@desplega.ai/agent-swarm 1.165.0 → 1.167.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 (296) hide show
  1. package/dist/acp-adapter-zpvy6321.js +34 -0
  2. package/dist/{actions-jna0b3wm.js → actions-fq2zrwtf.js} +30 -34
  3. package/dist/{amp-adapter-0eve81pz.js → amp-adapter-5gbk7501.js} +7 -7
  4. package/dist/{anthropic-messages-hst62ws9.js → anthropic-messages-13yn502s.js} +4 -4
  5. package/dist/{app-75hm5cfa.js → app-nctetn1e.js} +11 -11
  6. package/dist/{assistant-yzd51j33.js → assistant-0aq8gjvj.js} +31 -35
  7. package/dist/{azure-openai-responses-mh8tvf78.js → azure-openai-responses-9st34pfz.js} +5 -5
  8. package/dist/{boot-reembed-z158xq32.js → boot-reembed-1ze5853n.js} +14 -16
  9. package/dist/{boot-reembed-2ex2mcsh.js → boot-reembed-fmp5ww69.js} +15 -16
  10. package/dist/boot-scrub-sweep-cbp8xd4e.js +212 -0
  11. package/dist/{boot-seeds-2bmnh18p.js → boot-seeds-22tx8a53.js} +13 -12
  12. package/dist/{claude-adapter-jbj1mycz.js → claude-adapter-0jhgeh1d.js} +25 -25
  13. package/dist/{claude-managed-adapter-17ggz09t.js → claude-managed-adapter-tzwxy803.js} +5 -5
  14. package/dist/{claude-managed-setup-ptm1nzm2.js → claude-managed-setup-nrhfx5b0.js} +5 -5
  15. package/dist/{claude-sdk-session-9re1g7r2.js → claude-sdk-session-wh77rh83.js} +2632 -2614
  16. package/dist/{cli-zsh093hk.js → cli-014vns2y.js} +63 -1
  17. package/dist/{cli-qvfk83fy.js → cli-13xwcqvj.js} +2 -2
  18. package/dist/{cli-8gpbwy09.js → cli-1yrcfa5s.js} +5 -5
  19. package/dist/{cli-xtgtyafv.js → cli-577bxkf6.js} +212 -451
  20. package/dist/{cli-ma3zvh39.js → cli-5qkcdv8c.js} +6118 -5874
  21. package/dist/{cli-cwxhbf43.js → cli-5t5my0h8.js} +85 -2
  22. package/dist/{cli-zvckv750.js → cli-69egj654.js} +2 -2
  23. package/dist/{cli-9xb89xca.js → cli-6bpvv8h4.js} +9 -9
  24. package/dist/{cli-90v942q1.js → cli-6qxmjpem.js} +8 -8
  25. package/dist/{cli-9866bd07.js → cli-6vfz44sr.js} +1 -1
  26. package/dist/{cli-32bca7nr.js → cli-7avy4v8w.js} +1 -1
  27. package/dist/{cli-xb3c6aat.js → cli-7mhy3ths.js} +21 -18
  28. package/dist/{cli-q38n4bq0.js → cli-95zs84qw.js} +3 -3
  29. package/dist/cli-a35hzdve.js +33 -0
  30. package/dist/{cli-x3x0qwky.js → cli-bxqez1p0.js} +51 -23
  31. package/dist/{cli-prt9emct.js → cli-c2tpw9ck.js} +3 -3
  32. package/dist/{cli-0n4fasz0.js → cli-c8r99akr.js} +16 -16
  33. package/dist/{cli-5anb0ev3.js → cli-cexctgn5.js} +89 -26
  34. package/dist/{cli-bns5c8k9.js → cli-cf2vgn9d.js} +105 -91
  35. package/dist/{cli-ng97fjq7.js → cli-cmxkbzzs.js} +33 -7
  36. package/dist/{cli-nexwh8zg.js → cli-g7k7zbcz.js} +12 -5
  37. package/dist/{cli-mmzwwptd.js → cli-hf5s9pgf.js} +1 -1
  38. package/dist/{cli-nvvfd8bq.js → cli-jbzbr36n.js} +4091 -3793
  39. package/dist/{cli-zn2v3t8v.js → cli-jvmtxqtc.js} +27 -15
  40. package/dist/{cli-pkke6geq.js → cli-km4x66j0.js} +83 -65
  41. package/dist/cli-kw0jcfje.js +516 -0
  42. package/dist/{cli-28smfvbn.js → cli-m7vmeepg.js} +32 -19
  43. package/dist/{cli-hpryr6em.js → cli-mb75wpxf.js} +1 -1
  44. package/dist/{cli-qdv8kgz7.js → cli-mkdsy1nq.js} +14018 -3333
  45. package/dist/{cli-b0f70z24.js → cli-mn8qkd8v.js} +1 -1
  46. package/dist/{cli-420bdgw0.js → cli-mv2520nm.js} +1 -1
  47. package/dist/{cli-n9ehc28t.js → cli-mxry91sa.js} +31 -10
  48. package/dist/{cli-wfajtmf7.js → cli-mxvnnv5q.js} +596 -13
  49. package/dist/cli-nkqjj42q.js +104 -0
  50. package/dist/{cli-e7t4snpa.js → cli-p8rt8spp.js} +5 -5
  51. package/dist/{cli-gh5yqzpe.js → cli-pkj1w46r.js} +12 -7
  52. package/dist/cli-q1vnz8wv.js +96 -0
  53. package/dist/{cli-fj86xr3c.js → cli-qd97v6z2.js} +2 -2
  54. package/dist/{cli-ba66wyhy.js → cli-qzmzwegq.js} +60 -20
  55. package/dist/{cli-5b2fjjzh.js → cli-r7eeddkq.js} +14 -9
  56. package/dist/{cli-8ssjez7e.js → cli-rhy7z1rp.js} +22 -11
  57. package/dist/{cli-4mevd1hf.js → cli-s9y81s7j.js} +5 -5
  58. package/dist/{cli-59jn5twa.js → cli-tc5zec7v.js} +7 -7
  59. package/dist/{cli-ttbsse3f.js → cli-tmhsxhb8.js} +1 -1
  60. package/dist/{cli-k6xx3pve.js → cli-tx2zvn23.js} +4 -4
  61. package/dist/{cli-pjxnr1jn.js → cli-ty4bzkqr.js} +5 -5
  62. package/dist/{cli-nfygw434.js → cli-v1pwxreq.js} +55 -52
  63. package/dist/{cli-ftry7975.js → cli-v1w7pbd8.js} +3 -2
  64. package/dist/{cli-10zmp1p7.js → cli-vr5avem2.js} +27 -32
  65. package/dist/{cli-bzr0ftht.js → cli-wnb9b2g3.js} +19 -0
  66. package/dist/cli-wt7ccy4r.js +2654 -0
  67. package/dist/{cli-50eg13rj.js → cli-wydz3feg.js} +549 -321
  68. package/dist/{cli-krqm5f11.js → cli-xezn9nkh.js} +16 -13
  69. package/dist/{cli-8kt0bmgx.js → cli-xf713zz0.js} +2 -2
  70. package/dist/{cli-x7afk5wm.js → cli-xvc3q9br.js} +1 -1
  71. package/dist/{cli-9s3h836g.js → cli-xvdgasgy.js} +1 -1
  72. package/dist/{cli-j0pdrmwg.js → cli-y0kjpfm9.js} +3 -3
  73. package/dist/{cli-6zcfw0x7.js → cli-y195hv1a.js} +1 -1
  74. package/dist/{cli-amwhs8h2.js → cli-ykt8f7va.js} +22 -9
  75. package/dist/{cli-1kzfvd1z.js → cli-ymmc1zxg.js} +15 -11
  76. package/dist/{cli-xnzrzets.js → cli-ypgba1a8.js} +2 -2
  77. package/dist/{cli-bdv39kgj.js → cli-z1dqhc9y.js} +31 -20
  78. package/dist/{cli-fw6vdcq5.js → cli-zp67qg5x.js} +34 -1
  79. package/dist/{cli-qbksc292.js → cli-zy39d433.js} +2 -0
  80. package/dist/cli.js +36 -32
  81. package/dist/{cloudflare-workers-ai-system-one-tt484t61.js → cloudflare-workers-ai-system-one-sta45jf9.js} +7 -5
  82. package/dist/{codex-adapter-3qnxshje.js → codex-adapter-cgesnjkr.js} +20 -20
  83. package/dist/{codex-login-brkxhhdg.js → codex-login-g1cyt5zm.js} +2 -2
  84. package/dist/{codex-session-runner-612wnapp.js → codex-session-runner-8kd7ddhr.js} +20 -20
  85. package/dist/{commands-2ybfcxkj.js → commands-h6zaaxym.js} +11 -10
  86. package/dist/{cursor-adapter-p3jgdehv.js → cursor-adapter-v8mm6bp5.js} +7 -7
  87. package/dist/{db-f4ans0jj.js → db-qg3myn53.js} +13 -10
  88. package/dist/{devin-adapter-dhzt01ff.js → devin-adapter-bffjj5n4.js} +2 -2
  89. package/dist/{dispatcher-pk182apd.js → dispatcher-7vnwj9qw.js} +28 -32
  90. package/dist/{dsh-adapter-7twaeps1.js → dsh-adapter-tz6hfp5r.js} +7 -7
  91. package/dist/{e2b-y8t3jzyz.js → e2b-nd50eccg.js} +1 -1
  92. package/dist/{easter-egg-3d-mtpnw06s.js → easter-egg-3d-66zxervv.js} +2 -2
  93. package/dist/{event-bus-w7ac4n3c.js → event-bus-vnfthafg.js} +2 -2
  94. package/dist/{execute-s4ccjq3n.js → execute-h4jgevyw.js} +61 -11
  95. package/dist/{google-generative-ai-d6nphg3q.js → google-generative-ai-b8zxrpax.js} +5 -5
  96. package/dist/{google-vertex-cpshkref.js → google-vertex-nrdd697t.js} +5 -5
  97. package/dist/grok-adapter-jdt2dz2s.js +39 -0
  98. package/dist/{handlers-g2wnr4t9.js → handlers-2qtkpncr.js} +31 -35
  99. package/dist/{hook-f7jt9vnm.js → hook-51yfcgsv.js} +48 -39
  100. package/dist/{hook-bbdpnkb4.js → hook-qnbdgwvd.js} +15 -17
  101. package/dist/{http-w40q4w94.js → http-jsmtag08.js} +536 -231
  102. package/dist/{index-056j5kzn.js → index-2t9kesn1.js} +13 -12
  103. package/dist/{index-cj1r9q83.js → index-bt8wkv1w.js} +29 -33
  104. package/dist/{index-7n70jwbb.js → index-cx1sb9bq.js} +42 -35
  105. package/dist/{index-9bfssf54.js → index-ekywyv2v.js} +28 -32
  106. package/dist/{index-fdk1t4d6.js → index-n0rxa4ca.js} +11962 -9900
  107. package/dist/{index-k8xc083e.js → index-t4g06w93.js} +28 -32
  108. package/dist/{keepalive-1tj10tf4.js → keepalive-4aezx4bj.js} +16 -12
  109. package/dist/{lead-st0bg7v4.js → lead-r44bkpm5.js} +52 -56
  110. package/dist/{llama-cpp-classify-tgj35k8d.js → llama-cpp-classify-6erb7wwv.js} +3 -1
  111. package/dist/{maintenance-nz71zats.js → maintenance-grz5jrzh.js} +12 -13
  112. package/dist/{mistral-conversations-8445ddjn.js → mistral-conversations-059y51zt.js} +4 -4
  113. package/dist/{node-f0ykebbv.js → node-qm9eb6z0.js} +25 -7
  114. package/dist/{oauth-refresh-sweep-aefzwvvq.js → oauth-refresh-sweep-wm4ctjfj.js} +15 -11
  115. package/dist/{onboard-kgpr9mbn.js → onboard-v60zgqf0.js} +2 -2
  116. package/dist/{openai-codex-responses-9ynm88zy.js → openai-codex-responses-jzxkta9b.js} +8 -7
  117. package/dist/{openai-completions-nhqwjmaw.js → openai-completions-663yncfq.js} +4 -4
  118. package/dist/openai-decisions-vj9nkpf8.js +162 -0
  119. package/dist/{openai-responses-xx1c4kgm.js → openai-responses-m3g43rrt.js} +5 -5
  120. package/dist/{opencode-adapter-0c8e70dk.js → opencode-adapter-yjyqynzf.js} +8 -8
  121. package/dist/{openrouter-images-8yx3487g.js → openrouter-images-kr60n6b9.js} +1 -1
  122. package/dist/{otel-impl-x8zp4y5a.js → otel-impl-ghh4dyf8.js} +2 -2
  123. package/dist/{pi-messages-vxdt8v7j.js → pi-messages-xszk613n.js} +1 -1
  124. package/dist/{pi-mono-adapter-t280ah5c.js → pi-mono-adapter-0eg8kw2c.js} +69 -52
  125. package/dist/{pricing-refresh-9e0q7cwk.js → pricing-refresh-mjrqvnvw.js} +12 -11
  126. package/dist/{rbac-roles-790j3ga8.js → rbac-roles-axv4d74x.js} +11 -10
  127. package/dist/{rbac-roles-kcp6zge2.js → rbac-roles-fd5tskj9.js} +11 -10
  128. package/dist/{render-v2-tch4nefj.js → render-v2-k50j33qd.js} +11 -11
  129. package/dist/{runtime-v2t1r79e.js → runtime-h9ha1mq6.js} +4 -4
  130. package/dist/{setup-rcm303ns.js → setup-4syh0pd2.js} +2 -2
  131. package/dist/{typesafe-system-one-datfr82p.js → typesafe-system-one-e988vty7.js} +7 -5
  132. package/dist/{virtual-modules-wm8mxdxx.js → virtual-modules-ftr9kwe8.js} +11 -11
  133. package/dist/{work-objects-ctg7t70w.js → work-objects-jcdbg8rr.js} +32 -36
  134. package/dist/{worker-5dp0xm55.js → worker-x8j8c9sx.js} +52 -56
  135. package/dist/{x-v3yw66zs.js → x-ma4gnfgy.js} +2 -2
  136. package/openapi.json +5 -2
  137. package/package.json +15 -11
  138. package/src/be/automation-preflight.ts +9 -4
  139. package/src/be/boot-scrub-sweep.ts +302 -0
  140. package/src/be/crypto/key-bootstrap.ts +1 -1
  141. package/src/be/db/approvals.ts +15 -1
  142. package/src/be/db/codex-oauth-device-flows.ts +40 -0
  143. package/src/be/db/config-secrets.ts +31 -0
  144. package/src/be/db/runtime.ts +4 -0
  145. package/src/be/db/script-runs.ts +15 -0
  146. package/src/be/db/tasks/write.ts +1 -1
  147. package/src/be/db-queries/mcp-oauth.ts +5 -0
  148. package/src/be/db-queries/oauth.ts +77 -0
  149. package/src/be/db.ts +162 -59
  150. package/src/be/events.ts +17 -1
  151. package/src/be/memory/index-content.ts +2 -2
  152. package/src/be/memory/providers/openai-embedding.ts +7 -2
  153. package/src/be/memory/providers/sqlite-store.ts +63 -11
  154. package/src/be/memory/raters/llm-summarizer.ts +7 -2
  155. package/src/be/memory/types.ts +14 -0
  156. package/src/be/migrations/201_workflow_replay_columns.sql +10 -0
  157. package/src/be/migrations/202_codex_oauth_device_flows.sql +24 -0
  158. package/src/be/modelsdev-cache.json +61 -0
  159. package/src/be/scripts/db.ts +28 -4
  160. package/src/be/scripts/source-secrets.ts +37 -0
  161. package/src/be/scrub-json.ts +32 -0
  162. package/src/be/sealed-json.ts +59 -0
  163. package/src/be/secret-registry.ts +131 -0
  164. package/src/be/seed-pricing.ts +84 -53
  165. package/src/be/swarm-config-guard.ts +13 -0
  166. package/src/be/workflow-replay.ts +77 -0
  167. package/src/commands/provider-credentials.ts +28 -5
  168. package/src/commands/runner.ts +7 -12
  169. package/src/heartbeat/heartbeat.ts +91 -19
  170. package/src/hooks/hook.ts +72 -27
  171. package/src/http/codex-oauth-device.ts +8 -10
  172. package/src/http/db-query-bounded.ts +3 -0
  173. package/src/http/db-query-shared.ts +107 -15
  174. package/src/http/db-query.ts +10 -2
  175. package/src/http/index.ts +23 -6
  176. package/src/http/mcp.ts +5 -0
  177. package/src/http/onboarding.ts +2 -0
  178. package/src/http/script-runs.ts +9 -1
  179. package/src/http/scripts.ts +15 -0
  180. package/src/http/workflows.ts +3 -2
  181. package/src/oauth/mcp-wrapper.ts +1 -1
  182. package/src/providers/acp-adapter.ts +25 -11
  183. package/src/providers/acp-target-catalog.ts +35 -1
  184. package/src/providers/acp-targets.ts +78 -7
  185. package/src/providers/amp-adapter.ts +1 -1
  186. package/src/providers/claude-adapter.ts +26 -0
  187. package/src/providers/codex-adapter.ts +30 -3
  188. package/src/providers/codex-oauth/auth-json.ts +21 -4
  189. package/src/providers/codex-oauth/types.ts +2 -0
  190. package/src/providers/cursor-adapter.ts +1 -1
  191. package/src/providers/dsh-adapter.ts +10 -1
  192. package/src/providers/grok-adapter.ts +18 -2
  193. package/src/providers/opencode-adapter.ts +21 -5
  194. package/src/providers/pi-mono-extension.ts +56 -25
  195. package/src/providers/pricing-sources.md +2 -0
  196. package/src/script-workflows/supervisor.ts +11 -2
  197. package/src/scripts-runtime/eval-harness.ts +2 -12
  198. package/src/scripts-runtime/executors/quickjs-bundle.ts +152 -0
  199. package/src/scripts-runtime/executors/quickjs-prelude.ts +285 -0
  200. package/src/scripts-runtime/executors/quickjs-runner.ts +580 -0
  201. package/src/scripts-runtime/executors/quickjs-worker.ts +81 -0
  202. package/src/scripts-runtime/executors/quickjs.ts +196 -0
  203. package/src/scripts-runtime/executors/registry.ts +2 -0
  204. package/src/scripts-runtime/executors/sourcemap.ts +79 -0
  205. package/src/scripts-runtime/script-error-hints.ts +14 -0
  206. package/src/server.ts +66 -4
  207. package/src/tests/acp-adapter.test.ts +277 -12
  208. package/src/tests/boot-scrub-sweep.test.ts +390 -0
  209. package/src/tests/check-text-columns.test.ts +145 -0
  210. package/src/tests/ci-unit-test-report.test.ts +73 -0
  211. package/src/tests/claude-default-route.test.ts +75 -0
  212. package/src/tests/claude-hook-output.test.ts +233 -0
  213. package/src/tests/claude-sdk-process.fixture.ts +13 -2
  214. package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +4 -2
  215. package/src/tests/codex-adapter.test.ts +166 -26
  216. package/src/tests/codex-oauth-auth-timestamps.test.ts +76 -0
  217. package/src/tests/codex-oauth-device.test.ts +23 -37
  218. package/src/tests/codex-oauth.test.ts +4 -1
  219. package/src/tests/context-window.test.ts +2 -2
  220. package/src/tests/credential-check.test.ts +51 -1
  221. package/src/tests/db-query-denylist.test.ts +202 -0
  222. package/src/tests/db-task-read-contract.test.ts +1 -0
  223. package/src/tests/db-task-write-contract.test.ts +1 -0
  224. package/src/tests/dsh-adapter.test.ts +23 -1
  225. package/src/tests/enabled-tools.test.ts +269 -0
  226. package/src/tests/entrypoint-acp-target-binary.test.ts +31 -1
  227. package/src/tests/entrypoint-codex-oauth-seed.test.ts +12 -0
  228. package/src/tests/events-scrub.test.ts +88 -0
  229. package/src/tests/fixtures/secret-corpus.ts +320 -0
  230. package/src/tests/grok-adapter.test.ts +13 -0
  231. package/src/tests/haiku-5-5-pricing.test.ts +38 -0
  232. package/src/tests/heartbeat-checklist.test.ts +158 -1
  233. package/src/tests/onboarding.test.ts +44 -0
  234. package/src/tests/opencode-adapter.test.ts +66 -3
  235. package/src/tests/opencode-plugin.test.ts +37 -0
  236. package/src/tests/openrouter-attribution-call-sites.test.ts +204 -0
  237. package/src/tests/openrouter-base-url.test.ts +30 -39
  238. package/src/tests/pi-mono-extension.test.ts +161 -2
  239. package/src/tests/pricing-refresh.test.ts +70 -1
  240. package/src/tests/reasoning-effort.test.ts +3 -1
  241. package/src/tests/script-connections.test.ts +5 -0
  242. package/src/tests/script-executor-conformance.test.ts +3 -0
  243. package/src/tests/script-executor-quickjs.test.ts +442 -0
  244. package/src/tests/script-executor-registry.test.ts +6 -1
  245. package/src/tests/script-runs-http.test.ts +88 -1
  246. package/src/tests/script-runs-scrub.test.ts +275 -0
  247. package/src/tests/scripts-http.test.ts +82 -1
  248. package/src/tests/scrubbed-text-12e.test.ts +289 -0
  249. package/src/tests/sealed-key-guard.test.ts +166 -0
  250. package/src/tests/secret-canary-sweep.test.ts +958 -0
  251. package/src/tests/secret-registry.test.ts +355 -0
  252. package/src/tests/secret-rules.test.ts +230 -0
  253. package/src/tests/secret-scrubber.test.ts +3 -2
  254. package/src/tests/telemetry-trigger.test.ts +12 -1
  255. package/src/tests/workflow-llm.test.ts +14 -0
  256. package/src/tests/workflow-replay.test.ts +518 -0
  257. package/src/tests/workflow-scrub.test.ts +242 -0
  258. package/src/tests/workflow-system-one-decision-providers.test.ts +33 -0
  259. package/src/tools/db-query.ts +1 -1
  260. package/src/tools/inject-learning.ts +1 -1
  261. package/src/tools/request-human-input.ts +7 -2
  262. package/src/tools/workflows/get-workflow-run.ts +3 -2
  263. package/src/types.ts +1 -1
  264. package/src/utils/enabled-tools.ts +27 -0
  265. package/src/utils/internal-ai/complete-structured.ts +11 -3
  266. package/src/utils/openrouter-base-url.ts +23 -0
  267. package/src/utils/secret-rules.generated.ts +2055 -0
  268. package/src/utils/secret-scrubber.ts +363 -29
  269. package/src/workflows/engine.ts +39 -4
  270. package/src/workflows/executors/raw-llm.ts +1 -0
  271. package/src/workflows/executors/system-one-decision.ts +2 -0
  272. package/src/workflows/executors/validate.ts +1 -0
  273. package/src/workflows/executors/workflow-llm.ts +9 -2
  274. package/src/workflows/recovery.ts +10 -1
  275. package/src/workflows/resume.ts +62 -3
  276. package/src/workflows/retry-poller.ts +3 -0
  277. package/templates/skills/agent-browser/SKILL.md +2 -0
  278. package/templates/skills/agent-browser/content.md +2 -0
  279. package/templates/skills/code-quality/content.md +1 -0
  280. package/templates/skills/heartbeat-runbook/content.md +1 -1
  281. package/templates/skills/work-on-task/SKILL.md +4 -0
  282. package/templates/skills/work-on-task/content.md +4 -0
  283. package/templates/skills/workflow-iterate/content.md +9 -0
  284. package/dist/acp-adapter-w6zws6me.js +0 -23
  285. package/dist/boot-scrub-logs-246yn076.js +0 -99
  286. package/dist/cli-3a4m1aws.js +0 -572
  287. package/dist/cli-3dpj7atn.js +0 -11
  288. package/dist/cli-a87b04k8.js +0 -951
  289. package/dist/cli-cvk6yzw5.js +0 -40
  290. package/dist/cli-gvcgmx69.js +0 -183
  291. package/dist/cli-h1spv8v4.js +0 -427
  292. package/dist/cli-jqt9hrnz.js +0 -168
  293. package/dist/cli-yhmwmv0g.js +0 -9281
  294. package/dist/grok-adapter-yt9pab3k.js +0 -29
  295. package/src/be/boot-scrub-logs.ts +0 -132
  296. package/dist/{codex-hook-d2rkvf39.js → codex-hook-15dgc4cb.js} +1 -1
