@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
@@ -1,10 +1,21 @@
1
1
  #!/bin/bash
2
2
  set -e
3
3
 
4
- # Validate required environment variables
5
- if [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then
6
- echo "Error: CLAUDE_CODE_OAUTH_TOKEN environment variable is required"
7
- exit 1
4
+ # Validate required environment variables based on provider
5
+ HARNESS_PROVIDER="${HARNESS_PROVIDER:-claude}"
6
+
7
+ if [ "$HARNESS_PROVIDER" = "pi" ]; then
8
+ # Pi-mono auth: ANTHROPIC_API_KEY, OPENROUTER_API_KEY, or auth.json must exist
9
+ if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$OPENROUTER_API_KEY" ] && [ ! -f "$HOME/.pi/agent/auth.json" ]; then
10
+ echo "Error: ANTHROPIC_API_KEY, OPENROUTER_API_KEY, or ~/.pi/agent/auth.json required for pi provider"
11
+ exit 1
12
+ fi
13
+ else
14
+ # Claude auth (default)
15
+ if [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then
16
+ echo "Error: CLAUDE_CODE_OAUTH_TOKEN environment variable is required"
17
+ exit 1
18
+ fi
8
19
  fi
9
20
 
10
21
  if [ -z "$API_KEY" ]; then
@@ -12,6 +23,50 @@ if [ -z "$API_KEY" ]; then
12
23
  exit 1
13
24
  fi
14
25
 
26
+ # ---- Archil disk mounts ----
27
+ # Skipped when ARCHIL_MOUNT_TOKEN is not set (local dev / environments without Archil)
28
+ if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
29
+ echo ""
30
+ echo "=== Archil Mount ==="
31
+
32
+ # Ensure /dev/fuse exists (needed in some VM environments like Fly.io Firecracker)
33
+ if [ ! -e /dev/fuse ]; then
34
+ mknod /dev/fuse c 10 229
35
+ chmod 666 /dev/fuse
36
+ fi
37
+
38
+ if [ -n "$ARCHIL_SHARED_DISK_NAME" ]; then
39
+ echo "Mounting shared disk ($ARCHIL_SHARED_DISK_NAME) at /workspace/shared..."
40
+ archil mount --shared "$ARCHIL_SHARED_DISK_NAME" /workspace/shared --region "$ARCHIL_REGION"
41
+ fi
42
+
43
+ # NOTE: Top-level shared directory pre-creation (thoughts/, memory/, etc.)
44
+ # lives in api-entrypoint.sh, not here. The API boots first and creates
45
+ # them so workers' mkdir auto-grants delegation at the subdir level.
46
+
47
+ if [ -n "$ARCHIL_PERSONAL_DISK_NAME" ]; then
48
+ echo "Mounting personal disk ($ARCHIL_PERSONAL_DISK_NAME) at /workspace/personal..."
49
+ # --force reclaims stale delegations from previous machine incarnations.
50
+ # Personal disks are always single-client, so force is safe.
51
+ # archil mount requires root — entrypoint runs as root (USER root in Dockerfile).
52
+ archil mount --force "$ARCHIL_PERSONAL_DISK_NAME" /workspace/personal --region "$ARCHIL_REGION"
53
+ # Brief pause for FUSE daemon to finish --force re-negotiation
54
+ sleep 1
55
+ fi
56
+ echo "===================="
57
+ fi
58
+ # ---- End Archil mount ----
59
+
60
+ # Create personal workspace subdirectories (after FUSE mount, since Archil
61
+ # requires empty mount points — these dirs can't exist at build time).
62
+ # Personal disk is exclusive (rw), so this always succeeds.
63
+ # NOTE: Shared disk subdirectories are created per-agent below (see
64
+ # "Setting up per-agent directories" block), NOT here.
65
+ mkdir -p /workspace/personal/memory 2>/dev/null || true
66
+ # chown individual dirs (not -R) to avoid EPERM on .archil system files
67
+ chown worker:worker /workspace/personal 2>/dev/null || true
68
+ chown worker:worker /workspace/personal/memory 2>/dev/null || true
69
+
15
70
  # Role defaults to worker, can be set to "lead"
16
71
  ROLE="${AGENT_ROLE:-worker}"
17
72
  MCP_URL="${MCP_BASE_URL:-http://host.docker.internal:3013}"
@@ -28,6 +83,7 @@ fi
28
83
 
29
84
  echo "=== Agent Swarm ${ROLE^} v${VERSION} ==="
30
85
  echo "Agent ID: ${AGENT_ID:-<not set>}"
86
+ echo "Harness Provider: $HARNESS_PROVIDER"
31
87
  echo "MCP Base URL: $MCP_URL"
32
88
  echo "YOLO Mode: $YOLO_MODE"
33
89
  echo "Session ID: ${SESSION_ID:-<auto-generated>}"
@@ -80,44 +136,148 @@ echo "=========================="
80
136
  # Cleanup function for graceful shutdown
81
137
  cleanup() {
82
138
  echo ""
139
+ # Unmount Archil disks (flushes pending data to backing store)
140
+ if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
141
+ echo "Unmounting Archil disks..."
142
+ archil unmount /workspace/shared 2>/dev/null || true
143
+ archil unmount /workspace/personal 2>/dev/null || true
144
+ fi
83
145
  echo "Shutting down PM2 processes..."
84
146
  pm2 kill 2>/dev/null || true
85
147
  }
86
148
  trap cleanup EXIT SIGINT SIGTERM
87
149
 
150
+ # ---- Fetch swarm config from API ----
151
+ if [ -n "$AGENT_ID" ]; then
152
+ echo "Fetching swarm config from API..."
153
+ if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
154
+ -H "X-Agent-ID: ${AGENT_ID}" \
155
+ "${MCP_URL}/api/config/resolved?agentId=${AGENT_ID}&includeSecrets=true" \
156
+ > /tmp/swarm_config.json 2>/dev/null; then
157
+
158
+ CONFIG_COUNT=$(jq '.configs | length' /tmp/swarm_config.json 2>/dev/null || echo "0")
159
+ if [ "$CONFIG_COUNT" -gt 0 ]; then
160
+ echo "Found $CONFIG_COUNT config entries, exporting as env vars..."
161
+ jq -r '.configs[] | "\(.key)=" + (.value | @sh)' /tmp/swarm_config.json > /tmp/swarm_config.env 2>/dev/null || true
162
+ if [ -f /tmp/swarm_config.env ]; then
163
+ set -a
164
+ . /tmp/swarm_config.env
165
+ set +a
166
+ rm -f /tmp/swarm_config.env
167
+ fi
168
+ fi
169
+ rm -f /tmp/swarm_config.json
170
+ else
171
+ echo "Warning: Could not fetch swarm config (API may not be ready)"
172
+ fi
173
+ fi
174
+ # ---- End swarm config fetch ----
175
+
176
+ # ---- agent-fs registration ----
177
+ if [ -n "$AGENT_FS_API_URL" ] && [ -n "$AGENT_ID" ]; then
178
+ if [ -z "$AGENT_FS_API_KEY" ]; then
179
+ echo "[agent-fs] Registering with agent-fs at $AGENT_FS_API_URL..."
180
+ AF_EMAIL="${AGENT_EMAIL:-${AGENT_ID}@swarm.local}"
181
+
182
+ AF_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/auth/register" \
183
+ -H "Content-Type: application/json" \
184
+ -d "{\"email\": \"$AF_EMAIL\"}" 2>/dev/null) || true
185
+
186
+ AF_API_KEY=$(echo "$AF_RESULT" | jq -r '.apiKey // empty')
187
+
188
+ if [ -n "$AF_API_KEY" ]; then
189
+ echo "[agent-fs] Registered successfully, storing API key..."
190
+ # Store as agent-scoped secret
191
+ curl -s -X PUT "${MCP_URL}/api/config" \
192
+ -H "Authorization: Bearer ${API_KEY}" \
193
+ -H "Content-Type: application/json" \
194
+ -d "{
195
+ \"scope\": \"agent\",
196
+ \"scopeId\": \"${AGENT_ID}\",
197
+ \"key\": \"AGENT_FS_API_KEY\",
198
+ \"value\": \"${AF_API_KEY}\",
199
+ \"isSecret\": true,
200
+ \"description\": \"agent-fs API key for ${AF_EMAIL}\"
201
+ }" > /dev/null 2>&1 || true
202
+
203
+ export AGENT_FS_API_KEY="$AF_API_KEY"
204
+ echo "[agent-fs] API key stored and exported"
205
+ else
206
+ echo "[agent-fs] Registration failed or already registered: $(echo "$AF_RESULT" | jq -r '.error // .message // "unknown error"')"
207
+ fi
208
+ else
209
+ echo "[agent-fs] Already registered (API key present)"
210
+ fi
211
+
212
+ # Lead-specific: create shared org
213
+ if [ "$AGENT_ROLE" = "lead" ] && [ -n "$AGENT_FS_API_KEY" ]; then
214
+ if [ -z "$AGENT_FS_SHARED_ORG_ID" ]; then
215
+ echo "[agent-fs] Lead: Creating shared org..."
216
+ AF_ORG_RESULT=$(curl -s -X POST "${AGENT_FS_API_URL}/orgs" \
217
+ -H "Authorization: Bearer ${AGENT_FS_API_KEY}" \
218
+ -H "Content-Type: application/json" \
219
+ -d '{"name": "swarm"}' 2>/dev/null) || true
220
+
221
+ AF_SHARED_ORG_ID=$(echo "$AF_ORG_RESULT" | jq -r '.orgId // .id // empty')
222
+
223
+ if [ -n "$AF_SHARED_ORG_ID" ]; then
224
+ echo "[agent-fs] Shared org created: $AF_SHARED_ORG_ID"
225
+ # Store as global config so all agents see it
226
+ curl -s -X PUT "${MCP_URL}/api/config" \
227
+ -H "Authorization: Bearer ${API_KEY}" \
228
+ -H "Content-Type: application/json" \
229
+ -d "{
230
+ \"scope\": \"global\",
231
+ \"key\": \"AGENT_FS_SHARED_ORG_ID\",
232
+ \"value\": \"${AF_SHARED_ORG_ID}\",
233
+ \"isSecret\": false,
234
+ \"description\": \"agent-fs shared org ID for the swarm\"
235
+ }" > /dev/null 2>&1 || true
236
+
237
+ export AGENT_FS_SHARED_ORG_ID="$AF_SHARED_ORG_ID"
238
+
239
+ # Create a one-time task for the lead to invite workers
240
+ echo "[agent-fs] Creating invitation task for lead..."
241
+ curl -s -X POST "${MCP_URL}/api/tasks" \
242
+ -H "Authorization: Bearer ${API_KEY}" \
243
+ -H "Content-Type: application/json" \
244
+ -d "{
245
+ \"task\": \"Invite workers to agent-fs shared org (${AF_SHARED_ORG_ID}). For each worker: check their AGENT_EMAIL config (or default to {agentId}@swarm.local), then run: agent-fs --org ${AF_SHARED_ORG_ID} org invite --email <worker-email> --role editor. Skip any already invited.\",
246
+ \"agentId\": \"${AGENT_ID}\",
247
+ \"source\": \"system\"
248
+ }" > /dev/null 2>&1 || true
249
+ else
250
+ echo "[agent-fs] Failed to create shared org: $(echo "$AF_ORG_RESULT" | jq -r '.error // .message // "unknown"')"
251
+ fi
252
+ else
253
+ echo "[agent-fs] Shared org already exists: $AGENT_FS_SHARED_ORG_ID"
254
+ fi
255
+ fi
256
+ fi
257
+ # ---- End agent-fs registration ----
258
+
88
259
  # Create .mcp.json in /workspace (project-level config)
