@desplega.ai/agent-swarm 1.172.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 (525) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-fpecx1g1.js → acp-adapter-sj2g0m84.js} +18 -17
  3. package/dist/{actions-pw87a1a8.js → actions-fegk44gr.js} +65 -35
  4. package/dist/{amp-adapter-8jem2bc0.js → amp-adapter-ad8ft89x.js} +8 -7
  5. package/dist/{anthropic-messages-8ee2f22q.js → anthropic-messages-r6czkjv1.js} +7 -7
  6. package/dist/{app-wmf0m843.js → app-kfvgbvzy.js} +19 -13
  7. package/dist/{assistant-emp1e108.js → assistant-z7zdy9ja.js} +65 -38
  8. package/dist/{boot-reembed-1de4f4aj.js → boot-reembed-5c2z0mbe.js} +11 -9
  9. package/dist/{boot-reembed-4ymn9atn.js → boot-reembed-j8xa181e.js} +11 -9
  10. package/dist/{boot-scrub-sweep-adhk1s8c.js → boot-scrub-sweep-hnkn3rgt.js} +12 -10
  11. package/dist/{boot-seeds-8q637aew.js → boot-seeds-kwjq4d2z.js} +15 -13
  12. package/dist/{claude-adapter-t26cv8a4.js → claude-adapter-9vmvpvgd.js} +20 -19
  13. package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-k9qae05j.js} +7 -5
  14. package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-q54zx5q2.js} +6 -4
  15. package/dist/{claude-sdk-session-gsfsh662.js → claude-sdk-session-9jye6cxr.js} +12698 -11995
  16. package/dist/{cli-k46r9hmk.js → cli-03gedhng.js} +16 -14
  17. package/dist/{cli-kb4ehzx5.js → cli-1e4b6bzh.js} +7 -7
  18. package/dist/{cli-d603qf86.js → cli-29jc5q7w.js} +10 -8
  19. package/dist/cli-2m1ktfzz.js +17795 -0
  20. package/dist/{cli-8vs9trd4.js → cli-3dj8k4vy.js} +1 -1
  21. package/dist/{cli-zxm9p3x4.js → cli-3fbmmawm.js} +5 -5
  22. package/dist/{cli-gmdajfw5.js → cli-4jxm2qtz.js} +4987 -1708
  23. package/dist/{cli-tadfgd0t.js → cli-5hkm7whv.js} +33 -4
  24. package/dist/{cli-6jb2rf77.js → cli-5t4f29ez.js} +3 -3
  25. package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
  26. package/dist/cli-6cvfxs8r.js +47 -0
  27. package/dist/{cli-pj6x9qce.js → cli-6jyj59nb.js} +2 -2
  28. package/dist/{cli-388egyf6.js → cli-6razj6t4.js} +2 -2
  29. package/dist/{cli-qsztpfry.js → cli-74ahz61x.js} +2 -2
  30. package/dist/{cli-4nz8p1p5.js → cli-7x0g4sn1.js} +15474 -16082
  31. package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
  32. package/dist/{cli-81r1wjyv.js → cli-9nfx44eh.js} +1 -1
  33. package/dist/cli-9traj3dn.js +638 -0
  34. package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
  35. package/dist/{cli-bf7485pm.js → cli-apx87jne.js} +2 -2
  36. package/dist/{cli-ztrv9y21.js → cli-bzszjf2p.js} +3689 -1081
  37. package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
  38. package/dist/{cli-hsem16hb.js → cli-cgtksawx.js} +7 -4
  39. package/dist/{cli-db3m6zdt.js → cli-d2qr7aj4.js} +1 -1
  40. package/dist/{cli-1hgat6pa.js → cli-d5f9ed5c.js} +5 -5
  41. package/dist/cli-e3g5mbkz.js +776 -0
  42. package/dist/{cli-7jykv7ef.js → cli-e6mpjhed.js} +1 -1
  43. package/dist/{cli-j6kpj9az.js → cli-ee9gtz70.js} +1553 -68
  44. package/dist/{cli-e0a9sk00.js → cli-eejsgvm4.js} +4 -4
  45. package/dist/{cli-tgpfnm6r.js → cli-ef1hg1wv.js} +518 -59
  46. package/dist/cli-f527ce74.js +781 -0
  47. package/dist/{cli-ppy4nnnh.js → cli-f7kr7svz.js} +2 -2
  48. package/dist/cli-hjwmhcg1.js +10622 -0
  49. package/dist/{cli-2bw3w47j.js → cli-hnhtk6cj.js} +1 -1
  50. package/dist/{cli-ywm1azg9.js → cli-hnmhtzvh.js} +6 -4
  51. package/dist/{cli-4fnb6884.js → cli-hvqbtna4.js} +7 -1259
  52. package/dist/{cli-pstq9888.js → cli-j0pfptdp.js} +220 -103
  53. package/dist/cli-jta2eyzc.js +619 -0
  54. package/dist/{cli-esnpehf5.js → cli-k382tshb.js} +12 -13
  55. package/dist/cli-k3dp5tpf.js +263 -0
  56. package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
  57. package/dist/cli-kceah1eh.js +92 -0
  58. package/dist/{cli-prrt9fa0.js → cli-ke896fcf.js} +10 -10
  59. package/dist/{cli-nv4zd0b9.js → cli-kt6zqg0e.js} +6 -6
  60. package/dist/{cli-g6t9texm.js → cli-m50t4309.js} +5 -18
  61. package/dist/cli-n2wq4j7m.js +6985 -0
  62. package/dist/{cli-c2pq2rjb.js → cli-n3hzg89b.js} +46 -15
  63. package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
  64. package/dist/{cli-5rv1j9ga.js → cli-ne236afy.js} +53 -7
  65. package/dist/cli-p0sg24zp.js +16 -0
  66. package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
  67. package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
  68. package/dist/{cli-g4f5pj26.js → cli-q0ke1yww.js} +111 -25
  69. package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
  70. package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
  71. package/dist/{cli-gj81e47t.js → cli-r2pnvj8g.js} +2 -2
  72. package/dist/{cli-r8smj8b8.js → cli-r62a35ea.js} +19 -3
  73. package/dist/{cli-cd0hv9nh.js → cli-ra0xzggj.js} +2 -2
  74. package/dist/cli-rhs9pz33.js +294 -0
  75. package/dist/{cli-nyhb1r6x.js → cli-s2sp957d.js} +52 -29
  76. package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
  77. package/dist/{cli-xczpdp9e.js → cli-se8w6wny.js} +6 -6
  78. package/dist/cli-skxvvpap.js +10140 -0
  79. package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
  80. package/dist/{cli-0p3enk35.js → cli-tqaazemc.js} +9 -1
  81. package/dist/{cli-cf69s3ew.js → cli-tr4sxp68.js} +3 -3
  82. package/dist/{cli-8hzfb6xz.js → cli-tsde1hdr.js} +15 -15
  83. package/dist/{cli-cceskcvt.js → cli-txqb9s38.js} +8 -8
  84. package/dist/{cli-aspcaef3.js → cli-v1yb0rqb.js} +6 -6
  85. package/dist/{cli-j1pmc07z.js → cli-vatyhshy.js} +268 -40
  86. package/dist/{cli-04emfe2q.js → cli-vdach5a9.js} +5 -5
  87. package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
  88. package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
  89. package/dist/{cli-hwwvy36w.js → cli-wayw93nt.js} +3 -3
  90. package/dist/cli-wmgrkscj.js +23254 -0
  91. package/dist/{cli-gp1rtyvk.js → cli-z5jjpaxw.js} +29 -6
  92. package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
  93. package/dist/cli.js +32 -48
  94. package/dist/{codex-adapter-m4tgdysy.js → codex-adapter-y81sssk0.js} +16 -15
  95. package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
  96. package/dist/{codex-session-runner-ymwzm6ea.js → codex-session-runner-8vx4j6a9.js} +16 -15
  97. package/dist/{commands-n0hshcvs.js → commands-kcpvpcrr.js} +21 -10
  98. package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
  99. package/dist/{controllers-connect-y07cqcvy.js → controllers-connect-kwpvj3rf.js} +45 -38
  100. package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
  101. package/dist/{db-hkqvrdcb.js → db-k8ankj20.js} +13 -11
  102. package/dist/{db-4w7tmt1g.js → db-ww5d7jq3.js} +29 -9
  103. package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
  104. package/dist/{dispatcher-5sd69y14.js → dispatcher-e8gq5m68.js} +41 -34
  105. package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
  106. package/dist/{dsh-adapter-2h8m4cab.js → dsh-adapter-3epjm3af.js} +7 -6
  107. package/dist/{e2b-66xra4az.js → e2b-8ygwhg0f.js} +4 -3
  108. package/dist/{e2b-xwhyj8cw.js → e2b-swhnpw3n.js} +4 -3
  109. package/dist/{event-bus-vjtv82gm.js → event-bus-6axnngdj.js} +3 -2
  110. package/dist/external-channel-h3359cwn.js +52 -0
  111. package/dist/{google-generative-ai-7pavrbv7.js → google-generative-ai-g8db7x0f.js} +5 -3
  112. package/dist/{google-vertex-3f1jk41f.js → google-vertex-r2692q0r.js} +5 -3
  113. package/dist/{grok-adapter-8m9yqzbq.js → grok-adapter-0d4x7gkx.js} +19 -18
  114. package/dist/{handlers-s20xr10r.js → handlers-an1gzv21.js} +44 -37
  115. package/dist/{heartbeat-3k31q4g2.js → heartbeat-6dakeb61.js} +46 -39
  116. package/dist/{hook-gdn6a2fn.js → hook-6v6cv6d5.js} +12 -24
  117. package/dist/{hook-ygwerrdh.js → hook-sa5xye4y.js} +13 -12
  118. package/dist/{http-jdteeg81.js → http-r7f3eky0.js} +1598 -279
  119. package/dist/index-52j1aja4.js +3465 -0
  120. package/dist/{index-e0snym4t.js → index-7ep4gzdk.js} +41 -34
  121. package/dist/index-9gw58n4k.js +193 -0
  122. package/dist/index-9j87mcm8.js +56305 -0
  123. package/dist/index-bsmcresk.js +79424 -0
  124. package/dist/index-mh85qhec.js +475 -0
  125. package/dist/{index-vm3bm9t7.js → index-rmpw9a8q.js} +41 -34
  126. package/dist/{index-6ksewd5y.js → index-s2wxgzr0.js} +1015 -732
  127. package/dist/{index-tsszt7g9.js → index-v1v6n7hg.js} +46 -39
  128. package/dist/index-we27kd31.js +12810 -0
  129. package/dist/{index-ffqzqgwb.js → index-zk96aq1k.js} +11 -9
  130. package/dist/{keepalive-jekc896t.js → keepalive-be9vwy5h.js} +13 -11
  131. package/dist/{lead-4k9s9szx.js → lead-0861cwrf.js} +64 -57
  132. package/dist/{maintenance-shazch4n.js → maintenance-mzzgc8bn.js} +11 -9
  133. package/dist/node-c9we95xf.js +1 -1
  134. package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
  135. package/dist/{oauth-refresh-sweep-5gb36kn8.js → oauth-refresh-sweep-cpdnfwdj.js} +12 -10
  136. package/dist/{onboard-ydrbnvww.js → onboard-fh8qs4r3.js} +11 -3
  137. package/dist/{opencode-adapter-5zh0he20.js → opencode-adapter-nm42wwj8.js} +19 -14
  138. package/dist/{otel-impl-6pf5cv86.js → otel-impl-x6c1c9g4.js} +248 -869
  139. package/dist/{pi-mono-adapter-ef9wwx9m.js → pi-mono-adapter-9n2ya240.js} +245 -107
  140. package/dist/{pricing-refresh-s52nsa5q.js → pricing-refresh-qb0rv0ap.js} +13 -11
  141. package/dist/{rbac-roles-aq3msh4e.js → rbac-roles-1gzdwbh1.js} +12 -10
  142. package/dist/{rbac-roles-q5gb5e8v.js → rbac-roles-3mraey52.js} +13 -11
  143. package/dist/{render-v2-pd1rg54q.js → render-v2-agpa45zz.js} +19 -13
  144. package/dist/{resume-gw4a2c6v.js → resume-x0ydy9s9.js} +27 -21
  145. package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
  146. package/dist/{setup-jda1ksdh.js → setup-as9ga0d6.js} +2 -2
  147. package/dist/{virtual-modules-b3ga2m65.js → virtual-modules-9gkxqrap.js} +7 -6
  148. package/dist/{work-objects-tb7ycye8.js → work-objects-y5g1y7ev.js} +49 -37
  149. package/dist/{worker-njjccz5d.js → worker-860c3e38.js} +64 -57
  150. package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
  151. package/openapi.json +951 -356
  152. package/package.json +12 -13
  153. package/src/apps/catalog.generated.json +1309 -53
  154. package/src/apps/page-validator.ts +93 -31
  155. package/src/azure-devops/api.ts +94 -18
  156. package/src/azure-devops/auth.ts +32 -0
  157. package/src/azure-devops/boards-sync.ts +708 -0
  158. package/src/azure-devops/handlers.ts +52 -8
  159. package/src/azure-devops/html.ts +26 -0
  160. package/src/azure-devops/index.ts +15 -0
  161. package/src/azure-devops/templates.ts +86 -0
  162. package/src/azure-devops/types.ts +65 -1
  163. package/src/be/config-refs.ts +60 -0
  164. package/src/be/db/page-versions.ts +15 -0
  165. package/src/be/db/runtime.ts +35 -8
  166. package/src/be/db/skill-name-resolution.ts +36 -0
  167. package/src/be/db/tasks/read.ts +230 -0
  168. package/src/be/db/tasks/write.ts +7 -0
  169. package/src/be/db.ts +74 -13
  170. package/src/be/migrations/213_script_connections_sql.sql +79 -0
  171. package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
  172. package/src/be/migrations/216_task_resolved_effort.sql +5 -0
  173. package/src/be/migrations/217_chat_sdk_state.sql +104 -0
  174. package/src/be/model-catalog-store.ts +5 -1
  175. package/src/be/model-tier-resolution.ts +12 -1
  176. package/src/be/model-validation.ts +5 -2
  177. package/src/be/models-catalog.ts +26 -1
  178. package/src/be/modelsdev-cache.json +198 -63
  179. package/src/be/modelsdev-cache.ts +9 -1
  180. package/src/be/script-connections.ts +47 -8
  181. package/src/be/script-credential-broker.ts +39 -2
  182. package/src/be/scripts/run-saved.ts +1 -0
  183. package/src/be/scripts/typecheck.ts +10 -8
  184. package/src/be/seed/runner.ts +13 -1
  185. package/src/be/seed/state-db.ts +5 -0
  186. package/src/be/seed/types.ts +6 -0
  187. package/src/be/seed-pricing.ts +19 -2
  188. package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
  189. package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
  190. package/src/be/seed-skills/bundled-files.generated.json +10 -18
  191. package/src/be/seed-skills/index.ts +107 -3
  192. package/src/be/sql-connections.ts +118 -0
  193. package/src/be/swarm-config-guard.ts +53 -0
  194. package/src/cli.tsx +0 -16
  195. package/src/commands/onboard/non-interactive.ts +4 -2
  196. package/src/commands/profile-sync.ts +5 -3
  197. package/src/commands/provider-credentials.ts +52 -6
  198. package/src/commands/runner.ts +196 -56
  199. package/src/e2b/env.ts +5 -0
  200. package/src/extensions/contract-types.generated.ts +1 -1
  201. package/src/extensions/contract.ts +45 -0
  202. package/src/extensions/dispatcher.ts +7 -0
  203. package/src/extensions/post-bridge.ts +40 -0
  204. package/src/github/handlers.ts +11 -4
  205. package/src/heartbeat/templates.ts +8 -5
  206. package/src/hooks/hook.ts +0 -26
  207. package/src/http/all-routes.ts +0 -1
  208. package/src/http/config.ts +36 -17
  209. package/src/http/core.ts +4 -0
  210. package/src/http/index.ts +14 -2
  211. package/src/http/integrations.ts +88 -1
  212. package/src/http/mcp-oauth.ts +6 -13
  213. package/src/http/mcp.ts +15 -5
  214. package/src/http/page-proxy.ts +2 -4
  215. package/src/http/pages-public.ts +6 -5
  216. package/src/http/pages.ts +5 -14
  217. package/src/http/poll.ts +28 -68
  218. package/src/http/requested-by.ts +54 -0
  219. package/src/http/route-def.ts +7 -6
  220. package/src/http/script-connection-proxy.ts +51 -4
  221. package/src/http/script-connections.ts +5 -2
  222. package/src/http/scripts.ts +1 -0
  223. package/src/http/session-cost-recompute.ts +12 -2
  224. package/src/http/session-data.ts +4 -0
  225. package/src/http/stats.ts +1 -30
  226. package/src/http/tasks.ts +61 -5
  227. package/src/http/utils.ts +14 -0
  228. package/src/http/webhooks.ts +183 -2
  229. package/src/http/x.ts +1 -0
  230. package/src/integrations/chat-sdk/adapters.ts +129 -0
  231. package/src/integrations/chat-sdk/attachments.ts +232 -0
  232. package/src/integrations/chat-sdk/background.ts +36 -0
  233. package/src/integrations/chat-sdk/commands.ts +194 -0
  234. package/src/integrations/chat-sdk/config.ts +198 -0
  235. package/src/integrations/chat-sdk/discord-api.ts +63 -0
  236. package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
  237. package/src/integrations/chat-sdk/handlers.ts +28 -0
  238. package/src/integrations/chat-sdk/inbound.ts +426 -0
  239. package/src/integrations/chat-sdk/limits.ts +48 -0
  240. package/src/integrations/chat-sdk/logger.ts +81 -0
  241. package/src/integrations/chat-sdk/outbound.ts +123 -0
  242. package/src/integrations/chat-sdk/relay.ts +172 -0
  243. package/src/integrations/chat-sdk/router.ts +169 -0
  244. package/src/integrations/chat-sdk/runtime.ts +351 -0
  245. package/src/integrations/chat-sdk/schema.ts +245 -0
  246. package/src/integrations/chat-sdk/state.ts +243 -0
  247. package/src/integrations/chat-sdk/status.ts +244 -0
  248. package/src/integrations/chat-sdk/steering.ts +58 -0
  249. package/src/integrations/chat-sdk/teams-origin.ts +77 -0
  250. package/src/integrations/chat-sdk/telegram-api.ts +56 -0
  251. package/src/integrations/chat-sdk/templates.ts +16 -0
  252. package/src/integrations/chat-sdk/test-hooks.ts +37 -0
  253. package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
  254. package/src/integrations/chat-sdk/typing.ts +65 -0
  255. package/src/jira/adf.ts +3 -1
  256. package/src/kv-reserved-namespaces.ts +2 -0
  257. package/src/oauth/mcp-wrapper.ts +10 -6
  258. package/src/otel-impl.ts +2 -1
  259. package/src/pages/version.ts +4 -5
  260. package/src/prompts/base-prompt.ts +111 -45
  261. package/src/providers/acp-target-catalog.ts +6 -0
  262. package/src/providers/acp-targets.ts +56 -3
  263. package/src/providers/amp-adapter.ts +1 -1
  264. package/src/providers/claude-adapter.ts +27 -2
  265. package/src/providers/claude-flag-settings.ts +133 -0
  266. package/src/providers/claude-managed-adapter.ts +1 -1
  267. package/src/providers/claude-sdk-session.ts +7 -0
  268. package/src/providers/claude-session-events.ts +6 -1
  269. package/src/providers/dsh-adapter.ts +1 -1
  270. package/src/providers/opencode-adapter.ts +268 -37
  271. package/src/providers/opencode-billing.ts +86 -0
  272. package/src/providers/opencode-swarm-plugin.ts +51 -0
  273. package/src/providers/pi-mono-adapter.ts +398 -153
  274. package/src/providers/pricing-sources.md +37 -3
  275. package/src/providers/reasoning-effort.ts +27 -0
  276. package/src/providers/types.ts +11 -2
  277. package/src/rbac/legacy-policy.ts +8 -2
  278. package/src/rbac/permissions.ts +21 -0
  279. package/src/scheduler/scheduler.ts +4 -2
  280. package/src/scripts-runtime/api-client.ts +15 -1
  281. package/src/scripts-runtime/api-types.ts +9 -1
  282. package/src/scripts-runtime/ctx.ts +1 -1
  283. package/src/scripts-runtime/loader.ts +19 -7
  284. package/src/scripts-runtime/mcp-client.ts +30 -19
  285. package/src/scripts-runtime/sdk-allowlist.ts +8 -6
  286. package/src/scripts-runtime/swarm-sdk.ts +0 -11
  287. package/src/scripts-runtime/types/stdlib.d.ts +27 -15
  288. package/src/scripts-runtime/types/swarm-extension.d.ts +63 -1
  289. package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -15
  290. package/src/server.ts +52 -18
  291. package/src/slack/actions.ts +29 -1
  292. package/src/slack/app.ts +14 -2
  293. package/src/slack/assistant.ts +36 -2
  294. package/src/slack/channel-join.ts +3 -16
  295. package/src/slack/commands.ts +9 -1
  296. package/src/slack/event-dedup.ts +1 -1
  297. package/src/slack/external-channel-egress.ts +113 -0
  298. package/src/slack/external-channel.ts +309 -0
  299. package/src/slack/handlers.ts +61 -0
  300. package/src/slack/render-v2.ts +40 -47
  301. package/src/slack/work-objects.ts +5 -0
  302. package/src/tasks/additive-buffer.ts +4 -2
  303. package/src/tasks/context-key.ts +94 -2
  304. package/src/tasks/model-pin.ts +67 -0
  305. package/src/tasks/worker-follow-up.ts +4 -31
  306. package/src/telemetry.ts +2 -1
  307. package/src/tests/acp-adapter.test.ts +42 -0
  308. package/src/tests/api-drain-worker-e2e.test.ts +1 -6
  309. package/src/tests/apps-catalog-feedback.test.ts +310 -0
  310. package/src/tests/apps-catalog-inputs.test.ts +70 -0
  311. package/src/tests/apps-catalog-table.test.ts +113 -0
  312. package/src/tests/azure-devops-boards-sync.test.ts +584 -0
  313. package/src/tests/azure-devops-html.test.ts +13 -0
  314. package/src/tests/azure-devops-webhook-malformed.test.ts +4 -0
  315. package/src/tests/base-prompt.test.ts +58 -54
  316. package/src/tests/chat-sdk-commands.test.ts +191 -0
  317. package/src/tests/chat-sdk-config.test.ts +334 -0
  318. package/src/tests/chat-sdk-discord-api.test.ts +68 -0
  319. package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
  320. package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
  321. package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
  322. package/src/tests/chat-sdk-harness.ts +146 -0
  323. package/src/tests/chat-sdk-inbound.test.ts +363 -0
  324. package/src/tests/chat-sdk-relay.test.ts +470 -0
  325. package/src/tests/chat-sdk-reload.test.ts +128 -0
  326. package/src/tests/chat-sdk-shutdown.test.ts +220 -0
  327. package/src/tests/chat-sdk-slack.test.ts +268 -0
  328. package/src/tests/chat-sdk-state.test.ts +163 -0
  329. package/src/tests/chat-sdk-status-route.test.ts +382 -0
  330. package/src/tests/chat-sdk-teams.test.ts +277 -0
  331. package/src/tests/chat-sdk-tools.test.ts +520 -0
  332. package/src/tests/chat-sdk-typing.test.ts +120 -0
  333. package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
  334. package/src/tests/claude-adapter-binary.test.ts +144 -0
  335. package/src/tests/claude-flag-settings.test.ts +114 -0
  336. package/src/tests/claude-managed-adapter.test.ts +1 -1
  337. package/src/tests/claude-sdk-lifecycle.test.ts +148 -1
  338. package/src/tests/claude-sdk-process.fixture.ts +7 -0
  339. package/src/tests/claude-thinking-tokens.test.ts +57 -0
  340. package/src/tests/claude-worker-parity.test.ts +2 -7
  341. package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
  342. package/src/tests/config-refs.test.ts +66 -0
  343. package/src/tests/context-key.test.ts +51 -0
  344. package/src/tests/cors-allowlist.test.ts +25 -0
  345. package/src/tests/create-page-tool.test.ts +18 -0
  346. package/src/tests/credential-check.test.ts +139 -0
  347. package/src/tests/credentials.test.ts +21 -0
  348. package/src/tests/db-runtime.test.ts +61 -0
  349. package/src/tests/db-task-read-contract.test.ts +20 -0
  350. package/src/tests/db-task-write-contract.test.ts +10 -0
  351. package/src/tests/deferred-task-wake.test.ts +52 -4
  352. package/src/tests/docs-index-footprint.test.js +3 -3
  353. package/src/tests/dsh-adapter.test.ts +1 -1
  354. package/src/tests/enabled-capabilities.test.ts +20 -0
  355. package/src/tests/entrypoint-api-readiness.test.ts +14 -8
  356. package/src/tests/entrypoint-config-env-export.test.ts +5 -2
  357. package/src/tests/entrypoint-export-to-env.test.ts +78 -0
  358. package/src/tests/explicit-model-validation.test.ts +105 -1
  359. package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
  360. package/src/tests/extensions-post-bridge.test.ts +51 -0
  361. package/src/tests/fetch-resolved-env.test.ts +128 -0
  362. package/src/tests/fixtures/azure-boards/workitem.commented.json +89 -0
  363. package/src/tests/fixtures/azure-boards/workitem.created.json +81 -0
  364. package/src/tests/fixtures/azure-boards/workitem.deleted.json +70 -0
  365. package/src/tests/fixtures/azure-boards/workitem.restored.json +82 -0
  366. package/src/tests/fixtures/azure-boards/workitem.updated.json +130 -0
  367. package/src/tests/fixtures/catalog-feedback-definition.json.txt +860 -0
  368. package/src/tests/fixtures/catalog-inputs-definition.json.txt +910 -0
  369. package/src/tests/fixtures/catalog-table-definition.json.txt +468 -0
  370. package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
  371. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
  372. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
  373. package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
  374. package/src/tests/fixtures/runner-identity-refresh.ts +3 -0
  375. package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
  376. package/src/tests/github-handlers.test.ts +35 -0
  377. package/src/tests/harness-provider-resolution.test.ts +12 -0
  378. package/src/tests/heartbeat-checklist.test.ts +3 -2
  379. package/src/tests/hook-runtime-close.test.ts +0 -2
  380. package/src/tests/http-api-integration.test.ts +0 -25
  381. package/src/tests/migration-046-budgets.test.ts +17 -16
  382. package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
  383. package/src/tests/model-tier-resolution.test.ts +93 -0
  384. package/src/tests/models-catalog.test.ts +42 -1
  385. package/src/tests/node-env-runtime.test.ts +98 -0
  386. package/src/tests/openai-compatible-providers.test.ts +134 -0
  387. package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
  388. package/src/tests/opencode-adapter.test.ts +348 -3
  389. package/src/tests/opencode-billing.test.ts +28 -0
  390. package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
  391. package/src/tests/opencode-shell-env.test.ts +145 -0
  392. package/src/tests/openrouter-base-url.test.ts +101 -151
  393. package/src/tests/page-proxy.test.ts +1 -1
  394. package/src/tests/pages-browser-sdk.test.ts +76 -0
  395. package/src/tests/pages-feedback.test.ts +1 -1
  396. package/src/tests/paused-tasks-requested-by.test.ts +102 -0
  397. package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
  398. package/src/tests/pi-mono-adapter.test.ts +385 -5
  399. package/src/tests/pi-shell-env.test.ts +170 -0
  400. package/src/tests/prompt-template-remaining.test.ts +35 -0
  401. package/src/tests/rbac-engine.test.ts +11 -3
  402. package/src/tests/runner-exit-after-tasks.test.ts +0 -4
  403. package/src/tests/runner-identity-refresh.test.ts +3 -0
  404. package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
  405. package/src/tests/script-connections-sql.test.ts +675 -0
  406. package/src/tests/script-connections.test.ts +7 -1
  407. package/src/tests/scripts-http.test.ts +201 -1
  408. package/src/tests/scripts-only-gating.test.ts +2 -3
  409. package/src/tests/scripts-runtime.test.ts +58 -40
  410. package/src/tests/secret-scrubber.test.ts +86 -0
  411. package/src/tests/seed-skills-bundled-files.test.ts +45 -53
  412. package/src/tests/seed-skills-retire.test.ts +182 -0
  413. package/src/tests/send-task-requester-gate.test.ts +58 -0
  414. package/src/tests/session-cost-recompute-unit.test.ts +94 -0
  415. package/src/tests/skill-get-name-resolution.test.ts +137 -0
  416. package/src/tests/slack-channel-join.test.ts +4 -1
  417. package/src/tests/slack-external-channel-config.test.ts +65 -0
  418. package/src/tests/slack-external-channel-egress.test.ts +237 -0
  419. package/src/tests/slack-external-channel-guard.test.ts +280 -0
  420. package/src/tests/slack-external-channel-tools.test.ts +173 -0
  421. package/src/tests/slack-external-channel.test.ts +370 -0
  422. package/src/tests/slack-render-v2.test.ts +86 -10
  423. package/src/tests/sonnet-5-5-registry.test.ts +9 -1
  424. package/src/tests/spec-base-url.test.ts +16 -1
  425. package/src/tests/swarm-config-export-to-env.test.ts +267 -0
  426. package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
  427. package/src/tests/swarm-diff.test.ts +1 -1
  428. package/src/tests/task-model-effort-rerun.test.ts +164 -0
  429. package/src/tests/task-session-prompts.test.ts +132 -0
  430. package/src/tests/task-tool-manifest.test.ts +14 -0
  431. package/src/tests/task-tools-ctx.test.ts +2 -0
  432. package/src/tests/tool-annotations.test.ts +6 -6
  433. package/src/tests/ui-logs-parser.test.ts +43 -0
  434. package/src/tests/used-by-route.test.ts +6 -0
  435. package/src/tests/vendored-openapi.test.ts +16 -1
  436. package/src/tests/vercel-ai-gateway.test.ts +149 -0
  437. package/src/tests/workflow-swarm-script.test.ts +38 -0
  438. package/src/tests/workflow-wait-filter.test.ts +5 -3
  439. package/src/tools/chat-access.ts +41 -0
  440. package/src/tools/chat-open-dm.ts +59 -0
  441. package/src/tools/chat-post.ts +74 -0
  442. package/src/tools/chat-read-thread.ts +100 -0
  443. package/src/tools/chat-reply.ts +75 -0
  444. package/src/tools/create-page.ts +3 -13
  445. package/src/tools/defer-task.ts +17 -0
  446. package/src/tools/model-catalog/index.ts +2 -1
  447. package/src/tools/register-chat-channel.ts +139 -0
  448. package/src/tools/send-task.ts +24 -0
  449. package/src/tools/skills/skill-get.ts +17 -9
  450. package/src/tools/slack-post.ts +6 -0
  451. package/src/tools/slack-read.ts +8 -0
  452. package/src/tools/slack-reply.ts +6 -0
  453. package/src/tools/slack-start-thread.ts +6 -0
  454. package/src/tools/slack-update.ts +6 -0
  455. package/src/tools/slack-upload-file.ts +6 -0
  456. package/src/tools/swarm-config/get-config.ts +2 -1
  457. package/src/tools/swarm-config/list-config.ts +2 -1
  458. package/src/tools/swarm-config/set-config.ts +16 -3
  459. package/src/tools/tool-config.ts +8 -6
  460. package/src/types.ts +12 -2
  461. package/src/utils/config-env-export.ts +74 -0
  462. package/src/utils/credentials.test.ts +92 -0
  463. package/src/utils/credentials.ts +52 -4
  464. package/src/utils/harness-provider.ts +15 -6
  465. package/src/utils/node-env.ts +24 -0
  466. package/src/utils/runtime-model-catalog.ts +11 -1
  467. package/src/utils/secret-scrubber.ts +71 -2
  468. package/src/utils/task-tool-manifest.ts +19 -2
  469. package/src/workflows/executors/swarm-script.ts +1 -0
  470. package/templates/skills/agent-browser/SKILL.md +1 -1
  471. package/templates/skills/agent-browser/content.md +1 -1
  472. package/templates/skills/apps/SKILL.md +749 -0
  473. package/templates/skills/apps/content.md +60 -22
  474. package/templates/skills/chat-sdk/config.json +14 -0
  475. package/templates/skills/chat-sdk/content.md +84 -0
  476. package/templates/skills/composio-gmail/content.md +7 -0
  477. package/templates/skills/composio-google-docs/content.md +1 -1
  478. package/templates/skills/email-domain-health/config.json +14 -0
  479. package/templates/skills/email-domain-health/content.md +131 -0
  480. package/templates/skills/kv-storage/content.md +2 -2
  481. package/templates/skills/pages/content.md +8 -10
  482. package/templates/skills/qa-loom/config.json +14 -0
  483. package/templates/skills/qa-loom/content.md +187 -0
  484. package/templates/skills/qa-loom/files/build-loom.mjs +221 -0
  485. package/templates/skills/qa-loom/files/run-qa.sh +57 -0
  486. package/templates/skills/slack-interaction/content.md +4 -0
  487. package/templates/skills/swarm-extensions/content.md +2 -0
  488. package/templates/skills/swarm-scripts/SKILL.md +4 -2
  489. package/templates/skills/swarm-scripts/config.json +1 -1
  490. package/templates/skills/swarm-scripts/content.md +4 -2
  491. package/templates/skills/workflow-iterate/content.md +38 -0
  492. package/dist/artifact-eczsknc3.js +0 -3843
  493. package/dist/cli-9xsmdpdt.js +0 -56377
  494. package/dist/cli-bd957dgb.js +0 -153
  495. package/dist/cli-q51yprfq.js +0 -1104
  496. package/dist/cli-t1ze64h3.js +0 -811
  497. package/dist/index-9ch1n761.js +0 -1102
  498. package/src/artifact-sdk/index.ts +0 -2
  499. package/src/artifact-sdk/localtunnel.d.ts +0 -20
  500. package/src/artifact-sdk/port.ts +0 -12
  501. package/src/artifact-sdk/server.ts +0 -183
  502. package/src/artifact-sdk/tunnel.ts +0 -19
  503. package/src/commands/artifact.ts +0 -249
  504. package/src/http/ecosystem.ts +0 -77
  505. package/src/tests/artifact-commands.test.ts +0 -92
  506. package/src/tests/artifact-sdk.test.ts +0 -793
  507. package/src/tests/register-service-security.test.ts +0 -194
  508. package/src/tools/list-services.ts +0 -107
  509. package/src/tools/register-service.ts +0 -177
  510. package/src/tools/unregister-service.ts +0 -73
  511. package/src/tools/update-service-status.ts +0 -96
  512. package/templates/skills/artifacts/config.json +0 -14
  513. package/templates/skills/artifacts/content.md +0 -344
  514. package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
  515. package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
  516. package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
  517. package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
  518. package/dist/{azure-openai-responses-ap1gwxgr.js → azure-openai-responses-ygfreq4t.js} +5 -5
  519. package/dist/{cli-5rqrj7q0.js → cli-pw7ebjdt.js} +0 -0
  520. package/dist/{openai-codex-responses-33qhkkdy.js → openai-codex-responses-3bk0grnr.js} +4 -4
  521. package/dist/{openai-completions-s88xm3ns.js → openai-completions-5d4jpakc.js} +9 -9
  522. package/dist/{openai-responses-7xd2f2e2.js → openai-responses-krb51f59.js} +5 -5
  523. package/dist/{pi-messages-xszk613n.js → pi-messages-x9gzynm1.js} +3 -3
  524. /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
  525. /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
