profclaw 2.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -15,7 +15,22 @@ 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';
21
36
  import { runWithModelFallback, getUserFriendlyErrorMessage, getProvidersInCooldown, describeFailoverError, } from './failover/index.js';
@@ -142,24 +157,80 @@ export async function executeAgenticChat(request) {
142
157
  conversationId: request.conversationId,
143
158
  goal: goal.substring(0, 100),
144
159
  });
145
- // Resolve the primary model and provider
160
+ // Team budget check (if user is in a team)
161
+ if (request.teamId && request.userId) {
162
+ try {
163
+ const { canMemberSpend, recordMemberUsage } = await import('../teams/index.js');
164
+ const budgetCheck = await canMemberSpend(request.teamId, request.userId, 0.05); // estimated min cost
165
+ if (!budgetCheck.allowed) {
166
+ return {
167
+ content: `Budget exceeded: ${budgetCheck.reason}. Contact your team admin to increase the budget.`,
168
+ model: 'none',
169
+ provider: 'none',
170
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, cost: 0 },
171
+ agentState: { sessionId, totalSteps: 0, stopReason: 'budget_exceeded', artifacts: [] },
172
+ };
173
+ }
174
+ }
175
+ catch {
176
+ // Teams module not initialized - skip budget check
177
+ }
178
+ }
179
+ // Resolve the primary model and provider - fully provider-agnostic
146
180
  const explicitProvider = request.provider;
147
- const modelRef = request.model || 'sonnet';
181
+ const configuredProviders = aiProvider.getConfiguredProviders();
182
+ const availableProviders = new Set(configuredProviders);
183
+ // Smart Model Router: auto-select model based on query complexity
184
+ let modelRef = request.model;
185
+ let smartRouted = false;
186
+ if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
187
+ const routingDecision = routeQuery(goal, availableProviders, {
188
+ conversationLength: request.messages.length,
189
+ hasToolUse: request.tools.length > 0,
190
+ hasCodeContext: request.tools.some(t => t.name.startsWith('git_') || t.name === 'exec'),
191
+ hasImages: false,
192
+ });
193
+ modelRef = routingDecision.selectedModel.id;
194
+ smartRouted = true;
195
+ recordRoutingDecision(routingDecision);
196
+ logger.info('[AgenticChat] Smart-routed to model', {
197
+ tier: routingDecision.complexity.tier,
198
+ model: routingDecision.selectedModel.id,
199
+ provider: routingDecision.selectedModel.provider,
200
+ savings: `${routingDecision.savingsPercent}%`,
201
+ reasoning: routingDecision.complexity.reasoning,
202
+ });
203
+ }
204
+ // Fall back to provider-agnostic default if no model specified
205
+ if (!modelRef) {
206
+ modelRef = aiProvider.getDefaultProvider();
207
+ // Try to get the default model for the default provider
208
+ try {
209
+ const resolved = aiProvider.resolveModel(modelRef);
210
+ modelRef = resolved.model;
211
+ }
212
+ catch {
213
+ modelRef = 'sonnet'; // last resort alias
214
+ }
215
+ }
148
216
  const aliasEntry = MODEL_ALIASES[modelRef];
149
- const primaryProvider = explicitProvider || (aliasEntry?.provider || 'anthropic');
217
+ // Resolve provider from alias, smart route result, or configured default
218
+ const primaryProvider = explicitProvider
219
+ ?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
220
+ ?? aiProvider.getDefaultProvider();
150
221
  // 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')
222
+ let primaryModel = smartRouted ? modelRef : (aliasEntry?.model || modelRef);
223
+ if (!smartRouted) {
224
+ try {
225
+ const resolved = aiProvider.resolveModel(primaryProvider);
226
+ if (resolved.provider === primaryProvider && resolved.model) {
227
+ primaryModel = resolved.model;
228
+ }
229
+ }
230
+ catch {
231
+ // Keep the alias model if provider not configured
156
232
  }
157
233
  }
