profclaw 2.0.0 → 2.4.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 (519) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +52 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +178 -41
  6. package/config/pricing.yml +26 -2
  7. package/dist/agents/agent-summary.d.ts +44 -0
  8. package/dist/agents/agent-summary.js +176 -0
  9. package/dist/agents/auto-memory.d.ts +59 -0
  10. package/dist/agents/auto-memory.js +310 -0
  11. package/dist/agents/checkpoint-manager.d.ts +76 -0
  12. package/dist/agents/checkpoint-manager.js +156 -0
  13. package/dist/agents/circuit-breaker.d.ts +54 -0
  14. package/dist/agents/circuit-breaker.js +153 -0
  15. package/dist/agents/command-sandbox.d.ts +93 -0
  16. package/dist/agents/command-sandbox.js +235 -0
  17. package/dist/agents/context-compactor.d.ts +70 -0
  18. package/dist/agents/context-compactor.js +361 -0
  19. package/dist/agents/conversation-branch.d.ts +55 -0
  20. package/dist/agents/conversation-branch.js +115 -0
  21. package/dist/agents/error-recovery.d.ts +44 -0
  22. package/dist/agents/error-recovery.js +197 -0
  23. package/dist/agents/events.d.ts +76 -0
  24. package/dist/agents/events.js +8 -0
  25. package/dist/agents/executor-runner.d.ts +135 -0
  26. package/dist/agents/executor-runner.js +303 -0
  27. package/dist/agents/executor.d.ts +37 -1
  28. package/dist/agents/executor.js +606 -124
  29. package/dist/agents/file-snapshots.d.ts +72 -0
  30. package/dist/agents/file-snapshots.js +182 -0
  31. package/dist/agents/index.d.ts +2 -0
  32. package/dist/agents/orchestrator.d.ts +183 -0
  33. package/dist/agents/orchestrator.js +495 -0
  34. package/dist/agents/output-truncator.d.ts +59 -0
  35. package/dist/agents/output-truncator.js +128 -0
  36. package/dist/agents/permissions.d.ts +63 -0
  37. package/dist/agents/permissions.js +138 -0
  38. package/dist/agents/plan-mode.d.ts +71 -0
  39. package/dist/agents/plan-mode.js +186 -0
  40. package/dist/agents/prompt-suggestions.d.ts +33 -0
  41. package/dist/agents/prompt-suggestions.js +208 -0
  42. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  43. package/dist/agents/rate-limit-monitor.js +224 -0
  44. package/dist/agents/receipt/receipt-cli.d.ts +43 -0
  45. package/dist/agents/receipt/receipt-cli.js +82 -0
  46. package/dist/agents/receipt/receipt-types.d.ts +136 -0
  47. package/dist/agents/receipt/receipt-types.js +19 -0
  48. package/dist/agents/receipt/receipt-verify.d.ts +19 -0
  49. package/dist/agents/receipt/receipt-verify.js +176 -0
  50. package/dist/agents/receipt/receipt-view.d.ts +29 -0
  51. package/dist/agents/receipt/receipt-view.js +227 -0
  52. package/dist/agents/receipt/receipt-writer.d.ts +47 -0
  53. package/dist/agents/receipt/receipt-writer.js +186 -0
  54. package/dist/agents/result-store.d.ts +43 -0
  55. package/dist/agents/result-store.js +145 -0
  56. package/dist/agents/session-diff.d.ts +49 -0
  57. package/dist/agents/session-diff.js +249 -0
  58. package/dist/agents/tool-loader.d.ts +65 -0
  59. package/dist/agents/tool-loader.js +273 -0
  60. package/dist/agents/tool-selector.d.ts +123 -0
  61. package/dist/agents/tool-selector.js +321 -0
  62. package/dist/agents/transcript.d.ts +96 -0
  63. package/dist/agents/transcript.js +267 -0
  64. package/dist/agents/verified-run-git.d.ts +49 -0
  65. package/dist/agents/verified-run-git.js +82 -0
  66. package/dist/agents/verified-run.d.ts +149 -0
  67. package/dist/agents/verified-run.js +402 -0
  68. package/dist/agents/verifier.d.ts +64 -0
  69. package/dist/agents/verifier.js +186 -0
  70. package/dist/agents/worktree-manager.d.ts +80 -0
  71. package/dist/agents/worktree-manager.js +203 -0
  72. package/dist/agents/worktree-tools.d.ts +47 -0
  73. package/dist/agents/worktree-tools.js +246 -0
  74. package/dist/auth/middleware.js +14 -0
  75. package/dist/chat/agentic-executor.d.ts +7 -0
  76. package/dist/chat/agentic-executor.js +263 -32
  77. package/dist/chat/conversations.d.ts +2 -0
  78. package/dist/chat/conversations.js +8 -0
  79. package/dist/chat/execution/executor.d.ts +8 -0
  80. package/dist/chat/execution/executor.js +157 -103
  81. package/dist/chat/execution/index.js +5 -1
  82. package/dist/chat/execution/sandbox.d.ts +8 -0
  83. package/dist/chat/execution/sandbox.js +25 -1
  84. package/dist/chat/execution/tool-router.js +40 -14
  85. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  86. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  87. package/dist/chat/execution/tools/code-tools.js +353 -0
  88. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  89. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  90. package/dist/chat/execution/tools/cron-tool.js +48 -3
  91. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  92. package/dist/chat/execution/tools/decompose-task.js +166 -0
  93. package/dist/chat/execution/tools/exec.d.ts +5 -2
  94. package/dist/chat/execution/tools/exec.js +294 -155
  95. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  96. package/dist/chat/execution/tools/feed-tools.js +142 -0
  97. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  98. package/dist/chat/execution/tools/github.d.ts +2 -2
  99. package/dist/chat/execution/tools/index.d.ts +14 -2
  100. package/dist/chat/execution/tools/index.js +86 -12
  101. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  102. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  103. package/dist/chat/execution/tools/multi-patch.js +373 -0
  104. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  105. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  106. package/dist/chat/execution/tools/plan-tools.js +134 -0
  107. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  108. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  109. package/dist/chat/execution/tools/repl-tool.js +207 -0
  110. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  111. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  112. package/dist/chat/execution/tools/system.d.ts +4 -4
  113. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  114. package/dist/chat/execution/tools/todo-tool.js +152 -0
  115. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  116. package/dist/chat/execution/tools/tool-search.js +155 -0
  117. package/dist/chat/execution/tools/tts-speak.d.ts +2 -2
  118. package/dist/chat/execution/types.d.ts +21 -14
  119. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  120. package/dist/chat/execution/workflows/executor.js +99 -1
  121. package/dist/chat/execution/workflows/types.d.ts +35 -2
  122. package/dist/chat/format/index.d.ts +1 -0
  123. package/dist/chat/format/index.js +1 -0
  124. package/dist/chat/format/markdown-convert.d.ts +23 -0
  125. package/dist/chat/format/markdown-convert.js +149 -0
  126. package/dist/chat/index.d.ts +1 -1
  127. package/dist/chat/index.js +1 -1
  128. package/dist/chat/message-handler.js +58 -6
  129. package/dist/chat/meta-tool-handlers.d.ts +18 -0
  130. package/dist/chat/meta-tool-handlers.js +51 -0
  131. package/dist/chat/proactive/index.d.ts +62 -0
  132. package/dist/chat/proactive/index.js +147 -0
  133. package/dist/chat/prompt-adapter.js +2 -0
  134. package/dist/chat/providers/irc/index.d.ts +2 -2
  135. package/dist/chat/providers/telegram/index.d.ts +2 -0
  136. package/dist/chat/providers/telegram/index.js +21 -2
  137. package/dist/chat/system-prompts.d.ts +3 -3
  138. package/dist/chat/system-prompts.js +121 -61
  139. package/dist/chat/tool-handler.d.ts +2 -0
  140. package/dist/chat/tool-handler.js +47 -3
  141. package/dist/chat/tools.d.ts +6 -6
  142. package/dist/cli/commands/auth.js +64 -1
  143. package/dist/cli/commands/chat.js +1327 -138
  144. package/dist/cli/commands/doctor.js +222 -16
  145. package/dist/cli/commands/history.d.ts +3 -0
  146. package/dist/cli/commands/history.js +138 -0
  147. package/dist/cli/commands/import.d.ts +44 -0
  148. package/dist/cli/commands/import.js +526 -0
  149. package/dist/cli/commands/init.d.ts +13 -0
  150. package/dist/cli/commands/init.js +381 -0
  151. package/dist/cli/commands/onboard.js +210 -30
  152. package/dist/cli/commands/plan.d.ts +13 -0
  153. package/dist/cli/commands/plan.js +184 -0
  154. package/dist/cli/commands/receipt.d.ts +7 -0
  155. package/dist/cli/commands/receipt.js +90 -0
  156. package/dist/cli/commands/run.d.ts +28 -0
  157. package/dist/cli/commands/run.js +204 -0
  158. package/dist/cli/commands/serve.d.ts +7 -0
  159. package/dist/cli/commands/serve.js +77 -18
  160. package/dist/cli/commands/setup.js +84 -3
  161. package/dist/cli/commands/status.js +54 -0
  162. package/dist/cli/commands/tools.js +13 -13
  163. package/dist/cli/commands/tui.js +26 -1
  164. package/dist/cli/index.js +23 -0
  165. package/dist/cli/ink/App.d.ts +13 -0
  166. package/dist/cli/ink/App.js +6 -0
  167. package/dist/cli/ink/ChatApp.d.ts +60 -0
  168. package/dist/cli/ink/ChatApp.js +325 -0
  169. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  170. package/dist/cli/ink/DashboardApp.js +143 -0
  171. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  172. package/dist/cli/ink/components/AgentStatus.js +33 -0
  173. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  174. package/dist/cli/ink/components/ChannelList.js +33 -0
  175. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  176. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  177. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  178. package/dist/cli/ink/components/CostBar.js +35 -0
  179. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  180. package/dist/cli/ink/components/HookStatus.js +7 -0
  181. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  182. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  183. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  184. package/dist/cli/ink/components/PlanView.js +26 -0
  185. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  186. package/dist/cli/ink/components/ProviderList.js +16 -0
  187. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  188. package/dist/cli/ink/components/SessionHeader.js +15 -0
  189. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  190. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  191. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  192. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  193. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  194. package/dist/cli/ink/components/SystemHealth.js +39 -0
  195. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  196. package/dist/cli/ink/components/TaskList.js +59 -0
  197. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  198. package/dist/cli/ink/components/ToolCall.js +43 -0
  199. package/dist/cli/ink/index.d.ts +23 -0
  200. package/dist/cli/ink/index.js +15 -0
  201. package/dist/cli/ink/keybindings.d.ts +35 -0
  202. package/dist/cli/ink/keybindings.js +105 -0
  203. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  204. package/dist/cli/ink/markdown-renderer.js +380 -0
  205. package/dist/cli/ink/output-styles.d.ts +39 -0
  206. package/dist/cli/ink/output-styles.js +119 -0
  207. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  208. package/dist/cli/interactive/auto-serve.js +209 -0
  209. package/dist/cli/interactive/index.d.ts +25 -0
  210. package/dist/cli/interactive/index.js +23 -0
  211. package/dist/cli/interactive/picker.d.ts +28 -0
  212. package/dist/cli/interactive/picker.js +153 -0
  213. package/dist/cli/interactive/renderer.d.ts +26 -0
  214. package/dist/cli/interactive/renderer.js +555 -0
  215. package/dist/cli/interactive/repl.d.ts +14 -0
  216. package/dist/cli/interactive/repl.js +1516 -0
  217. package/dist/cli/interactive/stream-client.d.ts +59 -0
  218. package/dist/cli/interactive/stream-client.js +506 -0
  219. package/dist/cli/interactive/types.d.ts +121 -0
  220. package/dist/cli/interactive/types.js +10 -0
  221. package/dist/cli/utils/api.d.ts +9 -0
  222. package/dist/cli/utils/api.js +58 -2
  223. package/dist/costs/token-tracker.d.ts +10 -1
  224. package/dist/costs/token-tracker.js +37 -5
  225. package/dist/cron/natural-language.d.ts +54 -0
  226. package/dist/cron/natural-language.js +569 -0
  227. package/dist/cron/scheduler.d.ts +34 -4
  228. package/dist/cron/scheduler.js +141 -9
  229. package/dist/cron/templates.d.ts +1 -1
  230. package/dist/cron/templates.js +219 -0
  231. package/dist/feeds/feed-engine.d.ts +149 -0
  232. package/dist/feeds/feed-engine.js +600 -0
  233. package/dist/feeds/index.d.ts +9 -0
  234. package/dist/feeds/index.js +8 -0
  235. package/dist/gateway/router.js +6 -1
  236. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  237. package/dist/hooks/built-in/audit-log.js +84 -0
  238. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  239. package/dist/hooks/built-in/cost-warning.js +59 -0
  240. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  241. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  242. package/dist/hooks/built-in/index.d.ts +14 -0
  243. package/dist/hooks/built-in/index.js +20 -0
  244. package/dist/hooks/index.d.ts +3 -0
  245. package/dist/hooks/index.js +6 -0
  246. package/dist/hooks/loader.d.ts +17 -0
  247. package/dist/hooks/loader.js +142 -0
  248. package/dist/hooks/registry.d.ts +62 -0
  249. package/dist/hooks/registry.js +127 -0
  250. package/dist/integrations/web-search.js +6 -3
  251. package/dist/memory/index.d.ts +1 -0
  252. package/dist/memory/index.js +2 -0
  253. package/dist/memory/memory-service.js +14 -13
  254. package/dist/memory/observational.d.ts +62 -0
  255. package/dist/memory/observational.js +396 -0
  256. package/dist/middleware/content-filter.d.ts +22 -0
  257. package/dist/middleware/content-filter.js +69 -0
  258. package/dist/middleware/request-validator.d.ts +159 -0
  259. package/dist/middleware/request-validator.js +93 -0
  260. package/dist/plugins/sdk.d.ts +22 -0
  261. package/dist/plugins/sdk.js +17 -1
  262. package/dist/projects/types.d.ts +10 -10
  263. package/dist/providers/ai-sdk.d.ts +11 -0
  264. package/dist/providers/ai-sdk.js +111 -56
  265. package/dist/providers/core/models.js +114 -6
  266. package/dist/providers/core/types.d.ts +7 -0
  267. package/dist/providers/index.d.ts +1 -0
  268. package/dist/providers/index.js +1 -0
  269. package/dist/providers/prompt-cache.d.ts +68 -0
  270. package/dist/providers/prompt-cache.js +165 -0
  271. package/dist/providers/smart-router.d.ts +118 -0
  272. package/dist/providers/smart-router.js +693 -0
  273. package/dist/providers/types.d.ts +16 -16
  274. package/dist/routes/agents.js +50 -0
  275. package/dist/routes/auth.js +8 -1
  276. package/dist/routes/chat.js +280 -18
  277. package/dist/routes/costs.js +32 -0
  278. package/dist/routes/cron.js +80 -5
  279. package/dist/routes/feeds.d.ts +10 -0
  280. package/dist/routes/feeds.js +168 -0
  281. package/dist/routes/mcp.js +21 -0
  282. package/dist/routes/memory.js +130 -0
  283. package/dist/routes/skills.js +129 -0
  284. package/dist/routes/teams.d.ts +9 -0
  285. package/dist/routes/teams.js +210 -0
  286. package/dist/routes/tools.js +14 -0
  287. package/dist/routes/users.js +2 -0
  288. package/dist/server/route-loader.js +3 -1
  289. package/dist/server/stream-bridge.d.ts +19 -0
  290. package/dist/server/stream-bridge.js +38 -0
  291. package/dist/server.js +313 -36
  292. package/dist/skills/marketplace.d.ts +87 -0
  293. package/dist/skills/marketplace.js +268 -0
  294. package/dist/storage/index.d.ts +14 -0
  295. package/dist/storage/index.js +64 -3
  296. package/dist/storage/schema.d.ts +4 -4
  297. package/dist/storage/schema.js +1 -1
  298. package/dist/teams/index.d.ts +110 -0
  299. package/dist/teams/index.js +365 -0
  300. package/dist/tickets/types.d.ts +39 -39
  301. package/dist/types/summary.d.ts +5 -5
  302. package/dist/utils/auto-update.d.ts +23 -0
  303. package/dist/utils/auto-update.js +157 -0
  304. package/dist/utils/offline-detect.d.ts +55 -0
  305. package/dist/utils/offline-detect.js +121 -0
  306. package/dist/utils/pid-file.d.ts +36 -0
  307. package/dist/utils/pid-file.js +125 -0
  308. package/dist/utils/prevent-sleep.d.ts +27 -0
  309. package/dist/utils/prevent-sleep.js +95 -0
  310. package/dist/utils/sanitizer.d.ts +57 -0
  311. package/dist/utils/sanitizer.js +174 -0
  312. package/docker-compose.yml +13 -137
  313. package/package.json +31 -6
  314. package/skills/deploy-cloudflare/SKILL.md +62 -0
  315. package/skills/deploy-vercel/SKILL.md +67 -0
  316. package/skills/docker-deploy/SKILL.md +158 -0
  317. package/skills/full-stack-builder/SKILL.md +92 -0
  318. package/skills/humanizer/SKILL.md +488 -0
  319. package/skills/profclaw-assistant/SKILL.md +85 -56
  320. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  321. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  322. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  323. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  324. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  325. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  326. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  327. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  328. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  329. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  330. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  331. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  333. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  334. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  335. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  336. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  338. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  341. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  343. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  349. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  350. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  351. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  352. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  353. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  356. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  357. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  358. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  359. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  360. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  361. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  362. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  363. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  364. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  365. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  366. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  367. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  368. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  369. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  370. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  371. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  372. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  373. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  374. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  375. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  376. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  377. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  378. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  379. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  380. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  381. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  382. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  383. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  384. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  385. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  386. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  387. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  388. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  389. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  390. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  391. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  392. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  393. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  394. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  395. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  396. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  397. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  398. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  399. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  400. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  401. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  402. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  403. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  404. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  405. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  406. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  407. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  408. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  409. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  410. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  411. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  412. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  413. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  414. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  415. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  416. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  417. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  418. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  419. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  420. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  421. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  422. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  423. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  424. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  425. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  426. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  427. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  428. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  429. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  430. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  431. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  432. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  433. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  434. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  435. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  436. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  437. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  438. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  439. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  440. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  441. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  442. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  443. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  444. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  445. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  446. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  447. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  448. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  449. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  450. package/ui/dist/assets/select-n108rXny.js +1 -0
  451. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  452. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  453. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  454. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  455. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  456. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  457. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  458. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  459. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  460. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  461. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  462. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  463. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  464. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  465. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  466. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  467. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  468. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  469. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  470. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  471. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  472. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  473. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  474. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  475. package/ui/dist/index.html +5 -2
  476. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  477. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  478. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  479. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  480. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  481. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  482. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  483. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  484. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  485. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  486. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  487. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  488. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  489. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  490. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  491. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  492. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  493. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  494. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  495. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  496. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  497. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  498. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  499. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  500. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  501. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  502. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  503. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  504. package/ui/dist/assets/index-C8N375c2.js +0 -1
  505. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  506. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  507. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  508. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  509. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  510. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  511. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  512. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  513. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  514. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  515. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  516. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  517. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  518. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  519. 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
  }
