@desplega.ai/agent-swarm 2.5.4 → 2.7.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 (354) hide show
  1. package/README.md +4 -2
  2. package/dist/{acp-adapter-ek38cwsv.js → acp-adapter-ma1js5n7.js} +9 -9
  3. package/dist/{actions-92mepq03.js → actions-1vhmtvg9.js} +21 -21
  4. package/dist/{amp-adapter-9gaxg015.js → amp-adapter-sxqqvmdk.js} +4 -4
  5. package/dist/{app-ctn8gsgx.js → app-mwx1d5a9.js} +3 -3
  6. package/dist/{assistant-zyr5kz47.js → assistant-yx1p6g82.js} +30 -26
  7. package/dist/{boot-reembed-w75maga2.js → boot-reembed-5h37a2c2.js} +1 -1
  8. package/dist/{boot-reembed-dwzfttdr.js → boot-reembed-7h78vmvv.js} +2 -1
  9. package/dist/{boot-scrub-sweep-e9kq43kf.js → boot-scrub-sweep-8mawd4gw.js} +4 -4
  10. package/dist/{boot-seeds-x28v3fhb.js → boot-seeds-ca84dhnn.js} +4 -4
  11. package/dist/{claude-adapter-f0afqnne.js → claude-adapter-wqt4hfkq.js} +9 -9
  12. package/dist/{claude-managed-adapter-x81a7r65.js → claude-managed-adapter-6fjqtr2z.js} +2 -2
  13. package/dist/{claude-managed-setup-bqzwjd9x.js → claude-managed-setup-rqv98sea.js} +10 -3
  14. package/dist/{claude-sdk-session-7b7whkaq.js → claude-sdk-session-f29f3b2x.js} +11 -11
  15. package/dist/{cli-sxgtf5fw.js → cli-07q03xm2.js} +1 -1
  16. package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
  17. package/dist/{cli-g9vd9ece.js → cli-1hhbzkbb.js} +14 -16
  18. package/dist/{cli-qqzmjxkf.js → cli-1m9x8dr5.js} +11 -6
  19. package/dist/{cli-jbnn4vxb.js → cli-2pvzmas1.js} +3 -3
  20. package/dist/{cli-x77gen2p.js → cli-2y7v133v.js} +7 -7
  21. package/dist/{cli-dew6x255.js → cli-39aet655.js} +2 -2
  22. package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
  23. package/dist/{cli-jb30dzvk.js → cli-48gxjmcz.js} +530 -190
  24. package/dist/{cli-pzatvw94.js → cli-54sj64fc.js} +2 -2
  25. package/dist/{cli-bvpgr9ny.js → cli-60sty27p.js} +5 -5
  26. package/dist/{cli-asq5ydm4.js → cli-6a9qfa8b.js} +411 -69
  27. package/dist/{cli-277c31dw.js → cli-6mgdba42.js} +225 -3
  28. package/dist/{cli-19202kew.js → cli-6srv653c.js} +5 -5
  29. package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
  30. package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
  31. package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
  32. package/dist/{cli-hh5we352.js → cli-86ehn4s5.js} +7 -7
  33. package/dist/{cli-9s05422w.js → cli-8mbc9za9.js} +1 -1
  34. package/dist/{cli-ff1tm9n9.js → cli-8wmj18cz.js} +1 -1
  35. package/dist/{cli-1r5ad7j5.js → cli-9gsm2rzp.js} +12 -12
  36. package/dist/{cli-mz9afxxf.js → cli-9pshx6rd.js} +17 -3
  37. package/dist/{cli-s682zgqz.js → cli-a6ds2epe.js} +1 -1
  38. package/dist/{cli-6a1xg1p7.js → cli-a89zdqz9.js} +2 -2
  39. package/dist/{cli-03vpq45j.js → cli-ay40dnj3.js} +2 -2
  40. package/dist/{cli-tsma7p8v.js → cli-aypd09nf.js} +2 -2
  41. package/dist/{cli-ethgy7ha.js → cli-b3yzyc57.js} +2 -2
  42. package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
  43. package/dist/{cli-mmhj8vd7.js → cli-c668vvcf.js} +11 -2
  44. package/dist/{cli-sbwsxvtd.js → cli-d20qvpr2.js} +2 -2
  45. package/dist/{cli-c952c7ac.js → cli-e1595bgx.js} +3 -3
  46. package/dist/{cli-621ce7kw.js → cli-f12mr20z.js} +3 -3
  47. package/dist/{cli-dqygeeh5.js → cli-f1e0ptjj.js} +10 -1
  48. package/dist/{cli-xzfq4at3.js → cli-f4dbh7a5.js} +16 -12
  49. package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
  50. package/dist/{cli-5bnsc0e1.js → cli-gsfk58nw.js} +5 -5
  51. package/dist/cli-gt4h8cxw.js +895 -0
  52. package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
  53. package/dist/{cli-25n3mv5d.js → cli-h5jeg46p.js} +6 -6
  54. package/dist/{cli-gn5af0x5.js → cli-he9gbdx0.js} +62 -12
  55. package/dist/{cli-gbfxp48k.js → cli-j0ppywdr.js} +42 -35
  56. package/dist/{cli-k4tjsdx9.js → cli-j3y0x2n4.js} +277 -199
  57. package/dist/{cli-7p4jxgtt.js → cli-j9bpmykh.js} +75 -27
  58. package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
  59. package/dist/{cli-wx2nj19m.js → cli-kv7sbc2c.js} +6 -6
  60. package/dist/{cli-abs8ndtr.js → cli-m30k9777.js} +26 -26
  61. package/dist/{cli-cz5nmdxt.js → cli-m5e802r7.js} +2 -2
  62. package/dist/{cli-0shx9j93.js → cli-pfk92eqz.js} +2 -2
  63. package/dist/{cli-xtrz6bzs.js → cli-ptfq202x.js} +5 -3
  64. package/dist/{cli-6n8axjv1.js → cli-qj442fws.js} +2 -2
  65. package/dist/{cli-c61mbdds.js → cli-rd5m70gj.js} +4 -4
  66. package/dist/{cli-eftzyh9y.js → cli-s09j9vp5.js} +2 -2
  67. package/dist/{cli-m4ecdxvz.js → cli-s0mgx214.js} +7 -7
  68. package/dist/{cli-wghjkr0e.js → cli-sgqm2582.js} +10 -7
  69. package/dist/{cli-2655k16q.js → cli-sjctjr48.js} +2 -2
  70. package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
  71. package/dist/{cli-x0f2v69c.js → cli-twctnkng.js} +12 -7
  72. package/dist/{cli-j6rktc91.js → cli-v6shg7na.js} +1 -1
  73. package/dist/{cli-gx4rm0qx.js → cli-vz78s5wm.js} +1 -1
  74. package/dist/{cli-gwhjmh8g.js → cli-wqr7cea4.js} +5 -5
  75. package/dist/{cli-e42vss7b.js → cli-x37r7qwf.js} +16 -8
  76. package/dist/{cli-4b2z6n0m.js → cli-yd2nreqw.js} +17 -8
  77. package/dist/{cli-64mh9mf3.js → cli-ymjpkxgn.js} +69 -17
  78. package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
  79. package/dist/{cli-9j129brq.js → cli-yxbsmx56.js} +6 -6
  80. package/dist/cli.js +22 -20
  81. package/dist/{codex-adapter-wch12q99.js → codex-adapter-zk59x2zh.js} +7 -7
  82. package/dist/{codex-hook-brpnycn5.js → codex-hook-xyjhvxwd.js} +1 -1
  83. package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
  84. package/dist/{codex-session-runner-41pfcr95.js → codex-session-runner-kh6s4j3n.js} +8 -8
  85. package/dist/{commands-9849dkj6.js → commands-68et1qv2.js} +2 -2
  86. package/dist/{controller-ja0sd95p.js → controller-fyrbnzg4.js} +4 -4
  87. package/dist/{controllers-connect-xp05dj6x.js → controllers-connect-nep9h2xv.js} +23 -23
  88. package/dist/{cursor-adapter-623qxqew.js → cursor-adapter-yss3pg7t.js} +2 -2
  89. package/dist/{db-w759qmx0.js → db-28gjyvxj.js} +4 -2
  90. package/dist/{db-47vj40dy.js → db-8ftwvzba.js} +3 -3
  91. package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
  92. package/dist/{dispatcher-7b8e4z2j.js → dispatcher-hayexmkr.js} +20 -20
  93. package/dist/{docker-s84hjs91.js → docker-fdzyewpz.js} +2 -2
  94. package/dist/{dsh-adapter-2ezw3xea.js → dsh-adapter-46wawff9.js} +2 -2
  95. package/dist/{e2b-9gkdhm3c.js → e2b-222hsajc.js} +2 -2
  96. package/dist/{e2b-cjtf8k1z.js → e2b-fn3zacvt.js} +2 -2
  97. package/dist/{easter-egg-3d-e4qv8dxj.js → easter-egg-3d-8d1e0h4m.js} +1 -1
  98. package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
  99. package/dist/{execute-0xpz8950.js → execute-cjrfxfnm.js} +1 -1
  100. package/dist/{external-channel-e2s028da.js → external-channel-xbmxcg09.js} +2 -2
  101. package/dist/{grok-adapter-ys7gaqee.js → grok-adapter-ag4wks2a.js} +10 -10
  102. package/dist/handlers-tzmevqb5.js +41 -0
  103. package/dist/{heartbeat-w3mntghj.js → heartbeat-psfvcgwp.js} +23 -23
  104. package/dist/{hook-g7kvv6x9.js → hook-8pz04697.js} +6 -6
  105. package/dist/{hook-3jjywnpb.js → hook-cyq4mryn.js} +8 -8
  106. package/dist/{http-tkp7d4kb.js → http-haj1nd6k.js} +921 -169
  107. package/dist/{index-q7m26kvs.js → index-jwt2bj6f.js} +265 -97
  108. package/dist/{index-3n8m9ea2.js → index-q52f47pe.js} +1 -1
  109. package/dist/{index-31ceyf42.js → index-syvhnvtw.js} +1 -1
  110. package/dist/index-y1ajx04a.js +43 -0
  111. package/dist/{index-1ef1myq2.js → index-z5h22pes.js} +20 -20
  112. package/dist/{index-xdaahthb.js → index-zyq8ct52.js} +20 -20
  113. package/dist/{keepalive-v4ta8wgg.js → keepalive-xdvsamvj.js} +4 -4
  114. package/dist/lead-hqg57kdp.js +79 -0
  115. package/dist/{maintenance-84n1ex21.js → maintenance-4y2xzh3a.js} +1 -1
  116. package/dist/{oauth-refresh-sweep-vjnnandw.js → oauth-refresh-sweep-jd4r7zbs.js} +9 -4
  117. package/dist/{onboard-sfmpe4np.js → onboard-18447q9q.js} +6 -6
  118. package/dist/{opencode-adapter-jmpst4q4.js → opencode-adapter-26b2frdf.js} +7 -7
  119. package/dist/{otel-impl-v6cc0zve.js → otel-impl-f9tgr8yw.js} +2 -2
  120. package/dist/{pi-mono-adapter-fk8fkcf6.js → pi-mono-adapter-qn6qbga1.js} +38 -17
  121. package/dist/{pricing-refresh-fsk1e1zc.js → pricing-refresh-dw2tgb53.js} +3 -3
  122. package/dist/{rbac-roles-prmkdnkw.js → rbac-roles-aygm2760.js} +2 -2
  123. package/dist/{rbac-roles-zxmxqa39.js → rbac-roles-s4nwj2m3.js} +1 -1
  124. package/dist/render-v2-yfvdfr0x.js +16 -0
  125. package/dist/{resume-frdtgfa0.js → resume-1bmvjbf3.js} +9 -9
  126. package/dist/{runtime-bt5pkpm1.js → runtime-f7tpzedy.js} +1 -1
  127. package/dist/{session-access-fpez4y5q.js → session-access-r5garej6.js} +4 -4
  128. package/dist/session-source-backfill-424wzv0r.js +110 -0
  129. package/dist/{setup-mq6m3m8q.js → setup-8tygvxkq.js} +1 -1
  130. package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-xsw323b3.js} +2 -2
  131. package/dist/{work-objects-kfahhjsq.js → work-objects-ggnghpgf.js} +23 -23
  132. package/dist/worker-sqjd1nqf.js +79 -0
  133. package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
  134. package/openapi.json +1324 -14
  135. package/package.json +5 -3
  136. package/src/assets/source-key.ts +95 -0
  137. package/src/be/automation-preflight.ts +2 -0
  138. package/src/be/db/api-keys.ts +89 -0
  139. package/src/be/db/session-labels.ts +28 -0
  140. package/src/be/db/session-moves.ts +5 -6
  141. package/src/be/db/session-tree.ts +153 -14
  142. package/src/be/db/tasks/read.ts +11 -0
  143. package/src/be/db/tasks/write.ts +6 -1
  144. package/src/be/db/workflow-runs.ts +219 -6
  145. package/src/be/db-retention.ts +61 -6
  146. package/src/be/db.ts +135 -132
  147. package/src/be/memory/providers/openai-embedding.ts +5 -1
  148. package/src/be/memory/task-learning.ts +155 -0
  149. package/src/be/migrations/244_api_key_validation.sql +4 -0
  150. package/src/be/migrations/245_script_executor.sql +3 -0
  151. package/src/be/oauth-refresh-sweep.ts +2 -1
  152. package/src/be/onboarding.ts +4 -0
  153. package/src/be/scripts/boot-reembed.ts +2 -0
  154. package/src/be/scripts/db.ts +14 -4
  155. package/src/be/scripts/embeddings.ts +2 -0
  156. package/src/be/scripts/run-saved.ts +1 -0
  157. package/src/be/scripts/typecheck.ts +10 -4
  158. package/src/be/seed-skills/index.ts +7 -0
  159. package/src/be/session-source-backfill.ts +163 -0
  160. package/src/be/swarm-config-guard.ts +1 -0
  161. package/src/comb/review-batch.ts +28 -1
  162. package/src/comb/templates.ts +7 -2
  163. package/src/commands/claude-managed-setup.ts +7 -1
  164. package/src/commands/credential-refresh.ts +76 -1
  165. package/src/commands/credential-wait.ts +2 -2
  166. package/src/commands/onboard/compose-generator.ts +5 -3
  167. package/src/commands/provider-credentials.ts +212 -171
  168. package/src/commands/runner.ts +25 -4
  169. package/src/extensions/apply-task-create.ts +8 -1
  170. package/src/extensions/contract-types.generated.ts +1 -1
  171. package/src/extensions/contract.ts +5 -0
  172. package/src/heartbeat/heartbeat.ts +14 -1
  173. package/src/heartbeat/script-runner-probe.ts +47 -0
  174. package/src/http/all-routes.ts +2 -0
  175. package/src/http/api-keys.ts +77 -9
  176. package/src/http/assets.ts +15 -0
  177. package/src/http/codex-oauth-accounts.ts +191 -0
  178. package/src/http/comb.ts +15 -2
  179. package/src/http/config.ts +1 -1
  180. package/src/http/core.ts +6 -0
  181. package/src/http/fleet-benchmark.ts +5 -2
  182. package/src/http/idempotency-key.ts +1 -1
  183. package/src/http/index.ts +14 -3
  184. package/src/http/integrations.ts +5 -1
  185. package/src/http/kv.ts +8 -3
  186. package/src/http/onboarding.ts +6 -1
  187. package/src/http/pages-public.ts +38 -5
  188. package/src/http/pool-keys.ts +354 -0
  189. package/src/http/scripts.ts +27 -0
  190. package/src/http/sessions.ts +37 -12
  191. package/src/http/stats.ts +1 -0
  192. package/src/http/status.ts +26 -12
  193. package/src/http/tasks.ts +3 -0
  194. package/src/http/used-by.ts +7 -2
  195. package/src/http/workflows.ts +88 -9
  196. package/src/http/x.ts +5 -0
  197. package/src/integrations/chat-sdk/inbound.ts +27 -0
  198. package/src/kv-reserved-namespaces.ts +19 -0
  199. package/src/prompts/base-prompt.ts +21 -1
  200. package/src/prompts/session-templates.ts +17 -3
  201. package/src/providers/acp-targets.ts +1 -1
  202. package/src/providers/amp-adapter.ts +1 -1
  203. package/src/providers/claude-adapter.ts +5 -1
  204. package/src/providers/claude-managed-adapter.ts +16 -9
  205. package/src/providers/codex-adapter.ts +71 -11
  206. package/src/providers/dsh-adapter.ts +1 -1
  207. package/src/providers/pi-mono-adapter.ts +41 -11
  208. package/src/scheduler/scheduler.ts +5 -3
  209. package/src/scripts-runtime/eval-harness.ts +8 -1
  210. package/src/scripts-runtime/executors/native.ts +22 -16
  211. package/src/scripts-runtime/executors/quickjs-prelude.ts +103 -1
  212. package/src/scripts-runtime/executors/quickjs-runner.ts +2 -1
  213. package/src/scripts-runtime/executors/quickjs.ts +7 -0
  214. package/src/scripts-runtime/executors/registry.ts +32 -0
  215. package/src/scripts-runtime/executors/types.ts +7 -0
  216. package/src/scripts-runtime/host-validated-args.ts +133 -0
  217. package/src/scripts-runtime/loader.ts +30 -3
  218. package/src/scripts-runtime/swarm-sdk.ts +16 -3
  219. package/src/scripts-runtime/types/stdlib.d.ts +10 -2
  220. package/src/scripts-runtime/types/swarm-extension.d.ts +17 -8
  221. package/src/scripts-runtime/types/swarm-sdk.d.ts +10 -2
  222. package/src/slack/assistant.ts +7 -0
  223. package/src/slack/channel-labels.ts +74 -0
  224. package/src/slack/handlers.ts +8 -0
  225. package/src/slack/inbound-files.ts +5 -2
  226. package/src/slack/thread-buffer.ts +4 -0
  227. package/src/tasks/sibling-awareness.ts +12 -3
  228. package/src/telemetry-context.ts +5 -6
  229. package/src/telemetry-identity.ts +3 -3
  230. package/src/tests/api-key-status-by-suffix.test.ts +242 -0
  231. package/src/tests/api-keys-validation.test.ts +170 -0
  232. package/src/tests/base-prompt.test.ts +70 -2
  233. package/src/tests/claude-managed-adapter.test.ts +46 -0
  234. package/src/tests/claude-routes-e2e.test.ts +7 -2
  235. package/src/tests/codex-credential-pools.test.ts +120 -0
  236. package/src/tests/codex-gateway-route.test.ts +165 -0
  237. package/src/tests/codex-oauth-accounts.test.ts +357 -0
  238. package/src/tests/comb-review-batch.test.ts +63 -2
  239. package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
  240. package/src/tests/config-pool-keys.test.ts +533 -0
  241. package/src/tests/credential-check.test.ts +294 -4
  242. package/src/tests/credential-refresh.test.ts +172 -1
  243. package/src/tests/db-retention.test.ts +9 -3
  244. package/src/tests/db-task-read-contract.test.ts +1 -0
  245. package/src/tests/db-task-write-contract.test.ts +1 -3
  246. package/src/tests/docs-index-footprint.test.js +3 -3
  247. package/src/tests/docs-index.test.ts +135 -0
  248. package/src/tests/dsh-adapter.test.ts +1 -1
  249. package/src/tests/extensions-pre-task.test.ts +53 -1
  250. package/src/tests/fetch-resolved-env.test.ts +16 -2
  251. package/src/tests/fixtures/extensions/record-task-create/hooks.ts +9 -0
  252. package/src/tests/fixtures/extensions/record-task-create/manifest.json +7 -0
  253. package/src/tests/fleet-benchmark.test.ts +8 -0
  254. package/src/tests/get-workflow-run-tool.test.ts +98 -0
  255. package/src/tests/heartbeat-checklist.test.ts +89 -0
  256. package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
  257. package/src/tests/integrations-http.test.ts +32 -2
  258. package/src/tests/internal-ai/complete-structured.test.ts +37 -1
  259. package/src/tests/internal-ai/credentials.test.ts +23 -0
  260. package/src/tests/kv-http.test.ts +32 -0
  261. package/src/tests/kv-tool.test.ts +25 -0
  262. package/src/tests/multi-runtime-registration.test.ts +12 -12
  263. package/src/tests/oauth-refresh-sweep.test.ts +34 -1
  264. package/src/tests/onboard-compose.test.ts +20 -0
  265. package/src/tests/onboarding.test.ts +108 -1
  266. package/src/tests/openai-embedding-credentials.test.ts +35 -0
  267. package/src/tests/opencode-adapter.test.ts +2 -1
  268. package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
  269. package/src/tests/org-website.test.ts +36 -0
  270. package/src/tests/pages-frame-ancestors.test.ts +162 -0
  271. package/src/tests/pi-codemode.test.ts +2 -1
  272. package/src/tests/pi-mono-adapter.test.ts +54 -0
  273. package/src/tests/pi-native-mcp.test.ts +13 -1
  274. package/src/tests/pi-tool-exposure.test.ts +8 -8
  275. package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
  276. package/src/tests/prompt-template-session.test.ts +4 -3
  277. package/src/tests/provider-key-probes.test.ts +181 -0
  278. package/src/tests/rbac-e2e-helpers.test.ts +88 -1
  279. package/src/tests/rbac-e2e-helpers.ts +36 -11
  280. package/src/tests/request-composition-derive.test.ts +329 -0
  281. package/src/tests/script-connections.test.ts +4 -0
  282. package/src/tests/script-executor-conformance.test.ts +36 -1
  283. package/src/tests/script-executor-quickjs-pool.test.ts +50 -0
  284. package/src/tests/script-executor-quickjs.test.ts +140 -0
  285. package/src/tests/script-host-validated-args-native.test.ts +196 -0
  286. package/src/tests/script-per-script-executor.test.ts +415 -0
  287. package/src/tests/script-runs-retention.test.ts +212 -0
  288. package/src/tests/scripts-external-api.test.ts +45 -0
  289. package/src/tests/sdk-allowlist.test.ts +42 -2
  290. package/src/tests/self-improvement.test.ts +4 -4
  291. package/src/tests/session-source-backfill.test.ts +429 -0
  292. package/src/tests/session-source-keys.test.ts +236 -0
  293. package/src/tests/session-source-labels.test.ts +419 -0
  294. package/src/tests/sessions-detail-batch.test.ts +2 -0
  295. package/src/tests/sessions-move.test.ts +131 -0
  296. package/src/tests/sessions-tree.test.ts +299 -2
  297. package/src/tests/slack-inbound-files.test.ts +103 -23
  298. package/src/tests/status.test.ts +101 -18
  299. package/src/tests/store-progress-learning.test.ts +288 -0
  300. package/src/tests/tasks-workflow-run-filter.test.ts +146 -0
  301. package/src/tests/test-net.ts +31 -0
  302. package/src/tests/transcription.test.ts +8 -0
  303. package/src/tests/ui-logs-parser.test.ts +180 -0
  304. package/src/tests/used-by-route.test.ts +11 -0
  305. package/src/tests/workflow-cascade-cancel.test.ts +172 -0
  306. package/src/tests/workflow-engine-v2.test.ts +116 -1
  307. package/src/tests/workflow-http-v2.test.ts +131 -0
  308. package/src/tests/workflow-mcp-trigger-schema.test.ts +209 -0
  309. package/src/tests/workflow-run-finished-event.test.ts +263 -0
  310. package/src/tests/workflow-step-order.test.ts +92 -0
  311. package/src/tests/workflow-sub-workflow.test.ts +30 -0
  312. package/src/tests/workflow-swarm-script.test.ts +34 -0
  313. package/src/tools/get-tasks.ts +8 -0
  314. package/src/tools/kv/kv-read-auth.ts +4 -2
  315. package/src/tools/script-common.ts +1 -0
  316. package/src/tools/script-run.ts +7 -0
  317. package/src/tools/script-upsert.ts +7 -0
  318. package/src/tools/store-progress.ts +67 -1
  319. package/src/tools/task-action.ts +1 -1
  320. package/src/tools/workflows/get-workflow-run.ts +14 -4
  321. package/src/tools/workflows/trigger-workflow.ts +104 -10
  322. package/src/types.ts +36 -1
  323. package/src/utils/company-profile.ts +51 -1
  324. package/src/utils/credentials.ts +10 -4
  325. package/src/utils/internal-ai/complete-structured.ts +5 -0
  326. package/src/utils/internal-ai/credentials.ts +4 -3
  327. package/src/utils/provider-key-probes.ts +328 -0
  328. package/src/utils/transcription.ts +4 -1
  329. package/src/workflows/engine.ts +18 -16
  330. package/src/workflows/executors/sub-workflow.ts +8 -1
  331. package/src/workflows/executors/swarm-script.ts +5 -0
  332. package/src/workflows/foreach-driver.ts +5 -11
  333. package/src/workflows/node-timeout.ts +30 -0
  334. package/templates/ai-toolbox.manifest.json +2 -2
  335. package/templates/community/linear-delivery-loop/PLAYBOOK.md +323 -0
  336. package/templates/community/linear-delivery-loop/README.md +38 -0
  337. package/templates/community/linear-delivery-loop/config.example.json +31 -0
  338. package/templates/community/linear-delivery-loop/lead-prompt.md +34 -0
  339. package/templates/community/linear-delivery-loop/schedule.json +10 -0
  340. package/templates/community/linear-delivery-loop/scripts/linear-delivery-setup.ts +148 -0
  341. package/templates/community/linear-delivery-loop/scripts/linear-delivery-tick.ts +1781 -0
  342. package/templates/skills/researching/content.md +2 -0
  343. package/templates/skills/swarm-docs/config.json +14 -0
  344. package/templates/skills/swarm-docs/content.md +144 -0
  345. package/templates/skills/swarm-scripts/SKILL.md +1 -0
  346. package/templates/skills/swarm-scripts/content.md +1 -0
  347. package/dist/cli-7421jzsw.js +0 -84
  348. package/dist/cli-e45e4m6b.js +0 -413
  349. package/dist/cli-zw88zjba.js +0 -307
  350. package/dist/handlers-wy1dr6ja.js +0 -41
  351. package/dist/index-nmm79qgr.js +0 -43
  352. package/dist/lead-sawnyqxk.js +0 -79
  353. package/dist/render-v2-pjwxvnkw.js +0 -12
  354. package/dist/worker-v5e5rxj3.js +0 -79