@@ -1,42 +1,45 @@
1
1
  import {
2
2
  piPromptSkillName
3
3
  } from "./cli-ge593j7e.js";
4
+ import {
5
+ createSwarmHooksExtension
6
+ } from "./cli-apx87jne.js";
4
7
  import {
5
8
  readPkgVersion
6
9
  } from "./cli-vv0qtfpx.js";
7
10
  import {
8
- createSwarmHooksExtension
9
- } from "./cli-bf7485pm.js";
11
+ fetchInstalledMcpServers
12
+ } from "./cli-tng3131n.js";
13
+ import"./cli-tr4sxp68.js";
14
+ import"./cli-hp1n6zq3.js";
10
15
  import {
11
16
  DefaultResourceLoader,
12
17
  ModelRuntime,
13
18
  SessionManager,
14
19
  SettingsManager,
15
20
  createAgentSession,
21
+ createBashToolDefinition,
16
22
  createCodemodeExtension,
17
23
  createMcpExtension,
18
- createToolSearchExtension
19
- } from "./cli-4nz8p1p5.js";
24
+ createToolSearchExtension,
25
+ defineTool
26
+ } from "./cli-7x0g4sn1.js";
27
+ import"./cli-c8r3kzzb.js";
28
+ import"./cli-r106725k.js";
29
+ import"./cli-pxeeyc53.js";
20
30
  import"./cli-bt8k5h3s.js";
