@desplega.ai/agent-swarm 1.20.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (810) hide show
  1. package/.claude/settings.json +84 -0
  2. package/.claude/settings.local.json +3 -1
  3. package/.entire/settings.json +4 -0
  4. package/.env.docker.example +40 -23
  5. package/.env.example +39 -1
  6. package/.github/ISSUE_TEMPLATE/bug_report.yml +78 -0
  7. package/.github/ISSUE_TEMPLATE/community-template.yml +77 -0
  8. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  9. package/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
  10. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +29 -0
  11. package/.github/workflows/ci.yml +3 -27
  12. package/.github/workflows/docker-and-deploy.yml +20 -5
  13. package/.github/workflows/merge-gate.yml +233 -0
  14. package/.opencode/plugins/entire.ts +133 -0
  15. package/.superset/config.json +6 -0
  16. package/.wts-setup.ts +103 -34
  17. package/CHANGELOG.md +447 -0
  18. package/CLAUDE.md +422 -5
  19. package/CONTRIBUTING.md +46 -1
  20. package/DEPLOYMENT.md +26 -9
  21. package/Dockerfile +15 -7
  22. package/Dockerfile.worker +99 -67
  23. package/MCP.md +452 -17
  24. package/README.md +271 -169
  25. package/api-entrypoint.sh +56 -0
  26. package/depot.json +1 -0
  27. package/docker-compose.example.yml +194 -3
  28. package/docker-compose.local.yml +119 -0
  29. package/docker-entrypoint.sh +393 -113
  30. package/docs-site/app/api/search/route.ts +4 -0
  31. package/docs-site/app/docs/[[...slug]]/page.tsx +87 -0
  32. package/docs-site/app/docs/layout.tsx +12 -0
  33. package/docs-site/app/globals.css +24 -0
  34. package/docs-site/app/layout.config.tsx +34 -0
  35. package/docs-site/app/layout.tsx +119 -0
  36. package/docs-site/app/llms-full.txt/route.ts +11 -0
  37. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +24 -0
  38. package/docs-site/app/llms.txt/route.ts +8 -0
  39. package/docs-site/app/page.tsx +5 -0
  40. package/docs-site/app/robots.ts +13 -0
  41. package/docs-site/app/sitemap.ts +37 -0
  42. package/docs-site/components/api-page.client.tsx +4 -0
  43. package/docs-site/components/api-page.tsx +7 -0
  44. package/docs-site/components/mdx/mermaid.tsx +55 -0
  45. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +117 -0
  46. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +77 -0
  47. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +96 -0
  48. package/docs-site/content/docs/(documentation)/architecture/meta.json +4 -0
  49. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +172 -0
  50. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +98 -0
  51. package/docs-site/content/docs/(documentation)/concepts/meta.json +4 -0
  52. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +136 -0
  53. package/docs-site/content/docs/(documentation)/concepts/services.mdx +104 -0
  54. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +148 -0
  55. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +209 -0
  56. package/docs-site/content/docs/(documentation)/contributing.mdx +158 -0
  57. package/docs-site/content/docs/(documentation)/getting-started.mdx +157 -0
  58. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +79 -0
  59. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +171 -0
  60. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +81 -0
  61. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +93 -0
  62. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +98 -0
  63. package/docs-site/content/docs/(documentation)/guides/meta.json +13 -0
  64. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +52 -0
  65. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +179 -0
  66. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +154 -0
  67. package/docs-site/content/docs/(documentation)/index.mdx +65 -0
  68. package/docs-site/content/docs/(documentation)/meta.json +19 -0
  69. package/docs-site/content/docs/(documentation)/reference/cli.mdx +241 -0
  70. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +205 -0
  71. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +449 -0
  72. package/docs-site/content/docs/(documentation)/reference/meta.json +4 -0
  73. package/docs-site/content/docs/api-reference/active-sessions.mdx +9 -0
  74. package/docs-site/content/docs/api-reference/agents.mdx +9 -0
  75. package/docs-site/content/docs/api-reference/channels.mdx +9 -0
  76. package/docs-site/content/docs/api-reference/config.mdx +9 -0
  77. package/docs-site/content/docs/api-reference/debug.mdx +9 -0
  78. package/docs-site/content/docs/api-reference/ecosystem.mdx +9 -0
  79. package/docs-site/content/docs/api-reference/epics.mdx +9 -0
  80. package/docs-site/content/docs/api-reference/index.mdx +32 -0
  81. package/docs-site/content/docs/api-reference/memory.mdx +9 -0
  82. package/docs-site/content/docs/api-reference/meta.json +25 -0
  83. package/docs-site/content/docs/api-reference/poll.mdx +9 -0
  84. package/docs-site/content/docs/api-reference/repos.mdx +9 -0
  85. package/docs-site/content/docs/api-reference/schedules.mdx +9 -0
  86. package/docs-site/content/docs/api-reference/session-data.mdx +9 -0
  87. package/docs-site/content/docs/api-reference/stats.mdx +9 -0
  88. package/docs-site/content/docs/api-reference/tasks.mdx +9 -0
  89. package/docs-site/content/docs/api-reference/trackers.mdx +9 -0
  90. package/docs-site/content/docs/api-reference/webhooks.mdx +9 -0
  91. package/docs-site/content/docs/api-reference/workflows.mdx +9 -0
  92. package/docs-site/content/docs/meta.json +3 -0
  93. package/docs-site/lib/get-llm-text.ts +10 -0
  94. package/docs-site/lib/openapi.ts +23 -0
  95. package/docs-site/lib/source.ts +8 -0
  96. package/docs-site/mdx-components.tsx +13 -0
  97. package/docs-site/next.config.mjs +29 -0
  98. package/docs-site/package.json +35 -0
  99. package/docs-site/pnpm-lock.yaml +5407 -0
  100. package/docs-site/postcss.config.mjs +8 -0
  101. package/docs-site/scripts/generate-docs.ts +171 -0
  102. package/docs-site/source.config.ts +17 -0
  103. package/docs-site/tsconfig.json +46 -0
  104. package/ecosystem.config.cjs +4 -4
  105. package/landing/next.config.ts +14 -0
  106. package/landing/package.json +31 -0
  107. package/landing/pnpm-lock.yaml +1091 -0
  108. package/landing/postcss.config.mjs +8 -0
  109. package/landing/public/apple-touch-icon.png +0 -0
  110. package/landing/public/favicon.ico +0 -0
  111. package/landing/public/logo.png +0 -0
  112. package/landing/public/og-image.png +0 -0
  113. package/landing/public/omghost-desplega.svg +30 -0
  114. package/landing/public/omghost-openfort.svg +9 -0
  115. package/landing/src/app/actions/waitlist.ts +25 -0
  116. package/landing/src/app/blog/openfort-hackathon/page.tsx +863 -0
  117. package/landing/src/app/blog/page.tsx +162 -0
  118. package/landing/src/app/blog/swarm-metrics/page.tsx +685 -0
  119. package/landing/src/app/examples/page.tsx +174 -0
  120. package/landing/src/app/examples/x402/page.tsx +456 -0
  121. package/landing/src/app/globals.css +122 -0
  122. package/landing/src/app/layout.tsx +134 -0
  123. package/landing/src/app/page.tsx +27 -0
  124. package/landing/src/app/robots.ts +13 -0
  125. package/landing/src/app/sitemap.ts +44 -0
  126. package/landing/src/components/architecture.tsx +163 -0
  127. package/landing/src/components/cta.tsx +52 -0
  128. package/landing/src/components/features.tsx +160 -0
  129. package/landing/src/components/footer.tsx +100 -0
  130. package/landing/src/components/hero.tsx +217 -0
  131. package/landing/src/components/how-it-works.tsx +165 -0
  132. package/landing/src/components/navbar.tsx +147 -0
  133. package/landing/src/components/waitlist.tsx +110 -0
  134. package/landing/src/components/why-choose.tsx +149 -0
  135. package/landing/src/components/workshops.tsx +328 -0
  136. package/landing/src/lib/utils.ts +6 -0
  137. package/landing/tsconfig.json +41 -0
  138. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +154 -0
  139. package/new-ui/CLAUDE.md +92 -0
  140. package/new-ui/README.md +73 -0
  141. package/new-ui/biome.json +42 -0
  142. package/new-ui/components.json +21 -0
  143. package/new-ui/index.html +25 -0
  144. package/new-ui/package.json +49 -0
  145. package/new-ui/pnpm-lock.yaml +4845 -0
  146. package/new-ui/public/logo.png +0 -0
  147. package/new-ui/src/api/client.ts +814 -0
  148. package/new-ui/src/api/hooks/index.ts +64 -0
  149. package/new-ui/src/api/hooks/use-agents.ts +58 -0
  150. package/new-ui/src/api/hooks/use-channels.ts +115 -0
  151. package/new-ui/src/api/hooks/use-config-api.ts +46 -0
  152. package/new-ui/src/api/hooks/use-costs.ts +122 -0
  153. package/new-ui/src/api/hooks/use-db-query.ts +29 -0
  154. package/new-ui/src/api/hooks/use-epics.ts +75 -0
  155. package/new-ui/src/api/hooks/use-repos.ts +61 -0
  156. package/new-ui/src/api/hooks/use-schedules.ts +81 -0
  157. package/new-ui/src/api/hooks/use-services.ts +16 -0
  158. package/new-ui/src/api/hooks/use-stats.ts +27 -0
  159. package/new-ui/src/api/hooks/use-tasks.ts +89 -0
  160. package/new-ui/src/api/hooks/use-workflows.ts +109 -0
  161. package/{ui/src/types/api.ts → new-ui/src/api/types.ts} +236 -10
  162. package/new-ui/src/app/App.tsx +13 -0
  163. package/new-ui/src/app/providers.tsx +32 -0
  164. package/new-ui/src/app/router.tsx +52 -0
  165. package/new-ui/src/components/layout/app-header.tsx +47 -0
  166. package/new-ui/src/components/layout/app-sidebar.tsx +128 -0
  167. package/new-ui/src/components/layout/breadcrumbs.tsx +57 -0
  168. package/new-ui/src/components/layout/config-guard.tsx +22 -0
  169. package/new-ui/src/components/layout/root-layout.tsx +40 -0
  170. package/new-ui/src/components/layout/swarm-switcher.tsx +85 -0
  171. package/new-ui/src/components/shared/command-menu.tsx +131 -0
  172. package/new-ui/src/components/shared/data-grid.tsx +141 -0
  173. package/new-ui/src/components/shared/empty-state.tsx +24 -0
  174. package/new-ui/src/components/shared/error-boundary.tsx +72 -0
  175. package/new-ui/src/components/shared/json-viewer.tsx +47 -0
  176. package/new-ui/src/components/shared/name-connection-modal.tsx +99 -0
  177. package/new-ui/src/components/shared/page-skeleton.tsx +16 -0
  178. package/new-ui/src/components/shared/session-log-viewer.tsx +364 -0
  179. package/new-ui/src/components/shared/stats-bar.tsx +132 -0
  180. package/new-ui/src/components/shared/status-badge.tsx +131 -0
  181. package/new-ui/src/components/shared/usage-summary.tsx +179 -0
  182. package/new-ui/src/components/ui/alert-dialog.tsx +176 -0
  183. package/new-ui/src/components/ui/alert.tsx +60 -0
  184. package/new-ui/src/components/ui/avatar.tsx +96 -0
  185. package/new-ui/src/components/ui/badge.tsx +46 -0
  186. package/new-ui/src/components/ui/button.tsx +62 -0
  187. package/new-ui/src/components/ui/card.tsx +75 -0
  188. package/new-ui/src/components/ui/command.tsx +160 -0
  189. package/new-ui/src/components/ui/dialog.tsx +143 -0
  190. package/new-ui/src/components/ui/dropdown-menu.tsx +226 -0
  191. package/new-ui/src/components/ui/input.tsx +21 -0
  192. package/new-ui/src/components/ui/label.tsx +19 -0
  193. package/new-ui/src/components/ui/progress.tsx +26 -0
  194. package/new-ui/src/components/ui/scroll-area.tsx +54 -0
  195. package/new-ui/src/components/ui/select.tsx +175 -0
  196. package/new-ui/src/components/ui/separator.tsx +28 -0
  197. package/new-ui/src/components/ui/sheet.tsx +132 -0
  198. package/new-ui/src/components/ui/sidebar.tsx +691 -0
  199. package/new-ui/src/components/ui/skeleton.tsx +13 -0
  200. package/new-ui/src/components/ui/sonner.tsx +35 -0
  201. package/new-ui/src/components/ui/switch.tsx +33 -0
  202. package/new-ui/src/components/ui/table.tsx +92 -0
  203. package/new-ui/src/components/ui/tabs.tsx +79 -0
  204. package/new-ui/src/components/ui/textarea.tsx +18 -0
  205. package/new-ui/src/components/ui/tooltip.tsx +51 -0
  206. package/new-ui/src/components/workflows/action-node.tsx +53 -0
  207. package/new-ui/src/components/workflows/condition-node.tsx +50 -0
  208. package/new-ui/src/components/workflows/graph-utils.ts +124 -0
  209. package/new-ui/src/components/workflows/json-tree.tsx +189 -0
  210. package/new-ui/src/components/workflows/node-styles.ts +10 -0
  211. package/new-ui/src/components/workflows/step-detail-sheet.tsx +87 -0
  212. package/new-ui/src/components/workflows/trigger-node.tsx +41 -0
  213. package/new-ui/src/components/workflows/workflow-graph.tsx +65 -0
  214. package/{ui/src/hooks/useAutoScroll.ts → new-ui/src/hooks/use-auto-scroll.ts} +0 -1
  215. package/new-ui/src/hooks/use-config.ts +203 -0
  216. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +41 -0
  217. package/new-ui/src/hooks/use-mobile.ts +19 -0
  218. package/new-ui/src/hooks/use-theme.ts +60 -0
  219. package/new-ui/src/lib/config.ts +188 -0
  220. package/new-ui/src/lib/slugs.ts +71 -0
  221. package/{ui → new-ui}/src/lib/utils.ts +32 -0
  222. package/new-ui/src/main.tsx +11 -0
  223. package/new-ui/src/pages/agents/[id]/page.tsx +492 -0
  224. package/new-ui/src/pages/agents/page.tsx +134 -0
  225. package/new-ui/src/pages/chat/page.tsx +674 -0
  226. package/new-ui/src/pages/config/page.tsx +1109 -0
  227. package/new-ui/src/pages/dashboard/page.tsx +454 -0
  228. package/new-ui/src/pages/debug/page.tsx +275 -0
  229. package/new-ui/src/pages/epics/[id]/page.tsx +809 -0
  230. package/new-ui/src/pages/epics/page.tsx +321 -0
  231. package/new-ui/src/pages/not-found/page.tsx +18 -0
  232. package/new-ui/src/pages/repos/page.tsx +369 -0
  233. package/new-ui/src/pages/schedules/[id]/page.tsx +664 -0
  234. package/new-ui/src/pages/schedules/page.tsx +477 -0
  235. package/new-ui/src/pages/services/page.tsx +128 -0
  236. package/new-ui/src/pages/tasks/[id]/page.tsx +670 -0
  237. package/new-ui/src/pages/tasks/page.tsx +592 -0
  238. package/new-ui/src/pages/usage/page.tsx +195 -0
  239. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +363 -0
  240. package/new-ui/src/pages/workflows/[id]/page.tsx +417 -0
  241. package/new-ui/src/pages/workflows/page.tsx +266 -0
  242. package/new-ui/src/styles/ag-grid.css +36 -0
  243. package/new-ui/src/styles/globals.css +213 -0
  244. package/new-ui/test-results/.last-run.json +4 -0
  245. package/{ui/tsconfig.json → new-ui/tsconfig.app.json} +7 -4
  246. package/new-ui/tsconfig.json +4 -0
  247. package/new-ui/tsconfig.node.json +26 -0
  248. package/new-ui/vercel.json +4 -0
  249. package/new-ui/vite.config.ts +28 -0
  250. package/openapi.json +4436 -0
  251. package/package.json +31 -7
  252. package/plugin/build-pi-skills.ts +233 -0
  253. package/plugin/commands/close-issue.md +7 -3
  254. package/plugin/commands/create-pr.md +18 -12
  255. package/plugin/commands/implement-issue.md +7 -3
  256. package/plugin/commands/respond-github.md +8 -4
  257. package/plugin/commands/review-pr.md +44 -10
  258. package/plugin/commands/start-leader.md +1 -3
  259. package/plugin/commands/start-worker.md +1 -3
  260. package/plugin/commands/work-on-task.md +22 -3
  261. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  262. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  263. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  264. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  265. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  266. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  267. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  268. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  269. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  270. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  271. package/plugin/pi-skills/todos/SKILL.md +66 -0
  272. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  273. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  274. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  275. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  276. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  277. package/plugin/skills/artifacts/skill.md +71 -0
  278. package/prek.toml +75 -0
  279. package/scripts/check-db-boundary.sh +60 -0
  280. package/scripts/e2e-docker-provider.ts +820 -0
  281. package/scripts/e2e-io-schemas-test.ts +807 -0
  282. package/scripts/e2e-provider-test.ts +220 -0
  283. package/scripts/e2e-workflow-redesign.sh +229 -0
  284. package/scripts/e2e-workflow-test.sh +285 -0
  285. package/scripts/e2e-workflow-test.ts +857 -0
  286. package/scripts/generate-openapi.ts +26 -0
  287. package/scripts/measure-tool-tokens.ts +118 -0
  288. package/scripts/x402-e2e-test.ts +195 -0
  289. package/scripts/x402-test-server.ts +236 -0
  290. package/scripts/x402-testnet-e2e.ts +668 -0
  291. package/slack-manifest.json +17 -0
  292. package/src/agentmail/app.ts +65 -0
  293. package/src/agentmail/handlers.ts +207 -0
  294. package/src/agentmail/index.ts +9 -0
  295. package/src/agentmail/types.ts +51 -0
  296. package/src/artifact-sdk/browser-sdk.ts +30 -0
  297. package/src/artifact-sdk/index.ts +2 -0
  298. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  299. package/src/artifact-sdk/port.ts +12 -0
  300. package/src/artifact-sdk/server.ts +156 -0
  301. package/src/artifact-sdk/tunnel.ts +19 -0
  302. package/src/be/chunking.ts +193 -0
  303. package/src/be/db-queries/oauth.ts +90 -0
  304. package/src/be/db-queries/tracker.ts +182 -0
  305. package/src/be/db.ts +2729 -770
  306. package/src/be/embedding.ts +80 -0
  307. package/src/be/migrations/001_initial.sql +409 -0
  308. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  309. package/src/be/migrations/003_workflows.sql +51 -0
  310. package/src/be/migrations/004_workflow_source.sql +81 -0
  311. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  312. package/src/be/migrations/006_vcs_provider.sql +94 -0
  313. package/src/be/migrations/007_task_dir.sql +2 -0
  314. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  315. package/src/be/migrations/009_tracker_integration.sql +144 -0
  316. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  317. package/src/be/migrations/011_step_next_port.sql +1 -0
  318. package/src/be/migrations/012_trigger_schema.sql +1 -0
  319. package/src/be/migrations/013_task_output_schema.sql +2 -0
  320. package/src/be/migrations/runner.ts +188 -0
  321. package/src/cli.tsx +231 -299
  322. package/src/commands/artifact.ts +241 -0
  323. package/src/commands/onboard/compose-generator.ts +169 -0
  324. package/src/commands/onboard/env-generator.ts +79 -0
  325. package/src/commands/onboard/manifest.ts +37 -0
  326. package/src/commands/onboard/presets.ts +85 -0
  327. package/src/commands/onboard/service-names.ts +47 -0
  328. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  329. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  330. package/src/commands/onboard/steps/generate.tsx +154 -0
  331. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  332. package/src/commands/onboard/steps/harness.tsx +21 -0
  333. package/src/commands/onboard/steps/health-check.tsx +171 -0
  334. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  335. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  336. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  337. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  338. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  339. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  340. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  341. package/src/commands/onboard/steps/post-task.tsx +103 -0
  342. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  343. package/src/commands/onboard/steps/review.tsx +82 -0
  344. package/src/commands/onboard/steps/start.tsx +97 -0
  345. package/src/commands/onboard/templates.ts +34 -0
  346. package/src/commands/onboard/types.ts +259 -0
  347. package/src/commands/onboard.tsx +425 -0
  348. package/src/commands/runner.ts +1376 -559
  349. package/src/commands/setup.tsx +23 -38
  350. package/src/commands/shared/client-config.ts +41 -0
  351. package/src/github/app.ts +8 -0
  352. package/src/github/handlers.ts +93 -75
  353. package/src/github/index.ts +1 -0
  354. package/src/github/types.ts +1 -0
  355. package/src/gitlab/auth.ts +63 -0
  356. package/src/gitlab/handlers.ts +327 -0
  357. package/src/gitlab/index.ts +19 -0
  358. package/src/gitlab/reactions.ts +104 -0
  359. package/src/gitlab/types.ts +130 -0
  360. package/src/heartbeat/heartbeat.ts +425 -0
  361. package/src/heartbeat/index.ts +1 -0
  362. package/src/hooks/hook.ts +555 -4
  363. package/src/hooks/tool-loop-detection.test.ts +158 -0
  364. package/src/hooks/tool-loop-detection.ts +167 -0
  365. package/src/http/active-sessions.ts +172 -0
  366. package/src/http/agents.ts +328 -0
  367. package/src/http/config.ts +191 -0
  368. package/src/http/core.ts +309 -0
  369. package/src/http/db-query.ts +91 -0
  370. package/src/http/ecosystem.ts +63 -0
  371. package/src/http/epics.ts +460 -0
  372. package/src/http/index.ts +213 -0
  373. package/src/http/mcp.ts +77 -0
  374. package/src/http/memory.ts +168 -0
  375. package/src/http/openapi.ts +109 -0
  376. package/src/http/poll.ts +178 -0
  377. package/src/http/repos.ts +195 -0
  378. package/src/http/route-def.ts +123 -0
  379. package/src/http/schedules.ts +391 -0
  380. package/src/http/session-data.ts +241 -0
  381. package/src/http/stats.ts +174 -0
  382. package/src/http/tasks.ts +468 -0
  383. package/src/http/trackers/index.ts +10 -0
  384. package/src/http/trackers/linear.ts +187 -0
  385. package/src/http/types.ts +12 -0
  386. package/src/http/utils.ts +87 -0
  387. package/src/http/webhooks.ts +432 -0
  388. package/src/http/workflows.ts +522 -0
  389. package/src/http.ts +1 -1890
  390. package/src/linear/README.md +65 -0
  391. package/src/linear/app.ts +48 -0
  392. package/src/linear/client.ts +18 -0
  393. package/src/linear/index.ts +1 -0
  394. package/src/linear/oauth.ts +35 -0
  395. package/src/linear/outbound.ts +212 -0
  396. package/src/linear/sync.ts +543 -0
  397. package/src/linear/types.ts +7 -0
  398. package/src/linear/webhook.ts +104 -0
  399. package/src/oauth/README.md +66 -0
  400. package/src/oauth/index.ts +6 -0
  401. package/src/oauth/wrapper.ts +204 -0
  402. package/src/prompts/base-prompt.ts +366 -24
  403. package/src/prompts/defaults.ts +196 -0
  404. package/src/providers/claude-adapter.ts +429 -0
  405. package/src/providers/index.ts +24 -0
  406. package/src/providers/pi-mono-adapter.ts +442 -0
  407. package/src/providers/pi-mono-extension.ts +620 -0
  408. package/src/providers/pi-mono-mcp-client.ts +124 -0
  409. package/src/providers/types.ts +75 -0
  410. package/src/scheduler/scheduler.test.ts +2 -0
  411. package/src/scheduler/scheduler.ts +186 -29
  412. package/src/server.ts +82 -6
  413. package/src/slack/HEURISTICS.md +105 -0
  414. package/src/slack/actions.ts +133 -0
  415. package/src/slack/app.ts +7 -0
  416. package/src/slack/assistant.ts +115 -0
  417. package/src/slack/blocks.ts +233 -0
  418. package/src/slack/commands.ts +31 -17
  419. package/src/slack/files.ts +1 -1
  420. package/src/slack/handlers.test.ts +114 -1
  421. package/src/slack/handlers.ts +212 -52
  422. package/src/slack/responses.ts +120 -67
  423. package/src/slack/router.ts +17 -99
  424. package/src/slack/thread-buffer.ts +213 -0
  425. package/src/slack/watcher.ts +119 -4
  426. package/src/tests/agent-activity.test.ts +247 -0
  427. package/src/tests/agentmail-filters.test.ts +97 -0
  428. package/src/tests/artifact-sdk.test.ts +800 -0
  429. package/src/tests/base-prompt.test.ts +264 -0
  430. package/src/tests/build-pi-skills.test.ts +127 -0
  431. package/src/tests/claude-adapter.test.ts +126 -0
  432. package/src/tests/context-versioning.test.ts +425 -0
  433. package/src/tests/db-queries-oauth.test.ts +197 -0
  434. package/src/tests/db-queries-tracker.test.ts +230 -0
  435. package/src/tests/epics.test.ts +3 -3
  436. package/src/tests/error-tracker.test.ts +368 -0
  437. package/src/tests/fetch-resolved-env.test.ts +167 -0
  438. package/src/tests/generate-default-claude-md.test.ts +9 -1
  439. package/src/tests/generate-identity-templates.test.ts +124 -0
  440. package/src/tests/gitlab-auth.test.ts +109 -0
  441. package/src/tests/gitlab-handlers.test.ts +691 -0
  442. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  443. package/src/tests/heartbeat.test.ts +363 -0
  444. package/src/tests/http-api-integration.test.ts +1698 -0
  445. package/src/tests/linear-outbound-sync.test.ts +200 -0
  446. package/src/tests/linear-webhook.test.ts +402 -0
  447. package/src/tests/match-route.test.ts +187 -0
  448. package/src/tests/memory.test.ts +737 -0
  449. package/src/tests/migration-runner-regressions.test.ts +86 -0
  450. package/src/tests/model-control.test.ts +338 -0
  451. package/src/tests/oauth-wrapper.test.ts +147 -0
  452. package/src/tests/onboard-compose.test.ts +138 -0
  453. package/src/tests/onboard-env.test.ts +174 -0
  454. package/src/tests/onboard-manifest.test.ts +137 -0
  455. package/src/tests/pi-mono-adapter.test.ts +234 -0
  456. package/src/tests/progress-dedup.test.ts +98 -0
  457. package/src/tests/provider-adapter.test.ts +122 -0
  458. package/src/tests/provider-command-format.test.ts +98 -0
  459. package/src/tests/reload-config.test.ts +170 -0
  460. package/src/tests/runner-polling-api.test.ts +25 -20
  461. package/src/tests/scheduled-tasks.test.ts +104 -0
  462. package/src/tests/scheduler-backoff.test.ts +166 -0
  463. package/src/tests/self-improvement.test.ts +540 -0
  464. package/src/tests/session-attach.test.ts +536 -0
  465. package/src/tests/session-costs.test.ts +267 -1
  466. package/src/tests/slack-actions.test.ts +133 -0
  467. package/src/tests/slack-assistant.test.ts +136 -0
  468. package/src/tests/slack-blocks.test.ts +246 -0
  469. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  470. package/src/tests/slack-queue-offline.test.ts +174 -0
  471. package/src/tests/slack-router.test.ts +181 -0
  472. package/src/tests/slack-thread-buffer.test.ts +305 -0
  473. package/src/tests/slack-thread-followups.test.ts +298 -0
  474. package/src/tests/slack-watcher.test.ts +101 -0
  475. package/src/tests/structured-output.test.ts +311 -0
  476. package/src/tests/swarm-repos.test.ts +198 -0
  477. package/src/tests/task-cancellation.test.ts +6 -4
  478. package/src/tests/task-working-dir.test.ts +176 -0
  479. package/src/tests/template-fetch.test.ts +490 -0
  480. package/src/tests/tool-annotations.test.ts +371 -0
  481. package/src/tests/tracker-tools.test.ts +184 -0
  482. package/src/tests/update-profile-api.test.ts +143 -3
  483. package/src/tests/validation-adapters.test.ts +86 -0
  484. package/src/tests/vcs-provider.test.ts +27 -0
  485. package/src/tests/workflow-agent-task.test.ts +196 -0
  486. package/src/tests/workflow-async-v2.test.ts +386 -0
  487. package/src/tests/workflow-convergence.test.ts +541 -0
  488. package/src/tests/workflow-definition-validation.test.ts +290 -0
  489. package/src/tests/workflow-engine-v2.test.ts +691 -0
  490. package/src/tests/workflow-executors.test.ts +736 -0
  491. package/src/tests/workflow-http-v2.test.ts +599 -0
  492. package/src/tests/workflow-integration-io.test.ts +902 -0
  493. package/src/tests/workflow-io-schemas.test.ts +624 -0
  494. package/src/tests/workflow-registry.test.ts +592 -0
  495. package/src/tests/workflow-retry-v2.test.ts +401 -0
  496. package/src/tests/workflow-retry-validation.test.ts +282 -0
  497. package/src/tests/workflow-template.test.ts +288 -0
  498. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  499. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  500. package/src/tests/workflow-versions.test.ts +208 -0
  501. package/src/tests/x402-client.test.ts +117 -0
  502. package/src/tests/x402-config.test.ts +182 -0
  503. package/src/tests/x402-spending-tracker.test.ts +185 -0
  504. package/src/tools/cancel-task.ts +2 -0
  505. package/src/tools/context-diff.ts +171 -0
  506. package/src/tools/context-history.ts +138 -0
  507. package/src/tools/create-channel.ts +1 -0
  508. package/src/tools/db-query.ts +78 -0
  509. package/src/tools/delete-channel.ts +132 -0
  510. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  511. package/src/tools/epics/create-epic.ts +3 -2
  512. package/src/tools/epics/delete-epic.ts +2 -0
  513. package/src/tools/epics/get-epic-details.ts +2 -0
  514. package/src/tools/epics/list-epics.ts +2 -0
  515. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  516. package/src/tools/epics/update-epic.ts +7 -4
  517. package/src/tools/get-swarm.ts +2 -0
  518. package/src/tools/get-task-details.ts +2 -0
  519. package/src/tools/get-tasks.ts +27 -1
  520. package/src/tools/inject-learning.ts +106 -0
  521. package/src/tools/join-swarm.ts +17 -7
  522. package/src/tools/list-channels.ts +2 -0
  523. package/src/tools/list-services.ts +2 -0
  524. package/src/tools/memory-get.ts +56 -0
  525. package/src/tools/memory-search.ts +131 -0
  526. package/src/tools/my-agent-info.ts +2 -0
  527. package/src/tools/poll-task.ts +2 -20
  528. package/src/tools/post-message.ts +1 -0
  529. package/src/tools/read-messages.ts +2 -0
  530. package/src/tools/register-agentmail-inbox.ts +166 -0
  531. package/src/tools/register-service.ts +2 -0
  532. package/src/tools/schedules/create-schedule.ts +134 -24
  533. package/src/tools/schedules/delete-schedule.ts +2 -0
  534. package/src/tools/schedules/list-schedules.ts +20 -4
  535. package/src/tools/schedules/run-schedule-now.ts +1 -0
  536. package/src/tools/schedules/update-schedule.ts +49 -17
  537. package/src/tools/send-task.ts +132 -10
  538. package/src/tools/slack-download-file.ts +4 -2
  539. package/src/tools/slack-list-channels.ts +2 -0
  540. package/src/tools/slack-post.ts +2 -0
  541. package/src/tools/slack-read.ts +2 -0
  542. package/src/tools/slack-reply.ts +2 -0
  543. package/src/tools/slack-upload-file.ts +2 -0
  544. package/src/tools/store-progress.ts +187 -4
  545. package/src/tools/swarm-config/delete-config.ts +87 -0
  546. package/src/tools/swarm-config/get-config.ts +108 -0
  547. package/src/tools/swarm-config/index.ts +4 -0
  548. package/src/tools/swarm-config/list-config.ts +99 -0
  549. package/src/tools/swarm-config/set-config.ts +118 -0
  550. package/src/tools/task-action.ts +30 -5
  551. package/src/tools/task-dedup.ts +97 -0
  552. package/src/tools/tool-config.ts +117 -0
  553. package/src/tools/tracker/index.ts +6 -0
  554. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  555. package/src/tools/tracker/tracker-link-task.ts +64 -0
  556. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  557. package/src/tools/tracker/tracker-status.ts +56 -0
  558. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  559. package/src/tools/tracker/tracker-unlink.ts +41 -0
  560. package/src/tools/unregister-service.ts +2 -0
  561. package/src/tools/update-profile.ts +93 -10
  562. package/src/tools/update-service-status.ts +2 -0
  563. package/src/tools/utils.ts +10 -1
  564. package/src/tools/workflows/create-workflow.ts +111 -0
  565. package/src/tools/workflows/delete-workflow.ts +42 -0
  566. package/src/tools/workflows/get-workflow-run.ts +59 -0
  567. package/src/tools/workflows/get-workflow.ts +53 -0
  568. package/src/tools/workflows/index.ts +9 -0
  569. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  570. package/src/tools/workflows/list-workflows.ts +42 -0
  571. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  572. package/src/tools/workflows/trigger-workflow.ts +96 -0
  573. package/src/tools/workflows/update-workflow.ts +118 -0
  574. package/src/tracker/types.ts +51 -0
  575. package/src/types.ts +477 -14
  576. package/src/utils/credentials.test.ts +156 -0
  577. package/src/utils/credentials.ts +50 -0
  578. package/src/utils/error-tracker.ts +190 -0
  579. package/src/vcs/index.ts +15 -0
  580. package/src/vcs/types.ts +5 -0
  581. package/src/workflows/checkpoint.ts +121 -0
  582. package/src/workflows/cooldown.ts +28 -0
  583. package/src/workflows/definition.ts +217 -0
  584. package/src/workflows/engine.ts +554 -0
  585. package/src/workflows/event-bus.ts +29 -0
  586. package/src/workflows/executors/agent-task.ts +92 -0
  587. package/src/workflows/executors/base.ts +86 -0
  588. package/src/workflows/executors/code-match.ts +88 -0
  589. package/src/workflows/executors/index.ts +16 -0
  590. package/src/workflows/executors/notify.ts +93 -0
  591. package/src/workflows/executors/property-match.ts +104 -0
  592. package/src/workflows/executors/raw-llm.ts +83 -0
  593. package/src/workflows/executors/registry.ts +76 -0
  594. package/src/workflows/executors/script.ts +103 -0
  595. package/src/workflows/executors/validate.ts +215 -0
  596. package/src/workflows/executors/vcs.ts +58 -0
  597. package/src/workflows/index.ts +61 -0
  598. package/src/workflows/input.ts +46 -0
  599. package/src/workflows/json-schema-validator.ts +118 -0
  600. package/src/workflows/recovery.ts +139 -0
  601. package/src/workflows/resume.ts +143 -0
  602. package/src/workflows/retry-poller.ts +216 -0
  603. package/src/workflows/template.ts +74 -0
  604. package/src/workflows/templates.ts +86 -0
  605. package/src/workflows/triggers.ts +95 -0
  606. package/src/workflows/validation.ts +104 -0
  607. package/src/workflows/version.ts +42 -0
  608. package/src/x402/cli.ts +140 -0
  609. package/src/x402/client.ts +192 -0
  610. package/src/x402/config.ts +131 -0
  611. package/src/x402/index.ts +37 -0
  612. package/src/x402/openfort-signer.ts +83 -0
  613. package/src/x402/spending-tracker.ts +109 -0
  614. package/templates/community/.gitkeep +0 -0
  615. package/templates/official/coder/CLAUDE.md +49 -0
  616. package/templates/official/coder/IDENTITY.md +28 -0
  617. package/templates/official/coder/SOUL.md +43 -0
  618. package/templates/official/coder/TOOLS.md +40 -0
  619. package/templates/official/coder/config.json +23 -0
  620. package/templates/official/coder/start-up.sh +23 -0
  621. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  622. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  623. package/templates/official/content-reviewer/SOUL.md +44 -0
  624. package/templates/official/content-reviewer/TOOLS.md +37 -0
  625. package/templates/official/content-reviewer/config.json +23 -0
  626. package/templates/official/content-reviewer/start-up.sh +23 -0
  627. package/templates/official/content-strategist/CLAUDE.md +63 -0
  628. package/templates/official/content-strategist/IDENTITY.md +33 -0
  629. package/templates/official/content-strategist/SOUL.md +48 -0
  630. package/templates/official/content-strategist/TOOLS.md +47 -0
  631. package/templates/official/content-strategist/config.json +23 -0
  632. package/templates/official/content-strategist/start-up.sh +23 -0
  633. package/templates/official/content-writer/CLAUDE.md +72 -0
  634. package/templates/official/content-writer/IDENTITY.md +30 -0
  635. package/templates/official/content-writer/SOUL.md +46 -0
  636. package/templates/official/content-writer/TOOLS.md +44 -0
  637. package/templates/official/content-writer/config.json +23 -0
  638. package/templates/official/content-writer/start-up.sh +23 -0
  639. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  640. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  641. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  642. package/templates/official/forward-deployed-engineer/config.json +21 -0
  643. package/templates/official/lead/CLAUDE.md +33 -0
  644. package/templates/official/lead/IDENTITY.md +36 -0
  645. package/templates/official/lead/SOUL.md +51 -0
  646. package/templates/official/lead/config.json +22 -0
  647. package/templates/official/researcher/CLAUDE.md +46 -0
  648. package/templates/official/researcher/IDENTITY.md +28 -0
  649. package/templates/official/researcher/SOUL.md +43 -0
  650. package/templates/official/researcher/config.json +21 -0
  651. package/templates/official/reviewer/CLAUDE.md +63 -0
  652. package/templates/official/reviewer/IDENTITY.md +28 -0
  653. package/templates/official/reviewer/SOUL.md +45 -0
  654. package/templates/official/reviewer/config.json +21 -0
  655. package/templates/official/tester/CLAUDE.md +53 -0
  656. package/templates/official/tester/IDENTITY.md +28 -0
  657. package/templates/official/tester/SOUL.md +55 -0
  658. package/templates/official/tester/config.json +21 -0
  659. package/templates/schema.ts +35 -0
  660. package/templates-ui/README.md +46 -0
  661. package/templates-ui/components.json +17 -0
  662. package/templates-ui/eslint.config.mjs +18 -0
  663. package/templates-ui/next.config.ts +7 -0
  664. package/templates-ui/package.json +35 -0
  665. package/templates-ui/pnpm-lock.yaml +4571 -0
  666. package/templates-ui/postcss.config.mjs +7 -0
  667. package/templates-ui/public/file.svg +1 -0
  668. package/templates-ui/public/globe.svg +1 -0
  669. package/templates-ui/public/logo.png +0 -0
  670. package/templates-ui/public/next.svg +1 -0
  671. package/templates-ui/public/vercel.svg +1 -0
  672. package/templates-ui/public/window.svg +1 -0
  673. package/templates-ui/src/app/[category]/[name]/page.tsx +89 -0
  674. package/templates-ui/src/app/api/templates/[...slug]/route.ts +52 -0
  675. package/templates-ui/src/app/api/templates/route.ts +18 -0
  676. package/templates-ui/src/app/builder/page.tsx +37 -0
  677. package/templates-ui/src/app/globals.css +94 -0
  678. package/templates-ui/src/app/layout.tsx +79 -0
  679. package/templates-ui/src/app/page.tsx +38 -0
  680. package/templates-ui/src/app/robots.ts +11 -0
  681. package/templates-ui/src/app/sitemap.ts +31 -0
  682. package/templates-ui/src/components/compose-builder.tsx +442 -0
  683. package/templates-ui/src/components/compose-preview.tsx +117 -0
  684. package/templates-ui/src/components/file-preview.tsx +77 -0
  685. package/templates-ui/src/components/footer.tsx +40 -0
  686. package/templates-ui/src/components/header.tsx +41 -0
  687. package/templates-ui/src/components/template-card.tsx +87 -0
  688. package/templates-ui/src/components/template-detail.tsx +125 -0
  689. package/templates-ui/src/components/template-gallery.tsx +263 -0
  690. package/templates-ui/src/components/ui/badge.tsx +36 -0
  691. package/templates-ui/src/components/ui/button.tsx +57 -0
  692. package/templates-ui/src/components/ui/card.tsx +76 -0
  693. package/templates-ui/src/components/ui/separator.tsx +31 -0
  694. package/templates-ui/src/components/ui/tooltip.tsx +32 -0
  695. package/templates-ui/src/lib/compose-generator.ts +241 -0
  696. package/templates-ui/src/lib/templates.ts +137 -0
  697. package/templates-ui/src/lib/utils.ts +6 -0
  698. package/templates-ui/tsconfig.json +34 -0
  699. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +679 -0
  700. package/thoughts/research/2026-02-28-x402-payments-research.md +686 -0
  701. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +282 -0
  702. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +492 -0
  703. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +282 -0
  704. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +328 -0
  705. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +224 -0
  706. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +159 -0
  707. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +337 -0
  708. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +778 -0
  709. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +1269 -0
  710. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +411 -0
  711. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +724 -0
  712. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +443 -0
  713. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +307 -0
  714. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +803 -0
  715. package/thoughts/taras/plans/2026-02-20-env-management.md +538 -0
  716. package/thoughts/taras/plans/2026-02-20-memory-system.md +882 -0
  717. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +806 -0
  718. package/thoughts/taras/plans/2026-02-20-session-attach.md +647 -0
  719. package/thoughts/taras/plans/2026-02-20-worker-identity.md +820 -0
  720. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +768 -0
  721. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +77 -0
  722. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +543 -0
  723. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +373 -0
  724. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +512 -0
  725. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +919 -0
  726. package/thoughts/taras/plans/2026-03-09-templates-registry.md +723 -0
  727. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +371 -0
  728. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +621 -0
  729. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +61 -0
  730. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +488 -0
  731. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +644 -0
  732. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +636 -0
  733. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +444 -0
  734. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +591 -0
  735. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +446 -0
  736. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +987 -0
  737. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +403 -0
  738. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +860 -0
  739. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +899 -0
  740. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +874 -0
  741. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +723 -0
  742. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +390 -0
  743. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +594 -0
  744. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +825 -0
  745. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +393 -0
  746. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +168 -0
  747. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +230 -0
  748. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +445 -0
  749. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +375 -0
  750. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +869 -0
  751. package/thoughts/taras/research/2026-03-09-templates-registry.md +373 -0
  752. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +223 -0
  753. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +339 -0
  754. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +181 -0
  755. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +437 -0
  756. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +258 -0
  757. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +335 -0
  758. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +670 -0
  759. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +54 -0
  760. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +558 -0
  761. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +526 -0
  762. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +797 -0
  763. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +563 -0
  764. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +486 -0
  765. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +469 -0
  766. package/tsconfig.json +1 -1
  767. package/FAQ.md +0 -19
  768. package/src/tests/get-inbox-message.test.ts +0 -145
  769. package/src/tools/get-inbox-message.ts +0 -89
  770. package/src/tools/inbox-delegate.ts +0 -113
  771. package/ui/CLAUDE.md +0 -49
  772. package/ui/bun.lock +0 -771
  773. package/ui/index.html +0 -22
  774. package/ui/package-lock.json +0 -5290
  775. package/ui/package.json +0 -33
  776. package/ui/pnpm-lock.yaml +0 -3341
  777. package/ui/postcss.config.js +0 -6
  778. package/ui/src/App.tsx +0 -63
  779. package/ui/src/components/ActivityFeed.tsx +0 -440
  780. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  781. package/ui/src/components/AgentsPanel.tsx +0 -815
  782. package/ui/src/components/ChatPanel.tsx +0 -1920
  783. package/ui/src/components/ConfigModal.tsx +0 -253
  784. package/ui/src/components/Dashboard.tsx +0 -832
  785. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  786. package/ui/src/components/EpicDetailPage.tsx +0 -741
  787. package/ui/src/components/EpicsPanel.tsx +0 -566
  788. package/ui/src/components/Header.tsx +0 -160
  789. package/ui/src/components/JsonViewer.tsx +0 -171
  790. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  791. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  792. package/ui/src/components/ServicesPanel.tsx +0 -622
  793. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  794. package/ui/src/components/StatsBar.tsx +0 -321
  795. package/ui/src/components/StatusBadge.tsx +0 -168
  796. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  797. package/ui/src/components/TasksPanel.tsx +0 -614
  798. package/ui/src/components/UsageCharts.tsx +0 -216
  799. package/ui/src/components/UsageTab.tsx +0 -394
  800. package/ui/src/hooks/queries.ts +0 -353
  801. package/ui/src/index.css +0 -257
  802. package/ui/src/lib/api.ts +0 -268
  803. package/ui/src/lib/config.ts +0 -35
  804. package/ui/src/lib/contentPreview.ts +0 -208
  805. package/ui/src/lib/theme.ts +0 -214
  806. package/ui/src/main.tsx +0 -28
  807. package/ui/src/vite-env.d.ts +0 -1
  808. package/ui/tailwind.config.js +0 -37
  809. package/ui/vite.config.ts +0 -35
  810. /package/{ui → docs-site}/public/logo.png +0 -0
