@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,373 +0,0 @@
1
- ---
2
- date: 2026-03-06T12:00:00Z
3
- topic: "One-Time Scheduled Tasks"
4
- type: plan
5
- status: draft
6
- ---
7
-
8
- # One-Time Scheduled Tasks
9
-
10
- ## Overview
11
-
12
- Extend the existing schedules system to support one-time (delayed) tasks — e.g., "do this in 30 minutes." A new `scheduleType` column distinguishes recurring from one-time schedules. One-time schedules auto-disable after execution and don't require a cron expression or interval.
13
-
14
- ## Current State
15
-
16
- - `scheduled_tasks` table stores recurring schedules with `cronExpression` or `intervalMs` (at least one required via CHECK constraint)
17
- - Scheduler polls every 10s, finds due schedules (`nextRunAt <= now`), creates tasks, then recalculates `nextRunAt`
18
- - After execution, `calculateNextRun()` always computes the next occurrence — no concept of "run once and stop"
19
- - MCP tools: `create-schedule`, `update-schedule`, `delete-schedule`, `list-schedules`, `run-schedule-now`
20
- - UI: schedule list/detail pages in `new-ui/`
21
-
22
- ## Desired End State
23
-
24
- - Agents can create one-time schedules: `create-schedule --name "deploy-reminder" --taskTemplate "Deploy staging" --delayMs 1800000` (30 min from now)
25
- - Alternatively: `--runAt "2026-03-06T15:00:00Z"` for an absolute time
26
- - One-time schedules appear in the schedules list with a distinct type indicator
27
- - After execution, one-time schedules auto-disable (set `enabled = 0`) and don't recalculate `nextRunAt`
28
- - The CHECK constraint is relaxed: one-time schedules don't need `cronExpression` or `intervalMs`
29
- - Existing recurring schedules are unaffected (backward compatible)
30
-
31
- ## Design Decisions
32
-
33
- **Column name**: `scheduleType TEXT NOT NULL DEFAULT 'recurring' CHECK(scheduleType IN ('recurring', 'one_time'))` — clear, extensible, and easy to query. The column is NOT optional (`NOT NULL`). Existing schedules get `'recurring'` automatically via the `DEFAULT` value during migration (the `INSERT ... SELECT *, 'recurring'` copies all rows with the explicit value). For the MCP/API input, the parameter defaults to `'recurring'` so existing callers are unaffected.
34
-
35
- **Input params**: Accept `delayMs` (relative) or `runAt` (absolute ISO datetime) on `create-schedule`. These are NOT stored columns — they compute `nextRunAt` at creation time. `delayMs` and `runAt` are mutually exclusive with `cronExpression`/`intervalMs` for one-time schedules.
36
-
37
- **Auto-cleanup**: One-time schedules are auto-disabled after execution, NOT deleted. This preserves history and lets agents see what ran. The `lastRunAt` timestamp serves as proof of execution.
38
-
39
- **Default filtering**: The API and UI should hide executed one-time schedules by default (i.e., where `scheduleType = 'one_time' AND enabled = 0`). The API `GET /api/schedules` and `list-schedules` MCP tool will add a `hideCompleted` filter (default `true`) that excludes these. The UI will have a "Show completed one-time" toggle to reveal them.
40
-
41
- **Validation**: For `scheduleType = 'one_time'`, exactly one of `delayMs` or `runAt` must be provided (and no cron/interval). For `scheduleType = 'recurring'` (default), existing validation applies (cron or interval required).
42
-
43
- ---
44
-
45
- ## Phase 1: Database Migration
46
-
47
- Add `scheduleType` column and relax the CHECK constraint.
48
-
49
- ### Files to modify:
50
- - `src/be/migrations/` — new migration file
51
-
52
- ### Steps:
53
-
54
- 1. Create `src/be/migrations/NNN_one_time_schedules.sql` (next number after highest existing):
55
-
56
- ```sql
57
- -- Add scheduleType column
58
- -- The existing CHECK (cronExpression IS NOT NULL OR intervalMs IS NOT NULL)
59
- -- blocks one-time schedules. We must recreate the table.
60
-
61
- -- Step 1: Rename existing table
62
- ALTER TABLE scheduled_tasks RENAME TO _scheduled_tasks_old;
63
-
64
- -- Step 2: Create new table with updated constraints
65
- CREATE TABLE scheduled_tasks (
66
- id TEXT PRIMARY KEY,
67
- name TEXT NOT NULL UNIQUE,
68
- description TEXT,
69
- cronExpression TEXT,
70
- intervalMs INTEGER,
71
- taskTemplate TEXT NOT NULL,
72
- taskType TEXT,
73
- tags TEXT DEFAULT '[]',
74
- priority INTEGER DEFAULT 50,
75
- targetAgentId TEXT,
76
- enabled INTEGER DEFAULT 1,
77
- lastRunAt TEXT,
78
- nextRunAt TEXT,
79
- createdByAgentId TEXT,
80
- timezone TEXT DEFAULT 'UTC',
81
- consecutiveErrors INTEGER DEFAULT 0,
82
- lastErrorAt TEXT,
83
- lastErrorMessage TEXT,
84
- model TEXT,
85
- scheduleType TEXT NOT NULL DEFAULT 'recurring' CHECK(scheduleType IN ('recurring', 'one_time')),
86
- createdAt TEXT NOT NULL,
87
- lastUpdatedAt TEXT NOT NULL,
88
- CHECK (
89
- (scheduleType = 'recurring' AND (cronExpression IS NOT NULL OR intervalMs IS NOT NULL))
90
- OR
91
- (scheduleType = 'one_time')
92
- )
93
- );
94
-
95
- -- Step 3: Copy data (all existing schedules are 'recurring')
96
- INSERT INTO scheduled_tasks SELECT *, 'recurring' FROM _scheduled_tasks_old;
97
-
98
- -- Step 4: Drop old table
99
- DROP TABLE _scheduled_tasks_old;
100
-
101
- -- Step 5: Recreate indexes
102
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_enabled ON scheduled_tasks(enabled);
103
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_nextRunAt ON scheduled_tasks(nextRunAt);
104
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_type ON scheduled_tasks(scheduleType);
105
- ```
106
-
107
- 2. Also update `001_initial.sql` to include `scheduleType` in the CREATE TABLE for fresh DBs (the migration runner's bootstrap logic handles existing DBs).
108
-
109
- 3. Update `src/be/db.ts`:
110
- - Add `scheduleType` to `ScheduledTaskRow` type (~line 3890)
111
- - Add `scheduleType` to `rowToScheduledTask()` mapping (~line 3914)
112
- - Add `scheduleType` to `CreateScheduledTaskData` interface (~line 3981)
113
- - Add `scheduleType` to `createScheduledTask()` INSERT (~line 3998)
114
- - Add `scheduleType` to `UpdateScheduledTaskData` interface (~line 4034)
115
- - Add `scheduleType` to `updateScheduledTask()` SET handling (~line 4055)
116
-
117
- 4. Update `src/types.ts`:
118
- - Add `scheduleType` to `ScheduledTaskSchema` (~line 356)
119
- - Adjust the `.refine()` to account for one-time schedules (~line 380)
120
-
121
- ### Success Criteria:
122
-
123
- #### Automated Verification:
124
- - [x] Fresh DB starts clean: `rm agent-swarm-db.sqlite && bun run start:http` (starts without errors)
125
- - [x] Existing DB migrates: `bun run start:http` (starts without errors with existing DB)
126
- - [x] Type check passes: `bun run tsc:check`
127
- - [x] Lint passes: `bun run lint:fix`
128
-
129
- #### Manual Verification:
130
- - [x] Query `SELECT sql FROM sqlite_master WHERE name='scheduled_tasks'` — confirms new CHECK and `scheduleType` column
131
- - [x] Existing schedules have `scheduleType = 'recurring'` after migration
132
-
133
- **Implementation Note**: Pause for verification before proceeding to Phase 2.
134
-
135
- ---
136
-
137
- ## Phase 2: Scheduler Logic for One-Time Execution
138
-
139
- Modify the scheduler to handle one-time schedules: execute once, then auto-disable.
140
-
141
- ### Files to modify:
142
- - `src/scheduler/scheduler.ts`
143
-
144
- ### Steps:
145
-
146
- 1. In `executeSchedule()` (~line 107): After creating the task, check `schedule.scheduleType`:
147
- - If `'one_time'`: set `enabled = false`, `nextRunAt = null`, update `lastRunAt`. Do NOT call `calculateNextRun()`.
148
- - If `'recurring'` (default): existing behavior — call `calculateNextRun()` and update `nextRunAt`.
149
-
150
- 2. In `recoverMissedSchedules()` (~line 19): Same one-time check — auto-disable after recovery run instead of recalculating next run.
151
-
152
- 3. In `runScheduleNow()` (~line 237): After creating the task, if `schedule.scheduleType === 'one_time'`, auto-disable (set `enabled = false`, clear `nextRunAt`). Manual runs of one-time schedules should also mark them as completed.
153
-
154
- 4. In the error handler within `executeSchedule()` (~line 139): If `schedule.scheduleType === 'one_time'` and execution fails, auto-disable immediately (no backoff retries — the one-time window has passed). Set `enabled = false` with the error info.
155
-
156
- 5. `calculateNextRun()` needs no changes — it's simply not called for one-time schedules.
157
-
158
- **All code paths that execute a schedule must check `scheduleType` and auto-disable for one-time.** This includes: normal execution, recovery, manual run, and error handling.
159
-
160
- ### Success Criteria:
161
-
162
- #### Automated Verification:
163
- - [x] Type check passes: `bun run tsc:check`
164
- - [x] Existing scheduler tests pass: `bun test src/scheduler/scheduler.test.ts`
165
- - [x] Existing scheduled tasks tests pass: `bun test src/tests/scheduled-tasks.test.ts`
166
-
167
- #### Manual Verification:
168
- - [x] Create a one-time schedule via DB insert with `nextRunAt` 15s in the future, verify it executes and auto-disables (will verify during E2E)
169
-
170
- **Implementation Note**: Pause for verification before proceeding to Phase 3.
171
-
172
- ---
173
-
174
- ## Phase 3: MCP Tool Updates
175
-
176
- Update `create-schedule` and `update-schedule` tools to accept one-time schedule parameters.
177
-
178
- ### Files to modify:
179
- - `src/tools/schedules/create-schedule.ts`
180
- - `src/tools/schedules/update-schedule.ts`
181
- - `src/tools/schedules/list-schedules.ts` (add filter by scheduleType)
182
-
183
- ### Steps:
184
-
185
- 1. **`create-schedule.ts`**: Add new input params:
186
- - `scheduleType: z.enum(['recurring', 'one_time']).default('recurring')`
187
- - `delayMs: z.number().int().positive().optional()` — "run in X milliseconds from now"
188
- - `runAt: z.string().datetime().optional()` — "run at this exact time"
189
- - Validation:
190
- - If `scheduleType = 'one_time'`: require exactly one of `delayMs` or `runAt`. Reject `cronExpression`/`intervalMs`.
191
- - If `scheduleType = 'recurring'` (or omitted): existing validation (require cron or interval). Reject `delayMs`/`runAt`.
192
- - Compute `nextRunAt`:
193
- - From `delayMs`: `new Date(Date.now() + delayMs).toISOString()`
194
- - From `runAt`: validate it's in the future, use directly
195
- - Pass `scheduleType` to `createScheduledTask()`
196
-
197
- 2. **`update-schedule.ts`**:
198
- - Do NOT allow changing `scheduleType` after creation (prevent confusion)
199
- - For one-time schedules: allow updating `runAt` (recompute `nextRunAt`) if not yet executed
200
- - For one-time schedules that have already run (`enabled = false`, `lastRunAt` set): reject updates with helpful message
201
-
202
- 3. **`list-schedules.ts`**:
203
- - Add optional `scheduleType` filter param
204
- - Add `hideCompleted` boolean param (default `true`) — when true, excludes schedules where `scheduleType = 'one_time' AND enabled = false`
205
-
206
- ### Success Criteria:
207
-
208
- #### Automated Verification:
209
- - [x] Type check passes: `bun run tsc:check`
210
- - [x] Lint passes: `bun run lint:fix`
211
- - [x] All existing tests pass: `bun test`
212
-
213
- #### Manual Verification:
214
- - [x] Via MCP: create a one-time schedule with `delayMs: 60000` — verify it shows `nextRunAt` ~1 min in future
215
- - [x] Via MCP: create a one-time schedule with `runAt` in the past — verify rejection
216
- - [x] Via MCP: list schedules filtered by `scheduleType: 'one_time'`
217
- - [x] Via MCP: verify creating a recurring schedule still works as before
218
-
219
- **Implementation Note**: Pause for verification before proceeding to Phase 4.
220
-
221
- ---
222
-
223
- ## Phase 4: HTTP API Updates
224
-
225
- Update the HTTP API to support one-time schedule creation and filtering.
226
-
227
- ### Files to modify:
228
- - `src/http/schedules.ts`
229
-
230
- ### Steps:
231
-
232
- 1. **POST /api/schedules**: Accept `scheduleType`, `delayMs`, `runAt` in body. Apply same validation as MCP tool.
233
- 2. **PUT /api/schedules/:id**: Same restrictions as MCP update tool (no type change, etc.)
234
- 3. **GET /api/schedules** (if list endpoint exists): Support `?scheduleType=one_time` and `?hideCompleted=false` query filters. Default behavior hides executed one-time schedules.
235
-
236
- ### Success Criteria:
237
-
238
- #### Automated Verification:
239
- - [x] Type check passes: `bun run tsc:check`
240
- - [x] Lint passes: `bun run lint:fix`
241
- - [x] HTTP integration tests pass: `bun test src/tests/http-api-integration.test.ts`
242
-
243
- #### Manual Verification:
244
- - [x] `curl -X POST /api/schedules` with one-time payload — returns 201 with schedule
245
- - [x] `curl -X POST /api/schedules` with invalid combo (one_time + cronExpression) — returns 400
246
-
247
- **Implementation Note**: Pause for verification before proceeding to Phase 5.
248
-
249
- ---
250
-
251
- ## Phase 5: UI Updates
252
-
253
- Update the dashboard to display and distinguish one-time schedules.
254
-
255
- ### Files to modify:
256
- - `new-ui/src/api/types.ts` — add `scheduleType` to `ScheduledTask` interface
257
- - `new-ui/src/pages/schedules/page.tsx` — show schedule type in list, add filter
258
- - `new-ui/src/pages/schedules/[id]/page.tsx` — show schedule type in detail view
259
-
260
- ### Steps:
261
-
262
- 1. Add `scheduleType?: 'recurring' | 'one_time'` to the `ScheduledTask` interface in `new-ui/src/api/types.ts`
263
- 2. In the schedules list page, add a badge/indicator for one-time vs recurring
264
- 3. In the schedule detail page, show the type and appropriate timing info (for one-time: "Runs at X" or "Ran at X"; for recurring: existing cron/interval display)
265
- 4. Add a "Show completed one-time" toggle (default off) to reveal executed one-time schedules
266
- 5. Optionally add a filter chip to toggle between all/recurring/one-time
267
-
268
- ### Success Criteria:
269
-
270
- #### Automated Verification:
271
- - [x] UI type check passes: `cd new-ui && pnpm exec tsc --noEmit`
272
- - [x] UI lint passes: `cd new-ui && pnpm lint`
273
-
274
- #### Manual Verification:
275
- - [x] One-time schedules show a distinct badge in the list
276
- - [x] Completed one-time schedules show "Executed at X" instead of "Next run: disabled"
277
-
278
- **Implementation Note**: Pause for verification before proceeding to Phase 6.
279
-
280
- ---
281
-
282
- ## Phase 6: Tests
283
-
284
- Add unit tests for the new one-time schedule behavior.
285
-
286
- ### Files to modify:
287
- - `src/tests/scheduled-tasks.test.ts` — or new test file `src/tests/one-time-schedules.test.ts`
288
- - `src/scheduler/scheduler.test.ts`
289
-
290
- ### Tests to add:
291
-
292
- 1. **Create one-time schedule with delayMs** — verify `nextRunAt` is computed correctly, `scheduleType` is `'one_time'`
293
- 2. **Create one-time schedule with runAt** — verify `nextRunAt` matches `runAt`
294
- 3. **Reject one-time with cron** — verify error when providing both `scheduleType: 'one_time'` and `cronExpression`
295
- 4. **Reject recurring with delayMs** — verify error when providing `delayMs` without `scheduleType: 'one_time'`
296
- 5. **Execute one-time schedule** — verify task is created, schedule is auto-disabled, `nextRunAt` is cleared
297
- 6. **One-time recovery** — verify missed one-time schedule fires once and auto-disables
298
- 7. **Reject runAt in the past** — verify appropriate error
299
-
300
- ### Success Criteria:
301
-
302
- #### Automated Verification:
303
- - [x] All tests pass: `bun test`
304
- - [x] Type check passes: `bun run tsc:check`
305
-
306
- #### Manual Verification:
307
- - [x] Review test coverage is adequate
308
-
309
- **Implementation Note**: Pause for verification before final review.
310
-
311
- ---
312
-
313
- ## Manual E2E Verification
314
-
315
- After all phases are complete, verify end-to-end:
316
-
317
- ```bash
318
- # 1. Start fresh
319
- rm agent-swarm-db.sqlite
320
- bun run start:http
321
-
322
- # 2. Create a one-time schedule (runs in 30 seconds)
323
- curl -X POST http://localhost:3013/api/schedules \
324
- -H "Authorization: Bearer 123123" \
325
- -H "Content-Type: application/json" \
326
- -d '{
327
- "name": "test-one-time",
328
- "taskTemplate": "Say hello - this is a one-time test",
329
- "scheduleType": "one_time",
330
- "delayMs": 30000
331
- }'
332
-
333
- # 2b. Create a one-time schedule with runAt (1 minute from now)
334
- RUNAT=$(date -u -v+1M +"%Y-%m-%dT%H:%M:%SZ")
335
- curl -X POST http://localhost:3013/api/schedules \
336
- -H "Authorization: Bearer 123123" \
337
- -H "Content-Type: application/json" \
338
- -d "{
339
- \"name\": \"test-one-time-runat\",
340
- \"taskTemplate\": \"Say hello - runAt test\",
341
- \"scheduleType\": \"one_time\",
342
- \"runAt\": \"$RUNAT\"
343
- }"
344
-
345
- # 3. Verify both appear in schedule list
346
- curl -H "Authorization: Bearer 123123" http://localhost:3013/api/schedules
347
-
348
- # 4. Wait 30s-60s, then verify:
349
- # - A task was created (check /api/tasks)
350
- # - The schedule is now disabled (check /api/schedules/<id>)
351
- curl -H "Authorization: Bearer 123123" http://localhost:3013/api/tasks
352
- curl -H "Authorization: Bearer 123123" http://localhost:3013/api/schedules/<id>
353
-
354
- # 5. Create a recurring schedule (verify no regression)
355
- curl -X POST http://localhost:3013/api/schedules \
356
- -H "Authorization: Bearer 123123" \
357
- -H "Content-Type: application/json" \
358
- -d '{
359
- "name": "test-recurring",
360
- "taskTemplate": "Recurring test",
361
- "cronExpression": "*/1 * * * *"
362
- }'
363
-
364
- # 6. Verify the UI shows both schedules with correct type badges
365
- # Open http://localhost:5274/schedules
366
- ```
367
-
368
- ## Risk Assessment
369
-
370
- - **Low risk**: Adding a column with a default value is backward-compatible
371
- - **Medium risk**: Table recreation in migration — must be tested with both fresh and existing DBs
372
- - **Low risk**: Scheduler changes are isolated to the one-time code path; recurring behavior is unchanged
373
- - **Low risk**: UI changes are additive (new badge, optional filter)