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
@@ -15,9 +15,25 @@ import { randomUUID } from 'node:crypto';
15
15
  import { tool as createTool, jsonSchema } from 'ai';
16
16
  import { zodToJsonSchema } from 'zod-to-json-schema';
17
17
  import { AgentExecutor } from '../agents/index.js';
18
+ import { bridgeStreamToSSE } from '../server/stream-bridge.js';
19
+ import { broadcastEvent } from '../server.js';
18
20
  import { MODEL_ALIASES } from '../providers/core/models.js';
21
+ import { routeQuery, recordRoutingDecision, isSmartRouterEnabled } from '../providers/smart-router.js';
22
+ import { generateSuggestions, gatherContext } from './proactive/index.js';
23
+ // Experience store lazy import to avoid circular deps
24
+ let experienceStorePromise = null;
25
+ function getExperienceStore() {
26
+ if (!experienceStorePromise) {
27
+ experienceStorePromise = import('../memory/experience-store.js').catch(() => {
28
+ experienceStorePromise = null;
29
+ return null;
30
+ });
31
+ }
32
+ return experienceStorePromise;
33
+ }
19
34
  import { normalizeToolSchema } from '../providers/schema-utils.js';
20
35
  import { logger } from '../utils/logger.js';
36
+ import { selectToolsForRequest } from '../agents/tool-selector.js';
21
37
  import { runWithModelFallback, getUserFriendlyErrorMessage, getProvidersInCooldown, describeFailoverError, } from './failover/index.js';
22
38
  const passthroughValidate = (value) => ({
23
39
  success: true,
@@ -142,24 +158,80 @@ export async function executeAgenticChat(request) {
142
158
  conversationId: request.conversationId,
143
159
  goal: goal.substring(0, 100),
144
160
  });
145
- // Resolve the primary model and provider
161
+ // Team budget check (if user is in a team)
162
+ if (request.teamId && request.userId) {
163
+ try {
164
+ const { canMemberSpend, recordMemberUsage } = await import('../teams/index.js');
165
+ const budgetCheck = await canMemberSpend(request.teamId, request.userId, 0.05); // estimated min cost
166
+ if (!budgetCheck.allowed) {
167
+ return {
168
+ content: `Budget exceeded: ${budgetCheck.reason}. Contact your team admin to increase the budget.`,
169
+ model: 'none',
170
+ provider: 'none',
171
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, cost: 0 },
172
+ agentState: { sessionId, totalSteps: 0, stopReason: 'budget_exceeded', artifacts: [] },
173
+ };
174
+ }
175
+ }
176
+ catch {
177
+ // Teams module not initialized - skip budget check
178
+ }
179
+ }
180
+ // Resolve the primary model and provider - fully provider-agnostic
146
181
  const explicitProvider = request.provider;
147
- const modelRef = request.model || 'sonnet';
182
+ const configuredProviders = aiProvider.getConfiguredProviders();
183
+ const availableProviders = new Set(configuredProviders);
184
+ // Smart Model Router: auto-select model based on query complexity
185
+ let modelRef = request.model;
186
+ let smartRouted = false;
187
+ if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
188
+ const routingDecision = routeQuery(goal, availableProviders, {
189
+ conversationLength: request.messages.length,
190
+ hasToolUse: request.tools.length > 0,
191
+ hasCodeContext: request.tools.some(t => t.name.startsWith('git_') || t.name === 'exec'),
192
+ hasImages: false,
193
+ });
194
+ modelRef = routingDecision.selectedModel.id;
195
+ smartRouted = true;
196
+ recordRoutingDecision(routingDecision);
197
+ logger.info('[AgenticChat] Smart-routed to model', {
198
+ tier: routingDecision.complexity.tier,
199
+ model: routingDecision.selectedModel.id,
200
+ provider: routingDecision.selectedModel.provider,
201
+ savings: `${routingDecision.savingsPercent}%`,
202
+ reasoning: routingDecision.complexity.reasoning,
203
+ });
204
+ }
205
+ // Fall back to provider-agnostic default if no model specified
206
+ if (!modelRef) {
207
+ modelRef = aiProvider.getDefaultProvider();
208
+ // Try to get the default model for the default provider
209
+ try {
210
+ const resolved = aiProvider.resolveModel(modelRef);
211
+ modelRef = resolved.model;
212
+ }
213
+ catch {
214
+ modelRef = 'sonnet'; // last resort alias
215
+ }
216
+ }
148
217
  const aliasEntry = MODEL_ALIASES[modelRef];
