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.
Files changed (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/dist/agent.d.ts +46 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +393 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/built-in-agents/explore.d.ts +9 -0
  8. package/dist/built-in-agents/explore.d.ts.map +1 -0
  9. package/dist/built-in-agents/explore.js +40 -0
  10. package/dist/built-in-agents/explore.js.map +1 -0
  11. package/dist/built-in-agents/index.d.ts +15 -0
  12. package/dist/built-in-agents/index.d.ts.map +1 -0
  13. package/dist/built-in-agents/index.js +19 -0
  14. package/dist/built-in-agents/index.js.map +1 -0
  15. package/dist/built-in-agents/plan.d.ts +10 -0
  16. package/dist/built-in-agents/plan.d.ts.map +1 -0
  17. package/dist/built-in-agents/plan.js +62 -0
  18. package/dist/built-in-agents/plan.js.map +1 -0
  19. package/dist/built-in-agents/worker.d.ts +9 -0
  20. package/dist/built-in-agents/worker.d.ts.map +1 -0
  21. package/dist/built-in-agents/worker.js +53 -0
  22. package/dist/built-in-agents/worker.js.map +1 -0
  23. package/dist/constants.d.ts +7 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +18 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/context-manager.d.ts +65 -0
  28. package/dist/context-manager.d.ts.map +1 -0
  29. package/dist/context-manager.js +272 -0
  30. package/dist/context-manager.js.map +1 -0
  31. package/dist/context-manager.test.d.ts +2 -0
  32. package/dist/context-manager.test.d.ts.map +1 -0
  33. package/dist/context-manager.test.js +394 -0
  34. package/dist/context-manager.test.js.map +1 -0
  35. package/dist/executor.d.ts +29 -0
  36. package/dist/executor.d.ts.map +1 -0
  37. package/dist/executor.js +399 -0
  38. package/dist/executor.js.map +1 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +40 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/prompt/index.d.ts +9 -0
  44. package/dist/prompt/index.d.ts.map +1 -0
  45. package/dist/prompt/index.js +10 -0
  46. package/dist/prompt/index.js.map +1 -0
  47. package/dist/prompt/main-agent-builder.d.ts +81 -0
  48. package/dist/prompt/main-agent-builder.d.ts.map +1 -0
  49. package/dist/prompt/main-agent-builder.js +287 -0
  50. package/dist/prompt/main-agent-builder.js.map +1 -0
  51. package/dist/prompt/sub-agent-builder.d.ts +133 -0
  52. package/dist/prompt/sub-agent-builder.d.ts.map +1 -0
  53. package/dist/prompt/sub-agent-builder.js +337 -0
  54. package/dist/prompt/sub-agent-builder.js.map +1 -0
  55. package/dist/prompt/templates.d.ts +87 -0
  56. package/dist/prompt/templates.d.ts.map +1 -0
  57. package/dist/prompt/templates.js +343 -0
  58. package/dist/prompt/templates.js.map +1 -0
  59. package/dist/prompt/types.d.ts +159 -0
  60. package/dist/prompt/types.d.ts.map +1 -0
  61. package/dist/prompt/types.js +5 -0
  62. package/dist/prompt/types.js.map +1 -0
  63. package/dist/prompt.d.ts +32 -0
  64. package/dist/prompt.d.ts.map +1 -0
  65. package/dist/prompt.js +86 -0
  66. package/dist/prompt.js.map +1 -0
  67. package/dist/providers/dataset/base.d.ts +74 -0
  68. package/dist/providers/dataset/base.d.ts.map +1 -0
  69. package/dist/providers/dataset/base.js +7 -0
  70. package/dist/providers/dataset/base.js.map +1 -0
  71. package/dist/providers/dataset/index.d.ts +8 -0
  72. package/dist/providers/dataset/index.d.ts.map +1 -0
  73. package/dist/providers/dataset/index.js +8 -0
  74. package/dist/providers/dataset/index.js.map +1 -0
  75. package/dist/providers/dataset/recorder.d.ts +46 -0
  76. package/dist/providers/dataset/recorder.d.ts.map +1 -0
  77. package/dist/providers/dataset/recorder.js +105 -0
  78. package/dist/providers/dataset/recorder.js.map +1 -0
  79. package/dist/providers/dataset/replayer.d.ts +46 -0
  80. package/dist/providers/dataset/replayer.d.ts.map +1 -0
  81. package/dist/providers/dataset/replayer.js +163 -0
  82. package/dist/providers/dataset/replayer.js.map +1 -0
  83. package/dist/providers/dataset/tester.d.ts +89 -0
  84. package/dist/providers/dataset/tester.d.ts.map +1 -0
  85. package/dist/providers/dataset/tester.js +143 -0
  86. package/dist/providers/dataset/tester.js.map +1 -0
  87. package/dist/providers/env/memory.d.ts +14 -0
  88. package/dist/providers/env/memory.d.ts.map +1 -0
  89. package/dist/providers/env/memory.js +19 -0
  90. package/dist/providers/env/memory.js.map +1 -0
  91. package/dist/providers/index.d.ts +12 -0
  92. package/dist/providers/index.d.ts.map +1 -0
  93. package/dist/providers/index.js +10 -0
  94. package/dist/providers/index.js.map +1 -0
  95. package/dist/providers/llm/base.d.ts +7 -0
  96. package/dist/providers/llm/base.d.ts.map +1 -0
  97. package/dist/providers/llm/base.js +7 -0
  98. package/dist/providers/llm/base.js.map +1 -0
  99. package/dist/providers/llm/claude.d.ts +32 -0
  100. package/dist/providers/llm/claude.d.ts.map +1 -0
  101. package/dist/providers/llm/claude.js +171 -0
  102. package/dist/providers/llm/claude.js.map +1 -0
  103. package/dist/providers/llm/openai.d.ts +26 -0
  104. package/dist/providers/llm/openai.d.ts.map +1 -0
  105. package/dist/providers/llm/openai.js +174 -0
  106. package/dist/providers/llm/openai.js.map +1 -0
  107. package/dist/providers/llm/openrouter.d.ts +43 -0
  108. package/dist/providers/llm/openrouter.d.ts.map +1 -0
  109. package/dist/providers/llm/openrouter.js +288 -0
  110. package/dist/providers/llm/openrouter.js.map +1 -0
  111. package/dist/providers/logger/base.d.ts +7 -0
  112. package/dist/providers/logger/base.d.ts.map +1 -0
  113. package/dist/providers/logger/base.js +7 -0
  114. package/dist/providers/logger/base.js.map +1 -0
  115. package/dist/providers/logger/console.d.ts +29 -0
  116. package/dist/providers/logger/console.d.ts.map +1 -0
  117. package/dist/providers/logger/console.js +70 -0
  118. package/dist/providers/logger/console.js.map +1 -0
  119. package/dist/providers/repository/base.d.ts +7 -0
  120. package/dist/providers/repository/base.d.ts.map +1 -0
  121. package/dist/providers/repository/base.js +7 -0
  122. package/dist/providers/repository/base.js.map +1 -0
  123. package/dist/providers/repository/memory.d.ts +21 -0
  124. package/dist/providers/repository/memory.d.ts.map +1 -0
  125. package/dist/providers/repository/memory.js +50 -0
  126. package/dist/providers/repository/memory.js.map +1 -0
  127. package/dist/providers/workspace/file.d.ts +26 -0
  128. package/dist/providers/workspace/file.d.ts.map +1 -0
  129. package/dist/providers/workspace/file.js +151 -0
  130. package/dist/providers/workspace/file.js.map +1 -0
  131. package/dist/providers/workspace/index.d.ts +7 -0
  132. package/dist/providers/workspace/index.d.ts.map +1 -0
  133. package/dist/providers/workspace/index.js +6 -0
  134. package/dist/providers/workspace/index.js.map +1 -0
  135. package/dist/providers/workspace/memory.d.ts +26 -0
  136. package/dist/providers/workspace/memory.d.ts.map +1 -0
  137. package/dist/providers/workspace/memory.js +136 -0
  138. package/dist/providers/workspace/memory.js.map +1 -0
  139. package/dist/providers/workspace/types.d.ts +27 -0
  140. package/dist/providers/workspace/types.d.ts.map +1 -0
  141. package/dist/providers/workspace/types.js +8 -0
  142. package/dist/providers/workspace/types.js.map +1 -0
  143. package/dist/providers/workspace/workspace-provider.test.d.ts +2 -0
  144. package/dist/providers/workspace/workspace-provider.test.d.ts.map +1 -0
  145. package/dist/providers/workspace/workspace-provider.test.js +250 -0
  146. package/dist/providers/workspace/workspace-provider.test.js.map +1 -0
  147. package/dist/shell/commands/browse.d.ts +6 -0
  148. package/dist/shell/commands/browse.d.ts.map +1 -0
  149. package/dist/shell/commands/browse.js +158 -0
  150. package/dist/shell/commands/browse.js.map +1 -0
  151. package/dist/shell/commands/cat.d.ts +6 -0
  152. package/dist/shell/commands/cat.d.ts.map +1 -0
  153. package/dist/shell/commands/cat.js +104 -0
  154. package/dist/shell/commands/cat.js.map +1 -0
  155. package/dist/shell/commands/curl.d.ts +6 -0
  156. package/dist/shell/commands/curl.d.ts.map +1 -0
  157. package/dist/shell/commands/curl.js +190 -0
  158. package/dist/shell/commands/curl.js.map +1 -0
  159. package/dist/shell/commands/date.d.ts +6 -0
  160. package/dist/shell/commands/date.d.ts.map +1 -0
  161. package/dist/shell/commands/date.js +151 -0
  162. package/dist/shell/commands/date.js.map +1 -0
  163. package/dist/shell/commands/echo.d.ts +6 -0
  164. package/dist/shell/commands/echo.d.ts.map +1 -0
  165. package/dist/shell/commands/echo.js +48 -0
  166. package/dist/shell/commands/echo.js.map +1 -0
  167. package/dist/shell/commands/env.d.ts +8 -0
  168. package/dist/shell/commands/env.d.ts.map +1 -0
  169. package/dist/shell/commands/env.js +41 -0
  170. package/dist/shell/commands/env.js.map +1 -0
  171. package/dist/shell/commands/file.d.ts +6 -0
  172. package/dist/shell/commands/file.d.ts.map +1 -0
  173. package/dist/shell/commands/file.js +213 -0
  174. package/dist/shell/commands/file.js.map +1 -0
  175. package/dist/shell/commands/find.d.ts +6 -0
  176. package/dist/shell/commands/find.d.ts.map +1 -0
  177. package/dist/shell/commands/find.js +100 -0
  178. package/dist/shell/commands/find.js.map +1 -0
  179. package/dist/shell/commands/grep.d.ts +6 -0
  180. package/dist/shell/commands/grep.d.ts.map +1 -0
  181. package/dist/shell/commands/grep.js +229 -0
  182. package/dist/shell/commands/grep.js.map +1 -0
  183. package/dist/shell/commands/head.d.ts +6 -0
  184. package/dist/shell/commands/head.d.ts.map +1 -0
  185. package/dist/shell/commands/head.js +88 -0
  186. package/dist/shell/commands/head.js.map +1 -0
  187. package/dist/shell/commands/index.d.ts +25 -0
  188. package/dist/shell/commands/index.d.ts.map +1 -0
  189. package/dist/shell/commands/index.js +43 -0
  190. package/dist/shell/commands/index.js.map +1 -0
  191. package/dist/shell/commands/jq.d.ts +8 -0
  192. package/dist/shell/commands/jq.d.ts.map +1 -0
  193. package/dist/shell/commands/jq.js +233 -0
  194. package/dist/shell/commands/jq.js.map +1 -0
  195. package/dist/shell/commands/ls.d.ts +6 -0
  196. package/dist/shell/commands/ls.d.ts.map +1 -0
  197. package/dist/shell/commands/ls.js +88 -0
  198. package/dist/shell/commands/ls.js.map +1 -0
  199. package/dist/shell/commands/mkdir.d.ts +6 -0
  200. package/dist/shell/commands/mkdir.d.ts.map +1 -0
  201. package/dist/shell/commands/mkdir.js +43 -0
  202. package/dist/shell/commands/mkdir.js.map +1 -0
  203. package/dist/shell/commands/rm.d.ts +6 -0
  204. package/dist/shell/commands/rm.d.ts.map +1 -0
  205. package/dist/shell/commands/rm.js +64 -0
  206. package/dist/shell/commands/rm.js.map +1 -0
  207. package/dist/shell/commands/sed.d.ts +6 -0
  208. package/dist/shell/commands/sed.d.ts.map +1 -0
  209. package/dist/shell/commands/sed.js +414 -0
  210. package/dist/shell/commands/sed.js.map +1 -0
  211. package/dist/shell/commands/sort.d.ts +6 -0
  212. package/dist/shell/commands/sort.d.ts.map +1 -0
  213. package/dist/shell/commands/sort.js +109 -0
  214. package/dist/shell/commands/sort.js.map +1 -0
  215. package/dist/shell/commands/tail.d.ts +6 -0
  216. package/dist/shell/commands/tail.d.ts.map +1 -0
  217. package/dist/shell/commands/tail.js +68 -0
  218. package/dist/shell/commands/tail.js.map +1 -0
  219. package/dist/shell/commands/wc.d.ts +6 -0
  220. package/dist/shell/commands/wc.d.ts.map +1 -0
  221. package/dist/shell/commands/wc.js +86 -0
  222. package/dist/shell/commands/wc.js.map +1 -0
  223. package/dist/shell/index.d.ts +10 -0
  224. package/dist/shell/index.d.ts.map +1 -0
  225. package/dist/shell/index.js +10 -0
  226. package/dist/shell/index.js.map +1 -0
  227. package/dist/shell/limits.d.ts +5 -0
  228. package/dist/shell/limits.d.ts.map +1 -0
  229. package/dist/shell/limits.js +5 -0
  230. package/dist/shell/limits.js.map +1 -0
  231. package/dist/shell/parser.d.ts +8 -0
  232. package/dist/shell/parser.d.ts.map +1 -0
  233. package/dist/shell/parser.js +307 -0
  234. package/dist/shell/parser.js.map +1 -0
  235. package/dist/shell/path-validation.d.ts +35 -0
  236. package/dist/shell/path-validation.d.ts.map +1 -0
  237. package/dist/shell/path-validation.js +81 -0
  238. package/dist/shell/path-validation.js.map +1 -0
  239. package/dist/shell/shell.d.ts +66 -0
  240. package/dist/shell/shell.d.ts.map +1 -0
  241. package/dist/shell/shell.js +301 -0
  242. package/dist/shell/shell.js.map +1 -0
  243. package/dist/shell/shell.test.d.ts +2 -0
  244. package/dist/shell/shell.test.d.ts.map +1 -0
  245. package/dist/shell/shell.test.js +1088 -0
  246. package/dist/shell/shell.test.js.map +1 -0
  247. package/dist/shell/types.d.ts +82 -0
  248. package/dist/shell/types.d.ts.map +1 -0
  249. package/dist/shell/types.js +5 -0
  250. package/dist/shell/types.js.map +1 -0
  251. package/dist/summarizer.d.ts +28 -0
  252. package/dist/summarizer.d.ts.map +1 -0
  253. package/dist/summarizer.js +136 -0
  254. package/dist/summarizer.js.map +1 -0
  255. package/dist/summarizer.test.d.ts +2 -0
  256. package/dist/summarizer.test.d.ts.map +1 -0
  257. package/dist/summarizer.test.js +192 -0
  258. package/dist/summarizer.test.js.map +1 -0
  259. package/dist/tools/ask-user.d.ts +11 -0
  260. package/dist/tools/ask-user.d.ts.map +1 -0
  261. package/dist/tools/ask-user.js +35 -0
  262. package/dist/tools/ask-user.js.map +1 -0
  263. package/dist/tools/index.d.ts +11 -0
  264. package/dist/tools/index.d.ts.map +1 -0
  265. package/dist/tools/index.js +18 -0
  266. package/dist/tools/index.js.map +1 -0
  267. package/dist/tools/output.d.ts +15 -0
  268. package/dist/tools/output.d.ts.map +1 -0
  269. package/dist/tools/output.js +40 -0
  270. package/dist/tools/output.js.map +1 -0
  271. package/dist/tools/shell.d.ts +13 -0
  272. package/dist/tools/shell.d.ts.map +1 -0
  273. package/dist/tools/shell.js +166 -0
  274. package/dist/tools/shell.js.map +1 -0
  275. package/dist/tools/sub-agent.d.ts +25 -0
  276. package/dist/tools/sub-agent.d.ts.map +1 -0
  277. package/dist/tools/sub-agent.js +312 -0
  278. package/dist/tools/sub-agent.js.map +1 -0
  279. package/dist/tools/tasks.d.ts +170 -0
  280. package/dist/tools/tasks.d.ts.map +1 -0
  281. package/dist/tools/tasks.js +947 -0
  282. package/dist/tools/tasks.js.map +1 -0
  283. package/dist/trace/builder.d.ts +54 -0
  284. package/dist/trace/builder.d.ts.map +1 -0
  285. package/dist/trace/builder.js +229 -0
  286. package/dist/trace/builder.js.map +1 -0
  287. package/dist/trace/console.d.ts +45 -0
  288. package/dist/trace/console.d.ts.map +1 -0
  289. package/dist/trace/console.js +143 -0
  290. package/dist/trace/console.js.map +1 -0
  291. package/dist/trace/index.d.ts +11 -0
  292. package/dist/trace/index.d.ts.map +1 -0
  293. package/dist/trace/index.js +11 -0
  294. package/dist/trace/index.js.map +1 -0
  295. package/dist/trace/openrouter-pricing.d.ts +9 -0
  296. package/dist/trace/openrouter-pricing.d.ts.map +1 -0
  297. package/dist/trace/openrouter-pricing.js +321 -0
  298. package/dist/trace/openrouter-pricing.js.map +1 -0
  299. package/dist/trace/pricing.d.ts +13 -0
  300. package/dist/trace/pricing.d.ts.map +1 -0
  301. package/dist/trace/pricing.js +41 -0
  302. package/dist/trace/pricing.js.map +1 -0
  303. package/dist/trace/types.d.ts +142 -0
  304. package/dist/trace/types.d.ts.map +1 -0
  305. package/dist/trace/types.js +16 -0
  306. package/dist/trace/types.js.map +1 -0
  307. package/dist/trace.d.ts +5 -0
  308. package/dist/trace.d.ts.map +1 -0
  309. package/dist/trace.js +5 -0
  310. package/dist/trace.js.map +1 -0
  311. package/dist/types.d.ts +382 -0
  312. package/dist/types.d.ts.map +1 -0
  313. package/dist/types.js +5 -0
  314. package/dist/types.js.map +1 -0
  315. package/dist/workspace.d.ts +287 -0
  316. package/dist/workspace.d.ts.map +1 -0
  317. package/dist/workspace.js +560 -0
  318. package/dist/workspace.js.map +1 -0
  319. 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"}