@desplega.ai/agent-swarm 2.5.4 → 2.6.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 (271) hide show
  1. package/README.md +2 -2
  2. package/dist/{acp-adapter-ek38cwsv.js → acp-adapter-dgfakfpw.js} +9 -9
  3. package/dist/{actions-92mepq03.js → actions-fbqma8aa.js} +21 -21
  4. package/dist/{amp-adapter-9gaxg015.js → amp-adapter-en0jy6hs.js} +4 -4
  5. package/dist/{app-ctn8gsgx.js → app-k8a5cgpp.js} +3 -3
  6. package/dist/{assistant-zyr5kz47.js → assistant-a16433gr.js} +29 -25
  7. package/dist/{boot-reembed-dwzfttdr.js → boot-reembed-6c1sjfnr.js} +1 -1
  8. package/dist/{boot-reembed-w75maga2.js → boot-reembed-f4nn561n.js} +1 -1
  9. package/dist/{boot-scrub-sweep-e9kq43kf.js → boot-scrub-sweep-d4w9gajf.js} +4 -4
  10. package/dist/{boot-seeds-x28v3fhb.js → boot-seeds-9bmkspyw.js} +4 -4
  11. package/dist/{claude-adapter-f0afqnne.js → claude-adapter-nys1kjxa.js} +9 -9
  12. package/dist/{claude-managed-adapter-x81a7r65.js → claude-managed-adapter-55207973.js} +2 -2
  13. package/dist/{claude-managed-setup-bqzwjd9x.js → claude-managed-setup-3cm35gey.js} +10 -3
  14. package/dist/{claude-sdk-session-7b7whkaq.js → claude-sdk-session-nw5yd8cp.js} +11 -11
  15. package/dist/{cli-c61mbdds.js → cli-03gg9pd1.js} +4 -4
  16. package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
  17. package/dist/cli-1tem6ns9.js +894 -0
  18. package/dist/{cli-jbnn4vxb.js → cli-24j1jeeb.js} +3 -3
  19. package/dist/{cli-pzatvw94.js → cli-2sjhpsns.js} +2 -2
  20. package/dist/{cli-dew6x255.js → cli-39aet655.js} +2 -2
  21. package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
  22. package/dist/{cli-x0f2v69c.js → cli-3aqd4jaa.js} +12 -7
  23. package/dist/{cli-gbfxp48k.js → cli-3fwqy71j.js} +15 -15
  24. package/dist/{cli-7p4jxgtt.js → cli-3gfvmzht.js} +6 -6
  25. package/dist/{cli-03vpq45j.js → cli-3ndmpxxv.js} +2 -2
  26. package/dist/{cli-asq5ydm4.js → cli-4hxrf0p4.js} +131 -50
  27. package/dist/{cli-mz9afxxf.js → cli-4rf0f5vg.js} +15 -3
  28. package/dist/{cli-k4tjsdx9.js → cli-5rj83bam.js} +272 -195
  29. package/dist/{cli-sbwsxvtd.js → cli-5sckpqcx.js} +2 -2
  30. package/dist/{cli-cz5nmdxt.js → cli-683y0b3a.js} +2 -2
  31. package/dist/{cli-ethgy7ha.js → cli-6y51ryva.js} +2 -2
  32. package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
  33. package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
  34. package/dist/{cli-gx4rm0qx.js → cli-7enjwya9.js} +1 -1
  35. package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
  36. package/dist/{cli-hh5we352.js → cli-9abdgn5t.js} +7 -7
  37. package/dist/{cli-ff1tm9n9.js → cli-a2rr0fmg.js} +1 -1
  38. package/dist/{cli-c952c7ac.js → cli-a34pr3w1.js} +2 -2
  39. package/dist/{cli-s682zgqz.js → cli-abkm71vr.js} +1 -1
  40. package/dist/{cli-mmhj8vd7.js → cli-ag2yrnt5.js} +11 -2
  41. package/dist/{cli-bvpgr9ny.js → cli-aj8djyqt.js} +5 -5
  42. package/dist/{cli-gwhjmh8g.js → cli-art7c1zh.js} +5 -5
  43. package/dist/{cli-5bnsc0e1.js → cli-az25fn5f.js} +4 -4
  44. package/dist/{cli-9s05422w.js → cli-bqztfyve.js} +1 -1
  45. package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
  46. package/dist/{cli-1r5ad7j5.js → cli-c2habvsf.js} +12 -12
  47. package/dist/{cli-64mh9mf3.js → cli-ca6banwz.js} +69 -17
  48. package/dist/{cli-25n3mv5d.js → cli-cz37jqss.js} +5 -5
  49. package/dist/{cli-6n8axjv1.js → cli-d2dpf95n.js} +2 -2
  50. package/dist/{cli-gn5af0x5.js → cli-emhjcj2y.js} +11 -11
  51. package/dist/{cli-6a1xg1p7.js → cli-esakngh8.js} +2 -2
  52. package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
  53. package/dist/{cli-4b2z6n0m.js → cli-ffvsj2qw.js} +17 -8
  54. package/dist/{cli-abs8ndtr.js → cli-g20jjwt4.js} +26 -26
  55. package/dist/{cli-jb30dzvk.js → cli-g8ka5j4j.js} +446 -164
  56. package/dist/{cli-19202kew.js → cli-gf95q3bm.js} +5 -5
  57. package/dist/{cli-eftzyh9y.js → cli-gnsb1zxa.js} +2 -2
  58. package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
  59. package/dist/{cli-e42vss7b.js → cli-hfeb68z4.js} +5 -5
  60. package/dist/{cli-g9vd9ece.js → cli-k21gx5ht.js} +14 -16
  61. package/dist/{cli-tsma7p8v.js → cli-kf4jree9.js} +2 -2
  62. package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
  63. package/dist/{cli-wx2nj19m.js → cli-m5a9m0ak.js} +6 -6
  64. package/dist/{cli-621ce7kw.js → cli-m70bajzr.js} +3 -3
  65. package/dist/{cli-9j129brq.js → cli-mtnj4fwa.js} +6 -6
  66. package/dist/{cli-xzfq4at3.js → cli-mvjz5an3.js} +15 -11
  67. package/dist/{cli-277c31dw.js → cli-n7asmce6.js} +225 -3
  68. package/dist/{cli-xtrz6bzs.js → cli-nn6vx2mq.js} +1 -1
  69. package/dist/{cli-2655k16q.js → cli-nq677csy.js} +1 -1
  70. package/dist/{cli-0shx9j93.js → cli-pfk92eqz.js} +2 -2
  71. package/dist/{cli-wghjkr0e.js → cli-sqma6vw1.js} +10 -7
  72. package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
  73. package/dist/{cli-qqzmjxkf.js → cli-v49fkghp.js} +11 -6
  74. package/dist/{cli-x77gen2p.js → cli-w2656ka1.js} +7 -7
  75. package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
  76. package/dist/{cli-m4ecdxvz.js → cli-zqne1qcj.js} +7 -7
  77. package/dist/cli.js +17 -17
  78. package/dist/{codex-adapter-wch12q99.js → codex-adapter-d95q4qsn.js} +7 -7
  79. package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
  80. package/dist/{codex-session-runner-41pfcr95.js → codex-session-runner-gdwd8h0c.js} +8 -8
  81. package/dist/{commands-9849dkj6.js → commands-jqmgk54b.js} +2 -2
  82. package/dist/{controller-ja0sd95p.js → controller-z3jq589f.js} +4 -4
  83. package/dist/{controllers-connect-xp05dj6x.js → controllers-connect-r2za39ef.js} +23 -23
  84. package/dist/{cursor-adapter-623qxqew.js → cursor-adapter-4mr4jgkw.js} +2 -2
  85. package/dist/{db-47vj40dy.js → db-ppv2tze7.js} +3 -3
  86. package/dist/{db-w759qmx0.js → db-w36wwb5g.js} +4 -2
  87. package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
  88. package/dist/{dispatcher-7b8e4z2j.js → dispatcher-pv5h77vf.js} +20 -20
  89. package/dist/{docker-s84hjs91.js → docker-fdzyewpz.js} +2 -2
  90. package/dist/{dsh-adapter-2ezw3xea.js → dsh-adapter-d4pdpb3r.js} +2 -2
  91. package/dist/{e2b-9gkdhm3c.js → e2b-222hsajc.js} +2 -2
  92. package/dist/{e2b-cjtf8k1z.js → e2b-fn3zacvt.js} +2 -2
  93. package/dist/{easter-egg-3d-e4qv8dxj.js → easter-egg-3d-4sp4dvmc.js} +1 -1
  94. package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
  95. package/dist/{execute-0xpz8950.js → execute-jev839y1.js} +1 -1
  96. package/dist/{external-channel-e2s028da.js → external-channel-y6nkzhnn.js} +2 -2
  97. package/dist/{grok-adapter-ys7gaqee.js → grok-adapter-t08b9ntm.js} +10 -10
  98. package/dist/handlers-eqsnmv95.js +41 -0
  99. package/dist/{heartbeat-w3mntghj.js → heartbeat-vn31xwdk.js} +23 -23
  100. package/dist/{hook-g7kvv6x9.js → hook-6d0zbvvt.js} +6 -6
  101. package/dist/{hook-3jjywnpb.js → hook-cpjs8q51.js} +8 -8
  102. package/dist/{http-tkp7d4kb.js → http-9c6medda.js} +856 -99
  103. package/dist/{index-xdaahthb.js → index-38t35h0n.js} +20 -20
  104. package/dist/{index-3n8m9ea2.js → index-g6k9tctj.js} +1 -1
  105. package/dist/{index-1ef1myq2.js → index-k0yt1tvq.js} +20 -20
  106. package/dist/{index-31ceyf42.js → index-pkma1yf8.js} +1 -1
  107. package/dist/{index-q7m26kvs.js → index-qhjf2htm.js} +13 -10
  108. package/dist/index-yqgbfgaj.js +43 -0
  109. package/dist/{keepalive-v4ta8wgg.js → keepalive-em0117bp.js} +4 -4
  110. package/dist/lead-23e7z59t.js +79 -0
  111. package/dist/{maintenance-84n1ex21.js → maintenance-kbme3qy9.js} +1 -1
  112. package/dist/{oauth-refresh-sweep-vjnnandw.js → oauth-refresh-sweep-xysj4yse.js} +3 -3
  113. package/dist/{onboard-sfmpe4np.js → onboard-p6q0vz97.js} +3 -3
  114. package/dist/{opencode-adapter-jmpst4q4.js → opencode-adapter-esv3k9yn.js} +7 -7
  115. package/dist/{otel-impl-v6cc0zve.js → otel-impl-54qhqh1z.js} +2 -2
  116. package/dist/{pi-mono-adapter-fk8fkcf6.js → pi-mono-adapter-mymbwhj0.js} +10 -10
  117. package/dist/{pricing-refresh-fsk1e1zc.js → pricing-refresh-yb75wv33.js} +3 -3
  118. package/dist/{rbac-roles-prmkdnkw.js → rbac-roles-1vp2mw4p.js} +2 -2
  119. package/dist/{rbac-roles-zxmxqa39.js → rbac-roles-dexhc9x8.js} +1 -1
  120. package/dist/render-v2-tjay5hhf.js +16 -0
  121. package/dist/{resume-frdtgfa0.js → resume-8ayf37g5.js} +9 -9
  122. package/dist/{runtime-bt5pkpm1.js → runtime-hqe5cqcd.js} +1 -1
  123. package/dist/{session-access-fpez4y5q.js → session-access-fdhp987s.js} +4 -4
  124. package/dist/session-source-backfill-qgtc86z1.js +110 -0
  125. package/dist/{setup-mq6m3m8q.js → setup-4rrmqcq3.js} +1 -1
  126. package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-52km00d6.js} +2 -2
  127. package/dist/{work-objects-kfahhjsq.js → work-objects-p28fgd70.js} +23 -23
  128. package/dist/worker-e3w7vye1.js +79 -0
  129. package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
  130. package/openapi.json +1274 -32
  131. package/package.json +1 -1
  132. package/src/assets/source-key.ts +95 -0
  133. package/src/be/db/api-keys.ts +80 -0
  134. package/src/be/db/session-labels.ts +28 -0
  135. package/src/be/db/session-moves.ts +5 -6
  136. package/src/be/db/session-tree.ts +153 -14
  137. package/src/be/db/tasks/read.ts +11 -0
  138. package/src/be/db/tasks/write.ts +6 -1
  139. package/src/be/db/workflow-runs.ts +183 -1
  140. package/src/be/db-retention.ts +61 -6
  141. package/src/be/db.ts +59 -114
  142. package/src/be/memory/providers/openai-embedding.ts +5 -1
  143. package/src/be/migrations/244_api_key_validation.sql +4 -0
  144. package/src/be/onboarding.ts +4 -0
  145. package/src/be/scripts/typecheck.ts +1 -1
  146. package/src/be/session-source-backfill.ts +163 -0
  147. package/src/be/swarm-config-guard.ts +1 -0
  148. package/src/comb/review-batch.ts +28 -1
  149. package/src/comb/templates.ts +7 -2
  150. package/src/commands/claude-managed-setup.ts +7 -1
  151. package/src/commands/credential-refresh.ts +76 -1
  152. package/src/commands/credential-wait.ts +2 -2
  153. package/src/commands/provider-credentials.ts +210 -170
  154. package/src/commands/runner.ts +25 -4
  155. package/src/extensions/apply-task-create.ts +8 -1
  156. package/src/extensions/contract-types.generated.ts +1 -1
  157. package/src/extensions/contract.ts +5 -0
  158. package/src/http/all-routes.ts +2 -0
  159. package/src/http/api-keys.ts +53 -0
  160. package/src/http/assets.ts +15 -0
  161. package/src/http/codex-oauth-accounts.ts +191 -0
  162. package/src/http/comb.ts +15 -2
  163. package/src/http/config.ts +1 -1
  164. package/src/http/core.ts +6 -0
  165. package/src/http/fleet-benchmark.ts +5 -2
  166. package/src/http/index.ts +11 -0
  167. package/src/http/integrations.ts +5 -1
  168. package/src/http/kv.ts +8 -3
  169. package/src/http/onboarding.ts +6 -1
  170. package/src/http/pool-keys.ts +354 -0
  171. package/src/http/sessions.ts +37 -12
  172. package/src/http/stats.ts +1 -0
  173. package/src/http/status.ts +26 -12
  174. package/src/http/tasks.ts +3 -0
  175. package/src/http/used-by.ts +7 -2
  176. package/src/http/workflows.ts +78 -9
  177. package/src/integrations/chat-sdk/inbound.ts +27 -0
  178. package/src/kv-reserved-namespaces.ts +19 -0
  179. package/src/providers/acp-targets.ts +1 -1
  180. package/src/providers/amp-adapter.ts +1 -1
  181. package/src/providers/claude-adapter.ts +5 -1
  182. package/src/providers/claude-managed-adapter.ts +16 -9
  183. package/src/providers/codex-adapter.ts +71 -11
  184. package/src/scheduler/scheduler.ts +3 -2
  185. package/src/scripts-runtime/swarm-sdk.ts +7 -1
  186. package/src/scripts-runtime/types/stdlib.d.ts +1 -1
  187. package/src/scripts-runtime/types/swarm-extension.d.ts +17 -8
  188. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -1
  189. package/src/slack/assistant.ts +7 -0
  190. package/src/slack/channel-labels.ts +74 -0
  191. package/src/slack/handlers.ts +8 -0
  192. package/src/slack/inbound-files.ts +5 -2
  193. package/src/slack/thread-buffer.ts +4 -0
  194. package/src/tasks/sibling-awareness.ts +12 -3
  195. package/src/telemetry-context.ts +5 -6
  196. package/src/telemetry-identity.ts +3 -3
  197. package/src/tests/api-keys-validation.test.ts +170 -0
  198. package/src/tests/claude-managed-adapter.test.ts +46 -0
  199. package/src/tests/claude-routes-e2e.test.ts +7 -2
  200. package/src/tests/codex-credential-pools.test.ts +120 -0
  201. package/src/tests/codex-gateway-route.test.ts +165 -0
  202. package/src/tests/codex-oauth-accounts.test.ts +357 -0
  203. package/src/tests/comb-review-batch.test.ts +63 -2
  204. package/src/tests/config-pool-keys.test.ts +533 -0
  205. package/src/tests/credential-check.test.ts +290 -2
  206. package/src/tests/credential-refresh.test.ts +172 -1
  207. package/src/tests/db-retention.test.ts +9 -3
  208. package/src/tests/db-task-read-contract.test.ts +1 -0
  209. package/src/tests/db-task-write-contract.test.ts +1 -3
  210. package/src/tests/docs-index-footprint.test.js +3 -3
  211. package/src/tests/extensions-pre-task.test.ts +53 -1
  212. package/src/tests/fixtures/extensions/record-task-create/hooks.ts +9 -0
  213. package/src/tests/fixtures/extensions/record-task-create/manifest.json +7 -0
  214. package/src/tests/fleet-benchmark.test.ts +8 -0
  215. package/src/tests/get-workflow-run-tool.test.ts +98 -0
  216. package/src/tests/integrations-http.test.ts +32 -2
  217. package/src/tests/internal-ai/complete-structured.test.ts +37 -1
  218. package/src/tests/internal-ai/credentials.test.ts +23 -0
  219. package/src/tests/kv-http.test.ts +32 -0
  220. package/src/tests/kv-tool.test.ts +25 -0
  221. package/src/tests/multi-runtime-registration.test.ts +12 -12
  222. package/src/tests/onboarding.test.ts +108 -1
  223. package/src/tests/openai-embedding-credentials.test.ts +35 -0
  224. package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
  225. package/src/tests/org-website.test.ts +36 -0
  226. package/src/tests/provider-key-probes.test.ts +181 -0
  227. package/src/tests/rbac-e2e-helpers.test.ts +88 -1
  228. package/src/tests/rbac-e2e-helpers.ts +36 -11
  229. package/src/tests/script-connections.test.ts +2 -0
  230. package/src/tests/script-runs-retention.test.ts +212 -0
  231. package/src/tests/sdk-allowlist.test.ts +39 -0
  232. package/src/tests/session-source-backfill.test.ts +429 -0
  233. package/src/tests/session-source-keys.test.ts +236 -0
  234. package/src/tests/session-source-labels.test.ts +419 -0
  235. package/src/tests/sessions-detail-batch.test.ts +2 -0
  236. package/src/tests/sessions-move.test.ts +131 -0
  237. package/src/tests/sessions-tree.test.ts +299 -2
  238. package/src/tests/slack-inbound-files.test.ts +103 -23
  239. package/src/tests/status.test.ts +101 -18
  240. package/src/tests/tasks-workflow-run-filter.test.ts +146 -0
  241. package/src/tests/test-net.ts +31 -0
  242. package/src/tests/transcription.test.ts +8 -0
  243. package/src/tests/used-by-route.test.ts +11 -0
  244. package/src/tests/workflow-cascade-cancel.test.ts +172 -0
  245. package/src/tests/workflow-http-v2.test.ts +131 -0
  246. package/src/tests/workflow-step-order.test.ts +92 -0
  247. package/src/tests/workflow-sub-workflow.test.ts +30 -0
  248. package/src/tools/get-tasks.ts +8 -0
  249. package/src/tools/kv/kv-read-auth.ts +4 -2
  250. package/src/tools/task-action.ts +1 -1
  251. package/src/tools/workflows/get-workflow-run.ts +14 -4
  252. package/src/types.ts +24 -0
  253. package/src/utils/company-profile.ts +51 -1
  254. package/src/utils/credentials.ts +5 -2
  255. package/src/utils/internal-ai/complete-structured.ts +5 -0
  256. package/src/utils/internal-ai/credentials.ts +4 -3
  257. package/src/utils/provider-key-probes.ts +328 -0
  258. package/src/utils/transcription.ts +4 -1
  259. package/src/workflows/executors/sub-workflow.ts +8 -1
  260. package/templates/ai-toolbox.manifest.json +2 -2
  261. package/templates/skills/researching/content.md +2 -0
  262. package/templates/skills/swarm-scripts/SKILL.md +1 -0
  263. package/templates/skills/swarm-scripts/content.md +1 -0
  264. package/dist/cli-7421jzsw.js +0 -84
  265. package/dist/cli-e45e4m6b.js +0 -413
  266. package/dist/cli-zw88zjba.js +0 -307
  267. package/dist/handlers-wy1dr6ja.js +0 -41
  268. package/dist/index-nmm79qgr.js +0 -43
  269. package/dist/lead-sawnyqxk.js +0 -79
  270. package/dist/render-v2-pjwxvnkw.js +0 -12
  271. package/dist/worker-v5e5rxj3.js +0 -79
