@buoy-gg/agent-core 7.0.36 → 7.0.39
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/README.md +13 -9
- package/lib/commonjs/catalog/catalog.g.js +93 -6
- package/lib/commonjs/catalog/catalog.g.js.map +1 -1
- package/lib/commonjs/catalog/catalog.source.json +106 -4
- package/lib/commonjs/catalog/catalog.types.g.js +3 -3
- package/lib/commonjs/catalog/catalog.types.g.js.map +1 -1
- package/lib/commonjs/catalog/toProviderTools.js +3 -1
- package/lib/commonjs/catalog/toProviderTools.js.map +1 -1
- package/lib/commonjs/effects/ledger.js +13 -1
- package/lib/commonjs/effects/ledger.js.map +1 -1
- package/lib/commonjs/engine/evidence.js +113 -0
- package/lib/commonjs/engine/evidence.js.map +1 -0
- package/lib/commonjs/engine/historyBudget.js +158 -55
- package/lib/commonjs/engine/historyBudget.js.map +1 -1
- package/lib/commonjs/engine/retrieve.js +214 -0
- package/lib/commonjs/engine/retrieve.js.map +1 -0
- package/lib/commonjs/engine/runAgentTurn.js +364 -94
- package/lib/commonjs/engine/runAgentTurn.js.map +1 -1
- package/lib/commonjs/engine/systemPrompt.js +31 -1
- package/lib/commonjs/engine/systemPrompt.js.map +1 -1
- package/lib/commonjs/engine/tokenCalibration.js +81 -0
- package/lib/commonjs/engine/tokenCalibration.js.map +1 -0
- package/lib/commonjs/engine/verify.js +300 -0
- package/lib/commonjs/engine/verify.js.map +1 -0
- package/lib/commonjs/index.js +16 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/providers/anthropic.js +12 -3
- package/lib/commonjs/providers/anthropic.js.map +1 -1
- package/lib/commonjs/providers/openai.js +11 -3
- package/lib/commonjs/providers/openai.js.map +1 -1
- package/lib/commonjs/providers/problem.js +98 -0
- package/lib/commonjs/providers/problem.js.map +1 -0
- package/lib/commonjs/providers/sse.js +6 -5
- package/lib/commonjs/providers/sse.js.map +1 -1
- package/lib/commonjs/providers/transport.js +20 -4
- package/lib/commonjs/providers/transport.js.map +1 -1
- package/lib/commonjs/providers/xhrStream.js +3 -0
- package/lib/commonjs/providers/xhrStream.js.map +1 -1
- package/lib/commonjs/session.js +32 -5
- package/lib/commonjs/session.js.map +1 -1
- package/lib/module/catalog/catalog.g.js +93 -6
- package/lib/module/catalog/catalog.g.js.map +1 -1
- package/lib/module/catalog/catalog.source.json +106 -4
- package/lib/module/catalog/catalog.types.g.js +3 -3
- package/lib/module/catalog/catalog.types.g.js.map +1 -1
- package/lib/module/catalog/toProviderTools.js +3 -1
- package/lib/module/catalog/toProviderTools.js.map +1 -1
- package/lib/module/effects/ledger.js +13 -1
- package/lib/module/effects/ledger.js.map +1 -1
- package/lib/module/engine/evidence.js +107 -0
- package/lib/module/engine/evidence.js.map +1 -0
- package/lib/module/engine/historyBudget.js +158 -54
- package/lib/module/engine/historyBudget.js.map +1 -1
- package/lib/module/engine/retrieve.js +210 -0
- package/lib/module/engine/retrieve.js.map +1 -0
- package/lib/module/engine/runAgentTurn.js +365 -96
- package/lib/module/engine/runAgentTurn.js.map +1 -1
- package/lib/module/engine/systemPrompt.js +30 -1
- package/lib/module/engine/systemPrompt.js.map +1 -1
- package/lib/module/engine/tokenCalibration.js +75 -0
- package/lib/module/engine/tokenCalibration.js.map +1 -0
- package/lib/module/engine/verify.js +292 -0
- package/lib/module/engine/verify.js.map +1 -0
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/providers/anthropic.js +12 -3
- package/lib/module/providers/anthropic.js.map +1 -1
- package/lib/module/providers/openai.js +11 -3
- package/lib/module/providers/openai.js.map +1 -1
- package/lib/module/providers/problem.js +92 -0
- package/lib/module/providers/problem.js.map +1 -0
- package/lib/module/providers/sse.js +6 -5
- package/lib/module/providers/sse.js.map +1 -1
- package/lib/module/providers/transport.js +20 -4
- package/lib/module/providers/transport.js.map +1 -1
- package/lib/module/providers/xhrStream.js +3 -0
- package/lib/module/providers/xhrStream.js.map +1 -1
- package/lib/module/session.js +33 -6
- package/lib/module/session.js.map +1 -1
- package/lib/typescript/catalog/catalog.g.d.ts +2 -2
- package/lib/typescript/catalog/catalog.g.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.types.g.d.ts +3 -3
- package/lib/typescript/catalog/catalog.types.g.d.ts.map +1 -1
- package/lib/typescript/catalog/toProviderTools.d.ts.map +1 -1
- package/lib/typescript/effects/ledger.d.ts +18 -0
- package/lib/typescript/effects/ledger.d.ts.map +1 -1
- package/lib/typescript/engine/evidence.d.ts +67 -0
- package/lib/typescript/engine/evidence.d.ts.map +1 -0
- package/lib/typescript/engine/historyBudget.d.ts +31 -8
- package/lib/typescript/engine/historyBudget.d.ts.map +1 -1
- package/lib/typescript/engine/retrieve.d.ts +32 -0
- package/lib/typescript/engine/retrieve.d.ts.map +1 -0
- package/lib/typescript/engine/runAgentTurn.d.ts +96 -2
- package/lib/typescript/engine/runAgentTurn.d.ts.map +1 -1
- package/lib/typescript/engine/systemPrompt.d.ts +39 -0
- package/lib/typescript/engine/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/engine/tokenCalibration.d.ts +46 -0
- package/lib/typescript/engine/tokenCalibration.d.ts.map +1 -0
- package/lib/typescript/engine/verify.d.ts +67 -0
- package/lib/typescript/engine/verify.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/providers/anthropic.d.ts.map +1 -1
- package/lib/typescript/providers/openai.d.ts.map +1 -1
- package/lib/typescript/providers/problem.d.ts +50 -0
- package/lib/typescript/providers/problem.d.ts.map +1 -0
- package/lib/typescript/providers/sse.d.ts +4 -1
- package/lib/typescript/providers/sse.d.ts.map +1 -1
- package/lib/typescript/providers/transport.d.ts +8 -0
- package/lib/typescript/providers/transport.d.ts.map +1 -1
- package/lib/typescript/providers/types.d.ts +14 -0
- package/lib/typescript/providers/types.d.ts.map +1 -1
- package/lib/typescript/providers/xhrStream.d.ts +2 -0
- package/lib/typescript/providers/xhrStream.d.ts.map +1 -1
- package/lib/typescript/session.d.ts +15 -2
- package/lib/typescript/session.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +6 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -83,6 +83,13 @@ export class EffectLedger {
|
|
|
83
83
|
return this.entries;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
/** Tool-call ids of changes still applied — the rounds history budgeting keeps longest. */
|
|
87
|
+
liveCallIds() {
|
|
88
|
+
const out = new Set();
|
|
89
|
+
for (const e of this.entries) if (!e.undoneAt && e.callId) out.add(e.callId);
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
|
|
86
93
|
/**
|
|
87
94
|
* Put back the entries of a conversation that outlived the app.
|
|
88
95
|
*
|
|
@@ -286,7 +293,8 @@ export class EffectLedger {
|
|
|
286
293
|
const outcome = {
|
|
287
294
|
reverted: 0,
|
|
288
295
|
failed: [],
|
|
289
|
-
skippedTransients: 0
|
|
296
|
+
skippedTransients: 0,
|
|
297
|
+
permanent: 0
|
|
290
298
|
};
|
|
291
299
|
const pending = [...this.entries].filter(e => !e.undoneAt).reverse();
|
|
292
300
|
for (const entry of pending) {
|
|
@@ -294,6 +302,10 @@ export class EffectLedger {
|
|
|
294
302
|
outcome.skippedTransients += 1;
|
|
295
303
|
continue;
|
|
296
304
|
}
|
|
305
|
+
if (!isReversible(entry.effect)) {
|
|
306
|
+
outcome.permanent += 1;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
297
309
|
const error = await this.revertOne(entry, dispatch);
|
|
298
310
|
if (error) outcome.failed.push({
|
|
299
311
|
label: entry.effect.label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["digestOf","isReversible","effect","kind","seq","EffectLedger","entries","listeners","Set","gen","generation","record","toolId","action","undefined","entry","id","Date","now","at","emit","list","
|
|
1
|
+
{"version":3,"names":["digestOf","isReversible","effect","kind","seq","EffectLedger","entries","listeners","Set","gen","generation","record","toolId","action","undefined","entry","id","Date","now","at","emit","list","liveCallIds","out","e","undoneAt","callId","add","restore","length","touch","reversible","filter","transients","isEmpty","every","subscribe","fn","delete","clear","noteExternalRevert","params","changed","mark","match","undoError","ruleId","revertOne","dispatch","fx","scope","instanceId","wrote","readAction","current","key","rec","value","found","before","removeAction","wroteDigest","queryHash","hasData","data","outcome","force","ok","error","err","msg","Error","message","String","revertAll","reverted","failed","skippedTransients","permanent","pending","reverse","push","label"],"sourceRoot":"../../../src","sources":["effects/ledger.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The evidence store: every tool result this conversation produced, kept in
|
|
5
|
+
* full so the model can go back to it.
|
|
6
|
+
*
|
|
7
|
+
* Two markers used to point nowhere. A result over 24 000 characters was cut
|
|
8
|
+
* with "ask for a narrower slice" — and no tool offers one, so the bank has
|
|
9
|
+
* cases tagged `capability` (Pokémon `stats` sit at offset ~180 000 of a
|
|
10
|
+
* 400 000-character detail; unreadable by design). And a result compressed
|
|
11
|
+
* out of memory said "ask again" — a re-dispatch returns the CURRENT value,
|
|
12
|
+
* not what the model saw before it wrote, which is the one it needs when a
|
|
13
|
+
* write is refused and it has to say what it changed FROM.
|
|
14
|
+
*
|
|
15
|
+
* So the full text is kept here, keyed by a short ref the markers carry, and
|
|
16
|
+
* `ask-buoy.retrieve` reads any part of it back: a path, a substring, a
|
|
17
|
+
* window. Borrowed from Strands' ContextOffloader (`retrieve_offloaded_content`
|
|
18
|
+
* with pattern / line_range), minus the storage layer — this is in-memory and
|
|
19
|
+
* per session on purpose: persisted transcripts deliberately carry no tool
|
|
20
|
+
* result payloads (see ask-buoy transcriptPersistence.ts), and this must not
|
|
21
|
+
* quietly change that.
|
|
22
|
+
*
|
|
23
|
+
* What goes in is what the MODEL was given: after `redact` (credential names
|
|
24
|
+
* and value shapes) and `stripSelfTraffic`. Never the raw adapter value.
|
|
25
|
+
*
|
|
26
|
+
* Bounded by bytes and entries, oldest out first; an evicted ref is remembered
|
|
27
|
+
* so the answer is "evicted" rather than "never existed" — the marker still
|
|
28
|
+
* names a real thing, and the honest reply is to call the tool again.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const DEFAULT_MAX_CHARS = 4_000_000;
|
|
32
|
+
const DEFAULT_MAX_ENTRIES = 200;
|
|
33
|
+
export class EvidenceStore {
|
|
34
|
+
entries = new Map();
|
|
35
|
+
evictedRefs = new Set();
|
|
36
|
+
chars = 0;
|
|
37
|
+
seq = 0;
|
|
38
|
+
constructor(opts = {}) {
|
|
39
|
+
this.maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
|
|
40
|
+
this.maxEntries = opts.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Keep a result. Returns its ref — `ev_<n>`, counting up for the life of the store. */
|
|
44
|
+
stash(input) {
|
|
45
|
+
const ref = `ev_${++this.seq}`;
|
|
46
|
+
const entry = {
|
|
47
|
+
...input,
|
|
48
|
+
ref
|
|
49
|
+
};
|
|
50
|
+
// A single result larger than the whole store still gets a ref — it is
|
|
51
|
+
// the case the store exists for — and simply evicts everything else.
|
|
52
|
+
this.entries.set(ref, entry);
|
|
53
|
+
this.chars += entry.text.length;
|
|
54
|
+
this.evict();
|
|
55
|
+
return ref;
|
|
56
|
+
}
|
|
57
|
+
get(ref) {
|
|
58
|
+
return this.entries.get(ref);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** True when the ref was real and has since been dropped for space. */
|
|
62
|
+
wasEvicted(ref) {
|
|
63
|
+
return this.evictedRefs.has(ref);
|
|
64
|
+
}
|
|
65
|
+
get size() {
|
|
66
|
+
return this.entries.size;
|
|
67
|
+
}
|
|
68
|
+
get totalChars() {
|
|
69
|
+
return this.chars;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** New conversation: nothing from the old one is retrievable. */
|
|
73
|
+
clear() {
|
|
74
|
+
this.entries.clear();
|
|
75
|
+
this.evictedRefs.clear();
|
|
76
|
+
this.chars = 0;
|
|
77
|
+
}
|
|
78
|
+
evict() {
|
|
79
|
+
// Map iteration is insertion order, so the first key is the oldest.
|
|
80
|
+
for (const [ref, entry] of this.entries) {
|
|
81
|
+
const over = this.chars > this.maxChars || this.entries.size > this.maxEntries;
|
|
82
|
+
if (!over || this.entries.size === 1) return;
|
|
83
|
+
this.entries.delete(ref);
|
|
84
|
+
this.evictedRefs.add(ref);
|
|
85
|
+
this.chars -= entry.text.length;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── the markers ──────────────────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
const RETRIEVE_HINT = "ask-buoy.retrieve";
|
|
93
|
+
|
|
94
|
+
/** The tail of a result cut at the engine's cap. */
|
|
95
|
+
export function truncationMarker(totalChars, ref) {
|
|
96
|
+
const size = totalChars.toLocaleString("en-US");
|
|
97
|
+
if (!ref) return `\n\n[truncated — ${size} characters total. Ask for a narrower slice if you need more.]`;
|
|
98
|
+
return `\n\n[truncated — ${size} characters total; ref ${ref}. Call ${RETRIEVE_HINT} {"ref":"${ref}"} to see its shape, then {"ref":"${ref}","path":"…"} or {"ref":"${ref}","pattern":"…"} to read the part you need.]`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** What a consumed result is replaced with when history is compressed. Keep the `[earlier result` prefix — historyBudget skips on it. */
|
|
102
|
+
export function compressedMarker(totalChars, ref) {
|
|
103
|
+
const size = totalChars.toLocaleString("en-US");
|
|
104
|
+
if (!ref) return `[earlier result — ${size} characters, already read. Ask again if you need it.]`;
|
|
105
|
+
return `[earlier result — ${size} characters, already read; ref ${ref}. ${RETRIEVE_HINT} {"ref":"${ref}",…} re-reads exactly what you saw then; calling the tool again gives the CURRENT value.]`;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_MAX_CHARS","DEFAULT_MAX_ENTRIES","EvidenceStore","entries","Map","evictedRefs","Set","chars","seq","constructor","opts","maxChars","maxEntries","stash","input","ref","entry","set","text","length","evict","get","wasEvicted","has","size","totalChars","clear","over","delete","add","RETRIEVE_HINT","truncationMarker","toLocaleString","compressedMarker"],"sourceRoot":"../../../src","sources":["engine/evidence.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
* budget before every request; the session still applies it when a turn opens.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { compressedMarker } from "./evidence";
|
|
17
|
+
import { DEFAULT_CHARS_PER_TOKEN } from "./tokenCalibration";
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* A long QA session must not die on the provider's context limit with an
|
|
18
21
|
* opaque error, so the history is kept under a budget.
|
|
@@ -43,14 +46,22 @@
|
|
|
43
46
|
* before — a round starts at a user message, so the assistant/tool-result
|
|
44
47
|
* pairing every provider requires stays intact.
|
|
45
48
|
*/
|
|
46
|
-
|
|
49
|
+
/**
|
|
50
|
+
* The limits are in TOKENS — the unit the provider enforces — and turned into
|
|
51
|
+
* characters at the ratio the session has measured (engine/tokenCalibration.ts).
|
|
52
|
+
* The `_CHARS` constants below are those limits at the default 4 chars/token,
|
|
53
|
+
* kept for callers that have no calibration in hand (tests, one-shot use).
|
|
54
|
+
*/
|
|
55
|
+
export const MAX_HISTORY_TOKENS = 37_500;
|
|
47
56
|
/**
|
|
48
57
|
* The ceiling on a WHOLE request: tools, system prompt, messages and the room
|
|
49
|
-
* reserved for the reply.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
58
|
+
* reserved for the reply. 100k tokens fits the smallest context Ask Buoy is
|
|
59
|
+
* pointed at in practice (a 128k-token gateway) with headroom, and leaves
|
|
60
|
+
* Anthropic's 200k far from the limit.
|
|
52
61
|
*/
|
|
53
|
-
export const
|
|
62
|
+
export const MAX_REQUEST_TOKENS = 100_000;
|
|
63
|
+
export const MAX_HISTORY_CHARS = MAX_HISTORY_TOKENS * DEFAULT_CHARS_PER_TOKEN;
|
|
64
|
+
export const MAX_REQUEST_CHARS = MAX_REQUEST_TOKENS * DEFAULT_CHARS_PER_TOKEN;
|
|
54
65
|
const MIN_KEEP_MESSAGES = 4;
|
|
55
66
|
/** Below this a marker costs more than the payload it replaces. */
|
|
56
67
|
const MIN_COMPRESS_CHARS = 400;
|
|
@@ -66,16 +77,21 @@ export function messageSize(m) {
|
|
|
66
77
|
* Replace consumed tool results with a marker. See the note above
|
|
67
78
|
* MAX_HISTORY_CHARS for what "consumed" means and why the exemptions exist.
|
|
68
79
|
*/
|
|
69
|
-
export function compressConsumed(messages) {
|
|
80
|
+
export function compressConsumed(messages, exemptNewest = true) {
|
|
70
81
|
// The newest tool-results message: the model is about to answer from it.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
// Unless the caller says otherwise — `budgetForRequest` hands in the rounds
|
|
83
|
+
// BEFORE the current one, whose last result was answered long ago.
|
|
84
|
+
let newest = messages.length;
|
|
85
|
+
if (exemptNewest) {
|
|
86
|
+
newest = -1;
|
|
87
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
88
|
+
if (messages[i].role === "tool-results") {
|
|
89
|
+
newest = i;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
76
92
|
}
|
|
93
|
+
if (newest <= 0) return messages;
|
|
77
94
|
}
|
|
78
|
-
if (newest <= 0) return messages;
|
|
79
95
|
|
|
80
96
|
// The reads a later write depended on. An assistant turn that called a
|
|
81
97
|
// write was matching a shape it read in the round before, and that is the
|
|
@@ -100,9 +116,11 @@ export function compressConsumed(messages) {
|
|
|
100
116
|
if (r.isError || r.content.length < MIN_COMPRESS_CHARS) return r;
|
|
101
117
|
if (r.content.startsWith("[earlier result")) return r;
|
|
102
118
|
touched = true;
|
|
119
|
+
// The ref survives the compression: the marker names it, and a later
|
|
120
|
+
// `retrieve` reads the full text back. See engine/evidence.ts.
|
|
103
121
|
return {
|
|
104
122
|
...r,
|
|
105
|
-
content:
|
|
123
|
+
content: compressedMarker(r.content.length, r.ref)
|
|
106
124
|
};
|
|
107
125
|
});
|
|
108
126
|
if (!touched) return m;
|
|
@@ -122,6 +140,70 @@ export function compressConsumed(messages) {
|
|
|
122
140
|
*/
|
|
123
141
|
const WRITE_ISH = /set|write|dispatch|navigate|tap|override|restore|delete|remove|clear|save|run|impersonat|reload/i;
|
|
124
142
|
|
|
143
|
+
/**
|
|
144
|
+
* A round: a user message and everything up to the next one. `pinned` when
|
|
145
|
+
* one of its tool calls made a change that is still applied — see
|
|
146
|
+
* `dropRounds`.
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
function splitRounds(messages, pinnedCallIds) {
|
|
150
|
+
const rounds = [];
|
|
151
|
+
for (const m of messages) {
|
|
152
|
+
if (m.role === "user" || rounds.length === 0) rounds.push({
|
|
153
|
+
messages: [],
|
|
154
|
+
size: 0,
|
|
155
|
+
pinned: false
|
|
156
|
+
});
|
|
157
|
+
const round = rounds[rounds.length - 1];
|
|
158
|
+
round.messages.push(m);
|
|
159
|
+
round.size += messageSize(m);
|
|
160
|
+
if (pinnedCallIds?.size && m.role === "assistant" && m.toolCalls?.some(c => pinnedCallIds.has(c.id))) round.pinned = true;
|
|
161
|
+
}
|
|
162
|
+
return rounds;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Drop whole rounds, oldest first, until `keepSize + dropped` fits — but the
|
|
167
|
+
* PINNED rounds last.
|
|
168
|
+
*
|
|
169
|
+
* Dropping oldest-first was the whole rule, and in a QA session the oldest
|
|
170
|
+
* round is usually the SETUP: the override that was armed, the store that
|
|
171
|
+
* was written, the user someone is impersonating. Lose it and the model can
|
|
172
|
+
* no longer explain the screen it is looking at, or that a "wrong" response
|
|
173
|
+
* is its own mock — and the changes list in the prompt names the change but
|
|
174
|
+
* not the reasoning around it. The ledger knows which changes are still
|
|
175
|
+
* applied, so a round that made one is kept (compressed, like any other) for
|
|
176
|
+
* as long as an unpinned round remains to drop instead. Only when nothing
|
|
177
|
+
* else is left do pinned rounds go, oldest first, and the caller says so.
|
|
178
|
+
* Strands' `pin-message.ts` is the same idea, keyed on message metadata.
|
|
179
|
+
*
|
|
180
|
+
* `minMessages` is the floor the session-level trim keeps (a history that
|
|
181
|
+
* opens mid-exchange is rejected by every provider; the floor is applied on
|
|
182
|
+
* STARTING a drop, so a drop always runs to the next user boundary).
|
|
183
|
+
*/
|
|
184
|
+
function dropRounds(rounds, budget, keepSize, minMessages) {
|
|
185
|
+
const remaining = [...rounds];
|
|
186
|
+
let size = remaining.reduce((n, r) => n + r.size, 0);
|
|
187
|
+
let droppedRounds = 0;
|
|
188
|
+
let droppedPinned = 0;
|
|
189
|
+
const messageCount = () => remaining.reduce((n, r) => n + r.messages.length, 0);
|
|
190
|
+
while (remaining.length > 0 && size + keepSize > budget && messageCount() > minMessages) {
|
|
191
|
+
let i = remaining.findIndex(r => !r.pinned);
|
|
192
|
+
if (i < 0) {
|
|
193
|
+
i = 0;
|
|
194
|
+
droppedPinned += 1;
|
|
195
|
+
}
|
|
196
|
+
size -= remaining[i].size;
|
|
197
|
+
remaining.splice(i, 1);
|
|
198
|
+
droppedRounds += 1;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
kept: remaining.flatMap(r => r.messages),
|
|
202
|
+
droppedRounds,
|
|
203
|
+
droppedPinned
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
125
207
|
/**
|
|
126
208
|
* Trim, and say how many whole rounds were dropped — the number the UI turns
|
|
127
209
|
* into "older messages were trimmed from the agent's memory".
|
|
@@ -132,37 +214,35 @@ const WRITE_ISH = /set|write|dispatch|navigate|tap|override|restore|delete|remov
|
|
|
132
214
|
* assistant or tool-results message — which every provider rejects. The
|
|
133
215
|
* minimum-keep guard belongs on STARTING a drop, not on finishing one.
|
|
134
216
|
*/
|
|
135
|
-
export function trimHistoryReport(messages
|
|
217
|
+
export function trimHistoryReport(messages, charsPerToken = DEFAULT_CHARS_PER_TOKEN, /** Tool-call ids whose change is still applied — their rounds are dropped last. See dropRounds. */
|
|
218
|
+
pinnedCallIds) {
|
|
219
|
+
const limit = Math.floor(MAX_HISTORY_TOKENS * charsPerToken);
|
|
136
220
|
let total = 0;
|
|
137
221
|
for (const m of messages) total += messageSize(m);
|
|
138
|
-
if (total <=
|
|
222
|
+
if (total <= limit) return {
|
|
139
223
|
messages,
|
|
140
|
-
droppedRounds: 0
|
|
224
|
+
droppedRounds: 0,
|
|
225
|
+
droppedPinned: 0
|
|
141
226
|
};
|
|
142
227
|
|
|
143
228
|
// Compress before dropping — a compressed round still explains the screen.
|
|
144
229
|
const compressed = compressConsumed(messages);
|
|
145
230
|
let after = 0;
|
|
146
231
|
for (const m of compressed) after += messageSize(m);
|
|
147
|
-
if (after <=
|
|
232
|
+
if (after <= limit) return {
|
|
148
233
|
messages: compressed,
|
|
149
|
-
droppedRounds: 0
|
|
234
|
+
droppedRounds: 0,
|
|
235
|
+
droppedPinned: 0
|
|
150
236
|
};
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
out.shift();
|
|
157
|
-
while (out.length > 0 && out[0].role !== "user") {
|
|
158
|
-
total -= messageSize(out[0]);
|
|
159
|
-
out.shift();
|
|
160
|
-
}
|
|
161
|
-
droppedRounds += 1;
|
|
162
|
-
}
|
|
237
|
+
const {
|
|
238
|
+
kept,
|
|
239
|
+
droppedRounds,
|
|
240
|
+
droppedPinned
|
|
241
|
+
} = dropRounds(splitRounds(compressed, pinnedCallIds), limit, 0, MIN_KEEP_MESSAGES);
|
|
163
242
|
return {
|
|
164
|
-
messages:
|
|
165
|
-
droppedRounds
|
|
243
|
+
messages: kept,
|
|
244
|
+
droppedRounds,
|
|
245
|
+
droppedPinned
|
|
166
246
|
};
|
|
167
247
|
}
|
|
168
248
|
|
|
@@ -185,7 +265,15 @@ export function trimHistory(messages) {
|
|
|
185
265
|
* installed), the system prompt, and the reply the model is allowed to write.
|
|
186
266
|
* Budgeting messages alone would leave the biggest fixed cost out of the sum.
|
|
187
267
|
*/
|
|
188
|
-
export function budgetForRequest(messages, reserve
|
|
268
|
+
export function budgetForRequest(messages, reserve,
|
|
269
|
+
/**
|
|
270
|
+
* A tighter ceiling on the messages than MAX_HISTORY_CHARS — set by the
|
|
271
|
+
* engine after the provider refused a request as too big. The proactive
|
|
272
|
+
* budget is an estimate; the provider's refusal is the truth.
|
|
273
|
+
*/
|
|
274
|
+
cap = MAX_HISTORY_CHARS, /** The session's measured ratio; scales the whole-request ceiling. */
|
|
275
|
+
charsPerToken = DEFAULT_CHARS_PER_TOKEN, /** Tool-call ids whose change is still applied — their rounds are dropped last. See dropRounds. */
|
|
276
|
+
pinnedCallIds) {
|
|
189
277
|
/**
|
|
190
278
|
* `MAX_HISTORY_CHARS` is a MESSAGES budget and always was — subtracting the
|
|
191
279
|
* reserve from it is wrong by a wide margin. The tool block alone is ~94,000
|
|
@@ -199,12 +287,13 @@ export function budgetForRequest(messages, reserve) {
|
|
|
199
287
|
* the fixed cost is counted. In an ordinary install the first wins and
|
|
200
288
|
* nothing changes; the second only bites when the tools are huge.
|
|
201
289
|
*/
|
|
202
|
-
const budget = Math.min(
|
|
290
|
+
const budget = Math.min(cap, Math.floor(MAX_REQUEST_TOKENS * charsPerToken) - reserve);
|
|
203
291
|
let total = 0;
|
|
204
292
|
for (const m of messages) total += messageSize(m);
|
|
205
293
|
if (total <= budget) return {
|
|
206
294
|
messages,
|
|
207
|
-
droppedRounds: 0
|
|
295
|
+
droppedRounds: 0,
|
|
296
|
+
droppedPinned: 0
|
|
208
297
|
};
|
|
209
298
|
|
|
210
299
|
// Where the current round begins. Nothing from here on is eligible.
|
|
@@ -215,37 +304,52 @@ export function budgetForRequest(messages, reserve) {
|
|
|
215
304
|
break;
|
|
216
305
|
}
|
|
217
306
|
}
|
|
218
|
-
if (currentRound <= 0)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
307
|
+
if (currentRound <= 0) {
|
|
308
|
+
// The whole history is this one round and it is over the limit by
|
|
309
|
+
// itself. Its consumed results are compressed, the newest kept — see the
|
|
310
|
+
// last-resort note below; this is the same move with nothing to drop.
|
|
311
|
+
return {
|
|
312
|
+
messages: compressConsumed(messages),
|
|
313
|
+
droppedRounds: 0,
|
|
314
|
+
droppedPinned: 0
|
|
315
|
+
};
|
|
316
|
+
}
|
|
222
317
|
const earlier = messages.slice(0, currentRound);
|
|
223
318
|
const current = messages.slice(currentRound);
|
|
224
319
|
let currentSize = 0;
|
|
225
320
|
for (const m of current) currentSize += messageSize(m);
|
|
226
|
-
|
|
321
|
+
|
|
322
|
+
// `false`: the earlier rounds' last result was answered long ago — the
|
|
323
|
+
// newest-result exemption is about the round being answered NOW.
|
|
324
|
+
const compressed = compressConsumed(earlier, false);
|
|
227
325
|
let earlierSize = 0;
|
|
228
326
|
for (const m of compressed) earlierSize += messageSize(m);
|
|
229
327
|
if (earlierSize + currentSize <= budget) {
|
|
230
328
|
return {
|
|
231
329
|
messages: [...compressed, ...current],
|
|
232
|
-
droppedRounds: 0
|
|
330
|
+
droppedRounds: 0,
|
|
331
|
+
droppedPinned: 0
|
|
233
332
|
};
|
|
234
333
|
}
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
334
|
+
const {
|
|
335
|
+
kept: out,
|
|
336
|
+
droppedRounds,
|
|
337
|
+
droppedPinned
|
|
338
|
+
} = dropRounds(splitRounds(compressed, pinnedCallIds), budget, currentSize, 0);
|
|
339
|
+
earlierSize = out.reduce((n, m) => n + messageSize(m), 0);
|
|
340
|
+
/**
|
|
341
|
+
* LAST RESORT, inside the current round. Everything earlier is gone and the
|
|
342
|
+
* turn's own reads are still over the limit — a twelve-step investigation
|
|
343
|
+
* of 24k-character results does that by itself. The consumed ones (an
|
|
344
|
+
* assistant message came after them) are compressed the same way earlier
|
|
345
|
+
* rounds were, newest result and the reads before a write still exempt.
|
|
346
|
+
* Their refs make this lossless for the model: `retrieve` reads them back.
|
|
347
|
+
*/
|
|
348
|
+
const currentOut = out.length === 0 && earlierSize + currentSize > budget ? compressConsumed(current) : current;
|
|
246
349
|
return {
|
|
247
|
-
messages: [...out, ...
|
|
248
|
-
droppedRounds
|
|
350
|
+
messages: [...out, ...currentOut],
|
|
351
|
+
droppedRounds,
|
|
352
|
+
droppedPinned
|
|
249
353
|
};
|
|
250
354
|
}
|
|
251
355
|
//# sourceMappingURL=historyBudget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MAX_HISTORY_CHARS","MAX_REQUEST_CHARS","MIN_KEEP_MESSAGES","MIN_COMPRESS_CHARS","messageSize","m","JSON","stringify","length","compressConsumed","messages","newest","i","role","beforeWrite","Set","toolCalls","some","c","WRITE_ISH","test","input","name","j","add","changed","out","map","has","touched","results","r","isError","content","startsWith","
|
|
1
|
+
{"version":3,"names":["compressedMarker","DEFAULT_CHARS_PER_TOKEN","MAX_HISTORY_TOKENS","MAX_REQUEST_TOKENS","MAX_HISTORY_CHARS","MAX_REQUEST_CHARS","MIN_KEEP_MESSAGES","MIN_COMPRESS_CHARS","messageSize","m","JSON","stringify","length","compressConsumed","messages","exemptNewest","newest","i","role","beforeWrite","Set","toolCalls","some","c","WRITE_ISH","test","input","name","j","add","changed","out","map","has","touched","results","r","isError","content","startsWith","ref","splitRounds","pinnedCallIds","rounds","push","size","pinned","round","id","dropRounds","budget","keepSize","minMessages","remaining","reduce","n","droppedRounds","droppedPinned","messageCount","findIndex","splice","kept","flatMap","trimHistoryReport","charsPerToken","limit","Math","floor","total","compressed","after","trimHistory","budgetForRequest","reserve","cap","min","currentRound","earlier","slice","current","currentSize","earlierSize","currentOut"],"sourceRoot":"../../../src","sources":["engine/historyBudget.ts"],"mappings":"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","ignoreList":[]}
|