@@ -7,14 +7,14 @@ import {
7
7
  ACP_TARGET_IDS,
8
8
  isAcpTarget,
9
9
  getAcpTargetCatalogEntry
10
- } from "./cli-5kqnemen.js";
10
+ } from "./cli-yvy48785.js";
11
11
  import {
12
12
  applyReasoningEffort
13
- } from "./cli-bn0rewsy.js";
13
+ } from "./cli-c081bj3b.js";
14
14
  import {
15
15
  applyOpenRouterBaseUrlOverride2,
16
16
  buildOpenAICompatibleProviderBlock2
17
- } from "./cli-hh5we352.js";
17
+ } from "./cli-86ehn4s5.js";
18
18
  import {
19
19
  fetchInstalledMcpServers
20
20
  } from "./cli-bst1vp7e.js";
@@ -22,7 +22,7 @@ import {
22
22
  getContextWindowSize,
23
23
  clampContextPercent,
24
24
  init_context_window
25
- } from "./cli-0shx9j93.js";
25
+ } from "./cli-pfk92eqz.js";
26
26
  import {
27
27
  NEVER,
28
28
  string2,
@@ -44,18 +44,18 @@ import {
44
44
  import {
45
45
  init_package,
46
46
  package_default
47
- } from "./cli-xtrz6bzs.js";
47
+ } from "./cli-ptfq202x.js";
48
48
  import {
49
49
  scrubSecrets,
50
50
  init_secret_scrubber
51
- } from "./cli-n4c8e3s5.js";
51
+ } from "./cli-708wdy32.js";
52
52
  import {
53
53
  normalizeGrokModel,
54
54
  baseUrlOverride,
55
55
  providerBaseUrl,
56
56
  providerForModel,
57
57
  init_src2
58
- } from "./cli-nwyw3zhg.js";
58
+ } from "./cli-gxee0bqa.js";
59
59
 
