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
@@ -238,7 +238,7 @@ export declare const ChatMessageSchema: z.ZodObject<{
238
238
  id: string;
239
239
  timestamp: string;
240
240
  content: string;
241
- role: "user" | "system" | "assistant" | "tool";
241
+ role: "user" | "system" | "tool" | "assistant";
242
242
  name?: string | undefined;
243
243
  tokensUsed?: number | undefined;
244
244
  toolCallId?: string | undefined;
@@ -247,7 +247,7 @@ export declare const ChatMessageSchema: z.ZodObject<{
247
247
  id: string;
248
248
  timestamp: string;
249
249
  content: string;
250
- role: "user" | "system" | "assistant" | "tool";
250
+ role: "user" | "system" | "tool" | "assistant";
251
251
  name?: string | undefined;
252
252
  tokensUsed?: number | undefined;
253
253
  toolCallId?: string | undefined;
@@ -270,7 +270,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
270
270
  id: string;
271
271
  timestamp: string;
272
272
  content: string;
273
- role: "user" | "system" | "assistant" | "tool";
273
+ role: "user" | "system" | "tool" | "assistant";
274
274
  name?: string | undefined;
275
275
  tokensUsed?: number | undefined;
276
276
  toolCallId?: string | undefined;
@@ -279,7 +279,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
279
279
  id: string;
280
280
  timestamp: string;
281
281
  content: string;
282
- role: "user" | "system" | "assistant" | "tool";
282
+ role: "user" | "system" | "tool" | "assistant";
283
283
  name?: string | undefined;
284
284
  tokensUsed?: number | undefined;
285
285
  toolCallId?: string | undefined;
@@ -311,7 +311,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
311
311
  id: string;
312
312
  timestamp: string;
313
313
  content: string;
314
- role: "user" | "system" | "assistant" | "tool";
314
+ role: "user" | "system" | "tool" | "assistant";
315
315
  name?: string | undefined;
316
316
  tokensUsed?: number | undefined;
317
317
  toolCallId?: string | undefined;
@@ -328,14 +328,14 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
328
328
  description: string;
329
329
  parameters: Record<string, unknown>;
330
330
  }[] | undefined;
331
- systemPrompt?: string | undefined;
332
331
  maxTokens?: number | undefined;
332
+ systemPrompt?: string | undefined;
333
333
  }, {
334
334
  messages: {
335
335
  id: string;
336
336
  timestamp: string;
337
337
  content: string;
338
- role: "user" | "system" | "assistant" | "tool";
338
+ role: "user" | "system" | "tool" | "assistant";
339
339
  name?: string | undefined;
340
340
  tokensUsed?: number | undefined;
341
341
  toolCallId?: string | undefined;
@@ -352,9 +352,9 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
352
352
  description: string;
353
353
  parameters: Record<string, unknown>;
354
354
  }[] | undefined;
355
+ maxTokens?: number | undefined;
355
356
  systemPrompt?: string | undefined;
356
357
  temperature?: number | undefined;
357
- maxTokens?: number | undefined;
358
358
  }>;
359
359
  export type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;