@@ -1,413 +0,0 @@
1
- import {
2
- __esm
3
- } from "./cli-242037k3.js";
4
-
5
- // packages/model-routing/src/env.ts
6
- function envValue(env, key) {
7
- const value = env[key]?.trim();
8
- return value ? value : undefined;
9
- }
10
- function isEnvTruthy(env, key) {
11
- const value = envValue(env, key)?.toLowerCase();
12
- return value === "1" || value === "true" || value === "yes" || value === "on";
13
- }
14
- var init_env = () => {};
15
-
16
- // packages/model-routing/src/protocols.ts
17
- function defineRouteProvider(p) {
18
- return {
19
- ...p,
20
- isHarnessDefaultProtocol: p.isHarnessDefaultProtocol ?? ((harness, protocol) => HARNESS_DEFAULT_PROTOCOL[harness] === protocol)
21
- };
22
- }
23
- var HARNESS_DEFAULT_PROTOCOL;
24
- var init_protocols = __esm(() => {
25
- HARNESS_DEFAULT_PROTOCOL = {
26
- claude: "anthropic-messages",
27
- codex: "openai-responses",
28
- pi: "openai-chat",
29
- opencode: "openai-chat",
30
- dsh: "openai-chat"
31
- };
32
- });
33
-
34
- // packages/model-routing/src/providers/anthropic-models.ts
35
- function routeAuthHeaders(ctx) {
36
- const { auth } = ctx.route;
37
- if (auth.kind !== "bearer" && auth.kind !== "x-api-key" && auth.kind !== "header")
38
- return {};
39
- const secret = envValue(ctx.env, auth.secretKey);
40
- if (!secret)
41
- return {};
42
- if (auth.kind === "bearer")
43
- return { Authorization: `Bearer ${secret}` };
44
- if (auth.kind === "x-api-key")
45
- return { "x-api-key": secret };
46
- return { [auth.header]: secret };
47
- }
48
- async function readBody(res) {
49
- try {
50
- return await res.text();
51
- } catch {
52
- return "";
53
- }
54
- }
55
- function modelIds(body) {
56
- try {
57
- const parsed = JSON.parse(body);
58
- if (!Array.isArray(parsed.data))
59
- return;
60
- return parsed.data.flatMap((m) => typeof m.id === "string" ? [m.id] : []);
61
- } catch {
62
- return;
63
- }
64
- }
65
- async function checkAnthropicModels(ctx, opts = {}) {
66
- const res = await ctx.fetch("/v1/models", {
67
- method: "GET",
68
- headers: {
69
- "anthropic-version": ANTHROPIC_VERSION,
70
- ...opts.extraHeaders,
71
- ...routeAuthHeaders(ctx)
72
- },
73
- signal: ctx.signal
74
- });
75
- const body = await readBody(res);
76
- if (res.ok)
77
- return { status: "verified", models: modelIds(body) };
78
- if (opts.notFoundIsConfigured && (res.status === 404 || res.status === 405)) {
79
- return {
80
- status: "configured",
81
- reason: `HTTP ${res.status}: the endpoint does not list models, so the key was not checked`
82
- };
83
- }
84
- return { status: "failed", reason: `HTTP ${res.status}: ${body.slice(0, 200)}` };
85
- }
86
- var ANTHROPIC_VERSION = "2023-06-01";
87
- var init_anthropic_models = __esm(() => {
88
- init_env();
89
- });
90
-
91
- // packages/model-routing/src/providers/secret-env.ts
92
- function secretEnv(route) {
93
- const { auth } = route;
94
- return "secretKey" in auth ? [auth.secretKey] : [];
95
- }
96
- var init_secret_env = () => {};
97
-
98
- // packages/model-routing/src/providers/anthropic.ts
99
- var ANTHROPIC_API_BASE_URL = "https://api.anthropic.com", anthropicProvider;
100
- var init_anthropic = __esm(() => {
101
- init_protocols();
102
- init_anthropic_models();
103
- init_secret_env();
104
- anthropicProvider = defineRouteProvider({
105
- id: "anthropic",
106
- name: "Anthropic API",
107
- protocols: ["anthropic-messages"],
108
- defaultBaseUrl: ANTHROPIC_API_BASE_URL,
109
- requiredEnv: (route) => secretEnv(route),
110
- validate: (ctx) => checkAnthropicModels(ctx)
111
- });
112
- });
113
-
114
- // packages/model-routing/src/providers/anthropic-gateway.ts
115
- function customHeaders(route, env) {
116
- if (route.source !== "default")
117
- return {};
118
- const raw = envValue(env, "ANTHROPIC_CUSTOM_HEADERS");
119
- if (!raw)
120
- return {};
121
- const headers = {};
122
- for (const line of raw.split(`
123
- `)) {
124
- const colon = line.indexOf(":");
125
- if (colon <= 0)
126
- continue;
127
- const name = line.slice(0, colon).trim();
128
- const value = line.slice(colon + 1).trim();
129
- if (name && value)
130
- headers[name] = value;
131
- }
132
- return headers;
133
- }
134
- var anthropicGatewayProvider;
135
- var init_anthropic_gateway = __esm(() => {
136
- init_env();
137
- init_protocols();
138
- init_anthropic_models();
139
- init_secret_env();
140
- anthropicGatewayProvider = defineRouteProvider({
141
- id: "anthropic-gateway",
142
- name: "Anthropic-compatible gateway",
143
- protocols: ["anthropic-messages"],
144
- requiredEnv: (route) => secretEnv(route),
145
- validate: (ctx) => checkAnthropicModels(ctx, {
146
- extraHeaders: customHeaders(ctx.route, ctx.env),
147
- notFoundIsConfigured: true
148
- })
149
- });
150
- });
151
-
152
- // packages/model-routing/src/providers/bedrock.ts
153
- var bedrockProvider;
154
- var init_bedrock = __esm(() => {
155
- init_protocols();
156
- init_secret_env();
157
- bedrockProvider = defineRouteProvider({
158
- id: "bedrock",
159
- name: "Amazon Bedrock",
160
- protocols: ["bedrock"],
161
- requiredEnv: (route) => ["AWS_REGION", ...secretEnv(route)]
162
- });
163
- });
164
-
165
- // packages/model-routing/src/providers/claude-subscription.ts
166
- var claudeSubscriptionProvider;
167
- var init_claude_subscription = __esm(() => {
168
- init_protocols();
169
- init_anthropic();
170
- claudeSubscriptionProvider = defineRouteProvider({
171
- id: "claude-subscription",
172
- name: "Claude subscription",
173
- protocols: ["anthropic-messages"],
174
- harnesses: ["claude"],
175
- defaultBaseUrl: ANTHROPIC_API_BASE_URL,
176
- requiredEnv: () => ["CLAUDE_CODE_OAUTH_TOKEN"],
177
- validate: async () => ({ status: "verified" })
178
- });
179
- });
180
-
181
- // packages/model-routing/src/providers/foundry.ts
182
- function foundryBaseUrl(resource) {
183
- return `https://${resource}.services.ai.azure.com/anthropic`;
184
- }
185
- var foundryProvider;
186
- var init_foundry = __esm(() => {
187
- init_protocols();
188
- init_secret_env();
189
- foundryProvider = defineRouteProvider({
190
- id: "foundry",
191
- name: "Microsoft Foundry",
192
- protocols: ["foundry"],
193
- requiredEnv: (route) => [
194
- ...route.baseUrl ? [] : ["ANTHROPIC_FOUNDRY_RESOURCE"],
195
- ...secretEnv(route)
196
- ]
197
- });
198
- });
199
-
200
- // packages/model-routing/src/providers/vertex.ts
201
- var vertexProvider;
202
- var init_vertex = __esm(() => {
203
- init_protocols();
204
- vertexProvider = defineRouteProvider({
205
- id: "vertex",
206
- name: "Google Vertex AI",
207
- protocols: ["vertex"],
208
- requiredEnv: () => ["CLOUD_ML_REGION", "ANTHROPIC_VERTEX_PROJECT_ID"]
209
- });
210
- });
211
-
212
- // packages/model-routing/src/providers/index.ts
213
- function getRouteProvider(id) {
214
- return ROUTE_PROVIDERS.find((p) => p.id === id);
215
- }
216
- var ROUTE_PROVIDERS;
217
- var init_providers = __esm(() => {
218
- init_anthropic();
219
- init_anthropic_gateway();
220
- init_bedrock();
221
- init_claude_subscription();
222
- init_foundry();
223
- init_vertex();
224
- ROUTE_PROVIDERS = [
225
- anthropicProvider,
226
- claudeSubscriptionProvider,
227
- anthropicGatewayProvider,
228
- foundryProvider,
229
- bedrockProvider,
230
- vertexProvider
231
- ];
232
- });
233
-
234
- // packages/model-routing/src/scoped-fetch.ts
235
- function isAbsolute(path) {
236
- return /^[a-z][a-z0-9+.-]*:/i.test(path) || path.startsWith("//");
237
- }
238
- function createScopedFetch(baseUrl, impl) {
239
- let base;
240
- try {
241
- base = new URL(baseUrl);
242
- } catch {
243
- throw new ScopedFetchError(`Invalid route base URL: ${baseUrl}`);
244
- }
245
- const prefix = base.href.replace(/\/+$/, "");
246
- return (path, init) => {
247
- let target;
248
- try {
249
- target = isAbsolute(path) ? new URL(path, base) : new URL(`${prefix}/${path.replace(/^\/+/, "")}`);
250
- } catch {
251
- return Promise.reject(new ScopedFetchError(`Invalid route path: ${path}`));
252
- }
253
- if (target.origin !== base.origin) {
254
- return Promise.reject(new ScopedFetchError(`Refusing request to ${target.origin}: route is scoped to ${base.origin}`));
255
- }
256
- const doFetch = impl ?? globalThis.fetch;
257
- return doFetch(target.href, { ...init, redirect: "manual" });
258
- };
259
- }
260
- var ScopedFetchError;
261
- var init_scoped_fetch = __esm(() => {
262
- ScopedFetchError = class ScopedFetchError extends Error {
263
- name = "ScopedFetchError";
264
- };
265
- });
266
-
267
- // packages/model-routing/src/credential-status.ts
268
- function describeRoute(route, providerName) {
269
- return route.baseUrl ? `${providerName} at ${route.baseUrl}` : providerName;
270
- }
271
- function routeCredentialStatus(route, env) {
272
- const provider = getRouteProvider(route.provider);
273
- if (!provider) {
274
- return { ready: false, missing: [], hint: `Unknown route provider "${route.provider}".` };
275
- }
276
- const missing = provider.requiredEnv(route).filter((key) => !envValue(env, key));
277
- const where = describeRoute(route, provider.name);
278
- return missing.length === 0 ? { ready: true, missing: [], hint: `Routing through ${where}.` } : { ready: false, missing, hint: `${where} needs ${missing.join(", ")}.` };
279
- }
280
- async function validateRoute(route, env, opts = {}) {
281
- const provider = getRouteProvider(route.provider);
282
- const status = routeCredentialStatus(route, env);
283
- if (!provider || !status.ready) {
284
- return { status: "failed", reason: status.hint, missing: status.missing };
285
- }
286
- if (!provider.validate) {
287
- return {
288
- status: "configured",
289
- reason: `${provider.name} has no free credential check; the first task proves the route.`
290
- };
291
- }
292
- const baseUrl = route.baseUrl ?? provider.defaultBaseUrl;
293
- const controller = new AbortController;
294
- const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? VALIDATE_TIMEOUT_MS);
295
- try {
296
- const scopedFetch = baseUrl ? createScopedFetch(baseUrl) : () => Promise.reject(new ScopedFetchError(`Route "${route.name}" has no base URL.`));
297
- return await provider.validate({ route, env, fetch: scopedFetch, signal: controller.signal });
298
- } catch (err) {
299
- return { status: "failed", reason: err instanceof Error ? err.message : String(err) };
300
- } finally {
301
- clearTimeout(timer);
302
- }
303
- }
304
- var VALIDATE_TIMEOUT_MS = 5000;
305
- var init_credential_status = __esm(() => {
306
- init_env();
307
- init_protocols();
308
- init_providers();
309
- init_scoped_fetch();
310
- });
311
-
312
- // packages/model-routing/src/default-route.ts
313
- function isFirstPartyAnthropicUrl(url) {
314
- try {
315
- return new URL(url).origin === ANTHROPIC_API_BASE_URL;
316
- } catch {
317
- return false;
318
- }
319
- }
320
- function defaultRoute(harness, route) {
321
- return { id: `default:${harness}`, name: `default:${harness}`, source: "default", ...route };
322
- }
323
- function deriveClaudeDefaultRoute(env) {
324
- if (isEnvTruthy(env, "CLAUDE_CODE_USE_FOUNDRY")) {
325
- const resource = envValue(env, "ANTHROPIC_FOUNDRY_RESOURCE");
326
- const auth = envValue(env, "ANTHROPIC_FOUNDRY_AUTH_TOKEN") ? { kind: "bearer", secretKey: "ANTHROPIC_FOUNDRY_AUTH_TOKEN" } : envValue(env, "ANTHROPIC_FOUNDRY_API_KEY") ? { kind: "x-api-key", secretKey: "ANTHROPIC_FOUNDRY_API_KEY" } : { kind: "cloud-chain" };
327
- return defaultRoute("claude", {
328
- provider: "foundry",
329
- protocol: "foundry",
330
- baseUrl: envValue(env, "ANTHROPIC_FOUNDRY_BASE_URL") ?? (resource ? foundryBaseUrl(resource) : undefined),
331
- auth,
332
- cloud: { resource }
333
- });
334
- }
335
- if (isEnvTruthy(env, "CLAUDE_CODE_USE_BEDROCK")) {
336
- const region = envValue(env, "AWS_REGION");
337
- return defaultRoute("claude", {
338
- provider: "bedrock",
339
- protocol: "bedrock",
340
- baseUrl: envValue(env, "ANTHROPIC_BEDROCK_BASE_URL") ?? (region ? `https://bedrock-runtime.${region}.amazonaws.com` : undefined),
341
- auth: envValue(env, "AWS_BEARER_TOKEN_BEDROCK") ? { kind: "bearer", secretKey: "AWS_BEARER_TOKEN_BEDROCK" } : { kind: "cloud-chain" },
342
- cloud: { region }
343
- });
344
- }
345
- if (isEnvTruthy(env, "CLAUDE_CODE_USE_VERTEX")) {
346
- const region = envValue(env, "CLOUD_ML_REGION");
347
- const vertexHost = region === "global" ? "aiplatform.googleapis.com" : `${region}-aiplatform.googleapis.com`;
348
- return defaultRoute("claude", {
349
- provider: "vertex",
350
- protocol: "vertex",
351
- baseUrl: envValue(env, "ANTHROPIC_VERTEX_BASE_URL") ?? (region ? `https://${vertexHost}` : undefined),
352
- auth: { kind: "cloud-chain" },
353
- cloud: { region, project: envValue(env, "ANTHROPIC_VERTEX_PROJECT_ID") }
354
- });
355
- }
356
- const oauthToken = envValue(env, "CLAUDE_CODE_OAUTH_TOKEN");
357
- const baseUrl = envValue(env, "ANTHROPIC_BASE_URL");
358
- if (baseUrl && !isFirstPartyAnthropicUrl(baseUrl)) {
359
- const authToken = envValue(env, "ANTHROPIC_AUTH_TOKEN");
360
- const apiKey = envValue(env, "ANTHROPIC_API_KEY");
361
- return defaultRoute("claude", {
362
- provider: "anthropic-gateway",
363
- protocol: "anthropic-messages",
364
- baseUrl,
365
- auth: authToken || !apiKey ? { kind: "bearer", secretKey: "ANTHROPIC_AUTH_TOKEN" } : { kind: "x-api-key", secretKey: "ANTHROPIC_API_KEY" }
366
- });
367
- }
368
- if (oauthToken) {
369
- return defaultRoute("claude", {
370
- provider: "claude-subscription",
371
- protocol: "anthropic-messages",
372
- baseUrl: baseUrl ?? ANTHROPIC_API_BASE_URL,
373
- auth: { kind: "subscription", plan: "claude" }
374
- });
375
- }
376
- if (envValue(env, "ANTHROPIC_API_KEY")) {
377
- return defaultRoute("claude", {
378
- provider: "anthropic",
379
- protocol: "anthropic-messages",
380
- baseUrl: baseUrl ?? ANTHROPIC_API_BASE_URL,
381
- auth: { kind: "x-api-key", secretKey: "ANTHROPIC_API_KEY" }
382
- });
383
- }
384
- return null;
385
- }
386
- function deriveDefaultRoute(harness, env) {
387
- if (harness === "claude")
388
- return deriveClaudeDefaultRoute(env);
389
- return null;
390
- }
391
- function routeUnsetEnv(harness, route) {
392
- if (harness === "claude" && route.provider !== "claude-subscription") {
393
- return ["CLAUDE_CODE_OAUTH_TOKEN"];
394
- }
395
- return [];
396
- }
397
- var init_default_route = __esm(() => {
398
- init_env();
399
- init_anthropic();
400
- init_foundry();
401
- });
402
-
403
- // packages/model-routing/src/index.ts
404
- var init_src = __esm(() => {
405
- init_credential_status();
406
- init_default_route();
407
- init_protocols();
408
- init_anthropic();
409
- init_providers();
410
- init_scoped_fetch();
411
- });
412
-
413
- export { routeCredentialStatus, validateRoute, isFirstPartyAnthropicUrl, deriveDefaultRoute, routeUnsetEnv, init_src };