profclaw 0.0.1-beta.3 → 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 (535) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +54 -34
  3. package/CONTRIBUTING.md +23 -5
  4. package/Dockerfile +39 -23
  5. package/README.md +271 -72
  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 +15 -3
  71. package/dist/chat/execution/tools/index.js +125 -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/slack/index.d.ts +2 -2
  104. package/dist/chat/providers/telegram/index.d.ts +2 -0
  105. package/dist/chat/providers/telegram/index.js +21 -2
  106. package/dist/chat/system-prompts.d.ts +3 -3
  107. package/dist/chat/system-prompts.js +116 -61
  108. package/dist/chat/tools.d.ts +6 -6
  109. package/dist/cli/commands/auth.js +64 -1
  110. package/dist/cli/commands/chat.js +1327 -138
  111. package/dist/cli/commands/doctor.js +222 -16
  112. package/dist/cli/commands/history.d.ts +3 -0
  113. package/dist/cli/commands/history.js +138 -0
  114. package/dist/cli/commands/import.d.ts +44 -0
  115. package/dist/cli/commands/import.js +526 -0
  116. package/dist/cli/commands/init.d.ts +13 -0
  117. package/dist/cli/commands/init.js +381 -0
  118. package/dist/cli/commands/models.js +39 -26
  119. package/dist/cli/commands/onboard.js +263 -98
  120. package/dist/cli/commands/plan.d.ts +13 -0
  121. package/dist/cli/commands/plan.js +184 -0
  122. package/dist/cli/commands/serve.d.ts +7 -0
  123. package/dist/cli/commands/serve.js +77 -18
  124. package/dist/cli/commands/setup.js +375 -91
  125. package/dist/cli/commands/status.js +54 -0
  126. package/dist/cli/commands/tools.js +13 -13
  127. package/dist/cli/commands/tui.js +26 -1
  128. package/dist/cli/index.js +19 -6
  129. package/dist/cli/ink/App.d.ts +13 -0
  130. package/dist/cli/ink/App.js +6 -0
  131. package/dist/cli/ink/ChatApp.d.ts +60 -0
  132. package/dist/cli/ink/ChatApp.js +325 -0
  133. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  134. package/dist/cli/ink/DashboardApp.js +143 -0
  135. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  136. package/dist/cli/ink/components/AgentStatus.js +33 -0
  137. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  138. package/dist/cli/ink/components/ChannelList.js +33 -0
  139. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  140. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  141. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  142. package/dist/cli/ink/components/CostBar.js +35 -0
  143. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  144. package/dist/cli/ink/components/HookStatus.js +7 -0
  145. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  146. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  147. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  148. package/dist/cli/ink/components/PlanView.js +26 -0
  149. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  150. package/dist/cli/ink/components/ProviderList.js +16 -0
  151. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  152. package/dist/cli/ink/components/SessionHeader.js +15 -0
  153. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  154. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  155. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  156. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  157. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  158. package/dist/cli/ink/components/SystemHealth.js +39 -0
  159. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  160. package/dist/cli/ink/components/TaskList.js +59 -0
  161. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  162. package/dist/cli/ink/components/ToolCall.js +43 -0
  163. package/dist/cli/ink/index.d.ts +23 -0
  164. package/dist/cli/ink/index.js +15 -0
  165. package/dist/cli/ink/keybindings.d.ts +35 -0
  166. package/dist/cli/ink/keybindings.js +105 -0
  167. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  168. package/dist/cli/ink/markdown-renderer.js +380 -0
  169. package/dist/cli/ink/output-styles.d.ts +39 -0
  170. package/dist/cli/ink/output-styles.js +119 -0
  171. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  172. package/dist/cli/interactive/auto-serve.js +209 -0
  173. package/dist/cli/interactive/index.d.ts +25 -0
  174. package/dist/cli/interactive/index.js +23 -0
  175. package/dist/cli/interactive/picker.d.ts +28 -0
  176. package/dist/cli/interactive/picker.js +153 -0
  177. package/dist/cli/interactive/renderer.d.ts +26 -0
  178. package/dist/cli/interactive/renderer.js +555 -0
  179. package/dist/cli/interactive/repl.d.ts +14 -0
  180. package/dist/cli/interactive/repl.js +1516 -0
  181. package/dist/cli/interactive/stream-client.d.ts +59 -0
  182. package/dist/cli/interactive/stream-client.js +506 -0
  183. package/dist/cli/interactive/types.d.ts +121 -0
  184. package/dist/cli/interactive/types.js +10 -0
  185. package/dist/cli/providers.d.ts +15 -0
  186. package/dist/cli/providers.js +41 -0
  187. package/dist/cli/utils/api.d.ts +9 -0
  188. package/dist/cli/utils/api.js +58 -2
  189. package/dist/core/deployment.js +2 -0
  190. package/dist/cron/natural-language.d.ts +54 -0
  191. package/dist/cron/natural-language.js +569 -0
  192. package/dist/cron/scheduler.d.ts +34 -4
  193. package/dist/cron/scheduler.js +141 -9
  194. package/dist/cron/templates.d.ts +1 -1
  195. package/dist/cron/templates.js +219 -0
  196. package/dist/feeds/feed-engine.d.ts +149 -0
  197. package/dist/feeds/feed-engine.js +600 -0
  198. package/dist/feeds/index.d.ts +9 -0
  199. package/dist/feeds/index.js +8 -0
  200. package/dist/gateway/router.js +6 -1
  201. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  202. package/dist/hooks/built-in/audit-log.js +84 -0
  203. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  204. package/dist/hooks/built-in/cost-warning.js +59 -0
  205. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  206. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  207. package/dist/hooks/built-in/index.d.ts +14 -0
  208. package/dist/hooks/built-in/index.js +20 -0
  209. package/dist/hooks/index.d.ts +3 -0
  210. package/dist/hooks/index.js +6 -0
  211. package/dist/hooks/loader.d.ts +17 -0
  212. package/dist/hooks/loader.js +142 -0
  213. package/dist/hooks/registry.d.ts +62 -0
  214. package/dist/hooks/registry.js +127 -0
  215. package/dist/integrations/web-search.js +6 -3
  216. package/dist/memory/index.d.ts +1 -0
  217. package/dist/memory/index.js +2 -0
  218. package/dist/memory/memory-service.js +14 -13
  219. package/dist/memory/observational.d.ts +62 -0
  220. package/dist/memory/observational.js +396 -0
  221. package/dist/middleware/content-filter.d.ts +22 -0
  222. package/dist/middleware/content-filter.js +69 -0
  223. package/dist/middleware/request-validator.d.ts +159 -0
  224. package/dist/middleware/request-validator.js +93 -0
  225. package/dist/plugins/sdk.d.ts +22 -0
  226. package/dist/plugins/sdk.js +17 -1
  227. package/dist/projects/types.d.ts +10 -10
  228. package/dist/providers/ai-sdk.d.ts +11 -0
  229. package/dist/providers/ai-sdk.js +97 -18
  230. package/dist/providers/core/models.js +67 -1
  231. package/dist/providers/core/types.d.ts +3 -0
  232. package/dist/providers/index.d.ts +1 -0
  233. package/dist/providers/index.js +1 -0
  234. package/dist/providers/smart-router.d.ts +118 -0
  235. package/dist/providers/smart-router.js +685 -0
  236. package/dist/providers/types.d.ts +16 -16
  237. package/dist/routes/agents.js +50 -0
  238. package/dist/routes/auth.js +8 -1
  239. package/dist/routes/channels.d.ts +12 -0
  240. package/dist/routes/channels.js +166 -0
  241. package/dist/routes/chat.js +259 -14
  242. package/dist/routes/costs.js +32 -0
  243. package/dist/routes/cron.js +80 -5
  244. package/dist/routes/feeds.d.ts +10 -0
  245. package/dist/routes/feeds.js +168 -0
  246. package/dist/routes/mcp.js +21 -0
  247. package/dist/routes/memory.js +130 -0
  248. package/dist/routes/skills.js +129 -0
  249. package/dist/routes/teams.d.ts +9 -0
  250. package/dist/routes/teams.js +210 -0
  251. package/dist/routes/tools.js +14 -0
  252. package/dist/routes/users.js +2 -0
  253. package/dist/server/route-loader.js +4 -1
  254. package/dist/server/stream-bridge.d.ts +19 -0
  255. package/dist/server/stream-bridge.js +38 -0
  256. package/dist/server.js +421 -141
  257. package/dist/skills/marketplace.d.ts +87 -0
  258. package/dist/skills/marketplace.js +268 -0
  259. package/dist/storage/index.d.ts +14 -0
  260. package/dist/storage/index.js +64 -3
  261. package/dist/storage/schema.d.ts +4 -4
  262. package/dist/storage/schema.js +1 -1
  263. package/dist/teams/index.d.ts +110 -0
  264. package/dist/teams/index.js +365 -0
  265. package/dist/tickets/types.d.ts +39 -39
  266. package/dist/types/summary.d.ts +5 -5
  267. package/dist/utils/auto-update.d.ts +23 -0
  268. package/dist/utils/auto-update.js +157 -0
  269. package/dist/utils/offline-detect.d.ts +55 -0
  270. package/dist/utils/offline-detect.js +121 -0
  271. package/dist/utils/pid-file.d.ts +36 -0
  272. package/dist/utils/pid-file.js +125 -0
  273. package/dist/utils/prevent-sleep.d.ts +27 -0
  274. package/dist/utils/prevent-sleep.js +95 -0
  275. package/dist/utils/sanitizer.d.ts +57 -0
  276. package/dist/utils/sanitizer.js +174 -0
  277. package/docker-compose.yml +13 -137
  278. package/package.json +31 -6
  279. package/skills/deploy-cloudflare/SKILL.md +62 -0
  280. package/skills/deploy-vercel/SKILL.md +67 -0
  281. package/skills/docker-deploy/SKILL.md +158 -0
  282. package/skills/full-stack-builder/SKILL.md +92 -0
  283. package/skills/git-workflow/SKILL.md +3 -3
  284. package/skills/humanizer/SKILL.md +488 -0
  285. package/skills/profclaw-assistant/SKILL.md +85 -56
  286. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  287. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  288. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  289. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  290. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  291. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  292. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  293. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  294. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  295. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  296. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  297. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  298. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  299. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  300. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  301. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  302. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  306. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  308. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  309. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  310. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  311. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  315. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  316. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  318. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  319. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  321. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  323. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  324. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  325. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  327. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  328. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  331. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  333. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  334. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  335. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  337. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  338. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  341. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  346. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  349. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  350. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  351. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  352. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  353. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  356. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  357. package/ui/dist/assets/{ProjectDetail-DlYUcOss.js → ProjectDetail-BgWvA6UP.js} +2 -2
  358. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  359. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  360. package/ui/dist/assets/{Settings-CgPqzUvj.js → Settings-xA8Zhi3p.js} +3 -3
  361. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  362. package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.js → SummaryDetail-eedRfTtF.js} +2 -2
  363. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  364. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  365. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  366. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  367. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  368. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  369. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  370. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  371. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  372. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  373. package/ui/dist/assets/{archive-CGck7gxR.js → archive-CX7UvZpf.js} +1 -1
  374. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  375. package/ui/dist/assets/{bug-DqSGPUUE.js → bug-3WX0394-.js} +1 -1
  376. package/ui/dist/assets/{calendar-BuZ4zbPW.js → calendar-buq77TaS.js} +1 -1
  377. package/ui/dist/assets/{chevron-up-DcJ4LL_N.js → chevron-up-4ymsBJRo.js} +1 -1
  378. package/ui/dist/assets/{circle-x-C78PNZjF.js → circle-x-ByXtwR6Y.js} +1 -1
  379. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  380. package/ui/dist/assets/{cpu-Ck6AoG8c.js → cpu-CiuoCeDY.js} +1 -1
  381. package/ui/dist/assets/{database-CA2w8Lvt.js → database-BWXSBg5a.js} +1 -1
  382. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  383. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  384. package/ui/dist/assets/{ellipsis-FhHKRbfl.js → ellipsis-vT-5SVIp.js} +1 -1
  385. package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  386. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  387. package/ui/dist/assets/{file-code-ChnhYYj1.js → file-code-ChOWdKXf.js} +1 -1
  388. package/ui/dist/assets/{folder-open-CHwA1-ve.js → folder-open-CkOUbIiP.js} +1 -1
  389. package/ui/dist/assets/{funnel-ByEjRFNB.js → funnel-uZkoSPP-.js} +1 -1
  390. package/ui/dist/assets/{git-branch-GTOPQgU4.js → git-branch-CwvUxj7C.js} +1 -1
  391. package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  392. package/ui/dist/assets/{globe-CQWfr7hT.js → globe-D_WpJdsj.js} +1 -1
  393. package/ui/dist/assets/{hash-nKC9gtLg.js → hash-CA0hJ7vh.js} +1 -1
  394. package/ui/dist/assets/{history-DfFSA9xJ.js → history-CEWMLELs.js} +1 -1
  395. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  396. package/ui/dist/assets/{index-a4Fxq0Hb.js → index-C1rhbml4.js} +3 -3
  397. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  398. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  399. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  400. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  401. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  402. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  403. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  404. package/ui/dist/assets/{layout-dashboard-WmgjMhWF.js → layout-dashboard-BRUM0kpT.js} +1 -1
  405. package/ui/dist/assets/{lightbulb-Bo8hEr7B.js → lightbulb-CN2q1O5l.js} +1 -1
  406. package/ui/dist/assets/{link-2-YqrpQXBH.js → link-2-CC4E28yJ.js} +1 -1
  407. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  408. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  409. package/ui/dist/assets/{message-square-CD0H5hot.js → message-square-Bbb241am.js} +1 -1
  410. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  411. package/ui/dist/assets/{pencil-DpFnj5dn.js → pencil-CDmiHzoj.js} +1 -1
  412. package/ui/dist/assets/{play-DVgea_jT.js → play-tjy5jMQX.js} +1 -1
  413. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  414. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  415. package/ui/dist/assets/{rocket-BFxPYGx9.js → rocket--8ZHgdXJ.js} +1 -1
  416. package/ui/dist/assets/select-n108rXny.js +1 -0
  417. package/ui/dist/assets/{send-eYnW_7n-.js → send-Cu7MR2Qh.js} +1 -1
  418. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  419. package/ui/dist/assets/{settings-2-scXUOuE_.js → settings-2-CkRNqkxj.js} +1 -1
  420. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  421. package/ui/dist/assets/{shield-check-PEr7nmVw.js → shield-check-ViI3nMKE.js} +1 -1
  422. package/ui/dist/assets/{shield-off-CLtXio62.js → shield-off-DN3tagkn.js} +1 -1
  423. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  424. package/ui/dist/assets/{smartphone-DusFfY0U.js → smartphone-5FghiXpA.js} +1 -1
  425. package/ui/dist/assets/{square-e1yxB2eR.js → square-DiNSx8K7.js} +1 -1
  426. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  427. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  428. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  429. package/ui/dist/assets/{tag-tAwMmQ9G.js → tag-CH_vQliw.js} +1 -1
  430. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  431. package/ui/dist/assets/{timer-Vel1N3RP.js → timer-CdGVTb60.js} +1 -1
  432. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  433. package/ui/dist/assets/{trash-2-eM-CNwsZ.js → trash-2-CucZJL0N.js} +1 -1
  434. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  435. package/ui/dist/assets/{trending-up-BGafmjRo.js → trending-up-C5OYX2k2.js} +1 -1
  436. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  437. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  438. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  439. package/ui/dist/assets/{wand-sparkles-DPvcd9Pi.js → wand-sparkles-BaH6pJnc.js} +1 -1
  440. package/ui/dist/assets/{wrench-B8s3zYVV.js → wrench-CjxjP6ok.js} +1 -1
  441. package/ui/dist/index.html +5 -2
  442. package/dist/chat/auto-reply.d.ts +0 -90
  443. package/dist/chat/auto-reply.js +0 -272
  444. package/dist/chat/execution/pty.d.ts +0 -92
  445. package/dist/chat/execution/pty.js +0 -285
  446. package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
  447. package/dist/chat/execution/tools/glinr-ops.js +0 -694
  448. package/dist/cli/commands/browser.d.ts +0 -3
  449. package/dist/cli/commands/browser.js +0 -138
  450. package/dist/cli/commands/canvas.d.ts +0 -3
  451. package/dist/cli/commands/canvas.js +0 -155
  452. package/dist/cli/commands/nodes.d.ts +0 -3
  453. package/dist/cli/commands/nodes.js +0 -193
  454. package/dist/diagnostics/exporters.d.ts +0 -21
  455. package/dist/diagnostics/exporters.js +0 -138
  456. package/dist/diagnostics/index.d.ts +0 -10
  457. package/dist/diagnostics/index.js +0 -9
  458. package/dist/diagnostics/middleware.d.ts +0 -12
  459. package/dist/diagnostics/middleware.js +0 -58
  460. package/dist/diagnostics/tracer.d.ts +0 -133
  461. package/dist/diagnostics/tracer.js +0 -257
  462. package/dist/discovery/index.d.ts +0 -8
  463. package/dist/discovery/index.js +0 -7
  464. package/dist/discovery/mdns.d.ts +0 -40
  465. package/dist/discovery/mdns.js +0 -249
  466. package/dist/plugins/registry.d.ts +0 -122
  467. package/dist/plugins/registry.js +0 -352
  468. package/dist/plugins/sandbox.d.ts +0 -77
  469. package/dist/plugins/sandbox.js +0 -287
  470. package/dist/plugins/search/brave.d.ts +0 -9
  471. package/dist/plugins/search/brave.js +0 -157
  472. package/dist/plugins/search/duckduckgo.d.ts +0 -9
  473. package/dist/plugins/search/duckduckgo.js +0 -171
  474. package/dist/plugins/search/index.d.ts +0 -13
  475. package/dist/plugins/search/index.js +0 -23
  476. package/dist/plugins/search/searxng.d.ts +0 -9
  477. package/dist/plugins/search/searxng.js +0 -170
  478. package/dist/plugins/search/serper.d.ts +0 -9
  479. package/dist/plugins/search/serper.js +0 -135
  480. package/dist/plugins/search/tavily.d.ts +0 -9
  481. package/dist/plugins/search/tavily.js +0 -146
  482. package/dist/providers/adapters/anthropic.d.ts +0 -26
  483. package/dist/providers/adapters/anthropic.js +0 -306
  484. package/dist/providers/adapters/base.d.ts +0 -53
  485. package/dist/providers/adapters/base.js +0 -99
  486. package/dist/providers/adapters/ollama.d.ts +0 -30
  487. package/dist/providers/adapters/ollama.js +0 -292
  488. package/dist/utils/ai-cache.d.ts +0 -72
  489. package/dist/utils/ai-cache.js +0 -204
  490. package/dist/utils/file-lock.d.ts +0 -85
  491. package/dist/utils/file-lock.js +0 -204
  492. package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
  493. package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
  494. package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
  495. package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
  496. package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
  497. package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
  498. package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
  499. package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
  500. package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
  501. package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
  502. package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
  503. package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
  504. package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
  505. package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
  506. package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
  507. package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
  508. package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
  509. package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
  510. package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
  511. package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
  512. package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
  513. package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
  514. package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
  515. package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
  516. package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
  517. package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
  518. package/ui/dist/assets/index--JkIxVXb.js +0 -67
  519. package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
  520. package/ui/dist/assets/index-DHGvP9mp.js +0 -1
  521. package/ui/dist/assets/index-DeI8lKRR.js +0 -1
  522. package/ui/dist/assets/index-WclMPci1.css +0 -1
  523. package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
  524. package/ui/dist/assets/layers-DFeLExSa.js +0 -1
  525. package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
  526. package/ui/dist/assets/popover-JXecfWG5.js +0 -1
  527. package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
  528. package/ui/dist/assets/select-MADP8m6Q.js +0 -1
  529. package/ui/dist/assets/server-CPMaysH8.js +0 -1
  530. package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
  531. package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
  532. package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
  533. package/ui/dist/assets/table-CXxtLicg.js +0 -1
  534. package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
  535. package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Feed Routes
