longer-agent 0.1.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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/README.zh-CN.md +227 -0
  4. package/agent_templates/executor/agent.yaml +22 -0
  5. package/agent_templates/executor/system_prompt.md +17 -0
  6. package/agent_templates/explorer/agent.yaml +13 -0
  7. package/agent_templates/explorer/system_prompt.md +19 -0
  8. package/agent_templates/main/agent.yaml +7 -0
  9. package/agent_templates/main/system_prompt.md +45 -0
  10. package/configExample.yaml +83 -0
  11. package/dist/agents/agent.d.ts +79 -0
  12. package/dist/agents/agent.d.ts.map +1 -0
  13. package/dist/agents/agent.js +156 -0
  14. package/dist/agents/agent.js.map +1 -0
  15. package/dist/agents/tool-loop.d.ts +140 -0
  16. package/dist/agents/tool-loop.d.ts.map +1 -0
  17. package/dist/agents/tool-loop.js +465 -0
  18. package/dist/agents/tool-loop.js.map +1 -0
  19. package/dist/ask.d.ts +81 -0
  20. package/dist/ask.d.ts.map +1 -0
  21. package/dist/ask.js +34 -0
  22. package/dist/ask.js.map +1 -0
  23. package/dist/auth/openai-oauth.d.ts +66 -0
  24. package/dist/auth/openai-oauth.d.ts.map +1 -0
  25. package/dist/auth/openai-oauth.js +640 -0
  26. package/dist/auth/openai-oauth.js.map +1 -0
  27. package/dist/cli.d.ts +14 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +254 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands.d.ts +118 -0
  32. package/dist/commands.d.ts.map +1 -0
  33. package/dist/commands.js +862 -0
  34. package/dist/commands.js.map +1 -0
  35. package/dist/config.d.ts +130 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +648 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/context-rendering.d.ts +69 -0
  40. package/dist/context-rendering.d.ts.map +1 -0
  41. package/dist/context-rendering.js +250 -0
  42. package/dist/context-rendering.js.map +1 -0
  43. package/dist/document-projection.d.ts +12 -0
  44. package/dist/document-projection.d.ts.map +1 -0
  45. package/dist/document-projection.js +75 -0
  46. package/dist/document-projection.js.map +1 -0
  47. package/dist/ephemeral-log.d.ts +15 -0
  48. package/dist/ephemeral-log.d.ts.map +1 -0
  49. package/dist/ephemeral-log.js +173 -0
  50. package/dist/ephemeral-log.js.map +1 -0
  51. package/dist/file-attach.d.ts +89 -0
  52. package/dist/file-attach.d.ts.map +1 -0
  53. package/dist/file-attach.js +571 -0
  54. package/dist/file-attach.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/init-wizard.d.ts +13 -0
  60. package/dist/init-wizard.d.ts.map +1 -0
  61. package/dist/init-wizard.js +328 -0
  62. package/dist/init-wizard.js.map +1 -0
  63. package/dist/log-entry.d.ts +104 -0
  64. package/dist/log-entry.d.ts.map +1 -0
  65. package/dist/log-entry.js +292 -0
  66. package/dist/log-entry.js.map +1 -0
  67. package/dist/log-projection.d.ts +73 -0
  68. package/dist/log-projection.d.ts.map +1 -0
  69. package/dist/log-projection.js +651 -0
  70. package/dist/log-projection.js.map +1 -0
  71. package/dist/mcp-client.d.ts +55 -0
  72. package/dist/mcp-client.d.ts.map +1 -0
  73. package/dist/mcp-client.js +402 -0
  74. package/dist/mcp-client.js.map +1 -0
  75. package/dist/model-selection.d.ts +16 -0
  76. package/dist/model-selection.d.ts.map +1 -0
  77. package/dist/model-selection.js +181 -0
  78. package/dist/model-selection.js.map +1 -0
  79. package/dist/network-retry.d.ts +38 -0
  80. package/dist/network-retry.d.ts.map +1 -0
  81. package/dist/network-retry.js +140 -0
  82. package/dist/network-retry.js.map +1 -0
  83. package/dist/persistence.d.ts +104 -0
  84. package/dist/persistence.d.ts.map +1 -0
  85. package/dist/persistence.js +644 -0
  86. package/dist/persistence.js.map +1 -0
  87. package/dist/primitives/context.d.ts +29 -0
  88. package/dist/primitives/context.d.ts.map +1 -0
  89. package/dist/primitives/context.js +85 -0
  90. package/dist/primitives/context.js.map +1 -0
  91. package/dist/progress.d.ts +51 -0
  92. package/dist/progress.d.ts.map +1 -0
  93. package/dist/progress.js +229 -0
  94. package/dist/progress.js.map +1 -0
  95. package/dist/provider-presets.d.ts +34 -0
  96. package/dist/provider-presets.d.ts.map +1 -0
  97. package/dist/provider-presets.js +181 -0
  98. package/dist/provider-presets.js.map +1 -0
  99. package/dist/providers/anthropic.d.ts +32 -0
  100. package/dist/providers/anthropic.d.ts.map +1 -0
  101. package/dist/providers/anthropic.js +450 -0
  102. package/dist/providers/anthropic.js.map +1 -0
  103. package/dist/providers/base.d.ts +135 -0
  104. package/dist/providers/base.d.ts.map +1 -0
  105. package/dist/providers/base.js +104 -0
  106. package/dist/providers/base.js.map +1 -0
  107. package/dist/providers/glm.d.ts +18 -0
  108. package/dist/providers/glm.d.ts.map +1 -0
  109. package/dist/providers/glm.js +59 -0
  110. package/dist/providers/glm.js.map +1 -0
  111. package/dist/providers/kimi.d.ts +23 -0
  112. package/dist/providers/kimi.d.ts.map +1 -0
  113. package/dist/providers/kimi.js +89 -0
  114. package/dist/providers/kimi.js.map +1 -0
  115. package/dist/providers/minimax.d.ts +20 -0
  116. package/dist/providers/minimax.d.ts.map +1 -0
  117. package/dist/providers/minimax.js +192 -0
  118. package/dist/providers/minimax.js.map +1 -0
  119. package/dist/providers/openai-chat.d.ts +33 -0
  120. package/dist/providers/openai-chat.d.ts.map +1 -0
  121. package/dist/providers/openai-chat.js +543 -0
  122. package/dist/providers/openai-chat.js.map +1 -0
  123. package/dist/providers/openai-responses.d.ts +26 -0
  124. package/dist/providers/openai-responses.d.ts.map +1 -0
  125. package/dist/providers/openai-responses.js +443 -0
  126. package/dist/providers/openai-responses.js.map +1 -0
  127. package/dist/providers/openrouter.d.ts +24 -0
  128. package/dist/providers/openrouter.d.ts.map +1 -0
  129. package/dist/providers/openrouter.js +177 -0
  130. package/dist/providers/openrouter.js.map +1 -0
  131. package/dist/providers/registry.d.ts +7 -0
  132. package/dist/providers/registry.d.ts.map +1 -0
  133. package/dist/providers/registry.js +38 -0
  134. package/dist/providers/registry.js.map +1 -0
  135. package/dist/security/path.d.ts +51 -0
  136. package/dist/security/path.d.ts.map +1 -0
  137. package/dist/security/path.js +187 -0
  138. package/dist/security/path.js.map +1 -0
  139. package/dist/security/sensitive-files.d.ts +3 -0
  140. package/dist/security/sensitive-files.d.ts.map +1 -0
  141. package/dist/security/sensitive-files.js +41 -0
  142. package/dist/security/sensitive-files.js.map +1 -0
  143. package/dist/session.d.ts +446 -0
  144. package/dist/session.d.ts.map +1 -0
  145. package/dist/session.js +4595 -0
  146. package/dist/session.js.map +1 -0
  147. package/dist/settings.d.ts +46 -0
  148. package/dist/settings.d.ts.map +1 -0
  149. package/dist/settings.js +134 -0
  150. package/dist/settings.js.map +1 -0
  151. package/dist/show-context.d.ts +35 -0
  152. package/dist/show-context.d.ts.map +1 -0
  153. package/dist/show-context.js +320 -0
  154. package/dist/show-context.js.map +1 -0
  155. package/dist/skills/loader.d.ts +49 -0
  156. package/dist/skills/loader.d.ts.map +1 -0
  157. package/dist/skills/loader.js +166 -0
  158. package/dist/skills/loader.js.map +1 -0
  159. package/dist/summarize-context.d.ts +29 -0
  160. package/dist/summarize-context.d.ts.map +1 -0
  161. package/dist/summarize-context.js +247 -0
  162. package/dist/summarize-context.js.map +1 -0
  163. package/dist/templates/loader.d.ts +104 -0
  164. package/dist/templates/loader.d.ts.map +1 -0
  165. package/dist/templates/loader.js +514 -0
  166. package/dist/templates/loader.js.map +1 -0
  167. package/dist/tools/basic.d.ts +29 -0
  168. package/dist/tools/basic.d.ts.map +1 -0
  169. package/dist/tools/basic.js +2079 -0
  170. package/dist/tools/basic.js.map +1 -0
  171. package/dist/tools/comm.d.ts +17 -0
  172. package/dist/tools/comm.d.ts.map +1 -0
  173. package/dist/tools/comm.js +192 -0
  174. package/dist/tools/comm.js.map +1 -0
  175. package/dist/tools/web-fetch.d.ts +11 -0
  176. package/dist/tools/web-fetch.d.ts.map +1 -0
  177. package/dist/tools/web-fetch.js +237 -0
  178. package/dist/tools/web-fetch.js.map +1 -0
  179. package/dist/tools/web-search.d.ts +24 -0
  180. package/dist/tools/web-search.d.ts.map +1 -0
  181. package/dist/tools/web-search.js +51 -0
  182. package/dist/tools/web-search.js.map +1 -0
  183. package/dist/tui/app.d.ts +35 -0
  184. package/dist/tui/app.d.ts.map +1 -0
  185. package/dist/tui/app.js +1042 -0
  186. package/dist/tui/app.js.map +1 -0
  187. package/dist/tui/checkbox-picker.d.ts +35 -0
  188. package/dist/tui/checkbox-picker.d.ts.map +1 -0
  189. package/dist/tui/checkbox-picker.js +85 -0
  190. package/dist/tui/checkbox-picker.js.map +1 -0
  191. package/dist/tui/command-picker.d.ts +31 -0
  192. package/dist/tui/command-picker.d.ts.map +1 -0
  193. package/dist/tui/command-picker.js +113 -0
  194. package/dist/tui/command-picker.js.map +1 -0
  195. package/dist/tui/components/ask-panel.d.ts +21 -0
  196. package/dist/tui/components/ask-panel.d.ts.map +1 -0
  197. package/dist/tui/components/ask-panel.js +81 -0
  198. package/dist/tui/components/ask-panel.js.map +1 -0
  199. package/dist/tui/components/conversation-panel.d.ts +68 -0
  200. package/dist/tui/components/conversation-panel.d.ts.map +1 -0
  201. package/dist/tui/components/conversation-panel.js +611 -0
  202. package/dist/tui/components/conversation-panel.js.map +1 -0
  203. package/dist/tui/components/input-panel.d.ts +27 -0
  204. package/dist/tui/components/input-panel.d.ts.map +1 -0
  205. package/dist/tui/components/input-panel.js +725 -0
  206. package/dist/tui/components/input-panel.js.map +1 -0
  207. package/dist/tui/components/logo-panel.d.ts +14 -0
  208. package/dist/tui/components/logo-panel.d.ts.map +1 -0
  209. package/dist/tui/components/logo-panel.js +37 -0
  210. package/dist/tui/components/logo-panel.js.map +1 -0
  211. package/dist/tui/components/plan-panel.d.ts +10 -0
  212. package/dist/tui/components/plan-panel.d.ts.map +1 -0
  213. package/dist/tui/components/plan-panel.js +8 -0
  214. package/dist/tui/components/plan-panel.js.map +1 -0
  215. package/dist/tui/components/status-bar.d.ts +24 -0
  216. package/dist/tui/components/status-bar.d.ts.map +1 -0
  217. package/dist/tui/components/status-bar.js +80 -0
  218. package/dist/tui/components/status-bar.js.map +1 -0
  219. package/dist/tui/input/editor-state.d.ts +22 -0
  220. package/dist/tui/input/editor-state.d.ts.map +1 -0
  221. package/dist/tui/input/editor-state.js +157 -0
  222. package/dist/tui/input/editor-state.js.map +1 -0
  223. package/dist/tui/input/keymap.d.ts +3 -0
  224. package/dist/tui/input/keymap.d.ts.map +1 -0
  225. package/dist/tui/input/keymap.js +72 -0
  226. package/dist/tui/input/keymap.js.map +1 -0
  227. package/dist/tui/input/paste-slots.d.ts +17 -0
  228. package/dist/tui/input/paste-slots.d.ts.map +1 -0
  229. package/dist/tui/input/paste-slots.js +46 -0
  230. package/dist/tui/input/paste-slots.js.map +1 -0
  231. package/dist/tui/input/paste.d.ts +15 -0
  232. package/dist/tui/input/paste.d.ts.map +1 -0
  233. package/dist/tui/input/paste.js +35 -0
  234. package/dist/tui/input/paste.js.map +1 -0
  235. package/dist/tui/input/protocol.d.ts +9 -0
  236. package/dist/tui/input/protocol.d.ts.map +1 -0
  237. package/dist/tui/input/protocol.js +387 -0
  238. package/dist/tui/input/protocol.js.map +1 -0
  239. package/dist/tui/input/sanitize.d.ts +6 -0
  240. package/dist/tui/input/sanitize.d.ts.map +1 -0
  241. package/dist/tui/input/sanitize.js +20 -0
  242. package/dist/tui/input/sanitize.js.map +1 -0
  243. package/dist/tui/input/types.d.ts +18 -0
  244. package/dist/tui/input/types.d.ts.map +1 -0
  245. package/dist/tui/input/types.js +2 -0
  246. package/dist/tui/input/types.js.map +1 -0
  247. package/dist/tui/launch.d.ts +23 -0
  248. package/dist/tui/launch.d.ts.map +1 -0
  249. package/dist/tui/launch.js +104 -0
  250. package/dist/tui/launch.js.map +1 -0
  251. package/dist/tui/theme.d.ts +20 -0
  252. package/dist/tui/theme.d.ts.map +1 -0
  253. package/dist/tui/theme.js +29 -0
  254. package/dist/tui/theme.js.map +1 -0
  255. package/dist/tui/types.d.ts +136 -0
  256. package/dist/tui/types.d.ts.map +1 -0
  257. package/dist/tui/types.js +9 -0
  258. package/dist/tui/types.js.map +1 -0
  259. package/package.json +76 -0
  260. package/prompts/sections/agents_md.md +23 -0
  261. package/prompts/sections/important_log.md +16 -0
  262. package/prompts/sections/system_mechanisms.md +18 -0
  263. package/prompts/tools/apply_patch.md +31 -0
  264. package/prompts/tools/ask.md +18 -0
  265. package/prompts/tools/bash.md +13 -0
  266. package/prompts/tools/bash_background.md +9 -0
  267. package/prompts/tools/bash_output.md +9 -0
  268. package/prompts/tools/check_status.md +3 -0
  269. package/prompts/tools/diff.md +5 -0
  270. package/prompts/tools/edit_file.md +11 -0
  271. package/prompts/tools/glob.md +7 -0
  272. package/prompts/tools/grep.md +20 -0
  273. package/prompts/tools/kill_agent.md +3 -0
  274. package/prompts/tools/kill_shell.md +5 -0
  275. package/prompts/tools/list_dir.md +5 -0
  276. package/prompts/tools/plan.md +252 -0
  277. package/prompts/tools/read_file.md +9 -0
  278. package/prompts/tools/show_context.md +12 -0
  279. package/prompts/tools/skill.md +7 -0
  280. package/prompts/tools/spawn_agent.md +195 -0
  281. package/prompts/tools/summarize_context.md +122 -0
  282. package/prompts/tools/test.md +5 -0
  283. package/prompts/tools/wait.md +17 -0
  284. package/prompts/tools/web_fetch.md +9 -0
  285. package/prompts/tools/web_search.md +5 -0
  286. package/prompts/tools/write_file.md +11 -0
  287. package/skills/.staging/.gitkeep +0 -0
  288. package/skills/explain-code/SKILL.md +15 -0
  289. package/skills/skill-manager/SKILL.md +83 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * Shared tool loop logic for Agent.
