@animalabs/agent-framework 0.13.0 → 0.15.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/agent.d.ts +10 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +39 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +36 -6
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +451 -83
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +55 -1
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +41 -1
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/gate/index.d.ts +1 -1
- package/dist/src/gate/index.d.ts.map +1 -1
- package/dist/src/gate/index.js +1 -1
- package/dist/src/gate/index.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/modules/history/index.d.ts +69 -0
- package/dist/src/modules/history/index.d.ts.map +1 -0
- package/dist/src/modules/history/index.js +519 -0
- package/dist/src/modules/history/index.js.map +1 -0
- package/dist/src/modules/history/search-regex-worker.d.ts +23 -0
- package/dist/src/modules/history/search-regex-worker.d.ts.map +1 -0
- package/dist/src/modules/history/search-regex-worker.js +57 -0
- package/dist/src/modules/history/search-regex-worker.js.map +1 -0
- package/dist/src/modules/index.d.ts +1 -0
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -0
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +42 -1
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +5 -0
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/tool-image-ledger.d.ts +175 -0
- package/dist/src/tool-image-ledger.d.ts.map +1 -0
- package/dist/src/tool-image-ledger.js +257 -0
- package/dist/src/tool-image-ledger.js.map +1 -0
- package/dist/src/tool-result-history.d.ts +15 -2
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +16 -9
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/types/agent.d.ts +10 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +4 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/event-gate.test.js +84 -1
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/history-module.test.d.ts +2 -0
- package/dist/test/history-module.test.d.ts.map +1 -0
- package/dist/test/history-module.test.js +449 -0
- package/dist/test/history-module.test.js.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +2 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.js +189 -0
- package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -0
- package/dist/test/kv-unified-wiring.test.js +39 -0
- package/dist/test/kv-unified-wiring.test.js.map +1 -1
- package/dist/test/puppet-tool-call.test.js +114 -1
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +2 -0
- package/dist/test/puppet-turn-reservation.test.d.ts.map +1 -0
- package/dist/test/puppet-turn-reservation.test.js +139 -0
- package/dist/test/puppet-turn-reservation.test.js.map +1 -0
- package/dist/test/save-recent-image.test.d.ts +26 -0
- package/dist/test/save-recent-image.test.d.ts.map +1 -0
- package/dist/test/save-recent-image.test.js +736 -0
- package/dist/test/save-recent-image.test.js.map +1 -0
- package/dist/test/tool-result-spill.test.js +114 -0
- package/dist/test/tool-result-spill.test.js.map +1 -1
- package/dist/test/turn-trigger-provenance.test.js +17 -0
- package/dist/test/turn-trigger-provenance.test.js.map +1 -1
- package/dist/test/workspace-read-text.test.d.ts +2 -0
- package/dist/test/workspace-read-text.test.d.ts.map +1 -0
- package/dist/test/workspace-read-text.test.js +101 -0
- package/dist/test/workspace-read-text.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +41 -0
- package/src/framework.ts +519 -95
- package/src/gate/event-gate.ts +71 -3
- package/src/gate/index.ts +1 -1
- package/src/index.ts +1 -1
- package/src/modules/history/index.ts +613 -0
- package/src/modules/history/search-regex-worker.ts +76 -0
- package/src/modules/index.ts +2 -0
- package/src/modules/workspace/index.ts +42 -1
- package/src/modules/workspace/types.ts +5 -0
- package/src/tool-image-ledger.ts +334 -0
- package/src/tool-result-history.ts +30 -9
- package/src/types/agent.ts +10 -0
- package/src/types/trace.ts +4 -0
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { HistoryModule } from '../src/modules/history/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* HistoryModule's own logic is dispatch (always via
|
|
6
|
+
* queryMessagesByTimeAndChannel, per context-manager's own test evidence
|
|
7
|
+
* that it already handles "only one filter" and "neither filter"), input
|
|
8
|
+
* validation (ISO dates, regex, limit capping), and presentation (content
|
|
9
|
+
* flattening, snippet extraction, truncation detection). The underlying
|
|
10
|
+
* index-query *correctness* is context-manager's own responsibility and is
|
|
11
|
+
* covered by its test suite (test/message-store-history-index.test.ts) — so
|
|
12
|
+
* this stub implements realistic-but-simple in-memory filtering over a small
|
|
13
|
+
* fixture rather than standing up a real chronicle store, and a `calls` log
|
|
14
|
+
* lets tests assert on exactly what HistoryModule asked for (e.g. the capped
|
|
15
|
+
* limit).
|
|
16
|
+
*/
|
|
17
|
+
function textBlock(text) {
|
|
18
|
+
return { type: 'text', text };
|
|
19
|
+
}
|
|
20
|
+
function metaFor(channelId) {
|
|
21
|
+
return channelId ? { external: { channelId } } : undefined;
|
|
22
|
+
}
|
|
23
|
+
function msg(id, ms, participant, content, channelId) {
|
|
24
|
+
return {
|
|
25
|
+
id,
|
|
26
|
+
sequence: Number(id.replace(/\D/g, '')),
|
|
27
|
+
participant,
|
|
28
|
+
content,
|
|
29
|
+
metadata: metaFor(channelId),
|
|
30
|
+
timestamp: new Date(ms),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function channelIdOf(m) {
|
|
34
|
+
return m.metadata?.external?.channelId;
|
|
35
|
+
}
|
|
36
|
+
/** Trivial, deterministic stand-in for real token estimation — tests only
|
|
37
|
+
* assert on shape/filtering, never on the exact number. */
|
|
38
|
+
function estimate(m) {
|
|
39
|
+
return m.content.reduce((n, b) => n + (b.type === 'text' ? b.text.length : 4), 0);
|
|
40
|
+
}
|
|
41
|
+
function buildStub(messages, opts = {}) {
|
|
42
|
+
const calls = [];
|
|
43
|
+
const unsupported = () => {
|
|
44
|
+
throw new Error('Chronicle history index unsupported: native field-index capability absent on this chronicle build.');
|
|
45
|
+
};
|
|
46
|
+
const cm = {
|
|
47
|
+
queryMessagesByTimeAndChannel(args) {
|
|
48
|
+
calls.push({ method: 'queryMessagesByTimeAndChannel', args });
|
|
49
|
+
if (opts.throwUnsupported)
|
|
50
|
+
return unsupported();
|
|
51
|
+
const filtered = messages.filter((m) => {
|
|
52
|
+
const ts = m.timestamp.getTime();
|
|
53
|
+
if (args.fromMs !== undefined && ts < args.fromMs)
|
|
54
|
+
return false;
|
|
55
|
+
if (args.toMs !== undefined && ts > args.toMs)
|
|
56
|
+
return false;
|
|
57
|
+
if (args.channelId !== undefined && channelIdOf(m) !== args.channelId)
|
|
58
|
+
return false;
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
const matchedCount = filtered.length;
|
|
62
|
+
const offset = args.offset ?? 0;
|
|
63
|
+
const limit = args.limit ?? filtered.length;
|
|
64
|
+
return { messages: filtered.slice(offset, offset + limit), matchedCount };
|
|
65
|
+
},
|
|
66
|
+
getChannelMessageCounts() {
|
|
67
|
+
calls.push({ method: 'getChannelMessageCounts', args: undefined });
|
|
68
|
+
if (opts.throwUnsupported)
|
|
69
|
+
return unsupported();
|
|
70
|
+
const counts = new Map();
|
|
71
|
+
for (const m of messages) {
|
|
72
|
+
const c = channelIdOf(m);
|
|
73
|
+
if (c)
|
|
74
|
+
counts.set(c, (counts.get(c) ?? 0) + 1);
|
|
75
|
+
}
|
|
76
|
+
return [...counts.entries()].map(([channelId, count]) => ({ channelId, messages: count }));
|
|
77
|
+
},
|
|
78
|
+
getChannelTokenStats(args) {
|
|
79
|
+
calls.push({ method: 'getChannelTokenStats', args });
|
|
80
|
+
if (opts.throwUnsupported)
|
|
81
|
+
return unsupported();
|
|
82
|
+
const inRange = messages.filter((m) => {
|
|
83
|
+
const ts = m.timestamp.getTime();
|
|
84
|
+
if (args?.fromMs !== undefined && ts < args.fromMs)
|
|
85
|
+
return false;
|
|
86
|
+
if (args?.toMs !== undefined && ts > args.toMs)
|
|
87
|
+
return false;
|
|
88
|
+
return true;
|
|
89
|
+
});
|
|
90
|
+
const byChannel = new Map();
|
|
91
|
+
let totalTokensEstimate = 0;
|
|
92
|
+
for (const m of inRange) {
|
|
93
|
+
const est = estimate(m);
|
|
94
|
+
totalTokensEstimate += est;
|
|
95
|
+
const c = channelIdOf(m);
|
|
96
|
+
if (c) {
|
|
97
|
+
const agg = byChannel.get(c) ?? { messages: 0, tokensEstimate: 0 };
|
|
98
|
+
agg.messages++;
|
|
99
|
+
agg.tokensEstimate += est;
|
|
100
|
+
byChannel.set(c, agg);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
totalMessages: inRange.length,
|
|
105
|
+
totalTokensEstimate,
|
|
106
|
+
byChannel: [...byChannel.entries()].map(([channelId, agg]) => ({ channelId, ...agg })),
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
return { cm, calls };
|
|
111
|
+
}
|
|
112
|
+
function call(name, input) {
|
|
113
|
+
return { id: `call-${name}`, name, input };
|
|
114
|
+
}
|
|
115
|
+
// Fixture: two channels (c1, c2), one channel-less message, spread across
|
|
116
|
+
// distinct timestamps so time-range filtering is exercisable.
|
|
117
|
+
const FIXTURE = [
|
|
118
|
+
msg('m1', 1000, 'User', [textBlock('hello world')], 'c1'),
|
|
119
|
+
msg('m2', 2000, 'Claude', [{ type: 'tool_use', id: 't1', name: 'search', input: {} }], 'c1'),
|
|
120
|
+
msg('m3', 3000, 'User', [textBlock('foo BAR baz')], 'c2'),
|
|
121
|
+
msg('m4', 4000, 'Claude', [{ type: 'thinking', thinking: 'hmm' }, textBlock('final answer')], 'c2'),
|
|
122
|
+
msg('m5', 5000, 'User', [textBlock('unchanneled message')]),
|
|
123
|
+
msg('m6', 6000, 'User', [textBlock('another c1 message with searchterm inside')], 'c1'),
|
|
124
|
+
];
|
|
125
|
+
describe('HistoryModule', () => {
|
|
126
|
+
describe('stats', () => {
|
|
127
|
+
it('reports all-time message counts and range-scoped token stats separately', async () => {
|
|
128
|
+
const { cm } = buildStub(FIXTURE);
|
|
129
|
+
const h = new HistoryModule();
|
|
130
|
+
h.bind(cm);
|
|
131
|
+
// Range covers only m3..m5 (3000-5000), but messageCountsAllTime must
|
|
132
|
+
// still reflect the whole store.
|
|
133
|
+
const result = await h.handleToolCall(call('stats', { from: new Date(3000).toISOString(), to: new Date(5000).toISOString() }));
|
|
134
|
+
assert.equal(result.success, true, result.error);
|
|
135
|
+
const data = result.data;
|
|
136
|
+
const allTimeByChannel = new Map(data.messageCountsAllTime.map((c) => [c.channelId, c.messages]));
|
|
137
|
+
assert.equal(allTimeByChannel.get('c1'), 3); // m1, m2, m6 — unaffected by the range
|
|
138
|
+
assert.equal(allTimeByChannel.get('c2'), 2); // m3, m4
|
|
139
|
+
assert.equal(data.tokenStatsForRange.totalMessages, 3); // m3, m4, m5
|
|
140
|
+
const rangeByChannel = new Map(data.tokenStatsForRange.byChannel.map((c) => [c.channelId, c.messages]));
|
|
141
|
+
assert.equal(rangeByChannel.get('c2'), 2); // m3 and m4 both fall in [3000,5000]
|
|
142
|
+
assert.equal(rangeByChannel.has('c1'), false); // no c1 message falls in [3000,5000]
|
|
143
|
+
});
|
|
144
|
+
it('filters both parts of the response to one channelId when given', async () => {
|
|
145
|
+
const { cm } = buildStub(FIXTURE);
|
|
146
|
+
const h = new HistoryModule();
|
|
147
|
+
h.bind(cm);
|
|
148
|
+
const result = await h.handleToolCall(call('stats', { channelId: 'c1' }));
|
|
149
|
+
assert.equal(result.success, true, result.error);
|
|
150
|
+
const data = result.data;
|
|
151
|
+
assert.deepEqual(data.messageCountsAllTime.map((c) => c.channelId), ['c1']);
|
|
152
|
+
assert.deepEqual(data.tokenStatsForRange.byChannel.map((c) => c.channelId), ['c1']);
|
|
153
|
+
});
|
|
154
|
+
it('rejects an invalid ISO date cleanly instead of throwing', async () => {
|
|
155
|
+
const { cm } = buildStub(FIXTURE);
|
|
156
|
+
const h = new HistoryModule();
|
|
157
|
+
h.bind(cm);
|
|
158
|
+
const result = await h.handleToolCall(call('stats', { from: 'not-a-date' }));
|
|
159
|
+
assert.equal(result.success, false);
|
|
160
|
+
assert.equal(result.isError, true);
|
|
161
|
+
assert.match(result.error ?? '', /Invalid ISO 8601 date/);
|
|
162
|
+
});
|
|
163
|
+
it('surfaces the capability-absent error as a clean tool error, not a crash', async () => {
|
|
164
|
+
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
165
|
+
const h = new HistoryModule();
|
|
166
|
+
h.bind(cm);
|
|
167
|
+
const result = await h.handleToolCall(call('stats', {}));
|
|
168
|
+
assert.equal(result.success, false);
|
|
169
|
+
assert.equal(result.isError, true);
|
|
170
|
+
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('extract', () => {
|
|
174
|
+
it('filters by channel and date range', async () => {
|
|
175
|
+
const { cm } = buildStub(FIXTURE);
|
|
176
|
+
const h = new HistoryModule();
|
|
177
|
+
h.bind(cm);
|
|
178
|
+
const result = await h.handleToolCall(call('extract', { channelId: 'c1', from: new Date(1500).toISOString() }));
|
|
179
|
+
assert.equal(result.success, true, result.error);
|
|
180
|
+
const data = result.data;
|
|
181
|
+
// c1 messages at ts >= 1500: m2 (2000), m6 (6000) — m1 (1000) excluded.
|
|
182
|
+
assert.deepEqual(data.messages.map((m) => m.id), ['m2', 'm6']);
|
|
183
|
+
assert.equal(data.returned, 2);
|
|
184
|
+
assert.equal(data.matchedCount, 2);
|
|
185
|
+
});
|
|
186
|
+
it('format:"text" flattens content; format:"raw" returns blocks as-is', async () => {
|
|
187
|
+
const { cm } = buildStub(FIXTURE);
|
|
188
|
+
const h = new HistoryModule();
|
|
189
|
+
h.bind(cm);
|
|
190
|
+
const textResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'text' }));
|
|
191
|
+
const textData = textResult.data;
|
|
192
|
+
const m4 = textData.messages.find((m) => m.id === 'm4');
|
|
193
|
+
assert.equal(m4.content, '[thinking] final answer');
|
|
194
|
+
const rawResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'raw' }));
|
|
195
|
+
const rawData = rawResult.data;
|
|
196
|
+
const m4Raw = rawData.messages.find((m) => m.id === 'm4');
|
|
197
|
+
assert.ok(Array.isArray(m4Raw.content));
|
|
198
|
+
assert.equal(m4Raw.content.length, 2);
|
|
199
|
+
assert.equal(m4Raw.content[0]?.type, 'thinking');
|
|
200
|
+
});
|
|
201
|
+
it('caps limit at the hard maximum before it reaches context-manager', async () => {
|
|
202
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
203
|
+
const h = new HistoryModule();
|
|
204
|
+
h.bind(cm);
|
|
205
|
+
await h.handleToolCall(call('extract', { limit: 999999 }));
|
|
206
|
+
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
207
|
+
assert.equal((queryCall?.args).limit, 200);
|
|
208
|
+
});
|
|
209
|
+
it('clamps an out-of-u32-range offset to the native ceiling instead of passing it through to wrap (reviewer repro)', async () => {
|
|
210
|
+
// Number.MAX_SAFE_INTEGER is not a safe ceiling for a value that
|
|
211
|
+
// eventually crosses into a native u32 argument: 4294967296 (one past
|
|
212
|
+
// u32 max) must be clamped to 4294967295, not passed through as-is —
|
|
213
|
+
// otherwise it wraps/truncates at the N-API boundary into a small
|
|
214
|
+
// offset and silently returns the wrong page instead of an empty one.
|
|
215
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
216
|
+
const h = new HistoryModule();
|
|
217
|
+
h.bind(cm);
|
|
218
|
+
await h.handleToolCall(call('extract', { offset: 4294967296, limit: 1 }));
|
|
219
|
+
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
220
|
+
assert.equal((queryCall?.args).offset, 4294967295);
|
|
221
|
+
});
|
|
222
|
+
it('surfaces the capability-absent error cleanly', async () => {
|
|
223
|
+
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
224
|
+
const h = new HistoryModule();
|
|
225
|
+
h.bind(cm);
|
|
226
|
+
const result = await h.handleToolCall(call('extract', {}));
|
|
227
|
+
assert.equal(result.success, false);
|
|
228
|
+
assert.equal(result.isError, true);
|
|
229
|
+
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe('search', () => {
|
|
233
|
+
it('matches a case-insensitive substring by default', async () => {
|
|
234
|
+
const { cm } = buildStub(FIXTURE);
|
|
235
|
+
const h = new HistoryModule();
|
|
236
|
+
h.bind(cm);
|
|
237
|
+
const result = await h.handleToolCall(call('search', { query: 'bar' }));
|
|
238
|
+
assert.equal(result.success, true, result.error);
|
|
239
|
+
const data = result.data;
|
|
240
|
+
assert.deepEqual(data.matches.map((m) => m.id), ['m3']);
|
|
241
|
+
assert.match(data.matches[0].snippet, /BAR/);
|
|
242
|
+
});
|
|
243
|
+
it('limit:0 (substring) returns zero matches instead of one (reviewer repro)', async () => {
|
|
244
|
+
// clampCount accepts 0 as a valid value (it's >= 0). Both matching
|
|
245
|
+
// loops used to push a match onto the results array BEFORE checking
|
|
246
|
+
// the limit, so with a matching candidate present, limit:0 still
|
|
247
|
+
// returned exactly 1 match.
|
|
248
|
+
const { cm } = buildStub(FIXTURE);
|
|
249
|
+
const h = new HistoryModule();
|
|
250
|
+
h.bind(cm);
|
|
251
|
+
const result = await h.handleToolCall(call('search', { query: 'bar', limit: 0 }));
|
|
252
|
+
assert.equal(result.success, true, result.error);
|
|
253
|
+
const data = result.data;
|
|
254
|
+
assert.equal(data.matches.length, 0);
|
|
255
|
+
});
|
|
256
|
+
it('limit:0 (regex) returns zero matches instead of one (reviewer repro)', async () => {
|
|
257
|
+
// Same bug, independently, in search-regex-worker.ts's own copy of
|
|
258
|
+
// the match loop.
|
|
259
|
+
const { cm } = buildStub(FIXTURE);
|
|
260
|
+
const h = new HistoryModule();
|
|
261
|
+
h.bind(cm);
|
|
262
|
+
const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true, limit: 0 }));
|
|
263
|
+
assert.equal(result.success, true, result.error);
|
|
264
|
+
const data = result.data;
|
|
265
|
+
assert.equal(data.matches.length, 0);
|
|
266
|
+
});
|
|
267
|
+
it('caseSensitive:true respects case', async () => {
|
|
268
|
+
const { cm } = buildStub(FIXTURE);
|
|
269
|
+
const h = new HistoryModule();
|
|
270
|
+
h.bind(cm);
|
|
271
|
+
const result = await h.handleToolCall(call('search', { query: 'bar', caseSensitive: true }));
|
|
272
|
+
assert.equal(result.success, true, result.error);
|
|
273
|
+
const data = result.data;
|
|
274
|
+
assert.equal(data.matches.length, 0); // fixture only has "BAR", not "bar"
|
|
275
|
+
});
|
|
276
|
+
it('matches a regex', async () => {
|
|
277
|
+
const { cm } = buildStub(FIXTURE);
|
|
278
|
+
const h = new HistoryModule();
|
|
279
|
+
h.bind(cm);
|
|
280
|
+
const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true }));
|
|
281
|
+
assert.equal(result.success, true, result.error);
|
|
282
|
+
const data = result.data;
|
|
283
|
+
assert.deepEqual(data.matches.map((m) => m.id), ['m1']);
|
|
284
|
+
});
|
|
285
|
+
it('forcibly terminates a catastrophically-backtracking (ReDoS) regex instead of hanging', async () => {
|
|
286
|
+
// Reviewer's repro: 32 'a's followed by a non-matching character, plus
|
|
287
|
+
// a classic exponential-backtracking pattern. `(a+)+$` against this
|
|
288
|
+
// input backtracks exponentially and (verified separately in an
|
|
289
|
+
// isolated child process) has to be force-killed after several
|
|
290
|
+
// seconds; the equivalent linear pattern `^a+$` returns instantly.
|
|
291
|
+
// This must never block the framework's single event loop — matching
|
|
292
|
+
// has to happen off-thread with a real, forcible deadline.
|
|
293
|
+
const evil = 'a'.repeat(32) + '!';
|
|
294
|
+
const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock(evil)], 'c1')]);
|
|
295
|
+
const h = new HistoryModule();
|
|
296
|
+
h.bind(cm);
|
|
297
|
+
const start = Date.now();
|
|
298
|
+
const result = await h.handleToolCall(call('search', { query: '(a+)+$', regex: true, maxScan: 1 }));
|
|
299
|
+
const elapsed = Date.now() - start;
|
|
300
|
+
// Returns well within a bounded time (module deadline is 2s; generous
|
|
301
|
+
// slack here for worker spawn/CI jitter) — proves the test runner
|
|
302
|
+
// itself never hung waiting on this call.
|
|
303
|
+
assert.ok(elapsed < 8000, `search took ${elapsed}ms — should have been forcibly terminated near the deadline`);
|
|
304
|
+
// A cut-short match MUST be a clean, unambiguous failure, never
|
|
305
|
+
// success:true with an empty matches array — that would be
|
|
306
|
+
// indistinguishable from "no matches found", which is a lie.
|
|
307
|
+
assert.equal(result.success, false);
|
|
308
|
+
assert.equal(result.isError, true);
|
|
309
|
+
assert.match(result.error ?? '', /timed out/i);
|
|
310
|
+
});
|
|
311
|
+
it('a normal regex against the same kind of input still matches correctly (worker path is not just failing everything)', async () => {
|
|
312
|
+
const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock('aaaa!')], 'c1')]);
|
|
313
|
+
const h = new HistoryModule();
|
|
314
|
+
h.bind(cm);
|
|
315
|
+
const result = await h.handleToolCall(call('search', { query: '^a+!$', regex: true }));
|
|
316
|
+
assert.equal(result.success, true, result.error);
|
|
317
|
+
const data = result.data;
|
|
318
|
+
assert.deepEqual(data.matches.map((m) => m.id), ['r1']);
|
|
319
|
+
});
|
|
320
|
+
it('returns a clean error for an invalid regex instead of throwing', async () => {
|
|
321
|
+
const { cm } = buildStub(FIXTURE);
|
|
322
|
+
const h = new HistoryModule();
|
|
323
|
+
h.bind(cm);
|
|
324
|
+
const result = await h.handleToolCall(call('search', { query: '(unclosed', regex: true }));
|
|
325
|
+
assert.equal(result.success, false);
|
|
326
|
+
assert.equal(result.isError, true);
|
|
327
|
+
assert.match(result.error ?? '', /Invalid regex/);
|
|
328
|
+
});
|
|
329
|
+
it('reports truncated:true up front when the candidate window exceeds maxScan', async () => {
|
|
330
|
+
const { cm } = buildStub(FIXTURE);
|
|
331
|
+
const h = new HistoryModule();
|
|
332
|
+
h.bind(cm);
|
|
333
|
+
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: 3 }));
|
|
334
|
+
assert.equal(result.success, true, result.error);
|
|
335
|
+
const data = result.data;
|
|
336
|
+
assert.equal(data.truncated, true);
|
|
337
|
+
assert.equal(data.candidatePoolSize, 3);
|
|
338
|
+
assert.ok(data.scanned <= 3);
|
|
339
|
+
});
|
|
340
|
+
it('does not report truncated when the candidate window fits within maxScan', async () => {
|
|
341
|
+
const { cm } = buildStub(FIXTURE);
|
|
342
|
+
const h = new HistoryModule();
|
|
343
|
+
h.bind(cm);
|
|
344
|
+
const result = await h.handleToolCall(call('search', { query: 'searchterm', maxScan: 5000 }));
|
|
345
|
+
assert.equal(result.success, true, result.error);
|
|
346
|
+
const data = result.data;
|
|
347
|
+
assert.equal(data.truncated, false);
|
|
348
|
+
assert.deepEqual(data.matches.map((m) => m.id), ['m6']);
|
|
349
|
+
});
|
|
350
|
+
it('surfaces the capability-absent error cleanly', async () => {
|
|
351
|
+
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
352
|
+
const h = new HistoryModule();
|
|
353
|
+
h.bind(cm);
|
|
354
|
+
const result = await h.handleToolCall(call('search', { query: 'x' }));
|
|
355
|
+
assert.equal(result.success, false);
|
|
356
|
+
assert.equal(result.isError, true);
|
|
357
|
+
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
describe('pagination input validation', () => {
|
|
361
|
+
// Math.min(value, max) alone only enforces an UPPER bound —
|
|
362
|
+
// Math.min(-1, 200) is -1, not clamped up to anything — so a negative
|
|
363
|
+
// (or non-integer/non-finite) limit/offset/maxScan would previously
|
|
364
|
+
// reach context-manager's native query unbounded. Each of these must
|
|
365
|
+
// now be rejected before the native call is ever made.
|
|
366
|
+
const badValues = [
|
|
367
|
+
['negative', -1],
|
|
368
|
+
['non-integer', 1.5],
|
|
369
|
+
['NaN', NaN],
|
|
370
|
+
['Infinity', Infinity],
|
|
371
|
+
];
|
|
372
|
+
for (const [label, value] of badValues) {
|
|
373
|
+
it(`extract: rejects a ${label} limit before it reaches context-manager`, async () => {
|
|
374
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
375
|
+
const h = new HistoryModule();
|
|
376
|
+
h.bind(cm);
|
|
377
|
+
const result = await h.handleToolCall(call('extract', { limit: value }));
|
|
378
|
+
assert.equal(result.success, false);
|
|
379
|
+
assert.equal(result.isError, true);
|
|
380
|
+
assert.equal(calls.length, 0, 'must reject before ever calling context-manager');
|
|
381
|
+
});
|
|
382
|
+
it(`extract: rejects a ${label} offset before it reaches context-manager`, async () => {
|
|
383
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
384
|
+
const h = new HistoryModule();
|
|
385
|
+
h.bind(cm);
|
|
386
|
+
const result = await h.handleToolCall(call('extract', { offset: value }));
|
|
387
|
+
assert.equal(result.success, false);
|
|
388
|
+
assert.equal(result.isError, true);
|
|
389
|
+
assert.equal(calls.length, 0);
|
|
390
|
+
});
|
|
391
|
+
it(`search: rejects a ${label} limit before it reaches context-manager`, async () => {
|
|
392
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
393
|
+
const h = new HistoryModule();
|
|
394
|
+
h.bind(cm);
|
|
395
|
+
const result = await h.handleToolCall(call('search', { query: 'm', limit: value }));
|
|
396
|
+
assert.equal(result.success, false);
|
|
397
|
+
assert.equal(result.isError, true);
|
|
398
|
+
assert.equal(calls.length, 0);
|
|
399
|
+
});
|
|
400
|
+
it(`search: rejects a ${label} maxScan before it reaches context-manager`, async () => {
|
|
401
|
+
const { cm, calls } = buildStub(FIXTURE);
|
|
402
|
+
const h = new HistoryModule();
|
|
403
|
+
h.bind(cm);
|
|
404
|
+
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: value }));
|
|
405
|
+
assert.equal(result.success, false);
|
|
406
|
+
assert.equal(result.isError, true);
|
|
407
|
+
assert.equal(calls.length, 0);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
it('extract: a real 250-message store with limit:-1 does NOT return everything (reviewer repro)', async () => {
|
|
411
|
+
// Reviewer's exact repro shape: a store larger than the hard cap, and
|
|
412
|
+
// a negative limit that must not bypass it.
|
|
413
|
+
const many = Array.from({ length: 250 }, (_, i) => msg(`p${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
|
|
414
|
+
const { cm } = buildStub(many);
|
|
415
|
+
const h = new HistoryModule();
|
|
416
|
+
h.bind(cm);
|
|
417
|
+
const result = await h.handleToolCall(call('extract', { limit: -1 }));
|
|
418
|
+
assert.equal(result.success, false);
|
|
419
|
+
assert.equal(result.isError, true);
|
|
420
|
+
});
|
|
421
|
+
it('search: a real large candidate pool with maxScan:-2 does NOT fetch everything (reviewer repro)', async () => {
|
|
422
|
+
const many = Array.from({ length: 248 }, (_, i) => msg(`q${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
|
|
423
|
+
const { cm, calls } = buildStub(many);
|
|
424
|
+
const h = new HistoryModule();
|
|
425
|
+
h.bind(cm);
|
|
426
|
+
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: -2 }));
|
|
427
|
+
assert.equal(result.success, false);
|
|
428
|
+
assert.equal(result.isError, true);
|
|
429
|
+
assert.equal(calls.length, 0);
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
it('rejects tool calls before bind()', async () => {
|
|
433
|
+
const h = new HistoryModule();
|
|
434
|
+
const result = await h.handleToolCall(call('stats', {}));
|
|
435
|
+
assert.equal(result.success, false);
|
|
436
|
+
assert.equal(result.isError, true);
|
|
437
|
+
assert.match(result.error ?? '', /not bound/);
|
|
438
|
+
});
|
|
439
|
+
it('rejects an unknown tool name', async () => {
|
|
440
|
+
const { cm } = buildStub(FIXTURE);
|
|
441
|
+
const h = new HistoryModule();
|
|
442
|
+
h.bind(cm);
|
|
443
|
+
const result = await h.handleToolCall(call('bogus', {}));
|
|
444
|
+
assert.equal(result.success, false);
|
|
445
|
+
assert.equal(result.isError, true);
|
|
446
|
+
assert.match(result.error ?? '', /Unknown tool/);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
//# sourceMappingURL=history-module.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-module.test.js","sourceRoot":"","sources":["../../test/history-module.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-unified-open-flight-retry.test.d.ts","sourceRoot":"","sources":["../../test/kv-unified-open-flight-retry.test.ts"],"names":[],"mappings":""}
|