mindweave 3.2.8 → 3.3.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.
Files changed (65) hide show
  1. package/dist/cli/App.js +293 -19
  2. package/dist/cli/App.js.map +1 -1
  3. package/dist/cli/altScreen.js +6 -0
  4. package/dist/cli/altScreen.js.map +1 -1
  5. package/dist/cli/blockHeights.js +3 -0
  6. package/dist/cli/blockHeights.js.map +1 -1
  7. package/dist/cli/chatAnchor.js +17 -0
  8. package/dist/cli/chatAnchor.js.map +1 -1
  9. package/dist/cli/components/BlockView.js +10 -1
  10. package/dist/cli/components/BlockView.js.map +1 -1
  11. package/dist/cli/components/KeyManager.js +63 -7
  12. package/dist/cli/components/KeyManager.js.map +1 -1
  13. package/dist/cli/components/Picker.js +31 -5
  14. package/dist/cli/components/Picker.js.map +1 -1
  15. package/dist/cli/components/PromptInput.js +41 -9
  16. package/dist/cli/components/PromptInput.js.map +1 -1
  17. package/dist/cli/components/ToolLine.js +6 -0
  18. package/dist/cli/components/ToolLine.js.map +1 -1
  19. package/dist/cli/components/WorkGroup.js +27 -10
  20. package/dist/cli/components/WorkGroup.js.map +1 -1
  21. package/dist/cli/framebuffer/writer.js +29 -6
  22. package/dist/cli/framebuffer/writer.js.map +1 -1
  23. package/dist/cli/help.js +1 -0
  24. package/dist/cli/help.js.map +1 -1
  25. package/dist/cli/messageQueue.js +7 -2
  26. package/dist/cli/messageQueue.js.map +1 -1
  27. package/dist/cli/pickerSearch.js +59 -0
  28. package/dist/cli/pickerSearch.js.map +1 -0
  29. package/dist/cli/selectionGrow.js +86 -3
  30. package/dist/cli/selectionGrow.js.map +1 -1
  31. package/dist/cli/toolDisplay.js +20 -5
  32. package/dist/cli/toolDisplay.js.map +1 -1
  33. package/dist/cli/transcript.js +24 -7
  34. package/dist/cli/transcript.js.map +1 -1
  35. package/dist/cli/wheelStep.js +2 -2
  36. package/dist/cli/workLines.js +26 -7
  37. package/dist/cli/workLines.js.map +1 -1
  38. package/dist/core/turnRunner.js +7 -1
  39. package/dist/core/turnRunner.js.map +1 -1
  40. package/dist/dynamo/engine.js +8 -4
  41. package/dist/dynamo/engine.js.map +1 -1
  42. package/dist/dynamo/prompt.js +9 -0
  43. package/dist/dynamo/prompt.js.map +1 -1
  44. package/dist/memory/compaction.js +15 -3
  45. package/dist/memory/compaction.js.map +1 -1
  46. package/dist/memory/localCommand.js +138 -0
  47. package/dist/memory/localCommand.js.map +1 -0
  48. package/dist/memory/store.js +4 -1
  49. package/dist/memory/store.js.map +1 -1
  50. package/dist/memory/types.js.map +1 -1
  51. package/dist/tools/detail.js +2 -0
  52. package/dist/tools/detail.js.map +1 -1
  53. package/dist/tools/rebuildDetail.js +49 -1
  54. package/dist/tools/rebuildDetail.js.map +1 -1
  55. package/dist/tools/runCommand.js +8 -4
  56. package/dist/tools/runCommand.js.map +1 -1
  57. package/dist/tools/untrusted.js +7 -0
  58. package/dist/tools/untrusted.js.map +1 -1
  59. package/dist/tools/userCommand.js +52 -0
  60. package/dist/tools/userCommand.js.map +1 -0
  61. package/dist/tools/viewImage.js +14 -2
  62. package/dist/tools/viewImage.js.map +1 -1
  63. package/dist/tools/webSearch.js +42 -20
  64. package/dist/tools/webSearch.js.map +1 -1
  65. package/package.json +3 -3
