@desplega.ai/agent-swarm 1.173.0 → 2.0.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 (432) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-ccm9xrep.js → acp-adapter-sj2g0m84.js} +17 -16
  3. package/dist/{actions-sgeyv08k.js → actions-fegk44gr.js} +39 -34
  4. package/dist/{amp-adapter-gpxp3kc9.js → amp-adapter-ad8ft89x.js} +8 -7
  5. package/dist/{app-km9qnv2f.js → app-kfvgbvzy.js} +18 -14
  6. package/dist/{assistant-5r8tcvvd.js → assistant-z7zdy9ja.js} +40 -35
  7. package/dist/{boot-reembed-swwzdgd7.js → boot-reembed-5c2z0mbe.js} +10 -9
  8. package/dist/{boot-reembed-16rv9843.js → boot-reembed-j8xa181e.js} +10 -9
  9. package/dist/{boot-scrub-sweep-zkr6vkqb.js → boot-scrub-sweep-hnkn3rgt.js} +11 -10
  10. package/dist/{boot-seeds-d8sp49t2.js → boot-seeds-kwjq4d2z.js} +14 -13
  11. package/dist/{claude-adapter-yzzzh8jp.js → claude-adapter-9vmvpvgd.js} +19 -18
  12. package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-k9qae05j.js} +7 -5
  13. package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-q54zx5q2.js} +6 -4
  14. package/dist/{claude-sdk-session-4whxere4.js → claude-sdk-session-9jye6cxr.js} +11881 -11472
  15. package/dist/{cli-94b48jhk.js → cli-03gedhng.js} +16 -14
  16. package/dist/{cli-1w0vj3gw.js → cli-1e4b6bzh.js} +7 -7
  17. package/dist/{cli-d603qf86.js → cli-29jc5q7w.js} +10 -8
  18. package/dist/cli-2m1ktfzz.js +17795 -0
  19. package/dist/{cli-x119kdba.js → cli-3dj8k4vy.js} +1 -1
  20. package/dist/{cli-srqq3gc5.js → cli-3fbmmawm.js} +5 -5
  21. package/dist/{cli-gmdajfw5.js → cli-4jxm2qtz.js} +4987 -1708
  22. package/dist/{cli-tadfgd0t.js → cli-5hkm7whv.js} +33 -4
  23. package/dist/{cli-42qhyvwx.js → cli-5t4f29ez.js} +3 -3
  24. package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
  25. package/dist/cli-6cvfxs8r.js +47 -0
  26. package/dist/{cli-0kxf81jj.js → cli-6jyj59nb.js} +2 -2
  27. package/dist/{cli-w1apjecb.js → cli-6razj6t4.js} +2 -2
  28. package/dist/{cli-anzdk0z4.js → cli-74ahz61x.js} +2 -2
  29. package/dist/{cli-m89t9jdf.js → cli-7x0g4sn1.js} +15416 -16024
  30. package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
  31. package/dist/{cli-81r1wjyv.js → cli-9nfx44eh.js} +1 -1
  32. package/dist/cli-9traj3dn.js +638 -0
  33. package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
  34. package/dist/{cli-na2pxe4f.js → cli-apx87jne.js} +2 -2
  35. package/dist/{cli-rfz2ve55.js → cli-bzszjf2p.js} +2855 -862
  36. package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
  37. package/dist/{cli-hsem16hb.js → cli-cgtksawx.js} +7 -4
  38. package/dist/{cli-db3m6zdt.js → cli-d2qr7aj4.js} +1 -1
  39. package/dist/{cli-rfs4vddv.js → cli-d5f9ed5c.js} +5 -5
  40. package/dist/cli-e3g5mbkz.js +776 -0
  41. package/dist/{cli-7jykv7ef.js → cli-e6mpjhed.js} +1 -1
  42. package/dist/{cli-7a93cv8c.js → cli-ee9gtz70.js} +98 -23
  43. package/dist/{cli-3nxdmjrc.js → cli-eejsgvm4.js} +4 -4
  44. package/dist/{cli-fmhj1ehj.js → cli-ef1hg1wv.js} +470 -51
  45. package/dist/cli-f527ce74.js +781 -0
  46. package/dist/{cli-ppy4nnnh.js → cli-f7kr7svz.js} +2 -2
  47. package/dist/cli-hjwmhcg1.js +10622 -0
  48. package/dist/{cli-2bw3w47j.js → cli-hnhtk6cj.js} +1 -1
  49. package/dist/{cli-ywm1azg9.js → cli-hnmhtzvh.js} +6 -4
  50. package/dist/{cli-h7k0xtry.js → cli-hvqbtna4.js} +4 -1256
  51. package/dist/{cli-s8z6x4b4.js → cli-j0pfptdp.js} +218 -102
  52. package/dist/cli-jta2eyzc.js +619 -0
  53. package/dist/{cli-5er5gjbm.js → cli-k382tshb.js} +10 -11
  54. package/dist/{cli-v3zhnxsb.js → cli-k3dp5tpf.js} +2 -2
  55. package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
  56. package/dist/cli-kceah1eh.js +92 -0
  57. package/dist/{cli-ne7smj1b.js → cli-ke896fcf.js} +10 -10
  58. package/dist/{cli-xc7p7s3g.js → cli-kt6zqg0e.js} +6 -6
  59. package/dist/{cli-wrh08zjd.js → cli-m50t4309.js} +5 -18
  60. package/dist/cli-n2wq4j7m.js +6985 -0
  61. package/dist/{cli-bv2etw2y.js → cli-n3hzg89b.js} +46 -15
  62. package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
  63. package/dist/{cli-qm1448f9.js → cli-ne236afy.js} +8 -8
  64. package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
  65. package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
  66. package/dist/{cli-0a7mm3zp.js → cli-q0ke1yww.js} +25 -21
  67. package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
  68. package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
  69. package/dist/{cli-phcqp1b9.js → cli-r2pnvj8g.js} +2 -2
  70. package/dist/{cli-jpc4r224.js → cli-r62a35ea.js} +19 -3
  71. package/dist/{cli-cd0hv9nh.js → cli-ra0xzggj.js} +2 -2
  72. package/dist/cli-rhs9pz33.js +294 -0
  73. package/dist/{cli-r4fqfpwf.js → cli-s2sp957d.js} +50 -27
  74. package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
  75. package/dist/{cli-6thk4jz3.js → cli-se8w6wny.js} +6 -6
  76. package/dist/cli-skxvvpap.js +10140 -0
  77. package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
  78. package/dist/{cli-0p3enk35.js → cli-tqaazemc.js} +9 -1
  79. package/dist/{cli-nwrdx840.js → cli-tr4sxp68.js} +3 -3
  80. package/dist/{cli-r0byd61h.js → cli-tsde1hdr.js} +15 -15
  81. package/dist/{cli-b07hr3bt.js → cli-txqb9s38.js} +2 -2
  82. package/dist/{cli-6r2f7edk.js → cli-v1yb0rqb.js} +6 -6
  83. package/dist/{cli-saqyage0.js → cli-vatyhshy.js} +179 -27
  84. package/dist/{cli-5wpw4rab.js → cli-vdach5a9.js} +5 -5
  85. package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
  86. package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
  87. package/dist/{cli-c3rk1v0x.js → cli-wayw93nt.js} +3 -3
  88. package/dist/cli-wmgrkscj.js +23254 -0
  89. package/dist/{cli-9xf7fdtp.js → cli-z5jjpaxw.js} +29 -6
  90. package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
  91. package/dist/cli.js +29 -45
  92. package/dist/{codex-adapter-r3dn4fp5.js → codex-adapter-y81sssk0.js} +15 -14
  93. package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
  94. package/dist/{codex-session-runner-fwt793h4.js → codex-session-runner-8vx4j6a9.js} +15 -14
  95. package/dist/{commands-z8fq9qna.js → commands-kcpvpcrr.js} +11 -10
  96. package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
  97. package/dist/{controllers-connect-3mf2btyj.js → controllers-connect-kwpvj3rf.js} +42 -37
  98. package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
  99. package/dist/{db-yyhqqrbf.js → db-k8ankj20.js} +12 -11
  100. package/dist/{db-qfpq4bt7.js → db-ww5d7jq3.js} +28 -9
  101. package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
  102. package/dist/{dispatcher-x0x7qfcq.js → dispatcher-e8gq5m68.js} +38 -33
  103. package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
  104. package/dist/{dsh-adapter-34etvb5m.js → dsh-adapter-3epjm3af.js} +7 -6
  105. package/dist/{e2b-66xra4az.js → e2b-8ygwhg0f.js} +4 -3
  106. package/dist/{e2b-xwhyj8cw.js → e2b-swhnpw3n.js} +4 -3
  107. package/dist/{event-bus-vjtv82gm.js → event-bus-6axnngdj.js} +3 -2
  108. package/dist/{external-channel-h1fjecwe.js → external-channel-h3359cwn.js} +11 -10
  109. package/dist/{google-generative-ai-szdxbpqg.js → google-generative-ai-g8db7x0f.js} +4 -2
  110. package/dist/{google-vertex-qzw3p36d.js → google-vertex-r2692q0r.js} +4 -2
  111. package/dist/{grok-adapter-e7mr287e.js → grok-adapter-0d4x7gkx.js} +18 -17
  112. package/dist/{handlers-znb9n7d4.js → handlers-an1gzv21.js} +41 -36
  113. package/dist/{heartbeat-bm4qkn8d.js → heartbeat-6dakeb61.js} +43 -38
  114. package/dist/{hook-254r4mza.js → hook-6v6cv6d5.js} +11 -23
  115. package/dist/{hook-xaa3q80s.js → hook-sa5xye4y.js} +12 -11
  116. package/dist/{http-3dgrgp8y.js → http-r7f3eky0.js} +1499 -251
  117. package/dist/index-52j1aja4.js +3465 -0
  118. package/dist/{index-fx3jqq1e.js → index-7ep4gzdk.js} +38 -33
  119. package/dist/index-9gw58n4k.js +193 -0
  120. package/dist/index-9j87mcm8.js +56305 -0
  121. package/dist/index-bsmcresk.js +79424 -0
  122. package/dist/index-mh85qhec.js +475 -0
  123. package/dist/{index-g2byveez.js → index-rmpw9a8q.js} +38 -33
  124. package/dist/{index-2ybk7khy.js → index-s2wxgzr0.js} +468 -683
  125. package/dist/{index-bdsqa799.js → index-v1v6n7hg.js} +43 -38
  126. package/dist/index-we27kd31.js +12810 -0
  127. package/dist/{index-jd7sejm2.js → index-zk96aq1k.js} +10 -9
  128. package/dist/{keepalive-6ywhpja1.js → keepalive-be9vwy5h.js} +12 -11
  129. package/dist/{lead-cw45n21s.js → lead-0861cwrf.js} +61 -56
  130. package/dist/{maintenance-ss1a1ge9.js → maintenance-mzzgc8bn.js} +10 -9
  131. package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
  132. package/dist/{oauth-refresh-sweep-3c6f8vyy.js → oauth-refresh-sweep-cpdnfwdj.js} +11 -10
  133. package/dist/{onboard-8hzdhc1k.js → onboard-fh8qs4r3.js} +11 -3
  134. package/dist/{opencode-adapter-qbchbcfz.js → opencode-adapter-nm42wwj8.js} +18 -13
  135. package/dist/{otel-impl-e6mnvc4v.js → otel-impl-x6c1c9g4.js} +242 -868
  136. package/dist/{pi-mono-adapter-3c9g9snh.js → pi-mono-adapter-9n2ya240.js} +244 -106
  137. package/dist/{pricing-refresh-gedkjdw0.js → pricing-refresh-qb0rv0ap.js} +12 -11
  138. package/dist/{rbac-roles-dt4vh1yy.js → rbac-roles-1gzdwbh1.js} +11 -10
  139. package/dist/{rbac-roles-eszdg6pm.js → rbac-roles-3mraey52.js} +12 -11
  140. package/dist/{render-v2-907cy6sa.js → render-v2-agpa45zz.js} +18 -14
  141. package/dist/{resume-42stcaz0.js → resume-x0ydy9s9.js} +25 -21
  142. package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
  143. package/dist/{setup-adbc1c10.js → setup-as9ga0d6.js} +2 -2
  144. package/dist/{virtual-modules-rtmt494q.js → virtual-modules-9gkxqrap.js} +6 -5
  145. package/dist/{work-objects-wpj8ck95.js → work-objects-y5g1y7ev.js} +41 -36
  146. package/dist/{worker-bzdra9rf.js → worker-860c3e38.js} +61 -56
  147. package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
  148. package/openapi.json +523 -344
  149. package/package.json +10 -11
  150. package/src/be/config-refs.ts +60 -0
  151. package/src/be/db/page-versions.ts +15 -0
  152. package/src/be/db/runtime.ts +35 -8
  153. package/src/be/db/skill-name-resolution.ts +36 -0
  154. package/src/be/db/tasks/read.ts +230 -0
  155. package/src/be/db/tasks/write.ts +7 -0
  156. package/src/be/db.ts +52 -7
  157. package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
  158. package/src/be/migrations/216_task_resolved_effort.sql +5 -0
  159. package/src/be/migrations/217_chat_sdk_state.sql +104 -0
  160. package/src/be/model-catalog-store.ts +5 -1
  161. package/src/be/model-tier-resolution.ts +12 -1
  162. package/src/be/model-validation.ts +5 -2
  163. package/src/be/models-catalog.ts +26 -1
  164. package/src/be/modelsdev-cache.json +198 -63
  165. package/src/be/modelsdev-cache.ts +9 -1
  166. package/src/be/script-credential-broker.ts +39 -2
  167. package/src/be/scripts/run-saved.ts +1 -0
  168. package/src/be/scripts/typecheck.ts +10 -8
  169. package/src/be/seed/runner.ts +13 -1
  170. package/src/be/seed/state-db.ts +5 -0
  171. package/src/be/seed/types.ts +6 -0
  172. package/src/be/seed-pricing.ts +19 -2
  173. package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
  174. package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
  175. package/src/be/seed-skills/bundled-files.generated.json +0 -18
  176. package/src/be/seed-skills/index.ts +104 -3
  177. package/src/be/swarm-config-guard.ts +52 -0
  178. package/src/cli.tsx +0 -16
  179. package/src/commands/onboard/non-interactive.ts +4 -2
  180. package/src/commands/provider-credentials.ts +52 -6
  181. package/src/commands/runner.ts +190 -54
  182. package/src/e2b/env.ts +5 -0
  183. package/src/extensions/contract-types.generated.ts +1 -1
  184. package/src/extensions/contract.ts +45 -0
  185. package/src/extensions/dispatcher.ts +7 -0
  186. package/src/extensions/post-bridge.ts +40 -0
  187. package/src/github/handlers.ts +11 -4
  188. package/src/heartbeat/templates.ts +8 -5
  189. package/src/hooks/hook.ts +0 -26
  190. package/src/http/all-routes.ts +0 -1
  191. package/src/http/config.ts +36 -17
  192. package/src/http/core.ts +4 -0
  193. package/src/http/index.ts +14 -2
  194. package/src/http/integrations.ts +88 -1
  195. package/src/http/mcp.ts +15 -5
  196. package/src/http/page-proxy.ts +2 -4
  197. package/src/http/pages-public.ts +3 -3
  198. package/src/http/pages.ts +3 -13
  199. package/src/http/poll.ts +28 -68
  200. package/src/http/requested-by.ts +54 -0
  201. package/src/http/scripts.ts +1 -0
  202. package/src/http/stats.ts +1 -30
  203. package/src/http/tasks.ts +61 -5
  204. package/src/http/utils.ts +14 -0
  205. package/src/http/webhooks.ts +159 -1
  206. package/src/http/x.ts +1 -0
  207. package/src/integrations/chat-sdk/adapters.ts +129 -0
  208. package/src/integrations/chat-sdk/attachments.ts +232 -0
  209. package/src/integrations/chat-sdk/background.ts +36 -0
  210. package/src/integrations/chat-sdk/commands.ts +194 -0
  211. package/src/integrations/chat-sdk/config.ts +198 -0
  212. package/src/integrations/chat-sdk/discord-api.ts +63 -0
  213. package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
  214. package/src/integrations/chat-sdk/handlers.ts +28 -0
  215. package/src/integrations/chat-sdk/inbound.ts +426 -0
  216. package/src/integrations/chat-sdk/limits.ts +48 -0
  217. package/src/integrations/chat-sdk/logger.ts +81 -0
  218. package/src/integrations/chat-sdk/outbound.ts +123 -0
  219. package/src/integrations/chat-sdk/relay.ts +172 -0
  220. package/src/integrations/chat-sdk/router.ts +169 -0
  221. package/src/integrations/chat-sdk/runtime.ts +351 -0
  222. package/src/integrations/chat-sdk/schema.ts +245 -0
  223. package/src/integrations/chat-sdk/state.ts +243 -0
  224. package/src/integrations/chat-sdk/status.ts +244 -0
  225. package/src/integrations/chat-sdk/steering.ts +58 -0
  226. package/src/integrations/chat-sdk/teams-origin.ts +77 -0
  227. package/src/integrations/chat-sdk/telegram-api.ts +56 -0
  228. package/src/integrations/chat-sdk/templates.ts +16 -0
  229. package/src/integrations/chat-sdk/test-hooks.ts +37 -0
  230. package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
  231. package/src/integrations/chat-sdk/typing.ts +65 -0
  232. package/src/pages/version.ts +4 -5
  233. package/src/prompts/base-prompt.ts +111 -45
  234. package/src/providers/acp-target-catalog.ts +6 -0
  235. package/src/providers/acp-targets.ts +55 -2
  236. package/src/providers/amp-adapter.ts +1 -1
  237. package/src/providers/claude-adapter.ts +1 -1
  238. package/src/providers/claude-flag-settings.ts +17 -5
  239. package/src/providers/claude-managed-adapter.ts +1 -1
  240. package/src/providers/claude-session-events.ts +6 -1
  241. package/src/providers/dsh-adapter.ts +1 -1
  242. package/src/providers/opencode-adapter.ts +243 -26
  243. package/src/providers/opencode-swarm-plugin.ts +31 -0
  244. package/src/providers/pi-mono-adapter.ts +398 -153
  245. package/src/providers/pricing-sources.md +33 -2
  246. package/src/providers/reasoning-effort.ts +27 -0
  247. package/src/providers/types.ts +6 -2
  248. package/src/rbac/legacy-policy.ts +8 -2
  249. package/src/rbac/permissions.ts +21 -0
  250. package/src/scheduler/scheduler.ts +4 -2
  251. package/src/scripts-runtime/loader.ts +19 -7
  252. package/src/scripts-runtime/sdk-allowlist.ts +8 -6
  253. package/src/scripts-runtime/swarm-sdk.ts +0 -11
  254. package/src/scripts-runtime/types/stdlib.d.ts +27 -15
  255. package/src/scripts-runtime/types/swarm-extension.d.ts +63 -1
  256. package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -15
  257. package/src/server.ts +52 -18
  258. package/src/slack/event-dedup.ts +1 -1
  259. package/src/tasks/additive-buffer.ts +4 -2
  260. package/src/tasks/context-key.ts +60 -1
  261. package/src/tasks/model-pin.ts +67 -0
  262. package/src/tasks/worker-follow-up.ts +4 -31
  263. package/src/tests/acp-adapter.test.ts +42 -0
  264. package/src/tests/api-drain-worker-e2e.test.ts +1 -6
  265. package/src/tests/base-prompt.test.ts +58 -54
  266. package/src/tests/chat-sdk-commands.test.ts +191 -0
  267. package/src/tests/chat-sdk-config.test.ts +334 -0
  268. package/src/tests/chat-sdk-discord-api.test.ts +68 -0
  269. package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
  270. package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
  271. package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
  272. package/src/tests/chat-sdk-harness.ts +146 -0
  273. package/src/tests/chat-sdk-inbound.test.ts +363 -0
  274. package/src/tests/chat-sdk-relay.test.ts +470 -0
  275. package/src/tests/chat-sdk-reload.test.ts +128 -0
  276. package/src/tests/chat-sdk-shutdown.test.ts +220 -0
  277. package/src/tests/chat-sdk-slack.test.ts +268 -0
  278. package/src/tests/chat-sdk-state.test.ts +163 -0
  279. package/src/tests/chat-sdk-status-route.test.ts +382 -0
  280. package/src/tests/chat-sdk-teams.test.ts +277 -0
  281. package/src/tests/chat-sdk-tools.test.ts +520 -0
  282. package/src/tests/chat-sdk-typing.test.ts +120 -0
  283. package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
  284. package/src/tests/claude-adapter-binary.test.ts +9 -4
  285. package/src/tests/claude-flag-settings.test.ts +11 -3
  286. package/src/tests/claude-managed-adapter.test.ts +1 -1
  287. package/src/tests/claude-sdk-lifecycle.test.ts +9 -3
  288. package/src/tests/claude-thinking-tokens.test.ts +57 -0
  289. package/src/tests/claude-worker-parity.test.ts +2 -7
  290. package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
  291. package/src/tests/config-refs.test.ts +66 -0
  292. package/src/tests/context-key.test.ts +19 -0
  293. package/src/tests/cors-allowlist.test.ts +25 -0
  294. package/src/tests/create-page-tool.test.ts +18 -0
  295. package/src/tests/credential-check.test.ts +139 -0
  296. package/src/tests/credentials.test.ts +21 -0
  297. package/src/tests/db-runtime.test.ts +61 -0
  298. package/src/tests/db-task-read-contract.test.ts +20 -0
  299. package/src/tests/db-task-write-contract.test.ts +10 -0
  300. package/src/tests/docs-index-footprint.test.js +3 -3
  301. package/src/tests/dsh-adapter.test.ts +1 -1
  302. package/src/tests/enabled-capabilities.test.ts +20 -0
  303. package/src/tests/entrypoint-api-readiness.test.ts +14 -8
  304. package/src/tests/entrypoint-config-env-export.test.ts +5 -2
  305. package/src/tests/entrypoint-export-to-env.test.ts +78 -0
  306. package/src/tests/explicit-model-validation.test.ts +105 -1
  307. package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
  308. package/src/tests/extensions-post-bridge.test.ts +51 -0
  309. package/src/tests/fetch-resolved-env.test.ts +128 -0
  310. package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
  311. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
  312. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
  313. package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
  314. package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
  315. package/src/tests/github-handlers.test.ts +35 -0
  316. package/src/tests/harness-provider-resolution.test.ts +12 -0
  317. package/src/tests/heartbeat-checklist.test.ts +3 -2
  318. package/src/tests/hook-runtime-close.test.ts +0 -2
  319. package/src/tests/http-api-integration.test.ts +0 -25
  320. package/src/tests/migration-046-budgets.test.ts +17 -16
  321. package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
  322. package/src/tests/model-tier-resolution.test.ts +93 -0
  323. package/src/tests/models-catalog.test.ts +42 -1
  324. package/src/tests/openai-compatible-providers.test.ts +134 -0
  325. package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
  326. package/src/tests/opencode-adapter.test.ts +216 -2
  327. package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
  328. package/src/tests/opencode-shell-env.test.ts +145 -0
  329. package/src/tests/openrouter-base-url.test.ts +101 -151
  330. package/src/tests/page-proxy.test.ts +1 -1
  331. package/src/tests/pages-browser-sdk.test.ts +76 -0
  332. package/src/tests/pages-feedback.test.ts +1 -1
  333. package/src/tests/paused-tasks-requested-by.test.ts +102 -0
  334. package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
  335. package/src/tests/pi-mono-adapter.test.ts +385 -5
  336. package/src/tests/pi-shell-env.test.ts +170 -0
  337. package/src/tests/prompt-template-remaining.test.ts +35 -0
  338. package/src/tests/rbac-engine.test.ts +11 -3
  339. package/src/tests/runner-exit-after-tasks.test.ts +0 -4
  340. package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
  341. package/src/tests/script-connections.test.ts +2 -0
  342. package/src/tests/scripts-http.test.ts +201 -1
  343. package/src/tests/scripts-only-gating.test.ts +2 -3
  344. package/src/tests/scripts-runtime.test.ts +58 -40
  345. package/src/tests/secret-scrubber.test.ts +86 -0
  346. package/src/tests/seed-skills-bundled-files.test.ts +45 -53
  347. package/src/tests/seed-skills-retire.test.ts +182 -0
  348. package/src/tests/send-task-requester-gate.test.ts +58 -0
  349. package/src/tests/session-cost-recompute-unit.test.ts +46 -0
  350. package/src/tests/skill-get-name-resolution.test.ts +137 -0
  351. package/src/tests/sonnet-5-5-registry.test.ts +9 -1
  352. package/src/tests/swarm-config-export-to-env.test.ts +267 -0
  353. package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
  354. package/src/tests/swarm-diff.test.ts +1 -1
  355. package/src/tests/task-model-effort-rerun.test.ts +164 -0
  356. package/src/tests/task-session-prompts.test.ts +132 -0
  357. package/src/tests/task-tool-manifest.test.ts +14 -0
  358. package/src/tests/task-tools-ctx.test.ts +2 -0
  359. package/src/tests/tool-annotations.test.ts +6 -6
  360. package/src/tests/ui-logs-parser.test.ts +43 -0
  361. package/src/tests/used-by-route.test.ts +6 -0
  362. package/src/tests/vercel-ai-gateway.test.ts +149 -0
  363. package/src/tests/workflow-swarm-script.test.ts +38 -0
  364. package/src/tests/workflow-wait-filter.test.ts +5 -3
  365. package/src/tools/chat-access.ts +41 -0
  366. package/src/tools/chat-open-dm.ts +59 -0
  367. package/src/tools/chat-post.ts +74 -0
  368. package/src/tools/chat-read-thread.ts +100 -0
  369. package/src/tools/chat-reply.ts +75 -0
  370. package/src/tools/create-page.ts +3 -13
  371. package/src/tools/model-catalog/index.ts +2 -1
  372. package/src/tools/register-chat-channel.ts +139 -0
  373. package/src/tools/send-task.ts +24 -0
  374. package/src/tools/skills/skill-get.ts +17 -9
  375. package/src/tools/swarm-config/get-config.ts +2 -1
  376. package/src/tools/swarm-config/list-config.ts +2 -1
  377. package/src/tools/swarm-config/set-config.ts +16 -3
  378. package/src/tools/tool-config.ts +8 -6
  379. package/src/types.ts +12 -2
  380. package/src/utils/config-env-export.ts +74 -0
  381. package/src/utils/credentials.test.ts +92 -0
  382. package/src/utils/credentials.ts +52 -4
  383. package/src/utils/harness-provider.ts +15 -6
  384. package/src/utils/runtime-model-catalog.ts +11 -1
  385. package/src/utils/secret-scrubber.ts +71 -2
  386. package/src/utils/task-tool-manifest.ts +19 -2
  387. package/src/workflows/executors/swarm-script.ts +1 -0
  388. package/templates/skills/agent-browser/SKILL.md +1 -1
  389. package/templates/skills/agent-browser/content.md +1 -1
  390. package/templates/skills/apps/SKILL.md +8 -1
  391. package/templates/skills/apps/content.md +8 -1
  392. package/templates/skills/chat-sdk/config.json +14 -0
  393. package/templates/skills/chat-sdk/content.md +84 -0
  394. package/templates/skills/composio-gmail/content.md +7 -0
  395. package/templates/skills/composio-google-docs/content.md +1 -1
  396. package/templates/skills/email-domain-health/config.json +14 -0
  397. package/templates/skills/email-domain-health/content.md +131 -0
  398. package/templates/skills/kv-storage/content.md +2 -2
  399. package/templates/skills/pages/content.md +8 -10
  400. package/templates/skills/swarm-extensions/content.md +2 -0
  401. package/templates/skills/swarm-scripts/SKILL.md +4 -2
  402. package/templates/skills/swarm-scripts/config.json +1 -1
  403. package/templates/skills/swarm-scripts/content.md +4 -2
  404. package/templates/skills/workflow-iterate/content.md +38 -0
  405. package/dist/artifact-eczsknc3.js +0 -3843
  406. package/dist/cli-bd957dgb.js +0 -153
  407. package/dist/cli-q51yprfq.js +0 -1104
  408. package/dist/cli-t1ze64h3.js +0 -811
  409. package/dist/cli-tcc4wd5d.js +0 -56471
  410. package/dist/index-9ch1n761.js +0 -1102
  411. package/src/artifact-sdk/index.ts +0 -2
  412. package/src/artifact-sdk/localtunnel.d.ts +0 -20
  413. package/src/artifact-sdk/port.ts +0 -12
  414. package/src/artifact-sdk/server.ts +0 -183
  415. package/src/artifact-sdk/tunnel.ts +0 -19
  416. package/src/commands/artifact.ts +0 -249
  417. package/src/http/ecosystem.ts +0 -77
  418. package/src/tests/artifact-commands.test.ts +0 -92
  419. package/src/tests/artifact-sdk.test.ts +0 -793
  420. package/src/tests/register-service-security.test.ts +0 -194
  421. package/src/tools/list-services.ts +0 -107
  422. package/src/tools/register-service.ts +0 -177
  423. package/src/tools/unregister-service.ts +0 -73
  424. package/src/tools/update-service-status.ts +0 -96
  425. package/templates/skills/artifacts/config.json +0 -14
  426. package/templates/skills/artifacts/content.md +0 -344
  427. package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
  428. package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
  429. package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
  430. package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
  431. /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
  432. /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