@@ -23,6 +23,14 @@ export interface SandboxExecuteResult {
23
23
  containerId?: string;
24
24
  error?: string;
25
25
  }
26
+ /**
27
+ * Ping the Docker daemon, giving up after a timeout. A wedged daemon (for example a
28
+ * half-started Docker Desktop) accepts the connection but never answers, which would
29
+ * otherwise hang startup forever.
30
+ */
31
+ export declare function pingDockerWithTimeout(docker: {
32
+ ping(): Promise<unknown>;
33
+ }, timeoutMs?: number): Promise<void>;
26
34
  export declare class SandboxManager {
27
35
  private config;
28
36
  private securityConfig;
@@ -16,6 +16,30 @@ const DEFAULT_CPU_LIMIT = '1';
16
16
  const CONTAINER_POOL_SIZE = 3;
17
17
  const CONTAINER_MAX_AGE_MS = 3600_000; // 1 hour
18
18
  const CLEANUP_INTERVAL_MS = 60_000; // 1 minute
19
+ const DEFAULT_DOCKER_PING_TIMEOUT_MS = 3_000;
20
+ /** How long to wait for the Docker daemon to answer before treating it as unavailable. */
21
+ function getDockerPingTimeoutMs(env = process.env) {
22
+ const parsed = Number(env['PROFCLAW_DOCKER_PING_TIMEOUT_MS']);
23
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_DOCKER_PING_TIMEOUT_MS;
24
+ }
25
+ /**
26
+ * Ping the Docker daemon, giving up after a timeout. A wedged daemon (for example a
27
+ * half-started Docker Desktop) accepts the connection but never answers, which would
28
+ * otherwise hang startup forever.
29
+ */
30
+ export async function pingDockerWithTimeout(docker, timeoutMs = getDockerPingTimeoutMs()) {
31
+ let timer;
32
+ const timeout = new Promise((_, reject) => {
33
+ timer = setTimeout(() => reject(new Error(`Docker daemon did not respond within ${timeoutMs}ms`)), timeoutMs);
34
+ });
35
+ try {
36
+ await Promise.race([docker.ping(), timeout]);
37
+ }
38
+ finally {
39
+ if (timer)
40
+ clearTimeout(timer);
41
+ }
42
+ }
19
43
  const DEFAULT_SESSION_IDLE_MS = 600_000; // 10 minutes
20
44
  export class SandboxManager {
21
45
  config;
@@ -76,7 +100,7 @@ export class SandboxManager {
76
100
  : new DockerModule.default();
77
101
  }
78
102
  // Check Docker connection
79
- await this.docker.ping();
103
+ await pingDockerWithTimeout(this.docker);
80
104
  logger.info('[Sandbox] Docker connection established', { component: 'Sandbox' });
81
105
  // Log active security level so operators know what enforcement is in place
82
106
  logger.info(`[Sandbox] Security level: ${this.securityConfig.level} (mode override: ${process.env.PROFCLAW_SANDBOX_LEVEL ?? 'none'}, resolved: ${getSecurityLevel()})`, {
@@ -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