@@ -0,0 +1,516 @@
1
+ import {
2
+ acquireOAuthRefreshLock,
3
+ createOAuthPending,
4
+ getAuthorizationById,
5
+ getDefaultAuthorizationIdForProvider,
6
+ getOAuthAppById,
7
+ getOAuthAppIdByProvider,
8
+ init_oauth,
9
+ markAuthorizationRefreshFailed,
10
+ releaseOAuthRefreshLock,
11
+ updateAuthorizationTokens
12
+ } from "./cli-mkdsy1nq.js";
13
+ import {
14
+ init_secret_scrubber,
15
+ registerVolatileSecret,
16
+ scrubSecrets
17
+ } from "./cli-wt7ccy4r.js";
18
+
19
+ // src/oauth/ensure-token.ts
20
+ init_oauth();
21
+ init_secret_scrubber();
22
+
23
+ // node_modules/oauth4webapi/build/index.js
24
+ var USER_AGENT;
25
+ if (typeof navigator === "undefined" || !navigator.userAgent?.startsWith?.("Mozilla/5.0 ")) {
26
+ const NAME = "oauth4webapi";
27
+ const VERSION = "v3.8.5";
28
+ USER_AGENT = `${NAME}/${VERSION}`;
29
+ }
30
+ var ERR_INVALID_ARG_VALUE = "ERR_INVALID_ARG_VALUE";
31
+ var ERR_INVALID_ARG_TYPE = "ERR_INVALID_ARG_TYPE";
32
+ function CodedTypeError(message, code, cause) {
33
+ const err = new TypeError(message, { cause });
34
+ Object.assign(err, { code });
35
+ return err;
36
+ }
37
+ var allowInsecureRequests = Symbol();
38
+ var clockSkew = Symbol();
39
+ var clockTolerance = Symbol();
40
+ var customFetch = Symbol();
41
+ var modifyAssertion = Symbol();
42
+ var jweDecrypt = Symbol();
43
+ var jwksCache = Symbol();
44
+ var encoder = new TextEncoder;
45
+ var decoder = new TextDecoder;
46
+ function buf(input) {
47
+ if (typeof input === "string") {
48
+ return encoder.encode(input);
49
+ }
50
+ return decoder.decode(input);
51
+ }
52
+ var encodeBase64Url;
53
+ if (Uint8Array.prototype.toBase64) {
54
+ encodeBase64Url = (input) => {
55
+ if (input instanceof ArrayBuffer) {
56
+ input = new Uint8Array(input);
57
+ }
58
+ return input.toBase64({ alphabet: "base64url", omitPadding: true });
59
+ };
60
+ } else {
61
+ const CHUNK_SIZE = 32768;
62
+ encodeBase64Url = (input) => {
63
+ if (input instanceof ArrayBuffer) {
64
+ input = new Uint8Array(input);
65
+ }
66
+ const arr = [];
67
+ for (let i = 0;i < input.byteLength; i += CHUNK_SIZE) {
68
+ arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));
69
+ }
70
+ return btoa(arr.join("")).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
71
+ };
72
+ }
73
+ var decodeBase64Url;
74
+ if (Uint8Array.fromBase64) {
75
+ decodeBase64Url = (input) => {
76
+ try {
77
+ return Uint8Array.fromBase64(input, { alphabet: "base64url" });
78
+ } catch (cause) {
79
+ throw CodedTypeError("The input to be decoded is not correctly encoded.", ERR_INVALID_ARG_VALUE, cause);
80
+ }
81
+ };
82
+ } else {
83
+ decodeBase64Url = (input) => {
84
+ try {
85
+ const binary = atob(input.replace(/-/g, "+").replace(/_/g, "/").replace(/\s/g, ""));
86
+ const bytes = new Uint8Array(binary.length);
87
+ for (let i = 0;i < binary.length; i++) {
88
+ bytes[i] = binary.charCodeAt(i);
89
+ }
90
+ return bytes;
91
+ } catch (cause) {
92
+ throw CodedTypeError("The input to be decoded is not correctly encoded.", ERR_INVALID_ARG_VALUE, cause);
93
+ }
94
+ };
95
+ }
96
+ function b64u(input) {
97
+ if (typeof input === "string") {
98
+ return decodeBase64Url(input);
99
+ }
100
+ return encodeBase64Url(input);
101
+ }
102
+ class OperationProcessingError extends Error {
103
+ code;
104
+ constructor(message, options) {
105
+ super(message, options);
106
+ this.name = this.constructor.name;
107
+ if (options?.code) {
108
+ this.code = options?.code;
109
+ }
110
+ Error.captureStackTrace?.(this, this.constructor);
111
+ }
112
+ }
113
+ function OPE(message, code, cause) {
114
+ return new OperationProcessingError(message, { code, cause });
115
+ }
116
+ function assertString(input, it, code, cause) {
117
+ try {
118
+ if (typeof input !== "string") {
119
+ throw CodedTypeError(`${it} must be a string`, ERR_INVALID_ARG_TYPE, cause);
120
+ }
121
+ if (input.length === 0) {
122
+ throw CodedTypeError(`${it} must not be empty`, ERR_INVALID_ARG_VALUE, cause);
123
+ }
124
+ } catch (err) {
125
+ if (code) {
126
+ throw OPE(err.message, code, cause);
127
+ }
128
+ throw err;
129
+ }
130
+ }
131
+ function randomBytes() {
132
+ return b64u(crypto.getRandomValues(new Uint8Array(32)));
133
+ }
134
+ function generateRandomCodeVerifier() {
135
+ return randomBytes();
136
+ }
137
+ function generateRandomState() {
138
+ return randomBytes();
139
+ }
140
+ async function calculatePKCECodeChallenge(codeVerifier) {
141
+ assertString(codeVerifier, "codeVerifier");
142
+ return b64u(await crypto.subtle.digest("SHA-256", buf(codeVerifier)));
143
+ }
144
+ var URLParse = URL.parse ? (url, base) => URL.parse(url, base) : (url, base) => {
145
+ try {
146
+ return new URL(url, base);
147
+ } catch {
148
+ return null;
149
+ }
150
+ };
151
+ var tokenMatch = "[a-zA-Z0-9!#$%&\\'\\*\\+\\-\\.\\^_`\\|~]+";
152
+ var token68Match = "[a-zA-Z0-9\\-\\._\\~\\+\\/]+={0,2}";
153
+ var quotedMatch = '"((?:[^"\\\\]|\\\\[\\s\\S])*)"';
154
+ var quotedParamMatcher = "(" + tokenMatch + ")\\s*=\\s*" + quotedMatch;
155
+ var paramMatcher = "(" + tokenMatch + ")\\s*=\\s*(" + tokenMatch + ")";
156
+ var schemeRE = new RegExp("^[,\\s]*(" + tokenMatch + ")");
157
+ var quotedParamRE = new RegExp("^[,\\s]*" + quotedParamMatcher + "[,\\s]*(.*)");
158
+ var unquotedParamRE = new RegExp("^[,\\s]*" + paramMatcher + "[,\\s]*(.*)");
159
+ var token68ParamRE = new RegExp("^(" + token68Match + ")(?:$|[,\\s])(.*)");
160
+ var skipSubjectCheck = Symbol();
161
+ var idTokenClaims = new WeakMap;
162
+ var jwtRefs = new WeakMap;
163
+ var branded = new WeakSet;
164
+ var nopkce = Symbol();
165
+ var expectNoNonce = Symbol();
166
+ var skipAuthTimeCheck = Symbol();
167
+ var skipStateCheck = Symbol();
168
+ var expectNoState = Symbol();
169
+ var _nodiscoverycheck = Symbol();
170
+ var _expectedIssuer = Symbol();
171
+
172
+ // src/oauth/wrapper.ts
173
+ init_oauth();
174
+ async function buildAuthorizationUrl(config, options = {}) {
175
+ const state = generateRandomState();
176
+ const codeVerifier = generateRandomCodeVerifier();
177
+ const codeChallenge = await calculatePKCECodeChallenge(codeVerifier);
178
+ const appId = options.appId ?? await getOAuthAppIdByProvider(config.provider);
179
+ if (!appId) {
180
+ throw new Error(`OAuth app ${config.provider} is not configured`);
181
+ }
182
+ await createOAuthPending({
183
+ state,
184
+ appId,
185
+ label: options.label ?? "default",
186
+ flow: options.flow ?? "generic",
187
+ codeVerifier,
188
+ nonce: options.nonce ?? null,
189
+ redirectUri: config.redirectUri,
190
+ finalRedirect: options.finalRedirect ?? null,
191
+ userId: options.userId ?? null
192
+ });
193
+ const url = new URL(config.authorizeUrl);
194
+ url.searchParams.set("client_id", config.clientId);
195
+ url.searchParams.set("redirect_uri", config.redirectUri);
196
+ url.searchParams.set("response_type", "code");
197
+ url.searchParams.set("scope", config.scopes.join(config.scopeSeparator ?? ","));
198
+ url.searchParams.set("state", state);
199
+ url.searchParams.set("code_challenge", codeChallenge);
200
+ url.searchParams.set("code_challenge_method", "S256");
201
+ if (config.extraParams) {
202
+ for (const [key, value] of Object.entries(config.extraParams)) {
203
+ url.searchParams.set(key, value);
204
+ }
205
+ }
206
+ return { url: url.toString(), state, codeVerifier };
207
+ }
208
+ function tokenRequestInit(config, params) {
209
+ const useBasic = config.tokenAuthStyle === "basic";
210
+ const bodyParams = useBasic ? params : { ...params, client_id: config.clientId, client_secret: config.clientSecret };
211
+ const headers = { Accept: "application/json" };
212
+ if (useBasic) {
213
+ headers.Authorization = `Basic ${Buffer.from(`${config.clientId}:${config.clientSecret}`).toString("base64")}`;
214
+ }
215
+ if (config.tokenBodyFormat === "json") {
216
+ headers["Content-Type"] = "application/json";
217
+ return { headers, body: JSON.stringify(bodyParams) };
218
+ }
219
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
220
+ return { headers, body: new URLSearchParams(bodyParams).toString() };
221
+ }
222
+ async function exchangeAuthorizationCode(config, params) {
223
+ const response = await fetch(config.tokenUrl, {
224
+ method: "POST",
225
+ ...tokenRequestInit(config, {
226
+ grant_type: "authorization_code",
227
+ redirect_uri: params.redirectUri,
228
+ code: params.code,
229
+ code_verifier: params.codeVerifier
230
+ })
231
+ });
232
+ if (!response.ok) {
233
+ const errorText = await response.text();
234
+ throw new Error(`Token exchange failed (${response.status}): ${errorText}`);
235
+ }
236
+ const data = await response.json();
237
+ return {
238
+ accessToken: data.access_token,
239
+ refreshToken: data.refresh_token,
240
+ expiresIn: data.expires_in,
241
+ scope: data.scope,
242
+ tokenType: data.token_type,
243
+ idToken: data.id_token
244
+ };
245
+ }
246
+ async function performTokenRefreshRequest(config, refreshToken) {
247
+ const response = await fetch(config.tokenUrl, {
248
+ method: "POST",
249
+ ...tokenRequestInit(config, {
250
+ grant_type: "refresh_token",
251
+ refresh_token: refreshToken
252
+ })
253
+ });
254
+ if (!response.ok) {
255
+ const errorText = await response.text();
256
+ throw new Error(`Token refresh failed (${response.status}): ${errorText}`);
257
+ }
258
+ const data = await response.json();
259
+ if (typeof data.access_token !== "string" || data.access_token.length === 0) {
260
+ throw new Error(`Token refresh failed: ${config.provider} response missing access_token`);
261
+ }
262
+ if (config.requiresRefreshTokenRotation && (typeof data.refresh_token !== "string" || data.refresh_token.length === 0)) {
263
+ throw new Error(`Token refresh failed: ${config.provider} response did not include a rotated refresh_token`);
264
+ }
265
+ const expiresAt = data.expires_in ? new Date(Date.now() + data.expires_in * 1000).toISOString() : null;
266
+ return {
267
+ accessToken: data.access_token,
268
+ refreshToken: data.refresh_token,
269
+ expiresIn: data.expires_in,
270
+ scope: data.scope,
271
+ expiresAt
272
+ };
273
+ }
274
+
275
+ // src/oauth/ensure-token.ts
276
+ function parseMetadata(metadataJson) {
277
+ try {
278
+ const parsed = JSON.parse(metadataJson || "{}");
279
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
280
+ } catch {
281
+ return {};
282
+ }
283
+ }
284
+ function stringRecord(value) {
285
+ if (!value || typeof value !== "object" || Array.isArray(value))
286
+ return;
287
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, String(item)]));
288
+ }
289
+ function oauthAppRowToProviderConfig(app) {
290
+ const metadata = parseMetadata(app.metadata);
291
+ const liftedExtraParams = stringRecord(parseMetadata(app.extraParamsJson));
292
+ const extraParams = {
293
+ ...typeof metadata.actor === "string" ? { actor: metadata.actor } : {},
294
+ ...liftedExtraParams
295
+ };
296
+ return {
297
+ provider: app.provider,
298
+ clientId: app.clientId,
299
+ clientSecret: app.clientSecret,
300
+ authorizeUrl: app.authorizeUrl,
301
+ tokenUrl: app.tokenUrl,
302
+ redirectUri: app.redirectUri,
303
+ scopes: app.scopes.split(",").map((scope) => scope.trim()).filter(Boolean),
304
+ extraParams: Object.keys(extraParams).length > 0 ? extraParams : undefined,
305
+ scopeSeparator: app.scopeSeparator,
306
+ tokenAuthStyle: app.tokenAuthStyle,
307
+ tokenBodyFormat: app.tokenBodyFormat,
308
+ requiresRefreshTokenRotation: app.requiresRefreshTokenRotation
309
+ };
310
+ }
311
+
312
+ class OAuthRefreshError extends Error {
313
+ authorizationId;
314
+ appId;
315
+ reason;
316
+ authorizationLabel;
317
+ constructor(authorizationId, appId, reason, authorizationLabel, message) {
318
+ super(message ?? `OAuth authorization '${authorizationLabel}' refresh failed (${reason})`);
319
+ this.authorizationId = authorizationId;
320
+ this.appId = appId;
321
+ this.reason = reason;
322
+ this.authorizationLabel = authorizationLabel;
323
+ this.name = "OAuthRefreshError";
324
+ }
325
+ }
326
+ function authorizationLabelFor(app, authorization) {
327
+ const base = app.displayName?.trim() || app.provider;
328
+ return authorization.label && authorization.label !== "default" ? `${base} (${authorization.label})` : base;
329
+ }
330
+ var refreshLocks = new Map;
331
+ var REFRESH_LOCK_TTL_MS = 2 * 60 * 1000;
332
+ var REFRESH_LOCK_WAIT_MS = 30 * 1000;
333
+ var REFRESH_LOCK_POLL_MS = 250;
334
+ var DEFAULT_REFRESH_BUFFER_MS = 5 * 60 * 1000;
335
+ async function withAuthorizationRefreshLock(authorizationId, fn) {
336
+ const previous = refreshLocks.get(authorizationId) ?? Promise.resolve();
337
+ let release;
338
+ const current = new Promise((resolve) => {
339
+ release = resolve;
340
+ });
341
+ const next = previous.catch(() => {
342
+ return;
343
+ }).then(() => current);
344
+ refreshLocks.set(authorizationId, next);
345
+ await previous.catch(() => {
346
+ return;
347
+ });
348
+ try {
349
+ return await fn();
350
+ } finally {
351
+ release();
352
+ if (refreshLocks.get(authorizationId) === next) {
353
+ refreshLocks.delete(authorizationId);
354
+ }
355
+ }
356
+ }
357
+ function sleep(ms) {
358
+ return new Promise((resolve) => setTimeout(resolve, ms));
359
+ }
360
+ function authorizationNeedsRefresh(authorization, bufferMs = DEFAULT_REFRESH_BUFFER_MS, force = false) {
361
+ if (authorization.status === "refresh-failed" || authorization.status === "expired")
362
+ return true;
363
+ if (force)
364
+ return true;
365
+ if (!authorization.expiresAt)
366
+ return false;
367
+ const expiresAt = new Date(authorization.expiresAt).getTime();
368
+ if (Number.isNaN(expiresAt))
369
+ return true;
370
+ return expiresAt - Date.now() < bufferMs;
371
+ }
372
+ var authorizationRefreshedListeners = new Set;
373
+ function onAuthorizationRefreshed(listener) {
374
+ authorizationRefreshedListeners.add(listener);
375
+ return () => {
376
+ authorizationRefreshedListeners.delete(listener);
377
+ };
378
+ }
379
+ function notifyAuthorizationRefreshed(event) {
380
+ for (const listener of authorizationRefreshedListeners) {
381
+ try {
382
+ listener(event);
383
+ } catch (err) {
384
+ console.error(scrubSecrets(`[OAuth] authorization-refreshed listener failed for ${event.provider}: ${err instanceof Error ? err.message : String(err)}`));
385
+ }
386
+ }
387
+ }
388
+ async function ensureAuthorizationTokenOrThrow(authorizationId, bufferMs, force = false) {
389
+ const initial = await getAuthorizationById(authorizationId);
390
+ if (!initial || initial.status === "revoked")
391
+ return;
392
+ if (!authorizationNeedsRefresh(initial, bufferMs, force))
393
+ return;
394
+ await withAuthorizationRefreshLock(authorizationId, async () => {
395
+ const waitStartedAt = Date.now();
396
+ while (true) {
397
+ const current = await getAuthorizationById(authorizationId);
398
+ if (!current || current.status === "revoked")
399
+ return;
400
+ if (current.tokenVersion !== initial.tokenVersion)
401
+ return;
402
+ if (!authorizationNeedsRefresh(current, bufferMs, force))
403
+ return;
404
+ const app = await getOAuthAppById(current.appId);
405
+ if (!app || app.mcpServerId !== null)
406
+ return;
407
+ if (!current.refreshToken) {
408
+ const label = authorizationLabelFor(app, current);
409
+ const message = `OAuth authorization '${label}' cannot refresh: no refresh token stored`;
410
+ await markAuthorizationRefreshFailed(authorizationId, message);
411
+ throw new OAuthRefreshError(authorizationId, app.id, "no_refresh_token", label, message);
412
+ }
413
+ const lockOwner = await acquireOAuthRefreshLock(`authz:${authorizationId}`, REFRESH_LOCK_TTL_MS);
414
+ if (!lockOwner) {
415
+ if (Date.now() - waitStartedAt > REFRESH_LOCK_WAIT_MS) {
416
+ const label = authorizationLabelFor(app, current);
417
+ const message = `Timed out waiting for OAuth refresh lock for '${label}'`;
418
+ await markAuthorizationRefreshFailed(authorizationId, message);
419
+ throw new OAuthRefreshError(authorizationId, app.id, "lock_timeout", label, message);
420
+ }
421
+ await sleep(REFRESH_LOCK_POLL_MS);
422
+ continue;
423
+ }
424
+ try {
425
+ const locked = await getAuthorizationById(authorizationId);
426
+ if (!locked || locked.status === "revoked")
427
+ return;
428
+ if (locked.tokenVersion !== initial.tokenVersion)
429
+ return;
430
+ if (!authorizationNeedsRefresh(locked, bufferMs, force))
431
+ return;
432
+ const lockedApp = await getOAuthAppById(locked.appId);
433
+ if (!lockedApp || lockedApp.mcpServerId !== null)
434
+ return;
435
+ if (!locked.refreshToken) {
436
+ const label = authorizationLabelFor(lockedApp, locked);
437
+ const message = `OAuth authorization '${label}' cannot refresh: no refresh token stored`;
438
+ await markAuthorizationRefreshFailed(authorizationId, message);
439
+ throw new OAuthRefreshError(authorizationId, lockedApp.id, "no_refresh_token", label, message);
440
+ }
441
+ const config = oauthAppRowToProviderConfig(lockedApp);
442
+ try {
443
+ const refreshed = await performTokenRefreshRequest(config, locked.refreshToken);
444
+ const persisted = await updateAuthorizationTokens(authorizationId, {
445
+ accessToken: refreshed.accessToken,
446
+ refreshToken: refreshed.refreshToken ?? locked.refreshToken,
447
+ expiresAt: refreshed.expiresAt,
448
+ scope: refreshed.scope ?? null,
449
+ expectedTokenVersion: locked.tokenVersion
450
+ });
451
+ if (!persisted) {
452
+ continue;
453
+ }
454
+ notifyAuthorizationRefreshed({
455
+ authorizationId,
456
+ appId: lockedApp.id,
457
+ provider: lockedApp.provider
458
+ });
459
+ return;
460
+ } catch (err) {
461
+ const label = authorizationLabelFor(lockedApp, locked);
462
+ if (locked.refreshToken)
463
+ registerVolatileSecret(locked.refreshToken, "oauth-refresh-token");
464
+ if (locked.accessToken)
465
+ registerVolatileSecret(locked.accessToken, "oauth-access-token");
466
+ if (lockedApp.clientSecret)
467
+ registerVolatileSecret(lockedApp.clientSecret, "oauth-client-secret");
468
+ const message = scrubSecrets(err instanceof Error ? err.message : String(err));
469
+ await markAuthorizationRefreshFailed(authorizationId, message);
470
+ if (err instanceof OAuthRefreshError)
471
+ throw err;
472
+ throw new OAuthRefreshError(authorizationId, lockedApp.id, "refresh_rejected", label, message);
473
+ }
474
+ } finally {
475
+ await releaseOAuthRefreshLock(`authz:${authorizationId}`, lockOwner);
476
+ }
477
+ }
478
+ });
479
+ }
480
+ async function forceRefreshAuthorizationOrThrow(authorizationId) {
481
+ await ensureAuthorizationTokenOrThrow(authorizationId, undefined, true);
482
+ }
483
+ async function ensureToken(provider, bufferMs) {
484
+ try {
485
+ await ensureTokenOrThrow(provider, bufferMs);
486
+ } catch (err) {
487
+ console.error(`[OAuth] Failed to refresh ${provider} token:`, err instanceof Error ? err.message : err);
488
+ }
489
+ }
490
+ async function ensureTokenOrThrow(provider, bufferMs) {
491
+ const authorizationId = await getDefaultAuthorizationIdForProvider(provider);
492
+ if (!authorizationId)
493
+ return;
494
+ try {
495
+ await ensureAuthorizationTokenOrThrow(authorizationId, bufferMs);
496
+ } catch (err) {
497
+ if (err instanceof OAuthRefreshError && err.reason === "no_refresh_token") {
498
+ return;
499
+ }
500
+ throw err;
501
+ }
502
+ }
503
+ async function forceRefreshTokenOrThrow(provider) {
504
+ const authorizationId = await getDefaultAuthorizationIdForProvider(provider);
505
+ if (!authorizationId)
506
+ return;
507
+ try {
508
+ await forceRefreshAuthorizationOrThrow(authorizationId);
509
+ } catch (err) {
510
+ if (err instanceof OAuthRefreshError && err.reason === "no_refresh_token")
511
+ return;
512
+ throw err;
513
+ }
514
+ }
515
+
516
+ export { generateRandomCodeVerifier, generateRandomState, calculatePKCECodeChallenge, buildAuthorizationUrl, exchangeAuthorizationCode, oauthAppRowToProviderConfig, onAuthorizationRefreshed, ensureAuthorizationTokenOrThrow, forceRefreshAuthorizationOrThrow, ensureToken, ensureTokenOrThrow, forceRefreshTokenOrThrow };
@@ -4,9 +4,15 @@ import {
4
4
  import {
5
5
  readPkgVersion
6
6
  } from "./cli-gt4hxb8p.js";
7
+ import {
8
+ hasCodexOAuthPoolSlots
9
+ } from "./cli-bqjfjex4.js";
7
10
  import {
8
11
  buildOtelTraceparentEnv
9
12
  } from "./cli-q2j38vre.js";
13
+ import {
14
+ summarizeSession
15
+ } from "./cli-r7eeddkq.js";
10
16
  import {
11
17
  CTX_MODE_NUDGE_EVERY
12
18
  } from "./cli-zm7njwzd.js";
@@ -17,19 +23,13 @@ import {
17
23
  CONTEXT_FORMULA,
18
24
  clampContextPercent,
19
25
  computeContextUsedUnified
20
- } from "./cli-32bca7nr.js";
21
- import {
22
- summarizeSession
23
- } from "./cli-5b2fjjzh.js";
24
- import {
25
- hasCodexOAuthPoolSlots
26
- } from "./cli-bqjfjex4.js";
26
+ } from "./cli-7avy4v8w.js";
27
27
  import {
28
28
  SessionErrorTracker
29
29
  } from "./cli-2pdaysab.js";
