@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
@@ -0,0 +1,776 @@
1
+ import {
2
+ __esm
3
+ } from "./cli-bc05qbss.js";
4
+
5
+ // packages/model-catalog/src/model-alias.ts
6
+ function buildClaudeAliasMap(models) {
7
+ const best = new Map;
8
+ for (const model of models) {
9
+ const id = model.id.toLowerCase();
10
+ if (!id.startsWith("claude"))
11
+ continue;
12
+ if (DATED_ID_RE.test(id) || id.endsWith("-latest"))
13
+ continue;
14
+ for (const token of id.split("-")) {
15
+ if (token === "claude" || !FAMILY_TOKEN_RE.test(token))
16
+ continue;
17
+ const current = best.get(token);
18
+ if (!current || isNewer(model, current))
19
+ best.set(token, model);
20
+ }
21
+ }
22
+ const out = {};
23
+ for (const [alias, model] of best)
24
+ out[alias] = model.id;
25
+ return out;
26
+ }
27
+ function isNewer(a, b) {
28
+ const ra = a.releaseDate ?? "";
29
+ const rb = b.releaseDate ?? "";
30
+ if (ra !== rb)
31
+ return ra > rb;
32
+ return a.id > b.id;
33
+ }
34
+ var DATED_ID_RE, FAMILY_TOKEN_RE;
35
+ var init_model_alias = __esm(() => {
36
+ DATED_ID_RE = /-\d{8}$/;
37
+ FAMILY_TOKEN_RE = /^[a-z]+$/;
38
+ });
39
+
40
+ // packages/model-catalog/src/resolve-alias.ts
41
+ function isAlias(value) {
42
+ return value.trim().toLowerCase().startsWith(LATEST_PREFIX);
43
+ }
44
+ function parseAlias(alias) {
45
+ let value = alias.trim().toLowerCase();
46
+ if (!value.startsWith(LATEST_PREFIX))
47
+ return null;
48
+ let channel = "stable";
49
+ const at = value.lastIndexOf("@");
50
+ if (at >= 0) {
51
+ const suffix = value.slice(at + 1);
52
+ if (suffix !== "stable" && suffix !== "any")
53
+ return null;
54
+ channel = suffix;
55
+ value = value.slice(0, at);
56
+ }
57
+ const rest = value.slice(LATEST_PREFIX.length);
58
+ const slash = rest.indexOf("/");
59
+ if (slash <= 0)
60
+ return null;
61
+ const section = rest.slice(0, slash);
62
+ const target = rest.slice(slash + 1);
63
+ if (target.length === 0)
64
+ return null;
65
+ if (section === "anthropic") {
66
+ return /^[a-z]+$/.test(target) ? { kind: "anthropic", family: target, channel } : null;
67
+ }
68
+ if (section === "openrouter" && !OPENROUTER_VENDOR_RE.test(target))
69
+ return null;
70
+ if (section === "openrouter" || section === "openai") {
71
+ return GLOB_TARGET_RE.test(target) ? { kind: section, glob: target, channel } : null;
72
+ }
73
+ return null;
74
+ }
75
+ function globToRegExp(glob) {
76
+ const escaped = glob.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
77
+ return new RegExp(`^${escaped}$`);
78
+ }
79
+ function isNewer2(a, b) {
80
+ if (a.releaseDate !== b.releaseDate)
81
+ return a.releaseDate > b.releaseDate;
82
+ return a.id > b.id;
83
+ }
84
+ function passesPolicy(id, releaseDate, channel, named, policy) {
85
+ if (policy.isSupported && !policy.isSupported(id))
86
+ return false;
87
+ if (channel === "any")
88
+ return true;
89
+ const lower = id.toLowerCase();
90
+ if (!named.includes("preview") && lower.includes("preview"))
91
+ return false;
92
+ if (!named.includes("experimental") && lower.includes("experimental"))
93
+ return false;
94
+ const soakDays = policy.soakDays ?? 0;
95
+ if (soakDays > 0 && releaseDate) {
96
+ const released = Date.parse(releaseDate);
97
+ const now = (policy.now ?? new Date).getTime();
98
+ if (!Number.isNaN(released) && now - released < soakDays * DAY_MS)
99
+ return false;
100
+ }
101
+ return true;
102
+ }
103
+ function resolveAlias(alias, catalog, policy = {}) {
104
+ const parsed = parseAlias(alias);
105
+ if (!parsed)
106
+ return null;
107
+ if (parsed.kind === "anthropic") {
108
+ const models = catalog.anthropic?.models ?? {};
109
+ const map = buildClaudeAliasMap(Object.entries(models).filter(([id, m]) => passesPolicy(id, m.release_date, parsed.channel, "", policy)).map(([id, m]) => ({ id, releaseDate: m.release_date ?? null })));
110
+ return map[parsed.family] ?? null;
111
+ }
112
+ const re = globToRegExp(parsed.glob);
113
+ const allowFree = parsed.glob.includes(":free");
114
+ const allowLatest = parsed.glob.includes("latest");
115
+ const allowPreview = parsed.glob.includes("preview");
116
+ let best = null;
117
+ for (const [id, m] of Object.entries(catalog[parsed.kind]?.models ?? {})) {
118
+ const lower = id.toLowerCase();
119
+ if (!re.test(lower))
120
+ continue;
121
+ if (DATED_ID_RE2.test(lower))
122
+ continue;
123
+ if (!allowLatest && lower.endsWith("-latest"))
124
+ continue;
125
+ if (!allowFree && lower.endsWith(":free"))
126
+ continue;
127
+ if (parsed.channel === "stable" && !allowPreview && lower.includes("preview"))
128
+ continue;
129
+ if (!passesPolicy(id, m.release_date, parsed.channel, parsed.glob, policy))
130
+ continue;
131
+ const candidate = { id, releaseDate: m.release_date ?? "" };
132
+ if (!best || isNewer2(candidate, best))
133
+ best = candidate;
134
+ }
135
+ if (!best)
136
+ return null;
137
+ return parsed.kind === "openrouter" ? `openrouter/${best.id}` : best.id;
138
+ }
139
+ var LATEST_PREFIX = "latest:", DATED_ID_RE2, DAY_MS, GLOB_TARGET_RE, OPENROUTER_VENDOR_RE;
140
+ var init_resolve_alias = __esm(() => {
141
+ init_model_alias();
142
+ DATED_ID_RE2 = /-\d{8}$/;
143
+ DAY_MS = 24 * 60 * 60 * 1000;
144
+ GLOB_TARGET_RE = /^[a-z0-9._:~*/-]+$/;
145
+ OPENROUTER_VENDOR_RE = /^[a-z0-9._~-]+\//;
146
+ });
147
+
148
+ // packages/model-catalog/src/harness-models.ts
149
+ function harnessCatalogSection(harness) {
150
+ return HARNESS_CATALOG_SECTION[harness] ?? null;
151
+ }
152
+ function isHarnessModelJudged(harness) {
153
+ return !!harness && (harnessCatalogSection(harness) !== null || harness === "grok");
154
+ }
155
+ function normalizeGrokModel(model) {
156
+ return model.trim().replace(XAI_PREFIX_RE, "");
157
+ }
158
+ function isHarnessCatalogModel(harness, id, model = {}) {
159
+ const lower = id.toLowerCase();
160
+ if (model.status === "deprecated")
161
+ return false;
162
+ const section = harnessCatalogSection(harness);
163
+ if (section === "anthropic") {
164
+ if (!lower.startsWith("claude-"))
165
+ return false;
166
+ if (DATED_ID_RE3.test(lower) || lower.endsWith("-latest"))
167
+ return false;
168
+ if (/^claude-\d/.test(lower))
169
+ return false;
170
+ return true;
171
+ }
172
+ if (section === "openai") {
173
+ const match = /^gpt-(\d+)/.exec(lower);
174
+ if (!match || Number(match[1]) < CODEX_MIN_GPT_MAJOR)
175
+ return false;
176
+ if (DATED_ID_RE3.test(lower) || ISO_DATED_ID_RE.test(lower))
177
+ return false;
178
+ if (model.reasoning === false)
179
+ return false;
180
+ for (const token of lower.split("-")) {
181
+ if (CODEX_EXCLUDED_TOKENS.has(token))
182
+ return false;
183
+ }
184
+ return true;
185
+ }
186
+ return false;
187
+ }
188
+ function compareNewestFirst(a, b) {
189
+ const ra = a.release_date ?? "9999";
190
+ const rb = b.release_date ?? "9999";
191
+ if (ra !== rb)
192
+ return ra > rb ? -1 : 1;
193
+ return a.id > b.id ? -1 : a.id < b.id ? 1 : 0;
194
+ }
195
+ function harnessModelIds(harness, models) {
196
+ return Object.entries(models ?? {}).filter(([id, m]) => isHarnessCatalogModel(harness, id, m)).map(([id, m]) => ({ id, release_date: m.release_date ?? null })).sort(compareNewestFirst).map((m) => m.id);
197
+ }
198
+ function modelFamilyKey(id) {
199
+ const slash = id.lastIndexOf("/");
200
+ const tail = (slash >= 0 ? id.slice(slash + 1) : id).toLowerCase();
201
+ return tail.split("-").filter((token) => token !== "" && !/^\d+(\.\d+)*$/.test(token)).join("-");
202
+ }
203
+ function buildClaudeShortnameMap(models) {
204
+ const best = new Map;
205
+ for (const [rawId, m] of Object.entries(models ?? {})) {
206
+ const id = rawId.toLowerCase();
207
+ if (!id.startsWith("claude"))
208
+ continue;
209
+ if (DATED_ID_RE3.test(id) || id.endsWith("-latest"))
210
+ continue;
211
+ if (m.status === "deprecated")
212
+ continue;
213
+ const candidate = { id: rawId, release_date: m.release_date ?? null };
214
+ for (const token of id.split("-")) {
215
+ if (token === "claude" || !/^[a-z]+$/.test(token))
216
+ continue;
217
+ const current = best.get(token);
218
+ if (!current || compareNewestFirst(candidate, current) < 0)
219
+ best.set(token, candidate);
220
+ }
221
+ }
222
+ const out = {};
223
+ for (const [alias, model] of best)
224
+ out[alias] = model.id;
225
+ return out;
226
+ }
227
+ function harnessModelMismatch(model, harness, sections, context = {}) {
228
+ if (harness === "grok")
229
+ return grokModelMismatch(model, sections, context);
230
+ const section = harness ? harnessCatalogSection(harness) : null;
231
+ if (!harness || !section)
232
+ return null;
233
+ const id = model.trim().replace(CONTEXT_SUFFIX_RE, "");
234
+ if (!id)
235
+ return null;
236
+ const own = sections[section]?.models ?? {};
237
+ const fail = () => harnessMismatchMessage(model.trim(), harness, section, own, context);
238
+ if (isAlias(id)) {
239
+ const parsed = parseAlias(id);
240
+ if (!parsed)
241
+ return null;
242
+ return parsed.kind === section ? null : fail();
243
+ }
244
+ let bare = id;
245
+ const slash = id.indexOf("/");
246
+ if (slash > 0) {
247
+ if (id.slice(0, slash) !== section)
248
+ return fail();
249
+ bare = id.slice(slash + 1);
250
+ }
251
+ if (section === "anthropic" && Object.hasOwn(buildClaudeShortnameMap(own), bare))
252
+ return null;
253
+ if (Object.hasOwn(own, bare)) {
254
+ const familyId = section === "anthropic" ? bare.replace(DATED_ID_RE3, "").replace(/-latest$/i, "") : bare;
255
+ return isHarnessCatalogModel(harness, familyId, own[bare]) ? null : fail();
256
+ }
257
+ for (const [name, other] of Object.entries(sections)) {
258
+ if (name === section)
259
+ continue;
260
+ if (other?.models && Object.hasOwn(other.models, bare))
261
+ return fail();
262
+ }
263
+ return null;
264
+ }
265
+ function grokModelMismatch(model, sections, context) {
266
+ const id = model.trim();
267
+ if (!id)
268
+ return null;
269
+ const fail = () => grokMismatchMessage(id, sections, context);
270
+ if (isAlias(id)) {
271
+ const parsed = parseAlias(id);
272
+ if (!parsed)
273
+ return null;
274
+ return parsed.kind === "openrouter" ? null : fail();
275
+ }
276
+ if (/^openrouter\/./i.test(id))
277
+ return null;
278
+ const bare = normalizeGrokModel(id);
279
+ if (!bare || bare.includes("/"))
280
+ return fail();
281
+ if (GROK_ID_RE.test(bare) || Object.hasOwn(sections.xai?.models ?? {}, bare))
282
+ return null;
283
+ for (const [name, other] of Object.entries(sections)) {
284
+ if (name === "xai")
285
+ continue;
286
+ if (other?.models && Object.hasOwn(other.models, bare))
287
+ return fail();
288
+ }
289
+ return null;
290
+ }
291
+ function grokMismatchMessage(model, sections, context) {
292
+ const agent = context.agentId ? ` of agent "${context.agentName ?? context.agentId}" (${context.agentId})` : "";
293
+ const pool = sections.xai?.models ? [sections.xai.models] : Object.values(sections).map((section) => section?.models ?? {});
294
+ const best = new Map;
295
+ for (const models of pool) {
296
+ for (const [id, m] of Object.entries(models)) {
297
+ if (m.status === "deprecated" || !GROK_ID_RE.test(id) || best.has(id))
298
+ continue;
299
+ best.set(id, { id, release_date: m.release_date ?? null });
300
+ }
301
+ }
302
+ const ids = [...best.values()].sort(compareNewestFirst).map((m) => m.id);
303
+ const extra = ids.length - MAX_EXAMPLE_IDS;
304
+ const examples = ids.length ? ` (for example: ${ids.slice(0, MAX_EXAMPLE_IDS).join(", ")}${extra > 0 ? ` and ${extra} more` : ""})` : "";
305
+ return `Model "${model}" does not run on the grok harness${agent}. The grok harness accepts xai catalog models${examples} and openrouter/<vendor>/<id>. Use modelTier (smol, regular, smart, ultra) for portable intent, or omit model and let the assignee resolve it.`;
306
+ }
307
+ function harnessMismatchMessage(model, harness, section, own, context) {
308
+ const agent = context.agentId ? ` of agent "${context.agentName ?? context.agentId}" (${context.agentId})` : "";
309
+ const ids = harnessModelIds(harness, own);
310
+ const extra = ids.length - MAX_EXAMPLE_IDS;
311
+ const examples = ids.slice(0, MAX_EXAMPLE_IDS).join(", ") + (extra > 0 ? ` and ${extra} more` : "");
312
+ return `Model "${model}" does not run on the ${harness} harness${agent}. The ${harness} harness accepts ${section} catalog models, for example: ${examples}. Use modelTier (smol, regular, smart, ultra) for portable intent, or omit model and let the assignee resolve it.`;
313
+ }
314
+ var HARNESS_CATALOG_SECTION, XAI_PREFIX_RE, GROK_ID_RE, DATED_ID_RE3, ISO_DATED_ID_RE, CODEX_EXCLUDED_TOKENS, CODEX_MIN_GPT_MAJOR = 5, CONTEXT_SUFFIX_RE, MAX_EXAMPLE_IDS = 8;
315
+ var init_harness_models = __esm(() => {
316
+ init_resolve_alias();
317
+ HARNESS_CATALOG_SECTION = {
318
+ claude: "anthropic",
319
+ "claude-managed": "anthropic",
320
+ codex: "openai"
321
+ };
322
+ XAI_PREFIX_RE = /^xai\//i;
323
+ GROK_ID_RE = /^grok-[^/]+$/i;
324
+ DATED_ID_RE3 = /-\d{8}$/;
325
+ ISO_DATED_ID_RE = /-\d{4}-\d{2}-\d{2}$/;
326
+ CODEX_EXCLUDED_TOKENS = new Set([
327
+ "chat",
328
+ "latest",
329
+ "pro",
330
+ "nano",
331
+ "spark",
332
+ "realtime",
333
+ "audio",
334
+ "image",
335
+ "search",
336
+ "transcribe",
337
+ "tts",
338
+ "deep",
339
+ "research",
340
+ "oss"
341
+ ]);
342
+ CONTEXT_SUFFIX_RE = /\[1m\]$/i;
343
+ });
344
+
345
+ // packages/model-catalog/src/openai-compatible-providers.ts
346
+ var DEVELOPER_ROLE, TEXT_IMAGE, TEXT_ONLY, EFFORTS, EFFORTS_WITH_NONE, OPENAI_COMPATIBLE_PROVIDERS;
347
+ var init_openai_compatible_providers = __esm(() => {
348
+ DEVELOPER_ROLE = { supportsDeveloperRole: true };
349
+ TEXT_IMAGE = ["text", "image"];
350
+ TEXT_ONLY = ["text"];
351
+ EFFORTS = ["low", "medium", "high", "max"];
352
+ EFFORTS_WITH_NONE = ["none", "low", "medium", "high", "max"];
353
+ OPENAI_COMPATIBLE_PROVIDERS = {
354
+ nan: {
355
+ id: "nan",
356
+ displayName: "NaN",
357
+ description: "Open-weight models such as GLM, Qwen and DeepSeek for the pi and opencode harnesses.",
358
+ baseUrl: "https://api.nan.builders/v1",
359
+ docsUrl: "https://nan.builders/docs/models",
360
+ envVar: "NAN_API_KEY",
361
+ aliasEnvVars: ["HELMCODE_API_NAN"],
362
+ catalog: "models.dev",
363
+ npm: "@ai-sdk/openai-compatible",
364
+ models: [
365
+ {
366
+ id: "deepseek-v4-flash",
367
+ name: "DeepSeek V4.1 Flash",
368
+ contextWindow: 1e6,
369
+ maxOutputTokens: 384000,
370
+ input: TEXT_IMAGE,
371
+ reasoning: true,
372
+ compat: DEVELOPER_ROLE
373
+ },
374
+ {
375
+ id: "glm5.3",
376
+ name: "GLM-5.3",
377
+ contextWindow: 1e6,
378
+ maxOutputTokens: 131072,
379
+ input: TEXT_ONLY,
380
+ reasoning: true,
381
+ compat: DEVELOPER_ROLE
382
+ },
383
+ {
384
+ id: "glm5.3-flash",
385
+ name: "GLM-5.3-Flash",
386
+ contextWindow: 1e6,
387
+ maxOutputTokens: 131072,
388
+ input: TEXT_IMAGE,
389
+ reasoning: true,
390
+ compat: DEVELOPER_ROLE
391
+ },
392
+ {
393
+ id: "qwen3.6",
394
+ name: "Qwen3.6 35B-A3B",
395
+ contextWindow: 262144,
396
+ maxOutputTokens: 65536,
397
+ input: TEXT_IMAGE,
398
+ reasoning: true,
399
+ compat: DEVELOPER_ROLE
400
+ },
401
+ {
402
+ id: "qwen3.8-flash",
403
+ name: "Qwen3.8 Flash",
404
+ contextWindow: 262144,
405
+ maxOutputTokens: 131072,
406
+ input: TEXT_IMAGE,
407
+ reasoning: true,
408
+ compat: DEVELOPER_ROLE
409
+ },
410
+ {
411
+ id: "gemma4",
412
+ name: "Gemma 4 26B A4B IT",
413
+ contextWindow: 262144,
414
+ maxOutputTokens: 32768,
415
+ input: TEXT_IMAGE,
416
+ reasoning: true,
417
+ compat: DEVELOPER_ROLE
418
+ },
419
+ {
420
+ id: "mimo-v2.6-flash",
421
+ name: "MiMo-V2.6-Flash",
422
+ contextWindow: 1048576,
423
+ maxOutputTokens: 131072,
424
+ input: TEXT_IMAGE,
425
+ reasoning: true,
426
+ compat: DEVELOPER_ROLE
427
+ }
428
+ ]
429
+ },
430
+ helmcode: {
431
+ id: "helmcode",
432
+ displayName: "Helmcode",
433
+ description: "Open-weight models through Helmcode for the pi and opencode harnesses.",
434
+ baseUrl: "https://api.helmcode.com/v1",
435
+ docsUrl: "https://helmcode.com/docs",
436
+ envVar: "HELMCODE_API_KEY",
437
+ aliasEnvVars: [],
438
+ keyNote: "Helmcode org plans include 5, 15 or 40 keys.",
439
+ catalog: "registry",
440
+ npm: "@ai-sdk/openai-compatible",
441
+ models: [
442
+ {
443
+ id: "deepseek-v4-flash",
444
+ name: "DeepSeek V4 Flash",
445
+ contextWindow: 1048576,
446
+ maxOutputTokens: 32768,
447
+ input: TEXT_IMAGE,
448
+ reasoning: true,
449
+ compat: DEVELOPER_ROLE,
450
+ family: "deepseek-flash",
451
+ reasoningEfforts: EFFORTS_WITH_NONE
452
+ },
453
+ {
454
+ id: "glm5.3",
455
+ name: "GLM-5.3",
456
+ contextWindow: 1048576,
457
+ maxOutputTokens: 32768,
458
+ input: TEXT_IMAGE,
459
+ reasoning: true,
460
+ compat: DEVELOPER_ROLE,
461
+ family: "glm",
462
+ reasoningEfforts: EFFORTS
463
+ },
464
+ {
465
+ id: "glm5.3-flash",
466
+ name: "GLM-5.3-Flash",
467
+ contextWindow: 1048576,
468
+ maxOutputTokens: 32768,
469
+ input: TEXT_IMAGE,
470
+ reasoning: true,
471
+ compat: DEVELOPER_ROLE,
472
+ family: "glm-flash",
473
+ reasoningEfforts: EFFORTS
474
+ },
475
+ {
476
+ id: "qwen3.6",
477
+ name: "Qwen3.6",
478
+ contextWindow: 262144,
479
+ maxOutputTokens: 32768,
480
+ input: TEXT_IMAGE,
481
+ reasoning: true,
482
+ compat: DEVELOPER_ROLE,
483
+ family: "qwen",
484
+ reasoningEfforts: EFFORTS_WITH_NONE
485
+ },
486
+ {
487
+ id: "gemma4",
488
+ name: "Gemma 4",
489
+ contextWindow: 262144,
490
+ maxOutputTokens: 32768,
491
+ input: TEXT_IMAGE,
492
+ reasoning: true,
493
+ compat: DEVELOPER_ROLE,
494
+ family: "gemma",
495
+ reasoningEfforts: EFFORTS_WITH_NONE
496
+ }
497
+ ]
498
+ },
499
+ vercel: {
500
+ id: "vercel",
501
+ displayName: "Vercel AI Gateway",
502
+ description: "Every AI Gateway chat model (GLM, Kimi, Claude, GPT, Gemini and more), including Token Pass.",
503
+ baseUrl: "https://ai-gateway.vercel.sh/v1",
504
+ baseUrlLocked: true,
505
+ docsUrl: "https://vercel.com/docs/ai-gateway/token-pass",
506
+ envVar: "AI_GATEWAY_API_KEY",
507
+ aliasEnvVars: [],
508
+ keyNote: "Use a Token Pass API key for Token Pass credit; regular keys use AI Gateway credit.",
509
+ catalog: "models.dev",
510
+ npm: "@ai-sdk/gateway",
511
+ models: [],
512
+ modelsFromCatalog: true
513
+ }
514
+ };
515
+ });
516
+
517
+ // packages/model-catalog/src/openai-compatible-registry.ts
518
+ function table() {
519
+ return OPENAI_COMPATIBLE_PROVIDERS;
520
+ }
521
+ function openAICompatibleProviders() {
522
+ return Object.values(table());
523
+ }
524
+ function openAICompatibleProviderIds() {
525
+ return Object.keys(table());
526
+ }
527
+ function providerKeyVars(provider) {
528
+ return [provider.envVar, ...provider.aliasEnvVars];
529
+ }
530
+ function openAICompatibleKeyVars() {
531
+ return openAICompatibleProviders().flatMap(providerKeyVars);
532
+ }
533
+ function baseUrlEnvVar(provider) {
534
+ return `${provider.id.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_BASE_URL`;
535
+ }
536
+ function openAICompatibleBaseUrlVars() {
537
+ return openAICompatibleProviders().filter((p) => !p.baseUrlLocked).map(baseUrlEnvVar);
538
+ }
539
+ function baseUrlOverride(provider, env) {
540
+ if (provider.baseUrlLocked)
541
+ return;
542
+ const value = env[baseUrlEnvVar(provider)]?.trim().replace(/\/+$/, "");
543
+ return value || undefined;
544
+ }
545
+ function ignoredBaseUrlVar(provider, env) {
546
+ const name = baseUrlEnvVar(provider);
547
+ return provider.baseUrlLocked && env[name]?.trim() ? name : undefined;
548
+ }
549
+ function providerBaseUrl(provider, env) {
550
+ return baseUrlOverride(provider, env) ?? provider.baseUrl;
551
+ }
552
+ function openAICompatibleProvider(id) {
553
+ return Object.hasOwn(table(), id) ? table()[id] : undefined;
554
+ }
555
+ function providerForModel(model) {
556
+ if (!model)
557
+ return;
558
+ const slash = model.indexOf("/");
559
+ if (slash <= 0)
560
+ return;
561
+ return openAICompatibleProvider(model.slice(0, slash));
562
+ }
563
+ function providerForKeyVar(name) {
564
+ return openAICompatibleProviders().find((p) => providerKeyVars(p).includes(name));
565
+ }
566
+ function providerKeyFromEnv(provider, env) {
567
+ for (const name of providerKeyVars(provider)) {
568
+ const value = env[name]?.trim();
569
+ if (value)
570
+ return value;
571
+ }
572
+ return;
573
+ }
574
+ function isAgentChatModel(row) {
575
+ return row.tool_call === true && (row.modalities?.output ?? []).includes("text");
576
+ }
577
+ function catalogChatModels(section) {
578
+ const models = [];
579
+ for (const [key, row] of Object.entries(section ?? {})) {
580
+ if (!isAgentChatModel(row))
581
+ continue;
582
+ const id = row.id ?? key;
583
+ const input = (row.modalities?.input ?? []).filter((m) => m === "text" || m === "image");
584
+ models.push({
585
+ id,
586
+ name: row.name ?? id,
587
+ contextWindow: row.limit?.context ?? 128000,
588
+ maxOutputTokens: row.limit?.output ?? 16384,
589
+ input: input.length > 0 ? input : ["text"],
590
+ reasoning: row.reasoning === true,
591
+ compat: { supportsDeveloperRole: false }
592
+ });
593
+ }
594
+ return models;
595
+ }
596
+ function providerHarnessModels(provider, section) {
597
+ if (!provider.modelsFromCatalog)
598
+ return [...provider.models];
599
+ const listed = new Set(provider.models.map((m) => m.id));
600
+ return [...provider.models, ...catalogChatModels(section).filter((m) => !listed.has(m.id))];
601
+ }
602
+ function withAgentChatRegistrySections(cache) {
603
+ const out = { ...cache };
604
+ for (const provider of openAICompatibleProviders()) {
605
+ const section = out[provider.id];
606
+ if (!section?.models)
607
+ continue;
608
+ out[provider.id] = {
609
+ ...section,
610
+ models: Object.fromEntries(Object.entries(section.models).filter(([, row]) => isAgentChatModel(row)))
611
+ };
612
+ }
613
+ return out;
614
+ }
615
+ function registryCatalogSections() {
616
+ const sections = {};
617
+ for (const provider of openAICompatibleProviders()) {
618
+ if (provider.catalog !== "registry")
619
+ continue;
620
+ const models = {};
621
+ for (const m of provider.models) {
622
+ models[m.id] = {
623
+ id: m.id,
624
+ name: m.name,
625
+ ...m.family ? { family: m.family } : {},
626
+ attachment: m.input.includes("image"),
627
+ reasoning: m.reasoning,
628
+ ...m.reasoningEfforts ? { reasoning_options: [{ type: "effort", values: [...m.reasoningEfforts] }] } : {},
629
+ tool_call: true,
630
+ modalities: { input: [...m.input], output: ["text"] },
631
+ limit: { context: m.contextWindow, output: m.maxOutputTokens },
632
+ cost: { input: 0, output: 0 }
633
+ };
634
+ }
635
+ sections[provider.id] = {
636
+ id: provider.id,
637
+ name: provider.displayName,
638
+ env: [provider.envVar],
639
+ npm: provider.npm,
640
+ api: provider.baseUrl,
641
+ doc: provider.docsUrl,
642
+ models
643
+ };
644
+ }
645
+ return sections;
646
+ }
647
+ function withRegistryCatalogSections(cache) {
648
+ return { ...withAgentChatRegistrySections(cache), ...registryCatalogSections() };
649
+ }
650
+ var init_openai_compatible_registry = __esm(() => {
651
+ init_openai_compatible_providers();
652
+ });
653
+
654
+ // packages/model-catalog/src/reasoning.ts
655
+ function dshCatalogRef(model) {
656
+ if (model.startsWith("openrouter/")) {
657
+ return { providerId: "openrouter", modelId: model.slice("openrouter/".length) };
658
+ }
659
+ return { providerId: "deepseek", modelId: model };
660
+ }
661
+ function grokCatalogRef(model) {
662
+ const id = normalizeGrokModel(model);
663
+ if (id.startsWith("openrouter/")) {
664
+ return { providerId: "openrouter", modelId: id.slice("openrouter/".length) };
665
+ }
666
+ return { providerId: "xai", modelId: id };
667
+ }
668
+ function cursorCatalogRef(model) {
669
+ const id = model.trim().toLowerCase();
670
+ if (/^(gpt-|o\d)/.test(id))
671
+ return { providerId: "openai", modelId: id };
672
+ if (id.startsWith("claude-"))
673
+ return { providerId: "anthropic", modelId: id };
674
+ if (id.startsWith("gemini-"))
675
+ return { providerId: "google", modelId: id };
676
+ if (id.startsWith("grok-"))
677
+ return { providerId: "xai", modelId: id };
678
+ return { providerId: "cursor", modelId: id };
679
+ }
680
+ function isDshDirectModel(catalogId) {
681
+ return !catalogId.includes("/");
682
+ }
683
+ function isReasoningHarness(harness) {
684
+ return REASONING_HARNESSES.includes(harness);
685
+ }
686
+ function levelsFromReasoningOptions(options) {
687
+ const effortEntry = options?.find((o) => o.type === "effort");
688
+ if (!effortEntry?.values?.length)
689
+ return [];
690
+ const mapped = new Set(effortEntry.values.map((v) => EFFORT_VALUE_MAP[v]).filter((v) => v !== undefined));
691
+ return REASONING_EFFORT_LEVELS.filter((level) => mapped.has(level));
692
+ }
693
+ function applyHarnessOverrides(harness, modelId, facts, levels) {
694
+ let result = levels;
695
+ if (harness === "claude") {
696
+ if (facts.reasoning_options?.some((o) => o.type === "budget_tokens") && !result.includes("off")) {
697
+ result = ["off", ...result];
698
+ }
699
+ }
700
+ if (harness === "dsh") {
701
+ const direct = isDshDirectModel(modelId);
702
+ const hasToggle = facts.reasoning_options?.some((o) => o.type === "toggle") ?? false;
703
+ if (direct && hasToggle && !result.includes("off"))
704
+ result = ["off", ...result];
705
+ if (!direct)
706
+ result = result.filter((l) => l !== "off");
707
+ } else if (harness !== "codex" && harness !== "cursor") {
708
+ result = result.filter((l) => l !== "max");
709
+ }
710
+ if (harness === "codex") {
711
+ const isCodexMax = /-codex-max$/.test(modelId);
712
+ const isCodexNonMax = /-codex$/.test(modelId) && !isCodexMax;
713
+ if (isCodexMax && !result.includes("xhigh"))
714
+ result = [...result, "xhigh"];
715
+ if (isCodexNonMax)
716
+ result = result.filter((l) => l !== "xhigh");
717
+ }
718
+ return REASONING_EFFORT_LEVELS.filter((level) => result.includes(level));
719
+ }
720
+ function reasoningLevelsFor(harness, modelId, facts) {
721
+ if (!isReasoningHarness(harness) || !facts || !facts.reasoning)
722
+ return [];
723
+ let levels = levelsFromReasoningOptions(facts.reasoning_options);
724
+ if (levels.length === 0)
725
+ levels = [...FALLBACK_LEVELS];
726
+ return applyHarnessOverrides(harness, modelId, facts, levels);
727
+ }
728
+ function claudeCatalogModelId(modelId, models) {
729
+ if (!modelId || models?.[modelId])
730
+ return modelId;
731
+ return buildClaudeShortnameMap(models)[modelId] ?? modelId;
732
+ }
733
+ var REASONING_EFFORT_LEVELS, REASONING_HARNESSES, FALLBACK_LEVELS, EFFORT_VALUE_MAP;
734
+ var init_reasoning = __esm(() => {
735
+ init_harness_models();
736
+ REASONING_EFFORT_LEVELS = ["off", "low", "medium", "high", "xhigh", "max"];
737
+ REASONING_HARNESSES = [
738
+ "claude",
739
+ "codex",
740
+ "pi",
741
+ "opencode",
742
+ "dsh",
743
+ "cursor",
744
+ "amp",
745
+ "grok"
746
+ ];
747
+ FALLBACK_LEVELS = ["low", "medium", "high"];
748
+ EFFORT_VALUE_MAP = {
749
+ none: "off",
750
+ low: "low",
751
+ medium: "medium",
752
+ high: "high",
753
+ xhigh: "xhigh",
754
+ max: "max"
755
+ };
756
+ });
757
+
758
+ // packages/model-catalog/src/display.ts
759
+ var init_display = () => {};
760
+
761
+ // packages/model-catalog/src/merge.ts
762
+ var init_merge = () => {};
763
+
764
+ // packages/model-catalog/src/index.ts
765
+ var init_src = __esm(() => {
766
+ init_display();
767
+ init_harness_models();
768
+ init_merge();
769
+ init_model_alias();
770
+ init_openai_compatible_providers();
771
+ init_openai_compatible_registry();
772
+ init_reasoning();
773
+ init_resolve_alias();
774
+ });
775
+
776
+ export { isAlias, parseAlias, resolveAlias, harnessCatalogSection, isHarnessModelJudged, normalizeGrokModel, harnessModelIds, modelFamilyKey, buildClaudeShortnameMap, harnessModelMismatch, openAICompatibleProviders, openAICompatibleProviderIds, providerKeyVars, openAICompatibleKeyVars, openAICompatibleBaseUrlVars, baseUrlOverride, ignoredBaseUrlVar, providerBaseUrl, openAICompatibleProvider, providerForModel, providerForKeyVar, providerKeyFromEnv, providerHarnessModels, withAgentChatRegistrySections, registryCatalogSections, withRegistryCatalogSections, dshCatalogRef, grokCatalogRef, cursorCatalogRef, reasoningLevelsFor, claudeCatalogModelId, init_src };