@edwardlee5423/magi 0.1.0-alpha.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 (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/agent/headless-agent.d.ts +15 -0
  4. package/dist/agent/headless-agent.js +105 -0
  5. package/dist/agent/headless-agent.js.map +1 -0
  6. package/dist/agent/local-plan.d.ts +20 -0
  7. package/dist/agent/local-plan.js +30 -0
  8. package/dist/agent/local-plan.js.map +1 -0
  9. package/dist/agent/query-engine.d.ts +71 -0
  10. package/dist/agent/query-engine.js +938 -0
  11. package/dist/agent/query-engine.js.map +1 -0
  12. package/dist/agent/query.d.ts +128 -0
  13. package/dist/agent/query.js +674 -0
  14. package/dist/agent/query.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +12 -0
  16. package/dist/agent/system-prompt.js +104 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/agent/tools.d.ts +71 -0
  19. package/dist/agent/tools.js +37 -0
  20. package/dist/agent/tools.js.map +1 -0
  21. package/dist/agents/roles.d.ts +9 -0
  22. package/dist/agents/roles.js +18 -0
  23. package/dist/agents/roles.js.map +1 -0
  24. package/dist/agents/task-queue.d.ts +13 -0
  25. package/dist/agents/task-queue.js +50 -0
  26. package/dist/agents/task-queue.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.js +1540 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/colors.d.ts +20 -0
  31. package/dist/colors.js +92 -0
  32. package/dist/colors.js.map +1 -0
  33. package/dist/commands/agents.d.ts +9 -0
  34. package/dist/commands/agents.js +37 -0
  35. package/dist/commands/agents.js.map +1 -0
  36. package/dist/commands/clear.d.ts +9 -0
  37. package/dist/commands/clear.js +20 -0
  38. package/dist/commands/clear.js.map +1 -0
  39. package/dist/commands/commit.d.ts +8 -0
  40. package/dist/commands/commit.js +35 -0
  41. package/dist/commands/commit.js.map +1 -0
  42. package/dist/commands/compact.d.ts +8 -0
  43. package/dist/commands/compact.js +29 -0
  44. package/dist/commands/compact.js.map +1 -0
  45. package/dist/commands/copy.d.ts +8 -0
  46. package/dist/commands/copy.js +49 -0
  47. package/dist/commands/copy.js.map +1 -0
  48. package/dist/commands/cost.d.ts +8 -0
  49. package/dist/commands/cost.js +94 -0
  50. package/dist/commands/cost.js.map +1 -0
  51. package/dist/commands/diff.d.ts +8 -0
  52. package/dist/commands/diff.js +38 -0
  53. package/dist/commands/diff.js.map +1 -0
  54. package/dist/commands/doctor.d.ts +8 -0
  55. package/dist/commands/doctor.js +23 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/export.d.ts +8 -0
  58. package/dist/commands/export.js +42 -0
  59. package/dist/commands/export.js.map +1 -0
  60. package/dist/commands/fork.d.ts +8 -0
  61. package/dist/commands/fork.js +20 -0
  62. package/dist/commands/fork.js.map +1 -0
  63. package/dist/commands/goal.d.ts +9 -0
  64. package/dist/commands/goal.js +54 -0
  65. package/dist/commands/goal.js.map +1 -0
  66. package/dist/commands/help.d.ts +8 -0
  67. package/dist/commands/help.js +65 -0
  68. package/dist/commands/help.js.map +1 -0
  69. package/dist/commands/hooks.d.ts +8 -0
  70. package/dist/commands/hooks.js +56 -0
  71. package/dist/commands/hooks.js.map +1 -0
  72. package/dist/commands/image.d.ts +17 -0
  73. package/dist/commands/image.js +74 -0
  74. package/dist/commands/image.js.map +1 -0
  75. package/dist/commands/init.d.ts +26 -0
  76. package/dist/commands/init.js +214 -0
  77. package/dist/commands/init.js.map +1 -0
  78. package/dist/commands/mcp.d.ts +8 -0
  79. package/dist/commands/mcp.js +217 -0
  80. package/dist/commands/mcp.js.map +1 -0
  81. package/dist/commands/memory.d.ts +8 -0
  82. package/dist/commands/memory.js +79 -0
  83. package/dist/commands/memory.js.map +1 -0
  84. package/dist/commands/model.d.ts +8 -0
  85. package/dist/commands/model.js +21 -0
  86. package/dist/commands/model.js.map +1 -0
  87. package/dist/commands/permissions.d.ts +9 -0
  88. package/dist/commands/permissions.js +30 -0
  89. package/dist/commands/permissions.js.map +1 -0
  90. package/dist/commands/proactive.d.ts +9 -0
  91. package/dist/commands/proactive.js +24 -0
  92. package/dist/commands/proactive.js.map +1 -0
  93. package/dist/commands/register-all.d.ts +1 -0
  94. package/dist/commands/register-all.js +68 -0
  95. package/dist/commands/register-all.js.map +1 -0
  96. package/dist/commands/registry.d.ts +64 -0
  97. package/dist/commands/registry.js +235 -0
  98. package/dist/commands/registry.js.map +1 -0
  99. package/dist/commands/rename.d.ts +8 -0
  100. package/dist/commands/rename.js +16 -0
  101. package/dist/commands/rename.js.map +1 -0
  102. package/dist/commands/review.d.ts +8 -0
  103. package/dist/commands/review.js +13 -0
  104. package/dist/commands/review.js.map +1 -0
  105. package/dist/commands/rewind.d.ts +8 -0
  106. package/dist/commands/rewind.js +45 -0
  107. package/dist/commands/rewind.js.map +1 -0
  108. package/dist/commands/route.d.ts +9 -0
  109. package/dist/commands/route.js +83 -0
  110. package/dist/commands/route.js.map +1 -0
  111. package/dist/commands/sessions.d.ts +9 -0
  112. package/dist/commands/sessions.js +25 -0
  113. package/dist/commands/sessions.js.map +1 -0
  114. package/dist/commands/skill.d.ts +9 -0
  115. package/dist/commands/skill.js +46 -0
  116. package/dist/commands/skill.js.map +1 -0
  117. package/dist/commands/status.d.ts +8 -0
  118. package/dist/commands/status.js +41 -0
  119. package/dist/commands/status.js.map +1 -0
  120. package/dist/commands/summary.d.ts +8 -0
  121. package/dist/commands/summary.js +39 -0
  122. package/dist/commands/summary.js.map +1 -0
  123. package/dist/commands/tasks.d.ts +9 -0
  124. package/dist/commands/tasks.js +70 -0
  125. package/dist/commands/tasks.js.map +1 -0
  126. package/dist/commands/todos.d.ts +9 -0
  127. package/dist/commands/todos.js +27 -0
  128. package/dist/commands/todos.js.map +1 -0
  129. package/dist/commands/tutorial.d.ts +8 -0
  130. package/dist/commands/tutorial.js +159 -0
  131. package/dist/commands/tutorial.js.map +1 -0
  132. package/dist/commands/upgrade.d.ts +9 -0
  133. package/dist/commands/upgrade.js +73 -0
  134. package/dist/commands/upgrade.js.map +1 -0
  135. package/dist/commands/usage.d.ts +8 -0
  136. package/dist/commands/usage.js +54 -0
  137. package/dist/commands/usage.js.map +1 -0
  138. package/dist/commands/vim.d.ts +10 -0
  139. package/dist/commands/vim.js +34 -0
  140. package/dist/commands/vim.js.map +1 -0
  141. package/dist/config.d.ts +104 -0
  142. package/dist/config.js +533 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/context/compaction.d.ts +66 -0
  145. package/dist/context/compaction.js +353 -0
  146. package/dist/context/compaction.js.map +1 -0
  147. package/dist/context/layers.d.ts +32 -0
  148. package/dist/context/layers.js +114 -0
  149. package/dist/context/layers.js.map +1 -0
  150. package/dist/context/token-budget.d.ts +21 -0
  151. package/dist/context/token-budget.js +70 -0
  152. package/dist/context/token-budget.js.map +1 -0
  153. package/dist/control/auth.d.ts +17 -0
  154. package/dist/control/auth.js +31 -0
  155. package/dist/control/auth.js.map +1 -0
  156. package/dist/control/daemon.d.ts +38 -0
  157. package/dist/control/daemon.js +135 -0
  158. package/dist/control/daemon.js.map +1 -0
  159. package/dist/control/mdns.d.ts +51 -0
  160. package/dist/control/mdns.js +344 -0
  161. package/dist/control/mdns.js.map +1 -0
  162. package/dist/control/peer-client.d.ts +49 -0
  163. package/dist/control/peer-client.js +170 -0
  164. package/dist/control/peer-client.js.map +1 -0
  165. package/dist/control/server.d.ts +30 -0
  166. package/dist/control/server.js +887 -0
  167. package/dist/control/server.js.map +1 -0
  168. package/dist/cost.d.ts +23 -0
  169. package/dist/cost.js +80 -0
  170. package/dist/cost.js.map +1 -0
  171. package/dist/doctor.d.ts +8 -0
  172. package/dist/doctor.js +22 -0
  173. package/dist/doctor.js.map +1 -0
  174. package/dist/env.d.ts +7 -0
  175. package/dist/env.js +70 -0
  176. package/dist/env.js.map +1 -0
  177. package/dist/errors.d.ts +6 -0
  178. package/dist/errors.js +13 -0
  179. package/dist/errors.js.map +1 -0
  180. package/dist/events.d.ts +19 -0
  181. package/dist/events.js +236 -0
  182. package/dist/events.js.map +1 -0
  183. package/dist/fs-utils.d.ts +21 -0
  184. package/dist/fs-utils.js +48 -0
  185. package/dist/fs-utils.js.map +1 -0
  186. package/dist/goal.d.ts +32 -0
  187. package/dist/goal.js +172 -0
  188. package/dist/goal.js.map +1 -0
  189. package/dist/headless.d.ts +38 -0
  190. package/dist/headless.js +547 -0
  191. package/dist/headless.js.map +1 -0
  192. package/dist/history.d.ts +8 -0
  193. package/dist/history.js +77 -0
  194. package/dist/history.js.map +1 -0
  195. package/dist/hooks/events.d.ts +14 -0
  196. package/dist/hooks/events.js +37 -0
  197. package/dist/hooks/events.js.map +1 -0
  198. package/dist/hooks/runner.d.ts +73 -0
  199. package/dist/hooks/runner.js +256 -0
  200. package/dist/hooks/runner.js.map +1 -0
  201. package/dist/hooks/trigger.d.ts +9 -0
  202. package/dist/hooks/trigger.js +18 -0
  203. package/dist/hooks/trigger.js.map +1 -0
  204. package/dist/index.d.ts +61 -0
  205. package/dist/index.js +62 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/interactions.d.ts +102 -0
  208. package/dist/interactions.js +250 -0
  209. package/dist/interactions.js.map +1 -0
  210. package/dist/logger.d.ts +32 -0
  211. package/dist/logger.js +115 -0
  212. package/dist/logger.js.map +1 -0
  213. package/dist/markdown.d.ts +18 -0
  214. package/dist/markdown.js +293 -0
  215. package/dist/markdown.js.map +1 -0
  216. package/dist/mcp/approval.d.ts +9 -0
  217. package/dist/mcp/approval.js +27 -0
  218. package/dist/mcp/approval.js.map +1 -0
  219. package/dist/mcp/client.d.ts +61 -0
  220. package/dist/mcp/client.js +276 -0
  221. package/dist/mcp/client.js.map +1 -0
  222. package/dist/mcp/connection-manager.d.ts +30 -0
  223. package/dist/mcp/connection-manager.js +126 -0
  224. package/dist/mcp/connection-manager.js.map +1 -0
  225. package/dist/mcp/oauth-callback.d.ts +23 -0
  226. package/dist/mcp/oauth-callback.js +108 -0
  227. package/dist/mcp/oauth-callback.js.map +1 -0
  228. package/dist/mcp/oauth-flow.d.ts +45 -0
  229. package/dist/mcp/oauth-flow.js +145 -0
  230. package/dist/mcp/oauth-flow.js.map +1 -0
  231. package/dist/mcp/oauth.d.ts +82 -0
  232. package/dist/mcp/oauth.js +169 -0
  233. package/dist/mcp/oauth.js.map +1 -0
  234. package/dist/mcp/tool-registry.d.ts +29 -0
  235. package/dist/mcp/tool-registry.js +207 -0
  236. package/dist/mcp/tool-registry.js.map +1 -0
  237. package/dist/mcp/transport.d.ts +33 -0
  238. package/dist/mcp/transport.js +493 -0
  239. package/dist/mcp/transport.js.map +1 -0
  240. package/dist/mcp/types.d.ts +57 -0
  241. package/dist/mcp/types.js +2 -0
  242. package/dist/mcp/types.js.map +1 -0
  243. package/dist/memdir.d.ts +58 -0
  244. package/dist/memdir.js +219 -0
  245. package/dist/memdir.js.map +1 -0
  246. package/dist/memory-selection.d.ts +30 -0
  247. package/dist/memory-selection.js +102 -0
  248. package/dist/memory-selection.js.map +1 -0
  249. package/dist/memory.d.ts +85 -0
  250. package/dist/memory.js +259 -0
  251. package/dist/memory.js.map +1 -0
  252. package/dist/paths.d.ts +25 -0
  253. package/dist/paths.js +99 -0
  254. package/dist/paths.js.map +1 -0
  255. package/dist/permissions.d.ts +17 -0
  256. package/dist/permissions.js +72 -0
  257. package/dist/permissions.js.map +1 -0
  258. package/dist/plugins/manifest.d.ts +17 -0
  259. package/dist/plugins/manifest.js +98 -0
  260. package/dist/plugins/manifest.js.map +1 -0
  261. package/dist/plugins/marketplace.d.ts +22 -0
  262. package/dist/plugins/marketplace.js +98 -0
  263. package/dist/plugins/marketplace.js.map +1 -0
  264. package/dist/proactive.d.ts +15 -0
  265. package/dist/proactive.js +49 -0
  266. package/dist/proactive.js.map +1 -0
  267. package/dist/providers/errors.d.ts +14 -0
  268. package/dist/providers/errors.js +66 -0
  269. package/dist/providers/errors.js.map +1 -0
  270. package/dist/providers/format-proxy.d.ts +100 -0
  271. package/dist/providers/format-proxy.js +235 -0
  272. package/dist/providers/format-proxy.js.map +1 -0
  273. package/dist/providers/http.d.ts +4 -0
  274. package/dist/providers/http.js +21 -0
  275. package/dist/providers/http.js.map +1 -0
  276. package/dist/providers/ir.d.ts +84 -0
  277. package/dist/providers/ir.js +76 -0
  278. package/dist/providers/ir.js.map +1 -0
  279. package/dist/providers/messages-compatible.d.ts +19 -0
  280. package/dist/providers/messages-compatible.js +592 -0
  281. package/dist/providers/messages-compatible.js.map +1 -0
  282. package/dist/providers/openai.d.ts +18 -0
  283. package/dist/providers/openai.js +430 -0
  284. package/dist/providers/openai.js.map +1 -0
  285. package/dist/providers/registry.d.ts +10 -0
  286. package/dist/providers/registry.js +16 -0
  287. package/dist/providers/registry.js.map +1 -0
  288. package/dist/providers/sse.d.ts +6 -0
  289. package/dist/providers/sse.js +104 -0
  290. package/dist/providers/sse.js.map +1 -0
  291. package/dist/routing/model-alias.d.ts +8 -0
  292. package/dist/routing/model-alias.js +23 -0
  293. package/dist/routing/model-alias.js.map +1 -0
  294. package/dist/routing/model-router.d.ts +55 -0
  295. package/dist/routing/model-router.js +233 -0
  296. package/dist/routing/model-router.js.map +1 -0
  297. package/dist/routing/router.d.ts +26 -0
  298. package/dist/routing/router.js +63 -0
  299. package/dist/routing/router.js.map +1 -0
  300. package/dist/rules/agents-loader.d.ts +12 -0
  301. package/dist/rules/agents-loader.js +61 -0
  302. package/dist/rules/agents-loader.js.map +1 -0
  303. package/dist/runner/client.d.ts +67 -0
  304. package/dist/runner/client.js +175 -0
  305. package/dist/runner/client.js.map +1 -0
  306. package/dist/session-store.d.ts +250 -0
  307. package/dist/session-store.js +629 -0
  308. package/dist/session-store.js.map +1 -0
  309. package/dist/skills/bundled.d.ts +14 -0
  310. package/dist/skills/bundled.js +148 -0
  311. package/dist/skills/bundled.js.map +1 -0
  312. package/dist/skills/loader.d.ts +11 -0
  313. package/dist/skills/loader.js +73 -0
  314. package/dist/skills/loader.js.map +1 -0
  315. package/dist/slash-menu.d.ts +14 -0
  316. package/dist/slash-menu.js +166 -0
  317. package/dist/slash-menu.js.map +1 -0
  318. package/dist/slash.d.ts +75 -0
  319. package/dist/slash.js +126 -0
  320. package/dist/slash.js.map +1 -0
  321. package/dist/spinner.d.ts +27 -0
  322. package/dist/spinner.js +68 -0
  323. package/dist/spinner.js.map +1 -0
  324. package/dist/ssh/exec.d.ts +20 -0
  325. package/dist/ssh/exec.js +39 -0
  326. package/dist/ssh/exec.js.map +1 -0
  327. package/dist/ssh/file.d.ts +32 -0
  328. package/dist/ssh/file.js +60 -0
  329. package/dist/ssh/file.js.map +1 -0
  330. package/dist/syntax-highlight.d.ts +19 -0
  331. package/dist/syntax-highlight.js +181 -0
  332. package/dist/syntax-highlight.js.map +1 -0
  333. package/dist/tools/agent-tool.d.ts +53 -0
  334. package/dist/tools/agent-tool.js +62 -0
  335. package/dist/tools/agent-tool.js.map +1 -0
  336. package/dist/tools/archive-create.d.ts +35 -0
  337. package/dist/tools/archive-create.js +37 -0
  338. package/dist/tools/archive-create.js.map +1 -0
  339. package/dist/tools/archive-extract.d.ts +28 -0
  340. package/dist/tools/archive-extract.js +36 -0
  341. package/dist/tools/archive-extract.js.map +1 -0
  342. package/dist/tools/base64.d.ts +27 -0
  343. package/dist/tools/base64.js +19 -0
  344. package/dist/tools/base64.js.map +1 -0
  345. package/dist/tools/browser.d.ts +125 -0
  346. package/dist/tools/browser.js +241 -0
  347. package/dist/tools/browser.js.map +1 -0
  348. package/dist/tools/config-tool.d.ts +31 -0
  349. package/dist/tools/config-tool.js +167 -0
  350. package/dist/tools/config-tool.js.map +1 -0
  351. package/dist/tools/cron.d.ts +110 -0
  352. package/dist/tools/cron.js +299 -0
  353. package/dist/tools/cron.js.map +1 -0
  354. package/dist/tools/date.d.ts +24 -0
  355. package/dist/tools/date.js +26 -0
  356. package/dist/tools/date.js.map +1 -0
  357. package/dist/tools/dir-create.d.ts +21 -0
  358. package/dist/tools/dir-create.js +19 -0
  359. package/dist/tools/dir-create.js.map +1 -0
  360. package/dist/tools/dir-list.d.ts +36 -0
  361. package/dist/tools/dir-list.js +47 -0
  362. package/dist/tools/dir-list.js.map +1 -0
  363. package/dist/tools/disk-usage.d.ts +30 -0
  364. package/dist/tools/disk-usage.js +22 -0
  365. package/dist/tools/disk-usage.js.map +1 -0
  366. package/dist/tools/download-file.d.ts +28 -0
  367. package/dist/tools/download-file.js +42 -0
  368. package/dist/tools/download-file.js.map +1 -0
  369. package/dist/tools/environment.d.ts +31 -0
  370. package/dist/tools/environment.js +33 -0
  371. package/dist/tools/environment.js.map +1 -0
  372. package/dist/tools/errors.d.ts +5 -0
  373. package/dist/tools/errors.js +9 -0
  374. package/dist/tools/errors.js.map +1 -0
  375. package/dist/tools/file-copy.d.ts +34 -0
  376. package/dist/tools/file-copy.js +45 -0
  377. package/dist/tools/file-copy.js.map +1 -0
  378. package/dist/tools/file-delete.d.ts +34 -0
  379. package/dist/tools/file-delete.js +42 -0
  380. package/dist/tools/file-delete.js.map +1 -0
  381. package/dist/tools/file-find.d.ts +46 -0
  382. package/dist/tools/file-find.js +33 -0
  383. package/dist/tools/file-find.js.map +1 -0
  384. package/dist/tools/file-move.d.ts +33 -0
  385. package/dist/tools/file-move.js +32 -0
  386. package/dist/tools/file-move.js.map +1 -0
  387. package/dist/tools/files.d.ts +38 -0
  388. package/dist/tools/files.js +123 -0
  389. package/dist/tools/files.js.map +1 -0
  390. package/dist/tools/git-branch-delete.d.ts +27 -0
  391. package/dist/tools/git-branch-delete.js +25 -0
  392. package/dist/tools/git-branch-delete.js.map +1 -0
  393. package/dist/tools/git-reset.d.ts +30 -0
  394. package/dist/tools/git-reset.js +28 -0
  395. package/dist/tools/git-reset.js.map +1 -0
  396. package/dist/tools/git-stash.d.ts +28 -0
  397. package/dist/tools/git-stash.js +24 -0
  398. package/dist/tools/git-stash.js.map +1 -0
  399. package/dist/tools/git.d.ts +77 -0
  400. package/dist/tools/git.js +300 -0
  401. package/dist/tools/git.js.map +1 -0
  402. package/dist/tools/github.d.ts +68 -0
  403. package/dist/tools/github.js +77 -0
  404. package/dist/tools/github.js.map +1 -0
  405. package/dist/tools/head-tail.d.ts +34 -0
  406. package/dist/tools/head-tail.js +23 -0
  407. package/dist/tools/head-tail.js.map +1 -0
  408. package/dist/tools/http-request.d.ts +44 -0
  409. package/dist/tools/http-request.js +57 -0
  410. package/dist/tools/http-request.js.map +1 -0
  411. package/dist/tools/json-query.d.ts +27 -0
  412. package/dist/tools/json-query.js +90 -0
  413. package/dist/tools/json-query.js.map +1 -0
  414. package/dist/tools/kill-process.d.ts +32 -0
  415. package/dist/tools/kill-process.js +51 -0
  416. package/dist/tools/kill-process.js.map +1 -0
  417. package/dist/tools/lsp.d.ts +98 -0
  418. package/dist/tools/lsp.js +398 -0
  419. package/dist/tools/lsp.js.map +1 -0
  420. package/dist/tools/monitor.d.ts +29 -0
  421. package/dist/tools/monitor.js +78 -0
  422. package/dist/tools/monitor.js.map +1 -0
  423. package/dist/tools/network-check.d.ts +34 -0
  424. package/dist/tools/network-check.js +57 -0
  425. package/dist/tools/network-check.js.map +1 -0
  426. package/dist/tools/notebook.d.ts +63 -0
  427. package/dist/tools/notebook.js +158 -0
  428. package/dist/tools/notebook.js.map +1 -0
  429. package/dist/tools/plan-mode.d.ts +48 -0
  430. package/dist/tools/plan-mode.js +57 -0
  431. package/dist/tools/plan-mode.js.map +1 -0
  432. package/dist/tools/process-list.d.ts +35 -0
  433. package/dist/tools/process-list.js +42 -0
  434. package/dist/tools/process-list.js.map +1 -0
  435. package/dist/tools/registry.d.ts +132 -0
  436. package/dist/tools/registry.js +2262 -0
  437. package/dist/tools/registry.js.map +1 -0
  438. package/dist/tools/search.d.ts +38 -0
  439. package/dist/tools/search.js +327 -0
  440. package/dist/tools/search.js.map +1 -0
  441. package/dist/tools/shell.d.ts +18 -0
  442. package/dist/tools/shell.js +249 -0
  443. package/dist/tools/shell.js.map +1 -0
  444. package/dist/tools/skill-tool.d.ts +22 -0
  445. package/dist/tools/skill-tool.js +66 -0
  446. package/dist/tools/skill-tool.js.map +1 -0
  447. package/dist/tools/sleep.d.ts +16 -0
  448. package/dist/tools/sleep.js +24 -0
  449. package/dist/tools/sleep.js.map +1 -0
  450. package/dist/tools/snip.d.ts +26 -0
  451. package/dist/tools/snip.js +95 -0
  452. package/dist/tools/snip.js.map +1 -0
  453. package/dist/tools/system-info.d.ts +17 -0
  454. package/dist/tools/system-info.js +33 -0
  455. package/dist/tools/system-info.js.map +1 -0
  456. package/dist/tools/tasks.d.ts +191 -0
  457. package/dist/tools/tasks.js +348 -0
  458. package/dist/tools/tasks.js.map +1 -0
  459. package/dist/tools/text-stats.d.ts +25 -0
  460. package/dist/tools/text-stats.js +25 -0
  461. package/dist/tools/text-stats.js.map +1 -0
  462. package/dist/tools/todo.d.ts +69 -0
  463. package/dist/tools/todo.js +197 -0
  464. package/dist/tools/todo.js.map +1 -0
  465. package/dist/tools/tool-search.d.ts +29 -0
  466. package/dist/tools/tool-search.js +114 -0
  467. package/dist/tools/tool-search.js.map +1 -0
  468. package/dist/tools/tree-view.d.ts +34 -0
  469. package/dist/tools/tree-view.js +39 -0
  470. package/dist/tools/tree-view.js.map +1 -0
  471. package/dist/tools/user-message.d.ts +39 -0
  472. package/dist/tools/user-message.js +70 -0
  473. package/dist/tools/user-message.js.map +1 -0
  474. package/dist/tools/user-question.d.ts +88 -0
  475. package/dist/tools/user-question.js +236 -0
  476. package/dist/tools/user-question.js.map +1 -0
  477. package/dist/tools/web-browser.d.ts +53 -0
  478. package/dist/tools/web-browser.js +373 -0
  479. package/dist/tools/web-browser.js.map +1 -0
  480. package/dist/tools/web-fetch.d.ts +22 -0
  481. package/dist/tools/web-fetch.js +146 -0
  482. package/dist/tools/web-fetch.js.map +1 -0
  483. package/dist/tools/web-search.d.ts +51 -0
  484. package/dist/tools/web-search.js +198 -0
  485. package/dist/tools/web-search.js.map +1 -0
  486. package/dist/tools/which.d.ts +22 -0
  487. package/dist/tools/which.js +21 -0
  488. package/dist/tools/which.js.map +1 -0
  489. package/dist/tools/whoami.d.ts +17 -0
  490. package/dist/tools/whoami.js +24 -0
  491. package/dist/tools/whoami.js.map +1 -0
  492. package/dist/tools/workspace-diagnostics.d.ts +62 -0
  493. package/dist/tools/workspace-diagnostics.js +421 -0
  494. package/dist/tools/workspace-diagnostics.js.map +1 -0
  495. package/dist/tools/workspace.d.ts +14 -0
  496. package/dist/tools/workspace.js +65 -0
  497. package/dist/tools/workspace.js.map +1 -0
  498. package/dist/tools/worktree.d.ts +70 -0
  499. package/dist/tools/worktree.js +150 -0
  500. package/dist/tools/worktree.js.map +1 -0
  501. package/dist/tui/interactions.d.ts +25 -0
  502. package/dist/tui/interactions.js +232 -0
  503. package/dist/tui/interactions.js.map +1 -0
  504. package/dist/tui/multiline-input.d.ts +14 -0
  505. package/dist/tui/multiline-input.js +550 -0
  506. package/dist/tui/multiline-input.js.map +1 -0
  507. package/dist/tui/paste.d.ts +40 -0
  508. package/dist/tui/paste.js +113 -0
  509. package/dist/tui/paste.js.map +1 -0
  510. package/dist/tui/prompt-reader.d.ts +26 -0
  511. package/dist/tui/prompt-reader.js +553 -0
  512. package/dist/tui/prompt-reader.js.map +1 -0
  513. package/dist/tui/transcript.d.ts +34 -0
  514. package/dist/tui/transcript.js +275 -0
  515. package/dist/tui/transcript.js.map +1 -0
  516. package/dist/tui.d.ts +53 -0
  517. package/dist/tui.js +669 -0
  518. package/dist/tui.js.map +1 -0
  519. package/dist/version.d.ts +1 -0
  520. package/dist/version.js +2 -0
  521. package/dist/version.js.map +1 -0
  522. package/dist/vim/lineEditor.d.ts +18 -0
  523. package/dist/vim/lineEditor.js +420 -0
  524. package/dist/vim/lineEditor.js.map +1 -0
  525. package/dist/web/panel-html.d.ts +1 -0
  526. package/dist/web/panel-html.js +532 -0
  527. package/dist/web/panel-html.js.map +1 -0
  528. package/dist/web/panel.d.ts +4 -0
  529. package/dist/web/panel.js +121 -0
  530. package/dist/web/panel.js.map +1 -0
  531. package/package.json +42 -0
@@ -0,0 +1,674 @@
1
+ import { messageText, textMessage } from "../providers/ir.js";
2
+ import { ProviderError } from "../providers/errors.js";
3
+ import { executeHooks } from "../hooks/runner.js";
4
+ import { BUILTIN_AGENT_TOOLS, executeBuiltinAgentTools } from "./tools.js";
5
+ import { McpToolRegistry } from "../mcp/tool-registry.js";
6
+ export async function* runAgentQuery(input) {
7
+ const inner = runAgentQueryInner(input);
8
+ let result;
9
+ while (true) {
10
+ result = await inner.next();
11
+ if (result.done)
12
+ return result.value;
13
+ input.onStreamEvent?.(result.value);
14
+ yield result.value;
15
+ }
16
+ }
17
+ async function* runAgentQueryInner(input) {
18
+ const messages = [...input.messages];
19
+ const usage = { inputTokens: 0, outputTokens: 0 };
20
+ const maxTurns = input.maxTurns ?? 100;
21
+ const routes = normalizeRoutes(input);
22
+ const attempts = [];
23
+ let routeIndex = 0;
24
+ let activeRoute = routes[routeIndex];
25
+ let finalText = "";
26
+ const mcpTools = input.mcp ? new McpToolRegistry({ servers: input.mcp.servers, env: input.env, tokenLookup: input.mcp.tokenLookup, tokenRefresh: input.mcp.tokenRefresh }) : undefined;
27
+ try {
28
+ const toolDefinitions = await getAgentToolDefinitions(mcpTools);
29
+ yield { type: "request_start" };
30
+ for (let turn = 0; turn < maxTurns; turn++) {
31
+ throwIfCancelled(input.signal);
32
+ let response;
33
+ let streamedTextThisTurn = "";
34
+ while (true) {
35
+ try {
36
+ const completed = yield* completeRoute(activeRoute, {
37
+ model: activeRoute.model,
38
+ messages,
39
+ tools: toolDefinitions,
40
+ temperature: input.temperature,
41
+ maxOutputTokens: input.maxOutputTokens,
42
+ signal: input.signal
43
+ });
44
+ response = completed.response;
45
+ streamedTextThisTurn = completed.streamedText;
46
+ attempts.push({
47
+ providerName: activeRoute.providerName,
48
+ model: activeRoute.model,
49
+ ok: true
50
+ });
51
+ if (completed.streamedText) {
52
+ finalText += completed.streamedText;
53
+ }
54
+ break;
55
+ }
56
+ catch (error) {
57
+ const retryable = error instanceof ProviderError && error.retryable;
58
+ attempts.push({
59
+ providerName: activeRoute.providerName,
60
+ model: activeRoute.model,
61
+ ok: false,
62
+ errorKind: error instanceof ProviderError ? error.kind : "unknown"
63
+ });
64
+ // Retry same route for transient errors (502, 503, timeout, rate-limit)
65
+ const sameRouteRetries = attempts.filter((a) => !a.ok && a.providerName === activeRoute.providerName && a.model === activeRoute.model).length;
66
+ const nextRoute = routes[routeIndex + 1];
67
+ const hasFallback = retryable && nextRoute !== undefined;
68
+ // Fast retries: exponential backoff 1s -> 2s -> 4s (max 8s).
69
+ const maxFastRetries = hasFallback ? 3 : 5;
70
+ if (retryable && sameRouteRetries < maxFastRetries) {
71
+ const delayMs = Math.min(1000 * Math.pow(2, sameRouteRetries - 1), 8000);
72
+ yield {
73
+ type: "error",
74
+ error: `${error instanceof Error ? error.message : String(error)} — retrying in ${Math.round(delayMs / 1000)}s (attempt ${sameRouteRetries + 1}/${maxFastRetries})`,
75
+ retryable: true
76
+ };
77
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
78
+ continue;
79
+ }
80
+ // No fallback available: the proxy is likely having a transient issue.
81
+ // Don't give up after fast retries — keep retrying with longer
82
+ // intervals (10s -> 20s -> 30s) up to ~60s total so brief blips recover.
83
+ if (retryable && !hasFallback && sameRouteRetries < 8) {
84
+ const slowIndex = sameRouteRetries - maxFastRetries;
85
+ const delayMs = Math.min(10_000 * Math.pow(2, slowIndex), 30_000);
86
+ yield {
87
+ type: "error",
88
+ error: `${error instanceof Error ? error.message : String(error)} — proxy still down, retrying in ${Math.round(delayMs / 1000)}s (attempt ${sameRouteRetries + 1}/8)`,
89
+ retryable: true
90
+ };
91
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
92
+ continue;
93
+ }
94
+ if (retryable && hasFallback) {
95
+ const previous = activeRoute;
96
+ routeIndex += 1;
97
+ activeRoute = nextRoute;
98
+ yield {
99
+ type: "fallback_switched",
100
+ fromProvider: previous.providerName,
101
+ fromModel: previous.model,
102
+ toProvider: activeRoute.providerName,
103
+ toModel: activeRoute.model,
104
+ errorKind: error instanceof ProviderError ? error.kind : "unknown"
105
+ };
106
+ continue;
107
+ }
108
+ yield {
109
+ type: "error",
110
+ error: error instanceof Error ? error.message : String(error),
111
+ retryable
112
+ };
113
+ throw error;
114
+ }
115
+ }
116
+ if (response.usage) {
117
+ usage.inputTokens += response.usage.inputTokens;
118
+ usage.outputTokens += response.usage.outputTokens;
119
+ yield { type: "usage", usage: response.usage };
120
+ }
121
+ throwIfCancelled(input.signal);
122
+ let normalized = normalizeProviderResponse(response, toolDefinitions);
123
+ response = normalized.response;
124
+ let toolUses = normalized.toolUses;
125
+ if (toolUses.length === 0 && !response.text.trim() && response.usage && response.usage.outputTokens > 0) {
126
+ response = await recoverEmptyFinalAnswer(activeRoute, messages, input.signal);
127
+ if (response.usage) {
128
+ usage.inputTokens += response.usage.inputTokens;
129
+ usage.outputTokens += response.usage.outputTokens;
130
+ yield { type: "usage", usage: response.usage };
131
+ }
132
+ if (response.text.trim()) {
133
+ yield { type: "text_delta", text: response.text };
134
+ }
135
+ normalized = normalizeProviderResponse(response, toolDefinitions);
136
+ response = normalized.response;
137
+ toolUses = normalized.toolUses;
138
+ }
139
+ if (toolUses.length === 0
140
+ && !streamedTextThisTurn
141
+ && shouldRecoverDeferredAction(messages, response.text, toolDefinitions)) {
142
+ response = await recoverDeferredAction(activeRoute, messages, response.text, toolDefinitions, input.signal, input.maxOutputTokens);
143
+ if (response.usage) {
144
+ usage.inputTokens += response.usage.inputTokens;
145
+ usage.outputTokens += response.usage.outputTokens;
146
+ yield { type: "usage", usage: response.usage };
147
+ }
148
+ normalized = normalizeProviderResponse(response, toolDefinitions);
149
+ response = normalized.response;
150
+ toolUses = normalized.toolUses;
151
+ }
152
+ if (response.text && !streamedTextThisTurn) {
153
+ finalText += response.text;
154
+ yield { type: "text_delta", text: response.text };
155
+ }
156
+ for (const toolUse of toolUses) {
157
+ yield { type: "tool_use", toolUse };
158
+ }
159
+ const assistantMessage = {
160
+ role: "assistant",
161
+ content: [
162
+ ...(response.text ? [{ type: "text", text: response.text }] : []),
163
+ ...toolUses
164
+ ]
165
+ };
166
+ messages.push(assistantMessage);
167
+ yield { type: "assistant_message", message: assistantMessage };
168
+ if (toolUses.length === 0) {
169
+ yield { type: "done", text: finalText, messages };
170
+ return {
171
+ text: finalText,
172
+ messages,
173
+ usage,
174
+ turns: turn + 1,
175
+ providerName: activeRoute.providerName,
176
+ model: activeRoute.model,
177
+ attempts
178
+ };
179
+ }
180
+ const promptModel = async ({ model, messages }) => {
181
+ throwIfCancelled(input.signal);
182
+ const response = await activeRoute.adapter.complete({ model, messages, signal: input.signal });
183
+ return { text: response.text };
184
+ };
185
+ const prepared = await prepareToolUsesWithPreHooks(input, toolUses, promptModel);
186
+ for (const hookResult of prepared.hookResults) {
187
+ yield hookResult;
188
+ }
189
+ const executed = await executePreparedToolUses(input, prepared, mcpTools, async ({ messages }) => {
190
+ throwIfCancelled(input.signal);
191
+ const response = await activeRoute.adapter.complete({ model: activeRoute.model, messages, signal: input.signal });
192
+ return { text: response.text };
193
+ });
194
+ for (const event of executed.events) {
195
+ yield event;
196
+ }
197
+ const toolResults = executed.results;
198
+ const toolResultMessages = [];
199
+ const hookMessages = [];
200
+ for (const result of toolResults) {
201
+ if (result.permission?.decision === "ask") {
202
+ yield {
203
+ type: "approval_request",
204
+ toolUse: toolUses.find((toolUse) => toolUse.id === result.toolCallId) ?? {
205
+ type: "tool-use",
206
+ id: result.toolCallId,
207
+ name: result.toolName,
208
+ input: {}
209
+ },
210
+ reason: result.permission.reason
211
+ };
212
+ }
213
+ yield {
214
+ type: "tool_result",
215
+ toolCallId: result.toolCallId,
216
+ toolName: result.toolName,
217
+ content: result.content,
218
+ isError: result.isError,
219
+ retryable: result.retryable
220
+ };
221
+ toolResultMessages.push({
222
+ role: "tool",
223
+ content: [{
224
+ type: "tool-result",
225
+ toolCallId: result.toolCallId,
226
+ content: result.content,
227
+ isError: result.isError,
228
+ retryable: result.retryable
229
+ }]
230
+ });
231
+ const postHooks = await executeHooks({
232
+ event: result.isError ? "post_tool_use_failure" : "post_tool_use",
233
+ hooks: input.hooks ?? [],
234
+ env: input.env,
235
+ context: {
236
+ sessionId: input.sessionId ?? "",
237
+ cwd: input.cwd,
238
+ permissionMode: input.permissionMode,
239
+ toolName: result.toolName,
240
+ toolUseId: result.toolCallId,
241
+ toolResponse: result.content,
242
+ error: result.isError ? result.content : undefined
243
+ },
244
+ promptModel
245
+ });
246
+ for (const hook of postHooks) {
247
+ yield {
248
+ type: "hook_result",
249
+ event: result.isError ? "post_tool_use_failure" : "post_tool_use",
250
+ toolCallId: result.toolCallId,
251
+ toolName: result.toolName,
252
+ result: hook
253
+ };
254
+ if (hook.output) {
255
+ hookMessages.push(textMessage("system", `Hook output: ${hook.output}`));
256
+ }
257
+ }
258
+ }
259
+ messages.push(...toolResultMessages, ...hookMessages);
260
+ }
261
+ yield { type: "max_turns_reached" };
262
+ const text = finalText || "Agent loop stopped after reaching the maximum turn count.";
263
+ messages.push(textMessage("assistant", text));
264
+ yield { type: "done", text, messages };
265
+ return {
266
+ text,
267
+ messages,
268
+ usage,
269
+ turns: maxTurns,
270
+ providerName: activeRoute.providerName,
271
+ model: activeRoute.model,
272
+ attempts
273
+ };
274
+ }
275
+ catch (error) {
276
+ if (isAbortError(error) || input.signal?.aborted) {
277
+ yield { type: "cancelled", reason: input.signal?.reason ? String(input.signal.reason) : undefined };
278
+ }
279
+ throw error;
280
+ }
281
+ finally {
282
+ mcpTools?.close();
283
+ }
284
+ }
285
+ async function recoverEmptyFinalAnswer(route, messages, signal) {
286
+ throwIfCancelled(signal);
287
+ return route.adapter.complete({
288
+ model: route.model,
289
+ messages: [
290
+ ...messages,
291
+ textMessage("user", "Your previous response produced no visible final answer. Reply now with a concise, user-visible final answer. Do not include hidden reasoning.")
292
+ ],
293
+ maxOutputTokens: 1024,
294
+ signal
295
+ });
296
+ }
297
+ async function recoverDeferredAction(route, messages, previousText, toolDefinitions, signal, maxOutputTokens) {
298
+ throwIfCancelled(signal);
299
+ const readOnlyTools = toolDefinitions
300
+ .map((tool) => tool.name)
301
+ .filter((name) => [
302
+ "WorkspaceDiagnostics",
303
+ "DirList",
304
+ "FileRead",
305
+ "Grep",
306
+ "Glob",
307
+ "TreeView",
308
+ "GitStatus",
309
+ "GitSummary"
310
+ ].includes(name));
311
+ return route.adapter.complete({
312
+ model: route.model,
313
+ messages: [
314
+ ...messages,
315
+ textMessage("assistant", previousText),
316
+ textMessage("user", [
317
+ "You deferred the work instead of acting. The user's request is concrete enough to begin.",
318
+ "Do not ask for confirmation and do not promise future inspection.",
319
+ `Use one or more read-only tools now to inspect the project/context. Available read-only tools include: ${readOnlyTools.join(", ")}.`,
320
+ "After tool results return, continue normally."
321
+ ].join("\n"))
322
+ ],
323
+ tools: toolDefinitions,
324
+ temperature: 0,
325
+ maxOutputTokens,
326
+ signal
327
+ });
328
+ }
329
+ async function* completeRoute(route, request) {
330
+ throwIfCancelled(request.signal);
331
+ if (!route.adapter.stream) {
332
+ return {
333
+ response: await route.adapter.complete(request),
334
+ streamedText: ""
335
+ };
336
+ }
337
+ const stream = route.adapter.stream(request);
338
+ const streamedTextParts = [];
339
+ let next = await stream.next();
340
+ while (!next.done) {
341
+ if (next.value.type === "text-delta") {
342
+ streamedTextParts.push(next.value.text);
343
+ yield { type: "text_delta", text: next.value.text };
344
+ }
345
+ throwIfCancelled(request.signal);
346
+ next = await stream.next();
347
+ }
348
+ const response = next.value;
349
+ // When the server doesn't support SSE, stream() falls back to a full response
350
+ // with all the text in one shot — surface it as a text_delta so the TUI can display it
351
+ let streamedText = streamedTextParts.join("");
352
+ if (!streamedText && response.text) {
353
+ streamedText = response.text;
354
+ yield { type: "text_delta", text: response.text };
355
+ }
356
+ return { response, streamedText };
357
+ }
358
+ function throwIfCancelled(signal) {
359
+ if (!signal?.aborted) {
360
+ return;
361
+ }
362
+ const reason = signal.reason;
363
+ if (reason instanceof Error) {
364
+ throw reason;
365
+ }
366
+ throw new DOMException(reason ? String(reason) : "Operation cancelled", "AbortError");
367
+ }
368
+ function isAbortError(error) {
369
+ return error instanceof DOMException && error.name === "AbortError"
370
+ || error instanceof Error && error.name === "AbortError";
371
+ }
372
+ async function prepareToolUsesWithPreHooks(input, toolUses, promptModel) {
373
+ const results = new Array(toolUses.length);
374
+ const allowed = [];
375
+ const hookResults = [];
376
+ for (const [index, toolUse] of toolUses.entries()) {
377
+ const hooks = await executeHooks({
378
+ event: "pre_tool_use",
379
+ hooks: input.hooks ?? [],
380
+ env: input.env,
381
+ context: {
382
+ sessionId: input.sessionId ?? "",
383
+ cwd: input.cwd,
384
+ permissionMode: input.permissionMode,
385
+ toolName: toolUse.name,
386
+ toolInput: toolUse.input,
387
+ toolUseId: toolUse.id
388
+ },
389
+ promptModel
390
+ });
391
+ for (const hook of hooks) {
392
+ hookResults.push({
393
+ type: "hook_result",
394
+ event: "pre_tool_use",
395
+ toolCallId: toolUse.id,
396
+ toolName: toolUse.name,
397
+ result: hook
398
+ });
399
+ }
400
+ const block = hooks.find((hook) => hook.blocked);
401
+ if (block) {
402
+ results[index] = {
403
+ toolCallId: toolUse.id,
404
+ toolName: toolUse.name,
405
+ content: `Blocked by hook: ${block.output || "hook exited with code 2"}`,
406
+ isError: true
407
+ };
408
+ continue;
409
+ }
410
+ allowed.push({ index, toolUse });
411
+ }
412
+ return { results, allowed, hookResults };
413
+ }
414
+ async function executePreparedToolUses(input, prepared, mcpTools, promptModel) {
415
+ const results = prepared.results;
416
+ const events = [];
417
+ if (prepared.allowed.length > 0) {
418
+ const builtIn = prepared.allowed.filter(({ toolUse }) => !mcpTools?.hasTool(toolUse.name));
419
+ const mcp = prepared.allowed.filter(({ toolUse }) => mcpTools?.hasTool(toolUse.name));
420
+ const builtInResults = await executeBuiltinAgentTools({
421
+ cwd: input.cwd,
422
+ toolUses: builtIn.map(({ toolUse }) => toolUse),
423
+ env: input.env,
424
+ stateRoot: input.stateRoot,
425
+ sessionId: input.sessionId,
426
+ webSearchConfig: input.webSearchConfig,
427
+ permissionMode: input.permissionMode,
428
+ promptModel,
429
+ userQuestionResolver: async (request) => {
430
+ if (!input.userQuestionResolver) {
431
+ throw new Error("AskUserQuestion requires an interactive user question resolver");
432
+ }
433
+ const answer = await input.userQuestionResolver(request);
434
+ events.push({
435
+ type: "user_question",
436
+ toolUse: request.toolUse,
437
+ question: request.question,
438
+ answer
439
+ });
440
+ return answer;
441
+ },
442
+ userMessageSink: async (request) => {
443
+ const sink = input.userMessageSink ?? (async () => ({
444
+ delivered: true,
445
+ channel: "agent-event",
446
+ deliveredAt: new Date().toISOString()
447
+ }));
448
+ const result = await sink(request);
449
+ events.push({
450
+ type: "user_message",
451
+ toolUse: request.toolUse,
452
+ message: request.message,
453
+ result
454
+ });
455
+ return result;
456
+ },
457
+ approvalResolver: async ({ toolUse, permission }) => {
458
+ if (permission.decision !== "ask") {
459
+ return false;
460
+ }
461
+ return input.approvalResolver?.({ toolUse, reason: permission.reason, diff: permission.diff }) ?? false;
462
+ },
463
+ spawnSubAgent: input.spawnSubAgent,
464
+ signal: input.signal
465
+ });
466
+ for (const [resultIndex, result] of builtInResults.entries()) {
467
+ results[builtIn[resultIndex].index] = result;
468
+ }
469
+ if (mcpTools) {
470
+ for (const { index, toolUse } of mcp) {
471
+ const first = await mcpTools.executeTool({ toolUse });
472
+ if (first.permission?.decision === "ask" && input.approvalResolver) {
473
+ const approved = await input.approvalResolver({ toolUse, reason: first.permission.reason });
474
+ results[index] = approved ? await mcpTools.executeTool({ toolUse, approved: true }) : first;
475
+ }
476
+ else {
477
+ results[index] = first;
478
+ }
479
+ }
480
+ }
481
+ }
482
+ return {
483
+ results: results.map((result) => {
484
+ if (!result) {
485
+ throw new Error("Tool execution produced no result");
486
+ }
487
+ return result;
488
+ }),
489
+ events
490
+ };
491
+ }
492
+ async function getAgentToolDefinitions(mcpTools) {
493
+ if (!mcpTools) {
494
+ return BUILTIN_AGENT_TOOLS;
495
+ }
496
+ const dynamic = await mcpTools.getToolDefinitions();
497
+ const builtInNames = new Set(BUILTIN_AGENT_TOOLS.map((tool) => tool.name));
498
+ return [
499
+ ...BUILTIN_AGENT_TOOLS,
500
+ ...dynamic.filter((tool) => !builtInNames.has(tool.name))
501
+ ];
502
+ }
503
+ export async function collectAgentQuery(input) {
504
+ const iterator = runAgentQueryInner(input);
505
+ let next = await iterator.next();
506
+ while (!next.done) {
507
+ next = await iterator.next();
508
+ }
509
+ return next.value;
510
+ }
511
+ function normalizeToolUses(toolUses) {
512
+ return (toolUses ?? []).map((toolUse) => ({
513
+ type: "tool-use",
514
+ id: toolUse.id,
515
+ name: toolUse.name,
516
+ input: toolUse.input ?? {}
517
+ }));
518
+ }
519
+ function normalizeProviderResponse(response, toolDefinitions) {
520
+ const toolUses = normalizeToolUses(response.toolUses);
521
+ if (toolUses.length > 0) {
522
+ return { response, toolUses };
523
+ }
524
+ const textToolUses = parseTextToolUses(response.text, toolDefinitions);
525
+ if (textToolUses.toolUses.length === 0) {
526
+ return { response, toolUses: [] };
527
+ }
528
+ return {
529
+ response: { ...response, text: textToolUses.text, toolUses: textToolUses.toolUses },
530
+ toolUses: textToolUses.toolUses
531
+ };
532
+ }
533
+ function shouldRecoverDeferredAction(messages, text, toolDefinitions) {
534
+ if (!text.trim() || toolDefinitions.length === 0) {
535
+ return false;
536
+ }
537
+ const lastUser = findLastUserText(messages);
538
+ if (!lastUser || !isActionablePrompt(lastUser)) {
539
+ return false;
540
+ }
541
+ return isDeferralText(text);
542
+ }
543
+ function findLastUserText(messages) {
544
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
545
+ const message = messages[index];
546
+ if (message.role === "user") {
547
+ return messageText(message);
548
+ }
549
+ }
550
+ return undefined;
551
+ }
552
+ function isActionablePrompt(text) {
553
+ const normalized = text.toLowerCase();
554
+ return /(?:^|\s|["'`(])(?:\/Users\/|\/home\/|\/tmp\/|\.\/|\.\.\/|[A-Za-z]:\\)/.test(text)
555
+ || /(继续|推进|修|改|查|看看|检查|启动|拉起来|运行|测试|验证|debug|bug|build|test|run|start|fix|inspect|check|continue)/i.test(normalized);
556
+ }
557
+ function isDeferralText(text) {
558
+ const normalized = text.toLowerCase();
559
+ return [
560
+ /我会先/,
561
+ /我先/,
562
+ /我将/,
563
+ /接下来我/,
564
+ /可以继续/,
565
+ /需要你.*确认/,
566
+ /如果.*我.*可以/,
567
+ /i(?:'ll| will) (?:first )?(?:read|check|inspect|look|review|start|run)/,
568
+ /i(?:'m| am) going to (?:read|check|inspect|look|review|start|run)/,
569
+ /let me (?:read|check|inspect|look|review|start|run)/,
570
+ /i can (?:continue|start|check|inspect|look)/
571
+ ].some((pattern) => pattern.test(normalized));
572
+ }
573
+ function parseTextToolUses(text, toolDefinitions) {
574
+ if (!text.includes("<tool_use")) {
575
+ return { text, toolUses: [] };
576
+ }
577
+ const availableTools = new Set(toolDefinitions.map((tool) => tool.name));
578
+ const toolUses = [];
579
+ const blockPattern = /<tool_use\b([^>]*)>([\s\S]*?)<\/tool_use>/g;
580
+ const stripped = text.replace(blockPattern, (block, attrs, body) => {
581
+ const name = readXmlAttribute(attrs, "tool_name") ?? readXmlAttribute(attrs, "name");
582
+ if (!name || !availableTools.has(name)) {
583
+ return block;
584
+ }
585
+ toolUses.push({
586
+ type: "tool-use",
587
+ id: `text-tool-${toolUses.length + 1}`,
588
+ name,
589
+ input: normalizeTextToolInput(name, parseTextToolArgs(body))
590
+ });
591
+ return "";
592
+ });
593
+ return { text: toolUses.length > 0 ? stripped.trim() : text, toolUses };
594
+ }
595
+ function parseTextToolArgs(body) {
596
+ const input = {};
597
+ const argPattern = /<arg\b([^>]*)>([\s\S]*?)<\/arg>/g;
598
+ for (const match of body.matchAll(argPattern)) {
599
+ const name = readXmlAttribute(match[1], "name");
600
+ if (!name) {
601
+ continue;
602
+ }
603
+ input[name] = coerceTextToolValue(decodeXmlEntities(match[2].trim()));
604
+ }
605
+ const directArgPattern = /<([A-Za-z_][A-Za-z0-9_-]*)\b[^>]*>([\s\S]*?)<\/\1>/g;
606
+ for (const match of body.matchAll(directArgPattern)) {
607
+ const name = match[1];
608
+ if (name === "arg" || input[name] !== undefined) {
609
+ continue;
610
+ }
611
+ input[name] = coerceTextToolValue(decodeXmlEntities(match[2].trim()));
612
+ }
613
+ return input;
614
+ }
615
+ function normalizeTextToolInput(toolName, input) {
616
+ if ((toolName === "FileRead" || toolName === "FileWrite" || toolName === "FileEdit") && input.file_path === undefined && input.path !== undefined) {
617
+ return { ...input, file_path: input.path };
618
+ }
619
+ if (toolName === "Bash" && input.command === undefined && input.cmd !== undefined) {
620
+ return { ...input, command: input.cmd };
621
+ }
622
+ return input;
623
+ }
624
+ function coerceTextToolValue(value) {
625
+ if (value === "true")
626
+ return true;
627
+ if (value === "false")
628
+ return false;
629
+ if (value && /^-?\d+(?:\.\d+)?$/.test(value)) {
630
+ const numberValue = Number(value);
631
+ if (Number.isFinite(numberValue)) {
632
+ return numberValue;
633
+ }
634
+ }
635
+ if ((value.startsWith("{") && value.endsWith("}")) || (value.startsWith("[") && value.endsWith("]"))) {
636
+ try {
637
+ return JSON.parse(value);
638
+ }
639
+ catch {
640
+ return value;
641
+ }
642
+ }
643
+ return value;
644
+ }
645
+ function readXmlAttribute(attrs, name) {
646
+ const pattern = new RegExp(`${escapeRegExp(name)}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`);
647
+ const match = pattern.exec(attrs);
648
+ return match?.[1] ?? match?.[2];
649
+ }
650
+ function decodeXmlEntities(value) {
651
+ return value
652
+ .replace(/&quot;/g, "\"")
653
+ .replace(/&apos;/g, "'")
654
+ .replace(/&lt;/g, "<")
655
+ .replace(/&gt;/g, ">")
656
+ .replace(/&amp;/g, "&");
657
+ }
658
+ function escapeRegExp(value) {
659
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
660
+ }
661
+ function normalizeRoutes(input) {
662
+ if (input.routes?.length) {
663
+ return input.routes;
664
+ }
665
+ if (!input.adapter || !input.model) {
666
+ throw new Error("Agent query requires either routes or adapter+model");
667
+ }
668
+ return [{
669
+ providerName: input.providerName ?? input.adapter.name,
670
+ model: input.model,
671
+ adapter: input.adapter
672
+ }];
673
+ }
674
+ //# sourceMappingURL=query.js.map