@buoy-gg/agent-core 7.0.35 → 7.0.36
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 +10 -7
- package/lib/commonjs/blocks/receipts.js +57 -1
- package/lib/commonjs/blocks/receipts.js.map +1 -1
- package/lib/commonjs/blocks/types.js +23 -2
- package/lib/commonjs/blocks/types.js.map +1 -1
- package/lib/commonjs/blocks/uiTool.js +423 -10
- package/lib/commonjs/blocks/uiTool.js.map +1 -1
- package/lib/commonjs/catalog/catalog.g.js +121 -43
- package/lib/commonjs/catalog/catalog.g.js.map +1 -1
- package/lib/commonjs/catalog/catalog.source.json +121 -45
- package/lib/commonjs/catalog/catalog.types.g.js +44 -0
- package/lib/commonjs/catalog/catalog.types.g.js.map +1 -0
- package/lib/commonjs/catalog/normalizeParams.js +333 -0
- package/lib/commonjs/catalog/normalizeParams.js.map +1 -0
- package/lib/commonjs/catalog/signature.js +68 -0
- package/lib/commonjs/catalog/signature.js.map +1 -0
- package/lib/commonjs/catalog/snapshotReads.js +13 -6
- package/lib/commonjs/catalog/snapshotReads.js.map +1 -1
- package/lib/commonjs/catalog/toProviderTools.js +41 -5
- package/lib/commonjs/catalog/toProviderTools.js.map +1 -1
- package/lib/commonjs/context/buildContextPack.js +367 -19
- package/lib/commonjs/context/buildContextPack.js.map +1 -1
- package/lib/commonjs/effects/digest.js +34 -0
- package/lib/commonjs/effects/digest.js.map +1 -0
- package/lib/commonjs/effects/ledger.js +85 -1
- package/lib/commonjs/effects/ledger.js.map +1 -1
- package/lib/commonjs/engine/askGate.js +287 -0
- package/lib/commonjs/engine/askGate.js.map +1 -0
- package/lib/commonjs/engine/effectFor.js +82 -1
- package/lib/commonjs/engine/effectFor.js.map +1 -1
- package/lib/commonjs/engine/historyBudget.js +260 -0
- package/lib/commonjs/engine/historyBudget.js.map +1 -0
- package/lib/commonjs/engine/runAgentTurn.js +924 -83
- package/lib/commonjs/engine/runAgentTurn.js.map +1 -1
- package/lib/commonjs/engine/systemPrompt.js +72 -8
- package/lib/commonjs/engine/systemPrompt.js.map +1 -1
- package/lib/commonjs/engine/textToolCalls.js +276 -0
- package/lib/commonjs/engine/textToolCalls.js.map +1 -0
- package/lib/commonjs/index.js +58 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/policy/labels.js +19 -3
- package/lib/commonjs/policy/labels.js.map +1 -1
- package/lib/commonjs/policy/policy.js +6 -1
- package/lib/commonjs/policy/policy.js.map +1 -1
- package/lib/commonjs/policy/redact.js +42 -5
- package/lib/commonjs/policy/redact.js.map +1 -1
- package/lib/commonjs/providers/anthropic.js +331 -208
- package/lib/commonjs/providers/anthropic.js.map +1 -1
- package/lib/commonjs/providers/openai.js +229 -103
- package/lib/commonjs/providers/openai.js.map +1 -1
- package/lib/commonjs/providers/sse.js +164 -29
- package/lib/commonjs/providers/sse.js.map +1 -1
- package/lib/commonjs/providers/streamTimer.js +123 -0
- package/lib/commonjs/providers/streamTimer.js.map +1 -0
- package/lib/commonjs/providers/transport.js +107 -0
- package/lib/commonjs/providers/transport.js.map +1 -0
- package/lib/commonjs/providers/xhrStream.js +209 -0
- package/lib/commonjs/providers/xhrStream.js.map +1 -0
- package/lib/commonjs/session.js +215 -58
- package/lib/commonjs/session.js.map +1 -1
- package/lib/module/blocks/receipts.js +57 -1
- package/lib/module/blocks/receipts.js.map +1 -1
- package/lib/module/blocks/types.js +23 -2
- package/lib/module/blocks/types.js.map +1 -1
- package/lib/module/blocks/uiTool.js +421 -10
- package/lib/module/blocks/uiTool.js.map +1 -1
- package/lib/module/catalog/catalog.g.js +121 -43
- package/lib/module/catalog/catalog.g.js.map +1 -1
- package/lib/module/catalog/catalog.source.json +121 -45
- package/lib/module/catalog/catalog.types.g.js +40 -0
- package/lib/module/catalog/catalog.types.g.js.map +1 -0
- package/lib/module/catalog/normalizeParams.js +327 -0
- package/lib/module/catalog/normalizeParams.js.map +1 -0
- package/lib/module/catalog/signature.js +63 -0
- package/lib/module/catalog/signature.js.map +1 -0
- package/lib/module/catalog/snapshotReads.js +13 -6
- package/lib/module/catalog/snapshotReads.js.map +1 -1
- package/lib/module/catalog/toProviderTools.js +41 -5
- package/lib/module/catalog/toProviderTools.js.map +1 -1
- package/lib/module/context/buildContextPack.js +366 -19
- package/lib/module/context/buildContextPack.js.map +1 -1
- package/lib/module/effects/digest.js +29 -0
- package/lib/module/effects/digest.js.map +1 -0
- package/lib/module/effects/ledger.js +85 -1
- package/lib/module/effects/ledger.js.map +1 -1
- package/lib/module/engine/askGate.js +280 -0
- package/lib/module/engine/askGate.js.map +1 -0
- package/lib/module/engine/effectFor.js +83 -1
- package/lib/module/engine/effectFor.js.map +1 -1
- package/lib/module/engine/historyBudget.js +251 -0
- package/lib/module/engine/historyBudget.js.map +1 -0
- package/lib/module/engine/runAgentTurn.js +920 -83
- package/lib/module/engine/runAgentTurn.js.map +1 -1
- package/lib/module/engine/systemPrompt.js +71 -8
- package/lib/module/engine/systemPrompt.js.map +1 -1
- package/lib/module/engine/textToolCalls.js +270 -0
- package/lib/module/engine/textToolCalls.js.map +1 -0
- package/lib/module/index.js +5 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/policy/labels.js +19 -3
- package/lib/module/policy/labels.js.map +1 -1
- package/lib/module/policy/policy.js +6 -1
- package/lib/module/policy/policy.js.map +1 -1
- package/lib/module/policy/redact.js +42 -5
- package/lib/module/policy/redact.js.map +1 -1
- package/lib/module/providers/anthropic.js +332 -209
- package/lib/module/providers/anthropic.js.map +1 -1
- package/lib/module/providers/openai.js +230 -104
- package/lib/module/providers/openai.js.map +1 -1
- package/lib/module/providers/sse.js +160 -29
- package/lib/module/providers/sse.js.map +1 -1
- package/lib/module/providers/streamTimer.js +118 -0
- package/lib/module/providers/streamTimer.js.map +1 -0
- package/lib/module/providers/transport.js +103 -0
- package/lib/module/providers/transport.js.map +1 -0
- package/lib/module/providers/xhrStream.js +204 -0
- package/lib/module/providers/xhrStream.js.map +1 -0
- package/lib/module/session.js +199 -60
- package/lib/module/session.js.map +1 -1
- package/lib/typescript/blocks/receipts.d.ts +5 -0
- package/lib/typescript/blocks/receipts.d.ts.map +1 -1
- package/lib/typescript/blocks/types.d.ts +23 -2
- package/lib/typescript/blocks/types.d.ts.map +1 -1
- package/lib/typescript/blocks/uiTool.d.ts +11 -2
- package/lib/typescript/blocks/uiTool.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.g.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.types.g.d.ts +40 -0
- package/lib/typescript/catalog/catalog.types.g.d.ts.map +1 -0
- package/lib/typescript/catalog/normalizeParams.d.ts +43 -0
- package/lib/typescript/catalog/normalizeParams.d.ts.map +1 -0
- package/lib/typescript/catalog/signature.d.ts +29 -0
- package/lib/typescript/catalog/signature.d.ts.map +1 -0
- package/lib/typescript/catalog/snapshotReads.d.ts.map +1 -1
- package/lib/typescript/catalog/toProviderTools.d.ts +28 -15
- package/lib/typescript/catalog/toProviderTools.d.ts.map +1 -1
- package/lib/typescript/context/buildContextPack.d.ts +24 -2
- package/lib/typescript/context/buildContextPack.d.ts.map +1 -1
- package/lib/typescript/effects/digest.d.ts +10 -0
- package/lib/typescript/effects/digest.d.ts.map +1 -0
- package/lib/typescript/effects/ledger.d.ts +55 -0
- package/lib/typescript/effects/ledger.d.ts.map +1 -1
- package/lib/typescript/engine/askGate.d.ts +29 -0
- package/lib/typescript/engine/askGate.d.ts.map +1 -0
- package/lib/typescript/engine/effectFor.d.ts +6 -1
- package/lib/typescript/engine/effectFor.d.ts.map +1 -1
- package/lib/typescript/engine/historyBudget.d.ts +92 -0
- package/lib/typescript/engine/historyBudget.d.ts.map +1 -0
- package/lib/typescript/engine/runAgentTurn.d.ts +83 -1
- package/lib/typescript/engine/runAgentTurn.d.ts.map +1 -1
- package/lib/typescript/engine/systemPrompt.d.ts +41 -0
- package/lib/typescript/engine/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/engine/textToolCalls.d.ts +58 -0
- package/lib/typescript/engine/textToolCalls.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +5 -3
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/policy/labels.d.ts.map +1 -1
- package/lib/typescript/policy/policy.d.ts.map +1 -1
- package/lib/typescript/policy/redact.d.ts.map +1 -1
- package/lib/typescript/providers/anthropic.d.ts.map +1 -1
- package/lib/typescript/providers/openai.d.ts +0 -16
- package/lib/typescript/providers/openai.d.ts.map +1 -1
- package/lib/typescript/providers/sse.d.ts +82 -1
- package/lib/typescript/providers/sse.d.ts.map +1 -1
- package/lib/typescript/providers/streamTimer.d.ts +59 -0
- package/lib/typescript/providers/streamTimer.d.ts.map +1 -0
- package/lib/typescript/providers/transport.d.ts +40 -0
- package/lib/typescript/providers/transport.d.ts.map +1 -0
- package/lib/typescript/providers/types.d.ts +91 -3
- package/lib/typescript/providers/types.d.ts.map +1 -1
- package/lib/typescript/providers/xhrStream.d.ts +43 -0
- package/lib/typescript/providers/xhrStream.d.ts.map +1 -0
- package/lib/typescript/session.d.ts +40 -2
- package/lib/typescript/session.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* How much conversation the model is allowed to be sent, and what gets cut.
|
|
5
|
+
*
|
|
6
|
+
* Lives here, not in `session.ts`, because it is needed in TWO places and used
|
|
7
|
+
* to run in only one. The session trims once per turn, before the loop starts
|
|
8
|
+
* — and a turn is not one request. A twelve-step investigation appends an
|
|
9
|
+
* assistant message and a tool-results message per step, each result capped at
|
|
10
|
+
* 24,000 characters, so a long read chain could add well over a hundred
|
|
11
|
+
* thousand characters AFTER the only check had already happened and walk
|
|
12
|
+
* straight into the provider's context limit. The engine now applies the same
|
|
13
|
+
* budget before every request; the session still applies it when a turn opens.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A long QA session must not die on the provider's context limit with an
|
|
18
|
+
* opaque error, so the history is kept under a budget.
|
|
19
|
+
*
|
|
20
|
+
* TWO STAGES, AND THE ORDER IS THE POINT. Dropping the oldest rounds was the
|
|
21
|
+
* only stage, and in a QA session the oldest round is usually the SETUP — the
|
|
22
|
+
* override that was armed, the store that was written, the user someone is
|
|
23
|
+
* impersonating. Drop it and the model can no longer explain the screen it is
|
|
24
|
+
* looking at, or that a "wrong" response is its own mock. The reply gets worse
|
|
25
|
+
* in exactly the sessions long enough to need trimming.
|
|
26
|
+
*
|
|
27
|
+
* So: COMPRESS first, DROP only if that was not enough.
|
|
28
|
+
*
|
|
29
|
+
* A tool result is "consumed" once the model has produced an assistant message
|
|
30
|
+
* after seeing it — it has already been reasoned over, and what remains is
|
|
31
|
+
* bulk. Replacing it with a marker keeps the round, its decision and its
|
|
32
|
+
* ordering while giving back nearly all the bytes. Three exemptions carry
|
|
33
|
+
* their weight:
|
|
34
|
+
*
|
|
35
|
+
* - Errors are never compressed. A failure is the diagnostic value.
|
|
36
|
+
* - The newest tool-results message is never compressed. The model is about
|
|
37
|
+
* to answer from it.
|
|
38
|
+
* - The last read before a WRITE is never compressed: that is the shape the
|
|
39
|
+
* model matched its edit to, and it is the thing it re-reads when the write
|
|
40
|
+
* is refused and it has to correct itself.
|
|
41
|
+
*
|
|
42
|
+
* Only if the history is still over budget do whole rounds get dropped, as
|
|
43
|
+
* before — a round starts at a user message, so the assistant/tool-result
|
|
44
|
+
* pairing every provider requires stays intact.
|
|
45
|
+
*/
|
|
46
|
+
export const MAX_HISTORY_CHARS = 150_000;
|
|
47
|
+
/**
|
|
48
|
+
* The ceiling on a WHOLE request: tools, system prompt, messages and the room
|
|
49
|
+
* reserved for the reply. ~100k tokens, which fits the smallest context Ask
|
|
50
|
+
* Buoy is pointed at in practice (a 128k-token gateway) with headroom, and
|
|
51
|
+
* leaves Anthropic's 200k far from the limit.
|
|
52
|
+
*/
|
|
53
|
+
export const MAX_REQUEST_CHARS = 400_000;
|
|
54
|
+
const MIN_KEEP_MESSAGES = 4;
|
|
55
|
+
/** Below this a marker costs more than the payload it replaces. */
|
|
56
|
+
const MIN_COMPRESS_CHARS = 400;
|
|
57
|
+
export function messageSize(m) {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.stringify(m).length;
|
|
60
|
+
} catch {
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Replace consumed tool results with a marker. See the note above
|
|
67
|
+
* MAX_HISTORY_CHARS for what "consumed" means and why the exemptions exist.
|
|
68
|
+
*/
|
|
69
|
+
export function compressConsumed(messages) {
|
|
70
|
+
// The newest tool-results message: the model is about to answer from it.
|
|
71
|
+
let newest = -1;
|
|
72
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
73
|
+
if (messages[i].role === "tool-results") {
|
|
74
|
+
newest = i;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (newest <= 0) return messages;
|
|
79
|
+
|
|
80
|
+
// The reads a later write depended on. An assistant turn that called a
|
|
81
|
+
// write was matching a shape it read in the round before, and that is the
|
|
82
|
+
// read it goes back to when the write is refused.
|
|
83
|
+
const beforeWrite = new Set();
|
|
84
|
+
for (let i = 0; i < messages.length; i++) {
|
|
85
|
+
const m = messages[i];
|
|
86
|
+
if (m.role !== "assistant" || !m.toolCalls?.length) continue;
|
|
87
|
+
if (!m.toolCalls.some(c => WRITE_ISH.test(JSON.stringify(c.input ?? {}) + c.name))) continue;
|
|
88
|
+
for (let j = i - 1; j >= 0 && j >= i - 3; j--) {
|
|
89
|
+
if (messages[j].role === "tool-results") {
|
|
90
|
+
beforeWrite.add(j);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
let changed = false;
|
|
96
|
+
const out = messages.map((m, i) => {
|
|
97
|
+
if (m.role !== "tool-results" || i >= newest || beforeWrite.has(i)) return m;
|
|
98
|
+
let touched = false;
|
|
99
|
+
const results = m.results.map(r => {
|
|
100
|
+
if (r.isError || r.content.length < MIN_COMPRESS_CHARS) return r;
|
|
101
|
+
if (r.content.startsWith("[earlier result")) return r;
|
|
102
|
+
touched = true;
|
|
103
|
+
return {
|
|
104
|
+
...r,
|
|
105
|
+
content: `[earlier result — ${r.content.length} characters, already read. Ask again if you need it.]`
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
if (!touched) return m;
|
|
109
|
+
changed = true;
|
|
110
|
+
return {
|
|
111
|
+
...m,
|
|
112
|
+
results
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
return changed ? out : messages;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Heuristic for "this call changed something". Deliberately loose: the cost of
|
|
120
|
+
* a false positive is one uncompressed read, the cost of a false negative is
|
|
121
|
+
* the model losing the shape it was editing.
|
|
122
|
+
*/
|
|
123
|
+
const WRITE_ISH = /set|write|dispatch|navigate|tap|override|restore|delete|remove|clear|save|run|impersonat|reload/i;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Trim, and say how many whole rounds were dropped — the number the UI turns
|
|
127
|
+
* into "older messages were trimmed from the agent's memory".
|
|
128
|
+
*
|
|
129
|
+
* A round is a user message and everything up to the next one. Once a drop
|
|
130
|
+
* starts it ALWAYS runs to the next user boundary: the inner loop used to stop
|
|
131
|
+
* at `MIN_KEEP_MESSAGES` as well, so a history could come out starting with an
|
|
132
|
+
* assistant or tool-results message — which every provider rejects. The
|
|
133
|
+
* minimum-keep guard belongs on STARTING a drop, not on finishing one.
|
|
134
|
+
*/
|
|
135
|
+
export function trimHistoryReport(messages) {
|
|
136
|
+
let total = 0;
|
|
137
|
+
for (const m of messages) total += messageSize(m);
|
|
138
|
+
if (total <= MAX_HISTORY_CHARS) return {
|
|
139
|
+
messages,
|
|
140
|
+
droppedRounds: 0
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// Compress before dropping — a compressed round still explains the screen.
|
|
144
|
+
const compressed = compressConsumed(messages);
|
|
145
|
+
let after = 0;
|
|
146
|
+
for (const m of compressed) after += messageSize(m);
|
|
147
|
+
if (after <= MAX_HISTORY_CHARS) return {
|
|
148
|
+
messages: compressed,
|
|
149
|
+
droppedRounds: 0
|
|
150
|
+
};
|
|
151
|
+
total = after;
|
|
152
|
+
const out = [...compressed];
|
|
153
|
+
let droppedRounds = 0;
|
|
154
|
+
while (out.length > MIN_KEEP_MESSAGES && total > MAX_HISTORY_CHARS) {
|
|
155
|
+
total -= messageSize(out[0]);
|
|
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
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
messages: out,
|
|
165
|
+
droppedRounds
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Exported for the history tests; not part of the package surface. */
|
|
170
|
+
export function trimHistory(messages) {
|
|
171
|
+
return trimHistoryReport(messages).messages;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Trim the working history of a turn that is still running.
|
|
176
|
+
*
|
|
177
|
+
* Differs from `trimHistoryReport` in one way that matters: the CURRENT round
|
|
178
|
+
* is never touched. A turn's own user message and the reads it has taken since
|
|
179
|
+
* are the thing being answered, so compressing or dropping them would make the
|
|
180
|
+
* request cheaper and the answer wrong. Everything before the last user
|
|
181
|
+
* message is fair game, in the same order as always — compress, then drop.
|
|
182
|
+
*
|
|
183
|
+
* `reserve` is what the request costs BEFORE any messages: the tool
|
|
184
|
+
* definitions (~8k tokens for a typical install, ~23k with everything
|
|
185
|
+
* installed), the system prompt, and the reply the model is allowed to write.
|
|
186
|
+
* Budgeting messages alone would leave the biggest fixed cost out of the sum.
|
|
187
|
+
*/
|
|
188
|
+
export function budgetForRequest(messages, reserve) {
|
|
189
|
+
/**
|
|
190
|
+
* `MAX_HISTORY_CHARS` is a MESSAGES budget and always was — subtracting the
|
|
191
|
+
* reserve from it is wrong by a wide margin. The tool block alone is ~94,000
|
|
192
|
+
* characters with every tool installed, and the system prompt another
|
|
193
|
+
* ~16,000, so `150,000 - reserve` left about 24,000 characters for the
|
|
194
|
+
* conversation and dropped every earlier round of a two-turn chat. Caught by
|
|
195
|
+
* the bank, which is exactly what it is for.
|
|
196
|
+
*
|
|
197
|
+
* So the messages budget is the smaller of the two ceilings: the one that
|
|
198
|
+
* has always applied, and whatever is left of the whole-request ceiling once
|
|
199
|
+
* the fixed cost is counted. In an ordinary install the first wins and
|
|
200
|
+
* nothing changes; the second only bites when the tools are huge.
|
|
201
|
+
*/
|
|
202
|
+
const budget = Math.min(MAX_HISTORY_CHARS, MAX_REQUEST_CHARS - reserve);
|
|
203
|
+
let total = 0;
|
|
204
|
+
for (const m of messages) total += messageSize(m);
|
|
205
|
+
if (total <= budget) return {
|
|
206
|
+
messages,
|
|
207
|
+
droppedRounds: 0
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// Where the current round begins. Nothing from here on is eligible.
|
|
211
|
+
let currentRound = -1;
|
|
212
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
213
|
+
if (messages[i].role === "user") {
|
|
214
|
+
currentRound = i;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (currentRound <= 0) return {
|
|
219
|
+
messages,
|
|
220
|
+
droppedRounds: 0
|
|
221
|
+
};
|
|
222
|
+
const earlier = messages.slice(0, currentRound);
|
|
223
|
+
const current = messages.slice(currentRound);
|
|
224
|
+
let currentSize = 0;
|
|
225
|
+
for (const m of current) currentSize += messageSize(m);
|
|
226
|
+
const compressed = compressConsumed(earlier);
|
|
227
|
+
let earlierSize = 0;
|
|
228
|
+
for (const m of compressed) earlierSize += messageSize(m);
|
|
229
|
+
if (earlierSize + currentSize <= budget) {
|
|
230
|
+
return {
|
|
231
|
+
messages: [...compressed, ...current],
|
|
232
|
+
droppedRounds: 0
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const out = [...compressed];
|
|
236
|
+
let droppedRounds = 0;
|
|
237
|
+
while (out.length > 0 && earlierSize + currentSize > budget) {
|
|
238
|
+
earlierSize -= messageSize(out[0]);
|
|
239
|
+
out.shift();
|
|
240
|
+
while (out.length > 0 && out[0].role !== "user") {
|
|
241
|
+
earlierSize -= messageSize(out[0]);
|
|
242
|
+
out.shift();
|
|
243
|
+
}
|
|
244
|
+
droppedRounds += 1;
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
messages: [...out, ...current],
|
|
248
|
+
droppedRounds
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=historyBudget.js.map
|
|
@@ -0,0 +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","trimHistoryReport","total","droppedRounds","compressed","after","shift","trimHistory","budgetForRequest","reserve","budget","Math","min","currentRound","earlier","slice","current","currentSize","earlierSize"],"sourceRoot":"../../../src","sources":["engine/historyBudget.ts"],"mappings":"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","ignoreList":[]}
|