@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
@@ -147258,7 +147258,7 @@
147258
147258
  "cost": {
147259
147259
  "input": 2,
147260
147260
  "output": 10,
147261
- "cache_read": 0.2,
147261
+ "cache_read": 0.1,
147262
147262
  "cache_write": 2.5
147263
147263
  },
147264
147264
  "limit": {
@@ -314158,23 +314158,59 @@
314158
314158
  "name": "NaN",
314159
314159
  "doc": "https://nan.builders/docs/models",
314160
314160
  "models": {
314161
- "qwen3.6": {
314162
- "id": "qwen3.6",
314163
- "name": "Qwen3.6 35B-A3B",
314164
- "description": "Open multimodal Qwen MoE for local agents that need vision, audio, and code",
314161
+ "qwen-image-2.1": {
314162
+ "id": "qwen-image-2.1",
314163
+ "name": "Qwen-Image-2.1",
314164
+ "description": "Unified text-to-image generation and image editing model with native RGBA transparency and reference-image editing",
314165
314165
  "family": "qwen",
314166
+ "attachment": false,
314167
+ "reasoning": false,
314168
+ "tool_call": false,
314169
+ "temperature": true,
314170
+ "release_date": "2026-09-14",
314171
+ "last_updated": "2026-09-21",
314172
+ "modalities": {
314173
+ "input": [
314174
+ "text"
314175
+ ],
314176
+ "output": [
314177
+ "image"
314178
+ ]
314179
+ },
314180
+ "open_weights": true,
314181
+ "limit": {
314182
+ "context": 8192,
314183
+ "output": 0
314184
+ },
314185
+ "cost": {
314186
+ "input": 0,
314187
+ "output": 0
314188
+ },
314189
+ "canonical_model_id": "alibaba/qwen-image-2.1"
314190
+ },
314191
+ "glm5.3-flash": {
314192
+ "id": "glm5.3-flash",
314193
+ "name": "GLM-5.3-Flash",
314194
+ "description": "Native multimodal GLM model for efficient coding and long-horizon agent tasks",
314195
+ "family": "glm-flash",
314166
314196
  "attachment": true,
314167
314197
  "reasoning": true,
314168
314198
  "reasoning_options": [
314169
314199
  {
314170
- "type": "toggle"
314200
+ "type": "effort",
314201
+ "values": [
314202
+ "low",
314203
+ "medium",
314204
+ "high",
314205
+ "max"
314206
+ ]
314171
314207
  }
314172
314208
  ],
314173
314209
  "tool_call": true,
314174
314210
  "structured_output": true,
314175
314211
  "temperature": true,
314176
- "release_date": "2026-04-17",
314177
- "last_updated": "2026-04-17",
314212
+ "release_date": "2026-08-26",
314213
+ "last_updated": "2026-08-26",
314178
314214
  "modalities": {
314179
314215
  "input": [
314180
314216
  "text",
@@ -314186,31 +314222,43 @@
314186
314222
  },
314187
314223
  "open_weights": true,
314188
314224
  "limit": {
314189
- "context": 262144,
314190
- "output": 65536
314225
+ "context": 1000000,
314226
+ "output": 131072
314191
314227
  },
314192
314228
  "cost": {
314193
314229
  "input": 0,
314194
314230
  "output": 0
314195
- }
314231
+ },
314232
+ "canonical_model_id": "zhipuai/glm-5.3-flash"
314196
314233
  },
314197
- "deepseek-v4-flash": {
314198
- "id": "deepseek-v4-flash",
314199
- "name": "DeepSeek V4 Flash",
314200
- "description": "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work",
314201
- "family": "deepseek-flash",
314202
- "attachment": false,
314234
+ "gemma4": {
314235
+ "id": "gemma4",
314236
+ "name": "Gemma 4 26B A4B IT",
314237
+ "description": "Open Gemma instruction model for efficient chat and self-hosted deployments",
314238
+ "family": "gemma",
314239
+ "attachment": true,
314203
314240
  "reasoning": true,
314204
- "reasoning_options": [],
314241
+ "reasoning_options": [
314242
+ {
314243
+ "type": "effort",
314244
+ "values": [
314245
+ "none",
314246
+ "low",
314247
+ "medium",
314248
+ "high",
314249
+ "max"
314250
+ ]
314251
+ }
314252
+ ],
314205
314253
  "tool_call": true,
314206
314254
  "structured_output": true,
314207
314255
  "temperature": true,
314208
- "knowledge": "2025-05",
314209
- "release_date": "2026-04-24",
314210
- "last_updated": "2026-04-24",
314256
+ "release_date": "2026-04-02",
314257
+ "last_updated": "2026-04-02",
314211
314258
  "modalities": {
314212
314259
  "input": [
314213
- "text"
314260
+ "text",
314261
+ "image"
314214
314262
  ],
314215
314263
  "output": [
314216
314264
  "text"
@@ -314218,30 +314266,43 @@
314218
314266
  },
314219
314267
  "open_weights": true,
314220
314268
  "limit": {
314221
- "context": 1000000,
314222
- "output": 384000
314269
+ "context": 262144,
314270
+ "output": 32768
314223
314271
  },
314224
314272
  "cost": {
314225
314273
  "input": 0,
314226
314274
  "output": 0
314227
- }
314275
+ },
314276
+ "canonical_model_id": "google/gemma-4-26b-a4b-it"
314228
314277
  },
314229
- "glm5.2": {
314230
- "id": "glm5.2",
314231
- "name": "GLM-5.2",
314232
- "description": "Open flagship GLM for long-horizon coding agents, served at 500K context on the NaN premium tier",
314233
- "family": "glm",
314234
- "attachment": false,
314278
+ "qwen3.6": {
314279
+ "id": "qwen3.6",
314280
+ "name": "Qwen3.6 35B-A3B",
314281
+ "description": "Open multimodal Qwen MoE for local agents that need vision, audio, and code",
314282
+ "family": "qwen",
314283
+ "attachment": true,
314235
314284
  "reasoning": true,
314236
- "reasoning_options": [],
314285
+ "reasoning_options": [
314286
+ {
314287
+ "type": "effort",
314288
+ "values": [
314289
+ "none",
314290
+ "low",
314291
+ "medium",
314292
+ "high",
314293
+ "max"
314294
+ ]
314295
+ }
314296
+ ],
314237
314297
  "tool_call": true,
314238
314298
  "structured_output": true,
314239
314299
  "temperature": true,
314240
- "release_date": "2026-06-13",
314241
- "last_updated": "2026-06-13",
314300
+ "release_date": "2026-04-17",
314301
+ "last_updated": "2026-04-17",
314242
314302
  "modalities": {
314243
314303
  "input": [
314244
- "text"
314304
+ "text",
314305
+ "image"
314245
314306
  ],
314246
314307
  "output": [
314247
314308
  "text"
@@ -314249,35 +314310,32 @@
314249
314310
  },
314250
314311
  "open_weights": true,
314251
314312
  "limit": {
314252
- "context": 500000,
314253
- "output": 131072
314313
+ "context": 262144,
314314
+ "output": 65536
314254
314315
  },
314255
314316
  "cost": {
314256
314317
  "input": 0,
314257
314318
  "output": 0
314258
- }
314319
+ },
314320
+ "canonical_model_id": "alibaba/qwen3.6-35b-a3b"
314259
314321
  },
314260
- "gemma4": {
314261
- "id": "gemma4",
314262
- "name": "Gemma 4 26B A4B IT",
314263
- "description": "Open Gemma instruction model for efficient chat and self-hosted deployments",
314264
- "family": "gemma",
314322
+ "mimo-v2.6-flash": {
314323
+ "id": "mimo-v2.6-flash",
314324
+ "name": "MiMo-V2.6-Flash",
314325
+ "description": "MiMo Flash model for multimodal coding agents and long-context automation",
314326
+ "family": "mimo",
314265
314327
  "attachment": true,
314266
314328
  "reasoning": true,
314267
- "reasoning_options": [
314268
- {
314269
- "type": "toggle"
314270
- }
314271
- ],
314329
+ "reasoning_options": [],
314272
314330
  "tool_call": true,
314273
- "structured_output": true,
314274
314331
  "temperature": true,
314275
- "release_date": "2026-04-02",
314276
- "last_updated": "2026-04-02",
314332
+ "release_date": "2026-09-22",
314333
+ "last_updated": "2026-09-22",
314277
314334
  "modalities": {
314278
314335
  "input": [
314279
314336
  "text",
314280
- "image"
314337
+ "image",
314338
+ "audio"
314281
314339
  ],
314282
314340
  "output": [
314283
314341
  "text"
@@ -314285,13 +314343,14 @@
314285
314343
  },
314286
314344
  "open_weights": true,
314287
314345
  "limit": {
314288
- "context": 262144,
314289
- "output": 32768
314346
+ "context": 1048576,
314347
+ "output": 131072
314290
314348
  },
314291
314349
  "cost": {
314292
314350
  "input": 0,
314293
314351
  "output": 0
314294
- }
314352
+ },
314353
+ "canonical_model_id": "xiaomi/mimo-v2.6-flash"
314295
314354
  },
314296
314355
  "qwen3.8-flash": {
314297
314356
  "id": "qwen3.8-flash",
@@ -314322,21 +314381,65 @@
314322
314381
  "cost": {
314323
314382
  "input": 0,
314324
314383
  "output": 0
314325
- }
314384
+ },
314385
+ "canonical_model_id": "alibaba/qwen3.8-flash"
314326
314386
  },
314327
- "glm5.3-flash": {
314328
- "id": "glm5.3-flash",
314329
- "name": "GLM-5.3-Flash",
314330
- "description": "Native multimodal GLM model for efficient coding and long-horizon agent tasks",
314387
+ "glm5.3": {
314388
+ "id": "glm5.3",
314389
+ "name": "GLM-5.3",
314390
+ "description": "Flagship GLM model for long-horizon coding, agents, and complex project delivery",
314331
314391
  "family": "glm",
314392
+ "attachment": false,
314393
+ "reasoning": true,
314394
+ "reasoning_options": [
314395
+ {
314396
+ "type": "effort",
314397
+ "values": [
314398
+ "low",
314399
+ "medium",
314400
+ "high",
314401
+ "max"
314402
+ ]
314403
+ }
314404
+ ],
314405
+ "tool_call": true,
314406
+ "structured_output": true,
314407
+ "temperature": true,
314408
+ "release_date": "2026-08-14",
314409
+ "last_updated": "2026-08-14",
314410
+ "modalities": {
314411
+ "input": [
314412
+ "text"
314413
+ ],
314414
+ "output": [
314415
+ "text"
314416
+ ]
314417
+ },
314418
+ "open_weights": true,
314419
+ "limit": {
314420
+ "context": 1000000,
314421
+ "output": 131072
314422
+ },
314423
+ "cost": {
314424
+ "input": 0,
314425
+ "output": 0
314426
+ },
314427
+ "canonical_model_id": "zhipuai/glm-5.3"
314428
+ },
314429
+ "deepseek-v4-flash": {
314430
+ "id": "deepseek-v4-flash",
314431
+ "name": "DeepSeek V4.1 Flash",
314432
+ "description": "DeepSeek V4.1 Flash model for reasoning and agentic coding",
314433
+ "family": "deepseek-flash",
314332
314434
  "attachment": true,
314333
314435
  "reasoning": true,
314334
314436
  "reasoning_options": [],
314335
314437
  "tool_call": true,
314336
314438
  "structured_output": true,
314337
314439
  "temperature": true,
314338
- "release_date": "2026-08-26",
314339
- "last_updated": "2026-08-26",
314440
+ "knowledge": "2025-05",
314441
+ "release_date": "2026-09-10",
314442
+ "last_updated": "2026-09-10",
314340
314443
  "modalities": {
314341
314444
  "input": [
314342
314445
  "text",
@@ -314346,9 +314449,41 @@
314346
314449
  "text"
314347
314450
  ]
314348
314451
  },
314349
- "open_weights": false,
314452
+ "open_weights": true,
314350
314453
  "limit": {
314351
314454
  "context": 1000000,
314455
+ "output": 384000
314456
+ },
314457
+ "cost": {
314458
+ "input": 0,
314459
+ "output": 0
314460
+ },
314461
+ "canonical_model_id": "deepseek/deepseek-v4.1-flash"
314462
+ },
314463
+ "glm5.2": {
314464
+ "id": "glm5.2",
314465
+ "name": "GLM-5.2",
314466
+ "description": "Open flagship GLM for long-horizon coding agents, served at 500K context on the NaN premium tier",
314467
+ "family": "glm",
314468
+ "attachment": false,
314469
+ "reasoning": true,
314470
+ "reasoning_options": [],
314471
+ "tool_call": true,
314472
+ "structured_output": true,
314473
+ "temperature": true,
314474
+ "release_date": "2026-06-13",
314475
+ "last_updated": "2026-06-13",
314476
+ "modalities": {
314477
+ "input": [
314478
+ "text"
314479
+ ],
314480
+ "output": [
314481
+ "text"
314482
+ ]
314483
+ },
314484
+ "open_weights": true,
314485
+ "limit": {
314486
+ "context": 500000,
314352
314487
  "output": 131072
314353
314488
  },
314354
314489
  "cost": {
@@ -1,5 +1,6 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
+ import { withRegistryCatalogSections } from "@desplega/model-catalog";
3
4
 
4
5
  export interface ModelsDevCostBlock {
5
6
  input?: number;
@@ -53,6 +54,11 @@ const parsedCaches = new Map<string, WeakRef<ModelsDevCache>>();
53
54
  * fetches the live catalog from `GET /api/models-catalog`
54
55
  * (`src/be/models-catalog.ts`) and only falls back to its bundled copy of
55
56
  * this snapshot when that request hasn't resolved.
57
+ *
58
+ * The result also carries the sections of the OpenAI-compatible registry
59
+ * providers models.dev does not list (`helmcode`), synthesized from the
60
+ * registry (`withRegistryCatalogSections`), so every snapshot consumer
61
+ * (catalog, pricing seed, tier resolution) sees them like any other section.
56
62
  */
57
63
  export function loadModelsDevCache(): ModelsDevCache | null {
58
64
  const explicitPath = process.env.MODELSDEV_CACHE_PATH;
@@ -67,7 +73,9 @@ export function loadModelsDevCache(): ModelsDevCache | null {
67
73
  const memoized = parsedCaches.get(candidate)?.deref();
68
74
  if (memoized) return memoized;
69
75
  try {
70
- const parsed = JSON.parse(readFileSync(candidate, "utf-8")) as ModelsDevCache;
76
+ const parsed = withRegistryCatalogSections(
77
+ JSON.parse(readFileSync(candidate, "utf-8")) as ModelsDevCache,
78
+ );
71
79
  parsedCaches.set(candidate, new WeakRef(parsed));
72
80
  return parsed;
73
81
  } catch {
@@ -11,6 +11,7 @@ import { registerVolatileSecret } from "@/utils/secret-scrubber";
11
11
  import { getResolvedConfig } from "./db";
12
12
  import { resolveOAuthBindingToken } from "./oauth-credential-bindings";
13
13
  import { listRelationalCredentialBindings } from "./script-connections";
14
+ import { isApiOnlyConfigKey, isInternalConfigKey } from "./swarm-config-guard";
14
15
 
15
16
  // Relational-only credential binding store. The legacy SCRIPT_CREDENTIAL_BINDINGS
16
17
  // swarm-config JSON blob is retired (migrated to relational rows at boot), so
@@ -22,6 +23,32 @@ class RelationalCredentialBindingStore implements CredentialBindingStore {
22
23
  }
23
24
  }
24
25
 
26
+ export type ScriptUserConfig = Record<string, { value: string; isSecret: boolean }>;
27
+
28
+ /**
29
+ * The values behind `ctx.swarm.config.get(KEY)`: the invoking agent's resolved
30
+ * config (agent over global, plus repo when given), minus the keys the
31
+ * `/api/config/resolved` route never hands out. A script's own SDK bearer
32
+ * already reads every one of these through `ctx.swarm.config_get`, so this
33
+ * widens nothing; it only makes the documented accessor return them. Secret
34
+ * values are registered with the scrubber so they never leave in run output.
35
+ */
36
+ function toScriptUserConfig(configs: Awaited<ReturnType<typeof getResolvedConfig>>) {
37
+ const exposed = configs.filter(
38
+ (config) => !isApiOnlyConfigKey(config.key) && !isInternalConfigKey(config.key),
39
+ );
40
+ for (const config of exposed) {
41
+ if (config.isSecret && config.value) {
42
+ registerVolatileSecret(config.value, `config:${config.key}`);
43
+ }
44
+ }
45
+ // fromEntries defines own properties, so a `__proto__` key survives
46
+ // (assigning it into `{}` would hit the prototype setter instead).
47
+ return Object.fromEntries(
48
+ exposed.map((config) => [config.key, { value: config.value, isSecret: config.isSecret }]),
49
+ ) as ScriptUserConfig;
50
+ }
51
+
25
52
  /**
26
53
  * Resolve credential bindings for a script run, partitioning OAuth bindings
27
54
  * whose refresh failed into `failedBindings` (surfaced to the sandbox so the
@@ -32,8 +59,14 @@ class RelationalCredentialBindingStore implements CredentialBindingStore {
32
59
  export async function buildScriptCredentialBindingsWithFailures(input: {
33
60
  agentId?: string;
34
61
  repoId?: string;
35
- }): Promise<{ egressSecrets: EgressSecretEntry[]; failedBindings: FailedCredentialBinding[] }> {
62
+ }): Promise<{
63
+ egressSecrets: EgressSecretEntry[];
64
+ failedBindings: FailedCredentialBinding[];
65
+ userConfig: ScriptUserConfig;
66
+ }> {
36
67
  const resolvedConfigs = await getResolvedConfig(input.agentId, input.repoId);
68
+ // Before the binding loop below, so a binding's own scrubber label wins.
69
+ const userConfig = toScriptUserConfig(resolvedConfigs);
37
70
  const configMap = new Map(resolvedConfigs.map((config) => [config.key, config.value]));
38
71
  const broker = new CredentialBroker(
39
72
  new RelationalCredentialBindingStore(),
@@ -49,7 +82,11 @@ export async function buildScriptCredentialBindingsWithFailures(input: {
49
82
  for (const binding of resolved) {
50
83
  registerVolatileSecret(binding.value, binding.configKey);
51
84
  }
52
- return { egressSecrets: resolved, failedBindings: failed };
85
+ return {
86
+ egressSecrets: resolved,
87
+ failedBindings: failed,
88
+ userConfig,
89
+ };
53
90
  }
54
91
 
55
92
  export async function buildScriptCredentialBindings(input: {
@@ -52,6 +52,7 @@ export async function runSavedScriptAsAgent(
52
52
  agentId: args.agentId,
53
53
  egressSecrets: credentials.egressSecrets,
54
54
  failedBindings: credentials.failedBindings,
55
+ userConfig: credentials.userConfig,
55
56
  apiConnections: getScriptApiConnectionDescriptors({ agentId: args.agentId }),
56
57
  mcpConnections: getScriptMcpConnectionDescriptors({ agentId: args.agentId }),
57
58
  ...(args.timeoutMs ? { timeoutMs: args.timeoutMs } : {}),
@@ -235,10 +235,10 @@ export interface SwarmSdk {
235
235
  // --- slack ---
236
236
  slack_read(args?: { inboxMessageId?: string; taskId?: string; channelId?: string; threadTs?: string; limit?: number; includeFiles?: boolean }): Promise<unknown>;
237
237
  slack_listChannels(args?: { types?: Array<"public" | "private" | "dm" | "mpim">; limit?: number }): Promise<unknown>;
238
+ // --- chat sdk ---
239
+ chat_readThread(args: { threadId: string; limit?: number }): Promise<unknown>;
238
240
  // --- messaging ---
239
241
  message_read(args?: { channel?: string; limit?: number; since?: string; unreadOnly?: boolean; mentionsOnly?: boolean; markAsRead?: boolean }): Promise<unknown>;
240
- // --- services ---
241
- service_list(args?: { agentId?: string; name?: string; status?: "starting" | "healthy" | "unhealthy" | "stopped"; includeOwn?: boolean }): Promise<unknown>;
242
242
  // --- context / profiles ---
243
243
  context_history(args?: { agentId?: string; field?: "soulMd" | "identityMd" | "toolsMd" | "claudeMd" | "setupScript"; limit?: number }): Promise<unknown>;
244
244
  context_diff(args: { versionId: string; compareToVersionId?: string }): Promise<unknown>;
@@ -281,7 +281,7 @@ export interface SwarmSdk {
281
281
  task_action(args: Record<string, unknown>): Promise<unknown>;
282
282
 
283
283
  // --- write: config ---
284
- config_set(args: { key: string; value: unknown; scope?: "global" | "agent" | "repo"; scopeId?: string; isSecret?: boolean }): Promise<unknown>;
284
+ config_set(args: { key: string; value: unknown; scope?: "global" | "agent" | "repo"; scopeId?: string; isSecret?: boolean; exportToEnv?: boolean }): Promise<unknown>;
285
285
  config_delete(args: { id: string }): Promise<unknown>;
286
286
 
287
287
  // --- write: model catalog ---
@@ -311,17 +311,19 @@ export interface SwarmSdk {
311
311
  slack_delete(args: { channelId: string; messageTs: string }): Promise<unknown>;
312
312
  slack_update(args: { channelId: string; messageTs: string; message: string }): Promise<unknown>;
313
313
 
314
+ // --- write: chat sdk ---
315
+ chat_reply(args: { text: string }): Promise<unknown>;
316
+ chat_post(args: { adapter: "telegram" | "slack" | "discord" | "teams"; threadId?: string; channelId?: string; text: string }): Promise<unknown>;
317
+ chat_openDm(args: { adapter: "telegram" | "slack" | "discord" | "teams"; userId: string }): Promise<unknown>;
318
+ chat_registerChannel(args: { adapter: "telegram" | "slack" | "discord" | "teams"; channelId: string; agentId?: string; workflowId?: string; name?: string }): Promise<unknown>;
319
+ chat_unregisterChannel(args: { adapter: "telegram" | "slack" | "discord" | "teams"; channelId: string }): Promise<unknown>;
320
+
314
321
  // --- write: messaging (internal) ---
315
322
  message_post(args: { channel?: string; content: string; to?: string }): Promise<unknown>;
316
323
 
317
324
  // --- write: profiles ---
318
325
  profile_update(args: Record<string, unknown>): Promise<unknown>;
319
326
 
320
- // --- write: services ---
321
- service_register(args: Record<string, unknown>): Promise<unknown>;
322
- service_unregister(args: { name: string }): Promise<unknown>;
323
- service_updateStatus(args: { name: string; status: "starting" | "healthy" | "unhealthy" | "stopped" }): Promise<unknown>;
324
-
325
327
  // --- write: schedules ---
326
328
  schedule_create(args: Record<string, unknown>): Promise<unknown>;
327
329
  schedule_update(args: Record<string, unknown>): Promise<unknown>;
@@ -22,6 +22,7 @@ export async function runSeeder(seeder: Seeder, opts?: SeederRunOptions): Promis
22
22
  updated: 0,
23
23
  skippedUnchanged: 0,
24
24
  skippedUserModified: 0,
25
+ retired: 0,
25
26
  failed: [],
26
27
  };
27
28
 
@@ -77,11 +78,22 @@ export async function runSeeder(seeder: Seeder, opts?: SeederRunOptions): Promis
77
78
  }
78
79
  }
79
80
 
81
+ if (seeder.retire) {
82
+ try {
83
+ result.retired = (await seeder.retire()).length;
84
+ } catch (err) {
85
+ result.failed.push({
86
+ key: "(retire)",
87
+ error: err instanceof Error ? err.message : String(err),
88
+ });
89
+ }
90
+ }
91
+
80
92
  if (!opts?.quiet) {
81
93
  console.log(
82
94
  `[seed:${result.kind}] created=${result.created} updated=${result.updated} ` +
83
95
  `unchanged=${result.skippedUnchanged} preserved=${result.skippedUserModified} ` +
84
- `failed=${result.failed.length}`,
96
+ `retired=${result.retired} failed=${result.failed.length}`,
85
97
  );
86
98
  for (const f of result.failed) {
87
99
  console.error(`[seed:${result.kind}] FAILED ${f.key}: ${f.error}`);
@@ -36,3 +36,8 @@ export async function recordSeedState(
36
36
  [kind, key, seededHash, new Date().toISOString()],
37
37
  );
38
38
  }
39
+
40
+ /** Forget `(kind, key)`, e.g. after the seeder retires the entity it seeded. */
41
+ export async function deleteSeedState(kind: string, key: string): Promise<void> {
42
+ await getDbClient().run("DELETE FROM seed_state WHERE kind = ? AND key = ?", [kind, key]);
43
+ }
@@ -53,6 +53,11 @@ export interface Seeder<TItem extends SeedItem = SeedItem> {
53
53
  upstreamHash(item: TItem): string | null | Promise<string | null>;
54
54
  /** Create or update the upstream entity so it matches the source definition. */
55
55
  apply(item: TItem, action: "create" | "update", opts?: SeederRunOptions): void | Promise<void>;
56
+ /**
57
+ * Optional: remove upstream entities for keys the source no longer ships.
58
+ * Must leave user-modified entities in place. Returns the removed keys.
59
+ */
60
+ retire?(): Promise<string[]>;
56
61
  }
57
62
 
58
63
  export type SeederResult = {
@@ -61,5 +66,6 @@ export type SeederResult = {
61
66
  updated: number;
62
67
  skippedUnchanged: number;
63
68
  skippedUserModified: number;
69
+ retired: number;
64
70
  failed: Array<{ key: string; error: string }>;
65
71
  };
@@ -19,6 +19,7 @@
19
19
  * admin route (`POST /api/pricing`) — we don't overwrite seed rows.
20
20
  */
21
21
 
22
+ import { openAICompatibleProviderIds } from "@desplega/model-catalog";
22
23
  import type { PricingProvider, PricingTokenClass } from "../types";
23
24
  import { getDb } from "./db";
24
25
  import {
@@ -98,8 +99,9 @@ const ANTHROPIC_SHORTNAME_TO_MODELSDEV: Record<string, string> = {
98
99
  const ANTHROPIC_SHORTNAME_PRICING_FALLBACKS: Record<string, ModelsDevCostBlock> = {
99
100
  // https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-09-22)
100
101
  "claude-opus-5-5": { input: 4, output: 20, cache_read: 0.2, cache_write: 5 },
101
- // https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-09-28)
102
- "claude-sonnet-5-5": { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 },
102
+ // https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-10-15):
103
+ // cache hits on Sonnet 5.5 cost 0.05x input, not the usual 0.1x.
104
+ "claude-sonnet-5-5": { input: 2, output: 10, cache_read: 0.1, cache_write: 2.5 },
103
105
  "claude-fable-5-1": { input: 10, output: 50, cache_read: 0.25, cache_write: 12.5 },
104
106
  "claude-mythos-5-1": { input: 10, output: 50, cache_read: 0.25, cache_write: 12.5 },
105
107
  };
@@ -367,6 +369,21 @@ export function buildModelsDevSeedRows(cache: ModelsDevCache): PricingSeedRow[]
367
369
  }
368
370
  }
369
371
 
372
+ // ---- OpenAI-compatible registry providers ($0 flat-rate subscriptions) --
373
+ // pi and opencode run these as `<provider>/<id>`. The models.dev `nan`
374
+ // section and the registry-synthesized `helmcode` section
375
+ // (`withRegistryCatalogSections`) carry cost {0, 0}, so the sessions price
376
+ // as `pricing-table` at $0 instead of `unpriced`. The provider prefix stays
377
+ // in the key: `nan/qwen3.6` and `helmcode/qwen3.6` are separate rows.
378
+ for (const provider of openAICompatibleProviderIds()) {
379
+ for (const [id, model] of Object.entries(cache[provider]?.models ?? {})) {
380
+ if (!model?.cost) continue;
381
+ const key = `${provider}/${id}`;
382
+ add(key, projectCostBlock("pi", key, model.cost));
383
+ add(key, projectCostBlock("opencode", key, model.cost));
384
+ }
385
+ }
386
+
370
387
  return collapseNormalizedIds(sourced);
371
388
  }
372
389
 
@@ -38,7 +38,7 @@ const CONTRADICTORY_RE =
38
38
  /\b(do not|don't|never)\b[\s\S]{0,240}\b(always|must|required)\b|\b(always|must|required)\b[\s\S]{0,240}\b(do not|don't|never)\b/i;
39
39
 
40
40
  const CODE_REGISTRY_EVENTS =
41
- "agentmail.email.followup agentmail.email.mapped_lead agentmail.email.mapped_worker agentmail.email.no_agent agentmail.email.unmapped common.command_suggestions.github_comment_issue common.command_suggestions.github_comment_pr common.command_suggestions.github_issue common.command_suggestions.github_pr common.command_suggestions.gitlab_issue common.command_suggestions.gitlab_mr common.delegation_instruction common.delegation_instruction.gitlab github.check_run.failed github.check_suite.failed github.comment.mentioned github.issue.assigned github.issue.labeled github.issue.mentioned github.pull_request.assigned github.pull_request.closed github.pull_request.labeled github.pull_request.mentioned github.pull_request.review_requested github.pull_request.review_submitted github.pull_request.synchronize github.workflow_run.failed gitlab.comment.mentioned gitlab.issue.assigned gitlab.merge_request.opened gitlab.pipeline.failed heartbeat.boot-triage heartbeat.checklist jira.issue.assigned jira.issue.commented jira.issue.followup kapso.message.received linear.issue.assigned linear.issue.followup linear.issue.reassigned slack.assistant.greeting slack.assistant.offline slack.assistant.suggested_prompts slack.message.attachment_failed slack.message.thread_context system.agent.communication system.agent.lead system.agent.memory system.agent.memory.remote system.agent.outputs system.agent.outputs.no_agent_fs system.agent.repository system.agent.role system.agent.secrets system.agent.slack system.agent.tools_skills system.agent.worker system.agent.worker.remote system.agent.workspace system.agent.workspace.remote system.session.lead system.session.lead.managed system.session.worker system.session.worker.managed system.session.worker.remote task.budget.refused task.requester.profile task.worker.completed task.worker.failed".split(
41
+ "agentmail.email.followup agentmail.email.mapped_lead agentmail.email.mapped_worker agentmail.email.no_agent agentmail.email.unmapped chat.message.thread_context common.command_suggestions.github_comment_issue common.command_suggestions.github_comment_pr common.command_suggestions.github_issue common.command_suggestions.github_pr common.command_suggestions.gitlab_issue common.command_suggestions.gitlab_mr common.delegation_instruction common.delegation_instruction.gitlab github.check_run.failed github.check_suite.failed github.comment.mentioned github.issue.assigned github.issue.labeled github.issue.mentioned github.pull_request.assigned github.pull_request.closed github.pull_request.labeled github.pull_request.mentioned github.pull_request.review_requested github.pull_request.review_submitted github.pull_request.synchronize github.workflow_run.failed gitlab.comment.mentioned gitlab.issue.assigned gitlab.merge_request.opened gitlab.pipeline.failed heartbeat.boot-triage heartbeat.checklist jira.issue.assigned jira.issue.commented jira.issue.followup kapso.message.received linear.issue.assigned linear.issue.followup linear.issue.reassigned slack.assistant.greeting slack.assistant.offline slack.assistant.suggested_prompts slack.message.attachment_failed slack.message.thread_context system.agent.communication system.agent.lead system.agent.memory system.agent.memory.remote system.agent.outputs system.agent.outputs.no_agent_fs system.agent.repository system.agent.role system.agent.secrets system.agent.slack system.agent.tools_skills system.agent.worker system.agent.worker.remote system.agent.workspace system.agent.workspace.remote system.session.lead system.session.lead.managed system.session.worker system.session.worker.managed system.session.worker.remote task.budget.refused task.requester.profile task.worker.completed task.worker.failed".split(
42
42
  " ",
43
43
  );
44
44