@bitkyc08/opencodex 2.76.0 → 2.77.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 (189) hide show
  1. package/gui/dist/assets/App-COdEeqSj.css +1 -0
  2. package/gui/dist/assets/App-DEpCJEP_.js +54 -0
  3. package/gui/dist/assets/{Tray-DjNwwrWS.js → Tray-gloIYNaW.js} +1 -1
  4. package/gui/dist/assets/index-Cd7ittMv.css +1 -0
  5. package/gui/dist/assets/index-DwJKFJm5.js +94 -0
  6. package/gui/dist/assets/quota-summary-DGcEJU3h.js +1 -0
  7. package/gui/dist/index.html +4 -3
  8. package/package.json +1 -1
  9. package/src/adapters/antigravity-refusal.ts +28 -0
  10. package/src/adapters/cursor/protobuf-request.ts +6 -0
  11. package/src/adapters/cursor/request-builder.ts +3 -0
  12. package/src/adapters/cursor/structured-output.ts +13 -0
  13. package/src/adapters/cursor/types.ts +2 -0
  14. package/src/adapters/ollama-native.ts +29 -2
  15. package/src/adapters/openai-responses/passthrough.ts +133 -103
  16. package/src/adapters/openai-responses/request-strips.ts +10 -4
  17. package/src/adapters/zed.ts +26 -4
  18. package/src/bridge/response-json.ts +14 -14
  19. package/src/bridge/sse.ts +15 -5
  20. package/src/chatgpt/app-server-shim/bundle-trust.ts +40 -10
  21. package/src/chatgpt/app-server-shim/gate-rewrite.ts +3 -0
  22. package/src/claude/agents-inject.ts +4 -43
  23. package/src/claude/gateway-cache.ts +16 -13
  24. package/src/claude/inbound-model-options.ts +9 -2
  25. package/src/claude/intercept/cli-catalog.ts +27 -16
  26. package/src/claude/intercept/picker-bootstrap.ts +37 -16
  27. package/src/claude/intercept/picker-budget.ts +41 -0
  28. package/src/claude/outbound.ts +2 -0
  29. package/src/claude/subagent-force-status.ts +53 -0
  30. package/src/claude/subagent-model.ts +93 -0
  31. package/src/cli/account-api.ts +3 -0
  32. package/src/cli/account.ts +3 -1
  33. package/src/cli/agent.ts +10 -0
  34. package/src/cli/capabilities.ts +9 -0
  35. package/src/cli/chatgpt-command.ts +10 -7
  36. package/src/cli/claude.ts +22 -6
  37. package/src/cli/codex-shim-readiness.ts +89 -0
  38. package/src/cli/connect.ts +19 -0
  39. package/src/cli/dispatch.ts +3 -3
  40. package/src/cli/export-command.ts +20 -9
  41. package/src/cli/gui.ts +8 -3
  42. package/src/cli/help-catalog.ts +84 -0
  43. package/src/cli/help-models-context.ts +17 -0
  44. package/src/cli/help-navigation.ts +50 -0
  45. package/src/cli/help-recovery.ts +66 -0
  46. package/src/cli/help.ts +52 -8
  47. package/src/cli/models-runtime.ts +2 -1
  48. package/src/cli/opencode.ts +54 -10
  49. package/src/cli/provider.ts +3 -29
  50. package/src/cli/registry.ts +29 -5
  51. package/src/cli/root.ts +30 -9
  52. package/src/cli/runtime-api.ts +1 -1
  53. package/src/cli/tray-proxy.ts +3 -2
  54. package/src/clients/config-export/contracts.ts +100 -0
  55. package/src/clients/config-export/droid.ts +54 -2
  56. package/src/clients/config-export/kilo.ts +12 -2
  57. package/src/clients/config-export/model-metadata.ts +10 -4
  58. package/src/clients/config-export/reasoning-metadata.ts +47 -0
  59. package/src/clients/config-export.ts +46 -66
  60. package/src/clients/omo-role-models.ts +17 -3
  61. package/src/codex/account-credit-use.ts +4 -2
  62. package/src/codex/account-runtime-state.ts +21 -0
  63. package/src/codex/account-store.ts +11 -47
  64. package/src/codex/account-usability.ts +11 -8
  65. package/src/codex/auth-api/account-list.ts +73 -63
  66. package/src/codex/auth-api/main-account-probe.ts +25 -12
  67. package/src/codex/auth-api/pool-mode-gate.ts +6 -9
  68. package/src/codex/auth-api/pool-quota-probe.ts +2 -4
  69. package/src/codex/auth-api/reset-credit-service.ts +3 -2
  70. package/src/codex/auth-context.ts +30 -11
  71. package/src/codex/catalog/aggregation.ts +3 -0
  72. package/src/codex/catalog/model-hints.ts +2 -1
  73. package/src/codex/catalog/model-visibility.ts +6 -3
  74. package/src/codex/catalog/parsing.ts +2 -0
  75. package/src/codex/catalog/provider-models.ts +13 -4
  76. package/src/codex/catalog/retained-sync.ts +2 -1
  77. package/src/codex/chatgpt-refresh-failure.ts +56 -0
  78. package/src/codex/convergence.ts +2 -1
  79. package/src/codex/main-account.ts +144 -11
  80. package/src/codex/quota-refresh-outcome.ts +17 -2
  81. package/src/codex/quota-types.ts +33 -1
  82. package/src/codex/quota.ts +56 -15
  83. package/src/codex/routing/cooldown-math.ts +10 -4
  84. package/src/codex/routing/selection.ts +11 -4
  85. package/src/codex/routing.ts +9 -9
  86. package/src/codex/shim-path-resolution.ts +133 -0
  87. package/src/codex/shim.ts +39 -39
  88. package/src/codex/subagent-model-fallback.ts +2 -1
  89. package/src/combos/failover.ts +82 -1
  90. package/src/combos/jev.ts +13 -3
  91. package/src/config/diagnostics.ts +4 -0
  92. package/src/config/load-degrade.ts +4 -0
  93. package/src/config/provider-validation.ts +3 -0
  94. package/src/config/schema/compaction-triggers.ts +8 -0
  95. package/src/config/schema/config-schema.ts +11 -0
  96. package/src/config/schema/leaf-validators.ts +5 -1
  97. package/src/config/subagent-models.ts +12 -0
  98. package/src/generated/compatibility-version.json +245 -153
  99. package/src/grok/session-identity.ts +33 -0
  100. package/src/integrations/catalog-refresh.ts +1 -1
  101. package/src/integrations/mutation-plan.ts +4 -2
  102. package/src/integrations/state.ts +68 -6
  103. package/src/integrations/writer.ts +18 -4
  104. package/src/lib/gui-pair-capability.ts +17 -0
  105. package/src/lib/provider-client-headers.ts +62 -0
  106. package/src/oauth/anthropic-continuity.ts +65 -0
  107. package/src/oauth/anthropic-identity.ts +75 -0
  108. package/src/oauth/anthropic-routing.ts +3 -3
  109. package/src/oauth/anthropic.ts +7 -1
  110. package/src/oauth/generic-account-failover.ts +21 -0
  111. package/src/oauth/health.ts +32 -5
  112. package/src/oauth/index.ts +36 -27
  113. package/src/oauth/local-token-detect.ts +7 -0
  114. package/src/oauth/refresh-policy.ts +2 -0
  115. package/src/oauth/store.ts +55 -6
  116. package/src/oauth/types.ts +9 -0
  117. package/src/protocols/encoders/messages.ts +4 -3
  118. package/src/providers/antigravity-effort-families.ts +75 -0
  119. package/src/providers/antigravity-models.ts +54 -16
  120. package/src/providers/antigravity-wire-snapshot.ts +66 -0
  121. package/src/providers/derive.ts +2 -0
  122. package/src/providers/model-rename-fields.ts +3 -0
  123. package/src/providers/new-model-policy.ts +48 -10
  124. package/src/providers/registry/entries-extended.ts +3 -0
  125. package/src/providers/registry/model-ids.ts +2 -0
  126. package/src/providers/registry/model-seeds.ts +5 -0
  127. package/src/providers/registry/types.ts +4 -0
  128. package/src/responses/compaction.ts +19 -0
  129. package/src/router.ts +6 -0
  130. package/src/server/auth-cors.ts +9 -0
  131. package/src/server/chat-completions.ts +10 -0
  132. package/src/server/claude-messages.ts +18 -11
  133. package/src/server/droid-reasoning-default.ts +50 -0
  134. package/src/server/github-copilot-responses-repair.ts +3 -6
  135. package/src/server/grok-responses-control-frame.ts +2 -2
  136. package/src/server/grok-responses-snapshot-repair.ts +4 -5
  137. package/src/server/gui-session.ts +33 -11
  138. package/src/server/index/claude-intercept-lifecycle.ts +4 -0
  139. package/src/server/index/serve-options.ts +2 -1
  140. package/src/server/management/agent-settings-routes.ts +6 -129
  141. package/src/server/management/config-routes.ts +1 -1
  142. package/src/server/management/integration-routes.ts +64 -6
  143. package/src/server/management/link-routes.ts +20 -13
  144. package/src/server/management/model-row-export-metadata.ts +150 -0
  145. package/src/server/management/model-rows.ts +148 -9
  146. package/src/server/management/route-registry.ts +4 -3
  147. package/src/server/management/shared.ts +19 -5
  148. package/src/server/management/subagent-model-routes.ts +214 -0
  149. package/src/server/relay.ts +14 -44
  150. package/src/server/request-log-generation-window.ts +38 -0
  151. package/src/server/request-log.ts +13 -0
  152. package/src/server/responses/adapter-dispatch.ts +100 -1
  153. package/src/server/responses/codex-auth-error.ts +10 -2
  154. package/src/server/responses/combo-stream-preflight.ts +29 -3
  155. package/src/server/responses/compaction-routing.ts +10 -1
  156. package/src/server/responses/core-auth.ts +57 -26
  157. package/src/server/responses/core-codex-account.ts +6 -3
  158. package/src/server/responses/core-combo-failure.ts +5 -1
  159. package/src/server/responses/core-combo-native.ts +7 -1
  160. package/src/server/responses/core-combo.ts +18 -1
  161. package/src/server/responses/core-normalize.ts +7 -0
  162. package/src/server/responses/core-options.ts +5 -0
  163. package/src/server/responses/fetch-helpers.ts +9 -0
  164. package/src/server/responses/passthrough-delivery.ts +1 -1
  165. package/src/server/responses/policy-fallback.ts +1 -1
  166. package/src/server/responses/request-prepare.ts +5 -0
  167. package/src/server/responses/request-spend.ts +30 -30
  168. package/src/server/responses-custom-tool-repair.ts +2 -2
  169. package/src/server/responses-hosted-image-display.ts +70 -9
  170. package/src/server/responses-terminal-repair.ts +15 -2
  171. package/src/server/sse-frame-buffer.ts +38 -36
  172. package/src/server/sse-payload-rewrite.ts +78 -49
  173. package/src/server/ws-bridge.ts +1 -11
  174. package/src/service/windows-taskxml.ts +1 -2
  175. package/src/service-manager-probe.ts +36 -2
  176. package/src/types/config.ts +4 -0
  177. package/src/types/provider.ts +18 -0
  178. package/src/update/npm-invocation.mjs +35 -3
  179. package/src/update/proxy-liveness-probe.mjs +38 -8
  180. package/src/usage/expected-prices.ts +9 -0
  181. package/src/usage/log.ts +7 -0
  182. package/src/usage/summary.ts +82 -1
  183. package/src/web-search/loop.ts +11 -8
  184. package/src/web-search/run-turn-loop.ts +10 -7
  185. package/gui/dist/assets/App-CddorHdA.js +0 -51
  186. package/gui/dist/assets/App-DMudtISW.css +0 -1
  187. package/gui/dist/assets/index-Btze1I3T.css +0 -1
  188. package/gui/dist/assets/index-CvnY7E6i.js +0 -86
  189. package/gui/dist/assets/quota-summary-B_AWpHfP.js +0 -1