3
+ *
4
+ * REST API for managing RSS/Atom feeds and article digests.
5
+ * All endpoints are under /api/feeds.
6
+ */
7
+ import { Hono } from 'hono';
8
+ import { z } from 'zod';
9
+ import { addFeed, addFeedBundle, listFeeds, getFeed, updateFeed, removeFeed, toggleFeed, pollFeed, pollAllFeeds, getDigestArticles, markAsDigested, getFeedStats, listCategories, discoverFeedUrl, FEED_BUNDLES, } from '../feeds/index.js';
10
+ const app = new Hono();
11
+ // Schemas
12
+ const createFeedSchema = z.object({
13
+ name: z.string().min(1).max(200),
14
+ url: z.string().url(),
15
+ category: z.string().max(50).optional(),
16
+ tags: z.array(z.string()).optional(),
17
+ pollIntervalMs: z.number().min(60000).optional(), // Min 1 minute
18
+ metadata: z.record(z.unknown()).optional(),
19
+ });
20
+ const updateFeedSchema = z.object({
21
+ name: z.string().min(1).max(200).optional(),
22
+ category: z.string().max(50).optional(),
23
+ tags: z.array(z.string()).optional(),
24
+ pollIntervalMs: z.number().min(60000).optional(),
25
+ metadata: z.record(z.unknown()).optional(),
26
+ });
27
+ // Routes
28
+ /** List all feeds */
29
+ app.get('/', async (c) => {
30
+ const category = c.req.query('category');
31
+ const tag = c.req.query('tag');
32
+ const enabled = c.req.query('enabled');
33
+ const feeds = await listFeeds({
34
+ category: category || undefined,
35
+ tag: tag || undefined,
36
+ enabled: enabled !== undefined ? enabled === 'true' : undefined,
37
+ });
38
+ return c.json({ success: true, data: feeds });
39
+ });
40
+ /** Get feed stats */
41
+ app.get('/stats', async (c) => {
42
+ const stats = await getFeedStats();
43
+ return c.json({ success: true, data: stats });
44
+ });
45
+ /** List available categories */
46
+ app.get('/categories', async (c) => {
47
+ const categories = await listCategories();
48
+ return c.json({ success: true, data: categories });
49
+ });
50
+ /** List available bundles */
51
+ app.get('/bundles', (c) => {
52
+ const bundles = Object.entries(FEED_BUNDLES).map(([name, feeds]) => ({
53
+ name,
54
+ feedCount: feeds.length,
55
+ feeds: feeds.map((f) => ({ name: f.name, url: f.url, category: f.category })),
56
+ }));
57
+ return c.json({ success: true, data: bundles });
58
+ });
59
+ /** Get a single feed */
60
+ app.get('/:id', async (c) => {
61
+ const feed = await getFeed(c.req.param('id'));
62
+ if (!feed) {
63
+ return c.json({ success: false, error: { code: 'NOT_FOUND', message: 'Feed not found' } }, 404);
64
+ }
65
+ return c.json({ success: true, data: feed });
66
+ });
67
+ /** Create a new feed */
68
+ app.post('/', async (c) => {
69
+ const body = await c.req.json();
70
+ const parsed = createFeedSchema.safeParse(body);
71
+ if (!parsed.success) {
72
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message } }, 400);
73
+ }
74
+ try {
75
+ const feed = await addFeed(parsed.data);
76
+ return c.json({ success: true, data: feed }, 201);
77
+ }
78
+ catch (error) {
79
+ const msg = error instanceof Error ? error.message : 'Failed to create feed';
80
+ return c.json({ success: false, error: { code: 'CREATE_FAILED', message: msg } }, 400);
81
+ }
82
+ });
83
+ /** Install a feed bundle */
84
+ app.post('/bundles/:name/install', async (c) => {
85
+ const bundleName = c.req.param('name');
86
+ try {
87
+ const feeds = await addFeedBundle(bundleName);
88
+ return c.json({ success: true, data: { installed: feeds.length, feeds } });
89
+ }
90
+ catch (error) {
91
+ const msg = error instanceof Error ? error.message : 'Failed to install bundle';
92
+ return c.json({ success: false, error: { code: 'BUNDLE_FAILED', message: msg } }, 400);
93
+ }
94
+ });
95
+ /** Discover feed URL from a website */
96
+ app.post('/discover', async (c) => {
97
+ const body = await c.req.json();
98
+ if (!body.url) {
99
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: 'url is required' } }, 400);
100
+ }
101
+ const feedUrl = await discoverFeedUrl(body.url);
102
+ return c.json({ success: true, data: { feedUrl } });
103
+ });
104
+ /** Update a feed */
105
+ app.patch('/:id', async (c) => {
106
+ const body = await c.req.json();
107
+ const parsed = updateFeedSchema.safeParse(body);
108
+ if (!parsed.success) {
109
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message } }, 400);
110
+ }
111
+ await updateFeed(c.req.param('id'), parsed.data);
112
+ const feed = await getFeed(c.req.param('id'));
113
+ return c.json({ success: true, data: feed });
114
+ });
115
+ /** Toggle feed enabled/disabled */
116
+ app.post('/:id/toggle', async (c) => {
117
+ const body = await c.req.json();
118
+ const enabled = body.enabled !== false;
119
+ await toggleFeed(c.req.param('id'), enabled);
120
+ return c.json({ success: true, data: { enabled } });
121
+ });
122
+ /** Delete a feed */
123
+ app.delete('/:id', async (c) => {
124
+ const removed = await removeFeed(c.req.param('id'));
125
+ if (!removed) {
126
+ return c.json({ success: false, error: { code: 'NOT_FOUND', message: 'Feed not found' } }, 404);
127
+ }
128
+ return c.json({ success: true });
129
+ });
130
+ /** Poll a specific feed */
131
+ app.post('/:id/poll', async (c) => {
132
+ const result = await pollFeed(c.req.param('id'));
133
+ return c.json({ success: true, data: result });
134
+ });
135
+ /** Poll all due feeds */
136
+ app.post('/poll-all', async (c) => {
137
+ const result = await pollAllFeeds();
138
+ return c.json({ success: true, data: result });
139
+ });
140
+ /** Get digest articles */
141
+ app.get('/digest/articles', async (c) => {
142
+ const since = c.req.query('since');
143
+ const category = c.req.query('category');
144
+ const tag = c.req.query('tag');
145
+ const feedId = c.req.query('feedId');
146
+ const limit = c.req.query('limit');
147
+ const undigestedOnly = c.req.query('undigestedOnly');
148
+ const articles = await getDigestArticles({
149
+ since: since ? new Date(since) : undefined,
150
+ category: category || undefined,
151
+ tag: tag || undefined,
152
+ feedId: feedId || undefined,
153
+ limit: limit ? parseInt(limit) : undefined,
154
+ undigestedOnly: undigestedOnly === 'true',
155
+ });
156
+ return c.json({ success: true, data: articles });
157
+ });
158
+ /** Mark articles as digested */
159
+ app.post('/digest/mark', async (c) => {
160
+ const body = await c.req.json();
161
+ if (!body.articleIds?.length) {
162
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: 'articleIds required' } }, 400);
163
+ }
164
+ await markAsDigested(body.articleIds);
165
+ return c.json({ success: true });
166
+ });
167
+ export default app;
168
+ //# sourceMappingURL=feeds.js.map
@@ -25,6 +25,27 @@ async function getMcpRuntime() {
25
25
  }