21
- import"./cli-c5km5znr.js";
22
- import"./cli-r44t9wqc.js";
23
31
  import"./cli-ev91t6xp.js";
24
- import"./cli-pxeeyc53.js";
25
32
  import"./cli-qybkr9n3.js";
26
33
  import"./cli-vb8g5x02.js";
27
34
  import {
28
35
  getAgentDir,
29
36
  setEmbeddedQuickJSWasmPath
30
37
  } from "./cli-hd27d2md.js";
31
- import {
32
- fetchInstalledMcpServers
33
- } from "./cli-tng3131n.js";
34
- import"./cli-cf69s3ew.js";
35
- import"./cli-hp1n6zq3.js";
38
+ import"./cli-0m7wct0d.js";
36
39
  import {
37
40
  applyReasoningEffort
38
- } from "./cli-tmhsxhb8.js";
39
- import"./cli-0m7wct0d.js";
41
+ } from "./cli-n5vwg842.js";
42
+ import"./cli-jta2eyzc.js";
40
43
  import"./cli-7nxes1hs.js";
41
44
  import"./cli-104zsxba.js";
42
45
  import {
@@ -45,16 +48,16 @@ import {
45
48
  import {
46
49
  McpHttpClient
47
50
  } from "./cli-epan13p1.js";
48
- import"./cli-xczpdp9e.js";
49
- import"./cli-7jykv7ef.js";
51
+ import"./cli-se8w6wny.js";
52
+ import"./cli-e6mpjhed.js";
53
+ import"./cli-2x0e561b.js";
50
54
  import {
51
55
  getBuiltinModel,
52
56
  getBuiltinModels
53
- } from "./cli-cceskcvt.js";
57
+ } from "./cli-txqb9s38.js";
54
58
  import {
55
59
  exports_typebox
56
60
  } from "./cli-h6vtvt5c.js";
57
- import"./cli-2x0e561b.js";
58
61
  import"./cli-bsakbbkm.js";
59
62
  import"./cli-zxg80zs9.js";
60
63
  import"./cli-ydt3zkwv.js";
@@ -62,14 +65,14 @@ import"./cli-3er6gcsn.js";
62
65
  import"./cli-0xqde53b.js";
63
66
  import"./cli-pqetb83f.js";
64
67
  import"./cli-61625k3x.js";
65
- import"./cli-btbzvq95.js";
66
68
  import"./cli-1m2e086m.js";
69
+ import"./cli-btbzvq95.js";
67
70
  import"./cli-p7z6q2m6.js";
68
71
  import"./cli-wnb9b2g3.js";
69
72
  import {
70
73
  CORE_TOOLS,
71
74
  init_tool_config
72
- } from "./cli-ywm1azg9.js";
75
+ } from "./cli-hnmhtzvh.js";
73
76
  import {
74
77
  init_templates
75
78
  } from "./cli-mvzyxwg3.js";
