Skip to content

Commit 56d2df0

Browse files
committed
feat(sidecar): add provided_commands wire request for per-package command listing
1 parent 78efd87 commit 56d2df0

13 files changed

Lines changed: 384 additions & 144 deletions

File tree

crates/sidecar-browser/src/wire_dispatch.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,17 @@ where
199199
"link_package is not available in the converged browser runtime",
200200
)
201201
}
202+
RequestRoute::ProvidedCommands(payload) => {
203+
// Provided command metadata is retained by the native sidecar's
204+
// host-backed package projection, which the converged browser
205+
// runtime does not provide.
206+
let _ = payload;
207+
rejected(
208+
&request,
209+
"unsupported",
210+
"provided_commands is not available in the converged browser runtime",
211+
)
212+
}
202213
RequestRoute::UnsupportedHostCallbackDirection => {
203214
unsupported_host_callback_direction_dispatch(&request)
204215
}

crates/sidecar-core/src/frames.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
use secure_exec_sidecar_protocol::protocol::{
22
AuthenticateRequest, AuthenticatedResponse, BoundUdpSnapshotResponse, EventFrame, EventPayload,
33
LayerCreatedResponse, LayerSealedResponse, ListenerSnapshotResponse, OverlayCreatedResponse,
4-
OwnershipScope, PackageLinkedResponse, ProcessExitedEvent, ProcessKilledResponse,
5-
ProcessOutputEvent, ProcessSnapshotEntry, ProcessSnapshotResponse, ProcessStartedResponse,
6-
ProjectedCommand, ProtocolSchema, RejectedResponse, RequestFrame, RequestId, ResponseFrame,
7-
ResponsePayload, RootFilesystemBootstrappedResponse, RootFilesystemEntry,
8-
RootFilesystemSnapshotResponse, SessionOpenedResponse, SignalHandlerRegistration,
9-
SignalStateResponse, SnapshotExportedResponse, SnapshotImportedResponse, SocketStateEntry,
10-
StdinClosedResponse, StdinWrittenResponse, StreamChannel, StructuredEvent,
11-
VmConfiguredResponse, VmCreatedResponse, VmDisposedResponse, VmLifecycleEvent,
12-
VmLifecycleState, ZombieTimerCountResponse, PROTOCOL_VERSION,
4+
OwnershipScope, PackageCommands, PackageLinkedResponse, ProcessExitedEvent,
5+
ProcessKilledResponse, ProcessOutputEvent, ProcessSnapshotEntry, ProcessSnapshotResponse,
6+
ProcessStartedResponse, ProjectedCommand, ProtocolSchema, ProvidedCommandsResponse,
7+
RejectedResponse, RequestFrame, RequestId, ResponseFrame, ResponsePayload,
8+
RootFilesystemBootstrappedResponse, RootFilesystemEntry, RootFilesystemSnapshotResponse,
9+
SessionOpenedResponse, SignalHandlerRegistration, SignalStateResponse,
10+
SnapshotExportedResponse, SnapshotImportedResponse, SocketStateEntry, StdinClosedResponse,
11+
StdinWrittenResponse, StreamChannel, StructuredEvent, VmConfiguredResponse, VmCreatedResponse,
12+
VmDisposedResponse, VmLifecycleEvent, VmLifecycleState, ZombieTimerCountResponse,
13+
PROTOCOL_VERSION,
1314
};
1415
use std::collections::HashMap;
1516

@@ -172,9 +173,17 @@ pub fn package_linked_response(
172173
) -> ResponseFrame {
173174
respond(
174175
request,
175-
ResponsePayload::PackageLinked(PackageLinkedResponse {
176-
projected_commands,
177-
}),
176+
ResponsePayload::PackageLinked(PackageLinkedResponse { projected_commands }),
177+
)
178+
}
179+
180+
pub fn provided_commands_response(
181+
request: &RequestFrame,
182+
packages: Vec<PackageCommands>,
183+
) -> ResponseFrame {
184+
respond(
185+
request,
186+
ResponsePayload::ProvidedCommands(ProvidedCommandsResponse { packages }),
178187
)
179188
}
180189

