@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/docker-entrypoint.sh
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -e
|
|
3
3
|
|
|
4
|
-
# Validate required environment variables
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
# Validate required environment variables based on provider
|
|
5
|
+
HARNESS_PROVIDER="${HARNESS_PROVIDER:-claude}"
|
|
6
|
+
|
|
7
|
+
if [ "$HARNESS_PROVIDER" = "pi" ]; then
|
|
8
|
+
# Pi-mono auth: ANTHROPIC_API_KEY, OPENROUTER_API_KEY, or auth.json must exist
|
|
9
|
+
if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$OPENROUTER_API_KEY" ] && [ ! -f "$HOME/.pi/agent/auth.json" ]; then
|
|
10
|
+
echo "Error: ANTHROPIC_API_KEY, OPENROUTER_API_KEY, or ~/.pi/agent/auth.json required for pi provider"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
else
|
|
14
|
+
# Claude auth (default)
|
|
15
|
+
if [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then
|
|
16
|
+
echo "Error: CLAUDE_CODE_OAUTH_TOKEN environment variable is required"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
8
19
|
fi
|
|
9
20
|
|
|
10
21
|
if [ -z "$API_KEY" ]; then
|
|
@@ -12,6 +23,50 @@ if [ -z "$API_KEY" ]; then
|
|
|
12
23
|
exit 1
|
|
13
24
|
fi
|
|
14
25
|
|
|
26
|
+
# ---- Archil disk mounts ----
|
|
27
|
+
# Skipped when ARCHIL_MOUNT_TOKEN is not set (local dev / environments without Archil)
|
|
28
|
+
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
29
|
+
echo ""
|
|
30
|
+
echo "=== Archil Mount ==="
|
|
31
|
+
|
|
32
|
+
# Ensure /dev/fuse exists (needed in some VM environments like Fly.io Firecracker)
|
|
33
|
+
if [ ! -e /dev/fuse ]; then
|
|
34
|
+
mknod /dev/fuse c 10 229
|
|
35
|
+
chmod 666 /dev/fuse
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
if [ -n "$ARCHIL_SHARED_DISK_NAME" ]; then
|
|
39
|
+
echo "Mounting shared disk ($ARCHIL_SHARED_DISK_NAME) at /workspace/shared..."
|
|
40
|
+
archil mount --shared "$ARCHIL_SHARED_DISK_NAME" /workspace/shared --region "$ARCHIL_REGION"
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# NOTE: Top-level shared directory pre-creation (thoughts/, memory/, etc.)
|
|
44
|
+
# lives in api-entrypoint.sh, not here. The API boots first and creates
|
|
45
|
+
# them so workers' mkdir auto-grants delegation at the subdir level.
|
|
46
|
+
|
|
47
|
+
if [ -n "$ARCHIL_PERSONAL_DISK_NAME" ]; then
|
|
48
|
+
echo "Mounting personal disk ($ARCHIL_PERSONAL_DISK_NAME) at /workspace/personal..."
|
|
49
|
+
# --force reclaims stale delegations from previous machine incarnations.
|
|
50
|
+
# Personal disks are always single-client, so force is safe.
|
|
51
|
+
# archil mount requires root — entrypoint runs as root (USER root in Dockerfile).
|
|
52
|
+
archil mount --force "$ARCHIL_PERSONAL_DISK_NAME" /workspace/personal --region "$ARCHIL_REGION"
|
|
53
|
+
# Brief pause for FUSE daemon to finish --force re-negotiation
|
|
54
|
+
sleep 1
|
|
55
|
+
fi
|
|
56
|
+
echo "===================="
|
|
57
|
+
fi
|
|
58
|
+
# ---- End Archil mount ----
|
|
59
|
+
|
|
60
|
+
# Create personal workspace subdirectories (after FUSE mount, since Archil
|
|
61
|
+
# requires empty mount points — these dirs can't exist at build time).
|
|
62
|
+
# Personal disk is exclusive (rw), so this always succeeds.
|
|
63
|
+
# NOTE: Shared disk subdirectories are created per-agent below (see
|
|
64
|
+
# "Setting up per-agent directories" block), NOT here.
|
|
65
|
+
mkdir -p /workspace/personal/memory 2>/dev/null || true
|
|
66
|
+
# chown individual dirs (not -R) to avoid EPERM on .archil system files
|
|
67
|
+
chown worker:worker /workspace/personal 2>/dev/null || true
|
|
68
|
+
chown worker:worker /workspace/personal/memory 2>/dev/null || true
|
|
69
|
+
|
|
15
70
|
# Role defaults to worker, can be set to "lead"
|
|
16
71
|
ROLE="${AGENT_ROLE:-worker}"
|
|
17
72
|
MCP_URL="${MCP_BASE_URL:-http://host.docker.internal:3013}"
|
|
@@ -28,6 +83,7 @@ fi
|
|
|
28
83
|
|
|
29
84
|
echo "=== Agent Swarm ${ROLE^} v${VERSION} ==="
|
|
30
85
|
echo "Agent ID: ${AGENT_ID:-<not set>}"
|
|
86
|
+
echo "Harness Provider: $HARNESS_PROVIDER"
|
|
31
87
|
echo "MCP Base URL: $MCP_URL"
|
|
32
88
|
echo "YOLO Mode: $YOLO_MODE"
|
|
33
89
|
echo "Session ID: ${SESSION_ID:-<auto-generated>}"
|
|
@@ -80,44 +136,148 @@ echo "=========================="
|
|
|
80
136
|
# Cleanup function for graceful shutdown
|
|
81
137
|
cleanup() {
|
|
82
138
|
echo ""
|
|
139
|
+
# Unmount Archil disks (flushes pending data to backing store)
|
|
140
|
+
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
141
|
+
echo "Unmounting Archil disks..."
|
|
142
|
+
archil unmount /workspace/shared 2>/dev/null || true
|
|
143
|
+
archil unmount /workspace/personal 2>/dev/null || true
|
|
144
|
+
fi
|
|
83
145
|
echo "Shutting down PM2 processes..."
|
|
84
146
|
pm2 kill 2>/dev/null || true
|
|
85
147
|
}
|
|
86
148
|
trap cleanup EXIT SIGINT SIGTERM
|
|
87
149
|
|
|
150
|
+
# ---- Fetch swarm config from API ----
|
|
151
|
+
if [ -n "$AGENT_ID" ]; then
|
|
152
|
+
echo "Fetching swarm config from API..."
|
|
153
|
+
if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
|
|
154
|
+
-H "X-Agent-ID: ${AGENT_ID}" \
|
|
155
|
+
"${MCP_URL}/api/config/resolved?agentId=${AGENT_ID}&includeSecrets=true" \
|
|
156
|
+
> /tmp/swarm_config.json 2>/dev/null; then
|
|
157
|
+
|
|
158
|
+
CONFIG_COUNT=$(jq '.configs | length' /tmp/swarm_config.json 2>/dev/null || echo "0")
|
|
159
|
+
if [ "$CONFIG_COUNT" -gt 0 ]; then
|
|
160
|
+
echo "Found $CONFIG_COUNT config entries, exporting as env vars..."
|
|
161
|
+
jq -r '.configs[] | "\(.key)=" + (.value | @sh)' /tmp/swarm_config.json > /tmp/swarm_config.env 2>/dev/null || true
|
|
162
|
+
if [ -f /tmp/swarm_config.env ]; then
|
|
163
|
+
set -a
|
|
164
|
+
. /tmp/swarm_config.env
|
|
165
|
+
set +a
|
|
166
|
+
rm -f /tmp/swarm_config.env
|
|
167
|
+
fi
|
|
168
|
+
fi
|
|
169
|
+
rm -f /tmp/swarm_config.json
|
|
170
|
+
else
|
|
171
|
+
echo "Warning: Could not fetch swarm config (API may not be ready)"
|
|
172
|
+
fi
|
|
173
|
+
fi
|
|
174
|
+
# ---- End swarm config fetch ----
|
|
175
|
+
|
|
176
|
+
# ---- agent-fs registration ----
|
|
177
|
+
if [ -n "$AGENT_FS_API_URL" ] && [ -n "$AGENT_ID" ]; then
|
|
178
|
+
if [ -z "$AGENT_FS_API_KEY" ]; then
|
|
179
|
+
echo "[agent-fs] Registering with agent-fs at $AGENT_FS_API_URL..."
|
|
180
|
+
AF_EMAIL="${AGENT_EMAIL:-${AGENT_ID}@swarm.local}"
|
|
181
|
+
|
|
182
|
+
AF_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/auth/register" \
|
|
183
|
+
-H "Content-Type: application/json" \
|
|
184
|
+
-d "{\"email\": \"$AF_EMAIL\"}" 2>/dev/null) || true
|
|
185
|
+
|
|
186
|
+
AF_API_KEY=$(echo "$AF_RESULT" | jq -r '.apiKey // empty')
|
|
187
|
+
|
|
188
|
+
if [ -n "$AF_API_KEY" ]; then
|
|
189
|
+
echo "[agent-fs] Registered successfully, storing API key..."
|
|
190
|
+
# Store as agent-scoped secret
|
|
191
|
+
curl -s -X PUT "${MCP_URL}/api/config" \
|
|
192
|
+
-H "Authorization: Bearer ${API_KEY}" \
|
|
193
|
+
-H "Content-Type: application/json" \
|
|
194
|
+
-d "{
|
|
195
|
+
\"scope\": \"agent\",
|
|
196
|
+
\"scopeId\": \"${AGENT_ID}\",
|
|
197
|
+
\"key\": \"AGENT_FS_API_KEY\",
|
|
198
|
+
\"value\": \"${AF_API_KEY}\",
|
|
199
|
+
\"isSecret\": true,
|
|
200
|
+
\"description\": \"agent-fs API key for ${AF_EMAIL}\"
|
|
201
|
+
}" > /dev/null 2>&1 || true
|
|
202
|
+
|
|
203
|
+
export AGENT_FS_API_KEY="$AF_API_KEY"
|
|
204
|
+
echo "[agent-fs] API key stored and exported"
|
|
205
|
+
else
|
|
206
|
+
echo "[agent-fs] Registration failed or already registered: $(echo "$AF_RESULT" | jq -r '.error // .message // "unknown error"')"
|
|
207
|
+
fi
|
|
208
|
+
else
|
|
209
|
+
echo "[agent-fs] Already registered (API key present)"
|
|
210
|
+
fi
|
|
211
|
+
|
|
212
|
+
# Lead-specific: create shared org
|
|
213
|
+
if [ "$AGENT_ROLE" = "lead" ] && [ -n "$AGENT_FS_API_KEY" ]; then
|
|
214
|
+
if [ -z "$AGENT_FS_SHARED_ORG_ID" ]; then
|
|
215
|
+
echo "[agent-fs] Lead: Creating shared org..."
|
|
216
|
+
AF_ORG_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/orgs" \
|
|
217
|
+
-H "Authorization: Bearer ${AGENT_FS_API_KEY}" \
|
|
218
|
+
-H "Content-Type: application/json" \
|
|
219
|
+
-d '{"name": "swarm"}' 2>/dev/null) || true
|
|
220
|
+
|
|
221
|
+
AF_SHARED_ORG_ID=$(echo "$AF_ORG_RESULT" | jq -r '.orgId // .id // empty')
|
|
222
|
+
|
|
223
|
+
if [ -n "$AF_SHARED_ORG_ID" ]; then
|
|
224
|
+
echo "[agent-fs] Shared org created: $AF_SHARED_ORG_ID"
|
|
225
|
+
# Store as global config so all agents see it
|
|
226
|
+
curl -s -X PUT "${MCP_URL}/api/config" \
|
|
227
|
+
-H "Authorization: Bearer ${API_KEY}" \
|
|
228
|
+
-H "Content-Type: application/json" \
|
|
229
|
+
-d "{
|
|
230
|
+
\"scope\": \"global\",
|
|
231
|
+
\"key\": \"AGENT_FS_SHARED_ORG_ID\",
|
|
232
|
+
\"value\": \"${AF_SHARED_ORG_ID}\",
|
|
233
|
+
\"isSecret\": false,
|
|
234
|
+
\"description\": \"agent-fs shared org ID for the swarm\"
|
|
235
|
+
}" > /dev/null 2>&1 || true
|
|
236
|
+
|
|
237
|
+
export AGENT_FS_SHARED_ORG_ID="$AF_SHARED_ORG_ID"
|
|
238
|
+
|
|
239
|
+
# Create a one-time task for the lead to invite workers
|
|
240
|
+
echo "[agent-fs] Creating invitation task for lead..."
|
|
241
|
+
curl -s -X POST "${MCP_URL}/api/tasks" \
|
|
242
|
+
-H "Authorization: Bearer ${API_KEY}" \
|
|
243
|
+
-H "Content-Type: application/json" \
|
|
244
|
+
-d "{
|
|
245
|
+
\"task\": \"Invite workers to agent-fs shared org (${AF_SHARED_ORG_ID}). For each worker: check their AGENT_EMAIL config (or default to {agentId}@swarm.local), then run: agent-fs --org ${AF_SHARED_ORG_ID} org invite --email <worker-email> --role editor. Skip any already invited.\",
|
|
246
|
+
\"agentId\": \"${AGENT_ID}\",
|
|
247
|
+
\"source\": \"system\"
|
|
248
|
+
}" > /dev/null 2>&1 || true
|
|
249
|
+
else
|
|
250
|
+
echo "[agent-fs] Failed to create shared org: $(echo "$AF_ORG_RESULT" | jq -r '.error // .message // "unknown"')"
|
|
251
|
+
fi
|
|
252
|
+
else
|
|
253
|
+
echo "[agent-fs] Shared org already exists: $AGENT_FS_SHARED_ORG_ID"
|
|
254
|
+
fi
|
|
255
|
+
fi
|
|
256
|
+
fi
|
|
257
|
+
# ---- End agent-fs registration ----
|
|
258
|
+
|
|
88
259
|
# Create .mcp.json in /workspace (project-level config)
|
|
89
260
|
echo "Creating MCP config in /workspace..."
|
|
261
|
+
# Build base MCP config with jq
|
|
262
|
+
MCP_JSON=$(jq -n \
|
|
263
|
+
--arg url "${MCP_URL}/mcp" \
|
|
264
|
+
--arg apiKey "Bearer ${API_KEY}" \
|
|
265
|
+
'{mcpServers: {"agent-swarm": {type: "http", url: $url, headers: {Authorization: $apiKey}}}}')
|
|
266
|
+
|
|
267
|
+
# Add X-Agent-ID header if set
|
|
90
268
|
if [ -n "$AGENT_ID" ]; then
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"X-Agent-ID": "${AGENT_ID}"
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
EOF
|
|
105
|
-
else
|
|
106
|
-
cat > /workspace/.mcp.json << EOF
|
|
107
|
-
{
|
|
108
|
-
"mcpServers": {
|
|
109
|
-
"agent-swarm": {
|
|
110
|
-
"type": "http",
|
|
111
|
-
"url": "${MCP_URL}/mcp",
|
|
112
|
-
"headers": {
|
|
113
|
-
"Authorization": "Bearer ${API_KEY}"
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
EOF
|
|
269
|
+
MCP_JSON=$(echo "$MCP_JSON" | jq --arg agentId "$AGENT_ID" \
|
|
270
|
+
'.mcpServers["agent-swarm"].headers["X-Agent-ID"] = $agentId')
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
# Add agentmail-mcp if API key is present
|
|
274
|
+
if [ -n "$AGENTMAIL_API_KEY" ]; then
|
|
275
|
+
MCP_JSON=$(echo "$MCP_JSON" | jq --arg key "$AGENTMAIL_API_KEY" \
|
|
276
|
+
'.mcpServers.agentmail = {command: "npx", args: ["-y", "agentmail-mcp"], env: {AGENTMAIL_API_KEY: $key}}')
|
|
119
277
|
fi
|
|
120
278
|
|
|
279
|
+
echo "$MCP_JSON" > /workspace/.mcp.json
|
|
280
|
+
|
|
121
281
|
# Configure GitHub authentication if token is provided
|
|
122
282
|
echo ""
|
|
123
283
|
echo "=== GitHub Authentication ==="
|
|
@@ -137,67 +297,162 @@ if [ -n "$GITHUB_TOKEN" ]; then
|
|
|
137
297
|
echo "GitHub authentication configured successfully"
|
|
138
298
|
echo "Git user: $GIT_NAME <$GIT_EMAIL>"
|
|
139
299
|
else
|
|
140
|
-
echo "WARNING: GITHUB_TOKEN not set - git push operations will fail"
|
|
300
|
+
echo "WARNING: GITHUB_TOKEN not set - GitHub git push operations will fail"
|
|
141
301
|
fi
|
|
142
302
|
echo "=============================="
|
|
143
303
|
|
|
144
|
-
#
|
|
304
|
+
# Configure GitLab authentication if token is provided
|
|
145
305
|
echo ""
|
|
146
|
-
echo "===
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
306
|
+
echo "=== GitLab Authentication ==="
|
|
307
|
+
if [ -n "$GITLAB_TOKEN" ]; then
|
|
308
|
+
echo "Configuring GitLab authentication..."
|
|
309
|
+
|
|
310
|
+
# Configure glab CLI with the token
|
|
311
|
+
GITLAB_HOST="${GITLAB_URL:-https://gitlab.com}"
|
|
312
|
+
# Strip protocol for glab host config
|
|
313
|
+
GITLAB_HOST_BARE=$(echo "$GITLAB_HOST" | sed 's|https\?://||')
|
|
314
|
+
echo "$GITLAB_TOKEN" | glab auth login --hostname "$GITLAB_HOST_BARE" --stdin 2>/dev/null || true
|
|
315
|
+
|
|
316
|
+
# Set git user config for GitLab commits (use GitLab-specific env vars or fall back to GitHub ones)
|
|
317
|
+
GITLAB_GIT_EMAIL="${GITLAB_EMAIL:-${GITHUB_EMAIL:-worker-agent@desplega.ai}}"
|
|
318
|
+
GITLAB_GIT_NAME="${GITLAB_NAME:-${GITHUB_NAME:-Worker Agent}}"
|
|
319
|
+
# Only override git config if GitHub didn't set it already
|
|
320
|
+
if [ -z "$GITHUB_TOKEN" ]; then
|
|
321
|
+
git config --global user.email "$GITLAB_GIT_EMAIL"
|
|
322
|
+
git config --global user.name "$GITLAB_GIT_NAME"
|
|
323
|
+
fi
|
|
162
324
|
|
|
163
|
-
echo "
|
|
325
|
+
echo "GitLab authentication configured successfully (host: $GITLAB_HOST_BARE)"
|
|
164
326
|
else
|
|
165
|
-
echo "
|
|
327
|
+
echo "GITLAB_TOKEN not set - GitLab integration disabled for this worker"
|
|
166
328
|
fi
|
|
167
|
-
echo "
|
|
329
|
+
echo "=============================="
|
|
168
330
|
|
|
169
|
-
#
|
|
331
|
+
# ---- Auto-clone registered repos ----
|
|
170
332
|
echo ""
|
|
171
|
-
echo "===
|
|
172
|
-
if
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
333
|
+
echo "=== Repo Auto-Clone ==="
|
|
334
|
+
if [ -n "$AGENT_ID" ]; then
|
|
335
|
+
echo "Fetching registered repos from API..."
|
|
336
|
+
if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
|
|
337
|
+
-H "X-Agent-ID: ${AGENT_ID}" \
|
|
338
|
+
"${MCP_URL}/api/repos?autoClone=true" \
|
|
339
|
+
> /tmp/swarm_repos.json 2>/dev/null; then
|
|
340
|
+
|
|
341
|
+
REPO_COUNT=$(jq '.repos | length' /tmp/swarm_repos.json 2>/dev/null || echo "0")
|
|
342
|
+
if [ "$REPO_COUNT" -gt 0 ]; then
|
|
343
|
+
echo "Found $REPO_COUNT repos to clone..."
|
|
344
|
+
|
|
345
|
+
jq -c '.repos[]' /tmp/swarm_repos.json | while read -r repo; do
|
|
346
|
+
REPO_URL=$(echo "$repo" | jq -r '.url')
|
|
347
|
+
REPO_NAME=$(echo "$repo" | jq -r '.name')
|
|
348
|
+
REPO_BRANCH=$(echo "$repo" | jq -r '.defaultBranch // "main"')
|
|
349
|
+
REPO_DIR=$(echo "$repo" | jq -r '.clonePath')
|
|
350
|
+
|
|
351
|
+
# Ensure parent directory exists
|
|
352
|
+
mkdir -p "$(dirname "$REPO_DIR")"
|
|
353
|
+
|
|
354
|
+
if [ -d "${REPO_DIR}/.git" ]; then
|
|
355
|
+
echo " Pulling ${REPO_NAME} (${REPO_BRANCH}) at ${REPO_DIR}..."
|
|
356
|
+
cd "$REPO_DIR" && git pull origin "$REPO_BRANCH" --ff-only 2>/dev/null || echo " Warning: Could not pull ${REPO_NAME}"
|
|
357
|
+
cd /workspace
|
|
358
|
+
else
|
|
359
|
+
echo " Cloning ${REPO_NAME} to ${REPO_DIR} (branch: ${REPO_BRANCH})..."
|
|
360
|
+
gh repo clone "$REPO_URL" "$REPO_DIR" -- --branch "$REPO_BRANCH" --single-branch 2>/dev/null || echo " Warning: Could not clone ${REPO_NAME}"
|
|
361
|
+
fi
|
|
362
|
+
done
|
|
363
|
+
else
|
|
364
|
+
echo "No repos registered for auto-clone"
|
|
365
|
+
fi
|
|
366
|
+
rm -f /tmp/swarm_repos.json
|
|
181
367
|
else
|
|
182
|
-
|
|
183
|
-
echo "AI Tracker DB Path: $AI_TRACKER_DB_PATH (default, AGENT_ID not set)"
|
|
368
|
+
echo "Warning: Could not fetch repos (API may not be ready)"
|
|
184
369
|
fi
|
|
370
|
+
else
|
|
371
|
+
echo "Skipping repo clone (no AGENT_ID)"
|
|
372
|
+
fi
|
|
373
|
+
echo "==============================="
|
|
185
374
|
|
|
186
|
-
# Persist AI_TRACKER_DB_PATH to .bashrc for git hooks and new shell sessions
|
|
187
|
-
# Git hooks spawn fresh shells that don't inherit the exported env var
|
|
188
|
-
if ! grep -q "AI_TRACKER_DB_PATH" ~/.bashrc 2>/dev/null; then
|
|
189
|
-
echo "export AI_TRACKER_DB_PATH=\"${AI_TRACKER_DB_PATH}\"" >> ~/.bashrc
|
|
190
|
-
fi
|
|
191
375
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
376
|
+
# Find existing startup script in /workspace (start-up.sh, .bash, .js, .ts, .bun, or bare)
|
|
377
|
+
find_startup_script() {
|
|
378
|
+
for pattern in start-up.sh start-up.bash start-up.js start-up.ts start-up.bun start-up; do
|
|
379
|
+
if [ -f "/workspace/${pattern}" ]; then
|
|
380
|
+
echo "/workspace/${pattern}"
|
|
381
|
+
return 0
|
|
382
|
+
fi
|
|
383
|
+
done
|
|
384
|
+
return 1
|
|
385
|
+
}
|
|
195
386
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
387
|
+
|
|
388
|
+
# ---- Fetch and compose setup scripts from API ----
|
|
389
|
+
if [ -n "$AGENT_ID" ]; then
|
|
390
|
+
echo ""
|
|
391
|
+
echo "=== Setup Script Fetch ==="
|
|
392
|
+
echo "Fetching setup scripts from API..."
|
|
393
|
+
if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
|
|
394
|
+
-H "X-Agent-ID: ${AGENT_ID}" \
|
|
395
|
+
"${MCP_URL}/api/agents/${AGENT_ID}/setup-script" \
|
|
396
|
+
> /tmp/setup_scripts.json 2>/dev/null; then
|
|
397
|
+
|
|
398
|
+
GLOBAL_SCRIPT=$(jq -r '.globalSetupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
|
|
399
|
+
AGENT_SCRIPT=$(jq -r '.setupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
|
|
400
|
+
|
|
401
|
+
if [ -n "$GLOBAL_SCRIPT" ] || [ -n "$AGENT_SCRIPT" ]; then
|
|
402
|
+
EXISTING_STARTUP=$(find_startup_script) || true
|
|
403
|
+
|
|
404
|
+
if [ -n "$EXISTING_STARTUP" ]; then
|
|
405
|
+
# Prepend to existing file (preserve operator content)
|
|
406
|
+
echo "Prepending DB setup script to existing ${EXISTING_STARTUP}..."
|
|
407
|
+
TEMP_FILE=$(mktemp)
|
|
408
|
+
echo "#!/bin/bash" > "$TEMP_FILE"
|
|
409
|
+
# Global script goes outside markers (not synced back to agent DB)
|
|
410
|
+
if [ -n "$GLOBAL_SCRIPT" ]; then
|
|
411
|
+
echo "# --- Global setup script ---" >> "$TEMP_FILE"
|
|
412
|
+
echo "$GLOBAL_SCRIPT" >> "$TEMP_FILE"
|
|
413
|
+
echo "" >> "$TEMP_FILE"
|
|
414
|
+
fi
|
|
415
|
+
# Agent script goes between markers (synced back to DB by hooks)
|
|
416
|
+
if [ -n "$AGENT_SCRIPT" ]; then
|
|
417
|
+
echo "# === Agent-managed setup (from DB) ===" >> "$TEMP_FILE"
|
|
418
|
+
echo "$AGENT_SCRIPT" >> "$TEMP_FILE"
|
|
419
|
+
echo "# === End agent-managed setup ===" >> "$TEMP_FILE"
|
|
420
|
+
fi
|
|
421
|
+
echo "" >> "$TEMP_FILE"
|
|
422
|
+
# Strip shebang, global section, and existing marker sections from original
|
|
423
|
+
sed '1{/^#!/d;}' "$EXISTING_STARTUP" \
|
|
424
|
+
| sed '/^# --- Global setup script ---$/,/^$/d' \
|
|
425
|
+
| sed '/^# === Agent-managed setup (from DB) ===$/,/^# === End agent-managed setup ===$/d' \
|
|
426
|
+
>> "$TEMP_FILE"
|
|
427
|
+
mv "$TEMP_FILE" "$EXISTING_STARTUP"
|
|
428
|
+
chmod +x "$EXISTING_STARTUP"
|
|
429
|
+
else
|
|
430
|
+
# Create new start-up.sh
|
|
431
|
+
echo "Creating /workspace/start-up.sh from DB setup script..."
|
|
432
|
+
echo "#!/bin/bash" > /workspace/start-up.sh
|
|
433
|
+
if [ -n "$GLOBAL_SCRIPT" ]; then
|
|
434
|
+
echo "# --- Global setup script ---" >> /workspace/start-up.sh
|
|
435
|
+
echo "$GLOBAL_SCRIPT" >> /workspace/start-up.sh
|
|
436
|
+
echo "" >> /workspace/start-up.sh
|
|
437
|
+
fi
|
|
438
|
+
if [ -n "$AGENT_SCRIPT" ]; then
|
|
439
|
+
echo "# === Agent-managed setup (from DB) ===" >> /workspace/start-up.sh
|
|
440
|
+
echo "$AGENT_SCRIPT" >> /workspace/start-up.sh
|
|
441
|
+
echo "# === End agent-managed setup ===" >> /workspace/start-up.sh
|
|
442
|
+
fi
|
|
443
|
+
chmod +x /workspace/start-up.sh
|
|
444
|
+
fi
|
|
445
|
+
echo "Setup scripts composed (global: $([ -n "$GLOBAL_SCRIPT" ] && echo "yes" || echo "no"), agent: $([ -n "$AGENT_SCRIPT" ] && echo "yes" || echo "no"))"
|
|
446
|
+
else
|
|
447
|
+
echo "No setup scripts configured"
|
|
448
|
+
fi
|
|
449
|
+
rm -f /tmp/setup_scripts.json
|
|
450
|
+
else
|
|
451
|
+
echo "Warning: Could not fetch setup scripts (API may not be ready)"
|
|
452
|
+
fi
|
|
453
|
+
echo "==============================="
|
|
199
454
|
fi
|
|
200
|
-
|
|
455
|
+
# ---- End setup script fetch ----
|
|
201
456
|
|
|
202
457
|
|
|
203
458
|
# Execute startup script if found
|
|
@@ -206,13 +461,7 @@ echo ""
|
|
|
206
461
|
echo "=== Startup Script Detection (${ROLE}) ==="
|
|
207
462
|
|
|
208
463
|
# Find startup script matching /workspace/start-up.* pattern
|
|
209
|
-
STARTUP_SCRIPT
|
|
210
|
-
for pattern in start-up.sh start-up.bash start-up.js start-up.ts start-up.bun start-up; do
|
|
211
|
-
if [ -f "/workspace/${pattern}" ]; then
|
|
212
|
-
STARTUP_SCRIPT="/workspace/${pattern}"
|
|
213
|
-
break
|
|
214
|
-
fi
|
|
215
|
-
done
|
|
464
|
+
STARTUP_SCRIPT=$(find_startup_script) || true
|
|
216
465
|
|
|
217
466
|
if [ -n "$STARTUP_SCRIPT" ]; then
|
|
218
467
|
echo "Found startup script: $STARTUP_SCRIPT"
|
|
@@ -302,24 +551,11 @@ fi
|
|
|
302
551
|
echo ""
|
|
303
552
|
echo "=== Workspace Initialization ==="
|
|
304
553
|
|
|
305
|
-
#
|
|
306
|
-
echo "Configuring wts for agent mode..."
|
|
307
|
-
mkdir -p /home/worker/.wts
|
|
308
|
-
cat > /home/worker/.wts/config.json << EOF
|
|
309
|
-
{
|
|
310
|
-
"defaults": {
|
|
311
|
-
"autoTmux": false,
|
|
312
|
-
"autoClaude": false
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
EOF
|
|
316
|
-
|
|
554
|
+
# Create todos.md if it doesn't exist
|
|
317
555
|
PERSONAL_DIR="/workspace/personal"
|
|
318
|
-
mkdir -p "$PERSONAL_DIR"
|
|
319
|
-
|
|
320
556
|
if [ ! -f "$PERSONAL_DIR/todos.md" ]; then
|
|
321
557
|
echo "Creating personal todos.md..."
|
|
322
|
-
cat > "$PERSONAL_DIR/todos.md" << EOF
|
|
558
|
+
cat > "$PERSONAL_DIR/todos.md" << EOF || echo "Warning: Could not create todos.md (disk may not be mounted)"
|
|
323
559
|
# My TODOs
|
|
324
560
|
|
|
325
561
|
## Current
|
|
@@ -329,24 +565,68 @@ else
|
|
|
329
565
|
echo "Personal todo.md already exists, skipping creation"
|
|
330
566
|
fi
|
|
331
567
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
#
|
|
568
|
+
# Set up per-agent directories on the shared disk (requires AGENT_ID at runtime)
|
|
569
|
+
# Each agent gets exclusive write access to its own subdirectories under each
|
|
570
|
+
# category (thoughts, memory, downloads, misc). All agents can read everything
|
|
571
|
+
# via the --shared mount.
|
|
335
572
|
if [ -n "$AGENT_ID" ]; then
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
573
|
+
AGENT_SHARED="/workspace/shared"
|
|
574
|
+
|
|
575
|
+
# Safety net: if top-level dirs don't exist yet (API still booting),
|
|
576
|
+
# retry a few times with backoff
|
|
577
|
+
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
578
|
+
for attempt in 1 2 3; do
|
|
579
|
+
if [ -d "$AGENT_SHARED/thoughts" ]; then
|
|
580
|
+
break
|
|
581
|
+
fi
|
|
582
|
+
echo "Waiting for shared directory structure (attempt $attempt/3)..."
|
|
583
|
+
sleep 3
|
|
584
|
+
done
|
|
585
|
+
fi
|
|
341
586
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
587
|
+
echo "Setting up per-agent directories for $AGENT_ID..."
|
|
588
|
+
|
|
589
|
+
# The shared disk is already mounted via `archil mount --shared`.
|
|
590
|
+
# Read access to ALL directories (including other agents') is automatic.
|
|
591
|
+
# Here we claim WRITE ownership of this agent's own subdirectories only.
|
|
592
|
+
#
|
|
593
|
+
# IMPORTANT: Top-level dirs (thoughts/, memory/, downloads/, misc/) are
|
|
594
|
+
# pre-created by the API machine at boot. This ensures our mkdir below
|
|
595
|
+
# auto-grants delegation at the SUBDIR level (e.g., thoughts/$AGENT_ID),
|
|
596
|
+
# not the parent level (thoughts/). See Appendix A in the plan for details.
|
|
597
|
+
|
|
598
|
+
for category in "thoughts" "memory" "downloads" "misc"; do
|
|
599
|
+
AGENT_DIR="$AGENT_SHARED/$category/$AGENT_ID"
|
|
600
|
+
|
|
601
|
+
# Create our subdir (auto-grants delegation on $AGENT_ID level)
|
|
602
|
+
# Entrypoint runs as root, so no sudo needed for mkdir.
|
|
603
|
+
mkdir -p "$AGENT_DIR" 2>/dev/null || true
|
|
604
|
+
|
|
605
|
+
# Checkout for persistent ownership (survives reboots where dir already exists)
|
|
606
|
+
# Use -f (force) to reclaim stale delegations from destroyed/redeployed machines.
|
|
607
|
+
# Each agent is the sole writer for its own subdirectory, so force is safe.
|
|
608
|
+
# Use `yes` piped in to auto-confirm the force-checkout prompt (no --yes flag).
|
|
609
|
+
# No sudo — entrypoint runs as root; sudo can swallow stdin pipes.
|
|
610
|
+
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
611
|
+
yes | archil checkout -f "$AGENT_DIR" 2>/dev/null || true
|
|
612
|
+
fi
|
|
613
|
+
|
|
614
|
+
# chown AFTER checkout — need Archil delegation before FUSE allows chown
|
|
615
|
+
chown worker:worker "$AGENT_DIR" 2>/dev/null || true
|
|
616
|
+
done
|
|
617
|
+
|
|
618
|
+
# Create standard subdirectories (within owned dirs, always succeeds)
|
|
619
|
+
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/plans"
|
|
620
|
+
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/research"
|
|
621
|
+
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/brainstorms"
|
|
622
|
+
mkdir -p "$AGENT_SHARED/downloads/$AGENT_ID/slack"
|
|
623
|
+
|
|
624
|
+
echo "Per-agent directories ready for $AGENT_ID"
|
|
625
|
+
fi
|
|
346
626
|
|
|
347
627
|
echo "==============================="
|
|
348
628
|
echo ""
|
|
349
629
|
|
|
350
630
|
# Run the agent using compiled binary
|
|
351
631
|
echo "Starting $ROLE..."
|
|
352
|
-
exec /usr/local/bin/agent-swarm "$ROLE" "$@"
|
|
632
|
+
exec gosu worker /usr/local/bin/agent-swarm "$ROLE" "$@"
|