@@ -84,7 +87,10 @@ import {
84
87
  getOpenRouterBaseUrl,
85
88
  init_openrouter_base_url
86
89
  } from "./cli-a35hzdve.js";
87
- import"./cli-014vns2y.js";
90
+ import {
91
+ init_runtime_model_catalog,
92
+ snapshotCatalogRows
93
+ } from "./cli-stfs0k5s.js";
88
94
  import"./cli-sd0mxa3c.js";
89
95
  import"./cli-w5e1d1vv.js";
90
96
  import {
@@ -93,15 +99,39 @@ import {
93
99
  } from "./cli-ej6gbxfb.js";
94
100
  import {
95
101
  init_secret_scrubber,
102
+ registerEnvSecrets,
103
+ scrubObject,
96
104
  scrubSecrets
97
- } from "./cli-d161g69q.js";
105
+ } from "./cli-p1x85d2t.js";
106
+ import {
107
+ ignoredBaseUrlVar,
108
+ init_src,
109
+ openAICompatibleKeyVars,
110
+ openAICompatibleProvider,
111
+ openAICompatibleProviders,
112
+ providerBaseUrl,
113
+ providerForModel,
114
+ providerHarnessModels,
115
+ providerKeyFromEnv,
116
+ providerKeyVars
117
+ } from "./cli-e3g5mbkz.js";
98
118
  import {
99
119
  __require,
100
120
  __toESM
101
121
  } from "./cli-bc05qbss.js";