@@ -0,0 +1,52 @@
1
+ import { localCommandEntry } from "../memory/localCommand.js";
2
+ import { isInteractiveServerCommand } from "./backgroundShells.js";
3
+ import { sessionDetailFull } from "./detail.js";
4
+ import { runCommand } from "./runCommand.js";
5
+ /** Background shells the person started with `!`, by shell manager. Esc stops what the agent started, not these. */
6
+ const userShells = new WeakMap();
7
+ /** Whether a background shell is one the person started themselves. */
8
+ export function isUserShell(shells, id) {
9
+ return !!shells && !!userShells.get(shells)?.has(id);
10
+ }
11
+ /**
12
+ * Run `command` as the person's own and record it in the conversation.
13
+ *
14
+ * Returns what the shell tool answered, for the row to draw, and the entry that was added.
15
+ * The entry goes in AFTER the command ends (or is handed to the background), so a conversation never
16
+ * holds a command that has no result yet. A command stopped with Esc is recorded with whatever it
17
+ * printed, and says so.
18
+ */
19
+ export async function runUserCommand(session, command, options = {}) {
20
+ // A copy, so the turn that last ran does not leave its (aborted) signal on this one. The forbidden
21
+ // paths and commands are rules for what the AGENT may do; the person typing a command is not
22
+ // the agent, so they do not apply (and nothing asks the person for leave to lift them).
23
+ const governance = session.toolContext.governance;
24
+ const ctx = {
25
+ ...session.toolContext,
26
+ abortSignal: options.signal,
27
+ userInitiated: true,
28
+ ...(governance ? { governance: { ...governance, forbidden: { patterns: [], commands: [], mcpTools: [], root: governance.forbidden.root } } } : {}),
29
+ };
30
+ // The agent hears about a long-running command of the person's the way it hears about its own: the
31
+ // caller wakes it once when the command is handed to the background (so it can say so), and the shell
32
+ // manager wakes it again when the command finishes (`on_finish`), or, for an app or a dev server
33
+ // (`npm start`, `vite`, `electron .`), when it is up or stops early (`on_failure`). Those never end,
34
+ // so they start in the background at once and the person gets the prompt back.
35
+ // And `hidden: false`: what a person starts, they start to SEE.
36
+ const server = isInteractiveServerCommand(command);
37
+ const result = await runCommand.execute({ command, notify: server ? "on_failure" : "on_finish", hidden: false, ...(server ? { run_in_background: true } : {}) }, ctx, {
38
+ id: "user-command",
39
+ progress: (text) => options.onProgress?.(text),
40
+ });
41
+ const moved = /^(?:Backgrounded|Running) as shell #(\d+)/.exec(result.summary ?? "");
42
+ const shells = session.toolContext.backgroundShells;
43
+ if (moved && shells) {
44
+ const set = userShells.get(shells) ?? new Set();
45
+ set.add(Number(moved[1]));
46
+ userShells.set(shells, set);
47
+ }
48
+ const entry = localCommandEntry(command, result, Date.now(), sessionDetailFull);
49
+ session.transcript.push(entry);
50
+ return { result, entry };
51
+ }
52
+ //# sourceMappingURL=userCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userCommand.js","sourceRoot":"","sources":["../../src/tools/userCommand.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,iBAAiB,EAAkB,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAU7C,oHAAoH;AACpH,MAAM,UAAU,GAAG,IAAI,OAAO,EAAuB,CAAC;AAEtD,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,MAA0B,EAAE,EAAU;IAChE,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,OAAe,EACf,UAA8B,EAAE;IAEhC,mGAAmG;IACnG,6FAA6F;IAC7F,wFAAwF;IACxF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;IAClD,MAAM,GAAG,GAAgB;QACvB,GAAG,OAAO,CAAC,WAAW;QACtB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,aAAa,EAAE,IAAI;QACnB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnJ,CAAC;IACF,mGAAmG;IACnG,sGAAsG;IACtG,iGAAiG;IACjG,qGAAqG;IACrG,+EAA+E;IAC/E,gEAAgE;IAChE,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CACrC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACvH,GAAG,EACH;QACE,EAAE,EAAE,cAAc;QAClB,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;KACvD,CACF,CAAC;IACF,MAAM,KAAK,GAAG,2CAA2C,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC;IACpD,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAChF,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC"}
@@ -17,7 +17,8 @@
17
17
  * that it is being told rather than shown. A tool never asks which provider is running.
