@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.
Files changed (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. 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)