@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
@@ -1,12 +1,28 @@
1
+ import {
2
+ checkGrokCredentials
3
+ } from "./cli-kt6zqg0e.js";
1
4
  import {
2
5
  renderSteeringDelivery
3
6
  } from "./cli-19njxg5g.js";
4
7
  import {
5
- checkCursorCredentials
6
- } from "./cli-1x7da0de.js";
8
+ checkClaudeManagedCredentials
9
+ } from "./cli-29jc5q7w.js";
7
10
  import {
8
- checkGrokCredentials
9
- } from "./cli-xc7p7s3g.js";
11
+ checkDevinCredentials
12
+ } from "./cli-q50942rs.js";
13
+ import {
14
+ checkOpencodeCredentials
15
+ } from "./cli-vatyhshy.js";
16
+ import {
17
+ checkDshCredentials
18
+ } from "./cli-3fbmmawm.js";
19
+ import {
20
+ checkAmpCredentials,
21
+ liveTestAmpCredentials
22
+ } from "./cli-vdach5a9.js";
23
+ import {
24
+ checkCursorCredentials
25
+ } from "./cli-s4setq91.js";
10
26
  import {
11
27
  createSkillInvokeTracker,
12
28
  isSkillLoaderCall,
@@ -15,23 +31,13 @@ import {
15
31
  import {
16
32
  checkCodexCredentials,
17
33
  codexUserHome
18
- } from "./cli-94b48jhk.js";
34
+ } from "./cli-03gedhng.js";
19
35
  import {
20
- checkClaudeManagedCredentials
21
- } from "./cli-d603qf86.js";
22
- import {
23
- checkDevinCredentials
24
- } from "./cli-e3pmyt39.js";
25
- import {
26
- checkOpencodeCredentials
27
- } from "./cli-saqyage0.js";
28
- import {
29
- checkDshCredentials
30
- } from "./cli-srqq3gc5.js";
36
+ checkClaudeCredentials
37
+ } from "./cli-q0ke1yww.js";
31
38
  import {
32
- checkAmpCredentials,
33
- liveTestAmpCredentials
34
- } from "./cli-5wpw4rab.js";
39
+ getContextWindowSize
40
+ } from "./cli-w1q7h2r2.js";
35
41
  import {
36
42
  isLeadChannelMonitoringEnabled,
37
43
  isUnknownModelError,
@@ -41,19 +47,13 @@ import {
41
47
  import {
42
48
  ACP_TARGET_IDS,
43
49
  isAcpTarget
44
- } from "./cli-7a0sde2x.js";
50
+ } from "./cli-6cagzc96.js";
45
51
  import {
46
52
  CODEX_OAUTH_POOL_SLOTS_ENV,
47
53
  countCodexOAuthPoolSlots,
48
54
  hasCodexOAuthPoolSlots,
49
55
  isCodexOAuthConfigKey
50
56
  } from "./cli-bqjfjex4.js";
51
- import {
52
- checkClaudeCredentials
53
- } from "./cli-0a7mm3zp.js";
54
- import {
55
- getContextWindowSize
56
- } from "./cli-7avy4v8w.js";
57
57
  import {
58
58
  CODEX_CREDITS_EXHAUSTED_COOLDOWN_MS,
59
59
  MAX_RATE_LIMIT_RESET_MS,
@@ -62,23 +62,27 @@ import {
62
62
  parseRateLimitResetTime,
63
63
  resolveCodexCreditsExhaustedCooldownMs
64
64
  } from "./cli-2pdaysab.js";
65
+ import {
66
+ effectiveReasoningEffort
67
+ } from "./cli-n5vwg842.js";
65
68
  import {
66
69
  canonicalAzureDevOpsRepoUrl,
67
70
  isAzureDevOpsUrl,
68
71
  parseAzureDevOpsRepoUrl,
69
- resolveScriptsOnlyMode
70
- } from "./cli-rfz2ve55.js";
72
+ resolveScriptsOnlyMode,
73
+ resumedTaskModelSelection
74
+ } from "./cli-bzszjf2p.js";
71
75
  import {
72
76
  terminateRegisteredProcessGroups
73
77
  } from "./cli-zt3w1cn1.js";
74
78
  import {
75
79
  validateJsonSchema
76
- } from "./cli-1w0vj3gw.js";
80
+ } from "./cli-1e4b6bzh.js";
77
81
  import {
78
82
  authJsonToCredentialSelection,
79
83
  credentialsToAuthJson,
80
84
  loadAllCodexOAuthSlots
81
- } from "./cli-7jykv7ef.js";
85
+ } from "./cli-e6mpjhed.js";
82
86
  import {
83
87
  ensure,
84
88
  initOtel,
@@ -88,20 +92,22 @@ import {
88
92
  startSpan,
89
93
  withSpan,
90
94
  withSpanContext
91
- } from "./cli-tcc4wd5d.js";
95
+ } from "./cli-skxvvpap.js";
92
96
  import {
93
97
  MASKED_SECRET_VALUE,
94
98
  initTelemetry,
95
99
  init_api_drain,
96
100
  init_codex_auth_failure,
101
+ init_config_env_export,
97
102
  init_config_secrets,
98
103
  init_telemetry,
99
104
  init_telemetry_context,
100
105
  isApiDrainingResponse,
101
106
  isCodexAuthFailureReason,
107
+ isEnvExportRestrictedKey,
102
108
  mapTriggerSurface,
103
109
  telemetry
104
- } from "./cli-fmhj1ehj.js";
110
+ } from "./cli-ef1hg1wv.js";
105
111
  import {
106
112
  ProviderNameSchema,
107
113
  WorkerNudgeSchema,
@@ -109,7 +115,7 @@ import {
109
115
  isTerminalTaskStatus,
110
116
  parseWorkerModelTierOverrides,
111
117
  resolveTaskModelSelection
112
- } from "./cli-hsem16hb.js";
118
+ } from "./cli-cgtksawx.js";
113
119
  import {
114
120
  WORKSPACE_CLAUDE_MD_PATH,
115
121
  buildContextPreamble,
@@ -120,6 +126,7 @@ import {
120
126
  generateDefaultSoulMd,
121
127
  generateDefaultToolsMd,
122
128
  getBasePrompt,
129
+ getTaskContextPrompt,
123
130
  init_base_prompt,
124
131
  init_context_preamble,
125
132
  init_defaults,
@@ -132,20 +139,21 @@ import {
132
139
  taskAttachmentFetchCommand,
133
140
  writeIdentityBaselines,
134
141
  writeProfileFileFromDb
135
- } from "./cli-r4fqfpwf.js";
142
+ } from "./cli-s2sp957d.js";
136
143
  import {
137
144
  init_steering_enabled,
138
145
  isSteeringEnabled
139
146
  } from "./cli-7mm2r1kp.js";
140
- import {
141
- init_templates
142
- } from "./cli-mvzyxwg3.js";
143
147
  import {
144
148
  CLAUDE_CREDENTIALS_HINT,
145
149
  ModelWindowExhaustedError,
146
150
  init_credentials,
151
+ normalizeProviderKeyAliases,
147
152
  resolveCredentialPools
148
- } from "./cli-tadfgd0t.js";
153
+ } from "./cli-5hkm7whv.js";
154
+ import {
155
+ init_templates
156
+ } from "./cli-mvzyxwg3.js";
149
157
  import {
150
158
  configureHttpResolver,
151
159
  init_resolver,
@@ -162,7 +170,7 @@ import {
162
170
  } from "./cli-ywybs5as.js";
163
171
  import {
164
172
  deriveDefaultRoute,
165
- init_src,
173
+ init_src as init_src2,
166
174
  validateRoute
167
175
  } from "./cli-f9w1semm.js";
168
176
  import {
@@ -171,12 +179,10 @@ import {
171
179
  init_openrouter_base_url
172
180
  } from "./cli-a35hzdve.js";
173
181
  import {
174
- harnessModelMismatch,
175
182
  init_runtime_model_catalog,
176
- init_src as init_src2,
177
183
  refreshRuntimeModelCatalog,
178
184
  runtimeHarnessSections
179
- } from "./cli-014vns2y.js";
185
+ } from "./cli-stfs0k5s.js";
180
186
  import {
181
187
  getMcpBaseUrl,
182
188
  init_constants
@@ -187,9 +193,18 @@ import {
187
193
  } from "./cli-a1b9b32n.js";
188
194
  import {
189
195
  init_secret_scrubber,
196
+ registerEnvSecrets,
190
197
  registerSensitiveKeyName,
191
198
  scrubSecrets
192
- } from "./cli-d161g69q.js";
199
+ } from "./cli-p1x85d2t.js";
200
+ import {
201
+ harnessModelMismatch,
202
+ init_src,
203
+ openAICompatibleKeyVars,
204
+ openAICompatibleProviders,
205
+ providerBaseUrl,
206
+ providerKeyFromEnv
207
+ } from "./cli-e3g5mbkz.js";
193
208
  import {
194
209
  __require
195
210
  } from "./cli-bc05qbss.js";
@@ -226,47 +241,47 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
226
241
  async function createProviderAdapter(provider) {
227
242
  switch (provider) {
228
243
  case "claude": {
229
- const { ClaudeAdapter } = await import("./claude-adapter-yzzzh8jp.js");
244
+ const { ClaudeAdapter } = await import("./claude-adapter-9vmvpvgd.js");
230
245
  return new ClaudeAdapter;
231
246
  }
232
247
  case "pi": {
233
- const { PiMonoAdapter } = await import("./pi-mono-adapter-3c9g9snh.js");
248
+ const { PiMonoAdapter } = await import("./pi-mono-adapter-9n2ya240.js");
234
249
  return new PiMonoAdapter;
235
250
  }
236
251
  case "codex": {
237
- const { CodexAdapter } = await import("./codex-adapter-r3dn4fp5.js");
252
+ const { CodexAdapter } = await import("./codex-adapter-y81sssk0.js");
238
253
  return new CodexAdapter;
239
254
  }
240
255
  case "claude-managed": {
241
- const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-xgxhqrt2.js");
256
+ const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-k9qae05j.js");
242
257
  return new ClaudeManagedAdapter;
243
258
  }
244
259
  case "devin": {
245
- const { DevinAdapter } = await import("./devin-adapter-xgtj680j.js");
260
+ const { DevinAdapter } = await import("./devin-adapter-x1022qb1.js");
246
261
  return new DevinAdapter;
247
262
  }
248
263
  case "opencode": {
249
- const { OpencodeAdapter } = await import("./opencode-adapter-qbchbcfz.js");
264
+ const { OpencodeAdapter } = await import("./opencode-adapter-nm42wwj8.js");
250
265
  return new OpencodeAdapter;
251
266
  }
252
267
  case "dsh": {
253
- const { DshAdapter } = await import("./dsh-adapter-34etvb5m.js");
268
+ const { DshAdapter } = await import("./dsh-adapter-3epjm3af.js");
254
269
  return new DshAdapter;
255
270
  }
256
271
  case "amp": {
257
- const { AmpAdapter } = await import("./amp-adapter-gpxp3kc9.js");
272
+ const { AmpAdapter } = await import("./amp-adapter-ad8ft89x.js");
258
273
  return new AmpAdapter;
259
274
  }
260
275
  case "cursor": {
261
- const { CursorAdapter } = await import("./cursor-adapter-q8pgv5qa.js");
276
+ const { CursorAdapter } = await import("./cursor-adapter-cehv1qns.js");
262
277
  return new CursorAdapter;
263
278
  }
264
279
  case "grok": {
265
- const { GrokAdapter } = await import("./grok-adapter-e7mr287e.js");
280
+ const { GrokAdapter } = await import("./grok-adapter-0d4x7gkx.js");
266
281
  return new GrokAdapter;
267
282
  }
268
283
  case "acp": {
269
- const { ACPAdapter } = await import("./acp-adapter-ccm9xrep.js");
284
+ const { ACPAdapter } = await import("./acp-adapter-sj2g0m84.js");
270
285
  return new ACPAdapter;
271
286
  }
272
287
  default:
@@ -454,6 +469,7 @@ function computeBudgetBackoffMs(consecutiveRefusals, basePollMs) {
454
469
 
455
470
  // src/commands/runner.ts
456
471
  init_codex_auth_failure();
472
+ init_config_env_export();
457
473
  init_config_secrets();
458
474
  init_constants();
459
475
  init_credentials();
@@ -535,15 +551,17 @@ async function reportHarnessModelOutcome(opts) {
535
551
  }
536
552
 
537
553
  // src/utils/harness-provider.ts
554
+ init_src();
538
555
  init_types();
539
556
  var SUPPORTED_PROVIDERS = ProviderNameSchema.options;
540
557
  function hasEnvValue(key, resolvedEnv, fallbackEnv) {
541
558
  return !!(resolvedEnv[key]?.trim() || fallbackEnv[key]?.trim());
542
559
  }
560
+ var PI_DEFAULT_KEY_VARS = ["OPENROUTER_API_KEY", ...openAICompatibleKeyVars()];
543
561
  function credentialAwareDefault(resolvedEnv, fallbackEnv) {
544
- const hasOpenRouterKey = hasEnvValue("OPENROUTER_API_KEY", resolvedEnv, fallbackEnv);
562
+ const hasPiKey = PI_DEFAULT_KEY_VARS.some((key) => hasEnvValue(key, resolvedEnv, fallbackEnv));
545
563
  const hasClaudeCredential = hasEnvValue("ANTHROPIC_API_KEY", resolvedEnv, fallbackEnv) || hasEnvValue("CLAUDE_CODE_OAUTH_TOKEN", resolvedEnv, fallbackEnv);
546
- return hasOpenRouterKey && !hasClaudeCredential ? "pi" : "claude";
564
+ return hasPiKey && !hasClaudeCredential ? "pi" : "claude";
547
565
  }
548
566
  function resolveHarnessProvider(resolvedEnv, fallbackEnv = process.env) {
549
567
  const candidate = resolvedEnv.HARNESS_PROVIDER?.trim() || fallbackEnv.HARNESS_PROVIDER?.trim();
@@ -866,7 +884,7 @@ async function refreshSkillsIfChanged(ctx, lastHashRef, homeOverride) {
866
884
  }
867
885
 
868
886
  // src/utils/spawn-model-guard.ts
869
- init_src2();
887
+ init_src();
870
888
  init_runtime_model_catalog();
871
889
  function spawnHarnessMismatchReason(model, harness) {
872
890
  return `[model-harness-mismatch] Model "${model}" does not run on the ${harness} harness of this worker. The task pinned a model from another harness family. Re-create the task with modelTier or with a ${harness} model.`;
@@ -1110,6 +1128,7 @@ async function reportCredentialOutcomeThenFinish(input, finish) {
1110
1128
 
1111
1129
  // src/commands/provider-credentials.ts
1112
1130
  init_src();
1131
+ init_src2();
1113
1132
  init_credentials();
1114
1133
  init_openrouter_base_url();
1115
1134
  init_secret_scrubber();
@@ -1120,6 +1139,29 @@ function isBedrockMode(env) {
1120
1139
  function shouldRefreshBedrockStatus(opts) {
1121
1140
  return opts.harnessProvider === "pi" && isBedrockMode(opts.env) && opts.now - opts.lastRefreshAt > opts.intervalMs;
1122
1141
  }
1142
+ var REQUIRED_CRED_VARS_BY_PROVIDER = {
1143
+ claude: ["CLAUDE_CODE_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
1144
+ "claude-managed": [
1145
+ "ANTHROPIC_API_KEY",
1146
+ "MANAGED_AGENT_ID",
1147
+ "MANAGED_ENVIRONMENT_ID",
1148
+ "MCP_BASE_URL"
1149
+ ],
1150
+ codex: ["OPENAI_API_KEY", "CODEX_OAUTH"],
1151
+ devin: ["DEVIN_API_KEY", "DEVIN_ORG_ID"],
1152
+ opencode: [
1153
+ "OPENROUTER_API_KEY",
1154
+ "ANTHROPIC_API_KEY",
1155
+ "OPENAI_API_KEY",
1156
+ ...openAICompatibleKeyVars()
1157
+ ],
1158
+ pi: ["ANTHROPIC_API_KEY", "OPENROUTER_API_KEY", "OPENAI_API_KEY", ...openAICompatibleKeyVars()],
1159
+ acp: [],
1160
+ dsh: ["DEEPSEEK_API_KEY", "OPENROUTER_API_KEY"],
1161
+ amp: ["AMP_API_KEY"],
1162
+ cursor: ["CURSOR_API_KEY"],
1163
+ grok: ["XAI_API_KEY", "OPENROUTER_API_KEY"]
1164
+ };
1123
1165
  var CREDENTIAL_PROVIDER_CHECKERS = {
1124
1166
  dsh: (env) => checkDshCredentials(env),
1125
1167
  amp: (env) => checkAmpCredentials(env),
@@ -1131,7 +1173,7 @@ var CREDENTIAL_PROVIDER_CHECKERS = {
1131
1173
  devin: (env) => checkDevinCredentials(env),
1132
1174
  opencode: (env, opts) => checkOpencodeCredentials(env, opts),
1133
1175
  pi: async (env, opts) => {
1134
- const { checkPiMonoCredentials } = await import("./pi-mono-adapter-3c9g9snh.js");
1176
+ const { checkPiMonoCredentials } = await import("./pi-mono-adapter-9n2ya240.js");
1135
1177
  return checkPiMonoCredentials(env, opts);
1136
1178
  },
1137
1179
  acp: (env) => {
@@ -1246,6 +1288,19 @@ async function checkOpenRouter(apiKey) {
1246
1288
  latency_ms: r.latency_ms
1247
1289
  };
1248
1290
  }
1291
+ async function checkOpenAICompatibleProvider(provider, apiKey, baseUrl = provider.baseUrl) {
1292
+ const r = await timedFetch(`${baseUrl.replace(/\/+$/, "")}/models`, {
1293
+ method: "GET",
1294
+ headers: { Authorization: `Bearer ${apiKey}` }
1295
+ });
1296
+ if (r.ok)
1297
+ return { ok: true, latency_ms: r.latency_ms };
1298
+ return {
1299
+ ok: false,
1300
+ error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
1301
+ latency_ms: r.latency_ms
1302
+ };
1303
+ }
1249
1304
  function codexAuthFileExists(env) {
1250
1305
  return checkCodexCredentials(env).satisfiedBy === "file";
1251
1306
  }
@@ -1318,11 +1373,17 @@ async function validateProviderCredentials(provider, env = process.env, presence
1318
1373
  return checkAnthropicApiKey(env.ANTHROPIC_API_KEY);
1319
1374
  if (env.OPENAI_API_KEY)
1320
1375
  return checkOpenAiApiKey(env.OPENAI_API_KEY);
1376
+ for (const direct of openAICompatibleProviders()) {
1377
+ const key = providerKeyFromEnv(direct, env);
1378
+ if (key) {
1379
+ return checkOpenAICompatibleProvider(direct, key, providerBaseUrl(direct, env));
1380
+ }
1381
+ }
1321
1382
  if (status.ready)
1322
1383
  return presenceCheckOk();
1323
1384
  return {
1324
1385
  ok: false,
1325
- error: "No usable credential found (OPENROUTER_API_KEY, ANTHROPIC_API_KEY, or OPENAI_API_KEY).",
1386
+ error: `No usable credential found (OPENROUTER_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY, ${openAICompatibleProviders().map((p) => p.envVar).join(", ").replace(/, (?=[^,]*$)/, ", or ")}).`,
1326
1387
  latency_ms: Date.now() - startedAt
1327
1388
  };
1328
1389
  }
@@ -1381,7 +1442,7 @@ async function validateProviderCredentials(provider, env = process.env, presence
1381
1442
  latency_ms: Date.now() - startedAt
1382
1443
  };
1383
1444
  }
1384
- const { liveTestCursorKey } = await import("./cursor-adapter-q8pgv5qa.js");
1445
+ const { liveTestCursorKey } = await import("./cursor-adapter-cehv1qns.js");
1385
1446
  const result = await liveTestCursorKey(apiKey);
1386
1447
  return result.ok ? { ok: true, latency_ms: Date.now() - startedAt } : { ok: false, error: result.error, latency_ms: Date.now() - startedAt };
1387
1448
  }
@@ -1914,13 +1975,6 @@ function scheduleRunnerGc(reason) {
1914
1975
  timer.unref?.();
1915
1976
  return true;
1916
1977
  }
1917
- async function savePm2State(role) {
1918
- try {
1919
- console.log(`[${role}] Saving PM2 process list...`);
1920
- await Bun.$`pm2 save`.quiet();
1921
- console.log(`[${role}] PM2 state saved`);
1922
- } catch {}
1923
- }
1924
1978
  async function fetchRepoConfig(apiUrl, apiKey, vcsRepo, requireExactMatch = false) {
1925
1979
  try {
1926
1980
  const requested = vcsRepo.trim().replace(/\/+$/, "").replace(/\.git$/, "");
@@ -2255,6 +2309,16 @@ async function exitAfterTasksIfFinished(state, limit, shutdown) {
2255
2309
  }
2256
2310
  var deploymentMemoryRaters = process.env.MEMORY_RATERS;
2257
2311
  var rowOverriddenBootEnv = new Map;
2312
+ var lastWithheldEnvKeys = "";
2313
+ function logWithheldEnvKeys(keys) {
2314
+ const summary = [...keys].sort().join(", ");
2315
+ if (summary === lastWithheldEnvKeys)
2316
+ return;
2317
+ lastWithheldEnvKeys = summary;
2318
+ if (!summary)
2319
+ return;
2320
+ console.log(`[env-reload] Kept ${keys.length} config entries with exportToEnv=false out of the harness env: ${summary}`);
2321
+ }
2258
2322
  async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env, taskModel, sessionContext) {
2259
2323
  const env = { ...baseEnv };
2260
2324
  for (const key of Object.keys(env)) {
@@ -2284,7 +2348,17 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
2284
2348
  if (data.configs?.length) {
2285
2349
  const skippedSecretKeys = [];
2286
2350
  scriptsOnlyConfigValue = data.configs.find((config) => config.key === "SCRIPTS_ONLY_MCP")?.value;
2351
+ const withheldEnvKeys = [];
2287
2352
  for (const config of data.configs) {
2353
+ if (config.exportToEnv === false || isEnvExportRestrictedKey(config.key)) {
2354
+ if (config.isSecret)
2355
+ registerSensitiveKeyName(config.key);
2356
+ delete env[config.key];
2357
+ if (baseEnv === process.env)
2358
+ delete process.env[config.key];
2359
+ withheldEnvKeys.push(config.key);
2360
+ continue;
2361
+ }
2288
2362
  if (config.isSecret && config.value === MASKED_SECRET_VALUE) {
2289
2363
  skippedSecretKeys.push(config.key);
2290
2364
  continue;
@@ -2302,6 +2376,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
2302
2376
  if (skippedSecretKeys.length) {
2303
2377
  console.warn(scrubSecrets(`[env-reload] Skipped masked secrets: ${skippedSecretKeys.join(", ")}`));
2304
2378
  }
2379
+ logWithheldEnvKeys(withheldEnvKeys);
2305
2380
  console.log(`[env-reload] Loaded ${data.configs.length} config entries from API`);
2306
2381
  }
2307
2382
  const codexPoolSlots = countCodexOAuthPoolSlots(data.configs ?? []);
@@ -2311,6 +2386,8 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
2311
2386
  console.warn(`[env-reload] Could not fetch config, using current env: ${error}`);
2312
2387
  }
2313
2388
  }
2389
+ normalizeProviderKeyAliases(env);
2390
+ registerEnvSecrets(env);
2314
2391
  const resolvedProvider = sessionContext?.provider ?? resolveHarnessProvider(env, baseEnv);
2315
2392
  if (sessionContext?.provider)
2316
2393
  env.HARNESS_PROVIDER = sessionContext.provider;
@@ -2511,10 +2588,6 @@ var SWARM_TOOL_LABELS = {
2511
2588
  "create-channel": "\uD83D\uDCE2 Creating channel",
2512
2589
  "list-channels": "\uD83D\uDCE2 Listing channels",
2513
2590
  "delete-channel": "\uD83D\uDCE2 Deleting channel",
2514
- "register-service": "\uD83D\uDD0C Registering service",
2515
- "list-services": "\uD83D\uDD0C Listing services",
2516
- "unregister-service": "\uD83D\uDD0C Unregistering service",
2517
- "update-service-status": "\uD83D\uDD0C Updating service status",
2518
2591
  "script-search": "\uD83D\uDCDC Searching scripts",
2519
2592
  "script-run": "\uD83D\uDCDC Running script",
2520
2593
  "script-upsert": "\uD83D\uDCDC Saving script",
@@ -3174,7 +3247,6 @@ function setupShutdownHandlers(role, apiConfig, getRunnerState, onShutdown) {
3174
3247
  });
3175
3248
  await closeAgent(apiConfig, role);
3176
3249
  }
3177
- await savePm2State(role);
3178
3250
  process.exit(exitCode);
3179
3251
  };
3180
3252
  const beginShutdown = (signal, exitCode = 0) => shutdown(signal, exitCode).catch(async (error) => {
@@ -3254,11 +3326,13 @@ async function saveCostData(cost, apiUrl, apiKey, deadline) {
3254
3326
  console.warn(scrubSecrets(`[runner] Error saving cost data: ${error}`));
3255
3327
  }
3256
3328
  }
3257
- async function saveProviderSessionId(apiUrl, apiKey, taskId, claudeSessionId, provider, providerMeta, model, harnessVariant, harnessVariantMeta) {
3329
+ async function saveProviderSessionId(apiUrl, apiKey, taskId, claudeSessionId, provider, providerMeta, model, harnessVariant, harnessVariantMeta, effort) {
3258
3330
  const headers = { "Content-Type": "application/json" };
3259
3331
  if (apiKey)
3260
3332
  headers.Authorization = `Bearer ${apiKey}`;
3261
3333
  const body = { claudeSessionId };
3334
+ if (effort !== undefined && provider !== "devin")
3335
+ body.effort = effort;
3262
3336
  if (provider !== undefined)
3263
3337
  body.provider = provider;
3264
3338
  if (providerMeta !== undefined)
@@ -3545,6 +3619,33 @@ ${notes}` : "";
3545
3619
  });
3546
3620
  return result.skipped ? "" : result.text.trim();
3547
3621
  }
3622
+ function missingTaskDirWarning(taskDir, effectiveCwd) {
3623
+ return taskDir && !effectiveCwd ? `Note: The task requested working directory "${taskDir}" but it does not exist. Falling back to default directory.` : undefined;
3624
+ }
3625
+ async function buildTaskSessionPrompts(input) {
3626
+ const { basePromptArgs, additionalSystemPrompt, context } = input;
3627
+ const basePrompt = await getBasePrompt(basePromptArgs);
3628
+ const systemPrompt = additionalSystemPrompt ? `${basePrompt}
3629
+
3630
+ ${additionalSystemPrompt}` : basePrompt;
3631
+ const taskContext = [
3632
+ await getTaskContextPrompt({
3633
+ ...basePromptArgs,
3634
+ repoContext: context.repoContext,
3635
+ slackContext: context.slackContext
3636
+ }),
3637
+ await buildRequesterProfilePrompt(context.requestedBy),
3638
+ context.cwdWarning?.trim()
3639
+ ].filter((part) => Boolean(part)).join(`
3640
+
3641
+ `);
3642
+ return {
3643
+ systemPrompt,
3644
+ prompt: taskContext ? `${input.taskPrompt}
3645
+
3646
+ ${taskContext}` : input.taskPrompt
3647
+ };
3648
+ }
3548
3649
 
3549
3650
  class AgentRegistrationHttpError extends Error {
3550
3651
  status;
@@ -4077,6 +4178,7 @@ async function spawnProviderProcess(adapter, opts, logDir, isYolo) {
4077
4178
  if (spawnModel.warning)
4078
4179
  console.warn(spawnModel.warning);
4079
4180
  const model = spawnModel.model;
4181
+ const sessionEffort = effectiveReasoningEffort(adapter.name, model, reasoningEffortOverride);
4080
4182
  let oauthSelection;
4081
4183
  let oauthIsPoolBacked = false;
4082
4184
  if (adapter.name === "codex") {
@@ -4249,7 +4351,7 @@ async function spawnProviderProcess(adapter, opts, logDir, isYolo) {
4249
4351
  }).catch((err) => console.warn(`[runner] Failed to report ACP options: ${err}`));
4250
4352
  }
4251
4353
  if (realTaskId) {
4252
- saveProviderSessionId(opts.apiUrl, opts.apiKey, realTaskId, event.sessionId, event.provider, event.providerMeta, model, event.harnessVariant, event.harnessVariantMeta).catch((err) => console.warn(`[runner] Failed to save session ID: ${err}`));
4354
+ saveProviderSessionId(opts.apiUrl, opts.apiKey, realTaskId, event.sessionId, event.provider, event.providerMeta, model, event.harnessVariant, event.harnessVariantMeta, sessionEffort).catch((err) => console.warn(`[runner] Failed to save session ID: ${err}`));
4253
4355
  } else {
4254
4356
  saveProviderSessionIdOnActiveSession(opts.apiUrl, opts.apiKey, effectiveTaskId, event.sessionId).catch((err) => console.warn(`[runner] Failed to save provider session on active session: ${err}`));
4255
4357
  }
@@ -5077,11 +5179,9 @@ async function runAgent(config, opts) {
5077
5179
  let agentDescription;
5078
5180
  let agentSkillsSummary;
5079
5181
  let agentMcpServers;
5080
- let currentRepoContext;
5081
- let currentTaskSlackContext;
5082
- const buildSystemPrompt = async () => {
5182
+ const basePromptArgs = () => {
5083
5183
  const { traits } = adapter;
5084
- return getBasePrompt({
5184
+ return {
5085
5185
  role,
5086
5186
  agentId,
5087
5187
  capabilities,
@@ -5094,14 +5194,13 @@ async function runAgent(config, opts) {
5094
5194
  soulMd: agentSoulMd,
5095
5195
  identityMd: agentIdentityMd,
5096
5196
  claudeMd: agentClaudeMd,
5097
- repoContext: currentRepoContext,
5098
- slackContext: currentTaskSlackContext,
5099
5197
  ...traits.hasMcp && {
5100
5198
  skillsSummary: agentSkillsSummary,
5101
5199
  mcpServers: agentMcpServers
5102
5200
  }
5103
- });
5201
+ };
5104
5202
  };
5203
+ const buildSystemPrompt = async () => getBasePrompt(basePromptArgs());
5105
5204
  let basePrompt = await buildSystemPrompt();
5106
5205
  let additionalSystemPrompt;
5107
5206
  const systemPromptText = opts.systemPrompt || process.env.SYSTEM_PROMPT;
@@ -5715,7 +5814,8 @@ ${additionalSystemPrompt}` : basePrompt;
5715
5814
  console.warn(`[${role}] Failed to check resume task dir "${task.dir}", falling back to default cwd`);
5716
5815
  }
5717
5816
  }
5718
- if (!resumeCwd && task.vcsRepo && apiUrl) {
5817
+ let resumeRepoContext;
5818
+ if (task.vcsRepo && apiUrl) {
5719
5819
  const repoConfig = await fetchRepoConfig(apiUrl, apiKey, task.vcsRepo);
5720
5820
  const effectiveConfig = repoConfig ?? {
5721
5821
  url: task.vcsRepo,
@@ -5724,10 +5824,27 @@ ${additionalSystemPrompt}` : basePrompt;
5724
5824
  defaultBranch: "main"
5725
5825
  };
5726
5826
  const repoContext = await ensureRepoForTask(effectiveConfig, role, false);
5727
- if (repoContext?.clonePath) {
5827
+ resumeRepoContext = { ...repoContext, guidelines: repoConfig?.guidelines ?? null };
5828
+ if (!resumeCwd && repoContext?.clonePath) {
5728
5829
  resumeCwd = repoContext.clonePath;
5729
5830
  }
5730
5831
  }
5832
+ const resumeSlackChannelId = task.slackChannelId;
5833
+ const resumeSession = await buildTaskSessionPrompts({
5834
+ basePromptArgs: basePromptArgs(),
5835
+ additionalSystemPrompt,
5836
+ taskPrompt: resumePrompt,
5837
+ context: {
5838
+ repoContext: resumeRepoContext,
5839
+ slackContext: resumeSlackChannelId ? {
5840
+ channelId: resumeSlackChannelId,
5841
+ threadTs: task.slackThreadTs
5842
+ } : undefined,
5843
+ requestedBy: task.requestedBy,
5844
+ cwdWarning: missingTaskDirWarning(task.dir, resumeCwd)
5845
+ }
5846
+ });
5847
+ resumePrompt = resumeSession.prompt;
5731
5848
  const resumeRunnerSessionId = crypto.randomUUID();
5732
5849
  await registerActiveSession(apiConfig, {
5733
5850
  taskId: task.id,
@@ -5740,7 +5857,7 @@ ${additionalSystemPrompt}` : basePrompt;
5740
5857
  runningTask = await spawnProviderProcess(adapter, {
5741
5858
  prompt: resumePrompt,
5742
5859
  logFile,
5743
- systemPrompt: resolvedSystemPrompt,
5860
+ systemPrompt: resumeSession.systemPrompt,
5744
5861
  additionalArgs: opts.additionalArgs,
5745
5862
  resumeSessionId: undefined,
5746
5863
  role,
@@ -5750,10 +5867,8 @@ ${additionalSystemPrompt}` : basePrompt;
5750
5867
  runnerSessionId: resumeRunnerSessionId,
5751
5868
  iteration,
5752
5869
  taskId: task.id,
5753
- model: task.model,
5870
+ ...resumedTaskModelSelection(task),
5754
5871
  modelTier: task.modelTier,
5755
- resolvedModel: task.resolvedModel,
5756
- modelSource: task.modelSource,
5757
5872
  effort: task.effort,
5758
5873
  harnessProvider: state.harnessProvider,
5759
5874
  cwd: resumeCwd,
@@ -5980,7 +6095,8 @@ ${additionalSystemPrompt}` : basePrompt;
5980
6095
  const taskContextKey = trigger.task?.contextKey;
5981
6096
  const taskSlackChannelId = trigger.task?.slackChannelId;
5982
6097
  const taskSlackThreadTs = trigger.task?.slackThreadTs;
5983
- currentTaskSlackContext = taskSlackChannelId ? { channelId: taskSlackChannelId, threadTs: taskSlackThreadTs } : undefined;
6098
+ const taskSlackContext = taskSlackChannelId ? { channelId: taskSlackChannelId, threadTs: taskSlackThreadTs } : undefined;
6099
+ let currentRepoContext;
5984
6100
  const taskVcsRepo = trigger.task?.vcsRepo;
5985
6101
  if (taskVcsRepo && apiUrl) {
5986
6102
  const repoConfig = await fetchRepoConfig(apiUrl, apiKey, taskVcsRepo);
@@ -5996,8 +6112,6 @@ ${additionalSystemPrompt}` : basePrompt;
5996
6112
  ...repoResult,
5997
6113
  guidelines: repoConfig?.guidelines ?? null
5998
6114
  };
5999
- } else {
6000
- currentRepoContext = undefined;
6001
6115
  }
6002
6116
  const taskDir = trigger.task?.dir;
6003
6117
  let effectiveCwd;
@@ -6027,12 +6141,7 @@ ${additionalSystemPrompt}` : basePrompt;
6027
6141
  }
6028
6142
  triggerPrompt += " You can still access any path on the filesystem — this is just your starting directory.";
6029
6143
  }
6030
- let cwdWarning = "";
6031
- if (taskDir && !effectiveCwd) {
6032
- cwdWarning = `
6033
-
6034
- Note: The task requested working directory "${taskDir}" but it does not exist. Falling back to default directory.`;
6035
- }
6144
+ const cwdWarning = missingTaskDirWarning(taskDir, effectiveCwd);
6036
6145
  if (state.harnessProvider !== "claude-managed") {
6037
6146
  const skillResult = await refreshSkillsIfChanged({ apiUrl, swarmUrl, apiKey, agentId, role }, lastSkillHash);
6038
6147
  if (skillResult.changed && skillResult.summary) {
@@ -6059,12 +6168,19 @@ Note: The task requested working directory "${taskDir}" but it does not exist. F
6059
6168
  agentDescription = identityResult.fields.description;
6060
6169
  console.log(`[${role}] Identity changed — refreshing system prompt (${identityResult.changedFields.join(", ")})`);
6061
6170
  }
6062
- const taskBasePrompt = await buildSystemPrompt();
6063
- const requesterProfilePrompt = await buildRequesterProfilePrompt(trigger.requestedBy);
6064
- const taskPromptParts = [taskBasePrompt, requesterProfilePrompt, additionalSystemPrompt].filter((part) => Boolean(part)).join(`
6065
-
6066
- `);
6067
- const taskSystemPrompt = taskPromptParts + cwdWarning;
6171
+ const taskSession = await buildTaskSessionPrompts({
6172
+ basePromptArgs: basePromptArgs(),
6173
+ additionalSystemPrompt,
6174
+ taskPrompt: triggerPrompt,
6175
+ context: {
6176
+ repoContext: currentRepoContext,
6177
+ slackContext: taskSlackContext,
6178
+ requestedBy: trigger.requestedBy,
6179
+ cwdWarning
6180
+ }
6181
+ });
6182
+ const taskSystemPrompt = taskSession.systemPrompt;
6183
+ triggerPrompt = taskSession.prompt;
6068
6184
  const modelUnsupported = trigger.task?.modelUnsupported;
6069
6185
  if (trigger.taskId && modelUnsupported) {
6070
6186
  console.log(`[${role}] ${modelUnsupported}`);