360
360
  export declare const ChatCompletionResponseSchema: z.ZodObject<{
@@ -374,7 +374,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
374
374
  id: string;
375
375
  timestamp: string;
376
376
  content: string;
377
- role: "user" | "system" | "assistant" | "tool";
377
+ role: "user" | "system" | "tool" | "assistant";
378
378
  name?: string | undefined;
379
379
  tokensUsed?: number | undefined;
380
380
  toolCallId?: string | undefined;
@@ -383,7 +383,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
383
383
  id: string;
384
384
  timestamp: string;
385
385
  content: string;
386
- role: "user" | "system" | "assistant" | "tool";
386
+ role: "user" | "system" | "tool" | "assistant";
387
387
  name?: string | undefined;
388
388
  tokensUsed?: number | undefined;
389
389
  toolCallId?: string | undefined;
@@ -425,7 +425,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
425
425
  id: string;
426
426
  timestamp: string;
427
427
  content: string;
428
- role: "user" | "system" | "assistant" | "tool";
428
+ role: "user" | "system" | "tool" | "assistant";
429
429
  name?: string | undefined;
430
430
  tokensUsed?: number | undefined;
431
431
  toolCallId?: string | undefined;
@@ -452,7 +452,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
452
452
  id: string;
453
453
  timestamp: string;
454
454
  content: string;
455
- role: "user" | "system" | "assistant" | "tool";
455
+ role: "user" | "system" | "tool" | "assistant";
456
456
  name?: string | undefined;
457
457
  tokensUsed?: number | undefined;
458
458
  toolCallId?: string | undefined;
@@ -494,7 +494,7 @@ export declare const ConversationSchema: z.ZodObject<{
494
494
  id: string;
495
495
  timestamp: string;
496
496
  content: string;
497
- role: "user" | "system" | "assistant" | "tool";
497
+ role: "user" | "system" | "tool" | "assistant";
498
498
  name?: string | undefined;
499
499
  tokensUsed?: number | undefined;
500
500
  toolCallId?: string | undefined;
@@ -503,7 +503,7 @@ export declare const ConversationSchema: z.ZodObject<{
503
503
  id: string;
504
504
  timestamp: string;
505
505
  content: string;
506
- role: "user" | "system" | "assistant" | "tool";
506
+ role: "user" | "system" | "tool" | "assistant";
507
507
  name?: string | undefined;
508
508
  tokensUsed?: number | undefined;
509
509
  toolCallId?: string | undefined;
@@ -530,7 +530,7 @@ export declare const ConversationSchema: z.ZodObject<{
530
530
  id: string;
531
531
  timestamp: string;
532
532
  content: string;
533
- role: "user" | "system" | "assistant" | "tool";
533
+ role: "user" | "system" | "tool" | "assistant";
534
534
  name?: string | undefined;
535
535
  tokensUsed?: number | undefined;
536
536
  toolCallId?: string | undefined;
@@ -552,7 +552,7 @@ export declare const ConversationSchema: z.ZodObject<{
552
552
  id: string;
553
553
  timestamp: string;
554
554
  content: string;
555
- role: "user" | "system" | "assistant" | "tool";
555
+ role: "user" | "system" | "tool" | "assistant";
556
556
  name?: string | undefined;
557
557
  tokensUsed?: number | undefined;
558
558
  toolCallId?: string | undefined;
@@ -43,5 +43,55 @@ agents.get('/types', (c) => {
43
43
  types: registry.getAdapterTypes(),
44
44
  });
45
45
  });
46
+ // --- Multi-Agent Orchestration ---
47
+ import { z } from 'zod';
48
+ import { orchestrate, cancelOrchestration, listActiveOrchestrations } from '../agents/orchestrator.js';
49
+ const subAgentSchema = z.object({
50
+ id: z.string().optional(),
51
+ name: z.string(),
52
+ prompt: z.string(),
53
+ systemPrompt: z.string().optional(),
54
+ model: z.string().optional(),
55
+ maxTokens: z.number().optional(),
56
+ timeoutMs: z.number().optional(),
57
+ allowedTools: z.array(z.string()).optional(),
58
+ effort: z.enum(['low', 'medium', 'high']).optional(),
59
+ });
60
+ const orchestrateSchema = z.object({
61
+ name: z.string().min(1).max(200),
62
+ pattern: z.enum(['fan_out', 'pipeline', 'debate', 'custom']),
63
+ agents: z.array(subAgentSchema).min(1).max(10),
64
+ synthesizerPrompt: z.string().optional(),
65
+ judgePrompt: z.string().optional(),
66
+ timeoutMs: z.number().optional(),
67
+ failFast: z.boolean().optional(),
68
+ });
69
+ /** Execute a multi-agent orchestration */
70
+ agents.post('/orchestrate', async (c) => {
71
+ const body = await c.req.json();
72
+ const parsed = orchestrateSchema.safeParse(body);
73
+ if (!parsed.success) {
74
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message } }, 400);
75
+ }
76
+ const config = {
77
+ id: crypto.randomUUID(),
78
+ ...parsed.data,
79
+ agents: parsed.data.agents.map((a, i) => ({
80
+ ...a,
81
+ id: a.id || `agent-${i}`,
82
+ })),
83
+ };
84
+ const result = await orchestrate(config);
85
+ return c.json({ success: result.success, data: result });
86
+ });
87
+ /** Cancel a running orchestration */
88
+ agents.post('/orchestrate/:id/cancel', (c) => {
89
+ const cancelled = cancelOrchestration(c.req.param('id'));
90
+ return c.json({ success: cancelled });
91
+ });
92
+ /** List active orchestrations */
93
+ agents.get('/orchestrate/active', (c) => {
94
+ return c.json({ success: true, data: listActiveOrchestrations() });
95
+ });
46
96
  export { agents as agentsRoutes };
