sliding-context 0.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.
- package/README.md +245 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +441 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/fixtures/messages.d.ts +9 -0
- package/dist/__tests__/fixtures/messages.d.ts.map +1 -0
- package/dist/__tests__/fixtures/messages.js +44 -0
- package/dist/__tests__/fixtures/messages.js.map +1 -0
- package/dist/__tests__/token-counter.test.d.ts +2 -0
- package/dist/__tests__/token-counter.test.d.ts.map +1 -0
- package/dist/__tests__/token-counter.test.js +123 -0
- package/dist/__tests__/token-counter.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +92 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/budget.d.ts +16 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +31 -0
- package/dist/budget.js.map +1 -0
- package/dist/context.d.ts +16 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +245 -0
- package/dist/context.js.map +1 -0
- package/dist/eviction.d.ts +14 -0
- package/dist/eviction.d.ts.map +1 -0
- package/dist/eviction.js +78 -0
- package/dist/eviction.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt.d.ts +6 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +28 -0
- package/dist/prompt.js.map +1 -0
- package/dist/serialization.d.ts +12 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +33 -0
- package/dist/serialization.js.map +1 -0
- package/dist/summarization.d.ts +13 -0
- package/dist/summarization.d.ts.map +1 -0
- package/dist/summarization.js +23 -0
- package/dist/summarization.js.map +1 -0
- package/dist/token-counter.d.ts +7 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +41 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/types.d.ts +72 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const context_1 = require("../context");
|
|
5
|
+
const token_counter_1 = require("../token-counter");
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function makeCtx(overrides = {}) {
|
|
10
|
+
return (0, context_1.createSlidingContext)({
|
|
11
|
+
tokenBudget: 2000,
|
|
12
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
13
|
+
...overrides,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async function addMany(ctx, messages) {
|
|
17
|
+
for (const m of messages) {
|
|
18
|
+
await ctx.addMessage(m);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function msg(role, content, extra = {}) {
|
|
22
|
+
return { role, content, ...extra };
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Basic addMessage / getMessages
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
(0, vitest_1.describe)('addMessage / getMessages basic flow', () => {
|
|
28
|
+
(0, vitest_1.it)('starts empty', () => {
|
|
29
|
+
const ctx = makeCtx();
|
|
30
|
+
(0, vitest_1.expect)(ctx.getMessages()).toEqual([]);
|
|
31
|
+
(0, vitest_1.expect)(ctx.getTokenCount()).toBe(0);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('returns messages in order after adding them', async () => {
|
|
34
|
+
const ctx = makeCtx();
|
|
35
|
+
await ctx.addMessage(msg('user', 'Hello'));
|
|
36
|
+
await ctx.addMessage(msg('assistant', 'Hi there'));
|
|
37
|
+
const messages = ctx.getMessages();
|
|
38
|
+
(0, vitest_1.expect)(messages).toHaveLength(2);
|
|
39
|
+
(0, vitest_1.expect)(messages[0].role).toBe('user');
|
|
40
|
+
(0, vitest_1.expect)(messages[1].role).toBe('assistant');
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)('prepends system prompt to getMessages', async () => {
|
|
43
|
+
const ctx = makeCtx({ systemPrompt: 'You are helpful.' });
|
|
44
|
+
await ctx.addMessage(msg('user', 'Hello'));
|
|
45
|
+
const messages = ctx.getMessages();
|
|
46
|
+
(0, vitest_1.expect)(messages[0].role).toBe('system');
|
|
47
|
+
(0, vitest_1.expect)(messages[0].content).toBe('You are helpful.');
|
|
48
|
+
(0, vitest_1.expect)(messages[1].role).toBe('user');
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('getTotalMessageCount includes system prompt', async () => {
|
|
51
|
+
const ctx = makeCtx({ systemPrompt: 'sys' });
|
|
52
|
+
await ctx.addMessage(msg('user', 'hi'));
|
|
53
|
+
(0, vitest_1.expect)(ctx.getTotalMessageCount()).toBe(2); // system + user
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('getRecentMessageCount excludes system prompt', async () => {
|
|
56
|
+
const ctx = makeCtx({ systemPrompt: 'sys' });
|
|
57
|
+
await ctx.addMessage(msg('user', 'hi'));
|
|
58
|
+
await ctx.addMessage(msg('assistant', 'hello'));
|
|
59
|
+
(0, vitest_1.expect)(ctx.getRecentMessageCount()).toBe(2);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Token counting
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
(0, vitest_1.describe)('getTokenCount / getTokenBreakdown', () => {
|
|
66
|
+
(0, vitest_1.it)('reports non-zero token count after adding messages', async () => {
|
|
67
|
+
const ctx = makeCtx({ systemPrompt: 'You are helpful.' });
|
|
68
|
+
await ctx.addMessage(msg('user', 'What time is it?'));
|
|
69
|
+
const count = ctx.getTokenCount();
|
|
70
|
+
(0, vitest_1.expect)(count).toBeGreaterThan(0);
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)('getTokenBreakdown sums to total', async () => {
|
|
73
|
+
const ctx = makeCtx({ systemPrompt: 'sys' });
|
|
74
|
+
await ctx.addMessage(msg('user', 'hello'));
|
|
75
|
+
await ctx.addMessage(msg('assistant', 'world'));
|
|
76
|
+
const bd = ctx.getTokenBreakdown();
|
|
77
|
+
(0, vitest_1.expect)(bd.total).toBe(bd.system + bd.anchor + bd.summary + bd.recent);
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('system tokens are non-zero when system prompt provided', async () => {
|
|
80
|
+
const ctx = makeCtx({ systemPrompt: 'You are a helpful assistant.' });
|
|
81
|
+
const bd = ctx.getTokenBreakdown();
|
|
82
|
+
(0, vitest_1.expect)(bd.system).toBeGreaterThan(0);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('anchor tokens are 0 when no anchor set', async () => {
|
|
85
|
+
const ctx = makeCtx();
|
|
86
|
+
await ctx.addMessage(msg('user', 'hi'));
|
|
87
|
+
const bd = ctx.getTokenBreakdown();
|
|
88
|
+
(0, vitest_1.expect)(bd.anchor).toBe(0);
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)('anchor tokens increase after setAnchor', async () => {
|
|
91
|
+
const ctx = makeCtx();
|
|
92
|
+
ctx.setAnchor([msg('system', 'Important context.')]);
|
|
93
|
+
const bd = ctx.getTokenBreakdown();
|
|
94
|
+
(0, vitest_1.expect)(bd.anchor).toBeGreaterThan(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Token budget enforcement / eviction
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
(0, vitest_1.describe)('token budget enforcement', () => {
|
|
101
|
+
(0, vitest_1.it)('evicts oldest messages from recent zone when over budget', async () => {
|
|
102
|
+
// budget=200, each message is ceil(200/4)+4 = 54 tokens.
|
|
103
|
+
// targetRecent = 200 (no system, no summary, no summarizer).
|
|
104
|
+
// After 4 messages (216 tokens) eviction fires and moves oldest to pending.
|
|
105
|
+
// getMessages() still returns all messages (pending + recent) until summarized.
|
|
106
|
+
// But the *recent* zone (recentMessages array) should be trimmed.
|
|
107
|
+
const ctx = makeCtx({ tokenBudget: 200 });
|
|
108
|
+
const bigContent = 'a'.repeat(200); // 54 tokens per message
|
|
109
|
+
for (let i = 0; i < 10; i++) {
|
|
110
|
+
await ctx.addMessage(msg('user', bigContent));
|
|
111
|
+
}
|
|
112
|
+
// With a summarizer absent, evicted messages go to pending buffer and still appear
|
|
113
|
+
// in getMessages(). The key invariant is that recent zone is within budget.
|
|
114
|
+
// Without a summarizer, evicted messages go to pendingBuffer and still appear
|
|
115
|
+
// in getMessages(). Verify eviction happened by checking pendingBuffer.
|
|
116
|
+
const state = ctx.serialize();
|
|
117
|
+
(0, vitest_1.expect)(state.pendingBuffer.length).toBeGreaterThan(0);
|
|
118
|
+
});
|
|
119
|
+
(0, vitest_1.it)('recent zone token count stays near budget target with summarizer', async () => {
|
|
120
|
+
// With a summarizer, pending buffer is cleared after summarization,
|
|
121
|
+
// so total tokens drop below budget.
|
|
122
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('compact summary');
|
|
123
|
+
const ctx = makeCtx({
|
|
124
|
+
tokenBudget: 300,
|
|
125
|
+
summarizer,
|
|
126
|
+
summarizeThresholdMessages: 2,
|
|
127
|
+
});
|
|
128
|
+
const bigContent = 'x'.repeat(200); // 54 tokens + 4 = 54 tokens/msg
|
|
129
|
+
for (let i = 0; i < 8; i++) {
|
|
130
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', bigContent));
|
|
131
|
+
}
|
|
132
|
+
// After summarization, pending buffer is cleared and total should be within budget.
|
|
133
|
+
if (summarizer.mock.calls.length > 0) {
|
|
134
|
+
const count = ctx.getTokenCount();
|
|
135
|
+
(0, vitest_1.expect)(count).toBeLessThanOrEqual(300);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('setTokenBudget reduces budget and triggers eviction into pending', async () => {
|
|
139
|
+
const ctx = makeCtx({ tokenBudget: 2000 });
|
|
140
|
+
// Add several small messages that all fit comfortably.
|
|
141
|
+
for (let i = 0; i < 5; i++) {
|
|
142
|
+
await ctx.addMessage(msg('user', 'a'.repeat(200)));
|
|
143
|
+
}
|
|
144
|
+
const state1 = ctx.serialize();
|
|
145
|
+
(0, vitest_1.expect)(state1.pendingBuffer.length).toBe(0);
|
|
146
|
+
ctx.setTokenBudget(200); // Very small budget — forces eviction.
|
|
147
|
+
// Give async enforceBudget a tick to run.
|
|
148
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
149
|
+
const state2 = ctx.serialize();
|
|
150
|
+
// Evicted messages should now be in pendingBuffer.
|
|
151
|
+
(0, vitest_1.expect)(state2.pendingBuffer.length).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Tool call pair atomicity
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
(0, vitest_1.describe)('tool call pair atomicity', () => {
|
|
158
|
+
(0, vitest_1.it)('never evicts a tool_calls message without its paired tool result', async () => {
|
|
159
|
+
// Create a scenario where eviction must happen, and the oldest messages
|
|
160
|
+
// include a tool-call pair. Both must be evicted together.
|
|
161
|
+
const ctx = makeCtx({ tokenBudget: 400 });
|
|
162
|
+
const toolCall = {
|
|
163
|
+
role: 'assistant',
|
|
164
|
+
content: '',
|
|
165
|
+
tool_calls: [
|
|
166
|
+
{
|
|
167
|
+
id: 'call_abc',
|
|
168
|
+
type: 'function',
|
|
169
|
+
function: { name: 'search', arguments: '{"q":"test"}' },
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
};
|
|
173
|
+
const toolResult = {
|
|
174
|
+
role: 'tool',
|
|
175
|
+
content: 'result data',
|
|
176
|
+
tool_call_id: 'call_abc',
|
|
177
|
+
};
|
|
178
|
+
await ctx.addMessage(msg('user', 'Use a tool please'));
|
|
179
|
+
await ctx.addMessage(toolCall);
|
|
180
|
+
await ctx.addMessage(toolResult);
|
|
181
|
+
// Add a lot more messages to force eviction of the initial ones.
|
|
182
|
+
for (let i = 0; i < 8; i++) {
|
|
183
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(100)));
|
|
184
|
+
}
|
|
185
|
+
const messages = ctx.getMessages();
|
|
186
|
+
// Find any tool_calls messages and verify their results are present too.
|
|
187
|
+
for (const m of messages) {
|
|
188
|
+
if (m.tool_calls && m.tool_calls.length > 0) {
|
|
189
|
+
for (const tc of m.tool_calls) {
|
|
190
|
+
const resultPresent = messages.some((r) => r.role === 'tool' && r.tool_call_id === tc.id);
|
|
191
|
+
(0, vitest_1.expect)(resultPresent).toBe(true);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
(0, vitest_1.it)('tool pair stays together when one half would need eviction without the other', async () => {
|
|
197
|
+
// Force eviction to happen and verify the invariant holds after.
|
|
198
|
+
const ctx = makeCtx({ tokenBudget: 300 });
|
|
199
|
+
const toolCallMsg = {
|
|
200
|
+
role: 'assistant',
|
|
201
|
+
content: '',
|
|
202
|
+
tool_calls: [
|
|
203
|
+
{ id: 'tc_1', type: 'function', function: { name: 'fn', arguments: '{}' } },
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
const toolResultMsg = { role: 'tool', content: 'ok', tool_call_id: 'tc_1' };
|
|
207
|
+
await ctx.addMessage(msg('user', 'start'));
|
|
208
|
+
await ctx.addMessage(toolCallMsg);
|
|
209
|
+
await ctx.addMessage(toolResultMsg);
|
|
210
|
+
// Force eviction.
|
|
211
|
+
for (let i = 0; i < 6; i++) {
|
|
212
|
+
await ctx.addMessage(msg('user', 'a'.repeat(100)));
|
|
213
|
+
}
|
|
214
|
+
const result = ctx.getMessages();
|
|
215
|
+
const toolCallsInResult = result.filter((m) => m.tool_calls && m.tool_calls.length > 0);
|
|
216
|
+
for (const m of toolCallsInResult) {
|
|
217
|
+
for (const tc of m.tool_calls) {
|
|
218
|
+
const matched = result.some((r) => r.role === 'tool' && r.tool_call_id === tc.id);
|
|
219
|
+
(0, vitest_1.expect)(matched).toBe(true);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// clear()
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
(0, vitest_1.describe)('clear()', () => {
|
|
228
|
+
(0, vitest_1.it)('resets messages, summary, and token counts', async () => {
|
|
229
|
+
const ctx = makeCtx({ systemPrompt: 'sys' });
|
|
230
|
+
await ctx.addMessage(msg('user', 'hello'));
|
|
231
|
+
await ctx.addMessage(msg('assistant', 'world'));
|
|
232
|
+
ctx.clear();
|
|
233
|
+
(0, vitest_1.expect)(ctx.getRecentMessageCount()).toBe(0);
|
|
234
|
+
(0, vitest_1.expect)(ctx.getSummary()).toBeUndefined();
|
|
235
|
+
// System prompt should still be there.
|
|
236
|
+
const messages = ctx.getMessages();
|
|
237
|
+
(0, vitest_1.expect)(messages).toHaveLength(1);
|
|
238
|
+
(0, vitest_1.expect)(messages[0].content).toBe('sys');
|
|
239
|
+
});
|
|
240
|
+
(0, vitest_1.it)('getTokenCount after clear equals system token cost only', async () => {
|
|
241
|
+
const ctx = makeCtx({ systemPrompt: 'sys' });
|
|
242
|
+
await addMany(ctx, [msg('user', 'hi'), msg('assistant', 'hello')]);
|
|
243
|
+
const tokensBefore = ctx.getTokenCount();
|
|
244
|
+
ctx.clear();
|
|
245
|
+
const tokensAfter = ctx.getTokenCount();
|
|
246
|
+
(0, vitest_1.expect)(tokensAfter).toBeLessThan(tokensBefore);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// serialize / deserialize roundtrip
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
(0, vitest_1.describe)('serialize / deserialize roundtrip', () => {
|
|
253
|
+
(0, vitest_1.it)('serialize returns a ContextState with version 1', async () => {
|
|
254
|
+
const ctx = makeCtx();
|
|
255
|
+
await ctx.addMessage(msg('user', 'hello'));
|
|
256
|
+
const state = ctx.serialize();
|
|
257
|
+
(0, vitest_1.expect)(state.version).toBe(1);
|
|
258
|
+
(0, vitest_1.expect)(state.messages).toHaveLength(1);
|
|
259
|
+
(0, vitest_1.expect)(state.messages[0].content).toBe('hello');
|
|
260
|
+
});
|
|
261
|
+
(0, vitest_1.it)('serializeContext produces a JSON string', async () => {
|
|
262
|
+
const ctx = makeCtx();
|
|
263
|
+
await ctx.addMessage(msg('user', 'hello'));
|
|
264
|
+
const json = (0, context_1.serializeContext)(ctx);
|
|
265
|
+
(0, vitest_1.expect)(typeof json).toBe('string');
|
|
266
|
+
const parsed = JSON.parse(json);
|
|
267
|
+
(0, vitest_1.expect)(parsed.version).toBe(1);
|
|
268
|
+
});
|
|
269
|
+
(0, vitest_1.it)('restoreSlidingContext reproduces exact message list', async () => {
|
|
270
|
+
const opts = {
|
|
271
|
+
tokenBudget: 2000,
|
|
272
|
+
systemPrompt: 'You are helpful.',
|
|
273
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
274
|
+
};
|
|
275
|
+
const ctx = (0, context_1.createSlidingContext)(opts);
|
|
276
|
+
await ctx.addMessage(msg('user', 'What is the capital of France?'));
|
|
277
|
+
await ctx.addMessage(msg('assistant', 'Paris.'));
|
|
278
|
+
const json = (0, context_1.serializeContext)(ctx);
|
|
279
|
+
const ctx2 = (0, context_1.restoreSlidingContext)(json, opts);
|
|
280
|
+
const orig = ctx.getMessages();
|
|
281
|
+
const restored = ctx2.getMessages();
|
|
282
|
+
(0, vitest_1.expect)(restored).toEqual(orig);
|
|
283
|
+
});
|
|
284
|
+
(0, vitest_1.it)('restoreSlidingContext preserves summary', async () => {
|
|
285
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('Summary text');
|
|
286
|
+
const opts = {
|
|
287
|
+
tokenBudget: 200,
|
|
288
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
289
|
+
summarizer,
|
|
290
|
+
summarizeThresholdMessages: 3,
|
|
291
|
+
};
|
|
292
|
+
const ctx = (0, context_1.createSlidingContext)(opts);
|
|
293
|
+
// Add enough messages to overflow budget and trigger summarization.
|
|
294
|
+
for (let i = 0; i < 10; i++) {
|
|
295
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
296
|
+
}
|
|
297
|
+
const json = (0, context_1.serializeContext)(ctx);
|
|
298
|
+
const ctx2 = (0, context_1.restoreSlidingContext)(json, opts);
|
|
299
|
+
(0, vitest_1.expect)(ctx2.getSummary()).toBe(ctx.getSummary());
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
// setTokenBudget
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
(0, vitest_1.describe)('setTokenBudget', () => {
|
|
306
|
+
(0, vitest_1.it)('throws for budget < 100', () => {
|
|
307
|
+
const ctx = makeCtx();
|
|
308
|
+
(0, vitest_1.expect)(() => ctx.setTokenBudget(50)).toThrow(RangeError);
|
|
309
|
+
});
|
|
310
|
+
(0, vitest_1.it)('throws for non-finite budget', () => {
|
|
311
|
+
const ctx = makeCtx();
|
|
312
|
+
(0, vitest_1.expect)(() => ctx.setTokenBudget(Infinity)).toThrow(RangeError);
|
|
313
|
+
});
|
|
314
|
+
(0, vitest_1.it)('accepts valid budget', () => {
|
|
315
|
+
const ctx = makeCtx();
|
|
316
|
+
(0, vitest_1.expect)(() => ctx.setTokenBudget(500)).not.toThrow();
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// Summarizer integration
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
(0, vitest_1.describe)('summarizer integration', () => {
|
|
323
|
+
(0, vitest_1.it)('calls summarizer when pending buffer exceeds threshold', async () => {
|
|
324
|
+
// budget=200, each msg=54 tokens. targetRecent=200.
|
|
325
|
+
// After 4 msgs eviction fires. threshold=3 msgs in pending → summarizer called.
|
|
326
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('Compact summary');
|
|
327
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
328
|
+
tokenBudget: 200,
|
|
329
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
330
|
+
summarizer,
|
|
331
|
+
summarizeThresholdMessages: 3,
|
|
332
|
+
});
|
|
333
|
+
// Add messages that overflow the budget to trigger eviction then summarization.
|
|
334
|
+
for (let i = 0; i < 10; i++) {
|
|
335
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
336
|
+
}
|
|
337
|
+
(0, vitest_1.expect)(summarizer).toHaveBeenCalled();
|
|
338
|
+
});
|
|
339
|
+
(0, vitest_1.it)('getSummary returns the summarizer result after summarization', async () => {
|
|
340
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('The summary content');
|
|
341
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
342
|
+
tokenBudget: 200,
|
|
343
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
344
|
+
summarizer,
|
|
345
|
+
summarizeThresholdMessages: 3,
|
|
346
|
+
});
|
|
347
|
+
for (let i = 0; i < 10; i++) {
|
|
348
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
349
|
+
}
|
|
350
|
+
(0, vitest_1.expect)(ctx.getSummary()).toBe('The summary content');
|
|
351
|
+
});
|
|
352
|
+
(0, vitest_1.it)('summary appears in getMessages output after summarization', async () => {
|
|
353
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('Rolling summary');
|
|
354
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
355
|
+
tokenBudget: 200,
|
|
356
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
357
|
+
summarizer,
|
|
358
|
+
summarizeThresholdMessages: 3,
|
|
359
|
+
summaryRole: 'system',
|
|
360
|
+
});
|
|
361
|
+
for (let i = 0; i < 10; i++) {
|
|
362
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
363
|
+
}
|
|
364
|
+
const messages = ctx.getMessages();
|
|
365
|
+
const summaryMsg = messages.find((m) => m.role === 'system' && m.content === 'Rolling summary');
|
|
366
|
+
(0, vitest_1.expect)(summaryMsg).toBeDefined();
|
|
367
|
+
});
|
|
368
|
+
(0, vitest_1.it)('calls summarizer with existing summary on second round', async () => {
|
|
369
|
+
const summarizer = vitest_1.vi
|
|
370
|
+
.fn()
|
|
371
|
+
.mockResolvedValueOnce('First summary')
|
|
372
|
+
.mockResolvedValueOnce('Second summary');
|
|
373
|
+
// budget=200, threshold=2 msgs → summarizes early.
|
|
374
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
375
|
+
tokenBudget: 200,
|
|
376
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
377
|
+
summarizer,
|
|
378
|
+
summarizeThresholdMessages: 2,
|
|
379
|
+
});
|
|
380
|
+
// First round of eviction + summarization.
|
|
381
|
+
for (let i = 0; i < 8; i++) {
|
|
382
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
383
|
+
}
|
|
384
|
+
// Second round.
|
|
385
|
+
for (let i = 0; i < 8; i++) {
|
|
386
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'b'.repeat(200)));
|
|
387
|
+
}
|
|
388
|
+
if (summarizer.mock.calls.length > 1) {
|
|
389
|
+
const secondCall = summarizer.mock.calls[1];
|
|
390
|
+
// existingSummary should be 'First summary' on the second round.
|
|
391
|
+
(0, vitest_1.expect)(secondCall[1]).toBe('First summary');
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
(0, vitest_1.it)('onSummarize hook is called after successful summarization', async () => {
|
|
395
|
+
const onSummarize = vitest_1.vi.fn();
|
|
396
|
+
const summarizer = vitest_1.vi.fn().mockResolvedValue('summary text');
|
|
397
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
398
|
+
tokenBudget: 200,
|
|
399
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
400
|
+
summarizer,
|
|
401
|
+
summarizeThresholdMessages: 3,
|
|
402
|
+
hooks: { onSummarize },
|
|
403
|
+
});
|
|
404
|
+
for (let i = 0; i < 10; i++) {
|
|
405
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
406
|
+
}
|
|
407
|
+
(0, vitest_1.expect)(onSummarize).toHaveBeenCalled();
|
|
408
|
+
});
|
|
409
|
+
(0, vitest_1.it)('onEvict hook is called when messages are evicted', async () => {
|
|
410
|
+
const onEvict = vitest_1.vi.fn();
|
|
411
|
+
// budget=200, each msg=54 tokens. 4 msgs = 216 > 200 → eviction fires.
|
|
412
|
+
const ctx = (0, context_1.createSlidingContext)({
|
|
413
|
+
tokenBudget: 200,
|
|
414
|
+
tokenCounter: token_counter_1.approximateTokenCounter,
|
|
415
|
+
hooks: { onEvict },
|
|
416
|
+
});
|
|
417
|
+
for (let i = 0; i < 10; i++) {
|
|
418
|
+
await ctx.addMessage(msg(i % 2 === 0 ? 'user' : 'assistant', 'a'.repeat(200)));
|
|
419
|
+
}
|
|
420
|
+
(0, vitest_1.expect)(onEvict).toHaveBeenCalled();
|
|
421
|
+
const [evictedMessages, reason] = onEvict.mock.calls[0];
|
|
422
|
+
(0, vitest_1.expect)(Array.isArray(evictedMessages)).toBe(true);
|
|
423
|
+
(0, vitest_1.expect)(reason).toBe('budget');
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
// ---------------------------------------------------------------------------
|
|
427
|
+
// Constructor validation
|
|
428
|
+
// ---------------------------------------------------------------------------
|
|
429
|
+
(0, vitest_1.describe)('createSlidingContext validation', () => {
|
|
430
|
+
(0, vitest_1.it)('throws RangeError for tokenBudget < 100', () => {
|
|
431
|
+
(0, vitest_1.expect)(() => (0, context_1.createSlidingContext)({ tokenBudget: 99 })).toThrow(RangeError);
|
|
432
|
+
});
|
|
433
|
+
(0, vitest_1.it)('throws RangeError for non-finite tokenBudget', () => {
|
|
434
|
+
(0, vitest_1.expect)(() => (0, context_1.createSlidingContext)({ tokenBudget: NaN })).toThrow(RangeError);
|
|
435
|
+
(0, vitest_1.expect)(() => (0, context_1.createSlidingContext)({ tokenBudget: Infinity })).toThrow(RangeError);
|
|
436
|
+
});
|
|
437
|
+
(0, vitest_1.it)('does not throw for tokenBudget === 100', () => {
|
|
438
|
+
(0, vitest_1.expect)(() => (0, context_1.createSlidingContext)({ tokenBudget: 100 })).not.toThrow();
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Message } from '../../types';
|
|
2
|
+
export declare const systemMessage: Message;
|
|
3
|
+
export declare const userMessage: Message;
|
|
4
|
+
export declare const assistantMessage: Message;
|
|
5
|
+
export declare const toolCallMessage: Message;
|
|
6
|
+
export declare const toolResultMessage: Message;
|
|
7
|
+
export declare const shortConversation: Message[];
|
|
8
|
+
export declare const longConversation: Message[];
|
|
9
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,aAAa,EAAE,OAG3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAGzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,OAG9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAa7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,OAI/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAItC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,OAAO,EAGxB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.longConversation = exports.shortConversation = exports.toolResultMessage = exports.toolCallMessage = exports.assistantMessage = exports.userMessage = exports.systemMessage = void 0;
|
|
4
|
+
exports.systemMessage = {
|
|
5
|
+
role: 'system',
|
|
6
|
+
content: 'You are a helpful assistant.',
|
|
7
|
+
};
|
|
8
|
+
exports.userMessage = {
|
|
9
|
+
role: 'user',
|
|
10
|
+
content: 'Hello!',
|
|
11
|
+
};
|
|
12
|
+
exports.assistantMessage = {
|
|
13
|
+
role: 'assistant',
|
|
14
|
+
content: 'Hi there!',
|
|
15
|
+
};
|
|
16
|
+
exports.toolCallMessage = {
|
|
17
|
+
role: 'assistant',
|
|
18
|
+
content: '',
|
|
19
|
+
tool_calls: [
|
|
20
|
+
{
|
|
21
|
+
id: 'call_abc123',
|
|
22
|
+
type: 'function',
|
|
23
|
+
function: {
|
|
24
|
+
name: 'get_weather',
|
|
25
|
+
arguments: '{"location":"London"}',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
exports.toolResultMessage = {
|
|
31
|
+
role: 'tool',
|
|
32
|
+
content: 'The weather in London is 15°C and cloudy.',
|
|
33
|
+
tool_call_id: 'call_abc123',
|
|
34
|
+
};
|
|
35
|
+
exports.shortConversation = [
|
|
36
|
+
exports.systemMessage,
|
|
37
|
+
exports.userMessage,
|
|
38
|
+
exports.assistantMessage,
|
|
39
|
+
];
|
|
40
|
+
exports.longConversation = Array.from({ length: 20 }, (_, i) => ({
|
|
41
|
+
role: i % 2 === 0 ? 'user' : 'assistant',
|
|
42
|
+
content: `Message number ${i + 1}`,
|
|
43
|
+
}));
|
|
44
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/__tests__/fixtures/messages.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAY;IACpC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,8BAA8B;CACxC,CAAC;AAEW,QAAA,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEW,QAAA,gBAAgB,GAAY;IACvC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEW,QAAA,eAAe,GAAY;IACtC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,EAAE;IACX,UAAU,EAAE;QACV;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,uBAAuB;aACnC;SACF;KACF;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAY;IACxC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,2CAA2C;IACpD,YAAY,EAAE,aAAa;CAC5B,CAAC;AAEW,QAAA,iBAAiB,GAAc;IAC1C,qBAAa;IACb,mBAAW;IACX,wBAAgB;CACjB,CAAC;AAEW,QAAA,gBAAgB,GAAc,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;IACxC,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE;CACvB,CAAA,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/token-counter.test.ts"],"names":[],"mappings":""}
|