@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,565 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-01-15
|
|
3
|
-
author: Claude
|
|
4
|
-
status: ready
|
|
5
|
-
tags: [scheduling, cron, sqlite, task-automation, implementation]
|
|
6
|
-
related_research: thoughts/shared/research/2026-01-15-scheduled-tasks.md
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Scheduled Tasks Feature - Implementation Plan
|
|
10
|
-
|
|
11
|
-
**Date**: 2026-01-15
|
|
12
|
-
**Status**: Ready for Implementation
|
|
13
|
-
|
|
14
|
-
## Overview
|
|
15
|
-
|
|
16
|
-
Implement a native SQLite-based scheduled tasks feature for the agent-swarm. This allows defining recurring tasks (via cron expressions or intervals) that automatically create agent tasks at specified times. The scheduler follows existing architectural patterns (SQLite persistence, interval-based polling) and integrates seamlessly with the existing task system.
|
|
17
|
-
|
|
18
|
-
## Current State Analysis
|
|
19
|
-
|
|
20
|
-
The agent-swarm currently supports:
|
|
21
|
-
- **Task creation**: via `createTaskExtended()` in `src/be/db.ts`
|
|
22
|
-
- **Task pool**: unassigned tasks workers can claim
|
|
23
|
-
- **Interval polling**: pattern established in `src/slack/watcher.ts`
|
|
24
|
-
- **MCP tools**: registered via capability-gated `createToolRegistrar` pattern
|
|
25
|
-
- **Graceful shutdown**: SIGINT handler in `src/http.ts`
|
|
26
|
-
|
|
27
|
-
### Key Discoveries:
|
|
28
|
-
- Database uses SQLite with WAL mode, singleton pattern (`src/be/db.ts`)
|
|
29
|
-
- Schema created in transaction
|
|
30
|
-
- Migrations use try-catch for ALTER TABLE
|
|
31
|
-
- Slack watcher demonstrates polling pattern with throttling and optimistic locking (`src/slack/watcher.ts`)
|
|
32
|
-
- Tools registered via `createToolRegistrar` with Zod schemas (`src/tools/utils.ts`)
|
|
33
|
-
|
|
34
|
-
## Desired End State
|
|
35
|
-
|
|
36
|
-
A fully functional scheduler that:
|
|
37
|
-
1. Stores schedule definitions in SQLite (`scheduled_tasks` table)
|
|
38
|
-
2. Polls for due schedules every 10 seconds (configurable)
|
|
39
|
-
3. Creates tasks via existing `createTaskExtended` when schedules are due
|
|
40
|
-
4. Provides 5 MCP tools for schedule management
|
|
41
|
-
5. Starts on server startup and stops gracefully on shutdown
|
|
42
|
-
6. Supports both cron expressions and interval-based scheduling
|
|
43
|
-
|
|
44
|
-
## Quick Verification Reference
|
|
45
|
-
|
|
46
|
-
Common commands to verify the implementation:
|
|
47
|
-
- `bun run lint` - Linting
|
|
48
|
-
- `bun run typecheck` - Type checking
|
|
49
|
-
- `bun test` - Run tests (if available)
|
|
50
|
-
- `bun run build` - Build
|
|
51
|
-
|
|
52
|
-
Key files to check:
|
|
53
|
-
- `src/be/db.ts` - Schema and database functions
|
|
54
|
-
- `src/scheduler/scheduler.ts` - Core scheduler service
|
|
55
|
-
- `src/tools/schedules/*.ts` - MCP tools
|
|
56
|
-
- `src/http.ts` - Server startup/shutdown integration
|
|
57
|
-
|
|
58
|
-
## What We're NOT Doing
|
|
59
|
-
|
|
60
|
-
- **Catch-up execution**: Missed schedules during downtime will be skipped (user requirement)
|
|
61
|
-
- **Concurrency limits**: No limit on concurrent scheduled task instances (user requirement)
|
|
62
|
-
- **Task dependencies**: Scheduled tasks won't depend on other tasks (user requirement)
|
|
63
|
-
- **Notifications**: No automatic Slack/GitHub notifications (each task defines its own connections)
|
|
64
|
-
- **Horizontal scaling**: Single-instance scheduler (can be added later with leader election)
|
|
65
|
-
- **UI dashboard**: No frontend changes in this phase
|
|
66
|
-
|
|
67
|
-
## Implementation Approach
|
|
68
|
-
|
|
69
|
-
Follow existing patterns:
|
|
70
|
-
1. Add `scheduled_tasks` table schema in `db.ts`
|
|
71
|
-
2. Create scheduler service following `slack/watcher.ts` pattern
|
|
72
|
-
3. Register MCP tools following existing tool patterns
|
|
73
|
-
4. Integrate startup/shutdown in `http.ts`
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## Phase 1: Database Schema & Core Types
|
|
78
|
-
|
|
79
|
-
### Overview
|
|
80
|
-
Add the `scheduled_tasks` table schema and TypeScript types.
|
|
81
|
-
|
|
82
|
-
### Changes Required:
|
|
83
|
-
|
|
84
|
-
#### 1. Schema Definition
|
|
85
|
-
**File**: `src/be/db.ts`
|
|
86
|
-
**Location**: After existing table definitions (~line 190, before indexes)
|
|
87
|
-
|
|
88
|
-
**Add table creation:**
|
|
89
|
-
```sql
|
|
90
|
-
CREATE TABLE IF NOT EXISTS scheduled_tasks (
|
|
91
|
-
id TEXT PRIMARY KEY,
|
|
92
|
-
name TEXT NOT NULL UNIQUE,
|
|
93
|
-
description TEXT,
|
|
94
|
-
cronExpression TEXT,
|
|
95
|
-
intervalMs INTEGER,
|
|
96
|
-
taskTemplate TEXT NOT NULL,
|
|
97
|
-
taskType TEXT,
|
|
98
|
-
tags TEXT DEFAULT '[]',
|
|
99
|
-
priority INTEGER DEFAULT 50,
|
|
100
|
-
targetAgentId TEXT,
|
|
101
|
-
enabled INTEGER DEFAULT 1,
|
|
102
|
-
lastRunAt TEXT,
|
|
103
|
-
nextRunAt TEXT,
|
|
104
|
-
createdByAgentId TEXT,
|
|
105
|
-
timezone TEXT DEFAULT 'UTC',
|
|
106
|
-
createdAt TEXT NOT NULL,
|
|
107
|
-
lastUpdatedAt TEXT NOT NULL,
|
|
108
|
-
CHECK (cronExpression IS NOT NULL OR intervalMs IS NOT NULL)
|
|
109
|
-
)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Add indexes:**
|
|
113
|
-
```sql
|
|
114
|
-
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_enabled ON scheduled_tasks(enabled);
|
|
115
|
-
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_nextRunAt ON scheduled_tasks(nextRunAt);
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
#### 2. Type Definitions
|
|
119
|
-
**File**: `src/types.ts`
|
|
120
|
-
**Location**: After AgentTask definitions
|
|
121
|
-
|
|
122
|
-
**Add new types:**
|
|
123
|
-
```typescript
|
|
124
|
-
export const ScheduledTaskSchema = z.object({
|
|
125
|
-
id: z.uuid(),
|
|
126
|
-
name: z.string().min(1).max(100),
|
|
127
|
-
description: z.string().optional(),
|
|
128
|
-
cronExpression: z.string().optional(),
|
|
129
|
-
intervalMs: z.number().int().positive().optional(),
|
|
130
|
-
taskTemplate: z.string().min(1),
|
|
131
|
-
taskType: z.string().max(50).optional(),
|
|
132
|
-
tags: z.array(z.string()).default([]),
|
|
133
|
-
priority: z.number().int().min(0).max(100).default(50),
|
|
134
|
-
targetAgentId: z.uuid().optional(),
|
|
135
|
-
enabled: z.boolean().default(true),
|
|
136
|
-
lastRunAt: z.iso.datetime().optional(),
|
|
137
|
-
nextRunAt: z.iso.datetime().optional(),
|
|
138
|
-
createdByAgentId: z.uuid().optional(),
|
|
139
|
-
timezone: z.string().default('UTC'),
|
|
140
|
-
createdAt: z.iso.datetime(),
|
|
141
|
-
lastUpdatedAt: z.iso.datetime(),
|
|
142
|
-
}).refine(
|
|
143
|
-
data => data.cronExpression || data.intervalMs,
|
|
144
|
-
{ message: "Either cronExpression or intervalMs must be provided" }
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
export type ScheduledTask = z.infer<typeof ScheduledTaskSchema>;
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
#### 3. Database Helper Functions
|
|
151
|
-
**File**: `src/be/db.ts`
|
|
152
|
-
**Location**: After existing task functions
|
|
153
|
-
|
|
154
|
-
**Add CRUD functions:**
|
|
155
|
-
- `getScheduledTasks(filters?)` - List schedules with optional filters
|
|
156
|
-
- `getScheduledTaskById(id)` - Get single schedule
|
|
157
|
-
- `getScheduledTaskByName(name)` - Get by unique name
|
|
158
|
-
- `createScheduledTask(data)` - Create new schedule
|
|
159
|
-
- `updateScheduledTask(id, data)` - Update existing schedule
|
|
160
|
-
- `deleteScheduledTask(id)` - Delete schedule
|
|
161
|
-
- `getDueScheduledTasks()` - Query `enabled=1 AND nextRunAt <= now`
|
|
162
|
-
|
|
163
|
-
### Success Criteria:
|
|
164
|
-
|
|
165
|
-
#### Automated Verification:
|
|
166
|
-
- [ ] `bun run typecheck` passes
|
|
167
|
-
- [ ] `bun run lint` passes
|
|
168
|
-
|
|
169
|
-
#### Manual Verification:
|
|
170
|
-
- [ ] Database initializes without errors
|
|
171
|
-
- [ ] Can query `scheduled_tasks` table via SQLite CLI
|
|
172
|
-
|
|
173
|
-
**Implementation Note**: After completing this phase, verify schema is created correctly before proceeding.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Phase 2: Scheduler Service
|
|
178
|
-
|
|
179
|
-
### Overview
|
|
180
|
-
Create the core scheduler service that polls for due schedules and creates tasks.
|
|
181
|
-
|
|
182
|
-
### Changes Required:
|
|
183
|
-
|
|
184
|
-
#### 1. Install cron-parser Package
|
|
185
|
-
**Command**: `bun add cron-parser`
|
|
186
|
-
|
|
187
|
-
#### 2. Create Scheduler Service
|
|
188
|
-
**File**: `src/scheduler/scheduler.ts` (new file)
|
|
189
|
-
|
|
190
|
-
**Implementation following slack/watcher.ts pattern:**
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
import { parseExpression } from 'cron-parser';
|
|
194
|
-
import { getDb, createTaskExtended, getDueScheduledTasks, updateScheduledTask } from '../be/db';
|
|
195
|
-
import type { ScheduledTask } from '../types';
|
|
196
|
-
|
|
197
|
-
let schedulerInterval: ReturnType<typeof setInterval> | null = null;
|
|
198
|
-
let isProcessing = false;
|
|
199
|
-
|
|
200
|
-
// Calculate next run time based on cron or interval
|
|
201
|
-
export function calculateNextRun(schedule: ScheduledTask, fromTime: Date = new Date()): string {
|
|
202
|
-
if (schedule.cronExpression) {
|
|
203
|
-
const interval = parseExpression(schedule.cronExpression, {
|
|
204
|
-
currentDate: fromTime,
|
|
205
|
-
tz: schedule.timezone || 'UTC',
|
|
206
|
-
});
|
|
207
|
-
return interval.next().toISOString();
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (schedule.intervalMs) {
|
|
211
|
-
return new Date(fromTime.getTime() + schedule.intervalMs).toISOString();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
throw new Error('Schedule must have cronExpression or intervalMs');
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Execute a single scheduled task
|
|
218
|
-
async function executeSchedule(schedule: ScheduledTask): Promise<void> {
|
|
219
|
-
const now = new Date().toISOString();
|
|
220
|
-
|
|
221
|
-
// Create the actual task
|
|
222
|
-
createTaskExtended(schedule.taskTemplate, {
|
|
223
|
-
creatorAgentId: schedule.createdByAgentId,
|
|
224
|
-
taskType: schedule.taskType,
|
|
225
|
-
tags: [...schedule.tags, 'scheduled', `schedule:${schedule.name}`],
|
|
226
|
-
priority: schedule.priority,
|
|
227
|
-
agentId: schedule.targetAgentId, // null goes to pool
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
// Update lastRunAt and nextRunAt
|
|
231
|
-
const nextRun = calculateNextRun(schedule, new Date());
|
|
232
|
-
updateScheduledTask(schedule.id, {
|
|
233
|
-
lastRunAt: now,
|
|
234
|
-
nextRunAt: nextRun,
|
|
235
|
-
lastUpdatedAt: now,
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
console.log(`[Scheduler] Executed schedule "${schedule.name}", next run: ${nextRun}`);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Main polling function
|
|
242
|
-
export function startScheduler(intervalMs = 10000): void {
|
|
243
|
-
if (schedulerInterval) {
|
|
244
|
-
console.log('[Scheduler] Already running');
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
console.log(`[Scheduler] Starting with ${intervalMs}ms polling interval`);
|
|
249
|
-
|
|
250
|
-
schedulerInterval = setInterval(async () => {
|
|
251
|
-
if (isProcessing) return;
|
|
252
|
-
isProcessing = true;
|
|
253
|
-
|
|
254
|
-
try {
|
|
255
|
-
const dueSchedules = getDueScheduledTasks();
|
|
256
|
-
|
|
257
|
-
for (const schedule of dueSchedules) {
|
|
258
|
-
try {
|
|
259
|
-
await executeSchedule(schedule);
|
|
260
|
-
} catch (err) {
|
|
261
|
-
console.error(`[Scheduler] Error executing "${schedule.name}":`, err);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
} finally {
|
|
265
|
-
isProcessing = false;
|
|
266
|
-
}
|
|
267
|
-
}, intervalMs);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export function stopScheduler(): void {
|
|
271
|
-
if (schedulerInterval) {
|
|
272
|
-
clearInterval(schedulerInterval);
|
|
273
|
-
schedulerInterval = null;
|
|
274
|
-
isProcessing = false;
|
|
275
|
-
console.log('[Scheduler] Stopped');
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Run a schedule immediately (manual trigger)
|
|
280
|
-
export async function runScheduleNow(scheduleId: string): Promise<void> {
|
|
281
|
-
const schedule = getScheduledTaskById(scheduleId);
|
|
282
|
-
if (!schedule) {
|
|
283
|
-
throw new Error(`Schedule not found: ${scheduleId}`);
|
|
284
|
-
}
|
|
285
|
-
if (!schedule.enabled) {
|
|
286
|
-
throw new Error(`Schedule is disabled: ${schedule.name}`);
|
|
287
|
-
}
|
|
288
|
-
await executeSchedule(schedule);
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
#### 3. Create Index File
|
|
293
|
-
**File**: `src/scheduler/index.ts` (new file)
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
export { startScheduler, stopScheduler, runScheduleNow, calculateNextRun } from './scheduler';
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### Success Criteria:
|
|
300
|
-
|
|
301
|
-
#### Automated Verification:
|
|
302
|
-
- [ ] `bun run typecheck` passes
|
|
303
|
-
- [ ] `bun run lint` passes
|
|
304
|
-
- [ ] Package `cron-parser` installed successfully
|
|
305
|
-
|
|
306
|
-
#### Manual Verification:
|
|
307
|
-
- [ ] Scheduler starts without errors
|
|
308
|
-
- [ ] Test cron parsing: `parseExpression('0 9 * * *')` returns valid next date
|
|
309
|
-
|
|
310
|
-
**Implementation Note**: Test cron-parser integration before proceeding.
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## Phase 3: MCP Tools
|
|
315
|
-
|
|
316
|
-
### Overview
|
|
317
|
-
Create 5 MCP tools for schedule management: list-schedules, create-schedule, update-schedule, delete-schedule, run-schedule-now.
|
|
318
|
-
|
|
319
|
-
### Changes Required:
|
|
320
|
-
|
|
321
|
-
#### 1. Create Tools Directory
|
|
322
|
-
**Directory**: `src/tools/schedules/`
|
|
323
|
-
|
|
324
|
-
#### 2. list-schedules Tool
|
|
325
|
-
**File**: `src/tools/schedules/list-schedules.ts`
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
import type { McpServer } from '@anthropic-ai/sdk/resources/mcp';
|
|
329
|
-
import { z } from 'zod';
|
|
330
|
-
import { createToolRegistrar } from '../utils';
|
|
331
|
-
import { getScheduledTasks } from '../../be/db';
|
|
332
|
-
import { ScheduledTaskSchema } from '../../types';
|
|
333
|
-
|
|
334
|
-
export const registerListSchedulesTool = (server: McpServer) => {
|
|
335
|
-
createToolRegistrar(server)(
|
|
336
|
-
'list-schedules',
|
|
337
|
-
{
|
|
338
|
-
title: 'List scheduled tasks',
|
|
339
|
-
description: 'View all scheduled tasks with optional filters.',
|
|
340
|
-
inputSchema: z.object({
|
|
341
|
-
enabled: z.boolean().optional().describe('Filter by enabled status'),
|
|
342
|
-
name: z.string().optional().describe('Filter by name (partial match)'),
|
|
343
|
-
}),
|
|
344
|
-
outputSchema: z.object({
|
|
345
|
-
success: z.boolean(),
|
|
346
|
-
schedules: z.array(ScheduledTaskSchema),
|
|
347
|
-
count: z.number(),
|
|
348
|
-
}),
|
|
349
|
-
},
|
|
350
|
-
async ({ enabled, name }, requestInfo, _meta) => {
|
|
351
|
-
const schedules = getScheduledTasks({ enabled, name });
|
|
352
|
-
return {
|
|
353
|
-
success: true,
|
|
354
|
-
schedules,
|
|
355
|
-
count: schedules.length,
|
|
356
|
-
};
|
|
357
|
-
},
|
|
358
|
-
);
|
|
359
|
-
};
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
#### 3. create-schedule Tool
|
|
363
|
-
**File**: `src/tools/schedules/create-schedule.ts`
|
|
364
|
-
|
|
365
|
-
Implements schedule creation with:
|
|
366
|
-
- Required: name, taskTemplate
|
|
367
|
-
- Optional: cronExpression, intervalMs, description, taskType, tags, priority, targetAgentId, timezone
|
|
368
|
-
- Validates cron expression syntax
|
|
369
|
-
- Calculates initial nextRunAt
|
|
370
|
-
- Respects schedule ownership (createdByAgentId from requestInfo, or defaults to lead)
|
|
371
|
-
|
|
372
|
-
#### 4. update-schedule Tool
|
|
373
|
-
**File**: `src/tools/schedules/update-schedule.ts`
|
|
374
|
-
|
|
375
|
-
Implements schedule updates:
|
|
376
|
-
- Update by ID or name
|
|
377
|
-
- Can enable/disable schedule
|
|
378
|
-
- Recalculates nextRunAt if cron/interval changes
|
|
379
|
-
- Only creator or lead can update
|
|
380
|
-
|
|
381
|
-
#### 5. delete-schedule Tool
|
|
382
|
-
**File**: `src/tools/schedules/delete-schedule.ts`
|
|
383
|
-
|
|
384
|
-
Implements schedule deletion:
|
|
385
|
-
- Delete by ID or name
|
|
386
|
-
- Only creator or lead can delete
|
|
387
|
-
|
|
388
|
-
#### 6. run-schedule-now Tool
|
|
389
|
-
**File**: `src/tools/schedules/run-schedule-now.ts`
|
|
390
|
-
|
|
391
|
-
Implements immediate execution:
|
|
392
|
-
- Trigger by ID or name
|
|
393
|
-
- Creates task immediately
|
|
394
|
-
- Updates lastRunAt but not nextRunAt (regular schedule continues)
|
|
395
|
-
|
|
396
|
-
#### 7. Index File
|
|
397
|
-
**File**: `src/tools/schedules/index.ts`
|
|
398
|
-
|
|
399
|
-
```typescript
|
|
400
|
-
export { registerListSchedulesTool } from './list-schedules';
|
|
401
|
-
export { registerCreateScheduleTool } from './create-schedule';
|
|
402
|
-
export { registerUpdateScheduleTool } from './update-schedule';
|
|
403
|
-
export { registerDeleteScheduleTool } from './delete-schedule';
|
|
404
|
-
export { registerRunScheduleNowTool } from './run-schedule-now';
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### Success Criteria:
|
|
408
|
-
|
|
409
|
-
#### Automated Verification:
|
|
410
|
-
- [ ] `bun run typecheck` passes
|
|
411
|
-
- [ ] `bun run lint` passes
|
|
412
|
-
|
|
413
|
-
#### Manual Verification:
|
|
414
|
-
- [ ] Each tool registers without errors
|
|
415
|
-
- [ ] Tools appear in MCP tool list
|
|
416
|
-
|
|
417
|
-
**Implementation Note**: After completing this phase, test each tool manually via MCP client.
|
|
418
|
-
|
|
419
|
-
---
|
|
420
|
-
|
|
421
|
-
## Phase 4: Server Integration
|
|
422
|
-
|
|
423
|
-
### Overview
|
|
424
|
-
Wire up scheduler startup/shutdown and register MCP tools.
|
|
425
|
-
|
|
426
|
-
### Changes Required:
|
|
427
|
-
|
|
428
|
-
#### 1. Add Capability Gate
|
|
429
|
-
**File**: `src/server.ts`
|
|
430
|
-
|
|
431
|
-
Add new capability for scheduling:
|
|
432
|
-
```typescript
|
|
433
|
-
const DEFAULT_CAPABILITIES = "core,task-pool,messaging,profiles,services,scheduling";
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
Register tools if capability enabled:
|
|
437
|
-
```typescript
|
|
438
|
-
if (hasCapability("scheduling")) {
|
|
439
|
-
registerListSchedulesTool(server);
|
|
440
|
-
registerCreateScheduleTool(server);
|
|
441
|
-
registerUpdateScheduleTool(server);
|
|
442
|
-
registerDeleteScheduleTool(server);
|
|
443
|
-
registerRunScheduleNowTool(server);
|
|
444
|
-
}
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
#### 2. Start Scheduler on Server Start
|
|
448
|
-
**File**: `src/http.ts`
|
|
449
|
-
|
|
450
|
-
In `httpServer.listen()` callback:
|
|
451
|
-
```typescript
|
|
452
|
-
// Start scheduler (if configured)
|
|
453
|
-
if (hasCapability("scheduling")) {
|
|
454
|
-
const { startScheduler } = await import('./scheduler');
|
|
455
|
-
startScheduler(Number(process.env.SCHEDULER_INTERVAL_MS) || 10000);
|
|
456
|
-
}
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
#### 3. Stop Scheduler on Shutdown
|
|
460
|
-
**File**: `src/http.ts`
|
|
461
|
-
|
|
462
|
-
In `shutdown()` function:
|
|
463
|
-
```typescript
|
|
464
|
-
// Stop scheduler
|
|
465
|
-
if (hasCapability("scheduling")) {
|
|
466
|
-
const { stopScheduler } = await import('./scheduler');
|
|
467
|
-
stopScheduler();
|
|
468
|
-
}
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
#### 4. Environment Variable Documentation
|
|
472
|
-
**File**: `.env.example`
|
|
473
|
-
|
|
474
|
-
Add:
|
|
475
|
-
```bash
|
|
476
|
-
# Scheduler configuration
|
|
477
|
-
SCHEDULER_INTERVAL_MS=10000 # Polling interval (default: 10 seconds)
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
### Success Criteria:
|
|
481
|
-
|
|
482
|
-
#### Automated Verification:
|
|
483
|
-
- [ ] `bun run typecheck` passes
|
|
484
|
-
- [ ] `bun run lint` passes
|
|
485
|
-
|
|
486
|
-
#### Manual Verification:
|
|
487
|
-
- [ ] Server starts with scheduler running (check logs)
|
|
488
|
-
- [ ] Server shutdown stops scheduler cleanly
|
|
489
|
-
- [ ] Tools available via MCP when capability enabled
|
|
490
|
-
|
|
491
|
-
---
|
|
492
|
-
|
|
493
|
-
## Phase 5: Testing & Documentation
|
|
494
|
-
|
|
495
|
-
### Overview
|
|
496
|
-
Add tests and update documentation.
|
|
497
|
-
|
|
498
|
-
### Changes Required:
|
|
499
|
-
|
|
500
|
-
#### 1. Unit Tests
|
|
501
|
-
**File**: `src/scheduler/scheduler.test.ts`
|
|
502
|
-
|
|
503
|
-
Test cases:
|
|
504
|
-
- `calculateNextRun` with cron expression
|
|
505
|
-
- `calculateNextRun` with interval
|
|
506
|
-
- `calculateNextRun` with timezone
|
|
507
|
-
- Scheduler starts and stops correctly
|
|
508
|
-
|
|
509
|
-
#### 2. Update MCP.md
|
|
510
|
-
**File**: `MCP.md`
|
|
511
|
-
|
|
512
|
-
Add section documenting new tools:
|
|
513
|
-
- `list-schedules`
|
|
514
|
-
- `create-schedule`
|
|
515
|
-
- `update-schedule`
|
|
516
|
-
- `delete-schedule`
|
|
517
|
-
- `run-schedule-now`
|
|
518
|
-
|
|
519
|
-
Include examples for cron and interval scheduling.
|
|
520
|
-
|
|
521
|
-
#### 3. Update README.md
|
|
522
|
-
**File**: `README.md`
|
|
523
|
-
|
|
524
|
-
Add brief mention of scheduling capability in features section.
|
|
525
|
-
|
|
526
|
-
### Success Criteria:
|
|
527
|
-
|
|
528
|
-
#### Automated Verification:
|
|
529
|
-
- [ ] `bun test` passes (if tests are set up)
|
|
530
|
-
- [ ] `bun run lint` passes
|
|
531
|
-
|
|
532
|
-
#### Manual Verification:
|
|
533
|
-
- [ ] Documentation is clear and accurate
|
|
534
|
-
- [ ] Examples work as documented
|
|
535
|
-
|
|
536
|
-
---
|
|
537
|
-
|
|
538
|
-
## Testing Strategy
|
|
539
|
-
|
|
540
|
-
### Unit Tests
|
|
541
|
-
- `calculateNextRun` function with various cron expressions
|
|
542
|
-
- Database CRUD functions for scheduled_tasks
|
|
543
|
-
- Cron expression validation
|
|
544
|
-
|
|
545
|
-
### Integration Tests
|
|
546
|
-
- End-to-end: create schedule -> wait for execution -> verify task created
|
|
547
|
-
- Tool validation: verify MCP tool schemas
|
|
548
|
-
|
|
549
|
-
### Manual Testing Steps
|
|
550
|
-
1. Create a schedule with 1-minute interval
|
|
551
|
-
2. Wait for task to be created
|
|
552
|
-
3. Verify task appears in task list with correct metadata
|
|
553
|
-
4. Disable schedule, verify no new tasks
|
|
554
|
-
5. Run schedule manually, verify task created
|
|
555
|
-
6. Delete schedule, verify removal
|
|
556
|
-
|
|
557
|
-
---
|
|
558
|
-
|
|
559
|
-
## References
|
|
560
|
-
|
|
561
|
-
- Research document: `thoughts/shared/research/2026-01-15-scheduled-tasks.md`
|
|
562
|
-
- Existing polling pattern: `src/slack/watcher.ts`
|
|
563
|
-
- Task creation: `src/be/db.ts`
|
|
564
|
-
- Tool registration: `src/tools/utils.ts`
|
|
565
|
-
- cron-parser docs: https://www.npmjs.com/package/cron-parser
|