26
26
  return runtimePromise;
27
27
  }
28
+ // GET / - MCP overview (alias for /status)
29
+ mcpRoutes.get('/', async (c) => {
30
+ try {
31
+ const { mcpClientManager, adaptToolsToMCP } = await getMcpRuntime();
32
+ const connectedServers = mcpClientManager.getStatus();
33
+ const adaptedTools = adaptToolsToMCP();
34
+ return c.json({
35
+ server: {
36
+ enabled: true,
37
+ toolsExposed: adaptedTools.length,
38
+ },
39
+ clients: connectedServers,
40
+ connectedCount: connectedServers.filter((s) => s.connected).length,
41
+ totalServers: connectedServers.length,
42
+ });
43
+ }
44
+ catch (error) {
45
+ logger.error('[MCP Routes] Status error:', error instanceof Error ? error : undefined);
46
+ return c.json({ error: 'Failed to get MCP status' }, 500);
47
+ }
48
+ });
28
49
  // GET /status - MCP server/client status
29
50
  mcpRoutes.get('/status', async (c) => {
30
51
  try {
@@ -9,6 +9,8 @@ import { zValidator } from '@hono/zod-validator';
9
9
  import { z } from 'zod';
10
10
  import { initMemoryTables, syncMemoryFiles, searchMemory, getMemoryContent, getMemoryStats, listMemoryFiles, listFileChunks, deleteMemoryChunk, deleteMemoryFile, clearAllMemories, listMemorySessions, createMemorySession, archiveSession, DEFAULT_MEMORY_CONFIG, getMemoryWatcher, } from '../memory/index.js';
11
11
  import { initExperienceStore, recordExperience, getExperience, deleteExperience, listExperiences, findSimilarExperiences, markUsed, applyDecay, pruneExpired, getStats as getExperienceStats, trackPreference, getUserPreferences, } from '../memory/experience-store.js';
12
+ import { observeConversation } from '../memory/observational.js';
13
+ import { importFrom, listImportSources } from '../cli/commands/import.js';
12
14
  import { logger } from '../utils/logger.js';
13
15
  const memory = new Hono();
14
16
  // Schema Validators
@@ -618,5 +620,133 @@ memory.get('/preferences/:userId', async (c) => {
618
620
  return c.json({ error: 'Failed to get preferences', message: error instanceof Error ? error.message : 'Unknown error' }, 500);
619
621
  }
620
622
  });
623
+ /**
624
+ * POST /api/memory/observe - Extract observations from a conversation
625
+ * Manually trigger observational memory on a conversation snapshot.
626
+ */
627
+ memory.post('/observe', zValidator('json', z.object({
628
+ conversationId: z.string(),
629
+ messages: z.array(z.object({
630
+ role: z.enum(['user', 'assistant', 'system']),
631
+ content: z.string(),
632
+ toolsUsed: z.array(z.string()).optional(),
633
+ })),
634
+ userId: z.string().optional(),
635
+ })), async (c) => {
636
+ try {
637
+ const body = c.req.valid('json');
638
+ const result = await observeConversation({
639
+ conversationId: body.conversationId,
640
+ messages: body.messages,
641
+ metadata: { userId: body.userId },
642
+ });
643
+ return c.json({
644
+ success: true,
645
+ data: {
646
+ observations: result.observations.map(o => ({
647
+ type: o.type,
648
+ summary: o.summary,
649
+ confidence: o.confidence,
650
+ })),
651
+ experiencesRecorded: result.experiencesRecorded,
652
+ preferencesTracked: result.preferencesTracked,
653
+ processingTimeMs: result.processingTimeMs,
654
+ },
655
+ });
656
+ }
657
+ catch (error) {
658
+ logger.error('[Memory API] Observe failed:', error);
659
+ return c.json({ error: 'Failed to observe conversation', message: error instanceof Error ? error.message : 'Unknown error' }, 500);
660
+ }
661
+ });
662
+ /**
663
+ * GET /api/memory/insights - Dashboard summary of what profClaw has learned
664
+ * Shows learned patterns, top tool chains, preferences, and learning velocity.
665
+ */
666
+ memory.get('/insights', async (c) => {
667
+ try {
668
+ const stats = await getExperienceStats();
669
+ const recentChains = await listExperiences({ type: 'tool_chain', limit: 10, minWeight: 0.1 });
670
+ const recentPrefs = await listExperiences({ type: 'user_preference', limit: 10 });
671
+ const recentSolutions = await listExperiences({ type: 'task_solution', limit: 5 });
672
+ const recentRecoveries = await listExperiences({ type: 'error_recovery', limit: 5 });
673
+ // Build top tool chains summary
674
+ const topChains = recentChains.experiences
675
+ .filter(e => e.useCount >= 2)
676
+ .sort((a, b) => b.useCount - a.useCount)
677
+ .slice(0, 5)
678
+ .map(e => {
679
+ const chain = e.solution;
680
+ return {
681
+ intent: e.intent.slice(0, 100),
682
+ tools: chain.tools?.map(t => t.name) ?? [],
683
+ useCount: e.useCount,
684
+ successScore: e.successScore,
685
+ lastUsed: new Date(e.lastUsedAt).toISOString(),
686
+ };
687
+ });
688
+ // Learning velocity: experiences recorded per day (last 7 days)
689
+ const now = Date.now();
690
+ const sevenDaysAgo = now - 7 * 24 * 60 * 60 * 1000;
691
+ const allRecent = await listExperiences({ limit: 100 });
692
+ const recentCount = allRecent.experiences.filter(e => e.createdAt > sevenDaysAgo).length;
693
+ const learningRate = Math.round((recentCount / 7) * 10) / 10;
694
+ return c.json({
695
+ success: true,
696
+ data: {
697
+ stats,
698
+ learningRate: `${learningRate} experiences/day`,
699
+ topToolChains: topChains,
700
+ recentPreferences: recentPrefs.experiences.slice(0, 5).map(e => ({
701
+ intent: e.intent,
702
+ useCount: e.useCount,
703
+ weight: Math.round(e.weight * 100) / 100,
704
+ })),
705
+ recentSolutions: recentSolutions.total,
706
+ errorRecoveries: recentRecoveries.total,
707
+ summary: stats.total === 0
708
+ ? 'No experiences recorded yet. profClaw learns as you use it - tool chains, preferences, and error recovery patterns improve over time.'
709
+ : `profClaw has learned ${stats.total} experiences across ${Object.keys(stats.byType).length} categories. Learning rate: ${learningRate}/day. ${topChains.length > 0 ? `Most-used pattern: ${topChains[0].tools.join(' -> ')} (${topChains[0].useCount}x).` : ''}`,
710
+ },
711
+ });
712
+ }
713
+ catch (error) {
714
+ logger.error('[Memory API] Insights failed:', error);
715
+ return c.json({ error: 'Failed to generate insights', message: error instanceof Error ? error.message : 'Unknown error' }, 500);
716
+ }
717
+ });
718
+ /**
719
+ * GET /api/memory/import/sources - List available import sources
720
+ */
721
+ memory.get('/import/sources', (_c) => {
722
+ return _c.json({ success: true, sources: listImportSources() });
723
+ });
724
+ /**
725
+ * POST /api/memory/import - Import data from another AI assistant
726
+ */
727
+ memory.post('/import', zValidator('json', z.object({
728
+ source: z.enum(['openclaw', 'chatgpt', 'aider']),
729
+ path: z.string().optional(),
730
+ file: z.string().optional(),
731
+ dryRun: z.boolean().optional().default(false),
732
+ })), async (c) => {
733
+ try {
734
+ const body = c.req.valid('json');
735
+ const result = await importFrom(body.source, {
736
+ path: body.path,
737
+ file: body.file,
738
+ dryRun: body.dryRun,
739
+ });
740
+ return c.json({
741
+ success: result.errors.length === 0,
742
+ data: result,
743
+ summary: `Imported from ${result.source}: ${result.memories} memories, ${result.conversations} conversations, ${result.skills} skills, ${result.preferences} preferences${result.errors.length > 0 ? ` (${result.errors.length} errors)` : ''}`,
744
+ });
745
+ }
746
+ catch (error) {
747
+ logger.error('[Memory API] Import failed:', error);
748
+ return c.json({ error: 'Import failed', message: error instanceof Error ? error.message : 'Unknown error' }, 500);
749
+ }
750
+ });
621
751
  export { memory as memoryRoutes };
622
752
  //# sourceMappingURL=memory.js.map
@@ -149,4 +149,133 @@ skillsRoutes.post('/:name/toggle', async (c) => {
149
149
  enabled: skill.enabled,
150
150
  });
151
151
  });
