@kenkaiiii/ggcoder 5.31.0 → 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/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,283 @@
|
|
|
1
|
+
import { hasUnsafeShellSyntax, splitShellCommandSegments } from "../tools/read-only-bash.js";
|
|
2
|
+
const LONG_RUNNING_FLAGS = new Set([
|
|
3
|
+
"--watch",
|
|
4
|
+
"--watchall",
|
|
5
|
+
"--watchall=false",
|
|
6
|
+
"--ui",
|
|
7
|
+
"--inspect",
|
|
8
|
+
"--inspect-brk",
|
|
9
|
+
"-w",
|
|
10
|
+
]);
|
|
11
|
+
const MUTATING_FLAGS = new Set([
|
|
12
|
+
"--init",
|
|
13
|
+
"--build",
|
|
14
|
+
"-b",
|
|
15
|
+
"--clean",
|
|
16
|
+
"--fix",
|
|
17
|
+
"--write",
|
|
18
|
+
"--update",
|
|
19
|
+
"-u",
|
|
20
|
+
"--updatesnapshot",
|
|
21
|
+
"--incremental",
|
|
22
|
+
"--tsbuildinfofile",
|
|
23
|
+
"--emitdeclarationonly",
|
|
24
|
+
]);
|
|
25
|
+
const AMBIGUOUS_FLAGS = new Set([
|
|
26
|
+
"--nocheck",
|
|
27
|
+
"--listfilesonly",
|
|
28
|
+
"--showconfig",
|
|
29
|
+
"--help",
|
|
30
|
+
"-h",
|
|
31
|
+
"--version",
|
|
32
|
+
"--generatetrace",
|
|
33
|
+
"--traceresolution",
|
|
34
|
+
"--diagnostics",
|
|
35
|
+
"--extendeddiagnostics",
|
|
36
|
+
"--generatecpuprofile",
|
|
37
|
+
"--collect-only",
|
|
38
|
+
"--listtests",
|
|
39
|
+
]);
|
|
40
|
+
const SAFE_PACKAGE_SCRIPTS = /^(?:test(?::(?:unit|integration|e2e))?|check|typecheck|type-check|lint(?::check)?|format(?::check|-check)|prettier:check)$/i;
|
|
41
|
+
const UNSAFE_PACKAGE_SCRIPTS = /^(?:build|clean|dev|serve|start|watch|preview|prepare|install|format|lint:fix|test:watch)(?::|$)/i;
|
|
42
|
+
const VERIFIER_WORDS = /(?:^|\s|\/)(?:tsc|vitest|jest|pytest|eslint|prettier|pyright|mypy|ruff|cargo|go|shellcheck)(?:\s|$)/i;
|
|
43
|
+
function tokenize(segment) {
|
|
44
|
+
return segment
|
|
45
|
+
.trim()
|
|
46
|
+
.split(/\s+/)
|
|
47
|
+
.map((token) => token.replace(/^["']|["']$/g, ""))
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
}
|
|
50
|
+
function lowerFlags(tokens) {
|
|
51
|
+
return new Set(tokens.filter((token) => token.startsWith("-")).map((token) => token.toLowerCase()));
|
|
52
|
+
}
|
|
53
|
+
function hasFlag(flags, denied) {
|
|
54
|
+
for (const flag of flags) {
|
|
55
|
+
const name = flag.split("=")[0];
|
|
56
|
+
if (denied.has(flag) || denied.has(name))
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function rejected(candidate, reason) {
|
|
62
|
+
return { accepted: false, candidate, reason };
|
|
63
|
+
}
|
|
64
|
+
function accepted(reason) {
|
|
65
|
+
return { accepted: true, candidate: true, reason };
|
|
66
|
+
}
|
|
67
|
+
function classifyTsc(tokens) {
|
|
68
|
+
const flags = lowerFlags(tokens);
|
|
69
|
+
if (hasFlag(flags, LONG_RUNNING_FLAGS))
|
|
70
|
+
return rejected(true, "long-running watch/debug mode");
|
|
71
|
+
if (hasFlag(flags, MUTATING_FLAGS))
|
|
72
|
+
return rejected(true, "mutating or artifact-producing mode");
|
|
73
|
+
if (hasFlag(flags, AMBIGUOUS_FLAGS) || flags.has("-v")) {
|
|
74
|
+
return rejected(true, "does not prove type correctness");
|
|
75
|
+
}
|
|
76
|
+
if (!flags.has("--noemit"))
|
|
77
|
+
return rejected(true, "tsc must explicitly use --noEmit");
|
|
78
|
+
return accepted("bounded TypeScript no-emit check");
|
|
79
|
+
}
|
|
80
|
+
function classifyTestRunner(executable, tokens) {
|
|
81
|
+
const flags = lowerFlags(tokens);
|
|
82
|
+
if (hasFlag(flags, LONG_RUNNING_FLAGS) || flags.has("--watch=false")) {
|
|
83
|
+
return rejected(true, "long-running or interactive test mode");
|
|
84
|
+
}
|
|
85
|
+
if (hasFlag(flags, MUTATING_FLAGS))
|
|
86
|
+
return rejected(true, "mutating test/update mode");
|
|
87
|
+
if (hasFlag(flags, AMBIGUOUS_FLAGS))
|
|
88
|
+
return rejected(true, "does not execute the test suite");
|
|
89
|
+
if (executable === "vitest") {
|
|
90
|
+
const positional = tokens.slice(1).filter((token) => !token.startsWith("-"));
|
|
91
|
+
if (!positional.includes("run") && !flags.has("--run")) {
|
|
92
|
+
return rejected(true, "vitest must explicitly use one-shot run mode");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return accepted("bounded one-shot test check");
|
|
96
|
+
}
|
|
97
|
+
function classifyDirect(tokens) {
|
|
98
|
+
const executable = tokens[0]?.replace(/^.*[\\/]/, "").toLowerCase();
|
|
99
|
+
if (!executable)
|
|
100
|
+
return rejected(false, "empty command");
|
|
101
|
+
if (executable === "tsc")
|
|
102
|
+
return classifyTsc(tokens);
|
|
103
|
+
if (executable === "vitest" || executable === "jest" || executable === "pytest") {
|
|
104
|
+
return classifyTestRunner(executable, tokens);
|
|
105
|
+
}
|
|
106
|
+
const flags = lowerFlags(tokens);
|
|
107
|
+
if (["eslint", "prettier", "ruff"].includes(executable)) {
|
|
108
|
+
if (hasFlag(flags, LONG_RUNNING_FLAGS))
|
|
109
|
+
return rejected(true, "long-running mode");
|
|
110
|
+
if (hasFlag(flags, MUTATING_FLAGS))
|
|
111
|
+
return rejected(true, "mutating formatter/linter mode");
|
|
112
|
+
if (hasFlag(flags, AMBIGUOUS_FLAGS))
|
|
113
|
+
return rejected(true, "does not execute a static check");
|
|
114
|
+
if (executable === "prettier" && !flags.has("--check")) {
|
|
115
|
+
return rejected(true, "prettier must explicitly use --check");
|
|
116
|
+
}
|
|
117
|
+
if (executable === "ruff" && tokens[1] === "format" && !flags.has("--check")) {
|
|
118
|
+
return rejected(true, "ruff format must explicitly use --check");
|
|
119
|
+
}
|
|
120
|
+
return accepted("bounded static check");
|
|
121
|
+
}
|
|
122
|
+
if (["pyright", "mypy", "shellcheck"].includes(executable)) {
|
|
123
|
+
if (hasFlag(flags, LONG_RUNNING_FLAGS))
|
|
124
|
+
return rejected(true, "long-running mode");
|
|
125
|
+
if (hasFlag(flags, AMBIGUOUS_FLAGS))
|
|
126
|
+
return rejected(true, "does not execute a static check");
|
|
127
|
+
return accepted("bounded static check");
|
|
128
|
+
}
|
|
129
|
+
if (executable === "cargo") {
|
|
130
|
+
const subcommand = tokens[1]?.toLowerCase();
|
|
131
|
+
if (subcommand === "build" || subcommand === "clean" || subcommand === "run") {
|
|
132
|
+
return rejected(true, "artifact-producing Cargo command");
|
|
133
|
+
}
|
|
134
|
+
if (subcommand === "fmt" && !flags.has("--check")) {
|
|
135
|
+
return rejected(true, "cargo fmt must explicitly use --check");
|
|
136
|
+
}
|
|
137
|
+
return ["check", "clippy", "test", "fmt"].includes(subcommand)
|
|
138
|
+
? accepted("bounded Cargo check")
|
|
139
|
+
: rejected(false, "not a recognized verification command");
|
|
140
|
+
}
|
|
141
|
+
if (executable === "go") {
|
|
142
|
+
const subcommand = tokens[1]?.toLowerCase();
|
|
143
|
+
return subcommand === "test" || subcommand === "vet"
|
|
144
|
+
? accepted("bounded Go check")
|
|
145
|
+
: rejected(subcommand === "build" || subcommand === "clean", "not a bounded Go check");
|
|
146
|
+
}
|
|
147
|
+
return rejected(VERIFIER_WORDS.test(tokens.join(" ")), "not a recognized verification command");
|
|
148
|
+
}
|
|
149
|
+
function classifyPackageRunner(tokens) {
|
|
150
|
+
const runner = tokens[0].toLowerCase();
|
|
151
|
+
let index = 1;
|
|
152
|
+
while (index < tokens.length) {
|
|
153
|
+
const token = tokens[index].toLowerCase();
|
|
154
|
+
if (["--filter", "-f", "--dir", "-c"].includes(token)) {
|
|
155
|
+
index += 2;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (token === "--workspace-root" ||
|
|
159
|
+
token === "-w" ||
|
|
160
|
+
token.startsWith("--filter=") ||
|
|
161
|
+
token.startsWith("--dir=")) {
|
|
162
|
+
index += 1;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
const action = tokens[index]?.toLowerCase();
|
|
168
|
+
if (!action)
|
|
169
|
+
return rejected(false, "package runner has no command");
|
|
170
|
+
if (["exec", "x", "dlx"].includes(action))
|
|
171
|
+
return classifyDirect(tokens.slice(index + 1));
|
|
172
|
+
const scriptIndex = action === "run" ? index + 1 : index;
|
|
173
|
+
const script = tokens[scriptIndex]?.toLowerCase();
|
|
174
|
+
if (!script)
|
|
175
|
+
return rejected(false, "package runner has no script");
|
|
176
|
+
if (UNSAFE_PACKAGE_SCRIPTS.test(script)) {
|
|
177
|
+
return rejected(true, "mutating, artifact-producing, or long-running package script");
|
|
178
|
+
}
|
|
179
|
+
if (!SAFE_PACKAGE_SCRIPTS.test(script)) {
|
|
180
|
+
return rejected(false, "package script is not a recognized verification check");
|
|
181
|
+
}
|
|
182
|
+
const scriptArgs = tokens.slice(scriptIndex + 1).filter((token) => token !== "--");
|
|
183
|
+
const flags = lowerFlags(scriptArgs);
|
|
184
|
+
if (hasFlag(flags, LONG_RUNNING_FLAGS))
|
|
185
|
+
return rejected(true, "long-running package-script mode");
|
|
186
|
+
if (hasFlag(flags, MUTATING_FLAGS))
|
|
187
|
+
return rejected(true, "mutating package-script mode");
|
|
188
|
+
if (hasFlag(flags, AMBIGUOUS_FLAGS))
|
|
189
|
+
return rejected(true, "package script does not prove correctness");
|
|
190
|
+
return accepted(`bounded ${runner} verification script`);
|
|
191
|
+
}
|
|
192
|
+
function classifySegment(segment) {
|
|
193
|
+
const candidate = VERIFIER_WORDS.test(segment) || /(?:^|\s)(?:pnpm|npm|yarn|bun)(?:\s|$)/i.test(segment);
|
|
194
|
+
if (hasUnsafeShellSyntax(segment))
|
|
195
|
+
return rejected(candidate, "unsafe shell syntax or redirection");
|
|
196
|
+
const tokens = tokenize(segment);
|
|
197
|
+
const first = tokens[0]?.toLowerCase();
|
|
198
|
+
if (["pnpm", "npm", "yarn", "bun"].includes(first))
|
|
199
|
+
return classifyPackageRunner(tokens);
|
|
200
|
+
if (["npx", "bunx"].includes(first))
|
|
201
|
+
return classifyDirect(tokens.slice(1));
|
|
202
|
+
return classifyDirect(tokens);
|
|
203
|
+
}
|
|
204
|
+
/** Fail-closed semantic classifier: every shell segment must be a bounded check. */
|
|
205
|
+
export function classifyVerificationCommand(command) {
|
|
206
|
+
const candidate = VERIFIER_WORDS.test(command) || /(?:^|\s)(?:pnpm|npm|yarn|bun)(?:\s|$)/i.test(command);
|
|
207
|
+
// Only && preserves fail-closed evidence across a chain. Pipes, OR, semicolons,
|
|
208
|
+
// and newlines can hide a failed check behind a later zero exit status.
|
|
209
|
+
if (command.includes("||") ||
|
|
210
|
+
command.includes(";") ||
|
|
211
|
+
command.includes("\n") ||
|
|
212
|
+
/(^|[^|])\|([^|]|$)/.test(command)) {
|
|
213
|
+
return rejected(candidate, "shell control operator can hide a failed check");
|
|
214
|
+
}
|
|
215
|
+
const segments = splitShellCommandSegments(command);
|
|
216
|
+
if (segments.length === 0)
|
|
217
|
+
return rejected(false, "empty command");
|
|
218
|
+
const results = segments.map(classifySegment);
|
|
219
|
+
const firstRejected = results.find((result) => !result.accepted);
|
|
220
|
+
if (firstRejected) {
|
|
221
|
+
return rejected(results.some((result) => result.candidate), firstRejected.reason);
|
|
222
|
+
}
|
|
223
|
+
return accepted(segments.length === 1 ? results[0].reason : "bounded verification command chain");
|
|
224
|
+
}
|
|
225
|
+
function resultText(result) {
|
|
226
|
+
if (typeof result.content === "string")
|
|
227
|
+
return result.content;
|
|
228
|
+
return result.content
|
|
229
|
+
.filter((part) => part.type === "text")
|
|
230
|
+
.map((part) => part.text)
|
|
231
|
+
.join("\n");
|
|
232
|
+
}
|
|
233
|
+
/** Extract harness-owned evidence from completed bash calls in a transcript. */
|
|
234
|
+
export function collectVerificationEvidence(messages) {
|
|
235
|
+
const calls = new Map();
|
|
236
|
+
const evidence = [];
|
|
237
|
+
for (const message of messages) {
|
|
238
|
+
if (message.role === "assistant" && Array.isArray(message.content)) {
|
|
239
|
+
for (const part of message.content) {
|
|
240
|
+
if (part.type !== "tool_call" || part.name !== "bash")
|
|
241
|
+
continue;
|
|
242
|
+
const command = typeof part.args.command === "string" ? part.args.command.trim() : "";
|
|
243
|
+
const background = part.args.run_in_background === true || part.args.persist === true;
|
|
244
|
+
calls.set(part.id, {
|
|
245
|
+
command,
|
|
246
|
+
classification: classifyVerificationCommand(command),
|
|
247
|
+
background,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (message.role !== "tool")
|
|
252
|
+
continue;
|
|
253
|
+
for (const result of message.content) {
|
|
254
|
+
const call = calls.get(result.toolCallId);
|
|
255
|
+
if (!call || !call.classification.candidate)
|
|
256
|
+
continue;
|
|
257
|
+
if (call.background) {
|
|
258
|
+
evidence.push({
|
|
259
|
+
command: call.command,
|
|
260
|
+
status: "rejected",
|
|
261
|
+
reason: "background or persistent commands are not bounded evidence",
|
|
262
|
+
});
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (!call.classification.accepted) {
|
|
266
|
+
evidence.push({
|
|
267
|
+
command: call.command,
|
|
268
|
+
status: "rejected",
|
|
269
|
+
reason: call.classification.reason,
|
|
270
|
+
});
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const passed = !result.isError && /^Exit code:\s*0(?:\s|$)/i.test(resultText(result).trim());
|
|
274
|
+
evidence.push({
|
|
275
|
+
command: call.command,
|
|
276
|
+
status: passed ? "passed" : "failed",
|
|
277
|
+
reason: passed ? call.classification.reason : "bounded check did not exit successfully",
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return evidence;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=verification-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-evidence.js","sourceRoot":"","sources":["../../src/core/verification-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-evidence.test.d.ts","sourceRoot":"","sources":["../../src/core/verification-evidence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { classifyVerificationCommand, collectVerificationEvidence, } from "./verification-evidence.js";
|
|
3
|
+
describe("classifyVerificationCommand", () => {
|
|
4
|
+
it.each([
|
|
5
|
+
"tsc --noEmit",
|
|
6
|
+
"pnpm exec tsc --noEmit --pretty false",
|
|
7
|
+
"pnpm --filter @kenkaiiii/gg-ai check",
|
|
8
|
+
"pnpm -w typecheck",
|
|
9
|
+
"vitest run src/foo.test.ts",
|
|
10
|
+
"pnpm test -- --runInBand",
|
|
11
|
+
"cargo fmt --check && cargo clippy",
|
|
12
|
+
"ruff format --check .",
|
|
13
|
+
])("accepts bounded check: %s", (command) => {
|
|
14
|
+
expect(classifyVerificationCommand(command)).toMatchObject({
|
|
15
|
+
accepted: true,
|
|
16
|
+
candidate: true,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it.each([
|
|
20
|
+
["tsc --init", "mutating"],
|
|
21
|
+
["tsc --build", "mutating"],
|
|
22
|
+
["tsc --noEmit --incremental", "mutating"],
|
|
23
|
+
["tsc --noEmit --tsBuildInfoFile cache.tsbuildinfo", "mutating"],
|
|
24
|
+
["prettier --write src", "mutating"],
|
|
25
|
+
["pnpm build", "artifact-producing"],
|
|
26
|
+
["tsc --watch --noEmit", "long-running"],
|
|
27
|
+
["vitest --watch", "long-running"],
|
|
28
|
+
["pnpm dev", "long-running"],
|
|
29
|
+
["tsc", "--noEmit"],
|
|
30
|
+
["tsc --noEmit --noCheck", "does not prove"],
|
|
31
|
+
["tsc --noEmit --listFilesOnly", "does not prove"],
|
|
32
|
+
["tsc --showConfig", "does not prove"],
|
|
33
|
+
["tsc --help", "does not prove"],
|
|
34
|
+
["tsc --version", "does not prove"],
|
|
35
|
+
["tsc --noEmit --generateTrace trace", "does not prove"],
|
|
36
|
+
["tsc --noEmit --generateCpuProfile cpu.cpuprofile", "does not prove"],
|
|
37
|
+
["tsc --noEmit > result.txt", "unsafe shell"],
|
|
38
|
+
["tsc --noEmit | cat", "control operator"],
|
|
39
|
+
["tsc --noEmit || echo ignored", "control operator"],
|
|
40
|
+
["tsc --noEmit; echo ignored", "control operator"],
|
|
41
|
+
["tsc --noEmit && npm run clean", "mutating"],
|
|
42
|
+
])("rejects non-evidence command: %s", (command, reason) => {
|
|
43
|
+
expect(classifyVerificationCommand(command)).toMatchObject({
|
|
44
|
+
accepted: false,
|
|
45
|
+
candidate: true,
|
|
46
|
+
reason: expect.stringContaining(reason),
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it("rejects unknown commands without mislabeling ordinary shell work as verification", () => {
|
|
50
|
+
expect(classifyVerificationCommand("git status --short")).toMatchObject({
|
|
51
|
+
accepted: false,
|
|
52
|
+
candidate: false,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
function bashExchange(id, command, result, args = {}) {
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
role: "assistant",
|
|
60
|
+
content: [{ type: "tool_call", id, name: "bash", args: { command, ...args } }],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
role: "tool",
|
|
64
|
+
content: [{ type: "tool_result", toolCallId: id, content: result }],
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
describe("collectVerificationEvidence", () => {
|
|
69
|
+
it("records only successful bounded checks as passed evidence", () => {
|
|
70
|
+
const messages = [
|
|
71
|
+
...bashExchange("pass", "tsc --noEmit", "Exit code: 0\n"),
|
|
72
|
+
...bashExchange("fail", "vitest run src/foo.test.ts", "Exit code: 1\n1 test failed"),
|
|
73
|
+
...bashExchange("watch", "tsc --watch --noEmit", "Exit code: 0\nWatching"),
|
|
74
|
+
...bashExchange("ordinary", "git status --short", "Exit code: 0\n"),
|
|
75
|
+
...bashExchange("background", "vitest run", "Background process started.", {
|
|
76
|
+
run_in_background: true,
|
|
77
|
+
}),
|
|
78
|
+
];
|
|
79
|
+
expect(collectVerificationEvidence(messages)).toEqual([
|
|
80
|
+
{
|
|
81
|
+
command: "tsc --noEmit",
|
|
82
|
+
status: "passed",
|
|
83
|
+
reason: "bounded TypeScript no-emit check",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
command: "vitest run src/foo.test.ts",
|
|
87
|
+
status: "failed",
|
|
88
|
+
reason: "bounded check did not exit successfully",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
command: "tsc --watch --noEmit",
|
|
92
|
+
status: "rejected",
|
|
93
|
+
reason: "long-running watch/debug mode",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
command: "vitest run",
|
|
97
|
+
status: "rejected",
|
|
98
|
+
reason: "background or persistent commands are not bounded evidence",
|
|
99
|
+
},
|
|
100
|
+
]);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=verification-evidence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-evidence.test.js","sourceRoot":"","sources":["../../src/core/verification-evidence.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/bash.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { ProcessManager } from "../core/process-manager.js";
|
|
|
4
4
|
import { type ToolOperations } from "./operations.js";
|
|
5
5
|
import { type ResolveShellOpts } from "../core/shell.js";
|
|
6
6
|
import { type GetNetworkPolicy } from "../core/network-guard.js";
|
|
7
|
+
import { type SandboxPolicy } from "../core/sandbox.js";
|
|
7
8
|
/**
|
|
8
9
|
* Render command output for the tool result. Over-limit output is compressed
|
|
9
10
|
* (keeps errors + head/tail, collapses repeats) rather than blindly
|
|
@@ -21,6 +22,6 @@ declare const BashParams: z.ZodObject<{
|
|
|
21
22
|
}, z.core.$strip>;
|
|
22
23
|
export declare function createBashTool(cwd: string, processManager: ProcessManager, ops?: ToolOperations, planModeRef?: {
|
|
23
24
|
current: boolean;
|
|
24
|
-
}, shellOpts?: ResolveShellOpts, getNetworkPolicy?: GetNetworkPolicy): AgentTool<typeof BashParams>;
|
|
25
|
+
}, shellOpts?: ResolveShellOpts, getNetworkPolicy?: GetNetworkPolicy, getSandboxPolicy?: () => SandboxPolicy): AgentTool<typeof BashParams>;
|
|
25
26
|
export {};
|
|
26
27
|
//# sourceMappingURL=bash.d.ts.map
|
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKvE,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKvE,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAC;AAY5B;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzE;AAED,QAAA,MAAM,UAAU;;;;;iBAuBd,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAClC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,gBAAgB,CAAC,EAAE,MAAM,aAAa,GACrC,SAAS,CAAC,OAAO,UAAU,CAAC,CAgO9B"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -11,6 +11,13 @@ import { isReadOnlyCommand } from "./read-only-bash.js";
|
|
|
11
11
|
import { isPlanModeActive, planModeRestriction } from "../core/runtime-mode.js";
|
|
12
12
|
import { isCatastrophicCommand } from "../core/workspace-guard.js";
|
|
13
13
|
import { checkCommandPolicy } from "../core/network-guard.js";
|
|
14
|
+
import { prepareSandboxLaunch, SANDBOX_ENV_PATCH, } from "../core/sandbox.js";
|
|
15
|
+
import { annotateSandboxDenial } from "../core/sandbox-feedback.js";
|
|
16
|
+
/** Tool env, plus the tweaks that only make sense inside the OS sandbox. */
|
|
17
|
+
function sandboxAwareEnv(sandboxed) {
|
|
18
|
+
const env = getSafeToolEnv();
|
|
19
|
+
return sandboxed ? { ...env, ...SANDBOX_ENV_PATCH } : env;
|
|
20
|
+
}
|
|
14
21
|
const DEFAULT_TIMEOUT = 120_000; // 120 seconds
|
|
15
22
|
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024; // 10 MB — cap buffered output to prevent OOM
|
|
16
23
|
/**
|
|
@@ -54,10 +61,12 @@ const BashParams = z.object({
|
|
|
54
61
|
"survive across persist:true calls. Use for multi-step workflows in another " +
|
|
55
62
|
"directory or with sourced environments. Default false (fresh shell per call)."),
|
|
56
63
|
});
|
|
57
|
-
export function createBashTool(cwd, processManager, ops = localOperations, planModeRef, shellOpts, getNetworkPolicy) {
|
|
64
|
+
export function createBashTool(cwd, processManager, ops = localOperations, planModeRef, shellOpts, getNetworkPolicy, getSandboxPolicy) {
|
|
58
65
|
// Lazily created on the first persist:true call; one session per tool
|
|
59
66
|
// instance (i.e. per agent session), killed when the process exits.
|
|
60
67
|
let sessionShell = null;
|
|
68
|
+
let sessionSandboxKey = null;
|
|
69
|
+
let sessionSandboxed = false;
|
|
61
70
|
// Shell selection doesn't depend on the command, so resolve ONCE at tool
|
|
62
71
|
// creation and bake the true execution environment into the description —
|
|
63
72
|
// promising bash on a cmd.exe fallback makes the model write POSIX commands
|
|
@@ -109,10 +118,31 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
109
118
|
if (networkBlocked) {
|
|
110
119
|
return `Error: ${networkBlocked}`;
|
|
111
120
|
}
|
|
121
|
+
const sandboxPolicy = getSandboxPolicy?.() ?? { mode: "off", allowedDomains: [] };
|
|
122
|
+
const prepareLaunch = async (shell) => prepareSandboxLaunch(shell, cwd, sandboxPolicy);
|
|
112
123
|
// Persistent session mode — POSIX only; Windows-without-bash falls through
|
|
113
124
|
// to the normal spawn path (cmd.exe fallback) below.
|
|
114
125
|
if (persist && !run_in_background && !resolveShell(command, shellOpts).isCmdFallback) {
|
|
115
|
-
|
|
126
|
+
const sandboxKey = JSON.stringify(sandboxPolicy);
|
|
127
|
+
if (sessionShell && sessionSandboxKey !== sandboxKey) {
|
|
128
|
+
sessionShell.kill();
|
|
129
|
+
sessionShell = null;
|
|
130
|
+
}
|
|
131
|
+
if (!sessionShell) {
|
|
132
|
+
try {
|
|
133
|
+
const shell = resolveShell("", shellOpts);
|
|
134
|
+
const launch = await prepareLaunch({
|
|
135
|
+
...shell,
|
|
136
|
+
args: ["--norc", "--noprofile"],
|
|
137
|
+
});
|
|
138
|
+
sessionShell = new PersistentShell(cwd, sandboxAwareEnv(launch.sandboxed), MAX_OUTPUT_BYTES, shellOpts, launch);
|
|
139
|
+
sessionSandboxKey = sandboxKey;
|
|
140
|
+
sessionSandboxed = launch.sandboxed;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return `Error: OS sandbox unavailable; command was not run: ${error.message}`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
116
146
|
const res = await sessionShell.run(command, timeoutMs ?? DEFAULT_TIMEOUT, context.signal, context.onUpdate
|
|
117
147
|
? (text) => context.onUpdate?.({ type: "bash_progress", output: text, totalBytes: 0 })
|
|
118
148
|
: undefined);
|
|
@@ -120,10 +150,17 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
120
150
|
const exitCode = res.exitCode === "TIMEOUT"
|
|
121
151
|
? `TIMEOUT (${timeoutMs ?? DEFAULT_TIMEOUT}ms) — session shell was reset; cd/env state is gone`
|
|
122
152
|
: String(res.exitCode);
|
|
123
|
-
return `Exit code: ${exitCode}\n${output}
|
|
153
|
+
return annotateSandboxDenial(`Exit code: ${exitCode}\n${output}`, sessionSandboxed);
|
|
124
154
|
}
|
|
125
155
|
if (run_in_background) {
|
|
126
|
-
|
|
156
|
+
let launch;
|
|
157
|
+
try {
|
|
158
|
+
launch = await prepareLaunch(resolveShell(command, shellOpts));
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return `Error: OS sandbox unavailable; command was not run: ${error.message}`;
|
|
162
|
+
}
|
|
163
|
+
const result = await processManager.start(command, cwd, launch);
|
|
127
164
|
return (`Background process started.\n` +
|
|
128
165
|
`ID: ${result.id}\n` +
|
|
129
166
|
`PID: ${result.pid}\n` +
|
|
@@ -132,21 +169,22 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
132
169
|
`task_send to type input/answer prompts, task_stop to stop it.`);
|
|
133
170
|
}
|
|
134
171
|
const effectiveTimeout = timeoutMs ?? DEFAULT_TIMEOUT;
|
|
172
|
+
// Cross-platform shell: bash on macOS/Linux, Git Bash on Windows (or
|
|
173
|
+
// cmd.exe fallback), wrapped by the OS sandbox before any child starts.
|
|
174
|
+
const shell = resolveShell(command, shellOpts);
|
|
175
|
+
let launch;
|
|
176
|
+
try {
|
|
177
|
+
launch = await prepareLaunch(shell);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return `Exit code: 1\nOS sandbox unavailable; command was not run: ${error.message}`;
|
|
181
|
+
}
|
|
135
182
|
return new Promise((resolve) => {
|
|
136
|
-
|
|
137
|
-
// cmd.exe fallback). Hardcoding "bash" broke on Windows with `spawn
|
|
138
|
-
// bash ENOENT`, and accidentally hitting WSL's bash ran commands in a
|
|
139
|
-
// separate Linux filesystem (the "files not mounted" symptom).
|
|
140
|
-
// `shellOpts` MUST be threaded through here, not just into the
|
|
141
|
-
// description above: without it the tool advertised cmd.exe semantics
|
|
142
|
-
// while actually executing through bash, and no test could drive the
|
|
143
|
-
// Windows fallback path on a real Windows host.
|
|
144
|
-
const shell = resolveShell(command, shellOpts);
|
|
145
|
-
const child = ops.spawn(shell.file, shell.args, {
|
|
183
|
+
const child = ops.spawn(launch.file, launch.args, {
|
|
146
184
|
cwd,
|
|
147
185
|
detached: true,
|
|
148
186
|
stdio: ["ignore", "pipe", "pipe"],
|
|
149
|
-
env:
|
|
187
|
+
env: sandboxAwareEnv(launch.sandboxed),
|
|
150
188
|
});
|
|
151
189
|
const chunks = [];
|
|
152
190
|
let totalBytes = 0;
|
|
@@ -212,7 +250,7 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
212
250
|
: killed
|
|
213
251
|
? "KILLED"
|
|
214
252
|
: String(code ?? 1);
|
|
215
|
-
resolve(`Exit code: ${exitCode}\n${output}
|
|
253
|
+
resolve(annotateSandboxDenial(`Exit code: ${exitCode}\n${output}`, launch.sandboxed));
|
|
216
254
|
});
|
|
217
255
|
child.on("error", (err) => {
|
|
218
256
|
clearTimeout(timer);
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAyB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAyB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { type GenerateImageAuth } from "./generate-image.js";
|
|
|
7
7
|
import { type ToolOperations } from "./operations.js";
|
|
8
8
|
import type { WriteGuardSettings } from "../core/workspace-guard.js";
|
|
9
9
|
import type { GetNetworkPolicy } from "../core/network-guard.js";
|
|
10
|
+
import type { SandboxPolicy } from "../core/sandbox.js";
|
|
10
11
|
import type { AgentDefinition } from "../core/agents.js";
|
|
11
12
|
import type { Skill } from "../core/skills.js";
|
|
12
13
|
import type { AgentNotificationQueue } from "../core/agent-notifications.js";
|
|
@@ -79,6 +80,8 @@ export interface CreateToolsOptions {
|
|
|
79
80
|
* When omitted, no network restriction is applied.
|
|
80
81
|
*/
|
|
81
82
|
getNetworkPolicy?: GetNetworkPolicy;
|
|
83
|
+
/** Lazily read the OS command-sandbox mode and allowed network domains. */
|
|
84
|
+
getSandboxPolicy?: () => SandboxPolicy;
|
|
82
85
|
/**
|
|
83
86
|
* Push queue for out-of-band notifications (child completions, background
|
|
84
87
|
* process progress). When provided, producers enqueue here and the session
|