60
60
  // node_modules/@agentclientprotocol/sdk/dist/v1/unstable/schema/index.js
61
61
  var AGENT_METHODS = {
@@ -10,7 +10,7 @@ import {
10
10
  init_steering,
11
11
  createLogEntry2,
12
12
  init_db3
13
- } from "./cli-jb30dzvk.js";
13
+ } from "./cli-48gxjmcz.js";
14
14
  import {
15
15
  ackSlackMessage,
16
16
  buildBufferFlushBlocks,
@@ -20,7 +20,7 @@ import {
20
20
  ensureSlackThreadTree2,
21
21
  registerTreeMessage,
22
22
  getSlackApp2
23
- } from "./cli-abs8ndtr.js";
23
+ } from "./cli-m30k9777.js";
24
24
  import {
25
25
  createAdditiveBuffer,
26
26
  TaskCreationBlockedError,
@@ -30,15 +30,15 @@ import {
30
30
  createSlackTaskWithFiles,
31
31
  notifySlackFileFailures,
32
32
  extractSlackMessageText
33
- } from "./cli-asq5ydm4.js";
33
+ } from "./cli-6a9qfa8b.js";
34
34
  import {
35
35
  resolveSlackUserId,
36
36
  rewriteSlackMentions
37
- } from "./cli-jbnn4vxb.js";
37
+ } from "./cli-2pvzmas1.js";
38
38
  import {
39
39
  findUserByExternalId,
40
40
  init_users
41
- } from "./cli-6a1xg1p7.js";
41
+ } from "./cli-a89zdqz9.js";
42
42
  import {
43
43
  isSteeringEnabled2,
44
44
  init_steering_enabled
@@ -46,7 +46,7 @@ import {
46
46
  import {
47
47
  scrubSecrets,
48
48
  init_secret_scrubber
49
- } from "./cli-n4c8e3s5.js";
49
+ } from "./cli-708wdy32.js";
50
50
  import {
51
51
  __using,
52
52
  __callDispose
@@ -311,7 +311,10 @@ ${description}` : description;
311
311
  parentTaskId: mostRecentTask?.id,
312
312
  inheritParentOutputSchema: false,
313
313
  contextKey: slackContextKey({ channelId, threadTs })
314
- }, inbound);
314
+ }, inbound, {
315
+ trigger: "thread-buffer",
316
+ messages: items.map(({ ts, userId, text }) => ({ ts, userId, text }))
317
+ });
315
318
  } catch (error) {
316
319
  if (!(error instanceof TaskCreationBlockedError))
317
320
  throw error;
@@ -2,13 +2,13 @@ import {
2
2
  getKnownContextWindowSize,
3
3
  clampContextPercent,
4
4
  init_context_window
5
- } from "./cli-0shx9j93.js";
5
+ } from "./cli-pfk92eqz.js";
6
6
  import {
7
7
  resolveTemplateFromCode,
8
8
  resolveTemplateAsync,
9
9
  init_resolver,
10
10
  init_session_templates
11
- } from "./cli-dqygeeh5.js";
11
+ } from "./cli-f1e0ptjj.js";
12
12
 
13
13
  // src/hooks/context-bound-note.ts
14
14
  import { renameSync, writeFileSync } from "node:fs";
@@ -2,7 +2,7 @@ import {
2
2
  DEFAULT_E2B_API_BASE,
3
3
  redactWithEnv,
4
4
  init_env
5
- } from "./cli-ha9rmwgq.js";
5
+ } from "./cli-fb8m699c.js";
6
6
  import {
7
7
  __toESM,
8
8
  __esm
@@ -33,7 +33,7 @@ import {
33
33
  getPendingWaitsByEvent2,
34
34
  resolveWaitState2,
35
35
  init_db3
36
- } from "./cli-jb30dzvk.js";
36
+ } from "./cli-48gxjmcz.js";
37
37
  import {
38
38
  BaseExecutor,
39
39
  postApprovalCancellationUpdates,
@@ -61,16 +61,16 @@ import {
61
61
  stepFailureMode,
62
62
  getNextTargets,
63
63
  getSuccessors
64
- } from "./cli-gbfxp48k.js";
64
+ } from "./cli-j0ppywdr.js";
65
65
  import {
66
66
  workflowEventBus2,
67
67
  init_event_bus
68
- } from "./cli-dabehxhp.js";
68
+ } from "./cli-kt907da6.js";
69
69
  import {
70
70
  RetryPolicySchema,
71
71
  SUPERSEDED_WORKFLOW_TASK_REASON,
72
72
  init_types
73
- } from "./cli-mz9afxxf.js";
73
+ } from "./cli-9pshx6rd.js";
74
74
  import {
75
75
  init_zod
76
76
  } from "./cli-4chz1hye.js";
@@ -88,7 +88,7 @@ import {
88
88
  import {
89
89
  scrubSecrets,
90
90
  init_secret_scrubber
91
- } from "./cli-n4c8e3s5.js";
91
+ } from "./cli-708wdy32.js";
92
92
 
93
93
  // src/workflows/approval-resolution.ts
94
94
  function shapeApprovalResolution(registry, definition, nodeId, parkedOutput, approval) {
@@ -197,8 +197,13 @@ class SubWorkflowExecutor extends BaseExecutor {
197
197
  throw err;
198
198
  }
199
199
  const child = await db.getWorkflowRun(childRunId);
200
- if (!child)
201
- return { status: "failed", error: `Child workflow run ${childRunId} not found` };
200
+ if (!child) {
201
+ return {
202
+ status: "failed",
203
+ error: `Child workflow run ${childRunId} not found`,
204
+ retryable: false
205
+ };
206
+ }
202
207
  return this.settle(child, config.workflowId);
203
208
  }
204
209
  settle(child, workflowId) {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  registerTemplate,
3
3
  init_registry
4
- } from "./cli-dqygeeh5.js";
4
+ } from "./cli-f1e0ptjj.js";
5
5
  import {
6
6
  __esm
7
7
  } from "./cli-242037k3.js";
@@ -3,7 +3,7 @@ import {
3
3
  isModelScopedWindow,
4
4
  parseModelLimitMessage,
5
5
  init_model_rate_limit_windows
6
- } from "./cli-7421jzsw.js";
6
+ } from "./cli-gt4h8cxw.js";
7
7
 
8
8
  // src/utils/error-tracker.ts
9
9
  init_model_rate_limit_windows();
@@ -9,16 +9,16 @@ import {
9
9
  init_active_sessions,
10
10
  getSteeringMessageById2,
11
11
  init_db3
12
- } from "./cli-jb30dzvk.js";
12
+ } from "./cli-48gxjmcz.js";
13
13
  import {
14
14
  getUserGrant2,
15
15
  init_rbac_roles
16
- } from "./cli-ff1tm9n9.js";
16
+ } from "./cli-8wmj18cz.js";
17
17
  import {
18
18
  findUserById,
19
19
  findUserByExternalId,
20
20
  init_users
21
- } from "./cli-6a1xg1p7.js";
21
+ } from "./cli-a89zdqz9.js";
22
22
  import {
23
23
  isRbacEnabled,
24
24
  can,
@@ -43,7 +43,7 @@ import {
43
43
  import {
44
44
  scrubSecrets,
45
45
  init_secret_scrubber
46
- } from "./cli-n4c8e3s5.js";
46
+ } from "./cli-708wdy32.js";
47
47
 
48
48
  // src/http/route-def.ts
49
49
  init_zod();
@@ -503,7 +503,7 @@ function route(def) {
503
503
  try {
504
504
  const rawBody = def.body ? await parseBody(req, def.maxBodyBytes) : undefined;
505
505
  if (def.session && "bodyTaskIds" in def.session) {
506
- const { bodySessionDenial } = await import("./session-access-fpez4y5q.js");
506
+ const { bodySessionDenial } = await import("./session-access-r5garej6.js");
507
507
  const denial = await bodySessionDenial(req, def.session.bodyTaskIds(rawBody));
508
508
  if (denial) {
509
509
  jsonError(res, denial, 403);
@@ -1,19 +1,19 @@
1
- import {
2
- getSlackConfiguration,
3
- init_config
4
- } from "./cli-qeaq3j6t.js";
5
1
  import {
6
2
  isSteeringEnabled2,
7
3
  init_steering_enabled
8
4
  } from "./cli-4sydckyj.js";
5
+ import {
6
+ getSlackConfiguration,
7
+ init_config
8
+ } from "./cli-qeaq3j6t.js";
9
9
  import {
10
10
  init_templates3
11
- } from "./cli-j6rktc91.js";
11
+ } from "./cli-v6shg7na.js";
12
12
  import {
13
13
  resolveTemplateAsync,
14
14
  init_resolver,
15
15
  init_session_templates
16
- } from "./cli-dqygeeh5.js";
16
+ } from "./cli-f1e0ptjj.js";
17
17
  import {
18
18
  MAX_PROFILE_FILE_LENGTH,
19
19
  getAppUrl,
@@ -24,7 +24,7 @@ import {
24
24
  import {
25
25
  scrubSecrets,
26
26
  init_secret_scrubber
27
- } from "./cli-n4c8e3s5.js";
27
+ } from "./cli-708wdy32.js";
28
28
  import {
29
29
  __esm
30
30
  } from "./cli-242037k3.js";
@@ -283,6 +283,9 @@ function promptFlags(args) {
283
283
  scriptsOnlyMode: hasMcp && scriptsOnly
284
284
  };
285
285
  }
286
+ function hasSwarmDocsSkill(skills) {
287
+ return skills === undefined || skills.some((skill) => skill.name === "swarm-docs");
288
+ }
286
289
  function renderToolsAndSkillsVars(input) {
287
290
  let section = "";
288
291
  const skills = input.skillsSummary ?? [];
@@ -306,7 +309,7 @@ ${discovery}
306
309
  }
307
310
  }
308
311
  const servers = (input.mcpServers ?? []).filter((name) => name.trim().length > 0);
309
- const mcpLine = servers.length > 0 ? `Connected MCP servers: ${servers.join(", ")}. Their tools are in your tool list.
312
+ const mcpLine = servers.length > 0 ? `Connected MCP servers: ${servers.join(", ")}. ${input.mcpToolsDeferred ? "Load their tools with your harness tool search." : "Their tools are in your tool list."}
310
313
  ` : "";
311
314
  return {
312
315
  skills: section,
@@ -513,11 +516,16 @@ ${scriptsOnlyResult.text}`;
513
516
  const toolsResult = await resolveTemplateAsync("system.agent.tools_skills", renderToolsAndSkillsVars({
514
517
  skillsSummary: args.skillsSummary,
515
518
  mcpServers: args.mcpServers,
519
+ mcpToolsDeferred: provider === "pi" && hasToolSearch,
516
520
  nativeSkillDiscovery,
517
521
  toolDiscovery: discoveryResult.text,
518
522
  hasLocalEnv
519
523
  }));
520
524
  prompt += toolsResult.text;
525
+ if (role === "lead" && hasSwarmDocsSkill(args.skillsSummary)) {
526
+ const docsResult = await resolveTemplateAsync("system.agent.lead.docs", {});
527
+ prompt += docsResult.text;
528
+ }
521
529
  }
522
530
  if (hasLocalEnv && args.claudeMd && CLAUDE_MD_INJECT_PROVIDERS.has(provider) && !matchesDefaultClaudeMd(args.claudeMd, defaultsInput)) {
523
531
  const budget = Math.min(BOOTSTRAP_MAX_CHARS, Math.max(0, BOOTSTRAP_TOTAL_MAX_CHARS - prompt.length));
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  contextBoundNoteThreshold,
6
6
  createContextBoundNote
7
- } from "./cli-2655k16q.js";
7
+ } from "./cli-sjctjr48.js";
8
8
  import {
9
9
  checkToolLoop
10
10
  } from "./cli-0726awxw.js";
@@ -20,21 +20,26 @@ import {
20
20
  computeContextUsedUnified,
21
21
  clampContextPercent,
22
22
  init_context_window
23
- } from "./cli-0shx9j93.js";
23
+ } from "./cli-pfk92eqz.js";
24
+ import {
25
+ selectCredential,
26
+ init_credentials
27
+ } from "./cli-gt4h8cxw.js";
24
28
  import {
25
29
  runtimeCatalogModel,
26
30
  init_runtime_model_catalog
27
- } from "./cli-6x9ma5w5.js";
31
+ } from "./cli-803188pb.js";
28
32
  import {
29
33
  scrubSecrets,
30
34
  init_secret_scrubber
31
- } from "./cli-n4c8e3s5.js";
35
+ } from "./cli-708wdy32.js";
32
36
  import {
33
37
  init_src2
34
- } from "./cli-nwyw3zhg.js";
38
+ } from "./cli-gxee0bqa.js";
35
39
 
36
40
  // src/providers/claude-managed-adapter.ts
37
41
  init_context_window();
42
+ init_credentials();
38
43
  init_secret_scrubber();
39
44
 
40
45
  // src/providers/claude-managed-models.ts
@@ -592,7 +597,7 @@ class ClaudeManagedAdapter2 {
592
597
  if (missing.length > 0) {
593
598
  throw new Error(`[claude-managed] Missing required env var(s): ${missing.join(", ")}. ` + `Run \`bun run src/cli.tsx claude-managed-setup\` to create an Anthropic-side ` + `agent + environment and persist their IDs to swarm_config.`);
594
599
  }
595
- this.apiKey = process.env.ANTHROPIC_API_KEY;
600
+ this.apiKey = selectCredential(process.env.ANTHROPIC_API_KEY, undefined, "ANTHROPIC_API_KEY").selected;
596
601
  this.agentId = process.env.MANAGED_AGENT_ID;
597
602
  this.environmentId = process.env.MANAGED_ENVIRONMENT_ID;
598
603
  if (opts.client) {
@@ -602,6 +607,10 @@ class ClaudeManagedAdapter2 {
602
607
  }
603
608
  }
604
609
  async createSession(config) {
610
+ const taskKey = config.env?.ANTHROPIC_API_KEY;
611
+ const client = taskKey && this.client instanceof Anthropic ? this.client.withOptions({
612
+ apiKey: selectCredential(taskKey, undefined, "ANTHROPIC_API_KEY").selected
613
+ }) : this.client;
605
614
  if (config.resumeSessionId) {
606
615
  console.warn("[claude-managed-adapter] resumeSessionId ignored — native resume is disabled by deprecation plan");
607
616
  }
@@ -633,9 +642,9 @@ class ClaudeManagedAdapter2 {
633
642
  if (vaultIds.length > 0) {
634
643
  createParams.vault_ids = Array.from(new Set(vaultIds));
635
644
  }
636
- const created = await Promise.resolve(this.client.beta.sessions.create(createParams));
645
+ const created = await Promise.resolve(client.beta.sessions.create(createParams));
637
646
  const sessionId = created.id;
638
- return new ClaudeManagedSession(this.client, sessionId, config, userMessageContent, seenEventIds);
647
+ return new ClaudeManagedSession(client, sessionId, config, userMessageContent, seenEventIds);
639
648
  }
640
649
  async canResume(sessionId) {
641
650
  try {
@@ -7,18 +7,18 @@ import {
7
7
  import {
8
8
  contextBoundNoteThreshold,
9
9
  createContextBoundNote
10
- } from "./cli-2655k16q.js";
10
+ } from "./cli-sjctjr48.js";
11
11
  import {
12
12
  SessionErrorTracker
13
- } from "./cli-gx4rm0qx.js";
13
+ } from "./cli-vz78s5wm.js";
14
14
  import {
15
15
  credentialsToAuthJson,
16
16
  CodexOAuthRefreshError,
17
17
  getValidCodexOAuth
18
- } from "./cli-kxpfx2xr.js";
18
+ } from "./cli-0z1xjzwa.js";
19
19
  import {
20
20
  summarizeSession
21
- } from "./cli-mmhj8vd7.js";
21
+ } from "./cli-c668vvcf.js";
22
22
  import {
23
23
  swarmRuntimeInstanceId
24
24
  } from "./cli-e8xyjvfc.js";
@@ -41,7 +41,7 @@ import {
41
41
  } from "./cli-vbhgkw9h.js";
42
42
  import {
43
43
  applyReasoningEffort
44
- } from "./cli-bn0rewsy.js";
44
+ } from "./cli-c081bj3b.js";
45
45
  import {
46
46
  createSwarmEventHandler
47
47
  } from "./cli-4zsenjhy.js";
