@desplega.ai/agent-swarm 1.156.0 → 1.158.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/dist/{acp-adapter-c1msptrw.js → acp-adapter-xaq4n6pc.js} +1 -1
  2. package/dist/{actions-wd41qtdc.js → actions-p9hz5yat.js} +15 -15
  3. package/dist/{app-tz2qrnah.js → app-g26wdcz6.js} +4 -4
  4. package/dist/{artifact-td4q4dch.js → artifact-3v5t9jtg.js} +1 -1
  5. package/dist/{assistant-c3q1zj2t.js → assistant-wydfqkb3.js} +16 -16
  6. package/dist/{boot-reembed-0be1krkm.js → boot-reembed-g5ckg9yb.js} +6 -6
  7. package/dist/{boot-reembed-r00j03f3.js → boot-reembed-se8zmdcp.js} +5 -5
  8. package/dist/{boot-scrub-logs-9j4hd0vw.js → boot-scrub-logs-wfxqan61.js} +3 -3
  9. package/dist/{seed-pricing-ncgxz1r2.js → boot-seeds-s3q01xj3.js} +10 -10
  10. package/dist/{claude-adapter-112w28qc.js → claude-adapter-tv2x4f36.js} +7 -7
  11. package/dist/{claude-managed-adapter-ea2aga6w.js → claude-managed-adapter-41b2s7fd.js} +2 -2
  12. package/dist/{claude-sdk-session-k7pb5kfz.js → claude-sdk-session-t442qz6f.js} +8 -8
  13. package/dist/{cli-e781c6f9.js → cli-0xjkj1j7.js} +1 -0
  14. package/dist/{cli-58rgvkt4.js → cli-1hkrch3k.js} +2 -2
  15. package/dist/{cli-mx3bzbv8.js → cli-20cj37vt.js} +1968 -44
  16. package/dist/{cli-h0wdadsx.js → cli-4198qc9v.js} +7 -3
  17. package/dist/{cli-24w39x6n.js → cli-47m6dkd3.js} +362 -126
  18. package/dist/{cli-90x9ewbz.js → cli-53sz8gkz.js} +1 -1
  19. package/dist/{cli-005pze6s.js → cli-5d10vd2m.js} +1 -1
  20. package/dist/{cli-08n8jxcw.js → cli-65hjmev5.js} +57 -17
  21. package/dist/{cli-scwq51gn.js → cli-68w09sjw.js} +7 -1
  22. package/dist/{cli-7j2098n5.js → cli-7gtvvpbh.js} +4 -4
  23. package/dist/{cli-b05d7szr.js → cli-7s3syk22.js} +18 -11
  24. package/dist/{cli-9w4ex8vh.js → cli-8qmme6vd.js} +2 -2
  25. package/dist/{cli-28wkjpdp.js → cli-987hg0aa.js} +2 -2
  26. package/dist/{cli-7pgcpcrg.js → cli-9httdpyq.js} +1 -1
  27. package/dist/{cli-jk26c1sz.js → cli-aky8tctm.js} +26 -93
  28. package/dist/{cli-865swy5p.js → cli-c07r9a2m.js} +3 -2
  29. package/dist/{cli-nyqza443.js → cli-fgqxwrpv.js} +291 -12
  30. package/dist/{cli-9pyah9c4.js → cli-ftfvggzx.js} +633 -166
  31. package/dist/{cli-ytxs7mn1.js → cli-g8djp6qe.js} +17 -0
  32. package/dist/{cli-avkd6mqv.js → cli-h967nb6r.js} +551 -0
  33. package/dist/{cli-y8bfxjtw.js → cli-j55n64b6.js} +23 -22
  34. package/dist/{cli-7vj52450.js → cli-j57qkrpq.js} +86 -28
  35. package/dist/{cli-tjmghmm5.js → cli-q67y4wzm.js} +6 -3
  36. package/dist/{cli-n6zq3kbd.js → cli-rj19hc34.js} +1 -1
  37. package/dist/{cli-tp0d7vzb.js → cli-rjehvrts.js} +4 -4
  38. package/dist/{cli-s8hpxeg4.js → cli-rqz8qbw7.js} +245 -75
  39. package/dist/{cli-p37sg0a9.js → cli-s8eet254.js} +1 -1
  40. package/dist/cli-t1ze64h3.js +811 -0
  41. package/dist/{cli-hc2fkhdv.js → cli-ws6rqycm.js} +3 -2
  42. package/dist/{cli-t1cd3mhp.js → cli-wscdvcqz.js} +13 -5
  43. package/dist/{cli-xa4j64zh.js → cli-x24pshtq.js} +5 -5
  44. package/dist/{cli-nbp6m6gp.js → cli-xberxa1r.js} +51 -26
  45. package/dist/{cli-szcyv1mm.js → cli-xhaeg2nc.js} +1 -1
  46. package/dist/cli.js +30 -16
  47. package/dist/{codex-adapter-g4tj1f2g.js → codex-adapter-cnm8wk11.js} +5 -5
  48. package/dist/{codex-session-runner-ad8ha7zt.js → codex-session-runner-gfg547zj.js} +5 -5
  49. package/dist/{commands-z3gd8ppc.js → commands-e3bn0p75.js} +3 -3
  50. package/dist/{db-bezm97r9.js → db-03v9kzr2.js} +17 -3
  51. package/dist/{dispatcher-a97hc33y.js → dispatcher-nrmg8yht.js} +14 -14
  52. package/dist/{dsh-adapter-1dwg97zv.js → dsh-adapter-k03nfqa6.js} +2 -2
  53. package/dist/{handlers-wtdy1x02.js → handlers-aqcedbyb.js} +17 -17
  54. package/dist/{hook-7edgmzng.js → hook-7vkskkre.js} +19 -11
  55. package/dist/{hook-fvs58a5b.js → hook-ybvmrmhq.js} +4 -4
  56. package/dist/{http-phnf93hp.js → http-2eqa8t24.js} +432 -195
  57. package/dist/{index-7x131mmf.js → index-1yks3qcr.js} +14 -14
  58. package/dist/{index-1fktvwxc.js → index-a3vn96n8.js} +31 -28
  59. package/dist/{index-yp8rasxk.js → index-c6zsv1bd.js} +5 -5
  60. package/dist/{index-50jxgw0d.js → index-chgdkq36.js} +14 -14
  61. package/dist/{index-7jwk7nsm.js → index-x71bvq0p.js} +15 -15
  62. package/dist/{keepalive-nnz07ebd.js → keepalive-vtkf5n99.js} +5 -5
  63. package/dist/{lead-mg7qcgww.js → lead-h3sp357x.js} +26 -26
  64. package/dist/{maintenance-ywmnqrpx.js → maintenance-jzeqtk3q.js} +6 -6
  65. package/dist/{oauth-refresh-sweep-c63sqfs1.js → oauth-refresh-sweep-qp3dzmdp.js} +4 -4
  66. package/dist/{onboard-2zj8sqkq.js → onboard-tmsp0qbz.js} +278 -81
  67. package/dist/{opencode-adapter-z64xjzec.js → opencode-adapter-x6x2da1z.js} +3 -3
  68. package/dist/{otel-impl-jgdfm26f.js → otel-impl-9mz73q65.js} +416 -301
  69. package/dist/{pi-mono-adapter-2b7mw16r.js → pi-mono-adapter-m6dvv0dz.js} +2 -2
  70. package/dist/{pricing-refresh-3whntb69.js → pricing-refresh-v1cbr9te.js} +5 -5
  71. package/dist/{rbac-roles-3zptcc3p.js → rbac-roles-c9wqz83x.js} +4 -4
  72. package/dist/{render-v2-dbvpyysc.js → render-v2-gryrh9h8.js} +4 -4
  73. package/dist/{setup-qwx0j8z9.js → setup-q9720bt6.js} +2 -2
  74. package/dist/{virtual-modules-8qheft18.js → virtual-modules-3htpgn8x.js} +1 -1
  75. package/dist/{work-objects-sjbcmvep.js → work-objects-b76x7deb.js} +17 -17
  76. package/dist/{worker-xezqdkb7.js → worker-6vrxbv41.js} +26 -26
  77. package/openapi.json +1626 -629
  78. package/package.json +3 -2
  79. package/src/apps/catalog.generated.json +229 -0
  80. package/src/apps/page-validator.ts +71 -16
  81. package/src/apps/row-store.ts +66 -11
  82. package/src/apps/sync.ts +59 -17
  83. package/src/artifact-sdk/browser-sdk.ts +436 -2
  84. package/src/be/approval-sweeps.ts +109 -0
  85. package/src/be/boot-seeds.ts +40 -0
  86. package/src/be/chunking.ts +1 -1
  87. package/src/be/db/agents.ts +20 -0
  88. package/src/be/db/approvals.ts +78 -0
  89. package/src/be/db/tasks/read.ts +197 -39
  90. package/src/be/db/tasks/write.ts +41 -9
  91. package/src/be/db-client.ts +107 -48
  92. package/src/be/db.ts +219 -76
  93. package/src/be/events.ts +33 -1
  94. package/src/be/memory/graph-expansion.ts +10 -3
  95. package/src/be/memory/providers/sqlite-store.ts +55 -13
  96. package/src/be/memory/raters/retrieval.ts +5 -2
  97. package/src/be/memory/reranker.ts +26 -2
  98. package/src/be/memory/types.ts +2 -0
  99. package/src/be/migrations/166_approval_request_auto_cancellation.sql +9 -0
  100. package/src/be/migrations/171_memory_retrieval_relevance.sql +8 -0
  101. package/src/be/migrations/175_workflow_runs_list_index.sql +11 -0
  102. package/src/be/migrations/177_events_event_agent_created_index.sql +11 -0
  103. package/src/be/models-catalog.ts +2 -0
  104. package/src/be/modelsdev-cache.json +1857 -0
  105. package/src/be/modelsdev-cache.ts +14 -1
  106. package/src/be/pricing-normalize.ts +2 -0
  107. package/src/be/scripts/typecheck.ts +1 -0
  108. package/src/be/seed-pricing.ts +3 -1
  109. package/src/be/seed-skills/bundled-files.generated.json +1 -1
  110. package/src/be/steering.ts +53 -3
  111. package/src/be/swarm-config-guard.ts +3 -0
  112. package/src/be/task-citations.ts +29 -0
  113. package/src/cli.tsx +14 -1
  114. package/src/commands/onboard/compose-generator.ts +8 -3
  115. package/src/commands/onboard/container-engine.ts +220 -0
  116. package/src/commands/onboard/manifest.ts +1 -0
  117. package/src/commands/onboard/steps/health-check.tsx +4 -1
  118. package/src/commands/onboard/steps/prereq-check.tsx +50 -54
  119. package/src/commands/onboard/steps/start.tsx +31 -16
  120. package/src/commands/onboard/types.ts +7 -2
  121. package/src/commands/onboard.tsx +39 -4
  122. package/src/commands/profile-sync.ts +79 -26
  123. package/src/commands/runner.ts +8 -1
  124. package/src/extensions/catalog.generated.json +17 -0
  125. package/src/extensions/contract-types.generated.ts +1 -1
  126. package/src/heartbeat/heartbeat.ts +263 -103
  127. package/src/hooks/hook.ts +21 -12
  128. package/src/http/agents.ts +35 -0
  129. package/src/http/approval-requests.ts +136 -64
  130. package/src/http/apps.ts +14 -3
  131. package/src/http/config.ts +15 -1
  132. package/src/http/events.ts +62 -2
  133. package/src/http/index.ts +6 -4
  134. package/src/http/memory.ts +21 -7
  135. package/src/http/schedules.ts +1 -1
  136. package/src/http/session-data.ts +9 -4
  137. package/src/http/sessions.ts +25 -18
  138. package/src/http/stats.ts +19 -7
  139. package/src/http/status.ts +11 -1
  140. package/src/http/tasks.ts +40 -8
  141. package/src/http/webhooks.ts +67 -46
  142. package/src/http/workflows.ts +15 -20
  143. package/src/linear/outbound.ts +37 -15
  144. package/src/otel-impl.ts +151 -1
  145. package/src/otel.ts +14 -3
  146. package/src/prompts/memories.ts +19 -2
  147. package/src/providers/claude-managed-models.ts +8 -0
  148. package/src/providers/codex-agents-md.ts +140 -17
  149. package/src/providers/modelsdev-reasoning.json +551 -0
  150. package/src/rbac/legacy-policy.ts +16 -0
  151. package/src/rbac/permissions.ts +4 -0
  152. package/src/scheduler/deferred-task-waits.ts +28 -0
  153. package/src/scheduler/schedule-task.ts +3 -0
  154. package/src/scheduler/scheduler.ts +14 -0
  155. package/src/scripts-runtime/sdk-allowlist.ts +1 -0
  156. package/src/scripts-runtime/swarm-sdk.ts +9 -0
  157. package/src/scripts-runtime/types/stdlib.d.ts +1 -0
  158. package/src/scripts-runtime/types/swarm-extension.d.ts +1 -0
  159. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -0
  160. package/src/server.ts +12 -7
  161. package/src/slack/app.ts +35 -4
  162. package/src/slack/connection-state.ts +17 -0
  163. package/src/tasks/context-key.ts +1 -0
  164. package/src/tasks/worker-follow-up.ts +6 -2
  165. package/src/tests/agent-task-activity.test.ts +74 -0
  166. package/src/tests/agents-list-model-display.test.ts +6 -1
  167. package/src/tests/approval-auto-cancellation-migration.test.ts +104 -0
  168. package/src/tests/approval-requests.test.ts +395 -0
  169. package/src/tests/approval-sweeps-config.test.ts +47 -0
  170. package/src/tests/approval-sweeps.test.ts +508 -0
  171. package/src/tests/apps-kibo-blocks.test.ts +77 -0
  172. package/src/tests/apps-spike.test.ts +56 -1
  173. package/src/tests/apps-sync-engine.test.ts +20 -9
  174. package/src/tests/boot-seeds.test.ts +170 -0
  175. package/src/tests/cancel-approval-request-tool.test.ts +115 -0
  176. package/src/tests/claude-managed-adapter.test.ts +6 -0
  177. package/src/tests/codex-adapter.test.ts +126 -1
  178. package/src/tests/config-key-filter.test.ts +80 -0
  179. package/src/tests/context-window.test.ts +1 -0
  180. package/src/tests/db-client-busy-retry.test.ts +96 -0
  181. package/src/tests/db-client.test.ts +60 -1
  182. package/src/tests/db-task-read-contract.test.ts +10 -0
  183. package/src/tests/db-task-write-contract.test.ts +9 -0
  184. package/src/tests/deferred-schedule-reaper.test.ts +193 -0
  185. package/src/tests/docs-index-footprint.test.js +3 -3
  186. package/src/tests/events-http.test.ts +103 -0
  187. package/src/tests/extensions-catalog.test.ts +22 -17
  188. package/src/tests/extensions-pre-task.test.ts +107 -0
  189. package/src/tests/fixtures/kibo-blocks-definition.json.txt +105 -0
  190. package/src/tests/follow-up-config-inheritance.test.ts +260 -0
  191. package/src/tests/heartbeat-orphan-resume.test.ts +84 -0
  192. package/src/tests/heartbeat-reboot-live.test.ts +95 -0
  193. package/src/tests/heartbeat-stall-cas.test.ts +80 -0
  194. package/src/tests/heartbeat.test.ts +99 -3
  195. package/src/tests/hook-mcp-config.test.ts +29 -0
  196. package/src/tests/http-api-integration.test.ts +16 -2
  197. package/src/tests/kv-storage.test.ts +62 -0
  198. package/src/tests/linear-outbound-sync.test.ts +120 -5
  199. package/src/tests/list-endpoint-slimming.test.ts +91 -0
  200. package/src/tests/memory-graph-organic-route.test.ts +155 -0
  201. package/src/tests/memory-http-recall-gating.test.ts +14 -4
  202. package/src/tests/memory-hybrid.test.ts +161 -1
  203. package/src/tests/memory-prompt-recall-crowdout.test.ts +297 -0
  204. package/src/tests/memory.test.ts +22 -0
  205. package/src/tests/onboard-container-engine.test.ts +240 -0
  206. package/src/tests/otel-event-loop-and-logs.test.ts +99 -0
  207. package/src/tests/pricing-routes.test.ts +14 -0
  208. package/src/tests/profile-sync-warning.test.ts +8 -4
  209. package/src/tests/promote-draft-task-route.test.ts +19 -0
  210. package/src/tests/provider-registration.test.ts +296 -42
  211. package/src/tests/rbac-engine.test.ts +30 -0
  212. package/src/tests/reasoning-effort.test.ts +8 -0
  213. package/src/tests/script-connections.test.ts +7 -0
  214. package/src/tests/sdk-allowlist.test.ts +39 -0
  215. package/src/tests/session-costs-model-key-normalize.test.ts +1 -0
  216. package/src/tests/sessions-detail-batch.test.ts +250 -0
  217. package/src/tests/sessions.test.ts +118 -0
  218. package/src/tests/slack-config.test.ts +22 -0
  219. package/src/tests/sonnet-5-5-registry.test.ts +44 -0
  220. package/src/tests/status.test.ts +36 -1
  221. package/src/tests/swarm-diff.test.ts +316 -10
  222. package/src/tests/task-completion-idempotency.test.ts +2 -1
  223. package/src/tests/tasks-requested-by-filter.test.ts +3 -1
  224. package/src/tests/tool-annotations.test.ts +1 -1
  225. package/src/tests/ui-list-slim-projections.test.ts +158 -0
  226. package/src/tests/webhooks-task-blocked.test.ts +127 -0
  227. package/src/tests/workflow-approval-recovery.test.ts +203 -0
  228. package/src/tests/workflow-hitl-routing.test.ts +22 -1
  229. package/src/tests/workflow-hitl-slack-card.test.ts +52 -0
  230. package/src/tests/workflow-http-v2.test.ts +99 -8
  231. package/src/tests/workflow-retry-validation.test.ts +56 -0
  232. package/src/tests/workflow-tla-races.test.ts +389 -0
  233. package/src/tests/workflow-validation-port-routing.test.ts +113 -1
  234. package/src/tools/cancel-approval-request.ts +57 -0
  235. package/src/tools/memory-search.ts +1 -0
  236. package/src/tools/request-human-input.ts +4 -2
  237. package/src/tools/schedules/list-schedules.ts +4 -2
  238. package/src/tools/send-task.ts +4 -0
  239. package/src/tools/templates.ts +19 -0
  240. package/src/tools/tool-config.ts +2 -1
  241. package/src/tools/workflows/list-workflow-runs.ts +1 -0
  242. package/src/types.ts +38 -0
  243. package/src/utils/context-window.ts +1 -0
  244. package/src/workflows/approval-cancel.ts +152 -0
  245. package/src/workflows/approval-notifications.ts +84 -0
  246. package/src/workflows/checkpoint.ts +10 -5
  247. package/src/workflows/definition.ts +21 -0
  248. package/src/workflows/engine.ts +152 -21
  249. package/src/workflows/executors/human-in-the-loop.ts +1 -1
  250. package/src/workflows/recovery.ts +100 -45
  251. package/src/workflows/resume.ts +49 -18
  252. package/src/workflows/retry-poller.ts +71 -21
  253. package/templates/extensions/README.md +1 -0
  254. package/templates/extensions/github-sender-allowlist/README.md +18 -0
  255. package/templates/extensions/github-sender-allowlist/hooks.ts +55 -0
  256. package/templates/extensions/github-sender-allowlist/manifest.json +8 -0
  257. package/templates/skills/apps/content.md +20 -1
  258. package/templates/skills/code-quality/content.md +26 -1
  259. package/templates/skills/pages/content.md +16 -4
  260. package/templates/skills/pages/files/examples/multiplayer-board.html +3 -12
  261. package/templates/skills/scheduling/content.md +1 -1
  262. package/dist/cli-2daksqps.js +0 -378
  263. package/dist/rbac-roles-3zw68x72.js +0 -37