@@ -6,7 +6,12 @@ import {
6
6
  init_secret_scrubber,
7
7
  isSensitiveKey,
8
8
  scrubSecrets
9
- } from "./cli-d161g69q.js";
9
+ } from "./cli-p1x85d2t.js";
10
+ import {
11
+ init_src,
12
+ openAICompatibleBaseUrlVars,
13
+ openAICompatibleKeyVars
14
+ } from "./cli-e3g5mbkz.js";
10
15
  import {
11
16
  __esm
12
17
  } from "./cli-bc05qbss.js";
@@ -147,6 +152,7 @@ function absolutePath(path, cwd = process.cwd()) {
147
152
  }
148
153
  var DEFAULT_E2B_API_BASE = "https://api.e2b.app", DEFAULT_E2B_TEMPLATE_NAMES, DEFAULT_E2B_FORWARD_KEYS;
149
154
  var init_env = __esm(() => {
155
+ init_src();
150
156
  init_api_key();
151
157
  init_secret_scrubber();
152
158
  DEFAULT_E2B_TEMPLATE_NAMES = {
@@ -161,6 +167,8 @@ var init_env = __esm(() => {
161
167
  "CLAUDE_CODE_OAUTH_TOKEN",
162
168
  "OPENAI_API_KEY",
163
169
  "OPENROUTER_API_KEY",
170
+ ...openAICompatibleKeyVars(),
171
+ ...openAICompatibleBaseUrlVars(),
164
172
  "GITHUB_TOKEN",
165
173
  "GITLAB_TOKEN",
166
174
  "AZURE_DEVOPS_TOKEN",
@@ -6,11 +6,11 @@ import {
6
6
  import {
7
7
  parseModelStr,
8
8
  resolveCredential
9
- } from "./cli-6thk4jz3.js";
9
+ } from "./cli-se8w6wny.js";
10
10
  import {
11
11
  complete,
12
12
  getBuiltinModel
13
- } from "./cli-b07hr3bt.js";
13
+ } from "./cli-txqb9s38.js";
14
14
  import {
15
15
  exports_typebox
16
16
  } from "./cli-h6vtvt5c.js";
@@ -29,7 +29,7 @@ import {
29
29
  import {
30
30
  init_secret_scrubber,
31
31
  scrubSecrets
32
- } from "./cli-d161g69q.js";
32
+ } from "./cli-p1x85d2t.js";
33
33
 
34
34
  // src/utils/internal-ai/complete-structured.ts
35
35
  init_zod();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  remediateStalledRuntime
3
- } from "./cli-ne7smj1b.js";
3
+ } from "./cli-ke896fcf.js";
4
4
  import {
5
5
  REBOOT_RETRY_PIN_TAG,
6
6
  agentsWithLiveRuntime,
@@ -25,22 +25,22 @@ import {
25
25
  repointTrackerSyncBySwarmId,
26
26
  resolveLeadOnlyRecoveryAssignment,
27
27
  runtimeStaleThresholdMinutes
28
- } from "./cli-rfz2ve55.js";
28
+ } from "./cli-bzszjf2p.js";
29
29
  import {
30
30
  isMultiRuntimeEnabled
31
31
  } from "./cli-re8z5p8p.js";
32
32
  import {
33
33
  runSavedScriptAsAgent
34
- } from "./cli-7a93cv8c.js";
34
+ } from "./cli-ee9gtz70.js";
35
35
  import {
36
36
  createApprovalFollowUpTask
37
- } from "./cli-6r2f7edk.js";
37
+ } from "./cli-v1yb0rqb.js";
38
38
  import {
39
39
  init_db as init_db2,
40
40
  init_users,
41
41
  listRuntimePools,
42
42
  mintToken
43
- } from "./cli-3nxdmjrc.js";
43
+ } from "./cli-eejsgvm4.js";
44
44
  import {
45
45
  MAX_EMPTY_POLLS,
46
46
  assignUnassignedTaskPending,
@@ -98,11 +98,11 @@ import {
98
98
  settleSupersededTaskDependents,
99
99
  supersedeTask,
100
100
  updateAgentStatus
101
- } from "./cli-fmhj1ehj.js";
101
+ } from "./cli-ef1hg1wv.js";
102
102
  import {
103
103
  TERMINAL_TASK_STATUSES,
104
104
  init_types
105
- } from "./cli-hsem16hb.js";
105
+ } from "./cli-cgtksawx.js";
106
106
  import {
107
107
  init_registry,
108
108
  init_resolver,
@@ -112,11 +112,11 @@ import {
112
112
  import {
113
113
  init_package,
114
114
  package_default
115
- } from "./cli-5er5gjbm.js";
115
+ } from "./cli-k382tshb.js";
116
116
  import {
117
117
  init_event_bus,
118
118
  workflowEventBus
119
- } from "./cli-81r1wjyv.js";
119
+ } from "./cli-9nfx44eh.js";
120
120
  import {
121
121
  init_env_flag,
122
122
  isEnvFlagEnabled
@@ -124,7 +124,7 @@ import {
124
124
  import {
125
125
  init_secret_scrubber,
126
126
  scrubSecrets
127
- } from "./cli-d161g69q.js";
127
+ } from "./cli-p1x85d2t.js";
128
128
 
129
129
  // src/heartbeat/heartbeat.ts
130
130
  init_package();
@@ -477,9 +477,6 @@ registerTemplate({
477
477
  defaultBody: `Task Type: Heartbeat Checklist
478
478
  Goal: Review system status and your standing orders, take action if needed.
479
479
 
480
- ## Current System Status [auto-generated]
481
- {{system_status}}
482
-
483
480
  ## Your Standing Orders (snapshot from HEARTBEAT.md)
484
481
  {{heartbeat_content}}
485
482
 
@@ -489,7 +486,7 @@ Goal: Review system status and your standing orders, take action if needed.
489
486
  1. **Read your HEARTBEAT.md** — run \`read /workspace/HEARTBEAT.md\` to get the latest standing orders (the snapshot above may be slightly stale).
490
487
  2. **Prune tracked HEARTBEAT items FIRST.** Active Blockers + Watch Items + Open Discussion combined must stay at ≤10 items; 20 is the absolute max only when genuinely super busy. This cap does not apply to evergreen Standing Orders / Governance / Playbook-index reference sections. Before adding anything, re-check every tracked item against its lift trigger and remove anything resolved, stale, or past its trigger date. Lift incident detail to memory; never keep it inline in HEARTBEAT.md. Every new tracked item must include an explicit lift trigger + date; if it has no removal condition, do not add it. If the tracked list is already at/over cap, prune before (or instead of) adding — the cap is binding.
491
488
  3. **Run seeded heartbeat data-gathering.** Use \`script-run\` with the global scripts \`schedule-health\` and \`task-failure-audit\`, both with args \`{ "days": 1, "publishPage": false }\`. They report failing schedules and failure clusters. Check any other standing order in HEARTBEAT.md yourself. Scripts can read Slack too (\`ctx.swarm.slack_read\` or the seeded \`slack-thread-flatten\` script), so a recurring Slack check can be scripted.
492
- 4. Review the system status above plus the script results for anything that needs attention (stalled tasks, idle workers with available work, anomalies).
489
+ 4. Review the system status below plus the script results for anything that needs attention (stalled tasks, idle workers with available work, anomalies).
493
490
  5. **CRITICAL — Reboot failure triage:** Failures with reason "worker session not found" or "worker session heartbeat is stale" indicate tasks that were INTERRUPTED by a server restart. These are NOT "expected auto-cleanup" — they represent work that was lost mid-execution. For each such failure:
494
491
  - Check what the task was (via \`get-task-details\` with the task ID from the failure)
495
492
  - If a retry task was auto-created (tagged \`reboot-retry\`), verify it is progressing
@@ -499,7 +496,10 @@ Goal: Review system status and your standing orders, take action if needed.
499
496
  7. If something needs attention — take action now using your available tools (create tasks, post to Slack, cancel stuck tasks, etc.).
500
497
  8. If everything looks healthy and no standing orders are actionable — complete this task with a brief "All clear" summary. You may NOT say "All clear" if reboot-related failures exist that haven't been triaged.
501
498
  9. Do NOT create another heartbeat-checklist task — the system handles scheduling.
502
- 10. **Update HEARTBEAT.md only after pruning.** Keep it current, but keep tracked items capped: remove resolved items, add only dated lift-triggered items, and lift detail to memory instead of growing the file.`,
499
+ 10. **Update HEARTBEAT.md only after pruning.** Keep it current, but keep tracked items capped: remove resolved items, add only dated lift-triggered items, and lift detail to memory instead of growing the file.
500
+
501
+ ## Current System Status [auto-generated]
502
+ {{system_status}}`,
503
503
  variables: [
504
504
  {
505
505
  name: "system_status",
@@ -5870,7 +5870,7 @@ function githubCopilotProvider() {
5870
5870
  }
5871
5871
 
5872
5872
  // node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.js
5873
- var googleGenerativeAIApi = () => lazyApi(() => import("./google-generative-ai-szdxbpqg.js"));
5873
+ var googleGenerativeAIApi = () => lazyApi(() => import("./google-generative-ai-g8db7x0f.js"));
5874
5874
 
5875
5875
  // node_modules/@earendil-works/pi-ai/dist/providers/google.js
5876
5876
  function googleProvider() {
@@ -5885,7 +5885,7 @@ function googleProvider() {
5885
5885
  }
5886
5886
 
5887
5887
  // node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.js
5888
- var googleVertexApi = () => lazyApi(() => import("./google-vertex-qzw3p36d.js"));
5888
+ var googleVertexApi = () => lazyApi(() => import("./google-vertex-r2692q0r.js"));
5889
5889
 
5890
5890
  // node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js
5891
5891
  var VERTEX_ADC_PATH = "~/.config/gcloud/application_default_credentials.json";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  DEFAULT_MODEL,
3
3
  resolveCredential
4
- } from "./cli-6thk4jz3.js";
4
+ } from "./cli-se8w6wny.js";
5
5
  import {
6
6
  getSlackApp
7
- } from "./cli-tcc4wd5d.js";
7
+ } from "./cli-skxvvpap.js";
8
8
  import {
9
9
  claimApprovalCancellationNotification,
10
10
  completeApprovalCancellationNotificationClaim,
@@ -12,11 +12,11 @@ import {
12
12
  getTaskById,
13
13
  init_db1 as init_db,
14
14
  releaseApprovalCancellationNotificationClaim
15
- } from "./cli-fmhj1ehj.js";
15
+ } from "./cli-ef1hg1wv.js";
16
16
  import {
17
17
  TERMINAL_TASK_STATUSES,
18
18
  init_types
19
- } from "./cli-hsem16hb.js";
19
+ } from "./cli-cgtksawx.js";
20
20
  import {
21
21
  init_resolver,
22
22
  resolveTemplate
@@ -40,7 +40,7 @@ import {
40
40
  import {
41
41
  init_secret_scrubber,
42
42
  scrubSecrets
43
- } from "./cli-d161g69q.js";
43
+ } from "./cli-p1x85d2t.js";
44
44
  import {
45
45
  __require
46
46
  } from "./cli-bc05qbss.js";
@@ -433,7 +433,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
433
433
  }
434
434
  if (notification.channel === "slack") {
435
435
  try {
436
- const { getSlackApp: getSlackApp2 } = await import("./app-km9qnv2f.js");
436
+ const { getSlackApp: getSlackApp2 } = await import("./app-kfvgbvzy.js");
437
437
  const slackApp = getSlackApp2();
438
438
  if (!slackApp) {
439
439
  console.warn("[HITL] Slack not initialized — cannot send notification");
@@ -9,7 +9,7 @@ import {
9
9
  renderGoalReminder,
10
10
  summarizeTranscript,
11
11
  syncIdentityFilesToServer
12
- } from "./cli-na2pxe4f.js";
12
+ } from "./cli-apx87jne.js";
13
13
  import {
14
14
  fetchInstalledMcpServers
15
15
  } from "./cli-tng3131n.js";
@@ -23,17 +23,19 @@ import {
23
23
  CONTEXT_FORMULA,
24
24
  clampContextPercent,
25
25
  getContextWindowSize
26
- } from "./cli-7avy4v8w.js";
26
+ } from "./cli-w1q7h2r2.js";
27
27
  import {
28
28
  applyReasoningEffort
29
- } from "./cli-tmhsxhb8.js";
29
+ } from "./cli-n5vwg842.js";
30
30
  import {
31
31
  swarmRuntimeInstanceId
32
32
  } from "./cli-re8z5p8p.js";
33
33
  import {
34
34
  init_credentials,
35
+ openAICompatibleKeyLabels,
36
+ splitCredentialPool,
35
37
  validateOpencodeCredentials
36
- } from "./cli-tadfgd0t.js";
38
+ } from "./cli-5hkm7whv.js";
37
39
  import {
38
40
  DEFAULT_OPENROUTER_BASE_URL,
39
41
  getOpenRouterAttributionHeaders,
@@ -46,10 +48,23 @@ import {
46
48
  } from "./cli-ej6gbxfb.js";
47
49
  import {
48
50
  init_secret_scrubber,
51
+ registerVolatileSecret,
49
52
  scrubSecrets
50
- } from "./cli-d161g69q.js";
53
+ } from "./cli-p1x85d2t.js";
54
+ import {
55
+ baseUrlOverride,
56
+ ignoredBaseUrlVar,
57
+ init_src,
58
+ openAICompatibleKeyVars,
59
+ openAICompatibleProvider,
60
+ openAICompatibleProviders,
61
+ providerBaseUrl,
62
+ providerForKeyVar,
63
+ providerKeyVars
64
+ } from "./cli-e3g5mbkz.js";
51
65
 
52
66
  // src/providers/opencode-adapter.ts
67
+ init_src();
53
68
  import { existsSync, readFileSync } from "node:fs";
54
69
  import { dirname, join } from "node:path";
55
70
  init_credentials();
@@ -117,11 +132,29 @@ class OpenRouterBilling {
117
132
  }
118
133
 
119
134
  // src/providers/opencode-swarm-plugin.ts
135
+ var OPENCODE_SHELL_ENV_KEYS = ["TERM", "OPENCODE_TERMINAL"];
136
+ function applyOpencodeShellEnv(callEnv, sessionEnv) {
137
+ const keep = new Set(OPENCODE_SHELL_ENV_KEYS);
138
+ for (const key of Object.keys(callEnv)) {
139
+ if (!keep.has(key))
140
+ delete callEnv[key];
141
+ }
142
+ for (const [key, value] of Object.entries(sessionEnv)) {
143
+ if (value !== undefined && !keep.has(key))
144
+ callEnv[key] = value;
145
+ }
146
+ }
120
147
  function createOpencodeSwarmPlugin(config, options = {}) {
121
148
  return {
122
149
  id: "agent-swarm",
123
150
  async setup(ctx) {
124
151
  options.onToolRegistry?.(() => ctx.tool.list());
152
+ const sessionEnv = config.env;
153
+ if (sessionEnv) {
154
+ await ctx.shell.hook("create.before", (event) => {
155
+ applyOpencodeShellEnv(event.env, sessionEnv);
156
+ });
157
+ }
125
158
  await ctx.tool.hook("execute.before", async (event) => {
126
159
  if (!config.isLead && config.taskId) {
127
160
  const { cancelled, reason } = await isTaskCancelled(config);
@@ -184,9 +217,22 @@ function opencodeModelToCredKey(modelStr) {
184
217
  return "OPENROUTER_API_KEY";
185
218
  if (provider === "openai")
186
219
  return "OPENAI_API_KEY";
220
+ const direct = openAICompatibleProvider(provider);
221
+ if (direct)
222
+ return direct.envVar;
187
223
  }
188
224
  return null;
189
225
  }
226
+ function credKeyNames(requiredKey) {
227
+ const direct = providerForKeyVar(requiredKey);
228
+ return direct ? providerKeyVars(direct) : [requiredKey];
229
+ }
230
+ var OPENCODE_ANY_KEY_VARS = [
231
+ "OPENROUTER_API_KEY",
232
+ "ANTHROPIC_API_KEY",
233
+ "OPENAI_API_KEY",
234
+ ...openAICompatibleKeyVars()
235
+ ];
190
236
  function checkOpencodeCredentials(env, opts = {}) {
191
237
  const homeDir = opts.homeDir ?? env.HOME ?? "/root";
192
238
  const probe = opts.fs?.existsSync ?? existsSync;
@@ -196,7 +242,7 @@ function checkOpencodeCredentials(env, opts = {}) {
196
242
  }
197
243
  const requiredKey = opencodeModelToCredKey(env.MODEL_OVERRIDE);
198
244
  if (requiredKey) {
199
- if (env[requiredKey]) {
245
+ if (credKeyNames(requiredKey).some((name) => env[name])) {
200
246
  return { ready: true, missing: [], satisfiedBy: "env" };
201
247
  }
202
248
  return {
@@ -205,13 +251,24 @@ function checkOpencodeCredentials(env, opts = {}) {
205
251
  hint: `MODEL_OVERRIDE=${env.MODEL_OVERRIDE} requires ${requiredKey}; or run \`opencode auth login\` to create ${authFile}.`
206
252
  };
207
253
  }
208
- if (env.OPENROUTER_API_KEY || env.ANTHROPIC_API_KEY || env.OPENAI_API_KEY) {
254
+ if (OPENCODE_ANY_KEY_VARS.some((name) => env[name])) {
209
255
  return { ready: true, missing: [], satisfiedBy: "env" };
210
256
  }
211
257
  return {
212
258
  ready: false,
213
- missing: ["OPENROUTER_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY", authFile],
214
- hint: "Set one of OPENROUTER_API_KEY / ANTHROPIC_API_KEY / OPENAI_API_KEY (any one suffices), or run `opencode auth login` to create ~/.local/share/opencode/auth.json."
259
+ missing: [
260
+ "OPENROUTER_API_KEY",
261
+ "ANTHROPIC_API_KEY",
262
+ "OPENAI_API_KEY",
263
+ ...openAICompatibleProviders().map((p) => p.envVar),
264
+ authFile
265
+ ],
266
+ hint: `Set one of ${[
267
+ "OPENROUTER_API_KEY",
268
+ "ANTHROPIC_API_KEY",
269
+ "OPENAI_API_KEY",
270
+ ...openAICompatibleKeyLabels()
271
+ ].join(" / ")} (any one suffices), or run \`opencode auth login\` to create ~/.local/share/opencode/auth.json.`
215
272
  };
216
273
  }
217
274
  function defaultOpencodeSkillsDir() {
@@ -275,6 +332,92 @@ function applyOpenRouterBaseUrlOverride(opencodeConfig, env = process.env) {
275
332
  }
276
333
  };
277
334
  }
