@kenkaiiii/ggcoder 5.49.1 → 5.49.3
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 +16 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-pre-init-arming.test.d.ts +2 -0
- package/dist/core/agent-session-pre-init-arming.test.d.ts.map +1 -0
- package/dist/core/agent-session-pre-init-arming.test.js +60 -0
- package/dist/core/agent-session-pre-init-arming.test.js.map +1 -0
- package/dist/core/agent-session-verification-flow.test.d.ts +2 -0
- package/dist/core/agent-session-verification-flow.test.d.ts.map +1 -0
- package/dist/core/agent-session-verification-flow.test.js +125 -0
- package/dist/core/agent-session-verification-flow.test.js.map +1 -0
- package/dist/core/agent-session-verification-gate.test.js +6 -4
- package/dist/core/agent-session-verification-gate.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +16 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +42 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/event-bus.d.ts +6 -6
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/verification-gate.d.ts +22 -12
- package/dist/core/verification-gate.d.ts.map +1 -1
- package/dist/core/verification-gate.js +126 -27
- package/dist/core/verification-gate.js.map +1 -1
- package/dist/core/verification-gate.test.js +40 -4
- package/dist/core/verification-gate.test.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +15 -4
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +3 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +3 -0
- package/dist/ui/app-items.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-gate.d.ts","sourceRoot":"","sources":["../../src/core/verification-gate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verification-gate.d.ts","sourceRoot":"","sources":["../../src/core/verification-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,IAAI,CAAC;AA2K7C;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAwCD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAalF;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,UAAU,CAAK;IACvB,6EAA6E;IAC7E,OAAO,CAAC,YAAY,CAAqB;IAEzC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKtC,kBAAkB,IAAI,IAAI;IAK1B,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;;;;OAKG;IACH,QAAQ,IAAI,OAAO,EAAE,GAAG,IAAI;IAM5B,KAAK,IAAI,IAAI;CAOd"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Follow-ups per run
|
|
1
|
+
/** Follow-ups per run. After this the gate is silent for the rest of the run. */
|
|
2
2
|
export const MAX_VERIFICATION_INJECTIONS = 1;
|
|
3
3
|
/** Words that may precede the real command without changing its shape. */
|
|
4
4
|
const SHELL_WRAPPERS = new Set([
|
|
@@ -47,6 +47,10 @@ const RUNNERS = new Set([
|
|
|
47
47
|
"mypy",
|
|
48
48
|
"pylint",
|
|
49
49
|
]);
|
|
50
|
+
/** Shells whose `-c <script>` operand is itself a command to classify. */
|
|
51
|
+
const SHELL_INTERPRETERS = new Set(["sh", "bash", "zsh", "dash", "ksh"]);
|
|
52
|
+
/** Nested `sh -c` unwraps allowed before the classifier gives up. */
|
|
53
|
+
const MAX_SHELL_DEPTH = 3;
|
|
50
54
|
/** A non-flag word after the runner that makes the command a verification. */
|
|
51
55
|
const VERIFY_KEYWORDS = [
|
|
52
56
|
"test",
|
|
@@ -76,14 +80,105 @@ function isVerifyWord(word) {
|
|
|
76
80
|
// Exact keyword, or a script name built on one (npm run test:unit).
|
|
77
81
|
return VERIFY_KEYWORDS.some((keyword) => word === keyword || word.startsWith(`${keyword}:`));
|
|
78
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Split a command on shell control operators (`&&`, `||`, `;`, `|`, newline),
|
|
85
|
+
* ignoring operators inside quotes, and strip subshell/group punctuation from
|
|
86
|
+
* each piece. `cd pkg && npm test` must classify on its `npm test` half — the
|
|
87
|
+
* whole-string read saw `cd` as the runner and left the gate owed forever.
|
|
88
|
+
*/
|
|
89
|
+
function splitCommandSegments(command) {
|
|
90
|
+
const segments = [];
|
|
91
|
+
let current = "";
|
|
92
|
+
let quote = null;
|
|
93
|
+
for (let i = 0; i < command.length; i++) {
|
|
94
|
+
const char = command[i];
|
|
95
|
+
if (quote) {
|
|
96
|
+
current += char;
|
|
97
|
+
if (char === "\\" && quote === '"')
|
|
98
|
+
current += command[++i] ?? "";
|
|
99
|
+
else if (char === quote)
|
|
100
|
+
quote = null;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (char === "'" || char === '"') {
|
|
104
|
+
quote = char;
|
|
105
|
+
current += char;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (char === "\\") {
|
|
109
|
+
current += char + (command[++i] ?? "");
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Bare `&` is deliberately not an operator: it would split `2>&1`.
|
|
113
|
+
const operator = ["&&", "||", ";", "|", "\n"].find((op) => command.startsWith(op, i));
|
|
114
|
+
if (operator) {
|
|
115
|
+
segments.push(current);
|
|
116
|
+
current = "";
|
|
117
|
+
i += operator.length - 1;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
current += char;
|
|
121
|
+
}
|
|
122
|
+
segments.push(current);
|
|
123
|
+
return segments
|
|
124
|
+
.map((segment) => segment
|
|
125
|
+
.trim()
|
|
126
|
+
.replace(/^[({!\s]+/, "")
|
|
127
|
+
.replace(/[)}\s]+$/, ""))
|
|
128
|
+
.filter((segment) => segment.length > 0);
|
|
129
|
+
}
|
|
130
|
+
/** Split a segment into words, honouring quotes and dropping the quote marks. */
|
|
131
|
+
function tokenize(segment) {
|
|
132
|
+
const words = [];
|
|
133
|
+
let current = "";
|
|
134
|
+
let quote = null;
|
|
135
|
+
let started = false;
|
|
136
|
+
for (let i = 0; i < segment.length; i++) {
|
|
137
|
+
const char = segment[i];
|
|
138
|
+
if (quote) {
|
|
139
|
+
if (char === "\\" && quote === '"')
|
|
140
|
+
current += segment[++i] ?? "";
|
|
141
|
+
else if (char === quote)
|
|
142
|
+
quote = null;
|
|
143
|
+
else
|
|
144
|
+
current += char;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (char === "'" || char === '"') {
|
|
148
|
+
quote = char;
|
|
149
|
+
started = true;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (/\s/.test(char)) {
|
|
153
|
+
if (started || current.length > 0)
|
|
154
|
+
words.push(current);
|
|
155
|
+
current = "";
|
|
156
|
+
started = false;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (char === "\\") {
|
|
160
|
+
current += segment[++i] ?? "";
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
current += char;
|
|
164
|
+
}
|
|
165
|
+
if (started || current.length > 0)
|
|
166
|
+
words.push(current);
|
|
167
|
+
return words;
|
|
168
|
+
}
|
|
79
169
|
/**
|
|
80
170
|
* True when the command looks like a test/typecheck/lint/build invocation:
|
|
81
|
-
* wrappers stripped, a known runner
|
|
82
|
-
* its operands. Deliberately strict —
|
|
83
|
-
* `./run_tests.sh` all read as NOT
|
|
171
|
+
* compound segments considered independently, wrappers stripped, a known runner
|
|
172
|
+
* leading, and a verification keyword among its operands. Deliberately strict —
|
|
173
|
+
* `grep test x`, `git commit -m test` and `./run_tests.sh` all read as NOT
|
|
174
|
+
* verification.
|
|
84
175
|
*/
|
|
85
176
|
export function isVerificationCommand(command) {
|
|
86
|
-
|
|
177
|
+
return splitCommandSegments(command).some((segment) => isVerificationSegment(segment, 0));
|
|
178
|
+
}
|
|
179
|
+
/** Classify one operator-free segment. `depth` bounds `sh -c` unwrapping. */
|
|
180
|
+
function isVerificationSegment(segment, depth) {
|
|
181
|
+
const words = tokenize(segment);
|
|
87
182
|
let i = 0;
|
|
88
183
|
while (i < words.length) {
|
|
89
184
|
const word = words[i];
|
|
@@ -99,6 +194,16 @@ export function isVerificationCommand(command) {
|
|
|
99
194
|
break;
|
|
100
195
|
}
|
|
101
196
|
const runner = words[i] ?? "";
|
|
197
|
+
// `sh -c "cd pkg && npm test"` — classify the script the shell will run.
|
|
198
|
+
if (SHELL_INTERPRETERS.has(runner)) {
|
|
199
|
+
if (depth >= MAX_SHELL_DEPTH)
|
|
200
|
+
return false;
|
|
201
|
+
const flagIndex = words.indexOf("-c", i + 1);
|
|
202
|
+
const script = flagIndex === -1 ? undefined : words[flagIndex + 1];
|
|
203
|
+
if (!script)
|
|
204
|
+
return false;
|
|
205
|
+
return splitCommandSegments(script).some((inner) => isVerificationSegment(inner, depth + 1));
|
|
206
|
+
}
|
|
102
207
|
if (!RUNNERS.has(runner))
|
|
103
208
|
return false;
|
|
104
209
|
if (isVerifyWord(runner))
|
|
@@ -122,17 +227,9 @@ export function buildVerificationFollowUpMessage(files) {
|
|
|
122
227
|
"command has completed since the last edit:\n" +
|
|
123
228
|
files.map((filePath) => `- ${filePath}`).join("\n") +
|
|
124
229
|
"\nRun the project's verification now (its test command, or the closest equivalent) and " +
|
|
125
|
-
"address any failures. Do not describe the change as tested or working without having run it."
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
export function buildVerificationEscalationMessage(files) {
|
|
129
|
-
return {
|
|
130
|
-
role: "user",
|
|
131
|
-
provenance: { source: "runtime", kind: "completion_gate", visibility: "hidden" },
|
|
132
|
-
content: `Verification is still outstanding after ${MAX_VERIFICATION_INJECTIONS} attempt(s); ` +
|
|
133
|
-
"the gate will not prompt again. Give your final response now and state plainly which of " +
|
|
134
|
-
"these changes went unverified and why, so the user can check them:\n" +
|
|
135
|
-
files.map((filePath) => `- ${filePath}`).join("\n"),
|
|
230
|
+
"address any failures. Do not describe the change as tested or working without having run it. " +
|
|
231
|
+
"This is the only time you will be asked: if you cannot run it, say plainly in your final " +
|
|
232
|
+
"response which of these changes went unverified and why, so the user can check them.",
|
|
136
233
|
};
|
|
137
234
|
}
|
|
138
235
|
/**
|
|
@@ -159,23 +256,25 @@ export class VerificationGate {
|
|
|
159
256
|
isOwed() {
|
|
160
257
|
return this.lastMutationSeq > this.lastVerificationSeq;
|
|
161
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Would a stop right now inject? Lets the session arm clients BEFORE the
|
|
261
|
+
* candidate final answer streams, so the draft the injection replaces is held
|
|
262
|
+
* rather than painted and then superseded.
|
|
263
|
+
*/
|
|
264
|
+
willInject() {
|
|
265
|
+
return this.isOwed() && this.injections < MAX_VERIFICATION_INJECTIONS;
|
|
266
|
+
}
|
|
162
267
|
/**
|
|
163
268
|
* The blocking message for the pre-stop hook, or null when nothing is owed
|
|
164
|
-
* or the injection
|
|
165
|
-
*
|
|
269
|
+
* or the single injection is spent. Still-owed on a later stop is deliberately
|
|
270
|
+
* silent: the demand already told the model to disclose what went unverified,
|
|
271
|
+
* and one more injection only costs the user another restated final answer.
|
|
166
272
|
*/
|
|
167
273
|
followUp() {
|
|
168
|
-
if (!this.
|
|
169
|
-
return null;
|
|
170
|
-
if (this.injections >= MAX_VERIFICATION_INJECTIONS + 1)
|
|
274
|
+
if (!this.willInject())
|
|
171
275
|
return null;
|
|
172
276
|
this.injections += 1;
|
|
173
|
-
|
|
174
|
-
return [
|
|
175
|
-
this.injections > MAX_VERIFICATION_INJECTIONS
|
|
176
|
-
? buildVerificationEscalationMessage(files)
|
|
177
|
-
: buildVerificationFollowUpMessage(files),
|
|
178
|
-
];
|
|
277
|
+
return [buildVerificationFollowUpMessage([...this.mutatedFiles].sort())];
|
|
179
278
|
}
|
|
180
279
|
reset() {
|
|
181
280
|
this.seq = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-gate.js","sourceRoot":"","sources":["../../src/core/verification-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification-gate.js","sourceRoot":"","sources":["../../src/core/verification-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,20 @@ describe("isVerificationCommand", () => {
|
|
|
24
24
|
["gradle test", "gradle test"],
|
|
25
25
|
["dotnet test", "dotnet test"],
|
|
26
26
|
["deno task test", "deno task test"],
|
|
27
|
+
// Compound / chained shells: the classifier must look past the first word.
|
|
28
|
+
["cd packages/app && npm test", "cd into a package then test"],
|
|
29
|
+
["cd /tmp/proj && pnpm --filter web test", "cd then filtered workspace test"],
|
|
30
|
+
["npm run typecheck && npm run lint && npm run test", "chained checks"],
|
|
31
|
+
["npm run build; npm test", "semicolon-separated"],
|
|
32
|
+
["npm run test 2>&1 | tee /tmp/out.log", "piped into tee"],
|
|
33
|
+
["npm test 2>&1 | tail -50", "piped into tail"],
|
|
34
|
+
["npm run lint || npm test", "or-chained"],
|
|
35
|
+
["(cd api && cargo test)", "subshell"],
|
|
36
|
+
["git add -A && npm test", "non-verification first, verification second"],
|
|
37
|
+
['sh -c "npm test"', "sh -c wrapper"],
|
|
38
|
+
['bash -c "cd pkg && npm test"', "bash -c wrapping a chain"],
|
|
39
|
+
["sh -c 'pytest tests/'", "sh -c with single quotes"],
|
|
40
|
+
["cd pkg\nnpm test", "newline-separated"],
|
|
27
41
|
];
|
|
28
42
|
const no = [
|
|
29
43
|
["git commit -m fix test", "commit message mentioning test"],
|
|
@@ -36,6 +50,14 @@ describe("isVerificationCommand", () => {
|
|
|
36
50
|
["go run main.go", "go run"],
|
|
37
51
|
["python train.py", "python script"],
|
|
38
52
|
["echo running tests soon", "echo mentioning tests"],
|
|
53
|
+
// Compound negatives: splitting must not invent verification.
|
|
54
|
+
["cd packages/app && npm install", "cd then install"],
|
|
55
|
+
["git add -A && git commit -m 'add test'", "chained git with test in the message"],
|
|
56
|
+
["cd src && ./run_tests.sh", "cd then direct script"],
|
|
57
|
+
['echo "npm test" > notes.txt', "verification text inside a quoted argument"],
|
|
58
|
+
['sh -c "npm run dev"', "sh -c wrapping a dev server"],
|
|
59
|
+
["bash scripts/test.sh", "bash running a script file, not -c"],
|
|
60
|
+
["cat out.log | grep test", "piped grep"],
|
|
39
61
|
];
|
|
40
62
|
it.each(yes)("classifies %s as verification (%s)", (command) => {
|
|
41
63
|
expect(isVerificationCommand(command)).toBe(true);
|
|
@@ -78,17 +100,31 @@ describe("VerificationGate", () => {
|
|
|
78
100
|
expect(gate.isOwed()).toBe(false);
|
|
79
101
|
expect(gate.followUp()).toBeNull();
|
|
80
102
|
});
|
|
81
|
-
it("demands once,
|
|
103
|
+
it("demands once, then goes silent on every later stop while still owed", () => {
|
|
82
104
|
const gate = new VerificationGate();
|
|
83
105
|
gate.recordMutation("a.ts");
|
|
84
106
|
const demand = gate.followUp();
|
|
85
107
|
expect(String(demand[0].content)).toContain("Run the project's verification");
|
|
86
|
-
// Model stopped again without verifying
|
|
87
|
-
|
|
88
|
-
expect(
|
|
108
|
+
// Model stopped again without verifying: still owed, but no second turn is
|
|
109
|
+
// spent on it — each extra injection costs the user another final answer.
|
|
110
|
+
expect(gate.isOwed()).toBe(true);
|
|
111
|
+
expect(gate.followUp()).toBeNull();
|
|
89
112
|
expect(gate.followUp()).toBeNull();
|
|
90
113
|
expect(MAX_VERIFICATION_INJECTIONS).toBe(1);
|
|
91
114
|
});
|
|
115
|
+
it("carries the unverified-disclosure fallback in its single demand", () => {
|
|
116
|
+
const gate = new VerificationGate();
|
|
117
|
+
gate.recordMutation("a.ts");
|
|
118
|
+
// The dropped escalation turn existed only to ask for this; the demand now
|
|
119
|
+
// asks for it up front, so the honesty requirement survives without a turn.
|
|
120
|
+
expect(String(gate.followUp()[0].content)).toContain("unverified");
|
|
121
|
+
});
|
|
122
|
+
it("spends no injection when nothing is owed, so a later mutation still gets its demand", () => {
|
|
123
|
+
const gate = new VerificationGate();
|
|
124
|
+
expect(gate.followUp()).toBeNull();
|
|
125
|
+
gate.recordMutation("a.ts");
|
|
126
|
+
expect(String(gate.followUp()[0].content)).toContain("Run the project's verification");
|
|
127
|
+
});
|
|
92
128
|
it("a later mutation re-arms an already-satisfied gate after a fresh budget reset", () => {
|
|
93
129
|
const gate = new VerificationGate();
|
|
94
130
|
gate.recordMutation("a.ts");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-gate.test.js","sourceRoot":"","sources":["../../src/core/verification-gate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,GAAG,GAAG;QACV,CAAC,UAAU,EAAE,UAAU,CAAC;QACxB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;QACnD,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;QACpC,CAAC,oBAAoB,EAAE,YAAY,CAAC;QACpC,CAAC,YAAY,EAAE,aAAa,CAAC;QAC7B,CAAC,iBAAiB,EAAE,WAAW,CAAC;QAChC,CAAC,cAAc,EAAE,UAAU,CAAC;QAC5B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,eAAe,EAAE,SAAS,CAAC;QAC5B,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5B,CAAC,cAAc,EAAE,cAAc,CAAC;QAChC,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5B,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;QAC3C,CAAC,eAAe,EAAE,aAAa,CAAC;QAChC,CAAC,eAAe,EAAE,eAAe,CAAC;QAClC,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;QACzD,CAAC,eAAe,EAAE,iBAAiB,CAAC;QACpC,CAAC,gBAAgB,EAAE,YAAY,CAAC;QAChC,CAAC,eAAe,EAAE,aAAa,CAAC;QAChC,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-gate.test.js","sourceRoot":"","sources":["../../src/core/verification-gate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,GAAG,GAAG;QACV,CAAC,UAAU,EAAE,UAAU,CAAC;QACxB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;QACnD,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;QACpC,CAAC,oBAAoB,EAAE,YAAY,CAAC;QACpC,CAAC,YAAY,EAAE,aAAa,CAAC;QAC7B,CAAC,iBAAiB,EAAE,WAAW,CAAC;QAChC,CAAC,cAAc,EAAE,UAAU,CAAC;QAC5B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,eAAe,EAAE,SAAS,CAAC;QAC5B,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5B,CAAC,cAAc,EAAE,cAAc,CAAC;QAChC,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5B,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;QAC3C,CAAC,eAAe,EAAE,aAAa,CAAC;QAChC,CAAC,eAAe,EAAE,eAAe,CAAC;QAClC,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;QACzD,CAAC,eAAe,EAAE,iBAAiB,CAAC;QACpC,CAAC,gBAAgB,EAAE,YAAY,CAAC;QAChC,CAAC,eAAe,EAAE,aAAa,CAAC;QAChC,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;QACpC,2EAA2E;QAC3E,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;QAC9D,CAAC,wCAAwC,EAAE,iCAAiC,CAAC;QAC7E,CAAC,mDAAmD,EAAE,gBAAgB,CAAC;QACvE,CAAC,yBAAyB,EAAE,qBAAqB,CAAC;QAClD,CAAC,sCAAsC,EAAE,gBAAgB,CAAC;QAC1D,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;QAC/C,CAAC,0BAA0B,EAAE,YAAY,CAAC;QAC1C,CAAC,wBAAwB,EAAE,UAAU,CAAC;QACtC,CAAC,wBAAwB,EAAE,6CAA6C,CAAC;QACzE,CAAC,kBAAkB,EAAE,eAAe,CAAC;QACrC,CAAC,8BAA8B,EAAE,0BAA0B,CAAC;QAC5D,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;QACrD,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;KAC1C,CAAC;IACF,MAAM,EAAE,GAAG;QACT,CAAC,wBAAwB,EAAE,gCAAgC,CAAC;QAC5D,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;QAC/C,CAAC,qBAAqB,EAAE,WAAW,CAAC;QACpC,CAAC,gBAAgB,EAAE,eAAe,CAAC;QACnC,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;QAC/C,CAAC,aAAa,EAAE,iBAAiB,CAAC;QAClC,CAAC,aAAa,EAAE,YAAY,CAAC;QAC7B,CAAC,gBAAgB,EAAE,QAAQ,CAAC;QAC5B,CAAC,iBAAiB,EAAE,eAAe,CAAC;QACpC,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;QACpD,8DAA8D;QAC9D,CAAC,gCAAgC,EAAE,iBAAiB,CAAC;QACrD,CAAC,wCAAwC,EAAE,sCAAsC,CAAC;QAClF,CAAC,0BAA0B,EAAE,uBAAuB,CAAC;QACrD,CAAC,6BAA6B,EAAE,4CAA4C,CAAC;QAC7E,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;QACtD,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;QAC9D,CAAC,yBAAyB,EAAE,YAAY,CAAC;KAC1C,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oCAAoC,EAAE,CAAC,OAAO,EAAE,EAAE;QAC7D,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,wCAAwC,EAAE,CAAC,OAAO,EAAE,EAAE;QAChE,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAG,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAG,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAE/E,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAG,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAG,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAoBA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,6BAA6B,CAAC;AAmBrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAapF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAkB,eAAe,EAAe,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAa3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAIpE,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAY9B,OAAO,KAAK,EACV,aAAa,EAYd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/App.js
CHANGED
|
@@ -59,7 +59,7 @@ import { pickDurationVerb } from "./duration-summary.js";
|
|
|
59
59
|
import { toErrorItem } from "./error-item.js";
|
|
60
60
|
import { addLinesChanged, buildSessionSummary, createSessionStats, recordServerToolCall, recordToolEnd, recordTurnEnd, } from "./session-summary.js";
|
|
61
61
|
import { compactHistory, getNextGeneratedItemId, isActiveItem, isSameAssistantText, normalizeAssistantText, partitionCompleted, pinStreamingTextBeforeToolBoundary, removeItemsWithIds, uniqueItemsById, } from "./item-helpers.js";
|
|
62
|
-
import { IDEAL_HOOK_NOTICE_TEXT, LOOP_BREAK_NOTICE_TEXT, REGROUNDING_NOTICE_TEXT, TRUNCATED_CONTINUING_NOTICE_TEXT, TRUNCATED_INCOMPLETE_NOTICE_TEXT, TRUNCATED_EMPTY_RESPONSE_NOTICE_TEXT, TRUNCATED_PROVIDER_ERROR_NOTICE_TEXT, TRUNCATED_REFUSAL_NOTICE_TEXT, lastVisibleTranscriptItem, } from "./app-items.js";
|
|
62
|
+
import { IDEAL_HOOK_NOTICE_TEXT, LOOP_BREAK_NOTICE_TEXT, REGROUNDING_NOTICE_TEXT, VERIFICATION_HOOK_NOTICE_TEXT, TRUNCATED_CONTINUING_NOTICE_TEXT, TRUNCATED_INCOMPLETE_NOTICE_TEXT, TRUNCATED_EMPTY_RESPONSE_NOTICE_TEXT, TRUNCATED_PROVIDER_ERROR_NOTICE_TEXT, TRUNCATED_REFUSAL_NOTICE_TEXT, lastVisibleTranscriptItem, } from "./app-items.js";
|
|
63
63
|
export { buildUserContentWithAttachments, routePromptCommandInput } from "./prompt-routing.js";
|
|
64
64
|
export { getNextThinkingLevel } from "./thinking-level.js";
|
|
65
65
|
export { getChatControlsLayoutDecision, getDoneFlushDecision, getScrollStabilizationDecision, getStaticHistoryKey, hasParagraphBreakLiveUserMessage, isTallLiveUserMessage, shouldHideHistoryForOverlayView, shouldHideStaticItemsForOverlayView, shouldStabilizeOverlayPaneRerender, shouldTopSpaceAfterPrintedAgentBoundary, shouldTopSpaceAssistantAfterToolBoundary, shouldTopSpaceStreamingAssistant, } from "./layout-decisions.js";
|
|
@@ -1372,12 +1372,23 @@ export function App(props) {
|
|
|
1372
1372
|
return processFollowUp;
|
|
1373
1373
|
}
|
|
1374
1374
|
// Verification gate: code was edited but no test/typecheck/lint/build
|
|
1375
|
-
// completed since the last edit —
|
|
1376
|
-
// budget escalates to an honest unverified statement).
|
|
1375
|
+
// completed since the last edit — demand it once, then let the run stop.
|
|
1377
1376
|
if (verificationGateEnabledRef.current) {
|
|
1378
1377
|
const verificationFollowUp = verificationGateRef.current.followUp();
|
|
1379
|
-
if (verificationFollowUp)
|
|
1378
|
+
if (verificationFollowUp) {
|
|
1379
|
+
// Say why the run is continuing past its apparent end, or the extra
|
|
1380
|
+
// answer reads as the agent talking to itself.
|
|
1381
|
+
setLiveItems((prev) => [
|
|
1382
|
+
...prev,
|
|
1383
|
+
{
|
|
1384
|
+
kind: "ideal_hook",
|
|
1385
|
+
text: VERIFICATION_HOOK_NOTICE_TEXT,
|
|
1386
|
+
tone: "review",
|
|
1387
|
+
id: getId(),
|
|
1388
|
+
},
|
|
1389
|
+
]);
|
|
1380
1390
|
return verificationFollowUp;
|
|
1391
|
+
}
|
|
1381
1392
|
}
|
|
1382
1393
|
const steps = planStepsRef.current;
|
|
1383
1394
|
if (steps.length === 0 || !approvedPlanPathRef.current)
|