mindweave 2.4.5 → 2.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cli/App.js +35 -8
  2. package/dist/cli/App.js.map +1 -1
  3. package/dist/cli/attachments.js +18 -5
  4. package/dist/cli/attachments.js.map +1 -1
  5. package/dist/cli/backgroundWake.js +4 -0
  6. package/dist/cli/backgroundWake.js.map +1 -0
  7. package/dist/cli/commands.js +1 -1
  8. package/dist/cli/commands.js.map +1 -1
  9. package/dist/dynamo/contextBudget.js +145 -0
  10. package/dist/dynamo/contextBudget.js.map +1 -0
  11. package/dist/dynamo/contextWindow.js +18 -0
  12. package/dist/dynamo/contextWindow.js.map +1 -1
  13. package/dist/dynamo/engine.js +29 -7
  14. package/dist/dynamo/engine.js.map +1 -1
  15. package/dist/dynamo/prompt.js +4 -0
  16. package/dist/dynamo/prompt.js.map +1 -1
  17. package/dist/mcp/oauth/flow.js +20 -3
  18. package/dist/mcp/oauth/flow.js.map +1 -1
  19. package/dist/memory/autoMemory.js +42 -1
  20. package/dist/memory/autoMemory.js.map +1 -1
  21. package/dist/memory/compaction.js +19 -44
  22. package/dist/memory/compaction.js.map +1 -1
  23. package/dist/memory/session.js +4 -0
  24. package/dist/memory/session.js.map +1 -1
  25. package/dist/tools/backgroundShells.js +42 -4
  26. package/dist/tools/backgroundShells.js.map +1 -1
  27. package/dist/tools/readFile.js +29 -9
  28. package/dist/tools/readFile.js.map +1 -1
  29. package/dist/tools/runCommand.js +35 -8
  30. package/dist/tools/runCommand.js.map +1 -1
  31. package/dist/tools/subagent.js +41 -3
  32. package/dist/tools/subagent.js.map +1 -1
  33. package/dist/tools/todo.js +35 -0
  34. package/dist/tools/todo.js.map +1 -1
  35. package/dist/tools/verifyReport.js +144 -0
  36. package/dist/tools/verifyReport.js.map +1 -0
  37. package/package.json +2 -2
@@ -26,6 +26,7 @@
26
26
  */
27
27
  import { randomUUID } from "node:crypto";
28
28
  import { STATUS_INSTRUCTION, renderVerdict, verifySubagentReport } from "./subagentReport.js";
29
+ import { VERDICT_INSTRUCTION, VERIFIER_PROMPT, parseVerdict, renderVerdict as renderVerdictLine } from "./verifyReport.js";
29
30
  import { fail, failQuietly } from "./results.js";
30
31
  const MAX_SUBAGENT_DEPTH = 1;
31
32
  /** Default step budget for a worker; the caller can scale it with `max_steps`. */
@@ -136,6 +137,14 @@ export const spawnSubagent = {
136
137
  maximum: MAX_SUBAGENT_STEPS,
137
138
  description: `Tool-round budget for the child (default ${SUBAGENT_BUDGET}). Scale it up for deeper tasks, down for quick lookups.`,
138
139
  },
140
+ verify: {
141
+ type: "boolean",
142
+ description: "Spawn an adversarial VERIFIER of work that has already been done, instead of a worker. It is read-only " +
143
+ "(implied — do not also pass read_only), it is told to try to BREAK the change rather than confirm it, and " +
144
+ "it must show the command and output behind every check it claims. It answers `VERDICT: pass|fail|partial`, " +
145
+ "and a pass with no command output is automatically downgraded to partial. Give it the ORIGINAL request, " +
146
+ "the files that changed, and what the approach was — it cannot see this conversation.",
147
+ },
139
148
  },
140
149
  },