@@ -0,0 +1,591 @@
1
+ ---
2
+ date: 2026-03-18
3
+ author: Claude
4
+ status: completed
5
+ research: thoughts/taras/research/2026-03-18-agent-fs-integration.md
6
+ autonomy: verbose
7
+ ---
8
+
9
+ # Agent-FS Native Integration Plan
10
+
11
+ ## Overview
12
+
13
+ Integrate agent-fs (persistent, searchable filesystem for AI agents) into agent-swarm as a conditional, CLI-based storage backend. When `AGENT_FS_API_URL` is set as a global swarm config, agents register with agent-fs at boot, the lead creates a shared org/drive, and the base system prompt teaches agents to use the `agent-fs` CLI for thoughts, research, plans, and shared documents.
14
+
15
+ ## Current State Analysis
16
+
17
+ - Agents store thoughts/docs on **Archil FUSE-mounted shared disks** (`/workspace/shared/thoughts/{agentId}/`) in Docker, or **git-tracked `thoughts/` directories** in local dev
18
+ - The base system prompt (`BASE_PROMPT_FILESYSTEM` at `src/prompts/base-prompt.ts:228-304`) hardcodes `/workspace/shared/` paths
19
+ - **Zero** references to agent-fs exist in the codebase — clean namespace
20
+ - The swarm config system (`swarm_config` table, `POST /api/config` HTTP endpoint) supports global/agent/repo scopes with secrets
21
+ - Config injection flows through: `docker-entrypoint.sh` (boot) → `fetchResolvedEnv()` (per-task) → `Bun.spawn()` env
22
+ - The Docker image installs CLI tools via npm global (`@desplega.ai/wts`, `pm2`, etc.) and Claude plugins via `claude plugin add`
23
+
24
+ ### Key Discoveries:
25
+ - `POST /api/config` accepts `{scope, scopeId, key, value, isSecret, description}` for config upsert (`src/http/config.ts:144-175`)
26
+ - `getBasePrompt()` uses `process.env` indirectly — the function doesn't access it, but the static suffix is built at call time so we CAN check `process.env` there (`src/prompts/base-prompt.ts:477-509`)
27
+ - Swarm config fetch in entrypoint exports all config as env vars via `set -a` + source (`docker-entrypoint.sh:150-174`)
28
+ - The entrypoint injection point for new bootstrap logic is between config fetch (line 174) and MCP config creation (line 176)
29
+ - Claude plugins are installed at build time with `|| true` fallback (`Dockerfile.worker:88-97`)
30
+ - CLI tools install between lines 121-131 of Dockerfile.worker (after archil, before agent-swarm binary copy)
31
+
32
+ ## Desired End State
33
+
34
+ When `AGENT_FS_API_URL` is set as a global swarm config:
35
+
36
+ 1. **Every agent** auto-registers with agent-fs at first boot and stores its API key as an agent-scoped secret
37
+ 2. **The lead** creates a shared "swarm" org with a default drive and gets a task to invite workers dynamically
38
+ 3. **The system prompt** includes agent-fs CLI instructions (write, cat, search, comment) with personal and shared drive usage
39
+ 4. **Agents use `agent-fs` CLI** via Bash tool for all thoughts, research, plans, and shared documents — no longer writing to `/workspace/shared/thoughts/`
40
+ 5. **Local filesystem** continues to work for repos, artifacts, scripts, PM2 state
41
+ 6. **When `AGENT_FS_API_URL` is NOT set**, everything works exactly as before — zero behavioral change
42
+
43
+ ### Verification of End State:
44
+ - `docker exec <worker> env | grep AGENT_FS` shows both `AGENT_FS_API_URL` and `AGENT_FS_API_KEY`
45
+ - `docker exec <worker> agent-fs whoami` returns the agent's identity
46
+ - `docker exec <worker> agent-fs ls thoughts/` works on the personal drive
47
+ - `docker exec <worker> agent-fs --org <sharedOrgId> ls /` works on the shared drive
48
+ - The system prompt in a task session includes the agent-fs instructions section
49
+ - Without `AGENT_FS_API_URL`, the system prompt uses only the existing `BASE_PROMPT_FILESYSTEM`
50
+
51
+ ## Quick Verification Reference
52
+
53
+ Common commands:
54
+ - `bun run lint:fix` — Biome lint + format
55
+ - `bun run tsc:check` — TypeScript type check
56
+ - `bun test` — Unit tests
57
+ - `docker build -f Dockerfile.worker -t agent-swarm-worker:test .` — Docker build test
58
+
59
+ Key files:
60
+ - `Dockerfile.worker` — Docker image build (CLI + plugin install)
61
+ - `docker-entrypoint.sh` — Bootstrap logic (registration, shared org)
62
+ - `src/prompts/base-prompt.ts` — System prompt with agent-fs instructions
63
+ - `src/http/config.ts` — Config API (used by entrypoint for storing keys)
64
+
65
+ ## What We're NOT Doing
66
+
67
+ - **No MCP server for agent-fs** — CLI only (avoids tool bloat, research decision #4)
68
+ - **No migration of existing thoughts** — new content goes to agent-fs, existing local thoughts stay (research decision #5)
69
+ - **No dashboard UI integration** — humans access via `live.agent-fs.dev` (research decision #6)
70
+ - **No changes to runner.ts or claude-adapter.ts** — `fetchResolvedEnv()` already handles env injection
71
+ - **No changes to hook.ts** — CLAUDE.md writing is separate from base prompt
72
+ - **No template CLAUDE.md changes** — base prompt overrides template filesystem references
73
+ - **No `--drive` flag support** — single shared drive per org is sufficient (research caveat acknowledged)
74
+
75
+ ## Implementation Approach
76
+
77
+ The integration follows the same conditional pattern as Archil (`ARCHIL_MOUNT_TOKEN`): feature-flagged on `AGENT_FS_API_URL`, zero impact when absent. The entrypoint handles registration and org setup imperatively (curl calls), the base prompt conditionally includes CLI instructions, and the existing config resolution pipeline (`fetchResolvedEnv()`) handles env var propagation without code changes.
78
+
79
+ ---
80
+
81
+ ## Phase 1: Dockerfile.worker — Install agent-fs CLI + Plugin
82
+
83
+ ### Overview
84
+ Add the `agent-fs` CLI binary and Claude Code plugin to the Docker worker image. This is a prerequisite for all subsequent phases — agents need the binary available to use the CLI, and the plugin provides the skill that teaches agents CLI commands on-demand.
85
+
86
+ ### Changes Required:
87
+
88
+ #### 1. Install agent-fs CLI binary
89
+ **File**: `Dockerfile.worker`
90
+ **Where**: In the existing `npm install -g` block (lines 122-128) — combine into a single RUN layer for Docker cache efficiency
91
+ **Changes**: Add `@desplega.ai/agent-fs` to the existing npm global install:
92
+ ```dockerfile
93
+ # Install global npm tools (pinned versions for cache stability)
94
+ USER root
95
+ RUN npm install -g \
96
+ pm2@6.0.14 \
97
+ @sentry/cli@3.3.0 \
98
+ @desplega.ai/wts@0.2.2 \
99
+ @desplega.ai/localtunnel@2.2.0 \
100
+ @desplega.ai/qa-use@2.8.7 \
101
+ @desplega.ai/agent-fs@latest \
102
+ && qa-use install-deps
103
+ ```
104
+
105
+ This keeps it in a single layer with other npm globals, which is the existing Docker optimization pattern. The package is infrequently updated, so it benefits from layer caching.
106
+
107
+ #### 2. Install agent-fs Claude Code plugin
108
+ **File**: `Dockerfile.worker`
109
+ **Where**: In the existing Claude plugin marketplace block (lines 88-97) — follows the `claude plugin marketplace add` + `claude plugin install` pattern used by all other plugins
110
+ **Changes**: Add agent-fs plugin installation:
111
+ ```dockerfile
112
+ RUN mkdir -p /home/worker/.claude \
113
+ && claude plugin marketplace add desplega-ai/ai-toolbox || true \
114
+ && claude plugin install desplega@desplega-ai-toolbox --scope user || true \
115
+ && claude plugin install agent-swarm@desplega-ai-toolbox --scope user || true \
116
+ && claude plugin install wts@desplega-ai-toolbox --scope user || true \
117
+ && claude plugin marketplace add desplega-ai/qa-use || true \
118
+ && claude plugin install qa-use@desplega.ai --scope user || true \
119
+ && claude plugin marketplace add mksglu/claude-context-mode || true \
120
+ && claude plugin install context-mode@claude-context-mode --scope user || true \
121
+ && claude plugin marketplace add desplega-ai/agent-fs || true \
122
+ && claude plugin install agent-fs@desplega-ai-agent-fs --scope user || true
123
+ ```
124
+
125
+ **Note**: Plugins are installed at Docker build time (not in the entrypoint — verified: zero "plugin" references in `docker-entrypoint.sh`). The plugin provides the `agent-fs` skill (CLI reference, `skills/agent-fs/SKILL.md`) that auto-injects on relevant Bash tool calls. The plugin’s MCP server won’t be active because it’s not in `enabledMcpjsonServers` (line 107).
126
+
127
+ **Pre-requisite**: Verify the agent-fs plugin is published to the Claude Code marketplace before implementation. If not yet published, skip this step and install the skill files directly by copying them into the Docker image (from `../agent-fs/skills/agent-fs/` to `/home/worker/.claude/skills/agent-fs/`).
128
+
129
+ ### Success Criteria:
130
+
131
+ #### Automated Verification:
132
+ - [x] Docker build succeeds: `docker build -f Dockerfile.worker -t agent-swarm-worker:test .`
133
+ - [x] agent-fs binary exists in image: `docker run --rm agent-swarm-worker:test which agent-fs`
134
+ - [x] agent-fs version works: `docker run --rm agent-swarm-worker:test agent-fs --version`
135
+ - [x] Plugin installed: `docker run --rm -u worker agent-swarm-worker:test claude plugin list 2>/dev/null | grep agent-fs`
136
+
137
+ #### Manual Verification:
138
+ - [x] Docker image builds without errors or warnings related to agent-fs
139
+ - [x] The image size increase is reasonable (< 50MB)
140
+
141
+ **Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 2.
142
+
143
+ ---
144
+
145
+ ## Phase 2: docker-entrypoint.sh — Agent-fs Bootstrap (Worker Registration)
146
+
147
+ ### Overview
148
+ Add conditional agent-fs registration logic to the Docker entrypoint. When `AGENT_FS_API_URL` is in the environment (from swarm config), each agent registers with agent-fs at boot if it doesn't already have an API key. The key is stored as an agent-scoped secret via the swarm config API.
149
+
150
+ ### Changes Required:
151
+
152
+ #### 1. Agent-fs registration block
153
+ **File**: `docker-entrypoint.sh`
154
+ **Where**: After swarm config fetch (line 174), before MCP config creation (line 176)
155
+ **Changes**: Add a new conditional block:
156
+
157
+ ```bash
158
+ # === agent-fs registration ===
159
+ if [ -n "$AGENT_FS_API_URL" ] && [ -n "$AGENT_ID" ]; then
160
+ if [ -z "$AGENT_FS_API_KEY" ]; then
161
+ echo "[agent-fs] Registering with agent-fs at $AGENT_FS_API_URL..."
162
+ AF_EMAIL="${AGENT_EMAIL:-${AGENT_ID}@swarm.local}"
163
+
164
+ AF_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/auth/register" \
165
+ -H "Content-Type: application/json" \
166
+ -d "{\"email\": \"$AF_EMAIL\"}" 2>/dev/null) || true
167
+
168
+ AF_API_KEY=$(echo "$AF_RESULT" | jq -r '.apiKey // empty')
169
+
170
+ if [ -n "$AF_API_KEY" ]; then
171
+ echo "[agent-fs] Registered successfully, storing API key..."
172
+ # Store as agent-scoped secret
173
+ curl -s -X POST "${MCP_URL}/api/config" \
174
+ -H "Authorization: Bearer ${API_KEY}" \
175
+ -H "Content-Type: application/json" \
176
+ -d "{
177
+ \"scope\": \"agent\",
178
+ \"scopeId\": \"${AGENT_ID}\",
179
+ \"key\": \"AGENT_FS_API_KEY\",
180
+ \"value\": \"${AF_API_KEY}\",
181
+ \"isSecret\": true,
182
+ \"description\": \"agent-fs API key for ${AF_EMAIL}\"
183
+ }" > /dev/null 2>&1 || true
184
+
185
+ export AGENT_FS_API_KEY="$AF_API_KEY"
186
+ echo "[agent-fs] API key stored and exported"
187
+ else
188
+ echo "[agent-fs] Registration failed or already registered: $(echo "$AF_RESULT" | jq -r '.error // .message // "unknown error"')"
189
+ fi
190
+ else
191
+ echo "[agent-fs] Already registered (API key present)"
192
+ fi
193
+ fi
194
+ ```
195
+
196
+ **Key design decisions**:
197
+ - **Idempotent on restart**: The swarm config fetch at lines 150-174 runs BEFORE this block. On restart, `AGENT_FS_API_KEY` (stored as agent-scoped secret on first boot) is already loaded via `GET /api/config/resolved?agentId=...&includeSecrets=true` → exported via `set -a`. The `if [ -z "$AGENT_FS_API_KEY" ]` check sees the value and skips registration entirely.
198
+ - **Fail-safe**: Uses `|| true` and `/dev/null` redirects — agent-fs being down doesn't block the agent from booting
199
+ - **Email identity**: Uses `AGENT_EMAIL` env var if set, falls back to `{AGENT_ID}@swarm.local` (research decision #12)
200
+ - **Config storage**: Uses `POST /api/config` with `scope: "agent"` and `isSecret: true` (`src/http/config.ts:144-175`)
201
+
202
+ ### Success Criteria:
203
+
204
+ #### Automated Verification:
205
+ - [x] Entrypoint script has no syntax errors: `bash -n docker-entrypoint.sh`
206
+ - [x] Shellcheck passes on the new block: `shellcheck docker-entrypoint.sh` (warnings acceptable)
207
+
208
+ #### Manual Verification:
209
+ - [x] With `AGENT_FS_API_URL` set and agent-fs server running: worker registers and API key appears in `GET /api/config/resolved?agentId=<id>&includeSecrets=true`
210
+ - [x] With `AGENT_FS_API_URL` NOT set: no agent-fs output in boot logs
211
+ - [x] Second boot (API key already stored): logs "Already registered" and skips registration
212
+ - [x] With agent-fs server down: boot continues normally with a warning log
213
+
214
+ **Implementation Note**: This phase requires an agent-fs server running locally for manual verification. Use `AGENT_FS_HOME=/tmp/agent-fs-test agent-fs onboard -y && agent-fs daemon start` to start one. Pause for manual confirmation before proceeding.
215
+
216
+ ---
217
+
218
+ ## Phase 3: docker-entrypoint.sh — Agent-fs Bootstrap (Lead Orchestration)
219
+
220
+ ### Overview
221
+ Add lead-specific logic to create a shared org/drive in agent-fs. The lead creates the “swarm” org on first boot (if `AGENT_FS_SHARED_ORG_ID` isn’t already set), stores the org ID as a global config, and creates a task for itself to handle agent invitations dynamically (since agents may use custom `AGENT_EMAIL` values that can’t be predicted in the entrypoint).
222
+
223
+ ### Changes Required:
224
+
225
+ #### 1. Lead shared org creation
226
+ **File**: `docker-entrypoint.sh`
227
+ **Where**: Inside the agent-fs registration block from Phase 2, after the API key section, gated on `AGENT_ROLE`
228
+ **Changes**: Add lead-specific org creation logic:
229
+
230
+ ```bash
231
+ # Lead-specific: create shared org
232
+ if [ “$AGENT_ROLE” = “lead” ] && [ -n “$AGENT_FS_API_KEY” ]; then
233
+ if [ -z “$AGENT_FS_SHARED_ORG_ID” ]; then
234
+ echo “[agent-fs] Lead: Creating shared org...”
235
+ AF_ORG_RESULT=$(curl -s -X POST “${AGENT_FS_API_URL}/orgs” \
236
+ -H “Authorization: Bearer ${AGENT_FS_API_KEY}” \
237
+ -H “Content-Type: application/json” \
238
+ -d ‘{“name”: “swarm”}’ 2>/dev/null) || true
239
+
240
+ AF_SHARED_ORG_ID=$(echo “$AF_ORG_RESULT” | jq -r ‘.orgId // .id // empty’)
241
+
242
+ if [ -n “$AF_SHARED_ORG_ID” ]; then
243
+ echo “[agent-fs] Shared org created: $AF_SHARED_ORG_ID”
244
+ # Store as global config so all agents see it
245
+ curl -s -X POST “${MCP_URL}/api/config” \
246
+ -H “Authorization: Bearer ${API_KEY}” \
247
+ -H “Content-Type: application/json” \
248
+ -d “{
249
+ \”scope\”: \”global\”,
250
+ \”key\”: \”AGENT_FS_SHARED_ORG_ID\”,
251
+ \”value\”: \”${AF_SHARED_ORG_ID}\”,
252
+ \”isSecret\”: false,
253
+ \”description\”: \”agent-fs shared org ID for the swarm\”
254
+ }” > /dev/null 2>&1 || true
255
+
256
+ export AGENT_FS_SHARED_ORG_ID=”$AF_SHARED_ORG_ID”
257
+
258
+ # Create a one-time task for the lead to invite workers
259
+ # (only on first org creation — not on restart)
260
+ echo “[agent-fs] Creating invitation task for lead...”
261
+ curl -s -X POST “${MCP_URL}/api/tasks” \
262
+ -H “Authorization: Bearer ${API_KEY}” \
263
+ -H “Content-Type: application/json” \
264
+ -d “{
265
+ \”task\”: \”Invite workers to agent-fs shared org (${AGENT_FS_SHARED_ORG_ID}). For each worker: check their AGENT_EMAIL config (or default to {agentId}@swarm.local), then run: agent-fs --org ${AGENT_FS_SHARED_ORG_ID} org invite --email <worker-email> --role editor. Skip any already invited.\”,
266
+ \”agentId\”: \”${AGENT_ID}\”,
267
+ \”source\”: \”system\”
268
+ }” > /dev/null 2>&1 || true
269
+ else
270
+ echo “[agent-fs] Failed to create shared org: $(echo “$AF_ORG_RESULT” | jq -r ‘.error // .message // “unknown”’)”
271
+ fi
272
+ else
273
+ echo “[agent-fs] Shared org already exists: $AGENT_FS_SHARED_ORG_ID”
274
+ fi
275
+ fi
276
+ ```
277
+
278
+ **Key design decisions**:
279
+ - **Idempotent**: Checks `AGENT_FS_SHARED_ORG_ID` before creating — skips if already exists
280
+ - **Task-based invitations**: Instead of hardcoding invite logic in the entrypoint (which would fail for agents with custom `AGENT_EMAIL`), creates a task for the lead to handle invitations dynamically. The lead can ask each worker for their email and invite them properly.
281
+ - **One-time task**: The invitation task is created only when the org is first created (inside the `if [ -z “$AGENT_FS_SHARED_ORG_ID” ]` block), not on every restart.
282
+ - **Task API format**: Uses `POST /api/tasks` (`src/http/tasks.ts:46-68`) with body `{task, agentId, source}` — where `task` is the only required field.
283
+ - **Fail-safe**: All curl calls have `|| true` — agent-fs issues don’t prevent boot
284
+ - **Role check**: Uses `$AGENT_ROLE` env var (set in Dockerfile at line 165, default `worker`). The lead container passes `-e AGENT_ROLE=lead` at `docker run` time.
285
+
286
+ ### Success Criteria:
287
+
288
+ #### Automated Verification:
289
+ - [x] Entrypoint script has no syntax errors: `bash -n docker-entrypoint.sh`
290
+
291
+ #### Manual Verification:
292
+ - [x] Lead boot with agent-fs: shared org created, `AGENT_FS_SHARED_ORG_ID` appears in global config
293
+ - [x] Second lead boot: logs “Shared org already exists” and skips creation
294
+ - [x] Invitation task created for the lead in the task queue
295
+ - [x] Lead boot without agent-fs: no agent-fs output in logs
296
+
297
+ **Implementation Note**: Test with the full E2E Docker setup (API + lead + worker containers). Pause for manual confirmation before proceeding.
298
+
299
+ ---
300
+
301
+ ## Phase 4: base-prompt.ts — Conditional Agent-fs Instructions
302
+
303
+ ### Overview
304
+ Add a new `BASE_PROMPT_AGENT_FS` constant with CLI usage instructions and conditionally include it in the system prompt when `process.env.AGENT_FS_API_URL` is set. This replaces the local filesystem instructions for thoughts/docs while keeping the existing `BASE_PROMPT_FILESYSTEM` for general workspace guidance.
305
+
306
+ ### Changes Required:
307
+
308
+ #### 1. New agent-fs prompt constant
309
+ **File**: `src/prompts/base-prompt.ts`
310
+ **Where**: After `BASE_PROMPT_FILESYSTEM` definition (after line 304)
311
+ **Changes**: Add new constant:
312
+
313
+ ```typescript
314
+ const BASE_PROMPT_AGENT_FS = `
315
+ ## Agent Filesystem (agent-fs)
316
+
317
+ You have access to agent-fs — a persistent, searchable filesystem shared across the swarm.
318
+ Use the \`agent-fs\` CLI for all thoughts, research, plans, and shared documents.
319
+
320
+ The \`agent-fs\` skill (from the agent-fs Claude Code plugin) provides a full CLI reference —
321
+ it auto-injects on relevant Bash tool calls. You can also run \`agent-fs docs\` for
322
+ interactive CLI documentation.
323
+
324
+ ### Writing to your personal drive (default)
325
+ \`\`\`bash
326
+ agent-fs write thoughts/research/YYYY-MM-DD-topic.md --content "..." -m "description"
327
+ echo "content" | agent-fs write thoughts/plans/YYYY-MM-DD-topic.md -m "description"
328
+ \`\`\`
329
+
330
+ ### Writing to the shared drive
331
+ Use the same directory structure as the personal drive, namespaced by your agent ID:
332
+ \`\`\`bash
333
+ # Structured files: thoughts/{agentId}/{type}/YYYY-MM-DD-name.md
334
+ agent-fs --org {sharedOrgId} write thoughts/{agentId}/research/YYYY-MM-DD-topic.md --content "..." -m "research findings"
335
+ agent-fs --org {sharedOrgId} write thoughts/{agentId}/plans/YYYY-MM-DD-topic.md --content "..." -m "implementation plan"
336
+
337
+ # Random/misc files: misc/{agentId}/name.ext
338
+ agent-fs --org {sharedOrgId} write misc/{agentId}/notes.md --content "..." -m "misc notes"
339
+
340
+ # Shared documents (not agent-namespaced): docs/name.md
341
+ agent-fs --org {sharedOrgId} write docs/shared-report.md --content "..." -m "for team review"
342
+ \`\`\`
343
+
344
+ ### Reading and searching
345
+ \`\`\`bash
346
+ agent-fs cat thoughts/research/2026-03-18-topic.md
347
+ agent-fs fts "authentication" # keyword search across all files
348
+ agent-fs search "how does auth work" # semantic search
349
+ agent-fs ls thoughts/research/ # list files
350
+ agent-fs docs # interactive CLI documentation
351
+ \`\`\`
352
+
353
+ ### Comments (for human-agent collaboration)
354
+ \`\`\`bash
355
+ agent-fs comment add docs/spec.md --body "Needs clarification on auth flow"
356
+ agent-fs comment list docs/spec.md
357
+ \`\`\`
358
+
359
+ Key conventions:
360
+ - **Personal drive**: thoughts/{type}/YYYY-MM-DD-topic.md (plans, research, brainstorms)
361
+ - **Shared drive**: thoughts/{agentId}/{type}/YYYY-MM-DD-topic.md (same structure, namespaced by your ID)
362
+ - **Misc files**: misc/{agentId}/name.ext (shared drive) or misc/name.ext (personal drive)
363
+ - Add version messages (-m) to writes for auditability
364
+ - All CLI output is JSON — parse it
365
+ - Use the shared drive (--org) for documents humans or other agents should review
366
+ - Run \`agent-fs docs\` if you need help with any command
367
+
368
+ Do NOT use the local filesystem (/workspace/shared/thoughts/) for thoughts or shared docs
369
+ when agent-fs is available. Local filesystem is still used for: repos, artifacts, scripts,
370
+ and any non-thought data.
371
+ `;
372
+ ```
373
+
374
+ #### 2. Conditional injection in getBasePrompt()
375
+ **File**: `src/prompts/base-prompt.ts`
376
+ **Where**: In the static suffix construction (line 486)
377
+ **Changes**: After the `BASE_PROMPT_FILESYSTEM` injection (line 486), add conditional agent-fs section:
378
+
379
+ ```typescript
380
+ // Always include base filesystem instructions
381
+ staticSuffix += BASE_PROMPT_FILESYSTEM.replaceAll("{agentId}", agentId);
382
+
383
+ // Conditionally include agent-fs instructions when available
384
+ if (process.env.AGENT_FS_API_URL) {
385
+ const sharedOrgId = process.env.AGENT_FS_SHARED_ORG_ID || "YOUR_SHARED_ORG_ID";
386
+ staticSuffix += BASE_PROMPT_AGENT_FS
387
+ .replaceAll("{agentId}", agentId)
388
+ .replaceAll("{sharedOrgId}", sharedOrgId);
389
+ }
390
+ ```
391
+
392
+ #### 3. Keep `process.env` in sync with resolved config
393
+ **File**: `src/commands/runner.ts`
394
+ **Where**: Inside `spawnProviderProcess()`, after `fetchResolvedEnv()` (line 1155), before `buildSystemPrompt()` is called
395
+ **Changes**: Propagate agent-fs config values from the resolved env back to `process.env` so that `getBasePrompt()` can read them:
396
+
397
+ ```typescript
398
+ const freshEnv = await fetchResolvedEnv(opts.apiUrl, opts.apiKey, opts.agentId);
399
+
400
+ // Propagate agent-fs config to process.env so getBasePrompt() can read them
401
+ // (fetchResolvedEnv returns a new object, doesn't update process.env)
402
+ if (freshEnv.AGENT_FS_SHARED_ORG_ID) {
403
+ process.env.AGENT_FS_SHARED_ORG_ID = freshEnv.AGENT_FS_SHARED_ORG_ID;
404
+ }
405
+ ```
406
+
407
+ **Note**: `buildSystemPrompt()` is called independently of `fetchResolvedEnv()` — they don't share state. Without this propagation, workers that boot before the lead creates the shared org would never see the org ID in the prompt (even though `fetchResolvedEnv()` picks it up per-task). This is a targeted update — only `AGENT_FS_SHARED_ORG_ID` is propagated, not the full env.
408
+
409
+ **Key design decisions**:
410
+ - **Additive, not replacing**: Both `BASE_PROMPT_FILESYSTEM` (local paths) and `BASE_PROMPT_AGENT_FS` are included — the agent-fs section says "do NOT use local filesystem for thoughts" which overrides the local paths for that specific use case
411
+ - **`process.env` kept in sync**: `AGENT_FS_API_URL` is available at boot from the entrypoint's `set -a` export. `AGENT_FS_SHARED_ORG_ID` is propagated from the resolved env per-task to handle the case where the lead creates the org after the worker starts.
412
+ - **Shared org fallback**: If `AGENT_FS_SHARED_ORG_ID` isn't available yet, a `"YOUR_SHARED_ORG_ID"` placeholder is shown. On the next task, the resolved env picks it up and propagates it to `process.env`.
413
+
414
+ ### Success Criteria:
415
+
416
+ #### Automated Verification:
417
+ - [x] TypeScript compiles: `bun run tsc:check`
418
+ - [x] Linting passes: `bun run lint:fix`
419
+ - [x] Existing tests pass: `bun test`
420
+
421
+ #### Manual Verification:
422
+ - [x] With `AGENT_FS_API_URL` set in env: `getBasePrompt()` output includes "Agent Filesystem (agent-fs)" section
423
+ - [x] Without `AGENT_FS_API_URL`: `getBasePrompt()` output does NOT include agent-fs section
424
+ - [x] The `{agentId}` placeholder is correctly replaced in agent-fs section
425
+ - [x] The `{sharedOrgId}` placeholder is correctly replaced with the org ID or fallback
426
+
427
+ **Implementation Note**: Write a simple test or script to verify the prompt conditional. Pause for manual confirmation before proceeding.
428
+
429
+ ---
430
+
431
+ ## Phase 5: E2E Verification
432
+
433
+ ### Overview
434
+ Full end-to-end test of the integration with Docker containers and a local agent-fs server. Verify the complete flow: agent-fs server → Docker build → lead registration + shared org → worker registration → prompt injection → CLI operations from within a container.
435
+
436
+ ### Test Setup:
437
+
438
+ ```bash
439
+ # 1. Start a local agent-fs daemon (agent-fs CLI is already installed)
440
+ export AGENT_FS_HOME=/tmp/agent-fs-e2e
441
+ agent-fs onboard -y # sets up local MinIO + DB
442
+ agent-fs daemon start # starts the API daemon
443
+ AF_PORT=$(agent-fs daemon status --json | jq -r '.port // 7433')
444
+ AF_URL="http://host.docker.internal:${AF_PORT}"
445
+
446
+ # 2. Clean DB for fresh state
447
+ rm -f agent-swarm-db.sqlite agent-swarm-db.sqlite-wal agent-swarm-db.sqlite-shm
448
+
449
+ # 3. Start API server
450
+ bun run start:http &
451
+
452
+ # 4. Set AGENT_FS_API_URL as global swarm config
453
+ curl -X POST "http://localhost:3013/api/config" \
454
+ -H "Authorization: Bearer 123123" \
455
+ -H "Content-Type: application/json" \
456
+ -d "{\"scope\":\"global\",\"key\":\"AGENT_FS_API_URL\",\"value\":\"$AF_URL\",\"isSecret\":false,\"description\":\"agent-fs server URL\"}"
457
+
458
+ # 5. Build Docker image
459
+ docker build -f Dockerfile.worker -t agent-swarm-worker:test .
460
+
461
+ # 6. Start lead container
462
+ docker run --rm -d \
463
+ --name e2e-test-lead \
464
+ --env-file .env.docker-lead \
465
+ -e AGENT_ROLE=lead \
466
+ -e MAX_CONCURRENT_TASKS=1 \
467
+ -p 3201:3000 \
468
+ agent-swarm-worker:test
469
+
470
+ # 7. Start worker container
471
+ docker run --rm -d \
472
+ --name e2e-test-worker \
473
+ --env-file .env.docker \
474
+ -e MAX_CONCURRENT_TASKS=1 \
475
+ -p 3203:3000 \
476
+ agent-swarm-worker:test
477
+ ```
478
+
479
+ ### Verification Checklist:
480
+
481
+ #### Automated Verification:
482
+ - [x] Lead registered with agent-fs: `docker logs e2e-test-lead 2>&1 | grep "agent-fs.*Registered"`
483
+ - [x] Lead created shared org: `docker logs e2e-test-lead 2>&1 | grep "Shared org created"`
484
+ - [x] Worker registered with agent-fs: `docker logs e2e-test-worker 2>&1 | grep "agent-fs.*Registered"`
485
+ - [x] API keys stored in config: `curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?scope=agent&includeSecrets=true" | jq '.configs[] | select(.key=="AGENT_FS_API_KEY")'`
486
+ - [x] Shared org ID in global config: `curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?scope=global" | jq '.configs[] | select(.key=="AGENT_FS_SHARED_ORG_ID")'`
487
+
488
+ #### Manual Verification:
489
+ - [x] Worker can use agent-fs CLI: `docker exec e2e-test-worker agent-fs whoami`
490
+ - [x] Worker can write to personal drive: `docker exec e2e-test-worker agent-fs write test.md --content "hello" -m "test"`
491
+ - [x] Worker can read from personal drive: `docker exec e2e-test-worker agent-fs cat test.md`
492
+ - [x] Worker can write to shared drive: `docker exec e2e-test-worker bash -c 'agent-fs --org $AGENT_FS_SHARED_ORG_ID write shared-test.md --content "shared" -m "test"'`
493
+ - [x] Create a trivial task and verify the system prompt includes "Agent Filesystem" section
494
+ - [x] Without `AGENT_FS_API_URL`: system prompt does NOT include agent-fs section
495
+
496
+ #### Cleanup:
497
+ ```bash
498
+ docker stop e2e-test-lead e2e-test-worker
499
+ kill $(lsof -ti :3013)
500
+ agent-fs daemon stop
501
+ rm -rf /tmp/agent-fs-e2e
502
+ ```
503
+
504
+ **Implementation Note**: This phase is verification-only, no code changes. If issues are found, fix them in the relevant phase and re-verify.
505
+
506
+ ---
507
+
508
+ ## Testing Strategy
509
+
510
+ ### Unit Tests
511
+ - Add a test for `getBasePrompt()` that verifies agent-fs section inclusion is conditional on `process.env.AGENT_FS_API_URL`
512
+ - Test both with and without the env var set
513
+ - Verify placeholder replacement for `{agentId}` and `{sharedOrgId}`
514
+
515
+ ### Integration Tests
516
+ - Docker build test (CI already does this via merge gate)
517
+ - Entrypoint script syntax check (`bash -n`)
518
+
519
+ ### E2E Tests
520
+ - Full Docker flow as described in Phase 5
521
+ - Test idempotency: second boot should skip registration
522
+ - Test failure mode: agent-fs server down during boot should not block agent startup
523
+
524
+ ## Manual E2E Commands
525
+
526
+ ```bash
527
+ # After full implementation, run these commands to verify:
528
+
529
+ # 0. Start a local agent-fs daemon (agent-fs CLI is already installed)
530
+ export AGENT_FS_HOME=/tmp/agent-fs-e2e
531
+ agent-fs onboard -y # sets up local MinIO + DB
532
+ agent-fs daemon start # starts the API daemon
533
+ AF_PORT=$(agent-fs daemon status --json | jq -r ‘.port // 7433’)
534
+ AF_URL="http://host.docker.internal:${AF_PORT}"
535
+
536
+ # 1. Start the agent-swarm API server
537
+ bun run start:http &
538
+
539
+ # 2. Set AGENT_FS_API_URL as global swarm config
540
+ curl -X POST "http://localhost:3013/api/config" \
541
+ -H "Authorization: Bearer 123123" \
542
+ -H "Content-Type: application/json" \
543
+ -d "{\"scope\":\"global\",\"key\":\"AGENT_FS_API_URL\",\"value\":\"${AF_URL}\",\"isSecret\":false}"
544
+
545
+ # 3. Build and start containers
546
+ docker build -f Dockerfile.worker -t agent-swarm-worker:test .
547
+ docker run --rm -d --name e2e-lead --env-file .env.docker-lead -e AGENT_ROLE=lead -p 3201:3000 agent-swarm-worker:test
548
+ docker run --rm -d --name e2e-worker --env-file .env.docker -p 3203:3000 agent-swarm-worker:test
549
+
550
+ # 4. Verify registration
551
+ curl -s -H "Authorization: Bearer 123123" "http://localhost:3013/api/config?includeSecrets=true" | jq ‘.configs[] | select(.key | startswith("AGENT_FS"))’
552
+
553
+ # 5. Verify CLI works inside container
554
+ docker exec e2e-worker agent-fs whoami
555
+ docker exec e2e-worker agent-fs write hello.md --content "hello world" -m "test"
556
+ docker exec e2e-worker agent-fs cat hello.md
557
+
558
+ # 6. Verify prompt
559
+ docker exec e2e-worker env | grep AGENT_FS
560
+
561
+ # 7. Cleanup
562
+ docker stop e2e-lead e2e-worker
563
+ kill $(lsof -ti :3013)
564
+ agent-fs daemon stop
565
+ rm -rf /tmp/agent-fs-e2e
566
+ ```
567
+
568
+ ## References
569
+
570
+ - Research document: `thoughts/taras/research/2026-03-18-agent-fs-integration.md`
571
+ - agent-fs codebase: `../agent-fs`
572
+ - Resolved decisions: 13 decisions in research doc (CLI over MCP, self-registration, shared org model, email identity, etc.)
573
+
574
+ ---
575
+
576
+ ## Review Errata
577
+
578
+ _Reviewed: 2026-03-18 by Claude (automated structural + content + codebase verification)_
579
+
580
+ ### Important
581
+
582
+ _(All items addressed in plan update)_
583
+
584
+ ### Resolved
585
+
586
+ - [x] **`process.env` gap for `AGENT_FS_SHARED_ORG_ID`** — Added Phase 4 change #3: propagate from resolved env to `process.env` in `spawnProviderProcess()`
587
+ - [x] **Task API body format** — Fixed Phase 3 curl body to use `{task, agentId, source}` per `src/http/tasks.ts:46-68`
588
+ - [x] **Duplicate invitation tasks on restart** — Moved task creation inside `if [ -z "$AGENT_FS_SHARED_ORG_ID" ]` block
589
+ - [x] **No version pin** — Changed to `@desplega.ai/agent-fs@latest` (pin specific version during implementation)
590
+ - [x] **Plugin marketplace name unverified** — Added fallback: copy skill files directly if not on marketplace
591
+ - [x] Frontmatter uses `author` instead of `planner` — acceptable for this project's conventions