profclaw 2.0.0 → 2.3.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 (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -17,6 +17,7 @@ import { logger } from "../../utils/logger.js";
17
17
  import { randomUUID } from "crypto";
18
18
  import { hasSecrets, isSecretsDetectionEnabled, redactSecrets, } from "./secrets.js";
19
19
  import { checkSafetyBounds } from "./guardrails.js";
20
+ import { CorrectionTracker, executeWithSelfCorrection, formatErrorContextForPrompt, suggestParameterFixes, classifyFailure, } from "./self-correction.js";
20
21
  // Constants
21
22
  const DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes
22
23
  const PROGRESS_THROTTLE_MS = 100; // Throttle progress updates
@@ -33,8 +34,39 @@ const redactToolText = (text) => {
33
34
  return redactSecrets(text);
34
35
  };
35
36
  // Tool Executor
37
+ /** Error codes that represent user/policy decisions - self-correction must not retry these */
38
+ const NON_RETRYABLE_CODES = new Set([
39
+ 'APPROVAL_REQUIRED',
40
+ 'DENIED',
41
+ 'USER_DENIED',
42
+ 'SAFETY_BLOCKED',
43
+ 'PROMPT_BLOCKED',
44
+ 'RATE_LIMITED',
45
+ 'TOOL_NOT_FOUND',
46
+ 'MISSING_PARAMS',
47
+ 'INVALID_PARAMS',
48
+ ]);
49
+ /** Maximum retries per tool call enforced by the correction budget */
50
+ const MAX_CORRECTIONS_PER_CALL = 3;
36
51
  export class ToolExecutor {
37
52
  abortControllers = new Map();
53
+ /**
54
+ * One CorrectionTracker per conversation, reset when a conversation ends.
55
+ * Key: conversationId
56
+ */
57
+ correctionTrackers = new Map();
58
+ getOrCreateTracker(conversationId) {
59
+ let tracker = this.correctionTrackers.get(conversationId);
60
+ if (!tracker) {
61
+ tracker = new CorrectionTracker(MAX_CORRECTIONS_PER_CALL);
62
+ this.correctionTrackers.set(conversationId, tracker);
63
+ }
64
+ return tracker;
65
+ }
66
+ /** Call this when a conversation is done to free the tracker. */
67
+ resetCorrectionBudget(conversationId) {
68
+ this.correctionTrackers.delete(conversationId);
69
+ }
38
70
  /**
39
71
  * Execute a single tool call
40
72
  */
@@ -242,137 +274,159 @@ export class ToolExecutor {
242
274
  },
243
275
  };
244
276
  }
245
- // Execute the tool through process pool
277
+ // Execute the tool through process pool, wrapped with self-correction
246
278
  const processPool = getProcessPool();