crates/sidecar-core/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ pub use frames::{
3131
authenticated_response, bound_udp_snapshot_response, event, layer_created_response,
3232
layer_sealed_response, listener_snapshot_response, overlay_created_response,
3333
package_linked_response, process_exited_event, process_killed_response, process_output_event,
34-
process_snapshot_response, process_started_response, reject, respond, response_with_ownership,
35-
root_filesystem_bootstrapped_response, root_filesystem_snapshot_response,
36-
session_opened_response, signal_state_response, snapshot_exported_response,
37-
snapshot_imported_response, stdin_closed_response, stdin_written_response,
38-
unsupported_guest_kernel_call_detail, unsupported_guest_kernel_call_event,
39-
validate_authenticate_versions, vm_configured_response, vm_created_response,
40-
vm_disposed_response, vm_lifecycle_event, zombie_timer_count_response,
34+
process_snapshot_response, process_started_response, provided_commands_response, reject,
35+
respond, response_with_ownership, root_filesystem_bootstrapped_response,
36+
root_filesystem_snapshot_response, session_opened_response, signal_state_response,
37+
snapshot_exported_response, snapshot_imported_response, stdin_closed_response,
38+
stdin_written_response, unsupported_guest_kernel_call_detail,
39+
unsupported_guest_kernel_call_event, validate_authenticate_versions, vm_configured_response,
40+
vm_created_response, vm_disposed_response, vm_lifecycle_event, zombie_timer_count_response,
4141
AuthenticateVersionError, DispatchResult, UNSUPPORTED_GUEST_KERNEL_CALL_EVENT,
4242
};
4343
pub use guest_fs::{

crates/sidecar-core/src/router.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use secure_exec_sidecar_protocol::protocol::{
66
GetProcessSnapshotRequest, GetResourceSnapshotRequest, GetSignalStateRequest,
77
GetZombieTimerCountRequest, GuestFilesystemCallRequest, GuestKernelCallRequest,
88
ImportSnapshotRequest, KillProcessRequest, LinkPackageRequest, OpenSessionRequest,
9-
OwnershipScope, RegisterHostCallbacksRequest, RequestFrame, RequestPayload, ResizePtyRequest,
10-
SealLayerRequest, SnapshotRootFilesystemRequest, VmFetchRequest, WriteStdinRequest,
9+
OwnershipScope, ProvidedCommandsRequest, RegisterHostCallbacksRequest, RequestFrame,
10+
RequestPayload, ResizePtyRequest, SealLayerRequest, SnapshotRootFilesystemRequest,
11+
VmFetchRequest, WriteStdinRequest,
1112
};
1213
use secure_exec_sidecar_protocol::wire as generated_wire;
1314

@@ -54,6 +55,7 @@ pub enum RequestRoute {
5455
GetSignalState(GetSignalStateRequest),
5556
GetZombieTimerCount(GetZombieTimerCountRequest),
5657
LinkPackage(LinkPackageRequest),
58+
ProvidedCommands(ProvidedCommandsRequest),
5759
Ext(ExtEnvelope),
5860
UnsupportedHostCallbackDirection,
5961
}
@@ -100,6 +102,7 @@ pub fn route_request_payload(request: &RequestFrame) -> RequestRoute {
100102
RequestPayload::GetSignalState(payload) => RequestRoute::GetSignalState(payload),
101103
RequestPayload::GetZombieTimerCount(payload) => RequestRoute::GetZombieTimerCount(payload),
102104
RequestPayload::LinkPackage(payload) => RequestRoute::LinkPackage(payload),
105+
RequestPayload::ProvidedCommands(payload) => RequestRoute::ProvidedCommands(payload),
103106
RequestPayload::HostFilesystemCall(_)
104107
| RequestPayload::PersistenceLoad(_)
105108
| RequestPayload::PersistenceFlush(_) => RequestRoute::UnsupportedHostCallbackDirection,
@@ -162,6 +165,7 @@ pub fn request_dispatch_mode(request: &RequestFrame) -> RequestDispatchMode {
162165
| RequestPayload::GetSignalState(_)
163166
| RequestPayload::GetZombieTimerCount(_)
164167
| RequestPayload::LinkPackage(_)
168+
| RequestPayload::ProvidedCommands(_)
165169
| RequestPayload::HostFilesystemCall(_)
166170
| RequestPayload::PersistenceLoad(_)
167171
| RequestPayload::PersistenceFlush(_) => RequestDispatchMode::Immediate,

crates/sidecar-protocol/protocol/secure_exec_sidecar_v1.bare

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,17 @@ type LinkPackageRequest struct {
221221
package: PackageDescriptor
222222
}
223223

224+
type PackageCommands struct {
225+
packageName: str
226+
commands: list<str>
227+
}
228+
229+
type ProvidedCommandsRequest void
230+
231+
type ProvidedCommandsResponse struct {
232+
packages: list<PackageCommands>
233+
}
234+
224235
type ProjectedCommand struct {
225236
name: str
226237
guestPath: str
@@ -456,7 +467,8 @@ type RequestPayload union {
456467
GuestKernelCallRequest |
457468
ResizePtyRequest |
458469
GetResourceSnapshotRequest |
459-
LinkPackageRequest
470+
LinkPackageRequest |
471+
ProvidedCommandsRequest
460472
}
461473

462474
type RequestFrame struct {
@@ -742,7 +754,8 @@ type ResponsePayload union {
742754
GuestKernelResultResponse |
743755
PtyResizedResponse |
744756
ResourceSnapshotResponse |
745-
PackageLinkedResponse
757+
PackageLinkedResponse |
758+
ProvidedCommandsResponse
746759
}
747760

748761
type ResponseFrame struct {

crates/sidecar-protocol/src/protocol.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,9 @@ fn to_generated_request_payload(
497497
RequestPayload::LinkPackage(inner) => {
498498
generated_protocol::RequestPayload::LinkPackageRequest(inner.clone())
499499
}
500+
RequestPayload::ProvidedCommands(_) => {
501+
generated_protocol::RequestPayload::ProvidedCommandsRequest
502+
}
500503
})
501504
}
502505

@@ -602,6 +605,9 @@ fn from_generated_request_payload(
602605
generated_protocol::RequestPayload::LinkPackageRequest(inner) => {
603606
RequestPayload::LinkPackage(inner)
604607
}
608+
generated_protocol::RequestPayload::ProvidedCommandsRequest => {
609+
RequestPayload::ProvidedCommands(ProvidedCommandsRequest {})
610+
}
605611
})
606612
}
607613

@@ -753,6 +759,9 @@ fn to_generated_response_payload(
753759
ResponsePayload::PackageLinked(inner) => {
754760
generated_protocol::ResponsePayload::PackageLinkedResponse(inner.clone())
755761
}
762+
ResponsePayload::ProvidedCommands(inner) => {
763+
generated_protocol::ResponsePayload::ProvidedCommandsResponse(inner.clone())
764+
}
756765
})
757766
}
758767