149
- const primaryProvider = explicitProvider || (aliasEntry?.provider || 'anthropic');
218
+ // Resolve provider from alias, smart route result, or configured default
219
+ const primaryProvider = explicitProvider
220
+ ?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
221
+ ?? aiProvider.getDefaultProvider();
150
222
  // For Azure and similar providers, use the configured deployment name, not hardcoded alias
151
- let primaryModel = aliasEntry?.model || modelRef;
152
- try {
153
- const resolved = aiProvider.resolveModel(primaryProvider);
154
- if (resolved.provider === primaryProvider && resolved.model) {
155
- primaryModel = resolved.model; // Use configured deployment (e.g., 'gpt4o')
223
+ let primaryModel = smartRouted ? modelRef : (aliasEntry?.model || modelRef);
224
+ if (!smartRouted) {
225
+ try {
226
+ const resolved = aiProvider.resolveModel(primaryProvider);
227
+ if (resolved.provider === primaryProvider && resolved.model) {
228
+ primaryModel = resolved.model;
229
+ }
230
+ }
231
+ catch {
232
+ // Keep the alias model if provider not configured
156
233
  }
157
234
  }
158
- catch {
159
- // Keep the alias model if provider not configured
160
- }
161
- // Get configured providers
162
- const configuredProviders = aiProvider.getConfiguredProviders();
163
235
  // Log if any providers are in cooldown
164
236
  const cooldowns = getProvidersInCooldown();
165
237
  if (cooldowns.length > 0) {
@@ -171,19 +243,79 @@ export async function executeAgenticChat(request) {
171
243
  })),
172
244
  });
173
245
  }
246
+ // Clone the base system prompt to avoid mutating the request object on retry
247
+ const baseSystemPrompt = request.systemPrompt ?? '';
248
+ // Volatile per-request context is kept out of the base prompt so the base stays byte-stable
249
+ // for prompt caching (a second system message follows the stable one)
250
+ let volatileContext = '';
251
+ // Recall relevant past experiences to enhance system prompt
252
+ try {
253
+ const store = await getExperienceStore();
254
+ if (store) {
255
+ const similar = await store.findSimilarExperiences(goal, [], 3);
256
+ const hints = similar
257
+ .filter(exp => exp.successScore >= 0.7 && exp.weight > 0.1)
258
+ .slice(0, 2)
259
+ .map(exp => {
260
+ if (exp.type === 'tool_chain') {
261
+ const chain = exp.solution;
262
+ return `Previously solved similar task using: ${chain.tools.map(t => t.name).join(' -> ')} (used ${exp.useCount}x)`;
263
+ }
264
+ return `Past experience: ${exp.intent} (score: ${exp.successScore})`;
265
+ });
266
+ if (hints.length > 0) {
267
+ volatileContext += `\n\nRelevant past experiences:\n${hints.join('\n')}`;
268
+ logger.debug('[AgenticChat] Injected experience context', { count: hints.length });
269
+ for (const exp of similar.slice(0, 2)) {
270
+ store.markUsed(exp.id).catch(() => { });
271
+ }
272
+ }
273
+ }
274
+ }
275
+ catch {
276
+ // Experience recall is best-effort
277
+ }
278
+ // Auto-context gathering for complex queries (code/file-related tasks)
279
+ if (request.tools.length > 0 && goal.length > 30) {
280
+ try {
281
+ const context = await gatherContext(goal, {
282
+ maxSources: 4,
283
+ maxTokens: 2000,
284
+ includeFiles: true,
285
+ includeMemory: false, // memory handled by experience store above
286
+ includeHistory: false,
287
+ });
288
+ if (context.sources.length > 0) {
289
+ const contextBlock = context.sources
290
+ .map(s => `[${s.type}${s.path ? `: ${s.path}` : ''}]\n${s.content.slice(0, 500)}`)
291
+ .join('\n\n');
292
+ volatileContext += `\n\nProject context (auto-gathered):\n${contextBlock}`;
293
+ logger.debug('[AgenticChat] Injected project context', {
294
+ sources: context.sources.length,
295
+ tokens: context.tokens,
296
+ });
297
+ }
298
+ }
299
+ catch {
300
+ // Context gathering is best-effort
301
+ }
302
+ }
174
303
  // Create agent configuration