102
122
 
103
123
  // src/providers/pi-mono-adapter.ts
104
- import { existsSync, lstatSync, symlinkSync, unlinkSync } from "node:fs";
124
+ init_src();
125
+ import {
126
+ existsSync,
127
+ lstatSync,
128
+ readFileSync,
129
+ symlinkSync,
130
+ unlinkSync,
131
+ writeFileSync
132
+ } from "node:fs";
133
+ import { mkdtemp, rm } from "node:fs/promises";
134
+ import { tmpdir } from "node:os";
105
135
  import { join } from "node:path";
106
136
 
107
137
  // node_modules/quickjs-wasi/quickjs.wasm
@@ -170,6 +200,7 @@ function classifyAwsSdkError(text) {
170
200
  // src/providers/pi-mono-adapter.ts
171
201
  init_env_flag();
172
202
  init_openrouter_base_url();
203
+ init_runtime_model_catalog();
173
204
  init_secret_scrubber();
174
205
  function modelToCredKeys(modelStr) {
175
206
  if (!modelStr)
@@ -188,6 +219,9 @@ function modelToCredKeys(modelStr) {
188
219
  return ["OPENAI_API_KEY"];
189
220
  if (provider === "google")
190
221
  return ["GOOGLE_API_KEY", "GEMINI_API_KEY"];
222
+ const direct = openAICompatibleProvider(provider);
223
+ if (direct)
224
+ return providerKeyVars(direct);
191
225
  }
192
226
  return null;
193
227
  }
@@ -282,13 +316,13 @@ async function checkPiMonoCredentials(env, opts = {}) {
282
316
  hint: `MODEL_OVERRIDE=${env.MODEL_OVERRIDE} requires one of ${keyList}; or run \`pi auth login\` to create ${authFile}.`
283
317
  };
284
318
  }