@@ -891,6 +900,9 @@ fn from_generated_response_payload(
891900
generated_protocol::ResponsePayload::PackageLinkedResponse(inner) => {
892901
ResponsePayload::PackageLinked(inner)
893902
}
903+
generated_protocol::ResponsePayload::ProvidedCommandsResponse(inner) => {
904+
ResponsePayload::ProvidedCommands(inner)
905+
}
894906
})
895907
}
896908

@@ -1257,6 +1269,7 @@ pub enum RequestPayload {
12571269
ResizePty(ResizePtyRequest),
12581270
GetResourceSnapshot(GetResourceSnapshotRequest),
12591271
LinkPackage(LinkPackageRequest),
1272+
ProvidedCommands(ProvidedCommandsRequest),
12601273
}
12611274

12621275
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -1295,6 +1308,7 @@ pub enum ResponsePayload {
12951308
PtyResized(PtyResizedResponse),
12961309
ResourceSnapshot(ResourceSnapshotResponse),
12971310
PackageLinked(PackageLinkedResponse),
1311+
ProvidedCommands(ProvidedCommandsResponse),
12981312
}
12991313

13001314
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -1399,12 +1413,17 @@ pub type GuestFilesystemCallRequest = crate::wire::GuestFilesystemCallRequest;
13991413
pub type GuestKernelCallRequest = crate::wire::GuestKernelCallRequest;
14001414
pub type ResizePtyRequest = crate::wire::ResizePtyRequest;
14011415
pub type PackageDescriptor = crate::wire::PackageDescriptor;
1416+
pub type PackageCommands = crate::wire::PackageCommands;
14021417
pub type ProjectedCommand = crate::wire::ProjectedCommand;
14031418
pub type LinkPackageRequest = crate::wire::LinkPackageRequest;
14041419

1420+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
1421+
pub struct ProvidedCommandsRequest {}
1422+
14051423
pub type GuestKernelResultResponse = crate::wire::GuestKernelResultResponse;
14061424
pub type PtyResizedResponse = crate::wire::PtyResizedResponse;
14071425
pub type PackageLinkedResponse = crate::wire::PackageLinkedResponse;
1426+
pub type ProvidedCommandsResponse = crate::wire::ProvidedCommandsResponse;
14081427

14091428
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
14101429
pub struct SnapshotRootFilesystemRequest {}
@@ -1598,6 +1617,7 @@ impl_bare_newtype_union_enum!(
15981617
ResizePty(ResizePtyRequest) = 29,
15991618
GetResourceSnapshot(GetResourceSnapshotRequest) = 30,
16001619
LinkPackage(LinkPackageRequest) = 31,
1620+
ProvidedCommands(ProvidedCommandsRequest) = 32,
16011621
}
16021622
);
16031623

@@ -1640,6 +1660,7 @@ impl_bare_newtype_union_enum!(
16401660
PtyResized(PtyResizedResponse) = 31,
16411661
ResourceSnapshot(ResourceSnapshotResponse) = 32,
16421662
PackageLinked(PackageLinkedResponse) = 33,
1663+
ProvidedCommands(ProvidedCommandsResponse) = 34,
16431664
}
16441665
);
16451666