89
260
  echo "Creating MCP config in /workspace..."
261
+ # Build base MCP config with jq
262
+ MCP_JSON=$(jq -n \
263
+ --arg url "${MCP_URL}/mcp" \
264
+ --arg apiKey "Bearer ${API_KEY}" \
265
+ '{mcpServers: {"agent-swarm": {type: "http", url: $url, headers: {Authorization: $apiKey}}}}')
266
+
267
+ # Add X-Agent-ID header if set
90
268
  if [ -n "$AGENT_ID" ]; then
91
- cat > /workspace/.mcp.json << EOF
92
- {
93
- "mcpServers": {
94
- "agent-swarm": {
95
- "type": "http",
96
- "url": "${MCP_URL}/mcp",
97
- "headers": {
98
- "Authorization": "Bearer ${API_KEY}",
99
- "X-Agent-ID": "${AGENT_ID}"
100
- }
101
- }
102
- }
103
- }
104
- EOF
105
- else
106
- cat > /workspace/.mcp.json << EOF
107
- {
108
- "mcpServers": {
109
- "agent-swarm": {
110
- "type": "http",
111
- "url": "${MCP_URL}/mcp",
112
- "headers": {
113
- "Authorization": "Bearer ${API_KEY}"
114
- }
115
- }
116
- }
117
- }
118
- EOF
269
+ MCP_JSON=$(echo "$MCP_JSON" | jq --arg agentId "$AGENT_ID" \
270
+ '.mcpServers["agent-swarm"].headers["X-Agent-ID"] = $agentId')
271
+ fi
272
+
273
+ # Add agentmail-mcp if API key is present
274
+ if [ -n "$AGENTMAIL_API_KEY" ]; then
275
+ MCP_JSON=$(echo "$MCP_JSON" | jq --arg key "$AGENTMAIL_API_KEY" \
276
+ '.mcpServers.agentmail = {command: "npx", args: ["-y", "agentmail-mcp"], env: {AGENTMAIL_API_KEY: $key}}')
119
277
  fi
