@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,621 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-03-11T10:40:00Z
|
|
3
|
-
topic: "Archil Per-Agent Write Strategy Implementation"
|
|
4
|
-
author: Claude
|
|
5
|
-
status: completed
|
|
6
|
-
tags: [plan, archil, shared-disk, per-agent, ownership, fly-io]
|
|
7
|
-
research: "thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md"
|
|
8
|
-
autonomy: critical
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Archil Per-Agent Write Strategy Implementation Plan
|
|
12
|
-
|
|
13
|
-
## Overview
|
|
14
|
-
|
|
15
|
-
Implement per-agent write isolation on the shared Archil disk. Each agent gets exclusive write ownership of its own subdirectories (`thoughts/$AGENT_ID/`, `memory/$AGENT_ID/`, `downloads/$AGENT_ID/`, `misc/$AGENT_ID/`). All agents can read everything via the `--shared` mount. Write attempts to non-owned directories are intercepted by a PreToolUse hook guardrail (proactive) that warns the agent before the write fails, with a PostToolUse safety net for writes that bypass PreToolUse (e.g., Bash-based writes).
|
|
16
|
-
|
|
17
|
-
## Current State Analysis
|
|
18
|
-
|
|
19
|
-
The shared Archil disk at `/workspace/shared` is mounted with `--shared` on all containers (workers + API). Currently:
|
|
20
|
-
|
|
21
|
-
- `docker-entrypoint.sh:55-58` does `mkdir -p` for `thoughts/shared/{plans,research}` and `memory/` — the **first agent to boot wins ownership**, others silently fail with EPERM
|
|
22
|
-
- `docker-entrypoint.sh:477-486` does `archil checkout` for `thoughts/$AGENT_ID` only — this works correctly
|
|
23
|
-
- `base-prompt.ts:219` tells agents to write shared plans to `thoughts/shared/plans/` — broken for all agents except the first to boot
|
|
24
|
-
- `base-prompt.ts:245` tells agents to write memory to `/workspace/shared/memory/` — same issue
|
|
25
|
-
- `hook.ts:473-474` auto-indexes memory files using `startsWith("/workspace/shared/memory/")` — already matches `memory/$AGENT_ID/foo.md`, no change needed
|
|
26
|
-
|
|
27
|
-
### Key Discoveries:
|
|
28
|
-
- `hook.ts:473-474`: Memory auto-indexing path detection uses `startsWith("/workspace/shared/memory/")` which naturally matches per-agent subdirs — **no hook change needed for indexing**
|
|
29
|
-
- `hook.ts:164`: `isShared` scope detection uses same prefix — **also fine**
|
|
30
|
-
- `inject-learning.ts`, `store-progress.ts`: Write to database only, not filesystem — **not affected**
|
|
31
|
-
- `memory-search` MCP tool: Queries indexed database — **not affected by path changes**
|
|
32
|
-
- `slack-download-file.ts:14`: Hardcoded default `/workspace/shared/downloads/slack/` — needs update
|
|
33
|
-
- Archil `mkdir` on unowned dirs auto-grants ownership to the creator **at the first new parent level** (see Appendix A)
|
|
34
|
-
- Archil `--shared` mounts are always fully readable by all clients
|
|
35
|
-
- **CRITICAL**: `mkdir -p thoughts/agent-1/plans` when `thoughts/` doesn't exist auto-grants delegation on `thoughts/` (the parent), NOT `thoughts/agent-1/`. This blocks all other agents from writing inside `thoughts/`. Fix: pre-create top-level dirs, then agents `mkdir` only their subdirs (grants delegation at the correct subdir level).
|
|
36
|
-
- Write failures on `--shared` mounts produce **"Read-only file system"** errors (not EPERM/EACCES)
|
|
37
|
-
- A single Archil client can hold multiple non-overlapping delegations simultaneously (verified)
|
|
38
|
-
- `archil checkout` requires the target path to already exist (fails with "does not exist" otherwise)
|
|
39
|
-
- Unmounting releases ALL delegations; remounting starts fresh
|
|
40
|
-
|
|
41
|
-
**Note on `misc/`**: This directory is a new addition (not analyzed in the research). It serves as a catch-all for unanticipated agent writes — agents doing ad-hoc work (temp files, scratch data, tool outputs) need somewhere safe to write that doesn't pollute the structured `thoughts/`/`memory/`/`downloads/` hierarchy. Without it, agents would fail on any write that doesn't fit the three predefined categories.
|
|
42
|
-
|
|
43
|
-
## Desired End State
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
/workspace/shared/ # --shared mount, all agents read everything
|
|
47
|
-
├── thoughts/
|
|
48
|
-
│ ├── worker-1/ # Checked out by worker-1 at boot
|
|
49
|
-
│ │ ├── plans/
|
|
50
|
-
│ │ ├── research/
|
|
51
|
-
│ │ └── brainstorms/
|
|
52
|
-
│ ├── worker-2/ # Checked out by worker-2 at boot
|
|
53
|
-
│ │ └── ...
|
|
54
|
-
│ └── lead/ # Checked out by lead at boot
|
|
55
|
-
│ └── ...
|
|
56
|
-
├── memory/
|
|
57
|
-
│ ├── worker-1/ # Checked out by worker-1
|
|
58
|
-
│ ├── worker-2/ # Checked out by worker-2
|
|
59
|
-
│ └── lead/ # Checked out by lead
|
|
60
|
-
├── downloads/
|
|
61
|
-
│ ├── worker-1/slack/ # Checked out by worker-1
|
|
62
|
-
│ └── worker-2/slack/ # Checked out by worker-2
|
|
63
|
-
└── misc/
|
|
64
|
-
├── worker-1/ # Catch-all for unanticipated writes
|
|
65
|
-
└── worker-2/
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Boot flow — two-phase (API pre-creates, workers checkout):
|
|
69
|
-
|
|
70
|
-
**API machine** (boots first — deploy script waits for "started"):
|
|
71
|
-
```
|
|
72
|
-
archil mount --shared {disk} /workspace/shared
|
|
73
|
-
→ mkdir thoughts/ memory/ downloads/ misc/ # creates top-level dirs, gets parent delegations
|
|
74
|
-
→ archil unmount /workspace/shared # releases parent delegations
|
|
75
|
-
→ archil mount --shared {disk} /workspace/shared # remount clean (no delegations)
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Worker/Lead machines** (boot after API):
|
|
79
|
-
```
|
|
80
|
-
archil mount --shared {disk} /workspace/shared # top-level dirs already exist (API created them)
|
|
81
|
-
→ mkdir thoughts/$AGENT_ID # auto-grants delegation on thoughts/$AGENT_ID (NOT thoughts/)
|
|
82
|
-
→ mkdir memory/$AGENT_ID # auto-grants delegation on memory/$AGENT_ID
|
|
83
|
-
→ mkdir downloads/$AGENT_ID # auto-grants delegation on downloads/$AGENT_ID
|
|
84
|
-
→ mkdir misc/$AGENT_ID # auto-grants delegation on misc/$AGENT_ID
|
|
85
|
-
→ archil checkout thoughts/$AGENT_ID # persistent ownership (survives reboots)
|
|
86
|
-
→ archil checkout memory/$AGENT_ID
|
|
87
|
-
→ archil checkout downloads/$AGENT_ID
|
|
88
|
-
→ archil checkout misc/$AGENT_ID
|
|
89
|
-
→ mkdir -p thoughts/$AGENT_ID/{plans,research,brainstorms}
|
|
90
|
-
→ mkdir -p downloads/$AGENT_ID/slack
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Why two phases?** Archil `mkdir` auto-grants delegation at the **first new directory** in the path. If `thoughts/` doesn't exist, `mkdir -p thoughts/agent-1/plans` grants delegation on `thoughts/` (the parent), blocking all other agents. By having the API pre-create top-level dirs and release ownership, workers' `mkdir thoughts/$AGENT_ID` correctly grants delegation at the subdir level only.
|
|
94
|
-
|
|
95
|
-
Agent runtime:
|
|
96
|
-
- Write to own dirs: ✅ (owned via checkout)
|
|
97
|
-
- Read any agent's dirs: ✅ (shared mount)
|
|
98
|
-
- Write to another agent's dir: ❌ "Read-only file system" → hook hints "use your own dir"
|
|
99
|
-
- Write to non-existent top-level: ❌ hook hints "use misc/$AGENT_ID/"
|
|
100
|
-
|
|
101
|
-
## Quick Verification Reference
|
|
102
|
-
|
|
103
|
-
Common commands:
|
|
104
|
-
- `bun run tsc:check` — TypeScript check
|
|
105
|
-
- `bun run lint` — Biome lint
|
|
106
|
-
- Deploy test: push to main → wait for Docker build → `GITHUB_TOKEN=$(gh auth token) bun run scripts/deploy-swarm.ts <app> -y` (from agent-swarm-internal)
|
|
107
|
-
- Check logs: `fly logs -a <app> --no-tail | head -100`
|
|
108
|
-
- Check machines: `fly machines list -a <app>`
|
|
109
|
-
|
|
110
|
-
Key files:
|
|
111
|
-
- `docker-entrypoint.sh` — boot-time checkout
|
|
112
|
-
- `src/prompts/base-prompt.ts` — agent system prompt
|
|
113
|
-
- `src/hooks/hook.ts` — PostToolUse hook (memory indexing + guardrails)
|
|
114
|
-
- `src/tools/slack-download-file.ts` — slack download default path
|
|
115
|
-
- `plugin/pi-skills/work-on-task/SKILL.md` — pi-mono skill paths
|
|
116
|
-
|
|
117
|
-
## What We're NOT Doing
|
|
118
|
-
|
|
119
|
-
- **API-mediated shared writes** — deferred. If we ever need a truly shared writable directory, we'll add an API endpoint for that.
|
|
120
|
-
- **Database discovery layer** — memory-search already provides this. Plan/research discovery is handled by `ls /workspace/shared/thoughts/*/plans/` in prompts.
|
|
121
|
-
- **Data migration** — existing `thoughts/shared/` files remain readable. No move needed.
|
|
122
|
-
- **Deploy script changes** — `deploy-swarm.ts` doesn't need changes (Archil disk names and env vars stay the same).
|
|
123
|
-
- **Orphaned directory cleanup** — if `AGENT_ID` changes (e.g., machine replacement), the old agent's dirs remain on disk. Acceptable tech debt for v1 — dirs are small and readable by all agents. Cleanup can be added later if needed.
|
|
124
|
-
|
|
125
|
-
## Implementation Approach
|
|
126
|
-
|
|
127
|
-
Four phases, each independently deployable and verifiable:
|
|
128
|
-
|
|
129
|
-
1. **Entrypoint**: Two-phase setup — API pre-creates top-level dirs and releases ownership, workers create per-agent subdirs and checkout. Includes retry backoff for boot race safety.
|
|
130
|
-
2. **Prompting**: Update base-prompt.ts to describe the new directory layout. Works with or without Archil.
|
|
131
|
-
3. **Hook guardrails**: Add PreToolUse prevention (primary, proactive) and PostToolUse detection (secondary, safety net) for non-owned write attempts.
|
|
132
|
-
4. **Tool path updates**: Update hardcoded paths in slack download tool and pi-skills.
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## Phase 1: Entrypoint — Two-Phase Directory Setup
|
|
137
|
-
|
|
138
|
-
### Overview
|
|
139
|
-
Implement a two-phase boot sequence: the API machine pre-creates top-level directories and releases ownership, then workers create their per-agent subdirectories and claim ownership via checkout. This avoids the parent-delegation problem where `mkdir -p thoughts/$AGENT_ID/plans` would auto-grant ownership of the entire `thoughts/` directory to the first agent to boot, blocking all others (see Appendix A for the test that discovered this).
|
|
140
|
-
|
|
141
|
-
### Changes Required:
|
|
142
|
-
|
|
143
|
-
#### 1. API entrypoint — pre-create top-level dirs
|
|
144
|
-
**File**: `docker-entrypoint.sh`
|
|
145
|
-
**Location**: After the `archil mount --shared` call for the shared disk, add a block for the API role:
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
# --- API: Pre-create top-level shared directories ---
|
|
149
|
-
# The API boots first (deploy script waits for "started" state).
|
|
150
|
-
# We create the top-level category dirs so that workers' mkdir
|
|
151
|
-
# auto-grants delegation at the subdir level (not the parent).
|
|
152
|
-
# Then we unmount/remount to release the parent delegations.
|
|
153
|
-
if [ "$AGENT_ROLE" = "api" ] && [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
154
|
-
echo "Pre-creating shared directory structure..."
|
|
155
|
-
for category in thoughts memory downloads misc; do
|
|
156
|
-
mkdir -p "/workspace/shared/$category" 2>/dev/null || true
|
|
157
|
-
done
|
|
158
|
-
# Release parent delegations (mkdir auto-granted them)
|
|
159
|
-
sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil unmount /workspace/shared 2>/dev/null || true
|
|
160
|
-
sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil mount --shared \
|
|
161
|
-
--region "$ARCHIL_REGION" "$ARCHIL_SHARED_DISK_NAME" /workspace/shared
|
|
162
|
-
echo "Shared directory structure ready (delegations released)"
|
|
163
|
-
fi
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
#### 2. Worker/Lead entrypoint — per-agent checkout
|
|
167
|
-
**File**: `docker-entrypoint.sh`
|
|
168
|
-
**Location**: Remove the broken shared mkdir block (currently around lines 55-58). Replace the per-agent checkout block (currently around lines 477-486).
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
if [ -n "$AGENT_ID" ]; then
|
|
172
|
-
AGENT_SHARED="/workspace/shared"
|
|
173
|
-
|
|
174
|
-
echo "Setting up per-agent directories for $AGENT_ID..."
|
|
175
|
-
|
|
176
|
-
# The shared disk is already mounted via `archil mount --shared`.
|
|
177
|
-
# Read access to ALL directories (including other agents') is automatic.
|
|
178
|
-
# Here we claim WRITE ownership of this agent's own subdirectories only.
|
|
179
|
-
#
|
|
180
|
-
# IMPORTANT: Top-level dirs (thoughts/, memory/, downloads/, misc/) are
|
|
181
|
-
# pre-created by the API machine at boot. This ensures our mkdir below
|
|
182
|
-
# auto-grants delegation at the SUBDIR level (e.g., thoughts/$AGENT_ID),
|
|
183
|
-
# not the parent level (thoughts/). See Appendix A in the plan for details.
|
|
184
|
-
|
|
185
|
-
for category in "thoughts" "memory" "downloads" "misc"; do
|
|
186
|
-
AGENT_DIR="$AGENT_SHARED/$category/$AGENT_ID"
|
|
187
|
-
|
|
188
|
-
# Create our subdir (auto-grants delegation on $AGENT_ID level)
|
|
189
|
-
mkdir -p "$AGENT_DIR" 2>/dev/null || true
|
|
190
|
-
|
|
191
|
-
# Checkout for persistent ownership (survives reboots where dir already exists)
|
|
192
|
-
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
193
|
-
sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil checkout "$AGENT_DIR" 2>/dev/null || true
|
|
194
|
-
fi
|
|
195
|
-
done
|
|
196
|
-
|
|
197
|
-
# Create standard subdirectories (within owned dirs, always succeeds)
|
|
198
|
-
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/plans"
|
|
199
|
-
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/research"
|
|
200
|
-
mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/brainstorms"
|
|
201
|
-
mkdir -p "$AGENT_SHARED/downloads/$AGENT_ID/slack"
|
|
202
|
-
|
|
203
|
-
echo "Per-agent directories ready for $AGENT_ID"
|
|
204
|
-
fi
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
#### 3. Worker entrypoint — retry with backoff (safety net)
|
|
208
|
-
**File**: `docker-entrypoint.sh`
|
|
209
|
-
**Location**: Wrap the mkdir/checkout loop above in a retry mechanism in case workers boot before the API finishes pre-creating dirs:
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
# Safety net: if top-level dirs don't exist yet (API still booting),
|
|
213
|
-
# retry a few times with backoff
|
|
214
|
-
if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
|
|
215
|
-
for attempt in 1 2 3; do
|
|
216
|
-
if [ -d "$AGENT_SHARED/thoughts" ]; then
|
|
217
|
-
break
|
|
218
|
-
fi
|
|
219
|
-
echo "Waiting for shared directory structure (attempt $attempt/3)..."
|
|
220
|
-
sleep 3
|
|
221
|
-
done
|
|
222
|
-
fi
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Success Criteria:
|
|
226
|
-
|
|
227
|
-
#### Automated Verification:
|
|
228
|
-
- [x] Entrypoint runs without errors: `fly logs -a <app> --no-tail | grep -E "(Pre-creating|Per-agent directories ready|Error)"`
|
|
229
|
-
- [x] All machines start successfully: `fly machines list -a <app>` shows all `started`
|
|
230
|
-
- [x] Agent can write to own dir: SSH in and `echo test > /workspace/shared/thoughts/$AGENT_ID/test.txt`
|
|
231
|
-
- [x] Agent can read other's dir: SSH in as agent-1 and `cat /workspace/shared/thoughts/agent-2/test.txt`
|
|
232
|
-
|
|
233
|
-
#### Manual Verification:
|
|
234
|
-
- [x] Deploy to test swarm and confirm all workers + lead boot cleanly
|
|
235
|
-
- [x] **DELEGATION CHECK**: `archil delegations /workspace/shared` on each worker shows 4 delegations at the subdir level (e.g., `thoughts/agent-1`, NOT `thoughts/`)
|
|
236
|
-
- [x] **CROSS-AGENT WRITE BLOCKED**: SSH into worker-1, try `echo test > /workspace/shared/thoughts/agent-2/test.txt` — verify "Read-only file system" error
|
|
237
|
-
- [x] **CROSS-AGENT READ WORKS**: SSH into worker-1, `cat /workspace/shared/thoughts/agent-2/test.txt` — verify content is readable
|
|
238
|
-
- [x] **READ PROPAGATION TEST**: Worker-1 writes a file, worker-2 reads it immediately — note any delay
|
|
239
|
-
- [x] Verify existing `thoughts/shared/` directory (if present) is still readable
|
|
240
|
-
|
|
241
|
-
**Implementation Note**: The error pattern for non-owned writes is confirmed: **"Read-only file system"** (not EPERM/EACCES). This will be used in Phase 3. Pause for confirmation before proceeding.
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## Phase 2: Prompting — Directory Layout Convention
|
|
246
|
-
|
|
247
|
-
### Overview
|
|
248
|
-
Update `base-prompt.ts` to describe the per-agent directory convention. This works as good hygiene even without Archil — agents are guided to write to organized per-agent directories. With Archil, the guardrail (Phase 3) enforces it.
|
|
249
|
-
|
|
250
|
-
### Changes Required:
|
|
251
|
-
|
|
252
|
-
#### 1. Workspace directory layout in system prompt
|
|
253
|
-
**File**: `src/prompts/base-prompt.ts`
|
|
254
|
-
**Changes** (around lines 215-250):
|
|
255
|
-
|
|
256
|
-
Update the workspace directory structure description to describe the per-agent layout:
|
|
257
|
-
- Personal workspace (`/workspace/personal/`) — unchanged
|
|
258
|
-
- Shared workspace (`/workspace/shared/`) — each agent writes to `{category}/{yourId}/`, reads everything
|
|
259
|
-
- List the write directories: thoughts, memory, downloads, misc
|
|
260
|
-
- Show how to discover other agents' work: `ls /workspace/shared/thoughts/*/plans/`, `memory-search`
|
|
261
|
-
- Add clear warning: "Do NOT write to another agent's directory"
|
|
262
|
-
|
|
263
|
-
#### 2. Remove references to `thoughts/shared/`
|
|
264
|
-
**File**: `src/prompts/base-prompt.ts`
|
|
265
|
-
**Changes**: Find and update all references to `thoughts/shared/plans/` and `thoughts/shared/research/` to use `thoughts/{agentId}/plans/` and `thoughts/{agentId}/research/` instead.
|
|
266
|
-
|
|
267
|
-
#### 3. Update memory write path guidance
|
|
268
|
-
**File**: `src/prompts/base-prompt.ts`
|
|
269
|
-
**Changes** (around line 245): Change memory write path from `/workspace/shared/memory/` to `/workspace/shared/memory/{agentId}/`.
|
|
270
|
-
|
|
271
|
-
### Success Criteria:
|
|
272
|
-
|
|
273
|
-
#### Automated Verification:
|
|
274
|
-
- [x] TypeScript check passes: `bun run tsc:check`
|
|
275
|
-
- [x] Lint passes: `bun run lint`
|
|
276
|
-
- [x] No remaining references to `thoughts/shared/plans` or `thoughts/shared/research` as write targets: `grep -rn "thoughts/shared" src/prompts/`
|
|
277
|
-
|
|
278
|
-
#### Manual Verification:
|
|
279
|
-
- [x] Read the generated prompt for a test agent and confirm the workspace layout section is clear and correct
|
|
280
|
-
- [x] Verify agent ID substitution works correctly in the prompt
|
|
281
|
-
|
|
282
|
-
**Implementation Note**: This phase doesn't require a deploy to verify. TypeScript + lint is sufficient. Proceed to Phase 3 after confirmation.
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## Phase 3: Hook Guardrails — Write Failure Detection
|
|
287
|
-
|
|
288
|
-
### Overview
|
|
289
|
-
Add PreToolUse write prevention (primary, proactive) and PostToolUse error detection (secondary, safety net) in `hook.ts` and `pi-mono-extension.ts`. The error pattern for non-owned writes is **"Read-only file system"** (confirmed in Appendix A testing).
|
|
290
|
-
|
|
291
|
-
### Changes Required:
|
|
292
|
-
|
|
293
|
-
#### 1. Path ownership check helper
|
|
294
|
-
**Files**: `src/hooks/hook.ts` and `src/providers/pi-mono-extension.ts`
|
|
295
|
-
**Changes**: Add a shared helper function (or duplicate in both files):
|
|
296
|
-
```ts
|
|
297
|
-
function isOwnedSharedPath(path: string, agentId: string): boolean {
|
|
298
|
-
const sharedCategories = ["thoughts", "memory", "downloads", "misc"];
|
|
299
|
-
return sharedCategories.some(cat =>
|
|
300
|
-
path.startsWith(`/workspace/shared/${cat}/${agentId}/`)
|
|
301
|
-
);
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
#### 2. PreToolUse prevention (primary — proactive)
|
|
306
|
-
**Files**: `src/hooks/hook.ts` (PreToolUse handler) and `src/providers/pi-mono-extension.ts` (`tool_call` handler)
|
|
307
|
-
**Changes**: Before a Write/Edit tool executes, check if:
|
|
308
|
-
1. `ARCHIL_MOUNT_TOKEN` is set (skip in local dev — all paths are writable)
|
|
309
|
-
2. The target path is under `/workspace/shared/` but NOT under the agent's own subdirectory
|
|
310
|
-
|
|
311
|
-
If both conditions are true, return a **non-blocking warning** hint:
|
|
312
|
-
```
|
|
313
|
-
⚠️ This write will fail: You don't have write access to this directory.
|
|
314
|
-
|
|
315
|
-
On shared workspaces, each agent can only write to their own directories:
|
|
316
|
-
- /workspace/shared/thoughts/{yourId}/
|
|
317
|
-
- /workspace/shared/memory/{yourId}/
|
|
318
|
-
- /workspace/shared/downloads/{yourId}/
|
|
319
|
-
- /workspace/shared/misc/{yourId}/
|
|
320
|
-
|
|
321
|
-
You CAN read any file on the shared disk. For writes, use your own subdirectory.
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
This prevents wasted tool calls by warning the agent before the write fails.
|
|
325
|
-
|
|
326
|
-
#### 3. PostToolUse detection (secondary — safety net)
|
|
327
|
-
**Files**: `src/hooks/hook.ts` (PostToolUse handler) and `src/providers/pi-mono-extension.ts` (`tool_result` handler)
|
|
328
|
-
**Changes**: After a Write/Edit tool call, check if:
|
|
329
|
-
1. The tool result indicates an error (exact pattern from Phase 1 error discovery)
|
|
330
|
-
2. The target path is under `/workspace/shared/` but NOT owned by this agent
|
|
331
|
-
|
|
332
|
-
If both conditions are true, return the same hint as above. This catches cases where the PreToolUse check didn't fire (e.g., Bash-based writes, MCP tools).
|
|
333
|
-
|
|
334
|
-
### Success Criteria:
|
|
335
|
-
|
|
336
|
-
#### Automated Verification:
|
|
337
|
-
- [x] TypeScript check passes: `bun run tsc:check`
|
|
338
|
-
- [x] Lint passes: `bun run lint`
|
|
339
|
-
- [x] Hook correctly identifies owned paths: test `isOwnedSharedPath("/workspace/shared/memory/agent-1/foo.md", "agent-1")` → true
|
|
340
|
-
- [x] Hook correctly identifies non-owned paths: test `isOwnedSharedPath("/workspace/shared/memory/agent-2/foo.md", "agent-1")` → false
|
|
341
|
-
- [x] Both `hook.ts` and `pi-mono-extension.ts` contain the guardrail logic
|
|
342
|
-
|
|
343
|
-
#### Manual Verification:
|
|
344
|
-
- [x] Deploy and have an agent attempt to write to another agent's directory — verify the PreToolUse hint appears before the write
|
|
345
|
-
- [x] Verify writes to own directory still work without any hook interference
|
|
346
|
-
- [x] Verify the hint message is clear and actionable
|
|
347
|
-
- [x] Test with pi-mono harness (if available) to confirm parity
|
|
348
|
-
|
|
349
|
-
**Implementation Note**: PreToolUse is the primary guardrail (proactive). PostToolUse is the safety net (reactive). Both must be implemented in both `hook.ts` and `pi-mono-extension.ts`.
|
|
350
|
-
|
|
351
|
-
---
|
|
352
|
-
|
|
353
|
-
## Phase 4: Tool Path Updates
|
|
354
|
-
|
|
355
|
-
### Overview
|
|
356
|
-
Update hardcoded default paths in tools that write to the shared disk, so they use per-agent subdirectories by default.
|
|
357
|
-
|
|
358
|
-
### Changes Required:
|
|
359
|
-
|
|
360
|
-
#### 1. Slack download file tool
|
|
361
|
-
**File**: `src/tools/slack-download-file.ts`
|
|
362
|
-
**Changes** (around line 14): Update the default download directory to include agent ID:
|
|
363
|
-
```ts
|
|
364
|
-
const DEFAULT_DOWNLOAD_DIR = `/workspace/shared/downloads/${process.env.AGENT_ID || "default"}/slack`;
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
#### 2. Slack files utility
|
|
368
|
-
**File**: `src/slack/files.ts`
|
|
369
|
-
**Changes** (around line 14): Same pattern — update default path to include `$AGENT_ID`.
|
|
370
|
-
|
|
371
|
-
#### 3. Pi-mono work-on-task skill
|
|
372
|
-
**File**: `plugin/pi-skills/work-on-task/SKILL.md`
|
|
373
|
-
**Changes** (around line 27): Update path from `thoughts/shared/plans/` to `thoughts/{agentId}/plans/`.
|
|
374
|
-
|
|
375
|
-
#### 4. Plugin commands
|
|
376
|
-
**File**: `plugin/commands/work-on-task.md`
|
|
377
|
-
**Changes** (around line 68): Update `shared/memory/` reference to `memory/{agentId}/` (this line references the memory path, not thoughts).
|
|
378
|
-
|
|
379
|
-
#### 5. Plugin build script
|
|
380
|
-
**File**: `plugin/build-pi-skills.ts`
|
|
381
|
-
**Changes** (around line 76): Update `thoughts/shared/plans/` reference.
|
|
382
|
-
|
|
383
|
-
#### 6. Agent templates
|
|
384
|
-
**Files**:
|
|
385
|
-
- `templates/official/researcher/CLAUDE.md` (line 33)
|
|
386
|
-
- `templates/official/tester/CLAUDE.md` (line 36)
|
|
387
|
-
- `templates/official/forward-deployed-engineer/CLAUDE.md` (line 36)
|
|
388
|
-
**Changes**: Update shared path references to use per-agent convention.
|
|
389
|
-
|
|
390
|
-
#### 7. Documentation
|
|
391
|
-
**Files**:
|
|
392
|
-
- `docs-site/content/docs/architecture/memory.mdx` (lines 20, 28)
|
|
393
|
-
- `docs-site/content/docs/architecture/agents.mdx` (line 78)
|
|
394
|
-
- `docs-site/content/docs/guides/slack-integration.mdx` (line 89)
|
|
395
|
-
- `docs-site/content/docs/reference/mcp-tools.mdx` (line 213)
|
|
396
|
-
- `MCP.md` (line 272)
|
|
397
|
-
- `README.md` (line 148)
|
|
398
|
-
**Changes**: Update shared path references in documentation.
|
|
399
|
-
|
|
400
|
-
#### 8. Database prompt text
|
|
401
|
-
**File**: `src/be/db.ts`
|
|
402
|
-
**Changes** (around line 2144): Update prompt text referencing shared memory path.
|
|
403
|
-
|
|
404
|
-
#### 9. Remaining hardcoded shared paths
|
|
405
|
-
**Files**: Final grep sweep for any remaining hardcoded references to shared write paths.
|
|
406
|
-
|
|
407
|
-
### Success Criteria:
|
|
408
|
-
|
|
409
|
-
#### Automated Verification:
|
|
410
|
-
- [x] TypeScript check passes: `bun run tsc:check`
|
|
411
|
-
- [x] Lint passes: `bun run lint`
|
|
412
|
-
- [x] No remaining hardcoded shared write paths: `grep -rn "/workspace/shared/downloads/slack" src/ plugin/ templates/ docs-site/ README.md MCP.md` returns nothing
|
|
413
|
-
- [x] No remaining `thoughts/shared` write targets: `grep -rn "thoughts/shared" src/ plugin/ templates/ docs-site/ README.md MCP.md | grep -v "read\|Read\|cat \|ls "` returns nothing
|
|
414
|
-
|
|
415
|
-
#### Manual Verification:
|
|
416
|
-
- [x] Deploy and test Slack file download — verify file lands in `downloads/$AGENT_ID/slack/`
|
|
417
|
-
- [x] Test a pi-mono agent's plan creation — verify plan goes to `thoughts/$AGENT_ID/plans/`
|
|
418
|
-
|
|
419
|
-
**Implementation Note**: After completing this phase, do a full E2E deploy and verify all write operations land in the correct per-agent directories.
|
|
420
|
-
|
|
421
|
-
---
|
|
422
|
-
|
|
423
|
-
## Testing Strategy
|
|
424
|
-
|
|
425
|
-
### Automated
|
|
426
|
-
- `bun run tsc:check` — type safety
|
|
427
|
-
- `bun run lint` — code quality
|
|
428
|
-
- `grep` searches for leftover hardcoded paths
|
|
429
|
-
|
|
430
|
-
### Manual E2E (on live swarm)
|
|
431
|
-
After all phases:
|
|
432
|
-
1. Deploy fresh with `GITHUB_TOKEN=$(gh auth token) bun run scripts/deploy-swarm.ts <app> -y`
|
|
433
|
-
2. `fly logs -a <app> --no-tail | grep "Per-agent directories"` — verify all agents checkout OK
|
|
434
|
-
3. `fly machines list -a <app>` — all machines started
|
|
435
|
-
4. Via MCP or SSH, have an agent:
|
|
436
|
-
- Write a plan → verify lands in `thoughts/$AGENT_ID/plans/`
|
|
437
|
-
- Write a memory file → verify lands in `memory/$AGENT_ID/` and is auto-indexed
|
|
438
|
-
- Download a Slack file → verify lands in `downloads/$AGENT_ID/slack/`
|
|
439
|
-
- Read another agent's plan → verify succeeds
|
|
440
|
-
- Attempt to write to another agent's dir → verify hook guardrail fires
|
|
441
|
-
5. Check `archil delegations /workspace/shared` shows correct per-agent checkouts
|
|
442
|
-
|
|
443
|
-
## References
|
|
444
|
-
- Research: `thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md`
|
|
445
|
-
- Archil shared disk docs: https://docs.archil.com/concepts/shared-disks
|
|
446
|
-
- Current entrypoint: `docker-entrypoint.sh`
|
|
447
|
-
- Current prompts: `src/prompts/base-prompt.ts`
|
|
448
|
-
- Current hooks: `src/hooks/hook.ts`
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## Appendix A: Live Archil Checkout Testing
|
|
453
|
-
|
|
454
|
-
_Tested 2026-03-11 on `swarm-test-archil` (Fly.io, AMS region). Two worker machines (`test-agent-1`, `test-agent-2`) with a shared Archil disk._
|
|
455
|
-
|
|
456
|
-
### Test environment
|
|
457
|
-
```
|
|
458
|
-
App: swarm-test-archil (deploys/test in agent-swarm-internal)
|
|
459
|
-
Workers: 7810621a9e29e8 (test-agent-1), 683435ef716518 (test-agent-2)
|
|
460
|
-
Shared disk: dsk-00000000000069cb
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
### Test 1: Multiple checkouts per client ✅
|
|
464
|
-
Worker-2 successfully held 6+ delegations simultaneously:
|
|
465
|
-
```bash
|
|
466
|
-
# On worker-2 after mkdir + checkout:
|
|
467
|
-
archil delegations /workspace/shared
|
|
468
|
-
# Result:
|
|
469
|
-
# /workspace/shared/thoughts (Active)
|
|
470
|
-
# /workspace/shared/memory (Active)
|
|
471
|
-
# /workspace/shared/thoughts/test-agent-2 (Active)
|
|
472
|
-
# /workspace/shared/misc (Active)
|
|
473
|
-
# /workspace/shared/memory/test-agent-2 (Active)
|
|
474
|
-
# /workspace/shared/downloads (Active)
|
|
475
|
-
```
|
|
476
|
-
**Conclusion**: A single Archil client CAN hold multiple non-overlapping delegations.
|
|
477
|
-
|
|
478
|
-
### Test 2: Parent delegation problem ❌ (discovered)
|
|
479
|
-
Worker-2 ran `mkdir -p /workspace/shared/thoughts/test-agent-2/plans` (first agent to create `thoughts/`):
|
|
480
|
-
```bash
|
|
481
|
-
archil delegations /workspace/shared
|
|
482
|
-
# Result: /workspace/shared/thoughts (Active) ← owns ALL of thoughts/!
|
|
483
|
-
```
|
|
484
|
-
Worker-1 then tried to create its subdir:
|
|
485
|
-
```bash
|
|
486
|
-
mkdir -p /workspace/shared/thoughts/test-agent-1/plans
|
|
487
|
-
# Result: mkdir: cannot create directory '/workspace/shared/thoughts/test-agent-1': Read-only file system
|
|
488
|
-
```
|
|
489
|
-
**Root cause**: `mkdir -p` auto-grants delegation at the **first new parent directory**. Since `thoughts/` didn't exist, worker-2 got delegation on `thoughts/` (not `thoughts/test-agent-2/`), blocking all other agents.
|
|
490
|
-
|
|
491
|
-
### Test 3: Cross-agent reads ✅
|
|
492
|
-
Worker-1 successfully read worker-2's file:
|
|
493
|
-
```bash
|
|
494
|
-
# On worker-1:
|
|
495
|
-
cat /workspace/shared/thoughts/test-agent-2/plans/test.txt
|
|
496
|
-
# Result: hello from agent-2
|
|
497
|
-
```
|
|
498
|
-
|
|
499
|
-
### Test 4: Cross-agent writes blocked ✅
|
|
500
|
-
Worker-1 correctly blocked from writing to worker-2's dir:
|
|
501
|
-
```bash
|
|
502
|
-
echo "intruder" > /workspace/shared/thoughts/test-agent-2/plans/hack.txt
|
|
503
|
-
# Result: bash: /workspace/shared/thoughts/test-agent-2/plans/hack.txt: Read-only file system
|
|
504
|
-
```
|
|
505
|
-
**Error pattern confirmed: "Read-only file system"** (not EPERM or EACCES).
|
|
506
|
-
|
|
507
|
-
### Test 5: Unmount/remount/checkout fix ✅
|
|
508
|
-
Worker-2 unmounted, remounted, then checked out only its subdir:
|
|
509
|
-
```bash
|
|
510
|
-
archil unmount /workspace/shared
|
|
511
|
-
archil mount --shared --region aws-eu-west-1 $ARCHIL_SHARED_DISK_NAME /workspace/shared
|
|
512
|
-
archil checkout /workspace/shared/thoughts/test-agent-2
|
|
513
|
-
archil checkout /workspace/shared/memory/test-agent-2
|
|
514
|
-
|
|
515
|
-
archil delegations /workspace/shared
|
|
516
|
-
# Result:
|
|
517
|
-
# /workspace/shared/thoughts/test-agent-2 (Active) ← correct! subdir only
|
|
518
|
-
# /workspace/shared/memory/test-agent-2 (Active)
|
|
519
|
-
```
|
|
520
|
-
**Conclusion**: Unmounting releases ALL delegations. Checkout on existing subdirs grants delegation at the correct level.
|
|
521
|
-
|
|
522
|
-
### Test 6: Worker-1 mkdir after parent delegation released ✅
|
|
523
|
-
With worker-2 no longer owning `thoughts/` (only `thoughts/test-agent-2`), worker-1 successfully created its subdir:
|
|
524
|
-
```bash
|
|
525
|
-
# On worker-1 (after unmount/remount):
|
|
526
|
-
mkdir -p /workspace/shared/thoughts/test-agent-1/plans
|
|
527
|
-
# Result: exit 0 (success!)
|
|
528
|
-
|
|
529
|
-
echo "hello from agent-1" > /workspace/shared/thoughts/test-agent-1/plans/my-plan.txt
|
|
530
|
-
# Result: exit 0 (success!)
|
|
531
|
-
|
|
532
|
-
archil checkout /workspace/shared/thoughts/test-agent-1
|
|
533
|
-
# Result: exit 0
|
|
534
|
-
|
|
535
|
-
archil delegations /workspace/shared
|
|
536
|
-
# Result: /workspace/shared/thoughts/test-agent-1 (Active) ← correct!
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
### Test 7: archil checkout requires existing path ❌
|
|
540
|
-
```bash
|
|
541
|
-
archil checkout /workspace/shared/thoughts/test-agent-2
|
|
542
|
-
# Before dir exists: 'checkout' operation failed because path does not exist
|
|
543
|
-
# After mkdir: exit 0 (success)
|
|
544
|
-
```
|
|
545
|
-
**Conclusion**: `archil checkout` cannot create directories. Path must exist first.
|
|
546
|
-
|
|
547
|
-
### Summary of findings
|
|
548
|
-
|
|
549
|
-
| Behavior | Result |
|
|
550
|
-
|----------|--------|
|
|
551
|
-
| Multiple checkouts per client | ✅ Works (6+ simultaneous) |
|
|
552
|
-
| Cross-agent reads | ✅ Works perfectly |
|
|
553
|
-
| Cross-agent write blocking | ✅ "Read-only file system" |
|
|
554
|
-
| `mkdir` delegation level | ⚠️ First NEW parent level |
|
|
555
|
-
| `checkout` on non-existent path | ❌ Fails |
|
|
556
|
-
| Unmount releases all delegations | ✅ Works |
|
|
557
|
-
| Unmount/remount/checkout narrows delegation | ✅ Works |
|
|
558
|
-
| Concurrent subdir ownership | ✅ Works (when parent unowned) |
|
|
559
|
-
|
|
560
|
-
**Key insight**: The API must pre-create top-level dirs and release ownership before workers boot. This ensures workers' `mkdir thoughts/$AGENT_ID` grants delegation at the subdir level (correct) instead of the parent level (broken).
|
|
561
|
-
|
|
562
|
-
---
|
|
563
|
-
|
|
564
|
-
## Review Errata
|
|
565
|
-
|
|
566
|
-
_Reviewed: 2026-03-11 by Claude_
|
|
567
|
-
|
|
568
|
-
### Critical
|
|
569
|
-
|
|
570
|
-
_(none remaining)_
|
|
571
|
-
|
|
572
|
-
### Important
|
|
573
|
-
|
|
574
|
-
_(none remaining)_
|
|
575
|
-
|
|
576
|
-
### Resolved
|
|
577
|
-
|
|
578
|
-
- [x] Missing `brainstorms/` subdirectory — added to both Archil and non-Archil blocks, desired end state, and boot flow
|
|
579
|
-
- [x] Read-only access to other agents' dirs — clarified in entrypoint comment that `--shared` mounts provide automatic read access
|
|
580
|
-
- [x] `ARCHIL_MOUNT_TOKEN` availability in hooks — confirmed: hooks run as subprocesses in the same container, env vars are inherited
|
|
581
|
-
- [x] Line references verified — `hook.ts` lines corrected (473→860-864, 164→870)
|
|
582
|
-
- [x] Phase 3 missing `pi-mono-extension.ts` — added to all Phase 3 change items
|
|
583
|
-
- [x] Phase 1 checkout-vs-mkdir ambiguity — switched to `mkdir` first (auto-grants ownership), `checkout` as fallback
|
|
584
|
-
- [x] Phase 4 grep sweep — expanded to include `templates/`, `docs-site/`, `README.md`, `MCP.md`
|
|
585
|
-
- [x] Phase 3 PreToolUse vs PostToolUse — PreToolUse is now primary (proactive), PostToolUse is safety net
|
|
586
|
-
- [x] Rollback notes — skipped per Taras: whole thing is a no-op in non-Archil case
|
|
587
|
-
- [x] Overview said "PostToolUse hook guardrail" as primary — updated to describe PreToolUse as primary, PostToolUse as safety net (bot review #4)
|
|
588
|
-
- [x] `misc/` directory not in research — added justification note in Current State Analysis (bot review #1)
|
|
589
|
-
- [x] Phase 4 item 4 (`work-on-task.md:68`) had wrong change description — corrected: references `shared/memory/`, not `thoughts/shared/` (bot review #2, #5)
|
|
590
|
-
- [x] Research open questions #2 (multiple checkouts) and #3 (read propagation delay) — added explicit validation steps to Phase 1 manual verification (bot review #3)
|
|
591
|
-
- [x] Research open question #4 (AGENT_ID stability) — added orphaned directory note to "What We're NOT Doing" as explicit tech debt (bot review #3)
|
|
592
|
-
- [x] **Parent delegation problem discovered via live testing** — `mkdir -p thoughts/$AGENT_ID/plans` auto-grants delegation on `thoughts/` (the parent), not `thoughts/$AGENT_ID`. Fix: two-phase boot — API pre-creates top-level dirs, workers create subdirs. See Appendix A.
|
|
593
|
-
- [x] **Error pattern confirmed** — non-owned writes produce "Read-only file system" (not EPERM/EACCES). Phase 3 updated.
|
|
594
|
-
- [x] **Research open questions #2 and #3 answered** — multiple checkouts per client: ✅ works. Read propagation: needs live test but reads confirmed working cross-agent.
|
|
595
|
-
|
|
596
|
-
---
|
|
597
|
-
|
|
598
|
-
## Local Test Results (2026-03-11)
|
|
599
|
-
|
|
600
|
-
_Tested locally with Docker images `agent-swarm-api:1.41.0` and `agent-swarm-worker:1.41.0`._
|
|
601
|
-
|
|
602
|
-
1. **Single worker directory creation** — worker-alpha gets the exact expected structure:
|
|
603
|
-
`shared/thoughts/worker-alpha/{plans,research,brainstorms}`, `shared/memory/worker-alpha/`,
|
|
604
|
-
`shared/downloads/worker-alpha/slack/`, `shared/misc/worker-alpha/`
|
|
605
|
-
|
|
606
|
-
2. **Multi-agent isolation** — worker-alpha and worker-beta on the same shared volume create
|
|
607
|
-
completely separate subdirectory trees with no overlap.
|
|
608
|
-
|
|
609
|
-
3. **API role behavior** — Correctly skips shared dir pre-creation when `ARCHIL_MOUNT_TOKEN` is
|
|
610
|
-
absent (local dev path). Only pre-creates top-level dirs when Archil is active.
|
|
611
|
-
|
|
612
|
-
4. **`isOwnedSharedPath()` logic** — 9/9 test cases pass:
|
|
613
|
-
- Owned paths (own agent's files) → true
|
|
614
|
-
- Other agent's paths → false
|
|
615
|
-
- Paths without category prefix → false
|
|
616
|
-
- Directory itself without trailing slash → false (correct — agents write files, not dirs)
|
|
617
|
-
|
|
618
|
-
5. **Hook integration** — PreToolUse warns on Write/Edit to non-owned shared paths. PostToolUse
|
|
619
|
-
catches "Read-only file system" as safety net. Both gated on `ARCHIL_MOUNT_TOKEN` (inactive locally).
|
|
620
|
-
|
|
621
|
-
**Remaining**: Live Archil delegation test needs a Fly.io deploy to validate two-phase boot + cross-agent write blocking on actual Archil shared disk.
|