@@ -3,7 +3,7 @@ import {
3
3
  createDefaultMcpJson,
4
4
  createDefaultSettingsLocal,
5
5
  createHooksConfig
6
- } from "./cli-7pgcpcrg.js";
6
+ } from "./cli-9httdpyq.js";
7
7
  import {
8
8
  require_jsx_dev_runtime
9
9
  } from "./cli-eetrvv91.js";
@@ -18,7 +18,7 @@ import {
18
18
  import {
19
19
  init_package,
20
20
  package_default
21
- } from "./cli-865swy5p.js";
21
+ } from "./cli-c07r9a2m.js";
22
22
  import {
23
23
  Box_default,
24
24
  Select,
@@ -40,6 +40,148 @@ init_package();
40
40
  init_config();
41
41
  var import_react15 = __toESM(require_react(), 1);
42
42
 
43
+ // src/commands/onboard/container-engine.ts
44
+ var CONTAINER_ENGINE_PREFERENCES = [
45
+ "auto",
46
+ "docker",
47
+ "podman"
48
+ ];
49
+ var CONTAINER_ENGINE_LABELS = {
50
+ docker: "Docker",
51
+ podman: "Podman"
52
+ };
53
+ var ENGINE_INSTALL_HINTS = {
54
+ docker: "Install: brew install --cask docker (macOS) or https://docs.docker.com/get-docker/",
55
+ podman: "Install: https://podman.io/docs/installation"
56
+ };
57
+ var PODMAN_COMPOSE_PROVIDER_HINT = "`podman compose` needs an external Compose provider. Install podman-compose (dnf/apt install podman-compose, or pipx install podman-compose) or docker-compose v2, or point PODMAN_COMPOSE_PROVIDER at one. See https://docs.agent-swarm.dev/docs/guides/podman-rootless";
58
+ function isContainerEnginePreference(value) {
59
+ return CONTAINER_ENGINE_PREFERENCES.includes(value);
60
+ }
61
+ var CONTAINER_ENGINE_ENV = "AGENT_SWARM_CONTAINER_ENGINE";
62
+ function resolveContainerEnginePreference(flag, env) {
63
+ const options = CONTAINER_ENGINE_PREFERENCES.join(", ");
64
+ if (flag !== undefined) {
65
+ if (!isContainerEnginePreference(flag)) {
66
+ return { ok: false, error: `Invalid container engine "${flag}". Options: ${options}` };
67
+ }
68
+ return { ok: true, value: flag };
69
+ }
70
+ const fromEnv = env[CONTAINER_ENGINE_ENV];
71
+ if (fromEnv === undefined || fromEnv === "")
72
+ return { ok: true, value: "auto" };
73
+ if (!isContainerEnginePreference(fromEnv)) {
74
+ return {
75
+ ok: false,
76
+ error: `Invalid ${CONTAINER_ENGINE_ENV} "${fromEnv}". Options: ${options}`
77
+ };
78
+ }
79
+ return { ok: true, value: fromEnv };
80
+ }
81
+ function engineForCommands(preference) {
82
+ return preference === "podman" ? "podman" : "docker";
83
+ }
84
+ function composeArgv(engine, args) {
85
+ return [engine, "compose", ...args];
86
+ }
87
+ function composeCommandText(engine, args) {
88
+ return `${engine} compose ${args}`;
89
+ }
90
+ var defaultCommandRunner = async (argv, options) => {
91
+ try {
92
+ const proc = Bun.spawn(argv, {
93
+ cwd: options?.cwd,
94
+ stdout: "pipe",
95
+ stderr: "pipe",
96
+ stdin: "ignore"
97
+ });
98
+ const [stdout, stderr, exitCode] = await Promise.all([
99
+ new Response(proc.stdout).text(),
100
+ new Response(proc.stderr).text(),
101
+ proc.exited
102
+ ]);
103
+ return { exitCode, stdout, stderr };
104
+ } catch (err) {
105
+ return {
106
+ exitCode: 127,
107
+ stdout: "",
108
+ stderr: err instanceof Error ? err.message : String(err)
109
+ };
110
+ }
111
+ };
112
+ function firstLine(text) {
113
+ return text.trim().split(`
114
+ `)[0]?.trim() ?? "";
115
+ }
116
+ async function checkBinary(engine, run) {
117
+ const label = CONTAINER_ENGINE_LABELS[engine];
118
+ const result = await run([engine, "--version"]);
119
+ if (result.exitCode === 0)
120
+ return { ok: true, version: firstLine(result.stdout) };
121
+ return {
122
+ ok: false,
123
+ error: result.exitCode === 127 ? `${label} not found` : `${label} exited with non-zero status`,
124
+ hint: ENGINE_INSTALL_HINTS[engine]
125
+ };
126
+ }
127
+ async function checkCompose(engine, run) {
128
+ const result = await run(composeArgv(engine, ["version"]));
129
+ if (result.exitCode === 0) {
130
+ return { ok: true, version: firstLine(result.stdout) || firstLine(result.stderr) };
131
+ }
132
+ if (engine === "podman") {
133
+ const detail = firstLine(result.stderr) || firstLine(result.stdout);
134
+ return {
135
+ ok: false,
136
+ error: `podman compose has no working Compose provider${detail ? ` (${detail})` : ""}`,
137
+ hint: PODMAN_COMPOSE_PROVIDER_HINT
138
+ };
139
+ }
140
+ return {
141
+ ok: false,
142
+ error: "Docker Compose v2 not found",
143
+ hint: "Install the Compose v2 plugin: https://docs.docker.com/compose/install/"
144
+ };
145
+ }
146
+ async function probeEngine(engine, run = defaultCommandRunner) {
147
+ const binary = await checkBinary(engine, run);
148
+ if (!binary.ok) {
149
+ return { engine, binary, compose: { ok: false, error: "skipped: engine unavailable" } };
150
+ }
151
+ return { engine, binary, compose: await checkCompose(engine, run) };
152
+ }
153
+ function probeError(probe) {
154
+ if (!probe.binary.ok)
155
+ return probe.binary.error ?? "engine unavailable";
156
+ return probe.compose.error ?? "Compose unavailable";
157
+ }
158
+ async function resolveContainerEngine(preference, run = defaultCommandRunner) {
159
+ if (preference !== "auto") {
160
+ const probe = await probeEngine(preference, run);
161
+ if (probe.binary.ok && probe.compose.ok)
162
+ return { ok: true, engine: preference, probe };
163
+ return { ok: false, engine: preference, error: probeError(probe), probe };
164
+ }
165
+ const docker = await probeEngine("docker", run);
166
+ if (docker.binary.ok) {
167
+ if (docker.compose.ok)
168
+ return { ok: true, engine: "docker", probe: docker };
169
+ return { ok: false, engine: "docker", error: probeError(docker), probe: docker };
170
+ }
171
+ const podman = await probeEngine("podman", run);
172
+ if (podman.binary.ok) {
173
+ if (podman.compose.ok)
174
+ return { ok: true, engine: "podman", probe: podman };
175
+ return { ok: false, engine: "podman", error: probeError(podman), probe: podman };
176
+ }
177
+ return {
178
+ ok: false,
179
+ engine: null,
180
+ error: "Neither Docker nor Podman was found",
181
+ probe: docker
182
+ };
183
+ }
184
+
43
185
  // src/commands/onboard/dashboard-url.ts
44
186
  var DEFAULT_DASHBOARD_BASE = "https://app.agent-swarm.dev";
45
187
  function buildOnboardDashboardUrl(parts) {
@@ -79,7 +221,7 @@ var STEP_LABELS = [
79
221
  { step: "integration_menu", label: "Integrations" },
80
222
  { step: "review", label: "Review" },
81
223
  { step: "generate", label: "Generate" },
82
- { step: "prereq_check", label: "Docker" },
224
+ { step: "prereq_check", label: "Engine" },
83
225
  { step: "start", label: "Start" },
84
226
  { step: "health_check", label: "Health" },
85
227
  { step: "post_connect", label: "Connect" },
@@ -138,6 +280,7 @@ var INITIAL_STATE = {
138
280
  apiPort: 0,
139
281
  maxConcurrentTasks: null,
140
282
  pullPolicy: "always",
283
+ containerEngine: "auto",
141
284
  outputDir: process.cwd(),
142
285
  nonInteractive: false,
143
286
  error: null,
@@ -878,6 +1021,7 @@ var ENV_AWS_SESSION_TOKEN = " - AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN:-}";
878
1021
  var ENV_AWS_PROFILE = " - AWS_PROFILE=${AWS_PROFILE}";
879
1022
  var ENV_BEDROCK_AUTH_MODE = " - BEDROCK_AUTH_MODE=${BEDROCK_AUTH_MODE}";
880
1023
  var AWS_PROFILE_VOLUME = " - ${HOME}/.aws:/home/worker/.aws:ro";
1024
+ var AWS_PROFILE_VOLUME_SELINUX = " - ${HOME}/.aws:/home/worker/.aws:ro,z";
881
1025
  var ENV_GITHUB_TOKEN = " - GITHUB_TOKEN=${GITHUB_TOKEN}";
882
1026
  var ENV_GITHUB_EMAIL = " - GITHUB_EMAIL=${GITHUB_EMAIL}";
883
1027
  var ENV_GITHUB_NAME = " - GITHUB_NAME=${GITHUB_NAME}";
@@ -921,11 +1065,12 @@ function appendProviderEnvironment(lines, state, includeHarness) {
921
1065
  function generateCompose(state) {
922
1066
  const expanded = expandServices(state.services, state.agentIds);
923
1067
  const lines = [];
924
- lines.push("# Docker Compose for Agent Swarm");
1068
+ const engine = engineForCommands(state.containerEngine);
1069
+ lines.push(`# ${engine === "podman" ? "Podman" : "Docker"} Compose for Agent Swarm`);
925
1070
  lines.push("# Generated by `agent-swarm onboard`");
926
1071
  lines.push("#");
927
1072
  lines.push("# Usage:");
928
- lines.push("# docker compose --env-file .env up -d");
1073
+ lines.push(`# ${composeCommandText(engine, "--env-file .env up -d")}`);
929
1074
  lines.push("#");
930
1075
  lines.push("# Image version: set AGENT_SWARM_VERSION in .env to a published release.");
931
1076
  lines.push("# Blank falls back to `latest`, which moves on every commit to main and is");
@@ -1027,7 +1172,7 @@ function generateCompose(state) {
1027
1172
  lines.push(" - swarm_shared:/app/shared");
1028
1173
  lines.push(` - swarm_${svc.sanitizedName}:/app/agent`);
1029
1174
  if (state.provider === "bedrock" && state.awsProfile) {
1030
- lines.push(AWS_PROFILE_VOLUME);
1175
+ lines.push(engine === "podman" ? AWS_PROFILE_VOLUME_SELINUX : AWS_PROFILE_VOLUME);
1031
1176
  }
1032
1177
  lines.push("");
1033
1178
  lines.push(" restart: unless-stopped");
@@ -1161,6 +1306,7 @@ function generateManifest(state) {
1161
1306
  providerLabel: PROVIDER_LABELS[state.provider],
1162
1307
  providerNotice: state.provider === "bedrock" ? BEDROCK_ALPHA_NOTICE : undefined,
1163
1308
  harness: state.harness,
1309
+ containerEngine: state.containerEngine,
1164
1310
  services: expanded.map((svc) => ({
1165
1311
  name: svc.name,
1166
1312
  templateId: svc.entry.template,
@@ -1894,8 +2040,11 @@ function HealthCheckStep({ state, addLog, goToNext }) {
1894
2040
  }, undefined, true, undefined, this),
1895
2041
  /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(Text, {
1896
2042
  dimColor: true,
1897
- children: "Try: docker compose logs --tail 50"
1898
- }, undefined, false, undefined, this),
2043
+ children: [
2044
+ "Try: ",
2045
+ composeCommandText(engineForCommands(state.containerEngine), "logs --tail 50")
2046
+ ]
2047
+ }, undefined, true, undefined, this),
1899
2048
  /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(Box_default, {
1900
2049
  marginTop: 1,
1901
2050
  children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(Select, {
@@ -2945,30 +3094,9 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
2945
3094
  executed.current = true;
2946
3095
  const run = async () => {
2947
3096
  const res = {
2948
- docker: { ok: false },
2949
- compose: { ok: false },
3097
+ engine: await resolveContainerEngine(state.containerEngine),
2950
3098
  ports: { ok: true }
2951
3099
  };
2952
- try {
2953
- const out = await Bun.$`docker --version`.quiet();
2954
- if (out.exitCode === 0) {
2955
- res.docker = { ok: true, version: out.text().trim() };
2956
- } else {
2957
- res.docker = { ok: false, error: "Docker exited with non-zero status" };
2958
- }
2959
- } catch {
2960
- res.docker = { ok: false, error: "Docker not found" };
2961
- }
2962
- try {
2963
- const out = await Bun.$`docker compose version`.quiet();
2964
- if (out.exitCode === 0) {
2965
- res.compose = { ok: true, version: out.text().trim() };
2966
- } else {
2967
- res.compose = { ok: false, error: "Docker Compose not found" };
2968
- }
2969
- } catch {
2970
- res.compose = { ok: false, error: "Docker Compose v2 not found" };
2971
- }
2972
3100
  const portsToCheck = [3013];
2973
3101
  const agentCount = state.services.reduce((sum, s) => sum + s.count, 0);
2974
3102
  for (let i = 0;i < agentCount; i++) {
@@ -2988,7 +3116,8 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
2988
3116
  res.ports = { ok: false, conflicts };
2989
3117
  }
2990
3118
  setResult(res);
2991
- if (res.docker.ok && res.compose.ok && res.ports.ok) {
3119
+ if (res.engine.ok && res.ports.ok) {
3120
+ addLog(`Container engine: ${CONTAINER_ENGINE_LABELS[res.engine.engine]}`);
2992
3121
  addLog("All prerequisites met");
2993
3122
  setStatus("passed");
2994
3123
  } else {
@@ -2996,13 +3125,14 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
2996
3125
  }
2997
3126
  };
2998
3127
  run().catch((err) => goToError(err.message));
2999
- }, [state.services, addLog, goToError]);
3128
+ }, [state.services, state.containerEngine, addLog, goToError]);
3000
3129
  import_react13.useEffect(() => {
3001
- if (status === "passed") {
3002
- const timer = setTimeout(() => goToNext(), 500);
3130
+ if (status === "passed" && result?.engine.ok) {
3131
+ const engine = result.engine.engine;
3132
+ const timer = setTimeout(() => goToNext({ containerEngine: engine }), 500);
3003
3133
  return () => clearTimeout(timer);
3004
3134
  }
3005
- }, [status, goToNext]);
3135
+ }, [status, result, goToNext]);
3006
3136
  if (status === "checking") {
3007
3137
  return /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3008
3138
  padding: 1,
@@ -3011,7 +3141,7 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
3011
3141
  }, undefined, false, undefined, this)
3012
3142
  }, undefined, false, undefined, this);
3013
3143
  }
3014
- if (status === "passed" && result) {
3144
+ if (status === "passed" && result?.engine.ok) {
3015
3145
  return /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3016
3146
  flexDirection: "column",
3017
3147
  padding: 1,
@@ -3021,7 +3151,7 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
3021
3151
  children: [
3022
3152
  "✓",
3023
3153
  " ",
3024
- result.docker.version
3154
+ result.engine.probe.binary.version
3025
3155
  ]
3026
3156
  }, undefined, true, undefined, this),
3027
3157
  /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
@@ -3029,7 +3159,7 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
3029
3159
  children: [
3030
3160
  "✓",
3031
3161
  " ",
3032
- result.compose.version
3162
+ result.engine.probe.compose.version
3033
3163
  ]
3034
3164
  }, undefined, true, undefined, this),
3035
3165
  /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
@@ -3042,50 +3172,48 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
3042
3172
  ]
3043
3173
  }, undefined, true, undefined, this);