@@ -1 +1 @@
1
- import{D as e,O as t,_ as n,b as r,n as i}from"./index-CvnY7E6i.js";import{J as a,T as o,X as s,_ as c,a as ee,c as l,d as u,f as d,i as f,l as p,m,o as h,p as g,r as te,s as _,u as v,v as y}from"./quota-summary-B_AWpHfP.js";var b=t(e(),1),x=i(),S=2e4,C=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function w(){let{t:e,locale:t}=r(),[i,w]=(0,b.useState)(null),[T,E]=(0,b.useState)(!1),[D,O]=(0,b.useState)([null,null]),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)([]),[N,P]=(0,b.useState)(!1),[F,I]=(0,b.useState)(null),[L,R]=(0,b.useState)(!1),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(!1),[U,W]=(0,b.useState)(0),[G,K]=(0,b.useState)(null),[q,J]=(0,b.useState)(null),Y=()=>W(e=>e+1),X=(0,b.useRef)(!1),Z=async(t,r,i)=>{K(`${t}:${i}`),J(null);let a=n(S);try{let e=f(t,r,i),n=await fetch(e.path,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e.body),signal:a.signal});if(!n.ok)throw Error(String(n.status));X.current=!0,Y()}catch{K(null),J(e(r===`codex`?`codexAuth.switchFailed`:`prov.accountSwitchFail`))}finally{a.clear()}};(0,b.useEffect)(()=>{document.documentElement.classList.add(`tray-document`);let e=null,t=!1,n=!0,r=!1,i=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),a=async()=>{if(!i()||t)return;t=!0,H(!0);let n=!1,o=new AbortController;e=o;let s=e=>ee(e,o.signal),l=()=>!r&&!o.signal.aborted;try{let e=(async()=>{try{let e=u(await s(`/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 s(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await s(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,switchKind:e.switchKind,accounts:p(t)}}catch{return{name:e.name,switchKind:e.switchKind,accounts:[],unavailable:!0}}}));l()&&(M(t),P(!1),n=!0)}catch{l()&&(M([]),P(!0))}})(),t=(async()=>{let e;try{if(e=(await s(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);l()&&(w(e),E(!1))}catch{l()&&E(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>{let n=v(await s(t));return h(n,e)})).then(e=>{l()&&(n||=e.some(e=>e.status===`fulfilled`),O(e.map(e=>e.status===`fulfilled`?e.value:null)),A(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=y(e);try{let n=await s(`/api/usage/timeline?${t}`);l()&&(I(c(n,e)),R(!1))}catch{l()&&(I(null),R(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,l()&&(H(!1),n&&B(Date.now()),X.current&&(X.current=!1,K(null))),!r&&o.signal.aborted&&i()&&a()}},o=()=>{i()?a():e?.abort()},s=()=>{n=!1,o()},l=()=>{n=!0,o()},d=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),o()};a();let f=setInterval(()=>void a(),6e4);return document.addEventListener(`visibilitychange`,o),window.addEventListener(`blur`,s),window.addEventListener(`focus`,l),window.addEventListener(`opencodex:tray-visibility`,d),()=>{r=!0,e?.abort(),clearInterval(f),document.documentElement.classList.remove(`tray-document`),document.removeEventListener(`visibilitychange`,o),window.removeEventListener(`blur`,s),window.removeEventListener(`focus`,l),window.removeEventListener(`opencodex:tray-visibility`,d)}},[U]);let Q=e=>_(e)?a(e,t):`—`,$=n=>{let r=n?l(n):void 0,a=r?.cacheReadInputTokens??r?.cachedInputTokens,o=_(a)&&_(r?.inputTokens)&&r.inputTokens>0?`${Math.round(a/r.inputTokens*100)}%`:`—`;return(0,x.jsxs)(`dl`,{children:[(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`usage.card.totalTokens`)}),(0,x.jsx)(`dd`,{children:Q(r?.totalTokens)})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`tray.input`)}),(0,x.jsxs)(`dd`,{children:[Q(r?.inputTokens),` `,(0,x.jsx)(`small`,{title:e(`usage.card.cachedTokens`),children:e(`tray.cached`,{percent:o})})]})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`tray.output`)}),(0,x.jsx)(`dd`,{children:Q(r?.outputTokens)})]}),i?.showCost&&(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{title:e(`logs.metric.estimatedCostTitle`),children:e(`tray.cost`)}),(0,x.jsx)(`dd`,{title:_(r?.requests)&&_(r?.pricedRequests)&&r.pricedRequests<r.requests?e(`usage.cost.unpricedNote`,{count:r.requests-r.pricedRequests}):e(`logs.metric.estimatedCostTitle`),children:_(r?.estimatedCostUsd)?new Intl.NumberFormat(t,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(r.estimatedCostUsd)+(_(r.pricedRequests)&&_(r.requests)&&r.pricedRequests<r.requests?`*`:``):`—`})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`usage.card.requests`)}),(0,x.jsx)(`dd`,{children:Q(r?.requests)})]}),_(r?.requests)&&r.requests>0&&_(r.measuredRequests)&&r.measuredRequests<r.requests&&(0,x.jsxs)(`div`,{className:`tray-coverage`,title:e(`usage.coverage.note`),children:[(0,x.jsx)(`dt`,{children:e(`usage.card.coverage`)}),(0,x.jsxs)(`dd`,{children:[Math.round(r.measuredRequests/r.requests*100),`%`]})]})]})},ne=new Set(i?.hiddenProviders??[]);return(0,x.jsxs)(`main`,{className:`tray-page`,children:[(0,x.jsxs)(`header`,{children:[(0,x.jsx)(`strong`,{children:`OpenCodex`}),(0,x.jsx)(`a`,{href:`/?desktop=open#/usage`,"aria-label":e(`sub.settings`),title:e(`sub.settings`),children:`⚙`})]}),T&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.companion.settingsUnavailable`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),!i&&!T&&(0,x.jsx)(`p`,{role:`status`,children:e(`common.loading`)}),i&&(0,x.jsxs)(`section`,{className:`tray-totals`,children:[i.showToday&&(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`h2`,{children:[e(`tray.today`),C(D[0])&&(0,x.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),$(D[0]?.summary)]}),(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`h2`,{children:[e(`usage.range.30d`),C(D[1])&&(0,x.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),$(D[1]?.summary)]})]}),k&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.loadError`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),i?.showChart&&(0,x.jsx)(`section`,{className:`tray-chart`,children:(0,x.jsx)(m,{timeline:F,chartStyle:i.chartStyle,hours:i.chartHours,loading:!F&&!L,error:L?e(`usage.companion.timelineUnavailable`):null,onRetry:Y,locale:t,t:e})}),i?.showModels&&!!D[0]?.models.length&&(0,x.jsx)(`section`,{className:`tray-models`,"aria-label":e(`usage.section.models`),children:D[0].models.map(t=>(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`span`,{title:`${t.provider}/${t.model}`,children:t.model}),(0,x.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,x.jsx)(`span`,{title:e(`usage.card.requests`),children:e(`pws.dashboard.requests`,{count:Q(t.requests)})}),(0,x.jsx)(`span`,{title:e(`usage.card.totalTokens`),children:Q(l(t).totalTokens)})]})]},`${t.provider}/${t.model}`))}),(i?.showAccounts??!0)&&(0,x.jsxs)(`section`,{className:`tray-providers`,"aria-label":e(`usage.section.providers`),children:[N&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`startup.tray.unavailable`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),q&&(0,x.jsx)(`p`,{role:`alert`,className:`tray-error`,children:q}),j.filter(e=>!ne.has(e.name)).map(n=>(0,x.jsxs)(`div`,{className:`tray-provider`,children:[(0,x.jsxs)(`h2`,{children:[(0,x.jsx)(o,{name:n.name,cls:`provider-icon tray-provider-icon`}),s(n.name,e)]}),!n.accounts.length&&(0,x.jsx)(`div`,{className:`tray-missing`,children:e(n.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),n.accounts.map(r=>{let i=n.switchKind,a=G===`${n.name}:${r.id}`;return(0,x.jsxs)(`div`,{className:`tray-account`,children:[(0,x.jsxs)(`div`,{className:`tray-account-name`,children:[(0,x.jsxs)(`span`,{className:`tray-account-label`,title:r.label,children:[r.label,r.exhausted&&(0,x.jsx)(`span`,{className:`tray-exhausted`,title:e(`quota.limitReached`),"aria-label":e(`quota.limitReached`),children:` ⚠`})]}),(0,x.jsxs)(`span`,{className:`tray-account-meta`,children:[a&&(0,x.jsx)(`span`,{role:`status`,children:e(`pws.accountSwitching`)}),!a&&i&&r.switchState===`available`&&(0,x.jsx)(`button`,{type:`button`,className:`tray-use`,disabled:G!==null,onClick:()=>void Z(n.name,i,r.id),title:e(`prov.accountSwitchTitle`),"aria-label":`${e(`prov.accountSwitchTitle`)}: ${r.label}`,children:e(`prov.accountSwitchTitle`)}),r.plan,r.active&&(0,x.jsx)(`span`,{className:`tray-active`,title:e(`prov.activeBadge`),"aria-label":e(`prov.activeBadge`),children:` ✓`})]})]}),r.email&&r.email!==r.label&&(0,x.jsx)(`div`,{className:`tray-account-email`,children:r.email}),!d(r.quota).length&&(0,x.jsx)(`div`,{className:`tray-missing`,children:e(r.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),d(r.quota).map(n=>{let r=`key`in n?e(n.key):n.label,i=g(n.reset,t),a=_(n.percent)?Math.min(100,n.percent):null;return(0,x.jsxs)(`div`,{className:`tray-quota`,children:[(0,x.jsx)(`span`,{title:r,children:r}),(0,x.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,x.jsx)(`span`,{className:`tray-bar tray-bar--${te(a??void 0)}`,role:a===null?`img`:`meter`,"aria-label":a===null?`${r}: ${e(`pws.dashboard.noQuota`)}`:r,"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,x.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,x.jsx)(`time`,{title:i.exact,children:i.text})]},n.id)})]},r.id)})]},n.name))]}),(0,x.jsxs)(`div`,{className:`tray-refresh`,children:[(0,x.jsx)(`button`,{type:`button`,onClick:Y,disabled:V,children:e(`startup.refresh`)}),(0,x.jsx)(`span`,{role:`status`,children:e(`tray.updated`,{time:z===null?`—`:new Date(z).toLocaleTimeString(t,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,x.jsx)(`footer`,{children:(0,x.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[e(`nav.dashboard`),` `,(0,x.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{w as default};
1
+ import{D as e,O as t,_ as n,b as r,n as i}from"./index-DwJKFJm5.js";import{J as a,T as o,X as s,_ as c,a as ee,c as l,d as u,f as d,i as f,l as p,m,o as h,p as g,r as te,s as _,u as v,v as y}from"./quota-summary-DGcEJU3h.js";var b=t(e(),1),x=i(),S=2e4,C=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function w(){let{t:e,locale:t}=r(),[i,w]=(0,b.useState)(null),[T,E]=(0,b.useState)(!1),[D,O]=(0,b.useState)([null,null]),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)([]),[N,P]=(0,b.useState)(!1),[F,I]=(0,b.useState)(null),[L,R]=(0,b.useState)(!1),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(!1),[U,W]=(0,b.useState)(0),[G,K]=(0,b.useState)(null),[q,J]=(0,b.useState)(null),Y=()=>W(e=>e+1),X=(0,b.useRef)(!1),Z=async(t,r,i)=>{K(`${t}:${i}`),J(null);let a=n(S);try{let e=f(t,r,i),n=await fetch(e.path,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e.body),signal:a.signal});if(!n.ok)throw Error(String(n.status));X.current=!0,Y()}catch{K(null),J(e(r===`codex`?`codexAuth.switchFailed`:`prov.accountSwitchFail`))}finally{a.clear()}};(0,b.useEffect)(()=>{document.documentElement.classList.add(`tray-document`);let e=null,t=!1,n=!0,r=!1,i=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),a=async()=>{if(!i()||t)return;t=!0,H(!0);let n=!1,o=new AbortController;e=o;let s=e=>ee(e,o.signal),l=()=>!r&&!o.signal.aborted;try{let e=(async()=>{try{let e=u(await s(`/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 s(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await s(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,switchKind:e.switchKind,accounts:p(t)}}catch{return{name:e.name,switchKind:e.switchKind,accounts:[],unavailable:!0}}}));l()&&(M(t),P(!1),n=!0)}catch{l()&&(M([]),P(!0))}})(),t=(async()=>{let e;try{if(e=(await s(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);l()&&(w(e),E(!1))}catch{l()&&E(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>{let n=v(await s(t));return h(n,e)})).then(e=>{l()&&(n||=e.some(e=>e.status===`fulfilled`),O(e.map(e=>e.status===`fulfilled`?e.value:null)),A(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=y(e);try{let n=await s(`/api/usage/timeline?${t}`);l()&&(I(c(n,e)),R(!1))}catch{l()&&(I(null),R(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,l()&&(H(!1),n&&B(Date.now()),X.current&&(X.current=!1,K(null))),!r&&o.signal.aborted&&i()&&a()}},o=()=>{i()?a():e?.abort()},s=()=>{n=!1,o()},l=()=>{n=!0,o()},d=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),o()};a();let f=setInterval(()=>void a(),6e4);return document.addEventListener(`visibilitychange`,o),window.addEventListener(`blur`,s),window.addEventListener(`focus`,l),window.addEventListener(`opencodex:tray-visibility`,d),()=>{r=!0,e?.abort(),clearInterval(f),document.documentElement.classList.remove(`tray-document`),document.removeEventListener(`visibilitychange`,o),window.removeEventListener(`blur`,s),window.removeEventListener(`focus`,l),window.removeEventListener(`opencodex:tray-visibility`,d)}},[U]);let Q=e=>_(e)?a(e,t):`—`,$=n=>{let r=n?l(n):void 0,a=r?.cacheReadInputTokens??r?.cachedInputTokens,o=_(a)&&_(r?.inputTokens)&&r.inputTokens>0?`${Math.round(a/r.inputTokens*100)}%`:`—`;return(0,x.jsxs)(`dl`,{children:[(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`usage.card.totalTokens`)}),(0,x.jsx)(`dd`,{children:Q(r?.totalTokens)})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`tray.input`)}),(0,x.jsxs)(`dd`,{children:[Q(r?.inputTokens),` `,(0,x.jsx)(`small`,{title:e(`usage.card.cachedTokens`),children:e(`tray.cached`,{percent:o})})]})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`tray.output`)}),(0,x.jsx)(`dd`,{children:Q(r?.outputTokens)})]}),i?.showCost&&(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{title:e(`logs.metric.estimatedCostTitle`),children:e(`tray.cost`)}),(0,x.jsx)(`dd`,{title:_(r?.requests)&&_(r?.pricedRequests)&&r.pricedRequests<r.requests?e(`usage.cost.unpricedNote`,{count:r.requests-r.pricedRequests}):e(`logs.metric.estimatedCostTitle`),children:_(r?.estimatedCostUsd)?new Intl.NumberFormat(t,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(r.estimatedCostUsd)+(_(r.pricedRequests)&&_(r.requests)&&r.pricedRequests<r.requests?`*`:``):`—`})]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`dt`,{children:e(`usage.card.requests`)}),(0,x.jsx)(`dd`,{children:Q(r?.requests)})]}),_(r?.requests)&&r.requests>0&&_(r.measuredRequests)&&r.measuredRequests<r.requests&&(0,x.jsxs)(`div`,{className:`tray-coverage`,title:e(`usage.coverage.note`),children:[(0,x.jsx)(`dt`,{children:e(`usage.card.coverage`)}),(0,x.jsxs)(`dd`,{children:[Math.round(r.measuredRequests/r.requests*100),`%`]})]})]})},ne=new Set(i?.hiddenProviders??[]);return(0,x.jsxs)(`main`,{className:`tray-page`,children:[(0,x.jsxs)(`header`,{children:[(0,x.jsx)(`strong`,{children:`OpenCodex`}),(0,x.jsx)(`a`,{href:`/?desktop=open#/usage`,"aria-label":e(`sub.settings`),title:e(`sub.settings`),children:`⚙`})]}),T&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.companion.settingsUnavailable`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),!i&&!T&&(0,x.jsx)(`p`,{role:`status`,children:e(`common.loading`)}),i&&(0,x.jsxs)(`section`,{className:`tray-totals`,children:[i.showToday&&(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`h2`,{children:[e(`tray.today`),C(D[0])&&(0,x.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),$(D[0]?.summary)]}),(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`h2`,{children:[e(`usage.range.30d`),C(D[1])&&(0,x.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),$(D[1]?.summary)]})]}),k&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.loadError`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),i?.showChart&&(0,x.jsx)(`section`,{className:`tray-chart`,children:(0,x.jsx)(m,{timeline:F,chartStyle:i.chartStyle,hours:i.chartHours,loading:!F&&!L,error:L?e(`usage.companion.timelineUnavailable`):null,onRetry:Y,locale:t,t:e})}),i?.showModels&&!!D[0]?.models.length&&(0,x.jsx)(`section`,{className:`tray-models`,"aria-label":e(`usage.section.models`),children:D[0].models.map(t=>(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`span`,{title:`${t.provider}/${t.model}`,children:t.model}),(0,x.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,x.jsx)(`span`,{title:e(`usage.card.requests`),children:e(`pws.dashboard.requests`,{count:Q(t.requests)})}),(0,x.jsx)(`span`,{title:e(`usage.card.totalTokens`),children:Q(l(t).totalTokens)})]})]},`${t.provider}/${t.model}`))}),(i?.showAccounts??!0)&&(0,x.jsxs)(`section`,{className:`tray-providers`,"aria-label":e(`usage.section.providers`),children:[N&&(0,x.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`startup.tray.unavailable`),` `,(0,x.jsx)(`button`,{onClick:Y,children:e(`common.retry`)})]}),q&&(0,x.jsx)(`p`,{role:`alert`,className:`tray-error`,children:q}),j.filter(e=>!ne.has(e.name)).map(n=>(0,x.jsxs)(`div`,{className:`tray-provider`,children:[(0,x.jsxs)(`h2`,{children:[(0,x.jsx)(o,{name:n.name,cls:`provider-icon tray-provider-icon`}),s(n.name,e)]}),!n.accounts.length&&(0,x.jsx)(`div`,{className:`tray-missing`,children:e(n.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),n.accounts.map(r=>{let i=n.switchKind,a=G===`${n.name}:${r.id}`;return(0,x.jsxs)(`div`,{className:`tray-account`,children:[(0,x.jsxs)(`div`,{className:`tray-account-name`,children:[(0,x.jsxs)(`span`,{className:`tray-account-label`,title:r.label,children:[r.label,r.exhausted&&(0,x.jsx)(`span`,{className:`tray-exhausted`,title:e(`quota.limitReached`),"aria-label":e(`quota.limitReached`),children:` ⚠`})]}),(0,x.jsxs)(`span`,{className:`tray-account-meta`,children:[a&&(0,x.jsx)(`span`,{role:`status`,children:e(`pws.accountSwitching`)}),!a&&i&&r.switchState===`available`&&(0,x.jsx)(`button`,{type:`button`,className:`tray-use`,disabled:G!==null,onClick:()=>void Z(n.name,i,r.id),title:e(`prov.accountSwitchTitle`),"aria-label":`${e(`prov.accountSwitchTitle`)}: ${r.label}`,children:e(`prov.accountSwitchTitle`)}),r.plan,r.active&&(0,x.jsx)(`span`,{className:`tray-active`,title:e(`prov.activeBadge`),"aria-label":e(`prov.activeBadge`),children:` ✓`})]})]}),r.email&&r.email!==r.label&&(0,x.jsx)(`div`,{className:`tray-account-email`,children:r.email}),!d(r.quota).length&&(0,x.jsx)(`div`,{className:`tray-missing`,children:e(r.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),d(r.quota).map(n=>{let r=`key`in n?e(n.key):n.label,i=g(n.reset,t),a=_(n.percent)?Math.min(100,n.percent):null;return(0,x.jsxs)(`div`,{className:`tray-quota`,children:[(0,x.jsx)(`span`,{title:r,children:r}),(0,x.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,x.jsx)(`span`,{className:`tray-bar tray-bar--${te(a??void 0)}`,role:a===null?`img`:`meter`,"aria-label":a===null?`${r}: ${e(`pws.dashboard.noQuota`)}`:r,"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,x.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,x.jsx)(`time`,{title:i.exact,children:i.text})]},n.id)})]},r.id)})]},n.name))]}),(0,x.jsxs)(`div`,{className:`tray-refresh`,children:[(0,x.jsx)(`button`,{type:`button`,onClick:Y,disabled:V,children:e(`startup.refresh`)}),(0,x.jsx)(`span`,{role:`status`,children:e(`tray.updated`,{time:z===null?`—`:new Date(z).toLocaleTimeString(t,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,x.jsx)(`footer`,{children:(0,x.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[e(`nav.dashboard`),` `,(0,x.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{w as default};