@desplega.ai/agent-swarm 2.4.4 → 2.5.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 (382) hide show
  1. package/README.md +4 -2
  2. package/dist/{acp-adapter-thq04adh.js → acp-adapter-11gp67nr.js} +8 -6
  3. package/dist/{actions-j6ywh6x5.js → actions-8p2kze8j.js} +24 -22
  4. package/dist/{amp-adapter-k8b5xmj8.js → amp-adapter-z4qvhacj.js} +2 -2
  5. package/dist/{anthropic-messages-g6pqmqk4.js → anthropic-messages-txs190dd.js} +17 -20
  6. package/dist/{app-rb7vc02s.js → app-0qp0a2gk.js} +3 -3
  7. package/dist/{assistant-ftta1zjf.js → assistant-jedd3ktm.js} +27 -25
  8. package/dist/{azure-openai-responses-9dbmj346.js → azure-openai-responses-9kfwhmn7.js} +18 -13
  9. package/dist/{boot-reembed-xns7h5h9.js → boot-reembed-4xwq5tg0.js} +1 -1
  10. package/dist/{boot-reembed-srp6v6af.js → boot-reembed-n4wq5dd2.js} +1 -1
  11. package/dist/{boot-scrub-sweep-3qqrh2mz.js → boot-scrub-sweep-69h90xcq.js} +4 -4
  12. package/dist/{boot-seeds-9ks8hce7.js → boot-seeds-3vn0m9sg.js} +4 -4
  13. package/dist/{claude-adapter-k5ksyres.js → claude-adapter-221mvad5.js} +8 -6
  14. package/dist/{claude-managed-adapter-h2y889ge.js → claude-managed-adapter-gt6pa35d.js} +2 -2
  15. package/dist/{claude-managed-setup-n5a5eqks.js → claude-managed-setup-c3hp36ph.js} +4 -4
  16. package/dist/{claude-sdk-session-2j3j4kwn.js → claude-sdk-session-8thjsk5e.js} +9729 -9628
  17. package/dist/{cli-b9fcxxev.js → cli-007cnhm1.js} +50 -4
  18. package/dist/{cli-j4rqdf2n.js → cli-03vpq45j.js} +2 -2
  19. package/dist/{cli-amyhm3gj.js → cli-0y6f0ckq.js} +1 -1
  20. package/dist/{cli-4dg55wsk.js → cli-0z3vjrpm.js} +1 -1
  21. package/dist/{cli-pccfmtb5.js → cli-179xcyky.js} +11 -11
  22. package/dist/{cli-3r8samv3.js → cli-1f0gp9vz.js} +3 -2
  23. package/dist/{cli-hj3debgw.js → cli-1pr672hz.js} +3 -3
  24. package/dist/{cli-0bqteszy.js → cli-2nf3b08t.js} +328 -25
  25. package/dist/{cli-t7cyef5g.js → cli-36j4jnk3.js} +4 -4
  26. package/dist/{cli-er83cjbn.js → cli-3qv8naq8.js} +527 -231
  27. package/dist/cli-3zwye9sn.js +1193 -0
  28. package/dist/{cli-60cgh1rv.js → cli-459fk97x.js} +7 -7
  29. package/dist/{cli-xj0re5tm.js → cli-4w24f7z3.js} +1 -1
  30. package/dist/{cli-v3yr2gbg.js → cli-5kzk3472.js} +2198 -968
  31. package/dist/{cli-h7gc0b4r.js → cli-5m84zd2k.js} +55 -18
  32. package/dist/{cli-w6nadkh4.js → cli-5rvg1ddk.js} +5 -5
  33. package/dist/{cli-dvkmp9bt.js → cli-6ctwrf1z.js} +20 -10
  34. package/dist/{cli-9qtjfd60.js → cli-6rg2jn2y.js} +3 -2
  35. package/dist/{cli-2v045xyf.js → cli-7bwtc6yx.js} +3 -3
  36. package/dist/{cli-3cgngyd8.js → cli-7g40g8hq.js} +35 -17
  37. package/dist/{cli-q6r7t299.js → cli-92mqenkc.js} +2379 -154
  38. package/dist/{cli-cynvc9fj.js → cli-9ce2xw98.js} +8 -8
  39. package/dist/{cli-gqvh8d8a.js → cli-bgdtv62r.js} +36 -22
  40. package/dist/{cli-wxbn3yfx.js → cli-cz5nmdxt.js} +2 -2
  41. package/dist/{cli-wt645v7q.js → cli-dabehxhp.js} +1 -1
  42. package/dist/{cli-vfha21c9.js → cli-e5bxnjps.js} +2 -2
  43. package/dist/{cli-p20r8w42.js → cli-fcc5qe3f.js} +763 -268
  44. package/dist/{cli-1ephgwnq.js → cli-fes51ya2.js} +3 -3
  45. package/dist/{cli-1d70crsy.js → cli-ftmq4nvk.js} +2 -2
  46. package/dist/{cli-qkhc5aqy.js → cli-fy1jyyym.js} +13 -13
  47. package/dist/{cli-s95dknxh.js → cli-g1cw7xtt.js} +1 -1
  48. package/dist/{cli-qje9k2nh.js → cli-g9ypd5en.js} +12 -2
  49. package/dist/{cli-74c1wpm0.js → cli-gpv60278.js} +1 -1
  50. package/dist/{cli-pemywhfq.js → cli-ha9rmwgq.js} +2 -1
  51. package/dist/{cli-bnz0r3kc.js → cli-j1eghqfm.js} +5 -5
  52. package/dist/{cli-2zqpkvtt.js → cli-jpxsrxcb.js} +1 -1
  53. package/dist/{cli-ejs3m1sx.js → cli-kxpfx2xr.js} +1 -1
  54. package/dist/{cli-37yb7307.js → cli-mbfj11fq.js} +1 -1
  55. package/dist/{cli-pnp2j5zg.js → cli-mmhj8vd7.js} +2 -2
  56. package/dist/{cli-xf234ws8.js → cli-n4c8e3s5.js} +2 -0
  57. package/dist/{cli-a0kcty51.js → cli-n6kmqngw.js} +2 -2
  58. package/dist/{cli-te6b5wvg.js → cli-nnvjb17s.js} +3 -3
  59. package/dist/{cli-1dmcq2eh.js → cli-nzfnt2gs.js} +1 -1
  60. package/dist/{cli-625tb7aq.js → cli-p859hcc8.js} +2 -2
  61. package/dist/{cli-smvcw9z5.js → cli-pasyvjmm.js} +1 -1
  62. package/dist/cli-pkaqk57w.js +128 -0
  63. package/dist/{cli-8nyhf7za.js → cli-qqzmjxkf.js} +129 -105
  64. package/dist/{cli-zrwpctp4.js → cli-r25qpaxt.js} +161 -63
  65. package/dist/{cli-nc35pxb7.js → cli-rh5smt8t.js} +19 -4
  66. package/dist/{cli-qwkcwjdn.js → cli-rycdaj0a.js} +1 -1
  67. package/dist/{cli-esxerzg7.js → cli-s4sntwt4.js} +2 -2
  68. package/dist/{cli-b8k7epj1.js → cli-segs7hx9.js} +8 -8
  69. package/dist/{cli-36ckw0wx.js → cli-stxdrqs2.js} +2 -2
  70. package/dist/{cli-vdm20wej.js → cli-sy8f9705.js} +4 -4
  71. package/dist/{cli-1m17dc9d.js → cli-ta8bd7th.js} +2 -2
  72. package/dist/{cli-2y91wnbh.js → cli-we0ra057.js} +222 -10
  73. package/dist/{cli-55qmbp6z.js → cli-x21dqn18.js} +5 -5
  74. package/dist/{cli-dqb4n629.js → cli-x6vf4sad.js} +11 -11
  75. package/dist/{cli-d2mb5s8a.js → cli-x77gen2p.js} +680 -440
  76. package/dist/{cli-vq97g1jq.js → cli-xawhpgc9.js} +95 -195
  77. package/dist/{cli-82d3nkc3.js → cli-xd4eqtr2.js} +2 -2
  78. package/dist/{cli-9fhkkpj5.js → cli-xt768r5m.js} +2 -2
  79. package/dist/{cli-zrk6jxv8.js → cli-y4x8ww6s.js} +2 -2
  80. package/dist/{cli-xc27fwzg.js → cli-y9jvxfhk.js} +3 -3
  81. package/dist/{cli-44159k28.js → cli-z63a269p.js} +2 -2
  82. package/dist/{cli-sm8rses9.js → cli-zfdp01hn.js} +8 -5
  83. package/dist/cli.js +31 -29
  84. package/dist/{cloudflare-workers-ai-system-one-ch2wxfcp.js → cloudflare-workers-ai-system-one-43v9qkjk.js} +7 -2
  85. package/dist/{codex-adapter-968xwfy7.js → codex-adapter-tcg1q3jk.js} +6 -4
  86. package/dist/{codex-login-m819c41r.js → codex-login-rn7c5gxt.js} +1 -1
  87. package/dist/{codex-session-runner-ht4z99fa.js → codex-session-runner-xfx4wd9x.js} +7 -5
  88. package/dist/{commands-pcymaeg9.js → commands-ew83nj70.js} +2 -2
  89. package/dist/{controller-fpjyk46r.js → controller-gnq1k1mf.js} +4 -4
  90. package/dist/{controllers-connect-mwzx1fh6.js → controllers-connect-tw1dan9r.js} +26 -24
  91. package/dist/{cursor-adapter-cp4s2e2f.js → cursor-adapter-yq5xgfcg.js} +1 -1
  92. package/dist/{db-xsjg9jqq.js → db-7gbc53fd.js} +14 -2
  93. package/dist/{db-sgd12bt9.js → db-t86xrnes.js} +3 -3
  94. package/dist/{devin-adapter-zgqadvnm.js → devin-adapter-4ycy4vrf.js} +1 -1
  95. package/dist/{dispatcher-x0jfw2c9.js → dispatcher-64bdyhps.js} +23 -21
  96. package/dist/{docker-fkgtr75t.js → docker-nfy2gc8t.js} +2 -2
  97. package/dist/{dsh-adapter-jrq7ma7h.js → dsh-adapter-tvhc4k2d.js} +1 -1
  98. package/dist/{e2b-16d6ch39.js → e2b-9gkdhm3c.js} +2 -2
  99. package/dist/{e2b-zn0b4w5w.js → e2b-cjtf8k1z.js} +2 -2
  100. package/dist/{easter-egg-3d-5cgynaja.js → easter-egg-3d-e4qv8dxj.js} +1 -1
  101. package/dist/{event-bus-9vpk8gmq.js → event-bus-3z78ep5n.js} +1 -1
  102. package/dist/{execute-t4e6m3rw.js → execute-0xpz8950.js} +85 -23
  103. package/dist/{external-channel-8njj4h3b.js → external-channel-e9nw24zv.js} +2 -2
  104. package/dist/{google-generative-ai-bmq8gkf3.js → google-generative-ai-mk9vcpe1.js} +15 -15
  105. package/dist/{google-vertex-b1rvp52s.js → google-vertex-q580kz8k.js} +20 -20
  106. package/dist/{grok-adapter-kkr97v2f.js → grok-adapter-v82srhrx.js} +9 -7
  107. package/dist/handlers-c9ajzhbn.js +41 -0
  108. package/dist/{heartbeat-wd03zhn0.js → heartbeat-2vqs1319.js} +26 -24
  109. package/dist/{hook-xzj2ts2p.js → hook-01nk13wx.js} +7 -5
  110. package/dist/{hook-f0vghj42.js → hook-jzpheegg.js} +9 -7
  111. package/dist/{http-4hwxv62p.js → http-fc1k6ec8.js} +859 -252
  112. package/dist/index-07ef7nkm.js +42 -0
  113. package/dist/{index-g6tbb6ve.js → index-31ceyf42.js} +1 -1
  114. package/dist/index-7yts8n9s.js +43 -0
  115. package/dist/{index-c4ykd0f1.js → index-dr94zbnh.js} +13348 -11611
  116. package/dist/index-q3t40ryv.js +46 -0
  117. package/dist/{index-ww2vznkp.js → index-sepja052.js} +1 -1
  118. package/dist/{index-97q4xn03.js → index-zdycv3ja.js} +135 -79
  119. package/dist/{index-g216q6jr.js → index-zsyx51ap.js} +1 -4
  120. package/dist/{keepalive-hrh7xnr9.js → keepalive-5nh2rhmr.js} +4 -4
  121. package/dist/lead-aayq64jn.js +79 -0
  122. package/dist/{llama-cpp-classify-vv43gswy.js → llama-cpp-classify-ee7vmd7q.js} +4 -1
  123. package/dist/{maintenance-e8wnwnqx.js → maintenance-hjhzdt3k.js} +1 -1
  124. package/dist/{mistral-conversations-1medfwv7.js → mistral-conversations-sd0xf1tn.js} +13 -13
  125. package/dist/{node-3v3f08f7.js → node-jzjj7r9x.js} +10 -9
  126. package/dist/{oauth-refresh-sweep-zm0yj4sj.js → oauth-refresh-sweep-y3n1knmd.js} +3 -3
  127. package/dist/{onboard-dtwcq603.js → onboard-1zq3m7db.js} +2 -2
  128. package/dist/{openai-codex-responses-de9pvs4d.js → openai-codex-responses-79s8xnbh.js} +29 -23
  129. package/dist/{openai-completions-mtqge3nf.js → openai-completions-tdbyts0x.js} +21 -20
  130. package/dist/{openai-decisions-ygk4kkxd.js → openai-decisions-bqhnjyfz.js} +2 -1
  131. package/dist/{openai-responses-dkyng71g.js → openai-responses-dm3t5vqp.js} +26 -17
  132. package/dist/{opencode-adapter-x4tqzhkh.js → opencode-adapter-e56086m1.js} +7 -5
  133. package/dist/{openrouter-images-wvv7camj.js → openrouter-images-ssttr1y4.js} +6 -3
  134. package/dist/{otel-impl-w3fbhpn0.js → otel-impl-h9yyza47.js} +2 -2
  135. package/dist/{pi-messages-nhh1pkz2.js → pi-messages-3nf8bq1a.js} +6 -4
  136. package/dist/{pi-mono-adapter-mcfkn9vf.js → pi-mono-adapter-tzps8f38.js} +9 -37
  137. package/dist/{pricing-refresh-j38dehfs.js → pricing-refresh-nevhat8h.js} +3 -3
  138. package/dist/{rbac-roles-ae8yttq4.js → rbac-roles-4y6ngvzq.js} +1 -1
  139. package/dist/{rbac-roles-ejxx9b35.js → rbac-roles-exbg8xb6.js} +2 -2
  140. package/dist/{registry-rxw10xzg.js → registry-ajhexe44.js} +1 -1
  141. package/dist/{render-v2-n16n0phe.js → render-v2-cfsh13z3.js} +3 -3
  142. package/dist/{resume-z0fgjc38.js → resume-5s2t0dbs.js} +10 -8
  143. package/dist/{runtime-xe3aqy4x.js → runtime-bt5pkpm1.js} +1 -1
  144. package/dist/{session-access-cv3mq6mc.js → session-access-dnbyp3cn.js} +6 -4
  145. package/dist/{setup-mafhj3yt.js → setup-1wj1y77j.js} +1 -1
  146. package/dist/{typesafe-system-one-2hgpayzy.js → typesafe-system-one-bre38hvs.js} +4 -2
  147. package/dist/{virtual-modules-4r3zkc20.js → virtual-modules-mnfbh5mr.js} +8 -2
  148. package/dist/{work-objects-8b86mgjp.js → work-objects-7mg6216g.js} +26 -24
  149. package/dist/worker-nwb789mg.js +79 -0
  150. package/dist/{x-y45mthwn.js → x-pbpezr0s.js} +2 -2
  151. package/openapi.json +793 -6
  152. package/package.json +11 -11
  153. package/src/apps/catalog.generated.json +206 -4
  154. package/src/apps/page-validator.ts +13 -1
  155. package/src/assets/key.ts +17 -0
  156. package/src/azure-devops/handlers.ts +1 -1
  157. package/src/be/chunking.ts +42 -9
  158. package/src/be/db/approvals.ts +18 -0
  159. package/src/be/db/session-moves.ts +164 -0
  160. package/src/be/db/session-tree.ts +384 -0
  161. package/src/be/db/tasks/draft-text.ts +15 -0
  162. package/src/be/db/tasks/read.ts +54 -5
  163. package/src/be/db/workflow-runs.ts +96 -0
  164. package/src/be/db.ts +85 -237
  165. package/src/be/memory/index-content.ts +36 -17
  166. package/src/be/memory/providers/openai-embedding.ts +115 -61
  167. package/src/be/memory/providers/sqlite-store.ts +69 -23
  168. package/src/be/memory/reranker.ts +31 -1
  169. package/src/be/memory/search-candidates.ts +47 -0
  170. package/src/be/memory/types.ts +14 -0
  171. package/src/be/onboarding.ts +3 -0
  172. package/src/be/scripts/typecheck.ts +2 -0
  173. package/src/be/seed-scripts/catalog/heartbeat-jev-gate.ts +106 -54
  174. package/src/be/seed-scripts/index.ts +2 -2
  175. package/src/be/skill-sync.ts +43 -2
  176. package/src/be/swarm-config-guard.ts +25 -1
  177. package/src/be/task-attachment-store.ts +30 -0
  178. package/src/bitbucket/api.ts +81 -0
  179. package/src/bitbucket/auth.ts +64 -0
  180. package/src/bitbucket/handlers.ts +434 -0
  181. package/src/bitbucket/index.ts +28 -0
  182. package/src/bitbucket/templates.ts +134 -0
  183. package/src/bitbucket/types.ts +65 -0
  184. package/src/commands/runner.ts +55 -3
  185. package/src/e2b/env.ts +1 -0
  186. package/src/extensions/catalog.generated.json +4 -4
  187. package/src/extensions/contract-types.generated.ts +1 -1
  188. package/src/extensions/contract.ts +9 -2
  189. package/src/extensions/post-bridge.ts +1 -0
  190. package/src/fs/provider.ts +13 -1
  191. package/src/github/handlers.ts +6 -6
  192. package/src/gitlab/handlers.ts +5 -5
  193. package/src/heartbeat/heartbeat.ts +31 -11
  194. package/src/http/assets.ts +14 -2
  195. package/src/http/core.ts +12 -0
  196. package/src/http/fs.ts +54 -34
  197. package/src/http/index.ts +4 -0
  198. package/src/http/mcp-body.ts +37 -0
  199. package/src/http/mcp-user.ts +3 -5
  200. package/src/http/mcp.ts +6 -7
  201. package/src/http/memory.ts +26 -15
  202. package/src/http/onboarding.ts +1 -0
  203. package/src/http/page-proxy.ts +61 -5
  204. package/src/http/pages-public.ts +27 -44
  205. package/src/http/pages.ts +4 -4
  206. package/src/http/script-runs.ts +2 -0
  207. package/src/http/sessions.ts +366 -12
  208. package/src/http/skills.ts +48 -1
  209. package/src/http/tasks.ts +1 -1
  210. package/src/http/users.ts +13 -1
  211. package/src/http/webhooks.ts +141 -0
  212. package/src/integrations/chat-sdk/adapters.ts +24 -4
  213. package/src/integrations/chat-sdk/attachments.ts +90 -12
  214. package/src/integrations/chat-sdk/facts.ts +138 -0
  215. package/src/integrations/chat-sdk/inbound.ts +156 -8
  216. package/src/integrations/chat-sdk/limits.ts +24 -0
  217. package/src/integrations/chat-sdk/outbound-files.ts +186 -0
  218. package/src/integrations/chat-sdk/outbound.ts +272 -5
  219. package/src/integrations/chat-sdk/relay.ts +4 -1
  220. package/src/integrations/chat-sdk/router.ts +28 -2
  221. package/src/integrations/chat-sdk/steering.ts +9 -0
  222. package/src/integrations/chat-sdk/templates.ts +14 -0
  223. package/src/integrations/chat-sdk/thread-buffer.ts +4 -0
  224. package/src/mcp-limits.ts +20 -0
  225. package/src/pages/browser-sdk.ts +8 -3
  226. package/src/pages/feedback-overlay.ts +1 -1
  227. package/src/providers/acp-targets.ts +1 -1
  228. package/src/providers/amp-adapter.ts +1 -1
  229. package/src/providers/codex-adapter.ts +106 -119
  230. package/src/providers/codex-agents-md.ts +35 -229
  231. package/src/providers/cursor-adapter.ts +1 -1
  232. package/src/providers/pi-mono-adapter.ts +5 -53
  233. package/src/realtime/transport.ts +1 -2
  234. package/src/script-workflows/workflow-ctx.ts +1 -0
  235. package/src/scripts-runtime/types/stdlib.d.ts +2 -0
  236. package/src/scripts-runtime/types/swarm-extension.d.ts +14 -4
  237. package/src/scripts-runtime/types/swarm-sdk.d.ts +2 -0
  238. package/src/server-user.ts +2 -0
  239. package/src/server.ts +2 -0
  240. package/src/slack/assistant.ts +2 -2
  241. package/src/slack/files.ts +2 -0
  242. package/src/slack/handlers.test.ts +158 -0
  243. package/src/slack/handlers.ts +23 -32
  244. package/src/slack/inbound-files.ts +39 -6
  245. package/src/slack/thread-buffer.ts +2 -1
  246. package/src/tasks/context-key.ts +61 -1
  247. package/src/tasks/task-terminal-effects.ts +21 -17
  248. package/src/tests/apps-card-grid.test.ts +197 -0
  249. package/src/tests/apps-catalog-additions.test.ts +120 -0
  250. package/src/tests/apps-tree.test.ts +129 -0
  251. package/src/tests/bitbucket-auth.test.ts +156 -0
  252. package/src/tests/bitbucket-handlers.test.ts +425 -0
  253. package/src/tests/bitbucket-webhook.test.ts +220 -0
  254. package/src/tests/chat-sdk-attachments-reply.test.ts +52 -0
  255. package/src/tests/chat-sdk-config.test.ts +11 -0
  256. package/src/tests/chat-sdk-facts.test.ts +23 -0
  257. package/src/tests/chat-sdk-inbound.test.ts +597 -4
  258. package/src/tests/chat-sdk-outbound-files.test.ts +652 -0
  259. package/src/tests/chat-sdk-telegram-markdown.test.ts +92 -0
  260. package/src/tests/codex-adapter.test.ts +167 -242
  261. package/src/tests/config-api-only-keys.test.ts +9 -0
  262. package/src/tests/context-key.test.ts +50 -0
  263. package/src/tests/core-auth.test.ts +5 -0
  264. package/src/tests/cors-allowlist.test.ts +1 -1
  265. package/src/tests/db-task-read-contract.test.ts +7 -0
  266. package/src/tests/db-task-write-contract.test.ts +6 -0
  267. package/src/tests/docs-index-footprint.test.js +3 -3
  268. package/src/tests/extensions-example-slack-reply-gate.test.ts +262 -91
  269. package/src/tests/fixtures/bitbucket/pullrequest-comment-created-inline.json +174 -0
  270. package/src/tests/fixtures/bitbucket/pullrequest-comment-created.json +170 -0
  271. package/src/tests/fixtures/bitbucket/pullrequest-created-mention.json +132 -0
  272. package/src/tests/fixtures/bitbucket/pullrequest-created-reviewer.json +140 -0
  273. package/src/tests/fixtures/bitbucket/pullrequest-fulfilled.json +134 -0
  274. package/src/tests/fixtures/bitbucket/pullrequest-rejected.json +133 -0
  275. package/src/tests/generate-mcp-docs.test.ts +101 -0
  276. package/src/tests/gitlab-handlers.test.ts +3 -3
  277. package/src/tests/gitlab-vcs-db.test.ts +4 -4
  278. package/src/tests/heartbeat-checklist.test.ts +33 -0
  279. package/src/tests/heartbeat-jev-gate-credentials.test.ts +44 -0
  280. package/src/tests/heartbeat-jev-gate.test.ts +242 -1
  281. package/src/tests/integration-disable-flags.test.ts +36 -0
  282. package/src/tests/kv-page-proxy.test.ts +91 -5
  283. package/src/tests/launch-password-rejection.test.ts +2 -2
  284. package/src/tests/mcp-input-caps.test.ts +294 -0
  285. package/src/tests/mcp-tools.test.ts +1 -1
  286. package/src/tests/memory-chunked-search-starvation.test.ts +200 -0
  287. package/src/tests/memory-embedding-input-cap.test.ts +114 -0
  288. package/src/tests/memory.test.ts +14 -0
  289. package/src/tests/onboarding.test.ts +12 -0
  290. package/src/tests/page-guest-session.test.ts +19 -8
  291. package/src/tests/page-proxy-authed.test.ts +1 -1
  292. package/src/tests/page-proxy.test.ts +17 -10
  293. package/src/tests/page-session.test.ts +102 -1
  294. package/src/tests/pages-authed-mode.test.ts +82 -12
  295. package/src/tests/pages-password-mode.test.ts +5 -5
  296. package/src/tests/pi-codemode.test.ts +8 -2
  297. package/src/tests/preload-env.test.ts +57 -0
  298. package/src/tests/preload.ts +21 -0
  299. package/src/tests/prompt-template-remaining.test.ts +38 -0
  300. package/src/tests/realtime-transport.test.ts +13 -7
  301. package/src/tests/run-root-coverage.test.ts +39 -0
  302. package/src/tests/runner-bitbucket-vcs.test.ts +191 -0
  303. package/src/tests/runner-skills-refresh.test.ts +58 -0
  304. package/src/tests/script-runs-http.test.ts +84 -0
  305. package/src/tests/scripts-http.test.ts +10 -1
  306. package/src/tests/secret-scrubber.test.ts +15 -0
  307. package/src/tests/sessions-move.test.ts +576 -0
  308. package/src/tests/sessions-tree.test.ts +493 -0
  309. package/src/tests/skill-files-http.test.ts +50 -0
  310. package/src/tests/skills-bundle.test.ts +99 -0
  311. package/src/tests/swarm-config-export-to-env.test.ts +23 -3
  312. package/src/tests/task-audio-transcription.test.ts +299 -0
  313. package/src/tests/task-completion-memory-chunking.test.ts +434 -0
  314. package/src/tests/task-terminal-secret-scrub.test.ts +6 -1
  315. package/src/tests/transcription.test.ts +299 -0
  316. package/src/tests/vcs-bitbucket.test.ts +91 -0
  317. package/src/tests/vcs-provider-isolation.test.ts +123 -0
  318. package/src/tests/vcs-provider.test.ts +16 -1
  319. package/src/tests/vcs-tracking.test.ts +3 -3
  320. package/src/tests/workflow-foreach-bodies.test.ts +637 -0
  321. package/src/tests/workflow-foreach-concurrency.test.ts +342 -0
  322. package/src/tests/workflow-foreach-retry.test.ts +537 -0
  323. package/src/tests/workflow-foreach.test.ts +44 -23
  324. package/src/tests/workflow-step-claims.test.ts +6 -6
  325. package/src/tests/workflow-system-one-decision-providers.test.ts +98 -1
  326. package/src/tests/workflow-system-one-decision.test.ts +2 -1
  327. package/src/tests/workflow-tla-races.test.ts +2 -2
  328. package/src/tools/chat-access.ts +10 -0
  329. package/src/tools/chat-post.ts +31 -11
  330. package/src/tools/chat-reply.ts +32 -10
  331. package/src/tools/memory-search.ts +3 -1
  332. package/src/tools/script-delete.ts +1 -1
  333. package/src/tools/system-one-decide.ts +17 -4
  334. package/src/tools/workflows/create-workflow.ts +5 -3
  335. package/src/types.ts +9 -2
  336. package/src/utils/config-env-export.ts +4 -1
  337. package/src/utils/page-session.ts +133 -20
  338. package/src/utils/secret-scrubber.ts +4 -0
  339. package/src/utils/skills-refresh.ts +83 -43
  340. package/src/utils/transcription.ts +246 -0
  341. package/src/vcs/bitbucket.ts +58 -0
  342. package/src/vcs/index.ts +2 -0
  343. package/src/vcs/types.ts +2 -2
  344. package/src/workflows/approval-resolution.ts +4 -1
  345. package/src/workflows/checkpoint.ts +9 -1
  346. package/src/workflows/constants.ts +3 -0
  347. package/src/workflows/definition.ts +48 -17
  348. package/src/workflows/engine.ts +25 -15
  349. package/src/workflows/executors/foreach.ts +45 -99
  350. package/src/workflows/executors/system-one-decision.ts +28 -7
  351. package/src/workflows/executors/system-one-providers.ts +39 -4
  352. package/src/workflows/foreach-body.ts +146 -0
  353. package/src/workflows/foreach-driver.ts +552 -0
  354. package/src/workflows/foreach-join.ts +206 -7
  355. package/src/workflows/node-timeout.ts +21 -0
  356. package/src/workflows/recovery.ts +68 -3
  357. package/src/workflows/resume.ts +221 -43
  358. package/src/workflows/retry-poller.ts +39 -24
  359. package/src/workflows/step-input.ts +59 -0
  360. package/src/workflows/task-step-routing.ts +114 -56
  361. package/templates/extensions/slack-reply-gate/README.md +24 -22
  362. package/templates/extensions/slack-reply-gate/hooks.ts +146 -95
  363. package/templates/extensions/slack-reply-gate/manifest.json +2 -2
  364. package/templates/skills/apps/SKILL.md +28 -6
  365. package/templates/skills/apps/content.md +28 -6
  366. package/templates/skills/chat-sdk/content.md +6 -2
  367. package/templates/skills/code-quality/content.md +2 -1
  368. package/templates/skills/heartbeat-runbook/content.md +5 -5
  369. package/templates/skills/pages/content.md +6 -4
  370. package/templates/skills/slack-interaction/content.md +5 -0
  371. package/templates/skills/swarm-scripts/SKILL.md +2 -2
  372. package/templates/skills/swarm-scripts/content.md +2 -2
  373. package/templates/skills/work-on-task/SKILL.md +1 -1
  374. package/templates/skills/work-on-task/content.md +1 -1
  375. package/dist/cli-51y09c6p.js +0 -2657
  376. package/dist/cli-yw91rnmw.js +0 -13
  377. package/dist/handlers-0pvee9nw.js +0 -39
  378. package/dist/index-gdh8jrdm.js +0 -43
  379. package/dist/index-hg0x2cdv.js +0 -40
  380. package/dist/index-thm0y6a8.js +0 -41
  381. package/dist/lead-ee8vazz2.js +0 -77
  382. package/dist/worker-16s75hm5.js +0 -77
