tuplet 2.7.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/LICENSE +21 -0
- package/README.md +136 -0
- package/dist/agent.d.ts +46 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +393 -0
- package/dist/agent.js.map +1 -0
- package/dist/built-in-agents/explore.d.ts +9 -0
- package/dist/built-in-agents/explore.d.ts.map +1 -0
- package/dist/built-in-agents/explore.js +40 -0
- package/dist/built-in-agents/explore.js.map +1 -0
- package/dist/built-in-agents/index.d.ts +15 -0
- package/dist/built-in-agents/index.d.ts.map +1 -0
- package/dist/built-in-agents/index.js +19 -0
- package/dist/built-in-agents/index.js.map +1 -0
- package/dist/built-in-agents/plan.d.ts +10 -0
- package/dist/built-in-agents/plan.d.ts.map +1 -0
- package/dist/built-in-agents/plan.js +62 -0
- package/dist/built-in-agents/plan.js.map +1 -0
- package/dist/built-in-agents/worker.d.ts +9 -0
- package/dist/built-in-agents/worker.d.ts.map +1 -0
- package/dist/built-in-agents/worker.js +53 -0
- package/dist/built-in-agents/worker.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-manager.d.ts +65 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +272 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context-manager.test.d.ts +2 -0
- package/dist/context-manager.test.d.ts.map +1 -0
- package/dist/context-manager.test.js +394 -0
- package/dist/context-manager.test.js.map +1 -0
- package/dist/executor.d.ts +29 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +399 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt/index.d.ts +9 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +10 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/main-agent-builder.d.ts +81 -0
- package/dist/prompt/main-agent-builder.d.ts.map +1 -0
- package/dist/prompt/main-agent-builder.js +287 -0
- package/dist/prompt/main-agent-builder.js.map +1 -0
- package/dist/prompt/sub-agent-builder.d.ts +133 -0
- package/dist/prompt/sub-agent-builder.d.ts.map +1 -0
- package/dist/prompt/sub-agent-builder.js +337 -0
- package/dist/prompt/sub-agent-builder.js.map +1 -0
- package/dist/prompt/templates.d.ts +87 -0
- package/dist/prompt/templates.d.ts.map +1 -0
- package/dist/prompt/templates.js +343 -0
- package/dist/prompt/templates.js.map +1 -0
- package/dist/prompt/types.d.ts +159 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +5 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/prompt.d.ts +32 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +86 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers/dataset/base.d.ts +74 -0
- package/dist/providers/dataset/base.d.ts.map +1 -0
- package/dist/providers/dataset/base.js +7 -0
- package/dist/providers/dataset/base.js.map +1 -0
- package/dist/providers/dataset/index.d.ts +8 -0
- package/dist/providers/dataset/index.d.ts.map +1 -0
- package/dist/providers/dataset/index.js +8 -0
- package/dist/providers/dataset/index.js.map +1 -0
- package/dist/providers/dataset/recorder.d.ts +46 -0
- package/dist/providers/dataset/recorder.d.ts.map +1 -0
- package/dist/providers/dataset/recorder.js +105 -0
- package/dist/providers/dataset/recorder.js.map +1 -0
- package/dist/providers/dataset/replayer.d.ts +46 -0
- package/dist/providers/dataset/replayer.d.ts.map +1 -0
- package/dist/providers/dataset/replayer.js +163 -0
- package/dist/providers/dataset/replayer.js.map +1 -0
- package/dist/providers/dataset/tester.d.ts +89 -0
- package/dist/providers/dataset/tester.d.ts.map +1 -0
- package/dist/providers/dataset/tester.js +143 -0
- package/dist/providers/dataset/tester.js.map +1 -0
- package/dist/providers/env/memory.d.ts +14 -0
- package/dist/providers/env/memory.d.ts.map +1 -0
- package/dist/providers/env/memory.js +19 -0
- package/dist/providers/env/memory.js.map +1 -0
- package/dist/providers/index.d.ts +12 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llm/base.d.ts +7 -0
- package/dist/providers/llm/base.d.ts.map +1 -0
- package/dist/providers/llm/base.js +7 -0
- package/dist/providers/llm/base.js.map +1 -0
- package/dist/providers/llm/claude.d.ts +32 -0
- package/dist/providers/llm/claude.d.ts.map +1 -0
- package/dist/providers/llm/claude.js +171 -0
- package/dist/providers/llm/claude.js.map +1 -0
- package/dist/providers/llm/openai.d.ts +26 -0
- package/dist/providers/llm/openai.d.ts.map +1 -0
- package/dist/providers/llm/openai.js +174 -0
- package/dist/providers/llm/openai.js.map +1 -0
- package/dist/providers/llm/openrouter.d.ts +43 -0
- package/dist/providers/llm/openrouter.d.ts.map +1 -0
- package/dist/providers/llm/openrouter.js +288 -0
- package/dist/providers/llm/openrouter.js.map +1 -0
- package/dist/providers/logger/base.d.ts +7 -0
- package/dist/providers/logger/base.d.ts.map +1 -0
- package/dist/providers/logger/base.js +7 -0
- package/dist/providers/logger/base.js.map +1 -0
- package/dist/providers/logger/console.d.ts +29 -0
- package/dist/providers/logger/console.d.ts.map +1 -0
- package/dist/providers/logger/console.js +70 -0
- package/dist/providers/logger/console.js.map +1 -0
- package/dist/providers/repository/base.d.ts +7 -0
- package/dist/providers/repository/base.d.ts.map +1 -0
- package/dist/providers/repository/base.js +7 -0
- package/dist/providers/repository/base.js.map +1 -0
- package/dist/providers/repository/memory.d.ts +21 -0
- package/dist/providers/repository/memory.d.ts.map +1 -0
- package/dist/providers/repository/memory.js +50 -0
- package/dist/providers/repository/memory.js.map +1 -0
- package/dist/providers/workspace/file.d.ts +26 -0
- package/dist/providers/workspace/file.d.ts.map +1 -0
- package/dist/providers/workspace/file.js +151 -0
- package/dist/providers/workspace/file.js.map +1 -0
- package/dist/providers/workspace/index.d.ts +7 -0
- package/dist/providers/workspace/index.d.ts.map +1 -0
- package/dist/providers/workspace/index.js +6 -0
- package/dist/providers/workspace/index.js.map +1 -0
- package/dist/providers/workspace/memory.d.ts +26 -0
- package/dist/providers/workspace/memory.d.ts.map +1 -0
- package/dist/providers/workspace/memory.js +136 -0
- package/dist/providers/workspace/memory.js.map +1 -0
- package/dist/providers/workspace/types.d.ts +27 -0
- package/dist/providers/workspace/types.d.ts.map +1 -0
- package/dist/providers/workspace/types.js +8 -0
- package/dist/providers/workspace/types.js.map +1 -0
- package/dist/providers/workspace/workspace-provider.test.d.ts +2 -0
- package/dist/providers/workspace/workspace-provider.test.d.ts.map +1 -0
- package/dist/providers/workspace/workspace-provider.test.js +250 -0
- package/dist/providers/workspace/workspace-provider.test.js.map +1 -0
- package/dist/shell/commands/browse.d.ts +6 -0
- package/dist/shell/commands/browse.d.ts.map +1 -0
- package/dist/shell/commands/browse.js +158 -0
- package/dist/shell/commands/browse.js.map +1 -0
- package/dist/shell/commands/cat.d.ts +6 -0
- package/dist/shell/commands/cat.d.ts.map +1 -0
- package/dist/shell/commands/cat.js +104 -0
- package/dist/shell/commands/cat.js.map +1 -0
- package/dist/shell/commands/curl.d.ts +6 -0
- package/dist/shell/commands/curl.d.ts.map +1 -0
- package/dist/shell/commands/curl.js +190 -0
- package/dist/shell/commands/curl.js.map +1 -0
- package/dist/shell/commands/date.d.ts +6 -0
- package/dist/shell/commands/date.d.ts.map +1 -0
- package/dist/shell/commands/date.js +151 -0
- package/dist/shell/commands/date.js.map +1 -0
- package/dist/shell/commands/echo.d.ts +6 -0
- package/dist/shell/commands/echo.d.ts.map +1 -0
- package/dist/shell/commands/echo.js +48 -0
- package/dist/shell/commands/echo.js.map +1 -0
- package/dist/shell/commands/env.d.ts +8 -0
- package/dist/shell/commands/env.d.ts.map +1 -0
- package/dist/shell/commands/env.js +41 -0
- package/dist/shell/commands/env.js.map +1 -0
- package/dist/shell/commands/file.d.ts +6 -0
- package/dist/shell/commands/file.d.ts.map +1 -0
- package/dist/shell/commands/file.js +213 -0
- package/dist/shell/commands/file.js.map +1 -0
- package/dist/shell/commands/find.d.ts +6 -0
- package/dist/shell/commands/find.d.ts.map +1 -0
- package/dist/shell/commands/find.js +100 -0
- package/dist/shell/commands/find.js.map +1 -0
- package/dist/shell/commands/grep.d.ts +6 -0
- package/dist/shell/commands/grep.d.ts.map +1 -0
- package/dist/shell/commands/grep.js +229 -0
- package/dist/shell/commands/grep.js.map +1 -0
- package/dist/shell/commands/head.d.ts +6 -0
- package/dist/shell/commands/head.d.ts.map +1 -0
- package/dist/shell/commands/head.js +88 -0
- package/dist/shell/commands/head.js.map +1 -0
- package/dist/shell/commands/index.d.ts +25 -0
- package/dist/shell/commands/index.d.ts.map +1 -0
- package/dist/shell/commands/index.js +43 -0
- package/dist/shell/commands/index.js.map +1 -0
- package/dist/shell/commands/jq.d.ts +8 -0
- package/dist/shell/commands/jq.d.ts.map +1 -0
- package/dist/shell/commands/jq.js +233 -0
- package/dist/shell/commands/jq.js.map +1 -0
- package/dist/shell/commands/ls.d.ts +6 -0
- package/dist/shell/commands/ls.d.ts.map +1 -0
- package/dist/shell/commands/ls.js +88 -0
- package/dist/shell/commands/ls.js.map +1 -0
- package/dist/shell/commands/mkdir.d.ts +6 -0
- package/dist/shell/commands/mkdir.d.ts.map +1 -0
- package/dist/shell/commands/mkdir.js +43 -0
- package/dist/shell/commands/mkdir.js.map +1 -0
- package/dist/shell/commands/rm.d.ts +6 -0
- package/dist/shell/commands/rm.d.ts.map +1 -0
- package/dist/shell/commands/rm.js +64 -0
- package/dist/shell/commands/rm.js.map +1 -0
- package/dist/shell/commands/sed.d.ts +6 -0
- package/dist/shell/commands/sed.d.ts.map +1 -0
- package/dist/shell/commands/sed.js +414 -0
- package/dist/shell/commands/sed.js.map +1 -0
- package/dist/shell/commands/sort.d.ts +6 -0
- package/dist/shell/commands/sort.d.ts.map +1 -0
- package/dist/shell/commands/sort.js +109 -0
- package/dist/shell/commands/sort.js.map +1 -0
- package/dist/shell/commands/tail.d.ts +6 -0
- package/dist/shell/commands/tail.d.ts.map +1 -0
- package/dist/shell/commands/tail.js +68 -0
- package/dist/shell/commands/tail.js.map +1 -0
- package/dist/shell/commands/wc.d.ts +6 -0
- package/dist/shell/commands/wc.d.ts.map +1 -0
- package/dist/shell/commands/wc.js +86 -0
- package/dist/shell/commands/wc.js.map +1 -0
- package/dist/shell/index.d.ts +10 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/limits.d.ts +5 -0
- package/dist/shell/limits.d.ts.map +1 -0
- package/dist/shell/limits.js +5 -0
- package/dist/shell/limits.js.map +1 -0
- package/dist/shell/parser.d.ts +8 -0
- package/dist/shell/parser.d.ts.map +1 -0
- package/dist/shell/parser.js +307 -0
- package/dist/shell/parser.js.map +1 -0
- package/dist/shell/path-validation.d.ts +35 -0
- package/dist/shell/path-validation.d.ts.map +1 -0
- package/dist/shell/path-validation.js +81 -0
- package/dist/shell/path-validation.js.map +1 -0
- package/dist/shell/shell.d.ts +66 -0
- package/dist/shell/shell.d.ts.map +1 -0
- package/dist/shell/shell.js +301 -0
- package/dist/shell/shell.js.map +1 -0
- package/dist/shell/shell.test.d.ts +2 -0
- package/dist/shell/shell.test.d.ts.map +1 -0
- package/dist/shell/shell.test.js +1088 -0
- package/dist/shell/shell.test.js.map +1 -0
- package/dist/shell/types.d.ts +82 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +5 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/summarizer.d.ts +28 -0
- package/dist/summarizer.d.ts.map +1 -0
- package/dist/summarizer.js +136 -0
- package/dist/summarizer.js.map +1 -0
- package/dist/summarizer.test.d.ts +2 -0
- package/dist/summarizer.test.d.ts.map +1 -0
- package/dist/summarizer.test.js +192 -0
- package/dist/summarizer.test.js.map +1 -0
- package/dist/tools/ask-user.d.ts +11 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +35 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +18 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/output.d.ts +15 -0
- package/dist/tools/output.d.ts.map +1 -0
- package/dist/tools/output.js +40 -0
- package/dist/tools/output.js.map +1 -0
- package/dist/tools/shell.d.ts +13 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +166 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/sub-agent.d.ts +25 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +312 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/tasks.d.ts +170 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +947 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/trace/builder.d.ts +54 -0
- package/dist/trace/builder.d.ts.map +1 -0
- package/dist/trace/builder.js +229 -0
- package/dist/trace/builder.js.map +1 -0
- package/dist/trace/console.d.ts +45 -0
- package/dist/trace/console.d.ts.map +1 -0
- package/dist/trace/console.js +143 -0
- package/dist/trace/console.js.map +1 -0
- package/dist/trace/index.d.ts +11 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +11 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/openrouter-pricing.d.ts +9 -0
- package/dist/trace/openrouter-pricing.d.ts.map +1 -0
- package/dist/trace/openrouter-pricing.js +321 -0
- package/dist/trace/openrouter-pricing.js.map +1 -0
- package/dist/trace/pricing.d.ts +13 -0
- package/dist/trace/pricing.d.ts.map +1 -0
- package/dist/trace/pricing.js +41 -0
- package/dist/trace/pricing.js.map +1 -0
- package/dist/trace/types.d.ts +142 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +16 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/trace.d.ts +5 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +5 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +382 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +287 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +560 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { truncateOldMessages, estimateMessageTokens, ContextManager, sanitizeHistory } from './context-manager.js';
|
|
3
|
+
// Helpers to build messages concisely
|
|
4
|
+
function userText(text) {
|
|
5
|
+
return { role: 'user', content: text };
|
|
6
|
+
}
|
|
7
|
+
function assistantText(text) {
|
|
8
|
+
return { role: 'assistant', content: text };
|
|
9
|
+
}
|
|
10
|
+
function assistantToolUse(id, name = '__shell__') {
|
|
11
|
+
return {
|
|
12
|
+
role: 'assistant',
|
|
13
|
+
content: [{ type: 'tool_use', id, name, input: {} }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function userToolResult(toolUseId, result = 'ok') {
|
|
17
|
+
return {
|
|
18
|
+
role: 'user',
|
|
19
|
+
content: [{ type: 'tool_result', tool_use_id: toolUseId, content: result }],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function assistantTextAndToolUse(text, id, name = '__shell__') {
|
|
23
|
+
return {
|
|
24
|
+
role: 'assistant',
|
|
25
|
+
content: [
|
|
26
|
+
{ type: 'text', text },
|
|
27
|
+
{ type: 'tool_use', id, name, input: {} },
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
describe('truncateOldMessages', () => {
|
|
32
|
+
it('returns all messages when within limit', () => {
|
|
33
|
+
const messages = [
|
|
34
|
+
userText('hello'),
|
|
35
|
+
assistantText('hi'),
|
|
36
|
+
];
|
|
37
|
+
const result = truncateOldMessages(messages, 100000);
|
|
38
|
+
expect(result).toEqual(messages);
|
|
39
|
+
});
|
|
40
|
+
it('preserves first message and keeps recent messages', () => {
|
|
41
|
+
const messages = [
|
|
42
|
+
userText('first'),
|
|
43
|
+
assistantText('a'.repeat(1000)),
|
|
44
|
+
userText('b'.repeat(1000)),
|
|
45
|
+
assistantText('c'.repeat(100)),
|
|
46
|
+
userText('last'),
|
|
47
|
+
];
|
|
48
|
+
const firstTokens = estimateMessageTokens(messages[0]);
|
|
49
|
+
const lastTwoTokens = estimateMessageTokens(messages[3]) + estimateMessageTokens(messages[4]);
|
|
50
|
+
const limit = firstTokens + lastTwoTokens + 10; // just enough for first + last two
|
|
51
|
+
const result = truncateOldMessages(messages, limit);
|
|
52
|
+
expect(result[0]).toEqual(messages[0]); // first preserved
|
|
53
|
+
expect(result[result.length - 1]).toEqual(messages[4]); // last preserved
|
|
54
|
+
expect(result.length).toBeLessThan(messages.length);
|
|
55
|
+
});
|
|
56
|
+
describe('tool_use/tool_result pair safety', () => {
|
|
57
|
+
it('never separates a tool_use from its tool_result', () => {
|
|
58
|
+
const messages = [
|
|
59
|
+
userText('start'), // [0] preserved
|
|
60
|
+
assistantToolUse('tool_1'), // [1] pair A
|
|
61
|
+
userToolResult('tool_1', 'x'.repeat(2000)), // [2] pair A
|
|
62
|
+
assistantToolUse('tool_2'), // [3] pair B
|
|
63
|
+
userToolResult('tool_2', 'y'.repeat(2000)), // [4] pair B
|
|
64
|
+
assistantText('final answer'), // [5]
|
|
65
|
+
userText('thanks'), // [6]
|
|
66
|
+
];
|
|
67
|
+
// Set limit so that only some messages fit after first
|
|
68
|
+
const firstTokens = estimateMessageTokens(messages[0]);
|
|
69
|
+
const lastTwoTokens = estimateMessageTokens(messages[5]) + estimateMessageTokens(messages[6]);
|
|
70
|
+
const pairBTokens = estimateMessageTokens(messages[3]) + estimateMessageTokens(messages[4]);
|
|
71
|
+
// Enough for first + pair B + last two, but NOT pair A
|
|
72
|
+
const limit = firstTokens + pairBTokens + lastTwoTokens + 10;
|
|
73
|
+
const result = truncateOldMessages(messages, limit);
|
|
74
|
+
// Verify no orphaned tool_use or tool_result
|
|
75
|
+
for (let i = 0; i < result.length; i++) {
|
|
76
|
+
const msg = result[i];
|
|
77
|
+
if (typeof msg.content === 'string')
|
|
78
|
+
continue;
|
|
79
|
+
for (const block of msg.content) {
|
|
80
|
+
if (block.type === 'tool_use') {
|
|
81
|
+
// Next message must have matching tool_result
|
|
82
|
+
const next = result[i + 1];
|
|
83
|
+
expect(next).toBeDefined();
|
|
84
|
+
expect(typeof next.content).not.toBe('string');
|
|
85
|
+
const resultBlock = next.content.find((b) => b.type === 'tool_result' && b.tool_use_id === block.id);
|
|
86
|
+
expect(resultBlock).toBeDefined();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
it('removes both tool_use and tool_result when pair does not fit', () => {
|
|
92
|
+
const messages = [
|
|
93
|
+
userText('start'),
|
|
94
|
+
assistantToolUse('tool_1'),
|
|
95
|
+
userToolResult('tool_1', 'big_result'.repeat(500)),
|
|
96
|
+
assistantText('done'),
|
|
97
|
+
];
|
|
98
|
+
// Enough for first + last text, but not the tool pair
|
|
99
|
+
const firstTokens = estimateMessageTokens(messages[0]);
|
|
100
|
+
const lastTokens = estimateMessageTokens(messages[3]);
|
|
101
|
+
const limit = firstTokens + lastTokens + 10;
|
|
102
|
+
const result = truncateOldMessages(messages, limit);
|
|
103
|
+
expect(result).toEqual([messages[0], messages[3]]);
|
|
104
|
+
});
|
|
105
|
+
it('handles mixed text and tool_use in one assistant message', () => {
|
|
106
|
+
const messages = [
|
|
107
|
+
userText('start'),
|
|
108
|
+
assistantTextAndToolUse('let me check', 'tool_1'),
|
|
109
|
+
userToolResult('tool_1', 'result'),
|
|
110
|
+
assistantText('final'),
|
|
111
|
+
];
|
|
112
|
+
// Enough for everything
|
|
113
|
+
const result = truncateOldMessages(messages, 100000);
|
|
114
|
+
expect(result).toEqual(messages);
|
|
115
|
+
});
|
|
116
|
+
it('handles multiple sequential tool pairs correctly', () => {
|
|
117
|
+
const bigPayload = 'x'.repeat(4000); // ~1000 tokens
|
|
118
|
+
const messages = [
|
|
119
|
+
userText('start'),
|
|
120
|
+
assistantToolUse('t1'),
|
|
121
|
+
userToolResult('t1', bigPayload),
|
|
122
|
+
assistantToolUse('t2'),
|
|
123
|
+
userToolResult('t2', bigPayload),
|
|
124
|
+
assistantToolUse('t3'),
|
|
125
|
+
userToolResult('t3', bigPayload),
|
|
126
|
+
assistantText('summary'),
|
|
127
|
+
userText('ok'),
|
|
128
|
+
];
|
|
129
|
+
// Only enough for first + last pair + last two messages
|
|
130
|
+
const firstTokens = estimateMessageTokens(messages[0]);
|
|
131
|
+
const pair3Tokens = estimateMessageTokens(messages[5]) + estimateMessageTokens(messages[6]);
|
|
132
|
+
const lastTwoTokens = estimateMessageTokens(messages[7]) + estimateMessageTokens(messages[8]);
|
|
133
|
+
const limit = firstTokens + pair3Tokens + lastTwoTokens + 10;
|
|
134
|
+
const result = truncateOldMessages(messages, limit);
|
|
135
|
+
// Should have: first, pair3, last two
|
|
136
|
+
expect(result[0]).toEqual(messages[0]);
|
|
137
|
+
expect(result).toContain(messages[5]);
|
|
138
|
+
expect(result).toContain(messages[6]);
|
|
139
|
+
expect(result).toContain(messages[7]);
|
|
140
|
+
expect(result).toContain(messages[8]);
|
|
141
|
+
// Should NOT contain pair 1 or pair 2
|
|
142
|
+
expect(result).not.toContain(messages[1]);
|
|
143
|
+
expect(result).not.toContain(messages[2]);
|
|
144
|
+
expect(result).not.toContain(messages[3]);
|
|
145
|
+
expect(result).not.toContain(messages[4]);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('ContextManager', () => {
|
|
150
|
+
it('returns messages unchanged when within limit', async () => {
|
|
151
|
+
const cm = new ContextManager(100000);
|
|
152
|
+
const messages = [userText('hello'), assistantText('hi')];
|
|
153
|
+
expect(await cm.manageContext(messages)).toEqual(messages);
|
|
154
|
+
});
|
|
155
|
+
it('truncates while preserving tool pairs when over limit', async () => {
|
|
156
|
+
const cm = new ContextManager(500); // small limit
|
|
157
|
+
const messages = [
|
|
158
|
+
userText('start'),
|
|
159
|
+
assistantToolUse('t1'),
|
|
160
|
+
userToolResult('t1', 'x'.repeat(2000)),
|
|
161
|
+
assistantText('end'),
|
|
162
|
+
];
|
|
163
|
+
const result = await cm.manageContext(messages);
|
|
164
|
+
// Tool pair should be removed as a unit, not split
|
|
165
|
+
for (let i = 0; i < result.length; i++) {
|
|
166
|
+
const msg = result[i];
|
|
167
|
+
if (typeof msg.content === 'string')
|
|
168
|
+
continue;
|
|
169
|
+
for (const block of msg.content) {
|
|
170
|
+
if (block.type === 'tool_use') {
|
|
171
|
+
const next = result[i + 1];
|
|
172
|
+
expect(next).toBeDefined();
|
|
173
|
+
}
|
|
174
|
+
if (block.type === 'tool_result') {
|
|
175
|
+
const prev = result[i - 1];
|
|
176
|
+
expect(prev).toBeDefined();
|
|
177
|
+
expect(typeof prev.content).not.toBe('string');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
it('should sanitize orphaned tool_use before returning', async () => {
|
|
183
|
+
const cm = new ContextManager(100000);
|
|
184
|
+
const messages = [
|
|
185
|
+
userText('start'),
|
|
186
|
+
assistantToolUse('t1', '__shell__'),
|
|
187
|
+
userToolResult('t1', 'ok'),
|
|
188
|
+
assistantToolUse('orphan_1', '__ask_user__'),
|
|
189
|
+
];
|
|
190
|
+
const result = await cm.manageContext(messages);
|
|
191
|
+
assertNoOrphanedToolUse(result);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe('ContextManager with summarize strategy', () => {
|
|
195
|
+
function createMockLLM(summaryText) {
|
|
196
|
+
return {
|
|
197
|
+
chat: vi.fn().mockResolvedValue({
|
|
198
|
+
content: [{ type: 'text', text: `<summary>${summaryText}</summary>` }],
|
|
199
|
+
stopReason: 'end_turn',
|
|
200
|
+
}),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
it('returns messages unchanged when within limit (no compaction needed)', async () => {
|
|
204
|
+
const llm = createMockLLM('should not be called');
|
|
205
|
+
const cm = new ContextManager(100000, 'summarize', llm);
|
|
206
|
+
const messages = [userText('hello'), assistantText('hi')];
|
|
207
|
+
const result = await cm.manageContext(messages);
|
|
208
|
+
expect(result).toEqual(messages);
|
|
209
|
+
expect(llm.chat).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
it('applies micro-compaction before full compaction', async () => {
|
|
212
|
+
// Create a scenario where micro-compaction alone is enough.
|
|
213
|
+
// 2 old tool results with 2000 chars each (~500 tokens each).
|
|
214
|
+
// After micro-compaction they shrink to ~15 tokens each.
|
|
215
|
+
// Total before: ~500 + 500 + overhead (~200) = ~1200 tokens
|
|
216
|
+
// Total after micro-compact: ~15 + 15 + 200 = ~230 tokens
|
|
217
|
+
// Set maxTokens=1100 with buffer=50 → threshold=1050 → original exceeds, compacted doesn't
|
|
218
|
+
const llm = createMockLLM('should not be called');
|
|
219
|
+
const cm = new ContextManager(1100, 'summarize', llm, 50);
|
|
220
|
+
const messages = [
|
|
221
|
+
userText('start'),
|
|
222
|
+
assistantToolUse('t1'),
|
|
223
|
+
userToolResult('t1', 'a'.repeat(2000)), // old, large → truncated by micro-compact
|
|
224
|
+
assistantToolUse('t2'),
|
|
225
|
+
userToolResult('t2', 'b'.repeat(100)), // recent
|
|
226
|
+
assistantToolUse('t3'),
|
|
227
|
+
userToolResult('t3', 'c'.repeat(100)), // recent
|
|
228
|
+
assistantToolUse('t4'),
|
|
229
|
+
userToolResult('t4', 'd'.repeat(100)), // recent
|
|
230
|
+
assistantText('done'),
|
|
231
|
+
];
|
|
232
|
+
const result = await cm.manageContext(messages);
|
|
233
|
+
// Micro-compaction should have been enough, no LLM call
|
|
234
|
+
expect(llm.chat).not.toHaveBeenCalled();
|
|
235
|
+
expect(result.length).toBe(messages.length);
|
|
236
|
+
});
|
|
237
|
+
it('runs full compaction when micro-compaction is not enough', async () => {
|
|
238
|
+
const llm = createMockLLM('User asked to fix auth bug. Found issue in login.ts line 42.');
|
|
239
|
+
// Use a large enough limit that keepBudget (40%) can hold the last message,
|
|
240
|
+
// but small enough that the total conversation exceeds it.
|
|
241
|
+
// Total text: ~1200 tokens, maxTokens=500, buffer=10 → threshold=490
|
|
242
|
+
// keepBudget = 200 tokens (40% of 500), last message ~6 tokens → fits
|
|
243
|
+
const cm = new ContextManager(500, 'summarize', llm, 10);
|
|
244
|
+
const messages = [
|
|
245
|
+
userText('Fix the auth bug'), // ~4 tokens
|
|
246
|
+
assistantText('a'.repeat(800)), // ~200 tokens
|
|
247
|
+
userText('Check login.ts'), // ~4 tokens
|
|
248
|
+
assistantText('b'.repeat(800)), // ~200 tokens
|
|
249
|
+
userText('More context here' + 'x'.repeat(400)), // ~100+ tokens
|
|
250
|
+
assistantText('c'.repeat(800)), // ~200 tokens
|
|
251
|
+
userText('What did you find?'), // ~5 tokens
|
|
252
|
+
];
|
|
253
|
+
const result = await cm.manageContext(messages);
|
|
254
|
+
// LLM should have been called for summarization
|
|
255
|
+
expect(llm.chat).toHaveBeenCalledTimes(1);
|
|
256
|
+
// Result should start with summary message (user) + ack (assistant)
|
|
257
|
+
expect(result[0].role).toBe('user');
|
|
258
|
+
expect(typeof result[0].content).toBe('string');
|
|
259
|
+
expect(result[0].content).toContain('being continued from a previous conversation');
|
|
260
|
+
expect(result[0].content).toContain('fix auth bug');
|
|
261
|
+
expect(result[1].role).toBe('assistant');
|
|
262
|
+
expect(typeof result[1].content).toBe('string');
|
|
263
|
+
expect(result[1].content).toContain('continue from where we left off');
|
|
264
|
+
// Recent messages should follow after summary + ack
|
|
265
|
+
expect(result.length).toBeGreaterThanOrEqual(3);
|
|
266
|
+
});
|
|
267
|
+
it('preserves alternating user/assistant roles in output', async () => {
|
|
268
|
+
const llm = createMockLLM('Summary of conversation');
|
|
269
|
+
const cm = new ContextManager(200, 'summarize', llm, 20);
|
|
270
|
+
const messages = [
|
|
271
|
+
userText('first message'),
|
|
272
|
+
assistantText('a'.repeat(400)),
|
|
273
|
+
userText('second message'),
|
|
274
|
+
assistantText('b'.repeat(400)),
|
|
275
|
+
userText('latest message'),
|
|
276
|
+
];
|
|
277
|
+
const result = await cm.manageContext(messages);
|
|
278
|
+
// Verify alternating roles
|
|
279
|
+
for (let i = 1; i < result.length; i++) {
|
|
280
|
+
expect(result[i].role).not.toBe(result[i - 1].role);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
it('falls back to truncation when no LLM provided', async () => {
|
|
284
|
+
const cm = new ContextManager(200, 'summarize', undefined, 20);
|
|
285
|
+
const messages = [
|
|
286
|
+
userText('start'),
|
|
287
|
+
assistantText('a'.repeat(800)),
|
|
288
|
+
userText('end'),
|
|
289
|
+
];
|
|
290
|
+
const result = await cm.manageContext(messages);
|
|
291
|
+
// Should still work via truncation fallback
|
|
292
|
+
expect(result.length).toBeLessThanOrEqual(messages.length);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
// ============================================================
|
|
296
|
+
// Orphaned tool_use detection and repair
|
|
297
|
+
// ============================================================
|
|
298
|
+
/**
|
|
299
|
+
* Helper: verify that every tool_use block in messages has a matching
|
|
300
|
+
* tool_result in the immediately following user message.
|
|
301
|
+
*/
|
|
302
|
+
function assertNoOrphanedToolUse(messages) {
|
|
303
|
+
for (let i = 0; i < messages.length; i++) {
|
|
304
|
+
const msg = messages[i];
|
|
305
|
+
if (typeof msg.content === 'string')
|
|
306
|
+
continue;
|
|
307
|
+
const toolUseBlocks = msg.content.filter((b) => b.type === 'tool_use');
|
|
308
|
+
if (toolUseBlocks.length === 0)
|
|
309
|
+
continue;
|
|
310
|
+
const next = messages[i + 1];
|
|
311
|
+
expect(next, `tool_use at message[${i}] has no following message`).toBeDefined();
|
|
312
|
+
expect(next.role, `message after tool_use at [${i}] must be user`).toBe('user');
|
|
313
|
+
expect(typeof next.content, `message after tool_use at [${i}] must have content blocks`).not.toBe('string');
|
|
314
|
+
for (const toolUse of toolUseBlocks) {
|
|
315
|
+
const hasResult = next.content.some((b) => b.type === 'tool_result' && b.tool_use_id === toolUse.id);
|
|
316
|
+
expect(hasResult, `tool_use ${toolUse.id} (${toolUse.name}) at message[${i}] has no matching tool_result`).toBe(true);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
describe('sanitizeHistory', () => {
|
|
321
|
+
it('removes orphaned tool_use at the end of history (from __ask_user__)', () => {
|
|
322
|
+
const messages = [
|
|
323
|
+
userText('analyze this session'),
|
|
324
|
+
assistantToolUse('t1', '__shell__'),
|
|
325
|
+
userToolResult('t1', 'file contents here'),
|
|
326
|
+
assistantTextAndToolUse('I need more information', 'ask_1', '__ask_user__'),
|
|
327
|
+
];
|
|
328
|
+
const result = sanitizeHistory(messages);
|
|
329
|
+
assertNoOrphanedToolUse(result);
|
|
330
|
+
});
|
|
331
|
+
it('removes orphaned tool_use at the end from interruption between tools', () => {
|
|
332
|
+
const messages = [
|
|
333
|
+
userText('start'),
|
|
334
|
+
assistantToolUse('t1', '__shell__'),
|
|
335
|
+
userToolResult('t1', 'ok'),
|
|
336
|
+
{
|
|
337
|
+
role: 'assistant',
|
|
338
|
+
content: [
|
|
339
|
+
{ type: 'tool_use', id: 't2', name: '__shell__', input: { command: 'cat file' } },
|
|
340
|
+
{ type: 'tool_use', id: 't3', name: '__shell__', input: { command: 'ls' } },
|
|
341
|
+
],
|
|
342
|
+
},
|
|
343
|
+
];
|
|
344
|
+
const result = sanitizeHistory(messages);
|
|
345
|
+
assertNoOrphanedToolUse(result);
|
|
346
|
+
});
|
|
347
|
+
it('keeps valid tool_use/tool_result pairs intact', () => {
|
|
348
|
+
const messages = [
|
|
349
|
+
userText('hello'),
|
|
350
|
+
assistantToolUse('t1', '__shell__'),
|
|
351
|
+
userToolResult('t1', 'world'),
|
|
352
|
+
assistantText('done'),
|
|
353
|
+
];
|
|
354
|
+
const result = sanitizeHistory(messages);
|
|
355
|
+
expect(result).toEqual(messages);
|
|
356
|
+
});
|
|
357
|
+
it('handles history with orphan in the middle (from synthetic __ask_user__)', () => {
|
|
358
|
+
const messages = [
|
|
359
|
+
userText('analyze'),
|
|
360
|
+
assistantToolUse('t1', '__shell__'),
|
|
361
|
+
userToolResult('t1', 'transcript content'),
|
|
362
|
+
assistantToolUse('ask_1', '__ask_user__'),
|
|
363
|
+
assistantText('Based on the analysis...'),
|
|
364
|
+
userText('thanks'),
|
|
365
|
+
];
|
|
366
|
+
const result = sanitizeHistory(messages);
|
|
367
|
+
assertNoOrphanedToolUse(result);
|
|
368
|
+
expect(result.length).toBeGreaterThanOrEqual(3);
|
|
369
|
+
});
|
|
370
|
+
it('adds dummy tool_result for orphaned tool_use blocks', () => {
|
|
371
|
+
const messages = [
|
|
372
|
+
userText('hello'),
|
|
373
|
+
assistantTextAndToolUse('let me check', 'orphan_1', '__shell__'),
|
|
374
|
+
];
|
|
375
|
+
const result = sanitizeHistory(messages);
|
|
376
|
+
assertNoOrphanedToolUse(result);
|
|
377
|
+
const assistantMsg = result.find(m => m.role === 'assistant' && typeof m.content !== 'string' &&
|
|
378
|
+
m.content.some(b => b.type === 'text'));
|
|
379
|
+
expect(assistantMsg).toBeDefined();
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
describe('truncateOldMessages with orphaned input', () => {
|
|
383
|
+
it('should not output orphaned tool_use even when input has orphans', () => {
|
|
384
|
+
const messages = [
|
|
385
|
+
userText('start'),
|
|
386
|
+
assistantToolUse('t1', '__shell__'),
|
|
387
|
+
userToolResult('t1', 'ok'),
|
|
388
|
+
assistantToolUse('orphan_1', '__ask_user__'),
|
|
389
|
+
];
|
|
390
|
+
const result = truncateOldMessages(messages, 100000);
|
|
391
|
+
assertNoOrphanedToolUse(result);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
//# sourceMappingURL=context-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.test.js","sourceRoot":"","sources":["../src/context-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor - Tool Execution Loop
|
|
3
|
+
*
|
|
4
|
+
* Core execution loop that runs tools and handles agent responses.
|
|
5
|
+
*/
|
|
6
|
+
import type { Message, Tool, ToolContext, LLMProvider, LLMOptions, LogProvider, AgentResult } from './types.js';
|
|
7
|
+
import { ContextManager } from './context-manager.js';
|
|
8
|
+
import { TaskManager } from './tools/tasks.js';
|
|
9
|
+
export interface ExecutorConfig {
|
|
10
|
+
systemPrompt: string;
|
|
11
|
+
tools: Tool[];
|
|
12
|
+
llm: LLMProvider;
|
|
13
|
+
logger?: LogProvider;
|
|
14
|
+
maxIterations: number;
|
|
15
|
+
contextManager: ContextManager;
|
|
16
|
+
taskManager: TaskManager;
|
|
17
|
+
llmOptions?: LLMOptions;
|
|
18
|
+
/** AbortSignal for cancellation */
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
/** Async function to check if should continue */
|
|
21
|
+
shouldContinue?: () => Promise<boolean>;
|
|
22
|
+
/** Trace builder for execution tracing */
|
|
23
|
+
traceBuilder?: import('./trace.js').TraceBuilder;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Main execution loop
|
|
27
|
+
*/
|
|
28
|
+
export declare function executeLoop(config: ExecutorConfig, initialMessages: Message[], toolContext: ToolContext): Promise<AgentResult>;
|
|
29
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,IAAI,EAIJ,WAAW,EAIX,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EAEZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAI9C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,GAAG,EAAE,WAAW,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,CAAC,EAAE,UAAU,CAAA;IAEvB,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvC,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,CAAA;CACjD;AA4ND;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,OAAO,EAAE,EAC1B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,WAAW,CAAC,CA+RtB"}
|