@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,803 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-02-20T02:30:00Z
|
|
3
|
-
planner: Claude
|
|
4
|
-
branch: claw-auto-improvement
|
|
5
|
-
repository: agent-swarm
|
|
6
|
-
topic: "Auto-Improvement / Setup Scripts — Gap 5 Implementation"
|
|
7
|
-
tags: [plan, auto-improvement, setup-script, gap-5, agent-native]
|
|
8
|
-
status: completed
|
|
9
|
-
autonomy: autopilot
|
|
10
|
-
research: thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Auto-Improvement / Setup Scripts — Implementation Plan
|
|
14
|
-
|
|
15
|
-
## Overview
|
|
16
|
-
|
|
17
|
-
Add persistent, self-evolving setup scripts and environment-specific operational knowledge for agents. Today, agents start every container with the same environment — no way to accumulate tool installations, config tweaks, or workflow improvements across sessions. This plan adds:
|
|
18
|
-
|
|
19
|
-
1. A `setupScript TEXT` column on `agents` for per-agent setup scripts
|
|
20
|
-
2. A `toolsMd TEXT` column on `agents` for environment-specific operational knowledge (TOOLS.md)
|
|
21
|
-
3. A global setup script via the existing `swarm_config` table (key `SETUP_SCRIPT`, scope `global`)
|
|
22
|
-
4. Docker entrypoint logic to fetch, compose (global + agent), and prepend to any mounted `/workspace/start-up.*`
|
|
23
|
-
5. File lifecycle: runner writes setup script + TOOLS.md before spawn, Stop hook syncs edits back to DB
|
|
24
|
-
6. Self-improvement directives in SOUL.md template and base prompt, plus a `generateDefaultToolsMd()` template
|
|
25
|
-
|
|
26
|
-
This is Gap 5 / Phase 6 from the swarm-gaps research (`thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md`).
|
|
27
|
-
|
|
28
|
-
**Prerequisites**: Gap 6 (Env Management) ✅, Gap 1 (Worker Identity) ✅ — both merged.
|
|
29
|
-
|
|
30
|
-
## Current State Analysis
|
|
31
|
-
|
|
32
|
-
**What exists today:**
|
|
33
|
-
- **Docker entrypoint startup script mechanism** (`docker-entrypoint.sh:229-326`): Discovers `/workspace/start-up.*` files in priority order (`.sh`, `.bash`, `.js`, `.ts`, `.bun`, no ext). Detects interpreter via shebang or extension. `STARTUP_SCRIPT_STRICT=true` by default (container exits on failure). Runs after config fetch + GitHub auth + marketplace install, before workspace dirs + agent binary.
|
|
34
|
-
- **No `setupScript` or `toolsMd` columns** on the `agents` table — confirmed. Only `claudeMd`, `soulMd`, `identityMd` exist.
|
|
35
|
-
- **`swarm_config` table** exists with `global`/`agent`/`repo` scoping (Gap 6, merged). Can store a global setup script as a well-known config key.
|
|
36
|
-
- **Identity file lifecycle** is the pattern to follow: runner writes files before spawn (`runner.ts:1602-1621`), Stop hook syncs back to DB (`hook.ts:666-695`), PostToolUse hook syncs on edit (`hook.ts:537-553`).
|
|
37
|
-
- **`update-profile` MCP tool** (`src/tools/update-profile.ts`) accepts `claudeMd`, `soulMd`, `identityMd` but not `setupScript` or `toolsMd`.
|
|
38
|
-
- **`updateAgentProfile()` DB function** (`db.ts:2319-2370`) uses `COALESCE(?, column)` pattern — easy to extend for both new fields.
|
|
39
|
-
- **`fetchResolvedEnv()`** (`runner.ts:100-137`) already fetches config from API before each spawn — env vars from swarm_config are available.
|
|
40
|
-
- **SOUL.md template** (`db.ts:2240-2278`) has a `## Self-Evolution` section saying "refine your soul", but no mention of setup scripts or environment improvement.
|
|
41
|
-
- **Base prompt filesystem section** (`base-prompt.ts:204-218`) mentions `/workspace/personal` for persistence and suggests `memory.txt`/`memory.db`, but says nothing about setup scripts.
|
|
42
|
-
- **No post-task reflection**: `checkCompletedProcesses()` (`runner.ts:1365-1392`) only removes from `activeTasks` and calls `ensureTaskFinished()` — no learning extraction.
|
|
43
|
-
|
|
44
|
-
### Key Discoveries:
|
|
45
|
-
- The entrypoint's startup script discovery is first-match: if we write `start-up.sh` and an operator also mounts `start-up.ts`, only `.sh` is found. We must detect the existing file first and prepend to it.
|
|
46
|
-
- The config fetch (`docker-entrypoint.sh:88-112`) already runs before the startup script phase — so a new endpoint for setup scripts can follow the same pattern.
|
|
47
|
-
- The runner writes identity files at `runner.ts:1602-1621` and the system prompt is rebuilt at `runner.ts:1589` — both happen before any Claude process spawns.
|
|
48
|
-
- `writeTaskFile()` creates `/tmp/agent-swarm-task-{pid}.json` with `taskId` + `agentId` — the Stop hook reads this via `TASK_FILE` env var (though it currently doesn't read it in the Stop handler).
|
|
49
|
-
|
|
50
|
-
## Desired End State
|
|
51
|
-
|
|
52
|
-
1. Each agent has a `setupScript` field (65KB max, like `claudeMd`) stored in DB
|
|
53
|
-
2. Each agent has a `toolsMd` field (65KB max) stored in DB — a 4th identity file for environment-specific operational knowledge
|
|
54
|
-
3. A global setup script can be configured via `swarm_config` (key `SETUP_SCRIPT`, scope `global`)
|
|
55
|
-
4. On container start, the entrypoint fetches both scripts and composes them into the startup file
|
|
56
|
-
5. Agents can edit `/workspace/start-up.sh` and `/workspace/TOOLS.md` during sessions — changes sync to DB on Stop
|
|
57
|
-
6. The `update-profile` MCP tool and REST API accept `setupScript` and `toolsMd` updates
|
|
58
|
-
7. SOUL.md template includes self-improvement directives about setup script and TOOLS.md
|
|
59
|
-
8. Base prompt mentions the setup script mechanism and TOOLS.md
|
|
60
|
-
9. A `generateDefaultToolsMd()` template provides structured categories for environment-specific notes (repos, services, SSH hosts, APIs, etc.)
|
|
61
|
-
|
|
62
|
-
**Verification**: Register an agent, set its `setupScript` via API, start a Docker worker, verify the script runs at container start. Edit the script during a session, stop the worker, verify DB updated. Start again, verify the updated script runs.
|
|
63
|
-
|
|
64
|
-
## Quick Verification Reference
|
|
65
|
-
|
|
66
|
-
Common commands:
|
|
67
|
-
- `bun run tsc:check` — Type checking
|
|
68
|
-
- `bun run lint:fix` — Lint + format
|
|
69
|
-
- `bun test` — Run all tests
|
|
70
|
-
- `bun run start:http` — Start HTTP server
|
|
71
|
-
|
|
72
|
-
Key files to check:
|
|
73
|
-
- `src/be/db.ts` — Schema, migration, `updateAgentProfile()`, new `getAgentSetupScript()`, `generateDefaultToolsMd()`
|
|
74
|
-
- `src/types.ts` — `AgentSchema` with `setupScript` + `toolsMd`
|
|
75
|
-
- `docker-entrypoint.sh` — Setup script fetch + compose
|
|
76
|
-
- `src/hooks/hook.ts` — Stop hook sync (setup script + TOOLS.md), PostToolUse hook
|
|
77
|
-
- `src/commands/runner.ts` — Write setup script + TOOLS.md before spawn
|
|
78
|
-
- `src/tools/update-profile.ts` — New `setupScript` + `toolsMd` fields
|
|
79
|
-
- `src/prompts/base-prompt.ts` — Self-improvement directives
|
|
80
|
-
|
|
81
|
-
## What We're NOT Doing
|
|
82
|
-
|
|
83
|
-
- **Post-task reflection/learning extraction** — belongs to Gap 2 (Memory System), not here
|
|
84
|
-
- **Automatic learning propagation** between agents — separate concern
|
|
85
|
-
- **Setup script versioning/history** — no audit trail
|
|
86
|
-
- **Setup script validation/sandboxing** — agents can self-modify freely (per research decision #4)
|
|
87
|
-
- **UI editor for setup scripts or TOOLS.md** — can come later; API + MCP tool sufficient for now
|
|
88
|
-
- **Multi-file setup scripts** — single script per agent, stored as TEXT in DB
|
|
89
|
-
- **Setup script for leads** — leads don't run in Docker workers typically; skip for now
|
|
90
|
-
- **TOOLS.md sharing between agents** — each agent's TOOLS.md is personal; shared knowledge belongs in other mechanisms
|
|
91
|
-
|
|
92
|
-
## Implementation Approach
|
|
93
|
-
|
|
94
|
-
Five phases, each independently verifiable:
|
|
95
|
-
|
|
96
|
-
1. **DB + Types**: Schema migration (`setupScript` + `toolsMd`), type updates, `updateAgentProfile()` extension
|
|
97
|
-
2. **API + MCP Tool**: REST endpoint for setup script, `update-profile` extension (both fields), global script via swarm_config
|
|
98
|
-
3. **Docker Entrypoint**: Fetch and compose scripts at container start
|
|
99
|
-
4. **File Lifecycle**: Runner writes setup script + TOOLS.md before spawn, Stop hook syncs back, PostToolUse detects edits
|
|
100
|
-
5. **Self-Improvement Directives + TOOLS.md Template**: `generateDefaultToolsMd()`, SOUL.md update, base prompt update, CLAUDE.md template update
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Phase 1: DB Schema + Type System
|
|
105
|
-
|
|
106
|
-
### Overview
|
|
107
|
-
Add `setupScript TEXT` and `toolsMd TEXT` columns to the `agents` table and update all TypeScript types.
|
|
108
|
-
|
|
109
|
-
### Changes Required:
|
|
110
|
-
|
|
111
|
-
#### 1. Database Migration
|
|
112
|
-
**File**: `src/be/db.ts`
|
|
113
|
-
**Changes**: Add column migrations after the existing `identityMd` migration (~line 536):
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
// Setup script (per-agent auto-improvement)
|
|
117
|
-
try {
|
|
118
|
-
db.run(`ALTER TABLE agents ADD COLUMN setupScript TEXT`);
|
|
119
|
-
} catch { /* exists */ }
|
|
120
|
-
|
|
121
|
-
// Tools/environment reference (per-agent operational knowledge)
|
|
122
|
-
try {
|
|
123
|
-
db.run(`ALTER TABLE agents ADD COLUMN toolsMd TEXT`);
|
|
124
|
-
} catch { /* exists */ }
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
#### 2. AgentRow Type
|
|
128
|
-
**File**: `src/be/db.ts:714-728`
|
|
129
|
-
**Changes**: Add to `AgentRow`:
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
setupScript: string | null;
|
|
133
|
-
toolsMd: string | null;
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
#### 3. rowToAgent Function
|
|
137
|
-
**File**: `src/be/db.ts:731-748`
|
|
138
|
-
**Changes**: Add mappings:
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
setupScript: row.setupScript ?? undefined,
|
|
142
|
-
toolsMd: row.toolsMd ?? undefined,
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
#### 4. AgentSchema (Zod)
|
|
146
|
-
**File**: `src/types.ts:131-134`
|
|
147
|
-
**Changes**: Add after `identityMd`:
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
// Setup script: Runs at container start, agent-evolved (synced to /workspace/start-up.sh)
|
|
151
|
-
setupScript: z.string().max(65536).optional(),
|
|
152
|
-
// Tools/environment reference: Operational knowledge (synced to /workspace/TOOLS.md)
|
|
153
|
-
toolsMd: z.string().max(65536).optional(),
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
#### 5. updateAgentProfile Extension
|
|
157
|
-
**File**: `src/be/db.ts:2319-2370`
|
|
158
|
-
**Changes**: Add `setupScript?: string` and `toolsMd?: string` to the `updates` parameter type. Add `COALESCE(?, setupScript)` and `COALESCE(?, toolsMd)` to the UPDATE SQL and pass `updates.setupScript ?? null` and `updates.toolsMd ?? null` in the `.get()` call.
|
|
159
|
-
|
|
160
|
-
### Success Criteria:
|
|
161
|
-
|
|
162
|
-
#### Automated Verification:
|
|
163
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
164
|
-
- [x] Lint passes: `bun run lint:fix`
|
|
165
|
-
- [x] Existing tests pass: `bun test` (325 pass, 0 fail)
|
|
166
|
-
- [x] DB migration runs: `bun run start:http` (start + stop, no errors)
|
|
167
|
-
|
|
168
|
-
#### Manual Verification:
|
|
169
|
-
- [x] SQLite schema has the new columns: `sqlite3 agent-swarm-db.sqlite ".schema agents" | grep -E 'setupScript|toolsMd'`
|
|
170
|
-
- [x] GET /me returns `setupScript` and `toolsMd` fields (null for existing agents)
|
|
171
|
-
|
|
172
|
-
**Implementation Note**: After completing this phase, pause for manual confirmation.
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## Phase 2: API Endpoint + MCP Tool
|
|
177
|
-
|
|
178
|
-
### Overview
|
|
179
|
-
Expose setup script via REST API and MCP tool. Add a dedicated `GET /api/agents/:id/setup-script` endpoint for the Docker entrypoint to fetch, and extend `update-profile` to accept `setupScript`.
|
|
180
|
-
|
|
181
|
-
### Changes Required:
|
|
182
|
-
|
|
183
|
-
#### 1. Setup Script Fetch Endpoint
|
|
184
|
-
**File**: `src/http.ts`
|
|
185
|
-
**Changes**: Add a new endpoint in the REST API section (near the existing profile routes around line 968):
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
GET /api/agents/:id/setup-script → { setupScript: string | null, globalSetupScript: string | null }
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
This endpoint:
|
|
192
|
-
- Fetches the agent's `setupScript` from the `agents` table
|
|
193
|
-
- Fetches the global setup script from `swarm_config` where `scope='global'` and `key='SETUP_SCRIPT'`
|
|
194
|
-
- Returns both, so the entrypoint can compose them
|
|
195
|
-
|
|
196
|
-
Route matching: `pathSegments = ["api", "agents", <id>, "setup-script"]`
|
|
197
|
-
|
|
198
|
-
#### 2. Extend Profile API
|
|
199
|
-
**File**: `src/http.ts:968-1048`
|
|
200
|
-
**Changes**: The `PUT /api/agents/:id/profile` endpoint already passes through to `updateAgentProfile()`. Add `setupScript` and `toolsMd` to:
|
|
201
|
-
- The body parsing (it already uses `body.setupScript`/`body.toolsMd` if present due to the spread pattern)
|
|
202
|
-
- The "at least one field" check (~line 995-999)
|
|
203
|
-
- Size validation: max 64KB each, matching `claudeMd` pattern
|
|
204
|
-
|
|
205
|
-
#### 3. Extend update-profile MCP Tool
|
|
206
|
-
**File**: `src/tools/update-profile.ts:14-47`
|
|
207
|
-
**Changes**: Add `setupScript` and `toolsMd` to the input schema:
|
|
208
|
-
|
|
209
|
-
```typescript
|
|
210
|
-
setupScript: z.string().max(65536).optional().describe(
|
|
211
|
-
"Setup script content (bash). Runs at container start to install tools, configure environment. Persists across sessions. Also written to /workspace/start-up.sh."
|
|
212
|
-
),
|
|
213
|
-
toolsMd: z.string().max(65536).optional().describe(
|
|
214
|
-
"Environment-specific operational knowledge. Repos, services, SSH hosts, APIs, device names — anything specific to your setup. Synced to /workspace/TOOLS.md."
|
|
215
|
-
),
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
Add both to the "at least one field" check, `updatedFields` tracking, and `updateAgentProfile()` call.
|
|
219
|
-
|
|
220
|
-
After DB update:
|
|
221
|
-
- Write to `/workspace/start-up.sh` if the file doesn't exist or is the agent's own content (not operator-mounted). This mirrors the SOUL.md/IDENTITY.md pattern at lines 125-138.
|
|
222
|
-
- Write to `/workspace/TOOLS.md` following the same pattern.
|
|
223
|
-
|
|
224
|
-
#### 4. Global Setup Script Convention
|
|
225
|
-
No code changes needed — the `swarm_config` table already supports this. Document the convention:
|
|
226
|
-
- Key: `SETUP_SCRIPT`
|
|
227
|
-
- Scope: `global`
|
|
228
|
-
- Value: bash script content
|
|
229
|
-
- Set via `PUT /api/config` (existing endpoint)
|
|
230
|
-
|
|
231
|
-
### Success Criteria:
|
|
232
|
-
|
|
233
|
-
#### Automated Verification:
|
|
234
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
235
|
-
- [x] Lint passes: `bun run lint:fix`
|
|
236
|
-
- [x] Existing tests pass: `bun test` (325 pass, 0 fail)
|
|
237
|
-
|
|
238
|
-
#### Manual Verification:
|
|
239
|
-
- [x] Set agent setupScript via `PUT /api/agents/:id/profile` with `{"setupScript":"#!/bin/bash\necho hello"}` — verify persists
|
|
240
|
-
- [x] Fetch via `GET /api/agents/:id/setup-script` — verify returns the script
|
|
241
|
-
- [x] Set global script via `PUT /api/config` with `{"scope":"global","key":"SETUP_SCRIPT","value":"#!/bin/bash\necho global"}` — verify returned by the endpoint
|
|
242
|
-
- [x] Via MCP tool: agent edited start-up.sh and changes synced to DB via PostToolUse hook
|
|
243
|
-
- [x] Via MCP tool: agent edited TOOLS.md and changes synced to DB via PostToolUse hook
|
|
244
|
-
|
|
245
|
-
**Implementation Note**: After completing this phase, pause for manual confirmation.
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Phase 3: Docker Entrypoint Integration
|
|
250
|
-
|
|
251
|
-
### Overview
|
|
252
|
-
Update the Docker entrypoint to fetch the agent's setup script and global setup script from the API, compose them, and prepend to any existing `/workspace/start-up.*` file before the existing execution mechanism runs.
|
|
253
|
-
|
|
254
|
-
### Changes Required:
|
|
255
|
-
|
|
256
|
-
#### 1. Setup Script Fetch + Compose
|
|
257
|
-
**File**: `docker-entrypoint.sh`
|
|
258
|
-
**Changes**: Add a new section between the AI Tracker setup (line 226) and the existing startup script execution (line 229). This section:
|
|
259
|
-
|
|
260
|
-
1. Fetches the agent's setup script + global script from the new endpoint
|
|
261
|
-
2. Composes: global script first, then agent script (agent-specific additions build on global base)
|
|
262
|
-
3. Finds the existing startup file (if any) using the same discovery loop
|
|
263
|
-
4. If a startup file exists: prepends the composed script with a marker comment
|
|
264
|
-
5. If no startup file exists: creates `/workspace/start-up.sh` with the composed content
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
# ---- Fetch and compose setup scripts from API ----
|
|
268
|
-
if [ -n "$AGENT_ID" ]; then
|
|
269
|
-
echo "Fetching setup scripts from API..."
|
|
270
|
-
if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
|
|
271
|
-
-H "X-Agent-ID: ${AGENT_ID}" \
|
|
272
|
-
"${MCP_URL}/api/agents/${AGENT_ID}/setup-script" \
|
|
273
|
-
> /tmp/setup_scripts.json 2>/dev/null; then
|
|
274
|
-
|
|
275
|
-
GLOBAL_SCRIPT=$(jq -r '.globalSetupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
|
|
276
|
-
AGENT_SCRIPT=$(jq -r '.setupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
|
|
277
|
-
|
|
278
|
-
COMPOSED_SCRIPT=""
|
|
279
|
-
if [ -n "$GLOBAL_SCRIPT" ]; then
|
|
280
|
-
COMPOSED_SCRIPT="${GLOBAL_SCRIPT}"
|
|
281
|
-
fi
|
|
282
|
-
if [ -n "$AGENT_SCRIPT" ]; then
|
|
283
|
-
if [ -n "$COMPOSED_SCRIPT" ]; then
|
|
284
|
-
COMPOSED_SCRIPT="${COMPOSED_SCRIPT}
|
|
285
|
-
"
|
|
286
|
-
fi
|
|
287
|
-
COMPOSED_SCRIPT="${COMPOSED_SCRIPT}${AGENT_SCRIPT}"
|
|
288
|
-
fi
|
|
289
|
-
|
|
290
|
-
if [ -n "$COMPOSED_SCRIPT" ]; then
|
|
291
|
-
# Find existing startup file (same discovery logic as below)
|
|
292
|
-
EXISTING_STARTUP=""
|
|
293
|
-
for pattern in start-up.sh start-up.bash start-up.js start-up.ts start-up.bun start-up; do
|
|
294
|
-
if [ -f "/workspace/${pattern}" ]; then
|
|
295
|
-
EXISTING_STARTUP="/workspace/${pattern}"
|
|
296
|
-
break
|
|
297
|
-
fi
|
|
298
|
-
done
|
|
299
|
-
|
|
300
|
-
if [ -n "$EXISTING_STARTUP" ]; then
|
|
301
|
-
# Prepend to existing file (preserve operator content)
|
|
302
|
-
echo "Prepending DB setup script to existing ${EXISTING_STARTUP}..."
|
|
303
|
-
TEMP_FILE=$(mktemp)
|
|
304
|
-
echo "#!/bin/bash" > "$TEMP_FILE"
|
|
305
|
-
echo "# === Agent-managed setup (from DB) ===" >> "$TEMP_FILE"
|
|
306
|
-
echo "$COMPOSED_SCRIPT" >> "$TEMP_FILE"
|
|
307
|
-
echo "# === End agent-managed setup ===" >> "$TEMP_FILE"
|
|
308
|
-
echo "" >> "$TEMP_FILE"
|
|
309
|
-
# Strip existing shebang from original to avoid duplicate
|
|
310
|
-
sed '1{/^#!/d;}' "$EXISTING_STARTUP" >> "$TEMP_FILE"
|
|
311
|
-
mv "$TEMP_FILE" "$EXISTING_STARTUP"
|
|
312
|
-
chmod +x "$EXISTING_STARTUP"
|
|
313
|
-
else
|
|
314
|
-
# Create new start-up.sh
|
|
315
|
-
echo "Creating /workspace/start-up.sh from DB setup script..."
|
|
316
|
-
echo "#!/bin/bash" > /workspace/start-up.sh
|
|
317
|
-
echo "# === Agent-managed setup (from DB) ===" >> /workspace/start-up.sh
|
|
318
|
-
echo "$COMPOSED_SCRIPT" >> /workspace/start-up.sh
|
|
319
|
-
echo "# === End agent-managed setup ===" >> /workspace/start-up.sh
|
|
320
|
-
chmod +x /workspace/start-up.sh
|
|
321
|
-
fi
|
|
322
|
-
echo "Setup scripts composed (global: $([ -n "$GLOBAL_SCRIPT" ] && echo "yes" || echo "no"), agent: $([ -n "$AGENT_SCRIPT" ] && echo "yes" || echo "no"))"
|
|
323
|
-
fi
|
|
324
|
-
rm -f /tmp/setup_scripts.json
|
|
325
|
-
else
|
|
326
|
-
echo "Warning: Could not fetch setup scripts (API may not be ready)"
|
|
327
|
-
fi
|
|
328
|
-
fi
|
|
329
|
-
# ---- End setup script fetch ----
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
**Key decisions:**
|
|
333
|
-
- Global script comes first (base environment), agent script second (agent-specific additions)
|
|
334
|
-
- Marker comments (`=== Agent-managed setup ===`) allow us to strip the DB portion on sync-back
|
|
335
|
-
- If an operator-mounted startup file exists, we prepend rather than replace — operator content is preserved
|
|
336
|
-
- The shebang from the original file is stripped to avoid duplicate shebangs
|
|
337
|
-
- The composed file always gets a `#!/bin/bash` shebang (the DB-stored content may not have one)
|
|
338
|
-
|
|
339
|
-
### Success Criteria:
|
|
340
|
-
|
|
341
|
-
#### Automated Verification:
|
|
342
|
-
- [x] Entrypoint syntax valid: `bash -n docker-entrypoint.sh`
|
|
343
|
-
- [x] Lint passes: `bun run lint:fix`
|
|
344
|
-
|
|
345
|
-
#### Manual Verification:
|
|
346
|
-
- [x] Set an agent's setupScript via API (verified via curl)
|
|
347
|
-
- [x] Build worker image: `docker build -f Dockerfile.worker -t agent-swarm-worker:e2e-test .`
|
|
348
|
-
- [x] Start container, check logs for "Setup scripts composed" message
|
|
349
|
-
- [x] Verify setup test files exist inside the container (`/tmp/global-setup-test`, `/tmp/agent-setup-test`)
|
|
350
|
-
- [x] Restart container — verify no duplication of setup script content (marker stripping works)
|
|
351
|
-
|
|
352
|
-
**Implementation Note**: After completing this phase, pause for manual confirmation. Docker testing required.
|
|
353
|
-
|
|
354
|
-
---
|
|
355
|
-
|
|
356
|
-
## Phase 4: File Lifecycle (Runner + Hooks)
|
|
357
|
-
|
|
358
|
-
### Overview
|
|
359
|
-
Complete the setup script and TOOLS.md lifecycle: runner writes the files before spawn (so the agent can see/edit them), Stop hook syncs edits back to DB, PostToolUse hook syncs on direct edits.
|
|
360
|
-
|
|
361
|
-
### Changes Required:
|
|
362
|
-
|
|
363
|
-
#### 1. Runner Writes Setup Script + TOOLS.md Before Spawn
|
|
364
|
-
**File**: `src/commands/runner.ts`
|
|
365
|
-
**Changes**: After writing SOUL.md and IDENTITY.md (~line 1621), also write the setup script and TOOLS.md:
|
|
366
|
-
|
|
367
|
-
```typescript
|
|
368
|
-
const SETUP_SCRIPT_PATH = "/workspace/start-up.sh";
|
|
369
|
-
const TOOLS_MD_PATH = "/workspace/TOOLS.md";
|
|
370
|
-
|
|
371
|
-
// Write setup script to workspace (agent can edit during session)
|
|
372
|
-
if (agentSetupScript) {
|
|
373
|
-
try {
|
|
374
|
-
const file = Bun.file(SETUP_SCRIPT_PATH);
|
|
375
|
-
const exists = await file.exists();
|
|
376
|
-
if (!exists) {
|
|
377
|
-
await Bun.write(SETUP_SCRIPT_PATH, `#!/bin/bash\n${agentSetupScript}\n`);
|
|
378
|
-
log.info("Wrote start-up.sh to workspace");
|
|
379
|
-
}
|
|
380
|
-
} catch (err) {
|
|
381
|
-
log.warn(`Could not write start-up.sh: ${(err as Error).message}`);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Write TOOLS.md to workspace (agent can edit during session)
|
|
386
|
-
if (agentToolsMd) {
|
|
387
|
-
try {
|
|
388
|
-
await Bun.write(TOOLS_MD_PATH, agentToolsMd);
|
|
389
|
-
log.info("Wrote TOOLS.md to workspace");
|
|
390
|
-
} catch (err) {
|
|
391
|
-
log.warn(`Could not write TOOLS.md: ${(err as Error).message}`);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
Note: Setup script only creates if it doesn't exist — the entrypoint already composed/prepended it at container start. TOOLS.md always writes (like SOUL.md/IDENTITY.md) since it's a pure identity file with no operator-mounting concern.
|
|
397
|
-
|
|
398
|
-
Also extend the profile fetch at `runner.ts:1531-1549` to extract `agentSetupScript = profile.setupScript` and `agentToolsMd = profile.toolsMd`.
|
|
399
|
-
|
|
400
|
-
#### 2. Stop Hook Sync
|
|
401
|
-
**File**: `src/hooks/hook.ts`
|
|
402
|
-
**Changes**: In the Stop handler (~line 675-683), after `syncIdentityFilesToServer()`, add setup script sync. For TOOLS.md, extend the existing `syncIdentityFilesToServer()` to include it (since TOOLS.md is an identity file and follows the same pattern — this avoids an extra HTTP call):
|
|
403
|
-
|
|
404
|
-
```typescript
|
|
405
|
-
// Sync setup script back to DB (separate — has marker extraction logic)
|
|
406
|
-
try {
|
|
407
|
-
await syncSetupScriptToServer(agentInfo.id);
|
|
408
|
-
} catch { /* non-blocking */ }
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
**Extend `syncIdentityFilesToServer`** (~line 288-323): Add TOOLS.md alongside the existing SOUL.md and IDENTITY.md reads:
|
|
412
|
-
|
|
413
|
-
```typescript
|
|
414
|
-
const TOOLS_MD_PATH = "/workspace/TOOLS.md";
|
|
415
|
-
|
|
416
|
-
// Inside syncIdentityFilesToServer, after reading SOUL.md and IDENTITY.md:
|
|
417
|
-
try {
|
|
418
|
-
const toolsMdFile = Bun.file(TOOLS_MD_PATH);
|
|
419
|
-
if (await toolsMdFile.exists()) {
|
|
420
|
-
const content = await toolsMdFile.text();
|
|
421
|
-
if (content.trim() && content.length <= 65536) {
|
|
422
|
-
updates.toolsMd = content;
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
} catch { /* skip */ }
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
This sends `{ soulMd, identityMd, toolsMd }` in a single PUT call, consistent with the existing pattern.
|
|
429
|
-
|
|
430
|
-
**Add helper function `syncSetupScriptToServer`** (separate because of marker extraction logic):
|
|
431
|
-
|
|
432
|
-
```typescript
|
|
433
|
-
const SETUP_SCRIPT_PATH = "/workspace/start-up.sh";
|
|
434
|
-
|
|
435
|
-
const syncSetupScriptToServer = async (agentId: string): Promise<void> => {
|
|
436
|
-
if (!mcpConfig) return;
|
|
437
|
-
|
|
438
|
-
const file = Bun.file(SETUP_SCRIPT_PATH);
|
|
439
|
-
if (!(await file.exists())) return;
|
|
440
|
-
|
|
441
|
-
const raw = await file.text();
|
|
442
|
-
if (!raw.trim()) return;
|
|
443
|
-
|
|
444
|
-
const markerStart = "# === Agent-managed setup (from DB) ===";
|
|
445
|
-
const markerEnd = "# === End agent-managed setup ===";
|
|
446
|
-
const startIdx = raw.indexOf(markerStart);
|
|
447
|
-
const endIdx = raw.indexOf(markerEnd);
|
|
448
|
-
|
|
449
|
-
let content: string;
|
|
450
|
-
if (startIdx !== -1 && endIdx !== -1) {
|
|
451
|
-
// Markers present — extract ONLY the content between them.
|
|
452
|
-
// Content after the end marker is operator-mounted and must NOT be stored,
|
|
453
|
-
// otherwise it would be duplicated on next container restart (prepend + original).
|
|
454
|
-
content = raw.substring(startIdx + markerStart.length, endIdx).trim();
|
|
455
|
-
} else {
|
|
456
|
-
// No markers — agent created/replaced the entire file. Store as-is minus shebang.
|
|
457
|
-
content = raw.replace(/^#!\/bin\/bash\n/, "").trim();
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
if (!content || content.length > 65536) return;
|
|
461
|
-
|
|
462
|
-
try {
|
|
463
|
-
await fetch(`${getBaseUrl()}/api/agents/${agentId}/profile`, {
|
|
464
|
-
method: "PUT",
|
|
465
|
-
headers: {
|
|
466
|
-
...mcpConfig.headers,
|
|
467
|
-
"Content-Type": "application/json",
|
|
468
|
-
},
|
|
469
|
-
body: JSON.stringify({ setupScript: content }),
|
|
470
|
-
});
|
|
471
|
-
} catch { /* silently fail */ }
|
|
472
|
-
};
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
**Why extract between markers only:** The entrypoint composes the file as:
|
|
476
|
-
```
|
|
477
|
-
#!/bin/bash
|
|
478
|
-
# === Agent-managed setup (from DB) ===
|
|
479
|
-
<agent content>
|
|
480
|
-
# === End agent-managed setup ===
|
|
481
|
-
<operator's original start-up.sh content>
|
|
482
|
-
```
|
|
483
|
-
If we stored the full file, operator content would be saved to DB and then prepended again on next restart, duplicating with each cycle. Extracting only between markers ensures clean round-tripping.
|
|
484
|
-
|
|
485
|
-
**Trade-off:** If an agent adds lines *after* the end marker (e.g., appending to the file), those additions won't be persisted. The SOUL.md "Growth Mindset" directives should instruct agents to edit between the markers or use the `update-profile` MCP tool.
|
|
486
|
-
|
|
487
|
-
#### 3. PostToolUse Hook for Edits
|
|
488
|
-
**File**: `src/hooks/hook.ts`
|
|
489
|
-
**Changes**: In the PostToolUse handler (~line 537), alongside the existing identity file sync detection, add detection for setup script and TOOLS.md edits:
|
|
490
|
-
|
|
491
|
-
```typescript
|
|
492
|
-
if (
|
|
493
|
-
(toolName === "Write" || toolName === "Edit") &&
|
|
494
|
-
editedPath &&
|
|
495
|
-
editedPath.startsWith("/workspace/start-up")
|
|
496
|
-
) {
|
|
497
|
-
try {
|
|
498
|
-
await syncSetupScriptToServer(agentInfo.id);
|
|
499
|
-
} catch { /* non-blocking */ }
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// TOOLS.md edits are handled by the extended syncIdentityFilesToServer
|
|
503
|
-
// which already triggers on identity file edits. Add TOOLS.md path detection:
|
|
504
|
-
if (
|
|
505
|
-
(toolName === "Write" || toolName === "Edit") &&
|
|
506
|
-
editedPath === "/workspace/TOOLS.md"
|
|
507
|
-
) {
|
|
508
|
-
try {
|
|
509
|
-
await syncIdentityFilesToServer(agentInfo.id);
|
|
510
|
-
} catch { /* non-blocking */ }
|
|
511
|
-
}
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
This catches edits to any `/workspace/start-up.*` variant and `/workspace/TOOLS.md`.
|
|
515
|
-
|
|
516
|
-
### Success Criteria:
|
|
517
|
-
|
|
518
|
-
#### Automated Verification:
|
|
519
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
520
|
-
- [x] Lint passes: `bun run lint:fix`
|
|
521
|
-
- [x] Existing tests pass: `bun test` (325 pass, 0 fail)
|
|
522
|
-
|
|
523
|
-
#### Manual Verification:
|
|
524
|
-
- [x] Set agent's setupScript, start Docker worker — `/workspace/start-up.sh` created with correct content
|
|
525
|
-
- [x] Verify `/workspace/TOOLS.md` exists with default template (Repos, Services, Infrastructure sections)
|
|
526
|
-
- [x] Edit `/workspace/start-up.sh` during Claude session — PostToolUse hook synced `pip3 install httpx` to DB
|
|
527
|
-
- [x] Edit `/workspace/TOOLS.md` during Claude session — PostToolUse hook synced `API server at localhost:3013` to DB
|
|
528
|
-
- [x] Stop hook syncs both files to DB (verified via task completion + DB query)
|
|
529
|
-
- [x] Restart container — updated script runs and TOOLS.md restored from DB
|
|
530
|
-
|
|
531
|
-
**Implementation Note**: After completing this phase, pause for manual confirmation. Docker testing required.
|
|
532
|
-
|
|
533
|
-
---
|
|
534
|
-
|
|
535
|
-
## Phase 5: Self-Improvement Directives + TOOLS.md Template
|
|
536
|
-
|
|
537
|
-
### Overview
|
|
538
|
-
Update the SOUL.md template and base prompt to include explicit self-improvement guidance about setup scripts, TOOLS.md, and environment evolution. Add a `generateDefaultToolsMd()` template inspired by [OpenClaw's TOOLS.md pattern](https://github.com/openclaw/openclaw/blob/main/docs/reference/templates/TOOLS.md) — a structured personal reference for environment-specific operational knowledge.
|
|
539
|
-
|
|
540
|
-
### Changes Required:
|
|
541
|
-
|
|
542
|
-
#### 1. `generateDefaultToolsMd()` Template
|
|
543
|
-
**File**: `src/be/db.ts`
|
|
544
|
-
**Changes**: Add a new function after `generateDefaultIdentityMd()` (~line 2317):
|
|
545
|
-
|
|
546
|
-
```typescript
|
|
547
|
-
export function generateDefaultToolsMd(agent: {
|
|
548
|
-
name: string;
|
|
549
|
-
role?: string;
|
|
550
|
-
}): string {
|
|
551
|
-
return `# TOOLS.md — ${agent.name}
|
|
552
|
-
|
|
553
|
-
Skills define *how* tools work. This file is for *your* specifics.
|
|
554
|
-
|
|
555
|
-
## What Goes Here
|
|
556
|
-
|
|
557
|
-
Environment-specific knowledge that's unique to your setup:
|
|
558
|
-
- Repos you work with and their conventions
|
|
559
|
-
- Services, ports, and endpoints you interact with
|
|
560
|
-
- SSH hosts and access patterns
|
|
561
|
-
- API keys and auth patterns (references, not secrets)
|
|
562
|
-
- CLI tools and their quirks
|
|
563
|
-
- Anything that makes your job easier to remember
|
|
564
|
-
|
|
565
|
-
## Repos
|
|
566
|
-
|
|
567
|
-
<!-- Add repos you work with: name, path, conventions, gotchas -->
|
|
568
|
-
|
|
569
|
-
## Services
|
|
570
|
-
|
|
571
|
-
<!-- Add services you interact with: name, port, health check, notes -->
|
|
572
|
-
|
|
573
|
-
## Infrastructure
|
|
574
|
-
|
|
575
|
-
<!-- SSH hosts, Docker registries, cloud resources -->
|
|
576
|
-
|
|
577
|
-
## APIs & Integrations
|
|
578
|
-
|
|
579
|
-
<!-- Endpoints, auth patterns, rate limits -->
|
|
580
|
-
|
|
581
|
-
## Tools & Shortcuts
|
|
582
|
-
|
|
583
|
-
<!-- CLI aliases, scripts, preferred tools for specific tasks -->
|
|
584
|
-
|
|
585
|
-
## Notes
|
|
586
|
-
|
|
587
|
-
<!-- Anything else environment-specific -->
|
|
588
|
-
|
|
589
|
-
---
|
|
590
|
-
*This file is yours. Update it as you discover your environment. Changes persist across sessions.*
|
|
591
|
-
`;
|
|
592
|
-
}
|
|
593
|
-
```
|
|
594
|
-
|
|
595
|
-
**Key design principle** (from [OpenClaw](https://github.com/openclaw/openclaw/blob/main/docs/reference/templates/TOOLS.md)): "Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure."
|
|
596
|
-
|
|
597
|
-
#### 2. Runner Default Generation
|
|
598
|
-
**File**: `src/commands/runner.ts`
|
|
599
|
-
**Changes**: In the default generation fallback section (~line 1553-1586), alongside the existing `generateDefaultSoulMd()` and `generateDefaultIdentityMd()` calls, also generate default TOOLS.md:
|
|
600
|
-
|
|
601
|
-
```typescript
|
|
602
|
-
if (!agentToolsMd) {
|
|
603
|
-
agentToolsMd = generateDefaultToolsMd({ name: agentProfileName || role, role });
|
|
604
|
-
// Push default to server
|
|
605
|
-
await fetch(`${apiUrl}/api/agents/${agentId}/profile`, {
|
|
606
|
-
method: "PUT",
|
|
607
|
-
headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" },
|
|
608
|
-
body: JSON.stringify({ toolsMd: agentToolsMd }),
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
#### 3. SOUL.md Template Update
|
|
614
|
-
**File**: `src/be/db.ts` — `generateDefaultSoulMd()` (~line 2240)
|
|
615
|
-
**Changes**: Add a new section after `## Boundaries` and before `## Self-Evolution`:
|
|
616
|
-
|
|
617
|
-
```markdown
|
|
618
|
-
## Growth Mindset
|
|
619
|
-
|
|
620
|
-
After completing tasks, reflect on what made them harder or easier:
|
|
621
|
-
- **Tools you wished you had?** Add them to your setup script (\`/workspace/start-up.sh\`).
|
|
622
|
-
It runs at every container start — your environment improves automatically.
|
|
623
|
-
Edit between the \`# === Agent-managed setup\` markers to ensure changes persist.
|
|
624
|
-
Or use the \`update-profile\` tool with the \`setupScript\` field.
|
|
625
|
-
- **Environment knowledge gained?** Record it in your TOOLS.md — repos, services, APIs, infra.
|
|
626
|
-
- **Patterns you discovered?** Record them in your CLAUDE.md notes.
|
|
627
|
-
- **Mistakes you want to avoid?** Add guardrails to your setup script or notes.
|
|
628
|
-
|
|
629
|
-
Your setup script and TOOLS.md are yours to evolve. Start small and iterate.
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
Update the `## Self-Evolution` section to reference all self-evolving artifacts:
|
|
633
|
-
|
|
634
|
-
```markdown
|
|
635
|
-
## Self-Evolution
|
|
636
|
-
|
|
637
|
-
These files are yours. As you work and learn, refine them:
|
|
638
|
-
- **This file (SOUL.md)** — Your persona and values
|
|
639
|
-
- **IDENTITY.md** — Your expertise and working style
|
|
640
|
-
- **TOOLS.md** — Your environment-specific knowledge (repos, services, infra, APIs)
|
|
641
|
-
- **/workspace/start-up.sh** — Your environment setup (tools, configs, aliases)
|
|
642
|
-
- **CLAUDE.md** — Your operational notes and learnings
|
|
643
|
-
|
|
644
|
-
Changes to all of these persist across sessions.
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
#### 4. Base Prompt Filesystem Section Update
|
|
648
|
-
**File**: `src/prompts/base-prompt.ts` — `BASE_PROMPT_FILESYSTEM` (~line 204)
|
|
649
|
-
**Changes**: Add mentions of the setup script and TOOLS.md after the existing filesystem description:
|
|
650
|
-
|
|
651
|
-
```markdown
|
|
652
|
-
### Environment Setup
|
|
653
|
-
Your setup script at \`/workspace/start-up.sh\` runs at every container start.
|
|
654
|
-
Use it to install tools, configure your environment, or set up workflows.
|
|
655
|
-
If the file has \`# === Agent-managed setup\` markers, edit between them — content
|
|
656
|
-
between markers is what persists to the database. You can also use the \`update-profile\`
|
|
657
|
-
tool with the \`setupScript\` field.
|
|
658
|
-
|
|
659
|
-
### Operational Knowledge
|
|
660
|
-
Your \`/workspace/TOOLS.md\` file stores environment-specific knowledge — repos you work with,
|
|
661
|
-
services and ports, SSH hosts, APIs, tool preferences. Update it as you learn about your environment.
|
|
662
|
-
It persists across sessions.
|
|
663
|
-
```
|
|
664
|
-
|
|
665
|
-
**Design decision — TOOLS.md is NOT injected into the system prompt.** Unlike SOUL.md and IDENTITY.md (which are injected via `getBasePrompt()` at `base-prompt.ts:289-298`), TOOLS.md is a reference file the agent reads on demand via the `Read` tool. Rationale: TOOLS.md can grow large with operational details (repo lists, service inventories, API endpoints), and injecting it into every system prompt would waste tokens. Agents are told about its existence in the filesystem section and can read it when the task requires environment knowledge. The `BasePromptArgs` type does NOT get a `toolsMd` parameter.
|
|
666
|
-
|
|
667
|
-
#### 5. Updated Default CLAUDE.md Template
|
|
668
|
-
**File**: `src/be/db.ts` — `generateDefaultClaudeMd()` (~line 2200)
|
|
669
|
-
**Changes**: Add mentions of the setup script and TOOLS.md in the "Your Identity Files" section:
|
|
670
|
-
|
|
671
|
-
```markdown
|
|
672
|
-
- **`/workspace/TOOLS.md`** — Your environment-specific knowledge (repos, services, APIs, infra)
|
|
673
|
-
- **`/workspace/start-up.sh`** — Your setup script (runs at container start, add tools/configs here)
|
|
674
|
-
```
|
|
675
|
-
|
|
676
|
-
### Success Criteria:
|
|
677
|
-
|
|
678
|
-
#### Automated Verification:
|
|
679
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
680
|
-
- [x] Lint passes: `bun run lint:fix`
|
|
681
|
-
- [x] Existing tests pass: `bun test` (325 pass, 0 fail)
|
|
682
|
-
|
|
683
|
-
#### Manual Verification:
|
|
684
|
-
- [x] Register a new agent — verify SOUL.md includes "Growth Mindset" section
|
|
685
|
-
- [x] Verify TOOLS.md is generated with structured categories (Repos, Services, Infrastructure, etc.)
|
|
686
|
-
- [x] Verify base prompt includes "Environment Setup" and "Operational Knowledge" sections
|
|
687
|
-
- [x] Verify CLAUDE.md template references both `/workspace/TOOLS.md` and `/workspace/start-up.sh`
|
|
688
|
-
|
|
689
|
-
**Implementation Note**: After completing this phase, pause for manual confirmation.
|
|
690
|
-
|
|
691
|
-
---
|
|
692
|
-
|
|
693
|
-
## Testing Strategy
|
|
694
|
-
|
|
695
|
-
### Automated Tests
|
|
696
|
-
- `bun run tsc:check` — Type checking after each phase
|
|
697
|
-
- `bun run lint:fix` — Lint after each phase
|
|
698
|
-
- `bun test` — All existing tests pass (no regressions)
|
|
699
|
-
|
|
700
|
-
### Unit Tests (new file: `src/tests/setup-script.test.ts`)
|
|
701
|
-
- Migration: `setupScript` and `toolsMd` columns exist after `initDb()`
|
|
702
|
-
- `updateAgentProfile` with `setupScript` — persists and returns
|
|
703
|
-
- `updateAgentProfile` with `toolsMd` — persists and returns
|
|
704
|
-
- `getAgentById` returns `setupScript` and `toolsMd` fields
|
|
705
|
-
- `GET /api/agents/:id/setup-script` returns both agent and global scripts
|
|
706
|
-
- Global script from `swarm_config` with key `SETUP_SCRIPT` is returned
|
|
707
|
-
- `generateDefaultToolsMd()` returns structured template with expected sections
|
|
708
|
-
|
|
709
|
-
### What's NOT Tested Automatically
|
|
710
|
-
- Docker entrypoint script composition (requires Docker container)
|
|
711
|
-
- Stop hook sync for setup script + TOOLS.md (requires real Claude session)
|
|
712
|
-
- PostToolUse hook detection for both file types (requires real Claude session)
|
|
713
|
-
- These are tested manually via the E2E section below.
|
|
714
|
-
|
|
715
|
-
---
|
|
716
|
-
|
|
717
|
-
## Manual E2E Verification
|
|
718
|
-
|
|
719
|
-
```bash
|
|
720
|
-
# 1. Start server
|
|
721
|
-
bun run start:http
|
|
722
|
-
|
|
723
|
-
# 2. Register an agent (or use existing)
|
|
724
|
-
AGENT_ID="<agent-id>"
|
|
725
|
-
|
|
726
|
-
# 3. Set per-agent setup script
|
|
727
|
-
curl -X PUT -H "Authorization: Bearer 123123" \
|
|
728
|
-
-H "Content-Type: application/json" \
|
|
729
|
-
-d '{"setupScript":"echo \"Agent setup ran at $(date)\" > /tmp/agent-setup-test\napt-get update -qq && apt-get install -y -qq jq > /dev/null 2>&1 || true"}' \
|
|
730
|
-
http://localhost:3013/api/agents/$AGENT_ID/profile | jq '.setupScript'
|
|
731
|
-
|
|
732
|
-
# 4. Set global setup script via swarm_config
|
|
733
|
-
curl -X PUT -H "Authorization: Bearer 123123" \
|
|
734
|
-
-H "Content-Type: application/json" \
|
|
735
|
-
-d '{"scope":"global","key":"SETUP_SCRIPT","value":"echo \"Global setup ran\" > /tmp/global-setup-test"}' \
|
|
736
|
-
http://localhost:3013/api/config | jq .
|
|
737
|
-
|
|
738
|
-
# 5. Verify fetch endpoint
|
|
739
|
-
curl -H "Authorization: Bearer 123123" \
|
|
740
|
-
-H "X-Agent-ID: $AGENT_ID" \
|
|
741
|
-
http://localhost:3013/api/agents/$AGENT_ID/setup-script | jq .
|
|
742
|
-
# Should show both setupScript and globalSetupScript
|
|
743
|
-
|
|
744
|
-
# 6. Build and start Docker worker
|
|
745
|
-
bun run docker:build:worker
|
|
746
|
-
# Start worker container pointing at API
|
|
747
|
-
|
|
748
|
-
# 7. Verify scripts ran
|
|
749
|
-
docker exec <container> cat /tmp/global-setup-test # "Global setup ran"
|
|
750
|
-
docker exec <container> cat /tmp/agent-setup-test # "Agent setup ran at ..."
|
|
751
|
-
docker exec <container> which jq # Should show jq path
|
|
752
|
-
|
|
753
|
-
# 8. Create a task that edits the setup script
|
|
754
|
-
curl -X POST -H "Authorization: Bearer 123123" \
|
|
755
|
-
-H "Content-Type: application/json" \
|
|
756
|
-
-d "{\"task\":\"Add 'pip install requests' to your setup script at /workspace/start-up.sh\",\"agentId\":\"$AGENT_ID\"}" \
|
|
757
|
-
http://localhost:3013/api/tasks | jq .
|
|
758
|
-
|
|
759
|
-
# 9. After task completes, verify DB was updated
|
|
760
|
-
curl -H "Authorization: Bearer 123123" \
|
|
761
|
-
http://localhost:3013/api/agents/$AGENT_ID/setup-script | jq '.setupScript'
|
|
762
|
-
# Should include the pip install line
|
|
763
|
-
|
|
764
|
-
# 10. Restart worker, verify updated script runs
|
|
765
|
-
docker restart <container>
|
|
766
|
-
docker exec <container> python3 -c "import requests; print(requests.__version__)"
|
|
767
|
-
|
|
768
|
-
# --- TOOLS.md lifecycle ---
|
|
769
|
-
|
|
770
|
-
# 11. Verify TOOLS.md was generated with default template
|
|
771
|
-
docker exec <container> cat /workspace/TOOLS.md
|
|
772
|
-
# Should have structured sections: Repos, Services, Infrastructure, APIs, Tools & Shortcuts
|
|
773
|
-
|
|
774
|
-
# 12. Set TOOLS.md via API
|
|
775
|
-
curl -X PUT -H "Authorization: Bearer 123123" \
|
|
776
|
-
-H "Content-Type: application/json" \
|
|
777
|
-
-d '{"toolsMd":"# TOOLS.md\n\n## Repos\n- agent-swarm → /workspace/shared, Bun + TypeScript\n\n## Services\n- API → localhost:3013\n"}' \
|
|
778
|
-
http://localhost:3013/api/agents/$AGENT_ID/profile | jq '.toolsMd'
|
|
779
|
-
|
|
780
|
-
# 13. Restart worker, verify TOOLS.md is restored from DB
|
|
781
|
-
docker restart <container>
|
|
782
|
-
docker exec <container> cat /workspace/TOOLS.md
|
|
783
|
-
# Should show the content set in step 12
|
|
784
|
-
|
|
785
|
-
# 14. Create a task that edits TOOLS.md
|
|
786
|
-
curl -X POST -H "Authorization: Bearer 123123" \
|
|
787
|
-
-H "Content-Type: application/json" \
|
|
788
|
-
-d "{\"task\":\"Add a note about Redis on port 6379 to your /workspace/TOOLS.md under Services\",\"agentId\":\"$AGENT_ID\"}" \
|
|
789
|
-
http://localhost:3013/api/tasks | jq .
|
|
790
|
-
|
|
791
|
-
# 15. After task completes, verify DB was updated with TOOLS.md changes
|
|
792
|
-
curl -H "Authorization: Bearer 123123" \
|
|
793
|
-
http://localhost:3013/api/agents/$AGENT_ID | jq '.toolsMd'
|
|
794
|
-
# Should include the Redis note
|
|
795
|
-
```
|
|
796
|
-
|
|
797
|
-
## References
|
|
798
|
-
|
|
799
|
-
- Research: `thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md` (Gap 5 section, lines 304-331)
|
|
800
|
-
- Base research: `thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md`
|
|
801
|
-
- Identity implementation: `thoughts/taras/plans/2026-02-20-worker-identity.md` (pattern for file lifecycle)
|
|
802
|
-
- Env management: `thoughts/taras/plans/2026-02-20-env-management.md` (swarm_config table)
|
|
803
|
-
- TOOLS.md inspiration: [OpenClaw TOOLS.md template](https://github.com/openclaw/openclaw/blob/main/docs/reference/templates/TOOLS.md) (environment-specific reference pattern)
|