@desplega.ai/agent-swarm 1.20.0 → 1.49.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/.claude/settings.json +84 -0
- package/.claude/settings.local.json +3 -1
- package/.entire/settings.json +4 -0
- package/.env.docker.example +40 -23
- package/.env.example +39 -1
- package/.github/ISSUE_TEMPLATE/bug_report.yml +78 -0
- package/.github/ISSUE_TEMPLATE/community-template.yml +77 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +29 -0
- package/.github/workflows/ci.yml +3 -27
- package/.github/workflows/docker-and-deploy.yml +20 -5
- package/.github/workflows/merge-gate.yml +233 -0
- package/.opencode/plugins/entire.ts +133 -0
- package/.superset/config.json +6 -0
- package/.wts-setup.ts +103 -34
- package/CHANGELOG.md +447 -0
- package/CLAUDE.md +422 -5
- package/CONTRIBUTING.md +46 -1
- package/DEPLOYMENT.md +26 -9
- package/Dockerfile +15 -7
- package/Dockerfile.worker +99 -67
- package/MCP.md +452 -17
- package/README.md +271 -169
- package/api-entrypoint.sh +56 -0
- package/depot.json +1 -0
- package/docker-compose.example.yml +194 -3
- package/docker-compose.local.yml +119 -0
- package/docker-entrypoint.sh +393 -113
- package/docs-site/app/api/search/route.ts +4 -0
- package/docs-site/app/docs/[[...slug]]/page.tsx +87 -0
- package/docs-site/app/docs/layout.tsx +12 -0
- package/docs-site/app/globals.css +24 -0
- package/docs-site/app/layout.config.tsx +34 -0
- package/docs-site/app/layout.tsx +119 -0
- package/docs-site/app/llms-full.txt/route.ts +11 -0
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +24 -0
- package/docs-site/app/llms.txt/route.ts +8 -0
- package/docs-site/app/page.tsx +5 -0
- package/docs-site/app/robots.ts +13 -0
- package/docs-site/app/sitemap.ts +37 -0
- package/docs-site/components/api-page.client.tsx +4 -0
- package/docs-site/components/api-page.tsx +7 -0
- package/docs-site/components/mdx/mermaid.tsx +55 -0
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +117 -0
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +77 -0
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +96 -0
- package/docs-site/content/docs/(documentation)/architecture/meta.json +4 -0
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +172 -0
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +98 -0
- package/docs-site/content/docs/(documentation)/concepts/meta.json +4 -0
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +136 -0
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +104 -0
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +148 -0
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +209 -0
- package/docs-site/content/docs/(documentation)/contributing.mdx +158 -0
- package/docs-site/content/docs/(documentation)/getting-started.mdx +157 -0
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +79 -0
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +171 -0
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +81 -0
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +93 -0
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +98 -0
- package/docs-site/content/docs/(documentation)/guides/meta.json +13 -0
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +52 -0
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +179 -0
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +154 -0
- package/docs-site/content/docs/(documentation)/index.mdx +65 -0
- package/docs-site/content/docs/(documentation)/meta.json +19 -0
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +241 -0
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +205 -0
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +449 -0
- package/docs-site/content/docs/(documentation)/reference/meta.json +4 -0
- package/docs-site/content/docs/api-reference/active-sessions.mdx +9 -0
- package/docs-site/content/docs/api-reference/agents.mdx +9 -0
- package/docs-site/content/docs/api-reference/channels.mdx +9 -0
- package/docs-site/content/docs/api-reference/config.mdx +9 -0
- package/docs-site/content/docs/api-reference/debug.mdx +9 -0
- package/docs-site/content/docs/api-reference/ecosystem.mdx +9 -0
- package/docs-site/content/docs/api-reference/epics.mdx +9 -0
- package/docs-site/content/docs/api-reference/index.mdx +32 -0
- package/docs-site/content/docs/api-reference/memory.mdx +9 -0
- package/docs-site/content/docs/api-reference/meta.json +25 -0
- package/docs-site/content/docs/api-reference/poll.mdx +9 -0
- package/docs-site/content/docs/api-reference/repos.mdx +9 -0
- package/docs-site/content/docs/api-reference/schedules.mdx +9 -0
- package/docs-site/content/docs/api-reference/session-data.mdx +9 -0
- package/docs-site/content/docs/api-reference/stats.mdx +9 -0
- package/docs-site/content/docs/api-reference/tasks.mdx +9 -0
- package/docs-site/content/docs/api-reference/trackers.mdx +9 -0
- package/docs-site/content/docs/api-reference/webhooks.mdx +9 -0
- package/docs-site/content/docs/api-reference/workflows.mdx +9 -0
- package/docs-site/content/docs/meta.json +3 -0
- package/docs-site/lib/get-llm-text.ts +10 -0
- package/docs-site/lib/openapi.ts +23 -0
- package/docs-site/lib/source.ts +8 -0
- package/docs-site/mdx-components.tsx +13 -0
- package/docs-site/next.config.mjs +29 -0
- package/docs-site/package.json +35 -0
- package/docs-site/pnpm-lock.yaml +5407 -0
- package/docs-site/postcss.config.mjs +8 -0
- package/docs-site/scripts/generate-docs.ts +171 -0
- package/docs-site/source.config.ts +17 -0
- package/docs-site/tsconfig.json +46 -0
- package/ecosystem.config.cjs +4 -4
- package/landing/next.config.ts +14 -0
- package/landing/package.json +31 -0
- package/landing/pnpm-lock.yaml +1091 -0
- package/landing/postcss.config.mjs +8 -0
- 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 +30 -0
- package/landing/public/omghost-openfort.svg +9 -0
- package/landing/src/app/actions/waitlist.ts +25 -0
- package/landing/src/app/blog/openfort-hackathon/page.tsx +863 -0
- package/landing/src/app/blog/page.tsx +162 -0
- package/landing/src/app/blog/swarm-metrics/page.tsx +685 -0
- package/landing/src/app/examples/page.tsx +174 -0
- package/landing/src/app/examples/x402/page.tsx +456 -0
- package/landing/src/app/globals.css +122 -0
- package/landing/src/app/layout.tsx +134 -0
- package/landing/src/app/page.tsx +27 -0
- package/landing/src/app/robots.ts +13 -0
- package/landing/src/app/sitemap.ts +44 -0
- package/landing/src/components/architecture.tsx +163 -0
- package/landing/src/components/cta.tsx +52 -0
- package/landing/src/components/features.tsx +160 -0
- package/landing/src/components/footer.tsx +100 -0
- package/landing/src/components/hero.tsx +217 -0
- package/landing/src/components/how-it-works.tsx +165 -0
- package/landing/src/components/navbar.tsx +147 -0
- package/landing/src/components/waitlist.tsx +110 -0
- package/landing/src/components/why-choose.tsx +149 -0
- package/landing/src/components/workshops.tsx +328 -0
- package/landing/src/lib/utils.ts +6 -0
- package/landing/tsconfig.json +41 -0
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +154 -0
- package/new-ui/CLAUDE.md +92 -0
- package/new-ui/README.md +73 -0
- package/new-ui/biome.json +42 -0
- package/new-ui/components.json +21 -0
- package/new-ui/index.html +25 -0
- package/new-ui/package.json +49 -0
- package/new-ui/pnpm-lock.yaml +4845 -0
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +814 -0
- package/new-ui/src/api/hooks/index.ts +64 -0
- package/new-ui/src/api/hooks/use-agents.ts +58 -0
- package/new-ui/src/api/hooks/use-channels.ts +115 -0
- package/new-ui/src/api/hooks/use-config-api.ts +46 -0
- package/new-ui/src/api/hooks/use-costs.ts +122 -0
- package/new-ui/src/api/hooks/use-db-query.ts +29 -0
- package/new-ui/src/api/hooks/use-epics.ts +75 -0
- package/new-ui/src/api/hooks/use-repos.ts +61 -0
- package/new-ui/src/api/hooks/use-schedules.ts +81 -0
- package/new-ui/src/api/hooks/use-services.ts +16 -0
- package/new-ui/src/api/hooks/use-stats.ts +27 -0
- package/new-ui/src/api/hooks/use-tasks.ts +89 -0
- package/new-ui/src/api/hooks/use-workflows.ts +109 -0
- package/{ui/src/types/api.ts → new-ui/src/api/types.ts} +236 -10
- package/new-ui/src/app/App.tsx +13 -0
- package/new-ui/src/app/providers.tsx +32 -0
- package/new-ui/src/app/router.tsx +52 -0
- package/new-ui/src/components/layout/app-header.tsx +47 -0
- package/new-ui/src/components/layout/app-sidebar.tsx +128 -0
- package/new-ui/src/components/layout/breadcrumbs.tsx +57 -0
- package/new-ui/src/components/layout/config-guard.tsx +22 -0
- package/new-ui/src/components/layout/root-layout.tsx +40 -0
- package/new-ui/src/components/layout/swarm-switcher.tsx +85 -0
- package/new-ui/src/components/shared/command-menu.tsx +131 -0
- package/new-ui/src/components/shared/data-grid.tsx +141 -0
- package/new-ui/src/components/shared/empty-state.tsx +24 -0
- package/new-ui/src/components/shared/error-boundary.tsx +72 -0
- package/new-ui/src/components/shared/json-viewer.tsx +47 -0
- package/new-ui/src/components/shared/name-connection-modal.tsx +99 -0
- package/new-ui/src/components/shared/page-skeleton.tsx +16 -0
- package/new-ui/src/components/shared/session-log-viewer.tsx +364 -0
- package/new-ui/src/components/shared/stats-bar.tsx +132 -0
- package/new-ui/src/components/shared/status-badge.tsx +131 -0
- package/new-ui/src/components/shared/usage-summary.tsx +179 -0
- package/new-ui/src/components/ui/alert-dialog.tsx +176 -0
- package/new-ui/src/components/ui/alert.tsx +60 -0
- package/new-ui/src/components/ui/avatar.tsx +96 -0
- package/new-ui/src/components/ui/badge.tsx +46 -0
- package/new-ui/src/components/ui/button.tsx +62 -0
- package/new-ui/src/components/ui/card.tsx +75 -0
- package/new-ui/src/components/ui/command.tsx +160 -0
- package/new-ui/src/components/ui/dialog.tsx +143 -0
- package/new-ui/src/components/ui/dropdown-menu.tsx +226 -0
- package/new-ui/src/components/ui/input.tsx +21 -0
- package/new-ui/src/components/ui/label.tsx +19 -0
- package/new-ui/src/components/ui/progress.tsx +26 -0
- package/new-ui/src/components/ui/scroll-area.tsx +54 -0
- package/new-ui/src/components/ui/select.tsx +175 -0
- package/new-ui/src/components/ui/separator.tsx +28 -0
- package/new-ui/src/components/ui/sheet.tsx +132 -0
- package/new-ui/src/components/ui/sidebar.tsx +691 -0
- package/new-ui/src/components/ui/skeleton.tsx +13 -0
- package/new-ui/src/components/ui/sonner.tsx +35 -0
- package/new-ui/src/components/ui/switch.tsx +33 -0
- package/new-ui/src/components/ui/table.tsx +92 -0
- package/new-ui/src/components/ui/tabs.tsx +79 -0
- package/new-ui/src/components/ui/textarea.tsx +18 -0
- package/new-ui/src/components/ui/tooltip.tsx +51 -0
- package/new-ui/src/components/workflows/action-node.tsx +53 -0
- package/new-ui/src/components/workflows/condition-node.tsx +50 -0
- package/new-ui/src/components/workflows/graph-utils.ts +124 -0
- package/new-ui/src/components/workflows/json-tree.tsx +189 -0
- package/new-ui/src/components/workflows/node-styles.ts +10 -0
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +87 -0
- package/new-ui/src/components/workflows/trigger-node.tsx +41 -0
- package/new-ui/src/components/workflows/workflow-graph.tsx +65 -0
- package/{ui/src/hooks/useAutoScroll.ts → new-ui/src/hooks/use-auto-scroll.ts} +0 -1
- package/new-ui/src/hooks/use-config.ts +203 -0
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +41 -0
- package/new-ui/src/hooks/use-mobile.ts +19 -0
- package/new-ui/src/hooks/use-theme.ts +60 -0
- package/new-ui/src/lib/config.ts +188 -0
- package/new-ui/src/lib/slugs.ts +71 -0
- package/{ui → new-ui}/src/lib/utils.ts +32 -0
- package/new-ui/src/main.tsx +11 -0
- package/new-ui/src/pages/agents/[id]/page.tsx +492 -0
- package/new-ui/src/pages/agents/page.tsx +134 -0
- package/new-ui/src/pages/chat/page.tsx +674 -0
- package/new-ui/src/pages/config/page.tsx +1109 -0
- package/new-ui/src/pages/dashboard/page.tsx +454 -0
- package/new-ui/src/pages/debug/page.tsx +275 -0
- package/new-ui/src/pages/epics/[id]/page.tsx +809 -0
- package/new-ui/src/pages/epics/page.tsx +321 -0
- package/new-ui/src/pages/not-found/page.tsx +18 -0
- package/new-ui/src/pages/repos/page.tsx +369 -0
- package/new-ui/src/pages/schedules/[id]/page.tsx +664 -0
- package/new-ui/src/pages/schedules/page.tsx +477 -0
- package/new-ui/src/pages/services/page.tsx +128 -0
- package/new-ui/src/pages/tasks/[id]/page.tsx +670 -0
- package/new-ui/src/pages/tasks/page.tsx +592 -0
- package/new-ui/src/pages/usage/page.tsx +195 -0
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +363 -0
- package/new-ui/src/pages/workflows/[id]/page.tsx +417 -0
- package/new-ui/src/pages/workflows/page.tsx +266 -0
- package/new-ui/src/styles/ag-grid.css +36 -0
- package/new-ui/src/styles/globals.css +213 -0
- package/new-ui/test-results/.last-run.json +4 -0
- package/{ui/tsconfig.json → new-ui/tsconfig.app.json} +7 -4
- package/new-ui/tsconfig.json +4 -0
- package/new-ui/tsconfig.node.json +26 -0
- package/new-ui/vercel.json +4 -0
- package/new-ui/vite.config.ts +28 -0
- package/openapi.json +4436 -0
- package/package.json +31 -7
- package/plugin/build-pi-skills.ts +233 -0
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/prek.toml +75 -0
- package/scripts/check-db-boundary.sh +60 -0
- package/scripts/e2e-docker-provider.ts +820 -0
- package/scripts/e2e-io-schemas-test.ts +807 -0
- package/scripts/e2e-provider-test.ts +220 -0
- package/scripts/e2e-workflow-redesign.sh +229 -0
- package/scripts/e2e-workflow-test.sh +285 -0
- package/scripts/e2e-workflow-test.ts +857 -0
- package/scripts/generate-openapi.ts +26 -0
- package/scripts/measure-tool-tokens.ts +118 -0
- package/scripts/x402-e2e-test.ts +195 -0
- package/scripts/x402-test-server.ts +236 -0
- package/scripts/x402-testnet-e2e.ts +668 -0
- package/slack-manifest.json +17 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +207 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +2729 -770
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- package/src/be/migrations/runner.ts +188 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1376 -559
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +93 -75
- package/src/github/index.ts +1 -0
- package/src/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +327 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +425 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +172 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +213 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +178 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +391 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +522 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +543 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +366 -24
- package/src/prompts/defaults.ts +196 -0
- package/src/providers/claude-adapter.ts +429 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +620 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +186 -29
- package/src/server.ts +82 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +115 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +212 -52
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +363 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +402 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/progress-dedup.test.ts +98 -0
- package/src/tests/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +540 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +311 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +386 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +290 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -0
- package/src/tools/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +187 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +30 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/tool-config.ts +117 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +93 -10
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +111 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +118 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +477 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +217 -0
- package/src/workflows/engine.ts +554 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +92 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +143 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +95 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +42 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/community/.gitkeep +0 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/templates-ui/README.md +46 -0
- package/templates-ui/components.json +17 -0
- package/templates-ui/eslint.config.mjs +18 -0
- package/templates-ui/next.config.ts +7 -0
- package/templates-ui/package.json +35 -0
- package/templates-ui/pnpm-lock.yaml +4571 -0
- package/templates-ui/postcss.config.mjs +7 -0
- package/templates-ui/public/file.svg +1 -0
- package/templates-ui/public/globe.svg +1 -0
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +1 -0
- package/templates-ui/public/vercel.svg +1 -0
- package/templates-ui/public/window.svg +1 -0
- package/templates-ui/src/app/[category]/[name]/page.tsx +89 -0
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +52 -0
- package/templates-ui/src/app/api/templates/route.ts +18 -0
- package/templates-ui/src/app/builder/page.tsx +37 -0
- package/templates-ui/src/app/globals.css +94 -0
- package/templates-ui/src/app/layout.tsx +79 -0
- package/templates-ui/src/app/page.tsx +38 -0
- package/templates-ui/src/app/robots.ts +11 -0
- package/templates-ui/src/app/sitemap.ts +31 -0
- package/templates-ui/src/components/compose-builder.tsx +442 -0
- package/templates-ui/src/components/compose-preview.tsx +117 -0
- package/templates-ui/src/components/file-preview.tsx +77 -0
- package/templates-ui/src/components/footer.tsx +40 -0
- package/templates-ui/src/components/header.tsx +41 -0
- package/templates-ui/src/components/template-card.tsx +87 -0
- package/templates-ui/src/components/template-detail.tsx +125 -0
- package/templates-ui/src/components/template-gallery.tsx +263 -0
- package/templates-ui/src/components/ui/badge.tsx +36 -0
- package/templates-ui/src/components/ui/button.tsx +57 -0
- package/templates-ui/src/components/ui/card.tsx +76 -0
- package/templates-ui/src/components/ui/separator.tsx +31 -0
- package/templates-ui/src/components/ui/tooltip.tsx +32 -0
- package/templates-ui/src/lib/compose-generator.ts +241 -0
- package/templates-ui/src/lib/templates.ts +137 -0
- package/templates-ui/src/lib/utils.ts +6 -0
- package/templates-ui/tsconfig.json +34 -0
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +679 -0
- package/thoughts/research/2026-02-28-x402-payments-research.md +686 -0
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +282 -0
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +492 -0
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +282 -0
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +328 -0
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +224 -0
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +159 -0
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +337 -0
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +778 -0
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +1269 -0
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +411 -0
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +724 -0
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +443 -0
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +307 -0
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +803 -0
- package/thoughts/taras/plans/2026-02-20-env-management.md +538 -0
- package/thoughts/taras/plans/2026-02-20-memory-system.md +882 -0
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +806 -0
- package/thoughts/taras/plans/2026-02-20-session-attach.md +647 -0
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +820 -0
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +768 -0
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +77 -0
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +543 -0
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +373 -0
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +512 -0
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +919 -0
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +723 -0
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +371 -0
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +621 -0
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +61 -0
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +488 -0
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +644 -0
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +636 -0
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +444 -0
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +591 -0
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +446 -0
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +987 -0
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +403 -0
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +860 -0
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +899 -0
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +874 -0
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +723 -0
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +390 -0
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +594 -0
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +825 -0
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +393 -0
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +168 -0
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +230 -0
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +445 -0
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +375 -0
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +869 -0
- package/thoughts/taras/research/2026-03-09-templates-registry.md +373 -0
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +223 -0
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +339 -0
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +181 -0
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +437 -0
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +258 -0
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +335 -0
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +670 -0
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +54 -0
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +558 -0
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +526 -0
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +797 -0
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +563 -0
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +486 -0
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +469 -0
- package/tsconfig.json +1 -1
- package/FAQ.md +0 -19
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/main.tsx +0 -28
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/vite.config.ts +0 -35
- /package/{ui → docs-site}/public/logo.png +0 -0
package/CLAUDE.md
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
|
-
# Agent Swarm
|
|
1
|
+
# Agent Swarm
|
|
2
2
|
|
|
3
|
-
Multi-agent orchestration
|
|
3
|
+
Multi-agent orchestration for Claude Code, Codex, Gemini CLI. Enables task distribution, agent communication, and service discovery.
|
|
4
4
|
|
|
5
5
|
**Getting Started**: See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup. Run `bun run start:http` to start the server.
|
|
6
6
|
|
|
7
|
-
**Database**: Uses `bun:sqlite` (SQLite with WAL mode). DB file at `./agent-swarm-db.sqlite` (auto-created). Schema defined in `src/be/db.ts`.
|
|
7
|
+
**Database**: Uses `bun:sqlite` (SQLite with WAL mode). DB file at `./agent-swarm-db.sqlite` (auto-created). Schema defined in `src/be/migrations/` as numbered SQL files, run by `src/be/migrations/runner.ts`. Query functions in `src/be/db.ts`.
|
|
8
|
+
|
|
9
|
+
### Database Migrations
|
|
10
|
+
|
|
11
|
+
Schema changes use a file-based migration system (`src/be/migrations/`):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Migration files: numbered SQL files executed in order
|
|
15
|
+
src/be/migrations/
|
|
16
|
+
001_initial.sql # Baseline: all tables, indexes, seed data
|
|
17
|
+
runner.ts # Migration runner (auto-runs on startup)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Adding a new migration:**
|
|
21
|
+
1. Create `src/be/migrations/NNN_descriptive_name.sql` (next number after highest existing)
|
|
22
|
+
2. Write forward-only SQL (CREATE TABLE, ALTER TABLE, CREATE INDEX, etc.)
|
|
23
|
+
3. Test with both fresh DB (`rm agent-swarm-db.sqlite && bun run start:http`) and existing DB
|
|
24
|
+
4. The runner applies it automatically on next startup
|
|
25
|
+
|
|
26
|
+
**How it works:**
|
|
27
|
+
- `_migrations` table tracks which migrations have been applied (version, name, checksum)
|
|
28
|
+
- On startup, runner compares SQL files against `_migrations` and applies pending ones
|
|
29
|
+
- Each migration runs in a transaction — atomic success or rollback
|
|
30
|
+
- Checksums detect accidental edits to applied migrations (logged as warnings)
|
|
31
|
+
- Bootstrap is schema-aware for pre-migration DBs:
|
|
32
|
+
- If baseline tables already exist, runner marks `001_initial` as applied without re-executing it
|
|
33
|
+
- If schema is partial/incomplete, runner executes `001_initial` to reach baseline safely
|
|
34
|
+
- `initDb()` also runs compatibility guards after migrations for legacy DBs (for example, adding missing `agents` profile columns before seeding context versions)
|
|
35
|
+
|
|
36
|
+
**Rules:**
|
|
37
|
+
- Never modify an already-applied migration — create a new one instead
|
|
38
|
+
- No `down` migrations (SQLite limitations make rollbacks unreliable)
|
|
39
|
+
- Use `IF NOT EXISTS` for CREATE TABLE/INDEX in migrations for safety
|
|
40
|
+
- Keep the `AgentTaskSourceSchema` in `src/types.ts` in sync with CHECK constraints in SQL
|
|
8
41
|
|
|
9
42
|
## Quick Reference
|
|
10
43
|
|
|
@@ -43,21 +76,141 @@ src/
|
|
|
43
76
|
cli.tsx # CLI entry point (Ink)
|
|
44
77
|
tools/ # MCP tool definitions
|
|
45
78
|
be/ # Backend utilities (DB, storage)
|
|
79
|
+
db.ts # DB init + query functions
|
|
80
|
+
migrations/ # SQL migration files + runner
|
|
46
81
|
github/ # GitHub webhook handlers
|
|
47
82
|
slack/ # Slack integration
|
|
48
|
-
ui/
|
|
83
|
+
new-ui/ # Dashboard (Next.js app)
|
|
84
|
+
templates/ # Template data (official + community)
|
|
85
|
+
official/ # 9 official templates (lead, coder, researcher, reviewer, tester, fde, content-writer, content-reviewer, content-strategist)
|
|
86
|
+
community/ # Community-contributed templates
|
|
87
|
+
schema.ts # Shared TypeScript types
|
|
88
|
+
templates-ui/ # Templates registry (Next.js app)
|
|
49
89
|
```
|
|
50
90
|
|
|
91
|
+
## Architecture Invariants
|
|
92
|
+
|
|
93
|
+
**Worker/API DB boundary**: The API server (`src/http.ts`, `src/server.ts`, `src/tools/`, `src/http/`) is the **sole owner** of the SQLite database. Worker-side code (`src/commands/`, `src/hooks/`, `src/providers/`, `src/prompts/`, `src/cli.tsx`, `src/claude.ts`) must **never** import from `src/be/db` or `bun:sqlite`. Workers communicate with the API exclusively via HTTP using `API_KEY` and `X-Agent-ID` headers.
|
|
94
|
+
|
|
95
|
+
Enforced by `scripts/check-db-boundary.sh` (pre-push hook + CI merge gate). If you need to share pure logic between API and worker code, put it in a shared module (e.g., `src/prompts/`, `src/utils/`).
|
|
96
|
+
|
|
51
97
|
## Code Style
|
|
52
98
|
|
|
53
99
|
- Run `bun run lint:fix` before committing (lint + format)
|
|
54
100
|
- Run `bun run format` for formatting only
|
|
55
101
|
- Use Bun APIs, not Node.js equivalents
|
|
56
102
|
- Prefer `Bun.$` over execa for shell commands
|
|
103
|
+
- Use `google/gemini-3-flash-preview` as the default Gemini model in tests, workflows, and examples (not `gemini-2.0-flash-001`)
|
|
104
|
+
|
|
105
|
+
### CLI Commands & Help System
|
|
106
|
+
|
|
107
|
+
CLI help is plain `console.log` (not Ink), defined in `src/cli.tsx` via the `COMMAND_HELP` record and `printHelp()` function.
|
|
108
|
+
|
|
109
|
+
**When adding or modifying CLI commands:**
|
|
110
|
+
1. Add/update the command's entry in the `COMMAND_HELP` record (usage, description, options, examples)
|
|
111
|
+
2. Add the command to the `commands` array in `printHelp()` (general help listing)
|
|
112
|
+
3. Add routing in the `App` switch statement (UI commands) or the non-UI section before `render()` (simple commands like `docs`, `help`, `version`)
|
|
113
|
+
4. Run `bun run src/cli.tsx help` and `bun run src/cli.tsx <command> --help` to verify
|
|
114
|
+
|
|
115
|
+
**Command types:**
|
|
116
|
+
- **Non-UI commands** (handled before `render()`): `help`, `version`, `docs`, `hook`, `artifact` — use `console.log` + `process.exit(0)`
|
|
117
|
+
- **UI commands** (rendered by Ink): `onboard`, `connect`, `api`, `claude`, `worker`, `lead` — return JSX from the `App` switch
|
|
118
|
+
|
|
119
|
+
### Adding HTTP Endpoints
|
|
120
|
+
|
|
121
|
+
**Always use the `route()` factory** from `src/http/route-def.ts` when creating new REST endpoints. This auto-registers the route in the OpenAPI spec. Do NOT use raw `matchRoute` — it bypasses OpenAPI generation.
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// In src/http/my-feature.ts
|
|
125
|
+
import { route } from "./route-def";
|
|
126
|
+
|
|
127
|
+
const myRoute = route({
|
|
128
|
+
method: "post",
|
|
129
|
+
path: "/api/my-feature",
|
|
130
|
+
pattern: ["api", "my-feature"],
|
|
131
|
+
summary: "What this endpoint does",
|
|
132
|
+
tags: ["MyTag"],
|
|
133
|
+
body: z.object({ ... }),
|
|
134
|
+
responses: { 200: { description: "Success" }, 400: { description: "Error" } },
|
|
135
|
+
auth: { apiKey: true },
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
export async function handleMyFeature(req, res, pathSegments, queryParams): Promise<boolean> {
|
|
139
|
+
if (!myRoute.match(req.method, pathSegments)) return false;
|
|
140
|
+
const parsed = await myRoute.parse(req, res, pathSegments, queryParams);
|
|
141
|
+
if (!parsed) return true; // parse() already sent 400
|
|
142
|
+
// ... business logic using parsed.body, parsed.params, parsed.query
|
|
143
|
+
json(res, result);
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
After creating the handler:
|
|
149
|
+
1. Import and add to handler chain in `src/http/index.ts`
|
|
150
|
+
2. Add the import to `scripts/generate-openapi.ts` (for spec generation)
|
|
151
|
+
3. Run `bun run docs:openapi` to regenerate `openapi.json` and commit it
|
|
152
|
+
|
|
153
|
+
## Workflow Authoring Guide
|
|
154
|
+
|
|
155
|
+
Workflows are defined as a DAG of nodes connected via `next`. Key concepts for creating workflows with `create-workflow`:
|
|
156
|
+
|
|
157
|
+
### Cross-node data access (`inputs` mapping)
|
|
158
|
+
|
|
159
|
+
**By default, upstream step outputs are NOT available for interpolation.** Only `trigger` (trigger data) and `input` (workflow-level resolved inputs) are in scope. To access another node's output, you MUST declare an `inputs` mapping:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"id": "summarize",
|
|
164
|
+
"type": "agent-task",
|
|
165
|
+
"inputs": { "cityData": "generate-city" },
|
|
166
|
+
"config": {
|
|
167
|
+
"template": "The city is {{cityData.taskOutput.city}} in {{cityData.taskOutput.country}}"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
- Keys are local names used in `{{interpolation}}`, values are context paths (usually a node ID)
|
|
173
|
+
- Agent-task output shape is `{ taskId: string, taskOutput: <agent's JSON> }`, so access fields via `localName.taskOutput.field`
|
|
174
|
+
- For trigger data: `{ "pr": "trigger.pullRequest" }` → `{{pr.number}}`
|
|
175
|
+
- Without `inputs`, templates referencing upstream nodes silently resolve to empty strings (check `diagnostics.unresolvedTokens` on the step)
|
|
176
|
+
|
|
177
|
+
### Structured output (`outputSchema`)
|
|
178
|
+
|
|
179
|
+
There are **two different `outputSchema` locations** — they validate at different layers:
|
|
180
|
+
|
|
181
|
+
| Location | Validates | Example schema |
|
|
182
|
+
|----------|-----------|---------------|
|
|
183
|
+
| `config.outputSchema` (inside config) | The **agent's raw JSON** response | `{ type: "object", required: ["city"], properties: { city: { type: "string" } } }` |
|
|
184
|
+
| Node-level `outputSchema` (sibling of config) | The **executor's return** (`{ taskId, taskOutput }` for agent-task) | Rarely needed — executor schemas are built-in |
|
|
185
|
+
|
|
186
|
+
For agent-task nodes, put your schema in `config.outputSchema`. The agent will be prompted to produce JSON matching this schema, and `store-progress` validates it inline.
|
|
187
|
+
|
|
188
|
+
### Interpolation
|
|
189
|
+
|
|
190
|
+
- Syntax: `{{path.to.value}}` in any string field inside `config`
|
|
191
|
+
- Paths traverse the interpolation context (built from `inputs` + `trigger` + `input`)
|
|
192
|
+
- Objects are JSON-stringified, nulls resolve to empty string
|
|
193
|
+
- Unresolved tokens are logged in step `diagnostics` and the step proceeds (soft failure)
|
|
194
|
+
|
|
195
|
+
### Agent-task executor config fields
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
template (required) — Task description / prompt for the agent
|
|
199
|
+
outputSchema (optional) — JSON Schema for agent's structured output
|
|
200
|
+
agentId (optional) — Assign to specific agent (UUID)
|
|
201
|
+
tags (optional) — Task tags for filtering
|
|
202
|
+
priority (optional) — 0-100, default 50
|
|
203
|
+
offerMode (optional) — Offer to agent instead of direct assign
|
|
204
|
+
dir (optional) — Working directory for the agent
|
|
205
|
+
vcsRepo (optional) — Git repo for workspace scoping
|
|
206
|
+
model (optional) — Model override for the agent
|
|
207
|
+
parentTaskId (optional) — Link to parent task
|
|
208
|
+
```
|
|
57
209
|
|
|
58
210
|
## Related
|
|
59
211
|
|
|
60
|
-
- [UI Dashboard](./ui/
|
|
212
|
+
- [UI Dashboard](./new-ui/) - Next.js monitoring dashboard
|
|
213
|
+
- [Templates Registry](./templates-ui/) - Template gallery and compose builder
|
|
61
214
|
- [MCP.md](./MCP.md) - MCP tools reference
|
|
62
215
|
- [DEPLOYMENT.md](./DEPLOYMENT.md) - Production deployment
|
|
63
216
|
- [CONTRIBUTING.md](./CONTRIBUTING.md) - Development setup
|
|
@@ -83,6 +236,270 @@ curl -H "Authorization: Bearer 123123" -H "X-Agent-ID: <uuid>" http://localhost:
|
|
|
83
236
|
- `API_KEY` - Auth token for API requests
|
|
84
237
|
- `MCP_BASE_URL` - API server URL (default: http://localhost:3013)
|
|
85
238
|
- `SLACK_DISABLE=true` / `GITHUB_DISABLE=true` - Disable integrations locally
|
|
239
|
+
- `HARNESS_PROVIDER` - Provider selection: `claude` (default) or `pi` (pi-mono)
|
|
240
|
+
- `TEMPLATE_ID` - Template for initial worker profile (e.g., `official/coder`). Fetched from registry on first boot.
|
|
241
|
+
- `TEMPLATE_REGISTRY_URL` - Templates registry URL (default: https://templates.agent-swarm.dev)
|
|
242
|
+
|
|
243
|
+
**Portless (local dev):**
|
|
244
|
+
`bun run dev:http` uses [portless](https://port1355.dev/) → `https://api.swarm.localhost:1355`. Set `MCP_BASE_URL=https://api.swarm.localhost:1355` and `APP_URL=https://ui.swarm.localhost:1355` in `.env`. Update `.mcp.json` URL to match. Non-portless fallback: `bun run start:http`. Worktrees auto-get `<branch>.api.swarm.localhost:1355` subdomains.
|
|
245
|
+
|
|
246
|
+
**Local Docker Compose (builds from source):**
|
|
247
|
+
```bash
|
|
248
|
+
# Runs: API + Claude lead + Pi-mono worker
|
|
249
|
+
docker compose -f docker-compose.local.yml up --build
|
|
250
|
+
|
|
251
|
+
# Tear down
|
|
252
|
+
docker compose -f docker-compose.local.yml down
|
|
253
|
+
```
|
|
254
|
+
Requires `.env` with `API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY` (or `OPENROUTER_API_KEY`).
|
|
255
|
+
|
|
256
|
+
**Production Docker Compose (pulls from registry):** See `docker-compose.example.yml`.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Testing
|
|
261
|
+
|
|
262
|
+
### Unit Tests
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
bun test src/tests/<test-file>.test.ts # Run specific test
|
|
266
|
+
bun test # Run all tests
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
- Tests use isolated SQLite DBs (e.g. `./test-<name>.sqlite`) with `initDb()`/`closeDb()` in `beforeAll`/`afterAll`
|
|
270
|
+
- Tests that need HTTP use a minimal `node:http` handler — NOT the full `src/http.ts` server
|
|
271
|
+
- Use unique test ports to avoid conflicts (e.g. 13022, 13023)
|
|
272
|
+
- Clean up DB files (including `-wal` and `-shm`) in `afterAll`
|
|
273
|
+
|
|
274
|
+
### E2E Testing with Docker
|
|
275
|
+
|
|
276
|
+
For full integration tests (session capture, `--resume`, hooks), use a Docker worker against a local API server.
|
|
277
|
+
|
|
278
|
+
**Worktree port check**: When working in a worktree, other worktrees may already be running the API server on port 3013. Always check `.env` for `PORT` and `MCP_BASE_URL` first:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
lsof -i :3013 # Check if default port is in use
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
If occupied, set `PORT=<alt-port>` in `.env` and update `MCP_BASE_URL` to match. Also update `.env.docker` `MCP_BASE_URL` (use `host.docker.internal:<port>`):
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
# Start API on alternate port
|
|
288
|
+
PORT=3014 bun run start:http &
|
|
289
|
+
|
|
290
|
+
# Build image with current code changes
|
|
291
|
+
docker build -f Dockerfile.worker -t agent-swarm-worker:<tag> .
|
|
292
|
+
|
|
293
|
+
# Run worker pointing at alternate port, on alternate host port
|
|
294
|
+
docker run --rm -d \
|
|
295
|
+
--name e2e-test-worker \
|
|
296
|
+
--env-file .env.docker \
|
|
297
|
+
-e MCP_BASE_URL=http://host.docker.internal:3014 \
|
|
298
|
+
-e MAX_CONCURRENT_TASKS=1 \
|
|
299
|
+
-p 3203:3000 \
|
|
300
|
+
agent-swarm-worker:<tag>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**E2E flow**:
|
|
304
|
+
1. Start API server (check port first)
|
|
305
|
+
2. Rebuild Docker image: `bun run docker:build:worker` (or with custom tag)
|
|
306
|
+
3. Start worker container pointing at your API port
|
|
307
|
+
4. Create tasks via `curl` against the API
|
|
308
|
+
5. Poll `GET /api/tasks/:id` to verify status, `claudeSessionId`, etc.
|
|
309
|
+
6. Check worker logs: `docker logs <container-name>`
|
|
310
|
+
7. Clean up: `docker stop <container-name>` and kill the API process
|
|
311
|
+
|
|
312
|
+
**Task cancellation caveat**: Direct DB updates (`sqlite3 ... UPDATE`) bypass the hook-based cancellation flow. The Claude process inside Docker won't stop — you'll need to `docker restart` the container. Use the MCP `cancel-task` tool for proper cancellation when possible.
|
|
313
|
+
|
|
314
|
+
**Keep test tasks trivial**: Use simple tasks like "Say hi" for E2E tests. Complex tasks (web searches, research) waste time and API credits during testing.
|
|
315
|
+
|
|
316
|
+
**Quick E2E setup (clean DB + API + Docker lead/worker):**
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
# 1. Clean DB for fresh state
|
|
320
|
+
rm -f agent-swarm-db.sqlite agent-swarm-db.sqlite-wal agent-swarm-db.sqlite-shm
|
|
321
|
+
|
|
322
|
+
# 2. Start API server (NOT pm2 — it starts extra services)
|
|
323
|
+
bun run start:http &
|
|
324
|
+
|
|
325
|
+
# 3. Build Docker image with current code
|
|
326
|
+
bun run docker:build:worker
|
|
327
|
+
|
|
328
|
+
# 4a. Start a LEAD container (uses .env.docker-lead)
|
|
329
|
+
docker run --rm -d \
|
|
330
|
+
--name e2e-test-lead \
|
|
331
|
+
--env-file .env.docker-lead \
|
|
332
|
+
-e AGENT_ROLE=lead \
|
|
333
|
+
-e MAX_CONCURRENT_TASKS=1 \
|
|
334
|
+
-p 3201:3000 \
|
|
335
|
+
agent-swarm-worker:latest
|
|
336
|
+
|
|
337
|
+
# 4b. Start a WORKER container (uses .env.docker)
|
|
338
|
+
docker run --rm -d \
|
|
339
|
+
--name e2e-test-worker \
|
|
340
|
+
--env-file .env.docker \
|
|
341
|
+
-e MAX_CONCURRENT_TASKS=1 \
|
|
342
|
+
-p 3203:3000 \
|
|
343
|
+
agent-swarm-worker:latest
|
|
344
|
+
|
|
345
|
+
# 5. Verify registration
|
|
346
|
+
curl -s -H "Authorization: Bearer 123123" http://localhost:3013/api/agents | jq '.agents[] | {name, isLead, status}'
|
|
347
|
+
|
|
348
|
+
# 6. Cleanup
|
|
349
|
+
docker stop e2e-test-lead e2e-test-worker
|
|
350
|
+
kill $(lsof -ti :3013)
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Key differences between lead and worker env files:
|
|
354
|
+
- `.env.docker-lead` — lead-specific `AGENT_ID`, no `OPENROUTER_API_KEY`
|
|
355
|
+
- `.env.docker` — worker-specific `AGENT_ID`, includes `OPENROUTER_API_KEY`
|
|
356
|
+
- `AGENT_ROLE=lead` must be passed explicitly (not in the env file)
|
|
357
|
+
|
|
358
|
+
### Entrypoint Integration Testing
|
|
359
|
+
|
|
360
|
+
When modifying `docker-entrypoint.sh` (e.g. adding new conditional bootstrap logic), validate beyond `bash -n` syntax checks with a full Docker round-trip:
|
|
361
|
+
|
|
362
|
+
1. **Validate API endpoints first**: Before Docker testing, verify the exact HTTP methods and paths used by `curl` calls in the entrypoint against the actual route definitions in `src/http/`. Common gotcha: config API uses `PUT /api/config` (not `POST`). Use `context-mode execute` for curl calls to avoid hook blocks.
|
|
363
|
+
2. **Test idempotency**: Start a container (first boot = registers), stop it, start another with the same env file (same `AGENT_ID`). Second boot should skip registration via the config check (e.g. `if [ -z "$SOME_KEY" ]`).
|
|
364
|
+
3. **Test failure mode**: Stop the external service, boot a container. The entrypoint should continue (via `|| true` guards) with a warning log.
|
|
365
|
+
4. **Test lead vs worker paths**: Use `.env.docker-lead` + `-e AGENT_ROLE=lead` for lead, `.env.docker` for worker. They have different `AGENT_ID` values and different bootstrap paths.
|
|
366
|
+
5. **Grep logs for your feature**: `docker logs <name> 2>&1 | grep -i "<feature>"` to verify the exact log lines.
|
|
367
|
+
6. **Verify persisted state**: After boot, check `GET /api/config?includeSecrets=true` to confirm secrets/config were stored correctly.
|
|
368
|
+
|
|
369
|
+
**Entrypoint E2E commands:**
|
|
370
|
+
```bash
|
|
371
|
+
# 1. Clean DB + start API
|
|
372
|
+
rm -f agent-swarm-db.sqlite agent-swarm-db.sqlite-wal agent-swarm-db.sqlite-shm
|
|
373
|
+
bun run start:http &
|
|
374
|
+
|
|
375
|
+
# 2. Set any required global config (use PUT, not POST!)
|
|
376
|
+
curl -s -X PUT "http://localhost:3013/api/config" \
|
|
377
|
+
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
|
|
378
|
+
-d '{"scope":"global","key":"SOME_KEY","value":"some-value","isSecret":false}'
|
|
379
|
+
|
|
380
|
+
# 3. Build image with current code
|
|
381
|
+
bun run docker:build:worker
|
|
382
|
+
|
|
383
|
+
# 4. First boot (lead)
|
|
384
|
+
docker run --rm -d --name e2e-lead \
|
|
385
|
+
--env-file .env.docker-lead -e AGENT_ROLE=lead \
|
|
386
|
+
-e MAX_CONCURRENT_TASKS=1 -p 3201:3000 agent-swarm-worker:latest
|
|
387
|
+
|
|
388
|
+
# 5. First boot (worker)
|
|
389
|
+
docker run --rm -d --name e2e-worker \
|
|
390
|
+
--env-file .env.docker \
|
|
391
|
+
-e MAX_CONCURRENT_TASKS=1 -p 3203:3000 agent-swarm-worker:latest
|
|
392
|
+
|
|
393
|
+
# 6. Check logs (wait ~15s for boot)
|
|
394
|
+
docker logs e2e-lead 2>&1 | grep -i "<feature>"
|
|
395
|
+
docker logs e2e-worker 2>&1 | grep -i "<feature>"
|
|
396
|
+
|
|
397
|
+
# 7. Idempotency: stop and restart same worker (same AGENT_ID)
|
|
398
|
+
docker stop e2e-worker
|
|
399
|
+
docker run --rm -d --name e2e-worker-2 \
|
|
400
|
+
--env-file .env.docker \
|
|
401
|
+
-e MAX_CONCURRENT_TASKS=1 -p 3203:3000 agent-swarm-worker:latest
|
|
402
|
+
# Should see "Already registered" or equivalent skip message
|
|
403
|
+
docker logs e2e-worker-2 2>&1 | grep -i "<feature>"
|
|
404
|
+
|
|
405
|
+
# 8. Cleanup
|
|
406
|
+
docker stop e2e-lead e2e-worker-2 2>/dev/null
|
|
407
|
+
kill $(lsof -ti :3013) 2>/dev/null
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### MCP Tool Testing (Streamable HTTP)
|
|
411
|
+
|
|
412
|
+
To test MCP tools via curl, you need a proper session handshake:
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
# 1. Initialize session (capture session ID from response headers)
|
|
416
|
+
curl -s -D /tmp/mcp-headers.txt -X POST \
|
|
417
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
418
|
+
-H "Content-Type: application/json" \
|
|
419
|
+
-H "Accept: application/json, text/event-stream" \
|
|
420
|
+
-H "X-Agent-ID: <uuid>" \
|
|
421
|
+
http://localhost:$PORT/mcp \
|
|
422
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'
|
|
423
|
+
|
|
424
|
+
# 2. Extract session ID
|
|
425
|
+
SESSION_ID=$(grep -i 'mcp-session-id' /tmp/mcp-headers.txt | awk '{print $2}' | tr -d '\r\n')
|
|
426
|
+
|
|
427
|
+
# 3. Send initialized notification
|
|
428
|
+
curl -s -X POST \
|
|
429
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
430
|
+
-H "Content-Type: application/json" \
|
|
431
|
+
-H "Accept: application/json, text/event-stream" \
|
|
432
|
+
-H "X-Agent-ID: <uuid>" \
|
|
433
|
+
-H "mcp-session-id: $SESSION_ID" \
|
|
434
|
+
http://localhost:$PORT/mcp \
|
|
435
|
+
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
|
|
436
|
+
|
|
437
|
+
# 4. Call tools using the session
|
|
438
|
+
curl -s -X POST \
|
|
439
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
440
|
+
-H "Content-Type: application/json" \
|
|
441
|
+
-H "Accept: application/json, text/event-stream" \
|
|
442
|
+
-H "X-Agent-ID: <uuid>" \
|
|
443
|
+
-H "mcp-session-id: $SESSION_ID" \
|
|
444
|
+
http://localhost:$PORT/mcp \
|
|
445
|
+
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"join-swarm","arguments":{...}}}'
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Key gotchas:
|
|
449
|
+
- `Accept` header MUST include both `application/json` and `text/event-stream`
|
|
450
|
+
- `X-Agent-ID` must be a valid UUID (use `uuidgen` to generate)
|
|
451
|
+
- Session must be initialized before calling tools
|
|
452
|
+
|
|
453
|
+
### UI Testing
|
|
454
|
+
|
|
455
|
+
Use the `qa-use` tool (`/qa-use:test-run`, `/qa-use:verify`, `/qa-use:explore`) for browser-based UI testing of the dashboard.
|
|
456
|
+
|
|
457
|
+
**Worktree port check for UI**: The dashboard dev server defaults to port 5274 (see `APP_URL` in `.env`). Check before starting:
|
|
458
|
+
|
|
459
|
+
```bash
|
|
460
|
+
lsof -i :5274 # Check if UI port is in use
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
If occupied by another worktree, start on an alternate port and update `APP_URL`:
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
cd ui && pnpm run dev --port 5275
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
The UI connects to the API via `VITE_API_URL` (defaults to `http://localhost:3013`). When using alternate API ports, update accordingly in the UI `.env` or pass as env var.
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## Pre-PR Checklist
|
|
474
|
+
|
|
475
|
+
Before pushing a PR, run the checks that CI will enforce. Which checks to run depends on what files you changed:
|
|
476
|
+
|
|
477
|
+
**Root project (src/, tools/, etc.):**
|
|
478
|
+
```bash
|
|
479
|
+
bun run lint:fix # Biome lint + format
|
|
480
|
+
bun run tsc:check # TypeScript type check
|
|
481
|
+
bun test # Unit tests
|
|
482
|
+
bash scripts/check-db-boundary.sh # Worker/API DB boundary
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**If you changed `plugin/commands/*.md`:** Rebuild pi-mono skills and commit the result:
|
|
486
|
+
```bash
|
|
487
|
+
bun run build:pi-skills # Regenerate plugin/pi-skills/ from commands
|
|
488
|
+
```
|
|
489
|
+
CI enforces freshness — the merge gate will fail if generated pi-skills are out of date.
|
|
490
|
+
|
|
491
|
+
**new-ui/ (dashboard):**
|
|
492
|
+
```bash
|
|
493
|
+
cd new-ui
|
|
494
|
+
pnpm lint # Biome check (lint + format)
|
|
495
|
+
pnpm exec tsc --noEmit # TypeScript type check
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
**Both:** Run both sets if your changes span root and new-ui.
|
|
499
|
+
|
|
500
|
+
**Docker changes (Dockerfile, Dockerfile.worker):** CI does a build test — verify locally with `docker build -f <Dockerfile> .` if unsure.
|
|
501
|
+
|
|
502
|
+
All of these are enforced by the Merge Gate workflow (`.github/workflows/merge-gate.yml`). The gate job blocks merge if any check fails.
|
|
86
503
|
|
|
87
504
|
---
|
|
88
505
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Contributing to Agent Swarm
|
|
2
2
|
|
|
3
|
-
Thanks for your interest in contributing to Agent Swarm
|
|
3
|
+
Thanks for your interest in contributing to Agent Swarm!
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -89,6 +89,51 @@ bun run docker:run:worker
|
|
|
89
89
|
bun run docker:run:lead
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
+
### Local Development with Portless
|
|
93
|
+
|
|
94
|
+
[Portless](https://port1355.dev/) replaces port numbers with friendly domain URLs:
|
|
95
|
+
- API: `https://api.swarm.localhost:1355`
|
|
96
|
+
- UI: `https://ui.swarm.localhost:1355`
|
|
97
|
+
|
|
98
|
+
**One-time setup:**
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
bun add -g portless
|
|
102
|
+
portless trust # Add CA to system trust store
|
|
103
|
+
portless proxy start --https # Start HTTPS proxy (runs as daemon)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Usage:**
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Start API
|
|
110
|
+
bun run dev:http
|
|
111
|
+
# → https://api.swarm.localhost:1355
|
|
112
|
+
|
|
113
|
+
# Start UI (separate terminal)
|
|
114
|
+
cd new-ui && pnpm dev
|
|
115
|
+
# → https://ui.swarm.localhost:1355
|
|
116
|
+
|
|
117
|
+
# Or start everything with PM2
|
|
118
|
+
bun run pm2-start
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Environment:** Set these in your `.env`:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
MCP_BASE_URL=https://api.swarm.localhost:1355
|
|
125
|
+
APP_URL=https://ui.swarm.localhost:1355
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Update `.mcp.json`:
|
|
129
|
+
```json
|
|
130
|
+
{ "url": "https://api.swarm.localhost:1355/mcp" }
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Worktrees:** Each worktree gets a unique subdomain from the branch name. `.wts-setup.ts` handles this automatically.
|
|
134
|
+
|
|
135
|
+
**Without portless:** Use `bun run start:http` (no portless required).
|
|
136
|
+
|
|
92
137
|
---
|
|
93
138
|
|
|
94
139
|
## Code Quality
|
package/DEPLOYMENT.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Deployment Guide
|
|
2
2
|
|
|
3
|
-
This guide covers all deployment options for Agent Swarm
|
|
3
|
+
This guide covers all deployment options for Agent Swarm.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -41,6 +41,10 @@ docker-compose up -d
|
|
|
41
41
|
|
|
42
42
|
> **Note:** `.env.example` contains API server settings, `.env.docker.example` contains Docker worker settings. For docker-compose, you need both sets of variables in a single `.env` file.
|
|
43
43
|
|
|
44
|
+
### ARM Compatibility (Apple Silicon)
|
|
45
|
+
|
|
46
|
+
All services in the docker-compose files include `platform: linux/amd64` to avoid `no matching manifest for linux/arm64/v8` errors on Apple Silicon Macs. The Docker images are built for `linux/amd64` and run via Rosetta emulation.
|
|
47
|
+
|
|
44
48
|
### What's Included
|
|
45
49
|
|
|
46
50
|
The example `docker-compose.yml` sets up:
|
|
@@ -48,6 +52,7 @@ The example `docker-compose.yml` sets up:
|
|
|
48
52
|
- **API service** (port 3013) - MCP HTTP server
|
|
49
53
|
- **2 Worker agents** - Containerized Claude workers
|
|
50
54
|
- **1 Lead agent** - Coordinator agent
|
|
55
|
+
- **3 Content agents** (optional) - Content writer, reviewer, and strategist using `TEMPLATE_ID` for profile bootstrapping
|
|
51
56
|
|
|
52
57
|
### Configuration
|
|
53
58
|
|
|
@@ -57,6 +62,7 @@ Edit your `.env` file:
|
|
|
57
62
|
# Required
|
|
58
63
|
API_KEY=your-secret-api-key
|
|
59
64
|
CLAUDE_CODE_OAUTH_TOKEN=your-oauth-token # Run `claude setup-token` to get this
|
|
65
|
+
# Multiple tokens for load balancing: CLAUDE_CODE_OAUTH_TOKEN=token1,token2,token3
|
|
60
66
|
|
|
61
67
|
# Agent IDs (optional, auto-generated if not set)
|
|
62
68
|
AGENT_ID=worker-1-uuid
|
|
@@ -111,6 +117,9 @@ docker build -f Dockerfile.worker -t agent-swarm-worker .
|
|
|
111
117
|
|
|
112
118
|
# Or using npm script
|
|
113
119
|
bun run docker:build:worker
|
|
120
|
+
|
|
121
|
+
# Override the pinned Claude Code version (default: 2.1.80)
|
|
122
|
+
docker build -f Dockerfile.worker --build-arg CLAUDE_CODE_VERSION=2.2.0 -t agent-swarm-worker .
|
|
114
123
|
```
|
|
115
124
|
|
|
116
125
|
### Run
|
|
@@ -177,9 +186,9 @@ The Docker worker image uses a multi-stage build:
|
|
|
177
186
|
- **Languages**: Python 3, Node.js 22, Bun
|
|
178
187
|
- **Build tools**: gcc, g++, make, cmake
|
|
179
188
|
- **Process manager**: PM2 (for background services)
|
|
180
|
-
- **CLI tools**: GitHub CLI (`gh`), sqlite3
|
|
181
|
-
- **Agent tools**: `wts` (git worktree manager), `
|
|
182
|
-
- **Utilities**: git, git-lfs, vim, nano, jq, curl, wget, ssh
|
|
189
|
+
- **CLI tools**: GitHub CLI (`gh`), GitLab CLI (`glab`), sqlite3
|
|
190
|
+
- **Agent tools**: `wts` (git worktree manager), `archil` (FUSE/R2-backed storage)
|
|
191
|
+
- **Utilities**: git, git-lfs, vim, nano, jq, curl, wget, ssh, fuse3
|
|
183
192
|
- **Sudo access**: Worker can install packages with `sudo apt-get install`
|
|
184
193
|
|
|
185
194
|
**Volumes:**
|
|
@@ -337,11 +346,13 @@ When a worker starts, it:
|
|
|
337
346
|
|
|
338
347
|
## Environment Variables
|
|
339
348
|
|
|
349
|
+
> For the complete reference of all environment variables, see [docs/ENVS.md](./docs/ENVS.md).
|
|
350
|
+
|
|
340
351
|
### Docker Worker Variables
|
|
341
352
|
|
|
342
353
|
| Variable | Required | Description |
|
|
343
354
|
|----------|----------|-------------|
|
|
344
|
-
| `CLAUDE_CODE_OAUTH_TOKEN` | Yes | OAuth token for Claude CLI (run `claude setup-token`) |
|
|
355
|
+
| `CLAUDE_CODE_OAUTH_TOKEN` | Yes | OAuth token for Claude CLI (run `claude setup-token`). Supports comma-separated values for [multi-credential load balancing](./docs/ENVS.md#multi-credential-support). |
|
|
345
356
|
| `API_KEY` | Yes | API key for MCP server |
|
|
346
357
|
| `AGENT_ID` | No | Agent UUID (assigned on join if not set). **Keep stable for task resume.** |
|
|
347
358
|
| `AGENT_ROLE` | No | Role: `worker` (default) or `lead` |
|
|
@@ -355,7 +366,9 @@ When a worker starts, it:
|
|
|
355
366
|
| `SHUTDOWN_TIMEOUT` | No | Grace period in ms before pausing tasks (default: `30000`) |
|
|
356
367
|
| `MAX_CONCURRENT_TASKS` | No | Maximum parallel tasks per worker (default: `1`) |
|
|
357
368
|
| `SWARM_URL` | No | Base domain for service URLs (default: `localhost`) |
|
|
358
|
-
| `
|
|
369
|
+
| `LEAD_PORT` | No | Host port for lead service (default: `3020`). Example — adjust to your setup. In isolated network namespaces all services can share the same port. |
|
|
370
|
+
| `WORKER1_PORT` | No | Host port for worker-1 service (default: `3021`). Example — see `LEAD_PORT`. |
|
|
371
|
+
| `WORKER2_PORT` | No | Host port for worker-2 service (default: `3022`). Example — see `LEAD_PORT`. |
|
|
359
372
|
| `PM2_HOME` | No | PM2 state directory (default: `/workspace/.pm2`) |
|
|
360
373
|
| `GITHUB_TOKEN` | No | GitHub token for git operations |
|
|
361
374
|
| `GITHUB_EMAIL` | No | Git commit email (default: `worker-agent@desplega.ai`) |
|
|
@@ -375,6 +388,8 @@ When a worker starts, it:
|
|
|
375
388
|
| `ENV` | Environment mode (`development` adds prefix to Slack agent names) | - |
|
|
376
389
|
| `SCHEDULER_INTERVAL_MS` | Polling interval for scheduled tasks | `10000` |
|
|
377
390
|
| `DATABASE_PATH` | SQLite database file path | `./agent-swarm-db.sqlite` |
|
|
391
|
+
| `OPENAI_API_KEY` | OpenAI key for memory embeddings (optional) | - |
|
|
392
|
+
| `CAPABILITIES` | Comma-separated feature flags | All enabled |
|
|
378
393
|
|
|
379
394
|
---
|
|
380
395
|
|
|
@@ -384,10 +399,12 @@ Enable Slack for task creation and agent communication via direct messages.
|
|
|
384
399
|
|
|
385
400
|
### Setup
|
|
386
401
|
|
|
387
|
-
1. Create a Slack App at https://api.slack.com/apps
|
|
402
|
+
1. Create a Slack App at https://api.slack.com/apps (or import `slack-manifest.json` from the repo root)
|
|
388
403
|
2. Enable Socket Mode (for real-time events without public webhooks)
|
|
389
|
-
3.
|
|
390
|
-
4.
|
|
404
|
+
3. Enable Interactivity and Assistant View
|
|
405
|
+
4. Add required scopes: `app_mentions:read`, `assistant:write`, `channels:history`, `channels:read`, `chat:write`, `chat:write.customize`, `chat:write.public`, `commands`, `files:read`, `files:write`, `groups:history`, `groups:read`, `im:history`, `im:read`, `im:write`, `mpim:history`, `mpim:read`, `mpim:write`, `reactions:write`, `users:read`
|
|
406
|
+
5. Subscribe to bot events: `app_mention`, `assistant_thread_started`, `assistant_thread_context_changed`, `message.channels`, `message.groups`, `message.im`, `message.mpim`
|
|
407
|
+
6. Install to workspace and copy tokens
|
|
391
408
|
|
|
392
409
|
### Configuration
|
|
393
410
|
|
package/Dockerfile
CHANGED
|
@@ -24,6 +24,8 @@ FROM debian:bookworm-slim
|
|
|
24
24
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
25
25
|
ca-certificates \
|
|
26
26
|
wget \
|
|
27
|
+
curl \
|
|
28
|
+
fuse3 libfuse2 \
|
|
27
29
|
&& rm -rf /var/lib/apt/lists/*
|
|
28
30
|
|
|
29
31
|
WORKDIR /app
|
|
@@ -35,11 +37,19 @@ RUN chmod +x /usr/local/bin/agent-swarm-api
|
|
|
35
37
|
# Copy package.json for version info
|
|
36
38
|
COPY package.json ./
|
|
37
39
|
|
|
40
|
+
# Copy migration SQL files (compiled binary can't read from /$bunfs virtual filesystem)
|
|
41
|
+
COPY src/be/migrations/*.sql /app/migrations/
|
|
42
|
+
|
|
43
|
+
# Install archil CLI for FUSE/R2-backed disk mounts
|
|
44
|
+
RUN curl https://s3.amazonaws.com/archil-client/install | sh
|
|
45
|
+
|
|
38
46
|
# Create data directory for SQLite (WAL mode needs .sqlite, .sqlite-wal, .sqlite-shm on same filesystem)
|
|
39
|
-
|
|
47
|
+
# Create Archil mount point directories
|
|
48
|
+
RUN mkdir -p /app/data /mnt/data /workspace/shared
|
|
40
49
|
|
|
41
50
|
ENV PORT=3013
|
|
42
51
|
ENV DATABASE_PATH=/app/data/agent-swarm-db.sqlite
|
|
52
|
+
ENV MIGRATIONS_DIR=/app/migrations
|
|
43
53
|
|
|
44
54
|
VOLUME /app/data
|
|
45
55
|
|
|
@@ -49,9 +59,7 @@ EXPOSE 3013
|
|
|
49
59
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
50
60
|
CMD wget -qO- http://localhost:3013/health || exit 1
|
|
51
61
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
echo "==============================" && \
|
|
57
|
-
exec /usr/local/bin/agent-swarm-api
|
|
62
|
+
COPY api-entrypoint.sh /api-entrypoint.sh
|
|
63
|
+
RUN chmod +x /api-entrypoint.sh
|
|
64
|
+
|
|
65
|
+
ENTRYPOINT ["/api-entrypoint.sh"]
|