158
- catch {
159
- // Keep the alias model if provider not configured
160
- }
161
- // Get configured providers
162
- const configuredProviders = aiProvider.getConfiguredProviders();
163
234
  // Log if any providers are in cooldown
164
235
  const cooldowns = getProvidersInCooldown();
165
236
  if (cooldowns.length > 0) {
@@ -171,10 +242,65 @@ export async function executeAgenticChat(request) {
171
242
  })),
172
243
  });
173
244
  }
245
+ // Clone the base system prompt to avoid mutating the request object on retry
246
+ const baseSystemPrompt = request.systemPrompt ?? '';
247
+ let augmentedSystemPrompt = baseSystemPrompt;
248
+ // Recall relevant past experiences to enhance system prompt
249
+ try {
250
+ const store = await getExperienceStore();
251
+ if (store) {
252
+ const similar = await store.findSimilarExperiences(goal, [], 3);
253
+ const hints = similar
254
+ .filter(exp => exp.successScore >= 0.7 && exp.weight > 0.1)
255
+ .slice(0, 2)
256
+ .map(exp => {
257
+ if (exp.type === 'tool_chain') {
258
+ const chain = exp.solution;
259
+ return `Previously solved similar task using: ${chain.tools.map(t => t.name).join(' -> ')} (used ${exp.useCount}x)`;
260
+ }
261
+ return `Past experience: ${exp.intent} (score: ${exp.successScore})`;
262
+ });
263
+ if (hints.length > 0) {
264
+ augmentedSystemPrompt += `\n\nRelevant past experiences:\n${hints.join('\n')}`;
265
+ logger.debug('[AgenticChat] Injected experience context', { count: hints.length });
266
+ for (const exp of similar.slice(0, 2)) {
267
+ store.markUsed(exp.id).catch(() => { });
268
+ }
269
+ }
270
+ }
271
+ }
272
+ catch {
273
+ // Experience recall is best-effort
274
+ }
275
+ // Auto-context gathering for complex queries (code/file-related tasks)
276
+ if (request.tools.length > 0 && goal.length > 30) {
277
+ try {
278
+ const context = await gatherContext(goal, {
279
+ maxSources: 4,
280
+ maxTokens: 2000,
281
+ includeFiles: true,
282
+ includeMemory: false, // memory handled by experience store above
283
+ includeHistory: false,
284
+ });
285
+ if (context.sources.length > 0) {
286
+ const contextBlock = context.sources
287
+ .map(s => `[${s.type}${s.path ? `: ${s.path}` : ''}]\n${s.content.slice(0, 500)}`)
288
+ .join('\n\n');
289
+ augmentedSystemPrompt += `\n\nProject context (auto-gathered):\n${contextBlock}`;
290
+ logger.debug('[AgenticChat] Injected project context', {
291
+ sources: context.sources.length,
292
+ tokens: context.tokens,
293
+ });
294
+ }
295
+ }
296
+ catch {
297
+ // Context gathering is best-effort
298
+ }
299
+ }
174
300
  // Create agent configuration