120
278
 
279
+ echo "$MCP_JSON" > /workspace/.mcp.json
280
+
121
281
  # Configure GitHub authentication if token is provided
122
282
  echo ""
123
283
  echo "=== GitHub Authentication ==="
@@ -137,67 +297,162 @@ if [ -n "$GITHUB_TOKEN" ]; then
137
297
  echo "GitHub authentication configured successfully"
138
298
  echo "Git user: $GIT_NAME <$GIT_EMAIL>"
139
299
  else
140
- echo "WARNING: GITHUB_TOKEN not set - git push operations will fail"
300
+ echo "WARNING: GITHUB_TOKEN not set - GitHub git push operations will fail"
141
301
  fi
142
302
  echo "=============================="
143
303
 
144
- # Install the desplega-ai marketplace
304
+ # Configure GitLab authentication if token is provided
145
305
  echo ""
146
- echo "=== Marketplace Installation ==="
147
-
148
- if command -v claude >/dev/null 2>&1; then
149
- echo "Installing desplega-ai/ai-toolbox marketplace..."
150
- claude plugin marketplace add desplega-ai/ai-toolbox || echo "Toolbox marketplace add failed, continuing..."
151
-
152
- echo "Installing plugins from desplega-ai-toolbox..."
153
- claude plugin install desplega@desplega-ai-toolbox --scope user || echo "Plugin install failed, continuing..."
154
- claude plugin install agent-swarm@desplega-ai-toolbox --scope user || echo "Plugin install failed, continuing..."
155
- claude plugin install wts@desplega-ai-toolbox --scope user || echo "Plugin install failed, continuing..."
156
-
157
- echo "Installing desplega-ai/qa-use marketplace..."
158
- claude plugin marketplace add desplega-ai/qa-use || echo "qa-use marketplace add failed, continuing..."
159
-
160
- echo "Installing plugins from desplega.ai..."
161
- claude plugin install qa-use@desplega.ai --scope user || echo "Plugin install failed, continuing..."
306
+ echo "=== GitLab Authentication ==="
307
+ if [ -n "$GITLAB_TOKEN" ]; then
308
+ echo "Configuring GitLab authentication..."
309
+
310
+ # Configure glab CLI with the token
311
+ GITLAB_HOST="${GITLAB_URL:-https://gitlab.com}"
312
+ # Strip protocol for glab host config
313
+ GITLAB_HOST_BARE=$(echo "$GITLAB_HOST" | sed 's|https\?://||')
314
+ echo "$GITLAB_TOKEN" | glab auth login --hostname "$GITLAB_HOST_BARE" --stdin 2>/dev/null || true
315
+
316
+ # Set git user config for GitLab commits (use GitLab-specific env vars or fall back to GitHub ones)
317
+ GITLAB_GIT_EMAIL="${GITLAB_EMAIL:-${GITHUB_EMAIL:-worker-agent@desplega.ai}}"
318
+ GITLAB_GIT_NAME="${GITLAB_NAME:-${GITHUB_NAME:-Worker Agent}}"
319
+ # Only override git config if GitHub didn't set it already
320
+ if [ -z "$GITHUB_TOKEN" ]; then
321
+ git config --global user.email "$GITLAB_GIT_EMAIL"
322
+ git config --global user.name "$GITLAB_GIT_NAME"
323
+ fi
162
324
 
