@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.
- package/dist/cli.js +133 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/budgetLimits.d.ts +70 -0
- package/dist/commands/budgetLimits.d.ts.map +1 -0
- package/dist/commands/budgetLimits.js +223 -0
- package/dist/commands/budgetLimits.js.map +1 -0
- package/dist/commands/chaos.d.ts +40 -0
- package/dist/commands/chaos.d.ts.map +1 -0
- package/dist/commands/chaos.js +252 -0
- package/dist/commands/chaos.js.map +1 -0
- package/dist/commands/credentials.d.ts +5 -1
- package/dist/commands/credentials.d.ts.map +1 -1
- package/dist/commands/credentials.js +98 -9
- package/dist/commands/credentials.js.map +1 -1
- package/dist/commands/exec.d.ts +29 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +72 -35
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/incidents.d.ts +32 -0
- package/dist/commands/incidents.d.ts.map +1 -0
- package/dist/commands/incidents.js +94 -0
- package/dist/commands/incidents.js.map +1 -0
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +4 -1
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/settings.d.ts +5 -4
- package/dist/commands/settings.d.ts.map +1 -1
- package/dist/commands/settings.js +8 -6
- package/dist/commands/settings.js.map +1 -1
- package/dist/harness/openhands.d.ts.map +1 -1
- package/dist/harness/openhands.js +3 -4
- package/dist/harness/openhands.js.map +1 -1
- package/dist/lib/chaos/experiment.d.ts +18 -0
- package/dist/lib/chaos/experiment.d.ts.map +1 -0
- package/dist/lib/chaos/experiment.js +40 -0
- package/dist/lib/chaos/experiment.js.map +1 -0
- package/dist/lib/chaos/probes.d.ts +97 -0
- package/dist/lib/chaos/probes.d.ts.map +1 -0
- package/dist/lib/chaos/probes.js +191 -0
- package/dist/lib/chaos/probes.js.map +1 -0
- package/dist/lib/chaos/runner.d.ts +131 -0
- package/dist/lib/chaos/runner.d.ts.map +1 -0
- package/dist/lib/chaos/runner.js +340 -0
- package/dist/lib/chaos/runner.js.map +1 -0
- package/dist/lib/chaos/workspace.d.ts +70 -0
- package/dist/lib/chaos/workspace.d.ts.map +1 -0
- package/dist/lib/chaos/workspace.js +216 -0
- package/dist/lib/chaos/workspace.js.map +1 -0
- package/dist/lib/gitHooks.d.ts.map +1 -1
- package/dist/lib/gitHooks.js +6 -4
- package/dist/lib/gitHooks.js.map +1 -1
- package/dist/lib/providerProbe.d.ts +1 -1
- package/dist/lib/providerProbe.d.ts.map +1 -1
- package/dist/lib/providerProbe.js +13 -5
- package/dist/lib/providerProbe.js.map +1 -1
- package/dist/lib/sandbox/firecracker.d.ts.map +1 -1
- package/dist/lib/sandbox/firecracker.js +4 -1
- package/dist/lib/sandbox/firecracker.js.map +1 -1
- package/dist/lib/sandbox/image.d.ts +13 -4
- package/dist/lib/sandbox/image.d.ts.map +1 -1
- package/dist/lib/sandbox/image.js +25 -8
- package/dist/lib/sandbox/image.js.map +1 -1
- package/dist/lib/sandbox/oci.d.ts.map +1 -1
- package/dist/lib/sandbox/oci.js +18 -3
- package/dist/lib/sandbox/oci.js.map +1 -1
- package/dist/lib/sandbox/types.d.ts +6 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/resources/chaos/credential-revoked.yaml +28 -0
- package/resources/chaos/poisoned-readme.yaml +29 -0
- package/resources/chaos/registry-down.yaml +25 -0
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,oDAAoD;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAA;AAEnC,gEAAgE;AAChE,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAA;AAExC,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,uBAAuB;IACvB,6BAA6B;IAC7B,mBAAmB;IACnB,oBAAoB;CACZ,CAAA;AA+BV,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AACjD,MAAM,iBAAiB,GAAG,yBAAyB,CAAA;AAEnD,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACzD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IACpC,MAAM,GAAG,GAAsB,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IAE3G,gEAAgE;IAChE,KAAK,MAAM,GAAG,IAAI,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnG,CAAC;IACD,qEAAqE;IACrE,wBAAwB;IACxB,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjG,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrE,CAAC;IAED,iEAAiE;IACjE,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACvD,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAA;IAC5B,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3G,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;YAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpF,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,0DAA0D;IAC1D,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;QACpD,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACtD,MAAM,gBAAgB,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IACtF,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9C,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAA;QAC9E,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAA;QACjC,GAAG,CAAC,GAAG,CAAC,sBAAsB,GAAG,GAAG,gBAAgB,IAAI,iBAAiB,EAAE,CAAA;IAC7E,CAAC;IACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9C,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAA;QACjF,GAAG,CAAC,GAAG,CAAC,yBAAyB,GAAG,GAAG,gBAAgB,IAAI,iBAAiB,EAAE,CAAA;IAChF,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,QAAQ,CAAC,IAAI,CACf,yBAAyB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,mDAAmD;YACvG,2GAA2G,CAC9G,CAAA;IACH,CAAC;SAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,IAAI,CACf,yBAAyB,IAAI,CAAC,aAAa,IAAI,mBAAmB,GAAG,iBAAiB,6BAA6B;YACjH,6FAA6F,CAChG,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAwB;IACjE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAA;IAChG,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7F,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACxE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,YAAY,GAAG,KAAK;SACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,OAAO,IAAI,MAAM,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;AAClF,CAAC;AAED,+FAA+F;AAC/F,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACtD,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAChD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;IACnC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,EAAU;IAClD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC3B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,GAAW;IACjD,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;QAChD,IAAI,OAAO,CAAA;QACX,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;YAChC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;iBACjC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,CAAA;IACD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitHooks.d.ts","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
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"}
|
package/dist/lib/gitHooks.js
CHANGED
|
@@ -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`
|
|
113
|
-
*
|
|
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
|
-
|
|
132
|
-
|
|
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);
|
package/dist/lib/gitHooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitHooks.js","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,8FAA8F;AAC9F,MAAM,kBAAkB,GAAG,iCAAiC,CAAA;AAE5D,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,kCAAkC,CAAA;AAE5D,8FAA8F;AAC9F,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAEtE;;;;;GAKG;AACH,SAAS,qBAAqB;IAC5B,OAAO;;EAEP,kBAAkB;;;;CAInB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB;IACvB,OAAO;;EAEP,iBAAiB;;;;CAIlB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,gBAAgB;IACvB,OAAO;;EAEP,iBAAiB;;;;oGAIiF,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsB7H,CAAC,SAAS,EAAE,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,uBAAuB,CACpC,QAAgB,EAChB,IAAY,EACZ,OAAe,EACf,MAAc,EACd,WAAmB;IAEnB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/C,IAAI,QAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,
|
|
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
|
|
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,
|
|
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 {
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
?
|
|
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,
|
|
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;
|
|
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":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/lib/sandbox/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;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;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,qBAAqB,OAAO,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,IAAI,KAAK,KAAK,kBAAkB;QAAE,OAAM;IAC3E,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;QAAE,OAAM;IAE1E,MAAM,IAAI,GAAG,KAAK,KAAK,kBAAkB,CAAA;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAC9E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,4DAA4D,UAAU,KAAK;YACzE,wEAAwE,CAC3E,CAAA;IACH,CAAC;IACD,qEAAqE;IACrE,IAAI,IAAI;QAAE,MAAM,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAChF,GAAG,CAAC,IAAI,CAAC,8BAA8B,KAAK,+CAA+C,CAAC,CAAA;IAC5F,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,wBAAwB,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;QACnH,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,aAAa,KAAK,+BAA+B,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC"}
|
|
@@ -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,
|
|
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"}
|
package/dist/lib/sandbox/oci.js
CHANGED
|
@@ -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
|
-
|
|
43
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAK/C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAmB,EAAE,IAAiB;IACjE,MAAM,IAAI,GAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtC,gEAAgE;IAChE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAElC,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAE7C,0CAA0C;IAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACxB,
|
|
1
|
+
{"version":3,"file":"oci.js","sourceRoot":"","sources":["../../../src/lib/sandbox/oci.ts"],"names":[],"mappings":"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"}
|