335
+ function buildOpenAICompatibleProviderBlock(provider, apiKey, modelId, baseUrl = provider.baseUrl) {
336
+ const models = {};
337
+ for (const m of provider.models) {
338
+ models[m.id] = {
339
+ name: m.name,
340
+ tool_call: true,
341
+ reasoning: m.reasoning,
342
+ limit: { context: m.contextWindow, output: m.maxOutputTokens }
343
+ };
344
+ }
345
+ if (modelId && !models[modelId])
346
+ models[modelId] = { name: modelId, tool_call: true };
347
+ return {
348
+ npm: provider.npm,
349
+ name: provider.displayName,
350
+ env: [],
351
+ options: { baseURL: baseUrl, apiKey },
352
+ models
353
+ };
354
+ }
355
+ function envBoundKeyVars(providerId) {
356
+ if (providerId === "openrouter")
357
+ return ["OPENROUTER_API_KEY"];
358
+ const direct = openAICompatibleProvider(providerId);
359
+ return direct?.catalog === "models.dev" ? providerKeyVars(direct) : undefined;
360
+ }
361
+ function customBlockProvider(providerId) {
362
+ const direct = openAICompatibleProvider(providerId);
363
+ return direct?.catalog === "registry" ? direct : undefined;
364
+ }
365
+ function pickProviderKey(env, names) {
366
+ for (const name of names) {
367
+ const value = env[name]?.trim();
368
+ if (!value)
369
+ continue;
370
+ const key = splitCredentialPool(value)[0];
371
+ if (key)
372
+ return { key, name };
373
+ }
374
+ return;
375
+ }
376
+ function applyProviderKeySplice(opencodeConfig, model, env) {
377
+ const slash = model?.indexOf("/") ?? -1;
378
+ if (!model || slash <= 0)
379
+ return;
380
+ const providerId = model.slice(0, slash);
381
+ const existing = opencodeConfig.provider?.[providerId];
382
+ const custom = customBlockProvider(providerId);
383
+ if (custom) {
384
+ const picked2 = pickProviderKey(env, providerKeyVars(custom));
385
+ if (!picked2)
386
+ return;
387
+ const block = buildOpenAICompatibleProviderBlock(custom, picked2.key, model.slice(slash + 1), providerBaseUrl(custom, env));
388
+ opencodeConfig.provider = {
389
+ ...opencodeConfig.provider,
390
+ [providerId]: {
391
+ ...existing,
392
+ ...block,
393
+ options: { ...existing?.options, ...block.options },
394
+ models: { ...existing?.models, ...block.models }
395
+ }
396
+ };
397
+ return picked2;
398
+ }
399
+ const names = envBoundKeyVars(providerId);
400
+ if (!names)
401
+ return;
402
+ const picked = pickProviderKey(env, names);
403
+ if (!picked)
404
+ return;
405
+ const direct = openAICompatibleProvider(providerId);
406
+ const baseURL = direct ? baseUrlOverride(direct, env) : undefined;
407
+ const options = { ...existing?.options, ...baseURL ? { baseURL } : {}, apiKey: picked.key };
408
+ if (direct?.baseUrlLocked) {
409
+ const ignored = ignoredBaseUrlVar(direct, env);
410
+ if (ignored || options.baseURL !== undefined) {
411
+ console.warn(`[opencode] ${ignored ?? `provider.${providerId}.options.baseURL`} is ignored: ${direct.displayName} uses its built-in endpoint`);
412
+ }
413
+ delete options.baseURL;
414
+ }
415
+ opencodeConfig.provider = {
416
+ ...opencodeConfig.provider,
417
+ [providerId]: { ...existing, env: [], options }
418
+ };
419
+ return picked;
420
+ }
278
421
  var SWARM_AGENT_NAME = "swarm";