175
304
  const agentConfig = {
176
- maxSteps: 50, // Allow up to 50 steps for complex tasks
177
- maxBudget: 50000, // 50k token budget
305
+ maxSteps: 20, // Reasonable default
306
+ maxBudget: parseInt(process.env.PROFCLAW_AGENT_MAX_BUDGET || '30000', 10), // configurable via PROFCLAW_AGENT_MAX_BUDGET
178
307
  securityMode: 'ask', // Prompt for approval when needed
179
308
  enableStreaming: true,
180
309
  effort: request.effort,
181
310
  };
182
311
  // Store raw tool definitions - we'll convert to AI SDK format per-provider
183
- const toolDefinitions = request.tools;
312
+ // Per-turn tool selection (core set + relevant groups + load_tools meta-tool)
313
+ const turnUserMessage = [...request.messages].reverse().find((m) => m.role === 'user');
314
+ const toolDefinitions = selectToolsForRequest(request.tools, request.conversationId, typeof turnUserMessage?.content === 'string' ? turnUserMessage.content : '');
184
315
  // Build messages with system prompt
185
316
  const messages = [
186
- { role: 'system', content: request.systemPrompt },
317
+ { role: 'system', content: baseSystemPrompt },
318
+ ...(volatileContext ? [{ role: 'system', content: volatileContext.trim() }] : []),
187
319
  ...request.messages.map((m) => ({
188
320
  role: m.role,
189
321
  content: m.content,
@@ -223,8 +355,10 @@ export async function executeAgenticChat(request) {
223
355
  request.onToolResult(state, toolCall.name, toolCall.result);
224
356
  });
225
357
  }
226
- // Run the agent with normalized tools (pass provider hint for effort/thinking)
227
- return agent.run(modelInstance, messages, aiSdkTools, onToolExecute, provider);
358
+ // Run the agent with normalized tools (pass provider hint for effort/thinking).
359
+ // Bridge the stream to SSE so connected clients receive real-time events.
360
+ await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
361
+ return agent.getState();
228
362
  },
229
363
  onError: (attempt) => {
230
364
  const described = describeFailoverError(attempt.error);
@@ -290,6 +424,51 @@ export async function executeAgenticChat(request) {
290
424
  model: actualModel,
291
425
  usedFallback,
292
426
  });
427
+ // Record team usage (async, non-blocking)
428
+ if (request.teamId && request.userId) {
429
+ import('../teams/index.js').then(({ recordMemberUsage }) => {
430
+ const estimatedCost = finalState.usedBudget * 0.00001; // rough token-to-cost estimate
431
+ recordMemberUsage(request.teamId, request.userId, estimatedCost).catch(() => { });
432
+ }).catch(() => { });
433
+ }
434
+ // Record successful tool chains to experience store (async, non-blocking)
435
+ if (toolCalls.length > 0) {
436
+ const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
437
+ if (successfulCalls.length > 0) {
438
+ getExperienceStore().then(async (store) => {
439
+ if (!store)
440
+ return;
441
+ try {
442
+ await store.recordExperience({
443
+ type: 'tool_chain',
444
+ intent: goal.slice(0, 200),
445
+ solution: {
446
+ tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
447
+ totalDurationMs: finalState.usedBudget,
448
+ allSucceeded: successfulCalls.length === toolCalls.length,
449
+ },
450
+ successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
451
+ tags: [
452
+ ...new Set(successfulCalls.map(tc => tc.name)),
453
+ actualProvider,
454
+ actualModel,
455
+ ],
456
+ sourceConversationId: request.conversationId,
457
+ });
458
+ }
459
+ catch {
460
+ // Non-critical - don't break execution
461
+ }
462
+ }).catch(() => { });
463
+ }
464
+ }
465
+ // Generate proactive follow-up suggestions
466
+ const suggestions = generateSuggestions(goal, {
467
+ failedTests: toolCalls.filter(tc => tc.name === 'test_run' && tc.status === 'error').length,
468
+ createdFiles: toolCalls.filter(tc => tc.name === 'write_file' && tc.status === 'success')
469
+ .map(tc => String(tc.arguments['path'] ?? '')).filter(Boolean),
470
+ prCreated: toolCalls.some(tc => tc.name === 'github_pr' && tc.status === 'success'),
471
+ });
293
472
  return {
294
473
  content,
295
474
  model: actualModel,
@@ -313,6 +492,7 @@ export async function executeAgenticChat(request) {
313
492
  requestedModel: primaryModel,
314
493
  attempts: fallbackResult.attempts,
315
494
  },
495
+ suggestions: suggestions.length > 0 ? suggestions : undefined,
316
496
  };
317
497
  }
