@animalabs/context-manager 0.5.5 → 0.5.10
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/kv-control.d.ts +69 -32
- package/dist/src/adaptive/kv-control.d.ts.map +1 -1
- package/dist/src/adaptive/kv-control.js +471 -172
- package/dist/src/adaptive/kv-control.js.map +1 -1
- package/dist/src/adaptive/picker.d.ts +8 -0
- package/dist/src/adaptive/picker.d.ts.map +1 -1
- package/dist/src/adaptive/picker.js.map +1 -1
- package/dist/src/adaptive/strategies/kv-stable.d.ts +12 -4
- package/dist/src/adaptive/strategies/kv-stable.d.ts.map +1 -1
- package/dist/src/adaptive/strategies/kv-stable.js +14 -5
- package/dist/src/adaptive/strategies/kv-stable.js.map +1 -1
- package/dist/src/context-log.d.ts.map +1 -1
- package/dist/src/context-log.js +11 -0
- package/dist/src/context-log.js.map +1 -1
- package/dist/src/context-manager.d.ts +28 -1
- package/dist/src/context-manager.d.ts.map +1 -1
- package/dist/src/context-manager.js +42 -0
- package/dist/src/context-manager.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/message-store.d.ts +60 -0
- package/dist/src/message-store.d.ts.map +1 -1
- package/dist/src/message-store.js +165 -10
- package/dist/src/message-store.js.map +1 -1
- package/dist/src/strategies/autobiographical.d.ts +223 -2
- package/dist/src/strategies/autobiographical.d.ts.map +1 -1
- package/dist/src/strategies/autobiographical.js +1487 -142
- 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/strategies/knowledge.d.ts +8 -0
- package/dist/src/strategies/knowledge.d.ts.map +1 -1
- package/dist/src/strategies/knowledge.js +23 -1
- package/dist/src/strategies/knowledge.js.map +1 -1
- package/dist/src/types/strategy.d.ts +89 -5
- package/dist/src/types/strategy.d.ts.map +1 -1
- package/dist/src/types/strategy.js.map +1 -1
- package/dist/test/adaptive/doc-plus-chat.test.js +7 -3
- package/dist/test/adaptive/doc-plus-chat.test.js.map +1 -1
- package/dist/test/adaptive/hard-fail.test.js +103 -0
- package/dist/test/adaptive/hard-fail.test.js.map +1 -1
- package/dist/test/adaptive/ingestion.test.js +3 -1
- package/dist/test/adaptive/ingestion.test.js.map +1 -1
- package/dist/test/adaptive/kv-control.test.js +17 -11
- package/dist/test/adaptive/kv-control.test.js.map +1 -1
- package/dist/test/adaptive/single-path-solve.test.d.ts +16 -0
- package/dist/test/adaptive/single-path-solve.test.d.ts.map +1 -0
- package/dist/test/adaptive/single-path-solve.test.js +204 -0
- package/dist/test/adaptive/single-path-solve.test.js.map +1 -0
- package/dist/test/anti-redundancy-budget.test.d.ts +17 -0
- package/dist/test/anti-redundancy-budget.test.d.ts.map +1 -0
- package/dist/test/anti-redundancy-budget.test.js +197 -0
- package/dist/test/anti-redundancy-budget.test.js.map +1 -0
- package/dist/test/chunk-persistence.test.d.ts +29 -0
- package/dist/test/chunk-persistence.test.d.ts.map +1 -0
- package/dist/test/chunk-persistence.test.js +290 -0
- package/dist/test/chunk-persistence.test.js.map +1 -0
- package/dist/test/compression-dedup.test.d.ts +20 -0
- package/dist/test/compression-dedup.test.d.ts.map +1 -0
- package/dist/test/compression-dedup.test.js +92 -0
- package/dist/test/compression-dedup.test.js.map +1 -0
- package/dist/test/compression-shape-invariants.test.js +40 -3
- package/dist/test/compression-shape-invariants.test.js.map +1 -1
- package/dist/test/head-window-order.test.d.ts +19 -0
- package/dist/test/head-window-order.test.d.ts.map +1 -0
- package/dist/test/head-window-order.test.js +159 -0
- package/dist/test/head-window-order.test.js.map +1 -0
- package/dist/test/image-strip-render-stats.test.js +25 -3
- package/dist/test/image-strip-render-stats.test.js.map +1 -1
- package/dist/test/knowledge-tool-boundary.test.d.ts +14 -0
- package/dist/test/knowledge-tool-boundary.test.d.ts.map +1 -0
- package/dist/test/knowledge-tool-boundary.test.js +93 -0
- package/dist/test/knowledge-tool-boundary.test.js.map +1 -0
- package/dist/test/l1-holdback.test.d.ts +15 -0
- package/dist/test/l1-holdback.test.d.ts.map +1 -0
- package/dist/test/l1-holdback.test.js +119 -0
- package/dist/test/l1-holdback.test.js.map +1 -0
- package/dist/test/merge-contiguity.test.d.ts +11 -0
- package/dist/test/merge-contiguity.test.d.ts.map +1 -0
- package/dist/test/merge-contiguity.test.js +82 -0
- package/dist/test/merge-contiguity.test.js.map +1 -0
- package/dist/test/message-store-window.test.d.ts +13 -0
- package/dist/test/message-store-window.test.d.ts.map +1 -0
- package/dist/test/message-store-window.test.js +177 -0
- package/dist/test/message-store-window.test.js.map +1 -0
- package/dist/test/speculation-cap.test.js +4 -0
- package/dist/test/speculation-cap.test.js.map +1 -1
- package/dist/test/strategy-persistence.test.js +41 -0
- package/dist/test/strategy-persistence.test.js.map +1 -1
- package/dist/test/summary-log-consistency.test.d.ts +17 -0
- package/dist/test/summary-log-consistency.test.d.ts.map +1 -0
- package/dist/test/summary-log-consistency.test.js +102 -0
- package/dist/test/summary-log-consistency.test.js.map +1 -0
- package/dist/test/tool-pairing-invariant.test.d.ts +15 -0
- package/dist/test/tool-pairing-invariant.test.d.ts.map +1 -0
- package/dist/test/tool-pairing-invariant.test.js +225 -0
- package/dist/test/tool-pairing-invariant.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -3
- package/src/adaptive/kv-control.ts +509 -184
- package/src/adaptive/picker.ts +8 -0
- package/src/adaptive/strategies/kv-stable.ts +22 -10
- package/src/context-log.ts +11 -0
- package/src/context-manager.ts +48 -2
- package/src/index.ts +3 -2
- package/src/message-store.ts +202 -9
- package/src/strategies/autobiographical.ts +1576 -166
- package/src/strategies/index.ts +1 -1
- package/src/strategies/knowledge.ts +25 -1
- package/src/types/strategy.ts +97 -5
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bug 6.7: context-manager had no full post-selection tool-pair validation —
|
|
3
|
+
* only trailing (`trimOrphanedToolUse`) and leading orphan trims. Mid-list
|
|
4
|
+
* orphans (a budget break cutting a raw pin pair; the uncompressed-chunk
|
|
5
|
+
* fallback emitting a raw tool_result whose tool_use chunk already
|
|
6
|
+
* compressed) sailed through to the wire layer.
|
|
7
|
+
*
|
|
8
|
+
* `enforceToolPairing` is the final structural pass in selectHierarchical:
|
|
9
|
+
* every tool_use must be answered by a matching tool_result in the
|
|
10
|
+
* immediately-following entry, and every tool_result must answer a tool_use
|
|
11
|
+
* in the immediately-preceding entry. Repair prefers preserving pairs
|
|
12
|
+
* (stub tool_result) over dropping content.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, before, after } from 'node:test';
|
|
15
|
+
import assert from 'node:assert';
|
|
16
|
+
import { rmSync, existsSync } from 'node:fs';
|
|
17
|
+
import { AutobiographicalStrategy, ContextManager } from '../src/index.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Invariant checker (mirrors the Anthropic API's structural rules)
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function assertPaired(entries) {
|
|
22
|
+
for (let i = 0; i < entries.length; i++) {
|
|
23
|
+
for (const block of entries[i].content) {
|
|
24
|
+
if (block.type === 'tool_use') {
|
|
25
|
+
const id = block.id;
|
|
26
|
+
const next = entries[i + 1];
|
|
27
|
+
assert.ok(next?.content.some((b) => b.type === 'tool_result' && b.toolUseId === id), `entries[${i}]: tool_use ${id} not answered in entries[${i + 1}]`);
|
|
28
|
+
}
|
|
29
|
+
if (block.type === 'tool_result') {
|
|
30
|
+
const tid = block.toolUseId;
|
|
31
|
+
const prev = entries[i - 1];
|
|
32
|
+
assert.ok(prev?.content.some((b) => b.type === 'tool_use' && b.id === tid), `entries[${i}]: tool_result ${tid} has no tool_use in entries[${i - 1}]`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function entry(participant, content) {
|
|
38
|
+
return { index: 0, participant, content };
|
|
39
|
+
}
|
|
40
|
+
function text(t) {
|
|
41
|
+
return { type: 'text', text: t };
|
|
42
|
+
}
|
|
43
|
+
function use(id) {
|
|
44
|
+
return { type: 'tool_use', id, name: 'fn', input: {} };
|
|
45
|
+
}
|
|
46
|
+
function result(id, body = 'ok') {
|
|
47
|
+
return { type: 'tool_result', toolUseId: id, content: body };
|
|
48
|
+
}
|
|
49
|
+
function runEnforce(entries) {
|
|
50
|
+
const strategy = new AutobiographicalStrategy({});
|
|
51
|
+
strategy
|
|
52
|
+
.enforceToolPairing(entries);
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
describe('enforceToolPairing — post-selection pairing validator', () => {
|
|
56
|
+
it('leaves already-valid output untouched', () => {
|
|
57
|
+
const entries = [
|
|
58
|
+
entry('User', [text('hello')]),
|
|
59
|
+
entry('Claude', [text('working'), use('A')]),
|
|
60
|
+
entry('User', [result('A')]),
|
|
61
|
+
entry('Claude', [text('done')]),
|
|
62
|
+
];
|
|
63
|
+
entries.forEach((e, i) => { e.index = i; });
|
|
64
|
+
const snapshot = JSON.stringify(entries);
|
|
65
|
+
runEnforce(entries);
|
|
66
|
+
assert.strictEqual(JSON.stringify(entries), snapshot, 'valid input must pass through unchanged');
|
|
67
|
+
assertPaired(entries);
|
|
68
|
+
});
|
|
69
|
+
it('drops a mid-list orphan tool_result (its tool_use was compressed away)', () => {
|
|
70
|
+
const entries = [
|
|
71
|
+
entry('Claude', [text('summary of earlier work')]),
|
|
72
|
+
// Raw tool_result whose tool_use chunk already compressed — the
|
|
73
|
+
// uncompressed-chunk fallback shape.
|
|
74
|
+
entry('User', [result('GONE', 'orphaned payload')]),
|
|
75
|
+
entry('Claude', [text('later message')]),
|
|
76
|
+
];
|
|
77
|
+
runEnforce(entries);
|
|
78
|
+
assertPaired(entries);
|
|
79
|
+
// Entry preserved as a placeholder, not silently deleted.
|
|
80
|
+
assert.strictEqual(entries.length, 3);
|
|
81
|
+
assert.ok(entries[1].content.every((b) => b.type !== 'tool_result'), 'orphan tool_result block must be removed');
|
|
82
|
+
});
|
|
83
|
+
it('stubs a mid-list tool_use whose result entry was dropped by a budget break', () => {
|
|
84
|
+
const entries = [
|
|
85
|
+
entry('Claude', [text('let me check'), use('A')]),
|
|
86
|
+
// The tool_result entry got cut by a budget break; next entry is
|
|
87
|
+
// ordinary conversation.
|
|
88
|
+
entry('User', [text('unrelated next message')]),
|
|
89
|
+
entry('Claude', [text('reply')]),
|
|
90
|
+
];
|
|
91
|
+
runEnforce(entries);
|
|
92
|
+
assertPaired(entries);
|
|
93
|
+
// The tool_use is preserved (not dropped) and answered by a stub.
|
|
94
|
+
assert.ok(entries[0].content.some((b) => b.type === 'tool_use'), 'tool_use must be preserved');
|
|
95
|
+
const stub = entries[1];
|
|
96
|
+
assert.ok(stub.content.some((b) => b.type === 'tool_result' && b.toolUseId === 'A'), 'a stub tool_result entry must be inserted immediately after the tool_use');
|
|
97
|
+
});
|
|
98
|
+
it('adds stubs for partially-answered parallel tool_use blocks', () => {
|
|
99
|
+
const entries = [
|
|
100
|
+
entry('Claude', [use('A'), use('B'), use('C')]),
|
|
101
|
+
entry('User', [result('B')]),
|
|
102
|
+
entry('Claude', [text('continues')]),
|
|
103
|
+
];
|
|
104
|
+
runEnforce(entries);
|
|
105
|
+
assertPaired(entries);
|
|
106
|
+
const ids = entries[1].content
|
|
107
|
+
.filter((b) => b.type === 'tool_result')
|
|
108
|
+
.map((b) => b.toolUseId)
|
|
109
|
+
.sort();
|
|
110
|
+
assert.deepStrictEqual(ids, ['A', 'B', 'C'], 'missing results must be stubbed alongside the real one');
|
|
111
|
+
});
|
|
112
|
+
it('repairs a recall pair interleaved between a tool_use and its (now non-adjacent) result', () => {
|
|
113
|
+
const entries = [
|
|
114
|
+
entry('Claude', [use('A')]),
|
|
115
|
+
// A recall pair landed between the pair members.
|
|
116
|
+
entry('Context Manager', [text('[CM] Recall memory L1-3.')]),
|
|
117
|
+
entry('Claude', [text('I remember researching X.')]),
|
|
118
|
+
entry('User', [result('A', 'the real result, now orphaned')]),
|
|
119
|
+
];
|
|
120
|
+
runEnforce(entries);
|
|
121
|
+
assertPaired(entries);
|
|
122
|
+
// Look-ahead relocation: the REAL result payload must be preserved, not
|
|
123
|
+
// dropped in favour of a stub (roast finding #2).
|
|
124
|
+
const preserved = entries.some((e) => e.content.some((b) => b.type === 'tool_result' &&
|
|
125
|
+
b.toolUseId === 'A' &&
|
|
126
|
+
b.content === 'the real result, now orphaned'));
|
|
127
|
+
assert.ok(preserved, 'the genuine tool result must be relocated, not replaced by a stub');
|
|
128
|
+
});
|
|
129
|
+
it('handles consecutive tool_use entries (double budget cut)', () => {
|
|
130
|
+
const entries = [
|
|
131
|
+
entry('Claude', [use('A')]),
|
|
132
|
+
entry('Claude', [use('B')]),
|
|
133
|
+
entry('User', [result('B')]),
|
|
134
|
+
];
|
|
135
|
+
runEnforce(entries);
|
|
136
|
+
assertPaired(entries);
|
|
137
|
+
});
|
|
138
|
+
it('appends a stub entry for a trailing unanswered tool_use', () => {
|
|
139
|
+
const entries = [
|
|
140
|
+
entry('User', [text('hi')]),
|
|
141
|
+
entry('Claude', [text('checking'), use('C')]),
|
|
142
|
+
];
|
|
143
|
+
runEnforce(entries);
|
|
144
|
+
assertPaired(entries);
|
|
145
|
+
assert.strictEqual(entries.length, 3, 'a stub results entry must be appended');
|
|
146
|
+
assert.ok(entries[2].content.some((b) => b.type === 'tool_result' && b.toolUseId === 'C'));
|
|
147
|
+
});
|
|
148
|
+
it('dedupes duplicate tool_results for the same id', () => {
|
|
149
|
+
const entries = [
|
|
150
|
+
entry('Claude', [use('A')]),
|
|
151
|
+
entry('User', [result('A', 'first'), result('A', 'second')]),
|
|
152
|
+
];
|
|
153
|
+
runEnforce(entries);
|
|
154
|
+
assertPaired(entries);
|
|
155
|
+
const count = entries[1].content.filter((b) => b.type === 'tool_result').length;
|
|
156
|
+
assert.strictEqual(count, 1, 'duplicate tool_result for the same id must be dropped');
|
|
157
|
+
});
|
|
158
|
+
it('reindexes entries after inserting stub entries', () => {
|
|
159
|
+
const entries = [
|
|
160
|
+
entry('Claude', [use('A')]),
|
|
161
|
+
entry('User', [text('not a result')]),
|
|
162
|
+
];
|
|
163
|
+
runEnforce(entries);
|
|
164
|
+
assertPaired(entries);
|
|
165
|
+
for (let i = 0; i < entries.length; i++) {
|
|
166
|
+
assert.strictEqual(entries[i].index, i, `entry ${i} has stale index ${entries[i].index}`);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Regression: the guard must run on the ADAPTIVE render path too. FKM defaults
|
|
172
|
+
// autobiographical strategies onto `selectAdaptive` (adaptiveResolution=true),
|
|
173
|
+
// which has the same mid-list orphan producers as the hierarchical path but
|
|
174
|
+
// only received `trimOrphanedToolUse` before this fix. See roast finding #1.
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
describe('enforceToolPairing — wired into the adaptive render path (FKM default)', () => {
|
|
177
|
+
const STORE = './test-tool-pairing-adaptive';
|
|
178
|
+
const clean = () => { if (existsSync(STORE))
|
|
179
|
+
rmSync(STORE, { recursive: true, force: true }); };
|
|
180
|
+
before(clean);
|
|
181
|
+
after(clean);
|
|
182
|
+
it('repairs a mid-list orphan produced on the adaptive path', async () => {
|
|
183
|
+
clean();
|
|
184
|
+
// Inject a mid-list orphan tool_use into the merged entries at the exact
|
|
185
|
+
// point `selectAdaptive` hands off to the final structural passes — the
|
|
186
|
+
// shape a budget break or recall-pair interleave produces. It is spliced
|
|
187
|
+
// NOT at the tail, so `trimOrphanedToolUse` (trailing-only) cannot remove
|
|
188
|
+
// it; only `enforceToolPairing` can. If the guard is not wired into
|
|
189
|
+
// `selectAdaptive`, the orphan survives and `assertPaired` fails.
|
|
190
|
+
class InjectingStrategy extends AutobiographicalStrategy {
|
|
191
|
+
mergeAdjacentBodyGroupRaw(entries, store) {
|
|
192
|
+
const merged = super.mergeAdjacentBodyGroupRaw(entries, store);
|
|
193
|
+
if (merged.length >= 2) {
|
|
194
|
+
merged.splice(1, 0, {
|
|
195
|
+
index: 1,
|
|
196
|
+
participant: 'Claude',
|
|
197
|
+
content: [use('MIDLIST_ORPHAN')],
|
|
198
|
+
});
|
|
199
|
+
merged.forEach((e, i) => { e.index = i; });
|
|
200
|
+
}
|
|
201
|
+
return merged;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const strategy = new InjectingStrategy({ adaptiveResolution: true });
|
|
205
|
+
const manager = await ContextManager.open({
|
|
206
|
+
path: STORE,
|
|
207
|
+
strategy,
|
|
208
|
+
membrane: { complete: async () => ({ content: [{ type: 'text', text: 's' }] }) },
|
|
209
|
+
});
|
|
210
|
+
for (let i = 0; i < 5; i++) {
|
|
211
|
+
manager.addMessage(i % 2 === 0 ? 'User' : 'Claude', [
|
|
212
|
+
{ type: 'text', text: `message number ${i}` },
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
const internals = manager;
|
|
216
|
+
const entries = strategy.select(internals.messageStore.createView(), internals.contextLog.createView(), { maxTokens: 100000, reserveForResponse: 4000 });
|
|
217
|
+
// Sanity: the override ran and the injected use was not trimmed as a tail.
|
|
218
|
+
const orphanPreserved = entries.some(e => e.content.some(b => b.type === 'tool_use' && b.id === 'MIDLIST_ORPHAN'));
|
|
219
|
+
assert.ok(orphanPreserved, 'setup: injected mid-list tool_use should survive to the pairing pass');
|
|
220
|
+
// The guard must have stubbed the orphan — output is API-valid.
|
|
221
|
+
assertPaired(entries);
|
|
222
|
+
await manager.close();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=tool-pairing-invariant.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-pairing-invariant.test.js","sourceRoot":"","sources":["../../test/tool-pairing-invariant.test.ts"],"names":[],"mappings":"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"}
|