@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.
- package/README.md +271 -169
- package/openapi.json +5015 -0
- package/package.json +40 -7
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +262 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/templates.ts +111 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +3327 -784
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/runner.ts +188 -0
- package/src/be/seed.ts +62 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1540 -630
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/commands/templates.ts +172 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +384 -151
- package/src/github/index.ts +1 -0
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +368 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/templates.ts +140 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +434 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/heartbeat/templates.ts +30 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +199 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +216 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +299 -0
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +426 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +530 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +567 -0
- package/src/linear/templates.ts +47 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +150 -265
- package/src/prompts/defaults.ts +196 -0
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +442 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +624 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +231 -40
- package/src/server.ts +97 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +118 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +230 -55
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/templates.ts +55 -0
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +364 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +406 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/progress-dedup.test.ts +98 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +541 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +307 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +508 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +366 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +205 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +50 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +124 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +172 -17
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +129 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +133 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +530 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +235 -0
- package/src/workflows/engine.ts +580 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +103 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +229 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +124 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +44 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/.claude/settings.local.json +0 -115
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.env.docker.example +0 -39
- package/.env.example +0 -40
- package/.github/workflows/ci.yml +0 -76
- package/.github/workflows/docker-and-deploy.yml +0 -117
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -102
- package/CLAUDE.md +0 -104
- package/CONTRIBUTING.md +0 -270
- package/DEPLOYMENT.md +0 -605
- package/Dockerfile +0 -57
- package/Dockerfile.worker +0 -157
- package/FAQ.md +0 -19
- package/MCP.md +0 -406
- package/UI.md +0 -40
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/docker-compose.example.yml +0 -159
- package/docker-entrypoint.sh +0 -352
- package/ecosystem.config.cjs +0 -66
- package/plugin/README.md +0 -1
- package/plugin/hooks/hooks.json +0 -71
- package/pyproject.toml +0 -9
- package/scripts/generate-mcp-docs.ts +0 -415
- package/slack-manifest.json +0 -71
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/tsconfig.json +0 -37
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/public/logo.png +0 -0
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/hooks/useAutoScroll.ts +0 -83
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/lib/utils.ts +0 -88
- package/ui/src/main.tsx +0 -28
- package/ui/src/types/api.ts +0 -323
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/tsconfig.json +0 -31
- package/ui/vite.config.ts +0 -35
- /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/)
|