175
301
  const agentConfig = {
176
- maxSteps: 50, // Allow up to 50 steps for complex tasks
177
- maxBudget: 50000, // 50k token budget
302
+ maxSteps: 20, // Reasonable default
303
+ maxBudget: parseInt(process.env.PROFCLAW_AGENT_MAX_BUDGET || '30000', 10), // configurable via PROFCLAW_AGENT_MAX_BUDGET
178
304
  securityMode: 'ask', // Prompt for approval when needed
179
305
  enableStreaming: true,
180
306
  effort: request.effort,
@@ -183,7 +309,7 @@ export async function executeAgenticChat(request) {
183
309
  const toolDefinitions = request.tools;
184
310
  // Build messages with system prompt
185
311
  const messages = [
186
- { role: 'system', content: request.systemPrompt },
312
+ { role: 'system', content: augmentedSystemPrompt },
187
313
  ...request.messages.map((m) => ({
188
314
  role: m.role,
189
315
  content: m.content,
@@ -223,8 +349,10 @@ export async function executeAgenticChat(request) {
223
349
  request.onToolResult(state, toolCall.name, toolCall.result);
224
350
  });
225
351
  }
226
- // Run the agent with normalized tools (pass provider hint for effort/thinking)
227
- return agent.run(modelInstance, messages, aiSdkTools, onToolExecute, provider);
352
+ // Run the agent with normalized tools (pass provider hint for effort/thinking).
353
+ // Bridge the stream to SSE so connected clients receive real-time events.
354
+ await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
355
+ return agent.getState();
228
356
  },
229
357
  onError: (attempt) => {
230
358
  const described = describeFailoverError(attempt.error);
@@ -290,6 +418,51 @@ export async function executeAgenticChat(request) {
290
418
  model: actualModel,
291
419
  usedFallback,
292
420
  });
421
+ // Record team usage (async, non-blocking)
422
+ if (request.teamId && request.userId) {
423
+ import('../teams/index.js').then(({ recordMemberUsage }) => {
424
+ const estimatedCost = finalState.usedBudget * 0.00001; // rough token-to-cost estimate
425
+ recordMemberUsage(request.teamId, request.userId, estimatedCost).catch(() => { });
426
+ }).catch(() => { });
427
+ }
428
+ // Record successful tool chains to experience store (async, non-blocking)
429
+ if (toolCalls.length > 0) {
430
+ const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
431
+ if (successfulCalls.length > 0) {
432
+ getExperienceStore().then(async (store) => {
433
+ if (!store)
434
+ return;
435
+ try {
436
+ await store.recordExperience({
437
+ type: 'tool_chain',
438
+ intent: goal.slice(0, 200),
439
+ solution: {
440
+ tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
441
+ totalDurationMs: finalState.usedBudget,
442
+ allSucceeded: successfulCalls.length === toolCalls.length,
443
+ },
444
+ successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
445
+ tags: [
446
+ ...new Set(successfulCalls.map(tc => tc.name)),
447
+ actualProvider,
448
+ actualModel,
449
+ ],
450
+ sourceConversationId: request.conversationId,
451
+ });
452
+ }
453
+ catch {
454
+ // Non-critical - don't break execution
455
+ }
456
+ }).catch(() => { });
457
+ }
458
+ }
459
+ // Generate proactive follow-up suggestions
460
+ const suggestions = generateSuggestions(goal, {
461
+ failedTests: toolCalls.filter(tc => tc.name === 'test_run' && tc.status === 'error').length,
462
+ createdFiles: toolCalls.filter(tc => tc.name === 'write_file' && tc.status === 'success')
463
+ .map(tc => String(tc.arguments['path'] ?? '')).filter(Boolean),
464
+ prCreated: toolCalls.some(tc => tc.name === 'github_pr' && tc.status === 'success'),
465
+ });
293
466
  return {
294
467
  content,
295
468
  model: actualModel,
@@ -313,6 +486,7 @@ export async function executeAgenticChat(request) {
313
486
  requestedModel: primaryModel,
314
487
  attempts: fallbackResult.attempts,
315
488
  },
489
+ suggestions: suggestions.length > 0 ? suggestions : undefined,
316
490
  };
317
491
  }
318
492
  catch (error) {
@@ -375,18 +549,40 @@ export async function* streamAgenticChat(request) {
375
549
  goal: goal.substring(0, 100),
376
550
  showThinking,
377
551
  });
378
- // Resolve the primary model and provider
379
- // If provider is explicitly given, use it directly
552
+ // Resolve the primary model and provider - provider-agnostic
380
553
  const explicitProvider = request.provider;
381
- const modelRef = request.model || 'sonnet';
554
+ const configuredProviders = aiProvider.getConfiguredProviders();
555
+ const availableProviders = new Set(configuredProviders);
556
+ // Use smart routing for streaming too
557
+ let modelRef = request.model;
558
+ if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
559
+ const routingDecision = routeQuery(goal, availableProviders, {
560
+ conversationLength: request.messages.length,
561
+ hasToolUse: request.tools.length > 0,
562
+ });
563
+ modelRef = routingDecision.selectedModel.id;
564
+ recordRoutingDecision(routingDecision);
565
+ }
566
+ // Fall back to provider-agnostic default
567
+ if (!modelRef) {
568
+ try {
569
+ const resolved = aiProvider.resolveModel(aiProvider.getDefaultProvider());
570
+ modelRef = resolved.model;
571
+ }
572
+ catch {
573
+ modelRef = 'sonnet';
574
+ }
575
+ }
382
576
  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
577
+ const primaryProvider = explicitProvider
578
+ ?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
579
+ ?? aiProvider.getDefaultProvider();
580
+ // For Azure and similar providers, use the configured deployment name
385
581
  let primaryModel = aliasEntry?.model || modelRef;
386
582
  try {
387
583
  const resolved = aiProvider.resolveModel(primaryProvider);
388
584
  if (resolved.provider === primaryProvider && resolved.model) {
389
- primaryModel = resolved.model; // Use configured deployment (e.g., 'gpt4o')
585
+ primaryModel = resolved.model;
390
586
  }
391
587
  }
392
588
  catch {
@@ -398,8 +594,6 @@ export async function* streamAgenticChat(request) {
398
594
  primaryProvider,
399
595
  primaryModel,
400
596
  });
401
- // Get configured providers
402
- const configuredProviders = aiProvider.getConfiguredProviders();
403
597
  if (configuredProviders.length === 0) {
404
598
  yield {
405
599
  type: 'error',
@@ -438,8 +632,10 @@ export async function* streamAgenticChat(request) {
438
632
  };
439
633
  // Create agent configuration
440
634
  const agentConfig = {
441
- maxSteps: request.maxSteps ?? 50,
442
- maxBudget: request.maxBudget ?? 50000,
635
+ maxSteps: request.maxSteps ?? 20,
636
+ // Azure counts cached prompt tokens in totalUsage (inflates to ~75K for tool schemas)
637
+ // Set budget high enough for multi-step tasks without premature abort
638
+ maxBudget: request.maxBudget ?? 500000,
443
639
  securityMode: 'ask',
444
640
  enableStreaming: true,
445
641
  effort: request.effort,
@@ -608,8 +804,10 @@ export async function* streamAgenticChat(request) {
608
804
  // Convert tool definitions to AI SDK format with execute wrappers
609
805
  const aiSdkTools = convertToolsToAiSdk(toolDefinitions, provider, 'AgenticChat/Stream', onToolExecute);
610
806
  // 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);
807
+ // pass provider hint for effort/thinking options.
808
+ // Bridge the stream to SSE so connected clients receive real-time events.
809
+ await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
810
+ return agent.getState();
613
811
  },
614
812
  onError: (attempt) => {
615
813
  const described = describeFailoverError(attempt.error);
@@ -734,6 +932,31 @@ export async function* streamAgenticChat(request) {
734
932
  usedFallback,
735
933
  attempts: fallbackAttempts.length,
736
934
  });
935
+ // Record tool chain to experience store (async, non-blocking)
936
+ const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
937
+ if (successfulCalls.length > 0) {
938
+ getExperienceStore().then(async (store) => {
939
+ if (!store)
940
+ return;
941
+ try {
942
+ await store.recordExperience({
943
+ type: 'tool_chain',
944
+ intent: goal.slice(0, 200),
945
+ solution: {
946
+ tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
947
+ totalDurationMs: state.usedBudget,
948
+ allSucceeded: successfulCalls.length === toolCalls.length,
949
+ },
950
+ successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
951
+ tags: [...new Set(successfulCalls.map(tc => tc.name)), actualProvider, actualModel],
952
+ sourceConversationId: request.conversationId,
953
+ });
954
+ }
955
+ catch {
956
+ // Non-critical
957
+ }
958
+ }).catch(() => { });
959
+ }
737
960
  }
738
961
  }
739
962
  //# 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
  */