18
18
  */
19
19
  import { promises as fs } from "node:fs";
20
- import { basename } from "node:path";
20
+ import { extname } from "node:path";
21
+ import { humanSize } from "../mcp/resultStore.js";
21
22
  import { describeImage, isImage, isRejection, IMAGE_EXTS } from "../memory/images.js";
22
23
  import { guardedPathReason } from "./guard.js";
23
24
  import { relativize, resolvePath, touch } from "./paths.js";
@@ -75,10 +76,21 @@ export const viewImage = {
75
76
  touch(ctx, path);
76
77
  const shown = relativize(ctx, path);
77
78
  const size = ref.width && ref.height ? `${ref.width}x${ref.height}` : "image";
79
+ // What the row says about the picture (display only, never sent to the model): the whole
80
+ // path, the format, how big it is on screen when that could be read, and how big the file is.
81
+ const format = extname(path).slice(1).toLowerCase();
82
+ const dimensions = ref.width && ref.height ? `${ref.width}×${ref.height}` : "";
83
+ const fileSize = humanSize(stat.size);
78
84
  return {
79
85
  output: `Opened ${shown} (${size}). The image follows this result — look at it and say ` +
80
86
  `what you see.`,
81
- summary: `viewed ${basename(path)} (${size})`,
87
+ summary: [format, dimensions, fileSize].filter(Boolean).join(" · "),
88
+ detail: [
89
+ `File ${path.replace(/\\/g, "/")}`,
90
+ ...(format ? [`Format ${format}`] : []),
91
+ ...(dimensions ? [`Dimensions ${dimensions}`] : []),
92
+ `Size ${fileSize}`,
93
+ ].join("\n"),
82
94
  images: [ref],
83
95
  // The picture is the slow part, and it happens AFTER this returns.
84
96
  awaitsModel: true,
@@ -1 +1 @@
1
- {"version":3,"file":"viewImage.js","sourceRoot":"","sources":["../../src/tools/viewImage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewImage.js","sourceRoot":"","sources":["../../src/tools/viewImage.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { activeDriver } from "../drivers/registry.js";
2
2
  import { frameExternal } from "./untrusted.js";
3
- import { outputDetail } from "./detail.js";
3
+ import { FULL_DETAIL_MAX, SEARCH_PREVIEW_SOURCES, capLines, collapseBlanks, outputDetail, stripAnsi } from "./detail.js";
4
4
  import { fail, failQuietly } from "./results.js";
5
5
  /** Sources listed per answer. Enough to judge the answer, short enough to read. */
6
6
  const MAX_SOURCES = 8;
@@ -59,6 +59,7 @@ const webSearchTool = {
59
59
  output: formatSearch(query, result),
60
60
  summary: `searched "${query}" (${result.sources.length} source${result.sources.length === 1 ? "" : "s"})`,
61
61
  detail: formatSearchDetail(result, driver.label, elapsedMs),
62
+ detailFull: formatSearchDetailFull(result, driver.label, elapsedMs),
62
63
  web: {
63
64
  kind: "search",
64
65
  query,
@@ -106,31 +107,52 @@ export function formatSearch(query, result) {
106
107
  return frameExternal({ tag: "web_search", attrs: { query }, what: "a web search" }, lines.join("\n"));
107
108
  }
108
109
  /**
109
- * The UI-only detail block: a numbered source list, never sent to the model
110
- * (that's `formatSearch`'s job, with its own framing/injection defense) — this
111
- * is purely what the transcript row shows under the search. Empty when there
112
- * are no sources, so a bare-answer result shows just its summary line.
110
+ * The line above the sources: which service answered, how long it took, how many pages it
111
+ * found. Each part is left out when unknown rather than guessed. A search row is one of the
112
+ * few places where the cost of the call is not otherwise visible, and an invented number
113
+ * would be worse than no number.
114
+ */
115
+ function searchSummaryLine(count, engine, elapsedMs) {
116
+ const parts = [];
117
+ if (engine)
118
+ parts.push(engine);
119
+ if (elapsedMs !== undefined)
120
+ parts.push(formatElapsed(elapsedMs));
121
+ parts.push(`${count} source${count === 1 ? "" : "s"}`);
122
+ return parts.join(" · ");
123
+ }
124
+ /** A page title on one line: a title is the open web's text and may carry line breaks. */
125
+ function oneLine(title) {
126
+ return title.replace(/\s+/g, " ").trim();
127
+ }
128
+ /**
129
+ * The UI-only detail block: the summary line and the first few sources, never sent to the
130
+ * model (that's `formatSearchDetail`'s sibling `formatSearch`, with its own framing and
131
+ * injection defense). This is purely what the transcript row shows under the search. Empty
132
+ * when there are no sources, so a bare-answer result shows just its summary line.
113
133
  */
114
134
  export function formatSearchDetail(result, engine, elapsedMs) {
115
135
  if (result.sources.length === 0)
116
136
  return "";
117
- const shown = result.sources.slice(0, MAX_SOURCES);
118
- const lines = [];
119
- // Which service answered and how long it took. Both are omitted rather than guessed
120
- // when unknown — a search row is one of the few places where the cost of the call is
121
- // not otherwise visible, and an invented number would be worse than no number.
122
- if (engine)
123
- lines.push(`Engine: ${engine}`);
124
- if (elapsedMs !== undefined)
125
- lines.push(`Query time: ${formatElapsed(elapsedMs)}`);
126
- lines.push(`Found ${result.sources.length} source${result.sources.length === 1 ? "" : "s"}`);
127
- for (const [i, source] of shown.entries())
128
- lines.push(`${i + 1}. ${source.title}`);
129
- const hidden = result.sources.length - shown.length;
130
- if (hidden > 0)
131
- lines.push(`(+${hidden} more)`);
137
+ const lines = [searchSummaryLine(result.sources.length, engine, elapsedMs)];
138
+ for (const [i, source] of result.sources.slice(0, SEARCH_PREVIEW_SOURCES).entries())
139
+ lines.push(`${i + 1}. ${oneLine(source.title)}`);
132
140
  return outputDetail(lines.join("\n"));
133
141
  }
142
+ /**
143
+ * The same block with every source, for the row to open on a click like a command's output.
144
+ * Equal to the closed block when there is nothing more to show, so such a row stays plain.
145
+ */
146
+ export function formatSearchDetailFull(result, engine, elapsedMs) {
147
+ if (result.sources.length === 0)
148
+ return "";
149
+ const lines = [searchSummaryLine(result.sources.length, engine, elapsedMs)];
150
+ // Numbers padded to one width so the titles start in the same column past nine.
151
+ const width = String(result.sources.length).length;
152
+ for (const [i, source] of result.sources.entries())
153
+ lines.push(`${String(i + 1).padStart(width)}. ${oneLine(source.title)}`);
154
+ return capLines(collapseBlanks(stripAnsi(lines.join("\n")).split("\n")), FULL_DETAIL_MAX);
155
+ }
134
156
  /** A wait, at the precision it is worth reading: `310ms`, `1.4s`. */
135
157
  export function formatElapsed(ms) {
136
158
  return ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;
@@ -1 +1 @@
1
- {"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindweave",
3
- "version": "3.2.8",
3
+ "version": "3.3.0",
4
4
  "description": "Mindweave — a fast, model-adaptive terminal coding agent.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -39,8 +39,8 @@
39
39
  "install-global": "npm run build && npm link",
40
40
  "typecheck": "tsc --noEmit",
41
41
  "test": "npm run test:main && npm run test:cli && npm run test:lang",
42
- "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/core/turnRunner.test.ts src/drivers/openrouter/openrouter.test.ts src/drivers/ollama/ollama.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/selfService.test.ts src/tools/webSearch.test.ts src/tools/webFetch.test.ts src/tools/screenshot.test.ts src/tools/ui.test.ts src/tools/uiPage.test.ts src/tools/uiBatch.test.ts src/tools/listeningPorts.test.ts src/tools/hiddenDesktop.test.ts src/dynamo/auxModel.test.ts src/dynamo/usageLimits.test.ts src/dynamo/limitStop.test.ts src/dynamo/marathon.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/loopLab.test.ts src/dynamo/toolBatches.test.ts src/dynamo/stopAtTurnStart.test.ts src/dynamo/backgroundNotes.test.ts src/dynamo/streamStall.test.ts src/dynamo/callCap.test.ts src/dynamo/hooks.test.ts src/dynamo/todoReminder.test.ts src/dynamo/todoReminderEngine.test.ts src/dynamo/truncationRecovery.test.ts src/dynamo/callTags.test.ts src/tools/webSecurity.test.ts src/tools/stateGuard.test.ts src/tools/guardedPath.test.ts src/tools/runsLater.test.ts src/tools/destructiveDelete.test.ts src/tools/commandPolicy.test.ts src/tools/codeIntel.test.ts src/memory/resumeFidelity.test.ts src/memory/clearedKeepsWhatWasSaid.test.ts src/memory/memory.test.ts src/memory/durability.test.ts src/memory/memoryIndex.test.ts src/memory/callLog.test.ts src/memory/earlier.test.ts src/memory/sessionTitle.test.ts src/memory/callRecords.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/sessionMemoryRefresh.test.ts src/memory/sessionMemoryMidTurn.test.ts src/memory/sessionMemoryCompact.test.ts src/memory/notesInTail.test.ts src/memory/clearedArchive.test.ts src/memory/clearKinds.test.ts src/memory/todosResume.test.ts src/memory/counters.test.ts src/cli/attachBudget.test.ts src/memory/summaryHistory.test.ts src/memory/restore.test.ts src/memory/rewind.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/profile.test.ts src/cli/projectEnv.test.ts src/core/providerKeys.test.ts src/core/mcpServers.test.ts src/core/permissions.test.ts src/core/rulesSkills.test.ts src/core/contextSettings.test.ts src/core/spendView.test.ts src/core/marathonRun.test.ts src/core/agentAdded.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/dynamo/hiddenText.test.ts src/tools/invisible.test.ts 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/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/tools/sessionTools.test.ts src/tools/registry.test.ts src/tools/toolFuzz.test.ts src/tools/toolSurface.test.ts src/tools/runCommandShell.test.ts src/tools/runCommandCross.test.ts src/tools/childEnv.test.ts src/tools/untrusted.test.ts src/tools/runCommandEncoding.test.ts src/tools/ripgrepShell.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/subagentOutcome.test.ts src/tools/verifierRun.test.ts src/tools/childReport.test.ts src/tools/verifierCommands.test.ts src/tools/treeGuard.test.ts src/tools/verifyReport.test.ts src/tools/testSummary.test.ts src/tools/outputShape.test.ts src/tools/detail.test.ts src/tools/rebuildDetail.test.ts src/tools/writtenFromDisk.test.ts src/tools/uiRow.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/appLaunchSettle.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/tools/serverConsent.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/projectApproval.test.ts src/mcp/transport/http.test.ts src/mcp/manager.test.ts src/mcp/resultView.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/tools/mcpManage.test.ts src/tools/foregroundCommands.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",
43
- "test:cli": "node --max-old-space-size=4096 --import tsx --import ./scripts/testState.mjs --test --test-concurrency=4 --test-timeout=120000 src/cli/approvalText.probe.test.tsx src/cli/analytics.test.ts src/cli/desktopApp.test.ts src/cli/userBandAlign.probe.test.tsx 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/pickerFilter.probe.test.tsx src/cli/toolRowClip.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/feedback.test.ts src/cli/approvalText.addLine.probe.test.tsx 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/expandRow.probe.test.tsx src/cli/openWrap.probe.test.tsx src/cli/workGroup.probe.test.tsx src/cli/diffWrap.test.ts src/cli/uiLines.test.ts src/cli/uiRow.probe.test.tsx src/cli/expandHover.probe.test.tsx 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/shellNotes.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/marathonUi.test.ts src/cli/marathonBox.probe.test.tsx src/cli/selection.test.ts src/cli/selectionGrow.test.ts src/cli/blockBoxes.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/inkOutputPatch.test.ts src/cli/widestLinePatch.test.ts src/cli/prodEnv.test.ts src/cli/inputText.test.ts src/cli/appInlineStart.test.ts src/cli/bannerFit.test.ts 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/frameHold.test.ts src/cli/framebuffer/stoodDown.test.tsx src/cli/framebuffer/resizeCorruption.probe.test.tsx src/cli/toolItems.test.ts src/cli/agentLines.test.ts src/cli/approvalText.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/wheelStep.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/growAnchor.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/commandBackground.test.ts src/cli/commandMenu.test.ts src/cli/revealOpen.test.ts src/cli/mcpRow.probe.test.tsx src/cli/commandHint.probe.test.tsx 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/cli/refusalNotice.probe.test.tsx src/cli/modes.test.ts",
42
+ "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/core/turnRunner.test.ts src/drivers/openrouter/openrouter.test.ts src/drivers/ollama/ollama.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/selfService.test.ts src/tools/webSearch.test.ts src/tools/webFetch.test.ts src/tools/screenshot.test.ts src/tools/ui.test.ts src/tools/uiPage.test.ts src/tools/uiBatch.test.ts src/tools/listeningPorts.test.ts src/tools/hiddenDesktop.test.ts src/dynamo/auxModel.test.ts src/dynamo/usageLimits.test.ts src/dynamo/limitStop.test.ts src/dynamo/marathon.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/userCommand.test.ts src/tools/exitPlan.test.ts src/dynamo/planLifecycle.test.ts src/dynamo/steering.test.ts src/dynamo/loopLab.test.ts src/dynamo/toolBatches.test.ts src/dynamo/stopAtTurnStart.test.ts src/dynamo/backgroundNotes.test.ts src/dynamo/streamStall.test.ts src/dynamo/callCap.test.ts src/dynamo/hooks.test.ts src/dynamo/todoReminder.test.ts src/dynamo/todoReminderEngine.test.ts src/dynamo/truncationRecovery.test.ts src/dynamo/callTags.test.ts src/tools/webSecurity.test.ts src/tools/stateGuard.test.ts src/tools/guardedPath.test.ts src/tools/runsLater.test.ts src/tools/destructiveDelete.test.ts src/tools/commandPolicy.test.ts src/tools/codeIntel.test.ts src/memory/resumeFidelity.test.ts src/memory/clearedKeepsWhatWasSaid.test.ts src/memory/memory.test.ts src/memory/durability.test.ts src/memory/memoryIndex.test.ts src/memory/callLog.test.ts src/memory/earlier.test.ts src/memory/sessionTitle.test.ts src/memory/callRecords.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/sessionMemoryRefresh.test.ts src/memory/sessionMemoryMidTurn.test.ts src/memory/sessionMemoryCompact.test.ts src/memory/notesInTail.test.ts src/memory/clearedArchive.test.ts src/memory/clearKinds.test.ts src/memory/todosResume.test.ts src/memory/counters.test.ts src/cli/attachBudget.test.ts src/memory/summaryHistory.test.ts src/memory/restore.test.ts src/memory/rewind.test.ts src/memory/localCommand.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/profile.test.ts src/cli/projectEnv.test.ts src/core/providerKeys.test.ts src/core/mcpServers.test.ts src/core/permissions.test.ts src/core/rulesSkills.test.ts src/core/contextSettings.test.ts src/core/spendView.test.ts src/core/marathonRun.test.ts src/core/agentAdded.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/dynamo/hiddenText.test.ts src/tools/invisible.test.ts 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/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/tools/sessionTools.test.ts src/tools/registry.test.ts src/tools/toolFuzz.test.ts src/tools/toolSurface.test.ts src/tools/runCommandShell.test.ts src/tools/runCommandCross.test.ts src/tools/childEnv.test.ts src/tools/untrusted.test.ts src/tools/runCommandEncoding.test.ts src/tools/ripgrepShell.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/subagentOutcome.test.ts src/tools/verifierRun.test.ts src/tools/childReport.test.ts src/tools/verifierCommands.test.ts src/tools/treeGuard.test.ts src/tools/verifyReport.test.ts src/tools/testSummary.test.ts src/tools/outputShape.test.ts src/tools/detail.test.ts src/tools/rebuildDetail.test.ts src/tools/writtenFromDisk.test.ts src/tools/uiRow.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/appLaunchSettle.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/tools/serverConsent.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/projectApproval.test.ts src/mcp/transport/http.test.ts src/mcp/manager.test.ts src/mcp/resultView.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/tools/mcpManage.test.ts src/tools/foregroundCommands.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",
43
+ "test:cli": "node --max-old-space-size=4096 --import tsx --import ./scripts/testState.mjs --test --test-concurrency=4 --test-timeout=120000 src/cli/approvalText.probe.test.tsx src/cli/analytics.test.ts src/cli/desktopApp.test.ts src/cli/userBandAlign.probe.test.tsx 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/pickerFilter.probe.test.tsx src/cli/toolRowClip.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/feedback.test.ts src/cli/approvalText.addLine.probe.test.tsx 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/expandRow.probe.test.tsx src/cli/openWrap.probe.test.tsx src/cli/workGroup.probe.test.tsx src/cli/diffWrap.test.ts src/cli/uiLines.test.ts src/cli/uiRow.probe.test.tsx src/cli/expandHover.probe.test.tsx 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/shellNotes.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/marathonUi.test.ts src/cli/marathonBox.probe.test.tsx src/cli/selection.test.ts src/cli/selectionGrow.test.ts src/cli/blockBoxes.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/inkOutputPatch.test.ts src/cli/widestLinePatch.test.ts src/cli/prodEnv.test.ts src/cli/inputText.test.ts src/cli/appInlineStart.test.ts src/cli/bannerFit.test.ts 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/frameHold.test.ts src/cli/framebuffer/stoodDown.test.tsx src/cli/framebuffer/resizeCorruption.probe.test.tsx src/cli/toolItems.test.ts src/cli/agentLines.test.ts src/cli/approvalText.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/wheelStep.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/growAnchor.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/commandBackground.test.ts src/cli/commandMenu.test.ts src/cli/revealOpen.test.ts src/cli/mcpRow.probe.test.tsx src/cli/commandHint.probe.test.tsx 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/cli/searchBox.probe.test.tsx src/cli/userCommandRow.probe.test.tsx src/cli/userCommandBox.probe.test.tsx src/cli/keySearch.probe.test.tsx src/cli/refusalNotice.probe.test.tsx src/cli/modes.test.ts",
44
44
  "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"
45
45
  },
46
46
  "engines": {