318
498
  catch (error) {
@@ -375,18 +555,40 @@ export async function* streamAgenticChat(request) {
375
555
  goal: goal.substring(0, 100),
376
556
  showThinking,
377
557
  });
378
- // Resolve the primary model and provider
379
- // If provider is explicitly given, use it directly
558
+ // Resolve the primary model and provider - provider-agnostic
380
559
  const explicitProvider = request.provider;
381
- const modelRef = request.model || 'sonnet';
560
+ const configuredProviders = aiProvider.getConfiguredProviders();
561
+ const availableProviders = new Set(configuredProviders);
562
+ // Use smart routing for streaming too
563
+ let modelRef = request.model;
564
+ if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
565
+ const routingDecision = routeQuery(goal, availableProviders, {
566
+ conversationLength: request.messages.length,
567
+ hasToolUse: request.tools.length > 0,
568
+ });
569
+ modelRef = routingDecision.selectedModel.id;
570
+ recordRoutingDecision(routingDecision);
571
+ }
572
+ // Fall back to provider-agnostic default
573
+ if (!modelRef) {
574
+ try {
575
+ const resolved = aiProvider.resolveModel(aiProvider.getDefaultProvider());
576
+ modelRef = resolved.model;
577
+ }
578
+ catch {
579
+ modelRef = 'sonnet';
580
+ }
581
+ }
382
582
  const aliasEntry = MODEL_ALIASES[modelRef];
383
- const primaryProvider = explicitProvider || (aliasEntry?.provider || 'anthropic');
384
- // For Azure and similar providers, use the configured deployment name, not hardcoded alias
583
+ const primaryProvider = explicitProvider
584
+ ?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
585
+ ?? aiProvider.getDefaultProvider();
586
+ // For Azure and similar providers, use the configured deployment name
385
587
  let primaryModel = aliasEntry?.model || modelRef;
386
588
  try {
387
589
  const resolved = aiProvider.resolveModel(primaryProvider);
388
590
  if (resolved.provider === primaryProvider && resolved.model) {
389
- primaryModel = resolved.model; // Use configured deployment (e.g., 'gpt4o')
591
+ primaryModel = resolved.model;
390
592
  }
391
593
  }
392
594
  catch {
@@ -398,8 +600,6 @@ export async function* streamAgenticChat(request) {
398
600
  primaryProvider,
399
601
  primaryModel,
400
602
  });
