Skip to content

Commit db2c79b

Browse files
authored
feat(packages): sidecar package projection + agentos-toolchain + { packageDir } registry (#150)
Ports the package-projection feature onto the converged-runtime sidecar (crate split sidecar/sidecar-core/sidecar-protocol): PackageDescriptor / LinkPackageRequest / PackageLinkedResponse wire types, ConfigureVm packages projection into /opt/agentos, runtime LinkPackage, and package_projection.rs. Also: agentos-toolchain, @agentos-software/manifest, { packageDir } registry migration, single base-filesystem.
1 parent 6ce063a commit db2c79b

244 files changed

Lines changed: 3290 additions & 6183 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,18 @@ registry/native/c/vendor/
4343
registry/native/c/libs/
4444
registry/native/c/.cache/
4545
registry/native/c/sysroot/
46+
registry/software/*/bin/
4647
registry/software/*/wasm/
4748
registry/software/*/agent-os-package.meta.json
4849
registry/.last-publish-hash
4950
registry/software/*/.last-publish-hash
5051
registry/.build-markers/
5152

53+
# Experiments C build artifacts
54+
experiments/wasm-gui/third_party/**/*.o
55+
experiments/wasm-gui/third_party/**/*.a
56+
experiments/wasm-gui/third_party/**/.libs/
57+
5258
# Ralph agent artifacts
5359
scripts/ralph/archive/
5460
scripts/ralph/codex-streams/
@@ -70,6 +76,8 @@ crates/execution/.agent-os-pyodide-cache/
7076
crates/execution/async-out.txt
7177
crates/sidecar/.tmp-sidecar-tests/
7278
packages/browser/.cache/
79+
website/.astro/
80+
website/public/docs/
7381

7482
# Vendored V8 bridge bundles staged at release time for crates.io publishing
7583
crates/execution/assets/generated/

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Every bound that protects a shared resource — memory/heap, CPU/wall-clock, fd/
6060
## Build And Assets
6161

6262
- The VM base filesystem artifact is derived from Alpine Linux, but runtime source should stay generic.
63-
- Rebuild the base filesystem with `pnpm --dir packages/build-tools snapshot:alpine-defaults`, then `pnpm --dir packages/build-tools build:base-filesystem`.
63+
- Rebuild the base filesystem (requires Docker) with `pnpm --dir packages/build-tools build:base-filesystem`. The one script snapshots Alpine, applies the secure-exec transforms, and writes the single canonical `packages/core/fixtures/base-filesystem.json`, mirroring the same bytes into the crate-vendored `crates/sidecar/assets/` and `crates/vfs/assets/` copies (those exist only as the `cargo publish` fallback; never hand-edit them).
6464
- The V8 bridge bundle is generated from `packages/build-tools/scripts/build-v8-bridge.mjs`; keep its generated assets aligned with bridge-contract changes.
6565
- `registry/native` owns the Rust-to-WASM command build; package-local `registry/software/*/wasm/` output is release material.
6666

crates/execution/src/wasm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const DEFAULT_WASM_GUEST_HOME: &str = "/root";
5555
const DEFAULT_WASM_GUEST_USER: &str = "root";
5656
const DEFAULT_WASM_GUEST_SHELL: &str = "/bin/sh";
5757
const DEFAULT_WASM_GUEST_PATH: &str =
58-
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
58+
"/usr/local/sbin:/usr/local/bin:/opt/agentos/bin:/usr/sbin:/usr/bin:/sbin:/bin";
5959
// Warmup is a best-effort compile-cache optimization; fall back to a cold start
6060
// instead of burning minutes on a stalled prewarm session.
6161
const DEFAULT_WASM_PREWARM_TIMEOUT_MS: u64 = 30_000;

crates/sidecar-core/src/frames.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use secure_exec_sidecar_protocol::protocol::{
44
OwnershipScope, ProcessExitedEvent, ProcessKilledResponse, ProcessOutputEvent,
55
ProcessSnapshotEntry, ProcessSnapshotResponse, ProcessStartedResponse, ProtocolSchema,
66
RejectedResponse, RequestFrame, RequestId, ResponseFrame, ResponsePayload,
7-
RootFilesystemBootstrappedResponse, RootFilesystemEntry, RootFilesystemSnapshotResponse,
7+
PackageLinkedResponse, RootFilesystemBootstrappedResponse, RootFilesystemEntry,
8+
RootFilesystemSnapshotResponse,
89
SessionOpenedResponse, SignalHandlerRegistration, SignalStateResponse,
910
SnapshotExportedResponse, SnapshotImportedResponse, SocketStateEntry, StdinClosedResponse,
1011
StdinWrittenResponse, StreamChannel, StructuredEvent, VmConfiguredResponse, VmCreatedResponse,
@@ -164,6 +165,13 @@ pub fn vm_configured_response(
164165
)
165166
}
166167

168+
pub fn package_linked_response(request: &RequestFrame, commands: Vec<String>) -> ResponseFrame {
169+
respond(
170+
request,
171+
ResponsePayload::PackageLinked(PackageLinkedResponse { commands }),
172+
)
173+
}
174+
167175
pub fn layer_created_response(request: &RequestFrame, layer_id: String) -> ResponseFrame {
168176
respond(
169177
request,

crates/sidecar-core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub use diagnostics::{
3030
pub use frames::{
3131
authenticated_response, bound_udp_snapshot_response, event, layer_created_response,
3232
layer_sealed_response, listener_snapshot_response, overlay_created_response,
33+
package_linked_response,
3334
process_exited_event, process_killed_response, process_output_event, process_snapshot_response,
3435
process_started_response, reject, respond, response_with_ownership,
3536
root_filesystem_bootstrapped_response, root_filesystem_snapshot_response,

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,
88
GuestFilesystemCallRequest, GuestKernelCallRequest, ImportSnapshotRequest, KillProcessRequest,
9-
OpenSessionRequest, OwnershipScope, RegisterHostCallbacksRequest, RequestFrame, RequestPayload,
10-
ResizePtyRequest, SealLayerRequest, SnapshotRootFilesystemRequest, VmFetchRequest, WriteStdinRequest,
9+
LinkPackageRequest, OpenSessionRequest, OwnershipScope, RegisterHostCallbacksRequest,
10+
RequestFrame, RequestPayload, ResizePtyRequest, SealLayerRequest, SnapshotRootFilesystemRequest,
11+
VmFetchRequest, WriteStdinRequest,
1112
};
1213
use secure_exec_sidecar_protocol::wire as generated_wire;
1314

@@ -50,6 +51,7 @@ pub enum RequestRoute {
5051
VmFetch(VmFetchRequest),
5152
GetSignalState(GetSignalStateRequest),
5253
GetZombieTimerCount(GetZombieTimerCountRequest),
54+
LinkPackage(LinkPackageRequest),
5355
Ext(ExtEnvelope),
5456
UnsupportedHostCallbackDirection,
5557
}
@@ -95,6 +97,7 @@ pub fn route_request_payload(request: &RequestFrame) -> RequestRoute {
9597
RequestPayload::VmFetch(payload) => RequestRoute::VmFetch(payload),
9698
RequestPayload::GetSignalState(payload) => RequestRoute::GetSignalState(payload),
9799
RequestPayload::GetZombieTimerCount(payload) => RequestRoute::GetZombieTimerCount(payload),
100+
RequestPayload::LinkPackage(payload) => RequestRoute::LinkPackage(payload),
98101
RequestPayload::HostFilesystemCall(_)
99102
| RequestPayload::PersistenceLoad(_)
100103
| RequestPayload::PersistenceFlush(_) => RequestRoute::UnsupportedHostCallbackDirection,
@@ -156,6 +159,7 @@ pub fn request_dispatch_mode(request: &RequestFrame) -> RequestDispatchMode {
156159
| RequestPayload::VmFetch(_)
157160
| RequestPayload::GetSignalState(_)
158161
| RequestPayload::GetZombieTimerCount(_)
162+
| RequestPayload::LinkPackage(_)
159163
| RequestPayload::HostFilesystemCall(_)
160164
| RequestPayload::PersistenceLoad(_)
161165
| RequestPayload::PersistenceFlush(_) => RequestDispatchMode::Immediate,

crates/sidecar-protocol/protocol/secure_exec_sidecar_v1.bare

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,23 @@ type WasmPermissionTier enum {
208208
ISOLATED
209209
}
210210

211+
# agentOS package descriptor. The sidecar reads `<dir>/agentos-package.json`,
212+
# projects the self-contained `dir` read-only under
213+
# `<packagesMountAt>/<manifest.name>/<package.json version>`, and links its `bin/`
214+
# commands onto $PATH. `dir` is a trusted host path (the client configures its own
215+
# VM); the sidecar is the host-side TCB that builds the staging tree.
216+
type PackageDescriptor struct {
217+
dir: str
218+
}
219+
220+
type LinkPackageRequest struct {
221+
package: PackageDescriptor
222+
}
223+
224+
type PackageLinkedResponse struct {
225+
commands: list<str>
226+
}
227+
211228
type ConfigureVmRequest struct {
212229
mounts: list<MountDescriptor>
213230
software: list<SoftwareDescriptor>
@@ -217,6 +234,8 @@ type ConfigureVmRequest struct {
217234
projectedModules: list<ProjectedModuleDescriptor>
218235
commandPermissions: map<str><WasmPermissionTier>
219236
loopbackExemptPorts: list<u16>
237+
packages: list<PackageDescriptor>
238+
packagesMountAt: str
220239
}
221240

222241
type RegisteredHostCallbackExample struct {
@@ -424,7 +443,8 @@ type RequestPayload union {
424443
ExtEnvelope |
425444
GuestKernelCallRequest |
426445
ResizePtyRequest |
427-
GetResourceSnapshotRequest
446+
GetResourceSnapshotRequest |
447+
LinkPackageRequest
428448
}
429449

430450
type RequestFrame struct {
@@ -706,7 +726,8 @@ type ResponsePayload union {
706726
ExtEnvelope |
707727
GuestKernelResultResponse |
708728
PtyResizedResponse |
709-
ResourceSnapshotResponse
729+
ResourceSnapshotResponse |
730+
PackageLinkedResponse
710731
}
711732

712733
type ResponseFrame struct {

crates/sidecar-protocol/src/protocol.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,9 @@ fn to_generated_request_payload(
482482
RequestPayload::ResizePty(inner) => {
483483
generated_protocol::RequestPayload::ResizePtyRequest(inner.clone())
484484
}
485+
RequestPayload::LinkPackage(inner) => {
486+
generated_protocol::RequestPayload::LinkPackageRequest(inner.clone())
487+
}
485488
})
486489
}
487490

@@ -584,6 +587,9 @@ fn from_generated_request_payload(
584587
generated_protocol::RequestPayload::ResizePtyRequest(inner) => {
585588
RequestPayload::ResizePty(inner)
586589
}
590+
generated_protocol::RequestPayload::LinkPackageRequest(inner) => {
591+
RequestPayload::LinkPackage(inner)
592+
}
587593
})
588594
}
589595

@@ -732,6 +738,9 @@ fn to_generated_response_payload(
732738
ResponsePayload::PtyResized(inner) => {
733739
generated_protocol::ResponsePayload::PtyResizedResponse(inner.clone())
734740
}
741+
ResponsePayload::PackageLinked(inner) => {
742+
generated_protocol::ResponsePayload::PackageLinkedResponse(inner.clone())
743+
}
735744
})
736745
}
737746

@@ -867,6 +876,9 @@ fn from_generated_response_payload(
867876
generated_protocol::ResponsePayload::PtyResizedResponse(inner) => {
868877
ResponsePayload::PtyResized(inner)
869878
}
879+
generated_protocol::ResponsePayload::PackageLinkedResponse(inner) => {
880+
ResponsePayload::PackageLinked(inner)
881+
}
870882
})
871883
}
872884

@@ -1232,6 +1244,7 @@ pub enum RequestPayload {
12321244
GuestKernelCall(GuestKernelCallRequest),
12331245
ResizePty(ResizePtyRequest),
12341246
GetResourceSnapshot(GetResourceSnapshotRequest),
1247+
LinkPackage(LinkPackageRequest),
12351248
}
12361249

12371250
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -1269,6 +1282,7 @@ pub enum ResponsePayload {
12691282
GuestKernelResult(GuestKernelResultResponse),
12701283
PtyResized(PtyResizedResponse),
12711284
ResourceSnapshot(ResourceSnapshotResponse),
1285+
PackageLinked(PackageLinkedResponse),
12721286
}
12731287

12741288
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -1372,9 +1386,12 @@ pub type GuestFilesystemCallRequest = crate::wire::GuestFilesystemCallRequest;
13721386

13731387
pub type GuestKernelCallRequest = crate::wire::GuestKernelCallRequest;
13741388
pub type ResizePtyRequest = crate::wire::ResizePtyRequest;
1389+
pub type PackageDescriptor = crate::wire::PackageDescriptor;
1390+
pub type LinkPackageRequest = crate::wire::LinkPackageRequest;
13751391

13761392
pub type GuestKernelResultResponse = crate::wire::GuestKernelResultResponse;
13771393
pub type PtyResizedResponse = crate::wire::PtyResizedResponse;
1394+
pub type PackageLinkedResponse = crate::wire::PackageLinkedResponse;
13781395

13791396
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
13801397
pub struct SnapshotRootFilesystemRequest {}
@@ -1567,6 +1584,7 @@ impl_bare_newtype_union_enum!(
15671584
GuestKernelCall(GuestKernelCallRequest) = 28,
15681585
ResizePty(ResizePtyRequest) = 29,
15691586
GetResourceSnapshot(GetResourceSnapshotRequest) = 30,
1587+
LinkPackage(LinkPackageRequest) = 31,
15701588
}
15711589
);
15721590

@@ -1608,6 +1626,7 @@ impl_bare_newtype_union_enum!(
16081626
GuestKernelResult(GuestKernelResultResponse) = 30,
16091627
PtyResized(PtyResizedResponse) = 31,
16101628
ResourceSnapshot(ResourceSnapshotResponse) = 32,
1629+
PackageLinked(PackageLinkedResponse) = 33,
16111630
}
16121631
);
16131632