247
- try {
248
- const result = await processPool.submit(toolCallId, toolCall.name, context.conversationId, async () => {
249
- // Check if sandbox execution is required
250
- if (securityCheck.sandboxRequired &&
251
- securityPolicy.mode === "sandbox") {
252
- return this.executeInSandbox(tool, params, context, toolCallId);
253
- }
254
- // Normal execution
255
- return this.executeWithTimeout(tool, params, {
256
- ...context,
257
- toolCallId,
258
- sessionManager: getSessionManager(),
259
- securityPolicy,
260
- }, DEFAULT_TIMEOUT_MS);
261
- }, {
262
- userId: context.userId,
263
- priority: tool.securityLevel === "safe" ? 1 : 0,
264
- timeout: DEFAULT_TIMEOUT_MS,
265
- });
266
- const durationMs = Date.now() - startTime;
267
- const sanitizedOutput = redactToolText(result.output);
268
- const sanitizedResult = sanitizedOutput === result.output
269
- ? result
270
- : {
271
- ...result,
272
- output: sanitizedOutput,
273
- };
274
- // Log successful execution
275
- auditLogger.logExecution({
276
- toolName: toolCall.name,
277
- toolCallId,
278
- conversationId: context.conversationId,
279
- userId: context.userId,
280
- params,
281
- command: this.extractCommand(params),
282
- securityMode: securityPolicy.mode,
283
- success: sanitizedResult.success,
284
- durationMs,
285
- exitCode: sanitizedResult.data?.exitCode,
286
- output: sanitizedResult.output,
287
- error: sanitizedResult.error?.message,
288
- });
289
- logger.info(`[Executor] Tool ${toolCall.name} completed in ${durationMs}ms`, { component: "ToolExecutor" });
290
- return {
291
- toolCallId,
292
- toolName: toolCall.name,
293
- result: {
294
- ...sanitizedResult,
295
- durationMs,
296
- },
297
- rateLimitInfo: {
298
- remaining: rateLimitResult.remaining - 1,
299
- resetAt: rateLimitResult.resetAt,
300
- },
301
- };
302
- }
303
- catch (error) {
304
- const durationMs = Date.now() - startTime;
305
- // Handle specific error types
306
- if (error instanceof PoolFullError) {
307
- auditLogger.logError({
308
- toolName: toolCall.name,
309
- toolCallId,
310
- conversationId: context.conversationId,
279
+ const correctionTracker = this.getOrCreateTracker(context.conversationId);
280
+ /**
281
+ * Inner executor: submits one attempt to the process pool and converts
282
+ * thrown pool errors (PoolFullError, TimeoutError) into ToolResult failures
283
+ * so the self-correction classifier can handle them uniformly.
284
+ */
285
+ const poolExecutor = async () => {
286
+ try {
287
+ return await processPool.submit(toolCallId, toolCall.name, context.conversationId, async () => {
288
+ if (securityCheck.sandboxRequired &&
289
+ securityPolicy.mode === "sandbox") {
290
+ return this.executeInSandbox(tool, params, context, toolCallId);
291
+ }
292
+ return this.executeWithTimeout(tool, params, {
293
+ ...context,
294
+ toolCallId,
295
+ sessionManager: getSessionManager(),
296
+ securityPolicy,
297
+ }, DEFAULT_TIMEOUT_MS);
298
+ }, {
311
299
  userId: context.userId,
312
- error: "Execution pool is full",
300
+ priority: tool.securityLevel === "safe" ? 1 : 0,
301
+ timeout: DEFAULT_TIMEOUT_MS,
313
302
  });
314
- return {
315
- toolCallId,
316
- toolName: toolCall.name,
317
- result: {
303
+ }
304
+ catch (err) {
305
+ if (err instanceof PoolFullError) {
306
+ return {
318
307
  success: false,
319
308
  error: {
320
309
  code: "POOL_FULL",
321
310
  message: "Too many concurrent executions. Please try again later.",
322
311
  retryable: true,
323
312
  },
324
- durationMs,
325
- },
326
- };
327
- }
328
- if (error instanceof TimeoutError || error instanceof QueueTimeoutError) {
329
- auditLogger.logTimeout({
330
- toolName: toolCall.name,
331
- toolCallId,
332
- conversationId: context.conversationId,
333
- userId: context.userId,
334
- durationMs,
335
- });
336
- return {
337
- toolCallId,
338
- toolName: toolCall.name,
339
- result: {
313
+ };
314
+ }
315
+ if (err instanceof TimeoutError || err instanceof QueueTimeoutError) {
316
+ return {
340
317
  success: false,
341
318
  error: {
342
319
  code: "TIMEOUT",
343
- message: error.message,
320
+ message: err instanceof Error ? err.message : "Execution timed out",
344
321
  retryable: true,
345
322
  },
346
- durationMs,
323
+ };
324
+ }
325
+ return {
326
+ success: false,
327
+ error: {
328
+ code: "EXECUTION_ERROR",
329
+ message: err instanceof Error ? err.message : "Unknown error",
347
330
  },
348
331
  };
349
332
  }
350
- // Generic error
333
+ };
334
+ // Run with self-correction (auto-retry for retryable, context injection for fixable)
335
+ const correctionOutcome = await executeWithSelfCorrection(toolCall.name, poolExecutor, {
336
+ correctionBudget: correctionTracker.canCorrect()
337
+ ? correctionTracker.getStatus().maxCorrections - correctionTracker.getStatus().used
338
+ : 0,
339
+ signal: undefined,
340
+ onRetry: (attempt, error) => {
341
+ logger.info(`[Executor] Self-correction retry ${attempt} for "${toolCall.name}": ${error.code} - ${error.message}`, { component: "ToolExecutor", toolName: toolCall.name, attempt });
342
+ correctionTracker.recordCorrection();
343
+ },
344
+ });
345
+ const rawResult = correctionOutcome.result;
346
+ const durationMs = Date.now() - startTime;
347
+ // Sanitize output secrets
348
+ const sanitizedOutput = redactToolText(rawResult.output);
349
+ const sanitizedResult = sanitizedOutput === rawResult.output
350
+ ? rawResult
351
+ : { ...rawResult, output: sanitizedOutput };
352
+ // Audit log the final outcome
353
+ if (rawResult.error?.code === "POOL_FULL") {
354
+ auditLogger.logError({
355
+ toolName: toolCall.name,
356
+ toolCallId,
357
+ conversationId: context.conversationId,
358
+ userId: context.userId,
359
+ error: rawResult.error.message,
360
+ });
361
+ }
362
+ else if (rawResult.error?.code === "TIMEOUT") {
363
+ auditLogger.logTimeout({
364
+ toolName: toolCall.name,
365
+ toolCallId,
366
+ conversationId: context.conversationId,
367
+ userId: context.userId,
368
+ durationMs,
369
+ });
370
+ }
371
+ else {
351
372
  auditLogger.logExecution({
352
373
  toolName: toolCall.name,
353
374
  toolCallId,
354
375
  conversationId: context.conversationId,
355
376
  userId: context.userId,
356
377
  params,
378
+ command: this.extractCommand(params),
357
379
  securityMode: securityPolicy.mode,
358
- success: false,
380
+ success: sanitizedResult.success,
359
381
  durationMs,
360
- error: error instanceof Error ? error.message : "Unknown error",
382
+ exitCode: sanitizedResult.data?.exitCode,
383
+ output: sanitizedResult.output,
384
+ error: sanitizedResult.error?.message,
361
385
  });
362
- logger.error(`[Executor] Tool ${toolCall.name} failed`, error instanceof Error ? error : undefined);
363
- return {
364
- toolCallId,
365
- toolName: toolCall.name,
366
- result: {
367
- success: false,
368
- error: {
369
- code: "EXECUTION_ERROR",
370
- message: error instanceof Error ? error.message : "Unknown error",
371
- },
372
- durationMs,
373
- },
386
+ }
387
+ if (sanitizedResult.success) {
388
+ logger.info(`[Executor] Tool ${toolCall.name} completed in ${durationMs}ms` +
389
+ (correctionOutcome.retries > 0
390
+ ? ` (after ${correctionOutcome.retries} self-correction retries)`
391
+ : ""), { component: "ToolExecutor" });
392
+ }
393
+ else {
394
+ logger.error(`[Executor] Tool ${toolCall.name} failed after ${correctionOutcome.retries} retries`, undefined);
395
+ }
396
+ // Build self-correction metadata to attach to the result
397
+ const hasCorrectionActivity = correctionOutcome.retries > 0 || correctionOutcome.corrections > 0;
398
+ let selfCorrection;
399
+ if (hasCorrectionActivity || correctionOutcome.errorContexts.length > 0) {
400
+ // For fixable failures, generate parameter fix suggestions
401
+ const parameterFixes = !sanitizedResult.success && sanitizedResult.error
402
+ ? (() => {
403
+ const cls = classifyFailure(sanitizedResult.error, toolCall.name);
404
+ return cls.type === 'fixable'
405
+ ? suggestParameterFixes(sanitizedResult.error, toolCall.name, params)
406
+ : [];
407
+ })()
408
+ : [];
409
+ selfCorrection = {
410
+ retries: correctionOutcome.retries,
411
+ corrections: correctionOutcome.corrections,
412
+ promptContext: correctionOutcome.errorContexts.map(formatErrorContextForPrompt),
413
+ alternativeTools: correctionOutcome.alternativesSuggested.map((a) => a.toolName),
414
+ parameterFixes,
374
415
  };
375
416
  }
417
+ return {
418
+ toolCallId,
419
+ toolName: toolCall.name,
420
+ result: {
421
+ ...sanitizedResult,
422
+ durationMs,
423
+ },
424
+ rateLimitInfo: {
425
+ remaining: rateLimitResult.remaining - 1,
426
+ resetAt: rateLimitResult.resetAt,
427
+ },
428
+ ...(selfCorrection ? { selfCorrection } : {}),
429
+ };
376
430
  }
377
431
  /**
378
432
  * Execute multiple tool calls (parallel or sequential)
@@ -7,6 +7,7 @@
7
7
  // Types
8
8
  export * from './types.js';
9
9
  // Core modules
10
+ import { configureToolRouter } from './tool-router.js';
10
11
  export { getToolRegistry, ToolRegistryImpl } from './registry.js';
11
12
  export { getSecurityManager, initSecurityManager, SecurityPolicyManager } from './security.js';
12
13
  export { getSessionManager, ToolSessionManager } from './session-manager.js';
@@ -102,9 +103,12 @@ export async function initializeToolExecution(options) {
102
103
  }
103
104
  // Register built-in tools
104
105
  if (options?.registerBuiltins !== false) {
105
- registerBuiltinTools();
106
+ await registerBuiltinTools();
106
107
  logger.debug('[Execution] Built-in tools registered', { component: 'ToolExecution' });
107
108
  }
109
+ // Enable model-aware tool filtering to reduce token usage
110
+ configureToolRouter({ enabled: true });
111
+ logger.debug('[Execution] Tool router enabled', { component: 'ToolExecution' });
108
112
  initialized = true;
109
113
  logger.info('[Execution] Tool execution system initialized', { component: 'ToolExecution' });
110
114
  }
@@ -17,7 +17,7 @@ import { logger } from '../../utils/logger.js';
17
17
  const MODEL_PATTERNS = [
18
18
  // Large reasoning models (full tier)
19
19
  { pattern: /claude-(3\.5|4|opus|sonnet-4)/i, capability: 'reasoning', tier: 'full' },
20
- { pattern: /gpt-4o|gpt-4-turbo|gpt-4\.5/i, capability: 'reasoning', tier: 'full' },
20
+ { pattern: /gpt-?4o|gpt-4-turbo|gpt-4\.5|gpt-4\.1/i, capability: 'reasoning', tier: 'full' },
21
21
  { pattern: /gemini-(pro|1\.5|2)/i, capability: 'reasoning', tier: 'full' },
22
22
  { pattern: /o[13]-/i, capability: 'reasoning', tier: 'full' },
23
23
  { pattern: /deepseek-(v3|r1|chat)/i, capability: 'reasoning', tier: 'full' },
@@ -38,6 +38,9 @@ const MODEL_PATTERNS = [
38
38
  { pattern: /glm-4-(air|flashx|long)/i, capability: 'instruction', tier: 'standard' },
39
39
  { pattern: /glm-4\.7-flash/i, capability: 'instruction', tier: 'standard' },
40
40
  { pattern: /moonshot|kimi/i, capability: 'instruction', tier: 'standard' },
41
+ // Models with strong native tool calling despite small size
42
+ { pattern: /gemma-?4/i, capability: 'instruction', tier: 'standard' },
43
+ { pattern: /qwen-?3/i, capability: 'instruction', tier: 'standard' },
41
44
  // Small/local basic models (essential tier)
42
45
  { pattern: /llama-?3\.(2-[13]b|1-8b)|llama3\.2/i, capability: 'basic', tier: 'essential' },
43
46
  { pattern: /qwen-?2\.5-[37]b|qwen2\.5:[37]b/i, capability: 'basic', tier: 'essential' },
@@ -54,23 +57,17 @@ export const ESSENTIAL_TOOL_NAMES = new Set([
54
57
  'exec',
55
58
  'read_file',
56
59
  'write_file',
57
- 'edit_file',
58
- 'search_files',
59
60
  'web_search',
60
61
  'web_fetch',
61
62
  'complete_task',
62
- 'memory_search',
63
- 'agents_list',
64
63
  ]);
65
64
  /**
66
65
  * Tools restricted to full tier only (large capable models).
67
66
  */
68
67
  export const FULL_ONLY_TOOL_NAMES = new Set([
68
+ // Browser automation
69
69
  'canvas_render',
70
70
  'image_analyze',
71
- 'subagent_orchestrate',
72
- 'openai_image_gen',
73
- 'tts_speak',
74
71
  'browser_navigate',
75
72
  'browser_snapshot',
76
73
  'browser_click',
@@ -79,9 +76,33 @@ export const FULL_ONLY_TOOL_NAMES = new Set([
79
76
  'browser_screenshot',
80
77
  'browser_pages',
81
78
  'browser_close',
79
+ // Advanced orchestration
80
+ 'subagent_orchestrate',
81
+ 'openai_image_gen',
82
+ 'tts_speak',
82
83
  'discord_actions',
83
84
  'slack_actions',
84
85
  'telegram_actions',
86
+ // Heavy tools that small models misuse
87
+ 'sessions_spawn',
88
+ 'sessions_send',
89
+ 'decompose_task',
90
+ 'multi_patch',
91
+ 'github_pr',
92
+ 'create_pr',
93
+ 'cron_create',
94
+ 'cron_trigger',
95
+ 'cron_delete',
96
+ 'cron_archive',
97
+ 'cron_pause',
98
+ 'cron_history',
99
+ 'feed_add',
100
+ 'feed_bundle_install',
101
+ 'feed_poll',
102
+ 'feed_digest',
103
+ 'feed_discover',
104
+ 'repl_execute',
105
+ 'db_maintenance',
85
106
  ]);
86
107
  // State
87
108
  let config = {
@@ -92,6 +113,11 @@ let config = {
92
113
  };
93
114
  // Track promoted tools per conversation (conversationId -> set of tool names)
94
115
  const promotedTools = new Map();
116
+ const TIER_MAX_TOOLS = {
117
+ essential: 8,
118
+ standard: 12,
119
+ full: 50,
120
+ };
95
121
  // Core Functions
96
122
  /**
97
123
  * Classify a model ID into a capability profile.
@@ -103,7 +129,7 @@ export function classifyModel(modelId) {
103
129
  return {
104
130
  capability: entry.capability,
105
131
  tier: entry.tier,
106
- maxTools: entry.tier === 'essential' ? 10 : entry.tier === 'standard' ? 30 : 100,
132
+ maxTools: TIER_MAX_TOOLS[entry.tier],
107
133
  contextWindow,
108
134
  toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
109
135
  };
@@ -118,7 +144,7 @@ export function classifyModel(modelId) {
118
144
  return {
119
145
  capability: 'basic',
120
146
  tier: 'essential',
121
- maxTools: 10,
147
+ maxTools: TIER_MAX_TOOLS['essential'],
122
148
  contextWindow,
123
149
  toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
124
150
  };
@@ -127,18 +153,18 @@ export function classifyModel(modelId) {
127
153
  return {
128
154
  capability: 'instruction',
129
155
  tier: 'standard',
130
- maxTools: 30,
156
+ maxTools: TIER_MAX_TOOLS['standard'],
131
157
  contextWindow,
132
158
  toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
133
159
  };
134
160
  }
135
161
  }
136
- // Unknown model: default to configured tier (safe, won't break)
162
+ // Unknown model: default to standard tier (balances capability vs token cost)
137
163
  const contextWindow = 128000;
138
164
  return {
139
165
  capability: 'reasoning',
140
- tier: config.defaultTier,
141
- maxTools: 100,
166
+ tier: 'standard',
167
+ maxTools: TIER_MAX_TOOLS['standard'],
142
168
  contextWindow,
143
169
  toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
144
170
  };
@@ -43,13 +43,13 @@ declare const CanvasRenderParamsSchema: z.ZodObject<{
43
43
  language: z.ZodOptional<z.ZodString>;
44
44
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
45
45
  }, "strip", z.ZodTypeAny, {
46
- type: "code" | "markdown" | "table" | "chart" | "diagram" | "html" | "mermaid" | "svg";
46
+ type: "code" | "markdown" | "table" | "html" | "chart" | "diagram" | "mermaid" | "svg";
47
47
  content: string;
48
48
  title?: string | undefined;
49
49
  metadata?: Record<string, unknown> | undefined;
50
50
  language?: string | undefined;
51
51
  }, {
52
- type: "code" | "markdown" | "table" | "chart" | "diagram" | "html" | "mermaid" | "svg";
52
+ type: "code" | "markdown" | "table" | "html" | "chart" | "diagram" | "mermaid" | "svg";
53
53
  content: string;
54
54
  title?: string | undefined;
55
55
  metadata?: Record<string, unknown> | undefined;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Code Tools
3
+ *
4
+ * Development workflow tools: lint, typecheck, build, format, dependency audit.
5
+ * These complement the existing file-ops, git, and exec tools to enable
6
+ * full coding agent workflows.
7
+ */
8
+ import { z } from 'zod';
9
+ import type { ToolDefinition } from '../types.js';
10
+ declare const TypeCheckParams: z.ZodObject<{
11
+ path: z.ZodOptional<z.ZodString>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ path?: string | undefined;
14
+ }, {
15
+ path?: string | undefined;
16
+ }>;
17
+ export declare const typeCheckTool: ToolDefinition<z.infer<typeof TypeCheckParams>, unknown>;
18
+ declare const LintParams: z.ZodObject<{
19
+ path: z.ZodOptional<z.ZodString>;
20
+ fix: z.ZodOptional<z.ZodBoolean>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ path?: string | undefined;
23
+ fix?: boolean | undefined;
24
+ }, {
25
+ path?: string | undefined;
26
+ fix?: boolean | undefined;
27
+ }>;
28
+ export declare const lintTool: ToolDefinition<z.infer<typeof LintParams>, unknown>;
29
+ declare const BuildParams: z.ZodObject<{
30
+ script: z.ZodOptional<z.ZodString>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ script?: string | undefined;
33
+ }, {
34
+ script?: string | undefined;
35
+ }>;
36
+ export declare const buildTool: ToolDefinition<z.infer<typeof BuildParams>, unknown>;
37
+ declare const FormatParams: z.ZodObject<{
38
+ path: z.ZodOptional<z.ZodString>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ path?: string | undefined;
41
+ }, {
42
+ path?: string | undefined;
43
+ }>;
44
+ export declare const formatTool: ToolDefinition<z.infer<typeof FormatParams>, unknown>;
45
+ declare const ProjectInfoParams: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
46
+ export declare const projectInfoTool: ToolDefinition<z.infer<typeof ProjectInfoParams>, unknown>;
47
+ declare const CreatePrParams: z.ZodObject<{
48
+ title: z.ZodString;
49
+ body: z.ZodOptional<z.ZodString>;
50
+ base: z.ZodOptional<z.ZodString>;
51
+ draft: z.ZodOptional<z.ZodBoolean>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ title: string;
54
+ body?: string | undefined;
55
+ base?: string | undefined;
56
+ draft?: boolean | undefined;
57
+ }, {
58
+ title: string;
59
+ body?: string | undefined;
60
+ base?: string | undefined;
61
+ draft?: boolean | undefined;
62
+ }>;
63
+ export declare const createPrTool: ToolDefinition<z.infer<typeof CreatePrParams>, unknown>;
64
+ export declare const codeTools: ToolDefinition[];
65
+ export {};
66
+ //# sourceMappingURL=code-tools.d.ts.map