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
@@ -0,0 +1,569 @@
1
+ /**
2
+ * Natural Language Cron Parser
3
+ *
4
+ * Converts human-readable scheduling descriptions into cron expressions
5
+ * and structured job parameters. This is the "just tell me what you want"
6
+ * layer that makes profClaw feel autonomous.
7
+ *
8
+ * Examples:
9
+ * "every morning at 8am summarize GitHub notifications"
10
+ * "every friday at 5pm send sprint report to slack"
11
+ * "check server health every 30 minutes"
12
+ * "once a day at midnight clean up old logs"
13
+ * "every weekday at 9am pull RSS feeds and send digest to telegram"
14
+ */
15
+ import { createContextualLogger } from '../utils/logger.js';
16
+ const log = createContextualLogger('NLCron');
17
+ const SCHEDULE_PATTERNS = [
18
+ // MOST SPECIFIC FIRST - order matters since first match wins
19
+ // "every weekday at N" / "weekdays at N" (must be before generic "every...at")
20
+ {
21
+ pattern: /(?:every\s+)?weekday(?:s)?\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
22
+ extract: (m) => {
23
+ const hour = parseHour(m[1], m[3]);
24
+ const min = m[2] ? parseInt(m[2], 10) : 0;
25
+ return {
26
+ cronExpression: `${min} ${hour} * * 1-5`,
27
+ humanReadable: `weekdays at ${formatTime(hour, min)}`,
28
+ };
29
+ },
30
+ },
31
+ // "every monday/tuesday/etc at N" (must be before generic "every...at")
32
+ {
33
+ pattern: /every\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)(?:s)?\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
34
+ extract: (m) => {
35
+ const day = DAY_MAP[m[1].toLowerCase()];
36
+ const hour = parseHour(m[2], m[4]);
37
+ const min = m[3] ? parseInt(m[3], 10) : 0;
38
+ return {
39
+ cronExpression: `${min} ${hour} * * ${day}`,
40
+ humanReadable: `every ${m[1]} at ${formatTime(hour, min)}`,
41
+ };
42
+ },
43
+ },
44
+ // "every fri/mon/etc at N" (shorthand, must be before generic)
45
+ {
46
+ pattern: /every\s+(mon|tue|wed|thu|fri|sat|sun)\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
47
+ extract: (m) => {
48
+ const dayShort = m[1].toLowerCase();
49
+ const dayFull = Object.keys(DAY_MAP).find(d => d.startsWith(dayShort)) ?? dayShort;
50
+ const day = DAY_MAP[dayFull] ?? 1;
51
+ const hour = parseHour(m[2], m[4]);
52
+ const min = m[3] ? parseInt(m[3], 10) : 0;
53
+ return {
54
+ cronExpression: `${min} ${hour} * * ${day}`,
55
+ humanReadable: `every ${dayFull} at ${formatTime(hour, min)}`,
56
+ };
57
+ },
58
+ },
59
+ // "every N minutes/hours"
60
+ {
61
+ pattern: /every\s+(\d+)\s*(min(?:ute)?s?|hrs?|hours?)/i,
62
+ extract: (m) => {
63
+ const n = parseInt(m[1], 10);
64
+ const unit = m[2].toLowerCase();
65
+ if (unit.startsWith('min')) {
66
+ return {
67
+ cronExpression: n < 60 ? `*/${n} * * * *` : undefined,
68
+ intervalMs: n < 60 ? undefined : n * 60 * 1000,
69
+ humanReadable: `every ${n} minute${n > 1 ? 's' : ''}`,
70
+ };
71
+ }
72
+ return {
73
+ cronExpression: `0 */${n} * * *`,
74
+ humanReadable: `every ${n} hour${n > 1 ? 's' : ''}`,
75
+ };
76
+ },
77
+ },
78
+ // "every hour"
79
+ {
80
+ pattern: /every\s+hour\b/i,
81
+ extract: () => ({
82
+ cronExpression: '0 * * * *',
83
+ humanReadable: 'every hour',
84
+ }),
85
+ },
86
+ // "every N seconds" (use interval, not cron)
87
+ {
88
+ pattern: /every\s+(\d+)\s*(?:sec(?:ond)?s?)/i,
89
+ extract: (m) => ({
90
+ intervalMs: parseInt(m[1], 10) * 1000,
91
+ humanReadable: `every ${m[1]} seconds`,
92
+ }),
93
+ },
94
+ // "every morning at N" / "every day at N"
95
+ {
96
+ pattern: /every\s+(?:morning|day)\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
97
+ extract: (m) => {
98
+ const hour = parseHour(m[1], m[3]);
99
+ const min = m[2] ? parseInt(m[2], 10) : 0;
100
+ return {
101
+ cronExpression: `${min} ${hour} * * *`,
102
+ humanReadable: `every day at ${formatTime(hour, min)}`,
103
+ };
104
+ },
105
+ },
106
+ // "daily at N"
107
+ {
108
+ pattern: /daily\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
109
+ extract: (m) => {
110
+ const hour = parseHour(m[1], m[3]);
111
+ const min = m[2] ? parseInt(m[2], 10) : 0;
112
+ return {
113
+ cronExpression: `${min} ${hour} * * *`,
114
+ humanReadable: `daily at ${formatTime(hour, min)}`,
115
+ };
116
+ },
117
+ },
118
+ // "at N am/pm" (implicit daily)
119
+ {
120
+ pattern: /\bat\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)\b/i,
121
+ extract: (m) => {
122
+ const hour = parseHour(m[1], m[3]);
123
+ const min = m[2] ? parseInt(m[2], 10) : 0;
124
+ return {
125
+ cronExpression: `${min} ${hour} * * *`,
126
+ humanReadable: `daily at ${formatTime(hour, min)}`,
127
+ };
128
+ },
129
+ },
130
+ // "once a day at midnight"
131
+ {
132
+ pattern: /once\s+a\s+day\s+(?:at\s+)?midnight/i,
133
+ extract: () => ({
134
+ cronExpression: '0 0 * * *',
135
+ humanReadable: 'daily at midnight',
136
+ }),
137
+ },
138
+ // "once a day at noon"
139
+ {
140
+ pattern: /once\s+a\s+day\s+(?:at\s+)?noon/i,
141
+ extract: () => ({
142
+ cronExpression: '0 12 * * *',
143
+ humanReadable: 'daily at noon',
144
+ }),
145
+ },
146
+ // "every night" / "nightly"
147
+ {
148
+ pattern: /(?:every\s+night|nightly)\s*(?:at\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?)?/i,
149
+ extract: (m) => {
150
+ const hour = m[1] ? parseHour(m[1], m[3]) : 23;
151
+ const min = m[2] ? parseInt(m[2], 10) : 0;
152
+ return {
153
+ cronExpression: `${min} ${hour} * * *`,
154
+ humanReadable: `nightly at ${formatTime(hour, min)}`,
155
+ };
156
+ },
157
+ },
158
+ // "twice a day" / "every 12 hours"
159
+ {
160
+ pattern: /twice\s+a\s+day/i,
161
+ extract: () => ({
162
+ cronExpression: '0 8,20 * * *',
163
+ humanReadable: 'twice a day (8am & 8pm)',
164
+ }),
165
+ },
166
+ // "weekly" / "every week"
167
+ {
168
+ pattern: /(?:every\s+week|weekly)\b/i,
169
+ extract: () => ({
170
+ cronExpression: '0 9 * * 1',
171
+ humanReadable: 'weekly on Monday at 9am',
172
+ }),
173
+ },
174
+ // "monthly" / "every month"
175
+ {
176
+ pattern: /(?:every\s+month|monthly)\b/i,
177
+ extract: () => ({
178
+ cronExpression: '0 9 1 * *',
179
+ humanReadable: 'monthly on the 1st at 9am',
180
+ }),
181
+ },
182
+ // "in N minutes/hours" (one-shot)
183
+ {
184
+ pattern: /\bin\s+(\d+)\s*(min(?:ute)?s?|hrs?|hours?)\b/i,
185
+ extract: (m) => {
186
+ const n = parseInt(m[1], 10);
187
+ const unit = m[2].toLowerCase();
188
+ const ms = unit.startsWith('min') ? n * 60 * 1000 : n * 3600 * 1000;
189
+ return {
190
+ runAt: new Date(Date.now() + ms),
191
+ humanReadable: `in ${n} ${unit.startsWith('min') ? 'minute' : 'hour'}${n > 1 ? 's' : ''}`,
192
+ };
193
+ },
194
+ },
195
+ // "tomorrow at N"
196
+ {
197
+ pattern: /tomorrow\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?/i,
198
+ extract: (m) => {
199
+ const hour = parseHour(m[1], m[3]);
200
+ const min = m[2] ? parseInt(m[2], 10) : 0;
201
+ const tomorrow = new Date();
202
+ tomorrow.setDate(tomorrow.getDate() + 1);
203
+ tomorrow.setHours(hour, min, 0, 0);
204
+ return {
205
+ runAt: tomorrow,
206
+ humanReadable: `tomorrow at ${formatTime(hour, min)}`,
207
+ };
208
+ },
209
+ },
210
+ ];
211
+ const DAY_MAP = {
212
+ sunday: 0, monday: 1, tuesday: 2, wednesday: 3,
213
+ thursday: 4, friday: 5, saturday: 6,
214
+ };
215
+ const INTENT_PATTERNS = [
216
+ // GitHub-related
217
+ {
218
+ pattern: /summarize\s+(?:my\s+)?(?:github|gh)\s+(notifications?|issues?|prs?|pull\s*requests?)/i,
219
+ action: 'github_summary',
220
+ jobType: 'agent_session',
221
+ extractPayload: (m) => ({
222
+ prompt: `Summarize my recent GitHub ${m[1]}. Give a brief overview of what needs my attention.`,
223
+ tool: 'github_pr',
224
+ }),
225
+ },
226
+ {
227
+ pattern: /(?:check|poll|sync)\s+(?:github|gh)\s+(issues?|prs?|notifications?)/i,
228
+ action: 'github_sync',
229
+ jobType: 'tool',
230
+ extractPayload: (m) => ({
231
+ tool: 'github_sync',
232
+ params: { type: m[1].replace(/s$/, '') },
233
+ }),
234
+ },
235
+ // Feed/news digest
236
+ {
237
+ pattern: /(?:pull|fetch|get|check)\s+(?:rss|feeds?|news)\s*(?:and\s+)?(?:send|create)?\s*(?:a?\s*)?(?:digest)?/i,
238
+ action: 'feed_digest',
239
+ jobType: 'tool',
240
+ extractPayload: () => ({
241
+ tool: 'feed_digest',
242
+ params: { hours: 24, limit: 20 },
243
+ }),
244
+ },
245
+ {
246
+ pattern: /(?:news|feed)\s+digest/i,
247
+ action: 'feed_digest',
248
+ jobType: 'tool',
249
+ extractPayload: () => ({
250
+ tool: 'feed_digest',
251
+ params: { hours: 24, limit: 20 },
252
+ }),
253
+ },
254
+ // Reports
255
+ {
256
+ pattern: /(?:send|generate|create)\s+(?:a\s+)?(?:daily\s+)?(?:status|standup|report|summary)\s*(?:report)?/i,
257
+ action: 'daily_report',
258
+ jobType: 'tool',
259
+ extractPayload: () => ({
260
+ tool: 'generate_report',
261
+ params: { type: 'daily_status', includeMetrics: true, format: 'markdown' },
262
+ }),
263
+ },
264
+ {
265
+ pattern: /(?:sprint|weekly)\s+(?:report|summary|review)/i,
266
+ action: 'sprint_report',
267
+ jobType: 'tool',
268
+ extractPayload: () => ({
269
+ tool: 'generate_report',
270
+ params: { type: 'sprint_summary', includeVelocity: true },
271
+ }),
272
+ },
273
+ // Health/monitoring
274
+ {
275
+ pattern: /(?:check|monitor)\s+(?:server|system|health|service|api)\s*(?:health|status)?/i,
276
+ action: 'health_check',
277
+ jobType: 'tool',
278
+ extractPayload: () => ({
279
+ tool: 'healthcheck',
280
+ params: {},
281
+ }),
282
+ },
283
+ // Cleanup/maintenance
284
+ {
285
+ pattern: /(?:clean\s*up|archive|prune|delete)\s+(?:old\s+)?(?:logs?|tickets?|data|files?|history)/i,
286
+ action: 'cleanup',
287
+ jobType: 'tool',
288
+ extractPayload: (m) => ({
289
+ tool: 'db_maintenance',
290
+ params: { action: 'prune', target: m[0] },
291
+ }),
292
+ },
293
+ // Backup
294
+ {
295
+ pattern: /(?:backup|export|snapshot)\s+(?:the\s+)?(?:database|db|data|config)/i,
296
+ action: 'backup',
297
+ jobType: 'tool',
298
+ extractPayload: () => ({
299
+ tool: 'db_maintenance',
300
+ params: { action: 'backup' },
301
+ }),
302
+ },
303
+ // Generic "run this prompt" (catch-all for agent_session)
304
+ {
305
+ pattern: /(?:run|execute|do|perform)\s+"([^"]+)"/i,
306
+ action: 'custom_prompt',
307
+ jobType: 'agent_session',
308
+ extractPayload: (m) => ({
309
+ prompt: m[1],
310
+ }),
311
+ },
312
+ ];
313
+ const DELIVERY_PATTERNS = [
314
+ // "to slack #channel" or "to slack channel-name"
315
+ {
316
+ pattern: /(?:to|via|on)\s+slack\s+(?:#)?(\S+)/i,
317
+ channel: 'slack',
318
+ extractTarget: (m) => `#${m[1].replace(/^#/, '')}`,
319
+ },
320
+ // "to #channel on slack"
321
+ {
322
+ pattern: /(?:to|via|on)\s+#(\S+)\s+(?:on\s+)?slack/i,
323
+ channel: 'slack',
324
+ extractTarget: (m) => `#${m[1]}`,
325
+ },
326
+ // "to slack" (no channel)
327
+ {
328
+ pattern: /(?:to|via|on)\s+slack\b/i,
329
+ channel: 'slack',
330
+ extractTarget: () => '#general',
331
+ },
332
+ {
333
+ pattern: /(?:to|via|on)\s+telegram/i,
334
+ channel: 'telegram',
335
+ extractTarget: () => 'default',
336
+ },
337
+ {
338
+ pattern: /(?:to|via|on)\s+discord(?:\s+(?:#)?(\S+))?/i,
339
+ channel: 'discord',
340
+ extractTarget: (m) => m[1] ?? 'general',
341
+ },
342
+ {
343
+ pattern: /(?:email|mail)\s+(?:to\s+)?(\S+@\S+)/i,
344
+ channel: 'email',
345
+ extractTarget: (m) => m[1],
346
+ },
347
+ {
348
+ pattern: /(?:to|via)\s+(?:webhook|hook)\s+(\S+)/i,
349
+ channel: 'webhook',
350
+ extractTarget: (m) => m[1],
351
+ },
352
+ ];
353
+ // Core Parser
354
+ /**
355
+ * Parse a natural language automation request into structured job params.
356
+ */
357
+ export function parseNaturalLanguage(input) {
358
+ const trimmed = input.trim();
359
+ if (trimmed.length < 5) {
360
+ return { success: false, rawInput: input, error: 'Input too short to parse' };
361
+ }
362
+ // 1. Extract schedule
363
+ const schedule = parseSchedule(trimmed);
364
+ // 2. Extract intent (what to do)
365
+ const intent = parseIntent(trimmed);
366
+ // 3. Extract delivery channel
367
+ const delivery = parseDelivery(trimmed);
368
+ // Need at least a schedule or intent
369
+ if (!schedule && !intent) {
370
+ return {
371
+ success: false,
372
+ rawInput: input,
373
+ error: 'Could not understand the schedule or action. Try something like: "every morning at 8am summarize GitHub notifications"',
374
+ };
375
+ }
376
+ // Build job params
377
+ const jobName = intent
378
+ ? `${intent.action.replace(/_/g, ' ')}${schedule ? ` (${schedule.humanReadable})` : ''}`
379
+ : `Scheduled task (${schedule?.humanReadable ?? 'custom'})`;
380
+ const jobParams = {
381
+ name: jobName,
382
+ description: `Auto-created from: "${trimmed.length > 100 ? trimmed.slice(0, 97) + '...' : trimmed}"`,
383
+ cronExpression: schedule?.cronExpression,
384
+ intervalMs: schedule?.intervalMs,
385
+ runAt: schedule?.runAt,
386
+ timezone: schedule?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone,
387
+ jobType: intent?.details['jobType'] ?? 'agent_session',
388
+ payload: intent?.details ?? { prompt: trimmed },
389
+ labels: ['natural-language', intent?.action ?? 'custom'],
390
+ createdBy: 'human',
391
+ };
392
+ // Add delivery if detected
393
+ if (delivery) {
394
+ jobParams.delivery = {
395
+ channels: [{
396
+ type: delivery.channel,
397
+ target: delivery.target,
398
+ onSuccess: true,
399
+ onFailure: true,
400
+ }],
401
+ };
402
+ }
403
+ // If no explicit schedule but has intent, default to daily 9am
404
+ if (!schedule && intent) {
405
+ jobParams.cronExpression = '0 9 * * *';
406
+ }
407
+ log.info('Parsed natural language automation', {
408
+ input: trimmed.slice(0, 80),
409
+ schedule: schedule?.humanReadable,
410
+ intent: intent?.action,
411
+ delivery: delivery?.channel,
412
+ confidence: schedule?.confidence,
413
+ });
414
+ return {
415
+ success: true,
416
+ schedule: schedule ?? undefined,
417
+ intent: intent ?? undefined,
418
+ delivery: delivery ?? undefined,
419
+ jobParams,
420
+ rawInput: input,
421
+ };
422
+ }
423
+ /**
424
+ * Parse schedule from natural language.
425
+ */
426
+ function parseSchedule(input) {
427
+ for (const sp of SCHEDULE_PATTERNS) {
428
+ const match = input.match(sp.pattern);
429
+ if (match) {
430
+ const extracted = sp.extract(match);
431
+ return {
432
+ cronExpression: extracted.cronExpression,
433
+ intervalMs: extracted.intervalMs,
434
+ runAt: extracted.runAt,
435
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
436
+ confidence: 0.85,
437
+ humanReadable: extracted.humanReadable ?? 'custom schedule',
438
+ };
439
+ }
440
+ }
441
+ return null;
442
+ }
443
+ /**
444
+ * Parse action intent from natural language.
445
+ */
446
+ function parseIntent(input) {
447
+ for (const ip of INTENT_PATTERNS) {
448
+ const match = input.match(ip.pattern);
449
+ if (match) {
450
+ const payload = ip.extractPayload(match, input);
451
+ return {
452
+ action: ip.action,
453
+ target: match[1],
454
+ details: {
455
+ jobType: ip.jobType,
456
+ ...Object.fromEntries(Object.entries(payload).map(([k, v]) => [k, typeof v === 'string' ? v : JSON.stringify(v)])),
457
+ },
458
+ };
459
+ }
460
+ }
461
+ // Fallback: treat entire input as a prompt for agent_session
462
+ return {
463
+ action: 'custom_prompt',
464
+ details: {
465
+ jobType: 'agent_session',
466
+ prompt: input
467
+ .replace(/\b(every|daily|weekly|monthly|at\s+\d+(?::\d+)?\s*(?:am|pm)?|in\s+\d+\s*\w+)\b/gi, '')
468
+ .replace(/\s+/g, ' ')
469
+ .trim(),
470
+ },
471
+ };
472
+ }
473
+ /**
474
+ * Parse delivery channel from natural language.
475
+ */
476
+ function parseDelivery(input) {
477
+ for (const dp of DELIVERY_PATTERNS) {
478
+ const match = input.match(dp.pattern);
479
+ if (match) {
480
+ return {
481
+ channel: dp.channel,
482
+ target: dp.extractTarget(match),
483
+ };
484
+ }
485
+ }
486
+ return null;
487
+ }
488
+ // Helpers
489
+ function parseHour(hourStr, ampm) {
490
+ let hour = parseInt(hourStr, 10);
491
+ if (ampm) {
492
+ const isPm = ampm.toLowerCase() === 'pm';
493
+ if (isPm && hour !== 12)
494
+ hour += 12;
495
+ if (!isPm && hour === 12)
496
+ hour = 0;
497
+ }
498
+ return Math.max(0, Math.min(23, hour));
499
+ }
500
+ function formatTime(hour, minute) {
501
+ const h = hour % 12 || 12;
502
+ const ampm = hour < 12 ? 'am' : 'pm';
503
+ const m = minute > 0 ? `:${String(minute).padStart(2, '0')}` : '';
504
+ return `${h}${m}${ampm}`;
505
+ }
506
+ /**
507
+ * Validate a cron expression (basic check).
508
+ */
509
+ export function isValidCron(expression) {
510
+ const parts = expression.trim().split(/\s+/);
511
+ if (parts.length !== 5)
512
+ return false;
513
+ const ranges = [
514
+ [0, 59], // minute
515
+ [0, 23], // hour
516
+ [1, 31], // day of month
517
+ [1, 12], // month
518
+ [0, 7], // day of week (0 and 7 = Sunday)
519
+ ];
520
+ return parts.every((part, i) => {
521
+ if (part === '*')
522
+ return true;
523
+ if (/^\*\/\d+$/.test(part))
524
+ return true;
525
+ if (/^\d+-\d+$/.test(part))
526
+ return true;
527
+ if (/^[\d,]+$/.test(part)) {
528
+ return part.split(',').every(n => {
529
+ const num = parseInt(n, 10);
530
+ return num >= ranges[i][0] && num <= ranges[i][1];
531
+ });
532
+ }
533
+ return false;
534
+ });
535
+ }
536
+ /**
537
+ * Convert a cron expression to a human-readable string.
538
+ */
539
+ export function cronToHuman(expression) {
540
+ const parts = expression.trim().split(/\s+/);
541
+ if (parts.length !== 5)
542
+ return expression;
543
+ const [min, hour, dom, month, dow] = parts;
544
+ // Common patterns
545
+ if (min === '*' && hour === '*')
546
+ return 'every minute';
547
+ if (min.startsWith('*/') && hour === '*')
548
+ return `every ${min.slice(2)} minutes`;
549
+ if (min === '0' && hour.startsWith('*/'))
550
+ return `every ${hour.slice(2)} hours`;
551
+ if (min === '0' && hour === '*')
552
+ return 'every hour';
553
+ const timeStr = hour !== '*' && min !== '*'
554
+ ? formatTime(parseInt(hour, 10), parseInt(min, 10))
555
+ : '';
556
+ if (dow === '1-5' && timeStr)
557
+ return `weekdays at ${timeStr}`;
558
+ if (dow !== '*' && timeStr) {
559
+ const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
560
+ const days = dow.split(',').map(d => dayNames[parseInt(d, 10)] ?? d).join(', ');
561
+ return `${days} at ${timeStr}`;
562
+ }
563
+ if (dom === '1' && month === '*' && timeStr)
564
+ return `monthly on the 1st at ${timeStr}`;
565
+ if (timeStr)
566
+ return `daily at ${timeStr}`;
567
+ return expression;
568
+ }
569
+ //# sourceMappingURL=natural-language.js.map
@@ -13,11 +13,11 @@
13
13
  * - Script execution
14
14
  * - Message sending
15
15
  */
16
- export type JobType = 'http' | 'tool' | 'script' | 'message';
16
+ export type JobType = 'http' | 'tool' | 'script' | 'message' | 'agent_session';
17
17
  export type JobStatus = 'active' | 'paused' | 'completed' | 'failed' | 'archived';
18
18
  export type RunStatus = 'running' | 'success' | 'error' | 'timeout' | 'cancelled';
19
19
  export type EventTriggerType = 'webhook' | 'ticket' | 'file' | 'github';
20
- export type DeliveryChannelType = 'slack' | 'webhook' | 'email';
20
+ export type DeliveryChannelType = 'slack' | 'webhook' | 'email' | 'telegram' | 'discord';
21
21
  /** Event trigger configuration */
22
22
  export interface EventTrigger {
23
23
  type: EventTriggerType;
@@ -130,6 +130,24 @@ export interface MessageJobPayload {
130
130
  conversationId: string;
131
131
  content: string;
132
132
  }
133
+ export interface AgentSessionPayload {
134
+ /** The prompt/instruction for the agent to execute */
135
+ prompt: string;
136
+ /** System prompt override (defaults to a general assistant prompt) */
137
+ systemPrompt?: string;
138
+ /** AI model to use (defaults to configured default) */
139
+ model?: string;
140
+ /** AI provider override */
141
+ provider?: string;
142
+ /** Max tokens the agent can consume per run */
143
+ maxTokens?: number;
144
+ /** Which tools the agent can access (empty = all registered tools) */
145
+ allowedTools?: string[];
146
+ /** Thinking effort: low for fast chores, high for deep research */
147
+ effort?: 'low' | 'medium' | 'high';
148
+ /** Working directory for tool execution */
149
+ workdir?: string;
150
+ }
133
151
  export declare function getScheduler(): JobScheduler;
134
152
  export declare class JobScheduler {
135
153
  private queue;
@@ -241,9 +259,15 @@ export declare class JobScheduler {
241
259
  */
242
260
  private deliverOutput;
243
261
  /**
244
- * Deliver output to Slack channel
262
+ * Deliver output via a chat provider (Telegram, Slack, Discord, etc.)
263
+ * Uses the chat provider registry for real message delivery.
264
+ *
265
+ * Target format:
266
+ * - Telegram: "<chat_id>" or "<chat_id>:topic:<topic_id>"
267
+ * - Slack: "#channel-name" or "C01234ABCDE"
268
+ * - Discord: "<channel_id>"
245
269
  */
246
- private deliverToSlack;
270
+ private deliverToChatProvider;
247
271
  /**
248
272
  * Deliver output to a webhook URL
249
273
  */
@@ -269,6 +293,12 @@ export declare class JobScheduler {
269
293
  * Execute a message job
270
294
  */
271
295
  private executeMessageJob;
296
+ /**
297
+ * Execute an agent session job.
298
+ * Spawns an isolated agent with tool access, runs the prompt, returns the output.
299
+ * This is the core of the automation pipeline - enables "run this prompt every morning".
300
+ */
301
+ private executeAgentSessionJob;
272
302
  /**
273
303
  * Calculate next run time from cron or interval
274
304
  */