@bitkyc08/opencodex 2.89.0 → 2.90.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 (129) hide show
  1. package/gui/dist/assets/App-DgxkE6Md.js +58 -0
  2. package/gui/dist/assets/{Tray-7z1COnmz.js → Tray-DbTNc_88.js} +1 -1
  3. package/gui/dist/assets/{index-uchD-ngf.js → index-TmaHa54u.js} +5 -5
  4. package/gui/dist/assets/quota-summary-B16x5DZZ.js +1 -0
  5. package/gui/dist/index.html +1 -1
  6. package/package.json +2 -2
  7. package/src/adapters/base.ts +4 -0
  8. package/src/adapters/claude-cli/adapter.ts +13 -7
  9. package/src/adapters/claude-cli/usage-admission.ts +14 -2
  10. package/src/adapters/coding-agent/turn.ts +14 -4
  11. package/src/adapters/cursor/protobuf-request.ts +3 -0
  12. package/src/adapters/google-progress-history.ts +19 -1
  13. package/src/adapters/google.ts +28 -9
  14. package/src/adapters/image.ts +5 -3
  15. package/src/adapters/input-media-guard.ts +5 -2
  16. package/src/adapters/kiro-refusal.ts +41 -1
  17. package/src/adapters/ollama-native.ts +1 -0
  18. package/src/adapters/openai-chat/messages.ts +34 -4
  19. package/src/adapters/openai-chat/passthrough.ts +37 -4
  20. package/src/adapters/openai-chat/reasoning-replay.ts +98 -13
  21. package/src/adapters/openai-chat/serialized-tool-call-content.ts +95 -134
  22. package/src/adapters/openai-chat/serialized-tool-call-markup.ts +108 -0
  23. package/src/adapters/openai-chat/standalone-bare-tool-calls.ts +136 -0
  24. package/src/adapters/openai-chat.ts +7 -6
  25. package/src/adapters/openai-responses/opengateway-input.ts +139 -0
  26. package/src/adapters/openai-responses/passthrough.ts +5 -1
  27. package/src/adapters/openai-responses/transport.ts +13 -1
  28. package/src/claude/desktop-3p-library.ts +43 -3
  29. package/src/claude/desktop-3p.ts +20 -10
  30. package/src/claude/desktop-picker-profile.ts +18 -9
  31. package/src/claude/desktop-remote-store-io.ts +2 -2
  32. package/src/cli/ensure-desktop-cold-start.ts +2 -2
  33. package/src/codex/account-lifecycle.ts +19 -6
  34. package/src/codex/account-store.ts +27 -8
  35. package/src/codex/account-usability.ts +4 -1
  36. package/src/codex/auth-api/account-list.ts +10 -5
  37. package/src/codex/auth-api/account-pause-group.ts +2 -22
  38. package/src/codex/auth-api/login-collision.ts +59 -0
  39. package/src/codex/auth-api/login-flow.ts +12 -7
  40. package/src/codex/auth-api/pool-mode-gate.ts +81 -13
  41. package/src/codex/auth-collision.ts +31 -4
  42. package/src/codex/auth-context.ts +48 -6
  43. package/src/codex/cli-update-plan.ts +18 -3
  44. package/src/codex/collision-identity.ts +78 -0
  45. package/src/codex/main-account-hard-lock.ts +14 -0
  46. package/src/codex/routing/cooldown-math.ts +5 -0
  47. package/src/codex/routing/failure-window.ts +61 -9
  48. package/src/codex/routing.ts +4 -3
  49. package/src/codex/shim-diagnostics.ts +2 -1
  50. package/src/codex/shim-fingerprint.ts +11 -2
  51. package/src/codex/shim-templates.ts +16 -5
  52. package/src/codex/shim-windows-refresh.ts +224 -0
  53. package/src/codex/shim.ts +45 -21
  54. package/src/combos/failover.ts +8 -1
  55. package/src/config/provider-validation.ts +7 -2
  56. package/src/generated/compatibility-version.json +168 -108
  57. package/src/generated/model-metadata.ts +1 -1
  58. package/src/images/loop.ts +2 -2
  59. package/src/lib/bun-transpiler-cache-scope.mjs +31 -17
  60. package/src/lib/provider-admission-wait.ts +14 -0
  61. package/src/lib/service-secrets.ts +37 -2
  62. package/src/lib/translator-budget.ts +1 -1
  63. package/src/lib/upstream-retry.ts +15 -0
  64. package/src/oauth/account-import/google-antigravity-adapter.ts +38 -2
  65. package/src/oauth/account-import/parser.ts +15 -2
  66. package/src/oauth/account-import/types.ts +7 -0
  67. package/src/oauth/chatgpt-shared.ts +10 -1
  68. package/src/oauth/dsh.ts +45 -2
  69. package/src/oauth/kiro.ts +44 -1
  70. package/src/oauth/login-flow-state.ts +11 -2
  71. package/src/providers/claude-cli-usage.ts +20 -5
  72. package/src/providers/initial-model-selection.ts +2 -2
  73. package/src/providers/key-failover.ts +10 -2
  74. package/src/providers/key-store.ts +8 -3
  75. package/src/providers/mistral-transport.ts +207 -0
  76. package/src/providers/openai-sidecar.ts +5 -0
  77. package/src/providers/quota/anthropic-account-quota.ts +18 -6
  78. package/src/providers/quota/antigravity.ts +6 -2
  79. package/src/providers/quota/failure-codes.ts +18 -0
  80. package/src/providers/quota/vendor-probes-oauth.ts +12 -3
  81. package/src/providers/quota-routing-cache.ts +1 -1
  82. package/src/providers/quota.ts +5 -1
  83. package/src/providers/registry/entries-extended.ts +6 -1
  84. package/src/providers/routed-config.ts +1 -1
  85. package/src/providers/xai-transport.ts +2 -1
  86. package/src/responses/audio.ts +46 -0
  87. package/src/responses/input-media.ts +37 -15
  88. package/src/responses/parser-content.ts +22 -27
  89. package/src/responses/reasoning-retention.ts +218 -11
  90. package/src/responses/schema.ts +3 -4
  91. package/src/responses/web-search-replay.ts +11 -2
  92. package/src/server/chat-native.ts +8 -7
  93. package/src/server/index/serve-options.ts +8 -2
  94. package/src/server/index/websocket-handler.ts +10 -0
  95. package/src/server/lifecycle.ts +17 -1
  96. package/src/server/management/oauth-account-routes.ts +2 -1
  97. package/src/server/messages-native.ts +11 -0
  98. package/src/server/request-log.ts +16 -7
  99. package/src/server/responses/adapter-continuation.ts +2 -2
  100. package/src/server/responses/adapter-dispatch.ts +2 -2
  101. package/src/server/responses/codex-ws-exchange.ts +3 -0
  102. package/src/server/responses/codex-ws-metadata.ts +44 -0
  103. package/src/server/responses/codex-ws-session.ts +21 -1
  104. package/src/server/responses/combo-stream-preflight.ts +7 -2
  105. package/src/server/responses/compact.ts +2 -0
  106. package/src/server/responses/core-auth.ts +20 -0
  107. package/src/server/responses/core-codex-account.ts +21 -14
  108. package/src/server/responses/core-combo.ts +3 -0
  109. package/src/server/responses/core-opaque-recovery.ts +20 -11
  110. package/src/server/responses/deepseek-image-files.ts +121 -0
  111. package/src/server/responses/empty-completion-guard.ts +8 -0
  112. package/src/server/responses/fetch-helpers.ts +30 -10
  113. package/src/server/responses/input-admission.ts +6 -2
  114. package/src/server/responses/main-hard-lock-routing.ts +33 -8
  115. package/src/server/responses/opengateway-completion-guard.ts +232 -0
  116. package/src/server/responses/passthrough-completion.ts +41 -0
  117. package/src/server/responses/passthrough-delivery.ts +2 -0
  118. package/src/server/responses/passthrough-dispatch.ts +13 -13
  119. package/src/server/responses/passthrough-key-rotation.ts +40 -0
  120. package/src/server/responses/reasoning-archive-error.ts +21 -0
  121. package/src/server/responses/request-prepare.ts +11 -1
  122. package/src/server/responses/request-transport.ts +61 -3
  123. package/src/service/orchestration.ts +17 -0
  124. package/src/types/provider.ts +2 -0
  125. package/src/types/request.ts +16 -1
  126. package/src/types.ts +1 -0
  127. package/src/web-search/loop.ts +2 -2
  128. package/gui/dist/assets/App-BnRSujOq.js +0 -58
  129. package/gui/dist/assets/quota-summary-BY_10IEz.js +0 -1
