@desplega.ai/agent-swarm 1.49.0 → 1.52.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 (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. package/tsconfig.json +0 -37
@@ -1,565 +0,0 @@
1
- ---
2
- date: 2026-01-15
3
- author: Claude
4
- status: ready
5
- tags: [scheduling, cron, sqlite, task-automation, implementation]
6
- related_research: thoughts/shared/research/2026-01-15-scheduled-tasks.md
7
- ---
8
-
9
- # Scheduled Tasks Feature - Implementation Plan
10
-
11
- **Date**: 2026-01-15
12
- **Status**: Ready for Implementation
13
-
14
- ## Overview
15
-
16
- Implement a native SQLite-based scheduled tasks feature for the agent-swarm. This allows defining recurring tasks (via cron expressions or intervals) that automatically create agent tasks at specified times. The scheduler follows existing architectural patterns (SQLite persistence, interval-based polling) and integrates seamlessly with the existing task system.
17
-
18
- ## Current State Analysis
19
-
20
- The agent-swarm currently supports:
21
- - **Task creation**: via `createTaskExtended()` in `src/be/db.ts`
22
- - **Task pool**: unassigned tasks workers can claim
23
- - **Interval polling**: pattern established in `src/slack/watcher.ts`
24
- - **MCP tools**: registered via capability-gated `createToolRegistrar` pattern
25
- - **Graceful shutdown**: SIGINT handler in `src/http.ts`
26
-
27
- ### Key Discoveries:
28
- - Database uses SQLite with WAL mode, singleton pattern (`src/be/db.ts`)
29
- - Schema created in transaction
30
- - Migrations use try-catch for ALTER TABLE
31
- - Slack watcher demonstrates polling pattern with throttling and optimistic locking (`src/slack/watcher.ts`)
32
- - Tools registered via `createToolRegistrar` with Zod schemas (`src/tools/utils.ts`)
33
-
34
- ## Desired End State
35
-
36
- A fully functional scheduler that:
37
- 1. Stores schedule definitions in SQLite (`scheduled_tasks` table)
38
- 2. Polls for due schedules every 10 seconds (configurable)
39
- 3. Creates tasks via existing `createTaskExtended` when schedules are due
40
- 4. Provides 5 MCP tools for schedule management
41
- 5. Starts on server startup and stops gracefully on shutdown
42
- 6. Supports both cron expressions and interval-based scheduling
43
-
44
- ## Quick Verification Reference
45
-
46
- Common commands to verify the implementation:
47
- - `bun run lint` - Linting
48
- - `bun run typecheck` - Type checking
49
- - `bun test` - Run tests (if available)
50
- - `bun run build` - Build
51
-
52
- Key files to check:
53
- - `src/be/db.ts` - Schema and database functions
54
- - `src/scheduler/scheduler.ts` - Core scheduler service
55
- - `src/tools/schedules/*.ts` - MCP tools
56
- - `src/http.ts` - Server startup/shutdown integration
57
-
58
- ## What We're NOT Doing
59
-
60
- - **Catch-up execution**: Missed schedules during downtime will be skipped (user requirement)
61
- - **Concurrency limits**: No limit on concurrent scheduled task instances (user requirement)
62
- - **Task dependencies**: Scheduled tasks won't depend on other tasks (user requirement)
63
- - **Notifications**: No automatic Slack/GitHub notifications (each task defines its own connections)
64
- - **Horizontal scaling**: Single-instance scheduler (can be added later with leader election)
65
- - **UI dashboard**: No frontend changes in this phase
66
-
67
- ## Implementation Approach
68
-
69
- Follow existing patterns:
70
- 1. Add `scheduled_tasks` table schema in `db.ts`
71
- 2. Create scheduler service following `slack/watcher.ts` pattern
72
- 3. Register MCP tools following existing tool patterns
73
- 4. Integrate startup/shutdown in `http.ts`
74
-
75
- ---
76
-
77
- ## Phase 1: Database Schema & Core Types
78
-
79
- ### Overview
80
- Add the `scheduled_tasks` table schema and TypeScript types.
81
-
82
- ### Changes Required:
83
-
84
- #### 1. Schema Definition
85
- **File**: `src/be/db.ts`
86
- **Location**: After existing table definitions (~line 190, before indexes)
87
-
88
- **Add table creation:**
89
- ```sql
90
- CREATE TABLE IF NOT EXISTS scheduled_tasks (
91
- id TEXT PRIMARY KEY,
92
- name TEXT NOT NULL UNIQUE,
93
- description TEXT,
94
- cronExpression TEXT,
95
- intervalMs INTEGER,
96
- taskTemplate TEXT NOT NULL,
97
- taskType TEXT,
98
- tags TEXT DEFAULT '[]',
99
- priority INTEGER DEFAULT 50,
100
- targetAgentId TEXT,
101
- enabled INTEGER DEFAULT 1,
102
- lastRunAt TEXT,
103
- nextRunAt TEXT,
104
- createdByAgentId TEXT,
105
- timezone TEXT DEFAULT 'UTC',
106
- createdAt TEXT NOT NULL,
107
- lastUpdatedAt TEXT NOT NULL,
108
- CHECK (cronExpression IS NOT NULL OR intervalMs IS NOT NULL)
109
- )
110
- ```
111
-
112
- **Add indexes:**
113
- ```sql
114
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_enabled ON scheduled_tasks(enabled);
115
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_nextRunAt ON scheduled_tasks(nextRunAt);
116
- ```
117
-
118
- #### 2. Type Definitions
119
- **File**: `src/types.ts`
120
- **Location**: After AgentTask definitions
121
-
122
- **Add new types:**
123
- ```typescript
124
- export const ScheduledTaskSchema = z.object({
125
- id: z.uuid(),
126
- name: z.string().min(1).max(100),
127
- description: z.string().optional(),
128
- cronExpression: z.string().optional(),
129
- intervalMs: z.number().int().positive().optional(),
130
- taskTemplate: z.string().min(1),
131
- taskType: z.string().max(50).optional(),
132
- tags: z.array(z.string()).default([]),
133
- priority: z.number().int().min(0).max(100).default(50),
134
- targetAgentId: z.uuid().optional(),
135
- enabled: z.boolean().default(true),
136
- lastRunAt: z.iso.datetime().optional(),
137
- nextRunAt: z.iso.datetime().optional(),
138
- createdByAgentId: z.uuid().optional(),
139
- timezone: z.string().default('UTC'),
140
- createdAt: z.iso.datetime(),
141
- lastUpdatedAt: z.iso.datetime(),
142
- }).refine(
143
- data => data.cronExpression || data.intervalMs,
144
- { message: "Either cronExpression or intervalMs must be provided" }
145
- );
146
-
147
- export type ScheduledTask = z.infer<typeof ScheduledTaskSchema>;
148
- ```
149
-
150
- #### 3. Database Helper Functions
151
- **File**: `src/be/db.ts`
152
- **Location**: After existing task functions
153
-
154
- **Add CRUD functions:**
155
- - `getScheduledTasks(filters?)` - List schedules with optional filters
156
- - `getScheduledTaskById(id)` - Get single schedule
157
- - `getScheduledTaskByName(name)` - Get by unique name
158
- - `createScheduledTask(data)` - Create new schedule
159
- - `updateScheduledTask(id, data)` - Update existing schedule
160
- - `deleteScheduledTask(id)` - Delete schedule
161
- - `getDueScheduledTasks()` - Query `enabled=1 AND nextRunAt <= now`
162
-
163
- ### Success Criteria:
164
-
165
- #### Automated Verification:
166
- - [ ] `bun run typecheck` passes
167
- - [ ] `bun run lint` passes
168
-
169
- #### Manual Verification:
170
- - [ ] Database initializes without errors
171
- - [ ] Can query `scheduled_tasks` table via SQLite CLI
172
-
173
- **Implementation Note**: After completing this phase, verify schema is created correctly before proceeding.
174
-
175
- ---
176
-
177
- ## Phase 2: Scheduler Service
178
-
179
- ### Overview
180
- Create the core scheduler service that polls for due schedules and creates tasks.
181
-
182
- ### Changes Required:
183
-
184
- #### 1. Install cron-parser Package
185
- **Command**: `bun add cron-parser`
186
-
187
- #### 2. Create Scheduler Service
188
- **File**: `src/scheduler/scheduler.ts` (new file)
189
-
190
- **Implementation following slack/watcher.ts pattern:**
191
-
192
- ```typescript
193
- import { parseExpression } from 'cron-parser';
194
- import { getDb, createTaskExtended, getDueScheduledTasks, updateScheduledTask } from '../be/db';
195
- import type { ScheduledTask } from '../types';
196
-
197
- let schedulerInterval: ReturnType<typeof setInterval> | null = null;
198
- let isProcessing = false;
199
-
200
- // Calculate next run time based on cron or interval
201
- export function calculateNextRun(schedule: ScheduledTask, fromTime: Date = new Date()): string {
202
- if (schedule.cronExpression) {
203
- const interval = parseExpression(schedule.cronExpression, {
204
- currentDate: fromTime,
205
- tz: schedule.timezone || 'UTC',
206
- });
207
- return interval.next().toISOString();
208
- }
209
-
210
- if (schedule.intervalMs) {
211
- return new Date(fromTime.getTime() + schedule.intervalMs).toISOString();
212
- }
213
-
214
- throw new Error('Schedule must have cronExpression or intervalMs');
215
- }
216
-
217
- // Execute a single scheduled task
218
- async function executeSchedule(schedule: ScheduledTask): Promise<void> {
219
- const now = new Date().toISOString();
220
-
221
- // Create the actual task
222
- createTaskExtended(schedule.taskTemplate, {
223
- creatorAgentId: schedule.createdByAgentId,
224
- taskType: schedule.taskType,
225
- tags: [...schedule.tags, 'scheduled', `schedule:${schedule.name}`],
226
- priority: schedule.priority,
227
- agentId: schedule.targetAgentId, // null goes to pool
228
- });
229
-
230
- // Update lastRunAt and nextRunAt
231
- const nextRun = calculateNextRun(schedule, new Date());
232
- updateScheduledTask(schedule.id, {
233
- lastRunAt: now,
234
- nextRunAt: nextRun,
235
- lastUpdatedAt: now,
236
- });
237
-
238
- console.log(`[Scheduler] Executed schedule "${schedule.name}", next run: ${nextRun}`);
239
- }
240
-
241
- // Main polling function
242
- export function startScheduler(intervalMs = 10000): void {
243
- if (schedulerInterval) {
244
- console.log('[Scheduler] Already running');
245
- return;
246
- }
247
-
248
- console.log(`[Scheduler] Starting with ${intervalMs}ms polling interval`);
249
-
250
- schedulerInterval = setInterval(async () => {
251
- if (isProcessing) return;
252
- isProcessing = true;
253
-
254
- try {
255
- const dueSchedules = getDueScheduledTasks();
256
-
257
- for (const schedule of dueSchedules) {
258
- try {
259
- await executeSchedule(schedule);
260
- } catch (err) {
261
- console.error(`[Scheduler] Error executing "${schedule.name}":`, err);
262
- }
263
- }
264
- } finally {
265
- isProcessing = false;
266
- }
267
- }, intervalMs);
268
- }
269
-
270
- export function stopScheduler(): void {
271
- if (schedulerInterval) {
272
- clearInterval(schedulerInterval);
273
- schedulerInterval = null;
274
- isProcessing = false;
275
- console.log('[Scheduler] Stopped');
276
- }
277
- }
278
-
279
- // Run a schedule immediately (manual trigger)
280
- export async function runScheduleNow(scheduleId: string): Promise<void> {
281
- const schedule = getScheduledTaskById(scheduleId);
282
- if (!schedule) {
283
- throw new Error(`Schedule not found: ${scheduleId}`);
284
- }
285
- if (!schedule.enabled) {
286
- throw new Error(`Schedule is disabled: ${schedule.name}`);
287
- }
288
- await executeSchedule(schedule);
289
- }
290
- ```
291
-
292
- #### 3. Create Index File
293
- **File**: `src/scheduler/index.ts` (new file)
294
-
295
- ```typescript
296
- export { startScheduler, stopScheduler, runScheduleNow, calculateNextRun } from './scheduler';
297
- ```
298
-
299
- ### Success Criteria:
300
-
301
- #### Automated Verification:
302
- - [ ] `bun run typecheck` passes
303
- - [ ] `bun run lint` passes
304
- - [ ] Package `cron-parser` installed successfully
305
-
306
- #### Manual Verification:
307
- - [ ] Scheduler starts without errors
308
- - [ ] Test cron parsing: `parseExpression('0 9 * * *')` returns valid next date
309
-
310
- **Implementation Note**: Test cron-parser integration before proceeding.
311
-
312
- ---
313
-
314
- ## Phase 3: MCP Tools
315
-
316
- ### Overview
317
- Create 5 MCP tools for schedule management: list-schedules, create-schedule, update-schedule, delete-schedule, run-schedule-now.
318
-
319
- ### Changes Required:
320
-
321
- #### 1. Create Tools Directory
322
- **Directory**: `src/tools/schedules/`
323
-
324
- #### 2. list-schedules Tool
325
- **File**: `src/tools/schedules/list-schedules.ts`
326
-
327
- ```typescript
328
- import type { McpServer } from '@anthropic-ai/sdk/resources/mcp';
329
- import { z } from 'zod';
330
- import { createToolRegistrar } from '../utils';
331
- import { getScheduledTasks } from '../../be/db';
332
- import { ScheduledTaskSchema } from '../../types';
333
-
334
- export const registerListSchedulesTool = (server: McpServer) => {
335
- createToolRegistrar(server)(
336
- 'list-schedules',
337
- {
338
- title: 'List scheduled tasks',
339
- description: 'View all scheduled tasks with optional filters.',
340
- inputSchema: z.object({
341
- enabled: z.boolean().optional().describe('Filter by enabled status'),
342
- name: z.string().optional().describe('Filter by name (partial match)'),
343
- }),
344
- outputSchema: z.object({
345
- success: z.boolean(),
346
- schedules: z.array(ScheduledTaskSchema),
347
- count: z.number(),
348
- }),
349
- },
350
- async ({ enabled, name }, requestInfo, _meta) => {
351
- const schedules = getScheduledTasks({ enabled, name });
352
- return {
353
- success: true,
354
- schedules,
355
- count: schedules.length,
356
- };
357
- },
358
- );
359
- };
360
- ```
361
-
362
- #### 3. create-schedule Tool
363
- **File**: `src/tools/schedules/create-schedule.ts`
364
-
365
- Implements schedule creation with:
366
- - Required: name, taskTemplate
367
- - Optional: cronExpression, intervalMs, description, taskType, tags, priority, targetAgentId, timezone
368
- - Validates cron expression syntax
369
- - Calculates initial nextRunAt
370
- - Respects schedule ownership (createdByAgentId from requestInfo, or defaults to lead)
371
-
372
- #### 4. update-schedule Tool
373
- **File**: `src/tools/schedules/update-schedule.ts`
374
-
375
- Implements schedule updates:
376
- - Update by ID or name
377
- - Can enable/disable schedule
378
- - Recalculates nextRunAt if cron/interval changes
379
- - Only creator or lead can update
380
-
381
- #### 5. delete-schedule Tool
382
- **File**: `src/tools/schedules/delete-schedule.ts`
383
-
384
- Implements schedule deletion:
385
- - Delete by ID or name
386
- - Only creator or lead can delete
387
-
388
- #### 6. run-schedule-now Tool
389
- **File**: `src/tools/schedules/run-schedule-now.ts`
390
-
391
- Implements immediate execution:
392
- - Trigger by ID or name
393
- - Creates task immediately
394
- - Updates lastRunAt but not nextRunAt (regular schedule continues)
395
-
396
- #### 7. Index File
397
- **File**: `src/tools/schedules/index.ts`
398
-
399
- ```typescript
400
- export { registerListSchedulesTool } from './list-schedules';
401
- export { registerCreateScheduleTool } from './create-schedule';
402
- export { registerUpdateScheduleTool } from './update-schedule';
403
- export { registerDeleteScheduleTool } from './delete-schedule';
404
- export { registerRunScheduleNowTool } from './run-schedule-now';
405
- ```
406
-
407
- ### Success Criteria:
408
-
409
- #### Automated Verification:
410
- - [ ] `bun run typecheck` passes
411
- - [ ] `bun run lint` passes
412
-
413
- #### Manual Verification:
414
- - [ ] Each tool registers without errors
415
- - [ ] Tools appear in MCP tool list
416
-
417
- **Implementation Note**: After completing this phase, test each tool manually via MCP client.
418
-
419
- ---
420
-
421
- ## Phase 4: Server Integration
422
-
423
- ### Overview
424
- Wire up scheduler startup/shutdown and register MCP tools.
425
-
426
- ### Changes Required:
427
-
428
- #### 1. Add Capability Gate
429
- **File**: `src/server.ts`
430
-
431
- Add new capability for scheduling:
432
- ```typescript
433
- const DEFAULT_CAPABILITIES = "core,task-pool,messaging,profiles,services,scheduling";
434
- ```
435
-
436
- Register tools if capability enabled:
437
- ```typescript
438
- if (hasCapability("scheduling")) {
439
- registerListSchedulesTool(server);
440
- registerCreateScheduleTool(server);
441
- registerUpdateScheduleTool(server);
442
- registerDeleteScheduleTool(server);
443
- registerRunScheduleNowTool(server);
444
- }
445
- ```
446
-
447
- #### 2. Start Scheduler on Server Start
448
- **File**: `src/http.ts`
449
-
450
- In `httpServer.listen()` callback:
451
- ```typescript
452
- // Start scheduler (if configured)
453
- if (hasCapability("scheduling")) {
454
- const { startScheduler } = await import('./scheduler');
455
- startScheduler(Number(process.env.SCHEDULER_INTERVAL_MS) || 10000);
456
- }
457
- ```
458
-
459
- #### 3. Stop Scheduler on Shutdown
460
- **File**: `src/http.ts`
461
-
462
- In `shutdown()` function:
463
- ```typescript
464
- // Stop scheduler
465
- if (hasCapability("scheduling")) {
466
- const { stopScheduler } = await import('./scheduler');
467
- stopScheduler();
468
- }
469
- ```
470
-
471
- #### 4. Environment Variable Documentation
472
- **File**: `.env.example`
473
-
474
- Add:
475
- ```bash
476
- # Scheduler configuration
477
- SCHEDULER_INTERVAL_MS=10000 # Polling interval (default: 10 seconds)
478
- ```
479
-
480
- ### Success Criteria:
481
-
482
- #### Automated Verification:
483
- - [ ] `bun run typecheck` passes
484
- - [ ] `bun run lint` passes
485
-
486
- #### Manual Verification:
487
- - [ ] Server starts with scheduler running (check logs)
488
- - [ ] Server shutdown stops scheduler cleanly
489
- - [ ] Tools available via MCP when capability enabled
490
-
491
- ---
492
-
493
- ## Phase 5: Testing & Documentation
494
-
495
- ### Overview
496
- Add tests and update documentation.
497
-
498
- ### Changes Required:
499
-
500
- #### 1. Unit Tests
501
- **File**: `src/scheduler/scheduler.test.ts`
502
-
503
- Test cases:
504
- - `calculateNextRun` with cron expression
505
- - `calculateNextRun` with interval
506
- - `calculateNextRun` with timezone
507
- - Scheduler starts and stops correctly
508
-
509
- #### 2. Update MCP.md
510
- **File**: `MCP.md`
511
-
512
- Add section documenting new tools:
513
- - `list-schedules`
514
- - `create-schedule`
515
- - `update-schedule`
516
- - `delete-schedule`
517
- - `run-schedule-now`
518
-
519
- Include examples for cron and interval scheduling.
520
-
521
- #### 3. Update README.md
522
- **File**: `README.md`
523
-
524
- Add brief mention of scheduling capability in features section.
525
-
526
- ### Success Criteria:
527
-
528
- #### Automated Verification:
529
- - [ ] `bun test` passes (if tests are set up)
530
- - [ ] `bun run lint` passes
531
-
532
- #### Manual Verification:
533
- - [ ] Documentation is clear and accurate
534
- - [ ] Examples work as documented
535
-
536
- ---
537
-
538
- ## Testing Strategy
539
-
540
- ### Unit Tests
541
- - `calculateNextRun` function with various cron expressions
542
- - Database CRUD functions for scheduled_tasks
543
- - Cron expression validation
544
-
545
- ### Integration Tests
546
- - End-to-end: create schedule -> wait for execution -> verify task created
547
- - Tool validation: verify MCP tool schemas
548
-
549
- ### Manual Testing Steps
550
- 1. Create a schedule with 1-minute interval
551
- 2. Wait for task to be created
552
- 3. Verify task appears in task list with correct metadata
553
- 4. Disable schedule, verify no new tasks
554
- 5. Run schedule manually, verify task created
555
- 6. Delete schedule, verify removal
556
-
557
- ---
558
-
559
- ## References
560
-
561
- - Research document: `thoughts/shared/research/2026-01-15-scheduled-tasks.md`
562
- - Existing polling pattern: `src/slack/watcher.ts`
563
- - Task creation: `src/be/db.ts`
564
- - Tool registration: `src/tools/utils.ts`
565
- - cron-parser docs: https://www.npmjs.com/package/cron-parser