@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.
- package/README.md +1 -1
- package/openapi.json +2070 -728
- package/package.json +10 -1
- package/src/agentmail/handlers.ts +65 -10
- package/src/agentmail/templates.ts +111 -0
- package/src/be/db.ts +1233 -7
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/019_skills.sql +65 -0
- package/src/be/migrations/020_approval_requests.sql +41 -0
- package/src/be/seed.ts +62 -0
- package/src/be/skill-parser.ts +70 -0
- package/src/be/skill-sync.ts +106 -0
- package/src/commands/runner.ts +320 -132
- package/src/commands/templates.ts +172 -0
- package/src/github/handlers.ts +292 -77
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/gitlab/handlers.ts +63 -22
- package/src/gitlab/templates.ts +140 -0
- package/src/heartbeat/heartbeat.ts +19 -10
- package/src/heartbeat/templates.ts +30 -0
- package/src/http/active-sessions.ts +27 -0
- package/src/http/approval-requests.ts +247 -0
- package/src/http/config.ts +3 -3
- package/src/http/index.ts +9 -2
- package/src/http/poll.ts +135 -14
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/schedules.ts +35 -0
- package/src/http/skills.ts +479 -0
- package/src/http/workflows.ts +8 -0
- package/src/linear/sync.ts +28 -4
- package/src/linear/templates.ts +47 -0
- package/src/prompts/base-prompt.ts +41 -490
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +15 -2
- package/src/providers/pi-mono-extension.ts +5 -1
- package/src/scheduler/scheduler.ts +125 -91
- package/src/server.ts +44 -0
- package/src/slack/assistant.ts +7 -4
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/handlers.ts +21 -6
- package/src/slack/templates.ts +55 -0
- package/src/tests/approval-requests.test.ts +735 -0
- package/src/tests/artifact-sdk.test.ts +12 -12
- package/src/tests/base-prompt.test.ts +49 -49
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/heartbeat.test.ts +1 -0
- package/src/tests/linear-webhook.test.ts +7 -3
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/self-improvement.test.ts +8 -7
- package/src/tests/skill-parser.test.ts +178 -0
- package/src/tests/skill-sync.test.ts +171 -0
- package/src/tests/slack-metadata-inheritance.test.ts +1 -1
- package/src/tests/slack-thread-followups.test.ts +1 -1
- package/src/tests/structured-output.test.ts +0 -4
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/workflow-async-v2.test.ts +126 -4
- package/src/tests/workflow-definition-validation.test.ts +76 -0
- package/src/tests/workflow-executors.test.ts +4 -2
- package/src/tests/workflow-retry-v2.test.ts +1 -1
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/request-human-input.ts +106 -0
- package/src/tools/skills/index.ts +11 -0
- package/src/tools/skills/skill-create.ts +105 -0
- package/src/tools/skills/skill-delete.ts +67 -0
- package/src/tools/skills/skill-get.ts +75 -0
- package/src/tools/skills/skill-install-remote.ts +152 -0
- package/src/tools/skills/skill-install.ts +101 -0
- package/src/tools/skills/skill-list.ts +77 -0
- package/src/tools/skills/skill-publish.ts +123 -0
- package/src/tools/skills/skill-search.ts +43 -0
- package/src/tools/skills/skill-sync-remote.ts +128 -0
- package/src/tools/skills/skill-uninstall.ts +60 -0
- package/src/tools/skills/skill-update.ts +128 -0
- package/src/tools/store-progress.ts +22 -4
- package/src/tools/task-action.ts +20 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +23 -0
- package/src/tools/update-profile.ts +106 -34
- package/src/tools/workflows/create-workflow.ts +19 -1
- package/src/tools/workflows/update-workflow.ts +16 -1
- package/src/types.ts +109 -2
- package/src/workflows/definition.ts +30 -12
- package/src/workflows/engine.ts +40 -14
- package/src/workflows/executors/agent-task.ts +14 -3
- package/src/workflows/executors/human-in-the-loop.ts +160 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/index.ts +1 -1
- package/src/workflows/recovery.ts +72 -0
- package/src/workflows/resume.ts +162 -12
- package/src/workflows/triggers.ts +31 -2
- package/src/workflows/version.ts +2 -0
- package/.claude/settings.json +0 -84
- package/.claude/settings.local.json +0 -117
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.entire/settings.json +0 -4
- package/.env.docker.example +0 -56
- package/.env.example +0 -78
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
- package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
- package/.github/workflows/ci.yml +0 -52
- package/.github/workflows/docker-and-deploy.yml +0 -132
- package/.github/workflows/merge-gate.yml +0 -233
- package/.opencode/plugins/entire.ts +0 -133
- package/.superset/config.json +0 -6
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -171
- package/CHANGELOG.md +0 -447
- package/CLAUDE.md +0 -521
- package/CONTRIBUTING.md +0 -315
- package/DEPLOYMENT.md +0 -622
- package/Dockerfile +0 -65
- package/Dockerfile.worker +0 -189
- package/MCP.md +0 -841
- package/UI.md +0 -40
- package/api-entrypoint.sh +0 -56
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/depot.json +0 -1
- package/docker-compose.example.yml +0 -350
- package/docker-compose.local.yml +0 -119
- package/docker-entrypoint.sh +0 -632
- package/docs-site/app/api/search/route.ts +0 -4
- package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
- package/docs-site/app/docs/layout.tsx +0 -12
- package/docs-site/app/globals.css +0 -24
- package/docs-site/app/layout.config.tsx +0 -34
- package/docs-site/app/layout.tsx +0 -119
- package/docs-site/app/llms-full.txt/route.ts +0 -11
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
- package/docs-site/app/llms.txt/route.ts +0 -8
- package/docs-site/app/page.tsx +0 -5
- package/docs-site/app/robots.ts +0 -13
- package/docs-site/app/sitemap.ts +0 -37
- package/docs-site/components/api-page.client.tsx +0 -4
- package/docs-site/components/api-page.tsx +0 -7
- package/docs-site/components/mdx/mermaid.tsx +0 -55
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
- package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
- package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
- package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
- package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
- package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
- package/docs-site/content/docs/(documentation)/index.mdx +0 -65
- package/docs-site/content/docs/(documentation)/meta.json +0 -19
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
- package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
- package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
- package/docs-site/content/docs/api-reference/agents.mdx +0 -9
- package/docs-site/content/docs/api-reference/channels.mdx +0 -9
- package/docs-site/content/docs/api-reference/config.mdx +0 -9
- package/docs-site/content/docs/api-reference/debug.mdx +0 -9
- package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
- package/docs-site/content/docs/api-reference/epics.mdx +0 -9
- package/docs-site/content/docs/api-reference/index.mdx +0 -32
- package/docs-site/content/docs/api-reference/memory.mdx +0 -9
- package/docs-site/content/docs/api-reference/meta.json +0 -25
- package/docs-site/content/docs/api-reference/poll.mdx +0 -9
- package/docs-site/content/docs/api-reference/repos.mdx +0 -9
- package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
- package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
- package/docs-site/content/docs/api-reference/stats.mdx +0 -9
- package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
- package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
- package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
- package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
- package/docs-site/content/docs/meta.json +0 -3
- package/docs-site/lib/get-llm-text.ts +0 -10
- package/docs-site/lib/openapi.ts +0 -23
- package/docs-site/lib/source.ts +0 -8
- package/docs-site/mdx-components.tsx +0 -13
- package/docs-site/next.config.mjs +0 -29
- package/docs-site/package.json +0 -35
- package/docs-site/pnpm-lock.yaml +0 -5407
- package/docs-site/postcss.config.mjs +0 -8
- package/docs-site/public/logo.png +0 -0
- package/docs-site/scripts/generate-docs.ts +0 -171
- package/docs-site/source.config.ts +0 -17
- package/docs-site/tsconfig.json +0 -46
- package/ecosystem.config.cjs +0 -66
- package/landing/next.config.ts +0 -14
- package/landing/package.json +0 -31
- package/landing/pnpm-lock.yaml +0 -1091
- package/landing/postcss.config.mjs +0 -8
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +0 -30
- package/landing/public/omghost-openfort.svg +0 -9
- package/landing/src/app/actions/waitlist.ts +0 -25
- package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
- package/landing/src/app/blog/page.tsx +0 -162
- package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
- package/landing/src/app/examples/page.tsx +0 -174
- package/landing/src/app/examples/x402/page.tsx +0 -456
- package/landing/src/app/globals.css +0 -122
- package/landing/src/app/layout.tsx +0 -134
- package/landing/src/app/page.tsx +0 -27
- package/landing/src/app/robots.ts +0 -13
- package/landing/src/app/sitemap.ts +0 -44
- package/landing/src/components/architecture.tsx +0 -163
- package/landing/src/components/cta.tsx +0 -52
- package/landing/src/components/features.tsx +0 -160
- package/landing/src/components/footer.tsx +0 -100
- package/landing/src/components/hero.tsx +0 -217
- package/landing/src/components/how-it-works.tsx +0 -165
- package/landing/src/components/navbar.tsx +0 -147
- package/landing/src/components/waitlist.tsx +0 -110
- package/landing/src/components/why-choose.tsx +0 -149
- package/landing/src/components/workshops.tsx +0 -328
- package/landing/src/lib/utils.ts +0 -6
- package/landing/tsconfig.json +0 -41
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
- package/new-ui/CLAUDE.md +0 -92
- package/new-ui/README.md +0 -73
- package/new-ui/biome.json +0 -42
- package/new-ui/components.json +0 -21
- package/new-ui/index.html +0 -25
- package/new-ui/package.json +0 -49
- package/new-ui/pnpm-lock.yaml +0 -4845
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +0 -814
- package/new-ui/src/api/hooks/index.ts +0 -64
- package/new-ui/src/api/hooks/use-agents.ts +0 -58
- package/new-ui/src/api/hooks/use-channels.ts +0 -115
- package/new-ui/src/api/hooks/use-config-api.ts +0 -46
- package/new-ui/src/api/hooks/use-costs.ts +0 -122
- package/new-ui/src/api/hooks/use-db-query.ts +0 -29
- package/new-ui/src/api/hooks/use-epics.ts +0 -75
- package/new-ui/src/api/hooks/use-repos.ts +0 -61
- package/new-ui/src/api/hooks/use-schedules.ts +0 -81
- package/new-ui/src/api/hooks/use-services.ts +0 -16
- package/new-ui/src/api/hooks/use-stats.ts +0 -27
- package/new-ui/src/api/hooks/use-tasks.ts +0 -89
- package/new-ui/src/api/hooks/use-workflows.ts +0 -109
- package/new-ui/src/api/types.ts +0 -549
- package/new-ui/src/app/App.tsx +0 -13
- package/new-ui/src/app/providers.tsx +0 -32
- package/new-ui/src/app/router.tsx +0 -52
- package/new-ui/src/components/layout/app-header.tsx +0 -47
- package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
- package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
- package/new-ui/src/components/layout/config-guard.tsx +0 -22
- package/new-ui/src/components/layout/root-layout.tsx +0 -40
- package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
- package/new-ui/src/components/shared/command-menu.tsx +0 -131
- package/new-ui/src/components/shared/data-grid.tsx +0 -141
- package/new-ui/src/components/shared/empty-state.tsx +0 -24
- package/new-ui/src/components/shared/error-boundary.tsx +0 -72
- package/new-ui/src/components/shared/json-viewer.tsx +0 -47
- package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
- package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
- package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
- package/new-ui/src/components/shared/stats-bar.tsx +0 -132
- package/new-ui/src/components/shared/status-badge.tsx +0 -131
- package/new-ui/src/components/shared/usage-summary.tsx +0 -179
- package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
- package/new-ui/src/components/ui/alert.tsx +0 -60
- package/new-ui/src/components/ui/avatar.tsx +0 -96
- package/new-ui/src/components/ui/badge.tsx +0 -46
- package/new-ui/src/components/ui/button.tsx +0 -62
- package/new-ui/src/components/ui/card.tsx +0 -75
- package/new-ui/src/components/ui/command.tsx +0 -160
- package/new-ui/src/components/ui/dialog.tsx +0 -143
- package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
- package/new-ui/src/components/ui/input.tsx +0 -21
- package/new-ui/src/components/ui/label.tsx +0 -19
- package/new-ui/src/components/ui/progress.tsx +0 -26
- package/new-ui/src/components/ui/scroll-area.tsx +0 -54
- package/new-ui/src/components/ui/select.tsx +0 -175
- package/new-ui/src/components/ui/separator.tsx +0 -28
- package/new-ui/src/components/ui/sheet.tsx +0 -132
- package/new-ui/src/components/ui/sidebar.tsx +0 -691
- package/new-ui/src/components/ui/skeleton.tsx +0 -13
- package/new-ui/src/components/ui/sonner.tsx +0 -35
- package/new-ui/src/components/ui/switch.tsx +0 -33
- package/new-ui/src/components/ui/table.tsx +0 -92
- package/new-ui/src/components/ui/tabs.tsx +0 -79
- package/new-ui/src/components/ui/textarea.tsx +0 -18
- package/new-ui/src/components/ui/tooltip.tsx +0 -51
- package/new-ui/src/components/workflows/action-node.tsx +0 -53
- package/new-ui/src/components/workflows/condition-node.tsx +0 -50
- package/new-ui/src/components/workflows/graph-utils.ts +0 -124
- package/new-ui/src/components/workflows/json-tree.tsx +0 -189
- package/new-ui/src/components/workflows/node-styles.ts +0 -10
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
- package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
- package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
- package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
- package/new-ui/src/hooks/use-config.ts +0 -203
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
- package/new-ui/src/hooks/use-mobile.ts +0 -19
- package/new-ui/src/hooks/use-theme.ts +0 -60
- package/new-ui/src/lib/config.ts +0 -188
- package/new-ui/src/lib/slugs.ts +0 -71
- package/new-ui/src/lib/utils.ts +0 -120
- package/new-ui/src/main.tsx +0 -11
- package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
- package/new-ui/src/pages/agents/page.tsx +0 -134
- package/new-ui/src/pages/chat/page.tsx +0 -674
- package/new-ui/src/pages/config/page.tsx +0 -1109
- package/new-ui/src/pages/dashboard/page.tsx +0 -454
- package/new-ui/src/pages/debug/page.tsx +0 -275
- package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
- package/new-ui/src/pages/epics/page.tsx +0 -321
- package/new-ui/src/pages/not-found/page.tsx +0 -18
- package/new-ui/src/pages/repos/page.tsx +0 -369
- package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
- package/new-ui/src/pages/schedules/page.tsx +0 -477
- package/new-ui/src/pages/services/page.tsx +0 -128
- package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
- package/new-ui/src/pages/tasks/page.tsx +0 -592
- package/new-ui/src/pages/usage/page.tsx +0 -195
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
- package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
- package/new-ui/src/pages/workflows/page.tsx +0 -266
- package/new-ui/src/styles/ag-grid.css +0 -36
- package/new-ui/src/styles/globals.css +0 -213
- package/new-ui/test-results/.last-run.json +0 -4
- package/new-ui/tsconfig.app.json +0 -34
- package/new-ui/tsconfig.json +0 -4
- package/new-ui/tsconfig.node.json +0 -26
- package/new-ui/vercel.json +0 -4
- package/new-ui/vite.config.ts +0 -28
- package/plugin/README.md +0 -1
- package/plugin/build-pi-skills.ts +0 -233
- package/plugin/hooks/hooks.json +0 -71
- package/prek.toml +0 -75
- package/pyproject.toml +0 -9
- package/scripts/check-db-boundary.sh +0 -60
- package/scripts/e2e-docker-provider.ts +0 -820
- package/scripts/e2e-io-schemas-test.ts +0 -807
- package/scripts/e2e-provider-test.ts +0 -220
- package/scripts/e2e-workflow-redesign.sh +0 -229
- package/scripts/e2e-workflow-test.sh +0 -285
- package/scripts/e2e-workflow-test.ts +0 -857
- package/scripts/generate-mcp-docs.ts +0 -415
- package/scripts/generate-openapi.ts +0 -26
- package/scripts/measure-tool-tokens.ts +0 -118
- package/scripts/x402-e2e-test.ts +0 -195
- package/scripts/x402-test-server.ts +0 -236
- package/scripts/x402-testnet-e2e.ts +0 -668
- package/slack-manifest.json +0 -88
- package/templates-ui/README.md +0 -46
- package/templates-ui/components.json +0 -17
- package/templates-ui/eslint.config.mjs +0 -18
- package/templates-ui/next.config.ts +0 -7
- package/templates-ui/package.json +0 -35
- package/templates-ui/pnpm-lock.yaml +0 -4571
- package/templates-ui/postcss.config.mjs +0 -7
- package/templates-ui/public/file.svg +0 -1
- package/templates-ui/public/globe.svg +0 -1
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +0 -1
- package/templates-ui/public/vercel.svg +0 -1
- package/templates-ui/public/window.svg +0 -1
- package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
- package/templates-ui/src/app/api/templates/route.ts +0 -18
- package/templates-ui/src/app/builder/page.tsx +0 -37
- package/templates-ui/src/app/globals.css +0 -94
- package/templates-ui/src/app/layout.tsx +0 -79
- package/templates-ui/src/app/page.tsx +0 -38
- package/templates-ui/src/app/robots.ts +0 -11
- package/templates-ui/src/app/sitemap.ts +0 -31
- package/templates-ui/src/components/compose-builder.tsx +0 -442
- package/templates-ui/src/components/compose-preview.tsx +0 -117
- package/templates-ui/src/components/file-preview.tsx +0 -77
- package/templates-ui/src/components/footer.tsx +0 -40
- package/templates-ui/src/components/header.tsx +0 -41
- package/templates-ui/src/components/template-card.tsx +0 -87
- package/templates-ui/src/components/template-detail.tsx +0 -125
- package/templates-ui/src/components/template-gallery.tsx +0 -263
- package/templates-ui/src/components/ui/badge.tsx +0 -36
- package/templates-ui/src/components/ui/button.tsx +0 -57
- package/templates-ui/src/components/ui/card.tsx +0 -76
- package/templates-ui/src/components/ui/separator.tsx +0 -31
- package/templates-ui/src/components/ui/tooltip.tsx +0 -32
- package/templates-ui/src/lib/compose-generator.ts +0 -241
- package/templates-ui/src/lib/templates.ts +0 -137
- package/templates-ui/src/lib/utils.ts +0 -6
- package/templates-ui/tsconfig.json +0 -34
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
- package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
- package/thoughts/shared/plans/.gitkeep +0 -0
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
- package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
- package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
- package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
- package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
- 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)
|