30
30
  import {
31
31
  applyReasoningEffort
32
- } from "./cli-ttbsse3f.js";
32
+ } from "./cli-tmhsxhb8.js";
33
33
  import {
34
34
  buildRatingsFromLlm,
35
35
  fetchRetrievalsForTask,
@@ -42,33 +42,33 @@ import {
42
42
  import {
43
43
  getApiKey
44
44
  } from "./cli-f14fvzag.js";
45
+ import {
46
+ CodexOAuthRefreshError,
47
+ credentialsToAuthJson,
48
+ getValidCodexOAuth
49
+ } from "./cli-v1w7pbd8.js";
45
50
  import {
46
51
  detachedProcessGroup,
47
52
  registerProcessGroup,
48
53
  terminateProcessGroup
49
54
  } from "./cli-zt3w1cn1.js";
50
- import {
51
- CodexOAuthRefreshError,
52
- credentialsToAuthJson,
53
- getValidCodexOAuth
54
- } from "./cli-ftry7975.js";
55
55
  import {
56
56
  DEFAULT_MODEL_TIER_MAP,
57
57
  init_types
58
- } from "./cli-9s3h836g.js";
58
+ } from "./cli-xvdgasgy.js";
59
59
  import {
60
60
  init_runtime_model_catalog,
61
61
  init_src,
62
62
  runtimeCatalogModel
63
- } from "./cli-zsh093hk.js";
63
+ } from "./cli-014vns2y.js";
64
64
  import {
65
65
  init_package,
66
66
  package_default
67
- } from "./cli-1kzfvd1z.js";
67
+ } from "./cli-ymmc1zxg.js";
68
68
  import {
69
69
  init_secret_scrubber,
70
70
  scrubSecrets
71
- } from "./cli-h1spv8v4.js";
71
+ } from "./cli-wt7ccy4r.js";
72
72
  import {
73
73
  __require
74
74
  } from "./cli-bc05qbss.js";