163
- echo "Marketplace installation completed"
325
+ echo "GitLab authentication configured successfully (host: $GITLAB_HOST_BARE)"
164
326
  else
165
- echo "WARNING: claude CLI not found, skipping marketplace installation"
327
+ echo "GITLAB_TOKEN not set - GitLab integration disabled for this worker"
166
328
  fi
167
- echo "==============================="
329
+ echo "=============================="
168
330
 
169
- # Configure and install ai-tracker for tracking AI vs human code changes
331
+ # ---- Auto-clone registered repos ----
170
332
  echo ""
171
- echo "=== AI Tracker Setup ==="
172
- if command -v ai-tracker >/dev/null 2>&1; then
173
- # Create shared tracking directory
174
- TRACKING_DIR="/workspace/shared/tracking"
175
- mkdir -p "$TRACKING_DIR"
176
-
177
- # Set per-agent database path
178
- if [ -n "$AGENT_ID" ]; then
179
- export AI_TRACKER_DB_PATH="${TRACKING_DIR}/${AGENT_ID}.db"
180
- echo "AI Tracker DB Path: $AI_TRACKER_DB_PATH"
333
+ echo "=== Repo Auto-Clone ==="
334
+ if [ -n "$AGENT_ID" ]; then
335
+ echo "Fetching registered repos from API..."
336
+ if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
337
+ -H "X-Agent-ID: ${AGENT_ID}" \
338
+ "${MCP_URL}/api/repos?autoClone=true" \
339
+ > /tmp/swarm_repos.json 2>/dev/null; then
340
+
341
+ REPO_COUNT=$(jq '.repos | length' /tmp/swarm_repos.json 2>/dev/null || echo "0")
342
+ if [ "$REPO_COUNT" -gt 0 ]; then
343
+ echo "Found $REPO_COUNT repos to clone..."
344
+
345
+ jq -c '.repos[]' /tmp/swarm_repos.json | while read -r repo; do
346
+ REPO_URL=$(echo "$repo" | jq -r '.url')
347
+ REPO_NAME=$(echo "$repo" | jq -r '.name')
348
+ REPO_BRANCH=$(echo "$repo" | jq -r '.defaultBranch // "main"')
349
+ REPO_DIR=$(echo "$repo" | jq -r '.clonePath')
350
+
351
+ # Ensure parent directory exists
352
+ mkdir -p "$(dirname "$REPO_DIR")"
353
+
354
+ if [ -d "${REPO_DIR}/.git" ]; then
355
+ echo " Pulling ${REPO_NAME} (${REPO_BRANCH}) at ${REPO_DIR}..."
356
+ cd "$REPO_DIR" && git pull origin "$REPO_BRANCH" --ff-only 2>/dev/null || echo " Warning: Could not pull ${REPO_NAME}"
357
+ cd /workspace
358
+ else
359
+ echo " Cloning ${REPO_NAME} to ${REPO_DIR} (branch: ${REPO_BRANCH})..."
360
+ gh repo clone "$REPO_URL" "$REPO_DIR" -- --branch "$REPO_BRANCH" --single-branch 2>/dev/null || echo " Warning: Could not clone ${REPO_NAME}"
361
+ fi
362
+ done
363
+ else
364
+ echo "No repos registered for auto-clone"
365
+ fi
366
+ rm -f /tmp/swarm_repos.json
181
367
  else