@@ -2220,6 +2241,7 @@ enum ExpectedResponseKind {
22202241
GuestKernelResult,
22212242
PtyResized,
22222243
PackageLinked,
2244+
ProvidedCommands,
22232245
}
22242246

22252247
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -2265,6 +2287,7 @@ impl ExpectedResponseKind {
22652287
Self::GuestKernelResult => "guest_kernel_result",
22662288
Self::PtyResized => "pty_resized",
22672289
Self::PackageLinked => "package_linked",
2290+
Self::ProvidedCommands => "provided_commands_response",
22682291
}
22692292
}
22702293

@@ -2322,6 +2345,7 @@ impl RequestPayload {
23222345
| Self::GuestKernelCall(_)
23232346
| Self::ResizePty(_)
23242347
| Self::LinkPackage(_)
2348+
| Self::ProvidedCommands(_)
23252349
| Self::HostFilesystemCall(_) => OwnershipRequirement::Vm,
23262350
Self::Ext(_) => OwnershipRequirement::Any,
23272351
}
@@ -2361,6 +2385,7 @@ impl RequestPayload {
23612385
Self::GuestKernelCall(_) => ExpectedResponseKind::GuestKernelResult,
23622386
Self::ResizePty(_) => ExpectedResponseKind::PtyResized,
23632387
Self::LinkPackage(_) => ExpectedResponseKind::PackageLinked,
2388+
Self::ProvidedCommands(_) => ExpectedResponseKind::ProvidedCommands,
23642389
}
23652390
}
23662391
}
@@ -2413,7 +2438,8 @@ impl ResponsePayload {
24132438
| Self::PermissionDecision(_)
24142439
| Self::GuestKernelResult(_)
24152440
| Self::PtyResized(_)
2416-
| Self::PackageLinked(_) => OwnershipRequirement::Vm,
2441+
| Self::PackageLinked(_)
2442+
| Self::ProvidedCommands(_) => OwnershipRequirement::Vm,
24172443
Self::ExtResult(_) => OwnershipRequirement::Any,
24182444
}
24192445
}
@@ -2454,6 +2480,7 @@ impl ResponsePayload {
24542480
Self::GuestKernelResult(_) => "guest_kernel_result",
24552481
Self::PtyResized(_) => "pty_resized",
24562482
Self::PackageLinked(_) => "package_linked",
2483+
Self::ProvidedCommands(_) => "provided_commands_response",
24572484
}
24582485
}
24592486
}

crates/sidecar/src/service.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,9 @@ where
12141214
self.get_zombie_timer_count(&request, payload).await
12151215
}
12161216
RequestRoute::LinkPackage(payload) => self.link_package(&request, payload).await,
1217+
RequestRoute::ProvidedCommands(payload) => {
1218+
self.provided_commands(&request, payload).await
1219+
}
12171220
RequestRoute::UnsupportedHostCallbackDirection => {
12181221
Ok(unsupported_host_callback_direction_dispatch(&request))
12191222
}

crates/sidecar/src/state.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ pub(crate) struct VmConfiguration {
290290
pub(crate) instructions: Vec<String>,
291291
pub(crate) projected_modules: Vec<ProjectedModuleDescriptor>,
292292
pub(crate) command_permissions: BTreeMap<String, WasmPermissionTier>,
293+
pub(crate) provided_commands: BTreeMap<String, Vec<String>>,
293294
/// Guest JavaScript host-environment config (platform / module resolution /
294295
/// builtin allow-list). Set at `create_vm` from `CreateVmConfig.jsRuntime`
295296
/// and preserved across `configure_vm`. `None` => full Node.js emulation.
@@ -310,6 +311,7 @@ impl Default for VmConfiguration {
310311
instructions: Vec::new(),
311312
projected_modules: Vec::new(),
312313
command_permissions: BTreeMap::new(),
314+
provided_commands: BTreeMap::new(),
313315
js_runtime: None,
314316
snapshot_userland_code: None,
315317
loopback_exempt_ports: Vec::new(),
@@ -339,6 +341,7 @@ pub(crate) struct VmState {
339341
pub(crate) configuration: VmConfiguration,
340342
pub(crate) layers: VmLayerStore,
341343
pub(crate) command_guest_paths: BTreeMap<String, String>,
344+
pub(crate) provided_commands: BTreeMap<String, Vec<String>>,
342345
pub(crate) command_permissions: BTreeMap<String, WasmPermissionTier>,
343346
pub(crate) toolkits: BTreeMap<String, RegisterHostCallbacksRequest>,
344347
pub(crate) active_processes: BTreeMap<String, ActiveProcess>,

0 commit comments

Comments
 (0)