3
+ *
4
+ * Provides the async LLM <-> tool round-trip cycle. Calls the provider,
5
+ * executes tool calls, appends results via callbacks, and repeats until
6
+ * the model responds without tool calls or max rounds are reached.
7
+ *
8
+ * v2: operates through callbacks (getMessages / appendEntry) instead of
9
+ * directly mutating provider messages. The backing store can be the
10
+ * structured session log (main agent) or an ephemeral structured log
11
+ * (sub-agents / stateless runs).
12
+ */
13
+ import { ToolResult as ToolResultClass } from "../providers/base.js";
14
+ import { isRetryableNetworkError, computeRetryDelay, retrySleep, MAX_NETWORK_RETRIES, } from "../network-retry.js";
15
+ import { createReasoning, createAssistantText, createToolCall, createToolResult as createToolResultEntry, } from "../log-entry.js";
16
+ // ------------------------------------------------------------------
17
+ // generateToolSummary
18
+ // ------------------------------------------------------------------
19
+ /** Generate a one-line summary from a ToolDef.summaryTemplate. */
20
+ export function generateToolSummary(agentName, toolName, toolArgs, summaryTemplate) {
21
+ if (summaryTemplate) {
22
+ try {
23
+ // Replace {agent} and any {argKey} placeholders
24
+ let result = summaryTemplate.replace(/\{agent\}/g, agentName);
25
+ for (const [key, value] of Object.entries(toolArgs)) {
26
+ result = result.replace(new RegExp(`\\{${key}\\}`, "g"), String(value));
27
+ }
28
+ // If any unreplaced placeholders remain, fall through to default
29
+ if (!/\{[^}]+\}/.test(result)) {
30
+ return result;
31
+ }
32
+ }
33
+ catch {
34
+ // fall through
35
+ }
36
+ }
37
+ return `${agentName} is calling ${toolName}`;
38
+ }
39
+ function compactDisplayValue(value, maxLen = 48) {
40
+ if (typeof value === "string") {
41
+ const normalized = value.replace(/\s+/g, " ").trim();
42
+ if (!normalized)
43
+ return '""';
44
+ return normalized.length > maxLen ? `${normalized.slice(0, maxLen - 3)}...` : normalized;
45
+ }
46
+ if (typeof value === "number" || typeof value === "boolean") {
47
+ return String(value);
48
+ }
49
+ if (Array.isArray(value)) {
50
+ return `[${value.length} items]`;
51
+ }
52
+ if (value && typeof value === "object") {
53
+ return "{...}";
54
+ }
55
+ return "";
56
+ }
57
+ export function generateToolCallDisplay(toolName, toolArgs) {
58
+ const path = compactDisplayValue(toolArgs["path"]);
59
+ const file = compactDisplayValue(toolArgs["file"]);
60
+ const pattern = compactDisplayValue(toolArgs["pattern"]);
61
+ const url = compactDisplayValue(toolArgs["url"]);
62
+ const command = compactDisplayValue(toolArgs["command"], 60);
63
+ const name = compactDisplayValue(toolArgs["name"]);
64
+ const id = compactDisplayValue(toolArgs["id"]);
65
+ const shell = compactDisplayValue(toolArgs["shell"]);
66
+ const contextIds = Array.isArray(toolArgs["context_ids"])
67
+ ? `[${toolArgs["context_ids"].length} contexts]`
68
+ : "";
69
+ const ids = Array.isArray(toolArgs["ids"])
70
+ ? `[${toolArgs["ids"].length} ids]`
71
+ : "";
72
+ switch (toolName) {
73
+ case "read_file":
74
+ case "list_dir":
75
+ case "edit_file":
76
+ case "write_file":
77
+ return path ? `${toolName} ${path}` : toolName;
78
+ case "apply_patch":
79
+ return toolName;
80
+ case "glob":
81
+ return pattern ? `${toolName} ${pattern}` : toolName;
82
+ case "grep":
83
+ return pattern && path ? `${toolName} ${pattern} in ${path}` : pattern ? `${toolName} ${pattern}` : toolName;
84
+ case "diff":
85
+ return compactDisplayValue(toolArgs["file_a"]) ? `${toolName} ${compactDisplayValue(toolArgs["file_a"])}` : toolName;
86
+ case "bash":
87
+ case "test":
88
+ return command ? `${toolName} ${command}` : toolName;
89
+ case "bash_background":
90
+ return command ? `${toolName} ${command}` : toolName;
91
+ case "bash_output":
92
+ return id ? `${toolName} ${id}` : toolName;
93
+ case "kill_shell":
94
+ return ids ? `${toolName} ${ids}` : toolName;
95
+ case "web_fetch":
96
+ return url ? `${toolName} ${url}` : toolName;
97
+ case "web_search":
98
+ case "$web_search":
99
+ return compactDisplayValue(toolArgs["query"]) ? `${toolName} ${compactDisplayValue(toolArgs["query"])}` : toolName;
100
+ case "spawn_agent":
101
+ return file ? `${toolName} ${file}` : toolName;
102
+ case "kill_agent":
103
+ return ids ? `${toolName} ${ids}` : toolName;
104
+ case "wait":
105
+ if (shell) {
106
+ return toolArgs["seconds"] !== undefined
107
+ ? `${toolName} ${shell} ${String(toolArgs["seconds"])}s`
108
+ : `${toolName} ${shell}`;
109
+ }
110
+ return toolArgs["seconds"] !== undefined ? `${toolName} ${String(toolArgs["seconds"])}s` : toolName;
111
+ case "summarize_context":
112
+ return contextIds ? `${toolName} ${contextIds}` : toolName;
113
+ case "skill":
114
+ return name ? `${toolName} ${name}` : toolName;
115
+ default:
116
+ return toolName;
117
+ }
118
+ }
119
+ function extractToolPreview(metadata) {
120
+ const preview = metadata["tui_preview"];
121
+ if (!preview || typeof preview !== "object")
122
+ return null;
123
+ const text = preview["text"];
124
+ if (typeof text !== "string" || !text.trim())
125
+ return null;
126
+ const dim = preview["dim"] === true ? true : undefined;
127
+ return { text, dim };
128
+ }
129
+ /**
130
+ * Async tool loop: call LLM, execute tools, repeat until done.
131
+ *
132
+ * Tool executors are called with their arguments dict and may be
133
+ * sync or async. Exceptions are caught and returned as error
134
+ * ToolResult content.
135
+ */
136
+ export async function asyncRunToolLoop(opts) {
137
+ const { provider, getMessages, appendEntry, allocId, turnIndex, baseRoundIndex = 0, tools, toolExecutors, maxRounds, agentName = "", onToolCall, onTextChunk, onReasoningChunk, builtinExecutor, signal, contextIdAllocator, onTokenUpdate, compactCheck, thinkingLevel, cacheEnabled, onSaveCheckpoint, beforeToolExecute, getNotification, streamCallbacksOwnEntries = false, onRetryAttempt, onRetrySuccess, onRetryExhausted, } = opts;
138
+ let toolsMap = opts.toolsMap;
139
+ if (!toolsMap && tools) {
140
+ toolsMap = Object.fromEntries(tools.map((t) => [t.name, t]));
141
+ }
142
+ const toolHistory = [];
143
+ const intermediateText = [];
144
+ let hadStreamedText = false;
145
+ let totalInput = 0;
146
+ let totalOutput = 0;
147
+ let lastInput = 0;
148
+ let lastReasoningContent = "";
149
+ let lastReasoningState = null;
150
+ // Flat context ID per tool-call round
151
+ let lastRoundId;
152
+ // Network retry counter (consecutive failures across rounds)
153
+ let networkRetryCount = 0;
154
+ for (let roundIdx = 0; roundIdx < maxRounds; roundIdx++) {
155
+ const roundIndex = baseRoundIndex + roundIdx;
156
+ // Check abort before each provider call
157
+ if (signal?.aborted) {
158
+ throw new DOMException("The operation was aborted.", "AbortError");
159
+ }
160
+ // Track whether the provider called onTextChunk (streaming).
161
+ let providerStreamedText = false;
162
+ let providerStreamedReasoning = false;
163
+ let textHandledViaCallback = false;
164
+ let reasoningHandledViaCallback = false;
165
+ let wrappedChunk;
166
+ if (onTextChunk) {
167
+ wrappedChunk = (chunk) => {
168
+ providerStreamedText = true;
169
+ textHandledViaCallback = onTextChunk(roundIndex, chunk) === true || textHandledViaCallback;
170
+ };
171
+ }
172
+ let wrappedReasoningChunk;
173
+ if (onReasoningChunk) {
174
+ wrappedReasoningChunk = (chunk) => {
175
+ providerStreamedReasoning = true;
176
+ reasoningHandledViaCallback = onReasoningChunk(roundIndex, chunk) === true || reasoningHandledViaCallback;
177
+ };
178
+ }
179
+ let resp;
180
+ // eslint-disable-next-line no-constant-condition
181
+ while (true) {
182
+ try {
183
+ resp = await provider.asyncSendMessage(getMessages(), tools?.length ? tools : undefined, {
184
+ onTextChunk: wrappedChunk,
185
+ onReasoningChunk: wrappedReasoningChunk,
186
+ signal,
187
+ thinkingLevel,
188
+ cacheEnabled,
189
+ });
190
+ if (networkRetryCount > 0) {
191
+ onRetrySuccess?.(networkRetryCount);
192
+ networkRetryCount = 0;
193
+ }
194
+ break;
195
+ }
196
+ catch (netErr) {
197
+ if (!isRetryableNetworkError(netErr) || networkRetryCount >= MAX_NETWORK_RETRIES) {
198
+ if (isRetryableNetworkError(netErr)) {
199
+ const errMsg = netErr instanceof Error ? netErr.message : String(netErr);
200
+ onRetryExhausted?.(MAX_NETWORK_RETRIES, errMsg);
201
+ }
202
+ throw netErr;
203
+ }
204
+ networkRetryCount++;
205
+ const errMsg = netErr instanceof Error ? netErr.message : String(netErr);
206
+ const delay = computeRetryDelay(networkRetryCount - 1);
207
+ const delaySec = Math.round(delay / 1000);
208
+ onRetryAttempt?.(networkRetryCount, MAX_NETWORK_RETRIES, delaySec, errMsg);
209
+ await retrySleep(delay, signal);
210
+ }
211
+ }
212
+ lastInput = resp.usage.inputTokens;
213
+ totalInput += resp.usage.inputTokens;
214
+ totalOutput += resp.usage.outputTokens;
215
+ if (onTokenUpdate) {
216
+ onTokenUpdate(lastInput, resp.usage);
217
+ }
218
+ // Compact check after each provider call
219
+ let compactTriggered = false;
220
+ let compactScenario;
221
+ if (compactCheck) {
222
+ const check = compactCheck(resp.usage.inputTokens, resp.usage.outputTokens, resp.hasToolCalls);
223
+ if (check?.compactNeeded) {
224
+ compactTriggered = true;
225
+ compactScenario = check.scenario;
226
+ }
227
+ }
228
+ // Fallback: emit text as single chunk if provider didn't stream
229
+ if (resp.text && onTextChunk && !providerStreamedText) {
230
+ textHandledViaCallback = onTextChunk(roundIndex, resp.text) === true || textHandledViaCallback;
231
+ }
232
+ if (resp.reasoningContent && onReasoningChunk && !providerStreamedReasoning) {
233
+ reasoningHandledViaCallback =
234
+ onReasoningChunk(roundIndex, resp.reasoningContent) === true || reasoningHandledViaCallback;
235
+ }
236
+ if (resp.text) {
237
+ hadStreamedText = true;
238
+ }
239
+ if (!resp.hasToolCalls) {
240
+ // No tool calls — return final result.
241
+ // The caller (Session) is responsible for creating the final
242
+ // assistant_text / reasoning / no_reply entries.
243
+ return {
244
+ text: resp.text,
245
+ toolHistory,
246
+ totalUsage: { inputTokens: totalInput, outputTokens: totalOutput },
247
+ intermediateText,
248
+ lastInputTokens: lastInput,
249
+ reasoningContent: resp.reasoningContent,
250
+ reasoningState: resp.reasoningState,
251
+ lastRoundId: lastRoundId,
252
+ compactNeeded: compactTriggered,
253
+ compactScenario: compactTriggered ? "output" : undefined,
254
+ lastTotalTokens: resp.usage.inputTokens + resp.usage.outputTokens,
255
+ textHandledInLog: streamCallbacksOwnEntries && textHandledViaCallback,
256
+ reasoningHandledInLog: streamCallbacksOwnEntries && reasoningHandledViaCallback,
257
+ };
258
+ }
259
+ // Track reasoning from each round (used in max-rounds fallback)
260
+ lastReasoningContent = resp.reasoningContent;
261
+ lastReasoningState = resp.reasoningState;
262
+ // Context ID: allocate a flat ID per round
263
+ if (contextIdAllocator) {
264
+ lastRoundId = contextIdAllocator(roundIndex);
265
+ }
266
+ // --- Create entries for this round ---
267
+ // Reasoning entry
268
+ if (resp.reasoningContent && !(streamCallbacksOwnEntries && reasoningHandledViaCallback)) {
269
+ appendEntry(createReasoning(allocId("reasoning"), turnIndex, roundIndex, resp.reasoningContent, resp.reasoningContent, resp.reasoningState, lastRoundId));
270
+ }
271
+ // Intermediate assistant text entry (text alongside tool_calls)
272
+ if (resp.text && !(streamCallbacksOwnEntries && textHandledViaCallback)) {
273
+ intermediateText.push(resp.text);
274
+ appendEntry(createAssistantText(allocId("assistant_text"), turnIndex, roundIndex, resp.text, resp.text, lastRoundId));
275
+ }
276
+ // Pre-compute summaries, emit progress, and run preflight checks
277
+ const toolSummaries = new Map();
278
+ const preflightDecisions = new Map();
279
+ for (const tc of resp.toolCalls) {
280
+ const toolDef = toolsMap?.[tc.name];
281
+ const summary = generateToolSummary(agentName, tc.name, tc.arguments, toolDef?.summaryTemplate ?? "");
282
+ toolSummaries.set(tc.id, summary);
283
+ if (onToolCall) {
284
+ onToolCall(agentName, tc.name, tc.arguments, summary);
285
+ }
286
+ if (beforeToolExecute) {
287
+ const decision = await beforeToolExecute({
288
+ agentName,
289
+ toolName: tc.name,
290
+ toolArgs: tc.arguments,
291
+ toolCallId: tc.id,
292
+ summary,
293
+ });
294
+ if (decision) {
295
+ preflightDecisions.set(tc.id, decision);
296
+ }
297
+ }
298
+ }
299
+ // Tool call entries
300
+ for (const tc of resp.toolCalls) {
301
+ const summary = toolSummaries.get(tc.id) ?? "";
302
+ const display = generateToolCallDisplay(tc.name, tc.arguments);
303
+ appendEntry(createToolCall(allocId("tool_call"), turnIndex, roundIndex, display, { id: tc.id, name: tc.name, arguments: tc.arguments }, { toolCallId: tc.id, toolName: tc.name, agentName, contextId: lastRoundId }));
304
+ }
305
+ // Execute each tool call
306
+ for (const tc of resp.toolCalls) {
307
+ // Check abort before each tool execution
308
+ if (signal?.aborted) {
309
+ throw new DOMException("The operation was aborted.", "AbortError");
310
+ }
311
+ const summary = toolSummaries.get(tc.id) ?? "";
312
+ // Execute tool with exception safety
313
+ let toolOutput;
314
+ // Check for JSON parse errors from provider (arguments couldn't be parsed)
315
+ if (tc.arguments["_parseError"]) {
316
+ const parseError = tc.arguments["_parseError"];
317
+ toolOutput = new ToolResultClass({
318
+ content: `ERROR: ${parseError}`,
319
+ });
320
+ // Clean up internal marker from arguments before storing in history
321
+ const cleanArgs = { ...tc.arguments };
322
+ delete cleanArgs["_parseError"];
323
+ tc.arguments = cleanArgs;
324
+ }
325
+ else
326
+ try {
327
+ const preflight = preflightDecisions.get(tc.id);
328
+ if (preflight?.kind === "deny") {
329
+ toolOutput = new ToolResultClass({
330
+ content: `ERROR: ${preflight.message}`,
331
+ });
332
+ }
333
+ else if (tc.name in toolExecutors) {
334
+ toolOutput = await toolExecutors[tc.name](tc.arguments);
335
+ }
336
+ else if (builtinExecutor) {
337
+ toolOutput = await builtinExecutor(tc.name, tc.arguments);
338
+ }
339
+ else {
340
+ toolOutput = new ToolResultClass({
341
+ content: `ERROR: No executor found for tool '${tc.name}'`,
342
+ });
343
+ }
344
+ }
345
+ catch (e) {
346
+ if (e?.name === "AskPendingError") {
347
+ const ask = e.ask;
348
+ if (ask) {
349
+ ask.payload.toolCallId = tc.id;
350
+ ask.roundIndex = roundIndex;
351
+ }
352
+ return {
353
+ text: resp.text || "",
354
+ toolHistory,
355
+ totalUsage: { inputTokens: totalInput, outputTokens: totalOutput },
356
+ intermediateText,
357
+ lastInputTokens: lastInput,
358
+ reasoningContent: resp.reasoningContent,
359
+ reasoningState: resp.reasoningState,
360
+ lastRoundId: lastRoundId,
361
+ compactNeeded: false,
362
+ lastTotalTokens: resp.usage.inputTokens + resp.usage.outputTokens,
363
+ textHandledInLog: streamCallbacksOwnEntries && textHandledViaCallback,
364
+ reasoningHandledInLog: streamCallbacksOwnEntries && reasoningHandledViaCallback,
365
+ suspendedAsk: ask ? { ask, toolCallId: tc.id, roundIndex } : undefined,
366
+ };
367
+ }
368
+ if (e?.name === "AbortError" || signal?.aborted) {
369
+ throw e;
370
+ }
371
+ console.error(`[${agentName}] tool '${tc.name}' raised:`, e);
372
+ toolOutput = new ToolResultClass({
373
+ content: `ERROR: Tool execution failed — ${e}`,
374
+ });
375
+ }
376
+ // Normalize to ToolResult
377
+ const resolved = typeof toolOutput === "string"
378
+ ? new ToolResultClass({ content: toolOutput })
379
+ : toolOutput instanceof ToolResultClass
380
+ ? toolOutput
381
+ : new ToolResultClass({ content: String(toolOutput) });
382
+ // Append notification if queued messages are pending
383
+ let resultStr = resolved.content;
384
+ if (getNotification) {
385
+ const note = getNotification();
386
+ if (note)
387
+ resultStr += note;
388
+ }
389
+ const toolEntry = {
390
+ tool: tc.name,
391
+ arguments: tc.arguments,
392
+ result: resultStr,
393
+ };
394
+ if (resolved.actionHint) {
395
+ toolEntry["action_hint"] = resolved.actionHint;
396
+ }
397
+ if (resolved.tags.length > 0) {
398
+ toolEntry["tags"] = resolved.tags;
399
+ }
400
+ if (Object.keys(resolved.metadata).length > 0) {
401
+ toolEntry["tool_metadata"] = resolved.metadata;
402
+ }
403
+ toolHistory.push(toolEntry);
404
+ // Assign contextId to ALL tool_results in the round (metadata only, no visible §{id}§ tag)
405
+ const finalContent = resultStr;
406
+ const toolResultContextId = contextIdAllocator && lastRoundId !== undefined
407
+ ? lastRoundId
408
+ : undefined;
409
+ // Propagate contentBlocks to metadata for multimodal tool results
410
+ const mergedMetadata = { ...resolved.metadata };
411
+ if (resolved.contentBlocks) {
412
+ mergedMetadata._contentBlocks = resolved.contentBlocks;
413
+ }
414
+ // Create tool_result entry
415
+ const preview = extractToolPreview(resolved.metadata);
416
+ appendEntry(createToolResultEntry(allocId("tool_result"), turnIndex, roundIndex, {
417
+ toolCallId: tc.id,
418
+ toolName: tc.name,
419
+ content: finalContent,
420
+ toolSummary: summary,
421
+ }, {
422
+ isError: resolved.content.startsWith("ERROR:"),
423
+ contextId: toolResultContextId,
424
+ toolMetadata: mergedMetadata,
425
+ previewText: preview?.text,
426
+ previewDim: preview?.dim,
427
+ }));
428
+ if (onSaveCheckpoint)
429
+ onSaveCheckpoint();
430
+ }
431
+ // After all tool calls executed: if compact was triggered, return early
432
+ if (compactTriggered) {
433
+ return {
434
+ text: resp.text || "",
435
+ toolHistory,
436
+ totalUsage: { inputTokens: totalInput, outputTokens: totalOutput },
437
+ intermediateText,
438
+ lastInputTokens: lastInput,
439
+ reasoningContent: lastReasoningContent,
440
+ reasoningState: lastReasoningState,
441
+ lastRoundId: lastRoundId,
442
+ compactNeeded: true,
443
+ compactScenario: "toolcall",
444
+ lastTotalTokens: resp.usage.inputTokens + resp.usage.outputTokens,
445
+ textHandledInLog: streamCallbacksOwnEntries && textHandledViaCallback,
446
+ reasoningHandledInLog: streamCallbacksOwnEntries && reasoningHandledViaCallback,
447
+ };
448
+ }
449
+ }
450
+ console.warn(`[${agentName}] hit max tool rounds (${maxRounds})`);
451
+ return {
452
+ text: "(Agent reached maximum tool call rounds without completing.)",
453
+ toolHistory,
454
+ totalUsage: { inputTokens: totalInput, outputTokens: totalOutput },
455
+ intermediateText,
456
+ lastInputTokens: lastInput,
457
+ reasoningContent: lastReasoningContent,
458
+ reasoningState: lastReasoningState,
459
+ lastRoundId: lastRoundId,
460
+ lastTotalTokens: totalInput + totalOutput,
461
+ textHandledInLog: false,
462
+ reasoningHandledInLog: false,
463
+ };
464
+ }
465
+ //# sourceMappingURL=tool-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loop.js","sourceRoot":"","sources":["../../src/agents/tool-loop.ts"],"names":[],"mappings":"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"}
package/dist/ask.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ export type AskKind = "agent_question";
2
+ export interface AskSource {
3
+ agentId: string;
4
+ agentName?: string;
5
+ toolName?: string;
6
+ turnId?: string;
7
+ }
8
+ export interface AskBase {
9
+ id: string;
10
+ kind: AskKind;
11
+ createdAt: string;
12
+ source: AskSource;
13
+ summary: string;
14
+ roundIndex?: number;
15
+ }
16
+ export type AgentQuestionOptionKind = "normal" | "custom_input" | "discuss_further";
17
+ export interface AgentQuestionOption {
18
+ label: string;
19
+ description?: string;
20
+ kind: AgentQuestionOptionKind;
21
+ systemAdded?: boolean;
22
+ }
23
+ export declare const ASK_CUSTOM_OPTION_LABEL = "Enter custom answer";
24
+ export declare const ASK_DISCUSS_OPTION_LABEL = "Discuss further";
25
+ export declare const ASK_DISCUSS_FURTHER_GUIDANCE = "One or more answers are \"Discuss further\". Treat those answers as requests to continue the discussion rather than final commitments. Use any other answers normally. Briefly address the discussion points, then wait for the user's next message.";
26
+ export interface AgentQuestionItem {
27
+ question: string;
28
+ options: AgentQuestionOption[];
29
+ }
30
+ export interface AgentQuestionAnswer {
31
+ questionIndex: number;
32
+ selectedOptionIndex: number;
33
+ answerText: string;
34
+ /** Optional user note attached to any answer (added via Tab). */
35
+ note?: string;
36
+ }
37
+ export interface AgentQuestionDecision {
38
+ answers: AgentQuestionAnswer[];
39
+ }
40
+ export interface AgentQuestion extends AskBase {
41
+ kind: "agent_question";
42
+ payload: {
43
+ questions: AgentQuestionItem[];
44
+ toolCallId: string;
45
+ };
46
+ options: string[];
47
+ }
48
+ export type AskRequest = AgentQuestion;
49
+ export interface PendingAskUi {
50
+ id: string;
51
+ kind: AskKind;
52
+ createdAt: string;
53
+ summary: string;
54
+ source: AskSource;
55
+ payload: Record<string, unknown>;
56
+ options: string[];
57
+ }
58
+ export interface AskAuditRecord {
59
+ askId: string;
60
+ kind: AskKind;
61
+ summary: string;
62
+ decidedAt: string;
63
+ decision: string;
64
+ source: AskSource;
65
+ }
66
+ export interface PendingTurnState {
67
+ stage: "pre_user_input" | "activation";
68
+ userInput?: string;
69
+ nextActivationIdx?: number;
70
+ convLenBefore?: number;
71
+ pendingToolResultText?: string;
72
+ pendingToolCallId?: string;
73
+ }
74
+ export declare class AskPendingError extends Error {
75
+ askId: string;
76
+ ask?: AskRequest;
77
+ constructor(askOrId: string | AskRequest);
78
+ }
79
+ export declare function isAskPendingError(err: unknown): err is AskPendingError;
80
+ export declare function toPendingAskUi(ask: AskRequest | null): PendingAskUi | null;
81
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
package/dist/ask.js ADDED
@@ -0,0 +1,34 @@
1
+ export const ASK_CUSTOM_OPTION_LABEL = "Enter custom answer";
2
+ export const ASK_DISCUSS_OPTION_LABEL = "Discuss further";
3
+ export const ASK_DISCUSS_FURTHER_GUIDANCE = 'One or more answers are "Discuss further". Treat those answers as requests to continue the discussion rather than final commitments. Use any other answers normally. Briefly address the discussion points, then wait for the user\'s next message.';
4
+ export class AskPendingError extends Error {
5
+ askId;
6
+ ask;
7
+ constructor(askOrId) {
8
+ const askId = typeof askOrId === "string" ? askOrId : askOrId.id;
9
+ super(`Ask request pending resolution (${askId})`);
10
+ this.name = "AskPendingError";
11
+ this.askId = askId;
12
+ if (typeof askOrId !== "string") {
13
+ this.ask = askOrId;
14
+ }
15
+ }
16
+ }
17
+ export function isAskPendingError(err) {
18
+ return err instanceof AskPendingError ||
19
+ (err?.name === "AskPendingError" && typeof err?.askId === "string");
20
+ }
21
+ export function toPendingAskUi(ask) {
22
+ if (!ask)
23
+ return null;
24
+ return {
25
+ id: ask.id,
26
+ kind: ask.kind,
27
+ createdAt: ask.createdAt,
28
+ summary: ask.summary,
29
+ source: ask.source,
30
+ payload: ask.payload,
31
+ options: [...ask.options],
32
+ };
33
+ }
34
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAC1D,MAAM,CAAC,MAAM,4BAA4B,GACvC,qPAAqP,CAAC;AAuDxP,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,KAAK,CAAS;IACd,GAAG,CAAc;IAEjB,YAAY,OAA4B;QACtC,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,mCAAmC,KAAK,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,GAAG,YAAY,eAAe;QACnC,CAAE,GAAW,EAAE,IAAI,KAAK,iBAAiB,IAAI,OAAQ,GAAW,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAsB;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAkC;QAC/C,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;KAC1B,CAAC;AACJ,CAAC"}