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.
- package/dist/cli/App.js +35 -8
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/attachments.js +18 -5
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/backgroundWake.js +4 -0
- package/dist/cli/backgroundWake.js.map +1 -0
- package/dist/cli/commands.js +1 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/dynamo/contextBudget.js +145 -0
- package/dist/dynamo/contextBudget.js.map +1 -0
- package/dist/dynamo/contextWindow.js +18 -0
- package/dist/dynamo/contextWindow.js.map +1 -1
- package/dist/dynamo/engine.js +29 -7
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/prompt.js +4 -0
- package/dist/dynamo/prompt.js.map +1 -1
- package/dist/mcp/oauth/flow.js +20 -3
- package/dist/mcp/oauth/flow.js.map +1 -1
- package/dist/memory/autoMemory.js +42 -1
- package/dist/memory/autoMemory.js.map +1 -1
- package/dist/memory/compaction.js +19 -44
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/session.js +4 -0
- package/dist/memory/session.js.map +1 -1
- package/dist/tools/backgroundShells.js +42 -4
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/readFile.js +29 -9
- package/dist/tools/readFile.js.map +1 -1
- package/dist/tools/runCommand.js +35 -8
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/subagent.js +41 -3
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/todo.js +35 -0
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/verifyReport.js +144 -0
- package/dist/tools/verifyReport.js.map +1 -0
- package/package.json +2 -2
package/dist/cli/attachments.js
CHANGED
|
@@ -94,7 +94,10 @@ export async function resolveAttachments(text, cwd, canSeeImages = false, labelF
|
|
|
94
94
|
const blocks = [];
|
|
95
95
|
const notes = [];
|
|
96
96
|
const images = [];
|
|
97
|
-
// Spans to collapse
|
|
97
|
+
// Spans to collapse (dropped paths only), applied right-to-left. The chat and the model
|
|
98
|
+
// get DIFFERENT labels for the same span: the chat shows the handle the user saw in the
|
|
99
|
+
// input box, the model gets the file's name. Sending the model the handle gave it a word
|
|
100
|
+
// (`mwimg5`) that names nothing on disk, and it went looking for `mwimg5.png`.
|
|
98
101
|
const collapses = [];
|
|
99
102
|
for (const c of candidates) {
|
|
100
103
|
if (!c.raw)
|
|
@@ -118,7 +121,7 @@ export async function resolveAttachments(text, cwd, canSeeImages = false, labelF
|
|
|
118
121
|
// model, so it can ask about it rather than being unaware anything was shared.
|
|
119
122
|
if (isImage(abs)) {
|
|
120
123
|
if (c.kind === "path")
|
|
121
|
-
collapses.push({ start: c.start, end: c.end, label: labelFor?.(abs) ?? basename(abs) });
|
|
124
|
+
collapses.push({ start: c.start, end: c.end, label: labelFor?.(abs) ?? basename(abs), modelLabel: basename(abs) });
|
|
122
125
|
if (!canSeeImages) {
|
|
123
126
|
notes.push(`attached image ${shown} (this model can't see images — describe it, or switch with /provider)`);
|
|
124
127
|
blocks.push(`[The user shared an image file: ${shown}. The model you are running can't see images, so its ` +
|
|
@@ -132,6 +135,9 @@ export async function resolveAttachments(text, cwd, canSeeImages = false, labelF
|
|
|
132
135
|
continue;
|
|
133
136
|
}
|
|
134
137
|
images.push(verdict);
|
|
138
|
+
// Where the picture lives, so it can be opened again once its payload has been
|
|
139
|
+
// cleared from context. The image block itself carries no name at all.
|
|
140
|
+
blocks.push(imageSourceLine(shown));
|
|
135
141
|
const size = verdict.width && verdict.height ? `${verdict.width}x${verdict.height}` : "attached";
|
|
136
142
|
notes.push(`attached image ${shown} (${size})`);
|
|
137
143
|
continue;
|
|
@@ -153,12 +159,13 @@ export async function resolveAttachments(text, cwd, canSeeImages = false, labelF
|
|
|
153
159
|
// A dropped/quoted path is long and ugly in the chat — collapse it to the file
|
|
154
160
|
// name. An `@mention` is already short, so leave it visible as typed.
|
|
155
161
|
if (c.kind === "path")
|
|
156
|
-
collapses.push({ start: c.start, end: c.end, label: labelFor?.(abs) ?? basename(abs) });
|
|
162
|
+
collapses.push({ start: c.start, end: c.end, label: labelFor?.(abs) ?? basename(abs), modelLabel: basename(abs) });
|
|
157
163
|
}
|
|
158
164
|
const displayText = applyCollapses(text, collapses);
|
|
165
|
+
const typed = applyCollapses(text, collapses.map((c) => ({ ...c, label: c.modelLabel })));
|
|
159
166
|
if (blocks.length === 0)
|
|
160
|
-
return { modelText:
|
|
161
|
-
return { modelText: `${
|
|
167
|
+
return { modelText: typed, displayText, notes, images };
|
|
168
|
+
return { modelText: `${typed}\n\n${blocks.join("\n\n")}`, displayText, notes, images };
|
|
162
169
|
}
|
|
163
170
|
/**
|
|
164
171
|
* Hide attached-file payloads for display. Used when rebuilding the chat from a
|
|
@@ -168,8 +175,14 @@ export async function resolveAttachments(text, cwd, canSeeImages = false, labelF
|
|
|
168
175
|
export function stripAttachments(content) {
|
|
169
176
|
return content
|
|
170
177
|
.replace(/\n*<attached_file path="[^"]*">\n[\s\S]*?\n<\/attached_file>/g, "")
|
|
178
|
+
.replace(IMAGE_SOURCE_RE, "")
|
|
171
179
|
.trimEnd();
|
|
172
180
|
}
|
|
181
|
+
/** The line that tells the model where an attached image lives on disk. */
|
|
182
|
+
export function imageSourceLine(path) {
|
|
183
|
+
return `[Image source: ${path}]`;
|
|
184
|
+
}
|
|
185
|
+
const IMAGE_SOURCE_RE = /\n*\[Image source: [^\]\n]*\]/g;
|
|
173
186
|
/** Gather every file-reference token (mentions, quoted paths, bare absolute paths),
|
|
174
187
|
* sorted by position; quoted/bare ranges never overlap (a quote isn't a path char
|
|
175
188
|
* and bare paths require a leading word boundary). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/cli/attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AAEzF,oFAAoF;AACpF,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;AAE7B,mFAAmF;AACnF,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,8EAA8E;AAC9E,MAAM,SAAS,GAAG,sBAAsB,CAAC;AACzC,2EAA2E;AAC3E,yEAAyE;AACzE,gFAAgF;AAChF,MAAM,WAAW,GAAG,6CAA6C,CAAC;AAClE,kFAAkF;AAClF,oFAAoF;AACpF,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAUlD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAC5B,sFAAsF;QACtF,sFAAsF;QACtF,sFAAsF;QACtF,qFAAqF;QACrF,iEAAiE;QACjE,EAAE;QACF,6EAA6E;QAC7E,qFAAqF;QACrF,sFAAsF;QACtF,sEAAsE;QACtE,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;YAAE,SAAS;QAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAoBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,GAAW,EACX,YAAY,GAAG,KAAK,EACpB,QAAkD;IAElD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/cli/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundWake.js","sourceRoot":"","sources":["../../src/cli/backgroundWake.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,uBAAuB,CAAC,CAAY;IAClD,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;AAC3F,CAAC"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -31,7 +31,7 @@ export const BASE_COMMANDS = [
|
|
|
31
31
|
{ name: "/exclude", description: "remove an added folder: /exclude <label>" },
|
|
32
32
|
{ name: "/shells", description: "view or stop background commands (tests, servers)" },
|
|
33
33
|
{ name: "/mcp", description: "view MCP servers; /mcp add <name> <command|url> to connect one" },
|
|
34
|
-
{ name: "/context", description: "show what
|
|
34
|
+
{ name: "/context", description: "show what is filling the context window" },
|
|
35
35
|
{ name: "/undo", description: "roll back file changes: /undo, /undo list, /undo <n>" },
|
|
36
36
|
{ name: "/compact", description: "summarize the conversation to free up context" },
|
|
37
37
|
{ name: "/update", description: "update Mindweave and restart into this conversation" },
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH;qDACqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAChD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,2EAA2E,EAAE;IAC3G,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,2CAA2C,EAAE;IAC/E,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAC1D,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE;IACxF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACxE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAClF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;IAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iDAAiD,EAAE;IACnF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,iDAAiD,EAAE;IACtF,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,4DAA4D,EAAE;IACtG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4DAA4D,EAAE;IAC5F,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,gDAAgD,EAAE;IACnF,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,0CAA0C,EAAE;IAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mDAAmD,EAAE;IACrF,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gEAAgE,EAAE;IAC/F,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH;qDACqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAChD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,2EAA2E,EAAE;IAC3G,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,2CAA2C,EAAE;IAC/E,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAC1D,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE;IACxF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACxE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAClF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;IAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iDAAiD,EAAE;IACnF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,iDAAiD,EAAE;IACtF,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,4DAA4D,EAAE;IACtG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4DAA4D,EAAE;IAC5F,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,gDAAgD,EAAE;IACnF,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,0CAA0C,EAAE;IAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mDAAmD,EAAE;IACrF,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gEAAgE,EAAE;IAC/F,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,yCAAyC,EAAE;IAC5E,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,sDAAsD,EAAE;IACtF,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,+CAA+C,EAAE;IAClF,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qDAAqD,EAAE;IACvF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,gDAAgD,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;IAC7E,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,+BAA+B,EAAE;CACpE,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { estimateTokens, CLEARED_STUB, CLEARED_INPUT_NOTE, CONTENT_CARRYING_TOOLS, KEEP_LAST_N, } from "../memory/compaction.js";
|
|
2
|
+
// Both tests key off the stubs compaction actually writes, imported rather than
|
|
3
|
+
// re-spelled: a reworded stub would otherwise leave this counting cleared entries as
|
|
4
|
+
// reclaimable forever, and the only symptom would be a number quietly too large.
|
|
5
|
+
const isCleared = (content) => content.includes(CLEARED_STUB);
|
|
6
|
+
const argsCleared = (args) => args.includes(CLEARED_INPUT_NOTE);
|
|
7
|
+
/**
|
|
8
|
+
* Map every tool result back to the tool that produced it.
|
|
9
|
+
*
|
|
10
|
+
* A `tool` entry carries only a `toolCallId`, so on its own it can say how many tokens
|
|
11
|
+
* results cost but never WHICH tool cost them — which is the only form of the answer
|
|
12
|
+
* anyone can act on.
|
|
13
|
+
*/
|
|
14
|
+
function namesByCallId(entries) {
|
|
15
|
+
const names = new Map();
|
|
16
|
+
for (const e of entries) {
|
|
17
|
+
if (e.role !== "assistant" || !e.toolCalls)
|
|
18
|
+
continue;
|
|
19
|
+
for (const call of e.toolCalls)
|
|
20
|
+
names.set(call.id, call.name);
|
|
21
|
+
}
|
|
22
|
+
return names;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Break a transcript down into the categories that explain a full context window.
|
|
26
|
+
*
|
|
27
|
+
* `overhead` is the measured non-transcript size (system prompt, tool schemas, working
|
|
28
|
+
* set, todos) when the session has one for the CURRENT model; pass undefined and it is
|
|
29
|
+
* simply left out rather than guessed at, because a wrong number here would be the
|
|
30
|
+
* largest single error in the table.
|
|
31
|
+
*/
|
|
32
|
+
export function contextBudget(entries, overhead) {
|
|
33
|
+
let results = 0;
|
|
34
|
+
let args = 0;
|
|
35
|
+
let replies = 0;
|
|
36
|
+
let yours = 0;
|
|
37
|
+
let notes = 0;
|
|
38
|
+
let summaries = 0;
|
|
39
|
+
let reclaimable = 0;
|
|
40
|
+
const names = namesByCallId(entries);
|
|
41
|
+
const tools = new Map();
|
|
42
|
+
const bump = (name, tokens, calls) => {
|
|
43
|
+
const row = tools.get(name) ?? { name, calls: 0, tokens: 0 };
|
|
44
|
+
row.calls += calls;
|
|
45
|
+
row.tokens += tokens;
|
|
46
|
+
tools.set(name, row);
|
|
47
|
+
};
|
|
48
|
+
// Results in the last few rounds are the ones microcompaction protects, so they are
|
|
49
|
+
// not offered as reclaimable — promising to free tokens that the clearing pass would
|
|
50
|
+
// deliberately keep is the one way this number could lie.
|
|
51
|
+
const toolIndexes = entries.flatMap((e, i) => (e.role === "tool" ? [i] : []));
|
|
52
|
+
const protectedFrom = toolIndexes[Math.max(0, toolIndexes.length - KEEP_LAST_N)] ?? entries.length;
|
|
53
|
+
entries.forEach((entry, i) => {
|
|
54
|
+
switch (entry.role) {
|
|
55
|
+
case "tool": {
|
|
56
|
+
const cost = estimateTokens(entry.content);
|
|
57
|
+
results += cost;
|
|
58
|
+
bump(names.get(entry.toolCallId) ?? "(unknown tool)", cost, 0);
|
|
59
|
+
if (!isCleared(entry.content) && i < protectedFrom)
|
|
60
|
+
reclaimable += cost;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "assistant": {
|
|
64
|
+
replies += estimateTokens(entry.content);
|
|
65
|
+
for (const call of entry.toolCalls ?? []) {
|
|
66
|
+
const cost = estimateTokens(call.arguments);
|
|
67
|
+
args += cost;
|
|
68
|
+
bump(call.name, cost, 1);
|
|
69
|
+
// A write_file call carries the whole file it wrote. Clearing those payloads
|
|
70
|
+
// is the same free pass that clears results, and on measured sessions it is
|
|
71
|
+
// the bigger half — leaving it out would understate the largest lever there is.
|
|
72
|
+
if (CONTENT_CARRYING_TOOLS.has(call.name) && !argsCleared(call.arguments) && i < protectedFrom) {
|
|
73
|
+
reclaimable += cost;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case "user":
|
|
79
|
+
if (entry.synthetic)
|
|
80
|
+
notes += estimateTokens(entry.content);
|
|
81
|
+
else
|
|
82
|
+
yours += estimateTokens(entry.content);
|
|
83
|
+
break;
|
|
84
|
+
case "summary":
|
|
85
|
+
summaries += estimateTokens(entry.content);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const slices = [];
|
|
90
|
+
if (overhead !== undefined)
|
|
91
|
+
slices.push({ label: "System prompt and tools", tokens: overhead, measured: true });
|
|
92
|
+
slices.push({ label: "Tool results", tokens: results }, { label: "Tool call arguments", tokens: args }, { label: "Mindweave's replies", tokens: replies }, { label: "Your messages", tokens: yours });
|
|
93
|
+
if (notes > 0)
|
|
94
|
+
slices.push({ label: "Automatic reminders", tokens: notes });
|
|
95
|
+
if (summaries > 0)
|
|
96
|
+
slices.push({ label: "Compaction summaries", tokens: summaries });
|
|
97
|
+
return {
|
|
98
|
+
slices: slices.filter((s) => s.tokens > 0),
|
|
99
|
+
total: slices.reduce((n, s) => n + s.tokens, 0),
|
|
100
|
+
tools: [...tools.values()].sort((a, b) => b.tokens - a.tokens),
|
|
101
|
+
reclaimable,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const BAR_WIDTH = 24;
|
|
105
|
+
function short(tokens) {
|
|
106
|
+
if (tokens >= 1_000)
|
|
107
|
+
return `${(tokens / 1_000).toFixed(tokens >= 10_000 ? 0 : 1)}k`;
|
|
108
|
+
return `${tokens}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Render the breakdown as the block `/context` prints.
|
|
112
|
+
*
|
|
113
|
+
* Pure so the shape can be asserted without a terminal. The percentages are of the
|
|
114
|
+
* TOTAL rather than of the window, because the question being answered is "what is
|
|
115
|
+
* filling this", not "how full is it" — the header already answers the second, once.
|
|
116
|
+
*/
|
|
117
|
+
export function formatBudget(budget, window, autoBar) {
|
|
118
|
+
if (budget.total === 0)
|
|
119
|
+
return "Nothing in context yet beyond the system prompt.";
|
|
120
|
+
const pct = (n) => Math.round((n / budget.total) * 100);
|
|
121
|
+
const width = Math.max(...budget.slices.map((s) => s.label.length));
|
|
122
|
+
const lines = budget.slices.map((s) => {
|
|
123
|
+
const filled = Math.max(1, Math.round((s.tokens / budget.total) * BAR_WIDTH));
|
|
124
|
+
// An estimate and a reported figure are not the same claim, and the table is the
|
|
125
|
+
// only place that difference can be shown without a footnote nobody reads.
|
|
126
|
+
const mark = s.measured ? " " : "~";
|
|
127
|
+
return ` ${s.label.padEnd(width)} ${mark}${short(s.tokens).padStart(6)} ${String(pct(s.tokens)).padStart(3)}% ${"█".repeat(filled)}`;
|
|
128
|
+
});
|
|
129
|
+
const head = `${short(budget.total)} of ${short(window)} in context · compacts at ${short(autoBar)}`;
|
|
130
|
+
const out = [head, "", ...lines];
|
|
131
|
+
const heaviest = budget.tools.slice(0, 4).filter((t) => t.tokens > 0);
|
|
132
|
+
if (heaviest.length > 0) {
|
|
133
|
+
out.push("", " Heaviest tools:");
|
|
134
|
+
for (const t of heaviest) {
|
|
135
|
+
const calls = t.calls > 0 ? ` ×${t.calls}` : "";
|
|
136
|
+
out.push(` ${t.name}${calls} — ~${short(t.tokens)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
out.push("", budget.reclaimable > 0
|
|
140
|
+
? ` /compact frees about ${short(budget.reclaimable)} of old tool output without asking the model to summarize.`
|
|
141
|
+
: " Nothing old enough to clear yet.");
|
|
142
|
+
out.push(" ~ marks an estimate from character counts; unmarked figures are what the provider reported.");
|
|
143
|
+
return out.join("\n");
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=contextBudget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextBudget.js","sourceRoot":"","sources":["../../src/dynamo/contextBudget.ts"],"names":[],"mappings":"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"}
|
|
@@ -212,6 +212,24 @@ export function cacheLikelyCold(lastCallAt, now, used, microBar, ttlMs = CACHE_T
|
|
|
212
212
|
* 0.35 sits where the break-even (~21 steps) is still optimistic but no longer absurd,
|
|
213
213
|
* and it is deliberately a FRACTION rather than a token count: the thing being paid for
|
|
214
214
|
* is proportional to the prefix, so the threshold has to be too.
|
|
215
|
+
*
|
|
216
|
+
* MEASURED against the derivation above (61 real sessions, 2026-09-16), and it is too
|
|
217
|
+
* pessimistic. Do not tighten this on the strength of the arithmetic:
|
|
218
|
+
*
|
|
219
|
+
* - A clear does not rewrite the whole remaining prefix, only what follows the first
|
|
220
|
+
* cleared result. Real clears cost 6-12K extra uncached tokens on a ~45K prompt,
|
|
221
|
+
* not the ~43K that `1.25(P-R)` charges.
|
|
222
|
+
* - Sessions run far past one turn. Clears were followed by 37-82 more calls on
|
|
223
|
+
* average, so savings keep accruing long after the break-even horizon of one turn.
|
|
224
|
+
* - The 0.1 / 1.25 ratios are one provider's. DeepSeek reads cache at 2% of input
|
|
225
|
+
* with no write premium; GLM Flash at 20%.
|
|
226
|
+
*
|
|
227
|
+
* Net of cache rewrites AND the re-reads clearing causes (about 18% of file reads re-read
|
|
228
|
+
* something that had been cleared), clearing saved 4.3% of spend on DeepSeek V4 Flash and
|
|
229
|
+
* 10.3% on GLM 5.3 Flash, and 28 of 32 individual clears paid for themselves, including
|
|
230
|
+
* most below this threshold. The policy is left as is because it is already net positive
|
|
231
|
+
* and loosening it trades a few percent of saving for more re-reads, which is not yet
|
|
232
|
+
* measured.
|
|
215
233
|
*/
|
|
216
234
|
const CLEAR_WORTH_FRACTION = 0.35;
|
|
217
235
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextWindow.js","sourceRoot":"","sources":["../../src/dynamo/contextWindow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"contextWindow.js","sourceRoot":"","sources":["../../src/dynamo/contextWindow.ts"],"names":[],"mappings":"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"}
|
package/dist/dynamo/engine.js
CHANGED
|
@@ -467,7 +467,7 @@ async function loadImagePayloads(session) {
|
|
|
467
467
|
}));
|
|
468
468
|
return out;
|
|
469
469
|
}
|
|
470
|
-
function buildRequest(session,
|
|
470
|
+
function buildRequest(session, tools, imagePayloads = new Map(),
|
|
471
471
|
/** Notes for the folders in play, resolved by the caller (it has to read disk). */
|
|
472
472
|
directoryNotes = []) {
|
|
473
473
|
const canSeeImages = modelSeesImages(session);
|
|
@@ -526,13 +526,16 @@ directoryNotes = []) {
|
|
|
526
526
|
messages.push({ role: "tool", tool_call_id: e.toolCallId, content: e.content });
|
|
527
527
|
}
|
|
528
528
|
}
|
|
529
|
-
for (const note of bgEvents)
|
|
530
|
-
messages.push({ role: "user", content: note });
|
|
531
529
|
// Compute the governance blocks once: the prefix uses forbidden/skills, the
|
|
532
530
|
// volatile tail uses the rules (moved there for salience — see volatileContext).
|
|
533
531
|
const gov = governancePrompt(session);
|
|
532
|
+
// A child spawned with a ROLE (the verifier is the one that has one) carries it at the
|
|
533
|
+
// END of the system prompt. The end, because everything before it is the prefix every
|
|
534
|
+
// session shares and caches against; appending leaves that untouched.
|
|
535
|
+
const agentPrompt = session.toolContext.agentPrompt;
|
|
536
|
+
const base = staticSystemPrompt(session.projectContext, session.projectMemory, session.memoryDir, session.memoryIndex, gov, workspaceText(session), session.priorSessions);
|
|
534
537
|
return {
|
|
535
|
-
system:
|
|
538
|
+
system: agentPrompt ? `${base}\n\n${agentPrompt}` : base,
|
|
536
539
|
messages,
|
|
537
540
|
context: volatileContext(gov.rules, session.toolContext.planMode ?? false, session.sessionMemory ?? "", session.toolContext.activePlan
|
|
538
541
|
? renderPlanBlock({
|
|
@@ -828,8 +831,6 @@ async function respondTurn(session, options = {}) {
|
|
|
828
831
|
// session run indefinitely without slowly losing the thread. One cheap call, gated so
|
|
829
832
|
// it fires rarely; degrade-safe.
|
|
830
833
|
await sweepSessionMemory(session, options);
|
|
831
|
-
// Background shells that finished since last turn — surfaced to the model once.
|
|
832
|
-
const bgEvents = await backgroundEventNotes(session);
|
|
833
834
|
// Per-task guards: cost and time ceilings, both opt-in, like the step ceiling above
|
|
834
835
|
// them. Every call's usage is summed so a ceiling reflects the whole task.
|
|
835
836
|
const limits = taskLimits();
|
|
@@ -985,7 +986,28 @@ async function respondTurn(session, options = {}) {
|
|
|
985
986
|
dirNotes.push(note);
|
|
986
987
|
}
|
|
987
988
|
}
|
|
988
|
-
|
|
989
|
+
// BACKGROUND EVENTS ARE DRAINED HERE, once per step, and become real transcript
|
|
990
|
+
// entries rather than a list re-attached to every request.
|
|
991
|
+
//
|
|
992
|
+
// The bug this replaces: the drain happened ONCE before this loop and the resulting
|
|
993
|
+
// array was passed to `buildRequest` on every step, so a single "shell #1 exited
|
|
994
|
+
// 101" was appended as a fresh user message dozens of times in one turn. The model
|
|
995
|
+
// answered it every time — correctly, since each time it looked like news — and a
|
|
996
|
+
// real session spent 19 of 37 steps re-explaining one finished command.
|
|
997
|
+
//
|
|
998
|
+
// Draining per step also fixes a second thing quietly: a shell that finishes DURING a
|
|
999
|
+
// turn is now reported at the next step instead of waiting for the turn to end.
|
|
1000
|
+
//
|
|
1001
|
+
// Pushing into the transcript (rather than attaching to one request) is what makes
|
|
1002
|
+
// delivery exactly-once at the consumer as well as the producer: once it is an entry,
|
|
1003
|
+
// it is part of the conversation like any other, carried forward without being
|
|
1004
|
+
// re-sent. `drainEvents` is already one-shot, so every later step gets an empty list
|
|
1005
|
+
// unless something genuinely new happened. Same shape as the ripple note below.
|
|
1006
|
+
for (const note of await backgroundEventNotes(session)) {
|
|
1007
|
+
session.transcript.push({ role: "user", content: note, synthetic: true });
|
|
1008
|
+
await options.persist?.();
|
|
1009
|
+
}
|
|
1010
|
+
const request = buildRequest(session, stepTools(), await loadImagePayloads(session), dirNotes);
|
|
989
1011
|
// Did the cacheable prefix survive since the last call? A break re-bills the system
|
|
990
1012
|
// prompt and every tool schema at full price, silently — nothing fails, the reply is
|
|
991
1013
|
// normal, and the only evidence is the bill. Reported so an UNEXPLAINED one is
|