@desplega.ai/agent-swarm 1.49.0 → 1.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/openapi.json +2070 -728
- package/package.json +10 -1
- package/src/agentmail/handlers.ts +65 -10
- package/src/agentmail/templates.ts +111 -0
- package/src/be/db.ts +1233 -7
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/019_skills.sql +65 -0
- package/src/be/migrations/020_approval_requests.sql +41 -0
- package/src/be/seed.ts +62 -0
- package/src/be/skill-parser.ts +70 -0
- package/src/be/skill-sync.ts +106 -0
- package/src/commands/runner.ts +320 -132
- package/src/commands/templates.ts +172 -0
- package/src/github/handlers.ts +292 -77
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/gitlab/handlers.ts +63 -22
- package/src/gitlab/templates.ts +140 -0
- package/src/heartbeat/heartbeat.ts +19 -10
- package/src/heartbeat/templates.ts +30 -0
- package/src/http/active-sessions.ts +27 -0
- package/src/http/approval-requests.ts +247 -0
- package/src/http/config.ts +3 -3
- package/src/http/index.ts +9 -2
- package/src/http/poll.ts +135 -14
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/schedules.ts +35 -0
- package/src/http/skills.ts +479 -0
- package/src/http/workflows.ts +8 -0
- package/src/linear/sync.ts +28 -4
- package/src/linear/templates.ts +47 -0
- package/src/prompts/base-prompt.ts +41 -490
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +15 -2
- package/src/providers/pi-mono-extension.ts +5 -1
- package/src/scheduler/scheduler.ts +125 -91
- package/src/server.ts +44 -0
- package/src/slack/assistant.ts +7 -4
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/handlers.ts +21 -6
- package/src/slack/templates.ts +55 -0
- package/src/tests/approval-requests.test.ts +735 -0
- package/src/tests/artifact-sdk.test.ts +12 -12
- package/src/tests/base-prompt.test.ts +49 -49
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/heartbeat.test.ts +1 -0
- package/src/tests/linear-webhook.test.ts +7 -3
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/self-improvement.test.ts +8 -7
- package/src/tests/skill-parser.test.ts +178 -0
- package/src/tests/skill-sync.test.ts +171 -0
- package/src/tests/slack-metadata-inheritance.test.ts +1 -1
- package/src/tests/slack-thread-followups.test.ts +1 -1
- package/src/tests/structured-output.test.ts +0 -4
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/workflow-async-v2.test.ts +126 -4
- package/src/tests/workflow-definition-validation.test.ts +76 -0
- package/src/tests/workflow-executors.test.ts +4 -2
- package/src/tests/workflow-retry-v2.test.ts +1 -1
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/request-human-input.ts +106 -0
- package/src/tools/skills/index.ts +11 -0
- package/src/tools/skills/skill-create.ts +105 -0
- package/src/tools/skills/skill-delete.ts +67 -0
- package/src/tools/skills/skill-get.ts +75 -0
- package/src/tools/skills/skill-install-remote.ts +152 -0
- package/src/tools/skills/skill-install.ts +101 -0
- package/src/tools/skills/skill-list.ts +77 -0
- package/src/tools/skills/skill-publish.ts +123 -0
- package/src/tools/skills/skill-search.ts +43 -0
- package/src/tools/skills/skill-sync-remote.ts +128 -0
- package/src/tools/skills/skill-uninstall.ts +60 -0
- package/src/tools/skills/skill-update.ts +128 -0
- package/src/tools/store-progress.ts +22 -4
- package/src/tools/task-action.ts +20 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +23 -0
- package/src/tools/update-profile.ts +106 -34
- package/src/tools/workflows/create-workflow.ts +19 -1
- package/src/tools/workflows/update-workflow.ts +16 -1
- package/src/types.ts +109 -2
- package/src/workflows/definition.ts +30 -12
- package/src/workflows/engine.ts +40 -14
- package/src/workflows/executors/agent-task.ts +14 -3
- package/src/workflows/executors/human-in-the-loop.ts +160 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/index.ts +1 -1
- package/src/workflows/recovery.ts +72 -0
- package/src/workflows/resume.ts +162 -12
- package/src/workflows/triggers.ts +31 -2
- package/src/workflows/version.ts +2 -0
- package/.claude/settings.json +0 -84
- package/.claude/settings.local.json +0 -117
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.entire/settings.json +0 -4
- package/.env.docker.example +0 -56
- package/.env.example +0 -78
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
- package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
- package/.github/workflows/ci.yml +0 -52
- package/.github/workflows/docker-and-deploy.yml +0 -132
- package/.github/workflows/merge-gate.yml +0 -233
- package/.opencode/plugins/entire.ts +0 -133
- package/.superset/config.json +0 -6
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -171
- package/CHANGELOG.md +0 -447
- package/CLAUDE.md +0 -521
- package/CONTRIBUTING.md +0 -315
- package/DEPLOYMENT.md +0 -622
- package/Dockerfile +0 -65
- package/Dockerfile.worker +0 -189
- package/MCP.md +0 -841
- package/UI.md +0 -40
- package/api-entrypoint.sh +0 -56
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/depot.json +0 -1
- package/docker-compose.example.yml +0 -350
- package/docker-compose.local.yml +0 -119
- package/docker-entrypoint.sh +0 -632
- package/docs-site/app/api/search/route.ts +0 -4
- package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
- package/docs-site/app/docs/layout.tsx +0 -12
- package/docs-site/app/globals.css +0 -24
- package/docs-site/app/layout.config.tsx +0 -34
- package/docs-site/app/layout.tsx +0 -119
- package/docs-site/app/llms-full.txt/route.ts +0 -11
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
- package/docs-site/app/llms.txt/route.ts +0 -8
- package/docs-site/app/page.tsx +0 -5
- package/docs-site/app/robots.ts +0 -13
- package/docs-site/app/sitemap.ts +0 -37
- package/docs-site/components/api-page.client.tsx +0 -4
- package/docs-site/components/api-page.tsx +0 -7
- package/docs-site/components/mdx/mermaid.tsx +0 -55
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
- package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
- package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
- package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
- package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
- package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
- package/docs-site/content/docs/(documentation)/index.mdx +0 -65
- package/docs-site/content/docs/(documentation)/meta.json +0 -19
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
- package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
- package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
- package/docs-site/content/docs/api-reference/agents.mdx +0 -9
- package/docs-site/content/docs/api-reference/channels.mdx +0 -9
- package/docs-site/content/docs/api-reference/config.mdx +0 -9
- package/docs-site/content/docs/api-reference/debug.mdx +0 -9
- package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
- package/docs-site/content/docs/api-reference/epics.mdx +0 -9
- package/docs-site/content/docs/api-reference/index.mdx +0 -32
- package/docs-site/content/docs/api-reference/memory.mdx +0 -9
- package/docs-site/content/docs/api-reference/meta.json +0 -25
- package/docs-site/content/docs/api-reference/poll.mdx +0 -9
- package/docs-site/content/docs/api-reference/repos.mdx +0 -9
- package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
- package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
- package/docs-site/content/docs/api-reference/stats.mdx +0 -9
- package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
- package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
- package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
- package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
- package/docs-site/content/docs/meta.json +0 -3
- package/docs-site/lib/get-llm-text.ts +0 -10
- package/docs-site/lib/openapi.ts +0 -23
- package/docs-site/lib/source.ts +0 -8
- package/docs-site/mdx-components.tsx +0 -13
- package/docs-site/next.config.mjs +0 -29
- package/docs-site/package.json +0 -35
- package/docs-site/pnpm-lock.yaml +0 -5407
- package/docs-site/postcss.config.mjs +0 -8
- package/docs-site/public/logo.png +0 -0
- package/docs-site/scripts/generate-docs.ts +0 -171
- package/docs-site/source.config.ts +0 -17
- package/docs-site/tsconfig.json +0 -46
- package/ecosystem.config.cjs +0 -66
- package/landing/next.config.ts +0 -14
- package/landing/package.json +0 -31
- package/landing/pnpm-lock.yaml +0 -1091
- package/landing/postcss.config.mjs +0 -8
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +0 -30
- package/landing/public/omghost-openfort.svg +0 -9
- package/landing/src/app/actions/waitlist.ts +0 -25
- package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
- package/landing/src/app/blog/page.tsx +0 -162
- package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
- package/landing/src/app/examples/page.tsx +0 -174
- package/landing/src/app/examples/x402/page.tsx +0 -456
- package/landing/src/app/globals.css +0 -122
- package/landing/src/app/layout.tsx +0 -134
- package/landing/src/app/page.tsx +0 -27
- package/landing/src/app/robots.ts +0 -13
- package/landing/src/app/sitemap.ts +0 -44
- package/landing/src/components/architecture.tsx +0 -163
- package/landing/src/components/cta.tsx +0 -52
- package/landing/src/components/features.tsx +0 -160
- package/landing/src/components/footer.tsx +0 -100
- package/landing/src/components/hero.tsx +0 -217
- package/landing/src/components/how-it-works.tsx +0 -165
- package/landing/src/components/navbar.tsx +0 -147
- package/landing/src/components/waitlist.tsx +0 -110
- package/landing/src/components/why-choose.tsx +0 -149
- package/landing/src/components/workshops.tsx +0 -328
- package/landing/src/lib/utils.ts +0 -6
- package/landing/tsconfig.json +0 -41
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
- package/new-ui/CLAUDE.md +0 -92
- package/new-ui/README.md +0 -73
- package/new-ui/biome.json +0 -42
- package/new-ui/components.json +0 -21
- package/new-ui/index.html +0 -25
- package/new-ui/package.json +0 -49
- package/new-ui/pnpm-lock.yaml +0 -4845
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +0 -814
- package/new-ui/src/api/hooks/index.ts +0 -64
- package/new-ui/src/api/hooks/use-agents.ts +0 -58
- package/new-ui/src/api/hooks/use-channels.ts +0 -115
- package/new-ui/src/api/hooks/use-config-api.ts +0 -46
- package/new-ui/src/api/hooks/use-costs.ts +0 -122
- package/new-ui/src/api/hooks/use-db-query.ts +0 -29
- package/new-ui/src/api/hooks/use-epics.ts +0 -75
- package/new-ui/src/api/hooks/use-repos.ts +0 -61
- package/new-ui/src/api/hooks/use-schedules.ts +0 -81
- package/new-ui/src/api/hooks/use-services.ts +0 -16
- package/new-ui/src/api/hooks/use-stats.ts +0 -27
- package/new-ui/src/api/hooks/use-tasks.ts +0 -89
- package/new-ui/src/api/hooks/use-workflows.ts +0 -109
- package/new-ui/src/api/types.ts +0 -549
- package/new-ui/src/app/App.tsx +0 -13
- package/new-ui/src/app/providers.tsx +0 -32
- package/new-ui/src/app/router.tsx +0 -52
- package/new-ui/src/components/layout/app-header.tsx +0 -47
- package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
- package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
- package/new-ui/src/components/layout/config-guard.tsx +0 -22
- package/new-ui/src/components/layout/root-layout.tsx +0 -40
- package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
- package/new-ui/src/components/shared/command-menu.tsx +0 -131
- package/new-ui/src/components/shared/data-grid.tsx +0 -141
- package/new-ui/src/components/shared/empty-state.tsx +0 -24
- package/new-ui/src/components/shared/error-boundary.tsx +0 -72
- package/new-ui/src/components/shared/json-viewer.tsx +0 -47
- package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
- package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
- package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
- package/new-ui/src/components/shared/stats-bar.tsx +0 -132
- package/new-ui/src/components/shared/status-badge.tsx +0 -131
- package/new-ui/src/components/shared/usage-summary.tsx +0 -179
- package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
- package/new-ui/src/components/ui/alert.tsx +0 -60
- package/new-ui/src/components/ui/avatar.tsx +0 -96
- package/new-ui/src/components/ui/badge.tsx +0 -46
- package/new-ui/src/components/ui/button.tsx +0 -62
- package/new-ui/src/components/ui/card.tsx +0 -75
- package/new-ui/src/components/ui/command.tsx +0 -160
- package/new-ui/src/components/ui/dialog.tsx +0 -143
- package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
- package/new-ui/src/components/ui/input.tsx +0 -21
- package/new-ui/src/components/ui/label.tsx +0 -19
- package/new-ui/src/components/ui/progress.tsx +0 -26
- package/new-ui/src/components/ui/scroll-area.tsx +0 -54
- package/new-ui/src/components/ui/select.tsx +0 -175
- package/new-ui/src/components/ui/separator.tsx +0 -28
- package/new-ui/src/components/ui/sheet.tsx +0 -132
- package/new-ui/src/components/ui/sidebar.tsx +0 -691
- package/new-ui/src/components/ui/skeleton.tsx +0 -13
- package/new-ui/src/components/ui/sonner.tsx +0 -35
- package/new-ui/src/components/ui/switch.tsx +0 -33
- package/new-ui/src/components/ui/table.tsx +0 -92
- package/new-ui/src/components/ui/tabs.tsx +0 -79
- package/new-ui/src/components/ui/textarea.tsx +0 -18
- package/new-ui/src/components/ui/tooltip.tsx +0 -51
- package/new-ui/src/components/workflows/action-node.tsx +0 -53
- package/new-ui/src/components/workflows/condition-node.tsx +0 -50
- package/new-ui/src/components/workflows/graph-utils.ts +0 -124
- package/new-ui/src/components/workflows/json-tree.tsx +0 -189
- package/new-ui/src/components/workflows/node-styles.ts +0 -10
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
- package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
- package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
- package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
- package/new-ui/src/hooks/use-config.ts +0 -203
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
- package/new-ui/src/hooks/use-mobile.ts +0 -19
- package/new-ui/src/hooks/use-theme.ts +0 -60
- package/new-ui/src/lib/config.ts +0 -188
- package/new-ui/src/lib/slugs.ts +0 -71
- package/new-ui/src/lib/utils.ts +0 -120
- package/new-ui/src/main.tsx +0 -11
- package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
- package/new-ui/src/pages/agents/page.tsx +0 -134
- package/new-ui/src/pages/chat/page.tsx +0 -674
- package/new-ui/src/pages/config/page.tsx +0 -1109
- package/new-ui/src/pages/dashboard/page.tsx +0 -454
- package/new-ui/src/pages/debug/page.tsx +0 -275
- package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
- package/new-ui/src/pages/epics/page.tsx +0 -321
- package/new-ui/src/pages/not-found/page.tsx +0 -18
- package/new-ui/src/pages/repos/page.tsx +0 -369
- package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
- package/new-ui/src/pages/schedules/page.tsx +0 -477
- package/new-ui/src/pages/services/page.tsx +0 -128
- package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
- package/new-ui/src/pages/tasks/page.tsx +0 -592
- package/new-ui/src/pages/usage/page.tsx +0 -195
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
- package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
- package/new-ui/src/pages/workflows/page.tsx +0 -266
- package/new-ui/src/styles/ag-grid.css +0 -36
- package/new-ui/src/styles/globals.css +0 -213
- package/new-ui/test-results/.last-run.json +0 -4
- package/new-ui/tsconfig.app.json +0 -34
- package/new-ui/tsconfig.json +0 -4
- package/new-ui/tsconfig.node.json +0 -26
- package/new-ui/vercel.json +0 -4
- package/new-ui/vite.config.ts +0 -28
- package/plugin/README.md +0 -1
- package/plugin/build-pi-skills.ts +0 -233
- package/plugin/hooks/hooks.json +0 -71
- package/prek.toml +0 -75
- package/pyproject.toml +0 -9
- package/scripts/check-db-boundary.sh +0 -60
- package/scripts/e2e-docker-provider.ts +0 -820
- package/scripts/e2e-io-schemas-test.ts +0 -807
- package/scripts/e2e-provider-test.ts +0 -220
- package/scripts/e2e-workflow-redesign.sh +0 -229
- package/scripts/e2e-workflow-test.sh +0 -285
- package/scripts/e2e-workflow-test.ts +0 -857
- package/scripts/generate-mcp-docs.ts +0 -415
- package/scripts/generate-openapi.ts +0 -26
- package/scripts/measure-tool-tokens.ts +0 -118
- package/scripts/x402-e2e-test.ts +0 -195
- package/scripts/x402-test-server.ts +0 -236
- package/scripts/x402-testnet-e2e.ts +0 -668
- package/slack-manifest.json +0 -88
- package/templates-ui/README.md +0 -46
- package/templates-ui/components.json +0 -17
- package/templates-ui/eslint.config.mjs +0 -18
- package/templates-ui/next.config.ts +0 -7
- package/templates-ui/package.json +0 -35
- package/templates-ui/pnpm-lock.yaml +0 -4571
- package/templates-ui/postcss.config.mjs +0 -7
- package/templates-ui/public/file.svg +0 -1
- package/templates-ui/public/globe.svg +0 -1
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +0 -1
- package/templates-ui/public/vercel.svg +0 -1
- package/templates-ui/public/window.svg +0 -1
- package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
- package/templates-ui/src/app/api/templates/route.ts +0 -18
- package/templates-ui/src/app/builder/page.tsx +0 -37
- package/templates-ui/src/app/globals.css +0 -94
- package/templates-ui/src/app/layout.tsx +0 -79
- package/templates-ui/src/app/page.tsx +0 -38
- package/templates-ui/src/app/robots.ts +0 -11
- package/templates-ui/src/app/sitemap.ts +0 -31
- package/templates-ui/src/components/compose-builder.tsx +0 -442
- package/templates-ui/src/components/compose-preview.tsx +0 -117
- package/templates-ui/src/components/file-preview.tsx +0 -77
- package/templates-ui/src/components/footer.tsx +0 -40
- package/templates-ui/src/components/header.tsx +0 -41
- package/templates-ui/src/components/template-card.tsx +0 -87
- package/templates-ui/src/components/template-detail.tsx +0 -125
- package/templates-ui/src/components/template-gallery.tsx +0 -263
- package/templates-ui/src/components/ui/badge.tsx +0 -36
- package/templates-ui/src/components/ui/button.tsx +0 -57
- package/templates-ui/src/components/ui/card.tsx +0 -76
- package/templates-ui/src/components/ui/separator.tsx +0 -31
- package/templates-ui/src/components/ui/tooltip.tsx +0 -32
- package/templates-ui/src/lib/compose-generator.ts +0 -241
- package/templates-ui/src/lib/templates.ts +0 -137
- package/templates-ui/src/lib/utils.ts +0 -6
- package/templates-ui/tsconfig.json +0 -34
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
- package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
- package/thoughts/shared/plans/.gitkeep +0 -0
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
- package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
- package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
- package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
- package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
- package/tsconfig.json +0 -37
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-03-11T12:00:00Z
|
|
3
|
-
topic: "Archil Shared Disk Write Access Strategies"
|
|
4
|
-
author: "Claude (research for Taras)"
|
|
5
|
-
status: "Research complete, awaiting decision"
|
|
6
|
-
tags: [research, archil, shared-disk, multi-agent, ownership, concurrency, fly-io]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Archil Shared Disk Write Access Strategies
|
|
10
|
-
|
|
11
|
-
## Problem Statement
|
|
12
|
-
|
|
13
|
-
We run 3 workers + 1 lead on Fly.io, each in its own Docker container. All mount the same Archil shared disk at `/workspace/shared` using `--shared` flag. Archil's delegation model grants **exclusive write ownership** to one client at a time per file/directory (recursive). The per-agent directories (`thoughts/$AGENT_ID/`) are fine because each agent checks out its own subtree. The problem is with **truly shared write targets**:
|
|
14
|
-
|
|
15
|
-
| Shared Write Target | Who Writes | Current Status |
|
|
16
|
-
|---|---|---|
|
|
17
|
-
| `/workspace/shared/thoughts/shared/plans/` | Any agent | **Broken** - first mkdir winner owns it, others get EPERM |
|
|
18
|
-
| `/workspace/shared/thoughts/shared/research/` | Any agent | **Broken** - same issue |
|
|
19
|
-
| `/workspace/shared/memory/` | Any agent (via Write/Edit tool) | **Broken** - same issue |
|
|
20
|
-
| `/workspace/shared/downloads/slack/` | Any agent (via slack-download-file) | **Broken** - same issue |
|
|
21
|
-
|
|
22
|
-
## Archil's Delegation Model
|
|
23
|
-
|
|
24
|
-
### From Official Docs + SDK
|
|
25
|
-
|
|
26
|
-
> "Archil uses a delegation model for writes. Before you can write to a file, you 'check out' a delegation on it -- this tells the server you intend to modify it and gives you exclusive access. When you're done, you 'check in' to release it so other clients can write."
|
|
27
|
-
|
|
28
|
-
```ts
|
|
29
|
-
await client.checkout(inodeId); // Acquire exclusive write delegation
|
|
30
|
-
await client.writeData(inodeId, 0, Buffer.from('new contents'));
|
|
31
|
-
await client.sync(); // Ensure write is durable on server
|
|
32
|
-
await client.checkin(inodeId); // Release delegation
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Key properties:
|
|
36
|
-
1. **Exclusive delegation**: Only ONE client can own a file/dir at a time
|
|
37
|
-
2. **Recursive ownership**: Owning a directory = owning ALL children. No parent of an owned dir can be owned by another client (ancestry constraint)
|
|
38
|
-
3. **`archil checkout /path`**: Requests exclusive access. Fails if another client already owns it
|
|
39
|
-
4. **`archil checkin /path`**: Releases the delegation so others can write
|
|
40
|
-
5. **`archil checkout --force /path`**: Revokes another client's ownership. **Dangerous**: may lose un-fsynced writes from the evicted client
|
|
41
|
-
6. **`mkdir` on unowned dir**: Auto-grants ownership to the creator
|
|
42
|
-
7. **On `archil unmount`**: All ownership claims are released automatically
|
|
43
|
-
|
|
44
|
-
Example from docs:
|
|
45
|
-
```
|
|
46
|
-
/(cannot be owned)
|
|
47
|
-
group/(cannot be owned) <-- because child is owned
|
|
48
|
-
models/(owned by client A)
|
|
49
|
-
model1.txt
|
|
50
|
-
model2.txt
|
|
51
|
-
data/(ownership available)
|
|
52
|
-
data.txt
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Current Architecture
|
|
56
|
-
|
|
57
|
-
### Archil Disk Topology
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
Swarm: {appName}
|
|
61
|
-
+-- {appName}-api (--shared mount on API container at /mnt/data)
|
|
62
|
-
+-- {appName}-shared (--shared mount on ALL containers at /workspace/shared)
|
|
63
|
-
+-- {appName}-personal-{id1} (exclusive mount on agent1 at /workspace/personal)
|
|
64
|
-
+-- {appName}-personal-{id2} (exclusive mount on agent2 at /workspace/personal)
|
|
65
|
-
+-- {appName}-personal-{id3} (exclusive mount on agent3 at /workspace/personal)
|
|
66
|
-
+-- {appName}-personal-{lead} (exclusive mount on lead at /workspace/personal)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Current Entrypoint Behavior
|
|
70
|
-
|
|
71
|
-
From `docker-entrypoint.sh`:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
# These dirs are created at boot - first agent to boot wins ownership
|
|
75
|
-
mkdir -p /workspace/shared/thoughts/shared/plans \
|
|
76
|
-
/workspace/shared/thoughts/shared/research \
|
|
77
|
-
/workspace/shared/memory 2>/dev/null || true
|
|
78
|
-
|
|
79
|
-
# Later, per-agent checkout (this works fine)
|
|
80
|
-
archil checkout "/workspace/shared/thoughts/$AGENT_ID"
|
|
81
|
-
mkdir -p "$AGENT_THOUGHTS_DIR/plans" "$AGENT_THOUGHTS_DIR/research"
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
The `mkdir -p` with `|| true` silently swallows EPERM from agents that lose the race. Only the first-booting agent can actually write to `thoughts/shared/` and `memory/`.
|
|
85
|
-
|
|
86
|
-
### Write Patterns in the Codebase
|
|
87
|
-
|
|
88
|
-
| Path | Writers | Trigger | Code Location |
|
|
89
|
-
|------|---------|---------|---------------|
|
|
90
|
-
| `thoughts/$AGENT_ID/{plans,research}/` | Single agent (owner) | /desplega:research, /desplega:create-plan | `base-prompt.ts:96,116` |
|
|
91
|
-
| `thoughts/shared/{plans,research}/` | Any agent | /desplega:create-plan | `base-prompt.ts:219` |
|
|
92
|
-
| `memory/` | Any agent | Write/Edit hook auto-indexes | `hook.ts:863-864`, `base-prompt.ts:245` |
|
|
93
|
-
| `downloads/slack/` | Any agent | Slack file downloads | `slack-download-file.ts:14` |
|
|
94
|
-
|
|
95
|
-
**Already working via database (not affected):**
|
|
96
|
-
- `inject-learning`: Lead injects learnings into worker memory via API (database), NOT filesystem
|
|
97
|
-
- `store-progress`: Creates memory entries in the database, not filesystem
|
|
98
|
-
- `memory-search`: Queries the indexed database, not raw files
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Strategy Evaluation
|
|
103
|
-
|
|
104
|
-
### Strategy A: Per-Agent Subdirectories Everywhere
|
|
105
|
-
|
|
106
|
-
**Concept**: Restructure so nothing is truly shared for writes. Every agent writes only to its own area under the shared disk. "Shared" becomes read-only visibility via the shared mount.
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
/workspace/shared/
|
|
110
|
-
thoughts/
|
|
111
|
-
agent-1/{plans,research}/ # agent-1 owns (checkout at boot)
|
|
112
|
-
agent-2/{plans,research}/ # agent-2 owns
|
|
113
|
-
lead/{plans,research}/ # lead owns
|
|
114
|
-
memory/
|
|
115
|
-
agent-1/ # agent-1 owns
|
|
116
|
-
agent-2/ # agent-2 owns
|
|
117
|
-
lead/ # lead owns
|
|
118
|
-
downloads/
|
|
119
|
-
agent-1/slack/ # agent-1 owns
|
|
120
|
-
agent-2/slack/ # agent-2 owns
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Agents read from any directory but only write to their own. The `thoughts/shared/` directory is eliminated.
|
|
124
|
-
|
|
125
|
-
**Changes required:**
|
|
126
|
-
1. `docker-entrypoint.sh`: Expand checkout to cover `memory/$AGENT_ID` and `downloads/$AGENT_ID`; remove `thoughts/shared` mkdir
|
|
127
|
-
2. `base-prompt.ts`: Direct all writes to `thoughts/{yourId}/`, `memory/{yourId}/`
|
|
128
|
-
3. `hook.ts` / `pi-mono-extension.ts`: Path detection already uses `startsWith("/workspace/shared/memory/")` so works unchanged
|
|
129
|
-
4. `slack-download-file.ts`: Change default save path to include `$AGENT_ID`
|
|
130
|
-
|
|
131
|
-
| Criterion | Rating | Notes |
|
|
132
|
-
|---|---|---|
|
|
133
|
-
| **Complexity** | Low | Mostly prompt + entrypoint changes |
|
|
134
|
-
| **Reliability** | Excellent | Zero race conditions - each agent owns its subtree exclusively |
|
|
135
|
-
| **Performance** | Excellent | No locking overhead, no checkout/checkin round-trips |
|
|
136
|
-
| **Agent workflow** | Medium | Agents scan multiple dirs for "shared" content. Reading is fine. |
|
|
137
|
-
| **Entrypoint changes** | Small | Expand checkout block, remove `thoughts/shared` mkdir |
|
|
138
|
-
| **Crash recovery** | Excellent | No shared state to corrupt |
|
|
139
|
-
|
|
140
|
-
**Risk**: Discovery is slightly harder (agents must scan N directories instead of one `shared/` dir).
|
|
141
|
-
|
|
142
|
-
**Verdict: RECOMMENDED -- Strong candidate**
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
### Strategy B: Rotating Ownership (Cooperative Checkout/Checkin)
|
|
147
|
-
|
|
148
|
-
**Concept**: Workers dynamically checkout/checkin shared directories when they need to write.
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
archil checkout /workspace/shared/memory
|
|
152
|
-
echo "content" > /workspace/shared/memory/my-file.md
|
|
153
|
-
sync
|
|
154
|
-
archil checkin /workspace/shared/memory
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
| Criterion | Rating | Notes |
|
|
158
|
-
|---|---|---|
|
|
159
|
-
| **Complexity** | High | Locking protocol, retry logic, deadlock prevention |
|
|
160
|
-
| **Reliability** | Poor | Race conditions, crash orphaning (held until unmount), starvation |
|
|
161
|
-
| **Performance** | Poor | Checkout round-trip + sync + checkin per write; contention cascades |
|
|
162
|
-
| **Agent workflow** | None (paths stay same) | |
|
|
163
|
-
| **Crash recovery** | Poor | Crashed agent holds ownership until container restarts |
|
|
164
|
-
|
|
165
|
-
**Key risks:**
|
|
166
|
-
- Agent checks out dir, enters a long thinking phase = others blocked for minutes
|
|
167
|
-
- Archil checkout is recursive on directories, so locking `memory/` locks ALL memory files
|
|
168
|
-
- Crash between checkout and checkin = dir locked until FUSE unmount
|
|
169
|
-
|
|
170
|
-
**Verdict: NOT RECOMMENDED -- Too fragile for agent workloads**
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
### Strategy C: Single Writer Pattern (Lead/API as Sole Shared Writer)
|
|
175
|
-
|
|
176
|
-
**Concept**: Designate the API server (or lead) as the sole writer to shared directories. Workers submit writes via MCP API tool.
|
|
177
|
-
|
|
178
|
-
```
|
|
179
|
-
Workers -> MCP tool (write-shared-file) -> API server -> writes to shared disk
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
| Criterion | Rating | Notes |
|
|
183
|
-
|---|---|---|
|
|
184
|
-
| **Complexity** | Medium | New API endpoint + MCP tool |
|
|
185
|
-
| **Reliability** | Good | Single writer = no conflicts |
|
|
186
|
-
| **Performance** | Acceptable | Extra network hop, but writes are infrequent |
|
|
187
|
-
| **Agent workflow** | High impact | Workers can't use `Write` tool for shared paths |
|
|
188
|
-
| **Crash recovery** | Good | API restarts release ownership |
|
|
189
|
-
|
|
190
|
-
**Key risks:**
|
|
191
|
-
- Agents are trained to use `Write` tool -- hard to redirect 100% of the time
|
|
192
|
-
- Read-after-write consistency through FUSE may show stale data
|
|
193
|
-
|
|
194
|
-
**Verdict: VIABLE but breaks natural file-write UX**
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
### Strategy D: Separate Archil Disks Per Agent
|
|
199
|
-
|
|
200
|
-
**Concept**: Give each agent its own Archil disk. Remove or keep shared disk read-only.
|
|
201
|
-
|
|
202
|
-
| Criterion | Rating | Notes |
|
|
203
|
-
|---|---|---|
|
|
204
|
-
| **Complexity** | High | Lose cross-agent filesystem reads |
|
|
205
|
-
| **Reliability** | Excellent | No shared write conflicts |
|
|
206
|
-
| **Performance** | Good | No contention |
|
|
207
|
-
| **Agent workflow** | Very High impact | Can't `cat` other agents' files at all |
|
|
208
|
-
|
|
209
|
-
**Verdict: NOT RECOMMENDED -- Kills the key benefit of shared filesystem (cross-agent reads)**
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
### Strategy E: Hybrid (Shared Disk for Reads + API for Shared Writes)
|
|
214
|
-
|
|
215
|
-
**Concept**: Keep shared disk for reads. Route shared-area writes through the API server.
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
Per-agent writes: Agent -> FUSE -> /workspace/shared/thoughts/$AGENT_ID/ (agent owns)
|
|
219
|
-
Shared writes: Agent -> MCP tool -> API -> /workspace/shared/thoughts/shared/
|
|
220
|
-
Reads: Agent -> FUSE -> /workspace/shared/* (all readable)
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
| Criterion | Rating | Notes |
|
|
224
|
-
|---|---|---|
|
|
225
|
-
| **Complexity** | Medium | API endpoint + MCP tool + hook logic |
|
|
226
|
-
| **Reliability** | Good | Single writer for shared dirs |
|
|
227
|
-
| **Performance** | Good | Only shared writes have extra hop |
|
|
228
|
-
| **Agent workflow** | Medium-High | Two write patterns to learn |
|
|
229
|
-
|
|
230
|
-
**Verdict: VIABLE but adds complexity without clear advantage over Strategy A**
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
### Strategy F: Force Checkout with Coordination
|
|
235
|
-
|
|
236
|
-
**Concept**: Use `archil checkout --force` to revoke ownership + distributed lock layer.
|
|
237
|
-
|
|
238
|
-
| Criterion | Rating | Notes |
|
|
239
|
-
|---|---|---|
|
|
240
|
-
| **Complexity** | Very High | Distributed locking + force checkout |
|
|
241
|
-
| **Reliability** | Poor | `--force` risks data loss from un-fsynced writes |
|
|
242
|
-
| **Performance** | Poor | Lock + force checkout + sync + checkin + unlock per write |
|
|
243
|
-
| **Crash recovery** | Very Poor | Orphaned lock + potential data loss |
|
|
244
|
-
|
|
245
|
-
**Verdict: NOT RECOMMENDED -- Overcomplicated and data-loss prone**
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
### Strategy G: mkdir-Based Per-Write Directories
|
|
250
|
-
|
|
251
|
-
**Concept**: Exploit `mkdir` auto-ownership. Each write creates a unique subdirectory.
|
|
252
|
-
|
|
253
|
-
```
|
|
254
|
-
/workspace/shared/memory/
|
|
255
|
-
1741690200-agent1-auth-fix/content.md # agent-1 created & owns
|
|
256
|
-
1741690500-agent2-db-pattern/content.md # agent-2 created & owns
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
| Criterion | Rating | Notes |
|
|
260
|
-
|---|---|---|
|
|
261
|
-
| **Complexity** | Medium | Write wrapper + read aggregation |
|
|
262
|
-
| **Reliability** | Good | Unique names avoid races |
|
|
263
|
-
| **Performance** | Good | mkdir is fast |
|
|
264
|
-
| **Agent workflow** | High impact | Can't `cat memory/auth-fix.md` -- need directory scanning |
|
|
265
|
-
| **Cleanup** | Needed | Thousands of single-file directories accumulate |
|
|
266
|
-
|
|
267
|
-
**Verdict: CREATIVE but impractical -- Directory proliferation, read patterns break**
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
### Strategy H: Symlink Farm (Per-Agent Writes + Shared View)
|
|
272
|
-
|
|
273
|
-
**Concept**: Each agent writes to its own area. Background process maintains symlinks in a `shared/` view.
|
|
274
|
-
|
|
275
|
-
**Key problem**: Who owns the `shared/plans/` directory to create the symlinks? Same ownership problem, circular.
|
|
276
|
-
|
|
277
|
-
Also unclear if Archil's FUSE layer handles symlinks correctly across clients.
|
|
278
|
-
|
|
279
|
-
**Verdict: NOT RECOMMENDED -- Circular ownership problem**
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
### Strategy I: Per-Agent Writes + Database Discovery (Enhanced Strategy A)
|
|
284
|
-
|
|
285
|
-
**Concept**: Strategy A plus a database-backed discovery layer. Each agent writes to its own directories. Shared artifacts are registered via API for cross-agent discovery.
|
|
286
|
-
|
|
287
|
-
```
|
|
288
|
-
Agent writes: /workspace/shared/thoughts/agent-1/plans/deploy-plan.md
|
|
289
|
-
Agent registers: POST /api/shared-artifacts { path, type: "plan", tags: ["deploy"] }
|
|
290
|
-
|
|
291
|
-
Other agent finds: GET /api/shared-artifacts?type=plan -> [{ path: "thoughts/agent-1/plans/..." }]
|
|
292
|
-
Other agent reads: cat /workspace/shared/thoughts/agent-1/plans/deploy-plan.md
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
| Criterion | Rating | Notes |
|
|
296
|
-
|---|---|---|
|
|
297
|
-
| **Complexity** | Medium | Strategy A + a simple API endpoint |
|
|
298
|
-
| **Reliability** | Excellent | No shared write conflicts. Database is the coordination point. |
|
|
299
|
-
| **Performance** | Excellent | Direct writes, API discovery is fast |
|
|
300
|
-
| **Agent workflow** | Low impact | Write normally to own dirs. Discovery via memory-search (exists) or new tool. |
|
|
301
|
-
| **Entrypoint changes** | Small | Same as Strategy A |
|
|
302
|
-
| **Crash recovery** | Excellent | Database survives container restarts |
|
|
303
|
-
|
|
304
|
-
**Key insight**: Memory discovery already exists via `memory-search` MCP tool (queries indexed DB). Plans/research discovery is simple with `ls /workspace/shared/thoughts/*/plans/`.
|
|
305
|
-
|
|
306
|
-
**Verdict: RECOMMENDED -- Best of all worlds**
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
### Strategy J: Direct R2 Writes (Bypass Archil for Shared Writes)
|
|
311
|
-
|
|
312
|
-
**Concept**: For shared writes, bypass Archil FUSE entirely and write directly to backing R2 bucket.
|
|
313
|
-
|
|
314
|
-
| Criterion | Rating | Notes |
|
|
315
|
-
|---|---|---|
|
|
316
|
-
| **Complexity** | Medium | R2 write logic, bucket prefix mapping |
|
|
317
|
-
| **Reliability** | Medium | Eventual consistency -- written file may not be visible via FUSE immediately |
|
|
318
|
-
| **Performance** | High | Direct R2 writes, no delegation contention |
|
|
319
|
-
| **Agent workflow** | Medium | Reads may be stale |
|
|
320
|
-
|
|
321
|
-
**Verdict: NOT RECOMMENDED -- Consistency issues make this unreliable for collaborative workflows**
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
## Comparative Summary
|
|
326
|
-
|
|
327
|
-
| Strategy | Complexity | Reliability | Performance | UX Impact | Verdict |
|
|
328
|
-
|---|---|---|---|---|---|
|
|
329
|
-
| **A: Per-agent subdirs** | Low | Excellent | Excellent | Medium | **RECOMMENDED** |
|
|
330
|
-
| **B: Rotating ownership** | High | Poor | Poor | None | Not recommended |
|
|
331
|
-
| **C: Single writer** | Medium | Good | Acceptable | High | Viable |
|
|
332
|
-
| **D: Separate disks** | High | Excellent | Good | Very High | Not recommended |
|
|
333
|
-
| **E: Hybrid API writes** | Medium | Good | Good | Medium-High | Viable |
|
|
334
|
-
| **F: Force checkout** | Very High | Poor | Poor | High | Not recommended |
|
|
335
|
-
| **G: mkdir per-write** | Medium | Good | Good | High | Impractical |
|
|
336
|
-
| **H: Symlink farm** | High | Medium | Good | Low | Not recommended |
|
|
337
|
-
| **I: Per-agent + DB discovery** | Medium | Excellent | Excellent | Low | **RECOMMENDED** |
|
|
338
|
-
| **J: Direct R2** | Medium | Medium | High | Medium | Not recommended |
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
## Recommendation: Strategy A+I Hybrid
|
|
343
|
-
|
|
344
|
-
### Primary recommendation: Per-Agent Writes + Database Discovery
|
|
345
|
-
|
|
346
|
-
Combine Strategies A and I. This is the cleanest solution because:
|
|
347
|
-
|
|
348
|
-
1. **Zero race conditions**: Each agent exclusively owns its subtree. Archil works as designed.
|
|
349
|
-
2. **Minimal changes**: Entrypoint already does per-agent checkout for thoughts. Expand to memory + downloads.
|
|
350
|
-
3. **Reads still work**: All agents can `cat` any file on the shared disk. No API needed for reads.
|
|
351
|
-
4. **Discovery already exists for memory**: `memory-search` MCP tool queries the indexed database. All memory writes get auto-indexed by the PostToolUse hook regardless of path.
|
|
352
|
-
5. **Plans/research discovery is trivial**: `ls /workspace/shared/thoughts/*/plans/` or lightweight tool.
|
|
353
|
-
|
|
354
|
-
### What about `thoughts/shared/`?
|
|
355
|
-
|
|
356
|
-
Eliminate it. A plan written by agent-1 "for the swarm" is still agent-1's plan -- just readable by everyone via the shared mount. The concept of a "shared scratchpad" is unnecessary when every agent's directory is readable by all.
|
|
357
|
-
|
|
358
|
-
### Implementation Plan
|
|
359
|
-
|
|
360
|
-
#### Phase 1: Entrypoint changes (low risk, immediate)
|
|
361
|
-
|
|
362
|
-
```bash
|
|
363
|
-
# In docker-entrypoint.sh, REMOVE:
|
|
364
|
-
mkdir -p /workspace/shared/thoughts/shared/plans \
|
|
365
|
-
/workspace/shared/thoughts/shared/research \
|
|
366
|
-
/workspace/shared/memory 2>/dev/null || true
|
|
367
|
-
|
|
368
|
-
# REPLACE the per-agent checkout block with:
|
|
369
|
-
if [ -n "$AGENT_ID" ] && [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
370
|
-
AGENT_SHARED="/workspace/shared"
|
|
371
|
-
for dir in "thoughts/$AGENT_ID" "memory/$AGENT_ID" "downloads/$AGENT_ID"; do
|
|
372
|
-
sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil checkout "$AGENT_SHARED/$dir" 2>/dev/null || true
|
|
373
|
-
mkdir -p "$AGENT_SHARED/$dir"
|
|
374
|
-
done
|
|
375
|
-
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/plans"
|
|
376
|
-
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/research"
|
|
377
|
-
fi
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
#### Phase 2: Prompt updates
|
|
381
|
-
|
|
382
|
-
Update `base-prompt.ts` to:
|
|
383
|
-
- Remove references to `/workspace/shared/thoughts/shared/`
|
|
384
|
-
- Direct agents to write plans/research to `/workspace/shared/thoughts/{yourId}/`
|
|
385
|
-
- Direct memory writes to `/workspace/shared/memory/{yourId}/`
|
|
386
|
-
- Add: "To see all agents' plans: `ls /workspace/shared/thoughts/*/plans/`"
|
|
387
|
-
|
|
388
|
-
#### Phase 3: Hook/extension updates
|
|
389
|
-
|
|
390
|
-
Update `hook.ts` and `pi-mono-extension.ts`:
|
|
391
|
-
- Memory auto-index path detection already uses `startsWith("/workspace/shared/memory/")` which will match `/workspace/shared/memory/$AGENT_ID/foo.md` -- no change needed
|
|
392
|
-
- The `isShared` scope detection uses same prefix -- also fine
|
|
393
|
-
|
|
394
|
-
#### Phase 4: Tool updates
|
|
395
|
-
|
|
396
|
-
- `slack-download-file.ts`: Default save to `/workspace/shared/downloads/${process.env.AGENT_ID}/slack/`
|
|
397
|
-
- Optional: Add `list-shared-artifacts` MCP tool for structured discovery
|
|
398
|
-
|
|
399
|
-
### Migration
|
|
400
|
-
|
|
401
|
-
- No data migration needed for new deployments
|
|
402
|
-
- Existing `thoughts/shared/` files remain read-only (no agent owns them after deploy)
|
|
403
|
-
- One-time migration script could move `thoughts/shared/*` to `thoughts/lead/*` if desired
|
|
404
|
-
|
|
405
|
-
---
|
|
406
|
-
|
|
407
|
-
## Open Questions
|
|
408
|
-
|
|
409
|
-
1. **Archil checkout on non-existent paths**: Can we `archil checkout /workspace/shared/memory/$AGENT_ID` before the directory exists? The current entrypoint does checkout then mkdir, suggesting checkout might create the path or work on non-existent paths. Needs validation.
|
|
410
|
-
|
|
411
|
-
2. **Multiple checkouts per client**: Can a single FUSE client checkout multiple non-overlapping subtrees simultaneously? (e.g., `thoughts/$AGENT_ID` AND `memory/$AGENT_ID`). The ancestry constraint docs suggest yes, since they don't share a parent that would conflict.
|
|
412
|
-
|
|
413
|
-
3. **Read propagation delay**: When agent-1 writes to its checked-out dir, how quickly does agent-2 see the new file via the shared FUSE mount? Near-instant (metadata server coordination) or delayed (cache invalidation)?
|
|
414
|
-
|
|
415
|
-
4. **AGENT_ID stability across deploys**: If AGENT_ID changes between deploys, old directories become orphaned. Need cleanup mechanism for long-lived shared disks.
|
|
416
|
-
|
|
417
|
-
5. **API server's shared mount**: The API server also mounts shared disk with `--shared`. If Strategy E fallback is ever needed, it would need its own checkout. Currently it only needs read access for serving files.
|
|
418
|
-
|
|
419
|
-
## Code References
|
|
420
|
-
|
|
421
|
-
| File | Relevant Lines | What |
|
|
422
|
-
|------|---------------|------|
|
|
423
|
-
| `agent-swarm/docker-entrypoint.sh` | 38-48 | Archil mount logic |
|
|
424
|
-
| `agent-swarm/docker-entrypoint.sh` | 55-58 | mkdir for shared dirs (the broken part) |
|
|
425
|
-
| `agent-swarm/docker-entrypoint.sh` | 477-486 | Per-agent checkout + mkdir |
|
|
426
|
-
| `agent-swarm/src/prompts/base-prompt.ts` | 96, 116 | Research/plan output paths |
|
|
427
|
-
| `agent-swarm/src/prompts/base-prompt.ts` | 215-220 | Workspace directory structure in prompt |
|
|
428
|
-
| `agent-swarm/src/prompts/base-prompt.ts` | 244-249 | Memory directory paths in prompt |
|
|
429
|
-
| `agent-swarm/src/hooks/hook.ts` | 863-864 | Memory file auto-indexing detection |
|
|
430
|
-
| `agent-swarm/src/hooks/hook.ts` | 870 | Shared vs personal scope detection |
|
|
431
|
-
| `agent-swarm/src/providers/pi-mono-extension.ts` | 473-474 | Memory write detection (pi-mono) |
|
|
432
|
-
| `agent-swarm/src/tools/slack-download-file.ts` | 14, 31 | Default download path |
|
|
433
|
-
| `agent-swarm/src/tools/inject-learning.ts` | 21 | DB-only writes (not affected) |
|
|
434
|
-
| `agent-swarm/src/tools/store-progress.ts` | 177-230 | DB-only writes (not affected) |
|
|
435
|
-
| `agent-swarm-internal/scripts/deploy-swarm.ts` | 39-63 | ensureArchilDisk function |
|
|
436
|
-
| `agent-swarm-internal/scripts/deploy-swarm.ts` | 297-324 | Agent machine config with Archil env vars |
|
|
437
|
-
| `agent-swarm-internal/scripts/deploy-swarm.ts` | 421-476 | Disk creation (shared + personal) |
|