@@ -2187,6 +2206,7 @@ enum ExpectedResponseKind {
21872206
ExtResult,
21882207
GuestKernelResult,
21892208
PtyResized,
2209+
PackageLinked,
21902210
}
21912211

21922212
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -2231,6 +2251,7 @@ impl ExpectedResponseKind {
22312251
Self::ExtResult => "ext_result",
22322252
Self::GuestKernelResult => "guest_kernel_result",
22332253
Self::PtyResized => "pty_resized",
2254+
Self::PackageLinked => "package_linked",
22342255
}
22352256
}
22362257

@@ -2287,6 +2308,7 @@ impl RequestPayload {
22872308
| Self::GetZombieTimerCount(_)
22882309
| Self::GuestKernelCall(_)
22892310
| Self::ResizePty(_)
2311+
| Self::LinkPackage(_)
22902312
| Self::HostFilesystemCall(_) => OwnershipRequirement::Vm,
22912313
Self::Ext(_) => OwnershipRequirement::Any,
22922314
}
@@ -2325,6 +2347,7 @@ impl RequestPayload {
23252347
Self::Ext(_) => ExpectedResponseKind::ExtResult,
23262348
Self::GuestKernelCall(_) => ExpectedResponseKind::GuestKernelResult,
23272349
Self::ResizePty(_) => ExpectedResponseKind::PtyResized,
2350+
Self::LinkPackage(_) => ExpectedResponseKind::PackageLinked,
23282351
}
23292352
}
23302353
}
@@ -2376,7 +2399,8 @@ impl ResponsePayload {
23762399
| Self::FilesystemResult(_)
23772400
| Self::PermissionDecision(_)
23782401
| Self::GuestKernelResult(_)
2379-
| Self::PtyResized(_) => OwnershipRequirement::Vm,
2402+
| Self::PtyResized(_)
2403+
| Self::PackageLinked(_) => OwnershipRequirement::Vm,
23802404
Self::ExtResult(_) => OwnershipRequirement::Any,
23812405
}
23822406
}
@@ -2416,6 +2440,7 @@ impl ResponsePayload {
24162440
Self::ExtResult(_) => "ext_result",
24172441
Self::GuestKernelResult(_) => "guest_kernel_result",
24182442
Self::PtyResized(_) => "pty_resized",
2443+
Self::PackageLinked(_) => "package_linked",
24192444
}
24202445
}
24212446
}

crates/sidecar/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub mod limits;
1515
#[cfg(target_os = "macos")]
1616
pub(crate) mod macos_fs;
1717
pub(crate) mod metadata;
18+
pub mod package_projection;
1819
pub(crate) mod plugins;
1920
pub mod service;
2021
pub(crate) mod state;

0 commit comments

Comments
 (0)