Implement PTY-native session terminal control

This commit is contained in:
ms2k 2026-08-02 17:36:40 +09:00
commit 8cef037fa3
3 changed files with 1488 additions and 382 deletions

View file

@ -288,6 +288,35 @@ fn session_id() -> SessionId {
SessionId::new(opaque(5))
}
fn terminal_modes_v2() -> TerminalModesV2 {
TerminalModesV2 {
input_modes: 1,
output_modes: 2,
control_modes: 3,
local_modes: 4,
line_discipline: 0,
input_speed: 38_400,
output_speed: 38_400,
interrupt: 3,
quit: 28,
erase: 127,
kill: 21,
eof: 4,
time: 0,
minimum: 1,
switch: 0,
start: 17,
stop: 19,
suspend: 26,
end_of_line: 0,
reprint: 18,
discard: 15,
word_erase: 23,
literal_next: 22,
end_of_line_2: 0,
}
}
fn process(seed: u32) -> PidfsProcessIdentityV1 {
PidfsProcessIdentityV1::new(
PidfsProcessAuthorityV1 {

View file

@ -145,6 +145,12 @@ fn every_schema_shape_round_trips_and_rejects_malformed_or_unknown_versions() {
}),
&mut seen,
);
verify_shape(
SessionTerminalEventV2::Break(TerminalBreak {
session_id: session_id(),
}),
&mut seen,
);
verify_shape(
TerminalInput {
session_id: session_id(),
@ -162,6 +168,13 @@ fn every_schema_shape_round_trips_and_rejects_malformed_or_unknown_versions() {
},
&mut seen,
);
verify_shape(terminal_modes_v2(), &mut seen);
verify_shape(
TerminalBreak {
session_id: session_id(),
},
&mut seen,
);
verify_shape(
TerminalSignal {
session_id: session_id(),
@ -227,12 +240,29 @@ fn every_schema_shape_round_trips_and_rejects_malformed_or_unknown_versions() {
},
&mut seen,
);
verify_shape(InteractiveProtocolVersion::V2, &mut seen);
verify_shape(
InteractiveSessionRequestV2 {
protocol_version: InteractiveProtocolVersion::V2,
session_id: session_id(),
argv: vec![b"tool".to_vec()],
initial_size: interactive_resize,
initial_modes: terminal_modes_v2(),
},
&mut seen,
);
verify_shape(
InteractiveSessionEvent::Poll {
session_id: session_id(),
},
&mut seen,
);
verify_shape(
InteractiveSessionEventV2::Poll {
session_id: session_id(),
},
&mut seen,
);
let prompt = TerminalPrompt {
session_id: session_id(),
request_id: RequestId::new(opaque(54)),
@ -251,6 +281,13 @@ fn every_schema_shape_round_trips_and_rejects_malformed_or_unknown_versions() {
},
&mut seen,
);
verify_shape(
InteractiveSessionBatchV2 {
session_id: session_id(),
messages: Vec::new(),
},
&mut seen,
);
verify_shape(generation_identity(), &mut seen);
verify_shape(trust_manifest(), &mut seen);
verify_shape(tls_credential.clone(), &mut seen);
@ -649,8 +686,8 @@ persistent_dirs = []
assert_eq!(
seen.digest(),
[
54, 187, 13, 149, 227, 157, 1, 54, 234, 66, 127, 9, 34, 65, 173, 20, 214, 200, 126, 67,
1, 216, 152, 76, 167, 32, 177, 218, 0, 192, 175, 28,
201, 9, 82, 185, 208, 17, 32, 181, 237, 9, 161, 239, 26, 109, 45, 148, 192, 138, 104,
114, 203, 147, 61, 180, 162, 184, 139, 77, 227, 8, 27, 128,
]
);
}

View file

@ -220,6 +220,7 @@ fn control_corpus(digest: &mut Sha256) {
ControlRequest::Register(_) => ControlRequest::Register(registration_request()),
ControlRequest::Execute(_) => ControlRequest::Execute(NonInteractiveSessionRequest { protocol_version: ProtocolVersion::V1, session_id: session_id(), argv: vec![b"tool".to_vec()] }),
ControlRequest::ExecuteInteractive(_) => ControlRequest::ExecuteInteractive(InteractiveSessionRequest { protocol_version: ProtocolVersion::V1, session_id: session_id(), argv: vec![b"tool".to_vec()], initial_size: resize }),
ControlRequest::ExecuteInteractiveV2(_) => ControlRequest::ExecuteInteractiveV2(InteractiveSessionRequestV2 { protocol_version: InteractiveProtocolVersion::V2, session_id: session_id(), argv: vec![b"tool".to_vec()], initial_size: resize, initial_modes: terminal_modes_v2() }),
});
enum_corpus!(digest, ControlResponse, {
ControlResponse::Enrolled(_) => ControlResponse::Enrolled(enrollment_response()),
@ -231,6 +232,9 @@ fn credential_corpus(digest: &mut Sha256) {
enum_corpus!(digest, ProtocolVersion, {
ProtocolVersion::V1 => ProtocolVersion::V1,
});
enum_corpus!(digest, InteractiveProtocolVersion, {
InteractiveProtocolVersion::V2 => InteractiveProtocolVersion::V2,
});
enum_corpus!(digest, TlsRole, {
TlsRole::SessionCoordinator => TlsRole::SessionCoordinator,
TlsRole::ClientCli => TlsRole::ClientCli,
@ -325,8 +329,8 @@ fn every_serialized_enum_variant_has_fixed_shape_evidence() {
assert_eq!(
digest.finalize().as_slice(),
[
63, 126, 242, 211, 164, 165, 11, 185, 180, 135, 109, 135, 92, 142, 111, 169, 142, 215,
49, 4, 170, 169, 119, 237, 235, 161, 192, 89, 92, 93, 88, 35,
16, 136, 82, 10, 228, 231, 132, 63, 189, 59, 106, 16, 164, 103, 232, 11, 245, 31, 144,
53, 91, 201, 91, 74, 66, 14, 174, 78, 110, 17, 181, 21,
]
);
}