dsh-a2a-server 0.2.0 → 0.4.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 +39 -0
- package/CHANGELOG.zh-CN.md +39 -0
- package/README.md +122 -29
- package/README.zh-CN.md +91 -28
- package/cordis.patch.yml +10 -6
- package/docker/Dockerfile +5 -0
- package/docs/visitor-isolation.en.md +51 -0
- package/docs/visitor-isolation.md +75 -0
- package/lib/briefing.d.ts +39 -0
- package/lib/briefing.d.ts.map +1 -0
- package/lib/briefing.js +108 -0
- package/lib/briefing.js.map +1 -0
- package/lib/config.d.ts +58 -15
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +74 -5
- package/lib/config.js.map +1 -1
- package/lib/contexts.d.ts +9 -4
- package/lib/contexts.d.ts.map +1 -1
- package/lib/contexts.js +7 -13
- package/lib/contexts.js.map +1 -1
- package/lib/docker-executor.d.ts +11 -0
- package/lib/docker-executor.d.ts.map +1 -0
- package/lib/docker-executor.js +115 -0
- package/lib/docker-executor.js.map +1 -0
- package/lib/index.d.ts +1 -31
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +462 -440
- package/lib/index.js.map +1 -1
- package/lib/isolation.d.ts +21 -0
- package/lib/isolation.d.ts.map +1 -0
- package/lib/isolation.js +108 -0
- package/lib/isolation.js.map +1 -0
- package/lib/management.d.ts +5 -0
- package/lib/management.d.ts.map +1 -0
- package/lib/management.js +75 -0
- package/lib/management.js.map +1 -0
- package/lib/microsandbox-executor.d.ts +39 -0
- package/lib/microsandbox-executor.d.ts.map +1 -0
- package/lib/microsandbox-executor.js +316 -0
- package/lib/microsandbox-executor.js.map +1 -0
- package/lib/microsandbox-runtime.d.ts +28 -0
- package/lib/microsandbox-runtime.d.ts.map +1 -0
- package/lib/microsandbox-runtime.js +164 -0
- package/lib/microsandbox-runtime.js.map +1 -0
- package/lib/projection.d.ts +46 -3
- package/lib/projection.d.ts.map +1 -1
- package/lib/projection.js +19 -8
- package/lib/projection.js.map +1 -1
- package/lib/router.d.ts +47 -0
- package/lib/router.d.ts.map +1 -1
- package/lib/router.js +218 -65
- package/lib/router.js.map +1 -1
- package/lib/sandbox-files.d.ts +16 -0
- package/lib/sandbox-files.d.ts.map +1 -0
- package/lib/sandbox-files.js +168 -0
- package/lib/sandbox-files.js.map +1 -0
- package/lib/sandbox-lifecycle.d.ts +48 -0
- package/lib/sandbox-lifecycle.d.ts.map +1 -0
- package/lib/sandbox-lifecycle.js +125 -0
- package/lib/sandbox-lifecycle.js.map +1 -0
- package/lib/security.d.ts +4 -2
- package/lib/security.d.ts.map +1 -1
- package/lib/security.js +4 -2
- package/lib/security.js.map +1 -1
- package/lib/state.d.ts +37 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +146 -0
- package/lib/state.js.map +1 -0
- package/lib/tasks.d.ts +4 -0
- package/lib/tasks.d.ts.map +1 -1
- package/lib/tasks.js +18 -0
- package/lib/tasks.js.map +1 -1
- package/lib/types.d.ts +9 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/visitor-read.d.ts +4 -0
- package/lib/visitor-read.d.ts.map +1 -0
- package/lib/visitor-read.js +20 -0
- package/lib/visitor-read.js.map +1 -0
- package/lib/visitor-worker.d.ts +2 -0
- package/lib/visitor-worker.d.ts.map +1 -0
- package/lib/visitor-worker.js +18 -0
- package/lib/visitor-worker.js.map +1 -0
- package/lib/visitor-worker.mjs +14686 -0
- package/lib/visitor-worker.py +78 -0
- package/lib/workspace-read.d.ts +9 -0
- package/lib/workspace-read.d.ts.map +1 -0
- package/lib/workspace-read.js +152 -0
- package/lib/workspace-read.js.map +1 -0
- package/package.json +48 -31
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, readFile, readdir, realpath, rename } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { contains, verifyMountTree, PUBLIC_PROJECTION_EXCLUDED_NAMES } from "./isolation.js";
|
|
6
|
+
import { acquireLease, atomicJson, copySafeTree, removeOwned } from "./sandbox-files.js";
|
|
7
|
+
import { VisitorSandboxes } from "./sandbox-lifecycle.js";
|
|
8
|
+
import { loadMicrosandbox, MICROSANDBOX_IMAGE, prepareMicrosandbox } from "./microsandbox-runtime.js";
|
|
9
|
+
const hash = (value) => createHash('sha256').update(value).digest('hex');
|
|
10
|
+
function configHash(config) {
|
|
11
|
+
// Resolved manifest is populated on first boot, not part of the requested bindings.
|
|
12
|
+
if (!Array.isArray(config.env))
|
|
13
|
+
throw new Error('Unexpected sandbox environment configuration');
|
|
14
|
+
const value = { ...config, env: [...config.env].sort((a, b) => String(a.key).localeCompare(String(b.key))), manifestDigest: null };
|
|
15
|
+
const stable = (input) => Array.isArray(input) ? input.map(stable)
|
|
16
|
+
: input && typeof input === 'object' ? Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null).sort(([a], [b]) => a.localeCompare(b)).map(([k, v]) => [k, stable(v)])) : input;
|
|
17
|
+
return hash(JSON.stringify(stable(value)));
|
|
18
|
+
}
|
|
19
|
+
export class MicrosandboxVM {
|
|
20
|
+
sandbox;
|
|
21
|
+
constructor(sandbox) {
|
|
22
|
+
this.sandbox = sandbox;
|
|
23
|
+
}
|
|
24
|
+
async pause() { await this.sandbox.pause(); }
|
|
25
|
+
async resume() { await this.sandbox.resume(); }
|
|
26
|
+
async stop() {
|
|
27
|
+
await this.sandbox.resume(); // idempotent; a paused VM must resume before stop
|
|
28
|
+
try {
|
|
29
|
+
await this.sandbox.stopWithTimeout(10_000);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
await this.sandbox.killWithTimeout(10_000);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Trusted host dispatch only. No model-controlled runtime flags or host paths. */
|
|
36
|
+
async python(code, args, signal, root = false) {
|
|
37
|
+
signal.throwIfAborted();
|
|
38
|
+
const exec = await this.sandbox.execStreamWith('python3', b => b.args(['-I', '-c', code, ...args]).user(root ? '0:0' : '1000:1000').timeout(30_000));
|
|
39
|
+
const abort = () => { void exec.kill().catch(() => { }); };
|
|
40
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
41
|
+
if (signal.aborted)
|
|
42
|
+
abort();
|
|
43
|
+
const output = [], errors = [];
|
|
44
|
+
let size = 0, exitCode;
|
|
45
|
+
try {
|
|
46
|
+
for await (const event of exec) {
|
|
47
|
+
signal.throwIfAborted();
|
|
48
|
+
if (event.kind === 'exited')
|
|
49
|
+
exitCode = event.code;
|
|
50
|
+
if (event.kind === 'stdout' || event.kind === 'stderr') {
|
|
51
|
+
size += event.data.length;
|
|
52
|
+
if (size > 256_000)
|
|
53
|
+
throw new Error('Sandbox output exceeded limit');
|
|
54
|
+
(event.kind === 'stdout' ? output : errors).push(event.data);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
signal.throwIfAborted();
|
|
58
|
+
const stdout = Buffer.concat(output).toString('utf8'), stderr = Buffer.concat(errors).toString('utf8');
|
|
59
|
+
if (exitCode !== 0) {
|
|
60
|
+
try {
|
|
61
|
+
const response = JSON.parse(stdout);
|
|
62
|
+
if (response.error)
|
|
63
|
+
throw new Error(response.error);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof Error && !(error instanceof SyntaxError))
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`Sandbox command failed (${exitCode}): ${stderr.slice(0, 2000)}`);
|
|
70
|
+
}
|
|
71
|
+
return stdout;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
await exec.kill().catch(() => { });
|
|
75
|
+
await exec.wait().catch(() => { });
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
signal.removeEventListener('abort', abort);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export class MicrosandboxDriver {
|
|
84
|
+
isolation;
|
|
85
|
+
sdk;
|
|
86
|
+
control;
|
|
87
|
+
namespace;
|
|
88
|
+
release;
|
|
89
|
+
constructor(isolation, sdk, control, namespace, release) {
|
|
90
|
+
this.isolation = isolation;
|
|
91
|
+
this.sdk = sdk;
|
|
92
|
+
this.control = control;
|
|
93
|
+
this.namespace = namespace;
|
|
94
|
+
this.release = release;
|
|
95
|
+
}
|
|
96
|
+
static async create(isolation, options = {}) {
|
|
97
|
+
const runtime = options.prepared ?? await prepareMicrosandbox(options);
|
|
98
|
+
// Managed images and all guest disks must also stay outside visitor-readable roots.
|
|
99
|
+
const runtimeRoot = await realpath(runtime.directory);
|
|
100
|
+
for (const data of new Set([isolation.dataRootFor('owner'), ...isolation.dataRoots])) {
|
|
101
|
+
const root = await realpath(data);
|
|
102
|
+
if (contains(root, runtimeRoot) || contains(runtimeRoot, root))
|
|
103
|
+
throw new Error('Public data must be outside the managed sandbox runtime');
|
|
104
|
+
}
|
|
105
|
+
const configuredControl = join(isolation.privateRoot, '.microsandbox');
|
|
106
|
+
await mkdir(configuredControl, { recursive: true, mode: 0o700 });
|
|
107
|
+
if ((await lstat(configuredControl)).isSymbolicLink())
|
|
108
|
+
throw new Error('Sandbox control directory must not be redirected');
|
|
109
|
+
const control = await realpath(configuredControl);
|
|
110
|
+
const release = await acquireLease(join(control, 'manager.lock'));
|
|
111
|
+
try {
|
|
112
|
+
const namespace = hash(await realpath(isolation.privateRoot)).slice(0, 24);
|
|
113
|
+
const driver = new MicrosandboxDriver(isolation, await loadMicrosandbox(runtime), control, namespace, release);
|
|
114
|
+
await driver.recover();
|
|
115
|
+
return driver;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
await release();
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** A crashed host may leave native VMs running. Reclaim only our recorded VMs. */
|
|
123
|
+
async recover() {
|
|
124
|
+
for (const entry of await readdir(this.control, { withFileTypes: true })) {
|
|
125
|
+
if (!entry.isDirectory() || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(entry.name))
|
|
126
|
+
continue;
|
|
127
|
+
const record = await this.record(entry.name);
|
|
128
|
+
if (!record.configHash)
|
|
129
|
+
continue;
|
|
130
|
+
let handle;
|
|
131
|
+
try {
|
|
132
|
+
handle = await this.sdk.Sandbox.get(record.name);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (/not found|does not exist|not exist|unknown sandbox/i.test(String(error)))
|
|
136
|
+
continue;
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
if (configHash(handle.config()) !== record.configHash)
|
|
140
|
+
throw new Error('Existing sandbox configuration differs; refusing recovery');
|
|
141
|
+
if (handle.status === 'paused')
|
|
142
|
+
await handle.resume();
|
|
143
|
+
if (handle.status === 'running' || handle.status === 'paused')
|
|
144
|
+
await new MicrosandboxVM(await handle.connect()).stop();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
paths(peer) {
|
|
148
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(peer))
|
|
149
|
+
throw new Error('Invalid visitor identity');
|
|
150
|
+
const base = join(this.control, peer);
|
|
151
|
+
return { base, public: join(base, 'public'), record: join(base, 'record.json'), name: `a2a-${this.namespace}-${hash(peer).slice(0, 24)}` };
|
|
152
|
+
}
|
|
153
|
+
async record(peer) {
|
|
154
|
+
const p = this.paths(peer);
|
|
155
|
+
try {
|
|
156
|
+
const value = JSON.parse(await readFile(p.record, 'utf8'));
|
|
157
|
+
if (value.schema !== 1 || value.name !== p.name)
|
|
158
|
+
throw new Error('Sandbox ownership metadata changed');
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (error.code !== 'ENOENT')
|
|
163
|
+
throw error;
|
|
164
|
+
return { schema: 1, name: p.name };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async stage(peer) {
|
|
168
|
+
await this.isolation.verifyContainer(peer);
|
|
169
|
+
const p = this.paths(peer);
|
|
170
|
+
await mkdir(p.base, { recursive: true, mode: 0o700 });
|
|
171
|
+
if (await realpath(p.base) !== p.base)
|
|
172
|
+
throw new Error('Sandbox data directory changed');
|
|
173
|
+
const temporary = join(p.base, `public-next-${randomUUID()}`);
|
|
174
|
+
try {
|
|
175
|
+
const digest = await copySafeTree(this.isolation.dataRootFor(peer), temporary, { excludeNames: PUBLIC_PROJECTION_EXCLUDED_NAMES });
|
|
176
|
+
const current = await this.record(peer);
|
|
177
|
+
if (current.publicHash === digest) {
|
|
178
|
+
await verifyMountTree(p.public);
|
|
179
|
+
await removeOwned(p.base, temporary);
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
commit: async () => {
|
|
184
|
+
const backup = join(p.base, `public-old-${randomUUID()}`);
|
|
185
|
+
let moved = false;
|
|
186
|
+
try {
|
|
187
|
+
await rename(p.public, backup);
|
|
188
|
+
moved = true;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (error.code !== 'ENOENT')
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
await rename(temporary, p.public);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (moved)
|
|
199
|
+
await rename(backup, p.public);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
await atomicJson(p.record, { ...await this.record(peer), publicHash: digest });
|
|
203
|
+
if (moved)
|
|
204
|
+
await removeOwned(p.base, backup);
|
|
205
|
+
},
|
|
206
|
+
discard: () => removeOwned(p.base, temporary),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
await removeOwned(p.base, temporary);
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async start(peer) {
|
|
215
|
+
const p = this.paths(peer), record = await this.record(peer);
|
|
216
|
+
const image = await this.sdk.Image.inspect(MICROSANDBOX_IMAGE);
|
|
217
|
+
if (!image.config)
|
|
218
|
+
throw new Error('Missing pinned sandbox image configuration');
|
|
219
|
+
const imageEnv = Object.fromEntries(image.config.env.map(entry => { const split = entry.indexOf('='); return [entry.slice(0, split), entry.slice(split + 1)]; }));
|
|
220
|
+
const builder = () => this.sdk.Sandbox.builder(p.name).image(MICROSANDBOX_IMAGE).pullPolicy('never')
|
|
221
|
+
.cpus(1).memory(512).rootDisk(256).security('restricted').disableNetwork().user('1000:1000').workdir('/work')
|
|
222
|
+
.cmd([...image.config.cmd ?? []]).envs(imageEnv)
|
|
223
|
+
.volume('/source', m => m.bind(p.public).readonly().noexec().nosuid().nodev().owner(1000, 1000))
|
|
224
|
+
.volume('/work', m => m.owned({ kind: 'disk', sizeMib: 512 }).nosuid().nodev())
|
|
225
|
+
.label('a2a.namespace', this.namespace).label('a2a.peer', peer);
|
|
226
|
+
const expected = configHash(await builder().build());
|
|
227
|
+
if (record.configHash && record.configHash !== expected)
|
|
228
|
+
throw new Error('Saved visitor sandbox configuration differs; preserve its disk and migrate before starting');
|
|
229
|
+
// Persist intent before native creation so a crash does not orphan or lose the disk.
|
|
230
|
+
await atomicJson(p.record, { ...record, configHash: expected });
|
|
231
|
+
let handle;
|
|
232
|
+
try {
|
|
233
|
+
handle = await this.sdk.Sandbox.get(p.name);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (!/not found|does not exist|not exist|unknown sandbox/i.test(String(error)))
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
let sandbox;
|
|
240
|
+
if (handle) {
|
|
241
|
+
if (configHash(handle.config()) !== expected)
|
|
242
|
+
throw new Error('Existing sandbox has unexpected mounts or security settings');
|
|
243
|
+
if (handle.status === 'paused') {
|
|
244
|
+
await handle.resume();
|
|
245
|
+
sandbox = await handle.connect();
|
|
246
|
+
}
|
|
247
|
+
else if (handle.status === 'running')
|
|
248
|
+
sandbox = await handle.connect();
|
|
249
|
+
else if (['stopped', 'crashed', 'created'].includes(handle.status))
|
|
250
|
+
sandbox = await handle.start();
|
|
251
|
+
else
|
|
252
|
+
throw new Error('Visitor sandbox is still transitioning; retry shortly');
|
|
253
|
+
}
|
|
254
|
+
else
|
|
255
|
+
sandbox = await builder().create();
|
|
256
|
+
const vm = new MicrosandboxVM(sandbox);
|
|
257
|
+
try {
|
|
258
|
+
if (sandbox.backendKind !== 'local' || configHash(await sandbox.config()) !== expected)
|
|
259
|
+
throw new Error('Unexpected sandbox backend or configuration');
|
|
260
|
+
if (!record.imported) {
|
|
261
|
+
const seed = join(p.base, `seed-${randomUUID()}`);
|
|
262
|
+
try {
|
|
263
|
+
await copySafeTree(this.isolation.workspaceFor(peer), seed);
|
|
264
|
+
const upload = async (dir, guest) => {
|
|
265
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
266
|
+
const source = join(dir, entry.name), target = `${guest}/${entry.name}`;
|
|
267
|
+
if (entry.isDirectory()) {
|
|
268
|
+
if (!await sandbox.fs().exists(target))
|
|
269
|
+
await sandbox.fs().mkdir(target);
|
|
270
|
+
await upload(source, target);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const bytes = await readFile(source);
|
|
274
|
+
if (await sandbox.fs().exists(target)) {
|
|
275
|
+
if (hash(await sandbox.fs().read(target)) !== hash(bytes))
|
|
276
|
+
throw new Error('Private file import conflict; original files have been retained');
|
|
277
|
+
}
|
|
278
|
+
else
|
|
279
|
+
await sandbox.fs().write(target, bytes);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
await upload(seed, '/work');
|
|
284
|
+
await vm.python('import os\nfor root,dirs,files in os.walk("/work"):\n os.chown(root,1000,1000)\n for name in files: os.chown(os.path.join(root,name),1000,1000)', [], new AbortController().signal, true);
|
|
285
|
+
await atomicJson(p.record, { ...await this.record(peer), imported: true });
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
await removeOwned(p.base, seed);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return vm;
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
await vm.stop().catch(() => { });
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async close() { await this.release(); }
|
|
299
|
+
}
|
|
300
|
+
export function microsandboxReadTool(definition, peer, manager) {
|
|
301
|
+
let script;
|
|
302
|
+
return { ...definition, execute: async (raw, { signal }) => {
|
|
303
|
+
const args = JSON.stringify(raw);
|
|
304
|
+
if (!args || Buffer.byteLength(args) > 8192)
|
|
305
|
+
throw new Error('Read request too large');
|
|
306
|
+
script ??= readFile(fileURLToPath(new URL('./visitor-worker.py', import.meta.url)), 'utf8');
|
|
307
|
+
const worker = await script;
|
|
308
|
+
return await manager.run(peer, async (vm) => {
|
|
309
|
+
const output = JSON.parse(await vm.python(worker, [args], signal));
|
|
310
|
+
if (output.error || output.result === undefined)
|
|
311
|
+
throw new Error(output.error || 'Invalid sandbox output');
|
|
312
|
+
return output.result;
|
|
313
|
+
}, signal);
|
|
314
|
+
} };
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=microsandbox-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsandbox-executor.js","sourceRoot":"","sources":["../src/microsandbox-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const MICROSANDBOX_VERSION = "0.7.11";
|
|
2
|
+
export declare const MICROSANDBOX_IMAGE = "docker.io/library/python@sha256:aa943ce411423c7582288f18707ff66eddcbaeb510502d747a72aeb34f30d159";
|
|
3
|
+
export interface PreparationProgress {
|
|
4
|
+
phase: 'checking' | 'installing' | 'image' | 'ready';
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RuntimeOptions {
|
|
8
|
+
directory?: string;
|
|
9
|
+
onProgress?: (progress: PreparationProgress) => void;
|
|
10
|
+
}
|
|
11
|
+
export type MicrosandboxModule = typeof import('microsandbox');
|
|
12
|
+
export interface PreparedRuntime {
|
|
13
|
+
directory: string;
|
|
14
|
+
home: string;
|
|
15
|
+
sdkFile: string;
|
|
16
|
+
cli: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runtimeDirectory(): string;
|
|
19
|
+
export declare function assertMicrosandboxPlatform(platform?: NodeJS.Platform, architecture?: NodeJS.Architecture): void;
|
|
20
|
+
export declare function runRuntimeCommand(command: string, args: string[], options?: {
|
|
21
|
+
home?: string;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}): Promise<string>;
|
|
24
|
+
/** First-start preparation is automatic, cached, versioned and never falls back to host execution. */
|
|
25
|
+
export declare function prepareMicrosandbox(options?: RuntimeOptions): Promise<PreparedRuntime>;
|
|
26
|
+
/** The native SDK has process-global storage/backend settings. Pin them once. */
|
|
27
|
+
export declare function loadMicrosandbox(runtime: PreparedRuntime): Promise<MicrosandboxModule>;
|
|
28
|
+
//# sourceMappingURL=microsandbox-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsandbox-runtime.d.ts","sourceRoot":"","sources":["../src/microsandbox-runtime.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,WAAW,CAAA;AAE5C,eAAO,MAAM,kBAAkB,qGAAqG,CAAA;AACpI,MAAM,WAAW,mBAAmB;IAAG,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC9G,MAAM,WAAW,cAAc;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAA;CAAE;AAC5G,MAAM,MAAM,kBAAkB,GAAG,cAAc,cAAc,CAAC,CAAA;AAC9D,MAAM,WAAW,eAAe;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAGlG,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AACD,wBAAgB,0BAA0B,CAAC,QAAQ,kBAAmB,EAAE,YAAY,sBAAe,GAAG,IAAI,CAIzG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B7I;AAUD,sGAAsG;AACtG,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAQ1F;AAsCD,iFAAiF;AACjF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ5F"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { access, mkdir, readFile, rename } from 'node:fs/promises';
|
|
11
|
+
import { dirname, join, resolve, delimiter } from 'node:path';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { pathToFileURL } from 'node:url';
|
|
15
|
+
import { waitForLease, removeOwned } from "./sandbox-files.js";
|
|
16
|
+
export const MICROSANDBOX_VERSION = '0.7.11';
|
|
17
|
+
// Multi-architecture OCI index, reviewed on 2026-10-30 (amd64 and arm64).
|
|
18
|
+
export const MICROSANDBOX_IMAGE = 'docker.io/library/python@sha256:aa943ce411423c7582288f18707ff66eddcbaeb510502d747a72aeb34f30d159';
|
|
19
|
+
const preparing = new Map();
|
|
20
|
+
export function runtimeDirectory() {
|
|
21
|
+
return resolve(process.env['A2A_SANDBOX_HOME'] || join(process.env['A2A_HOST_HOME'] || join(homedir(), '.a2a'), 'sandbox-runtime'));
|
|
22
|
+
}
|
|
23
|
+
export function assertMicrosandboxPlatform(platform = process.platform, architecture = process.arch) {
|
|
24
|
+
if (platform === 'darwin' && architecture !== 'arm64')
|
|
25
|
+
throw new Error('本地沙箱需要 Apple Silicon 和 ARM64 版 Node.js;Intel Mac 暂不支持');
|
|
26
|
+
if (!['darwin', 'win32', 'linux'].includes(platform) || !['arm64', 'x64'].includes(architecture))
|
|
27
|
+
throw new Error('当前系统或处理器暂不支持本地沙箱');
|
|
28
|
+
if (Number(process.versions.node.split('.')[0]) < 22)
|
|
29
|
+
throw new Error('本地沙箱需要 Node.js 22 或更高版本');
|
|
30
|
+
}
|
|
31
|
+
export async function runRuntimeCommand(command, args, options = {}) {
|
|
32
|
+
const env = { ...process.env, MSB_BACKEND: 'local', ...options.home ? { MSB_HOME: options.home } : {} };
|
|
33
|
+
// Managed local runtime must not inherit an unrelated binary, cloud, or profile selection.
|
|
34
|
+
for (const key of ['MSB_API_KEY', 'MSB_PROFILE', 'MSB_PATH', 'MSB_LIBKRUNFW_PATH'])
|
|
35
|
+
delete env[key];
|
|
36
|
+
return await new Promise((resolveResult, reject) => {
|
|
37
|
+
const child = spawn(command, args, { env, windowsHide: true, detached: process.platform !== 'win32', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
38
|
+
let output = '', errorOutput = '', timedOut = false;
|
|
39
|
+
let forceTimer;
|
|
40
|
+
const timeoutError = () => new Error('沙箱准备超时,请检查网络后重试;已经下载的内容会保留');
|
|
41
|
+
const timer = setTimeout(() => {
|
|
42
|
+
timedOut = true;
|
|
43
|
+
// npm and the SDK CLI spawn native children. Killing only the wrapper
|
|
44
|
+
// leaves downloads running and pipe handles open after a timeout.
|
|
45
|
+
if (child.pid && process.platform === 'win32') {
|
|
46
|
+
const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' });
|
|
47
|
+
killer.once('error', () => { child.kill(); });
|
|
48
|
+
}
|
|
49
|
+
else if (child.pid) {
|
|
50
|
+
try {
|
|
51
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
child.kill('SIGKILL');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
forceTimer = setTimeout(() => { child.stdout.destroy(); child.stderr.destroy(); reject(timeoutError()); }, 5000);
|
|
58
|
+
}, options.timeoutMs ?? 600_000);
|
|
59
|
+
child.stdout.on('data', chunk => { output = (output + String(chunk)).slice(-12_000); });
|
|
60
|
+
child.stderr.on('data', chunk => { errorOutput = (errorOutput + String(chunk)).slice(-12_000); });
|
|
61
|
+
child.on('error', error => { clearTimeout(timer); clearTimeout(forceTimer); reject(error); });
|
|
62
|
+
child.on('close', code => {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
clearTimeout(forceTimer);
|
|
65
|
+
if (timedOut)
|
|
66
|
+
reject(timeoutError());
|
|
67
|
+
else if (code !== 0)
|
|
68
|
+
reject(new Error((errorOutput || output || `Runtime exited (${code})`).slice(-4000)));
|
|
69
|
+
else
|
|
70
|
+
resolveResult(output);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async function npmCli() {
|
|
75
|
+
const dirs = [dirname(process.execPath), ...(process.env['PATH'] || '').split(delimiter)];
|
|
76
|
+
for (const dir of dirs)
|
|
77
|
+
for (const suffix of ['node_modules/npm/bin/npm-cli.js', '../lib/node_modules/npm/bin/npm-cli.js']) {
|
|
78
|
+
const candidate = resolve(dir, suffix);
|
|
79
|
+
try {
|
|
80
|
+
await access(candidate);
|
|
81
|
+
return candidate;
|
|
82
|
+
}
|
|
83
|
+
catch { /* next installation */ }
|
|
84
|
+
}
|
|
85
|
+
throw new Error('未找到随 Node.js 安装的 npm,请修复 Node.js 安装后重试');
|
|
86
|
+
}
|
|
87
|
+
/** First-start preparation is automatic, cached, versioned and never falls back to host execution. */
|
|
88
|
+
export function prepareMicrosandbox(options = {}) {
|
|
89
|
+
assertMicrosandboxPlatform();
|
|
90
|
+
const directory = resolve(options.directory || runtimeDirectory());
|
|
91
|
+
const existing = preparing.get(directory);
|
|
92
|
+
if (existing)
|
|
93
|
+
return existing;
|
|
94
|
+
const promise = prepare(directory, options.onProgress).finally(() => preparing.delete(directory));
|
|
95
|
+
preparing.set(directory, promise);
|
|
96
|
+
return promise;
|
|
97
|
+
}
|
|
98
|
+
async function prepare(directory, progress) {
|
|
99
|
+
const report = (phase, message) => progress?.({ phase, message });
|
|
100
|
+
report('checking', '正在检查本地沙箱环境…');
|
|
101
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
102
|
+
const release = await waitForLease(join(directory, 'prepare.lock'));
|
|
103
|
+
try {
|
|
104
|
+
const install = join(directory, `sdk-${MICROSANDBOX_VERSION}-${process.platform}-${process.arch}`);
|
|
105
|
+
const manifest = join(install, 'node_modules', 'microsandbox', 'package.json');
|
|
106
|
+
let installed = false;
|
|
107
|
+
try {
|
|
108
|
+
installed = JSON.parse(await readFile(manifest, 'utf8')).version === MICROSANDBOX_VERSION;
|
|
109
|
+
}
|
|
110
|
+
catch { /* first run */ }
|
|
111
|
+
if (!installed) {
|
|
112
|
+
report('installing', '首次使用,正在自动下载沙箱组件…');
|
|
113
|
+
const staging = join(directory, `install-${randomUUID()}`);
|
|
114
|
+
await mkdir(staging, { mode: 0o700 });
|
|
115
|
+
try {
|
|
116
|
+
await runRuntimeCommand(process.execPath, [await npmCli(), 'install', '--prefix', staging, '--save-exact', '--omit=dev', '--ignore-scripts', '--no-audit', '--no-fund', `microsandbox@${MICROSANDBOX_VERSION}`, '--registry=https://registry.npmjs.org']);
|
|
117
|
+
try {
|
|
118
|
+
await access(install);
|
|
119
|
+
await rename(install, `${install}.incomplete-${randomUUID()}`);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.code !== 'ENOENT')
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
await rename(staging, install);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await removeOwned(directory, staging);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const cli = join(install, 'node_modules/microsandbox/bin/microsandbox.cjs');
|
|
132
|
+
const home = join(directory, 'state');
|
|
133
|
+
await mkdir(home, { recursive: true, mode: 0o700 });
|
|
134
|
+
try {
|
|
135
|
+
await runRuntimeCommand(process.execPath, [cli, 'doctor'], { home, timeoutMs: 30_000 });
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const hint = process.platform === 'win32' ? '请在 Windows 功能中启用“Windows 虚拟机监控程序平台 (WHP)”并重启。'
|
|
139
|
+
: process.platform === 'linux' ? '请确认 /dev/kvm 可用且当前用户具有访问权限。' : '请确认使用 Apple Silicon 和 ARM64 版 Node.js。';
|
|
140
|
+
throw new Error(`系统虚拟化尚未就绪。${hint}\n${String(error)}`);
|
|
141
|
+
}
|
|
142
|
+
report('image', '正在准备工具运行环境,首次下载可能需要几分钟…');
|
|
143
|
+
await runRuntimeCommand(process.execPath, [cli, 'pull', MICROSANDBOX_IMAGE, '--quiet'], { home });
|
|
144
|
+
report('ready', '沙箱环境已就绪');
|
|
145
|
+
return { directory, home, sdkFile: join(install, 'node_modules/microsandbox/dist/index.js'), cli };
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await release();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
let loadedHome;
|
|
152
|
+
/** The native SDK has process-global storage/backend settings. Pin them once. */
|
|
153
|
+
export async function loadMicrosandbox(runtime) {
|
|
154
|
+
if (loadedHome && loadedHome !== runtime.home)
|
|
155
|
+
throw new Error('One process cannot manage different Microsandbox homes');
|
|
156
|
+
loadedHome = runtime.home;
|
|
157
|
+
process.env['MSB_HOME'] = runtime.home;
|
|
158
|
+
delete process.env['MSB_PATH'];
|
|
159
|
+
delete process.env['MSB_LIBKRUNFW_PATH'];
|
|
160
|
+
const sdk = await import(__rewriteRelativeImportExtension(pathToFileURL(runtime.sdkFile).href));
|
|
161
|
+
sdk.setDefaultBackend('local');
|
|
162
|
+
return sdk;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=microsandbox-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsandbox-runtime.js","sourceRoot":"","sources":["../src/microsandbox-runtime.ts"],"names":[],"mappings":"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"}
|