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
@@ -523,6 +523,9 @@ export class JobScheduler {
523
523
  case 'message':
524
524
  result = await this.executeMessageJob(job.payload);
525
525
  break;
526
+ case 'agent_session':
527
+ result = await this.executeAgentSessionJob(job.payload);
528
+ break;
526
529
  default:
527
530
  result = { success: false, error: `Unknown job type: ${job.jobType}`, durationMs: 0 };
528
531
  }
@@ -646,6 +649,7 @@ export class JobScheduler {
646
649
  const delivery = job.delivery;
647
650
  if (!delivery?.channels?.length)
648
651
  return;
652
+ const deliveryResults = [];
649
653
  for (const channel of delivery.channels) {
650
654
  // Check if we should deliver based on result
651
655
  const shouldDeliver = (result.success && channel.onSuccess !== false) ||
@@ -655,7 +659,13 @@ export class JobScheduler {
655
659
  try {
656
660
  switch (channel.type) {
657
661
  case 'slack':
658
- await this.deliverToSlack(channel.target, job, result);
662
+ await this.deliverToChatProvider('slack', channel.target, job, result);
663
+ break;
664
+ case 'telegram':
665
+ await this.deliverToChatProvider('telegram', channel.target, job, result);
666
+ break;
667
+ case 'discord':
668
+ await this.deliverToChatProvider('discord', channel.target, job, result);
659
669
  break;
660
670
  case 'webhook':
661
671
  await this.deliverToWebhook(channel.target, job, result);
@@ -664,21 +674,80 @@ export class JobScheduler {
664
674
  await this.deliverToEmail(channel.target, job, result);
665
675
  break;
666
676
  }
677
+ deliveryResults.push({ channel: `${channel.type}:${channel.target}`, success: true });
667
678
  }
668
679
  catch (error) {
669
- log.error(`Failed to deliver to ${channel.type}:${channel.target}:`, error instanceof Error ? error : new Error(String(error)));
680
+ const errMsg = error instanceof Error ? error.message : String(error);
681
+ log.error(`Failed to deliver to ${channel.type}:${channel.target}:`, error instanceof Error ? error : new Error(errMsg));
682
+ deliveryResults.push({ channel: `${channel.type}:${channel.target}`, success: false, error: errMsg });
670
683
  }
671
684
  }
685
+ if (deliveryResults.length > 0) {
686
+ const succeeded = deliveryResults.filter((d) => d.success).length;
687
+ const failed = deliveryResults.filter((d) => !d.success).length;
688
+ log.info(`Delivery complete: ${succeeded} succeeded, ${failed} failed`, {
689
+ jobId: job.id,
690
+ results: deliveryResults,
691
+ });
692
+ }
672
693
  }
673
694
  /**
674
- * Deliver output to Slack channel
695
+ * Deliver output via a chat provider (Telegram, Slack, Discord, etc.)
696
+ * Uses the chat provider registry for real message delivery.
697
+ *
698
+ * Target format:
699
+ * - Telegram: "<chat_id>" or "<chat_id>:topic:<topic_id>"
700
+ * - Slack: "#channel-name" or "C01234ABCDE"
701
+ * - Discord: "<channel_id>"
675
702
  */
676
- async deliverToSlack(target, job, result) {
677
- // TODO: Implement Slack webhook integration
678
- // For now, log the delivery attempt
679
- log.info(`[Slack Delivery] Job: ${job.name}, Channel: ${target}, Success: ${result.success}`);
680
- // This will be implemented when Slack OAuth is integrated
681
- // Will use the Slack API to post to the channel
703
+ async deliverToChatProvider(providerName, target, job, result) {
704
+ const { getChatRegistry } = await import('../chat/providers/registry.js');
705
+ const registry = getChatRegistry();
706
+ const provider = registry.get(providerName);
707
+ if (!provider) {
708
+ log.warn(`[Delivery] Chat provider "${providerName}" not registered, skipping`);
709
+ return;
710
+ }
711
+ // Parse target for topic support (Telegram: "chatId:topic:topicId")
712
+ let chatId = target;
713
+ let threadId;
714
+ if (providerName === 'telegram' && target.includes(':topic:')) {
715
+ const parts = target.split(':topic:');
716
+ chatId = parts[0];
717
+ threadId = parts[1];
718
+ }
719
+ // Convert markdown to channel-appropriate format
720
+ const { convertMarkdown } = await import('../chat/format/markdown-convert.js');
721
+ const formatTarget = providerName === 'telegram' ? 'telegram'
722
+ : providerName === 'slack' ? 'slack'
723
+ : 'plain';
724
+ const statusIcon = result.success ? '\u2705' : '\u274c';
725
+ const rawBody = result.output
726
+ ? result.output.slice(0, 3800)
727
+ : result.error
728
+ ? `Error: ${result.error}`
729
+ : 'No output';
730
+ // Convert agent markdown output to channel format
731
+ const formattedBody = convertMarkdown(rawBody, formatTarget);
732
+ const header = providerName === 'telegram'
733
+ ? `${statusIcon} <b>${job.name}</b>`
734
+ : `${statusIcon} *${job.name}*`;
735
+ const footer = result.durationMs
736
+ ? providerName === 'telegram'
737
+ ? `\n\n<i>${(result.durationMs / 1000).toFixed(1)}s</i>`
738
+ : `\n\n_${(result.durationMs / 1000).toFixed(1)}s_`
739
+ : '';
740
+ const text = `${header}\n\n${formattedBody}${footer}`;
741
+ const sendResult = await provider.outbound.send({
742
+ provider: providerName,
743
+ to: chatId,
744
+ text,
745
+ threadId,
746
+ });
747
+ if (!sendResult.success) {
748
+ throw new Error(`${providerName} delivery failed: ${sendResult.error}`);
749
+ }
750
+ log.info(`[${providerName}] Delivered to ${target}: ${result.success ? 'success' : 'failure'}`);
682
751
  }
683
752
  /**
684
753
  * Deliver output to a webhook URL
@@ -858,6 +927,69 @@ export class JobScheduler {
858
927
  };
859
928
  }
860
929
  }
930
+ /**
931
+ * Execute an agent session job.
932
+ * Spawns an isolated agent with tool access, runs the prompt, returns the output.
933
+ * This is the core of the automation pipeline - enables "run this prompt every morning".
934
+ */
935
+ async executeAgentSessionJob(payload) {
936
+ const startTime = Date.now();
937
+ const timeout = 300000; // 5 min max per agent session
938
+ try {
939
+ const { executeAgenticChat } = await import('../chat/agentic-executor.js');
940
+ const { createChatToolHandler } = await import('../chat/tool-handler.js');
941
+ const conversationId = `cron-agent-${crypto.randomUUID()}`;
942
+ // Create tool handler with full access (security mode = full for automated jobs)
943
+ const toolHandler = await createChatToolHandler({
944
+ conversationId,
945
+ securityMode: 'full',
946
+ workdir: payload.workdir || process.cwd(),
947
+ });
948
+ // Filter tools if allowedTools specified
949
+ const allTools = toolHandler.getTools();
950
+ const tools = payload.allowedTools?.length
951
+ ? allTools.filter((t) => payload.allowedTools.includes(t.name))
952
+ : allTools;
953
+ const systemPrompt = payload.systemPrompt ||
954
+ 'You are profClaw, an automated AI assistant running a scheduled task. ' +
955
+ 'Execute the user\'s request thoroughly. Use available tools (web_search, web_fetch, etc.) as needed. ' +
956
+ 'Be concise and deliver actionable results. Format output as clean text suitable for messaging.';
957
+ const response = await Promise.race([
958
+ executeAgenticChat({
959
+ conversationId,
960
+ messages: [{
961
+ id: crypto.randomUUID(),
962
+ role: 'user',
963
+ content: payload.prompt,
964
+ timestamp: new Date().toISOString(),
965
+ }],
966
+ systemPrompt,
967
+ model: payload.model,
968
+ provider: payload.provider,
969
+ effort: payload.effort || 'medium',
970
+ toolHandler,
971
+ tools: tools.map((t) => ({
972
+ name: t.name,
973
+ description: t.description,
974
+ parameters: t.parameters,
975
+ })),
976
+ }),
977
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Agent session timed out after 5 minutes')), timeout)),
978
+ ]);
979
+ return {
980
+ success: true,
981
+ output: response.content,
982
+ durationMs: Date.now() - startTime,
983
+ };
984
+ }
985
+ catch (error) {
986
+ return {
987
+ success: false,
988
+ error: error instanceof Error ? error.message : String(error),
989
+ durationMs: Date.now() - startTime,
990
+ };
991
+ }
992
+ }
861
993
  /**
862
994
  * Calculate next run time from cron or interval
863
995
  */
@@ -23,7 +23,7 @@ export interface JobTemplate {
23
23
  createdAt: Date;
24
24
  updatedAt: Date;
25
25
  }
26
- export type TemplateCategory = 'sync' | 'report' | 'cleanup' | 'notification' | 'monitoring' | 'custom';
26
+ export type TemplateCategory = 'sync' | 'report' | 'cleanup' | 'notification' | 'monitoring' | 'automation' | 'custom';
27
27
  export interface CreateTemplateParams {
28
28
  name: string;
29
29
  description?: string;
@@ -218,6 +218,225 @@ export const BUILT_IN_TEMPLATES = [
218
218
  suggestedCron: '0 2 * * *', // Daily at 2 AM
219
219
  isBuiltIn: true,
220
220
  },
221
+ // --- Feed Polling ---
222
+ {
223
+ name: 'Feed Poller',
224
+ description: 'Poll all enabled RSS/Atom feeds for new articles. Runs hourly by default.',
225
+ icon: '📡',
226
+ category: 'sync',
227
+ jobType: 'tool',
228
+ payloadTemplate: {
229
+ tool: 'poll_all_feeds',
230
+ params: {},
231
+ },
232
+ suggestedCron: '0 * * * *', // Every hour
233
+ isBuiltIn: true,
234
+ },
235
+ // --- Automation Templates (agent_session) ---
236
+ {
237
+ name: 'Morning AI News Digest',
238
+ description: 'Search for the latest AI and tech news, summarize the top stories, and deliver to your preferred channel',
239
+ icon: '📰',
240
+ category: 'automation',
241
+ jobType: 'agent_session',
242
+ payloadTemplate: {
243
+ prompt: 'Search for the latest AI and technology news from today. Find the top 5 most important stories. For each story provide: 1) A one-line headline, 2) A 2-3 sentence summary, 3) Why it matters. Format the output cleanly for a messaging app. No markdown headers, use plain text with line breaks.',
244
+ effort: 'medium',
245
+ },
246
+ suggestedCron: '0 7 * * 1-5', // 7 AM weekdays
247
+ defaultDelivery: {
248
+ channels: [
249
+ { type: 'telegram', target: '{{telegramChatId}}', onSuccess: true, onFailure: true },
250
+ ],
251
+ },
252
+ defaultRetryPolicy: {
253
+ enabled: true,
254
+ initialDelayMs: 300000,
255
+ backoffMultiplier: 2,
256
+ maxDelayMs: 1800000,
257
+ maxRetries: 2,
258
+ },
259
+ isBuiltIn: true,
260
+ },
261
+ {
262
+ name: 'Daily Standup Prep',
263
+ description: 'Scan GitHub activity and Linear/Jira tickets to generate a standup-ready summary of what happened yesterday',
264
+ icon: '🧑‍💻',
265
+ category: 'automation',
266
+ jobType: 'agent_session',
267
+ payloadTemplate: {
268
+ prompt: 'Prepare a daily standup summary. Check recent GitHub commits, pull requests, and issue activity. Summarize: 1) What was completed yesterday, 2) What is in progress, 3) Any blockers or items needing attention. Keep it brief and actionable.',
269
+ effort: 'medium',
270
+ },
271
+ suggestedCron: '30 8 * * 1-5', // 8:30 AM weekdays
272
+ defaultDelivery: {
273
+ channels: [
274
+ { type: 'slack', target: '#standup', onSuccess: true },
275
+ ],
276
+ },
277
+ isBuiltIn: true,
278
+ },
279
+ {
280
+ name: 'Weekly Repo Digest',
281
+ description: 'Generate a weekly summary of repository activity including PRs merged, issues closed, and key changes',
282
+ icon: '📊',
283
+ category: 'automation',
284
+ jobType: 'agent_session',
285
+ payloadTemplate: {
286
+ prompt: 'Generate a weekly repository digest. Summarize: 1) Pull requests merged this week, 2) Issues opened and closed, 3) Notable code changes or patterns, 4) Contributors active this week. Format as a clean summary suitable for a team channel.',
287
+ effort: 'medium',
288
+ },
289
+ suggestedCron: '0 17 * * 5', // Friday 5 PM
290
+ defaultDelivery: {
291
+ channels: [
292
+ { type: 'slack', target: '#engineering', onSuccess: true },
293
+ ],
294
+ },
295
+ isBuiltIn: true,
296
+ },
297
+ {
298
+ name: 'Security Advisory Check',
299
+ description: 'Scan for new security advisories and CVEs relevant to your project dependencies',
300
+ icon: '🔒',
301
+ category: 'automation',
302
+ jobType: 'agent_session',
303
+ payloadTemplate: {
304
+ prompt: 'Search for the latest security advisories and CVEs published in the last 24 hours that are relevant to Node.js, TypeScript, and common web dependencies. Focus on critical and high severity issues. For each finding: 1) CVE ID and severity, 2) Affected package/version, 3) One-line description, 4) Recommended action. If nothing critical found, say so briefly.',
305
+ effort: 'medium',
306
+ },
307
+ suggestedCron: '0 9 * * *', // Daily 9 AM
308
+ defaultDelivery: {
309
+ channels: [
310
+ { type: 'slack', target: '#security', onSuccess: true, onFailure: true },
311
+ ],
312
+ },
313
+ isBuiltIn: true,
314
+ },
315
+ {
316
+ name: 'Feed-Powered News Digest',
317
+ description: 'Poll RSS feeds and summarize new articles. Cheaper and more reliable than web search for recurring news digests.',
318
+ icon: '📡',
319
+ category: 'automation',
320
+ jobType: 'agent_session',
321
+ payloadTemplate: {
322
+ prompt: 'Check the RSS feed engine for new articles from the last 24 hours. Summarize the top {{count}} most interesting stories. For each: a one-line headline and a 2-sentence summary. Focus on {{category}} feeds. Format for a messaging app - plain text, no markdown headers.',
323
+ effort: 'low',
324
+ },
325
+ suggestedCron: '0 7 * * *', // Daily 7 AM
326
+ defaultDelivery: {
327
+ channels: [
328
+ { type: 'telegram', target: '{{telegramChatId}}', onSuccess: true },
329
+ ],
330
+ },
331
+ isBuiltIn: true,
332
+ },
333
+ {
334
+ name: 'Custom AI Agent Task',
335
+ description: 'Run any prompt on a schedule with full tool access. The agent can search the web, read files, run commands, and more.',
336
+ icon: '🤖',
337
+ category: 'automation',
338
+ jobType: 'agent_session',
339
+ payloadTemplate: {
340
+ prompt: '{{prompt}}',
341
+ systemPrompt: '{{systemPrompt}}',
342
+ effort: 'medium',
343
+ },
344
+ suggestedCron: '0 9 * * *', // Daily 9 AM
345
+ isBuiltIn: true,
346
+ },
347
+ {
348
+ name: 'Competitor Watch',
349
+ description: 'Monitor competitor activity by searching for recent news, product launches, and announcements',
350
+ icon: '👁️',
351
+ category: 'automation',
352
+ jobType: 'agent_session',
353
+ payloadTemplate: {
354
+ prompt: 'Search for the latest news and announcements from {{competitors}}. Focus on: product launches, pricing changes, major partnerships, and funding rounds from the past week. Summarize the top 3-5 developments with links where possible.',
355
+ effort: 'medium',
356
+ },
357
+ suggestedCron: '0 8 * * 1', // Monday 8 AM
358
+ defaultDelivery: {
359
+ channels: [
360
+ { type: 'telegram', target: '{{telegramChatId}}', onSuccess: true },
361
+ ],
362
+ },
363
+ isBuiltIn: true,
364
+ },
365
+ // --- Feed Digest Templates ---
366
+ {
367
+ name: 'Morning AI News Digest',
368
+ description: 'Poll AI/tech RSS feeds and send a curated digest with summaries',
369
+ icon: '📰',
370
+ category: 'automation',
371
+ jobType: 'tool',
372
+ payloadTemplate: {
373
+ tool: 'feed_digest',
374
+ params: {
375
+ category: 'ai',
376
+ hours: 24,
377
+ limit: 15,
378
+ },
379
+ },
380
+ suggestedCron: '0 7 * * 1-5', // Weekdays 7 AM
381
+ defaultDelivery: {
382
+ channels: [
383
+ { type: 'telegram', target: '{{channel}}', onSuccess: true },
384
+ ],
385
+ },
386
+ isBuiltIn: true,
387
+ },
388
+ {
389
+ name: 'Dev News Digest',
390
+ description: 'Daily developer news from RSS feeds - frameworks, tools, releases',
391
+ icon: '💻',
392
+ category: 'automation',
393
+ jobType: 'tool',
394
+ payloadTemplate: {
395
+ tool: 'feed_digest',
396
+ params: {
397
+ category: 'dev',
398
+ hours: 24,
399
+ limit: 20,
400
+ },
401
+ },
402
+ suggestedCron: '0 8 * * 1-5', // Weekdays 8 AM
403
+ isBuiltIn: true,
404
+ },
405
+ {
406
+ name: 'Security Alert Digest',
407
+ description: 'Security news and vulnerability alerts from RSS feeds',
408
+ icon: '🔒',
409
+ category: 'automation',
410
+ jobType: 'tool',
411
+ payloadTemplate: {
412
+ tool: 'feed_digest',
413
+ params: {
414
+ category: 'security',
415
+ hours: 12,
416
+ limit: 10,
417
+ },
418
+ },
419
+ suggestedCron: '0 9,17 * * *', // Twice daily 9 AM and 5 PM
420
+ isBuiltIn: true,
421
+ },
422
+ {
423
+ name: 'Feed Poll + Digest Pipeline',
424
+ description: 'Poll all feeds for new articles, then generate and deliver a digest',
425
+ icon: '🔄📰',
426
+ category: 'automation',
427
+ jobType: 'agent_session',
428
+ payloadTemplate: {
429
+ prompt: 'First, poll all RSS feeds for new articles using the feed_poll tool. Then use feed_digest to get the latest articles from the last {{hours}} hours. Summarize the top {{limit}} articles into a brief, scannable digest with titles, one-line summaries, and links. Group by category if multiple categories exist.',
430
+ effort: 'low',
431
+ },
432
+ suggestedCron: '0 7 * * *', // Daily 7 AM
433
+ defaultDelivery: {
434
+ channels: [
435
+ { type: 'slack', target: '#news', onSuccess: true },
436
+ ],
437
+ },
438
+ isBuiltIn: true,
439
+ },
221
440
  ];
222
441
  // Template Service
223
442
  export class TemplateService {
@@ -0,0 +1,149 @@
1
+ /**
2
+ * RSS/Atom Feed Engine
3
+ *
4
+ * Fetches, parses, and stores articles from RSS/Atom feeds.
5
+ * Provides deduplication, categorization, and AI summarization integration.
6
+ *
7
+ * Fully dynamic - categories, sources, and bundles can be extended at runtime.
8
+ * No hardcoded limitations on feed types, categories, or article counts.
9
+ *
10
+ * Used by cron jobs to power "morning AI news digest" and similar automations.
11
+ */
12
+ export interface FeedSource {
13
+ id: string;
14
+ name: string;
15
+ url: string;
16
+ /** Free-form category - any string is valid */
17
+ category: string;
18
+ /** Optional tags for fine-grained filtering */
19
+ tags: string[];
20
+ enabled: boolean;
21
+ /** How often to poll (ms). Defaults to 1 hour */
22
+ pollIntervalMs: number;
23
+ lastPolledAt?: Date;
24
+ lastError?: string;
25
+ articleCount: number;
26
+ /** Custom metadata - extensible per feed */
27
+ metadata: Record<string, unknown>;
28
+ userId?: string;
29
+ createdAt: Date;
30
+ updatedAt: Date;
31
+ }
32
+ export interface FeedArticle {
33
+ id: string;
34
+ feedId: string;
35
+ title: string;
36
+ url: string;
37
+ summary?: string;
38
+ content?: string;
39
+ author?: string;
40
+ publishedAt?: Date;
41
+ fetchedAt: Date;
42
+ /** AI-generated summary (populated by digest job) */
43
+ aiSummary?: string;
44
+ /** Whether this article has been included in a digest */
45
+ digestedAt?: Date;
46
+ /** Content hash for deduplication */
47
+ contentHash: string;
48
+ }
49
+ export interface CreateFeedParams {
50
+ name: string;
51
+ url: string;
52
+ category?: string;
53
+ tags?: string[];
54
+ pollIntervalMs?: number;
55
+ metadata?: Record<string, unknown>;
56
+ userId?: string;
57
+ }
58
+ export interface FeedDigest {
59
+ category?: string;
60
+ articles: FeedArticle[];
61
+ fetchedAt: Date;
62
+ }
63
+ export interface FeedBundleEntry {
64
+ name: string;
65
+ url: string;
66
+ category?: string;
67
+ tags?: string[];
68
+ }
69
+ export declare const FEED_BUNDLES: Record<string, FeedBundleEntry[]>;
70
+ /**
71
+ * Register a custom feed bundle at runtime.
72
+ * Agents and users can call this to extend the available bundles.
73
+ */
74
+ export declare function registerFeedBundle(name: string, feeds: FeedBundleEntry[]): void;
75
+ export declare function addFeed(params: CreateFeedParams): Promise<FeedSource>;
76
+ export declare function addFeedBundle(bundleName: string, userId?: string): Promise<FeedSource[]>;
77
+ export declare function listFeeds(filters?: {
78
+ category?: string;
79
+ tag?: string;
80
+ enabled?: boolean;
81
+ userId?: string;
82
+ }): Promise<FeedSource[]>;
83
+ export declare function getFeed(id: string): Promise<FeedSource | null>;
84
+ export declare function updateFeed(id: string, updates: Partial<Pick<CreateFeedParams, 'name' | 'category' | 'tags' | 'pollIntervalMs' | 'metadata'>>): Promise<void>;
85
+ export declare function removeFeed(id: string): Promise<boolean>;
86
+ export declare function toggleFeed(id: string, enabled: boolean): Promise<void>;
87
+ /**
88
+ * Parse an RSS/Atom XML feed into articles.
89
+ * Lightweight regex-based parser - no external dependencies needed.
90
+ */
91
+ export declare function parseFeedXml(xml: string): Array<{
92
+ title: string;
93
+ url: string;
94
+ summary?: string;
95
+ content?: string;
96
+ author?: string;
97
+ publishedAt?: string;
98
+ }>;
99
+ /**
100
+ * Poll a single feed source and store new articles.
101
+ */
102
+ export declare function pollFeed(feedId: string): Promise<{
103
+ newArticles: number;
104
+ errors?: string;
105
+ }>;
106
+ /**
107
+ * Poll all enabled feeds that are due for polling.
108
+ */
109
+ export declare function pollAllFeeds(): Promise<{
110
+ total: number;
111
+ newArticles: number;
112
+ errors: number;
113
+ }>;
114
+ /**
115
+ * Get recent articles for a digest.
116
+ * All filters are optional - the engine imposes no limits by default.
117
+ */
118
+ export declare function getDigestArticles(options?: {
119
+ since?: Date;
120
+ category?: string;
121
+ tag?: string;
122
+ feedId?: string;
123
+ limit?: number;
124
+ undigestedOnly?: boolean;
125
+ }): Promise<FeedArticle[]>;
126
+ /**
127
+ * Mark articles as digested (included in a delivered digest).
128
+ */
129
+ export declare function markAsDigested(articleIds: string[]): Promise<void>;
130
+ /**
131
+ * Get feed statistics.
132
+ */
133
+ export declare function getFeedStats(): Promise<{
134
+ totalFeeds: number;
135
+ enabledFeeds: number;
136
+ totalArticles: number;
137
+ articlesToday: number;
138
+ byCategory: Record<string, number>;
139
+ }>;
140
+ /**
141
+ * List all distinct categories currently in use.
142
+ */
143
+ export declare function listCategories(): Promise<string[]>;
144
+ /**
145
+ * Auto-discover feed URL from a website.
146
+ * Fetches the page and looks for RSS/Atom link tags.
147
+ */
148
+ export declare function discoverFeedUrl(websiteUrl: string): Promise<string | null>;
149
+ //# sourceMappingURL=feed-engine.d.ts.map