3044
3174
  }
3175
+ const probe = result?.engine.probe ?? null;
3176
+ const engineLabel = probe ? CONTAINER_ENGINE_LABELS[probe.engine] : "Container engine";
3045
3177
  return /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3046
3178
  flexDirection: "column",
3047
3179
  padding: 1,
3048
3180
  children: [
3049
- result?.docker.ok ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3050
- color: "green",
3051
- children: [
3052
- "✓",
3053
- " ",
3054
- result.docker.version
3055
- ]
3056
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3181
+ result && !result.engine.ok && !result.engine.engine ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3057
3182
  flexDirection: "column",
3058
3183
  children: [
3059
3184
  /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3060
3185
  color: "red",
3061
3186
  children: [
3062
3187
  "✗",
3063
- " Docker: ",
3064
- result?.docker.error
3188
+ " ",
3189
+ result.engine.error
3065
3190
  ]
3066
3191
  }, undefined, true, undefined, this),
3067
3192
  /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3068
3193
  dimColor: true,
3069
3194
  children: [
3070
3195
  " ",
3071
- "Install: brew install --cask docker (macOS) or https://docs.docker.com/get-docker/"
3196
+ ENGINE_INSTALL_HINTS.docker
3197
+ ]
3198
+ }, undefined, true, undefined, this),
3199
+ /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3200
+ dimColor: true,
3201
+ children: [
3202
+ " or ",
3203
+ ENGINE_INSTALL_HINTS.podman
3072
3204
  ]
