@animalabs/context-manager 0.4.0 → 0.5.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/dist/src/adaptive/chunker.d.ts +70 -0
- package/dist/src/adaptive/chunker.d.ts.map +1 -0
- package/dist/src/adaptive/chunker.js +233 -0
- package/dist/src/adaptive/chunker.js.map +1 -0
- package/dist/src/adaptive/folding-strategy.d.ts +118 -0
- package/dist/src/adaptive/folding-strategy.d.ts.map +1 -0
- package/dist/src/adaptive/folding-strategy.js +12 -0
- package/dist/src/adaptive/folding-strategy.js.map +1 -0
- package/dist/src/adaptive/index.d.ts +17 -0
- package/dist/src/adaptive/index.d.ts.map +1 -0
- package/dist/src/adaptive/index.js +23 -0
- package/dist/src/adaptive/index.js.map +1 -0
- package/dist/src/adaptive/picker.d.ts +103 -0
- package/dist/src/adaptive/picker.d.ts.map +1 -0
- package/dist/src/adaptive/picker.js +357 -0
- package/dist/src/adaptive/picker.js.map +1 -0
- package/dist/src/adaptive/render.d.ts +39 -0
- package/dist/src/adaptive/render.d.ts.map +1 -0
- package/dist/src/adaptive/render.js +104 -0
- package/dist/src/adaptive/render.js.map +1 -0
- package/dist/src/adaptive/strategies/flat-profile.d.ts +19 -0
- package/dist/src/adaptive/strategies/flat-profile.d.ts.map +1 -0
- package/dist/src/adaptive/strategies/flat-profile.js +86 -0
- package/dist/src/adaptive/strategies/flat-profile.js.map +1 -0
- package/dist/src/adaptive/strategies/oldest-first.d.ts +19 -0
- package/dist/src/adaptive/strategies/oldest-first.d.ts.map +1 -0
- package/dist/src/adaptive/strategies/oldest-first.js +39 -0
- package/dist/src/adaptive/strategies/oldest-first.js.map +1 -0
- package/dist/src/context-manager.d.ts +5 -0
- package/dist/src/context-manager.d.ts.map +1 -1
- package/dist/src/context-manager.js +22 -0
- package/dist/src/context-manager.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/message-store.d.ts +36 -1
- package/dist/src/message-store.d.ts.map +1 -1
- package/dist/src/message-store.js +134 -8
- package/dist/src/message-store.js.map +1 -1
- package/dist/src/strategies/autobiographical.d.ts +217 -2
- package/dist/src/strategies/autobiographical.d.ts.map +1 -1
- package/dist/src/strategies/autobiographical.js +1479 -37
- package/dist/src/strategies/autobiographical.js.map +1 -1
- package/dist/src/strategies/index.d.ts +1 -1
- package/dist/src/strategies/index.d.ts.map +1 -1
- package/dist/src/strategies/index.js.map +1 -1
- package/dist/src/types/message.d.ts +38 -0
- package/dist/src/types/message.d.ts.map +1 -1
- package/dist/src/types/strategy.d.ts +94 -10
- package/dist/src/types/strategy.d.ts.map +1 -1
- package/dist/src/types/strategy.js +7 -0
- package/dist/src/types/strategy.js.map +1 -1
- package/dist/test/adaptive/branching.test.d.ts +20 -0
- package/dist/test/adaptive/branching.test.d.ts.map +1 -0
- package/dist/test/adaptive/branching.test.js +176 -0
- package/dist/test/adaptive/branching.test.js.map +1 -0
- package/dist/test/adaptive/chunker.test.d.ts +2 -0
- package/dist/test/adaptive/chunker.test.d.ts.map +1 -0
- package/dist/test/adaptive/chunker.test.js +120 -0
- package/dist/test/adaptive/chunker.test.js.map +1 -0
- package/dist/test/adaptive/deep-levels.test.d.ts +10 -0
- package/dist/test/adaptive/deep-levels.test.d.ts.map +1 -0
- package/dist/test/adaptive/deep-levels.test.js +167 -0
- package/dist/test/adaptive/deep-levels.test.js.map +1 -0
- package/dist/test/adaptive/doc-plus-chat.test.d.ts +10 -0
- package/dist/test/adaptive/doc-plus-chat.test.d.ts.map +1 -0
- package/dist/test/adaptive/doc-plus-chat.test.js +194 -0
- package/dist/test/adaptive/doc-plus-chat.test.js.map +1 -0
- package/dist/test/adaptive/hard-fail.test.d.ts +9 -0
- package/dist/test/adaptive/hard-fail.test.d.ts.map +1 -0
- package/dist/test/adaptive/hard-fail.test.js +154 -0
- package/dist/test/adaptive/hard-fail.test.js.map +1 -0
- package/dist/test/adaptive/harness.d.ts +109 -0
- package/dist/test/adaptive/harness.d.ts.map +1 -0
- package/dist/test/adaptive/harness.js +263 -0
- package/dist/test/adaptive/harness.js.map +1 -0
- package/dist/test/adaptive/ingestion.test.d.ts +13 -0
- package/dist/test/adaptive/ingestion.test.d.ts.map +1 -0
- package/dist/test/adaptive/ingestion.test.js +306 -0
- package/dist/test/adaptive/ingestion.test.js.map +1 -0
- package/dist/test/adaptive/integration.test.d.ts +12 -0
- package/dist/test/adaptive/integration.test.d.ts.map +1 -0
- package/dist/test/adaptive/integration.test.js +247 -0
- package/dist/test/adaptive/integration.test.js.map +1 -0
- package/dist/test/adaptive/long-chronicle.test.d.ts +13 -0
- package/dist/test/adaptive/long-chronicle.test.d.ts.map +1 -0
- package/dist/test/adaptive/long-chronicle.test.js +186 -0
- package/dist/test/adaptive/long-chronicle.test.js.map +1 -0
- package/dist/test/adaptive/persistence.test.d.ts +11 -0
- package/dist/test/adaptive/persistence.test.d.ts.map +1 -0
- package/dist/test/adaptive/persistence.test.js +200 -0
- package/dist/test/adaptive/persistence.test.js.map +1 -0
- package/dist/test/adaptive/picker.test.d.ts +2 -0
- package/dist/test/adaptive/picker.test.d.ts.map +1 -0
- package/dist/test/adaptive/picker.test.js +333 -0
- package/dist/test/adaptive/picker.test.js.map +1 -0
- package/dist/test/adaptive/render.test.d.ts +2 -0
- package/dist/test/adaptive/render.test.d.ts.map +1 -0
- package/dist/test/adaptive/render.test.js +109 -0
- package/dist/test/adaptive/render.test.js.map +1 -0
- package/dist/test/adaptive/shard-immutability.test.d.ts +14 -0
- package/dist/test/adaptive/shard-immutability.test.d.ts.map +1 -0
- package/dist/test/adaptive/shard-immutability.test.js +184 -0
- package/dist/test/adaptive/shard-immutability.test.js.map +1 -0
- package/dist/test/adaptive/strategy-integration.test.d.ts +9 -0
- package/dist/test/adaptive/strategy-integration.test.d.ts.map +1 -0
- package/dist/test/adaptive/strategy-integration.test.js +293 -0
- package/dist/test/adaptive/strategy-integration.test.js.map +1 -0
- package/dist/test/message-store-sequence.test.d.ts +25 -0
- package/dist/test/message-store-sequence.test.d.ts.map +1 -0
- package/dist/test/message-store-sequence.test.js +157 -0
- package/dist/test/message-store-sequence.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adaptive/chunker.ts +323 -0
- package/src/adaptive/folding-strategy.ts +129 -0
- package/src/adaptive/index.ts +51 -0
- package/src/adaptive/picker.ts +442 -0
- package/src/adaptive/render.ts +115 -0
- package/src/adaptive/strategies/flat-profile.ts +96 -0
- package/src/adaptive/strategies/oldest-first.ts +48 -0
- package/src/context-manager.ts +32 -0
- package/src/index.ts +1 -1
- package/src/message-store.ts +147 -8
- package/src/strategies/autobiographical.ts +1586 -38
- package/src/strategies/index.ts +1 -1
- package/src/types/message.ts +43 -0
- package/src/types/strategy.ts +109 -10
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for the adaptive-resolution picker.
|
|
3
|
+
*
|
|
4
|
+
* These simulate realistic scenarios over many turns and verify the
|
|
5
|
+
* design's claimed properties end-to-end:
|
|
6
|
+
* - 500K-doc ingestion + first compile fits in budget
|
|
7
|
+
* - 200-turn growth with picker firing only as needed
|
|
8
|
+
* - Monotonic cache stickiness (a chunk's resolution only ever rises)
|
|
9
|
+
* - Group-fold operates correctly through chained levels
|
|
10
|
+
*/
|
|
11
|
+
import { test } from 'node:test';
|
|
12
|
+
import assert from 'node:assert/strict';
|
|
13
|
+
import { Picker } from '../../src/adaptive/picker.js';
|
|
14
|
+
import { FlatProfileStrategy } from '../../src/adaptive/strategies/flat-profile.js';
|
|
15
|
+
import { chunkMessage } from '../../src/adaptive/chunker.js';
|
|
16
|
+
import { MockChronicle } from './harness.js';
|
|
17
|
+
const BUDGET = (totalBudget, slack = 0.1) => ({
|
|
18
|
+
totalBudget,
|
|
19
|
+
targetBudget: totalBudget * (1 - slack),
|
|
20
|
+
slack,
|
|
21
|
+
});
|
|
22
|
+
test('integration: 500K doc ingested as shards + picker folds to fit 30K budget', () => {
|
|
23
|
+
// Synthetic 500K-char body. Real 500K-token doc would be ~2M chars.
|
|
24
|
+
// We use char-equivalent here for test speed; chunker uses charsPerToken=4 by default.
|
|
25
|
+
const synthetic500K = Array.from({ length: 125 }, (_, i) => {
|
|
26
|
+
return `## Section ${i}\n\n` + 'Lorem ipsum dolor sit amet. '.repeat(140); // ~3920 chars per section ≈ 4K chars ≈ 1K tokens
|
|
27
|
+
}).join('\n\n');
|
|
28
|
+
// Chunk
|
|
29
|
+
const sharded = chunkMessage(synthetic500K, { chunkThreshold: 8192, chunkSize: 4096, charsPerToken: 4 });
|
|
30
|
+
assert.equal(sharded.wasSharded, true);
|
|
31
|
+
const shardCount = sharded.shards.length;
|
|
32
|
+
assert.ok(shardCount >= 30, `expected ≥30 shards from 500K-char synthetic doc, got ${shardCount}`);
|
|
33
|
+
// Build chronicle
|
|
34
|
+
const chronicle = new MockChronicle({ mergeThreshold: 6, recallPairTokens: 200 });
|
|
35
|
+
for (const s of sharded.shards) {
|
|
36
|
+
chronicle.addChunk({
|
|
37
|
+
id: `doc-${s.index.toString().padStart(4, '0')}`,
|
|
38
|
+
rawTokens: s.approxTokens,
|
|
39
|
+
bodyGroupId: sharded.bodyGroupId,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Pre-produce summaries (mimics the speculative pre-producer running at ingestion)
|
|
43
|
+
for (let i = 0; i < chronicle.chunks.length; i += chronicle.mergeThreshold) {
|
|
44
|
+
chronicle.produceL1(chronicle.chunks.slice(i, i + chronicle.mergeThreshold).map((c) => c.id));
|
|
45
|
+
}
|
|
46
|
+
chronicle.preProduceUpperLevels();
|
|
47
|
+
// Compile with budget 30K
|
|
48
|
+
const tailInfo = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 0 });
|
|
49
|
+
const picker = new Picker(new FlatProfileStrategy());
|
|
50
|
+
const result = picker.run({
|
|
51
|
+
chunks: chronicle.chunks,
|
|
52
|
+
summaries: chronicle.summaries,
|
|
53
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
54
|
+
...tailInfo,
|
|
55
|
+
}, BUDGET(30_000));
|
|
56
|
+
// Should converge with budget met
|
|
57
|
+
assert.equal(result.budgetMet, true, `picker should meet budget; final tokens = ${result.finalTokens}`);
|
|
58
|
+
assert.ok(result.finalTokens <= 27_000, `final tokens ${result.finalTokens} should be ≤ targetBudget 27000`);
|
|
59
|
+
});
|
|
60
|
+
test('integration: 200-turn conversation growth — picker fires only as needed (steady-state cache)', () => {
|
|
61
|
+
const chronicle = new MockChronicle({ mergeThreshold: 6, recallPairTokens: 200 });
|
|
62
|
+
const picker = new Picker(new FlatProfileStrategy());
|
|
63
|
+
const BUDGET_TOTAL = 5000;
|
|
64
|
+
// Track how many turns invoke the picker (i.e., apply any folds).
|
|
65
|
+
let pickerFiredTurns = 0;
|
|
66
|
+
let totalRaises = 0;
|
|
67
|
+
// Per-chunk resolution history — verify monotonicity.
|
|
68
|
+
const resolutionHistory = new Map();
|
|
69
|
+
for (let turn = 0; turn < 200; turn++) {
|
|
70
|
+
// Each turn adds a new "message" chunk of ~50 tokens.
|
|
71
|
+
chronicle.addChunk({ id: `m-${turn.toString().padStart(4, '0')}`, rawTokens: 50 });
|
|
72
|
+
// Periodically produce L1s as the compression queue would (every 6 chunks).
|
|
73
|
+
if (chronicle.chunks.length % 6 === 0) {
|
|
74
|
+
const start = chronicle.chunks.length - 6;
|
|
75
|
+
chronicle.produceL1(chronicle.chunks.slice(start, start + 6).map((c) => c.id));
|
|
76
|
+
chronicle.preProduceUpperLevels();
|
|
77
|
+
}
|
|
78
|
+
// Run picker
|
|
79
|
+
const tailInfo = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 500 });
|
|
80
|
+
const result = picker.run({
|
|
81
|
+
chunks: chronicle.chunks,
|
|
82
|
+
summaries: chronicle.summaries,
|
|
83
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
84
|
+
...tailInfo,
|
|
85
|
+
}, BUDGET(BUDGET_TOTAL));
|
|
86
|
+
if (result.applied.length > 0) {
|
|
87
|
+
pickerFiredTurns++;
|
|
88
|
+
totalRaises += result.applied.length;
|
|
89
|
+
}
|
|
90
|
+
chronicle.applyResolutions(result.finalResolutions);
|
|
91
|
+
// Record resolution per chunk
|
|
92
|
+
for (const c of chronicle.chunks) {
|
|
93
|
+
const arr = resolutionHistory.get(c.id) ?? [];
|
|
94
|
+
arr.push(c.currentResolution);
|
|
95
|
+
resolutionHistory.set(c.id, arr);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Monotonicity check: every chunk's resolution sequence should be non-decreasing.
|
|
99
|
+
for (const [id, history] of resolutionHistory) {
|
|
100
|
+
for (let i = 1; i < history.length; i++) {
|
|
101
|
+
assert.ok(history[i] >= history[i - 1], `chunk ${id} resolution decreased at step ${i}: ${history[i - 1]} → ${history[i]}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Picker should fire on a MINORITY of turns (cache stickiness property).
|
|
105
|
+
assert.ok(pickerFiredTurns < 200 * 0.5, `picker fired on ${pickerFiredTurns}/200 turns; should fire less than half the time`);
|
|
106
|
+
// Most turns are no-ops in steady state.
|
|
107
|
+
const noOpTurns = 200 - pickerFiredTurns;
|
|
108
|
+
assert.ok(noOpTurns > 100, `expected at least 100 no-op turns, got ${noOpTurns}`);
|
|
109
|
+
});
|
|
110
|
+
test('integration: bodyGroupId chunks fold independently within one doc', () => {
|
|
111
|
+
// Build a doc with 18 shards (3 L1 groups). Force partial folding so some
|
|
112
|
+
// shards are L0 and some are L1, verifying that the per-chunk state allows
|
|
113
|
+
// mixed resolution within a single bodyGroup.
|
|
114
|
+
const chronicle = new MockChronicle({ mergeThreshold: 6, recallPairTokens: 100 });
|
|
115
|
+
for (let i = 0; i < 18; i++) {
|
|
116
|
+
chronicle.addChunk({
|
|
117
|
+
id: `doc-${i.toString().padStart(4, '0')}`,
|
|
118
|
+
rawTokens: 500,
|
|
119
|
+
bodyGroupId: 'doc-1',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
for (let i = 0; i < 18; i += 6) {
|
|
123
|
+
chronicle.produceL1(chronicle.chunks.slice(i, i + 6).map((c) => c.id));
|
|
124
|
+
}
|
|
125
|
+
chronicle.preProduceUpperLevels(); // 3 L1s won't produce L2 (need 6)
|
|
126
|
+
const tailInfo = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 500 });
|
|
127
|
+
const picker = new Picker(new FlatProfileStrategy());
|
|
128
|
+
const result = picker.run({
|
|
129
|
+
chunks: chronicle.chunks,
|
|
130
|
+
summaries: chronicle.summaries,
|
|
131
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
132
|
+
...tailInfo,
|
|
133
|
+
}, BUDGET(5000) // 17 chunks (excl tail) × 500 = 8500 raw; target 4500
|
|
134
|
+
);
|
|
135
|
+
// Should have folded some chunks (oldest L1 group) but not all.
|
|
136
|
+
let l0Count = 0;
|
|
137
|
+
let l1Count = 0;
|
|
138
|
+
for (const c of chronicle.chunks) {
|
|
139
|
+
const r = result.finalResolutions.get(c.id) ?? c.currentResolution;
|
|
140
|
+
if (r === 0)
|
|
141
|
+
l0Count++;
|
|
142
|
+
else if (r === 1)
|
|
143
|
+
l1Count++;
|
|
144
|
+
}
|
|
145
|
+
assert.ok(l0Count > 0 && l1Count > 0, `expected mixed L0+L1 within doc, got L0=${l0Count} L1=${l1Count}`);
|
|
146
|
+
});
|
|
147
|
+
test('integration: lockedByAgent prevents picker from raising a chunk', () => {
|
|
148
|
+
const chronicle = new MockChronicle({ mergeThreshold: 6, recallPairTokens: 200 });
|
|
149
|
+
for (let i = 0; i < 12; i++) {
|
|
150
|
+
chronicle.addChunk({ id: `c-${i.toString().padStart(4, '0')}`, rawTokens: 100 });
|
|
151
|
+
}
|
|
152
|
+
for (let i = 0; i < 12; i += 6) {
|
|
153
|
+
chronicle.produceL1(chronicle.chunks.slice(i, i + 6).map((c) => c.id));
|
|
154
|
+
}
|
|
155
|
+
// Lock chunk c-0002 by setting lockedByAgent directly. In production this
|
|
156
|
+
// is set via AutobiographicalStrategy.lockChunk(id); here we exercise the
|
|
157
|
+
// picker's contract that lockedByAgent freezes a chunk's resolution.
|
|
158
|
+
const lockChunk = (id) => {
|
|
159
|
+
for (const c of chronicle.chunks)
|
|
160
|
+
if (c.id === id)
|
|
161
|
+
c.lockedByAgent = true;
|
|
162
|
+
};
|
|
163
|
+
const unlockChunk = (id) => {
|
|
164
|
+
for (const c of chronicle.chunks)
|
|
165
|
+
if (c.id === id)
|
|
166
|
+
c.lockedByAgent = false;
|
|
167
|
+
};
|
|
168
|
+
const isLocked = (id) => chronicle.chunks.find((c) => c.id === id)?.lockedByAgent === true;
|
|
169
|
+
lockChunk('c-0002');
|
|
170
|
+
const tailInfo = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 100 });
|
|
171
|
+
const picker = new Picker(new FlatProfileStrategy());
|
|
172
|
+
const result = picker.run({
|
|
173
|
+
chunks: chronicle.chunks,
|
|
174
|
+
summaries: chronicle.summaries,
|
|
175
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
176
|
+
...tailInfo,
|
|
177
|
+
}, BUDGET(900));
|
|
178
|
+
// c-0002 should remain at L0 despite siblings being raised.
|
|
179
|
+
assert.equal(result.finalResolutions.get('c-0002'), 0);
|
|
180
|
+
// Siblings should be at L1 if the picker ran the first group fold.
|
|
181
|
+
if (result.finalResolutions.get('c-0000') === 1) {
|
|
182
|
+
for (const sibling of ['c-0000', 'c-0001', 'c-0003', 'c-0004', 'c-0005']) {
|
|
183
|
+
assert.equal(result.finalResolutions.get(sibling), 1, `${sibling} should be L1`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
assert.equal(isLocked('c-0002'), true);
|
|
187
|
+
// Unlock and verify the lock state is cleared.
|
|
188
|
+
unlockChunk('c-0002');
|
|
189
|
+
assert.equal(isLocked('c-0002'), false);
|
|
190
|
+
chronicle.applyResolutions(result.finalResolutions);
|
|
191
|
+
// Without new pressure, the picker won't refire — that's correct
|
|
192
|
+
// (monotonic, stingy). But under fresh pressure, c-0002 is now eligible.
|
|
193
|
+
// Simulate new pressure by adding many new L0 chunks.
|
|
194
|
+
for (let i = 12; i < 30; i++) {
|
|
195
|
+
chronicle.addChunk({ id: `c-${i.toString().padStart(4, '0')}`, rawTokens: 100 });
|
|
196
|
+
}
|
|
197
|
+
for (let i = 12; i < 30; i += 6) {
|
|
198
|
+
chronicle.produceL1(chronicle.chunks.slice(i, i + 6).map((c) => c.id));
|
|
199
|
+
}
|
|
200
|
+
chronicle.preProduceUpperLevels();
|
|
201
|
+
const tailInfo2 = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 100 });
|
|
202
|
+
const result2 = picker.run({
|
|
203
|
+
chunks: chronicle.chunks,
|
|
204
|
+
summaries: chronicle.summaries,
|
|
205
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
206
|
+
...tailInfo2,
|
|
207
|
+
}, BUDGET(900));
|
|
208
|
+
// Now under enough pressure that c-0002's group should fully collapse.
|
|
209
|
+
// The L1-0 group covers c-0000..c-0005. With c-0002 unlocked, applyRaise
|
|
210
|
+
// can include it. After enough pressure, c-0002 should be at L1.
|
|
211
|
+
const finalRes = result2.finalResolutions.get('c-0002');
|
|
212
|
+
assert.ok((finalRes ?? 0) >= 1, `after unlock + new pressure, c-0002 should be ≥ L1 (got ${finalRes})`);
|
|
213
|
+
});
|
|
214
|
+
test('integration: stress — 1000 chunks, deep recursion via preProduceUpperLevels', () => {
|
|
215
|
+
// Sanity check that the harness scales and the picker doesn't blow up.
|
|
216
|
+
const chronicle = new MockChronicle({ mergeThreshold: 6, recallPairTokens: 200 });
|
|
217
|
+
for (let i = 0; i < 1000; i++) {
|
|
218
|
+
chronicle.addChunk({ id: `c-${i.toString().padStart(4, '0')}`, rawTokens: 100 });
|
|
219
|
+
}
|
|
220
|
+
for (let i = 0; i < 1000; i += 6) {
|
|
221
|
+
const slice = chronicle.chunks.slice(i, Math.min(i + 6, 1000));
|
|
222
|
+
if (slice.length === 6) {
|
|
223
|
+
chronicle.produceL1(slice.map((c) => c.id));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
chronicle.preProduceUpperLevels();
|
|
227
|
+
// Expect summaries at multiple levels: 1000/6 ≈ 167 L1s, 167/6 ≈ 27 L2s, 27/6 = 4 L3s, no L4 yet.
|
|
228
|
+
const levels = new Set();
|
|
229
|
+
for (const s of chronicle.summaries.values())
|
|
230
|
+
levels.add(s.level);
|
|
231
|
+
assert.ok(levels.has(1) && levels.has(2) && levels.has(3), `expected L1, L2, L3; got ${Array.from(levels)}`);
|
|
232
|
+
const tailInfo = chronicle.computeHeadTail({ headTokens: 0, tailTokens: 500 });
|
|
233
|
+
const picker = new Picker(new FlatProfileStrategy());
|
|
234
|
+
const start = Date.now();
|
|
235
|
+
const result = picker.run({
|
|
236
|
+
chunks: chronicle.chunks,
|
|
237
|
+
summaries: chronicle.summaries,
|
|
238
|
+
recallPairTokens: chronicle.recallPairTokens,
|
|
239
|
+
...tailInfo,
|
|
240
|
+
}, BUDGET(10_000));
|
|
241
|
+
const elapsed = Date.now() - start;
|
|
242
|
+
assert.ok(elapsed < 5000, `picker took ${elapsed}ms on 1000 chunks; should be < 5s`);
|
|
243
|
+
assert.ok(result.iterations < 1000, `should converge in fewer than 1000 iterations, got ${result.iterations}`);
|
|
244
|
+
// Budget should be met or production requested
|
|
245
|
+
assert.ok(result.budgetMet || result.produced.length > 0);
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../test/adaptive/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end stress test: a long-running chronicle with mixed content.
|
|
3
|
+
*
|
|
4
|
+
* Simulates 200+ turns of conversation, with a big doc dropped in the middle,
|
|
5
|
+
* and verifies:
|
|
6
|
+
* - Compile output never exceeds the budget (the picker actually does its job)
|
|
7
|
+
* - Resolutions monotone over the run (no thrashing)
|
|
8
|
+
* - Picker is idle on most turns (steady-state cache property)
|
|
9
|
+
* - Final state can be reloaded cleanly
|
|
10
|
+
* - Output structure remains sensible across the run
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=long-chronicle.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-chronicle.test.d.ts","sourceRoot":"","sources":["../../../test/adaptive/long-chronicle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end stress test: a long-running chronicle with mixed content.
|
|
3
|
+
*
|
|
4
|
+
* Simulates 200+ turns of conversation, with a big doc dropped in the middle,
|
|
5
|
+
* and verifies:
|
|
6
|
+
* - Compile output never exceeds the budget (the picker actually does its job)
|
|
7
|
+
* - Resolutions monotone over the run (no thrashing)
|
|
8
|
+
* - Picker is idle on most turns (steady-state cache property)
|
|
9
|
+
* - Final state can be reloaded cleanly
|
|
10
|
+
* - Output structure remains sensible across the run
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, before, after, beforeEach } from 'node:test';
|
|
13
|
+
import assert from 'node:assert/strict';
|
|
14
|
+
import { rmSync, existsSync } from 'node:fs';
|
|
15
|
+
import { ContextManager, AutobiographicalStrategy } from '../../src/index.js';
|
|
16
|
+
const TEST_STORE_PATH = './test-adaptive-long-chronicle-store';
|
|
17
|
+
function cleanup() {
|
|
18
|
+
if (existsSync(TEST_STORE_PATH)) {
|
|
19
|
+
rmSync(TEST_STORE_PATH, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function makeMockMembrane() {
|
|
23
|
+
let callCount = 0;
|
|
24
|
+
return {
|
|
25
|
+
complete: async () => {
|
|
26
|
+
callCount++;
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: `[mock summary #${callCount}] short content.` }],
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
get callCount() {
|
|
32
|
+
return callCount;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function countTokens(text) {
|
|
37
|
+
return Math.ceil(text.length / 4);
|
|
38
|
+
}
|
|
39
|
+
function compiledTokenCount(compiled) {
|
|
40
|
+
let total = 0;
|
|
41
|
+
for (const m of compiled.messages) {
|
|
42
|
+
for (const block of m.content) {
|
|
43
|
+
if (block.type === 'text')
|
|
44
|
+
total += countTokens(block.text);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return total;
|
|
48
|
+
}
|
|
49
|
+
describe('AutobiographicalStrategy — long chronicle stress', () => {
|
|
50
|
+
before(() => cleanup());
|
|
51
|
+
after(() => cleanup());
|
|
52
|
+
beforeEach(() => cleanup());
|
|
53
|
+
it('200-turn simulation with mid-conversation doc: budget honored, resolutions monotone', async () => {
|
|
54
|
+
const mock = makeMockMembrane();
|
|
55
|
+
const BUDGET = 4000;
|
|
56
|
+
const strategy = new AutobiographicalStrategy({
|
|
57
|
+
adaptiveResolution: true,
|
|
58
|
+
targetChunkTokens: 300,
|
|
59
|
+
recentWindowTokens: 500,
|
|
60
|
+
mergeThreshold: 3,
|
|
61
|
+
compressionSlackRatio: 0.15,
|
|
62
|
+
});
|
|
63
|
+
const manager = await ContextManager.open({
|
|
64
|
+
path: TEST_STORE_PATH,
|
|
65
|
+
strategy,
|
|
66
|
+
membrane: mock,
|
|
67
|
+
});
|
|
68
|
+
const resolutionHistory = new Map();
|
|
69
|
+
const pickerFiredTurns = [];
|
|
70
|
+
// Burst of normal conversation
|
|
71
|
+
for (let turn = 0; turn < 50; turn++) {
|
|
72
|
+
manager.addMessage('User', [{ type: 'text', text: `Turn ${turn}. ` + 'word '.repeat(30) }]);
|
|
73
|
+
manager.addMessage('Claude', [{ type: 'text', text: `Reply ${turn}. ` + 'response '.repeat(30) }]);
|
|
74
|
+
while (!manager.isReady()) {
|
|
75
|
+
await manager.tick();
|
|
76
|
+
}
|
|
77
|
+
const compiled = await manager.compile({ maxTokens: BUDGET, reserveForResponse: 300 });
|
|
78
|
+
const tokens = compiledTokenCount(compiled);
|
|
79
|
+
assert.ok(tokens <= BUDGET - 300, `turn ${turn}: tokens ${tokens} exceeds budget ${BUDGET - 300}`);
|
|
80
|
+
// Track resolution per message
|
|
81
|
+
const res = strategy.resolutions;
|
|
82
|
+
for (const [id, level] of res) {
|
|
83
|
+
const hist = resolutionHistory.get(id) ?? [];
|
|
84
|
+
hist.push(level);
|
|
85
|
+
resolutionHistory.set(id, hist);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Drop a big doc mid-conversation
|
|
89
|
+
const bigDoc = Array.from({ length: 40 }, (_, i) => `Section ${i}: ` + 'word '.repeat(40)).join('\n\n');
|
|
90
|
+
manager.addMessage('User', [{ type: 'text', text: bigDoc }]);
|
|
91
|
+
while (!manager.isReady()) {
|
|
92
|
+
await manager.tick();
|
|
93
|
+
}
|
|
94
|
+
const afterDocCompile = await manager.compile({ maxTokens: BUDGET, reserveForResponse: 300 });
|
|
95
|
+
const afterDocTokens = compiledTokenCount(afterDocCompile);
|
|
96
|
+
assert.ok(afterDocTokens <= BUDGET - 300, `after-doc compile: ${afterDocTokens} tokens exceeds ${BUDGET - 300}`);
|
|
97
|
+
// More conversation after the doc
|
|
98
|
+
for (let turn = 50; turn < 100; turn++) {
|
|
99
|
+
manager.addMessage('User', [{ type: 'text', text: `Post-doc turn ${turn}. ` + 'word '.repeat(30) }]);
|
|
100
|
+
manager.addMessage('Claude', [{ type: 'text', text: `Reply ${turn}. ` + 'word '.repeat(30) }]);
|
|
101
|
+
while (!manager.isReady()) {
|
|
102
|
+
await manager.tick();
|
|
103
|
+
}
|
|
104
|
+
const before = new Map(strategy.resolutions);
|
|
105
|
+
const compiled = await manager.compile({ maxTokens: BUDGET, reserveForResponse: 300 });
|
|
106
|
+
const after = strategy.resolutions;
|
|
107
|
+
// Track when the picker fires (resolutions change)
|
|
108
|
+
let fired = false;
|
|
109
|
+
for (const [id, lvl] of after) {
|
|
110
|
+
if ((before.get(id) ?? 0) !== lvl) {
|
|
111
|
+
fired = true;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (fired)
|
|
116
|
+
pickerFiredTurns.push(turn);
|
|
117
|
+
const tokens = compiledTokenCount(compiled);
|
|
118
|
+
assert.ok(tokens <= BUDGET - 300, `turn ${turn}: tokens ${tokens} exceeds budget ${BUDGET - 300}`);
|
|
119
|
+
}
|
|
120
|
+
// Monotonicity: every chunk's resolution history should be non-decreasing
|
|
121
|
+
for (const [id, hist] of resolutionHistory) {
|
|
122
|
+
for (let i = 1; i < hist.length; i++) {
|
|
123
|
+
assert.ok(hist[i] >= hist[i - 1], `chunk ${id} resolution decreased at step ${i}: L${hist[i - 1]} → L${hist[i]}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Steady-state property: in the second half of post-doc turns, the picker
|
|
127
|
+
// should fire less often (cache stickiness).
|
|
128
|
+
// (We don't assert exact numbers — depends on chunk sizes — but ensure
|
|
129
|
+
// it's not firing every single turn.)
|
|
130
|
+
const lateFires = pickerFiredTurns.filter((t) => t >= 80).length;
|
|
131
|
+
assert.ok(lateFires < 20, `picker fired on ${lateFires}/20 late turns; expected <20 (some no-ops)`);
|
|
132
|
+
manager.close();
|
|
133
|
+
});
|
|
134
|
+
it('long chronicle reloads cleanly with full state intact', async () => {
|
|
135
|
+
// Phase 1: build a 50-turn chronicle, drive folding
|
|
136
|
+
const mock1 = makeMockMembrane();
|
|
137
|
+
const strategy1 = new AutobiographicalStrategy({
|
|
138
|
+
adaptiveResolution: true,
|
|
139
|
+
targetChunkTokens: 200,
|
|
140
|
+
recentWindowTokens: 400,
|
|
141
|
+
mergeThreshold: 3,
|
|
142
|
+
});
|
|
143
|
+
const manager1 = await ContextManager.open({
|
|
144
|
+
path: TEST_STORE_PATH,
|
|
145
|
+
strategy: strategy1,
|
|
146
|
+
membrane: mock1,
|
|
147
|
+
});
|
|
148
|
+
for (let i = 0; i < 50; i++) {
|
|
149
|
+
manager1.addMessage('User', [{ type: 'text', text: `Turn ${i}. ` + 'word '.repeat(30) }]);
|
|
150
|
+
}
|
|
151
|
+
while (!manager1.isReady()) {
|
|
152
|
+
await manager1.tick();
|
|
153
|
+
}
|
|
154
|
+
await manager1.compile({ maxTokens: 3500, reserveForResponse: 300 });
|
|
155
|
+
const stats1 = strategy1.getStats();
|
|
156
|
+
const resolutions1 = new Map(strategy1.resolutions);
|
|
157
|
+
const messageCount1 = manager1.getAllMessages().length;
|
|
158
|
+
manager1.close();
|
|
159
|
+
// Phase 2: reopen, verify state matches
|
|
160
|
+
const mock2 = makeMockMembrane();
|
|
161
|
+
const strategy2 = new AutobiographicalStrategy({
|
|
162
|
+
adaptiveResolution: true,
|
|
163
|
+
targetChunkTokens: 200,
|
|
164
|
+
recentWindowTokens: 400,
|
|
165
|
+
mergeThreshold: 3,
|
|
166
|
+
});
|
|
167
|
+
const manager2 = await ContextManager.open({
|
|
168
|
+
path: TEST_STORE_PATH,
|
|
169
|
+
strategy: strategy2,
|
|
170
|
+
membrane: mock2,
|
|
171
|
+
});
|
|
172
|
+
const stats2 = strategy2.getStats();
|
|
173
|
+
const resolutions2 = new Map(strategy2.resolutions);
|
|
174
|
+
const messageCount2 = manager2.getAllMessages().length;
|
|
175
|
+
assert.equal(messageCount2, messageCount1, 'message count should match after reopen');
|
|
176
|
+
assert.equal(stats2.l1, stats1.l1, 'L1 count should match');
|
|
177
|
+
assert.equal(stats2.l2, stats1.l2, 'L2 count should match');
|
|
178
|
+
assert.equal(stats2.l3, stats1.l3, 'L3 count should match');
|
|
179
|
+
assert.equal(resolutions2.size, resolutions1.size, 'resolutions size should match');
|
|
180
|
+
for (const [id, level] of resolutions1) {
|
|
181
|
+
assert.equal(resolutions2.get(id), level, `resolution mismatch for ${id}`);
|
|
182
|
+
}
|
|
183
|
+
manager2.close();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=long-chronicle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-chronicle.test.js","sourceRoot":"","sources":["../../../test/adaptive/long-chronicle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests that adaptive-resolution state (currentResolution + lockedByAgent)
|
|
3
|
+
* survives a close-and-reopen of the ContextManager.
|
|
4
|
+
*
|
|
5
|
+
* Without these slots persisted, a process restart would re-run the picker
|
|
6
|
+
* from scratch on first compile, almost certainly producing a different
|
|
7
|
+
* fold pattern → full KV invalidation. The chronicle slots ensure the
|
|
8
|
+
* picker resumes where it left off.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=persistence.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.test.d.ts","sourceRoot":"","sources":["../../../test/adaptive/persistence.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|