@namzu/sandbox 14.0.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +838 -0
- package/README.md +310 -14
- package/dist/backends/aci-standby-pool/index.d.ts.map +1 -1
- package/dist/backends/aci-standby-pool/index.js +13 -1
- package/dist/backends/aci-standby-pool/index.js.map +1 -1
- package/dist/backends/docker/index.d.ts.map +1 -1
- package/dist/backends/docker/index.js +19 -1
- package/dist/backends/docker/index.js.map +1 -1
- package/dist/backends/firecracker/index.d.ts.map +1 -1
- package/dist/backends/firecracker/index.js +12 -2
- package/dist/backends/firecracker/index.js.map +1 -1
- package/dist/backends/firecracker/protocol.d.ts +459 -8
- package/dist/backends/firecracker/protocol.d.ts.map +1 -1
- package/dist/backends/firecracker/protocol.js +136 -0
- package/dist/backends/firecracker/protocol.js.map +1 -1
- package/dist/backends/firecracker/transport.d.ts +539 -6
- package/dist/backends/firecracker/transport.d.ts.map +1 -1
- package/dist/backends/firecracker/transport.js +1171 -24
- package/dist/backends/firecracker/transport.js.map +1 -1
- package/dist/backends/kubernetes/egress-policy.d.ts +1088 -11
- package/dist/backends/kubernetes/egress-policy.d.ts.map +1 -1
- package/dist/backends/kubernetes/egress-policy.js +2173 -29
- package/dist/backends/kubernetes/egress-policy.js.map +1 -1
- package/dist/backends/kubernetes/identity.d.ts +193 -0
- package/dist/backends/kubernetes/identity.d.ts.map +1 -0
- package/dist/backends/kubernetes/identity.js +147 -0
- package/dist/backends/kubernetes/identity.js.map +1 -0
- package/dist/backends/kubernetes/index.d.ts +678 -33
- package/dist/backends/kubernetes/index.d.ts.map +1 -1
- package/dist/backends/kubernetes/index.js +1180 -95
- package/dist/backends/kubernetes/index.js.map +1 -1
- package/dist/backends/kubernetes/ingress-policy.d.ts +375 -0
- package/dist/backends/kubernetes/ingress-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/ingress-policy.js +1050 -0
- package/dist/backends/kubernetes/ingress-policy.js.map +1 -0
- package/dist/backends/kubernetes/k8s-client.d.ts +213 -4
- package/dist/backends/kubernetes/k8s-client.d.ts.map +1 -1
- package/dist/backends/kubernetes/k8s-client.js +359 -52
- package/dist/backends/kubernetes/k8s-client.js.map +1 -1
- package/dist/backends/kubernetes/lease.d.ts +40 -14
- package/dist/backends/kubernetes/lease.d.ts.map +1 -1
- package/dist/backends/kubernetes/lease.js +68 -18
- package/dist/backends/kubernetes/lease.js.map +1 -1
- package/dist/backends/kubernetes/objects.d.ts +423 -3
- package/dist/backends/kubernetes/objects.d.ts.map +1 -1
- package/dist/backends/kubernetes/objects.js +364 -2
- package/dist/backends/kubernetes/objects.js.map +1 -1
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts +219 -0
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js +407 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js.map +1 -0
- package/dist/backends/kubernetes/rbac.d.ts +153 -0
- package/dist/backends/kubernetes/rbac.d.ts.map +1 -0
- package/dist/backends/kubernetes/rbac.js +177 -0
- package/dist/backends/kubernetes/rbac.js.map +1 -0
- package/dist/backends/kubernetes/sandbox.d.ts +81 -14
- package/dist/backends/kubernetes/sandbox.d.ts.map +1 -1
- package/dist/backends/kubernetes/sandbox.js +149 -15
- package/dist/backends/kubernetes/sandbox.js.map +1 -1
- package/dist/backends/kubernetes/transport.d.ts +935 -9
- package/dist/backends/kubernetes/transport.d.ts.map +1 -1
- package/dist/backends/kubernetes/transport.js +1958 -62
- package/dist/backends/kubernetes/transport.js.map +1 -1
- package/dist/backends/kubernetes/workspace.d.ts +1149 -18
- package/dist/backends/kubernetes/workspace.d.ts.map +1 -1
- package/dist/backends/kubernetes/workspace.js +2825 -186
- package/dist/backends/kubernetes/workspace.js.map +1 -1
- package/dist/backends/remote-execution-controller.d.ts +14 -0
- package/dist/backends/remote-execution-controller.d.ts.map +1 -1
- package/dist/backends/remote-execution-controller.js.map +1 -1
- package/dist/index.d.ts +231 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +247 -5
- package/dist/index.js.map +1 -1
- package/dist/testing/sandbox-conformance.d.ts +39 -5
- package/dist/testing/sandbox-conformance.d.ts.map +1 -1
- package/dist/testing/sandbox-conformance.js +436 -5
- package/dist/testing/sandbox-conformance.js.map +1 -1
- package/package.json +3 -3
- package/src/backends/aci-standby-pool/index.ts +16 -1
- package/src/backends/docker/index.ts +22 -1
- package/src/backends/firecracker/index.ts +14 -2
- package/src/backends/firecracker/protocol.ts +514 -6
- package/src/backends/firecracker/transport.ts +1492 -40
- package/src/backends/kubernetes/egress-policy.ts +3064 -53
- package/src/backends/kubernetes/identity.ts +261 -0
- package/src/backends/kubernetes/index.ts +1785 -127
- package/src/backends/kubernetes/ingress-policy.ts +1344 -0
- package/src/backends/kubernetes/k8s-client.ts +444 -54
- package/src/backends/kubernetes/lease.ts +75 -19
- package/src/backends/kubernetes/objects.ts +626 -6
- package/src/backends/kubernetes/per-sandbox-policy.ts +542 -0
- package/src/backends/kubernetes/rbac.ts +192 -0
- package/src/backends/kubernetes/sandbox.ts +218 -20
- package/src/backends/kubernetes/transport.ts +2733 -124
- package/src/backends/kubernetes/workspace.ts +4476 -222
- package/src/backends/remote-execution-controller.ts +14 -0
- package/src/index.ts +595 -14
- package/src/testing/sandbox-conformance.ts +540 -5
|
@@ -15,6 +15,129 @@
|
|
|
15
15
|
* these data events. HTTP uses endpoints; the framed guest uses dedicated ops.
|
|
16
16
|
*/
|
|
17
17
|
import { RemoteCommandError, RemoteProtocolError } from '../remote-execution-controller.js';
|
|
18
|
+
/**
|
|
19
|
+
* The `healthz` feature string an agent advertises when it implements
|
|
20
|
+
* {@link WriteFilePart}. A host that does not see it in `features` keeps
|
|
21
|
+
* to the single-frame write and its named too-large error.
|
|
22
|
+
*/
|
|
23
|
+
export const WRITE_FILE_PARTS_FEATURE = 'write-file-parts';
|
|
24
|
+
/**
|
|
25
|
+
* The `healthz` feature string an agent advertises when it accepts a
|
|
26
|
+
* caller-chosen `executionId`, an `execute` carrying `retainOutput`, and
|
|
27
|
+
* the `attach-execution` op that replays a retained execution's output by
|
|
28
|
+
* byte offset.
|
|
29
|
+
*
|
|
30
|
+
* A host asking for a detachable command against a guest that does not
|
|
31
|
+
* advertise it is refused BEFORE the command is admitted, rather than
|
|
32
|
+
* starting one whose output nothing keeps.
|
|
33
|
+
*/
|
|
34
|
+
export const EXECUTION_ATTACH_FEATURE = 'execution-attach';
|
|
35
|
+
/**
|
|
36
|
+
* The `healthz` feature string an agent advertises when `read-file`
|
|
37
|
+
* honours {@link ReadFileRequest.offset}/`length` AND the
|
|
38
|
+
* `read-file-stream` op exists. ONE string for both halves because they
|
|
39
|
+
* ship together in `agent/agent.cjs` and no guest can have one without the
|
|
40
|
+
* other; a host that does not see it sends neither shape and keeps to the
|
|
41
|
+
* single whole-file reply.
|
|
42
|
+
*/
|
|
43
|
+
export const READ_FILE_STREAM_FEATURE = 'read-file-stream';
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Sessions — a program that outlives the connection that started it
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* The `healthz` feature string an agent advertises when it keeps a session
|
|
49
|
+
* registry: `terminal` with `{ sessionId, persistent: true }`, plus the
|
|
50
|
+
* `attach-session`, `start-detached`, `list-sessions` and `kill-session`
|
|
51
|
+
* ops.
|
|
52
|
+
*
|
|
53
|
+
* A host asking for any of them against a guest that does not advertise it
|
|
54
|
+
* is refused by name and never falls back to a connection-bound terminal: a
|
|
55
|
+
* caller that asked for a session is about to rely on coming back to it, and
|
|
56
|
+
* handing it one that dies with the socket would keep nothing and tell
|
|
57
|
+
* nobody.
|
|
58
|
+
*/
|
|
59
|
+
export const SESSIONS_FEATURE = 'sessions';
|
|
60
|
+
/**
|
|
61
|
+
* `healthz.features` entry: every authenticated reply and every stream
|
|
62
|
+
* `ready` frame carries a `guestBootId` naming the agent PROCESS that
|
|
63
|
+
* answered.
|
|
64
|
+
*
|
|
65
|
+
* The field is optional on every shape that carries it and a host must treat
|
|
66
|
+
* an absent one as "this guest cannot tell me" rather than as a change — an
|
|
67
|
+
* image built before this existed answers exactly as it always did. The
|
|
68
|
+
* feature string is here for the one host that wants to REQUIRE the evidence
|
|
69
|
+
* (a Kubernetes workspace deciding whether a command's guest is still the
|
|
70
|
+
* one it started on) and needs to know before it relies on it.
|
|
71
|
+
*/
|
|
72
|
+
export const GUEST_BOOT_ID_FEATURE = 'guest-boot-id';
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Quiesce — stop everything the guest is running, and keep serving
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* The `healthz` feature string an agent advertises when it implements the
|
|
78
|
+
* `quiesce` op: stop every process this guest is running — including ones
|
|
79
|
+
* no session and no execution owns — and go on serving `execute`,
|
|
80
|
+
* `read-file` and `write-file` afterwards.
|
|
81
|
+
*
|
|
82
|
+
* Gated exactly like {@link SESSIONS_FEATURE}: a host sends the op only to
|
|
83
|
+
* a guest that advertised it, because an agent that predates it answers
|
|
84
|
+
* `unknown_op: quiesce` and a host that read that as "nothing was running"
|
|
85
|
+
* would take its capture over a disk somebody is still writing to.
|
|
86
|
+
*/
|
|
87
|
+
export const QUIESCE_FEATURE = 'quiesce';
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Flush — put the workspace's dirty pages on the device, on purpose
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
/**
|
|
92
|
+
* The `healthz` feature string an agent advertises when it implements the
|
|
93
|
+
* `flush` op: run `syncfs(2)` over the workspace mount and answer only once
|
|
94
|
+
* it has returned.
|
|
95
|
+
*
|
|
96
|
+
* Gated exactly like {@link QUIESCE_FEATURE}, and for a sharper reason than
|
|
97
|
+
* any other feature in this file: an agent that predates the op answers
|
|
98
|
+
* `unknown_op: flush`, and a host that read that as "the disk is flushed"
|
|
99
|
+
* would take the pod away over pages that never reached the device. So the
|
|
100
|
+
* op is sent only to a guest that named it, and a guest that did not is
|
|
101
|
+
* reported as one that cannot flush rather than one that had nothing to.
|
|
102
|
+
*
|
|
103
|
+
* An agent that HAS the op advertises it only when it can actually perform
|
|
104
|
+
* one: the flush runs a program, and an image that stripped it has the code
|
|
105
|
+
* and nothing to run. Such a guest also answers `flush_unsupported` to an op
|
|
106
|
+
* sent anyway, which a host reads exactly as the missing string — because
|
|
107
|
+
* the alternative, an unconfirmed flush, is the shape that means "the disk
|
|
108
|
+
* may be missing writes" and would refuse that image's every suspend
|
|
109
|
+
* forever.
|
|
110
|
+
*/
|
|
111
|
+
export const FLUSH_FEATURE = 'flush';
|
|
112
|
+
/** Missed intervals that end a stream. Three, so one lost frame is not fatal. */
|
|
113
|
+
export const STREAM_HEARTBEAT_MISS_LIMIT = 3;
|
|
114
|
+
/**
|
|
115
|
+
* The shortest interval either side will run a heartbeat at.
|
|
116
|
+
*
|
|
117
|
+
* The interval arrives from the host, so the guest clamps it to this before
|
|
118
|
+
* using it and echoes the CLAMPED value — otherwise an authenticated host
|
|
119
|
+
* could ask for a fraction of a millisecond and leave the agent doing
|
|
120
|
+
* nothing but writing heartbeats.
|
|
121
|
+
*/
|
|
122
|
+
export const MIN_STREAM_HEARTBEAT_MS = 100;
|
|
123
|
+
/**
|
|
124
|
+
* How far above what it asked for a host will honour the guest's echo.
|
|
125
|
+
*
|
|
126
|
+
* The echo is a number from the pod, and the host does its own watchdog
|
|
127
|
+
* arithmetic with it: unclamped, a guest echoing a fraction of a millisecond
|
|
128
|
+
* makes the host tear the stream down on its first tick, and one echoing a
|
|
129
|
+
* day disables the host's detection entirely. A guest that clamps the way
|
|
130
|
+
* this one does always echoes a value inside the band, so the honest case is
|
|
131
|
+
* never altered.
|
|
132
|
+
*/
|
|
133
|
+
export const STREAM_HEARTBEAT_MAX_ECHO_FACTOR = 4;
|
|
134
|
+
/**
|
|
135
|
+
* The `healthz` feature string an agent advertises when it understands
|
|
136
|
+
* {@link StreamHeartbeat}. Informational for the host — the per-stream
|
|
137
|
+
* `ready` echo is what actually arms anything — and the honest answer for an
|
|
138
|
+
* operator reading a `healthz` reply to find out what an image can do.
|
|
139
|
+
*/
|
|
140
|
+
export const STREAM_HEARTBEAT_FEATURE = 'stream-heartbeat';
|
|
18
141
|
// ---------------------------------------------------------------------------
|
|
19
142
|
// Streaming exec-line accumulator — the parser docker/aci inline today,
|
|
20
143
|
// lifted out so the vsock transport reuses it byte-for-byte.
|
|
@@ -113,6 +236,19 @@ export function parseExecLine(line) {
|
|
|
113
236
|
catch (error) {
|
|
114
237
|
throw new RemoteProtocolError(`agent emitted malformed NDJSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
238
|
}
|
|
239
|
+
return parseExecEvent(parsed);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* The same structural validation over an event that has ALREADY been
|
|
243
|
+
* parsed out of its frame.
|
|
244
|
+
*
|
|
245
|
+
* Split out of {@link parseExecLine} for the caller that reads the exec
|
|
246
|
+
* stream frame by frame rather than as NDJSON text — the Kubernetes
|
|
247
|
+
* detached execution, which needs the raw object to read the retained-log
|
|
248
|
+
* offsets off it. One validation, two entry points: an ordinary exec and a
|
|
249
|
+
* detached one must never disagree about what a valid frame is.
|
|
250
|
+
*/
|
|
251
|
+
export function parseExecEvent(parsed) {
|
|
116
252
|
if (!parsed || typeof parsed !== 'object') {
|
|
117
253
|
throw new RemoteProtocolError('agent emitted an event without an object body');
|
|
118
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/backends/firecracker/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/backends/firecracker/protocol.ts"],"names":[],"mappings":"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"}
|