@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,390 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-01-15
|
|
3
|
-
topic: "Scheduled Tasks for the Agent Swarm"
|
|
4
|
-
researcher: "Claude"
|
|
5
|
-
status: "complete"
|
|
6
|
-
tags: [scheduling, cron, sqlite, task-automation]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Research: Scheduled Tasks for the Agent Swarm
|
|
10
|
-
|
|
11
|
-
**Date**: 2026-01-15
|
|
12
|
-
**Status**: Complete
|
|
13
|
-
|
|
14
|
-
## Research Question
|
|
15
|
-
|
|
16
|
-
How to implement scheduled/recurring tasks in the agent swarm architecture, including options for task scheduling, integration patterns, persistence mechanisms, worker assignment, and relevant libraries.
|
|
17
|
-
|
|
18
|
-
## Summary
|
|
19
|
-
|
|
20
|
-
This research explores options for implementing scheduled tasks in the agent-swarm architecture. The existing system uses SQLite for persistence with Bun runtime. After analyzing four major scheduling libraries (node-cron, BullMQ, Agenda, Bree) and the current codebase architecture, the **recommended approach is a native SQLite-based scheduler** that integrates directly with the existing task system, avoiding external dependencies like Redis or MongoDB.
|
|
21
|
-
|
|
22
|
-
## Detailed Findings
|
|
23
|
-
|
|
24
|
-
### 1. Current Agent-Swarm Architecture
|
|
25
|
-
|
|
26
|
-
The agent-swarm system is built with:
|
|
27
|
-
|
|
28
|
-
- **Runtime**: Bun (TypeScript)
|
|
29
|
-
- **Database**: SQLite with WAL mode (`src/be/db.ts`)
|
|
30
|
-
- **Task Management**: `agent_tasks` table with statuses: `unassigned`, `offered`, `reviewing`, `pending`, `in_progress`, `completed`, `failed`
|
|
31
|
-
- **Task Assignment**: Via `send-task` tool, supports direct assignment, offer mode, and task pool
|
|
32
|
-
- **Background Processing**: Uses `setInterval` for polling (e.g., Slack watcher at 3s intervals)
|
|
33
|
-
- **No External Dependencies**: Currently no Redis, MongoDB, or external queue systems
|
|
34
|
-
|
|
35
|
-
**Key Files:**
|
|
36
|
-
| File | Purpose |
|
|
37
|
-
|------|---------|
|
|
38
|
-
| `src/be/db.ts` | SQLite database initialization and schema |
|
|
39
|
-
| `src/types.ts` | AgentTask schema with status, priority, dependencies |
|
|
40
|
-
| `src/tools/send-task.ts` | Task creation and assignment logic |
|
|
41
|
-
| `src/slack/watcher.ts` | Example of interval-based polling pattern |
|
|
42
|
-
|
|
43
|
-
### 2. Scheduling Library Comparison
|
|
44
|
-
|
|
45
|
-
| Feature | node-cron | BullMQ | Agenda | Bree |
|
|
46
|
-
|---------|-----------|--------|--------|------|
|
|
47
|
-
| **Backend** | In-memory | Redis | MongoDB | In-memory (workers) |
|
|
48
|
-
| **Persistence** | No | Yes | Yes | No (DIY) |
|
|
49
|
-
| **Horizontal Scaling** | No | Yes | Yes | No |
|
|
50
|
-
| **Cron Expressions** | Yes | Yes | Yes | Yes |
|
|
51
|
-
| **Human-Readable** | No | No | Yes | Yes |
|
|
52
|
-
| **Retries** | No | Yes | Manual | No |
|
|
53
|
-
| **TypeScript** | Yes (v4+) | Native | Yes | Yes |
|
|
54
|
-
| **Weekly Downloads** | ~1.6M | ~2.1M | ~137K | ~28K |
|
|
55
|
-
| **External Deps** | None | Redis | MongoDB | None |
|
|
56
|
-
|
|
57
|
-
#### node-cron
|
|
58
|
-
- **Pros**: Lightweight, zero dependencies, simple API
|
|
59
|
-
- **Cons**: No persistence, jobs lost on restart, no distributed support
|
|
60
|
-
- **Best For**: Simple in-process scheduling where persistence isn't critical
|
|
61
|
-
|
|
62
|
-
#### BullMQ
|
|
63
|
-
- **Pros**: High performance, persistence via Redis, horizontal scaling, retries, rate limiting, parent-child job flows
|
|
64
|
-
- **Cons**: Requires Redis infrastructure, adds operational complexity
|
|
65
|
-
- **Best For**: High-volume distributed job queues
|
|
66
|
-
|
|
67
|
-
#### Agenda
|
|
68
|
-
- **Pros**: MongoDB persistence, human-readable scheduling syntax, priority support
|
|
69
|
-
- **Cons**: Requires MongoDB, slower maintenance cycle, some known issues with cancellation
|
|
70
|
-
- **Best For**: MongoDB-based applications needing job scheduling
|
|
71
|
-
|
|
72
|
-
#### Bree
|
|
73
|
-
- **Pros**: Worker thread isolation, no database required, multiple time formats
|
|
74
|
-
- **Cons**: No built-in persistence, no horizontal scaling, smaller community
|
|
75
|
-
- **Best For**: CPU-intensive jobs requiring process isolation
|
|
76
|
-
|
|
77
|
-
### 3. Integration Patterns for Scheduled Tasks
|
|
78
|
-
|
|
79
|
-
#### Option A: Native SQLite-Based Scheduler (Recommended)
|
|
80
|
-
|
|
81
|
-
Create a new `scheduled_tasks` table that stores scheduling configurations and uses the existing `agent_tasks` system for execution.
|
|
82
|
-
|
|
83
|
-
**Schema Design:**
|
|
84
|
-
```sql
|
|
85
|
-
CREATE TABLE scheduled_tasks (
|
|
86
|
-
id TEXT PRIMARY KEY,
|
|
87
|
-
name TEXT NOT NULL UNIQUE,
|
|
88
|
-
description TEXT,
|
|
89
|
-
cronExpression TEXT, -- Cron: "0 9 * * *"
|
|
90
|
-
intervalMs INTEGER, -- Interval: 300000 (5 min)
|
|
91
|
-
taskTemplate TEXT NOT NULL, -- Task description template
|
|
92
|
-
taskType TEXT, -- e.g., "maintenance", "report"
|
|
93
|
-
tags TEXT DEFAULT '[]',
|
|
94
|
-
priority INTEGER DEFAULT 50,
|
|
95
|
-
targetAgentId TEXT, -- Specific agent, or null for pool
|
|
96
|
-
enabled INTEGER DEFAULT 1,
|
|
97
|
-
lastRunAt TEXT,
|
|
98
|
-
nextRunAt TEXT,
|
|
99
|
-
createdAt TEXT NOT NULL,
|
|
100
|
-
lastUpdatedAt TEXT NOT NULL
|
|
101
|
-
);
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
**Polling Mechanism:**
|
|
105
|
-
```typescript
|
|
106
|
-
// Similar to slack/watcher.ts pattern
|
|
107
|
-
let schedulerInterval: ReturnType<typeof setInterval> | null = null;
|
|
108
|
-
|
|
109
|
-
export function startScheduler(intervalMs = 10000): void {
|
|
110
|
-
schedulerInterval = setInterval(async () => {
|
|
111
|
-
const now = new Date().toISOString();
|
|
112
|
-
const dueTasks = getDb().prepare(`
|
|
113
|
-
SELECT * FROM scheduled_tasks
|
|
114
|
-
WHERE enabled = 1 AND nextRunAt <= ?
|
|
115
|
-
`).all(now);
|
|
116
|
-
|
|
117
|
-
for (const scheduled of dueTasks) {
|
|
118
|
-
// Create task via existing system
|
|
119
|
-
createTaskExtended(scheduled.taskTemplate, {
|
|
120
|
-
taskType: scheduled.taskType,
|
|
121
|
-
tags: JSON.parse(scheduled.tags),
|
|
122
|
-
priority: scheduled.priority,
|
|
123
|
-
agentId: scheduled.targetAgentId,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Update next run time
|
|
127
|
-
const nextRun = calculateNextRun(scheduled);
|
|
128
|
-
updateScheduledTask(scheduled.id, { lastRunAt: now, nextRunAt: nextRun });
|
|
129
|
-
}
|
|
130
|
-
}, intervalMs);
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**Pros:**
|
|
135
|
-
- Zero external dependencies
|
|
136
|
-
- Uses existing SQLite persistence (survives restarts)
|
|
137
|
-
- Integrates naturally with existing task flow
|
|
138
|
-
- Consistent with current architecture patterns
|
|
139
|
-
|
|
140
|
-
**Cons:**
|
|
141
|
-
- Single-instance only (no distributed scheduling)
|
|
142
|
-
- Requires implementing cron parsing (use `cron-parser` package)
|
|
143
|
-
|
|
144
|
-
#### Option B: node-cron with Database Persistence Layer
|
|
145
|
-
|
|
146
|
-
Use node-cron for scheduling mechanics but persist schedule definitions in SQLite.
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
import cron from 'node-cron';
|
|
150
|
-
|
|
151
|
-
// On startup: reload schedules from database
|
|
152
|
-
const schedules = getScheduledTasksFromDb();
|
|
153
|
-
for (const schedule of schedules) {
|
|
154
|
-
cron.schedule(schedule.cronExpression, () => {
|
|
155
|
-
createTaskExtended(schedule.taskTemplate, { ... });
|
|
156
|
-
}, { name: schedule.name });
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Pros:**
|
|
161
|
-
- Mature cron parsing library
|
|
162
|
-
- Simple integration
|
|
163
|
-
|
|
164
|
-
**Cons:**
|
|
165
|
-
- Active schedules lost on restart (must re-register)
|
|
166
|
-
- Doesn't track lastRunAt automatically
|
|
167
|
-
|
|
168
|
-
#### Option C: BullMQ for Full-Featured Scheduling
|
|
169
|
-
|
|
170
|
-
Add Redis and use BullMQ for a production-grade solution.
|
|
171
|
-
|
|
172
|
-
**Pros:**
|
|
173
|
-
- Robust, battle-tested
|
|
174
|
-
- Horizontal scaling ready
|
|
175
|
-
- Built-in retries, rate limiting
|
|
176
|
-
|
|
177
|
-
**Cons:**
|
|
178
|
-
- Adds Redis dependency (significant operational overhead)
|
|
179
|
-
- Over-engineered for current single-server setup
|
|
180
|
-
- Inconsistent with existing architecture philosophy
|
|
181
|
-
|
|
182
|
-
### 4. Persistence Mechanisms
|
|
183
|
-
|
|
184
|
-
#### Current State
|
|
185
|
-
The agent-swarm already uses SQLite with WAL mode for durability:
|
|
186
|
-
- Jobs persist in `agent_tasks` table
|
|
187
|
-
- WAL mode ensures crash recovery
|
|
188
|
-
- Schema migrations handled at startup
|
|
189
|
-
|
|
190
|
-
#### Recommended Approach
|
|
191
|
-
Extend SQLite with a `scheduled_tasks` table:
|
|
192
|
-
|
|
193
|
-
1. **Schedule Definition Persistence**: Store cron expressions, intervals, and task templates
|
|
194
|
-
2. **Run History**: Track `lastRunAt`, `nextRunAt` for each schedule
|
|
195
|
-
3. **Task Creation Audit**: Created tasks include `scheduledTaskId` foreign key for traceability
|
|
196
|
-
|
|
197
|
-
### 5. Worker Assignment Strategies
|
|
198
|
-
|
|
199
|
-
#### Strategy 1: Pool-Based (Default)
|
|
200
|
-
Create tasks in the unassigned pool; workers claim via `task-action claim`.
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
const task = createTaskExtended(template, {
|
|
204
|
-
taskType: "scheduled",
|
|
205
|
-
tags: ["cron", scheduleName],
|
|
206
|
-
priority: 50,
|
|
207
|
-
// No agentId = goes to pool
|
|
208
|
-
});
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**Best For**: Load balancing across available workers
|
|
212
|
-
|
|
213
|
-
#### Strategy 2: Targeted Assignment
|
|
214
|
-
Assign to a specific agent (e.g., maintenance tasks to a dedicated worker).
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
const task = createTaskExtended(template, {
|
|
218
|
-
agentId: config.maintenanceAgentId,
|
|
219
|
-
taskType: "scheduled",
|
|
220
|
-
});
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
**Best For**: Specialized tasks requiring specific agent capabilities
|
|
224
|
-
|
|
225
|
-
#### Strategy 3: Round-Robin or Capability-Based
|
|
226
|
-
Query available workers and select based on capacity or capabilities.
|
|
227
|
-
|
|
228
|
-
```typescript
|
|
229
|
-
const workers = getIdleWorkersByCapability(["reporting"]);
|
|
230
|
-
const target = workers[0]; // or round-robin selection
|
|
231
|
-
createTaskExtended(template, { agentId: target.id });
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
**Best For**: Balanced distribution with capability matching
|
|
235
|
-
|
|
236
|
-
#### Strategy 4: Offer Mode
|
|
237
|
-
Offer scheduled tasks to agents for acceptance.
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
createTaskExtended(template, {
|
|
241
|
-
offeredTo: targetAgentId,
|
|
242
|
-
// Agent must accept within timeout
|
|
243
|
-
});
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**Best For**: Tasks requiring agent consent
|
|
247
|
-
|
|
248
|
-
### 6. Relevant Libraries
|
|
249
|
-
|
|
250
|
-
| Library | Purpose | npm Weekly DL |
|
|
251
|
-
|---------|---------|---------------|
|
|
252
|
-
| `cron-parser` | Parse cron expressions, calculate next run | ~10M |
|
|
253
|
-
| `croner` | Modern cron scheduler with timezone support | ~500K |
|
|
254
|
-
| `node-cron` | Simple cron-based scheduling | ~1.6M |
|
|
255
|
-
| `bullmq` | Redis-backed job queue | ~2.1M |
|
|
256
|
-
| `agenda` | MongoDB-backed job scheduler | ~137K |
|
|
257
|
-
| `bree` | Worker thread scheduler | ~28K |
|
|
258
|
-
| `ms` | Convert time strings ("5m", "1h") to ms | ~130M |
|
|
259
|
-
| `human-interval` | Parse "every 5 minutes" to ms | ~200K |
|
|
260
|
-
|
|
261
|
-
**Recommended Additions:**
|
|
262
|
-
- `cron-parser` - For parsing cron expressions in native solution
|
|
263
|
-
- `ms` - Already widely used; useful for interval parsing
|
|
264
|
-
|
|
265
|
-
## Recommendations
|
|
266
|
-
|
|
267
|
-
### Primary Recommendation: Native SQLite-Based Scheduler
|
|
268
|
-
|
|
269
|
-
Given the existing architecture (SQLite-only, single-instance, Bun runtime), implement a **native scheduler** that:
|
|
270
|
-
|
|
271
|
-
1. **Stores schedules in SQLite** (`scheduled_tasks` table)
|
|
272
|
-
2. **Uses interval-based polling** (consistent with `slack/watcher.ts` pattern)
|
|
273
|
-
3. **Creates tasks via existing `createTaskExtended`** function
|
|
274
|
-
4. **Parses cron expressions** via `cron-parser` package
|
|
275
|
-
5. **Supports both cron and interval scheduling**
|
|
276
|
-
|
|
277
|
-
**Why This Approach:**
|
|
278
|
-
- Zero new infrastructure (no Redis/MongoDB)
|
|
279
|
-
- Survives restarts via SQLite persistence
|
|
280
|
-
- Integrates seamlessly with existing task flow
|
|
281
|
-
- Consistent with architectural philosophy
|
|
282
|
-
- Simple to implement and maintain
|
|
283
|
-
|
|
284
|
-
### Implementation Considerations
|
|
285
|
-
|
|
286
|
-
1. **Cron Parser**: Use `cron-parser` for robust cron expression handling
|
|
287
|
-
```typescript
|
|
288
|
-
import { parseExpression } from 'cron-parser';
|
|
289
|
-
const interval = parseExpression('0 9 * * *');
|
|
290
|
-
const nextRun = interval.next().toISOString();
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
2. **Timezone Support**: Store timezone in schedule definition; pass to cron-parser
|
|
294
|
-
|
|
295
|
-
3. **Idempotency**: Generate deterministic task IDs to prevent duplicate creation if scheduler runs multiple times
|
|
296
|
-
|
|
297
|
-
4. **Graceful Shutdown**: Clear interval on SIGTERM/SIGINT
|
|
298
|
-
|
|
299
|
-
5. **Monitoring**: Add MCP tools for:
|
|
300
|
-
- `list-schedules` - View all scheduled tasks
|
|
301
|
-
- `create-schedule` - Add new schedule
|
|
302
|
-
- `update-schedule` - Modify/enable/disable
|
|
303
|
-
- `delete-schedule` - Remove schedule
|
|
304
|
-
- `run-schedule-now` - Trigger immediate execution
|
|
305
|
-
|
|
306
|
-
6. **UI Integration**: Add scheduled tasks panel to the existing dashboard
|
|
307
|
-
|
|
308
|
-
### Potential Challenges
|
|
309
|
-
|
|
310
|
-
| Challenge | Mitigation |
|
|
311
|
-
|-----------|------------|
|
|
312
|
-
| Missed executions during downtime | Track `lastRunAt` and `nextRunAt`; optionally catch up missed runs on startup |
|
|
313
|
-
| Overlapping executions | Track `running` state; skip if previous instance still running |
|
|
314
|
-
| Time drift | Use monotonic clock or external time source for critical schedules |
|
|
315
|
-
| Database locking | SQLite WAL mode handles concurrent reads well; use transactions for writes |
|
|
316
|
-
| Horizontal scaling (future) | Design schema to support leader election or external coordination later |
|
|
317
|
-
|
|
318
|
-
### Future Enhancements (if needed)
|
|
319
|
-
|
|
320
|
-
If horizontal scaling becomes necessary:
|
|
321
|
-
1. Add leader election (e.g., via SQLite row lock or external service)
|
|
322
|
-
2. Consider migrating to BullMQ with Redis for distributed scheduling
|
|
323
|
-
3. Implement schedule sharding across instances
|
|
324
|
-
|
|
325
|
-
## Design Decisions (Answered)
|
|
326
|
-
|
|
327
|
-
1. **Catch-up policy**: Missed scheduled runs will be **skipped** (not executed on startup)
|
|
328
|
-
|
|
329
|
-
2. **Concurrency limits**: **No limits** - just create tasks and let agent config handle them based on infrastructure
|
|
330
|
-
|
|
331
|
-
3. **Schedule ownership**: Optionally define who can create schedules; if not specified, **defaults to lead** for delegation
|
|
332
|
-
|
|
333
|
-
4. **Notification**: **No automatic notifications** - each task will define what it connects to
|
|
334
|
-
|
|
335
|
-
5. **Dependencies**: **Not needed** - scheduled tasks won't depend on other tasks
|
|
336
|
-
|
|
337
|
-
## Code References
|
|
338
|
-
|
|
339
|
-
- `src/be/db.ts` - Database initialization, schema, migrations
|
|
340
|
-
- `src/types.ts` - AgentTask schema definition
|
|
341
|
-
- `src/tools/send-task.ts` - Task creation and assignment
|
|
342
|
-
- `src/slack/watcher.ts` - Interval-based polling pattern example
|
|
343
|
-
- `src/tools/task-action.ts` - Task pool operations (claim, release, accept, reject)
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
## Appendix: Library Deep Dives
|
|
348
|
-
|
|
349
|
-
### node-cron Details
|
|
350
|
-
|
|
351
|
-
- **Version**: 4.0.0 (May 2025)
|
|
352
|
-
- **GitHub Stars**: ~3,200
|
|
353
|
-
- **Syntax**: Standard crontab with optional seconds field
|
|
354
|
-
- **Key Methods**: `schedule()`, `validate()`, `getTasks()`
|
|
355
|
-
- **Options**: `scheduled`, `timezone`, `name`, `runOnInit`, `recoverMissedExecutions`
|
|
356
|
-
|
|
357
|
-
### BullMQ Details
|
|
358
|
-
|
|
359
|
-
- **Version**: 5.x (Jan 2026)
|
|
360
|
-
- **GitHub Stars**: ~8,300
|
|
361
|
-
- **Architecture**: Redis Streams for persistence and coordination
|
|
362
|
-
- **Key Features**: Delayed jobs, repeatable jobs, priorities, retries, rate limiting, parent-child flows
|
|
363
|
-
- **Scaling**: Horizontal via multiple workers across machines
|
|
364
|
-
|
|
365
|
-
### Agenda Details
|
|
366
|
-
|
|
367
|
-
- **Version**: 5.0.0 (Nov 2024)
|
|
368
|
-
- **GitHub Stars**: ~9,600
|
|
369
|
-
- **Architecture**: MongoDB-backed with polling mechanism
|
|
370
|
-
- **Key Features**: Human-readable scheduling, priorities, concurrency control
|
|
371
|
-
- **Note**: Consider `@hokify/agenda` fork for TypeScript improvements
|
|
372
|
-
|
|
373
|
-
### Bree Details
|
|
374
|
-
|
|
375
|
-
- **Version**: 9.2.8 (Jan 2026)
|
|
376
|
-
- **GitHub Stars**: ~3,248
|
|
377
|
-
- **Architecture**: Node.js worker threads for sandboxed execution
|
|
378
|
-
- **Key Features**: Process isolation, multiple time formats, graceful shutdown
|
|
379
|
-
- **Note**: No built-in persistence; requires DIY implementation
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
**Sources:**
|
|
384
|
-
- [node-cron GitHub](https://github.com/node-cron/node-cron)
|
|
385
|
-
- [BullMQ Documentation](https://docs.bullmq.io/)
|
|
386
|
-
- [Agenda GitHub](https://github.com/agenda/agenda)
|
|
387
|
-
- [Bree GitHub](https://github.com/breejs/bree)
|
|
388
|
-
- [Better Stack: Schedulers in Node](https://betterstack.com/community/guides/scaling-nodejs/best-nodejs-schedulers/)
|
|
389
|
-
- [LogRocket: Comparing Node.js Schedulers](https://blog.logrocket.com/comparing-best-node-js-schedulers/)
|
|
390
|
-
- [cron-parser npm](https://www.npmjs.com/package/cron-parser)
|