@@ -50,22 +50,31 @@ import {
50
50
  computeContextUsedUnified,
51
51
  clampContextPercent,
52
52
  init_context_window
53
- } from "./cli-0shx9j93.js";
53
+ } from "./cli-pfk92eqz.js";
54
54
  import {
55
55
  hasCodexOAuthPoolSlots
56
56
  } from "./cli-j4bwnpkm.js";
57
57
  import {
58
58
  DEFAULT_MODEL_TIER_MAP,
59
59
  init_types
60
- } from "./cli-mz9afxxf.js";
60
+ } from "./cli-9pshx6rd.js";
61
+ import {
62
+ routeCredentialStatus,
63
+ CODEX_GATEWAY_API_KEY,
64
+ deriveDefaultRoute,
65
+ routeUnsetEnv,
66
+ init_src,
67
+ selectCredential,
68
+ init_credentials
69
+ } from "./cli-gt4h8cxw.js";
61
70
  import {
62
71
  runtimeCatalogModel,
63
72
  init_runtime_model_catalog
64
- } from "./cli-6x9ma5w5.js";
73
+ } from "./cli-803188pb.js";
65
74
  import {
66
75
  init_package,
67
76
  package_default
68
- } from "./cli-xtrz6bzs.js";
77
+ } from "./cli-ptfq202x.js";
69
78
  import {
70
79
  isEnvFlagEnabled,
71
80
  isSessionSummarySkipped,
@@ -78,10 +87,10 @@ import {
78
87
  import {
79
88
  scrubSecrets,
80
89
  init_secret_scrubber
81
- } from "./cli-n4c8e3s5.js";
90
+ } from "./cli-708wdy32.js";
82
91
  import {
83
92
  init_src2
84
- } from "./cli-nwyw3zhg.js";
93
+ } from "./cli-gxee0bqa.js";
85
94
 
