@kenkaiiii/ggcoder 5.30.3 → 5.32.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/app-sidecar.js +40 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-compaction.test.js +36 -1
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +41 -12
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts +10 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +31 -2
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +32 -0
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/query-aware-selector.d.ts +33 -0
- package/dist/core/compaction/query-aware-selector.d.ts.map +1 -0
- package/dist/core/compaction/query-aware-selector.js +202 -0
- package/dist/core/compaction/query-aware-selector.js.map +1 -0
- package/dist/core/compaction/query-aware-selector.test.d.ts +2 -0
- package/dist/core/compaction/query-aware-selector.test.d.ts.map +1 -0
- package/dist/core/compaction/query-aware-selector.test.js +96 -0
- package/dist/core/compaction/query-aware-selector.test.js.map +1 -0
- package/dist/core/event-bus.d.ts +6 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +28 -8
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/plugin-bundles.d.ts +23 -0
- package/dist/core/extensions/plugin-bundles.d.ts.map +1 -0
- package/dist/core/extensions/plugin-bundles.js +228 -0
- package/dist/core/extensions/plugin-bundles.js.map +1 -0
- package/dist/core/extensions/plugin-bundles.test.d.ts +2 -0
- package/dist/core/extensions/plugin-bundles.test.d.ts.map +1 -0
- package/dist/core/extensions/plugin-bundles.test.js +110 -0
- package/dist/core/extensions/plugin-bundles.test.js.map +1 -0
- package/dist/core/ken-context.d.ts.map +1 -1
- package/dist/core/ken-context.js +8 -0
- package/dist/core/ken-context.js.map +1 -1
- package/dist/core/ken-context.test.js +40 -0
- package/dist/core/ken-context.test.js.map +1 -1
- package/dist/core/ken-prompt.js +3 -0
- package/dist/core/ken-prompt.js.map +1 -1
- package/dist/core/ken-prompt.test.js +5 -0
- package/dist/core/ken-prompt.test.js.map +1 -1
- package/dist/core/persistent-shell.d.ts +3 -2
- package/dist/core/persistent-shell.d.ts.map +1 -1
- package/dist/core/persistent-shell.js +6 -2
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager.d.ts +2 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +2 -2
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/sandbox-domains.d.ts +14 -0
- package/dist/core/sandbox-domains.d.ts.map +1 -0
- package/dist/core/sandbox-domains.js +76 -0
- package/dist/core/sandbox-domains.js.map +1 -0
- package/dist/core/sandbox-feedback.d.ts +22 -0
- package/dist/core/sandbox-feedback.d.ts.map +1 -0
- package/dist/core/sandbox-feedback.js +69 -0
- package/dist/core/sandbox-feedback.js.map +1 -0
- package/dist/core/sandbox-feedback.test.d.ts +2 -0
- package/dist/core/sandbox-feedback.test.d.ts.map +1 -0
- package/dist/core/sandbox-feedback.test.js +32 -0
- package/dist/core/sandbox-feedback.test.js.map +1 -0
- package/dist/core/sandbox.d.ts +91 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +254 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/sandbox.test.d.ts +2 -0
- package/dist/core/sandbox.test.d.ts.map +1 -0
- package/dist/core/sandbox.test.js +157 -0
- package/dist/core/sandbox.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +5 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +20 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/verification-evidence.d.ts +17 -0
- package/dist/core/verification-evidence.d.ts.map +1 -0
- package/dist/core/verification-evidence.js +283 -0
- package/dist/core/verification-evidence.js.map +1 -0
- package/dist/core/verification-evidence.test.d.ts +2 -0
- package/dist/core/verification-evidence.test.d.ts.map +1 -0
- package/dist/core/verification-evidence.test.js +103 -0
- package/dist/core/verification-evidence.test.js.map +1 -0
- package/dist/modes/acp-mode.d.ts +13 -0
- package/dist/modes/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp-mode.js +101 -0
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/acp-mode.test.js +80 -9
- package/dist/modes/acp-mode.test.js.map +1 -1
- package/dist/tools/bash.d.ts +2 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +54 -16
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-only-bash.d.ts +3 -0
- package/dist/tools/read-only-bash.d.ts.map +1 -1
- package/dist/tools/read-only-bash.js +7 -9
- package/dist/tools/read-only-bash.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import { realpathSync } from "node:fs";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { log } from "./logger.js";
|
|
9
|
+
import { getAppPaths } from "../config.js";
|
|
10
|
+
import { DEFAULT_ALLOWED_DOMAINS } from "./sandbox-domains.js";
|
|
11
|
+
/**
|
|
12
|
+
* Environment applied only to sandboxed commands.
|
|
13
|
+
*
|
|
14
|
+
* The sandbox permanently protects `.git/hooks`, and git's only reason to write
|
|
15
|
+
* there is copying inert `*.sample` templates during `init`/`clone` — which
|
|
16
|
+
* fails the whole command. Pointing git at an empty template directory removes
|
|
17
|
+
* that write, so cloning works with hook protection fully intact.
|
|
18
|
+
*/
|
|
19
|
+
export const SANDBOX_ENV_PATCH = {
|
|
20
|
+
GIT_TEMPLATE_DIR: "",
|
|
21
|
+
};
|
|
22
|
+
const SANDBOX_CONFIG_DIR = path.join(os.homedir(), ".gg", "sandbox-configs");
|
|
23
|
+
const PROBE_TIMEOUT_MS = 20_000;
|
|
24
|
+
let warnedUnsupported = false;
|
|
25
|
+
function sensitiveReadPaths(home) {
|
|
26
|
+
return [
|
|
27
|
+
path.join(home, ".ssh"),
|
|
28
|
+
path.join(home, ".aws"),
|
|
29
|
+
path.join(home, ".gnupg"),
|
|
30
|
+
path.join(home, ".kube"),
|
|
31
|
+
path.join(home, ".config", "gcloud"),
|
|
32
|
+
path.join(home, ".azure"),
|
|
33
|
+
path.join(home, ".gg", "auth.json"),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Package-manager caches that live outside the workspace.
|
|
38
|
+
*
|
|
39
|
+
* `npm install`, `cargo build`, `go mod download` and friends all write to a
|
|
40
|
+
* shared cache in $HOME; without these the sandbox looks like it "breaks npm".
|
|
41
|
+
* Everything here is regenerable build state — no credentials, which stay
|
|
42
|
+
* unreadable via {@link sensitiveReadPaths}.
|
|
43
|
+
*/
|
|
44
|
+
function toolCacheDirs(home) {
|
|
45
|
+
return [
|
|
46
|
+
path.join(home, ".npm"),
|
|
47
|
+
path.join(home, ".cache"),
|
|
48
|
+
path.join(home, "Library", "Caches"),
|
|
49
|
+
path.join(home, ".pnpm-store"),
|
|
50
|
+
path.join(home, ".yarn"),
|
|
51
|
+
path.join(home, ".bun"),
|
|
52
|
+
path.join(home, ".deno"),
|
|
53
|
+
path.join(home, ".cargo"),
|
|
54
|
+
path.join(home, ".rustup"),
|
|
55
|
+
path.join(home, "go", "pkg", "mod"),
|
|
56
|
+
path.join(home, ".m2"),
|
|
57
|
+
path.join(home, ".gradle"),
|
|
58
|
+
path.join(home, ".gem"),
|
|
59
|
+
path.join(home, ".bundle"),
|
|
60
|
+
path.join(home, ".nuget"),
|
|
61
|
+
path.join(home, ".composer"),
|
|
62
|
+
path.join(home, ".local", "share", "virtualenvs"),
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A path plus its symlink-resolved twin.
|
|
67
|
+
*
|
|
68
|
+
* macOS resolves /tmp to /private/tmp and /var/folders to /private/var/folders.
|
|
69
|
+
* The sandbox matches on the real path, so listing only the symlink silently
|
|
70
|
+
* denies every write to the system temp directory.
|
|
71
|
+
*/
|
|
72
|
+
function withRealPath(target) {
|
|
73
|
+
try {
|
|
74
|
+
const real = realpathSync(target);
|
|
75
|
+
return real === target ? [target] : [target, real];
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [target];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Pure policy builder, exported so the security boundary is regression-tested. */
|
|
82
|
+
export function buildSandboxSettings(cwd, policy, platform = process.platform) {
|
|
83
|
+
const workspace = path.resolve(cwd);
|
|
84
|
+
const temp = path.resolve(os.tmpdir());
|
|
85
|
+
const home = os.homedir();
|
|
86
|
+
const allowedDomains = [
|
|
87
|
+
...new Set([...(policy.strictDomains ? [] : DEFAULT_ALLOWED_DOMAINS), ...policy.allowedDomains]
|
|
88
|
+
.map((host) => host.trim())
|
|
89
|
+
.filter(Boolean)),
|
|
90
|
+
].sort();
|
|
91
|
+
// Mirror resolveWriteGuard's roots. The sandbox must never be stricter than
|
|
92
|
+
// the write guard the user already controls, or bash silently loses
|
|
93
|
+
// multi-root workspaces and the documented outside-workspace opt-out.
|
|
94
|
+
const writeRoots = [
|
|
95
|
+
...new Set([
|
|
96
|
+
workspace,
|
|
97
|
+
...(policy.additionalRoots ?? []).map((root) => path.resolve(root)),
|
|
98
|
+
temp,
|
|
99
|
+
// The conventional scratch dir, distinct from os.tmpdir() on macOS.
|
|
100
|
+
...(platform === "win32" ? [] : ["/tmp"]),
|
|
101
|
+
path.resolve(getAppPaths().agentDir),
|
|
102
|
+
...toolCacheDirs(home),
|
|
103
|
+
...(policy.allowOutsideWorkspaceWrites ? [home] : []),
|
|
104
|
+
].flatMap(withRealPath)),
|
|
105
|
+
];
|
|
106
|
+
return {
|
|
107
|
+
network: {
|
|
108
|
+
allowedDomains,
|
|
109
|
+
deniedDomains: [],
|
|
110
|
+
strictAllowlist: true,
|
|
111
|
+
allowUnixSockets: [],
|
|
112
|
+
// Dev servers, preview servers and the screenshot tool all bind a local
|
|
113
|
+
// port. Loopback never leaves the machine, so blocking it costs core
|
|
114
|
+
// workflows without buying containment.
|
|
115
|
+
allowLocalBinding: true,
|
|
116
|
+
},
|
|
117
|
+
...(platform === "darwin" ? { enableWeakerNetworkIsolation: true } : {}),
|
|
118
|
+
filesystem: {
|
|
119
|
+
denyRead: sensitiveReadPaths(home),
|
|
120
|
+
// SRT adds its platform-required temporary paths; these are the only
|
|
121
|
+
// product-owned write roots supplied by GG Coder.
|
|
122
|
+
allowWrite: platform === "win32" ? writeRoots : [...writeRoots, "/dev/null"],
|
|
123
|
+
// `.git/hooks` is a mandatory sandbox protection with no opt-out, which
|
|
124
|
+
// is worth keeping: it stops a command installing a hook that later runs
|
|
125
|
+
// unsandboxed. `git clone`/`git init` only write there to copy inert
|
|
126
|
+
// `.sample` files, which SANDBOX_ENV_PATCH turns off.
|
|
127
|
+
//
|
|
128
|
+
// `.git/config` must be writable or `git init`, `git remote add` and
|
|
129
|
+
// `git clone` all fail outright.
|
|
130
|
+
allowGitConfig: true,
|
|
131
|
+
// Resolve the workspace first: on macOS the sandbox matches real paths, so
|
|
132
|
+
// a deny rule built from the symlinked path (/var/... vs /private/var/...)
|
|
133
|
+
// silently never matches.
|
|
134
|
+
denyWrite: withRealPath(workspace).flatMap((root) => [
|
|
135
|
+
path.join(root, ".env"),
|
|
136
|
+
path.join(root, ".env.local"),
|
|
137
|
+
]),
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function resolveSandboxCli() {
|
|
142
|
+
const packageEntry = import.meta.resolve("@anthropic-ai/sandbox-runtime");
|
|
143
|
+
return path.join(path.dirname(fileURLToPath(packageEntry)), "cli.js");
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Does this machine actually support OS sandboxing? SRT reports missing
|
|
147
|
+
* bubblewrap/socat or an unprovisioned Windows sandbox user only when it
|
|
148
|
+
* initializes, so probe once per process with a trivial command instead of
|
|
149
|
+
* reimplementing its per-platform dependency matrix.
|
|
150
|
+
*/
|
|
151
|
+
let supportProbe = null;
|
|
152
|
+
export function resetSandboxSupportProbeForTests() {
|
|
153
|
+
supportProbe = null;
|
|
154
|
+
warnedUnsupported = false;
|
|
155
|
+
}
|
|
156
|
+
function probeSandboxSupport(settingsPath) {
|
|
157
|
+
supportProbe ??= new Promise((resolve) => {
|
|
158
|
+
let child;
|
|
159
|
+
try {
|
|
160
|
+
child = spawn(process.execPath, [resolveSandboxCli(), "--settings", settingsPath, "-c", "exit 0"], {
|
|
161
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
resolve({ supported: false, reason: error.message });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
let stderr = "";
|
|
169
|
+
child.stderr?.on("data", (chunk) => {
|
|
170
|
+
stderr = `${stderr}${chunk.toString("utf8")}`.slice(-500);
|
|
171
|
+
});
|
|
172
|
+
const timer = setTimeout(() => {
|
|
173
|
+
child.kill("SIGKILL");
|
|
174
|
+
resolve({ supported: false, reason: "sandbox probe timed out" });
|
|
175
|
+
}, PROBE_TIMEOUT_MS);
|
|
176
|
+
timer.unref?.();
|
|
177
|
+
child.once("error", (error) => {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
resolve({ supported: false, reason: error.message });
|
|
180
|
+
});
|
|
181
|
+
child.once("exit", (code) => {
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
resolve({
|
|
184
|
+
supported: code === 0,
|
|
185
|
+
reason: code === 0 ? "ok" : stderr.trim() || `sandbox probe exited with code ${code}`,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
return supportProbe;
|
|
190
|
+
}
|
|
191
|
+
async function writeStableSettings(settings) {
|
|
192
|
+
const json = `${JSON.stringify(settings, null, 2)}\n`;
|
|
193
|
+
const digest = createHash("sha256").update(json).digest("hex").slice(0, 20);
|
|
194
|
+
const settingsPath = path.join(SANDBOX_CONFIG_DIR, `${digest}.json`);
|
|
195
|
+
await fs.mkdir(SANDBOX_CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
196
|
+
try {
|
|
197
|
+
await fs.writeFile(settingsPath, json, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error.code !== "EEXIST")
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
return settingsPath;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Known limitations when `sandboxMode` is enabled (upstream, not fixable here):
|
|
207
|
+
*
|
|
208
|
+
* - **Linux pipes/redirections**: `echo hi | grep hi` fails with "Permission
|
|
209
|
+
* denied" on /proc/self/fd/3 because bash's pipe setup clobbers the fd the
|
|
210
|
+
* seccomp filter arrives on (sandbox-runtime#261).
|
|
211
|
+
* - **git over SSH**: `git@host:` remotes fail the SOCKS handshake on macOS —
|
|
212
|
+
* the injected ProxyCommand uses `nc`, which cannot authenticate. HTTPS
|
|
213
|
+
* remotes work. `~/.ssh` is also unreadable by design.
|
|
214
|
+
* - **`git config --global`**: `~/.gitconfig` is a mandatory upstream write
|
|
215
|
+
* protection with no opt-out. Repo-local `git config` works.
|
|
216
|
+
* - **Corporate TLS interception / private registries**: need the CA and
|
|
217
|
+
* registry host configured explicitly.
|
|
218
|
+
* - **Ubuntu 24.04+**: AppArmor blocks the sandbox entirely, so `auto`
|
|
219
|
+
* degrades to no isolation (sandbox-runtime#428, #429).
|
|
220
|
+
*
|
|
221
|
+
* These are why the default is `off`; revisit when fixed upstream.
|
|
222
|
+
*/
|
|
223
|
+
/**
|
|
224
|
+
* Wrap an already-resolved shell with Anthropic's cross-platform OS sandbox.
|
|
225
|
+
* Initialization and dependency failures remain visible and fail closed: the
|
|
226
|
+
* original command is never spawned outside the sandbox as an implicit fallback.
|
|
227
|
+
*/
|
|
228
|
+
export async function prepareSandboxLaunch(shell, cwd, policy) {
|
|
229
|
+
if (policy.mode === "off")
|
|
230
|
+
return { ...shell, sandboxed: false };
|
|
231
|
+
const settingsPath = await writeStableSettings(buildSandboxSettings(cwd, policy));
|
|
232
|
+
const support = await probeSandboxSupport(settingsPath);
|
|
233
|
+
if (!support.supported) {
|
|
234
|
+
if (policy.mode === "workspace") {
|
|
235
|
+
throw new Error(`${support.reason}. Install the OS sandbox prerequisites ` +
|
|
236
|
+
`(Linux: bubblewrap + socat; Windows: run \`srt windows-install\`), ` +
|
|
237
|
+
`or set sandboxMode to "auto" to run without OS isolation.`);
|
|
238
|
+
}
|
|
239
|
+
if (!warnedUnsupported) {
|
|
240
|
+
warnedUnsupported = true;
|
|
241
|
+
log("WARN", "sandbox", "OS sandbox unavailable; commands run unisolated", {
|
|
242
|
+
reason: support.reason,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return { ...shell, sandboxed: false };
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
file: process.execPath,
|
|
249
|
+
args: [resolveSandboxCli(), "--settings", settingsPath, "--", shell.file, ...shell.args],
|
|
250
|
+
isCmdFallback: shell.isCmdFallback,
|
|
251
|
+
sandboxed: true,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/core/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.test.d.ts","sourceRoot":"","sources":["../../src/core/sandbox.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { getAppPaths } from "../config.js";
|
|
6
|
+
import { DEFAULT_SETTINGS } from "./settings-manager.js";
|
|
7
|
+
import { buildSandboxSettings, prepareSandboxLaunch, resetSandboxSupportProbeForTests, } from "./sandbox.js";
|
|
8
|
+
describe("buildSandboxSettings", () => {
|
|
9
|
+
it("limits writes to the workspace and temp directory, and enforces an allowlist", () => {
|
|
10
|
+
// A real directory, so symlinked temp roots (macOS /var → /private/var) are
|
|
11
|
+
// exercised rather than silently skipped.
|
|
12
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), "gg-sandbox-workspace-"));
|
|
13
|
+
const settings = buildSandboxSettings(cwd, { mode: "workspace", allowedDomains: [] }, "darwin");
|
|
14
|
+
expect(settings.filesystem.allowWrite).toEqual(expect.arrayContaining([
|
|
15
|
+
fs.realpathSync(path.resolve(cwd)),
|
|
16
|
+
fs.realpathSync(path.resolve(os.tmpdir())),
|
|
17
|
+
getAppPaths().agentDir,
|
|
18
|
+
]));
|
|
19
|
+
expect(settings.filesystem.allowWrite).not.toContain(os.homedir());
|
|
20
|
+
// The sandbox matches real paths, so a deny rule must cover the resolved
|
|
21
|
+
// workspace or it silently never fires (macOS /var → /private/var).
|
|
22
|
+
expect(settings.filesystem.denyWrite).toEqual(expect.arrayContaining([path.join(fs.realpathSync(path.resolve(cwd)), ".env")]));
|
|
23
|
+
expect(settings.filesystem.denyRead).toEqual(expect.arrayContaining([
|
|
24
|
+
path.join(os.homedir(), ".ssh"),
|
|
25
|
+
path.join(os.homedir(), ".gg", "auth.json"),
|
|
26
|
+
]));
|
|
27
|
+
expect(settings.network).toMatchObject({
|
|
28
|
+
strictAllowlist: true,
|
|
29
|
+
allowUnixSockets: [],
|
|
30
|
+
// Dev servers and the screenshot tool bind loopback; blocking it would
|
|
31
|
+
// break core workflows without containing anything.
|
|
32
|
+
allowLocalBinding: true,
|
|
33
|
+
});
|
|
34
|
+
// Egress is an allowlist, never open: an unknown host stays unreachable.
|
|
35
|
+
expect(settings.network.allowedDomains).not.toContain("api.example.com");
|
|
36
|
+
});
|
|
37
|
+
it("keeps bash writable in the same roots the write guard already allows", () => {
|
|
38
|
+
const cwd = path.join(os.tmpdir(), "gg-sandbox-workspace");
|
|
39
|
+
const extraRoot = path.join(os.tmpdir(), "gg-sandbox-second-root");
|
|
40
|
+
const settings = buildSandboxSettings(cwd, { mode: "workspace", allowedDomains: [], additionalRoots: [extraRoot] }, "darwin");
|
|
41
|
+
// Multi-root sessions and ~/.gg must not silently lose bash writes.
|
|
42
|
+
expect(settings.filesystem.allowWrite).toEqual(expect.arrayContaining([path.resolve(cwd), path.resolve(extraRoot), getAppPaths().agentDir]));
|
|
43
|
+
expect(settings.filesystem.allowWrite).not.toContain(os.homedir());
|
|
44
|
+
});
|
|
45
|
+
it("honors the outside-workspace opt-out instead of contradicting the user", () => {
|
|
46
|
+
const settings = buildSandboxSettings(path.join(os.tmpdir(), "gg-sandbox-workspace"), { mode: "workspace", allowedDomains: [], allowOutsideWorkspaceWrites: true }, "darwin");
|
|
47
|
+
expect(settings.filesystem.allowWrite).toContain(os.homedir());
|
|
48
|
+
// Consenting to write outside the workspace is not consent to leak secrets.
|
|
49
|
+
expect(settings.filesystem.denyRead).toContain(path.join(os.homedir(), ".ssh"));
|
|
50
|
+
});
|
|
51
|
+
it("normalizes and de-duplicates explicit network domains deterministically", () => {
|
|
52
|
+
const settings = buildSandboxSettings("/workspace", {
|
|
53
|
+
mode: "workspace",
|
|
54
|
+
allowedDomains: [" registry.npmjs.org ", "github.com", "github.com", ""],
|
|
55
|
+
strictDomains: true,
|
|
56
|
+
});
|
|
57
|
+
expect(settings.network.allowedDomains).toEqual(["github.com", "registry.npmjs.org"]);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("sandbox defaults", () => {
|
|
61
|
+
it("stays opt-in while upstream breaks core workflows", () => {
|
|
62
|
+
// Verified upstream breakage: Linux pipes/redirections fail under seccomp,
|
|
63
|
+
// macOS git-over-SSH fails the SOCKS handshake, and `git config --global`
|
|
64
|
+
// is refused. Turning this on by default would break `git push` and piped
|
|
65
|
+
// commands right after an update. Revisit when those are fixed upstream.
|
|
66
|
+
expect(DEFAULT_SETTINGS.sandboxMode).toBe("off");
|
|
67
|
+
});
|
|
68
|
+
it("reaches mainstream toolchains out of the box, so the default is invisible", () => {
|
|
69
|
+
const { network } = buildSandboxSettings("/workspace", {
|
|
70
|
+
mode: "auto",
|
|
71
|
+
allowedDomains: [],
|
|
72
|
+
});
|
|
73
|
+
// If any of these were missing, `npm install` / `pip install` / `git clone`
|
|
74
|
+
// would fail for every user the moment the sandbox shipped on.
|
|
75
|
+
for (const host of [
|
|
76
|
+
"github.com",
|
|
77
|
+
"registry.npmjs.org",
|
|
78
|
+
"pypi.org",
|
|
79
|
+
"files.pythonhosted.org",
|
|
80
|
+
"proxy.golang.org",
|
|
81
|
+
"crates.io",
|
|
82
|
+
"rubygems.org",
|
|
83
|
+
]) {
|
|
84
|
+
expect(network.allowedDomains).toContain(host);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
it("rejects patterns the sandbox itself refuses, so a bad entry cannot brick startup", () => {
|
|
88
|
+
const { network } = buildSandboxSettings("/workspace", {
|
|
89
|
+
mode: "auto",
|
|
90
|
+
allowedDomains: [],
|
|
91
|
+
});
|
|
92
|
+
for (const domain of network.allowedDomains) {
|
|
93
|
+
expect(domain).not.toBe("*");
|
|
94
|
+
// sandbox-runtime rejects overly broad wildcards like "*.com".
|
|
95
|
+
expect(domain).not.toMatch(/^\*\.[a-z]+$/);
|
|
96
|
+
expect(domain).not.toMatch(/[:/]/);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
it("adds user hosts to the defaults, and honors an explicit takeover", () => {
|
|
100
|
+
const merged = buildSandboxSettings("/workspace", {
|
|
101
|
+
mode: "auto",
|
|
102
|
+
allowedDomains: ["internal.example.com"],
|
|
103
|
+
});
|
|
104
|
+
expect(merged.network.allowedDomains).toContain("internal.example.com");
|
|
105
|
+
expect(merged.network.allowedDomains).toContain("github.com");
|
|
106
|
+
const strict = buildSandboxSettings("/workspace", {
|
|
107
|
+
mode: "auto",
|
|
108
|
+
allowedDomains: ["internal.example.com"],
|
|
109
|
+
strictDomains: true,
|
|
110
|
+
});
|
|
111
|
+
expect(strict.network.allowedDomains).toEqual(["internal.example.com"]);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe("prepareSandboxLaunch", () => {
|
|
115
|
+
const shell = { file: "bash", args: ["-c", "echo ok"], isCmdFallback: false };
|
|
116
|
+
beforeEach(() => resetSandboxSupportProbeForTests());
|
|
117
|
+
afterEach(() => {
|
|
118
|
+
vi.unstubAllEnvs();
|
|
119
|
+
resetSandboxSupportProbeForTests();
|
|
120
|
+
});
|
|
121
|
+
it("preserves the original shell only for explicit sandbox opt-out", async () => {
|
|
122
|
+
await expect(prepareSandboxLaunch(shell, "/workspace", { mode: "off", allowedDomains: [] })).resolves.toEqual({ ...shell, sandboxed: false });
|
|
123
|
+
});
|
|
124
|
+
it("wraps the command where isolation is available, and honors the mode contract where it is not", async () => {
|
|
125
|
+
// Whether an OS sandbox is usable is a property of the host, not of this
|
|
126
|
+
// code: CI Linux has no bwrap/socat and CI Windows has no provisioned
|
|
127
|
+
// sandbox user. `auto` never throws, so it reports which branch applies.
|
|
128
|
+
const probe = await prepareSandboxLaunch(shell, os.tmpdir(), {
|
|
129
|
+
mode: "auto",
|
|
130
|
+
allowedDomains: [],
|
|
131
|
+
});
|
|
132
|
+
if (!probe.sandboxed) {
|
|
133
|
+
// Unsupported host: `auto` degrades and `workspace` fails closed.
|
|
134
|
+
expect(probe).toEqual({ ...shell, sandboxed: false });
|
|
135
|
+
await expect(prepareSandboxLaunch(shell, os.tmpdir(), { mode: "workspace", allowedDomains: [] })).rejects.toThrow(/Install the OS sandbox prerequisites/);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const launch = await prepareSandboxLaunch(shell, os.tmpdir(), {
|
|
139
|
+
mode: "workspace",
|
|
140
|
+
allowedDomains: [],
|
|
141
|
+
});
|
|
142
|
+
expect(launch.sandboxed).toBe(true);
|
|
143
|
+
expect(launch.file).toBe(process.execPath);
|
|
144
|
+
expect(launch.args).toEqual(expect.arrayContaining(["--settings", "--", "bash", "-c", "echo ok"]));
|
|
145
|
+
});
|
|
146
|
+
it("degrades instead of breaking every command when prerequisites are missing", async () => {
|
|
147
|
+
// An unusable interpreter makes the probe child exit non-zero, standing in
|
|
148
|
+
// for bwrap-less Linux or an unprovisioned Windows sandbox user.
|
|
149
|
+
vi.spyOn(process, "execPath", "get").mockReturnValue("/nonexistent/gg-node");
|
|
150
|
+
await expect(prepareSandboxLaunch(shell, os.tmpdir(), { mode: "auto", allowedDomains: [] })).resolves.toEqual({ ...shell, sandboxed: false });
|
|
151
|
+
});
|
|
152
|
+
it("fails closed in strict workspace mode with actionable install guidance", async () => {
|
|
153
|
+
vi.spyOn(process, "execPath", "get").mockReturnValue("/nonexistent/gg-node");
|
|
154
|
+
await expect(prepareSandboxLaunch(shell, os.tmpdir(), { mode: "workspace", allowedDomains: [] })).rejects.toThrow(/bubblewrap \+ socat|windows-install/);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=sandbox.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.test.js","sourceRoot":"","sources":["../../src/core/sandbox.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,11 @@ declare const SettingsSchema: z.ZodObject<{
|
|
|
44
44
|
allowlist: "allowlist";
|
|
45
45
|
}>>;
|
|
46
46
|
networkAllow: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
47
|
+
sandboxMode: z.ZodDefault<z.ZodEnum<{
|
|
48
|
+
off: "off";
|
|
49
|
+
auto: "auto";
|
|
50
|
+
workspace: "workspace";
|
|
51
|
+
}>>;
|
|
47
52
|
deferredMcpTools: z.ZodDefault<z.ZodBoolean>;
|
|
48
53
|
mcpModernProtocol: z.ZodDefault<z.ZodBoolean>;
|
|
49
54
|
subagentMaxPerModel: z.ZodOptional<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqFlB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,EAAE,QAkB9B,CAAC;AAIF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,CAAC,EAAE,MAAM;IAIvB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAazB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAI5C,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E,MAAM,IAAI,QAAQ;CAGnB"}
|
|
@@ -50,6 +50,25 @@ const SettingsSchema = z.object({
|
|
|
50
50
|
/** Hosts allowed when networkMode is "allowlist". A leading `*.` wildcard
|
|
51
51
|
* matches subdomains (`*.github.com`). */
|
|
52
52
|
networkAllow: z.array(z.string()).default([]),
|
|
53
|
+
/**
|
|
54
|
+
* OS-enforced command isolation for bash (filesystem + network), via
|
|
55
|
+
* sandbox-runtime. `auto` isolates wherever the platform supports it and
|
|
56
|
+
* degrades with a warning where it does not; `workspace` additionally fails
|
|
57
|
+
* closed on hosts that cannot isolate.
|
|
58
|
+
*
|
|
59
|
+
* Opt-in, and deliberately so. Verified day-one breakage in the upstream
|
|
60
|
+
* sandbox that we cannot fix from here:
|
|
61
|
+
* • Linux: pipes and redirections fail under seccomp — `echo hi | grep hi`
|
|
62
|
+
* returns "Permission denied" on /proc/self/fd/3 (upstream #261).
|
|
63
|
+
* • macOS: git over SSH fails the SOCKS handshake, because the ProxyCommand
|
|
64
|
+
* uses `nc`, which cannot do SOCKS5 auth (upstream sandbox-utils.ts).
|
|
65
|
+
* • `git config --global` is refused: ~/.gitconfig is a mandatory upstream
|
|
66
|
+
* write protection with no opt-out.
|
|
67
|
+
* • Corporate TLS interception and private registries need extra config.
|
|
68
|
+
* Enabling it by default would break `git push` and piped commands for a
|
|
69
|
+
* large share of users immediately after an update, with no obvious cause.
|
|
70
|
+
*/
|
|
71
|
+
sandboxMode: z.enum(["auto", "workspace", "off"]).default("off"),
|
|
53
72
|
/** Defer MCP tool schemas out of the prompt until discovered via tool_search.
|
|
54
73
|
* Cuts ~8k tokens/cache-miss turn with two MCP servers (bench/RESULTS.md). */
|
|
55
74
|
deferredMcpTools: z.boolean().default(true),
|
|
@@ -82,6 +101,7 @@ export const DEFAULT_SETTINGS = {
|
|
|
82
101
|
allowOutsideWorkspaceWrites: false,
|
|
83
102
|
networkMode: "off",
|
|
84
103
|
networkAllow: [],
|
|
104
|
+
sandboxMode: "off",
|
|
85
105
|
deferredMcpTools: true,
|
|
86
106
|
mcpModernProtocol: false,
|
|
87
107
|
sessionRetentionDays: 30,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Message } from "@kenkaiiii/gg-ai";
|
|
2
|
+
export interface VerificationCommandClassification {
|
|
3
|
+
accepted: boolean;
|
|
4
|
+
/** False for ordinary shell work that was never plausibly a verification attempt. */
|
|
5
|
+
candidate: boolean;
|
|
6
|
+
reason: string;
|
|
7
|
+
}
|
|
8
|
+
export interface VerificationEvidence {
|
|
9
|
+
command: string;
|
|
10
|
+
status: "passed" | "failed" | "rejected";
|
|
11
|
+
reason: string;
|
|
12
|
+
}
|
|
13
|
+
/** Fail-closed semantic classifier: every shell segment must be a bounded check. */
|
|
14
|
+
export declare function classifyVerificationCommand(command: string): VerificationCommandClassification;
|
|
15
|
+
/** Extract harness-owned evidence from completed bash calls in a transcript. */
|
|
16
|
+
export declare function collectVerificationEvidence(messages: readonly Message[]): VerificationEvidence[];
|
|
17
|
+
//# sourceMappingURL=verification-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-evidence.d.ts","sourceRoot":"","sources":["../../src/core/verification-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,OAAO,EAAc,MAAM,kBAAkB,CAAC;AAGzE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAkND,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,iCAAiC,CAwB9F;AAUD,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,oBAAoB,EAAE,CAiDhG"}
|