182
- export AI_TRACKER_DB_PATH="${TRACKING_DIR}/default.db"
183
- echo "AI Tracker DB Path: $AI_TRACKER_DB_PATH (default, AGENT_ID not set)"
368
+ echo "Warning: Could not fetch repos (API may not be ready)"
184
369
  fi
370
+ else
371
+ echo "Skipping repo clone (no AGENT_ID)"
372
+ fi
373
+ echo "==============================="
185
374
 
186
- # Persist AI_TRACKER_DB_PATH to .bashrc for git hooks and new shell sessions
187
- # Git hooks spawn fresh shells that don't inherit the exported env var
188
- if ! grep -q "AI_TRACKER_DB_PATH" ~/.bashrc 2>/dev/null; then
189
- echo "export AI_TRACKER_DB_PATH=\"${AI_TRACKER_DB_PATH}\"" >> ~/.bashrc
190
- fi
191
375
 
192
- # Install ai-tracker hooks (Claude Code PostToolUse hook + git post-commit hook)
193
- echo "Installing ai-tracker hooks..."
194
- ai-tracker install || echo "AI Tracker install failed, continuing..."
376
+ # Find existing startup script in /workspace (start-up.sh, .bash, .js, .ts, .bun, or bare)
377
+ find_startup_script() {
378
+ for pattern in start-up.sh start-up.bash start-up.js start-up.ts start-up.bun start-up; do
379
+ if [ -f "/workspace/${pattern}" ]; then
380
+ echo "/workspace/${pattern}"
381
+ return 0
382
+ fi
383
+ done
384
+ return 1
385
+ }
195
386
 