86
95
  // src/providers/codex-oauth/home.ts
87
96
  import os from "node:os";
@@ -90,10 +99,12 @@ function codexUserHome() {
90
99
  }
91
100
 
92
101
  // src/providers/codex-adapter.ts
102
+ init_src();
93
103
  import { existsSync as nodeExistsSync } from "node:fs";
94
104
  import { join as join2 } from "node:path";
95
105
  init_api_key();
96
106
  init_context_window();
107
+ init_credentials();
97
108
  init_env_flag();
98
109
  init_secret_scrubber();
99
110
 
@@ -526,8 +537,28 @@ function createCodexSwarmEventHandler(opts) {
526
537
  }
527
538
 
528
539
  // src/providers/codex-adapter.ts
540
+ var CODEX_GATEWAY_PROVIDER_ID = "swarm-gateway";
541
+ function codexGatewayConfig(route) {
542
+ return {
543
+ model_provider: CODEX_GATEWAY_PROVIDER_ID,
544
+ model_providers: {
545
+ [CODEX_GATEWAY_PROVIDER_ID]: {
546
+ name: "Swarm gateway",
547
+ base_url: route.baseUrl,
548
+ env_key: CODEX_GATEWAY_API_KEY,
549
+ wire_api: "responses",
550
+ requires_openai_auth: false
551
+ }
552
+ }
553
+ };
554
+ }
529
555
  var CONTEXT_MODE_CODEX_PLUGIN = "context-mode@context-mode";