47
97
  //# sourceMappingURL=agents.js.map
@@ -99,8 +99,15 @@ authRoutes.post('/signup', signupLimiter, async (c) => {
99
99
  // Check registration mode
100
100
  const settings = await getSettingsRaw();
101
101
  const mode = settings.system.registrationMode;
102
+ // Allow first user signup without invite code (bootstrap admin)
103
+ const db = getDb();
104
+ let isFirstUser = false;
105
+ if (db) {
106
+ const existingUsers = await db.select({ id: users.id }).from(users).limit(1);
107
+ isFirstUser = existingUsers.length === 0;
108
+ }
102
109
  let inviteRecord;
103
- if (mode === 'invite') {
110
+ if (mode === 'invite' && !isFirstUser) {
104
111
  if (!inviteCode) {
105
112
  return c.json({ error: 'Registration requires an invite code' }, 403);
106
113
  }
@@ -9,8 +9,18 @@ import { streamText } from "hono/streaming";
9
9
  import { zValidator } from "@hono/zod-validator";
10
10
  import { z } from "zod";
11
11
  import { randomUUID } from "node:crypto";
12
+ import { routeQuery, recordRoutingDecision, isSmartRouterEnabled, getCostComparison, } from "../providers/smart-router.js";
12
13
  import { logger } from "../utils/logger.js";
14
+ import { rateLimit } from "../middleware/rate-limit.js";
15
+ import { contentFilter } from "../middleware/content-filter.js";
13
16
  const chatRoutes = new Hono();
17
+ // Per-IP sliding-window rate limiter for chat send endpoints
18
+ const chatMaxRequests = parseInt(process.env['CHAT_RATE_LIMIT'] ?? '20', 10);
19
+ const chatRateLimiter = rateLimit({
20
+ maxRequests: chatMaxRequests,
21
+ windowMs: 60_000,
22
+ message: `Chat rate limit exceeded. Maximum ${chatMaxRequests} messages per minute.`,
23
+ });
14
24
  let chatRuntimePromise = null;
15
25
  let ProviderTypeSchema;
16
26
  let aiProvider;
@@ -26,6 +36,7 @@ let listConversations;
26
36
  let deleteConversation;
27
37
  let addMessage;
28
38
  let getConversationMessages;
39
+ let deleteMessage;
29
40
  let getRecentConversationsWithPreview;
30
41
  let compactMessages;
31
42
  let getMemoryStats;
@@ -42,6 +53,17 @@ let getSessionModel;
42
53
  let streamAgenticChat;
43
54
  let getGroupChatManager;
44
55
  let trackChatUsage;
56
+ /** Best-effort removal of spilled tool-result temp files at request end. */
57
+ async function disposeToolHandler(handler) {
58
+ try {
59
+ await handler.dispose?.();
60
+ }
61
+ catch (error) {
62
+ logger.warn("[Chat] Tool handler dispose failed", {
63
+ error: error instanceof Error ? error.message : String(error),
64
+ });
65
+ }
66
+ }
45
67
  async function ensureChatRuntime() {
46
68
  if (!chatRuntimePromise) {
47
69
  chatRuntimePromise = Promise.all([
@@ -65,6 +87,7 @@ async function ensureChatRuntime() {
65
87
  deleteConversation = chatModule.deleteConversation;
66
88
  addMessage = chatModule.addMessage;
67
89
  getConversationMessages = chatModule.getConversationMessages;
90
+ deleteMessage = chatModule.deleteMessage;
68
91
  getRecentConversationsWithPreview =
69
92
  chatModule.getRecentConversationsWithPreview;
70
93
  compactMessages = chatModule.compactMessages;
@@ -168,6 +191,87 @@ chatRoutes.get("/model-capability", async (c) => {
168
191
  const resolved = MODEL_ALIASES[model.toLowerCase()]?.model ?? model;
169
192
  return c.json(getModelRouting(resolved));
170
193
  });
194
+ /**
195
+ * POST /api/chat/send
196
+ * Simple one-shot chat - send a message and get a response
197
+ */
198
+ chatRoutes.post("/send", chatRateLimiter, contentFilter(), zValidator("json", z.object({
199
+ message: z.string(),
200
+ model: z.string().optional(),
201
+ systemPrompt: z.string().optional(),
202
+ temperature: z.number().min(0).max(2).optional(),
203
+ maxTokens: z.number().positive().optional(),
204
+ })), async (c) => {
205
+ const body = c.req.valid("json");
206
+ try {
207
+ const messages = [
208
+ {
209
+ id: randomUUID(),
210
+ role: "user",
211
+ content: body.message,
212
+ timestamp: new Date().toISOString(),
213
+ },
214
+ ];
215
+ // Smart routing: auto-select model if none specified
216
+ let routing;
217
+ let modelToUse = body.model;
218
+ if (!body.model && isSmartRouterEnabled()) {
219
+ const providers = new Set(aiProvider.getConfiguredProviders());
220
+ routing = routeQuery(body.message, providers);
221
+ modelToUse = routing.selectedModel.id;
222
+ recordRoutingDecision(routing);
223
+ }
224
+ const response = await aiProvider.chat({
225
+ messages,
226
+ model: modelToUse,
227
+ systemPrompt: body.systemPrompt,
228
+ temperature: body.temperature,
229
+ maxTokens: body.maxTokens,
230
+ });
231
+ // Track token usage for cost dashboard
232
+ if (response.usage?.totalTokens && response.model) {
233
+ await ensureChatRuntime();
234
+ trackChatUsage(response.model, response.usage.totalTokens, response.usage.promptTokens, response.usage.completionTokens, {
235
+ cacheReadTokens: response.usage.cacheReadTokens,
236
+ cacheWriteTokens: response.usage.cacheWriteTokens,
237
+ });
238
+ }
239
+ return c.json({
240
+ id: response.id,
241
+ provider: response.provider,
242
+ model: response.model,
243
+ reply: response.content,
244
+ finishReason: response.finishReason,
245
+ usage: response.usage,
246
+ duration: response.duration,
247
+ ...(routing && {
248
+ routing: {
249
+ smartRouted: true,
250
+ complexity: routing.complexity.tier,
251
+ confidence: Math.round(routing.complexity.confidence * 100),
252
+ reasoning: routing.complexity.reasoning,
253
+ savings: `${routing.savingsPercent}%`,
254
+ estimatedCost: `$${routing.estimatedCost.toFixed(4)}`,
255
+ summary: getCostComparison(routing),
256
+ ...(routing.missingProviderHint && {
257
+ tip: {
258
+ addProvider: routing.missingProviderHint.provider,
259
+ reason: routing.missingProviderHint.reason,
260
+ savings: routing.missingProviderHint.estimatedSavings,
261
+ signupUrl: routing.missingProviderHint.signupUrl,
262
+ },
263
+ }),
264
+ },
265
+ }),
266
+ });
267
+ }
268
+ catch (error) {
269
+ logger.error("[Chat] Send error:", error instanceof Error ? error : undefined);
270
+ return c.json({
271
+ error: error instanceof Error ? error.message : "Chat send failed",
272
+ }, 500);
273
+ }
274
+ });
171
275
  /**
172
276
  * POST /api/chat/completions
173
277
  * Generate a chat completion
@@ -183,11 +287,37 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
183
287
  }));
184
288
  // Handle streaming
185
289
  if (body.stream) {
290
+ // Smart route for streaming too
291
+ let streamRouting;
292
+ let streamModel = body.model;
293
+ if (!body.model && isSmartRouterEnabled()) {
294
+ const lastUserMsg = [...body.messages].reverse().find((m) => m.role === "user");
295
+ if (lastUserMsg) {
296
+ const providers = new Set(aiProvider.getConfiguredProviders());
297
+ streamRouting = routeQuery(lastUserMsg.content, providers, {
298
+ conversationLength: body.messages.length,
299
+ });
300
+ streamModel = streamRouting.selectedModel.id;
301
+ recordRoutingDecision(streamRouting);
302
+ }
303
+ }
186
304
  return streamText(c, async (stream) => {
187
305
  try {
306
+ // Send routing info as first event in stream
307
+ if (streamRouting) {
308
+ await stream.write(`data: ${JSON.stringify({
309
+ routing: {
310
+ smartRouted: true,
311
+ complexity: streamRouting.complexity.tier,
312
+ savings: `${streamRouting.savingsPercent}%`,
313
+ model: streamRouting.selectedModel.id,
314
+ provider: streamRouting.selectedModel.provider,
315
+ },
316
+ })}\n\n`);
317
+ }
188
318
  const response = await aiProvider.chatStream({
189
319
  messages,
190
- model: body.model,
320
+ model: streamModel,
191
321
  systemPrompt: body.systemPrompt,
192
322
  temperature: body.temperature,
193
323
  maxTokens: body.maxTokens,
@@ -216,9 +346,23 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
216
346
  }
217
347
  // Non-streaming
218
348
  try {
349
+ // Smart routing for completions
350
+ let routing;
351
+ let modelToUse = body.model;
352
+ if (!body.model && isSmartRouterEnabled()) {
353
+ const lastUserMsg = [...body.messages].reverse().find((m) => m.role === "user");
354
+ if (lastUserMsg) {
355
+ const providers = new Set(aiProvider.getConfiguredProviders());
356
+ routing = routeQuery(lastUserMsg.content, providers, {
357
+ conversationLength: body.messages.length,
358
+ });
359
+ modelToUse = routing.selectedModel.id;
360
+ recordRoutingDecision(routing);
361
+ }
362
+ }
219
363
  const response = await aiProvider.chat({
220
364
  messages,
221
- model: body.model,
365
+ model: modelToUse,
222
366
  systemPrompt: body.systemPrompt,
223
367
  temperature: body.temperature,
224
368
  maxTokens: body.maxTokens,
@@ -234,6 +378,15 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
234
378
  finishReason: response.finishReason,
235
379
  usage: response.usage,
236
380
  duration: response.duration,
381
+ ...(routing && {
382
+ routing: {
383
+ smartRouted: true,
384
+ complexity: routing.complexity.tier,
385
+ savings: `${routing.savingsPercent}%`,
386
+ estimatedCost: `$${routing.estimatedCost.toFixed(4)}`,
387
+ summary: getCostComparison(routing),
388
+ },
389
+ }),
237
390
  });
238
391
  }
239
392
  catch (error) {
@@ -751,14 +904,62 @@ chatRoutes.post("/conversations/:id/compact", async (c) => {
751
904
  return c.json({ error: "Failed to compact conversation" }, 500);
752
905
  }
753
906
  });
907
+ /**
908
+ * DELETE /api/chat/conversations/:id/messages/:messageId
909
+ * Delete a single message from a conversation
910
+ */
911
+ chatRoutes.delete("/conversations/:id/messages/:messageId", async (c) => {
912
+ const conversationId = c.req.param("id");
913
+ const messageId = c.req.param("messageId");
914
+ try {
915
+ const conversation = await getConversation(conversationId);
916
+ if (!conversation) {
917
+ return c.json({ error: "Conversation not found" }, 404);
918
+ }
919
+ await deleteMessage(conversationId, messageId);
920
+ return c.json({ success: true });
921
+ }
922
+ catch (error) {
923
+ logger.error("[Chat] Delete message error:", error instanceof Error ? error : undefined);
924
+ return c.json({ error: "Failed to delete message" }, 500);
925
+ }
926
+ });
927
+ /**
928
+ * GET /api/chat/conversations/:id/export
929
+ * Export a conversation as JSON
930
+ */
931
+ chatRoutes.get("/conversations/:id/export", async (c) => {
932
+ const conversationId = c.req.param("id");
933
+ try {
934
+ const conversation = await getConversation(conversationId);
935
+ if (!conversation) {
936
+ return c.json({ error: "Conversation not found" }, 404);
937
+ }
938
+ const messages = await getConversationMessages(conversationId);
939
+ return c.json({
940
+ conversation: {
941
+ id: conversation.id,
942
+ title: conversation.title,
943
+ createdAt: conversation.createdAt,
944
+ },
945
+ messages,
946
+ exportedAt: new Date().toISOString(),
947
+ });
948
+ }
949
+ catch (error) {
950
+ logger.error("[Chat] Export conversation error:", error instanceof Error ? error : undefined);
951
+ return c.json({ error: "Failed to export conversation" }, 500);
952
+ }
953
+ });
754
954
  /**
755
955
  * POST /api/chat/conversations/:id/messages
756
956
  * Send a message in a conversation (with context and history)
757
957
  */
758
- chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
958
+ chatRoutes.post("/conversations/:id/messages", chatRateLimiter, contentFilter(), zValidator("json", z.object({
759
959
  content: z.string(),
760
960
  model: z.string().optional(),
761
961
  temperature: z.number().min(0).max(2).optional(),
962
+ stream: z.boolean().optional(),
762
963
  })), async (c) => {
763
964
  const conversationId = c.req.param("id");
764
965
  const body = c.req.valid("json");
@@ -870,7 +1071,56 @@ chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
870
1071
  content: m.content,
871
1072
  timestamp: m.createdAt,
872
1073
  }));
873
- // Send to AI
1074
+ // Streaming branch
1075
+ if (body.stream) {
1076
+ return streamText(c, async (stream) => {
1077
+ try {
1078
+ let fullContent = "";
1079
+ const response = await aiProvider.chatStream({
1080
+ messages: chatMessages,
1081
+ model: body.model,
1082
+ systemPrompt,
1083
+ temperature: body.temperature,
1084
+ }, (chunk) => {
1085
+ fullContent += chunk;
1086
+ stream
1087
+ .write(`data: ${JSON.stringify({ content: chunk })}\n\n`)
1088
+ .catch((err) => {
1089
+ logger.error("[Chat] Stream write error:", err instanceof Error ? err : undefined);
1090
+ });
1091
+ });
1092
+ // Save assistant response after streaming completes
1093
+ const assistantMessage = await addMessage({
1094
+ conversationId,
1095
+ role: "assistant",
1096
+ content: fullContent || response.content,
1097
+ model: response.model,
1098
+ provider: response.provider,
1099
+ tokenUsage: response.usage
1100
+ ? {
1101
+ prompt: response.usage.promptTokens,
1102
+ completion: response.usage.completionTokens,
1103
+ total: response.usage.totalTokens,
1104
+ }
1105
+ : undefined,
1106
+ cost: response.usage?.cost,
1107
+ });
1108
+ await stream.write(`data: ${JSON.stringify({
1109
+ done: true,
1110
+ usage: response.usage,
1111
+ messageId: assistantMessage.id,
1112
+ compaction: compactionInfo,
1113
+ })}\n\n`);
1114
+ }
1115
+ catch (error) {
1116
+ logger.error("[Chat] Conversation stream error:", error instanceof Error ? error : undefined);
1117
+ await stream.write(`data: ${JSON.stringify({
1118
+ error: error instanceof Error ? error.message : "Failed to send message",
1119
+ })}\n\n`);
1120
+ }
1121
+ });
1122
+ }
1123
+ // Send to AI (non-streaming)
874
1124
  const response = await aiProvider.chat({
875
1125
  messages: chatMessages,
876
1126
  model: body.model,
@@ -915,7 +1165,7 @@ chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
915
1165
  * POST /api/chat/conversations/:id/messages/with-tools
916
1166
  * Send a message in a conversation with native tool calling enabled
917
1167
  */
918
- chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.object({
1168
+ chatRoutes.post("/conversations/:id/messages/with-tools", chatRateLimiter, contentFilter(), zValidator("json", z.object({
919
1169
  content: z.string(),
920
1170
  model: z.string().optional(),
921
1171
  temperature: z.number().min(0).max(2).optional(),
@@ -993,6 +1243,10 @@ chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.o
993
1243
  const tools = enableTools
994
1244
  ? getChatToolsForModel(modelId, { conversationId })
995
1245
  : [];
1246
+ logger.info(`[Chat] Tools for ${modelId}: ${tools.length} (enableTools=${enableTools})`, {
1247
+ component: 'Chat',
1248
+ toolNames: tools.map(t => t.name).join(', '),
1249
+ });
996
1250
  // Build system prompt with context and tool mode
997
1251
  const systemPrompt = await buildSystemPrompt(conversation.presetId, context, {
998
1252
  enableTools: enableTools && tools.length > 0,
@@ -1057,6 +1311,7 @@ chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.o
1057
1311
  });
1058
1312
  // Get any pending approvals
1059
1313
  const pendingApprovals = toolHandler.getPendingApprovals();
1314
+ await disposeToolHandler(toolHandler);
1060
1315
  const inferToolCallStatus = (result) => {
1061
1316
  if (!result || typeof result !== "object") {
1062
1317
  return "success";
@@ -1279,6 +1534,7 @@ chatRoutes.post("/with-tools", zValidator("json", z.object({
1279
1534
  });
1280
1535
  // Check for pending approvals
1281
1536
  const pendingApprovals = toolHandler.getPendingApprovals();
1537
+ await disposeToolHandler(toolHandler);
1282
1538
  return c.json({
1283
1539
  id: response.id,
1284
1540
  conversationId,
@@ -1322,7 +1578,7 @@ chatRoutes.post("/with-tools", zValidator("json", z.object({
1322
1578
  * - complete - Session complete
1323
1579
  * - error - Error occurred
1324
1580
  */
1325
- chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.object({
1581
+ chatRoutes.post("/conversations/:id/messages/agentic", chatRateLimiter, contentFilter(), zValidator("json", z.object({
1326
1582
  content: z.string(),
1327
1583
  model: z.string().optional(),
1328
1584
  provider: z.string().optional(),
@@ -1385,8 +1641,6 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
1385
1641
  conversationId,
1386
1642
  sessionOverride,
1387
1643
  };
1388
- // Get tools - agentic mode uses model-aware filtering
1389
- const tools = getChatToolsForModel(resolvedRef.model, { conversationId, includeAll: true });
1390
1644
  // Build system prompt with agent mode (uses AGENT_MODE_SUFFIX)
1391
1645
  const systemPrompt = await buildSystemPrompt(conversation.presetId, context, {
1392
1646
  agentMode: true,
@@ -1429,11 +1683,14 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
1429
1683
  content: m.content,
1430
1684
  timestamp: m.createdAt,
1431
1685
  }));
1432
- // Create tool handler
1686
+ // Create tool handler (triggers tool registration if first call)
1433
1687
  const toolHandler = await createChatToolHandler({
1434
1688
  conversationId,
1435
1689
  securityMode: "full", // Full access in agentic mode (tools are pre-approved)
1436
1690
  });
1691
+ // Get tools AFTER handler init (registry is now populated)
1692
+ const tools = getChatToolsForModel(resolvedRef.model, { conversationId });
1693
+ logger.info(`[Chat/Agentic] Tools for model ${resolvedRef.model}: ${tools.length}`);
1437
1694
  // Set up SSE streaming response
1438
1695
  c.header("Content-Type", "text/event-stream");
1439
1696
  c.header("Cache-Control", "no-cache");
@@ -1491,11 +1748,15 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
1491
1748
  provider: body.provider,
1492
1749
  temperature: body.temperature,
1493
1750
  toolHandler,
1494
- tools: tools.map((t) => ({
1495
- name: t.name,
1496
- description: t.description,
1497
- parameters: t.parameters,
1498
- })),
1751
+ tools: (() => {
1752
+ const mapped = tools.map((t) => ({
1753
+ name: t.name,
1754
+ description: t.description,
1755
+ parameters: t.parameters,
1756
+ }));
1757
+ logger.info(`[Chat/Agentic] Sending ${mapped.length} tools: [${mapped.map(t => t.name).join(', ')}]`);
1758
+ return mapped;
1759
+ })(),
1499
1760
  showThinking: body.showThinking,
1500
1761
  maxSteps: body.maxSteps,
1501
1762
  maxBudget: body.maxBudget,
@@ -1542,10 +1803,8 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
1542
1803
  : undefined,
1543
1804
  toolCalls: collectedToolCalls.length > 0 ? collectedToolCalls : undefined,
1544
1805
  });
1545
- // Track in-memory usage for cost dashboard
1546
- if (totalTokens > 0 && finalModel) {
1547
- trackChatUsage(finalModel, totalTokens, inputTokensTotal, outputTokensTotal);
1548
- }
1806
+ // Cost tracking for agentic runs happens per step inside AgentExecutor;
1807
+ // tracking totals here as well would double count.
1549
1808
  // Send final saved message event
1550
1809
  await stream.write(`data: ${JSON.stringify({
1551
1810
  type: "message_saved",
@@ -1567,6 +1826,9 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
1567
1826
  timestamp: Date.now(),
1568
1827
  })}\n\n`);
1569
1828
  }
1829
+ finally {
1830
+ await disposeToolHandler(toolHandler);
1831
+ }
1570
1832
  });
1571
1833
  }
1572
1834
  catch (error) {