3073
3205
  }, undefined, true, undefined, this)
3074
3206
  ]
3075
- }, undefined, true, undefined, this),
3076
- result?.compose.ok ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3077
- color: "green",
3078
- children: [
3079
- "✓",
3080
- " ",
3081
- result.compose.version
3082
- ]
3083
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3084
- color: "red",
3207
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(jsx_dev_runtime15.Fragment, {
3085
3208
  children: [
3086
- "✗",
3087
- " Docker Compose v2: ",
3088
- result?.compose.error
3209
+ /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(CheckLine, {
3210
+ label: engineLabel,
3211
+ check: probe?.binary
3212
+ }, undefined, false, undefined, this),
3213
+ probe?.binary.ok ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(CheckLine, {
3214
+ label: `${engineLabel} Compose`,
3215
+ check: probe.compose
3216
+ }, undefined, false, undefined, this) : null
3089
3217
  ]
3090
3218
  }, undefined, true, undefined, this),
3091
3219
  result?.ports.ok ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
@@ -3134,6 +3262,40 @@ function PrereqCheckStep({ state, addLog, goToNext, goToStep, goToError }) {
3134
3262
  ]
3135
3263
  }, undefined, true, undefined, this);
3136
3264
  }
3265
+ function CheckLine({ label, check }) {
3266
+ if (check?.ok) {
3267
+ return /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3268
+ color: "green",
3269
+ children: [
3270
+ "✓",
3271
+ " ",
3272
+ check.version
3273
+ ]
3274
+ }, undefined, true, undefined, this);
3275
+ }
3276
+ return /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Box_default, {
3277
+ flexDirection: "column",
3278
+ children: [
3279
+ /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3280
+ color: "red",
3281
+ children: [
3282
+ "✗",
3283
+ " ",
3284
+ label,
3285
+ ": ",
3286
+ check?.error
3287
+ ]
3288
+ }, undefined, true, undefined, this),
3289
+ check?.hint ? /* @__PURE__ */ jsx_dev_runtime15.jsxDEV(Text, {
3290
+ dimColor: true,
3291
+ children: [
3292
+ " ",
3293
+ check.hint
3294
+ ]
3295
+ }, undefined, true, undefined, this) : null
3296
+ ]
3297
+ }, undefined, true, undefined, this);
3298
+ }
3137
3299
 
