@animalabs/context-manager 0.4.0 → 0.5.1

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.
Files changed (128) hide show
  1. package/dist/src/adaptive/chunker.d.ts +70 -0
  2. package/dist/src/adaptive/chunker.d.ts.map +1 -0
  3. package/dist/src/adaptive/chunker.js +233 -0
  4. package/dist/src/adaptive/chunker.js.map +1 -0
  5. package/dist/src/adaptive/folding-strategy.d.ts +118 -0
  6. package/dist/src/adaptive/folding-strategy.d.ts.map +1 -0
  7. package/dist/src/adaptive/folding-strategy.js +12 -0
  8. package/dist/src/adaptive/folding-strategy.js.map +1 -0
  9. package/dist/src/adaptive/index.d.ts +17 -0
  10. package/dist/src/adaptive/index.d.ts.map +1 -0
  11. package/dist/src/adaptive/index.js +23 -0
  12. package/dist/src/adaptive/index.js.map +1 -0
  13. package/dist/src/adaptive/picker.d.ts +103 -0
  14. package/dist/src/adaptive/picker.d.ts.map +1 -0
  15. package/dist/src/adaptive/picker.js +357 -0
  16. package/dist/src/adaptive/picker.js.map +1 -0
  17. package/dist/src/adaptive/render.d.ts +39 -0
  18. package/dist/src/adaptive/render.d.ts.map +1 -0
  19. package/dist/src/adaptive/render.js +104 -0
  20. package/dist/src/adaptive/render.js.map +1 -0
  21. package/dist/src/adaptive/strategies/flat-profile.d.ts +19 -0
  22. package/dist/src/adaptive/strategies/flat-profile.d.ts.map +1 -0
  23. package/dist/src/adaptive/strategies/flat-profile.js +86 -0
  24. package/dist/src/adaptive/strategies/flat-profile.js.map +1 -0
  25. package/dist/src/adaptive/strategies/oldest-first.d.ts +19 -0
  26. package/dist/src/adaptive/strategies/oldest-first.d.ts.map +1 -0
  27. package/dist/src/adaptive/strategies/oldest-first.js +39 -0
  28. package/dist/src/adaptive/strategies/oldest-first.js.map +1 -0
  29. package/dist/src/context-manager.d.ts +5 -0
  30. package/dist/src/context-manager.d.ts.map +1 -1
  31. package/dist/src/context-manager.js +22 -0
  32. package/dist/src/context-manager.js.map +1 -1
  33. package/dist/src/index.d.ts +1 -1
  34. package/dist/src/index.d.ts.map +1 -1
  35. package/dist/src/index.js.map +1 -1
  36. package/dist/src/message-store.d.ts +36 -1
  37. package/dist/src/message-store.d.ts.map +1 -1
  38. package/dist/src/message-store.js +134 -8
  39. package/dist/src/message-store.js.map +1 -1
  40. package/dist/src/strategies/autobiographical.d.ts +217 -2
  41. package/dist/src/strategies/autobiographical.d.ts.map +1 -1
  42. package/dist/src/strategies/autobiographical.js +1525 -37
  43. package/dist/src/strategies/autobiographical.js.map +1 -1
  44. package/dist/src/strategies/index.d.ts +1 -1
  45. package/dist/src/strategies/index.d.ts.map +1 -1
  46. package/dist/src/strategies/index.js.map +1 -1
  47. package/dist/src/types/message.d.ts +38 -0
  48. package/dist/src/types/message.d.ts.map +1 -1
  49. package/dist/src/types/strategy.d.ts +106 -10
  50. package/dist/src/types/strategy.d.ts.map +1 -1
  51. package/dist/src/types/strategy.js +7 -0
  52. package/dist/src/types/strategy.js.map +1 -1
  53. package/dist/test/adaptive/branching.test.d.ts +20 -0
  54. package/dist/test/adaptive/branching.test.d.ts.map +1 -0
  55. package/dist/test/adaptive/branching.test.js +176 -0
  56. package/dist/test/adaptive/branching.test.js.map +1 -0
  57. package/dist/test/adaptive/chunker.test.d.ts +2 -0
  58. package/dist/test/adaptive/chunker.test.d.ts.map +1 -0
  59. package/dist/test/adaptive/chunker.test.js +120 -0
  60. package/dist/test/adaptive/chunker.test.js.map +1 -0
  61. package/dist/test/adaptive/deep-levels.test.d.ts +10 -0
  62. package/dist/test/adaptive/deep-levels.test.d.ts.map +1 -0
  63. package/dist/test/adaptive/deep-levels.test.js +167 -0
  64. package/dist/test/adaptive/deep-levels.test.js.map +1 -0
  65. package/dist/test/adaptive/doc-plus-chat.test.d.ts +10 -0
  66. package/dist/test/adaptive/doc-plus-chat.test.d.ts.map +1 -0
  67. package/dist/test/adaptive/doc-plus-chat.test.js +194 -0
  68. package/dist/test/adaptive/doc-plus-chat.test.js.map +1 -0
  69. package/dist/test/adaptive/hard-fail.test.d.ts +9 -0
  70. package/dist/test/adaptive/hard-fail.test.d.ts.map +1 -0
  71. package/dist/test/adaptive/hard-fail.test.js +154 -0
  72. package/dist/test/adaptive/hard-fail.test.js.map +1 -0
  73. package/dist/test/adaptive/harness.d.ts +109 -0
  74. package/dist/test/adaptive/harness.d.ts.map +1 -0
  75. package/dist/test/adaptive/harness.js +263 -0
  76. package/dist/test/adaptive/harness.js.map +1 -0
  77. package/dist/test/adaptive/ingestion.test.d.ts +13 -0
  78. package/dist/test/adaptive/ingestion.test.d.ts.map +1 -0
  79. package/dist/test/adaptive/ingestion.test.js +306 -0
  80. package/dist/test/adaptive/ingestion.test.js.map +1 -0
  81. package/dist/test/adaptive/integration.test.d.ts +12 -0
  82. package/dist/test/adaptive/integration.test.d.ts.map +1 -0
  83. package/dist/test/adaptive/integration.test.js +247 -0
  84. package/dist/test/adaptive/integration.test.js.map +1 -0
  85. package/dist/test/adaptive/long-chronicle.test.d.ts +13 -0
  86. package/dist/test/adaptive/long-chronicle.test.d.ts.map +1 -0
  87. package/dist/test/adaptive/long-chronicle.test.js +186 -0
  88. package/dist/test/adaptive/long-chronicle.test.js.map +1 -0
  89. package/dist/test/adaptive/persistence.test.d.ts +11 -0
  90. package/dist/test/adaptive/persistence.test.d.ts.map +1 -0
  91. package/dist/test/adaptive/persistence.test.js +200 -0
  92. package/dist/test/adaptive/persistence.test.js.map +1 -0
  93. package/dist/test/adaptive/picker.test.d.ts +2 -0
  94. package/dist/test/adaptive/picker.test.d.ts.map +1 -0
  95. package/dist/test/adaptive/picker.test.js +333 -0
  96. package/dist/test/adaptive/picker.test.js.map +1 -0
  97. package/dist/test/adaptive/render.test.d.ts +2 -0
  98. package/dist/test/adaptive/render.test.d.ts.map +1 -0
  99. package/dist/test/adaptive/render.test.js +109 -0
  100. package/dist/test/adaptive/render.test.js.map +1 -0
  101. package/dist/test/adaptive/shard-immutability.test.d.ts +14 -0
  102. package/dist/test/adaptive/shard-immutability.test.d.ts.map +1 -0
  103. package/dist/test/adaptive/shard-immutability.test.js +184 -0
  104. package/dist/test/adaptive/shard-immutability.test.js.map +1 -0
  105. package/dist/test/adaptive/strategy-integration.test.d.ts +9 -0
  106. package/dist/test/adaptive/strategy-integration.test.d.ts.map +1 -0
  107. package/dist/test/adaptive/strategy-integration.test.js +293 -0
  108. package/dist/test/adaptive/strategy-integration.test.js.map +1 -0
  109. package/dist/test/message-store-sequence.test.d.ts +25 -0
  110. package/dist/test/message-store-sequence.test.d.ts.map +1 -0
  111. package/dist/test/message-store-sequence.test.js +157 -0
  112. package/dist/test/message-store-sequence.test.js.map +1 -0
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +1 -1
  115. package/src/adaptive/chunker.ts +323 -0
  116. package/src/adaptive/folding-strategy.ts +129 -0
  117. package/src/adaptive/index.ts +51 -0
  118. package/src/adaptive/picker.ts +442 -0
  119. package/src/adaptive/render.ts +115 -0
  120. package/src/adaptive/strategies/flat-profile.ts +96 -0
  121. package/src/adaptive/strategies/oldest-first.ts +48 -0
  122. package/src/context-manager.ts +32 -0
  123. package/src/index.ts +1 -1
  124. package/src/message-store.ts +147 -8
  125. package/src/strategies/autobiographical.ts +1635 -38
  126. package/src/strategies/index.ts +1 -1
  127. package/src/types/message.ts +43 -0
  128. package/src/types/strategy.ts +122 -10
