@intutic/cli 2.3.0 → 2.5.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.
Files changed (72) hide show
  1. package/dist/cli.js +133 -3
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/budgetLimits.d.ts +70 -0
  4. package/dist/commands/budgetLimits.d.ts.map +1 -0
  5. package/dist/commands/budgetLimits.js +223 -0
  6. package/dist/commands/budgetLimits.js.map +1 -0
  7. package/dist/commands/chaos.d.ts +40 -0
  8. package/dist/commands/chaos.d.ts.map +1 -0
  9. package/dist/commands/chaos.js +252 -0
  10. package/dist/commands/chaos.js.map +1 -0
  11. package/dist/commands/credentials.d.ts +5 -1
  12. package/dist/commands/credentials.d.ts.map +1 -1
  13. package/dist/commands/credentials.js +98 -9
  14. package/dist/commands/credentials.js.map +1 -1
  15. package/dist/commands/exec.d.ts +29 -1
  16. package/dist/commands/exec.d.ts.map +1 -1
  17. package/dist/commands/exec.js +72 -35
  18. package/dist/commands/exec.js.map +1 -1
  19. package/dist/commands/incidents.d.ts +32 -0
  20. package/dist/commands/incidents.d.ts.map +1 -0
  21. package/dist/commands/incidents.js +94 -0
  22. package/dist/commands/incidents.js.map +1 -0
  23. package/dist/commands/policy.d.ts.map +1 -1
  24. package/dist/commands/policy.js +4 -1
  25. package/dist/commands/policy.js.map +1 -1
  26. package/dist/commands/settings.d.ts +5 -4
  27. package/dist/commands/settings.d.ts.map +1 -1
  28. package/dist/commands/settings.js +8 -6
  29. package/dist/commands/settings.js.map +1 -1
  30. package/dist/harness/openhands.d.ts.map +1 -1
  31. package/dist/harness/openhands.js +3 -4
  32. package/dist/harness/openhands.js.map +1 -1
  33. package/dist/lib/chaos/experiment.d.ts +18 -0
  34. package/dist/lib/chaos/experiment.d.ts.map +1 -0
  35. package/dist/lib/chaos/experiment.js +40 -0
  36. package/dist/lib/chaos/experiment.js.map +1 -0
  37. package/dist/lib/chaos/probes.d.ts +97 -0
  38. package/dist/lib/chaos/probes.d.ts.map +1 -0
  39. package/dist/lib/chaos/probes.js +191 -0
  40. package/dist/lib/chaos/probes.js.map +1 -0
  41. package/dist/lib/chaos/runner.d.ts +131 -0
  42. package/dist/lib/chaos/runner.d.ts.map +1 -0
  43. package/dist/lib/chaos/runner.js +340 -0
  44. package/dist/lib/chaos/runner.js.map +1 -0
  45. package/dist/lib/chaos/workspace.d.ts +70 -0
  46. package/dist/lib/chaos/workspace.d.ts.map +1 -0
  47. package/dist/lib/chaos/workspace.js +216 -0
  48. package/dist/lib/chaos/workspace.js.map +1 -0
  49. package/dist/lib/gitHooks.d.ts.map +1 -1
  50. package/dist/lib/gitHooks.js +6 -4
  51. package/dist/lib/gitHooks.js.map +1 -1
  52. package/dist/lib/providerProbe.d.ts +1 -1
  53. package/dist/lib/providerProbe.d.ts.map +1 -1
  54. package/dist/lib/providerProbe.js +13 -5
  55. package/dist/lib/providerProbe.js.map +1 -1
  56. package/dist/lib/sandbox/firecracker.d.ts.map +1 -1
  57. package/dist/lib/sandbox/firecracker.js +4 -1
  58. package/dist/lib/sandbox/firecracker.js.map +1 -1
  59. package/dist/lib/sandbox/image.d.ts +13 -4
  60. package/dist/lib/sandbox/image.d.ts.map +1 -1
  61. package/dist/lib/sandbox/image.js +25 -8
  62. package/dist/lib/sandbox/image.js.map +1 -1
  63. package/dist/lib/sandbox/oci.d.ts.map +1 -1
  64. package/dist/lib/sandbox/oci.js +18 -3
  65. package/dist/lib/sandbox/oci.js.map +1 -1
  66. package/dist/lib/sandbox/types.d.ts +6 -0
  67. package/dist/lib/sandbox/types.d.ts.map +1 -1
  68. package/package.json +6 -5
  69. package/resources/chaos/credential-revoked.yaml +28 -0
  70. package/resources/chaos/poisoned-readme.yaml +29 -0
  71. package/resources/chaos/registry-down.yaml +25 -0
  72. package/resources/sandbox/Dockerfile.node +19 -0
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Carrying the project's gates into a repetition's workspace.
3
+ *
4
+ * A repetition runs in a fresh worktree of HEAD, mounted in the sandbox at
5
+ * `/work`. What `intutic connect` generated for the project is usually not in
6
+ * it, and what is in it points at the host:
7
+ *
8
+ * - the gate scripts under `.intutic/hooks/` are normally untracked, so the
9
+ * worktree has none;
10
+ * - the harness hook settings name the gate by its absolute host path
11
+ * (`node /Users/me/proj/.intutic/hooks/claude-code-check.js`), and the gate
12
+ * scripts name their event logs the same way; neither path exists in the
13
+ * sandbox;
14
+ * - the policy snapshot the gates enforce, and the approved-bypass list they
15
+ * consult, live in the host's `~/.intutic/hooks/`, while the sandbox has an
16
+ * empty home of its own.
17
+ *
18
+ * {@link prepareWorkspace} copies the generated gates and any untracked hook
19
+ * settings from the host project into the worktree (never over a file the
20
+ * commit already has), rewrites the host project root to `/work` in the
21
+ * worktree's copies, copies the snapshot and the bypass list next to the
22
+ * runner's events, and returns the environment that points the gates at
23
+ * them. It writes only inside the worktree; the project is read, never
24
+ * changed.
25
+ *
26
+ * @module
27
+ */
28
+ import * as fs from 'node:fs/promises';
29
+ import * as path from 'node:path';
30
+ /** Where the worktree is mounted in the sandbox. */
31
+ export const SANDBOX_ROOT = '/work';
32
+ /** The generated gate scripts, relative to the project root. */
33
+ export const GATE_DIR = '.intutic/hooks';
34
+ /** Where a gate writes its decision and review logs, relative to the project root. */
35
+ export const GATE_EVENTS_DIR = '.intutic/events';
36
+ /**
37
+ * Project-level hook settings that register a gate by path: Claude Code's
38
+ * shared and local settings, Codex's and Cursor's project hooks. User-level
39
+ * settings (`~/.claude/settings.json` and the like) are not carried: the
40
+ * sandbox home is empty.
41
+ */
42
+ export const HARNESS_SETTINGS = [
43
+ '.claude/settings.json',
44
+ '.claude/settings.local.json',
45
+ '.codex/hooks.json',
46
+ '.cursor/hooks.json',
47
+ ];
48
+ const SNAPSHOT_BASENAME = 'policy-snapshot.rules';
49
+ const BYPASSES_BASENAME = 'approved-bypasses.jsonl';
50
+ /** Prepare one repetition's worktree so a harness inside the sandbox finds its gates. */
51
+ export async function prepareWorkspace(opts) {
52
+ const { hostRoot, workspace } = opts;
53
+ const out = { copied: [], rewritten: [], settings: [], gates: 0, env: {}, warnings: [] };
54
+ // 1. The generated gates, where the commit does not carry them.
55
+ for (const rel of await filesUnder(hostRoot, GATE_DIR)) {
56
+ if (await copyIfAbsent(path.join(hostRoot, rel), path.join(workspace, rel)))
57
+ out.copied.push(rel);
58
+ }
59
+ // 2. Hook settings the commit does not carry (settings.local.json is
60
+ // normally ignored).
61
+ for (const rel of HARNESS_SETTINGS) {
62
+ if (await copyIfAbsent(path.join(hostRoot, rel), path.join(workspace, rel)))
63
+ out.copied.push(rel);
64
+ if (await isFile(path.join(workspace, rel)))
65
+ out.settings.push(rel);
66
+ }
67
+ // 3. Host paths to sandbox paths, in the worktree's copies only.
68
+ const gateFiles = await filesUnder(workspace, GATE_DIR);
69
+ out.gates = gateFiles.length;
70
+ const targets = [...out.settings, ...gateFiles];
71
+ const pattern = hostRootPattern(await hostRoots(hostRoot, targets.map((rel) => path.join(workspace, rel))));
72
+ for (const rel of targets) {
73
+ if (await rewriteFile(path.join(workspace, rel), pattern))
74
+ out.rewritten.push(rel);
75
+ }
76
+ // 4. Where the gates write. The sandbox user is not the host user, so the
77
+ // directory must be writable by anyone; made here so the runner (and
78
+ // not that user) owns it and can remove it afterwards.
79
+ if (out.gates > 0) {
80
+ const events = path.join(workspace, GATE_EVENTS_DIR);
81
+ await fs.mkdir(events, { recursive: true });
82
+ await fs.chmod(events, 0o777);
83
+ }
84
+ // 5. What the gates read from the host's home.
85
+ const policyDir = path.join(workspace, opts.policyDir);
86
+ const sandboxPolicyDir = `${SANDBOX_ROOT}/${opts.policyDir.split(path.sep).join('/')}`;
87
+ if (opts.snapshotRules && (await isFile(opts.snapshotRules))) {
88
+ await fs.mkdir(policyDir, { recursive: true });
89
+ await fs.copyFile(opts.snapshotRules, path.join(policyDir, SNAPSHOT_BASENAME));
90
+ out.snapshot = opts.snapshotRules;
91
+ out.env.INTUTIC_SNAPSHOT_RULES = `${sandboxPolicyDir}/${SNAPSHOT_BASENAME}`;
92
+ }
93
+ if (opts.approvedBypasses && (await isFile(opts.approvedBypasses))) {
94
+ await fs.mkdir(policyDir, { recursive: true });
95
+ await fs.copyFile(opts.approvedBypasses, path.join(policyDir, BYPASSES_BASENAME));
96
+ out.env.INTUTIC_APPROVED_BYPASSES = `${sandboxPolicyDir}/${BYPASSES_BASENAME}`;
97
+ }
98
+ if (out.gates === 0) {
99
+ out.warnings.push(`no generated gates in ${path.join(hostRoot, GATE_DIR)} (has \`intutic connect\` run in this project?): ` +
100
+ 'a harness in the sandbox runs ungoverned, so the gate faults and the destructive-command tier cannot fire');
101
+ }
102
+ else if (!out.snapshot) {
103
+ out.warnings.push(`no policy snapshot at ${opts.snapshotRules ?? '~/.intutic/hooks/' + SNAPSHOT_BASENAME}: the gates in the sandbox ` +
104
+ 'enforce their built-in protections only, without the destructive-command tier or your rules');
105
+ }
106
+ return out;
107
+ }
108
+ /**
109
+ * Every spelling of the project root the files use: as given, as resolved,
110
+ * and any other absolute path in front of `/.intutic/` in `files` that
111
+ * resolves to the same directory. A project reached through a symlink (or
112
+ * macOS's /var, which is /private/var) was connected under one spelling and
113
+ * may be run from another.
114
+ */
115
+ async function hostRoots(hostRoot, files) {
116
+ const real = await realpathOr(hostRoot);
117
+ const roots = new Set([path.resolve(hostRoot), real]);
118
+ const candidates = new Set();
119
+ for (const file of files) {
120
+ let text;
121
+ try {
122
+ text = await fs.readFile(file, 'utf-8');
123
+ }
124
+ catch {
125
+ continue;
126
+ }
127
+ for (const m of text.matchAll(/(\/[^\s"'`:;,()[\]{}]*?)\/\.intutic\//g))
128
+ candidates.add(m[1]);
129
+ }
130
+ for (const c of candidates)
131
+ if (!roots.has(c) && (await realpathOr(c)) === real)
132
+ roots.add(c);
133
+ return [...roots].map((r) => r.replace(/[/\\]+$/, '')).filter(Boolean);
134
+ }
135
+ async function realpathOr(p) {
136
+ try {
137
+ return await fs.realpath(p);
138
+ }
139
+ catch {
140
+ return path.resolve(p);
141
+ }
142
+ }
143
+ /** Any of the roots, as a whole path component: `/a/proj` and `/a/proj/x`, never `/a/project`. */
144
+ function hostRootPattern(roots) {
145
+ const alternatives = roots
146
+ .sort((a, b) => b.length - a.length)
147
+ .map((r) => r.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
148
+ return new RegExp(`(?:${alternatives.join('|')})(?![^/\\\\"'\\s:;,)\\]}])`, 'g');
149
+ }
150
+ /** Replace the host root in a text file; true when it changed. Binary files are left alone. */
151
+ async function rewriteFile(file, pattern) {
152
+ let text;
153
+ try {
154
+ text = await fs.readFile(file, 'utf-8');
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ if (text.includes('\0'))
160
+ return false;
161
+ const next = text.replace(pattern, SANDBOX_ROOT);
162
+ if (next === text)
163
+ return false;
164
+ const { mode } = await fs.stat(file);
165
+ await fs.writeFile(file, next);
166
+ await fs.chmod(file, mode & 0o7777);
167
+ return true;
168
+ }
169
+ /** Copy `from` to `to` unless `to` exists or `from` does not; true when copied. */
170
+ async function copyIfAbsent(from, to) {
171
+ if (!(await isFile(from)) || (await exists(to)))
172
+ return false;
173
+ await fs.mkdir(path.dirname(to), { recursive: true });
174
+ await fs.copyFile(from, to);
175
+ return true;
176
+ }
177
+ /** Regular files under `root/dir`, relative to `root`, with `/` separators. */
178
+ async function filesUnder(root, dir) {
179
+ const out = [];
180
+ const walk = async (rel) => {
181
+ let entries;
182
+ try {
183
+ entries = await fs.readdir(path.join(root, rel), { withFileTypes: true });
184
+ }
185
+ catch {
186
+ return;
187
+ }
188
+ for (const e of entries) {
189
+ const child = `${rel}/${e.name}`;
190
+ if (e.isDirectory())
191
+ await walk(child);
192
+ else if (e.isFile())
193
+ out.push(child);
194
+ }
195
+ };
196
+ await walk(dir);
197
+ return out.sort();
198
+ }
199
+ async function isFile(p) {
200
+ try {
201
+ return (await fs.stat(p)).isFile();
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ async function exists(p) {
208
+ try {
209
+ await fs.lstat(p);
210
+ return true;
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ }
216
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/lib/chaos/workspace.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gitHooks.d.ts","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8IH;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkG7E"}
1
+ {"version":3,"file":"gitHooks.d.ts","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgJH;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkG7E"}
@@ -11,6 +11,7 @@
11
11
  import * as node_fs from 'node:fs/promises';
12
12
  import * as node_path from 'node:path';
13
13
  import { secretPatternAlternation } from '@intutic/shared-types';
14
+ import { writeFileAtomic } from '@intutic/sync-daemon/lib/atomicWrite';
14
15
  import { log } from './logger.js';
15
16
  /** Marker line identifying a post-commit/post-checkout hook as ours — the overwrite guard. */
16
17
  const GIT_CONTEXT_MARKER = '# Intutic Git Context Sync Hook';
@@ -109,8 +110,8 @@ exit 0
109
110
  *
110
111
  * Reads the existing file first: absent, or already carrying `marker` (a
111
112
  * previous install of this same hook, safe to overwrite with the current
112
- * content — this is what makes a re-run idempotent), writes `content` and
113
- * marks it executable. Anything else is a hook this codebase did not write —
113
+ * content — this is what makes a re-run idempotent), writes `content`
114
+ * executable, atomically. Anything else is a hook this codebase did not write —
114
115
  * left standing untouched, with `warnMessage` logged so the operator knows
115
116
  * why the hook they expected is missing.
116
117
  *
@@ -128,8 +129,9 @@ async function writeHookIfOursOrAbsent(hooksDir, name, content, marker, warnMess
128
129
  existing = null;
129
130
  }
130
131
  if (existing === null || existing.includes(marker)) {
131
- await node_fs.writeFile(hookPath, content, { encoding: 'utf-8', mode: 0o755 });
132
- await node_fs.chmod(hookPath, 0o755);
132
+ // Atomic: git runs the hook at moments this does not choose, and a hook
133
+ // read half-written is a pre-commit secret scan that never ran.
134
+ await writeFileAtomic(hookPath, content, { mode: 0o755 });
133
135
  return true;
134
136
  }
135
137
  log.warn(warnMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"gitHooks.js","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitHooks.js","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ export interface ProviderProbeOutcome {
21
21
  /**
22
22
  * Verify a credential the caller holds locally (not yet, or not necessarily,
23
23
  * saved anywhere). `fields` matches the provider's registry field shape,
24
- * e.g. `{apiKey: '...'}` for Anthropic, `{apiKey, endpoint, deploymentName}`
24
+ * e.g. `{apiKey: '...'}` for Anthropic, `{apiKey, endpoint}`
25
25
  * for Azure OpenAI.
26
26
  */
27
27
  export declare function probeProviderCredential(providerId: string, fields: Record<string, string>, timeoutMs?: number): Promise<ProviderProbeOutcome>;
@@ -1 +1 @@
1
- {"version":3,"file":"providerProbe.d.ts","sourceRoot":"","sources":["../../src/lib/providerProbe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAwE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE/H,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,SAAS,SAAS,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoC/B"}
1
+ {"version":3,"file":"providerProbe.d.ts","sourceRoot":"","sources":["../../src/lib/providerProbe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAqE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE5H,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,SAAS,SAAS,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA6C/B"}
@@ -12,11 +12,11 @@
12
12
  *
13
13
  * @module
14
14
  */
15
- import { buildVerificationProbe, classifyProbeResponse, getProviderDefinition } from '@intutic/shared-types';
15
+ import { buildVerificationProbeAsync, classifyProbe, getProviderDefinition } from '@intutic/shared-types';
16
16
  /**
17
17
  * Verify a credential the caller holds locally (not yet, or not necessarily,
18
18
  * saved anywhere). `fields` matches the provider's registry field shape,
19
- * e.g. `{apiKey: '...'}` for Anthropic, `{apiKey, endpoint, deploymentName}`
19
+ * e.g. `{apiKey: '...'}` for Anthropic, `{apiKey, endpoint}`
20
20
  * for Azure OpenAI.
21
21
  */
22
22
  export async function probeProviderCredential(providerId, fields, timeoutMs = 10_000) {
@@ -24,13 +24,19 @@ export async function probeProviderCredential(providerId, fields, timeoutMs = 10
24
24
  if (!def) {
25
25
  return { status: 'unsupported', detail: `Unknown provider '${providerId}'` };
26
26
  }
27
- const probe = buildVerificationProbe(providerId, fields);
27
+ const probe = await buildVerificationProbeAsync(providerId, fields);
28
28
  if (!probe) {
29
29
  return {
30
30
  status: 'unsupported',
31
31
  detail: `${def.displayName} cannot be verified automatically yet — double-check the credential by hand`,
32
32
  };
33
33
  }
34
+ if (probe.localVerdict) {
35
+ return {
36
+ status: probe.localVerdict,
37
+ detail: `${def.displayName}: ${probe.validDetail ?? 'the credential cannot be used'}`,
38
+ };
39
+ }
34
40
  try {
35
41
  const res = await fetch(probe.url, {
36
42
  method: probe.method,
@@ -38,12 +44,14 @@ export async function probeProviderCredential(providerId, fields, timeoutMs = 10
38
44
  ...(probe.body ? { body: probe.body } : {}),
39
45
  signal: AbortSignal.timeout(timeoutMs),
40
46
  });
41
- const verdict = classifyProbeResponse(res.status);
47
+ const verdict = classifyProbe(probe, res.status, res.headers);
42
48
  return {
43
49
  status: verdict,
44
50
  httpStatus: res.status,
45
51
  detail: verdict === 'valid'
46
- ? `${def.displayName} credential looks valid`
52
+ ? probe.validDetail
53
+ ? `${def.displayName}: ${probe.validDetail}`
54
+ : `${def.displayName} credential looks valid`
47
55
  : verdict === 'invalid'
48
56
  ? `${def.displayName} rejected the credential (HTTP ${res.status})`
49
57
  : `${def.displayName} returned HTTP ${res.status} — could not confirm either way`,
@@ -1 +1 @@
1
- {"version":3,"file":"providerProbe.js","sourceRoot":"","sources":["../../src/lib/providerProbe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,EAAqB,MAAM,uBAAuB,CAAA;AAQ/H;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,MAA8B,EAC9B,SAAS,GAAG,MAAM;IAElB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,UAAU,GAAG,EAAE,CAAA;IAC9E,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,6EAA6E;SACxG,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjD,OAAO;YACL,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,MAAM,EACJ,OAAO,KAAK,OAAO;gBACjB,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,yBAAyB;gBAC7C,CAAC,CAAC,OAAO,KAAK,SAAS;oBACrB,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,kCAAkC,GAAG,CAAC,MAAM,GAAG;oBACnE,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,kBAAkB,GAAG,CAAC,MAAM,iCAAiC;SACxF,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,WAAW,eAAe,OAAO,EAAE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"providerProbe.js","sourceRoot":"","sources":["../../src/lib/providerProbe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,qBAAqB,EAAqB,MAAM,uBAAuB,CAAA;AAQ5H;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,MAA8B,EAC9B,SAAS,GAAG,MAAM;IAElB,MAAM,GAAG,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,UAAU,GAAG,EAAE,CAAA;IAC9E,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,6EAA6E;SACxG,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,YAAY;YAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,+BAA+B,EAAE;SACtF,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;QAC7D,OAAO;YACL,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,MAAM,EACJ,OAAO,KAAK,OAAO;gBACjB,CAAC,CAAC,KAAK,CAAC,WAAW;oBACjB,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE;oBAC5C,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,yBAAyB;gBAC/C,CAAC,CAAC,OAAO,KAAK,SAAS;oBACrB,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,kCAAkC,GAAG,CAAC,MAAM,GAAG;oBACnE,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,kBAAkB,GAAG,CAAC,MAAM,iCAAiC;SACxF,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,WAAW,eAAe,OAAO,EAAE,EAAE,CAAA;IAClG,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"firecracker.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/firecracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5E,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,cAAc,EAAE,OAAO,CAAA;QACvB,YAAY,EAAE,OAAO,CAAA;KACtB,CAAC,CAAA;IACF,oBAAoB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxE,gBAAgB,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAkBlF;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AASD,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKjE;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IAiBhC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAoC9C"}
1
+ {"version":3,"file":"firecracker.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/firecracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5E,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,cAAc,EAAE,OAAO,CAAA;QACvB,YAAY,EAAE,OAAO,CAAA;KACtB,CAAC,CAAA;IACF,oBAAoB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxE,gBAAgB,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAkBlF;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AASD,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKjE;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IAiBhC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAsC9C"}
@@ -121,9 +121,12 @@ export class FirecrackerBackend {
121
121
  ];
122
122
  return new Promise((resolve) => {
123
123
  const child = spawn('bash', args, {
124
- stdio: 'inherit',
124
+ stdio: spec.onStdout ? ['inherit', 'pipe', 'inherit'] : 'inherit',
125
125
  env: { ...process.env, ...this.env },
126
126
  });
127
+ if (spec.onStdout)
128
+ child.stdout?.on('data', spec.onStdout);
129
+ spec.signal?.addEventListener('abort', () => child.kill('SIGTERM'), { once: true });
127
130
  child.on('error', (err) => {
128
131
  log.error(`firecracker launch failed: ${err.message}`);
129
132
  resolve(127);
@@ -1 +1 @@
1
- {"version":3,"file":"firecracker.js","sourceRoot":"","sources":["../../../src/lib/sandbox/firecracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firecracker.js","sourceRoot":"","sources":["../../../src/lib/sandbox/firecracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAkCjD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAwB;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/C,MAAM,QAAQ,GACZ,0DAA0D;QAC1D,MAAM,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,YAAY,CAAA;IAC3D,OAAO;QACL,aAAa,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;QAC1E,MAAM,EAAE;YACN;gBACE,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,IAAI,CAAC,UAAU;gBAC7B,cAAc,EAAE,IAAI;gBACpB,YAAY,EAAE,KAAK;aACpB;SACF;QACD,oBAAoB,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3E,gBAAgB,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE;KACxE,CAAA;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAA;IACnE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB;IACvB,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,kDAAkD,CAAC,CAAA;AAC/E,CAAC;AAED,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,aAAa,CAAA;IACZ,IAAI,CAAoB;IACxB,GAAG,CAAwB;IAE5C,YAAY,IAAwB,EAAE,GAA2B;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAA;QAC7F,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAA;QACxF,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAA;QACxF,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAA;QACnD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAA;QACvE,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAA;IACnF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAiB;QACzB,0EAA0E;QAC1E,0EAA0E;QAC1E,yEAAyE;QACzE,4EAA4E;QAC5E,sDAAsD;QACtD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAA;YACzD,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,IAAI,GAAG;YACX,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC5B,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;YAC/B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YAC7B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YACpC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO;SACtB,CAAA;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;gBAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBACjE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;aACrC,CAAC,CAAA;YACF,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1D,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACnF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,GAAG,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACtD,OAAO,CAAC,GAAG,CAAC,CAAA;YACd,CAAC,CAAC,CAAA;YACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The default sandbox image, built locally from the Dockerfile the CLI ships.
2
+ * The sandbox images, built locally from the Dockerfiles the CLI ships.
3
3
  *
4
4
  * There is no registry copy to pull: the default used to be
5
5
  * `intutic/sandbox:latest`, a name nothing publishes, so `intutic exec
@@ -8,19 +8,28 @@
8
8
  * which is in the npm package, so the first sandboxed run builds it and tags it
9
9
  * with the CLI version; later runs, and upgrades to the same version, reuse it.
10
10
  *
11
+ * A second well-known tag, `<default>-node`, is the default image plus Node.js
12
+ * and npm (`Dockerfile.node`), the base for agents that run on Node. It is
13
+ * built the same way, on first use, FROM the default image.
14
+ *
11
15
  * @module
12
16
  */
13
17
  /** The image `--sandbox-image` defaults to: built locally, tagged with this CLI's version. */
14
18
  export declare const DEFAULT_SANDBOX_IMAGE: string;
19
+ /**
20
+ * The default image plus Node.js and npm, for agents that run on Node (Claude
21
+ * Code, Codex, …): same entrypoint, firewall and capability drop.
22
+ */
23
+ export declare const NODE_SANDBOX_IMAGE: string;
15
24
  /** Directory holding the shipped Dockerfile and entrypoint. */
16
25
  export declare function sandboxBuildContext(): string;
17
26
  /** Runs a container-runtime command; resolves with its exit code. */
18
27
  export type RuntimeRunner = (runtime: string, args: string[], inheritOutput: boolean) => Promise<number>;
19
28
  /**
20
- * Make sure `image` can be run. Only the default image is built here; any
21
- * other name is the user's own and the runtime pulls it as usual.
29
+ * Make sure `image` can be run. Only the two well-known images are built here;
30
+ * any other name is the user's own and the runtime pulls it as usual.
22
31
  *
23
- * Throws with a message for the user when the default image is missing and
32
+ * Throws with a message for the user when a well-known image is missing and
24
33
  * cannot be built.
25
34
  */
26
35
  export declare function ensureSandboxImage(runtime: string, image: string, run?: RuntimeRunner, context?: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,QAA+B,CAAA;AAEjE,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AASxG;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,aAA4B,EACjC,OAAO,GAAE,MAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAcf"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,QAA+B,CAAA;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAkC,CAAA;AAEjE,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AASxG;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,aAA4B,EACjC,OAAO,GAAE,MAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The default sandbox image, built locally from the Dockerfile the CLI ships.
2
+ * The sandbox images, built locally from the Dockerfiles the CLI ships.
3
3
  *
4
4
  * There is no registry copy to pull: the default used to be
5
5
  * `intutic/sandbox:latest`, a name nothing publishes, so `intutic exec
@@ -8,6 +8,10 @@
8
8
  * which is in the npm package, so the first sandboxed run builds it and tags it
9
9
  * with the CLI version; later runs, and upgrades to the same version, reuse it.
10
10
  *
11
+ * A second well-known tag, `<default>-node`, is the default image plus Node.js
12
+ * and npm (`Dockerfile.node`), the base for agents that run on Node. It is
13
+ * built the same way, on first use, FROM the default image.
14
+ *
11
15
  * @module
12
16
  */
13
17
  import { spawn } from 'node:child_process';
@@ -19,6 +23,11 @@ import { log } from '../logger.js';
19
23
  const { version } = createRequire(import.meta.url)('../../../package.json');
20
24
  /** The image `--sandbox-image` defaults to: built locally, tagged with this CLI's version. */
21
25
  export const DEFAULT_SANDBOX_IMAGE = `intutic/sandbox:${version}`;
26
+ /**
27
+ * The default image plus Node.js and npm, for agents that run on Node (Claude
28
+ * Code, Codex, …): same entrypoint, firewall and capability drop.
29
+ */
30
+ export const NODE_SANDBOX_IMAGE = `${DEFAULT_SANDBOX_IMAGE}-node`;
22
31
  /** Directory holding the shipped Dockerfile and entrypoint. */
23
32
  export function sandboxBuildContext() {
24
33
  // src/lib/sandbox/image.ts and dist/lib/sandbox/image.js are the same depth.
@@ -31,23 +40,31 @@ const spawnRuntime = (runtime, args, inheritOutput) => new Promise((resolve) =>
31
40
  child.on('exit', (code) => resolve(code ?? 1));
32
41
  });
33
42
  /**
34
- * Make sure `image` can be run. Only the default image is built here; any
35
- * other name is the user's own and the runtime pulls it as usual.
43
+ * Make sure `image` can be run. Only the two well-known images are built here;
44
+ * any other name is the user's own and the runtime pulls it as usual.
36
45
  *
37
- * Throws with a message for the user when the default image is missing and
46
+ * Throws with a message for the user when a well-known image is missing and
38
47
  * cannot be built.
39
48
  */
40
49
  export async function ensureSandboxImage(runtime, image, run = spawnRuntime, context = sandboxBuildContext()) {
41
- if (image !== DEFAULT_SANDBOX_IMAGE)
50
+ if (image !== DEFAULT_SANDBOX_IMAGE && image !== NODE_SANDBOX_IMAGE)
42
51
  return;
43
52
  if ((await run(runtime, ['image', 'inspect', image], false)) === 0)
44
53
  return;
45
- if (!existsSync(path.join(context, 'Dockerfile'))) {
46
- throw new Error(`the sandbox Dockerfile is not part of this installation (${context}). ` +
54
+ const node = image === NODE_SANDBOX_IMAGE;
55
+ const dockerfile = path.join(context, node ? 'Dockerfile.node' : 'Dockerfile');
56
+ if (!existsSync(dockerfile)) {
57
+ throw new Error(`the sandbox Dockerfile is not part of this installation (${dockerfile}). ` +
47
58
  'Install the CLI from npm, or pass --sandbox-image with your own image.');
48
59
  }
60
+ // The Node image is built FROM the default one, so that comes first.
61
+ if (node)
62
+ await ensureSandboxImage(runtime, DEFAULT_SANDBOX_IMAGE, run, context);
49
63
  log.info(`Building the sandbox image ${image} (first sandboxed run with this CLI version)…`);
50
- if ((await run(runtime, ['build', '-t', image, context], true)) !== 0) {
64
+ const args = node
65
+ ? ['build', '-f', dockerfile, '--build-arg', `INTUTIC_SANDBOX_BASE=${DEFAULT_SANDBOX_IMAGE}`, '-t', image, context]
66
+ : ['build', '-t', image, context];
67
+ if ((await run(runtime, args, true)) !== 0) {
51
68
  throw new Error(`${runtime} build of ${image} failed; see the output above`);
52
69
  }
53
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/lib/sandbox/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAElC,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAwB,CAAA;AAElG,8FAA8F;AAC9F,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,OAAO,EAAE,CAAA;AAEjE,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB;IACjC,6EAA6E;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAA;AACzD,CAAC;AAKD,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CACnE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IACnF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,KAAa,EACb,MAAqB,YAAY,EACjC,UAAkB,mBAAmB,EAAE;IAEvC,IAAI,KAAK,KAAK,qBAAqB;QAAE,OAAM;IAC3C,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;QAAE,OAAM;IAE1E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,4DAA4D,OAAO,KAAK;YACtE,wEAAwE,CAC3E,CAAA;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,8BAA8B,KAAK,+CAA+C,CAAC,CAAA;IAC5F,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,aAAa,KAAK,+BAA+B,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/lib/sandbox/image.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"oci.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/oci.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAoC7E;AAED,qBAAa,UAAW,YAAW,cAAc;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMtD,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IAgBhC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAuB9C"}
1
+ {"version":3,"file":"oci.d.ts","sourceRoot":"","sources":["../../../src/lib/sandbox/oci.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CA0C7E;AAED,qBAAa,UAAW,YAAW,cAAc;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMtD,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IAgBhC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CA8B9C"}
@@ -28,6 +28,8 @@ import { ensureSandboxImage } from './image.js';
28
28
  */
29
29
  export function buildOciArgs(runtime, spec) {
30
30
  const args = ['run', '--rm'];
31
+ if (spec.name)
32
+ args.push('--name', spec.name);
31
33
  // -i always (pipe stdin); -t only when we have a real terminal.
32
34
  args.push(spec.tty ? '-it' : '-i');
33
35
  // Capability envelope: drop everything, add back only what the entrypoint
@@ -39,8 +41,12 @@ export function buildOciArgs(runtime, spec) {
39
41
  args.push('--security-opt=no-new-privileges');
40
42
  // Immutable rootfs with writable scratch.
41
43
  args.push('--read-only');
42
- for (const t of ['/tmp', '/run', '/home/sandbox'])
43
- args.push('--tmpfs', t);
44
+ // A tmpfs is mounted root-owned, mode 755 unless told otherwise, so the
45
+ // agent's own home would be read-only to the unprivileged user it runs as,
46
+ // and every agent that keeps state there (Claude Code's ~/.claude, an MCP
47
+ // proxy's pins) would fail. The entrypoint cannot chown it (no CAP_CHOWN),
48
+ // so it is mounted writable for whichever uid the image's `sandbox` user has.
49
+ args.push('--tmpfs', '/tmp', '--tmpfs', '/run', '--tmpfs', '/home/sandbox:mode=1777');
44
50
  // Resource bounds.
45
51
  args.push(`--pids-limit=${spec.pidsLimit}`);
46
52
  args.push(`--memory=${spec.memory}`);
@@ -87,10 +93,19 @@ export class OciBackend {
87
93
  log.dim(`sandbox: ${this.runtime} ${args.slice(0, 12).join(' ')} …`);
88
94
  return new Promise((resolve) => {
89
95
  const child = spawn(this.runtime, args, {
90
- stdio: 'inherit',
96
+ stdio: spec.onStdout ? ['inherit', 'pipe', 'inherit'] : 'inherit',
91
97
  // Values for the `--env NAME` references live here, not in argv.
92
98
  env: { ...process.env, ...this.env },
93
99
  });
100
+ if (spec.onStdout)
101
+ child.stdout?.on('data', spec.onStdout);
102
+ // Killing the `docker run` client can leave the container running, so
103
+ // stop it by name when there is one.
104
+ spec.signal?.addEventListener('abort', () => {
105
+ if (spec.name)
106
+ spawn(this.runtime, ['kill', spec.name], { stdio: 'ignore' }).on('error', () => { });
107
+ child.kill('SIGTERM');
108
+ }, { once: true });
94
109
  child.on('error', (err) => {
95
110
  if (err.code === 'ENOENT') {
96
111
  log.error(`Sandbox runtime '${this.runtime}' not found. Install Docker or Podman.`);
@@ -1 +1 @@
1
- {"version":3,"file":"oci.js","sourceRoot":"","sources":["../../../src/lib/sandbox/oci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oci.js","sourceRoot":"","sources":["../../../src/lib/sandbox/oci.ts"],"names":[],"mappings":"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"}