3138
3300
  // src/commands/onboard/steps/review.tsx
3139
3301
  var jsx_dev_runtime16 = __toESM(require_jsx_dev_runtime(), 1);
@@ -3298,20 +3460,22 @@ function StartStep({ state, addLog, goToNext }) {
3298
3460
  const [status, setStatus] = import_react14.useState("starting");
3299
3461
  const [errorMsg, setErrorMsg] = import_react14.useState("");
3300
3462
  const executed = import_react14.useRef(false);
3463
+ const engine = engineForCommands(state.containerEngine);
3464
+ const engineLabel = CONTAINER_ENGINE_LABELS[engine];
3301
3465
  import_react14.useEffect(() => {
3302
3466
  if (executed.current)
3303
3467
  return;
3304
3468
  executed.current = true;
3305
3469
  const run = async () => {
3306
- addLog("Running docker compose up -d...");
3470
+ addLog(`Running ${composeCommandText(engine, "--env-file .env up -d")}...`);
3307
3471
  try {
3308
- const result = await Bun.$`docker compose --env-file .env up -d`.cwd(state.outputDir).quiet();
3472
+ const result = await defaultCommandRunner(composeArgv(engine, ["--env-file", ".env", "up", "-d"]), { cwd: state.outputDir });
3309
3473
  if (result.exitCode === 0) {
3310
- addLog("Docker stack started successfully");
3474
+ addLog(`${engineLabel} stack started successfully`);
3311
3475
  setStatus("success");
3312
3476
  } else {
3313
- const stderr = result.stderr.toString().trim();
3314
- setErrorMsg(stderr || "docker compose up failed");
3477
+ const stderr = result.stderr.trim();
3478
+ setErrorMsg(stderr || `${composeCommandText(engine, "up")} failed`);
3315
3479
  setStatus("failed");
3316
3480
  }
3317
3481
  } catch (err) {
@@ -3320,7 +3484,7 @@ function StartStep({ state, addLog, goToNext }) {
3320
3484
  }
3321
3485
  };
3322
3486
  run().catch((err) => addLog(`Start failed: ${err}`));
3323
- }, [state.outputDir, addLog]);
3487
+ }, [state.outputDir, engine, engineLabel, addLog]);
3324
3488
  import_react14.useEffect(() => {
3325
3489
  if (status === "success") {
3326
3490
  const timer = setTimeout(() => goToNext(), 500);
@@ -3331,7 +3495,7 @@ function StartStep({ state, addLog, goToNext }) {
3331
3495
  return /* @__PURE__ */ jsx_dev_runtime17.jsxDEV(Box_default, {
3332
3496
  padding: 1,
3333
3497
  children: /* @__PURE__ */ jsx_dev_runtime17.jsxDEV(Spinner, {
3334
- label: "Starting Docker stack..."
3498
+ label: `Starting ${engineLabel} stack...`
3335
3499
  }, undefined, false, undefined, this)
3336
3500
  }, undefined, false, undefined, this);
3337
3501
  }
@@ -3342,7 +3506,9 @@ function StartStep({ state, addLog, goToNext }) {
3342
3506
  color: "green",
3343
3507
  children: [
3344
3508
  "✓",
3345
- " Docker stack started"
3509
+ " ",
3510
+ engineLabel,
3511
+ " stack started"
3346
3512
  ]
3347
3513
  }, undefined, true, undefined, this)
3348
3514
  }, undefined, false, undefined, this);