152
+ // --- Marketplace Routes ---
153
+ import { getMarketplace } from '../skills/marketplace.js';
154
+ import { getSkillEffectiveness } from '../skills/compiler.js';
155
+ /** Search marketplace for skills */
156
+ skillsRoutes.get('/marketplace/search', async (c) => {
157
+ const marketplace = getMarketplace();
158
+ const query = c.req.query('q');
159
+ const category = c.req.query('category');
160
+ const tag = c.req.query('tag');
161
+ const sortBy = c.req.query('sortBy');
162
+ const limit = c.req.query('limit');
163
+ const results = await marketplace.search({
164
+ query: query || undefined,
165
+ category: category || undefined,
166
+ tag: tag || undefined,
167
+ sortBy,
168
+ limit: limit ? parseInt(limit) : undefined,
169
+ });
170
+ return c.json({ success: true, data: results });
171
+ });
172
+ /** Install a skill from marketplace, GitHub, or URL */
173
+ skillsRoutes.post('/marketplace/install', async (c) => {
174
+ const body = await c.req.json();
175
+ if (!body.source) {
176
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: 'source is required' } }, 400);
177
+ }
178
+ const marketplace = getMarketplace();
179
+ const result = await marketplace.install(body.source);
180
+ if (result.success) {
181
+ // Reload skills registry to pick up new skill
182
+ const registry = getSkillsRegistry();
183
+ await registry.reload();
184
+ }
185
+ return c.json({ success: result.success, data: result });
186
+ });
187
+ /** Uninstall a managed skill */
188
+ skillsRoutes.delete('/marketplace/:name', async (c) => {
189
+ const marketplace = getMarketplace();
190
+ const removed = await marketplace.uninstall(c.req.param('name'));
191
+ if (removed) {
192
+ const registry = getSkillsRegistry();
193
+ await registry.reload();
194
+ }
195
+ return c.json({ success: removed });
196
+ });
197
+ /** Check for skill updates */
198
+ skillsRoutes.get('/marketplace/updates', async (c) => {
199
+ const marketplace = getMarketplace();
200
+ const updates = await marketplace.checkUpdates();
201
+ return c.json({ success: true, data: updates });
202
+ });
203
+ /** List configured registries */
204
+ skillsRoutes.get('/marketplace/registries', (c) => {
205
+ const marketplace = getMarketplace();
206
+ return c.json({ success: true, data: marketplace.listRegistries() });
207
+ });
208
+ /** Get all categories from installed skills */
209
+ skillsRoutes.get('/categories', (_c) => {
210
+ const registry = getSkillsRegistry();
211
+ const entries = registry.getAllEntries();
212
+ const categories = new Map();
213
+ for (const entry of entries) {
214
+ const cats = entry.metadata?.toolCategories ?? [];
215
+ if (cats.length === 0) {
216
+ categories.set('uncategorized', (categories.get('uncategorized') ?? 0) + 1);
217
+ }
218
+ for (const cat of cats) {
219
+ categories.set(cat, (categories.get(cat) ?? 0) + 1);
220
+ }
221
+ }
222
+ const sorted = [...categories.entries()]
223
+ .map(([name, count]) => ({ name, count }))
224
+ .sort((a, b) => b.count - a.count);
225
+ return _c.json({ success: true, data: sorted });
226
+ });
227
+ /** Get skill effectiveness/usage stats */
228
+ skillsRoutes.get('/:name/effectiveness', (c) => {
229
+ const name = c.req.param('name');
230
+ const records = getSkillEffectiveness(name);
231
+ const totalAttempts = records.reduce((s, r) => s + r.attempts, 0);
232
+ const totalSuccesses = records.reduce((s, r) => s + r.successes, 0);
233
+ const overallRate = totalAttempts > 0 ? totalSuccesses / totalAttempts : 0;
234
+ return c.json({
235
+ success: true,
236
+ data: {
237
+ skillId: name,
238
+ totalAttempts,
239
+ totalSuccesses,
240
+ overallSuccessRate: Math.round(overallRate * 100),
241
+ byModel: records.map(r => ({
242
+ model: r.modelId,
243
+ attempts: r.attempts,
244
+ successRate: Math.round(r.successRate * 100),
245
+ avgDurationMs: Math.round(r.avgDurationMs),
246
+ })),
247
+ },
248
+ });
249
+ });
250
+ /** Get aggregate skill stats for dashboard */
251
+ skillsRoutes.get('/stats/overview', (_c) => {
252
+ const registry = getSkillsRegistry();
253
+ const entries = registry.getAllEntries();
254
+ const registryStats = registry.getStats();
255
+ // Group by category
256
+ const byCategory = {};
257
+ for (const entry of entries) {
258
+ for (const cat of entry.metadata?.toolCategories ?? ['other']) {
259
+ byCategory[cat] = (byCategory[cat] ?? 0) + 1;
260
+ }
261
+ }
262
+ // Count user vs model invocable
263
+ const userInvocable = entries.filter(e => e.invocation.userInvocable).length;
264
+ const modelInvocable = entries.filter(e => e.invocation.modelInvocable).length;
265
+ const eligible = entries.filter(e => e.eligible !== false).length;
266
+ const enabled = entries.filter(e => e.enabled !== false).length;
267
+ return _c.json({
268
+ success: true,
269
+ data: {
270
+ total: registryStats.totalSkills,
271
+ enabled,
272
+ eligible,
273
+ bySource: registryStats.bySource,
274
+ byCategory,
275
+ userInvocable,
276
+ modelInvocable,
277
+ mcpServers: registryStats.mcpServers,
278
+ },
279
+ });
280
+ });
152
281
  //# sourceMappingURL=skills.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Teams API Routes