285
- if (env.ANTHROPIC_API_KEY || env.OPENROUTER_API_KEY || env.OPENAI_API_KEY) {
319
+ if (env.ANTHROPIC_API_KEY || env.OPENROUTER_API_KEY || env.OPENAI_API_KEY || openAICompatibleKeyVars().some((k) => env[k])) {
286
320
  return { ready: true, missing: [], satisfiedBy: "env" };
287
321
  }
288
322
  return {
289
323
  ready: false,
290
324
  missing: ["ANTHROPIC_API_KEY", "OPENROUTER_API_KEY", "OPENAI_API_KEY", authFile],
291
- hint: "Set one of ANTHROPIC_API_KEY / OPENROUTER_API_KEY / OPENAI_API_KEY (any one suffices), or run `pi auth login` to create ~/.pi/agent/auth.json."
325
+ hint: `Set one of ANTHROPIC_API_KEY / OPENROUTER_API_KEY / OPENAI_API_KEY (any one suffices; ${openAICompatibleProviders().map((p) => p.envVar).join(" or ")} serve only ${openAICompatibleProviders().map((p) => `${p.id}/*`).join(" or ")} models), or run \`pi auth login\` to create ~/.pi/agent/auth.json.`
292
326
  };
293
327
  }
294
328
  function jsonSchemaToTypeBox(schema) {
@@ -349,10 +383,11 @@ var PI_RUNTIME_API_KEYS = [
349
383
  ["ANTHROPIC_API_KEY", "anthropic"],
350
384
  ["OPENAI_API_KEY", "openai"],
351
385
  ["GEMINI_API_KEY", "google"],
352
- ["GOOGLE_API_KEY", "google"]
386
+ ["GOOGLE_API_KEY", "google"],
387
+ ...openAICompatibleProviders().flatMap((p) => [...p.aliasEnvVars, p.envVar].map((name) => [name, p.id]))
353
388
  ];
354
- async function createPiRuntimeAuth(env = process.env) {
355
- const modelRuntime = await ModelRuntime.create();
389
+ async function createPiRuntimeAuth(env = process.env, modelsPath) {
390
+ const modelRuntime = await ModelRuntime.create(modelsPath ? { modelsPath, modelsStorePath: join(getAgentDir(), "models-store.json") } : {});
356
391
  for (const [envKey, provider] of PI_RUNTIME_API_KEYS) {
357
392
  const apiKey = env[envKey];
358
393
  if (apiKey) {
@@ -373,84 +408,113 @@ async function readJsonFile(path) {
373
408
  return;
374
409
  }
375
410
  }
376
- async function ensureOpenRouterModelsOverride(agentDir, env = process.env) {
377
- const baseUrl = getOpenRouterBaseUrl(env);
378
- const modelsPath = join(agentDir, "models.json");
379
- const markerPath = join(agentDir, OPENROUTER_OVERRIDE_MARKER);
380
- if (baseUrl === DEFAULT_OPENROUTER_BASE_URL) {
381
- await revertOpenRouterModelsOverride(modelsPath, markerPath);
382
- return;
383
- }
384
- let existing = {};
385
- try {
386
- const file = Bun.file(modelsPath);
387
- if (await file.exists()) {
388
- existing = JSON.parse(await file.text());
389
- }
390
- } catch (err) {
391
- console.warn(`[pi-mono] ${modelsPath} is unreadable/invalid (${err instanceof Error ? err.message : err}); rewriting with the OpenRouter gateway override`);
392
- existing = {};
411
+ function customProviderModelsBlock(provider, modelId, baseUrl = provider.baseUrl) {
412
+ const zeroCost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
413
+ const listed = providerHarnessModels(provider, snapshotCatalogRows(provider.id));
414
+ const models = listed.map((m) => ({
415
+ id: m.id,
416
+ name: m.name,
417
+ reasoning: m.reasoning,
418
+ input: [...m.input],
419
+ contextWindow: m.contextWindow,
420
+ maxTokens: m.maxOutputTokens,
421
+ cost: { ...zeroCost },
422
+ compat: { ...m.compat }
423
+ }));
424
+ if (modelId && !listed.some((m) => m.id === modelId)) {
425
+ models.push({ id: modelId, name: modelId, cost: { ...zeroCost } });
393
426
  }
394
- const providers = typeof existing.providers === "object" && existing.providers !== null ? existing.providers : {};
395
- const openrouter = typeof providers.openrouter === "object" && providers.openrouter !== null ? providers.openrouter : {};
396
- const priorMarker = await readJsonFile(markerPath);
397
- const currentBaseUrl = typeof openrouter.baseUrl === "string" ? openrouter.baseUrl : undefined;
398
- const previous = priorMarker ? priorMarker.previous : currentBaseUrl !== baseUrl ? currentBaseUrl : undefined;
399
- const next = {
400
- ...existing,
401
- providers: {
402
- ...providers,
403
- openrouter: { ...openrouter, baseUrl }
404
- }
405
- };
406
- await Bun.write(modelsPath, `${JSON.stringify(next, null, 2)}
407
- `);
408
- const marker = {
427
+ return {
409
428
  baseUrl,
410
- ...previous !== undefined ? { previous } : {}
429
+ api: "openai-completions",
430
+ apiKey: `$${provider.envVar}`,
431
+ models
411
432
  };
412
- await Bun.write(markerPath, `${JSON.stringify(marker, null, 2)}
413
- `);
414
433
  }
415
- async function revertOpenRouterModelsOverride(modelsPath, markerPath) {
416
- const marker = await readJsonFile(markerPath);
417
- if (!marker)
418
- return;
419
- const removeMarker = () => Bun.file(markerPath).delete();
420
- const existing = await readJsonFile(modelsPath);
421
- if (!existing) {
422
- await removeMarker();
423
- return;
434
+ function isPlainObject(value) {
435
+ return typeof value === "object" && value !== null && !Array.isArray(value);
436
+ }
437
+ async function writeSessionModelsJson(agentDir, env = process.env, model) {
438
+ const sharedPath = join(agentDir, "models.json");
439
+ const registry = openAICompatibleProviders();
440
+ const wanted = registry.filter((p) => providerKeyFromEnv(p, env) !== undefined);
441
+ const gateway = getOpenRouterBaseUrl(env);
442
+ const marker = await readJsonFile(join(agentDir, OPENROUTER_OVERRIDE_MARKER));
443
+ if (wanted.length === 0 && gateway === DEFAULT_OPENROUTER_BASE_URL && !marker) {
444
+ return { modelsPath: undefined, dispose: async () => {} };
424
445
  }
425
- const providers = typeof existing.providers === "object" && existing.providers !== null ? { ...existing.providers } : undefined;
426
- const openrouter = providers && typeof providers.openrouter === "object" && providers.openrouter !== null ? { ...providers.openrouter } : undefined;
427
- if (!providers || !openrouter || openrouter.baseUrl !== marker.baseUrl) {
428
- await removeMarker();
429
- return;
446
+ let shared = {};
447
+ const sharedFile = Bun.file(sharedPath);
448
+ if (await sharedFile.exists()) {
449
+ try {
450
+ const parsed = JSON.parse(await sharedFile.text());
451
+ if (!isPlainObject(parsed))
452
+ throw new Error("not a JSON object");
453
+ shared = parsed;
454
+ } catch (err) {
455
+ console.warn(scrubSecrets(`[pi-mono] ${sharedPath} is unreadable/invalid (${err instanceof Error ? err.message : String(err)}); this session loads its own provider blocks only`));
456
+ }
430
457
  }
431
- if (marker.previous !== undefined) {
432
- openrouter.baseUrl = marker.previous;
433
- } else {
434
- delete openrouter.baseUrl;
458
+ const providers = isPlainObject(shared.providers) ? { ...shared.providers } : {};
459
+ const openrouter = isPlainObject(providers.openrouter) ? { ...providers.openrouter } : {};
460
+ if (gateway !== DEFAULT_OPENROUTER_BASE_URL) {
461
+ openrouter.baseUrl = gateway;
462
+ } else if (marker && openrouter.baseUrl === marker.baseUrl) {
463
+ if (marker.previous !== undefined)
464
+ openrouter.baseUrl = marker.previous;
465
+ else
466
+ delete openrouter.baseUrl;
435
467
  }
436
- if (Object.keys(openrouter).length === 0) {
437
- delete providers.openrouter;
438
- } else {
468
+ if (Object.keys(openrouter).length > 0)
439
469
  providers.openrouter = openrouter;
470
+ else
471
+ delete providers.openrouter;
472
+ const modelProvider = providerForModel(model);
473
+ const modelId = modelProvider && model ? model.slice(modelProvider.id.length + 1) : undefined;
474
+ for (const provider of wanted) {
475
+ const ignored = ignoredBaseUrlVar(provider, env);
476
+ if (ignored) {
477
+ console.warn(scrubSecrets(`[pi-mono] ${ignored} is ignored: ${provider.displayName} is only reached at ${provider.baseUrl}`));
478
+ }
479
+ const existing = providers[provider.id];
480
+ if (provider.baseUrlLocked && isPlainObject(existing)) {
481
+ if (existing.baseUrl !== provider.baseUrl || existing.api !== "openai-completions") {
482
+ console.warn(scrubSecrets(`[pi-mono] ${sharedPath} providers.${provider.id} points at ${String(existing.baseUrl)}; using ${provider.baseUrl}`));
483
+ }
484
+ providers[provider.id] = {
485
+ ...customProviderModelsBlock(provider, modelProvider?.id === provider.id ? modelId : undefined),
486
+ ...existing,
487
+ baseUrl: provider.baseUrl,
488
+ api: "openai-completions"
489
+ };
490
+ continue;
491
+ }
492
+ if (existing !== undefined) {
493
+ console.warn(scrubSecrets(`[pi-mono] ${sharedPath} already has a providers.${provider.id} block; using it as is`));
494
+ continue;
495
+ }
496
+ providers[provider.id] = customProviderModelsBlock(provider, modelProvider?.id === provider.id ? modelId : undefined, providerBaseUrl(provider, env));
440
497
  }
441
- const next = { ...existing, providers };
442
- if (Object.keys(providers).length === 0) {
498
+ const next = { ...shared, providers };
499
+ if (Object.keys(providers).length === 0)
443
500
  delete next.providers;
444
- }
445
- if (Object.keys(next).length === 0) {
446
- await Bun.file(modelsPath).delete();
447
- } else {
448
- await Bun.write(modelsPath, `${JSON.stringify(next, null, 2)}
501
+ const dir = await mkdtemp(join(tmpdir(), "pi-session-models-"));
502
+ const modelsPath = join(dir, "models.json");
503
+ await Bun.write(modelsPath, `${JSON.stringify(next, null, 2)}
449
504
  `);
505
+ return {
506
+ modelsPath,
507
+ dispose: () => rm(dir, { recursive: true, force: true })
508
+ };
509
+ }
510
+ function resolveModel(modelStr, env = process.env, modelRuntime) {
511
+ const model = resolveModelInner(modelStr, env, modelRuntime);
512
+ if (modelStr && !model) {
513
+ console.warn(scrubSecrets(`[pi-mono] Model "${modelStr}" did not resolve to a builtin or models.json model; pi will fall back to its default model`));
450
514
  }
451
- await removeMarker();
515
+ return model;
452
516
  }
453
- function resolveModel(modelStr, env = process.env) {
517
+ function resolveModelInner(modelStr, env, modelRuntime) {
454
518
  if (!modelStr)
455
519
  return;
456
520
  const lower = modelStr.toLowerCase();
@@ -481,11 +545,15 @@ function resolveModel(modelStr, env = process.env) {
481
545
  const slashIdx = modelStr.indexOf("/");
482
546
  const provider = modelStr.slice(0, slashIdx);
483
547
  const modelId = modelStr.slice(slashIdx + 1);
548
+ let builtin;
484
549
  try {
485
- return getBuiltinModel(provider, modelId);
550
+ builtin = getBuiltinModel(provider, modelId);
486
551
  } catch {
487
- return;
552
+ builtin = undefined;
488
553
  }
554
+ if (builtin)
555
+ return builtin;
556
+ return modelRuntime?.getModel(provider, modelId);
489
557
  }
490
558
  for (const provider of ["anthropic", "openai", "google"]) {
491
559
  try {
@@ -547,6 +615,24 @@ function describeAssistantTurn(message) {
547
615
  };
548
616
  }
549
617
  var TERMINAL_STORE_PROGRESS_STATUSES = new Set(["completed", "failed"]);
618
+ function scrubSessionFileSync(path) {
619
+ if (!path || !existsSync(path))
620
+ return;
621
+ const text = readFileSync(path, "utf-8");
622
+ const scrubbed = scrubSecrets(text);
623
+ if (scrubbed !== text)
624
+ writeFileSync(path, scrubbed);
625
+ }
626
+ function scrubPiSessionPersistence(sessionManager) {
627
+ const persist = sessionManager._persist.bind(sessionManager);
628
+ sessionManager._persist = (entry) => {
629
+ const file = sessionManager.getSessionFile();
630
+ const existed = file ? existsSync(file) : true;
631
+ persist(scrubObject(entry));
632
+ if (!existed)
633
+ scrubSessionFileSync(file);
634
+ };
635
+ }
550
636
 
551
637
  class PiMonoSession {
552
638
  listeners = [];
@@ -569,8 +655,10 @@ class PiMonoSession {
569
655
  terminalStoreProgressDone = false;
570
656
  emptyTurnReprompted = false;
571
657
  abortRequested = false;
572
- constructor(agentSession, config, createdSymlink, appliedReasoningEffort = null) {
658
+ disposeModels;
659
+ constructor(agentSession, config, createdSymlink, appliedReasoningEffort = null, disposeModels = async () => {}) {
573
660
  this.agentSession = agentSession;
661
+ this.disposeModels = disposeModels;
574
662
  this.config = config;
575
663
  this.createdSymlink = createdSymlink;
576
664
  this.appliedReasoningEffort = appliedReasoningEffort;
@@ -595,7 +683,7 @@ class PiMonoSession {
595
683
  return this.config.model;
596
684
  }
597
685
  emit(event) {
598
- const scrubbed = event.type === "raw_log" || event.type === "raw_stderr" ? { ...event, content: scrubSecrets(event.content) } : event;
686
+ const scrubbed = scrubObject(event);
599
687
  this.logFileHandle.write(`${JSON.stringify({ ...scrubbed, timestamp: new Date().toISOString() })}
600
688
  `);
601
689
  if (this.listeners.length > 0) {
@@ -746,7 +834,7 @@ class PiMonoSession {
746
834
  const cost = this.buildCostData(stats);
747
835
  if (this.terminalError) {
748
836
  const classification = classifyAwsSdkError(this.terminalError);
749
- const message = classification?.message ?? this.terminalError;
837
+ const message = scrubSecrets(classification?.message ?? this.terminalError);
750
838
  const category = classification?.category;
751
839
  this.emit({ type: "error", message, category });
752
840
  return {
@@ -789,7 +877,7 @@ class PiMonoSession {
789
877
  sessionId: this._sessionId,
790
878
  isError: true,
791
879
  errorCategory: awsCatchError?.category,
792
- failureReason: awsCatchError?.message ?? errorMessage,
880
+ failureReason: scrubSecrets(awsCatchError?.message ?? errorMessage),
793
881
  appliedReasoningEffort: this.appliedReasoningEffort
794
882
  };
795
883
  } finally {
@@ -799,6 +887,12 @@ class PiMonoSession {
799
887
  cleanupAgentsMdSymlink(this.config.cwd);
800
888
  }
801
889
  this.agentSession.dispose();
890
+ try {
891
+ scrubSessionFileSync(this.agentSession.sessionManager?.getSessionFile());
892
+ } catch (err) {
893
+ console.warn(scrubSecrets(`[pi-mono] could not scrub the session file: ${String(err)}`));
894
+ }
895
+ await this.disposeModels();
802
896
  }
803
897
  }
804
898
  async repromptAfterEmptyFinalTurn() {
@@ -1039,6 +1133,24 @@ function piDefaultToolAdditions(features) {
1039
1133
  additions.push("+codemode");
1040
1134
  return additions;
1041
1135
  }
1136
+ var PI_SPAWN_ENV_KEYS = [
1137
+ "PATH",
1138
+ "PI_SESSION_ID",
1139
+ "PI_SESSION_FILE",
1140
+ "PI_PROVIDER",
1141
+ "PI_MODEL",
1142
+ "PI_REASONING_LEVEL"
1143
+ ];
1144
+ function buildPiShellEnv(sessionEnv, spawnEnv) {
1145
+ const env = { ...sessionEnv };
1146
+ for (const key of PI_SPAWN_ENV_KEYS) {
1147
+ if (spawnEnv[key] !== undefined)
1148
+ env[key] = spawnEnv[key];
1149
+ else if (key !== "PATH")
1150
+ delete env[key];
1151
+ }
1152
+ return env;
1153
+ }
1042
1154
  async function createPiResourceLoader(opts) {
1043
1155
  const settingsManager = SettingsManager.create(opts.cwd, opts.agentDir, {
1044
1156
  projectTrusted: false
@@ -1109,10 +1221,25 @@ class PiMonoAdapter {
1109
1221
  console.log(`\x1B[2m[${config.role}]\x1B[0m Registering ${Object.keys(piMcpServers).length} installed MCP server(s) with pi`);
1110
1222
  }
1111
1223
  const sessionEnv = config.env ?? process.env;
1112
- await ensureOpenRouterModelsOverride(getAgentDir(), sessionEnv);
1113
- const builtinModel = resolveModel(config.model, sessionEnv);
1114
- const modelRuntime = await createPiRuntimeAuth(sessionEnv);
1115
- const model = builtinModel ? modelRuntime.getModel(builtinModel.provider, builtinModel.id) ?? builtinModel : builtinModel;
1224
+ registerEnvSecrets(sessionEnv);
1225
+ const sessionModels = await writeSessionModelsJson(getAgentDir(), sessionEnv, config.model);
1226
+ try {
1227
+ return await this.createSessionWithModels(config, sessionEnv, sessionModels, {
1228
+ createdSymlink,
1229
+ customTools,
1230
+ deferTools,
1231
+ piMcpServers
1232
+ });
1233
+ } catch (err) {
1234
+ await sessionModels.dispose();
1235
+ throw err;
1236
+ }
1237
+ }
1238
+ async createSessionWithModels(config, sessionEnv, sessionModels, setup) {
1239
+ const { createdSymlink, customTools, deferTools, piMcpServers } = setup;
1240
+ const modelRuntime = await createPiRuntimeAuth(sessionEnv, sessionModels.modelsPath);
1241
+ const resolvedModel = resolveModel(config.model, sessionEnv, modelRuntime);
1242
+ const model = resolvedModel ? modelRuntime.getModel(resolvedModel.provider, resolvedModel.id) ?? resolvedModel : resolvedModel;
1116
1243
  const swarmExtension = createSwarmHooksExtension({
1117
1244
  apiUrl: config.apiUrl,
1118
1245
  apiKey: config.apiKey,
@@ -1144,10 +1271,18 @@ class PiMonoAdapter {
1144
1271
  const reasoningApplication = applyReasoningEffort("pi", config.model, config.reasoningEffort);
1145
1272
  const reasoningSessionOptions = reasoningApplication.kind === "pi-session" ? reasoningApplication.sessionOptions : {};
1146
1273
  const appliedReasoningEffort = reasoningApplication.kind === "pi-session" ? config.reasoningEffort ?? null : null;
1274
+ const bashTool = defineTool(createBashToolDefinition(config.cwd, {
1275
+ commandPrefix: settingsManager.getShellCommandPrefix(),
1276
+ shellPath: settingsManager.getShellPath(),
1277
+ spawnHook: (context) => ({ ...context, env: buildPiShellEnv(sessionEnv, context.env) })
1278
+ }));
1279
+ const sessionManager = SessionManager.create(config.cwd);
1280
+ scrubPiSessionPersistence(sessionManager);
1147
1281
  const sessionOptions = {
1148
1282
  cwd: config.cwd,
1283
+ sessionManager,
1149
1284
  model,
1150
- customTools,
1285
+ customTools: [...customTools, bashTool],
1151
1286
  resourceLoader,
1152
1287
  settingsManager,
1153
1288
  modelRuntime,
@@ -1155,7 +1290,7 @@ class PiMonoAdapter {
1155
1290
  };
1156
1291
  const { session } = await createAgentSession(sessionOptions);
1157
1292
  await session.bindExtensions({});
1158
- return new PiMonoSession(session, config, createdSymlink, appliedReasoningEffort);
1293
+ return new PiMonoSession(session, config, createdSymlink, appliedReasoningEffort, sessionModels.dispose);
1159
1294
  }
1160
1295
  async canResume(sessionId) {
1161
1296
  try {
@@ -1179,12 +1314,13 @@ export {
1179
1314
  PiMonoSession,
1180
1315
  SWARM_TOOL_NAMESPACE,
1181
1316
  boundCodemodeTool,
1317
+ buildPiShellEnv,
1182
1318
  checkPiMonoCredentials,
1183
1319
  createBoundedCodemodeExtension,
1184
1320
  createPiResourceLoader,
1185
1321
  createPiRuntimeAuth,
1186
1322
  createSwarmMcpExtension,
1187
- ensureOpenRouterModelsOverride,
1323
+ customProviderModelsBlock,
1188
1324
  extractPiAssistantText,
1189
1325
  isCoreSwarmTool,
1190
1326
  isPiCodemodeEnabled,
@@ -1195,5 +1331,7 @@ export {
1195
1331
  piExtensionFactories,
1196
1332
  resolveModel,
1197
1333
  runBedrockSdkProbeAndEnumerate,
1198
- toPiMcpServers
1334
+ scrubPiSessionPersistence,
1335
+ toPiMcpServers,
1336
+ writeSessionModelsJson
1199
1337
  };
@@ -7,29 +7,31 @@ import {
7
7
  requestModelCatalogRefresh,
8
8
  resetModelCatalogRefreshGuardForTests,
9
9
  startPricingRefreshLoop
10
- } from "./cli-gp1rtyvk.js";
11
- import"./cli-r8smj8b8.js";
12
- import"./cli-tgpfnm6r.js";
13
- import"./cli-ywm1azg9.js";
14
- import"./cli-hsem16hb.js";
15
- import"./cli-nyhb1r6x.js";
16
- import"./cli-7mm2r1kp.js";
10
+ } from "./cli-z5jjpaxw.js";
11
+ import"./cli-r62a35ea.js";
12
+ import"./cli-ef1hg1wv.js";
13
+ import"./cli-hnmhtzvh.js";
14
+ import"./cli-cgtksawx.js";
15
+ import"./cli-s2sp957d.js";
17
16
  import"./cli-dmtrxqhg.js";
17
+ import"./cli-7mm2r1kp.js";
18
+ import"./cli-5hkm7whv.js";
18
19
  import"./cli-mvzyxwg3.js";
19
- import"./cli-tadfgd0t.js";
20
20
  import"./cli-fdvbjtbw.js";
21
21
  import"./cli-ywybs5as.js";
22
22
  import"./cli-f9w1semm.js";
23
23
  import"./cli-1a2j50m0.js";
24
24
  import"./cli-a35hzdve.js";
25
- import"./cli-014vns2y.js";
25
+ import"./cli-stfs0k5s.js";
26
26
  import"./cli-sd0mxa3c.js";
27
27
  import"./cli-w5e1d1vv.js";
28
- import"./cli-esnpehf5.js";
28
+ import"./cli-p0sg24zp.js";
29
+ import"./cli-k382tshb.js";
29
30
  import"./cli-zf8jjwex.js";
30
31
  import"./cli-gd4favx9.js";
31
32
  import"./cli-ej6gbxfb.js";
32
- import"./cli-d161g69q.js";
33
+ import"./cli-p1x85d2t.js";
34
+ import"./cli-e3g5mbkz.js";
33
35
  import"./cli-bc05qbss.js";
34
36
  export {
35
37
  MODEL_CATALOG_FORCE_COOLDOWN_MS,
@@ -1,35 +1,37 @@
1
1
  import {
2
2
  PermissionVerbSchema,
3
3
  init_rbac
4
- } from "./cli-7pz3b7x5.js";
4
+ } from "./cli-przpmdgr.js";
5
5
  import {
6
6
  getDb,
7
7
  getDbClient,
8
8
  init_db1 as init_db
9
- } from "./cli-tgpfnm6r.js";
10
- import"./cli-ywm1azg9.js";
11
- import"./cli-hsem16hb.js";
12
- import"./cli-nyhb1r6x.js";
13
- import"./cli-7mm2r1kp.js";
9
+ } from "./cli-ef1hg1wv.js";
10
+ import"./cli-hnmhtzvh.js";
11
+ import"./cli-cgtksawx.js";
12
+ import"./cli-s2sp957d.js";
14
13
  import"./cli-dmtrxqhg.js";
14
+ import"./cli-7mm2r1kp.js";
15
+ import"./cli-5hkm7whv.js";
15
16
  import"./cli-mvzyxwg3.js";
16
- import"./cli-tadfgd0t.js";
17
17
  import"./cli-fdvbjtbw.js";
18
18
  import"./cli-ywybs5as.js";
19
19
  import"./cli-f9w1semm.js";
20
20
  import"./cli-1a2j50m0.js";
21
21
  import"./cli-a35hzdve.js";
22
- import"./cli-014vns2y.js";
22
+ import"./cli-stfs0k5s.js";
23
23
  import"./cli-sd0mxa3c.js";
24
24
  import"./cli-w5e1d1vv.js";
25
- import"./cli-esnpehf5.js";
25
+ import"./cli-p0sg24zp.js";
26
+ import"./cli-k382tshb.js";
26
27
  import"./cli-zf8jjwex.js";
27
28
  import"./cli-gd4favx9.js";
28
29
  import {
29
30
  init_env_flag,
30
31
  isEnvFlagEnabled
31
32
  } from "./cli-ej6gbxfb.js";
32
- import"./cli-d161g69q.js";
33
+ import"./cli-p1x85d2t.js";
34
+ import"./cli-e3g5mbkz.js";
33
35
  import"./cli-bc05qbss.js";
34
36
 
35
37
  // src/be/rbac-roles.ts