@@ -3355,7 +3521,9 @@ function StartStep({ state, addLog, goToNext }) {
3355
3521
  color: "red",
3356
3522
  children: [
3357
3523
  "✗",
3358
- " Failed to start Docker stack"
3524
+ " Failed to start ",
3525
+ engineLabel,
3526
+ " stack"
3359
3527
  ]
3360
3528
  }, undefined, true, undefined, this),
3361
3529
  /* @__PURE__ */ jsx_dev_runtime17.jsxDEV(Text, {
@@ -3367,7 +3535,7 @@ function StartStep({ state, addLog, goToNext }) {
3367
3535
  children: /* @__PURE__ */ jsx_dev_runtime17.jsxDEV(Select, {
3368
3536
  options: [
3369
3537
  { label: "Retry", value: "retry" },
3370
- { label: "View logs (docker compose logs)", value: "logs" },
3538
+ { label: `View logs (${composeCommandText(engine, "logs")})`, value: "logs" },
3371
3539
  { label: "Skip", value: "skip" }
3372
3540
  ],
3373
3541
  onChange: async (value2) => {
@@ -3377,8 +3545,8 @@ function StartStep({ state, addLog, goToNext }) {
3377
3545
  setErrorMsg("");
3378
3546
  } else if (value2 === "logs") {
3379
3547
  try {
3380
- const logs = await Bun.$`docker compose logs --tail 30`.cwd(state.outputDir).quiet();
3381
- addLog(logs.text());
3548
+ const logs = await defaultCommandRunner(composeArgv(engine, ["logs", "--tail", "30"]), { cwd: state.outputDir });
3549
+ addLog(logs.stdout || logs.stderr);
3382
3550
  } catch {
3383
3551
  addLog("Failed to fetch logs");
3384
3552
  }
@@ -3405,7 +3573,8 @@ function Onboard({
3405
3573
  yes = false,
3406
3574
  preset,
3407
3575
  maxConcurrentTasks,
3408
- pullPolicy
3576
+ pullPolicy,
3577
+ containerEngine
3409
3578
  }) {
3410
3579
  const { exit } = use_app_default();
3411
3580
  const [state, setState] = import_react15.useState(() => {
@@ -3428,6 +3597,13 @@ function Onboard({
3428
3597
  }
3429
3598
  initial.pullPolicy = pullPolicy;
3430
3599
  }
3600
+ const engine = resolveContainerEnginePreference(containerEngine, process.env);
3601
+ if (!engine.ok) {
3602
+ initial.step = "error";
3603
+ initial.error = engine.error;
3604
+ return initial;
3605
+ }
3606
+ initial.containerEngine = engine.value;
3431
3607
  return initial;
3432
3608
  });
3433
3609
  const [ctrlCPressed, setCtrlCPressed] = import_react15.useState(false);
@@ -3673,12 +3849,18 @@ function Onboard({
3673
3849
  }, undefined, false, undefined, this),
3674
3850
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Text, {
3675
3851
  dimColor: true,
3676
- children: " docker compose logs -f"
3677
- }, undefined, false, undefined, this),
3852
+ children: [
3853
+ " ",
3854
+ composeCommandText(engineForCommands(state.containerEngine), "logs -f")
3855
+ ]
3856
+ }, undefined, true, undefined, this),
3678
3857
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Text, {
3679
3858
  dimColor: true,
3680
- children: " docker compose down"
3681
- }, undefined, false, undefined, this),
3859
+ children: [
3860
+ " ",
3861
+ composeCommandText(engineForCommands(state.containerEngine), "down")
3862
+ ]
3863
+ }, undefined, true, undefined, this),
3682
3864
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Text, {
3683
3865
  dimColor: true,
3684
3866
  children: " agent-swarm setup"
@@ -3722,8 +3904,23 @@ function renderStep(step, props) {
3722
3904
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Box_default, {
3723
3905
  marginTop: 1,
3724
3906
  children: /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Select, {
3725
- options: [{ label: "Local (Docker Compose)", value: "local" }],
3726
- onChange: () => props.goToNext({ deployType: "local" })
3907
+ defaultValue: props.state.containerEngine,
3908
+ options: [
3909
+ {
3910
+ label: "Local, auto-detect engine (Docker if installed, else Podman)",
3911
+ value: "auto"
3912
+ },
3913
+ { label: `Local (${CONTAINER_ENGINE_LABELS.docker} Compose)`, value: "docker" },
3914
+ {
3915
+ label: `Local (${CONTAINER_ENGINE_LABELS.podman} Compose, rootless)`,
3916
+ value: "podman"
3917
+ }
3918
+ ],
3919
+ onChange: (value2) => {
3920
+ if (!isContainerEnginePreference(value2))
3921
+ return;
3922
+ props.goToNext({ deployType: "local", containerEngine: value2 });
3923
+ }
3727
3924
  }, undefined, false, undefined, this)
3728
3925
  }, undefined, false, undefined, this),
3729
3926
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Text, {
@@ -5,14 +5,14 @@ import {
5
5
  applyOpenRouterBaseUrlOverride,
6
6
  checkOpencodeCredentials,
7
7
  resolveContextModePluginPath
8
- } from "./cli-58rgvkt4.js";
8
+ } from "./cli-1hkrch3k.js";
9
9
  import"./cli-5bfdm1ah.js";
10
10
  import"./cli-r94z9p1z.js";
11
11
  import"./cli-2djtr51b.js";
12
12
  import"./cli-tng3131n.js";
13
13
  import"./cli-zm7njwzd.js";
14
- import"./cli-e781c6f9.js";
15
- import"./cli-avkd6mqv.js";
14
+ import"./cli-0xjkj1j7.js";
15
+ import"./cli-h967nb6r.js";
16
16
  import"./cli-re8z5p8p.js";
17
17
  import"./cli-3dpj7atn.js";
18
18
  import"./cli-19jenss3.js";