profclaw 2.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -9,6 +9,7 @@ import { zValidator } from '@hono/zod-validator';
9
9
  import { z } from 'zod';
10
10
  import { createScheduledJob, getScheduledJob, listScheduledJobs, updateScheduledJob, pauseScheduledJob, resumeScheduledJob, deleteScheduledJob, archiveScheduledJob, restoreScheduledJob, triggerScheduledJob, getJobRunHistory, getScheduler, } from '../cron/scheduler.js';
11
11
  import { listJobTemplates, getJobTemplate, createJobTemplate, deleteJobTemplate, applyJobTemplate, initBuiltInTemplates, } from '../cron/templates.js';
12
+ import { parseNaturalLanguage, cronToHuman } from '../cron/natural-language.js';
12
13
  import { createContextualLogger } from '../utils/logger.js';
13
14
  const log = createContextualLogger('CronRoutes');
14
15
  const app = new Hono();
@@ -34,7 +35,7 @@ app.use('*', async (_c, next) => {
34
35
  });
35
36
  // Schemas
36
37
  const deliveryChannelSchema = z.object({
37
- type: z.enum(['slack', 'webhook', 'email']),
38
+ type: z.enum(['slack', 'webhook', 'email', 'telegram', 'discord']),
38
39
  target: z.string(),
39
40
  onSuccess: z.boolean().optional(),
40
41
  onFailure: z.boolean().optional(),
@@ -64,7 +65,7 @@ const createJobSchema = z.object({
64
65
  // Event trigger (alternative to schedule)
65
66
  eventTrigger: eventTriggerSchema.optional(),
66
67
  // Execution
67
- jobType: z.enum(['http', 'tool', 'script', 'message']),
68
+ jobType: z.enum(['http', 'tool', 'script', 'message', 'agent_session']),
68
69
  payload: z.record(z.any()),
69
70
  templateId: z.string().optional(),
70
71
  // Delivery
@@ -98,7 +99,7 @@ const updateJobSchema = z.object({
98
99
  });
99
100
  const listQuerySchema = z.object({
100
101
  status: z.enum(['active', 'paused', 'completed', 'failed', 'archived']).optional(),
101
- jobType: z.enum(['http', 'tool', 'script', 'message']).optional(),
102
+ jobType: z.enum(['http', 'tool', 'script', 'message', 'agent_session']).optional(),
102
103
  projectId: z.string().optional(),
103
104
  userId: z.string().optional(),
104
105
  limit: z.coerce.number().min(1).max(100).optional().default(50),
@@ -107,8 +108,8 @@ const createTemplateSchema = z.object({
107
108
  name: z.string().min(1).max(100),
108
109
  description: z.string().max(500).optional(),
109
110
  icon: z.string().max(10).optional(),
110
- category: z.enum(['sync', 'report', 'cleanup', 'notification', 'monitoring', 'custom']).optional(),
111
- jobType: z.enum(['http', 'tool', 'script', 'message']),
111
+ category: z.enum(['sync', 'report', 'cleanup', 'notification', 'monitoring', 'automation', 'custom']).optional(),
112
+ jobType: z.enum(['http', 'tool', 'script', 'message', 'agent_session']),
112
113
  payloadTemplate: z.record(z.any()),
113
114
  suggestedCron: z.string().optional(),
114
115
  suggestedIntervalMs: z.number().min(1000).optional(),
@@ -166,6 +167,79 @@ app.get('/jobs', zValidator('query', listQuerySchema), async (c) => {
166
167
  }, 500);
167
168
  }
168
169
  });
170
+ /**
171
+ * POST /api/cron/automate - Create a job from natural language
172
+ *
173
+ * Example: { "input": "every morning at 8am summarize my GitHub notifications and send to telegram" }
174
+ *
175
+ * Returns the parsed schedule, intent, and delivery - then creates the job.
176
+ * Use ?dryRun=true to preview without creating.
177
+ */
178
+ app.post('/automate', zValidator('json', z.object({
179
+ input: z.string().min(5).max(500),
180
+ })), async (c) => {
181
+ try {
182
+ const { input } = c.req.valid('json');
183
+ const dryRun = c.req.query('dryRun') === 'true';
184
+ const result = parseNaturalLanguage(input);
185
+ if (!result.success || !result.jobParams) {
186
+ return c.json({
187
+ success: false,
188
+ error: result.error ?? 'Could not understand the request',
189
+ parsed: {
190
+ schedule: result.schedule,
191
+ intent: result.intent,
192
+ delivery: result.delivery,
193
+ },
194
+ hint: 'Try: "every morning at 8am summarize GitHub notifications and send to telegram"',
195
+ }, 400);
196
+ }
197
+ // Dry run: return what would be created
198
+ if (dryRun) {
199
+ return c.json({
200
+ success: true,
201
+ dryRun: true,
202
+ parsed: {
203
+ schedule: result.schedule,
204
+ intent: result.intent,
205
+ delivery: result.delivery,
206
+ humanReadable: result.schedule?.humanReadable,
207
+ cronExpression: result.jobParams.cronExpression,
208
+ cronExplained: result.jobParams.cronExpression
209
+ ? cronToHuman(result.jobParams.cronExpression)
210
+ : undefined,
211
+ },
212
+ jobParams: result.jobParams,
213
+ message: `Would create: "${result.jobParams.name}" running ${result.schedule?.humanReadable ?? 'on schedule'}`,
214
+ });
215
+ }
216
+ // Create the job
217
+ const job = await createScheduledJob(result.jobParams);
218
+ log.info(`Created job from natural language: ${job.name} (${job.id})`, {
219
+ input: input.slice(0, 80),
220
+ cron: result.jobParams.cronExpression,
221
+ schedule: result.schedule?.humanReadable,
222
+ });
223
+ return c.json({
224
+ success: true,
225
+ job,
226
+ parsed: {
227
+ schedule: result.schedule?.humanReadable,
228
+ cronExpression: result.jobParams.cronExpression,
229
+ intent: result.intent?.action,
230
+ delivery: result.delivery?.channel,
231
+ },
232
+ message: `Created "${job.name}" - ${result.schedule?.humanReadable ?? 'scheduled'}`,
233
+ }, 201);
234
+ }
235
+ catch (error) {
236
+ log.error('Failed to create job from natural language:', error instanceof Error ? error : new Error(String(error)));
237
+ return c.json({
238
+ success: false,
239
+ error: error instanceof Error ? error.message : 'Failed to create automation',
240
+ }, 500);
241
+ }
242
+ });
169
243
  /**
170
244
  * POST /api/cron/jobs - Create a scheduled job
171
245
  * Supports: cron, interval, one-shot (runAt), or event-triggered
@@ -534,6 +608,7 @@ app.get('/stats', async (c) => {
534
608
  tool: activeJobs.filter((j) => j.jobType === 'tool').length,
535
609
  script: activeJobs.filter((j) => j.jobType === 'script').length,
536
610
  message: activeJobs.filter((j) => j.jobType === 'message').length,
611
+ agent_session: activeJobs.filter((j) => j.jobType === 'agent_session').length,
537
612
  },
538
613
  byScheduleType: {
539
614
  cron: activeJobs.filter((j) => j.cronExpression).length,
@@ -0,0 +1,10 @@
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
+ declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
9
+ export default app;
10
+ //# sourceMappingURL=feeds.d.ts.map
@@ -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