141
150
  async execute(args, ctx) {
@@ -153,16 +162,22 @@ export const spawnSubagent = {
153
162
  // The status line is asked for on EVERY child, not only formatted ones: it is the
154
163
  // child's half of the verification contract (see subagentReport.ts), and a child
155
164
  // with no output_format is if anything the one whose outcome is least obvious.
165
+ // A VERIFIER answers a different contract: a verdict about the CODE rather than a
166
+ // status about its own run, and it carries its role in the system prompt rather than
167
+ // in the task — see verifyReport.ts for why that distinction is load-bearing.
168
+ const verifying = args.verify === true;
156
169
  const framedTask = [
157
170
  task,
158
171
  outputFormat ? `Report your result in EXACTLY this format:\n${outputFormat}` : "",
159
- STATUS_INSTRUCTION,
172
+ verifying ? VERDICT_INSTRUCTION : STATUS_INSTRUCTION,
160
173
  ]
161
174
  .filter(Boolean)
162
175
  .join("\n\n");
163
176
  const budget = clampSteps(args.max_steps) ?? SUBAGENT_BUDGET;
164
- const readOnly = args.read_only === true;
165
- const child = ctx.forkChild(framedTask, { readOnly });
177
+ // Verification is read-only whether or not the caller remembered to say so. A verifier
178
+ // that can edit is a verifier that can make the thing it is judging pass.
179
+ const readOnly = verifying || args.read_only === true;
180
+ const child = ctx.forkChild(framedTask, { readOnly, ...(verifying ? { agentPrompt: VERIFIER_PROMPT } : {}) });
166
181
  // Dynamic import: the static registry ← engine edge would otherwise cycle. By the
167
182
  // time execute() runs, both modules are fully loaded, so this is safe.
168
183
  const { respond } = await import("../dynamo/engine.js");
@@ -200,6 +215,29 @@ export const spawnSubagent = {
200
215
  // been checked. Nothing is withheld — the parent decides whether a partial answer
201
216
  // is still useful — but it is told what not to assume, above the report rather
202
217
  // than after it.
218
+ if (verifying) {
219
+ // The verifier's report is judged on its EVIDENCE, not on its confidence: a pass
220
+ // carrying no command output is downgraded before the parent ever reads the word.
221
+ const report = parseVerdict(reply);
222
+ const line = renderVerdictLine(report);
223
+ ctx.emitEvent?.({
224
+ type: "subagent",
225
+ phase: "end",
226
+ id: agentId,
227
+ summary: `${stepLabel} · ${line}`,
228
+ error: report.verdict === "fail",
229
+ });
230
+ const header = [
231
+ report.concerns.length > 0 ? `Treat with care: ${report.concerns.join("; ")}.` : "",
232
+ `VERDICT: ${report.verdict} (${report.evidence} check${report.evidence === 1 ? "" : "s"} with evidence)`,
233
+ ]
234
+ .filter(Boolean)
235
+ .join("\n");
236
+ return {
237
+ output: `${header}\n\n${report.body}`,
238
+ summary: `verify · ${stepLabel} · ${line}`,
239
+ };
240
+ }
203
241
  const verdict = verifySubagentReport(reply, { steps, budget, outputFormat });
204
242
  const flag = verdict.trustworthy ? "" : ` · ${verdict.status === "unstated" ? "unverified" : verdict.status}`;
205
243
  ctx.emitEvent?.({ type: "subagent", phase: "end", id: agentId, summary: `${stepLabel}${flag}`, error: verdict.status === "failed" });
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,26 @@
1
1
  import { failQuietly } from "./results.js";
2
2
  const STATUSES = ["pending", "in_progress", "completed"];
3
+ /** Below this, closing everything out is a small job finishing, not a run of work worth
4
+ * an independent check. Three is where "I did a few things" starts. */
5
+ const NUDGE_AT = 3;
6
+ /** Words that mean a task WAS the checking. Matched loosely because the model writes
7
+ * these itself and will phrase them freely. */
8
+ const VERIFICATION_WORDS = /\bverif|\btest|\bcheck|\bprov(e|ing|ed)\b|\bvalidat|\bconfirm/i;
9
+ /**
10
+ * Should this update carry the verification reminder (pure)?
11
+ *
12
+ * True only when EVERYTHING is finished and none of it was itself a check. A list that
13
+ * still has work in it is mid-run and the reminder would be noise; a list containing a
14
+ * "run the tests" task already did the thing being suggested, and nagging about it would
15
+ * teach the model to ignore the note — which is the real cost of a false positive here.
16
+ */
17
+ export function needsVerificationNudge(items) {
18
+ if (items.length < NUDGE_AT)
19
+ return false;
20
+ if (!items.every((t) => t.status === "completed"))
21
+ return false;
22
+ return !items.some((t) => VERIFICATION_WORDS.test(t.content));
23
+ }
3
24
  export const todoWrite = {
4
25
  name: "todo_write",
5
26
  /** Deferred: a task list is a planning instrument reached for once on a substantial
@@ -59,6 +80,20 @@ export const todoWrite = {
59
80
  if (inProgress > 1) {
60
81
  notes.push(`Note: ${inProgress} tasks are in_progress — keep it to one at a time.`);
61
82
  }
83
+ // THE VERIFICATION NUDGE, and it lives HERE rather than in the prompt on purpose.
84
+ //
85
+ // A standing rule about verifying before reporting done is exactly the kind of rule
86
+ // that survives a short task and is gone by the end of a long one — the prompt is far
87
+ // away and the work is right here. This fires at the moment the model is closing out
88
+ // a run of tasks, in the result it is already reading, which is the one place it
89
+ // cannot have drifted from. Nothing is blocked: it is a reminder in a tool result,
90
+ // not a gate, because the model may have good reason to skip it.
91
+ if (needsVerificationNudge(parsed)) {
92
+ notes.push(`Note: ${parsed.length} tasks are done and none of them was a verification step. ` +
93
+ "If this turn made non-trivial changes, spawn a verifier (spawn_subagent with " +
94
+ "verify:true) before reporting the work complete — give it the original request, " +
95
+ "the files that changed, and the approach. Listing your own caveats is not a verdict.");
96
+ }
62
97
  const body = allDone
63
98
  ? "All tasks completed — list cleared."
64
99
  : render(parsed);
@@ -1 +1 @@
1
- {"version":3,"file":"todo.js","sourceRoot":"","sources":["../../src/tools/todo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"todo.js","sourceRoot":"","sources":["../../src/tools/todo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * verifyReport.ts — the contract a verification worker answers under.
3
+ *
4
+ * A normal worker reports on ITSELF: `STATUS: complete` means "I did what you asked".
5
+ * A verifier has to report on something else — the code — and those two are genuinely
6
+ * different claims. A verifier can do its job perfectly and still have to say the work is
7
+ * broken, which under the worker contract would be a "complete" report carrying a failure,
8
+ * or worse, a "failed" report implying the verifier malfunctioned. So verification gets
9
+ * its own word, `VERDICT`, and its own parser.
10
+ *
11
+ * THE PROBLEM THIS WHOLE FILE EXISTS FOR: a model asked to verify will, under load,
12
+ * read the code, narrate the checks it would run, and write PASS. That is not a rare
13
+ * failure — it is the default one, and no amount of asking nicely fixes it. So the
14
+ * contract is mechanical instead: a PASS must carry command output, `evidenceCount`
15
+ * counts it, and `parseVerdict` DOWNGRADES a PASS that carries none. The model cannot
16
+ * talk its way past a function that counts.
17
+ */
18
+ /**
19
+ * The verifier's own instructions, appended to its system prompt.
20
+ *
21
+ * Deliberately about the MODEL's failure modes rather than about testing technique. The
22
+ * strategy half of this ("start the server, hit the endpoint") is engineering judgment the
23
+ * model already has and the thin-prompt boundary says we do not teach. What it does NOT
24
+ * reliably have is resistance to its own urge to skip the check — so that is what this
25
+ * spends its words on, named specifically enough to be recognised in the moment.
26
+ */
27
+ export const VERIFIER_PROMPT = `You are verifying someone else's work. Your job is not to confirm it works — it is to try to break it.
28
+
29
+ You have two failure modes, and naming them is the point:
30
+
31
+ 1. VERIFICATION AVOIDANCE. Faced with a check, you find reasons not to run it: you read the code, describe what you would test, write "PASS", and move on. Reading is not verification. If you catch yourself writing an explanation where a command should be, stop and run the command.
32
+ 2. THE FIRST 80%. A screen that renders and a green test suite feel like success. They are the easy part. The value is entirely in the last 20% — the button that does nothing, the state that vanishes on reload, the input that crashes it. Go looking for that.
33
+
34
+ These are the exact sentences you will reach for. Each one is wrong:
35
+ - "The code looks correct based on my reading" — run it.
36
+ - "The existing tests already pass" — those were written by the same kind of model that wrote the code. Check independently.
37
+ - "This is probably fine" — probably is not verified.
38
+ - "I don't have the tools for this" — check what you actually have before deciding that.
39
+
40
+ YOU CANNOT MODIFY ANYTHING. Your edit and write tools are removed, not discouraged — this is enforced, so do not plan around it. Read, search, and run commands. A scratch file under the system temp directory is fine; the project is not.
41
+
42
+ WHAT TO DO. Run the build. Run the tests, including the full suite when the change is broad enough to warrant it. Run the typechecker and any linter. Then — and this is the part that matters — exercise the change itself: call the function, hit the endpoint, run the command, drive the UI. Finally, try to break it: boundary values, empty and malformed input, the same operation twice, an id that does not exist.
43
+
44
+ Test results are context, not evidence. Note them and move on to checking the thing itself.
45
+
46
+ EVERY CHECK IS REPORTED LIKE THIS:
47
+
48
+ ### Check: <what you are verifying>
49
+ $ <the exact command you ran>
50
+ <the real output, pasted — trimmed if long, but never paraphrased>
51
+ => PASS (or FAIL, with what you expected and what you got)
52
+
53
+ A check with no command and no output is not a PASS, it is a skip, and it is counted as one. At least one of your checks must be an attempt to BREAK the code, and you must report what happened even if it held up correctly.
54
+
55
+ BEFORE YOU REPORT FAIL, rule out three things: something upstream already handles it; a comment or the project's own notes say it is deliberate; or it is a real limit that cannot be fixed without breaking something external. Any of those makes it an observation, not a failure. Do not use them to wave away a real bug either.
56
+
57
+ END WITH EXACTLY ONE LINE, nothing after it:
58
+ VERDICT: pass
59
+ VERDICT: fail
60
+ VERDICT: partial
61
+
62
+ \`partial\` is ONLY for something that stopped you — a tool you do not have, a server that will not start, no test framework. It is not for "I am unsure whether this is a bug". If you were able to run the check, decide.`;
63
+ /** The line the verifier must end on, restated at the end of the task where it is closest
64
+ * to the work. The system prompt says it once; a long run buries a single mention. */
65
+ export const VERDICT_INSTRUCTION = "End your reply with a final line of exactly `VERDICT: pass`, `VERDICT: fail`, or `VERDICT: partial` — " +
66
+ "pass only if you RAN checks that prove it works, fail if something is broken, partial only if " +
67
+ "something prevented you from checking at all. Every check you claim must show the command you ran " +
68
+ "and the output you got back.";
69
+ /**
70
+ * Same leniency as the worker status line, for the same reason: asked for a bare line,
71
+ * models reliably produce `**VERDICT: pass**` or `> VERDICT: PASS.` and a verdict that
72
+ * fails to parse reads as "never reached a conclusion", which would flag every
73
+ * well-behaved verifier and train the caller to ignore the flag.
74
+ */
75
+ const VERDICT_LINE = /^[ \t>*_#-]*VERDICT[:\s]+\s*(pass|fail|partial)[ \t*_.!]*$/im;
76
+ /**
77
+ * Count the checks that actually show their working (pure).
78
+ *
79
+ * Two shapes are accepted because the prompt asks for one and models drift to the other:
80
+ * a `$ command` line, and a fenced block introduced by "Command run". Both require the
81
+ * OUTPUT to follow, which is the half that cannot be produced without running anything.
82
+ */
83
+ export function evidenceCount(text) {
84
+ let count = 0;
85
+ const lines = text.split(/\r?\n/);
86
+ for (let i = 0; i < lines.length; i++) {
87
+ const line = lines[i];
88
+ const isCommand = /^\s*\$\s+\S/.test(line) || /^\s*\*{0,2}Command run/i.test(line);
89
+ if (!isCommand)
90
+ continue;
91
+ // A command with nothing after it is a command someone typed into a report, not one
92
+ // they ran. Something non-empty has to follow before the next check heading.
93
+ const next = lines.slice(i + 1, i + 6).find((l) => l.trim() && !/^\s*\$\s+\S/.test(l));
94
+ if (next && !/^#{1,6}\s/.test(next))
95
+ count += 1;
96
+ }
97
+ return count;
98
+ }
99
+ /**
100
+ * Read the verifier's conclusion, and refuse to take an unevidenced PASS at face value.
101
+ *
102
+ * The downgrade is the whole mechanism. A model that skipped the work and wrote `pass`
103
+ * produces a report with no command output in it, and that is a property of the text that
104
+ * a function can check — unlike sincerity, which is not. `fail` and `partial` are NOT
105
+ * downgraded: claiming something is broken, or that you were blocked, is not a claim that
106
+ * benefits the claimer, so there is no incentive to fake it and no reason to second-guess.
107
+ */
108
+ export function parseVerdict(reply) {
109
+ const text = (reply ?? "").trim();
110
+ const match = VERDICT_LINE.exec(text);
111
+ const stated = (match?.[1]?.toLowerCase() ?? "unstated");
112
+ const body = match ? text.replace(VERDICT_LINE, "").trim() : text;
113
+ const evidence = evidenceCount(body);
114
+ const concerns = [];
115
+ let verdict = stated;
116
+ let downgraded = false;
117
+ if (stated === "pass" && evidence === 0) {
118
+ verdict = "partial";
119
+ downgraded = true;
120
+ concerns.push("claimed pass without showing a single command and its output — treat as unverified, not as working");
121
+ }
122
+ if (stated === "unstated") {
123
+ concerns.push("never stated a verdict");
124
+ }
125
+ if (stated === "pass" && evidence === 1) {
126
+ // Not downgraded — one real check is a real check — but a single one is rarely the
127
+ // adversarial probe the contract asks for as well as the happy path.
128
+ concerns.push("only one check carried evidence; nothing here looks like an attempt to break it");
129
+ }
130
+ return { verdict, body, evidence, downgraded, concerns };
131
+ }
132
+ /** One line for the transcript. The caller gets the body; the user gets this. */
133
+ export function renderVerdict(report) {
134
+ const label = report.verdict === "pass"
135
+ ? "verified"
136
+ : report.verdict === "fail"
137
+ ? "FAILED verification"
138
+ : report.verdict === "partial"
139
+ ? "could not fully verify"
140
+ : "no verdict";
141
+ const checks = report.evidence === 1 ? "1 check" : `${report.evidence} checks`;
142
+ return `${label} · ${checks}`;
143
+ }
144
+ //# sourceMappingURL=verifyReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyReport.js","sourceRoot":"","sources":["../../src/tools/verifyReport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindweave",
3
- "version": "2.4.5",
3
+ "version": "2.4.7",
4
4
  "description": "Mindweave — a fast, model-adaptive terminal coding agent.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -36,7 +36,7 @@
36
36
  "install-global": "npm run build && npm link",
37
37
  "typecheck": "tsc --noEmit",
38
38
  "test": "npm run test:main && npm run test:lang",
39
- "test:main": "node --max-old-space-size=4096 --import tsx --import ./scripts/testState.mjs --test --test-concurrency=4 --test-timeout=120000 src/drivers/clientId.test.ts src/drivers/contextOverflow.test.ts src/drivers/retryPolicy.test.ts src/drivers/partialTurn.test.ts src/drivers/retryTransport.test.ts src/tools/tools.test.ts src/tools/quietFailures.test.ts src/tools/readBatch.test.ts src/tools/readBudget.test.ts src/tools/search.test.ts src/tools/searchPrecision.test.ts src/tools/ripgrepBundle.test.ts src/tools/shellLint.test.ts src/tools/askUser.test.ts src/tools/newtools.test.ts src/tools/webSearch.test.ts src/tools/webFetch.test.ts src/tools/screenshot.test.ts src/tools/viewImage.test.ts src/tools/openDefault.test.ts src/tools/commandOutput.test.ts src/tools/commandProgress.test.ts src/tools/runCommandExit.test.ts src/tools/exitPlan.test.ts src/dynamo/planLifecycle.test.ts src/dynamo/steering.test.ts src/cli/approvalText.probe.test.tsx src/tools/webSecurity.test.ts src/tools/codeIntel.test.ts src/memory/resumeFidelity.test.ts src/memory/memory.test.ts src/memory/durability.test.ts src/memory/memoryIndex.test.ts src/memory/callLog.test.ts src/memory/auditFixes.test.ts src/memory/compactionHygiene.test.ts src/memory/rounds.test.ts src/memory/subagentCost.test.ts src/memory/sessionMemory.test.ts src/memory/sessionMemoryCompact.test.ts src/memory/restore.test.ts src/memory/resumeReads.test.ts src/memory/autoMemory.test.ts src/memory/projectMemory.test.ts src/memory/projectNotes.test.ts src/memory/workingSet.test.ts src/memory/presence.test.ts src/memory/pastedText.test.ts src/memory/images.test.ts src/dynamo/contextWindow.test.ts src/dynamo/compactPaths.test.ts src/dynamo/cacheBreak.test.ts src/dynamo/coldCache.test.ts src/drivers/anthropic/cachePoints.test.ts src/dynamo/planArtifact.test.ts src/tools/focus.test.ts src/tools/workingSetTools.test.ts src/project/context.test.ts src/cli/version.test.ts src/cli/updateCheck.test.ts src/cli/quietConsole.test.ts src/cli/appIdentity.test.ts src/cli/memoryTuning.test.ts src/cli/keyField.test.ts src/cli/keyStore.test.ts src/cli/keyManager.probe.test.tsx src/cli/mcpMinitabs.probe.test.tsx src/cli/components/minitabs.probe.test.tsx src/cli/trust.probe.test.tsx src/cli/firstRunFrame.probe.test.tsx src/cli/keySetup.probe.test.tsx src/cli/firstRun.test.ts src/cli/startupFill.test.ts src/cli/liveSize.test.ts src/cli/frameBottom.probe.test.tsx src/cli/screenMode.test.ts src/cli/screenPicker.probe.test.tsx src/cli/screenShell.test.ts src/cli/screenStore.test.ts src/cli/inlineShell.probe.test.tsx src/cli/inlineCaret.probe.test.tsx src/cli/startupArgs.test.ts src/cli/markdown.test.ts src/cli/help.test.ts src/cli/providerSwitch.test.ts src/cli/attachments.test.ts src/cli/pasteAssembler.test.ts src/cli/approvalQueue.test.ts src/cli/transcript.test.ts src/cli/viewWait.probe.test.tsx src/cli/compaction.test.ts src/cli/commandLabel.test.ts src/cli/restart.test.ts src/cli/selfUpdate.test.ts src/cli/blockHeights.test.ts src/cli/resizePolicy.probe.test.tsx src/cli/blockSpacing.test.ts src/cli/inputView.test.ts src/cli/wordEdit.test.ts src/cli/wordEdit.probe.test.tsx src/cli/dropHandles.test.ts src/cli/dropHandles.probe.test.tsx src/cli/tipLine.probe.test.tsx src/cli/selection.test.ts src/cli/mouseLayer.probe.test.tsx src/cli/caret.probe.test.tsx src/cli/caretPark.test.ts src/cli/shuttle.probe.test.tsx src/cli/toolReveal.test.tsx src/cli/blockPerf.probe.test.tsx src/cli/blockSpacing.probe.test.tsx src/cli/workingVerb.test.ts src/cli/typingPerf.probe.test.tsx src/cli/scrollPerf.probe.test.tsx src/cli/virtualWindow.test.ts src/cli/virtualRender.probe.test.tsx src/cli/incrementalResize.probe.test.tsx src/cli/framebuffer/paint.test.ts src/cli/framebuffer/terminalAgreement.test.ts src/cli/framebuffer/writer.test.tsx src/cli/framebuffer/stoodDown.test.tsx src/cli/framebuffer/resizeCorruption.probe.test.tsx src/cli/toolItems.test.ts src/cli/toolDisplay.test.ts src/cli/toolColour.probe.test.tsx src/cli/mouse.test.ts src/cli/wheelCoalesce.test.ts src/cli/terminalRestore.test.ts src/cli/exitCursor.test.ts src/cli/ctrlC.test.ts src/cli/wrap.test.ts src/cli/chatAnchor.test.ts src/cli/chatAnchor.probe.test.tsx src/cli/scrollPill.test.ts src/cli/scrollPill.probe.test.tsx src/cli/pillClick.probe.test.tsx src/cli/inlineReading.probe.test.tsx src/cli/readingClose.probe.test.tsx src/cli/footerRemount.probe.test.tsx src/cli/scrollFlicker.probe.test.tsx src/cli/headerScroll.probe.test.tsx src/cli/reflowAnchor.test.ts src/cli/groupReveal.test.ts src/cli/revealPace.test.ts src/cli/messageQueue.test.ts src/cli/resumeParity.test.ts src/cli/commands.test.ts src/cli/commandRoute.test.ts src/cli/commandArgs.test.ts src/cli/pickerOrder.test.ts src/cli/clearSession.test.ts src/cli/queuePop.probe.test.tsx src/cli/menuContinuity.probe.test.tsx src/dynamo/model.test.ts src/dynamo/engine.test.ts src/drivers/docsCurrent.test.ts src/drivers/registry.test.ts src/drivers/providerSwitch.test.ts src/drivers/dynamicManifest.test.ts src/drivers/newProviders.test.ts src/drivers/providerError.test.ts src/cli/refusalNotice.probe.test.tsx src/drivers/deepseek/client.test.ts src/drivers/deepseek/vision.test.ts src/drivers/deepseek/live.test.ts src/drivers/anthropic/client.test.ts src/drivers/openai/client.test.ts src/drivers/qwen/client.test.ts src/drivers/kimi/client.test.ts src/drivers/glm/client.test.ts src/drivers/tencent/client.test.ts src/drivers/gemini/client.test.ts src/drivers/gemini/thoughtSignature.test.ts src/drivers/meta/client.test.ts src/drivers/minimax/client.test.ts src/dynamo/pricing.test.ts src/dynamo/spend.test.ts src/dynamo/liveMeter.test.ts src/drivers/deepseek/inlineTools.test.ts src/dynamo/verify.test.ts src/dynamo/promptAssembly.test.ts src/dynamo/prefixStability.test.ts src/dynamo/providerNeutrality.test.ts src/dynamo/guard.test.ts src/cli/modes.test.ts src/tools/sessionTools.test.ts src/tools/registry.test.ts src/tools/toolSurface.test.ts src/tools/runCommandShell.test.ts src/tools/runCommandCross.test.ts src/tools/posixShell.test.ts src/tools/processOwnership.test.ts src/tools/editRipple.test.ts src/tools/editCore.test.ts src/tools/workspaceBoundary.test.ts src/tools/atomicWrite.test.ts src/tools/edit.test.ts src/tools/checkpoints.test.ts src/tools/shellCheckpoint.test.ts src/tools/spanCore.test.ts src/tools/symbolTools.test.ts src/tools/subagent.test.ts src/tools/subagentReport.test.ts src/tools/testSummary.test.ts src/tools/outputShape.test.ts src/tools/detail.test.ts src/tools/approval.test.ts src/tools/agentData.test.ts src/tools/multiroot.test.ts src/tools/gitignore.test.ts src/tools/chassisMux.test.ts src/tools/workspaceDiscover.test.ts src/tools/backgroundShells.test.ts src/tools/killTree.test.ts src/governor/scope.test.ts src/governor/freshness.test.ts src/governor/governor.test.ts src/tools/governorTools.test.ts src/alternator/chassis/chassis.test.ts src/alternator/chassis/domRefs.test.ts src/alternator/chassis/servers.test.ts src/alternator/chassis/provision.test.ts src/alternator/chassis/lsp.test.ts src/mcp/protocol.test.ts src/mcp/mrtr.test.ts src/mcp/discover.test.ts src/mcp/catalog.test.ts src/mcp/paramHeaders.test.ts src/mcp/paramHeadersLive.test.ts src/mcp/transport/stdio.test.ts src/mcp/config.test.ts src/mcp/transport/http.test.ts src/mcp/manager.test.ts src/mcp/subscriptions.test.ts src/mcp/deferred.test.ts src/tools/mcpSearch.test.ts src/mcp/trust.test.ts src/mcp/governance.test.ts src/mcp/configWrite.test.ts src/tools/mcpAdd.test.ts src/mcp/resultStore.test.ts src/mcp/resources.test.ts src/mcp/prompts.test.ts src/mcp/oauth/metadata.test.ts src/mcp/oauth/flow.test.ts src/mcp/oauth/callback.test.ts src/mcp/oauth/tokenStore.test.ts src/mcp/oauth/index.test.ts src/mcp/oauth/endToEnd.test.ts src/tools/editMatching.test.ts src/tools/editScope.test.ts src/tools/editFreshness.test.ts src/dynamo/batchEdit.test.ts",
39
+ "test:main": "node --max-old-space-size=4096 --import tsx --import ./scripts/testState.mjs --test --test-concurrency=4 --test-timeout=120000 src/drivers/clientId.test.ts src/drivers/contextOverflow.test.ts src/drivers/retryPolicy.test.ts src/drivers/partialTurn.test.ts src/drivers/retryTransport.test.ts src/tools/tools.test.ts src/tools/quietFailures.test.ts src/tools/readBatch.test.ts src/tools/readLines.test.ts src/tools/readBudget.test.ts src/tools/search.test.ts src/tools/searchPrecision.test.ts src/tools/ripgrepBundle.test.ts src/tools/shellLint.test.ts src/tools/askUser.test.ts src/tools/newtools.test.ts src/tools/webSearch.test.ts src/tools/webFetch.test.ts src/tools/screenshot.test.ts src/tools/viewImage.test.ts src/tools/openDefault.test.ts src/tools/commandOutput.test.ts src/tools/commandProgress.test.ts src/tools/runCommandExit.test.ts src/tools/exitPlan.test.ts src/dynamo/planLifecycle.test.ts src/dynamo/steering.test.ts src/dynamo/backgroundNotes.test.ts src/cli/approvalText.probe.test.tsx src/tools/webSecurity.test.ts src/tools/codeIntel.test.ts src/memory/resumeFidelity.test.ts src/memory/memory.test.ts src/memory/durability.test.ts src/memory/memoryIndex.test.ts src/memory/callLog.test.ts src/memory/auditFixes.test.ts src/memory/compactionHygiene.test.ts src/memory/rounds.test.ts src/memory/subagentCost.test.ts src/memory/sessionMemory.test.ts src/memory/sessionMemoryCompact.test.ts src/memory/restore.test.ts src/memory/resumeReads.test.ts src/memory/autoMemory.test.ts src/memory/projectMemory.test.ts src/memory/projectNotes.test.ts src/memory/workingSet.test.ts src/memory/presence.test.ts src/memory/pastedText.test.ts src/memory/images.test.ts src/dynamo/contextWindow.test.ts src/dynamo/contextBudget.test.ts src/dynamo/compactPaths.test.ts src/dynamo/cacheBreak.test.ts src/dynamo/coldCache.test.ts src/drivers/anthropic/cachePoints.test.ts src/dynamo/planArtifact.test.ts src/tools/focus.test.ts src/tools/workingSetTools.test.ts src/project/context.test.ts src/cli/version.test.ts src/cli/updateCheck.test.ts src/cli/quietConsole.test.ts src/cli/appIdentity.test.ts src/cli/memoryTuning.test.ts src/cli/keyField.test.ts src/cli/keyStore.test.ts src/cli/keyManager.probe.test.tsx src/cli/mcpMinitabs.probe.test.tsx src/cli/components/minitabs.probe.test.tsx src/cli/trust.probe.test.tsx src/cli/firstRunFrame.probe.test.tsx src/cli/keySetup.probe.test.tsx src/cli/firstRun.test.ts src/cli/startupFill.test.ts src/cli/liveSize.test.ts src/cli/frameBottom.probe.test.tsx src/cli/screenMode.test.ts src/cli/screenPicker.probe.test.tsx src/cli/screenShell.test.ts src/cli/screenStore.test.ts src/cli/inlineShell.probe.test.tsx src/cli/inlineCaret.probe.test.tsx src/cli/startupArgs.test.ts src/cli/markdown.test.ts src/cli/help.test.ts src/cli/providerSwitch.test.ts src/cli/attachments.test.ts src/cli/pasteAssembler.test.ts src/cli/approvalQueue.test.ts src/cli/transcript.test.ts src/cli/viewWait.probe.test.tsx src/cli/compaction.test.ts src/cli/commandLabel.test.ts src/cli/restart.test.ts src/cli/selfUpdate.test.ts src/cli/blockHeights.test.ts src/cli/resizePolicy.probe.test.tsx src/cli/blockSpacing.test.ts src/cli/inputView.test.ts src/cli/wordEdit.test.ts src/cli/wordEdit.probe.test.tsx src/cli/dropHandles.test.ts src/cli/dropHandles.probe.test.tsx src/cli/tipLine.probe.test.tsx src/cli/selection.test.ts src/cli/mouseLayer.probe.test.tsx src/cli/caret.probe.test.tsx src/cli/caretPark.test.ts src/cli/shuttle.probe.test.tsx src/cli/toolReveal.test.tsx src/cli/blockPerf.probe.test.tsx src/cli/blockSpacing.probe.test.tsx src/cli/workingVerb.test.ts src/cli/typingPerf.probe.test.tsx src/cli/scrollPerf.probe.test.tsx src/cli/virtualWindow.test.ts src/cli/virtualRender.probe.test.tsx src/cli/incrementalResize.probe.test.tsx src/cli/framebuffer/paint.test.ts src/cli/framebuffer/terminalAgreement.test.ts src/cli/framebuffer/writer.test.tsx src/cli/framebuffer/stoodDown.test.tsx src/cli/framebuffer/resizeCorruption.probe.test.tsx src/cli/toolItems.test.ts src/cli/toolDisplay.test.ts src/cli/toolColour.probe.test.tsx src/cli/mouse.test.ts src/cli/wheelCoalesce.test.ts src/cli/terminalRestore.test.ts src/cli/exitCursor.test.ts src/cli/ctrlC.test.ts src/cli/wrap.test.ts src/cli/chatAnchor.test.ts src/cli/chatAnchor.probe.test.tsx src/cli/scrollPill.test.ts src/cli/scrollPill.probe.test.tsx src/cli/pillClick.probe.test.tsx src/cli/inlineReading.probe.test.tsx src/cli/readingClose.probe.test.tsx src/cli/footerRemount.probe.test.tsx src/cli/scrollFlicker.probe.test.tsx src/cli/headerScroll.probe.test.tsx src/cli/reflowAnchor.test.ts src/cli/groupReveal.test.ts src/cli/revealPace.test.ts src/cli/messageQueue.test.ts src/cli/backgroundWake.test.ts src/cli/resumeParity.test.ts src/cli/commands.test.ts src/cli/commandRoute.test.ts src/cli/commandArgs.test.ts src/cli/pickerOrder.test.ts src/cli/clearSession.test.ts src/cli/queuePop.probe.test.tsx src/cli/menuContinuity.probe.test.tsx src/dynamo/model.test.ts src/dynamo/engine.test.ts src/drivers/docsCurrent.test.ts src/drivers/registry.test.ts src/drivers/providerSwitch.test.ts src/drivers/dynamicManifest.test.ts src/drivers/newProviders.test.ts src/drivers/providerError.test.ts src/cli/refusalNotice.probe.test.tsx src/drivers/deepseek/client.test.ts src/drivers/deepseek/vision.test.ts src/drivers/deepseek/live.test.ts src/drivers/anthropic/client.test.ts src/drivers/openai/client.test.ts src/drivers/qwen/client.test.ts src/drivers/kimi/client.test.ts src/drivers/glm/client.test.ts src/drivers/tencent/client.test.ts src/drivers/gemini/client.test.ts src/drivers/gemini/thoughtSignature.test.ts src/drivers/meta/client.test.ts src/drivers/minimax/client.test.ts src/dynamo/pricing.test.ts src/dynamo/spend.test.ts src/dynamo/liveMeter.test.ts src/drivers/deepseek/inlineTools.test.ts src/dynamo/verify.test.ts src/dynamo/promptAssembly.test.ts src/dynamo/prefixStability.test.ts src/dynamo/providerNeutrality.test.ts src/dynamo/guard.test.ts src/cli/modes.test.ts src/tools/sessionTools.test.ts src/tools/registry.test.ts src/tools/toolSurface.test.ts src/tools/runCommandShell.test.ts src/tools/runCommandCross.test.ts src/tools/posixShell.test.ts src/tools/processOwnership.test.ts src/tools/editRipple.test.ts src/tools/editCore.test.ts src/tools/workspaceBoundary.test.ts src/tools/atomicWrite.test.ts src/tools/edit.test.ts src/tools/checkpoints.test.ts src/tools/shellCheckpoint.test.ts src/tools/spanCore.test.ts src/tools/symbolTools.test.ts src/tools/subagent.test.ts src/tools/subagentReport.test.ts src/tools/verifyReport.test.ts src/tools/testSummary.test.ts src/tools/outputShape.test.ts src/tools/detail.test.ts src/tools/approval.test.ts src/tools/agentData.test.ts src/tools/multiroot.test.ts src/tools/gitignore.test.ts src/tools/chassisMux.test.ts src/tools/workspaceDiscover.test.ts src/tools/backgroundShells.test.ts src/tools/killTree.test.ts src/governor/scope.test.ts src/governor/freshness.test.ts src/governor/governor.test.ts src/tools/governorTools.test.ts src/alternator/chassis/chassis.test.ts src/alternator/chassis/domRefs.test.ts src/alternator/chassis/servers.test.ts src/alternator/chassis/provision.test.ts src/alternator/chassis/lsp.test.ts src/mcp/protocol.test.ts src/mcp/mrtr.test.ts src/mcp/discover.test.ts src/mcp/catalog.test.ts src/mcp/paramHeaders.test.ts src/mcp/paramHeadersLive.test.ts src/mcp/transport/stdio.test.ts src/mcp/config.test.ts src/mcp/transport/http.test.ts src/mcp/manager.test.ts src/mcp/subscriptions.test.ts src/mcp/deferred.test.ts src/tools/mcpSearch.test.ts src/mcp/trust.test.ts src/mcp/governance.test.ts src/mcp/configWrite.test.ts src/tools/mcpAdd.test.ts src/mcp/resultStore.test.ts src/mcp/resources.test.ts src/mcp/prompts.test.ts src/mcp/oauth/metadata.test.ts src/mcp/oauth/flow.test.ts src/mcp/oauth/callback.test.ts src/mcp/oauth/tokenStore.test.ts src/mcp/oauth/index.test.ts src/mcp/oauth/endToEnd.test.ts src/tools/editMatching.test.ts src/tools/editScope.test.ts src/tools/editFreshness.test.ts src/dynamo/batchEdit.test.ts",
40
40
  "test:lang": "node --max-old-space-size=4096 --import tsx --import ./scripts/testState.mjs --test --test-concurrency=1 src/alternator/chassis/treesitter.test.ts src/alternator/chassis/treesitterIsolation.test.ts src/alternator/chassis/markup.test.ts src/alternator/chassis/treesitterLangs.test.ts src/alternator/chassis/treesitterLangs2.test.ts src/alternator/chassis/treesitterLangs3.test.ts src/alternator/chassis/treesitterLangs4.test.ts src/alternator/chassis/langBudget.test.ts"
41
41
  },
42
42
  "engines": {