@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
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
---
|
|
2
|
+
date: 2026-03-18
|
|
3
|
+
author: Claude
|
|
4
|
+
status: completed
|
|
5
|
+
research: thoughts/taras/research/2026-03-18-agent-fs-integration.md
|
|
6
|
+
autonomy: verbose
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Agent-FS Native Integration Plan
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
Integrate agent-fs (persistent, searchable filesystem for AI agents) into agent-swarm as a conditional, CLI-based storage backend. When `AGENT_FS_API_URL` is set as a global swarm config, agents register with agent-fs at boot, the lead creates a shared org/drive, and the base system prompt teaches agents to use the `agent-fs` CLI for thoughts, research, plans, and shared documents.
|
|
14
|
+
|
|
15
|
+
## Current State Analysis
|
|
16
|
+
|
|
17
|
+
- Agents store thoughts/docs on **Archil FUSE-mounted shared disks** (`/workspace/shared/thoughts/{agentId}/`) in Docker, or **git-tracked `thoughts/` directories** in local dev
|
|
18
|
+
- The base system prompt (`BASE_PROMPT_FILESYSTEM` at `src/prompts/base-prompt.ts:228-304`) hardcodes `/workspace/shared/` paths
|
|
19
|
+
- **Zero** references to agent-fs exist in the codebase — clean namespace
|
|
20
|
+
- The swarm config system (`swarm_config` table, `POST /api/config` HTTP endpoint) supports global/agent/repo scopes with secrets
|
|
21
|
+
- Config injection flows through: `docker-entrypoint.sh` (boot) → `fetchResolvedEnv()` (per-task) → `Bun.spawn()` env
|
|
22
|
+
- The Docker image installs CLI tools via npm global (`@desplega.ai/wts`, `pm2`, etc.) and Claude plugins via `claude plugin add`
|
|
23
|
+
|
|
24
|
+
### Key Discoveries:
|
|
25
|
+
- `POST /api/config` accepts `{scope, scopeId, key, value, isSecret, description}` for config upsert (`src/http/config.ts:144-175`)
|
|
26
|
+
- `getBasePrompt()` uses `process.env` indirectly — the function doesn't access it, but the static suffix is built at call time so we CAN check `process.env` there (`src/prompts/base-prompt.ts:477-509`)
|
|
27
|
+
- Swarm config fetch in entrypoint exports all config as env vars via `set -a` + source (`docker-entrypoint.sh:150-174`)
|
|
28
|
+
- The entrypoint injection point for new bootstrap logic is between config fetch (line 174) and MCP config creation (line 176)
|
|
29
|
+
- Claude plugins are installed at build time with `|| true` fallback (`Dockerfile.worker:88-97`)
|
|
30
|
+
- CLI tools install between lines 121-131 of Dockerfile.worker (after archil, before agent-swarm binary copy)
|
|
31
|
+
|
|
32
|
+
## Desired End State
|
|
33
|
+
|
|
34
|
+
When `AGENT_FS_API_URL` is set as a global swarm config:
|
|
35
|
+
|
|
36
|
+
1. **Every agent** auto-registers with agent-fs at first boot and stores its API key as an agent-scoped secret
|
|
37
|
+
2. **The lead** creates a shared "swarm" org with a default drive and gets a task to invite workers dynamically
|
|
38
|
+
3. **The system prompt** includes agent-fs CLI instructions (write, cat, search, comment) with personal and shared drive usage
|
|
39
|
+
4. **Agents use `agent-fs` CLI** via Bash tool for all thoughts, research, plans, and shared documents — no longer writing to `/workspace/shared/thoughts/`
|
|
40
|
+
5. **Local filesystem** continues to work for repos, artifacts, scripts, PM2 state
|
|
41
|
+
6. **When `AGENT_FS_API_URL` is NOT set**, everything works exactly as before — zero behavioral change
|
|
42
|
+
|
|
43
|
+
### Verification of End State:
|
|
44
|
+
- `docker exec <worker> env | grep AGENT_FS` shows both `AGENT_FS_API_URL` and `AGENT_FS_API_KEY`
|
|
45
|
+
- `docker exec <worker> agent-fs whoami` returns the agent's identity
|
|
46
|
+
- `docker exec <worker> agent-fs ls thoughts/` works on the personal drive
|
|
47
|
+
- `docker exec <worker> agent-fs --org <sharedOrgId> ls /` works on the shared drive
|
|
48
|
+
- The system prompt in a task session includes the agent-fs instructions section
|
|
49
|
+
- Without `AGENT_FS_API_URL`, the system prompt uses only the existing `BASE_PROMPT_FILESYSTEM`
|
|
50
|
+
|
|
51
|
+
## Quick Verification Reference
|
|
52
|
+
|
|
53
|
+
Common commands:
|
|
54
|
+
- `bun run lint:fix` — Biome lint + format
|
|
55
|
+
- `bun run tsc:check` — TypeScript type check
|
|
56
|
+
- `bun test` — Unit tests
|
|
57
|
+
- `docker build -f Dockerfile.worker -t agent-swarm-worker:test .` — Docker build test
|
|
58
|
+
|
|
59
|
+
Key files:
|
|
60
|
+
- `Dockerfile.worker` — Docker image build (CLI + plugin install)
|
|
61
|
+
- `docker-entrypoint.sh` — Bootstrap logic (registration, shared org)
|
|
62
|
+
- `src/prompts/base-prompt.ts` — System prompt with agent-fs instructions
|
|
63
|
+
- `src/http/config.ts` — Config API (used by entrypoint for storing keys)
|
|
64
|
+
|
|
65
|
+
## What We're NOT Doing
|
|
66
|
+
|
|
67
|
+
- **No MCP server for agent-fs** — CLI only (avoids tool bloat, research decision #4)
|
|
68
|
+
- **No migration of existing thoughts** — new content goes to agent-fs, existing local thoughts stay (research decision #5)
|
|
69
|
+
- **No dashboard UI integration** — humans access via `live.agent-fs.dev` (research decision #6)
|
|
70
|
+
- **No changes to runner.ts or claude-adapter.ts** — `fetchResolvedEnv()` already handles env injection
|
|
71
|
+
- **No changes to hook.ts** — CLAUDE.md writing is separate from base prompt
|
|
72
|
+
- **No template CLAUDE.md changes** — base prompt overrides template filesystem references
|
|
73
|
+
- **No `--drive` flag support** — single shared drive per org is sufficient (research caveat acknowledged)
|
|
74
|
+
|
|
75
|
+
## Implementation Approach
|
|
76
|
+
|
|
77
|
+
The integration follows the same conditional pattern as Archil (`ARCHIL_MOUNT_TOKEN`): feature-flagged on `AGENT_FS_API_URL`, zero impact when absent. The entrypoint handles registration and org setup imperatively (curl calls), the base prompt conditionally includes CLI instructions, and the existing config resolution pipeline (`fetchResolvedEnv()`) handles env var propagation without code changes.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Phase 1: Dockerfile.worker — Install agent-fs CLI + Plugin
|
|
82
|
+
|
|
83
|
+
### Overview
|
|
84
|
+
Add the `agent-fs` CLI binary and Claude Code plugin to the Docker worker image. This is a prerequisite for all subsequent phases — agents need the binary available to use the CLI, and the plugin provides the skill that teaches agents CLI commands on-demand.
|
|
85
|
+
|
|
86
|
+
### Changes Required:
|
|
87
|
+
|
|
88
|
+
#### 1. Install agent-fs CLI binary
|
|
89
|
+
**File**: `Dockerfile.worker`
|
|
90
|
+
**Where**: In the existing `npm install -g` block (lines 122-128) — combine into a single RUN layer for Docker cache efficiency
|
|
91
|
+
**Changes**: Add `@desplega.ai/agent-fs` to the existing npm global install:
|
|
92
|
+
```dockerfile
|
|
93
|
+
# Install global npm tools (pinned versions for cache stability)
|
|
94
|
+
USER root
|
|
95
|
+
RUN npm install -g \
|
|
96
|
+
pm2@6.0.14 \
|
|
97
|
+
@sentry/cli@3.3.0 \
|
|
98
|
+
@desplega.ai/wts@0.2.2 \
|
|
99
|
+
@desplega.ai/localtunnel@2.2.0 \
|
|
100
|
+
@desplega.ai/qa-use@2.8.7 \
|
|
101
|
+
@desplega.ai/agent-fs@latest \
|
|
102
|
+
&& qa-use install-deps
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
This keeps it in a single layer with other npm globals, which is the existing Docker optimization pattern. The package is infrequently updated, so it benefits from layer caching.
|
|
106
|
+
|
|
107
|
+
#### 2. Install agent-fs Claude Code plugin
|
|
108
|
+
**File**: `Dockerfile.worker`
|
|
109
|
+
**Where**: In the existing Claude plugin marketplace block (lines 88-97) — follows the `claude plugin marketplace add` + `claude plugin install` pattern used by all other plugins
|
|
110
|
+
**Changes**: Add agent-fs plugin installation:
|
|
111
|
+
```dockerfile
|
|
112
|
+
RUN mkdir -p /home/worker/.claude \
|
|
113
|
+
&& claude plugin marketplace add desplega-ai/ai-toolbox || true \
|
|
114
|
+
&& claude plugin install desplega@desplega-ai-toolbox --scope user || true \
|
|
115
|
+
&& claude plugin install agent-swarm@desplega-ai-toolbox --scope user || true \
|
|
116
|
+
&& claude plugin install wts@desplega-ai-toolbox --scope user || true \
|
|
117
|
+
&& claude plugin marketplace add desplega-ai/qa-use || true \
|
|
118
|
+
&& claude plugin install qa-use@desplega.ai --scope user || true \
|
|
119
|
+
&& claude plugin marketplace add mksglu/claude-context-mode || true \
|
|
120
|
+
&& claude plugin install context-mode@claude-context-mode --scope user || true \
|
|
121
|
+
&& claude plugin marketplace add desplega-ai/agent-fs || true \
|
|
122
|
+
&& claude plugin install agent-fs@desplega-ai-agent-fs --scope user || true
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Note**: Plugins are installed at Docker build time (not in the entrypoint — verified: zero "plugin" references in `docker-entrypoint.sh`). The plugin provides the `agent-fs` skill (CLI reference, `skills/agent-fs/SKILL.md`) that auto-injects on relevant Bash tool calls. The plugin’s MCP server won’t be active because it’s not in `enabledMcpjsonServers` (line 107).
|
|
126
|
+
|
|
127
|
+
**Pre-requisite**: Verify the agent-fs plugin is published to the Claude Code marketplace before implementation. If not yet published, skip this step and install the skill files directly by copying them into the Docker image (from `../agent-fs/skills/agent-fs/` to `/home/worker/.claude/skills/agent-fs/`).
|
|
128
|
+
|
|
129
|
+
### Success Criteria:
|
|
130
|
+
|
|
131
|
+
#### Automated Verification:
|
|
132
|
+
- [x] Docker build succeeds: `docker build -f Dockerfile.worker -t agent-swarm-worker:test .`
|
|
133
|
+
- [x] agent-fs binary exists in image: `docker run --rm agent-swarm-worker:test which agent-fs`
|
|
134
|
+
- [x] agent-fs version works: `docker run --rm agent-swarm-worker:test agent-fs --version`
|
|
135
|
+
- [x] Plugin installed: `docker run --rm -u worker agent-swarm-worker:test claude plugin list 2>/dev/null | grep agent-fs`
|
|
136
|
+
|
|
137
|
+
#### Manual Verification:
|
|
138
|
+
- [x] Docker image builds without errors or warnings related to agent-fs
|
|
139
|
+
- [x] The image size increase is reasonable (< 50MB)
|
|
140
|
+
|
|
141
|
+
**Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 2.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Phase 2: docker-entrypoint.sh — Agent-fs Bootstrap (Worker Registration)
|
|
146
|
+
|
|
147
|
+
### Overview
|
|
148
|
+
Add conditional agent-fs registration logic to the Docker entrypoint. When `AGENT_FS_API_URL` is in the environment (from swarm config), each agent registers with agent-fs at boot if it doesn't already have an API key. The key is stored as an agent-scoped secret via the swarm config API.
|
|
149
|
+
|
|
150
|
+
### Changes Required:
|
|
151
|
+
|
|
152
|
+
#### 1. Agent-fs registration block
|
|
153
|
+
**File**: `docker-entrypoint.sh`
|
|
154
|
+
**Where**: After swarm config fetch (line 174), before MCP config creation (line 176)
|
|
155
|
+
**Changes**: Add a new conditional block:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# === agent-fs registration ===
|
|
159
|
+
if [ -n "$AGENT_FS_API_URL" ] && [ -n "$AGENT_ID" ]; then
|
|
160
|
+
if [ -z "$AGENT_FS_API_KEY" ]; then
|
|
161
|
+
echo "[agent-fs] Registering with agent-fs at $AGENT_FS_API_URL..."
|
|
162
|
+
AF_EMAIL="${AGENT_EMAIL:-${AGENT_ID}@swarm.local}"
|
|
163
|
+
|
|
164
|
+
AF_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/auth/register" \
|
|
165
|
+
-H "Content-Type: application/json" \
|
|
166
|
+
-d "{\"email\": \"$AF_EMAIL\"}" 2>/dev/null) || true
|
|
167
|
+
|
|
168
|
+
AF_API_KEY=$(echo "$AF_RESULT" | jq -r '.apiKey // empty')
|
|
169
|
+
|
|
170
|
+
if [ -n "$AF_API_KEY" ]; then
|
|
171
|
+
echo "[agent-fs] Registered successfully, storing API key..."
|
|
172
|
+
# Store as agent-scoped secret
|
|
173
|
+
curl -s -X POST "${MCP_URL}/api/config" \
|
|
174
|
+
-H "Authorization: Bearer ${API_KEY}" \
|
|
175
|
+
-H "Content-Type: application/json" \
|
|
176
|
+
-d "{
|
|
177
|
+
\"scope\": \"agent\",
|
|
178
|
+
\"scopeId\": \"${AGENT_ID}\",
|
|
179
|
+
\"key\": \"AGENT_FS_API_KEY\",
|
|
180
|
+
\"value\": \"${AF_API_KEY}\",
|
|
181
|
+
\"isSecret\": true,
|
|
182
|
+
\"description\": \"agent-fs API key for ${AF_EMAIL}\"
|
|
183
|
+
}" > /dev/null 2>&1 || true
|
|
184
|
+
|
|
185
|
+
export AGENT_FS_API_KEY="$AF_API_KEY"
|
|
186
|
+
echo "[agent-fs] API key stored and exported"
|
|
187
|
+
else
|
|
188
|
+
echo "[agent-fs] Registration failed or already registered: $(echo "$AF_RESULT" | jq -r '.error // .message // "unknown error"')"
|
|
189
|
+
fi
|
|
190
|
+
else
|
|
191
|
+
echo "[agent-fs] Already registered (API key present)"
|
|
192
|
+
fi
|
|
193
|
+
fi
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**Key design decisions**:
|
|
197
|
+
- **Idempotent on restart**: The swarm config fetch at lines 150-174 runs BEFORE this block. On restart, `AGENT_FS_API_KEY` (stored as agent-scoped secret on first boot) is already loaded via `GET /api/config/resolved?agentId=...&includeSecrets=true` → exported via `set -a`. The `if [ -z "$AGENT_FS_API_KEY" ]` check sees the value and skips registration entirely.
|
|
198
|
+
- **Fail-safe**: Uses `|| true` and `/dev/null` redirects — agent-fs being down doesn't block the agent from booting
|
|
199
|
+
- **Email identity**: Uses `AGENT_EMAIL` env var if set, falls back to `{AGENT_ID}@swarm.local` (research decision #12)
|
|
200
|
+
- **Config storage**: Uses `POST /api/config` with `scope: "agent"` and `isSecret: true` (`src/http/config.ts:144-175`)
|
|
201
|
+
|
|
202
|
+
### Success Criteria:
|
|
203
|
+
|
|
204
|
+
#### Automated Verification:
|
|
205
|
+
- [x] Entrypoint script has no syntax errors: `bash -n docker-entrypoint.sh`
|
|
206
|
+
- [x] Shellcheck passes on the new block: `shellcheck docker-entrypoint.sh` (warnings acceptable)
|
|
207
|
+
|
|
208
|
+
#### Manual Verification:
|
|
209
|
+
- [x] With `AGENT_FS_API_URL` set and agent-fs server running: worker registers and API key appears in `GET /api/config/resolved?agentId=<id>&includeSecrets=true`
|
|
210
|
+
- [x] With `AGENT_FS_API_URL` NOT set: no agent-fs output in boot logs
|
|
211
|
+
- [x] Second boot (API key already stored): logs "Already registered" and skips registration
|
|
212
|
+
- [x] With agent-fs server down: boot continues normally with a warning log
|
|
213
|
+
|
|
214
|
+
**Implementation Note**: This phase requires an agent-fs server running locally for manual verification. Use `AGENT_FS_HOME=/tmp/agent-fs-test agent-fs onboard -y && agent-fs daemon start` to start one. Pause for manual confirmation before proceeding.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Phase 3: docker-entrypoint.sh — Agent-fs Bootstrap (Lead Orchestration)
|
|
219
|
+
|
|
220
|
+
### Overview
|
|
221
|
+
Add lead-specific logic to create a shared org/drive in agent-fs. The lead creates the “swarm” org on first boot (if `AGENT_FS_SHARED_ORG_ID` isn’t already set), stores the org ID as a global config, and creates a task for itself to handle agent invitations dynamically (since agents may use custom `AGENT_EMAIL` values that can’t be predicted in the entrypoint).
|
|
222
|
+
|
|
223
|
+
### Changes Required:
|
|
224
|
+
|
|
225
|
+
#### 1. Lead shared org creation
|
|
226
|
+
**File**: `docker-entrypoint.sh`
|
|
227
|
+
**Where**: Inside the agent-fs registration block from Phase 2, after the API key section, gated on `AGENT_ROLE`
|
|
228
|
+
**Changes**: Add lead-specific org creation logic:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# Lead-specific: create shared org
|
|
232
|
+
if [ “$AGENT_ROLE” = “lead” ] && [ -n “$AGENT_FS_API_KEY” ]; then
|
|
233
|
+
if [ -z “$AGENT_FS_SHARED_ORG_ID” ]; then
|
|
234
|
+
echo “[agent-fs] Lead: Creating shared org...”
|
|
235
|
+
AF_ORG_RESULT=$(curl -s -X POST “${AGENT_FS_API_URL}/orgs” \
|
|
236
|
+
-H “Authorization: Bearer ${AGENT_FS_API_KEY}” \
|
|
237
|
+
-H “Content-Type: application/json” \
|
|
238
|
+
-d ‘{“name”: “swarm”}’ 2>/dev/null) || true
|
|
239
|
+
|
|
240
|
+
AF_SHARED_ORG_ID=$(echo “$AF_ORG_RESULT” | jq -r ‘.orgId // .id // empty’)
|
|
241
|
+
|
|
242
|
+
if [ -n “$AF_SHARED_ORG_ID” ]; then
|
|
243
|
+
echo “[agent-fs] Shared org created: $AF_SHARED_ORG_ID”
|
|
244
|
+
# Store as global config so all agents see it
|
|
245
|
+
curl -s -X POST “${MCP_URL}/api/config” \
|
|
246
|
+
-H “Authorization: Bearer ${API_KEY}” \
|
|
247
|
+
-H “Content-Type: application/json” \
|
|
248
|
+
-d “{
|
|
249
|
+
\”scope\”: \”global\”,
|
|
250
|
+
\”key\”: \”AGENT_FS_SHARED_ORG_ID\”,
|
|
251
|
+
\”value\”: \”${AF_SHARED_ORG_ID}\”,
|
|
252
|
+
\”isSecret\”: false,
|
|
253
|
+
\”description\”: \”agent-fs shared org ID for the swarm\”
|
|
254
|
+
}” > /dev/null 2>&1 || true
|
|
255
|
+
|
|
256
|
+
export AGENT_FS_SHARED_ORG_ID=”$AF_SHARED_ORG_ID”
|
|
257
|
+
|
|
258
|
+
# Create a one-time task for the lead to invite workers
|
|
259
|
+
# (only on first org creation — not on restart)
|
|
260
|
+
echo “[agent-fs] Creating invitation task for lead...”
|
|
261
|
+
curl -s -X POST “${MCP_URL}/api/tasks” \
|
|
262
|
+
-H “Authorization: Bearer ${API_KEY}” \
|
|
263
|
+
-H “Content-Type: application/json” \
|
|
264
|
+
-d “{
|
|
265
|
+
\”task\”: \”Invite workers to agent-fs shared org (${AGENT_FS_SHARED_ORG_ID}). For each worker: check their AGENT_EMAIL config (or default to {agentId}@swarm.local), then run: agent-fs --org ${AGENT_FS_SHARED_ORG_ID} org invite --email <worker-email> --role editor. Skip any already invited.\”,
|
|
266
|
+
\”agentId\”: \”${AGENT_ID}\”,
|
|
267
|
+
\”source\”: \”system\”
|
|
268
|
+
}” > /dev/null 2>&1 || true
|
|
269
|
+
else
|
|
270
|
+
echo “[agent-fs] Failed to create shared org: $(echo “$AF_ORG_RESULT” | jq -r ‘.error // .message // “unknown”’)”
|
|
271
|
+
fi
|
|
272
|
+
else
|
|
273
|
+
echo “[agent-fs] Shared org already exists: $AGENT_FS_SHARED_ORG_ID”
|
|
274
|
+
fi
|
|
275
|
+
fi
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Key design decisions**:
|
|
279
|
+
- **Idempotent**: Checks `AGENT_FS_SHARED_ORG_ID` before creating — skips if already exists
|
|
280
|
+
- **Task-based invitations**: Instead of hardcoding invite logic in the entrypoint (which would fail for agents with custom `AGENT_EMAIL`), creates a task for the lead to handle invitations dynamically. The lead can ask each worker for their email and invite them properly.
|
|
281
|
+
- **One-time task**: The invitation task is created only when the org is first created (inside the `if [ -z “$AGENT_FS_SHARED_ORG_ID” ]` block), not on every restart.
|
|
282
|
+
- **Task API format**: Uses `POST /api/tasks` (`src/http/tasks.ts:46-68`) with body `{task, agentId, source}` — where `task` is the only required field.
|
|
283
|
+
- **Fail-safe**: All curl calls have `|| true` — agent-fs issues don’t prevent boot
|
|
284
|
+
- **Role check**: Uses `$AGENT_ROLE` env var (set in Dockerfile at line 165, default `worker`). The lead container passes `-e AGENT_ROLE=lead` at `docker run` time.
|
|
285
|
+
|
|
286
|
+
### Success Criteria:
|
|
287
|
+
|
|
288
|
+
#### Automated Verification:
|
|
289
|
+
- [x] Entrypoint script has no syntax errors: `bash -n docker-entrypoint.sh`
|
|
290
|
+
|
|
291
|
+
#### Manual Verification:
|
|
292
|
+
- [x] Lead boot with agent-fs: shared org created, `AGENT_FS_SHARED_ORG_ID` appears in global config
|
|
293
|
+
- [x] Second lead boot: logs “Shared org already exists” and skips creation
|
|
294
|
+
- [x] Invitation task created for the lead in the task queue
|
|
295
|
+
- [x] Lead boot without agent-fs: no agent-fs output in logs
|
|
296
|
+
|
|
297
|
+
**Implementation Note**: Test with the full E2E Docker setup (API + lead + worker containers). Pause for manual confirmation before proceeding.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Phase 4: base-prompt.ts — Conditional Agent-fs Instructions
|
|
302
|
+
|
|
303
|
+
### Overview
|
|
304
|
+
Add a new `BASE_PROMPT_AGENT_FS` constant with CLI usage instructions and conditionally include it in the system prompt when `process.env.AGENT_FS_API_URL` is set. This replaces the local filesystem instructions for thoughts/docs while keeping the existing `BASE_PROMPT_FILESYSTEM` for general workspace guidance.
|
|
305
|
+
|
|
306
|
+
### Changes Required:
|
|
307
|
+
|
|
308
|
+
#### 1. New agent-fs prompt constant
|
|
309
|
+
**File**: `src/prompts/base-prompt.ts`
|
|
310
|
+
**Where**: After `BASE_PROMPT_FILESYSTEM` definition (after line 304)
|
|
311
|
+
**Changes**: Add new constant:
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
const BASE_PROMPT_AGENT_FS = `
|
|
315
|
+
## Agent Filesystem (agent-fs)
|
|
316
|
+
|
|
317
|
+
You have access to agent-fs — a persistent, searchable filesystem shared across the swarm.
|
|
318
|
+
Use the \`agent-fs\` CLI for all thoughts, research, plans, and shared documents.
|
|
319
|
+
|
|
320
|
+
The \`agent-fs\` skill (from the agent-fs Claude Code plugin) provides a full CLI reference —
|
|
321
|
+
it auto-injects on relevant Bash tool calls. You can also run \`agent-fs docs\` for
|
|
322
|
+
interactive CLI documentation.
|
|
323
|
+
|
|
324
|
+
### Writing to your personal drive (default)
|
|
325
|
+
\`\`\`bash
|
|
326
|
+
agent-fs write thoughts/research/YYYY-MM-DD-topic.md --content "..." -m "description"
|
|
327
|
+
echo "content" | agent-fs write thoughts/plans/YYYY-MM-DD-topic.md -m "description"
|
|
328
|
+
\`\`\`
|
|
329
|
+
|
|
330
|
+
### Writing to the shared drive
|
|
331
|
+
Use the same directory structure as the personal drive, namespaced by your agent ID:
|
|
332
|
+
\`\`\`bash
|
|
333
|
+
# Structured files: thoughts/{agentId}/{type}/YYYY-MM-DD-name.md
|
|
334
|
+
agent-fs --org {sharedOrgId} write thoughts/{agentId}/research/YYYY-MM-DD-topic.md --content "..." -m "research findings"
|
|
335
|
+
agent-fs --org {sharedOrgId} write thoughts/{agentId}/plans/YYYY-MM-DD-topic.md --content "..." -m "implementation plan"
|
|
336
|
+
|
|
337
|
+
# Random/misc files: misc/{agentId}/name.ext
|
|
338
|
+
agent-fs --org {sharedOrgId} write misc/{agentId}/notes.md --content "..." -m "misc notes"
|
|
339
|
+
|
|
340
|
+
# Shared documents (not agent-namespaced): docs/name.md
|
|
341
|
+
agent-fs --org {sharedOrgId} write docs/shared-report.md --content "..." -m "for team review"
|
|
342
|
+
\`\`\`
|
|
343
|
+
|
|
344
|
+
### Reading and searching
|
|
345
|
+
\`\`\`bash
|
|
346
|
+
agent-fs cat thoughts/research/2026-03-18-topic.md
|
|
347
|
+
agent-fs fts "authentication" # keyword search across all files
|
|
348
|
+
agent-fs search "how does auth work" # semantic search
|
|
349
|
+
agent-fs ls thoughts/research/ # list files
|
|
350
|
+
agent-fs docs # interactive CLI documentation
|
|
351
|
+
\`\`\`
|
|
352
|
+
|
|
353
|
+
### Comments (for human-agent collaboration)
|
|
354
|
+
\`\`\`bash
|
|
355
|
+
agent-fs comment add docs/spec.md --body "Needs clarification on auth flow"
|
|
356
|
+
agent-fs comment list docs/spec.md
|
|
357
|
+
\`\`\`
|
|
358
|
+
|
|
359
|
+
Key conventions:
|
|
360
|
+
- **Personal drive**: thoughts/{type}/YYYY-MM-DD-topic.md (plans, research, brainstorms)
|
|
361
|
+
- **Shared drive**: thoughts/{agentId}/{type}/YYYY-MM-DD-topic.md (same structure, namespaced by your ID)
|
|
362
|
+
- **Misc files**: misc/{agentId}/name.ext (shared drive) or misc/name.ext (personal drive)
|
|
363
|
+
- Add version messages (-m) to writes for auditability
|
|
364
|
+
- All CLI output is JSON — parse it
|
|
365
|
+
- Use the shared drive (--org) for documents humans or other agents should review
|
|
366
|
+
- Run \`agent-fs docs\` if you need help with any command
|
|
367
|
+
|
|
368
|
+
Do NOT use the local filesystem (/workspace/shared/thoughts/) for thoughts or shared docs
|
|
369
|
+
when agent-fs is available. Local filesystem is still used for: repos, artifacts, scripts,
|
|
370
|
+
and any non-thought data.
|
|
371
|
+
`;
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### 2. Conditional injection in getBasePrompt()
|
|
375
|
+
**File**: `src/prompts/base-prompt.ts`
|
|
376
|
+
**Where**: In the static suffix construction (line 486)
|
|
377
|
+
**Changes**: After the `BASE_PROMPT_FILESYSTEM` injection (line 486), add conditional agent-fs section:
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// Always include base filesystem instructions
|
|
381
|
+
staticSuffix += BASE_PROMPT_FILESYSTEM.replaceAll("{agentId}", agentId);
|
|
382
|
+
|
|
383
|
+
// Conditionally include agent-fs instructions when available
|
|
384
|
+
if (process.env.AGENT_FS_API_URL) {
|
|
385
|
+
const sharedOrgId = process.env.AGENT_FS_SHARED_ORG_ID || "YOUR_SHARED_ORG_ID";
|
|
386
|
+
staticSuffix += BASE_PROMPT_AGENT_FS
|
|
387
|
+
.replaceAll("{agentId}", agentId)
|
|
388
|
+
.replaceAll("{sharedOrgId}", sharedOrgId);
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
#### 3. Keep `process.env` in sync with resolved config
|
|
393
|
+
**File**: `src/commands/runner.ts`
|
|
394
|
+
**Where**: Inside `spawnProviderProcess()`, after `fetchResolvedEnv()` (line 1155), before `buildSystemPrompt()` is called
|
|
395
|
+
**Changes**: Propagate agent-fs config values from the resolved env back to `process.env` so that `getBasePrompt()` can read them:
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
const freshEnv = await fetchResolvedEnv(opts.apiUrl, opts.apiKey, opts.agentId);
|
|
399
|
+
|
|
400
|
+
// Propagate agent-fs config to process.env so getBasePrompt() can read them
|
|
401
|
+
// (fetchResolvedEnv returns a new object, doesn't update process.env)
|
|
402
|
+
if (freshEnv.AGENT_FS_SHARED_ORG_ID) {
|
|
403
|
+
process.env.AGENT_FS_SHARED_ORG_ID = freshEnv.AGENT_FS_SHARED_ORG_ID;
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Note**: `buildSystemPrompt()` is called independently of `fetchResolvedEnv()` — they don't share state. Without this propagation, workers that boot before the lead creates the shared org would never see the org ID in the prompt (even though `fetchResolvedEnv()` picks it up per-task). This is a targeted update — only `AGENT_FS_SHARED_ORG_ID` is propagated, not the full env.
|
|
408
|
+
|
|
409
|
+
**Key design decisions**:
|
|
410
|
+
- **Additive, not replacing**: Both `BASE_PROMPT_FILESYSTEM` (local paths) and `BASE_PROMPT_AGENT_FS` are included — the agent-fs section says "do NOT use local filesystem for thoughts" which overrides the local paths for that specific use case
|
|
411
|
+
- **`process.env` kept in sync**: `AGENT_FS_API_URL` is available at boot from the entrypoint's `set -a` export. `AGENT_FS_SHARED_ORG_ID` is propagated from the resolved env per-task to handle the case where the lead creates the org after the worker starts.
|
|
412
|
+
- **Shared org fallback**: If `AGENT_FS_SHARED_ORG_ID` isn't available yet, a `"YOUR_SHARED_ORG_ID"` placeholder is shown. On the next task, the resolved env picks it up and propagates it to `process.env`.
|
|
413
|
+
|
|
414
|
+
### Success Criteria:
|
|
415
|
+
|
|
416
|
+
#### Automated Verification:
|
|
417
|
+
- [x] TypeScript compiles: `bun run tsc:check`
|
|
418
|
+
- [x] Linting passes: `bun run lint:fix`
|
|
419
|
+
- [x] Existing tests pass: `bun test`
|
|
420
|
+
|
|
421
|
+
#### Manual Verification:
|
|
422
|
+
- [x] With `AGENT_FS_API_URL` set in env: `getBasePrompt()` output includes "Agent Filesystem (agent-fs)" section
|
|
423
|
+
- [x] Without `AGENT_FS_API_URL`: `getBasePrompt()` output does NOT include agent-fs section
|
|
424
|
+
- [x] The `{agentId}` placeholder is correctly replaced in agent-fs section
|
|
425
|
+
- [x] The `{sharedOrgId}` placeholder is correctly replaced with the org ID or fallback
|
|
426
|
+
|
|
427
|
+
**Implementation Note**: Write a simple test or script to verify the prompt conditional. Pause for manual confirmation before proceeding.
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## Phase 5: E2E Verification
|
|
432
|
+
|
|
433
|
+
### Overview
|
|
434
|
+
Full end-to-end test of the integration with Docker containers and a local agent-fs server. Verify the complete flow: agent-fs server → Docker build → lead registration + shared org → worker registration → prompt injection → CLI operations from within a container.
|
|
435
|
+
|
|
436
|
+
### Test Setup:
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
# 1. Start a local agent-fs daemon (agent-fs CLI is already installed)
|
|
440
|
+
export AGENT_FS_HOME=/tmp/agent-fs-e2e
|
|
441
|
+
agent-fs onboard -y # sets up local MinIO + DB
|
|
442
|
+
agent-fs daemon start # starts the API daemon
|
|
443
|
+
AF_PORT=$(agent-fs daemon status --json | jq -r '.port // 7433')
|
|
444
|
+
AF_URL="http://host.docker.internal:${AF_PORT}"
|
|
445
|
+
|
|
446
|
+
# 2. Clean DB for fresh state
|
|
447
|
+
rm -f agent-swarm-db.sqlite agent-swarm-db.sqlite-wal agent-swarm-db.sqlite-shm
|
|
448
|
+
|
|
449
|
+
# 3. Start API server
|
|
450
|
+
bun run start:http &
|
|
451
|
+
|
|
452
|
+
# 4. Set AGENT_FS_API_URL as global swarm config
|
|
453
|
+
curl -X POST "http://localhost:3013/api/config" \
|
|
454
|
+
-H "Authorization: Bearer 123123" \
|
|
455
|
+
-H "Content-Type: application/json" \
|
|
456
|
+
-d "{\"scope\":\"global\",\"key\":\"AGENT_FS_API_URL\",\"value\":\"$AF_URL\",\"isSecret\":false,\"description\":\"agent-fs server URL\"}"
|
|
457
|
+
|
|
458
|
+
# 5. Build Docker image
|
|
459
|
+
docker build -f Dockerfile.worker -t agent-swarm-worker:test .
|
|
460
|
+
|
|
461
|
+
# 6. Start lead container
|
|
462
|
+
docker run --rm -d \
|
|
463
|
+
--name e2e-test-lead \
|
|
464
|
+
--env-file .env.docker-lead \
|
|
465
|
+
-e AGENT_ROLE=lead \
|
|
466
|
+
-e MAX_CONCURRENT_TASKS=1 \
|
|
467
|
+
-p 3201:3000 \
|
|
468
|
+
agent-swarm-worker:test
|
|
469
|
+
|
|
470
|
+
# 7. Start worker container
|
|
471
|
+
docker run --rm -d \
|
|
472
|
+
--name e2e-test-worker \
|
|
473
|
+
--env-file .env.docker \
|
|
474
|
+
-e MAX_CONCURRENT_TASKS=1 \
|
|
475
|
+
-p 3203:3000 \
|
|
476
|
+
agent-swarm-worker:test
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Verification Checklist:
|
|
480
|
+
|
|
481
|
+
#### Automated Verification:
|
|
482
|
+
- [x] Lead registered with agent-fs: `docker logs e2e-test-lead 2>&1 | grep "agent-fs.*Registered"`
|
|
483
|
+
- [x] Lead created shared org: `docker logs e2e-test-lead 2>&1 | grep "Shared org created"`
|
|
484
|
+
- [x] Worker registered with agent-fs: `docker logs e2e-test-worker 2>&1 | grep "agent-fs.*Registered"`
|
|
485
|
+
- [x] API keys stored in config: `curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?scope=agent&includeSecrets=true" | jq '.configs[] | select(.key=="AGENT_FS_API_KEY")'`
|
|
486
|
+
- [x] Shared org ID in global config: `curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?scope=global" | jq '.configs[] | select(.key=="AGENT_FS_SHARED_ORG_ID")'`
|
|
487
|
+
|
|
488
|
+
#### Manual Verification:
|
|
489
|
+
- [x] Worker can use agent-fs CLI: `docker exec e2e-test-worker agent-fs whoami`
|
|
490
|
+
- [x] Worker can write to personal drive: `docker exec e2e-test-worker agent-fs write test.md --content "hello" -m "test"`
|
|
491
|
+
- [x] Worker can read from personal drive: `docker exec e2e-test-worker agent-fs cat test.md`
|
|
492
|
+
- [x] Worker can write to shared drive: `docker exec e2e-test-worker bash -c 'agent-fs --org $AGENT_FS_SHARED_ORG_ID write shared-test.md --content "shared" -m "test"'`
|
|
493
|
+
- [x] Create a trivial task and verify the system prompt includes "Agent Filesystem" section
|
|
494
|
+
- [x] Without `AGENT_FS_API_URL`: system prompt does NOT include agent-fs section
|
|
495
|
+
|
|
496
|
+
#### Cleanup:
|
|
497
|
+
```bash
|
|
498
|
+
docker stop e2e-test-lead e2e-test-worker
|
|
499
|
+
kill $(lsof -ti :3013)
|
|
500
|
+
agent-fs daemon stop
|
|
501
|
+
rm -rf /tmp/agent-fs-e2e
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
**Implementation Note**: This phase is verification-only, no code changes. If issues are found, fix them in the relevant phase and re-verify.
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## Testing Strategy
|
|
509
|
+
|
|
510
|
+
### Unit Tests
|
|
511
|
+
- Add a test for `getBasePrompt()` that verifies agent-fs section inclusion is conditional on `process.env.AGENT_FS_API_URL`
|
|
512
|
+
- Test both with and without the env var set
|
|
513
|
+
- Verify placeholder replacement for `{agentId}` and `{sharedOrgId}`
|
|
514
|
+
|
|
515
|
+
### Integration Tests
|
|
516
|
+
- Docker build test (CI already does this via merge gate)
|
|
517
|
+
- Entrypoint script syntax check (`bash -n`)
|
|
518
|
+
|
|
519
|
+
### E2E Tests
|
|
520
|
+
- Full Docker flow as described in Phase 5
|
|
521
|
+
- Test idempotency: second boot should skip registration
|
|
522
|
+
- Test failure mode: agent-fs server down during boot should not block agent startup
|
|
523
|
+
|
|
524
|
+
## Manual E2E Commands
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
# After full implementation, run these commands to verify:
|
|
528
|
+
|
|
529
|
+
# 0. Start a local agent-fs daemon (agent-fs CLI is already installed)
|
|
530
|
+
export AGENT_FS_HOME=/tmp/agent-fs-e2e
|
|
531
|
+
agent-fs onboard -y # sets up local MinIO + DB
|
|
532
|
+
agent-fs daemon start # starts the API daemon
|
|
533
|
+
AF_PORT=$(agent-fs daemon status --json | jq -r ‘.port // 7433’)
|
|
534
|
+
AF_URL="http://host.docker.internal:${AF_PORT}"
|
|
535
|
+
|
|
536
|
+
# 1. Start the agent-swarm API server
|
|
537
|
+
bun run start:http &
|
|
538
|
+
|
|
539
|
+
# 2. Set AGENT_FS_API_URL as global swarm config
|
|
540
|
+
curl -X POST "http://localhost:3013/api/config" \
|
|
541
|
+
-H "Authorization: Bearer 123123" \
|
|
542
|
+
-H "Content-Type: application/json" \
|
|
543
|
+
-d "{\"scope\":\"global\",\"key\":\"AGENT_FS_API_URL\",\"value\":\"${AF_URL}\",\"isSecret\":false}"
|
|
544
|
+
|
|
545
|
+
# 3. Build and start containers
|
|
546
|
+
docker build -f Dockerfile.worker -t agent-swarm-worker:test .
|
|
547
|
+
docker run --rm -d --name e2e-lead --env-file .env.docker-lead -e AGENT_ROLE=lead -p 3201:3000 agent-swarm-worker:test
|
|
548
|
+
docker run --rm -d --name e2e-worker --env-file .env.docker -p 3203:3000 agent-swarm-worker:test
|
|
549
|
+
|
|
550
|
+
# 4. Verify registration
|
|
551
|
+
curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?includeSecrets=true" | jq ‘.configs[] | select(.key | startswith("AGENT_FS"))’
|
|
552
|
+
|
|
553
|
+
# 5. Verify CLI works inside container
|
|
554
|
+
docker exec e2e-worker agent-fs whoami
|
|
555
|
+
docker exec e2e-worker agent-fs write hello.md --content "hello world" -m "test"
|
|
556
|
+
docker exec e2e-worker agent-fs cat hello.md
|
|
557
|
+
|
|
558
|
+
# 6. Verify prompt
|
|
559
|
+
docker exec e2e-worker env | grep AGENT_FS
|
|
560
|
+
|
|
561
|
+
# 7. Cleanup
|
|
562
|
+
docker stop e2e-lead e2e-worker
|
|
563
|
+
kill $(lsof -ti :3013)
|
|
564
|
+
agent-fs daemon stop
|
|
565
|
+
rm -rf /tmp/agent-fs-e2e
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
## References
|
|
569
|
+
|
|
570
|
+
- Research document: `thoughts/taras/research/2026-03-18-agent-fs-integration.md`
|
|
571
|
+
- agent-fs codebase: `../agent-fs`
|
|
572
|
+
- Resolved decisions: 13 decisions in research doc (CLI over MCP, self-registration, shared org model, email identity, etc.)
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## Review Errata
|
|
577
|
+
|
|
578
|
+
_Reviewed: 2026-03-18 by Claude (automated structural + content + codebase verification)_
|
|
579
|
+
|
|
580
|
+
### Important
|
|
581
|
+
|
|
582
|
+
_(All items addressed in plan update)_
|
|
583
|
+
|
|
584
|
+
### Resolved
|
|
585
|
+
|
|
586
|
+
- [x] **`process.env` gap for `AGENT_FS_SHARED_ORG_ID`** — Added Phase 4 change #3: propagate from resolved env to `process.env` in `spawnProviderProcess()`
|
|
587
|
+
- [x] **Task API body format** — Fixed Phase 3 curl body to use `{task, agentId, source}` per `src/http/tasks.ts:46-68`
|
|
588
|
+
- [x] **Duplicate invitation tasks on restart** — Moved task creation inside `if [ -z "$AGENT_FS_SHARED_ORG_ID" ]` block
|
|
589
|
+
- [x] **No version pin** — Changed to `@desplega.ai/agent-fs@latest` (pin specific version during implementation)
|
|
590
|
+
- [x] **Plugin marketplace name unverified** — Added fallback: copy skill files directly if not on marketplace
|
|
591
|
+
- [x] Frontmatter uses `author` instead of `planner` — acceptable for this project's conventions
|