@desplega.ai/agent-swarm 1.20.0 → 1.51.2

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 (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
@@ -1,787 +0,0 @@
1
- ---
2
- date: 2026-01-15T02:35:00Z
3
- researcher: Researcher (16990304-76e4-4017-b991-f3e37b34cf73)
4
- git_commit: N/A (workspace not a git repo)
5
- branch: N/A
6
- repository: agent-swarm
7
- topic: "How to automatically start predefined processes (e.g. psql, redis) in worker Docker containers"
8
- tags: [research, docker, containers, process-management, s6-overlay, supervisord, worker-agents]
9
- status: complete
10
- autonomy: autopilot
11
- last_updated: 2026-01-15
12
- last_updated_by: Researcher
13
- ---
14
-
15
- # Research: Auto-Starting Predefined Processes in Worker Docker Containers
16
-
17
- **Date**: 2026-01-15T02:35:00Z
18
- **Researcher**: Researcher (16990304-76e4-4017-b991-f3e37b34cf73)
19
- **Git Commit**: N/A (workspace not a git repo)
20
- **Branch**: N/A
21
-
22
- ## Research Question
23
-
24
- How to automatically start predefined processes (e.g. psql, redis) in worker Docker containers for agent-swarm, including analysis of current mechanisms, process manager options, and configuration approaches.
25
-
26
- ## Summary
27
-
28
- This research analyzes approaches for running multiple services (like PostgreSQL, Redis) inside single Docker containers for worker agents. The current agent-swarm ecosystem uses simple entrypoint scripts with PM2 for Node.js process management. For more complex multi-process scenarios, **s6-overlay** emerges as the recommended modern solution, offering proper PID 1 handling, service dependencies, and container-native design.
29
-
30
- ---
31
-
32
- ## 1. Current Container Startup Mechanisms in Agent-Swarm
33
-
34
- ### 1.1 Current Approaches Found in Codebase
35
-
36
- The workspace contains several Docker-related projects with different initialization approaches:
37
-
38
- #### Content-Agent (`/workspace/shared/content-agent/docker/`)
39
-
40
- **Dockerfile** (`/workspace/shared/content-agent/docker/Dockerfile`):
41
- - Base: `python:3.11-slim`
42
- - Installs: git, curl, Node.js, GitHub CLI, Claude CLI
43
- - Uses bash entrypoint script
44
- - Single main process: `python main.py --mode daemon`
45
-
46
- **Entrypoint** (`/workspace/shared/content-agent/docker/entrypoint.sh`):
47
- ```bash
48
- #!/bin/bash
49
- set -e
50
-
51
- # Initialization checks
52
- - GitHub CLI auth check
53
- - Symlink creation for shared prompts
54
- - Database initialization
55
- - Claude CLI availability check
56
-
57
- # Execute main command
58
- exec "$@"
59
- ```
60
-
61
- **Key characteristics:**
62
- - Simple bash-based initialization
63
- - Single-process container design
64
- - Uses `exec` for proper signal handling
65
- - No process manager beyond the main application
66
-
67
- #### Desplega.ai Backend (`/workspace/shared/desplega.ai/be/`)
68
-
69
- **Dockerfile** (`/workspace/shared/desplega.ai/be/Dockerfile`):
70
- - Multi-stage build with `python:3.12-slim-bookworm`
71
- - Uses `uv` for Python dependency management
72
- - Includes Playwright/Chromium for browser automation
73
- - Generic entrypoint expecting runtime specification
74
-
75
- ```dockerfile
76
- ENTRYPOINT ["/bin/bash", "-c"]
77
- CMD ["echo 'Specify api or worker as entrypoint at runtime'"]
78
- ```
79
-
80
- **Key characteristics:**
81
- - Flexible runtime command specification
82
- - Single-process per container pattern
83
- - No embedded process manager
84
-
85
- #### Your-News Backend (`/workspace/shared/your-news/backend/`)
86
-
87
- **PM2 Ecosystem** (`/workspace/shared/your-news/backend/ecosystem.config.js`):
88
- ```javascript
89
- module.exports = {
90
- apps: [
91
- { name: 'your-news-api', script: './dist/index.js', ... },
92
- { name: 'your-news-email-poller', script: './dist/scripts/email-poller.js', ... },
93
- { name: 'your-news-scheduler', script: './dist/scripts/run-scheduler.js', ... }
94
- ]
95
- };
96
- ```
97
-
98
- **Key characteristics:**
99
- - Uses PM2 for multi-process management
100
- - Three related Node.js processes
101
- - Autorestart, logging, max_restarts configured
102
- - This is the closest to multi-process management in current codebase
103
-
104
- ### 1.2 Current Agent-Swarm Worker Environment
105
-
106
- Based on the current workspace structure (`/workspace`):
107
- - Workers run in isolated containers with:
108
- - Personal directory: `/workspace/personal`
109
- - Shared directory: `/workspace/shared`
110
- - PM2 for service management (`.pm2` directory present)
111
- - MCP configuration for agent-swarm API communication
112
-
113
- The current setup assumes:
114
- - Single Claude Code process as the main worker
115
- - External services (databases, etc.) accessed via network
116
- - PM2 available for background service management
117
-
118
- ---
119
-
120
- ## 2. Process Manager Options Comparison
121
-
122
- ### 2.1 Comparison Matrix
123
-
124
- | Feature | tini | dumb-init | supervisord | s6-overlay | runit | PM2 |
125
- |---------|------|-----------|-------------|------------|-------|-----|
126
- | **Multi-process** | No | No | Yes | Yes | Yes | Yes (Node.js) |
127
- | **Exit on child failure** | Yes | Yes | No | Yes | Partial | Configurable |
128
- | **Zombie reaping** | Yes | Yes | Yes | Yes | Yes | Yes |
129
- | **Signal forwarding** | Yes | Yes | Limited | Yes | Issues | Yes |
130
- | **Dependency management** | No | No | No | Yes | No | No |
131
- | **Graceful shutdown** | Yes | Yes | Limited | Yes | Limited | Yes |
132
- | **Configuration** | CLI | CLI | INI files | Directories | Directories | JS/JSON |
133
- | **Image size impact** | ~10KB | ~20KB | Large (Python) | ~2MB | ~500KB | ~50MB |
134
- | **Container-native** | Yes | Yes | No | Yes | No | Partial |
135
- | **Language** | C | C | Python | C | C | Node.js |
136
-
137
- ### 2.2 Detailed Analysis
138
-
139
- #### tini / dumb-init (Minimal Init Systems)
140
-
141
- **Best for**: Single-process containers needing proper PID 1 handling
142
-
143
- ```dockerfile
144
- # Using Docker's built-in tini
145
- docker run --init myimage
146
-
147
- # Or in docker-compose.yml
148
- services:
149
- myapp:
150
- init: true
151
- ```
152
-
153
- **Limitations**: Cannot manage multiple direct child processes, no supervision.
154
-
155
- #### supervisord
156
-
157
- **Best for**: Legacy applications, teams familiar with INI configuration
158
-
159
- ```ini
160
- [supervisord]
161
- nodaemon=true
162
-
163
- [program:nginx]
164
- command=/usr/sbin/nginx -g "daemon off;"
165
- autostart=true
166
- autorestart=true
167
-
168
- [program:redis]
169
- command=/usr/bin/redis-server
170
- autostart=true
171
- autorestart=true
172
- ```
173
-
174
- **Critical Issue**: Does not exit when child processes fail - container orchestrators won't detect failures.
175
-
176
- #### s6-overlay (Recommended)
177
-
178
- **Best for**: Production multi-process containers, complex service dependencies
179
-
180
- **Directory structure**:
181
- ```
182
- /etc/s6-overlay/s6-rc.d/
183
- ├── user/contents.d/
184
- │ ├── postgres # Empty file enables service
185
- │ └── redis
186
- ├── postgres/
187
- │ ├── type # "longrun"
188
- │ ├── run # Start script
189
- │ └── dependencies.d/
190
- │ └── base
191
- └── redis/
192
- ├── type
193
- ├── run
194
- └── dependencies.d/
195
- └── base
196
- ```
197
-
198
- **Key advantages**:
199
- - Container exits when main service fails
200
- - Proper dependency ordering
201
- - Graceful shutdown handling
202
- - Minimal footprint (~2MB)
203
-
204
- #### PM2 (Current in Agent-Swarm)
205
-
206
- **Best for**: Node.js applications, already present in agent-swarm
207
-
208
- ```javascript
209
- // ecosystem.config.js
210
- module.exports = {
211
- apps: [
212
- { name: 'service1', script: './service1.js', ... },
213
- { name: 'service2', script: './service2.js', ... }
214
- ]
215
- };
216
- ```
217
-
218
- **Current usage**: Already used for service registry in agent-swarm workers.
219
-
220
- ### 2.3 Recommendation Summary
221
-
222
- | Use Case | Recommendation |
223
- |----------|----------------|
224
- | Single-process container | `docker run --init` (built-in tini) |
225
- | Multi-process with dependencies | **s6-overlay** |
226
- | Node.js multi-process | PM2 (already available) |
227
- | Legacy/simple multi-process | supervisord (with caveats) |
228
- | **Flexible team deployments** | **Docker Compose sidecar services** (Recommended) |
229
-
230
- ---
231
-
232
- ## 3. Approaches for Running PostgreSQL/Redis in Worker Containers
233
-
234
- ### 3.1 Option A: External Services (Current Pattern)
235
-
236
- Workers connect to external PostgreSQL/Redis instances via environment variables:
237
-
238
- ```bash
239
- DATABASE_URL=postgresql://user:pass@db-host:5432/dbname
240
- REDIS_URL=redis://redis-host:6379
241
- ```
242
-
243
- **Pros**: Clean separation, easier scaling, standard Docker pattern
244
- **Cons**: Network latency, external dependency management
245
-
246
- ### 3.2 Option B: Embedded Services with s6-overlay
247
-
248
- Full PostgreSQL + Redis in container:
249
-
250
- ```dockerfile
251
- FROM alpine:3.19
252
-
253
- ARG S6_OVERLAY_VERSION=3.2.0.0
254
-
255
- # Install s6-overlay
256
- ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
257
- RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
258
- ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
259
- RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz
260
-
261
- # Install services
262
- RUN apk add --no-cache postgresql16 redis
263
-
264
- # Service configurations (see section 4 for details)
265
- COPY rootfs/ /
266
-
267
- ENTRYPOINT ["/init"]
268
- ```
269
-
270
- **Service definition** (`/etc/s6-overlay/s6-rc.d/postgres/run`):
271
- ```bash
272
- #!/command/execlineb -P
273
- su postgres -c "postgres -D /var/lib/postgresql/data"
274
- ```
275
-
276
- ### 3.3 Option C: Hybrid with PM2 (Leveraging Existing Infrastructure)
277
-
278
- Since PM2 is already present, extend ecosystem.config.js:
279
-
280
- ```javascript
281
- module.exports = {
282
- apps: [
283
- // Background services (if needed)
284
- {
285
- name: 'redis-server',
286
- script: '/usr/bin/redis-server',
287
- args: '--daemonize no --port 6379',
288
- interpreter: 'none',
289
- autorestart: true
290
- },
291
- // Main worker processes
292
- {
293
- name: 'claude-worker',
294
- script: '/path/to/worker.js',
295
- // ...
296
- }
297
- ]
298
- };
299
- ```
300
-
301
- **Note**: PM2 works best with Node.js; for system services like PostgreSQL, s6-overlay is more appropriate.
302
-
303
- ### 3.4 Option D: Docker Compose Sidecar Services (Recommended for Flexibility)
304
-
305
- **Best for**: Teams deploying the swarm who want maximum flexibility and control over their infrastructure.
306
-
307
- Instead of embedding services within worker containers, teams can add services as sidecar containers in their Docker Compose configuration. This is the most flexible approach as it allows each deployment to choose exactly which services they need without modifying the base worker image.
308
-
309
- ```yaml
310
- # docker-compose.yml
311
- version: '3.8'
312
-
313
- services:
314
- # Worker agent container
315
- worker:
316
- image: desplega/agent-swarm-worker:latest
317
- environment:
318
- DATABASE_URL: postgresql://postgres:password@postgres:5432/worker
319
- REDIS_URL: redis://redis:6379
320
- depends_on:
321
- postgres:
322
- condition: service_healthy
323
- redis:
324
- condition: service_healthy
325
- networks:
326
- - worker-network
327
-
328
- # PostgreSQL sidecar
329
- postgres:
330
- image: postgres:16-alpine
331
- environment:
332
- POSTGRES_PASSWORD: password
333
- POSTGRES_DB: worker
334
- volumes:
335
- - postgres-data:/var/lib/postgresql/data
336
- healthcheck:
337
- test: ["CMD-SHELL", "pg_isready -U postgres"]
338
- interval: 5s
339
- timeout: 5s
340
- retries: 5
341
- networks:
342
- - worker-network
343
-
344
- # Redis sidecar
345
- redis:
346
- image: redis:7-alpine
347
- volumes:
348
- - redis-data:/data
349
- healthcheck:
350
- test: ["CMD", "redis-cli", "ping"]
351
- interval: 5s
352
- timeout: 5s
353
- retries: 5
354
- networks:
355
- - worker-network
356
-
357
- volumes:
358
- postgres-data:
359
- redis-data:
360
-
361
- networks:
362
- worker-network:
363
- driver: bridge
364
- ```
365
-
366
- **Pros**:
367
- - **Maximum flexibility**: Each team decides which services they need
368
- - **Clean separation**: Services run in isolated containers with their own resources
369
- - **Standard Docker patterns**: Leverages well-understood Docker Compose conventions
370
- - **Easy scaling**: Services can be scaled independently
371
- - **No image modification**: Base worker image stays lean and generic
372
- - **Health checks built-in**: Docker Compose handles service health and dependencies
373
- - **Official images**: Use maintained official images for PostgreSQL, Redis, etc.
374
-
375
- **Cons**:
376
- - Requires Docker Compose for orchestration
377
- - Slightly higher network latency vs embedded services
378
- - Each deployment needs to manage their own compose file
379
-
380
- **When to use**: This is the **recommended approach** for most deployments. It provides the best balance of flexibility, maintainability, and separation of concerns. Teams can easily add, remove, or swap services without any changes to the core agent-swarm infrastructure.
381
-
382
- ---
383
-
384
- ## 4. Proposed Configuration Format for Worker Services
385
-
386
- ### 4.1 Recommended: YAML-Based Service Definition
387
-
388
- Create a `worker-services.yaml` that defines which services each worker needs:
389
-
390
- ```yaml
391
- # /workspace/config/worker-services.yaml
392
- version: "1.0"
393
-
394
- services:
395
- # Service definitions
396
- postgresql:
397
- enabled: false
398
- image_install: "apk add postgresql16"
399
- init_script: |
400
- if [ ! -d "/var/lib/postgresql/data/base" ]; then
401
- su postgres -c "initdb -D /var/lib/postgresql/data"
402
- fi
403
- run_command: "postgres -D /var/lib/postgresql/data"
404
- run_user: postgres
405
- port: 5432
406
- healthcheck: "pg_isready -U postgres"
407
- depends_on: []
408
-
409
- redis:
410
- enabled: false
411
- image_install: "apk add redis"
412
- run_command: "redis-server --daemonize no --port 6379"
413
- port: 6379
414
- healthcheck: "redis-cli ping"
415
- depends_on: []
416
-
417
- custom_service:
418
- enabled: false
419
- run_command: "/path/to/custom/service"
420
- depends_on: ["postgresql"]
421
-
422
- # Worker profiles - which services each worker type needs
423
- profiles:
424
- default:
425
- services: []
426
-
427
- database-worker:
428
- services:
429
- - postgresql
430
- - redis
431
-
432
- cache-worker:
433
- services:
434
- - redis
435
-
436
- full-stack:
437
- services:
438
- - postgresql
439
- - redis
440
- - custom_service
441
- ```
442
-
443
- ### 4.2 Environment Variable Configuration
444
-
445
- Workers specify their profile via environment:
446
-
447
- ```bash
448
- # In worker container
449
- WORKER_SERVICES_PROFILE=database-worker
450
- # Or specific services
451
- WORKER_SERVICES=postgresql,redis
452
- ```
453
-
454
- ### 4.3 Startup Script Integration
455
-
456
- A unified startup script reads the config and sets up services:
457
-
458
- ```bash
459
- #!/bin/bash
460
- # /usr/local/bin/worker-init.sh
461
-
462
- set -e
463
-
464
- CONFIG_FILE="${WORKER_SERVICES_CONFIG:-/workspace/config/worker-services.yaml}"
465
- PROFILE="${WORKER_SERVICES_PROFILE:-default}"
466
- SERVICES="${WORKER_SERVICES:-}"
467
-
468
- # Parse YAML config (using yq or similar)
469
- if [ -n "$SERVICES" ]; then
470
- enabled_services="$SERVICES"
471
- else
472
- enabled_services=$(yq ".profiles.$PROFILE.services[]" "$CONFIG_FILE" | tr '\n' ' ')
473
- fi
474
-
475
- # Start each enabled service
476
- for service in $enabled_services; do
477
- echo "Starting service: $service"
478
-
479
- # Check dependencies
480
- deps=$(yq ".services.$service.depends_on[]" "$CONFIG_FILE" 2>/dev/null || echo "")
481
- for dep in $deps; do
482
- wait_for_service "$dep"
483
- done
484
-
485
- # Run init script if exists
486
- init_script=$(yq ".services.$service.init_script" "$CONFIG_FILE")
487
- if [ -n "$init_script" ] && [ "$init_script" != "null" ]; then
488
- eval "$init_script"
489
- fi
490
-
491
- # Start service (via s6-overlay or PM2)
492
- run_cmd=$(yq ".services.$service.run_command" "$CONFIG_FILE")
493
- run_user=$(yq ".services.$service.run_user" "$CONFIG_FILE")
494
-
495
- if [ "$run_user" != "null" ]; then
496
- su "$run_user" -c "$run_cmd" &
497
- else
498
- $run_cmd &
499
- fi
500
- done
501
-
502
- # Execute main worker command
503
- exec "$@"
504
- ```
505
-
506
- ### 4.4 s6-overlay Integration
507
-
508
- For s6-overlay, generate service directories from config:
509
-
510
- ```bash
511
- #!/bin/bash
512
- # /etc/s6-overlay/scripts/setup-services.sh
513
-
514
- CONFIG_FILE="/workspace/config/worker-services.yaml"
515
-
516
- for service in $(yq '.services | keys[]' "$CONFIG_FILE"); do
517
- enabled=$(yq ".services.$service.enabled" "$CONFIG_FILE")
518
- if [ "$enabled" = "true" ]; then
519
- mkdir -p "/etc/s6-overlay/s6-rc.d/$service/dependencies.d"
520
-
521
- # Create type file
522
- echo "longrun" > "/etc/s6-overlay/s6-rc.d/$service/type"
523
-
524
- # Create run script
525
- run_cmd=$(yq ".services.$service.run_command" "$CONFIG_FILE")
526
- cat > "/etc/s6-overlay/s6-rc.d/$service/run" << EOF
527
- #!/command/execlineb -P
528
- $run_cmd
529
- EOF
530
- chmod +x "/etc/s6-overlay/s6-rc.d/$service/run"
531
-
532
- # Enable service
533
- touch "/etc/s6-overlay/s6-rc.d/user/contents.d/$service"
534
-
535
- # Set up dependencies
536
- for dep in $(yq ".services.$service.depends_on[]" "$CONFIG_FILE" 2>/dev/null); do
537
- touch "/etc/s6-overlay/s6-rc.d/$service/dependencies.d/$dep"
538
- done
539
- fi
540
- done
541
- ```
542
-
543
- ---
544
-
545
- ## 5. Recommended Implementation Approach
546
-
547
- ### 5.0 Recommended: Docker Compose Sidecar Services
548
-
549
- **For most deployments, the sidecar approach is recommended.** Instead of embedding services in worker containers, let each team deploying the swarm choose which services to add to their docker-compose.yml as sidecar services.
550
-
551
- **Why this is preferred:**
552
- - Zero changes needed to the base worker image
553
- - Teams have full control over their infrastructure
554
- - Standard Docker Compose patterns that everyone understands
555
- - Easy to add/remove services per deployment needs
556
- - Official images with security updates managed upstream
557
-
558
- **Implementation**: Simply document the sidecar pattern (see Section 3.4) and provide example docker-compose.yml snippets for common services. No code changes required.
559
-
560
- #### 5.0.1 Service Auto-Discovery
561
-
562
- For agents to discover available sidecar services, there are several approaches:
563
-
564
- 1. **Environment Variables (Recommended)**: Services are exposed to agents via standard environment variables injected by Docker Compose:
565
- ```yaml
566
- services:
567
- worker:
568
- environment:
569
- DATABASE_URL: postgresql://postgres:password@postgres:5432/worker_${WORKER_ID}
570
- REDIS_URL: redis://redis:6379
571
- # Service availability flags
572
- HAS_POSTGRES: "true"
573
- HAS_REDIS: "true"
574
- ```
575
- Agents can check for `HAS_*` environment variables or attempt connection to `DATABASE_URL`/`REDIS_URL` to discover what's available.
576
-
577
- 2. **Service Registry (For Complex Deployments)**: The agent-swarm already has a service registry (`register-service`, `list-services` MCP tools). Sidecar services can be registered at startup via an init container or startup script:
578
- ```yaml
579
- services:
580
- service-registrar:
581
- image: alpine
582
- command: |
583
- # Register postgres service to agent-swarm registry
584
- curl -X POST "$SWARM_API/services" -d '{"name":"postgres","url":"postgres:5432"}'
585
- depends_on:
586
- - postgres
587
- ```
588
-
589
- 3. **DNS-Based Discovery**: Docker Compose creates a network where services are discoverable by their service name. Agents can simply try to connect to well-known hostnames (`postgres`, `redis`, `mysql`) and use what's available.
590
-
591
- #### 5.0.2 Database Isolation per Worker
592
-
593
- **Critical point: Each worker MUST have its own isolated database to prevent data conflicts and ensure security.**
594
-
595
- There are two main strategies:
596
-
597
- **Strategy A: Dedicated Database Instance per Worker (Recommended for full isolation)**
598
- ```yaml
599
- services:
600
- worker-1:
601
- environment:
602
- DATABASE_URL: postgresql://postgres:password@postgres-worker-1:5432/worker
603
- depends_on:
604
- - postgres-worker-1
605
-
606
- postgres-worker-1:
607
- image: postgres:16-alpine
608
- environment:
609
- POSTGRES_DB: worker
610
- volumes:
611
- - postgres-worker-1-data:/var/lib/postgresql/data
612
-
613
- worker-2:
614
- environment:
615
- DATABASE_URL: postgresql://postgres:password@postgres-worker-2:5432/worker
616
- depends_on:
617
- - postgres-worker-2
618
-
619
- postgres-worker-2:
620
- image: postgres:16-alpine
621
- environment:
622
- POSTGRES_DB: worker
623
- volumes:
624
- - postgres-worker-2-data:/var/lib/postgresql/data
625
-
626
- volumes:
627
- postgres-worker-1-data:
628
- postgres-worker-2-data:
629
- ```
630
-
631
- **Strategy B: Shared Database Instance with Separate Databases/Schemas (More resource-efficient)**
632
- ```yaml
633
- services:
634
- postgres:
635
- image: postgres:16-alpine
636
- environment:
637
- POSTGRES_PASSWORD: password
638
- volumes:
639
- - ./init-worker-dbs.sql:/docker-entrypoint-initdb.d/init.sql
640
- - postgres-data:/var/lib/postgresql/data
641
-
642
- worker-1:
643
- environment:
644
- DATABASE_URL: postgresql://worker1:password@postgres:5432/worker1_db
645
-
646
- worker-2:
647
- environment:
648
- DATABASE_URL: postgresql://worker2:password@postgres:5432/worker2_db
649
-
650
- # init-worker-dbs.sql:
651
- # CREATE DATABASE worker1_db;
652
- # CREATE USER worker1 WITH PASSWORD 'password';
653
- # GRANT ALL PRIVILEGES ON DATABASE worker1_db TO worker1;
654
- # CREATE DATABASE worker2_db;
655
- # CREATE USER worker2 WITH PASSWORD 'password';
656
- # GRANT ALL PRIVILEGES ON DATABASE worker2_db TO worker2;
657
- ```
658
-
659
- **Why isolation matters:**
660
- - **Data integrity**: Workers may run arbitrary code that could corrupt shared data
661
- - **Security**: Workers should not be able to access other workers' data
662
- - **Debugging**: Isolated databases make it easier to trace issues to specific workers
663
- - **Cleanup**: When a worker is removed, its data can be cleanly deleted
664
-
665
- **For Redis**, similar isolation can be achieved using:
666
- - Separate Redis instances per worker (full isolation)
667
- - Redis databases (`SELECT 0`, `SELECT 1`, etc.) for logical separation
668
- - Key prefixing (`worker-1:*`, `worker-2:*`) for namespace isolation
669
-
670
- ### 5.1 Alternative: Short-Term (Minimal Changes)
671
-
672
- If embedded services are required, **use PM2 ecosystem files** already available in workers:
673
-
674
- 1. Create service scripts in worker container
675
- 2. Register services via existing PM2 infrastructure
676
- 3. Use `register-service` MCP tool for discovery
677
-
678
- ```javascript
679
- // ecosystem.config.js extension
680
- const workerServices = process.env.WORKER_SERVICES?.split(',') || [];
681
-
682
- const serviceConfigs = {
683
- redis: {
684
- name: 'redis-server',
685
- script: '/usr/bin/redis-server',
686
- args: '--daemonize no',
687
- interpreter: 'none'
688
- }
689
- };
690
-
691
- module.exports = {
692
- apps: [
693
- ...workerServices.map(s => serviceConfigs[s]).filter(Boolean),
694
- // ... existing apps
695
- ]
696
- };
697
- ```
698
-
699
- ### 5.2 Medium-Term (Proper Multi-Process)
700
-
701
- **Adopt s6-overlay** for robust multi-process management:
702
-
703
- 1. Update base Dockerfile to include s6-overlay
704
- 2. Create service definition templates
705
- 3. Generate s6-rc configurations from YAML config
706
- 4. Implement health checks for all services
707
-
708
- ### 5.3 Long-Term (Full Configuration System)
709
-
710
- 1. Build configuration parser for `worker-services.yaml`
711
- 2. Create service template library (PostgreSQL, Redis, MySQL, etc.)
712
- 3. Implement service dependency graph resolution
713
- 4. Add monitoring/alerting for embedded services
714
- 5. Consider sidecar pattern for Kubernetes deployments
715
-
716
- ---
717
-
718
- ## 6. Architecture Diagram
719
-
720
- ```
721
- ┌─────────────────────────────────────────────────────────────┐
722
- │ Worker Container │
723
- │ ┌─────────────────────────────────────────────────────┐ │
724
- │ │ s6-overlay (PID 1) │ │
725
- │ │ ┌─────────────┬─────────────┬─────────────────┐ │ │
726
- │ │ │ Service │ Service │ Main │ │ │
727
- │ │ │ PostgreSQL │ Redis │ Worker App │ │ │
728
- │ │ │ (optional) │ (optional) │ (Claude Code) │ │ │
729
- │ │ └─────────────┴─────────────┴─────────────────┘ │ │
730
- │ │ ↑ │ │
731
- │ │ Dependencies managed by s6-rc │ │
732
- │ └─────────────────────────────────────────────────────┘ │
733
- │ │
734
- │ ┌─────────────────────────────────────────────────────┐ │
735
- │ │ Configuration Layer │ │
736
- │ │ worker-services.yaml → WORKER_SERVICES_PROFILE env │ │
737
- │ └─────────────────────────────────────────────────────┘ │
738
- │ │
739
- │ ┌─────────────────────────────────────────────────────┐ │
740
- │ │ Volumes │ │
741
- │ │ /workspace/personal /workspace/shared /var/lib/* │ │
742
- │ └─────────────────────────────────────────────────────┘ │
743
- └─────────────────────────────────────────────────────────────┘
744
- ```
745
-
746
- ---
747
-
748
- ## 7. Code References
749
-
750
- | File | Description |
751
- |------|-------------|
752
- | `/workspace/shared/content-agent/docker/entrypoint.sh` | Example bash entrypoint with init logic |
753
- | `/workspace/shared/content-agent/docker/Dockerfile` | Simple single-process Dockerfile |
754
- | `/workspace/shared/your-news/backend/ecosystem.config.js` | PM2 multi-process configuration |
755
- | `/workspace/shared/desplega.ai/be/Dockerfile` | Multi-stage build with flexible entrypoint |
756
- | `/workspace/.mcp.json` | MCP configuration for agent-swarm communication |
757
-
758
- ---
759
-
760
- ## 8. Open Questions
761
-
762
- 1. **Resource allocation**: How much memory/CPU should be reserved for embedded services vs. main worker?
763
- 2. **Data persistence**: Should embedded databases persist across container restarts?
764
- 3. **Service discovery**: How should workers advertise their embedded services to the swarm?
765
- 4. **Security**: What isolation should exist between embedded services and the main worker process?
766
- 5. **Monitoring**: How to expose health metrics for embedded services to the swarm coordinator?
767
-
768
- ---
769
-
770
- ## 9. Sources
771
-
772
- ### Process Management
773
- - [Docker Official: Multi-Service Containers](https://docs.docker.com/engine/containers/multi-service_container/)
774
- - [s6-overlay GitHub](https://github.com/just-containers/s6-overlay)
775
- - [tini GitHub](https://github.com/krallin/tini)
776
- - [dumb-init GitHub](https://github.com/Yelp/dumb-init)
777
- - [PM2 Documentation](https://pm2.keymetrics.io/docs/)
778
-
779
- ### Multi-Process Patterns
780
- - [Choosing an init process for multi-process containers](https://ahmet.im/blog/minimal-init-process-for-containers/)
781
- - [Container Init Systems Comparison 2025](https://kyle.cascade.family/posts/a-comparison-of-container-init-systems-in-2025/)
782
- - [s6-overlay Quickstart Guide](https://platformengineers.io/blog/s6-overlay-quickstart/)
783
-
784
- ### Docker Compose Alternatives
785
- - [Kompose - Compose to Kubernetes](https://kompose.io/)
786
- - [Podman Pods](https://www.redhat.com/en/blog/compose-podman-pods)
787
- - [GitLab Runner Docker Executor](https://docs.gitlab.com/runner/executors/docker/)