279
422
  var TRANSCRIPT_TAIL_CHARS = 20000;
280
423
  var TOOL_RESULT_PREVIEW_CHARS = 500;
@@ -531,9 +674,10 @@ class OpencodeSession {
531
674
  autoIndexMemoryFile(this.swarm, path);
532
675
  }
533
676
  }
534
- fail(message) {
677
+ fail(rawMessage) {
535
678
  if (this.aborted || this.completed)
536
679
  return;
680
+ const message = scrubSecrets(rawMessage);
537
681
  this.emit({ type: "error", message });
538
682
  this.finish(async () => ({
539
683
  exitCode: 1,
@@ -681,6 +825,9 @@ class OpencodeAdapter {
681
825
  [SWARM_AGENT_NAME]: { mode: "primary", prompt: config.systemPrompt ?? "" }
682
826
  }
683
827
  };
828
+ const splicedKey = applyProviderKeySplice(opencodeConfig, config.model, env);
829
+ if (splicedKey)
830
+ registerVolatileSecret(splicedKey.key, splicedKey.name);
684
831
  const reasoningApplication = applyReasoningEffort("opencode", config.model, config.reasoningEffort);
685
832
  const appliedReasoningEffort = reasoningApplication.kind === "opencode-options" ? config.reasoningEffort ?? null : null;
686
833
  if (reasoningApplication.kind === "opencode-options") {
@@ -712,21 +859,26 @@ class OpencodeAdapter {
712
859
  const { sdk, version: opencodeVersion } = await loadOpencodeSdkImpl();
713
860
  let listTools;
714
861
  const billing = config.model.startsWith("openrouter/") ? new OpenRouterBilling : undefined;
715
- const host = await sdk.OpenCode.create({
716
- config: { content: JSON.stringify(opencodeConfig) },
717
- plugins: [
718
- createOpencodeSwarmPlugin(swarm, {
719
- onToolRegistry: (lister) => {
720
- listTools = lister;
721
- },
722
- ...billing ? { onOpenRouterResponse: (response) => billing.observe(response) } : {}
723
- })
724
- ],
725
- log: {
726
- level: "warn",
727
- emit: (entry) => console.warn(scrubSecrets(`[opencode] ${entry.message}`))
728
- }
729
- });
862
+ let host;
863
+ try {
864
+ host = await sdk.OpenCode.create({
865
+ config: { content: JSON.stringify(opencodeConfig) },
866
+ plugins: [
867
+ createOpencodeSwarmPlugin(swarm, {
868
+ onToolRegistry: (lister) => {
869
+ listTools = lister;
870
+ },
871
+ ...billing ? { onOpenRouterResponse: (response) => billing.observe(response) } : {}
872
+ })
873
+ ],
874
+ log: {
875
+ level: "warn",
876
+ emit: (entry) => console.warn(scrubSecrets(`[opencode] ${entry.message}`))
877
+ }
878
+ });
879
+ } catch (err) {
880
+ throw new Error(scrubSecrets(`opencode host failed to start: ${errorMessage(err, "")}`));
881
+ }
730
882
  let sessionId;
731
883
  try {
732
884
  const created = await host.sessions.create({
@@ -736,7 +888,7 @@ class OpencodeAdapter {
736
888
  sessionId = created.id;
737
889
  } catch (err) {
738
890
  await host.close().catch(() => {});
739
- throw err;
891
+ throw new Error(scrubSecrets(`opencode session create failed: ${errorMessage(err, "")}`));
740
892
  }
741
893
  const session = new OpencodeSession(host, sessionId, config.model, swarm, config.cwd, appliedReasoningEffort, billing);
742
894
  session.emitSessionInit(opencodeVersion ? { version: opencodeVersion } : undefined);
@@ -779,4 +931,4 @@ class OpencodeAdapter {
779
931
  }
780
932
  }
781
933
 
782
- export { checkOpencodeCredentials, resolveOpencodeSdkSpecifier, _setOpencodeSdkLoaderForTests, applyOpenRouterBaseUrlOverride, _setOpencodeSessionHooksForTests, checkSwarmMcpAdmission, OpencodeSession, OpencodeAdapter };
934
+ export { checkOpencodeCredentials, resolveOpencodeSdkSpecifier, _setOpencodeSdkLoaderForTests, applyOpenRouterBaseUrlOverride, buildOpenAICompatibleProviderBlock, applyProviderKeySplice, _setOpencodeSessionHooksForTests, checkSwarmMcpAdmission, OpencodeSession, OpencodeAdapter };
@@ -5,14 +5,14 @@ import {
5
5
  CONTEXT_FORMULA,
6
6
  clampContextPercent,
7
7
  computeContextUsedUnified
8
- } from "./cli-7avy4v8w.js";
8
+ } from "./cli-w1q7h2r2.js";
9
9
  import {
10
10
  applyReasoningEffort
11
- } from "./cli-tmhsxhb8.js";
11
+ } from "./cli-n5vwg842.js";
12
12
  import {
13
13
  ampBillsCacheWrites,
14
14
  resolveAmpModel
15
- } from "./cli-2bw3w47j.js";
15
+ } from "./cli-hnhtk6cj.js";
16
16
  import {
17
17
  swarmRuntimeInstanceId
18
18
  } from "./cli-re8z5p8p.js";
@@ -28,7 +28,7 @@ import {
28
28
  init_secret_scrubber,
29
29
  registerVolatileSecret,
30
30
  scrubSecrets
31
- } from "./cli-d161g69q.js";
31
+ } from "./cli-p1x85d2t.js";
32
32
 
33
33
  // src/providers/amp-adapter.ts
34
34
  import { existsSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
@@ -36,7 +36,7 @@ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
36
36
  import { tmpdir } from "node:os";
37
37
  import { join } from "node:path";
38
38
  init_secret_scrubber();
39
- var AMP_PACKAGE = "@ampcode/cli@0.0.1791979242-g144271";
39
+ var AMP_PACKAGE = "@ampcode/cli@0.0.1792065649-g5a30fc";
40
40
  var AMP_MCP_SERVER_NAME = "agent-swarm";
41
41
  var AMP_PLUGIN_MODE_KEY = "agent-swarm";
42
42
  var AMP_LIVE_TEST_TIMEOUT_MS = 5000;
@@ -1,10 +1,12 @@
1
1
  import {
2
- buildClaudeShortnameMap,
3
2
  init_runtime_model_catalog,
4
- init_src,
5
3
  runtimeCatalogModel,
6
4
  runtimeCatalogSection
7
- } from "./cli-014vns2y.js";
5
+ } from "./cli-stfs0k5s.js";
6
+ import {
7
+ buildClaudeShortnameMap,
8
+ init_src
9
+ } from "./cli-e3g5mbkz.js";
8
10
 
9
11
  // src/utils/context-window.ts
10
12
  init_src();
@@ -14,7 +14,7 @@ import {
14
14
  require_proper_lockfile,
15
15
  resolveConfigValueOrThrow,
16
16
  resolveHeadersOrThrow
17
- } from "./cli-r44t9wqc.js";
17
+ } from "./cli-r106725k.js";
18
18
  import {
19
19
  APP_NAME,
20
20
  VERSION,
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  recordUnmappedIdentity,
3
3
  resolveIdentity
4
- } from "./cli-rfz2ve55.js";
4
+ } from "./cli-bzszjf2p.js";
5
5
  import {
6
6
  findOrCreateUserByEmail,
7
7
  findUserByExternalId,
8
8
  init_users,
9
9
  linkIdentity
10
- } from "./cli-3nxdmjrc.js";
10
+ } from "./cli-eejsgvm4.js";
11
11
  import {
12
12
  getKv,
13
13
  init_db1 as init_db,
14
14
  upsertKv
15
- } from "./cli-fmhj1ehj.js";
15
+ } from "./cli-ef1hg1wv.js";
16
16
 
17
17
  // src/slack/enrich.ts
18
18
  init_db();