530
556
  function checkCodexCredentials2(env, opts = {}) {
557
+ const gateway = deriveDefaultRoute("codex", env);
558
+ if (gateway) {
559
+ const status = routeCredentialStatus(gateway, env);
560
+ return status.ready ? { ready: true, missing: [], satisfiedBy: "env", hint: status.hint } : { ready: false, missing: status.missing, hint: status.hint };
561
+ }
531
562
  const homeDir = opts.homeDir ?? env.HOME ?? "/root";
532
563
  const existsSync = opts.fs?.existsSync ?? nodeExistsSync;
533
564
  const authFile = `${homeDir}/.codex/auth.json`;
@@ -1735,8 +1766,13 @@ async function createInProcessCodexSession2(config, opts = {}) {
1735
1766
  const bufferedEmit = (event) => {
1736
1767
  preSessionEvents.push(event);
1737
1768
  };
1738
- const mergedConfig = await buildCodexConfig(config, resolvedModel, bufferedEmit);
1739
- const authMode = await resolveCodexAuthMode(config, bufferedEmit);
1769
+ const routeEnv = config.env ?? process.env;
1770
+ const gateway = deriveDefaultRoute("codex", routeEnv);
1771
+ const mergedConfig = {
1772
+ ...await buildCodexConfig(config, resolvedModel, bufferedEmit),
1773
+ ...gateway ? codexGatewayConfig(gateway) : {}
1774
+ };
1775
+ const authMode = gateway ? null : await resolveCodexAuthMode(config, bufferedEmit);
1740
1776
  const env = {
1741
1777
  PATH: process.env.PATH ?? "",
1742
1778
  HOME: process.env.HOME ?? "",
@@ -1747,8 +1783,17 @@ async function createInProcessCodexSession2(config, opts = {}) {
1747
1783
  ...buildOtelTraceparentEnv(config.env ?? process.env),
1748
1784
  SWARM_CODEX_APP_SERVER: "1"
1749
1785
  };
1750
- if (authMode === "chatgpt")
1786
+ if (gateway) {
1787
+ for (const key of routeUnsetEnv("codex", gateway))
1788
+ delete env[key];
1789
+ const gatewayKey = routeEnv[CODEX_GATEWAY_API_KEY];
1790
+ if (gatewayKey)
1791
+ env[CODEX_GATEWAY_API_KEY] = gatewayKey;
1792
+ } else if (authMode === "chatgpt")
1751
1793
  delete env.OPENAI_API_KEY;
1794
+ else if (env.OPENAI_API_KEY) {
1795
+ env.OPENAI_API_KEY = selectCredential(env.OPENAI_API_KEY, undefined, "OPENAI_API_KEY").selected;
1796
+ }
1752
1797
  const codexPathOverride = process.env.CODEX_PATH_OVERRIDE;
1753
1798
  if (config.resumeSessionId) {
1754
1799
  console.warn("[codex-adapter] resumeSessionId ignored — native resume is disabled by deprecation plan");
@@ -1830,6 +1875,12 @@ class CodexSubprocessSession {
1830
1875
  parentOtelEnv: buildOtelTraceparentEnv(config.env ?? process.env)
1831
1876
  };
1832
1877
  const apiKey = getApiKey();
1878
+ const providerKeys = {};
1879
+ for (const keyVar of ["OPENAI_API_KEY", "OPENROUTER_API_KEY", "ANTHROPIC_API_KEY"]) {
1880
+ const value = config.env?.[keyVar] ?? process.env[keyVar];
1881
+ if (value)
1882
+ providerKeys[keyVar] = selectCredential(value, undefined, keyVar).selected;
1883
+ }
1833
1884
  this.proc = registerProcessGroup(Bun.spawn(argv, {
1834
1885
  detached: detachedProcessGroup,
1835
1886
  env: {
@@ -1838,9 +1889,7 @@ class CodexSubprocessSession {
1838
1889
  ...process.env.NODE_EXTRA_CA_CERTS ? { NODE_EXTRA_CA_CERTS: process.env.NODE_EXTRA_CA_CERTS } : {},
1839
1890
  ...process.env.MCP_BASE_URL ? { MCP_BASE_URL: process.env.MCP_BASE_URL } : {},
1840
1891
  ...apiKey ? { AGENT_SWARM_API_KEY: apiKey, API_KEY: apiKey } : {},
1841
- ...process.env.OPENAI_API_KEY ? { OPENAI_API_KEY: process.env.OPENAI_API_KEY } : {},
1842
- ...process.env.OPENROUTER_API_KEY ? { OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY } : {},
1843
- ...process.env.ANTHROPIC_API_KEY ? { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY } : {},
1892
+ ...providerKeys,
1844
1893
  ...process.env.CODEX_PATH_OVERRIDE ? { CODEX_PATH_OVERRIDE: process.env.CODEX_PATH_OVERRIDE } : {},
1845
1894
  ...process.env.CODEX_SKILLS_DIR ? { CODEX_SKILLS_DIR: process.env.CODEX_SKILLS_DIR } : {},
1846
1895
  CONTEXT_MODE_EXTERNAL_MCP_NUDGE_EVERY: CTX_MODE_NUDGE_EVERY,
@@ -2070,6 +2119,9 @@ class CodexAdapter2 {
2070
2119
  this.threadFactory = opts.threadFactory;
2071
2120
  }
2072
2121
  async createSession(config) {
2122
+ if (deriveDefaultRoute("codex", config.env ?? process.env)) {
2123
+ console.log("\x1B[2m[codex]\x1B[0m Using credential: gateway");
2124
+ }
2073
2125
  if (this.bypassSubprocess) {
2074
2126
  return createInProcessCodexSession2(config, {
2075
2127
  skillsDir: this.skillsDir,
@@ -2,7 +2,7 @@ import {
2
2
  openAICompatibleKeyVars,
3
3
  openAICompatibleBaseUrlVars,
4
4
  init_src2
5
- } from "./cli-nwyw3zhg.js";
5
+ } from "./cli-gxee0bqa.js";
6
6
 
7
7
  // src/providers/acp-target-catalog.ts
8
8
  init_src2();
@@ -8,14 +8,14 @@ import {
8
8
  import {
9
9
  materializeClaudeMd,
10
10
  stopClaudeMd
11
- } from "./cli-pzatvw94.js";
11
+ } from "./cli-54sj64fc.js";
12
12
  import {
13
13
  summarizeSession
14
- } from "./cli-mmhj8vd7.js";
14
+ } from "./cli-c668vvcf.js";
15
15
  import {
16
16
  contextBoundNoteThreshold,
17
17
  injectClaimedContextBoundNote
18
- } from "./cli-2655k16q.js";
18
+ } from "./cli-sjctjr48.js";
19
19
  import {
20
20
  guardGhPrBody,
21
21
  guardGhPrRoom
@@ -31,11 +31,11 @@ import {
31
31
  warnProfileFileTooLarge,
32
32
  buildIndependentIdentityPayloads,
33
33
  init_profile_sync
34
- } from "./cli-e42vss7b.js";
34
+ } from "./cli-x37r7qwf.js";
35
35
  import {
36
36
  init_package,
37
37
  package_default
38
- } from "./cli-xtrz6bzs.js";
38
+ } from "./cli-ptfq202x.js";
39
39
  import {
40
40
  MAX_PROFILE_FILE_LENGTH,
41
41
  getMcpBaseUrl,
@@ -52,7 +52,7 @@ import {
52
52
  import {
53
53
  scrubSecrets,
54
54
  init_secret_scrubber
55
- } from "./cli-n4c8e3s5.js";
55
+ } from "./cli-708wdy32.js";
56
56
 
57
57
  // src/hooks/hook.ts
58
58
  init_package();