@@ -1 +1 @@
1
- import{A as e,C as t,j as n,m as r,n as i,o as a,p as o,s,u as c,y as l}from"./index-uchD-ngf.js";import{J as u,T as d,X as f,_ as ee,a as p,c as m,d as h,f as g,i as te,l as ne,m as re,o as ie,p as ae,r as oe,s as _,u as v,v as y}from"./quota-summary-BY_10IEz.js";var b=n(e(),1),x={discover:r,configure:s,hasSharedSession:()=>c(`shared`),bootstrapShared:e=>a(`shared`,e)},S=()=>new DOMException(`Tray target resolution cancelled`,`AbortError`);async function C(e,t=``,n=x){if(e.aborted)throw S();let r=await n.discover(t,e);if(e.aborted||(n.configure(r),r.connected&&!n.hasSharedSession()&&await n.bootstrapShared(e),e.aborted))throw S();return o(`shared`,r)}var w=i(),T=2e4,E=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function D({resolveApiBase:e=C}={}){let{t:n,locale:r}=t(),[i,a]=(0,b.useState)(null),[o,s]=(0,b.useState)(!1),[c,x]=(0,b.useState)(null),[S,D]=(0,b.useState)(!1),[O,k]=(0,b.useState)([null,null]),[A,j]=(0,b.useState)(!1),[se,M]=(0,b.useState)([]),[ce,N]=(0,b.useState)(!1),[P,F]=(0,b.useState)(null),[I,L]=(0,b.useState)(!1),[R,z]=(0,b.useState)(null),[B,V]=(0,b.useState)(!1),[H,U]=(0,b.useState)(0),[W,G]=(0,b.useState)(null),[K,q]=(0,b.useState)(null),J=()=>{s(!1),U(e=>e+1)},Y=(0,b.useRef)(!1),X=(0,b.useRef)(null),Z=(0,b.useRef)(!0);(0,b.useEffect)(()=>(Z.current=!0,document.documentElement.classList.add(`tray-document`),()=>{Z.current=!1,X.current?.abort(),document.documentElement.classList.remove(`tray-document`)}),[]),(0,b.useEffect)(()=>{if(i!==null)return;let t=new AbortController;return e(t.signal).then(e=>{t.signal.aborted||a(e)},()=>{t.signal.aborted||s(!0)}),()=>t.abort()},[H,i,e]);let le=async(e,t,r)=>{if(i===null)return;G(`${e}:${r}`),q(null);let a=l(T);X.current=a.controller;try{let n=te(e,t,r),o=await fetch(`${i}${n.path}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n.body),signal:a.signal});if(!o.ok)throw Error(String(o.status));if(!Z.current)return;Y.current=!0,J()}catch{if(!Z.current)return;G(null),q(n(t===`codex`?`codexAuth.switchFailed`:`prov.accountSwitchFail`))}finally{a.clear(),X.current===a.controller&&(X.current=null)}};(0,b.useEffect)(()=>{if(i===null)return;let e=null,t=!1,n=!0,r=!1,a=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),o=async()=>{if(!a()||t)return;t=!0,V(!0);let n=!1,s=new AbortController;e=s;let c=e=>p(`${i}${e}`,s.signal),l=()=>!r&&!s.signal.aborted;try{let e=(async()=>{try{let e=h(await c(`/api/config`)),t=await Promise.all(e.map(async e=>{if(!e.path)return{name:e.name,switchKind:e.switchKind,accounts:[]};try{let t=await c(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await c(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,switchKind:e.switchKind,accounts:ne(t)}}catch{return{name:e.name,switchKind:e.switchKind,accounts:[],unavailable:!0}}}));l()&&(M(t),N(!1),n=!0)}catch{l()&&(M([]),N(!0))}})(),t=(async()=>{let e;try{if(e=(await c(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);l()&&(x(e),D(!1))}catch{l()&&D(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>{let n=v(await c(t));return ie(n,e)})).then(e=>{l()&&(n||=e.some(e=>e.status===`fulfilled`),k(e.map(e=>e.status===`fulfilled`?e.value:null)),j(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=y(e);try{let n=await c(`/api/usage/timeline?${t}`);l()&&(F(ee(n,e)),L(!1))}catch{l()&&(F(null),L(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,l()&&(V(!1),n&&z(Date.now()),Y.current&&(Y.current=!1,G(null))),!r&&s.signal.aborted&&a()&&o()}},s=()=>{a()?o():e?.abort()},c=()=>{n=!1,s()},l=()=>{n=!0,s()},u=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),s()};o();let d=setInterval(()=>void o(),6e4);return document.addEventListener(`visibilitychange`,s),window.addEventListener(`blur`,c),window.addEventListener(`focus`,l),window.addEventListener(`opencodex:tray-visibility`,u),()=>{r=!0,e?.abort(),clearInterval(d),document.removeEventListener(`visibilitychange`,s),window.removeEventListener(`blur`,c),window.removeEventListener(`focus`,l),window.removeEventListener(`opencodex:tray-visibility`,u)}},[H,i]);let Q=e=>_(e)?u(e,r):`—`,$=e=>{let t=e?m(e):void 0,i=t?.cacheReadInputTokens??t?.cachedInputTokens,a=_(i)&&_(t?.inputTokens)&&t.inputTokens>0?`${Math.round(i/t.inputTokens*100)}%`:`—`;return(0,w.jsxs)(`dl`,{children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`usage.card.totalTokens`)}),(0,w.jsx)(`dd`,{children:Q(t?.totalTokens)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`tray.input`)}),(0,w.jsxs)(`dd`,{children:[Q(t?.inputTokens),` `,(0,w.jsx)(`small`,{title:n(`usage.card.cachedTokens`),children:n(`tray.cached`,{percent:a})})]})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`tray.output`)}),(0,w.jsx)(`dd`,{children:Q(t?.outputTokens)})]}),c?.showCost&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{title:n(`logs.metric.estimatedCostTitle`),children:n(`tray.cost`)}),(0,w.jsx)(`dd`,{title:_(t?.requests)&&_(t?.pricedRequests)&&t.pricedRequests<t.requests?n(`usage.cost.unpricedNote`,{count:t.requests-t.pricedRequests}):n(`logs.metric.estimatedCostTitle`),children:_(t?.estimatedCostUsd)?new Intl.NumberFormat(r,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(t.estimatedCostUsd)+(_(t.pricedRequests)&&_(t.requests)&&t.pricedRequests<t.requests?`*`:``):`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`usage.card.requests`)}),(0,w.jsx)(`dd`,{children:Q(t?.requests)})]}),_(t?.requests)&&t.requests>0&&_(t.measuredRequests)&&t.measuredRequests<t.requests&&(0,w.jsxs)(`div`,{className:`tray-coverage`,title:n(`usage.coverage.note`),children:[(0,w.jsx)(`dt`,{children:n(`usage.card.coverage`)}),(0,w.jsxs)(`dd`,{children:[Math.round(t.measuredRequests/t.requests*100),`%`]})]})]})},ue=new Set(c?.hiddenProviders??[]);return(0,w.jsxs)(`main`,{className:`tray-page`,children:[(0,w.jsxs)(`header`,{children:[(0,w.jsx)(`strong`,{children:`OpenCodex`}),(0,w.jsx)(`a`,{href:`/?desktop=open#/usage`,"aria-label":n(`sub.settings`),title:n(`sub.settings`),children:`⚙`})]}),o&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),S&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`usage.companion.settingsUnavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),!c&&!S&&!o&&(0,w.jsx)(`p`,{role:`status`,children:n(`common.loading`)}),c&&(0,w.jsxs)(`section`,{className:`tray-totals`,children:[c.showToday&&(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[n(`tray.today`),E(O[0])&&(0,w.jsx)(`span`,{title:n(`usage.incomplete`),"aria-label":n(`usage.incomplete`),children:` *`})]}),$(O[0]?.summary)]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[n(`usage.range.30d`),E(O[1])&&(0,w.jsx)(`span`,{title:n(`usage.incomplete`),"aria-label":n(`usage.incomplete`),children:` *`})]}),$(O[1]?.summary)]})]}),A&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`usage.loadError`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),c?.showChart&&(0,w.jsx)(`section`,{className:`tray-chart`,children:(0,w.jsx)(re,{timeline:P,chartStyle:c.chartStyle,hours:c.chartHours,loading:!P&&!I,error:I?n(`usage.companion.timelineUnavailable`):null,onRetry:J,locale:r,t:n})}),c?.showModels&&!!O[0]?.models.length&&(0,w.jsx)(`section`,{className:`tray-models`,"aria-label":n(`usage.section.models`),children:O[0].models.map(e=>(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`span`,{title:`${e.provider}/${e.model}`,children:e.model}),(0,w.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,w.jsx)(`span`,{title:n(`usage.card.requests`),children:n(`pws.dashboard.requests`,{count:Q(e.requests)})}),(0,w.jsx)(`span`,{title:n(`usage.card.totalTokens`),children:Q(m(e).totalTokens)})]})]},`${e.provider}/${e.model}`))}),(c?.showAccounts??!0)&&(0,w.jsxs)(`section`,{className:`tray-providers`,"aria-label":n(`usage.section.providers`),children:[ce&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),K&&(0,w.jsx)(`p`,{role:`alert`,className:`tray-error`,children:K}),se.filter(e=>!ue.has(e.name)).map(e=>(0,w.jsxs)(`div`,{className:`tray-provider`,children:[(0,w.jsxs)(`h2`,{children:[(0,w.jsx)(d,{name:e.name,cls:`provider-icon tray-provider-icon`}),f(e.name,n)]}),!e.accounts.length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:n(e.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),e.accounts.map(t=>{let i=e.switchKind,a=W===`${e.name}:${t.id}`;return(0,w.jsxs)(`div`,{className:`tray-account`,children:[(0,w.jsxs)(`div`,{className:`tray-account-name`,children:[(0,w.jsxs)(`span`,{className:`tray-account-label`,title:t.label,children:[t.label,t.exhausted&&(0,w.jsx)(`span`,{className:`tray-exhausted`,title:n(`quota.limitReached`),"aria-label":n(`quota.limitReached`),children:` ⚠`})]}),(0,w.jsxs)(`span`,{className:`tray-account-meta`,children:[a&&(0,w.jsx)(`span`,{role:`status`,children:n(`pws.accountSwitching`)}),!a&&i&&t.switchState===`available`&&(0,w.jsx)(`button`,{type:`button`,className:`tray-use`,disabled:W!==null,onClick:()=>void le(e.name,i,t.id),title:n(`prov.accountSwitchTitle`),"aria-label":`${n(`prov.accountSwitchTitle`)}: ${t.label}`,children:n(`prov.accountSwitchTitle`)}),t.plan,t.active&&(0,w.jsx)(`span`,{className:`tray-active`,title:n(`prov.activeBadge`),"aria-label":n(`prov.activeBadge`),children:` ✓`})]})]}),t.email&&t.email!==t.label&&(0,w.jsx)(`div`,{className:`tray-account-email`,children:t.email}),!g(t.quota).length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:n(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),g(t.quota).map(e=>{let t=`key`in e?n(e.key):e.label,i=ae(e.reset,r),a=_(e.percent)?Math.min(100,e.percent):null;return(0,w.jsxs)(`div`,{className:`tray-quota`,children:[(0,w.jsx)(`span`,{title:t,children:t}),(0,w.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,w.jsx)(`span`,{className:`tray-bar tray-bar--${oe(a??void 0)}`,role:a===null?`img`:`meter`,"aria-label":a===null?`${t}: ${n(`pws.dashboard.noQuota`)}`:t,"aria-valuemin":a===null?void 0:0,"aria-valuemax":a===null?void 0:100,"aria-valuenow":a??void 0,"aria-valuetext":a===null?void 0:`${Math.round(a)}%`,children:(0,w.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,w.jsx)(`time`,{title:i.exact,children:i.text})]},e.id)})]},t.id)})]},e.name))]}),(0,w.jsxs)(`div`,{className:`tray-refresh`,children:[(0,w.jsx)(`button`,{type:`button`,onClick:J,disabled:B,children:n(`startup.refresh`)}),(0,w.jsx)(`span`,{role:`status`,children:n(`tray.updated`,{time:R===null?`—`:new Date(R).toLocaleTimeString(r,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,w.jsx)(`footer`,{children:(0,w.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[n(`nav.dashboard`),` `,(0,w.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{D as default};
1
+ import{A as e,C as t,j as n,m as r,n as i,o as a,p as o,s,u as c,y as l}from"./index-TmaHa54u.js";import{J as u,T as d,X as f,_ as ee,a as p,c as m,d as h,f as g,i as te,l as ne,m as re,o as ie,p as ae,r as oe,s as _,u as v,v as y}from"./quota-summary-B16x5DZZ.js";var b=n(e(),1),x={discover:r,configure:s,hasSharedSession:()=>c(`shared`),bootstrapShared:e=>a(`shared`,e)},S=()=>new DOMException(`Tray target resolution cancelled`,`AbortError`);async function C(e,t=``,n=x){if(e.aborted)throw S();let r=await n.discover(t,e);if(e.aborted||(n.configure(r),r.connected&&!n.hasSharedSession()&&await n.bootstrapShared(e),e.aborted))throw S();return o(`shared`,r)}var w=i(),T=2e4,E=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function D({resolveApiBase:e=C}={}){let{t:n,locale:r}=t(),[i,a]=(0,b.useState)(null),[o,s]=(0,b.useState)(!1),[c,x]=(0,b.useState)(null),[S,D]=(0,b.useState)(!1),[O,k]=(0,b.useState)([null,null]),[A,j]=(0,b.useState)(!1),[se,M]=(0,b.useState)([]),[ce,N]=(0,b.useState)(!1),[P,F]=(0,b.useState)(null),[I,L]=(0,b.useState)(!1),[R,z]=(0,b.useState)(null),[B,V]=(0,b.useState)(!1),[H,U]=(0,b.useState)(0),[W,G]=(0,b.useState)(null),[K,q]=(0,b.useState)(null),J=()=>{s(!1),U(e=>e+1)},Y=(0,b.useRef)(!1),X=(0,b.useRef)(null),Z=(0,b.useRef)(!0);(0,b.useEffect)(()=>(Z.current=!0,document.documentElement.classList.add(`tray-document`),()=>{Z.current=!1,X.current?.abort(),document.documentElement.classList.remove(`tray-document`)}),[]),(0,b.useEffect)(()=>{if(i!==null)return;let t=new AbortController;return e(t.signal).then(e=>{t.signal.aborted||a(e)},()=>{t.signal.aborted||s(!0)}),()=>t.abort()},[H,i,e]);let le=async(e,t,r)=>{if(i===null)return;G(`${e}:${r}`),q(null);let a=l(T);X.current=a.controller;try{let n=te(e,t,r),o=await fetch(`${i}${n.path}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n.body),signal:a.signal});if(!o.ok)throw Error(String(o.status));if(!Z.current)return;Y.current=!0,J()}catch{if(!Z.current)return;G(null),q(n(t===`codex`?`codexAuth.switchFailed`:`prov.accountSwitchFail`))}finally{a.clear(),X.current===a.controller&&(X.current=null)}};(0,b.useEffect)(()=>{if(i===null)return;let e=null,t=!1,n=!0,r=!1,a=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),o=async()=>{if(!a()||t)return;t=!0,V(!0);let n=!1,s=new AbortController;e=s;let c=e=>p(`${i}${e}`,s.signal),l=()=>!r&&!s.signal.aborted;try{let e=(async()=>{try{let e=h(await c(`/api/config`)),t=await Promise.all(e.map(async e=>{if(!e.path)return{name:e.name,switchKind:e.switchKind,accounts:[]};try{let t=await c(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await c(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,switchKind:e.switchKind,accounts:ne(t)}}catch{return{name:e.name,switchKind:e.switchKind,accounts:[],unavailable:!0}}}));l()&&(M(t),N(!1),n=!0)}catch{l()&&(M([]),N(!0))}})(),t=(async()=>{let e;try{if(e=(await c(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);l()&&(x(e),D(!1))}catch{l()&&D(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>{let n=v(await c(t));return ie(n,e)})).then(e=>{l()&&(n||=e.some(e=>e.status===`fulfilled`),k(e.map(e=>e.status===`fulfilled`?e.value:null)),j(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=y(e);try{let n=await c(`/api/usage/timeline?${t}`);l()&&(F(ee(n,e)),L(!1))}catch{l()&&(F(null),L(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,l()&&(V(!1),n&&z(Date.now()),Y.current&&(Y.current=!1,G(null))),!r&&s.signal.aborted&&a()&&o()}},s=()=>{a()?o():e?.abort()},c=()=>{n=!1,s()},l=()=>{n=!0,s()},u=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),s()};o();let d=setInterval(()=>void o(),6e4);return document.addEventListener(`visibilitychange`,s),window.addEventListener(`blur`,c),window.addEventListener(`focus`,l),window.addEventListener(`opencodex:tray-visibility`,u),()=>{r=!0,e?.abort(),clearInterval(d),document.removeEventListener(`visibilitychange`,s),window.removeEventListener(`blur`,c),window.removeEventListener(`focus`,l),window.removeEventListener(`opencodex:tray-visibility`,u)}},[H,i]);let Q=e=>_(e)?u(e,r):`—`,$=e=>{let t=e?m(e):void 0,i=t?.cacheReadInputTokens??t?.cachedInputTokens,a=_(i)&&_(t?.inputTokens)&&t.inputTokens>0?`${Math.round(i/t.inputTokens*100)}%`:`—`;return(0,w.jsxs)(`dl`,{children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`usage.card.totalTokens`)}),(0,w.jsx)(`dd`,{children:Q(t?.totalTokens)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`tray.input`)}),(0,w.jsxs)(`dd`,{children:[Q(t?.inputTokens),` `,(0,w.jsx)(`small`,{title:n(`usage.card.cachedTokens`),children:n(`tray.cached`,{percent:a})})]})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`tray.output`)}),(0,w.jsx)(`dd`,{children:Q(t?.outputTokens)})]}),c?.showCost&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{title:n(`logs.metric.estimatedCostTitle`),children:n(`tray.cost`)}),(0,w.jsx)(`dd`,{title:_(t?.requests)&&_(t?.pricedRequests)&&t.pricedRequests<t.requests?n(`usage.cost.unpricedNote`,{count:t.requests-t.pricedRequests}):n(`logs.metric.estimatedCostTitle`),children:_(t?.estimatedCostUsd)?new Intl.NumberFormat(r,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(t.estimatedCostUsd)+(_(t.pricedRequests)&&_(t.requests)&&t.pricedRequests<t.requests?`*`:``):`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:n(`usage.card.requests`)}),(0,w.jsx)(`dd`,{children:Q(t?.requests)})]}),_(t?.requests)&&t.requests>0&&_(t.measuredRequests)&&t.measuredRequests<t.requests&&(0,w.jsxs)(`div`,{className:`tray-coverage`,title:n(`usage.coverage.note`),children:[(0,w.jsx)(`dt`,{children:n(`usage.card.coverage`)}),(0,w.jsxs)(`dd`,{children:[Math.round(t.measuredRequests/t.requests*100),`%`]})]})]})},ue=new Set(c?.hiddenProviders??[]);return(0,w.jsxs)(`main`,{className:`tray-page`,children:[(0,w.jsxs)(`header`,{children:[(0,w.jsx)(`strong`,{children:`OpenCodex`}),(0,w.jsx)(`a`,{href:`/?desktop=open#/usage`,"aria-label":n(`sub.settings`),title:n(`sub.settings`),children:`⚙`})]}),o&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),S&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`usage.companion.settingsUnavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),!c&&!S&&!o&&(0,w.jsx)(`p`,{role:`status`,children:n(`common.loading`)}),c&&(0,w.jsxs)(`section`,{className:`tray-totals`,children:[c.showToday&&(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[n(`tray.today`),E(O[0])&&(0,w.jsx)(`span`,{title:n(`usage.incomplete`),"aria-label":n(`usage.incomplete`),children:` *`})]}),$(O[0]?.summary)]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[n(`usage.range.30d`),E(O[1])&&(0,w.jsx)(`span`,{title:n(`usage.incomplete`),"aria-label":n(`usage.incomplete`),children:` *`})]}),$(O[1]?.summary)]})]}),A&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`usage.loadError`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),c?.showChart&&(0,w.jsx)(`section`,{className:`tray-chart`,children:(0,w.jsx)(re,{timeline:P,chartStyle:c.chartStyle,hours:c.chartHours,loading:!P&&!I,error:I?n(`usage.companion.timelineUnavailable`):null,onRetry:J,locale:r,t:n})}),c?.showModels&&!!O[0]?.models.length&&(0,w.jsx)(`section`,{className:`tray-models`,"aria-label":n(`usage.section.models`),children:O[0].models.map(e=>(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`span`,{title:`${e.provider}/${e.model}`,children:e.model}),(0,w.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,w.jsx)(`span`,{title:n(`usage.card.requests`),children:n(`pws.dashboard.requests`,{count:Q(e.requests)})}),(0,w.jsx)(`span`,{title:n(`usage.card.totalTokens`),children:Q(m(e).totalTokens)})]})]},`${e.provider}/${e.model}`))}),(c?.showAccounts??!0)&&(0,w.jsxs)(`section`,{className:`tray-providers`,"aria-label":n(`usage.section.providers`),children:[ce&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[n(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:J,children:n(`common.retry`)})]}),K&&(0,w.jsx)(`p`,{role:`alert`,className:`tray-error`,children:K}),se.filter(e=>!ue.has(e.name)).map(e=>(0,w.jsxs)(`div`,{className:`tray-provider`,children:[(0,w.jsxs)(`h2`,{children:[(0,w.jsx)(d,{name:e.name,cls:`provider-icon tray-provider-icon`}),f(e.name,n)]}),!e.accounts.length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:n(e.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),e.accounts.map(t=>{let i=e.switchKind,a=W===`${e.name}:${t.id}`;return(0,w.jsxs)(`div`,{className:`tray-account`,children:[(0,w.jsxs)(`div`,{className:`tray-account-name`,children:[(0,w.jsxs)(`span`,{className:`tray-account-label`,title:t.label,children:[t.label,t.exhausted&&(0,w.jsx)(`span`,{className:`tray-exhausted`,title:n(`quota.limitReached`),"aria-label":n(`quota.limitReached`),children:` ⚠`})]}),(0,w.jsxs)(`span`,{className:`tray-account-meta`,children:[a&&(0,w.jsx)(`span`,{role:`status`,children:n(`pws.accountSwitching`)}),!a&&i&&t.switchState===`available`&&(0,w.jsx)(`button`,{type:`button`,className:`tray-use`,disabled:W!==null,onClick:()=>void le(e.name,i,t.id),title:n(`prov.accountSwitchTitle`),"aria-label":`${n(`prov.accountSwitchTitle`)}: ${t.label}`,children:n(`prov.accountSwitchTitle`)}),t.plan,t.active&&(0,w.jsx)(`span`,{className:`tray-active`,title:n(`prov.activeBadge`),"aria-label":n(`prov.activeBadge`),children:` ✓`})]})]}),t.email&&t.email!==t.label&&(0,w.jsx)(`div`,{className:`tray-account-email`,children:t.email}),!g(t.quota).length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:n(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),g(t.quota).map(e=>{let t=`key`in e?n(e.key):e.label,i=ae(e.reset,r),a=_(e.percent)?Math.min(100,e.percent):null;return(0,w.jsxs)(`div`,{className:`tray-quota`,children:[(0,w.jsx)(`span`,{title:t,children:t}),(0,w.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,w.jsx)(`span`,{className:`tray-bar tray-bar--${oe(a??void 0)}`,role:a===null?`img`:`meter`,"aria-label":a===null?`${t}: ${n(`pws.dashboard.noQuota`)}`:t,"aria-valuemin":a===null?void 0:0,"aria-valuemax":a===null?void 0:100,"aria-valuenow":a??void 0,"aria-valuetext":a===null?void 0:`${Math.round(a)}%`,children:(0,w.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,w.jsx)(`time`,{title:i.exact,children:i.text})]},e.id)})]},t.id)})]},e.name))]}),(0,w.jsxs)(`div`,{className:`tray-refresh`,children:[(0,w.jsx)(`button`,{type:`button`,onClick:J,disabled:B,children:n(`startup.refresh`)}),(0,w.jsx)(`span`,{role:`status`,children:n(`tray.updated`,{time:R===null?`—`:new Date(R).toLocaleTimeString(r,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,w.jsx)(`footer`,{children:(0,w.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[n(`nav.dashboard`),` `,(0,w.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{D as default};