@@ -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"}
@@ -0,0 +1,200 @@
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
+ import { describe, it, before, after, beforeEach } from 'node:test';
11
+ import assert from 'node:assert/strict';
12
+ import { rmSync, existsSync } from 'node:fs';
13
+ import { ContextManager, AutobiographicalStrategy } from '../../src/index.js';
14
+ const TEST_STORE_PATH = './test-adaptive-persistence-store';
15
+ function cleanup() {
16
+ if (existsSync(TEST_STORE_PATH)) {
17
+ rmSync(TEST_STORE_PATH, { recursive: true, force: true });
18
+ }
19
+ }
20
+ function makeMockMembrane() {
21
+ let callCount = 0;
22
+ return {
23
+ complete: async () => {
24
+ callCount++;
25
+ return {
26
+ content: [{ type: 'text', text: `[mock summary #${callCount}]` }],
27
+ };
28
+ },
29
+ get callCount() {
30
+ return callCount;
31
+ },
32
+ };
33
+ }
34
+ describe('AutobiographicalStrategy — adaptive state persistence', () => {
35
+ before(() => cleanup());
36
+ after(() => cleanup());
37
+ beforeEach(() => cleanup());
38
+ it('resolutions survive close + reopen', async () => {
39
+ // Phase 1: open, ingest, compile under pressure, capture resolutions
40
+ const mock1 = makeMockMembrane();
41
+ const strategy1 = new AutobiographicalStrategy({
42
+ adaptiveResolution: true,
43
+ targetChunkTokens: 100,
44
+ recentWindowTokens: 200,
45
+ });
46
+ const manager1 = await ContextManager.open({
47
+ path: TEST_STORE_PATH,
48
+ strategy: strategy1,
49
+ membrane: mock1,
50
+ });
51
+ for (let i = 0; i < 40; i++) {
52
+ manager1.addMessage('User', [{ type: 'text', text: `Turn ${i}. ` + 'word '.repeat(60) }]);
53
+ }
54
+ while (!manager1.isReady()) {
55
+ await manager1.tick();
56
+ }
57
+ // Force folding with a tight budget
58
+ await manager1.compile({ maxTokens: 1500, reserveForResponse: 200 });
59
+ const phase1Resolutions = new Map(strategy1.resolutions);
60
+ // Debug: log what we have
61
+ if (phase1Resolutions.size === 0) {
62
+ const stats = strategy1.getStats?.() ?? {};
63
+ console.error('phase 1 resolutions empty; stats:', stats);
64
+ }
65
+ assert.ok(phase1Resolutions.size > 0, `phase 1 should have folded at least some messages; got ${phase1Resolutions.size}`);
66
+ manager1.close();
67
+ // Phase 2: reopen with a fresh strategy instance, verify resolutions restored
68
+ const mock2 = makeMockMembrane();
69
+ const strategy2 = new AutobiographicalStrategy({
70
+ adaptiveResolution: true,
71
+ targetChunkTokens: 100,
72
+ recentWindowTokens: 200,
73
+ });
74
+ const manager2 = await ContextManager.open({
75
+ path: TEST_STORE_PATH,
76
+ strategy: strategy2,
77
+ membrane: mock2,
78
+ });
79
+ // Without compiling, the strategy.resolutions should already be populated from chronicle
80
+ const phase2Resolutions = new Map(strategy2.resolutions);
81
+ assert.equal(phase2Resolutions.size, phase1Resolutions.size, `phase 2 should have ${phase1Resolutions.size} resolutions; got ${phase2Resolutions.size}`);
82
+ for (const [id, level] of phase1Resolutions) {
83
+ assert.equal(phase2Resolutions.get(id), level, `message ${id}: phase 1 had L${level}, phase 2 has L${phase2Resolutions.get(id)}`);
84
+ }
85
+ manager2.close();
86
+ });
87
+ it('locks survive close + reopen', async () => {
88
+ const mock1 = makeMockMembrane();
89
+ const strategy1 = new AutobiographicalStrategy({
90
+ adaptiveResolution: true,
91
+ targetChunkTokens: 100,
92
+ recentWindowTokens: 200,
93
+ });
94
+ const manager1 = await ContextManager.open({
95
+ path: TEST_STORE_PATH,
96
+ strategy: strategy1,
97
+ membrane: mock1,
98
+ });
99
+ const ids = [];
100
+ for (let i = 0; i < 8; i++) {
101
+ ids.push(manager1.addMessage('User', [{ type: 'text', text: `Turn ${i}` }]));
102
+ }
103
+ // Lock a couple of messages
104
+ strategy1.lockChunk(ids[2]);
105
+ strategy1.lockChunk(ids[5]);
106
+ manager1.close();
107
+ // Reopen
108
+ const mock2 = makeMockMembrane();
109
+ const strategy2 = new AutobiographicalStrategy({
110
+ adaptiveResolution: true,
111
+ targetChunkTokens: 100,
112
+ recentWindowTokens: 200,
113
+ });
114
+ const manager2 = await ContextManager.open({
115
+ path: TEST_STORE_PATH,
116
+ strategy: strategy2,
117
+ membrane: mock2,
118
+ });
119
+ const lockedAfterReopen = strategy2.locked;
120
+ assert.equal(lockedAfterReopen.size, 2);
121
+ assert.ok(lockedAfterReopen.has(ids[2]), `${ids[2]} should be locked after reopen`);
122
+ assert.ok(lockedAfterReopen.has(ids[5]), `${ids[5]} should be locked after reopen`);
123
+ manager2.close();
124
+ });
125
+ it('unlocking persists too', async () => {
126
+ const mock1 = makeMockMembrane();
127
+ const strategy1 = new AutobiographicalStrategy({
128
+ adaptiveResolution: true,
129
+ });
130
+ const manager1 = await ContextManager.open({
131
+ path: TEST_STORE_PATH,
132
+ strategy: strategy1,
133
+ membrane: mock1,
134
+ });
135
+ const id = manager1.addMessage('User', [{ type: 'text', text: 'msg' }]);
136
+ strategy1.lockChunk(id);
137
+ strategy1.unlockChunk(id);
138
+ manager1.close();
139
+ const strategy2 = new AutobiographicalStrategy({ adaptiveResolution: true });
140
+ const manager2 = await ContextManager.open({
141
+ path: TEST_STORE_PATH,
142
+ strategy: strategy2,
143
+ membrane: makeMockMembrane(),
144
+ });
145
+ const lockedAfter = strategy2.locked;
146
+ assert.equal(lockedAfter.size, 0, 'after lock+unlock+reopen, no locks should remain');
147
+ manager2.close();
148
+ });
149
+ it('compile after reopen produces same fold pattern (no thrashing)', async () => {
150
+ // Phase 1: drive compression and folding
151
+ const mock1 = makeMockMembrane();
152
+ const strategy1 = new AutobiographicalStrategy({
153
+ adaptiveResolution: true,
154
+ targetChunkTokens: 100,
155
+ recentWindowTokens: 200,
156
+ });
157
+ const manager1 = await ContextManager.open({
158
+ path: TEST_STORE_PATH,
159
+ strategy: strategy1,
160
+ membrane: mock1,
161
+ });
162
+ for (let i = 0; i < 18; i++) {
163
+ manager1.addMessage('User', [{ type: 'text', text: `Turn ${i}. ` + 'word '.repeat(40) }]);
164
+ }
165
+ while (!manager1.isReady()) {
166
+ await manager1.tick();
167
+ }
168
+ const compileA = await manager1.compile({ maxTokens: 3000, reserveForResponse: 200 });
169
+ const resolutionsA = new Map(strategy1.resolutions);
170
+ manager1.close();
171
+ // Phase 2: reopen, compile with same budget
172
+ const mock2 = makeMockMembrane();
173
+ const strategy2 = new AutobiographicalStrategy({
174
+ adaptiveResolution: true,
175
+ targetChunkTokens: 100,
176
+ recentWindowTokens: 200,
177
+ });
178
+ const manager2 = await ContextManager.open({
179
+ path: TEST_STORE_PATH,
180
+ strategy: strategy2,
181
+ membrane: mock2,
182
+ });
183
+ while (!manager2.isReady()) {
184
+ await manager2.tick();
185
+ }
186
+ const compileB = await manager2.compile({ maxTokens: 3000, reserveForResponse: 200 });
187
+ const resolutionsB = new Map(strategy2.resolutions);
188
+ // Resolutions should be identical — no thrashing across the reopen.
189
+ for (const [id, levelA] of resolutionsA) {
190
+ const levelB = resolutionsB.get(id);
191
+ assert.equal(levelB, levelA, `after reopen, message ${id} should still be at L${levelA}, got L${levelB}`);
192
+ }
193
+ // Compile output should also be substantially equivalent — same number of
194
+ // entries with same participants in same order. (Exact text may differ
195
+ // because the mock LLM uses an incrementing callCount.)
196
+ assert.equal(compileB.messages.length, compileA.messages.length, `compile entry count differs after reopen (was ${compileA.messages.length}, now ${compileB.messages.length})`);
197
+ manager2.close();
198
+ });
199
+ });
200
+ //# sourceMappingURL=persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.test.js","sourceRoot":"","sources":["../../../test/adaptive/persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=picker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.test.d.ts","sourceRoot":"","sources":["../../../test/adaptive/picker.test.ts"],"names":[],"mappings":""}