196
- echo "AI Tracker setup completed"
197
- else
198
- echo "WARNING: ai-tracker not found, skipping AI tracking setup"
387
+
388
+ # ---- Fetch and compose setup scripts from API ----
389
+ if [ -n "$AGENT_ID" ]; then
390
+ echo ""
391
+ echo "=== Setup Script Fetch ==="
392
+ echo "Fetching setup scripts from API..."
393
+ if curl -s -f -H "Authorization: Bearer ${API_KEY}" \
394
+ -H "X-Agent-ID: ${AGENT_ID}" \
395
+ "${MCP_URL}/api/agents/${AGENT_ID}/setup-script" \
396
+ > /tmp/setup_scripts.json 2>/dev/null; then
397
+
398
+ GLOBAL_SCRIPT=$(jq -r '.globalSetupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
399
+ AGENT_SCRIPT=$(jq -r '.setupScript // empty' /tmp/setup_scripts.json 2>/dev/null)
400
+
401
+ if [ -n "$GLOBAL_SCRIPT" ] || [ -n "$AGENT_SCRIPT" ]; then
402
+ EXISTING_STARTUP=$(find_startup_script) || true
403
+
404
+ if [ -n "$EXISTING_STARTUP" ]; then
405
+ # Prepend to existing file (preserve operator content)
406
+ echo "Prepending DB setup script to existing ${EXISTING_STARTUP}..."
407
+ TEMP_FILE=$(mktemp)
408
+ echo "#!/bin/bash" > "$TEMP_FILE"
409
+ # Global script goes outside markers (not synced back to agent DB)
410
+ if [ -n "$GLOBAL_SCRIPT" ]; then
411
+ echo "# --- Global setup script ---" >> "$TEMP_FILE"
412
+ echo "$GLOBAL_SCRIPT" >> "$TEMP_FILE"
413
+ echo "" >> "$TEMP_FILE"
414
+ fi
415
+ # Agent script goes between markers (synced back to DB by hooks)
416
+ if [ -n "$AGENT_SCRIPT" ]; then
417
+ echo "# === Agent-managed setup (from DB) ===" >> "$TEMP_FILE"
418
+ echo "$AGENT_SCRIPT" >> "$TEMP_FILE"
419
+ echo "# === End agent-managed setup ===" >> "$TEMP_FILE"
420
+ fi
421
+ echo "" >> "$TEMP_FILE"
422
+ # Strip shebang, global section, and existing marker sections from original
423
+ sed '1{/^#!/d;}' "$EXISTING_STARTUP" \
424
+ | sed '/^# --- Global setup script ---$/,/^$/d' \
425
+ | sed '/^# === Agent-managed setup (from DB) ===$/,/^# === End agent-managed setup ===$/d' \
426
+ >> "$TEMP_FILE"
427
+ mv "$TEMP_FILE" "$EXISTING_STARTUP"
428
+ chmod +x "$EXISTING_STARTUP"
429
+ else
430
+ # Create new start-up.sh
431
+ echo "Creating /workspace/start-up.sh from DB setup script..."
432
+ echo "#!/bin/bash" > /workspace/start-up.sh
433
+ if [ -n "$GLOBAL_SCRIPT" ]; then
434
+ echo "# --- Global setup script ---" >> /workspace/start-up.sh
435
+ echo "$GLOBAL_SCRIPT" >> /workspace/start-up.sh
436
+ echo "" >> /workspace/start-up.sh
437
+ fi
438
+ if [ -n "$AGENT_SCRIPT" ]; then
439
+ echo "# === Agent-managed setup (from DB) ===" >> /workspace/start-up.sh
440
+ echo "$AGENT_SCRIPT" >> /workspace/start-up.sh
441
+ echo "# === End agent-managed setup ===" >> /workspace/start-up.sh
442
+ fi
443
+ chmod +x /workspace/start-up.sh
444
+ fi
445
+ echo "Setup scripts composed (global: $([ -n "$GLOBAL_SCRIPT" ] && echo "yes" || echo "no"), agent: $([ -n "$AGENT_SCRIPT" ] && echo "yes" || echo "no"))"
446
+ else
447
+ echo "No setup scripts configured"
448
+ fi
449
+ rm -f /tmp/setup_scripts.json
450
+ else
451
+ echo "Warning: Could not fetch setup scripts (API may not be ready)"
452
+ fi
453
+ echo "==============================="
199
454
  fi
200
- echo "==============================="
455
+ # ---- End setup script fetch ----
201
456
 
202
457
 
203
458
  # Execute startup script if found
@@ -206,13 +461,7 @@ echo ""
206
461
  echo "=== Startup Script Detection (${ROLE}) ==="
207
462
 
208
463
  # Find startup script matching /workspace/start-up.* pattern
209
- STARTUP_SCRIPT=""
210
- for pattern in start-up.sh start-up.bash start-up.js start-up.ts start-up.bun start-up; do
211
- if [ -f "/workspace/${pattern}" ]; then
212
- STARTUP_SCRIPT="/workspace/${pattern}"
213
- break
214
- fi
215
- done
464
+ STARTUP_SCRIPT=$(find_startup_script) || true
216
465
 
217
466
  if [ -n "$STARTUP_SCRIPT" ]; then
218
467
  echo "Found startup script: $STARTUP_SCRIPT"
@@ -302,24 +551,11 @@ fi
302
551
  echo ""
303
552
  echo "=== Workspace Initialization ==="
304
553
 
305
- # Configure wts for agent use (no tmux, no auto-Claude)
306
- echo "Configuring wts for agent mode..."
307
- mkdir -p /home/worker/.wts
308
- cat > /home/worker/.wts/config.json << EOF
309
- {
310
- "defaults": {
311
- "autoTmux": false,
312
- "autoClaude": false
313
- }
314
- }
315
- EOF
316
-
554
+ # Create todos.md if it doesn't exist
317
555
  PERSONAL_DIR="/workspace/personal"
318
- mkdir -p "$PERSONAL_DIR"
319
-
320
556
  if [ ! -f "$PERSONAL_DIR/todos.md" ]; then
321
557
  echo "Creating personal todos.md..."
322
- cat > "$PERSONAL_DIR/todos.md" << EOF
558
+ cat > "$PERSONAL_DIR/todos.md" << EOF || echo "Warning: Could not create todos.md (disk may not be mounted)"
323
559
  # My TODOs
324
560
 
325
561
  ## Current
@@ -329,24 +565,68 @@ else
329
565
  echo "Personal todo.md already exists, skipping creation"
330
566
  fi
331
567
 
332
- SHARED_DIR="/workspace/shared/thoughts"
333
-
334
- # Create shared thoughts directories
568
+ # Set up per-agent directories on the shared disk (requires AGENT_ID at runtime)
569
+ # Each agent gets exclusive write access to its own subdirectories under each
570
+ # category (thoughts, memory, downloads, misc). All agents can read everything
571
+ # via the --shared mount.
335
572
  if [ -n "$AGENT_ID" ]; then
336
- AGENT_THOUGHTS_DIR="$SHARED_DIR/$AGENT_ID"
337
- echo "Creating shared thoughts directories for agent ID $AGENT_ID..."
338
- mkdir -p "$AGENT_THOUGHTS_DIR/plans"
339
- mkdir -p "$AGENT_THOUGHTS_DIR/research"
340
- fi
573
+ AGENT_SHARED="/workspace/shared"
574
+
575
+ # Safety net: if top-level dirs don't exist yet (API still booting),
576
+ # retry a few times with backoff
577
+ if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
578
+ for attempt in 1 2 3; do
579
+ if [ -d "$AGENT_SHARED/thoughts" ]; then
580
+ break
581
+ fi
582
+ echo "Waiting for shared directory structure (attempt $attempt/3)..."
583
+ sleep 3
584
+ done
585
+ fi
341
586
 
342
- # shared always
343
- echo "Creating shared thoughts directories..."
344
- mkdir -p "$SHARED_DIR/shared/plans"
345
- mkdir -p "$SHARED_DIR/shared/research"
587
+ echo "Setting up per-agent directories for $AGENT_ID..."
588
+
589
+ # The shared disk is already mounted via `archil mount --shared`.
590
+ # Read access to ALL directories (including other agents') is automatic.
591
+ # Here we claim WRITE ownership of this agent's own subdirectories only.
592
+ #
593
+ # IMPORTANT: Top-level dirs (thoughts/, memory/, downloads/, misc/) are
594
+ # pre-created by the API machine at boot. This ensures our mkdir below
595
+ # auto-grants delegation at the SUBDIR level (e.g., thoughts/$AGENT_ID),
596
+ # not the parent level (thoughts/). See Appendix A in the plan for details.
597
+
598
+ for category in "thoughts" "memory" "downloads" "misc"; do
599
+ AGENT_DIR="$AGENT_SHARED/$category/$AGENT_ID"
600
+
601
+ # Create our subdir (auto-grants delegation on $AGENT_ID level)
602
+ # Entrypoint runs as root, so no sudo needed for mkdir.
603
+ mkdir -p "$AGENT_DIR" 2>/dev/null || true
604
+
605
+ # Checkout for persistent ownership (survives reboots where dir already exists)
606
+ # Use -f (force) to reclaim stale delegations from destroyed/redeployed machines.
607
+ # Each agent is the sole writer for its own subdirectory, so force is safe.
608
+ # Use `yes` piped in to auto-confirm the force-checkout prompt (no --yes flag).
609
+ # No sudo — entrypoint runs as root; sudo can swallow stdin pipes.
610
+ if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
611
+ yes | archil checkout -f "$AGENT_DIR" 2>/dev/null || true
612
+ fi
613
+
614
+ # chown AFTER checkout — need Archil delegation before FUSE allows chown
615
+ chown worker:worker "$AGENT_DIR" 2>/dev/null || true
616
+ done
617
+
618
+ # Create standard subdirectories (within owned dirs, always succeeds)
619
+ mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/plans"
620
+ mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/research"
621
+ mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/brainstorms"
622
+ mkdir -p "$AGENT_SHARED/downloads/$AGENT_ID/slack"
623
+
624
+ echo "Per-agent directories ready for $AGENT_ID"
625
+ fi
346
626
 
347
627
  echo "==============================="
348
628
  echo ""
349
629
 
350
630
  # Run the agent using compiled binary
351
631
  echo "Starting $ROLE..."
352
- exec /usr/local/bin/agent-swarm "$ROLE" "$@"
632
+ exec gosu worker /usr/local/bin/agent-swarm "$ROLE" "$@"
@@ -0,0 +1,4 @@
1
+ import { source } from "@/lib/source";
2
+ import { createFromSource } from "fumadocs-core/search/server";
3
+
4
+ export const { GET } = createFromSource(source);