@@ -3,13 +3,14 @@ import {
3
3
  requiredNumber,
4
4
  postClassifierRequest,
5
5
  parseClassifierUsage
6
- } from "./cli-sm8rses9.js";
6
+ } from "./cli-zfdp01hn.js";
7
7
  import {
8
8
  normalizeProviderError,
9
9
  formatProviderError
10
10
  } from "./cli-bh87e0rh.js";
11
11
 
12
12
  // node_modules/@earendil-works/pi-ai/dist/api/system-one-shared.js
13
+ var IMAGE_OPT_IN_HEADERS = { "TypeSafe-Danger-Zone-Images": "true" };
13
14
  function probabilities(label, value, id) {
14
15
  if (!isRecord(value))
15
16
  throw new Error(`${label} returned invalid probabilities for ${id}`);
@@ -64,6 +65,40 @@ function parseAnswers(label, value, context) {
64
65
  }
65
66
  return Object.fromEntries(answers);
66
67
  }
68
+ var ASSET_FORMATS = { "image/png": "png", "image/jpeg": "jpeg" };
69
+ var DATA_URL_TYPES = new Set(["image/png", "image/jpeg", "image/webp"]);
70
+ var MAX_DATA_URL_IMAGES = 4;
71
+ function addImages(label, model, input, images, request) {
72
+ if (input === "images") {
73
+ if (images.length > MAX_DATA_URL_IMAGES) {
74
+ throw new Error(`${label} accepts at most ${MAX_DATA_URL_IMAGES} images for ${model.id}, got ${images.length}`);
75
+ }
76
+ request.images = images.map((image) => {
77
+ if (!DATA_URL_TYPES.has(image.mimeType)) {
78
+ throw new Error(`${label} accepts PNG, JPEG, and WebP images for ${model.id}, got ${image.mimeType}`);
79
+ }
80
+ return `data:${image.mimeType};base64,${image.data}`;
81
+ });
82
+ return;
83
+ }
84
+ if (input === "state-image-urls") {
85
+ const parts = images.map((image) => ({
86
+ type: "image_url",
87
+ image_url: { url: `data:${image.mimeType};base64,${image.data}` }
88
+ }));
89
+ request.state = [...parts, request.state];
90
+ return;
91
+ }
92
+ const assets = {};
93
+ images.forEach((image, index) => {
94
+ const format = ASSET_FORMATS[image.mimeType];
95
+ if (!format)
96
+ throw new Error(`${label} accepts PNG and JPEG images for ${model.id}, got ${image.mimeType}`);
97
+ assets[`<image-${index + 1}>`] = { type: "image", format, data_base64: image.data };
98
+ });
99
+ request.assets = assets;
100
+ request.state = [...Object.keys(assets), request.state];
101
+ }
67
102
  function wireRequest(context) {
68
103
  return {
69
104
  state: context.state,
@@ -85,9 +120,20 @@ async function classifySystemOne(transport, model, context, options) {
85
120
  try {
86
121
  if (model.api !== transport.api)
87
122
  throw new Error(`Unsupported classifier API: ${model.api}`);
88
- if (context.images?.length)
89
- throw new Error(`${transport.label} does not support image input`);
90
- const body = await postClassifierRequest(transport.label, transport.url(model), model, transport.payload(model, wireRequest(context)), options);
123
+ const request = wireRequest(context);
124
+ let requestOptions = options;
125
+ if (context.images?.length) {
126
+ if (!model.input.includes("image")) {
127
+ throw new Error(`${transport.label} does not support image input for ${model.id}`);
128
+ }
129
+ const detected = transport.detectCompat(model);
130
+ const imageInput = model.compat?.imageInput ?? detected.imageInput;
131
+ addImages(transport.label, model, imageInput, context.images, request);
132
+ if (model.compat?.sendImageOptInHeader ?? detected.sendImageOptInHeader) {
133
+ requestOptions = { ...options, headers: { ...IMAGE_OPT_IN_HEADERS, ...options?.headers } };
134
+ }
135
+ }
136
+ const body = await postClassifierRequest(transport.label, transport.url(model), model, transport.payload(model, request), requestOptions);
91
137
  const result = transport.output(body);
92
138
  const usage = parseClassifierUsage(result.usage, model);
93
139
  if (usage)
@@ -9,7 +9,7 @@ import {
9
9
  loadMcpConfig,
10
10
  addMcpServerConfig,
11
11
  removeMcpServerConfig
12
- } from "./cli-d2mb5s8a.js";
12
+ } from "./cli-x77gen2p.js";
13
13
  import {
14
14
  McpOAuthCredentialStore2,
15
15
  McpSignInCancelledError2,
@@ -17,7 +17,7 @@ import {
17
17
  McpServerLog2,
18
18
  createDefaultTransport2,
19
19
  McpServerConnection2
20
- } from "./cli-wxbn3yfx.js";
20
+ } from "./cli-cz5nmdxt.js";
21
21
 
22
22
  // node_modules/@earendil-works/pi-coding-agent/dist/extensions/mcp/cli.js
23
23
  import { existsSync } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getDb2,
3
3
  init_db3
4
- } from "./cli-p20r8w42.js";
4
+ } from "./cli-fcc5qe3f.js";
5
5
  import {
6
6
  openAICompatibleProviderIds,
7
7
  withRegistryCatalogSections,
@@ -2,7 +2,7 @@ import {
2
2
  getDb2,
3
3
  getDbClient2,
4
4
  init_db3
5
- } from "./cli-p20r8w42.js";
5
+ } from "./cli-fcc5qe3f.js";
6
6
  import {
7
7
  PermissionVerbSchema,
8
8
  init_rbac
@@ -7,7 +7,7 @@ var package_default;
7
7
  var init_package = __esm(() => {
8
8
  package_default = {
9
9
  name: "@desplega.ai/agent-swarm",
10
- version: "2.4.4",
10
+ version: "2.5.0",
11
11
  description: "agent-swarm.dev — an open-source operating system for AI work: a lead agent breaks goals into tasks, routes them to specialized workers such as Claude Code or Codex, runs each worker in an isolated container, and preserves shared memory, tools, schedules, and review gates so delegated work compounds across sessions.",
12
12
  keywords: [
13
13
  "agent-swarm.dev",
@@ -186,8 +186,8 @@ var init_package = __esm(() => {
186
186
  "@desplega/model-catalog": "workspace:*",
187
187
  "@desplega/model-routing": "workspace:*",
188
188
  "@faker-js/faker": "^10.4.0",
189
- "@opencode/plugin": "2.1.1",
190
- "@opencode/sdk": "2.1.1",
189
+ "@opencode/plugin": "2.1.3",
190
+ "@opencode/sdk": "2.1.3",
191
191
  "@oxlint/plugins": "1.78.0",
192
192
  "@types/bun": "latest",
193
193
  "dependency-cruiser": "^18.0.0",
@@ -205,26 +205,26 @@ var init_package = __esm(() => {
205
205
  bun: ">=1.3.12"
206
206
  },
207
207
  dependencies: {
208
- "@agentclientprotocol/sdk": "2.0.0",
208
+ "@agentclientprotocol/sdk": "2.0.1",
209
209
  "@ai-sdk/openai": "^3.0.41",
210
- "@anthropic-ai/claude-agent-sdk": "0.3.304",
211
- "@anthropic-ai/sdk": "^0.135.0",
210
+ "@anthropic-ai/claude-agent-sdk": "0.3.308",
211
+ "@anthropic-ai/sdk": "^1.1.0",
212
212
  "@asteasolutions/zod-to-openapi": "^8.0.0",
213
213
  "@aws-sdk/client-bedrock": "3.1048.0",
214
214
  "@chat-adapter/discord": "4.41.1",
215
215
  "@chat-adapter/slack": "4.41.1",
216
216
  "@chat-adapter/teams": "4.41.1",
217
217
  "@chat-adapter/telegram": "4.41.1",
218
- "@cursor/sdk": "1.0.38",
218
+ "@cursor/sdk": "1.0.40",
219
219
  "@desplega.ai/agent-fs-just-bash": "0.18.5",
220
220
  "@desplega.ai/business-use": "^0.4.2",
221
- "@earendil-works/pi-agent-core": "^1.3.0",
222
- "@earendil-works/pi-ai": "^1.3.0",
223
- "@earendil-works/pi-coding-agent": "^1.3.0",
221
+ "@earendil-works/pi-agent-core": "^1.4.0",
222
+ "@earendil-works/pi-ai": "^1.4.0",
223
+ "@earendil-works/pi-coding-agent": "^1.4.0",
224
224
  "@inkjs/ui": "^2.0.0",
225
225
  "@jitl/quickjs-singlefile-mjs-release-sync": "0.32.0",
226
226
  "@linear/sdk": "^77.0.0",
227
- "@modelcontextprotocol/sdk": "1.31.0",
227
+ "@modelcontextprotocol/sdk": "1.32.1",
228
228
  "@openai/codex": "0.163.0",
229
229
  "@openfort/openfort-node": "^0.9.1",
230
230
  "@opentelemetry/api": "^1.9.1",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getSystemMessageText,
3
3
  clampThinkingLevel
4
- } from "./cli-0bqteszy.js";
4
+ } from "./cli-2nf3b08t.js";
5
5
 
6
6
  // node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js
7
7
  class UnsupportedStrictJsonSchemaError extends Error {
@@ -332,13 +332,14 @@ function buildBaseOptions(model, context, options, apiKey) {
332
332
  samplingParams,
333
333
  maxTokens: clampMaxTokensToContext(model, context, options?.maxTokens ?? model.maxTokens),
334
334
  signal: options?.signal,
335
- telemetryContext: options?.telemetryContext,
335
+ telemetry: options?.telemetry,
336
336
  apiKey: apiKey || options?.apiKey,
337
337
  fetch: options?.fetch,
338
338
  transport: options?.transport,
339
339
  cacheRetention: options?.cacheRetention,
340
340
  sessionId: options?.sessionId,
341
341
  headers: options?.headers,
342
+ identity: options?.identity,
342
343
  onPayload: options?.onPayload,
343
344
  onResponse: options?.onResponse,
344
345
  onProviderStreamEvent: options?.onProviderStreamEvent,
@@ -6,11 +6,11 @@ import {
6
6
  getResolvedConfig2,
7
7
  getAllUsers2,
8
8
  init_db3
9
- } from "./cli-p20r8w42.js";
9
+ } from "./cli-fcc5qe3f.js";
10
10
  import {
11
11
  scrubSecrets,
12
12
  init_secret_scrubber
13
- } from "./cli-xf234ws8.js";
13
+ } from "./cli-n4c8e3s5.js";
14
14
 
15
15
  // src/be/seed/agent-fs-provision.ts
16
16
  init_secret_scrubber();
@@ -122,7 +122,7 @@ async function ensureAgentFsSharedProvisioning(options) {
122
122
  await upsertSwarmConfig2({ scope: "global", key, value, isSecret: false, description });
123
123
  }
124
124
  process.env.AGENT_FS_API_URL = apiUrl;
125
- const { resetFileStorageProvider } = await import("./registry-rxw10xzg.js");
125
+ const { resetFileStorageProvider } = await import("./registry-ajhexe44.js");
126
126
  resetFileStorageProvider();
127
127
  return { apiUrl, apiKey, orgId, driveId, authHeaders };
128
128
  }
@@ -2,6 +2,29 @@ import {
2
2
  AssistantMessageEventStream,
3
3
  formatThrownValue
4
4
  } from "./cli-m6m1bvtp.js";
5
+ import {
6
+ mergeClientIdentity,
7
+ getOpenCodeSessionHeaders
8
+ } from "./cli-pkaqk57w.js";
9
+ import {
10
+ __export
11
+ } from "./cli-242037k3.js";
12
+
13
+ // node_modules/@earendil-works/pi-ai/dist/models.js
14
+ var exports_models = {};
15
+ __export(exports_models, {
16
+ AI_TELEMETRY_SCHEMA: () => AI_TELEMETRY_SCHEMA,
17
+ ModelsError: () => ModelsError,
18
+ calculateCost: () => calculateCost,
19
+ clampThinkingLevel: () => clampThinkingLevel,
20
+ createModels: () => createModels,
21
+ createProvider: () => createProvider,
22
+ getModelType: () => getModelType,
23
+ getSupportedThinkingLevels: () => getSupportedThinkingLevels,
24
+ hasApi: () => hasApi,
25
+ isModelType: () => isModelType,
26
+ modelsAreEqual: () => modelsAreEqual
27
+ });
5
28
 
6
29
  // node_modules/@earendil-works/pi-ai/dist/api/lazy.js
7
30
  function createSetupErrorMessage(model, error, timestamp) {
@@ -27,19 +50,38 @@ function createSetupErrorMessage(model, error, timestamp) {
27
50
  function hasResult(source) {
28
51
  return typeof source.result === "function";
29
52
  }
30
- async function forwardStream(target, source) {
53
+ async function forwardStream(target, source, observer, observeResult) {
54
+ let result;
31
55
  for await (const event of source) {
32
56
  target.push(event);
33
- }
34
- target.end(hasResult(source) ? await source.result() : undefined);
57
+ observer?.onEvent?.(event);
58
+ if (event.type === "done")
59
+ result = event.message;
60
+ else if (event.type === "error")
61
+ result = event.error;
62
+ }
63
+ if (hasResult(source))
64
+ result = await source.result();
65
+ target.end(result);
66
+ observeResult(result);
35
67
  }
36
- function lazyStream(model, setup) {
68
+ function lazyStream(model, setup, observer) {
37
69
  const startedAt = Date.now();
38
70
  const outer = new AssistantMessageEventStream;
39
- setup().then((inner) => forwardStream(outer, inner)).catch((error) => {
71
+ let observedResult = false;
72
+ const observeResult = (result) => {
73
+ if (observedResult)
74
+ return;
75
+ observedResult = true;
76
+ observer?.onResult?.(result);
77
+ };
78
+ setup().then((inner) => forwardStream(outer, inner, observer, observeResult)).catch((error) => {
40
79
  const message = createSetupErrorMessage(model, error, startedAt);
41
- outer.push({ type: "error", reason: "error", error: message });
80
+ const event = { type: "error", reason: "error", error: message };
81
+ outer.push(event);
82
+ observer?.onEvent?.(event);
42
83
  outer.end(message);
84
+ observeResult(message);
43
85
  });
44
86
  return outer;
45
87
  }
@@ -331,6 +373,251 @@ class InMemoryModelsStore {
331
373
  }
332
374
  }
333
375
 
376
+ // node_modules/@earendil-works/pi-telemetry/dist/metrics.js
377
+ function createTypedMetrics(metrics, schemas) {
378
+ const definitions = new Map;
379
+ for (const schema of schemas) {
380
+ for (const [name, definition] of Object.entries(schema.metrics ?? {}))
381
+ definitions.set(name, definition);
382
+ }
383
+ return {
384
+ counter: (name) => metrics.counter(name, definitions.get(name)),
385
+ upDownCounter: (name) => metrics.upDownCounter(name, definitions.get(name)),
386
+ histogram: (name) => metrics.histogram(name, definitions.get(name))
387
+ };
388
+ }
389
+ // node_modules/@earendil-works/pi-telemetry/dist/noop.js
390
+ async function startNoopSpan(_options, callback) {
391
+ return callback(noopTelemetrySpan);
392
+ }
393
+ var noopCounter = Object.freeze({ add: () => {} });
394
+ var noopUpDownCounter = Object.freeze({ add: () => {} });
395
+ var noopHistogram = Object.freeze({ record: () => {} });
396
+ var NOOP_TELEMETRY_METRICS = Object.freeze({
397
+ counter: () => noopCounter,
398
+ upDownCounter: () => noopUpDownCounter,
399
+ histogram: () => noopHistogram
400
+ });
401
+ var NOOP_TELEMETRY_PROPAGATION = Object.freeze({
402
+ inject: () => {
403
+ return;
404
+ },
405
+ extract: () => NOOP_TELEMETRY_CONTEXT
406
+ });
407
+ var noopTelemetrySpan = {
408
+ metrics: NOOP_TELEMETRY_METRICS,
409
+ propagation: NOOP_TELEMETRY_PROPAGATION,
410
+ startSpan: startNoopSpan,
411
+ addLink: () => {},
412
+ addEvent: () => {},
413
+ setAttributes: () => {},
414
+ setStatus: () => {}
415
+ };
416
+ Object.freeze(noopTelemetrySpan);
417
+ var NOOP_TELEMETRY_CONTEXT = noopTelemetrySpan;
418
+ // node_modules/@earendil-works/pi-telemetry/dist/memory.js
419
+ var contextCarriers = new WeakMap;
420
+
421
+ // node_modules/@earendil-works/pi-telemetry/dist/index.js
422
+ function defineTelemetrySchema(schema) {
423
+ return schema;
424
+ }
425
+ function bindTypedSpanStarter(telemetryContext) {
426
+ const startSpan = (name, attributes, callback) => telemetryContext.startSpan({ name, attributes }, (span) => callback(span, bindTypedSpanStarter(span)));
427
+ return startSpan;
428
+ }
429
+ function createTypedSpanStarter(telemetryContext, _schemas) {
430
+ return bindTypedSpanStarter(telemetryContext);
431
+ }
432
+
433
+ // node_modules/@earendil-works/pi-ai/dist/telemetry.js
434
+ var provider = { type: "string", description: "Provider identifier.", required: true };
435
+ var model = { type: "string", description: "Requested model identifier.", required: true };
436
+ var stop = {
437
+ type: "string",
438
+ description: "Normalized stop reason.",
439
+ values: ["pending", "stop", "length", "toolUse", "error", "aborted", "deferred"]
440
+ };
441
+ var request = {
442
+ description: "One logical model request, including authentication and provider setup.",
443
+ parents: { kind: "any" },
444
+ startAttributes: {
445
+ provider,
446
+ api: { type: "string", description: "API identifier.", required: true },
447
+ model,
448
+ reasoning: { type: "string", description: "Scalar requested reasoning level.", required: false }
449
+ },
450
+ endAttributes: {
451
+ stop,
452
+ "usage.input": { type: "number", description: "Uncached input tokens." },
453
+ "usage.output": { type: "number", description: "Output tokens." },
454
+ "usage.cache_read": { type: "number", description: "Cache-read tokens." },
455
+ "usage.cache_write": { type: "number", description: "Cache-write tokens." },
456
+ "cost.total": { type: "number", description: "Total request cost in USD." },
457
+ "response.id": { type: "string", description: "Provider response identifier.", cardinality: "high" }
458
+ },
459
+ events: {
460
+ "pi.ai.first_chunk": { description: "First normalized stream event delivered.", attributes: {} },
461
+ "pi.ai.block": {
462
+ description: "A completed content block; content is never recorded.",
463
+ attributes: {
464
+ type: {
465
+ type: "string",
466
+ description: "Block kind.",
467
+ values: ["text", "thinking", "tool_call"],
468
+ required: true
469
+ },
470
+ index: { type: "number", description: "Content block index.", required: true },
471
+ chars: { type: "number", description: "UTF-16 character count.", required: true },
472
+ tool: { type: "string", description: "Tool name, for tool-call blocks only.", required: false }
473
+ }
474
+ }
475
+ },
476
+ status: {
477
+ default: "ok",
478
+ errorWhen: "Stop reason is error: provider_error with at most 500 error-message characters. Aborted stays ok."
479
+ }
480
+ };
481
+ var AI_TELEMETRY_SCHEMA = defineTelemetrySchema({
482
+ version: 1,
483
+ spans: {
484
+ "pi.ai.request": request,
485
+ "pi.ai.poll": { ...request, description: "One deferred-response poll, not the deferred request's lifetime." }
486
+ },
487
+ metrics: {
488
+ "pi.ai.request.duration": {
489
+ kind: "histogram",
490
+ description: "Logical request or poll duration.",
491
+ unit: "ms",
492
+ attributes: { provider, model, stop: { ...stop, required: true } }
493
+ },
494
+ "pi.ai.first_chunk.duration": {
495
+ kind: "histogram",
496
+ description: "Time to the first normalized stream event.",
497
+ unit: "ms",
498
+ attributes: { provider, model }
499
+ },
500
+ "pi.ai.tokens": {
501
+ kind: "counter",
502
+ description: "Reported model token usage; pending and deferred polls are excluded.",
503
+ unit: "token",
504
+ attributes: {
505
+ provider,
506
+ model,
507
+ kind: {
508
+ type: "string",
509
+ description: "Token usage category.",
510
+ values: ["input", "output", "cache_read", "cache_write"],
511
+ required: true
512
+ }
513
+ }
514
+ },
515
+ "pi.ai.cost": {
516
+ kind: "counter",
517
+ description: "Reported model cost; pending and deferred polls are excluded.",
518
+ unit: "USD",
519
+ attributes: { provider, model }
520
+ }
521
+ }
522
+ });
523
+ function createInstruments(adapter) {
524
+ const metrics = createTypedMetrics(adapter, [AI_TELEMETRY_SCHEMA]);
525
+ return {
526
+ requestDuration: metrics.histogram("pi.ai.request.duration"),
527
+ firstChunkDuration: metrics.histogram("pi.ai.first_chunk.duration"),
528
+ tokens: metrics.counter("pi.ai.tokens"),
529
+ cost: metrics.counter("pi.ai.cost")
530
+ };
531
+ }
532
+ var instrumentCache = new WeakMap;
533
+ function observeModelRequest(requestedModel, options, poll) {
534
+ const started = performance.now();
535
+ const attributes = { provider: requestedModel.provider, model: requestedModel.id };
536
+ const adapter = options?.telemetry?.metrics ?? NOOP_TELEMETRY_METRICS;
537
+ let instruments = instrumentCache.get(adapter);
538
+ if (!instruments) {
539
+ instruments = createInstruments(adapter);
540
+ instrumentCache.set(adapter, instruments);
541
+ }
542
+ const { requestDuration, firstChunkDuration, tokens, cost } = instruments;
543
+ let span;
544
+ let finish;
545
+ let first = true;
546
+ const toolChars = new Map;
547
+ const finished = new Promise((resolve) => {
548
+ finish = resolve;
549
+ });
550
+ const run = (activeSpan) => {
551
+ span = activeSpan;
552
+ return finished;
553
+ };
554
+ const startAttributes = {
555
+ ...attributes,
556
+ api: requestedModel.api,
557
+ ...typeof options?.reasoning === "string" ? { reasoning: options.reasoning } : {}
558
+ };
559
+ const start = createTypedSpanStarter(options?.telemetry ?? NOOP_TELEMETRY_CONTEXT, [AI_TELEMETRY_SCHEMA]);
560
+ if (poll)
561
+ start("pi.ai.poll", startAttributes, run);
562
+ else
563
+ start("pi.ai.request", startAttributes, run);
564
+ return {
565
+ onEvent(event) {
566
+ if (first) {
567
+ first = false;
568
+ span.addEvent("pi.ai.first_chunk");
569
+ firstChunkDuration.record(performance.now() - started, attributes, span);
570
+ }
571
+ if (event.type === "toolcall_delta") {
572
+ toolChars.set(event.contentIndex, (toolChars.get(event.contentIndex) ?? 0) + event.delta.length);
573
+ } else if (event.type === "text_end" || event.type === "thinking_end") {
574
+ span.addEvent("pi.ai.block", {
575
+ type: event.type === "text_end" ? "text" : "thinking",
576
+ index: event.contentIndex,
577
+ chars: event.content.length
578
+ });
579
+ } else if (event.type === "toolcall_end") {
580
+ const chars = toolChars.get(event.contentIndex) ?? 0;
581
+ toolChars.delete(event.contentIndex);
582
+ span.addEvent("pi.ai.block", {
583
+ type: "tool_call",
584
+ index: event.contentIndex,
585
+ chars,
586
+ tool: event.toolCall.name
587
+ });
588
+ }
589
+ },
590
+ onResult(message) {
591
+ if (message) {
592
+ span.setAttributes({
593
+ stop: message.stopReason,
594
+ "usage.input": message.usage.input,
595
+ "usage.output": message.usage.output,
596
+ "usage.cache_read": message.usage.cacheRead,
597
+ "usage.cache_write": message.usage.cacheWrite,
598
+ "cost.total": message.usage.cost.total,
599
+ "response.id": message.responseId
600
+ });
601
+ if (message.stopReason === "error") {
602
+ span.setStatus({
603
+ status: "error",
604
+ error: { name: "provider_error", message: message.errorMessage?.slice(0, 500) ?? "" }
605
+ });
606
+ }
607
+ requestDuration.record(performance.now() - started, { ...attributes, stop: message.stopReason }, span);
608
+ if (!poll || message.stopReason !== "pending" && message.stopReason !== "deferred") {
609
+ tokens.add(message.usage.input, { ...attributes, kind: "input" });
610
+ tokens.add(message.usage.output, { ...attributes, kind: "output" });
611
+ tokens.add(message.usage.cacheRead, { ...attributes, kind: "cache_read" });
612
+ tokens.add(message.usage.cacheWrite, { ...attributes, kind: "cache_write" });
613
+ cost.add(message.usage.cost.total, attributes);
614
+ }
615
+ }
616
+ finish();
617
+ }
618
+ };
619
+ }
620
+
334
621
  // node_modules/@earendil-works/pi-ai/dist/utils/model-operations.js
335
622
  function getModelType(model) {
336
623
  return model.type ?? "chat";
@@ -546,26 +833,32 @@ function hasToolRedefinitions(messages) {
546
833
  return false;
547
834
  }
548
835
  function hasNonAdditiveToolChanges(messages) {
836
+ return findLastNonAdditiveToolChange(messages.filter(isSystemMessage)) >= 0;
837
+ }
838
+ function findLastNonAdditiveToolChange(systemMessages) {
549
839
  const declared = new Set;
550
- for (const message of messages) {
551
- if (!isSystemMessage(message))
552
- continue;
840
+ let last = -1;
841
+ for (let index = 0;index < systemMessages.length; index++) {
842
+ const message = systemMessages[index];
553
843
  if ((message.toolsRemoved?.length ?? 0) > 0)
554
- return true;
844
+ last = index;
555
845
  for (const tool of message.toolsAdded ?? []) {
556
846
  if (declared.has(tool.name))
557
- return true;
847
+ last = index;
558
848
  declared.add(tool.name);
559
849
  }
560
850
  }
561
- return false;
851
+ return last;
562
852
  }
563
- function resolveTranscriptTools(messages, supportsToolAdditions) {
564
- const anchorsAdditions = supportsToolAdditions && !hasNonAdditiveToolChanges(messages);
565
- return {
566
- requestTools: anchorsAdditions ? getInitialSystemMessage(messages)?.toolsAdded ?? [] : getCurrentTools(messages),
567
- anchorsAdditions
568
- };
853
+ function resolveTranscriptTools(messages, support) {
854
+ const systemMessages = messages.filter(isSystemMessage);
855
+ if (support === "none") {
856
+ return { requestTools: getCurrentTools(systemMessages), foldedSystemMessages: systemMessages.length };
857
+ }
858
+ if (support === "changes")
859
+ return { requestTools: [], foldedSystemMessages: 0 };
860
+ const folded = Math.max(getInitialSystemMessage(messages) ? 1 : 0, findLastNonAdditiveToolChange(systemMessages) + 1);
861
+ return { requestTools: getCurrentTools(systemMessages.slice(0, folded)), foldedSystemMessages: folded };
569
862
  }
570
863
 
571
864
  // node_modules/@earendil-works/pi-ai/dist/models.js
@@ -596,6 +889,7 @@ class ModelsImpl {
596
889
  credentials;
597
890
  modelsStore;
598
891
  authContext;
892
+ identity;
599
893
  refreshGenerations = new Map;
600
894
  refreshControllers = new Map;
601
895
  publicationChains = new Map;
@@ -603,6 +897,7 @@ class ModelsImpl {
603
897
  this.credentials = options?.credentials ?? new InMemoryCredentialStore;
604
898
  this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore;
605
899
  this.authContext = options?.authContext ?? defaultProviderAuthContext();
900
+ this.identity = options?.identity;
606
901
  }
607
902
  setProvider(provider) {
608
903
  this.supersedeProviderRefresh(provider.id);
@@ -967,13 +1262,21 @@ class ModelsImpl {
967
1262
  }
968
1263
  const auth = resolution.auth;
969
1264
  const apiKey = options?.apiKey ?? auth.apiKey;
970
- let headers = mergeHeaders(auth.headers, options?.headers);
1265
+ const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
1266
+ const sessionId = options && "sessionId" in options && typeof options.sessionId === "string" ? options.sessionId : undefined;
1267
+ let headers = mergeHeaders(mergeHeaders(getOpenCodeSessionHeaders(requestModel, sessionId), auth.headers), options?.headers);
971
1268
  if (options?.transformHeaders)
972
1269
  headers = await options.transformHeaders(headers ?? {});
973
1270
  const env = resolution.env || options?.env ? { ...resolution.env ?? {}, ...options?.env ?? {} } : undefined;
974
- const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
1271
+ const identity = mergeClientIdentity(this.identity, options?.identity);
975
1272
  const { transformHeaders: _transformHeaders, ...providerOptions } = options ?? {};
976
- const requestOptions = { ...providerOptions, apiKey, headers, env };
1273
+ const requestOptions = {
1274
+ ...providerOptions,
1275
+ apiKey,
1276
+ headers,
1277
+ env,
1278
+ ...identity === undefined ? {} : { identity }
1279
+ };
977
1280
  return { requestModel, requestOptions };
978
1281
  }
979
1282
  stream(model, context, options) {
@@ -982,7 +1285,7 @@ class ModelsImpl {
982
1285
  const provider = this.requireChatProvider(model);
983
1286
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
984
1287
  return provider.stream(requestModel, transcript, requestOptions);
985
- });
1288
+ }, observeModelRequest(model, options, false));
986
1289
  }
987
1290
  async complete(model, context, options) {
988
1291
  return this.stream(model, context, options).result();
@@ -993,7 +1296,7 @@ class ModelsImpl {
993
1296
  const provider = this.requireChatProvider(model);
994
1297
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
995
1298
  return provider.streamSimple(requestModel, transcript, requestOptions);
996
- });
1299
+ }, observeModelRequest(model, options, false));
997
1300
  }
998
1301
  async completeSimple(model, context, options) {
999
1302
  return this.streamSimple(model, context, options).result();
@@ -1006,7 +1309,7 @@ class ModelsImpl {
1006
1309
  }
1007
1310
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
1008
1311
  return provider.fetchDeferred(requestModel, handle, requestOptions);
1009
- });
1312
+ }, observeModelRequest(model, options, true));
1010
1313
  }
1011
1314
  async fetchDeferred(model, handle, options) {
1012
1315
  return this.streamDeferred(model, handle, options).result();
@@ -1220,4 +1523,4 @@ function modelsAreEqual(a, b) {
1220
1523
  return getModelType(a) === getModelType(b) && a.id === b.id && a.provider === b.provider;
1221
1524
  }
1222
1525
 
1223
- export { lazyStream, lazyApi, defaultProviderAuthContext, InMemoryCredentialStore, ModelsError, InMemoryModelsStore, getModelType, isModelType, assertChatModel, assertImageModel, assertClassifierModel, assertClassifierInputSupported, imageErrorResult, classifierErrorResult, contentText, getSystemMessageText, renderSystemMessageUpdate, createInitialSystemMessage, normalizeContext, getInitialSystemMessage, withoutInitialSystemMessage, getCurrentTools, getCurrentSystemMessage, getCurrentSystemPrompt, collapseSystemMessages, resolveTranscript, toToolDeclaration, declarationsEqual, getToolStateChanges, getDeclaredTools, hasToolRedefinitions, hasNonAdditiveToolChanges, resolveTranscriptTools, createModels, createProvider, hasApi, calculateCost, getSupportedThinkingLevels, clampThinkingLevel, modelsAreEqual };
1526
+ export { lazyStream, lazyApi, defaultProviderAuthContext, InMemoryCredentialStore, ModelsError, InMemoryModelsStore, AI_TELEMETRY_SCHEMA, getModelType, isModelType, assertChatModel, assertImageModel, assertClassifierModel, assertClassifierInputSupported, imageErrorResult, classifierErrorResult, contentText, getSystemMessageText, renderSystemMessageUpdate, createInitialSystemMessage, normalizeContext, getInitialSystemMessage, withoutInitialSystemMessage, getCurrentTools, getCurrentSystemMessage, getCurrentSystemPrompt, collapseSystemMessages, resolveTranscript, toToolDeclaration, declarationsEqual, getToolStateChanges, getDeclaredTools, hasToolRedefinitions, hasNonAdditiveToolChanges, resolveTranscriptTools, createModels, createProvider, hasApi, calculateCost, getSupportedThinkingLevels, clampThinkingLevel, modelsAreEqual, exports_models };