@@ -1042,6 +1042,14 @@ class AppServerCodexThread {
1042
1042
  case "thread/tokenUsage/updated": {
1043
1043
  const tokenUsage = params.tokenUsage;
1044
1044
  this.latestTotalUsage = normalizeUsage(tokenUsage?.total);
1045
+ const last = normalizeUsage(tokenUsage?.last);
1046
+ if (last) {
1047
+ push({
1048
+ type: "context.updated",
1049
+ usage: last,
1050
+ contextWindow: typeof tokenUsage?.modelContextWindow === "number" && tokenUsage.modelContextWindow > 0 ? tokenUsage.modelContextWindow : undefined
1051
+ });
1052
+ }
1045
1053
  break;
1046
1054
  }
1047
1055
  case "error": {
@@ -1435,6 +1443,9 @@ class CodexSession {
1435
1443
  case "turn.interrupted":
1436
1444
  this.accountUsage(event.usage);
1437
1445
  break;
1446
+ case "context.updated":
1447
+ this.emitContextUsage(event.usage, event.contextWindow ?? this.contextWindow);
1448
+ break;
1438
1449
  case "error": {
1439
1450
  const { message } = this.formatTerminalError(event.message, event.codexErrorInfo);
1440
1451
  if (event.willRetry === true) {
@@ -1457,6 +1468,8 @@ class CodexSession {
1457
1468
  output_tokens: this.accumulatedUsage.output_tokens + usage.output_tokens,
1458
1469
  reasoning_output_tokens: this.accumulatedUsage.reasoning_output_tokens + usage.reasoning_output_tokens
1459
1470
  } : usage;
1471
+ }
1472
+ emitContextUsage(usage, contextWindow) {
1460
1473
  const contextUsed = computeContextUsedUnified({
1461
1474
  inputTokens: usage.input_tokens,
1462
1475
  cacheReadTokens: 0,
@@ -1466,8 +1479,8 @@ class CodexSession {
1466
1479
  this.emit({
1467
1480
  type: "context_usage",
1468
1481
  contextUsedTokens: contextUsed,
1469
- contextTotalTokens: this.contextWindow,
1470
- contextPercent: clampContextPercent(contextUsed, this.contextWindow) ?? 0,
1482
+ contextTotalTokens: contextWindow,
1483
+ contextPercent: clampContextPercent(contextUsed, contextWindow) ?? 0,
1471
1484
  outputTokens: usage.output_tokens,
1472
1485
  contextFormula: CONTEXT_FORMULA
1473
1486
  });
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  init_secret_scrubber,
8
8
  scrubSecrets
9
- } from "./cli-h1spv8v4.js";
9
+ } from "./cli-wt7ccy4r.js";
10
10
  import {
11
11
  __esm
12
12
  } from "./cli-bc05qbss.js";