3
+ *
4
+ * Multi-user team management with shared cost budgets.
5
+ * No other OSS AI tool has this.
6
+ */
7
+ import { Hono } from 'hono';
8
+ export declare const teamRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
9
+ //# sourceMappingURL=teams.d.ts.map
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Teams API Routes
3
+ *
4
+ * Multi-user team management with shared cost budgets.
5
+ * No other OSS AI tool has this.
6
+ */
7
+ import { Hono } from 'hono';
8
+ import { zValidator } from '@hono/zod-validator';
9
+ import { z } from 'zod';
10
+ import { initTeamsTables, createTeam, getTeam, getTeamBySlug, listUserTeams, updateTeam, deleteTeam, addMember, removeMember, listMembers, updateMemberRole, getTeamUsage, canMemberSpend, createInvite, acceptInvite, listTeamInvites, } from '../teams/index.js';
11
+ import { createContextualLogger } from '../utils/logger.js';
12
+ const log = createContextualLogger('TeamsRoutes');
13
+ const app = new Hono();
14
+ // Lazy init
15
+ let initialized = false;
16
+ app.use('*', async (_c, next) => {
17
+ if (!initialized) {
18
+ initialized = true;
19
+ try {
20
+ await initTeamsTables();
21
+ }
22
+ catch (e) {
23
+ initialized = false;
24
+ log.warn('Failed to init teams tables', { error: e.message });
25
+ }
26
+ }
27
+ await next();
28
+ });
29
+ // Schemas
30
+ const createTeamSchema = z.object({
31
+ name: z.string().min(1).max(50),
32
+ slug: z.string().min(1).max(50).regex(/^[a-z0-9-]+$/).optional(),
33
+ description: z.string().max(200).optional(),
34
+ ownerId: z.string(),
35
+ monthlyBudget: z.number().min(0).optional(),
36
+ dailyBudget: z.number().min(0).optional(),
37
+ });
38
+ const updateTeamSchema = z.object({
39
+ name: z.string().min(1).max(50).optional(),
40
+ description: z.string().max(200).optional(),
41
+ monthlyBudgetUsd: z.number().min(0).optional(),
42
+ dailyBudgetUsd: z.number().min(0).optional(),
43
+ budgetAlertThresholds: z.array(z.number().min(0).max(100)).optional(),
44
+ defaultModel: z.string().optional(),
45
+ preferredProviders: z.array(z.string()).optional(),
46
+ smartRoutingEnabled: z.boolean().optional(),
47
+ });
48
+ const addMemberSchema = z.object({
49
+ userId: z.string(),
50
+ role: z.enum(['admin', 'member', 'viewer']).optional().default('member'),
51
+ });
52
+ const inviteSchema = z.object({
53
+ email: z.string().email(),
54
+ role: z.enum(['admin', 'member', 'viewer']).optional().default('member'),
55
+ invitedBy: z.string(),
56
+ });
57
+ // Routes
58
+ /**
59
+ * GET /api/teams - List teams for a user
60
+ */
61
+ app.get('/', async (c) => {
62
+ const userId = c.req.query('userId');
63
+ if (!userId)
64
+ return c.json({ error: 'userId query param required' }, 400);
65
+ const teams = await listUserTeams(userId);
66
+ return c.json({ success: true, teams, total: teams.length });
67
+ });
68
+ /**
69
+ * POST /api/teams - Create a team
70
+ */
71
+ app.post('/', zValidator('json', createTeamSchema), async (c) => {
72
+ try {
73
+ const body = c.req.valid('json');
74
+ const team = await createTeam(body);
75
+ return c.json({ success: true, team }, 201);
76
+ }
77
+ catch (error) {
78
+ return c.json({ success: false, error: error.message }, 500);
79
+ }
80
+ });
81
+ /**
82
+ * GET /api/teams/:id - Get team details
83
+ */
84
+ app.get('/:id', async (c) => {
85
+ const { id } = c.req.param();
86
+ const team = id.includes('-') ? await getTeam(id) : await getTeamBySlug(id);
87
+ if (!team)
88
+ return c.json({ success: false, error: 'Team not found' }, 404);
89
+ return c.json({ success: true, team });
90
+ });
91
+ /**
92
+ * PATCH /api/teams/:id - Update team settings
93
+ */
94
+ app.patch('/:id', zValidator('json', updateTeamSchema), async (c) => {
95
+ const { id } = c.req.param();
96
+ const body = c.req.valid('json');
97
+ const team = await updateTeam(id, body);
98
+ if (!team)
99
+ return c.json({ success: false, error: 'Team not found' }, 404);
100
+ return c.json({ success: true, team });
101
+ });
102
+ /**
103
+ * DELETE /api/teams/:id - Delete a team
104
+ */
105
+ app.delete('/:id', async (c) => {
106
+ const { id } = c.req.param();
107
+ await deleteTeam(id);
108
+ return c.json({ success: true, deleted: true });
109
+ });
110
+ // Members
111
+ /**
112
+ * GET /api/teams/:id/members - List team members
113
+ */
114
+ app.get('/:id/members', async (c) => {
115
+ const { id } = c.req.param();
116
+ const members = await listMembers(id);
117
+ return c.json({ success: true, members, total: members.length });
118
+ });
119
+ /**
120
+ * POST /api/teams/:id/members - Add a member
121
+ */
122
+ app.post('/:id/members', zValidator('json', addMemberSchema), async (c) => {
123
+ const { id } = c.req.param();
124
+ const body = c.req.valid('json');
125
+ try {
126
+ const member = await addMember(id, body.userId, body.role);
127
+ return c.json({ success: true, member }, 201);
128
+ }
129
+ catch (error) {
130
+ return c.json({ success: false, error: error.message }, 500);
131
+ }
132
+ });
133
+ /**
134
+ * DELETE /api/teams/:id/members/:userId - Remove a member
135
+ */
136
+ app.delete('/:id/members/:userId', async (c) => {
137
+ const { id, userId } = c.req.param();
138
+ await removeMember(id, userId);
139
+ return c.json({ success: true, removed: true });
140
+ });
141
+ /**
142
+ * PATCH /api/teams/:id/members/:userId/role - Change member role
143
+ */
144
+ app.patch('/:id/members/:userId/role', zValidator('json', z.object({
145
+ role: z.enum(['admin', 'member', 'viewer']),
146
+ })), async (c) => {
147
+ const { id, userId } = c.req.param();
148
+ const { role } = c.req.valid('json');
149
+ await updateMemberRole(id, userId, role);
150
+ return c.json({ success: true, role });
151
+ });
152
+ // Budget & Usage
153
+ /**
154
+ * GET /api/teams/:id/usage - Get team usage summary
155
+ */
156
+ app.get('/:id/usage', async (c) => {
157
+ const { id } = c.req.param();
158
+ try {
159
+ const usage = await getTeamUsage(id);
160
+ return c.json({ success: true, usage });
161
+ }
162
+ catch (error) {
163
+ return c.json({ success: false, error: error.message }, 404);
164
+ }
165
+ });
166
+ /**
167
+ * GET /api/teams/:id/budget/check - Check if a member can spend
168
+ */
169
+ app.get('/:id/budget/check', async (c) => {
170
+ const { id } = c.req.param();
171
+ const userId = c.req.query('userId');
172
+ const cost = parseFloat(c.req.query('cost') ?? '0.01');
173
+ if (!userId)
174
+ return c.json({ error: 'userId query param required' }, 400);
175
+ const result = await canMemberSpend(id, userId, cost);
176
+ return c.json({ success: true, ...result });
177
+ });
178
+ // Invites
179
+ /**
180
+ * GET /api/teams/:id/invites - List pending invites
181
+ */
182
+ app.get('/:id/invites', async (c) => {
183
+ const { id } = c.req.param();
184
+ const invites = await listTeamInvites(id);
185
+ return c.json({ success: true, invites, total: invites.length });
186
+ });
187
+ /**
188
+ * POST /api/teams/:id/invites - Create an invite
189
+ */
190
+ app.post('/:id/invites', zValidator('json', inviteSchema), async (c) => {
191
+ const { id } = c.req.param();
192
+ const body = c.req.valid('json');
193
+ const invite = await createInvite(id, body.email, body.role, body.invitedBy);
194
+ return c.json({ success: true, invite }, 201);
195
+ });
196
+ /**
197
+ * POST /api/teams/invites/:inviteId/accept - Accept an invite
198
+ */
199
+ app.post('/invites/:inviteId/accept', zValidator('json', z.object({
200
+ userId: z.string(),
201
+ })), async (c) => {
202
+ const { inviteId } = c.req.param();
203
+ const { userId } = c.req.valid('json');
204
+ const member = await acceptInvite(inviteId, userId);
205
+ if (!member)
206
+ return c.json({ success: false, error: 'Invite not found or expired' }, 404);
207
+ return c.json({ success: true, member });
208
+ });
209
+ export const teamRoutes = app;
210
+ //# sourceMappingURL=teams.js.map