401
- // Get configured providers
402
- const configuredProviders = aiProvider.getConfiguredProviders();
403
603
  if (configuredProviders.length === 0) {
404
604
  yield {
405
605
  type: 'error',
@@ -438,14 +638,18 @@ export async function* streamAgenticChat(request) {
438
638
  };
439
639
  // Create agent configuration
440
640
  const agentConfig = {
441
- maxSteps: request.maxSteps ?? 50,
442
- maxBudget: request.maxBudget ?? 50000,
641
+ maxSteps: request.maxSteps ?? 20,
642
+ // Azure counts cached prompt tokens in totalUsage (inflates to ~75K for tool schemas)
643
+ // Set budget high enough for multi-step tasks without premature abort
644
+ maxBudget: request.maxBudget ?? 500000,
443
645
  securityMode: 'ask',
444
646
  enableStreaming: true,
445
647
  effort: request.effort,
446
648
  };
447
649
  // Store raw tool definitions - we'll convert to AI SDK format per-provider
448
- const toolDefinitions = request.tools;
650
+ // Per-turn tool selection, same as the non-streaming path
651
+ const turnUserMessage = [...request.messages].reverse().find((m) => m.role === 'user');
652
+ const toolDefinitions = selectToolsForRequest(request.tools, request.conversationId, typeof turnUserMessage?.content === 'string' ? turnUserMessage.content : '');
449
653
  // Build messages with system prompt
450
654
  const messages = [
451
655
  { role: 'system', content: request.systemPrompt },
@@ -608,8 +812,10 @@ export async function* streamAgenticChat(request) {
608
812
  // Convert tool definitions to AI SDK format with execute wrappers
609
813
  const aiSdkTools = convertToolsToAiSdk(toolDefinitions, provider, 'AgenticChat/Stream', onToolExecute);
610
814
  // Run the agent — tools already have execute functions,
611
- // pass provider hint for effort/thinking options
612
- return agent.run(modelInstance, messages, aiSdkTools, onToolExecute, provider);
815
+ // pass provider hint for effort/thinking options.
816
+ // Bridge the stream to SSE so connected clients receive real-time events.
817
+ await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
818
+ return agent.getState();
613
819
  },
614
820
  onError: (attempt) => {
615
821
  const described = describeFailoverError(attempt.error);
@@ -734,6 +940,31 @@ export async function* streamAgenticChat(request) {
734
940
  usedFallback,
735
941
  attempts: fallbackAttempts.length,
736
942
  });
943
+ // Record tool chain to experience store (async, non-blocking)
944
+ const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
945
+ if (successfulCalls.length > 0) {
946
+ getExperienceStore().then(async (store) => {
947
+ if (!store)
948
+ return;
949
+ try {
950
+ await store.recordExperience({
951
+ type: 'tool_chain',
952
+ intent: goal.slice(0, 200),
953
+ solution: {
954
+ tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
955
+ totalDurationMs: state.usedBudget,
956
+ allSucceeded: successfulCalls.length === toolCalls.length,
957
+ },
958
+ successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
959
+ tags: [...new Set(successfulCalls.map(tc => tc.name)), actualProvider, actualModel],
960
+ sourceConversationId: request.conversationId,
961
+ });
962
+ }
963
+ catch {
964
+ // Non-critical
965
+ }
966
+ }).catch(() => { });
967
+ }
737
968
  }
738
969
  }
739
970
  //# sourceMappingURL=agentic-executor.js.map
@@ -76,6 +76,7 @@ export declare function getRecentConversationsWithPreview(limit?: number): Promi
76
76
  preview: string;
77
77
  messageCount: number;
78
78
  }>>;
79
+ export declare function deleteMessage(conversationId: string, messageId: string): Promise<void>;
79
80
  declare const _default: {
80
81
  initConversationTables: typeof initConversationTables;
81
82
  createConversation: typeof createConversation;
@@ -86,6 +87,7 @@ declare const _default: {
86
87
  addMessage: typeof addMessage;
87
88
  getConversationMessages: typeof getConversationMessages;
88
89
  getRecentConversationsWithPreview: typeof getRecentConversationsWithPreview;
90
+ deleteMessage: typeof deleteMessage;
89
91
  };
90
92
  export default _default;
91
93
  //# sourceMappingURL=conversations.d.ts.map
@@ -283,6 +283,13 @@ export async function getRecentConversationsWithPreview(limit = 10) {
283
283
  messageCount: Number(row.message_count),
284
284
  }));
285
285
  }
286
+ export async function deleteMessage(conversationId, messageId) {
287
+ const client = getClient();
288
+ await client.execute({
289
+ sql: `DELETE FROM conversation_messages WHERE id = ? AND conversation_id = ?`,
290
+ args: [messageId, conversationId],
291
+ });
292
+ }
286
293
  export default {
287
294
  initConversationTables,
288
295
  createConversation,
@@ -293,5 +300,6 @@ export default {
293
300
  addMessage,
294
301
  getConversationMessages,
295
302
  getRecentConversationsWithPreview,
303
+ deleteMessage,
296
304
  };
297
305
  //# sourceMappingURL=conversations.js.map
@@ -8,6 +8,14 @@
8
8
  import type { ToolExecutionContext, AIToolCall, ToolCallResult, ApprovalRequest, ApprovalDecision } from "./types.js";
9
9
  export declare class ToolExecutor {
10
10
  private abortControllers;
11
+ /**
12
+ * One CorrectionTracker per conversation, reset when a conversation ends.
13
+ * Key: conversationId
14
+ */
15
+ private correctionTrackers;
16
+ private getOrCreateTracker;
17
+ /** Call this when a conversation is done to free the tracker. */
18
+ resetCorrectionBudget(conversationId: string): void;
11
19
  /**
12
20
  * Execute a single tool call
13
21
  */