@bitkyc08/opencodex 2.63.0-preview.20260923 → 2.64.0-preview.20260923

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 (262) hide show
  1. package/AGENTS_INSTALL.md +4 -3
  2. package/README.md +46 -33
  3. package/assets/download-linux.svg +10 -0
  4. package/assets/download-macos.svg +10 -0
  5. package/assets/download-windows.svg +10 -0
  6. package/bin/ocx.mjs +12 -4
  7. package/gui/dist/assets/App-D5eN1TID.js +50 -0
  8. package/gui/dist/assets/App-I5AnaSLh.css +1 -0
  9. package/gui/dist/assets/{Tray-B03pW-Uf.js → Tray-Bh_ErQDh.js} +1 -1
  10. package/gui/dist/assets/index-BEq4OCOz.js +86 -0
  11. package/gui/dist/assets/index-DiBRuK-d.css +1 -0
  12. package/gui/dist/assets/usage-companion-chart-DBG_37kQ.js +1 -0
  13. package/gui/dist/index.html +2 -2
  14. package/native/remote-workspace-helper/src/protocol.rs +5 -0
  15. package/package.json +4 -1
  16. package/src/adapters/anthropic.ts +66 -7
  17. package/src/adapters/codebuddy/adapter.ts +112 -16
  18. package/src/adapters/codebuddy/mcp-server.ts +180 -0
  19. package/src/adapters/codebuddy/scaffold-guard.ts +25 -8
  20. package/src/adapters/codebuddy/tool-bridge.ts +597 -0
  21. package/src/adapters/coding-agent/protocol.ts +123 -10
  22. package/src/adapters/coding-agent/turn.ts +324 -2
  23. package/src/adapters/command-code-restored-schema.ts +112 -0
  24. package/src/adapters/command-code-tool-text.ts +589 -0
  25. package/src/adapters/command-code.ts +80 -6
  26. package/src/adapters/cursor/catalog.ts +12 -0
  27. package/src/adapters/cursor/current-request.ts +46 -0
  28. package/src/adapters/cursor/discovery.ts +1 -1
  29. package/src/adapters/cursor/effort-map.ts +4 -0
  30. package/src/adapters/cursor/native-exec.ts +15 -0
  31. package/src/adapters/cursor/protobuf-events.ts +40 -12
  32. package/src/adapters/cursor/protobuf-request.ts +83 -18
  33. package/src/adapters/cursor/request-builder.ts +5 -4
  34. package/src/adapters/cursor/tool-guidance.ts +1 -1
  35. package/src/adapters/devin/live-models.ts +7 -0
  36. package/src/adapters/inline-think-tags.ts +251 -0
  37. package/src/adapters/kiro/adapter.ts +1 -0
  38. package/src/adapters/kiro/stream.ts +5 -3
  39. package/src/adapters/kiro/usage.ts +4 -3
  40. package/src/adapters/mimo-free.ts +37 -18
  41. package/src/adapters/openai-chat/messages.ts +5 -5
  42. package/src/adapters/openai-chat/tool-schema.ts +124 -2
  43. package/src/adapters/openai-chat.ts +13 -3
  44. package/src/adapters/openai-responses/passthrough.ts +15 -2
  45. package/src/adapters/openai-responses/reasoning.ts +14 -1
  46. package/src/adapters/openai-responses/request-strips.ts +29 -3
  47. package/src/adapters/openai-responses/tool-output-recovery.ts +9 -3
  48. package/src/adapters/qoder/adapter.ts +15 -12
  49. package/src/adapters/qoder/scaffold-guard.ts +45 -13
  50. package/src/bridge/internal.ts +20 -0
  51. package/src/bridge/sse.ts +14 -5
  52. package/src/claude/agents-inject.ts +2 -1
  53. package/src/claude/desktop-applied-marker.ts +44 -0
  54. package/src/claude/desktop-profile.ts +22 -12
  55. package/src/claude/inbound.ts +8 -3
  56. package/src/cli/access.ts +22 -5
  57. package/src/cli/account-api.ts +6 -0
  58. package/src/cli/account-auth.ts +5 -2
  59. package/src/cli/account.ts +5 -6
  60. package/src/cli/aside-profiles.ts +61 -1
  61. package/src/cli/claude-desktop.ts +3 -2
  62. package/src/cli/claude.ts +3 -1
  63. package/src/cli/codex-cli-update.ts +2 -2
  64. package/src/cli/codex-shim-autorestore.ts +3 -0
  65. package/src/cli/dispatch.ts +12 -4
  66. package/src/cli/index.ts +98 -10
  67. package/src/cli/registry.ts +1 -1
  68. package/src/cli/resolve.ts +113 -1
  69. package/src/cli/root.ts +5 -0
  70. package/src/cli/stop-approval.ts +186 -0
  71. package/src/cli/stop-report.ts +1 -1
  72. package/src/cli/system-restart-client.ts +19 -4
  73. package/src/client/hub-client.ts +25 -18
  74. package/src/clients/config-export.ts +12 -4
  75. package/src/codex/account-auto-switch.ts +59 -0
  76. package/src/codex/account-lifecycle.ts +7 -0
  77. package/src/codex/account-priority.ts +10 -0
  78. package/src/codex/account-usability.ts +9 -0
  79. package/src/codex/auth-api/account-list.ts +5 -0
  80. package/src/codex/auth-api/login-flow.ts +15 -5
  81. package/src/codex/auth-api/login-state.ts +5 -16
  82. package/src/codex/auth-api/pool-mode-gate.ts +30 -7
  83. package/src/codex/auth-api/routes.ts +39 -3
  84. package/src/codex/auth-context.ts +145 -17
  85. package/src/codex/catalog/build-entries.ts +2 -1
  86. package/src/codex/catalog/effort.ts +8 -2
  87. package/src/codex/catalog/metadata.ts +33 -7
  88. package/src/codex/catalog/native-models.ts +102 -5
  89. package/src/codex/catalog/parsing.ts +2 -0
  90. package/src/codex/catalog/provider-models.ts +19 -6
  91. package/src/codex/cli-installation-targets.ts +44 -40
  92. package/src/codex/codex-write-lock.ts +32 -2
  93. package/src/codex/inject/multi-agent-v2.ts +90 -0
  94. package/src/codex/inject/plan.ts +365 -0
  95. package/src/codex/inject.ts +237 -362
  96. package/src/codex/log-guard/maintenance.ts +30 -13
  97. package/src/codex/project-config-warnings.ts +47 -7
  98. package/src/codex/prompt-layers/encoding.ts +41 -0
  99. package/src/codex/prompt-layers/toml-read.ts +1 -1
  100. package/src/codex/prompt-layers.ts +17 -13
  101. package/src/codex/prompt-text-probe.ts +20 -10
  102. package/src/codex/quota-observation-freshness.ts +34 -0
  103. package/src/codex/quota-rejection.ts +8 -4
  104. package/src/codex/quota.ts +4 -2
  105. package/src/codex/routing/selection.ts +32 -9
  106. package/src/codex/routing.ts +53 -11
  107. package/src/codex/subagent-model-fallback.ts +4 -3
  108. package/src/codex/sync.ts +11 -0
  109. package/src/codex/windows-installation-files.ts +33 -11
  110. package/src/codex/write-coordination.ts +4 -0
  111. package/src/combos/request.ts +6 -2
  112. package/src/companion/settings.ts +6 -1
  113. package/src/config/atomic-write.ts +12 -1
  114. package/src/config/derived-registries.ts +29 -0
  115. package/src/config/diagnostics.ts +17 -0
  116. package/src/config/live-reconcile.ts +11 -2
  117. package/src/config/load-degrade.ts +9 -2
  118. package/src/config/persist-unlocked.ts +4 -3
  119. package/src/config/persisted-mutation.ts +94 -0
  120. package/src/config/provider-validation.ts +1 -1
  121. package/src/config/proxy-env.ts +62 -12
  122. package/src/config/rebase-provenance.ts +80 -1
  123. package/src/config/schema/config-schema.ts +5 -0
  124. package/src/config/schema/leaf-validators.ts +50 -1
  125. package/src/config/subagent-models.ts +41 -15
  126. package/src/config.ts +18 -95
  127. package/src/generated/compatibility-version.json +330 -218
  128. package/src/generated/model-metadata.ts +8 -5
  129. package/src/github/star-state.ts +46 -6
  130. package/src/grok/inject.ts +74 -40
  131. package/src/grok/status.ts +11 -4
  132. package/src/integrations/cursor-effort-table.ts +50 -13
  133. package/src/integrations/raycast-detect.ts +19 -4
  134. package/src/integrations/serialize.ts +11 -1
  135. package/src/lib/bounded-body.ts +30 -0
  136. package/src/lib/crash-guard.ts +52 -4
  137. package/src/lib/local-aside-sync-contract.ts +41 -0
  138. package/src/lib/package-tree-integrity.ts +181 -9
  139. package/src/lib/proxy-env.ts +18 -1
  140. package/src/lib/request-failure-attribution.ts +1 -0
  141. package/src/lib/request-failure-model.ts +3 -0
  142. package/src/lib/service-secrets.ts +99 -2
  143. package/src/lib/socks5-fetch.ts +43 -14
  144. package/src/lib/token-estimate.ts +17 -2
  145. package/src/oauth/command-code.ts +3 -2
  146. package/src/oauth/generic-account-failover.ts +29 -1
  147. package/src/oauth/index.ts +24 -16
  148. package/src/oauth/login-flow-state.ts +5 -5
  149. package/src/oauth/meta-muse-device.ts +49 -7
  150. package/src/oauth/store.ts +74 -9
  151. package/src/providers/alibaba-region-backup.ts +16 -1
  152. package/src/providers/anthropic-fast.ts +89 -0
  153. package/src/providers/anthropic-reset-grant-ledger.ts +288 -0
  154. package/src/providers/anthropic-reset-grants.ts +329 -0
  155. package/src/providers/claude-cli-identity.ts +12 -0
  156. package/src/providers/command-code-efforts.ts +184 -102
  157. package/src/providers/derive.ts +11 -3
  158. package/src/providers/fastwire.ts +16 -3
  159. package/src/providers/label.ts +8 -3
  160. package/src/providers/model-rename-fields.ts +1 -0
  161. package/src/providers/openai-virtual-models.ts +1 -0
  162. package/src/providers/quota/vendor-probes-oauth.ts +2 -1
  163. package/src/providers/reasoning-metadata.ts +38 -15
  164. package/src/providers/registry/entries-core.ts +95 -7
  165. package/src/providers/registry/entries-extended.ts +21 -10
  166. package/src/providers/registry/model-ids.ts +1 -0
  167. package/src/providers/registry/model-seeds.ts +31 -3
  168. package/src/providers/registry/types.ts +3 -1
  169. package/src/providers/resolved-model-policy-merge.ts +38 -8
  170. package/src/providers/resolved-model-policy.ts +4 -2
  171. package/src/providers/service-tier.ts +3 -1
  172. package/src/reasoning-effort.ts +6 -5
  173. package/src/responses/code-mode-helper-compat.ts +14 -4
  174. package/src/responses/code-mode-shell-input.ts +54 -0
  175. package/src/responses/custom-tool-compat.ts +173 -5
  176. package/src/responses/parser.ts +38 -2
  177. package/src/responses/reasoning-replay-cache.ts +26 -0
  178. package/src/router.ts +11 -1
  179. package/src/routing/history/indexer.ts +7 -2
  180. package/src/routing/history/schema.ts +3 -1
  181. package/src/server/adapter-resolve.ts +2 -2
  182. package/src/server/auth-cors.ts +3 -0
  183. package/src/server/chat-completions.ts +14 -1
  184. package/src/server/chat-native.ts +17 -0
  185. package/src/server/claude-messages.ts +4 -3
  186. package/src/server/direct-local-http.ts +45 -19
  187. package/src/server/gui-session.ts +6 -15
  188. package/src/server/index/package-tree-guard.ts +53 -0
  189. package/src/server/index/serve-options.ts +17 -3
  190. package/src/server/index/startup-warnings.ts +17 -0
  191. package/src/server/index.ts +15 -17
  192. package/src/server/lifecycle.ts +8 -0
  193. package/src/server/live.ts +54 -4
  194. package/src/server/management/agent-settings-routes.ts +44 -8
  195. package/src/server/management/anthropic-reset-grant-routes.ts +252 -0
  196. package/src/server/management/codex-prompt-routes.ts +5 -1
  197. package/src/server/management/config-routes.ts +14 -4
  198. package/src/server/management/oauth-account-routes.ts +17 -1
  199. package/src/server/management/provider-overwrite-carry.ts +164 -0
  200. package/src/server/management/provider-routes.ts +36 -6
  201. package/src/server/management/remote-workspace-routes.ts +2 -2
  202. package/src/server/management/route-registry.ts +2 -0
  203. package/src/server/management/shadow-call-validation.ts +39 -0
  204. package/src/server/management/system-restart.ts +72 -6
  205. package/src/server/management-api.ts +16 -2
  206. package/src/server/management-auth.ts +52 -8
  207. package/src/server/proxy-liveness.ts +110 -4
  208. package/src/server/request-log.ts +26 -9
  209. package/src/server/request-metrics.ts +5 -0
  210. package/src/server/responses/adapter-continuation.ts +6 -3
  211. package/src/server/responses/adapter-dispatch.ts +65 -1
  212. package/src/server/responses/compact.ts +31 -1
  213. package/src/server/responses/compaction-routing.ts +28 -3
  214. package/src/server/responses/core-codex-account.ts +85 -26
  215. package/src/server/responses/core-combo-failure.ts +16 -15
  216. package/src/server/responses/core-normalize.ts +5 -1
  217. package/src/server/responses/core-opaque-recovery.ts +50 -2
  218. package/src/server/responses/core-options.ts +2 -0
  219. package/src/server/responses/core-replay.ts +7 -0
  220. package/src/server/responses/core.ts +1 -1
  221. package/src/server/responses/encrypted-payload.ts +23 -9
  222. package/src/server/responses/passthrough-delivery.ts +55 -35
  223. package/src/server/responses/passthrough-dispatch.ts +12 -13
  224. package/src/server/responses/policy-fallback.ts +12 -1
  225. package/src/server/responses/request-prepare.ts +46 -7
  226. package/src/server/responses/request-spend.ts +31 -15
  227. package/src/server/responses/run-turn-execution.ts +6 -5
  228. package/src/server/responses/shadow-target-availability.ts +61 -0
  229. package/src/server/responses-custom-tool-repair.ts +2 -0
  230. package/src/service/claim.ts +185 -0
  231. package/src/service/cli.ts +10 -1
  232. package/src/service/guarded-manager-target.ts +151 -0
  233. package/src/service/guards.ts +47 -48
  234. package/src/service/managing-cli.ts +170 -0
  235. package/src/service/orchestration.ts +3 -1
  236. package/src/service/state.ts +4 -0
  237. package/src/service/systemd.ts +16 -1
  238. package/src/service.ts +1 -1
  239. package/src/types/config.ts +8 -0
  240. package/src/types/provider.ts +16 -0
  241. package/src/types/request.ts +10 -0
  242. package/src/types/tools.ts +9 -1
  243. package/src/types/wire.ts +68 -4
  244. package/src/types.ts +1 -0
  245. package/src/update/job.ts +10 -16
  246. package/src/update/npm-invocation.mjs +17 -16
  247. package/src/update/transactional-install.d.mts +22 -1
  248. package/src/update/transactional-install.mjs +176 -19
  249. package/src/update/update-failure-guidance.d.mts +8 -0
  250. package/src/update/update-failure-guidance.mjs +47 -0
  251. package/src/usage/expected-prices.ts +54 -12
  252. package/src/usage/log.ts +117 -3
  253. package/src/usage/telemetry-contract.ts +1 -0
  254. package/src/usage/timeline.ts +34 -6
  255. package/src/usage/user-cost-overlay-reconciler.ts +3 -3
  256. package/src/vision/reasoning.ts +2 -4
  257. package/src/web-search/xai-executor.ts +14 -4
  258. package/gui/dist/assets/App-EJxiUFMq.js +0 -50
  259. package/gui/dist/assets/index-BmJwNBHL.js +0 -86
  260. package/gui/dist/assets/index-DdDunwDb.css +0 -1
  261. package/gui/dist/assets/usage-companion-chart-IftE60UK.js +0 -1
  262. package/src/adapters/kiro-thinking.ts +0 -112
@@ -0,0 +1 @@
1
+ .codex-account-controls{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12px;min-width:0;display:flex}.codex-account-auto-switch{flex:none;align-items:center;gap:7px;min-width:0;display:flex}.codex-account-auto-switch-label{font-size:var(--text-label);color:var(--muted);font-weight:var(--weight-medium);white-space:nowrap}.codex-account-auto-switch-input-wrap{align-items:stretch;display:inline-flex;position:relative}.codex-account-auto-switch-input{width:76px;height:30px;font-size:var(--text-label);text-align:right;padding:4px 38px 4px 8px}.codex-account-auto-switch-unit{color:var(--muted);font-size:var(--text-label);pointer-events:none;position:absolute;top:50%;right:25px;transform:translateY(-50%)}.codex-account-auto-switch-input-wrap .ocx-stepper{width:22px}.codex-account-auto-switch-toggle{transform-origin:50%;margin-inline:-3px;transform:scale(.8)}
@@ -1 +1 @@
1
- import{T as e,_ as t,m as n,n as r,w as i}from"./index-BmJwNBHL.js";import{a,f as o,i as s,m as c,t as l,u}from"./usage-companion-chart-IftE60UK.js";var d=e(i(),1),f=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0,p=e=>typeof e==`object`&&e&&!Array.isArray(e)?e:{};function m(e){return Object.entries(p(p(e).providers)).flatMap(([e,t])=>{let n=p(t);return n.disabled===!0?[]:[{name:e,path:e===`openai`?`/api/codex-auth/accounts`:n.authMode===`oauth`?`/api/oauth/accounts?${new URLSearchParams({provider:e,quota:`1`})}`:n.hasApiKey===!0&&n.authMode!==`forward`?`/api/providers/keys?${new URLSearchParams({name:e,quota:`1`})}`:null}]})}function h(e){let t=p(e),n=t.accounts??t.keys;if(!Array.isArray(n))throw Error(`Invalid account roster`);return n.map(e=>{let n=p(e);if(typeof n.id!=`string`)throw Error(`Invalid account identifier`);let r=typeof n.email==`string`?_(n.email):void 0,i=[n.alias,n.label,r,n.logLabel,n.id].find(e=>typeof e==`string`&&e.length),a=n.quotaUnavailable===!0||n.quotaMode===`unsupported`||!n.quota?null:p(n.quota),o=typeof n.plan==`string`?n.plan:void 0,s=t.activeAccountId??t.activeId??t.activeCodexAccountId;return{id:n.id,label:i,email:r,plan:o,unavailable:n.quotaUnavailable===!0,active:typeof s==`string`?s===n.id:n.active===!0,status:typeof p(n.health).status==`string`?p(n.health).status:void 0,quotaFailure:typeof n.quotaFailure==`string`?n.quotaFailure:void 0,quota:u(a,o)}})}function g(e){if(!f(e)||e===0)return null;let t=e<0xe8d4a51000?e*1e3:e;return Number.isFinite(new Date(t).getTime())?t:null}function _(e){let[t,n]=e.split(`@`);if(!n)return`•••`;let r=n.includes(`.`)?n.slice(n.lastIndexOf(`.`)):``;return`${t?.slice(0,1)||`•`}•••@${n.slice(0,1)}•••${r}`}function v(e,t,n=Date.now()){let r=g(e);if(r===null||r<=n)return{text:`—`};let i=Math.ceil((r-n)/6e4),a=(e,n)=>new Intl.NumberFormat(t,{style:`unit`,unit:n,unitDisplay:`narrow`}).format(e);return{text:i<60?a(i,`minute`):i<1440?`${a(Math.floor(i/60),`hour`)} ${a(i%60,`minute`)}`:i<10080?`${a(Math.floor(i/1440),`day`)} ${a(Math.floor(i%1440/60),`hour`)}`:new Intl.DateTimeFormat(t,{month:`short`,day:`numeric`}).format(r),exact:new Date(r).toLocaleString(t)}}function y(e){if(!e)return[];let t=[{id:`quota.fiveHourLimit`,key:`quota.fiveHourLimit`,percent:e.fiveHourPercent??e.shortPercent,reset:e.fiveHourResetAt??e.shortResetAt},{id:`quota.weeklyLimit`,key:`quota.weeklyLimit`,percent:e.weeklyPercent,reset:e.weeklyResetAt},{id:`quota.monthlyLimit`,key:`quota.monthlyLimit`,percent:e.monthlyPercent,reset:e.monthlyResetAt},...Array.isArray(e.customWindows)?e.customWindows.filter(e=>e&&typeof e.label==`string`).map(e=>({id:e.label,label:e.label,percent:e.percent,reset:e.resetAt})):[]].filter((t,n)=>n===0&&e.monthlyPercent===void 0||f(t.percent)||g(t.reset)!==null),n=new Map;return t.map(e=>{let t=n.get(e.id)??0;return n.set(e.id,t+1),t===0?e:{...e,id:`${e.id}#${t}`}})}function b(e,t){let n=new Set(t.hiddenProviders),r=t.models===null?null:new Set(t.models),i=e.models.filter(e=>!n.has(e.provider)&&(r===null||r.has(`${e.provider}/${e.model}`)||r.has(e.model)));if(t.models===null&&t.hiddenProviders.length===0)return{...e,models:i};if(t.models?.length!==0&&e.models.some(e=>!e.provider||!e.model||e.provider===`other`&&e.model===`other`))return{...e,models:i.filter(e=>e.provider!==`other`||e.model!==`other`),summary:{},usageIncomplete:!0};let a={};for(let e of[`requests`,`totalTokens`,`inputTokens`,`outputTokens`,`cachedInputTokens`,`cacheReadInputTokens`,`estimatedCostUsd`,`measuredRequests`,`pricedRequests`])i.length&&i.every(t=>f(t[e]))&&(a[e]=i.reduce((t,n)=>t+n[e],0));return{...e,models:i,summary:a}}function x(e){let t={...e};if((e.requests??0)>0&&(e.measuredRequests===0||e.coverageRatio===0))for(let e of[`totalTokens`,`inputTokens`,`outputTokens`,`cachedInputTokens`,`cacheReadInputTokens`])delete t[e];return(e.requests??0)>0&&e.pricedRequests===0&&delete t.estimatedCostUsd,t}async function S(e,t){let r=n(2e4),i=()=>r.controller.abort();t.aborted&&i(),t.addEventListener(`abort`,i,{once:!0});try{let t=await fetch(e,{signal:r.signal,cache:`no-store`});if(!t.ok)throw Error(String(t.status));let n=await t.json();if(r.signal.aborted)throw Error(`Tray request cancelled`);return n}finally{r.clear(),t.removeEventListener(`abort`,i)}}function C(e){let t=p(e);if(t.error||!t.summary||typeof t.summary!=`object`||Array.isArray(t.summary)||!Array.isArray(t.models))throw Error(`Invalid usage`);return t}var w=r(),T=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function E(){let{t:e,locale:n}=t(),[r,i]=(0,d.useState)(null),[u,p]=(0,d.useState)(!1),[g,_]=(0,d.useState)([null,null]),[E,D]=(0,d.useState)(!1),[O,k]=(0,d.useState)([]),[A,j]=(0,d.useState)(!1),[M,N]=(0,d.useState)(null),[P,F]=(0,d.useState)(!1),[I,L]=(0,d.useState)(null),[R,z]=(0,d.useState)(!1),[B,V]=(0,d.useState)(0),H=()=>V(e=>e+1);(0,d.useEffect)(()=>{document.documentElement.classList.add(`tray-document`);let e=null,t=!1,n=!0,r=!1,o=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),c=async()=>{if(!o()||t)return;t=!0,z(!0);let n=!1,l=new AbortController;e=l;let u=e=>S(e,l.signal),d=()=>!r&&!l.signal.aborted;try{let e=(async()=>{try{let e=m(await u(`/api/config`)),t=await Promise.all(e.map(async e=>{if(!e.path)return{name:e.name,accounts:[]};try{let t=await u(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await u(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,accounts:h(t)}}catch{return{name:e.name,accounts:[],unavailable:!0}}}));d()&&(k(t),j(!1),n=!0)}catch{d()&&(k([]),j(!0))}})(),t=(async()=>{let e;try{if(e=(await u(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);d()&&(i(e),p(!1))}catch{d()&&p(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>b(C(await u(t)),e))).then(e=>{d()&&(n||=e.some(e=>e.status===`fulfilled`),_(e.map(e=>e.status===`fulfilled`?e.value:null)),D(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=a(e);try{let n=await u(`/api/usage/timeline?${t}`);d()&&(N(s(n,e)),F(!1))}catch{d()&&(N(null),F(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,d()&&(z(!1),n&&L(Date.now())),!r&&l.signal.aborted&&o()&&c()}},l=()=>{o()?c():e?.abort()},u=()=>{n=!1,l()},d=()=>{n=!0,l()},f=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),l()};c();let g=setInterval(()=>void c(),6e4);return document.addEventListener(`visibilitychange`,l),window.addEventListener(`blur`,u),window.addEventListener(`focus`,d),window.addEventListener(`opencodex:tray-visibility`,f),()=>{r=!0,e?.abort(),clearInterval(g),document.documentElement.classList.remove(`tray-document`),document.removeEventListener(`visibilitychange`,l),window.removeEventListener(`blur`,u),window.removeEventListener(`focus`,d),window.removeEventListener(`opencodex:tray-visibility`,f)}},[B]);let U=e=>f(e)?o(e,n):`—`,W=t=>{let i=t?x(t):void 0,a=i?.cacheReadInputTokens??i?.cachedInputTokens,o=f(a)&&f(i?.inputTokens)&&i.inputTokens>0?`${Math.round(a/i.inputTokens*100)}%`:`—`;return(0,w.jsxs)(`dl`,{children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`usage.card.totalTokens`)}),(0,w.jsx)(`dd`,{children:U(i?.totalTokens)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`tray.input`)}),(0,w.jsxs)(`dd`,{children:[U(i?.inputTokens),` `,(0,w.jsx)(`small`,{title:e(`usage.card.cachedTokens`),children:e(`tray.cached`,{percent:o})})]})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`tray.output`)}),(0,w.jsx)(`dd`,{children:U(i?.outputTokens)})]}),r?.showCost&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{title:e(`logs.metric.estimatedCostTitle`),children:e(`tray.cost`)}),(0,w.jsx)(`dd`,{title:f(i?.requests)&&f(i?.pricedRequests)&&i.pricedRequests<i.requests?e(`usage.cost.unpricedNote`,{count:i.requests-i.pricedRequests}):e(`logs.metric.estimatedCostTitle`),children:f(i?.estimatedCostUsd)?new Intl.NumberFormat(n,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(i.estimatedCostUsd)+(f(i.pricedRequests)&&f(i.requests)&&i.pricedRequests<i.requests?`*`:``):`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`usage.card.requests`)}),(0,w.jsx)(`dd`,{children:U(i?.requests)})]}),f(i?.requests)&&i.requests>0&&f(i.measuredRequests)&&i.measuredRequests<i.requests&&(0,w.jsxs)(`div`,{className:`tray-coverage`,title:e(`usage.coverage.note`),children:[(0,w.jsx)(`dt`,{children:e(`usage.card.coverage`)}),(0,w.jsxs)(`dd`,{children:[Math.round(i.measuredRequests/i.requests*100),`%`]})]})]})},G=new Set(r?.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":e(`sub.settings`),title:e(`sub.settings`),children:`⚙`})]}),u&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.companion.settingsUnavailable`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),!r&&!u&&(0,w.jsx)(`p`,{role:`status`,children:e(`common.loading`)}),r&&(0,w.jsxs)(`section`,{className:`tray-totals`,children:[r.showToday&&(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[e(`tray.today`),T(g[0])&&(0,w.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),W(g[0]?.summary)]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[e(`usage.range.30d`),T(g[1])&&(0,w.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),W(g[1]?.summary)]})]}),E&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.loadError`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),r?.showChart&&(0,w.jsx)(`section`,{className:`tray-chart`,children:(0,w.jsx)(l,{timeline:M,chartStyle:r.chartStyle,hours:r.chartHours,loading:!M&&!P,error:P?e(`usage.companion.timelineUnavailable`):null,onRetry:H,locale:n,t:e})}),r?.showModels&&!!g[0]?.models.length&&(0,w.jsx)(`section`,{className:`tray-models`,"aria-label":e(`usage.section.models`),children:g[0].models.map(t=>(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`span`,{title:`${t.provider}/${t.model}`,children:t.model}),(0,w.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,w.jsx)(`span`,{title:e(`usage.card.requests`),children:e(`pws.dashboard.requests`,{count:U(t.requests)})}),(0,w.jsx)(`span`,{title:e(`usage.card.totalTokens`),children:U(x(t).totalTokens)})]})]},`${t.provider}/${t.model}`))}),(r?.showAccounts??!0)&&(0,w.jsxs)(`section`,{className:`tray-providers`,"aria-label":e(`usage.section.providers`),children:[A&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),O.filter(e=>!G.has(e.name)).map(t=>(0,w.jsxs)(`div`,{className:`tray-provider`,children:[(0,w.jsx)(`h2`,{children:c(t.name,e)}),!t.accounts.length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:e(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),t.accounts.map(t=>(0,w.jsxs)(`div`,{className:`tray-account`,children:[(0,w.jsxs)(`div`,{className:`tray-account-name`,title:t.label,children:[t.label,(0,w.jsxs)(`span`,{className:`tray-account-meta`,children:[t.plan,t.active&&(0,w.jsx)(`span`,{title:e(`prov.activeBadge`),"aria-label":e(`prov.activeBadge`),children:` ●`})]})]}),t.email&&t.email!==t.label&&(0,w.jsx)(`div`,{className:`tray-account-email`,children:t.email}),!y(t.quota).length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:e(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),y(t.quota).map(t=>{let r=`key`in t?e(t.key):t.label,i=v(t.reset,n),a=f(t.percent)?Math.min(100,t.percent):null;return(0,w.jsxs)(`div`,{className:`tray-quota`,children:[(0,w.jsx)(`span`,{title:r,children:r}),(0,w.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,w.jsx)(`span`,{className:`tray-bar`,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,w.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,w.jsx)(`time`,{title:i.exact,children:i.text})]},t.id)})]},t.id))]},t.name))]}),(0,w.jsxs)(`div`,{className:`tray-refresh`,children:[(0,w.jsx)(`button`,{type:`button`,onClick:H,disabled:R,children:e(`startup.refresh`)}),(0,w.jsx)(`span`,{role:`status`,children:e(`tray.updated`,{time:I===null?`—`:new Date(I).toLocaleTimeString(n,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,w.jsx)(`footer`,{children:(0,w.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[e(`nav.dashboard`),` `,(0,w.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{E as default};
1
+ import{T as e,_ as t,m as n,n as r,w as i}from"./index-BEq4OCOz.js";import{a,f as o,i as s,m as c,t as l,u}from"./usage-companion-chart-DBG_37kQ.js";var d=e(i(),1),f=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0,p=e=>typeof e==`object`&&e&&!Array.isArray(e)?e:{};function m(e){return Object.entries(p(p(e).providers)).flatMap(([e,t])=>{let n=p(t);return n.disabled===!0?[]:[{name:e,path:e===`openai`?`/api/codex-auth/accounts`:n.authMode===`oauth`?`/api/oauth/accounts?${new URLSearchParams({provider:e,quota:`1`})}`:n.hasApiKey===!0&&n.authMode!==`forward`?`/api/providers/keys?${new URLSearchParams({name:e,quota:`1`})}`:null}]})}function h(e){let t=p(e),n=t.accounts??t.keys;if(!Array.isArray(n))throw Error(`Invalid account roster`);return n.map(e=>{let n=p(e);if(typeof n.id!=`string`)throw Error(`Invalid account identifier`);let r=typeof n.email==`string`?_(n.email):void 0,i=[n.alias,n.label,r,n.logLabel,n.id].find(e=>typeof e==`string`&&e.length),a=n.quotaUnavailable===!0||n.quotaMode===`unsupported`||!n.quota?null:p(n.quota),o=typeof n.plan==`string`?n.plan:void 0,s=t.activeAccountId??t.activeId??t.activeCodexAccountId;return{id:n.id,label:i,email:r,plan:o,unavailable:n.quotaUnavailable===!0,active:typeof s==`string`?s===n.id:n.active===!0,status:typeof p(n.health).status==`string`?p(n.health).status:void 0,quotaFailure:typeof n.quotaFailure==`string`?n.quotaFailure:void 0,quota:u(a,o)}})}function g(e){if(!f(e)||e===0)return null;let t=e<0xe8d4a51000?e*1e3:e;return Number.isFinite(new Date(t).getTime())?t:null}function _(e){let[t,n]=e.split(`@`);if(!n)return`•••`;let r=n.includes(`.`)?n.slice(n.lastIndexOf(`.`)):``;return`${t?.slice(0,1)||`•`}•••@${n.slice(0,1)}•••${r}`}function v(e,t,n=Date.now()){let r=g(e);if(r===null||r<=n)return{text:`—`};let i=Math.ceil((r-n)/6e4),a=(e,n)=>new Intl.NumberFormat(t,{style:`unit`,unit:n,unitDisplay:`narrow`}).format(e);return{text:i<60?a(i,`minute`):i<1440?`${a(Math.floor(i/60),`hour`)} ${a(i%60,`minute`)}`:i<10080?`${a(Math.floor(i/1440),`day`)} ${a(Math.floor(i%1440/60),`hour`)}`:new Intl.DateTimeFormat(t,{month:`short`,day:`numeric`}).format(r),exact:new Date(r).toLocaleString(t)}}function y(e){if(!e)return[];let t=[{id:`quota.fiveHourLimit`,key:`quota.fiveHourLimit`,percent:e.fiveHourPercent??e.shortPercent,reset:e.fiveHourResetAt??e.shortResetAt},{id:`quota.weeklyLimit`,key:`quota.weeklyLimit`,percent:e.weeklyPercent,reset:e.weeklyResetAt},{id:`quota.monthlyLimit`,key:`quota.monthlyLimit`,percent:e.monthlyPercent,reset:e.monthlyResetAt},...Array.isArray(e.customWindows)?e.customWindows.filter(e=>e&&typeof e.label==`string`).map(e=>({id:e.label,label:e.label,percent:e.percent,reset:e.resetAt})):[]].filter((t,n)=>n===0&&e.monthlyPercent===void 0||f(t.percent)||g(t.reset)!==null),n=new Map;return t.map(e=>{let t=n.get(e.id)??0;return n.set(e.id,t+1),t===0?e:{...e,id:`${e.id}#${t}`}})}function b(e,t){let n=new Set(t.hiddenProviders),r=t.models===null?null:new Set(t.models),i=e.models.filter(e=>!n.has(e.provider)&&(r===null||r.has(`${e.provider}/${e.model}`)||r.has(e.model)));if(t.models===null&&t.hiddenProviders.length===0)return{...e,models:i};if(t.models?.length!==0&&e.models.some(e=>!e.provider||!e.model||e.provider===`other`&&e.model===`other`))return{...e,models:i.filter(e=>e.provider!==`other`||e.model!==`other`),summary:{},usageIncomplete:!0};let a={};for(let e of[`requests`,`totalTokens`,`inputTokens`,`outputTokens`,`cachedInputTokens`,`cacheReadInputTokens`,`estimatedCostUsd`,`measuredRequests`,`pricedRequests`])i.length&&i.every(t=>f(t[e]))&&(a[e]=i.reduce((t,n)=>t+n[e],0));return{...e,models:i,summary:a}}function x(e){let t={...e};if((e.requests??0)>0&&(e.measuredRequests===0||e.coverageRatio===0))for(let e of[`totalTokens`,`inputTokens`,`outputTokens`,`cachedInputTokens`,`cacheReadInputTokens`])delete t[e];return(e.requests??0)>0&&e.pricedRequests===0&&delete t.estimatedCostUsd,t}async function S(e,t){let r=n(2e4),i=()=>r.controller.abort();t.aborted&&i(),t.addEventListener(`abort`,i,{once:!0});try{let t=await fetch(e,{signal:r.signal,cache:`no-store`});if(!t.ok)throw Error(String(t.status));let n=await t.json();if(r.signal.aborted)throw Error(`Tray request cancelled`);return n}finally{r.clear(),t.removeEventListener(`abort`,i)}}function C(e){let t=p(e);if(t.error||!t.summary||typeof t.summary!=`object`||Array.isArray(t.summary)||!Array.isArray(t.models))throw Error(`Invalid usage`);return t}var w=r(),T=e=>e?.usageIncomplete||e?.historyTruncated||e?.entriesTruncated;function E(){let{t:e,locale:n}=t(),[r,i]=(0,d.useState)(null),[u,p]=(0,d.useState)(!1),[g,_]=(0,d.useState)([null,null]),[E,D]=(0,d.useState)(!1),[O,k]=(0,d.useState)([]),[A,j]=(0,d.useState)(!1),[M,N]=(0,d.useState)(null),[P,F]=(0,d.useState)(!1),[I,L]=(0,d.useState)(null),[R,z]=(0,d.useState)(!1),[B,V]=(0,d.useState)(0),H=()=>V(e=>e+1);(0,d.useEffect)(()=>{document.documentElement.classList.add(`tray-document`);let e=null,t=!1,n=!0,r=!1,o=()=>!document.hidden&&(window.__OPENCODEX_TRAY_VISIBLE__??n),c=async()=>{if(!o()||t)return;t=!0,z(!0);let n=!1,l=new AbortController;e=l;let u=e=>S(e,l.signal),d=()=>!r&&!l.signal.aborted;try{let e=(async()=>{try{let e=m(await u(`/api/config`)),t=await Promise.all(e.map(async e=>{if(!e.path)return{name:e.name,accounts:[]};try{let t=await u(e.path);if(e.name===`openai`)try{t.activeCodexAccountId=(await u(`/api/codex-auth/active`)).activeCodexAccountId??`__main__`}catch{}return{name:e.name,accounts:h(t)}}catch{return{name:e.name,accounts:[],unavailable:!0}}}));d()&&(k(t),j(!1),n=!0)}catch{d()&&(k([]),j(!0))}})(),t=(async()=>{let e;try{if(e=(await u(`/api/companion/settings`)).settings,!e||!Array.isArray(e.hiddenProviders)||!(e.models===null||Array.isArray(e.models)))throw Error(`Invalid settings`);d()&&(i(e),p(!1))}catch{d()&&p(!0);return}let t=Promise.allSettled([`/api/usage?range=today`,`/api/usage?range=30d`].map(async t=>b(C(await u(t)),e))).then(e=>{d()&&(n||=e.some(e=>e.status===`fulfilled`),_(e.map(e=>e.status===`fulfilled`?e.value:null)),D(e.some(e=>e.status===`rejected`)))}),r=(async()=>{if(!e.showChart)return;let t=a(e);try{let n=await u(`/api/usage/timeline?${t}`);d()&&(N(s(n,e)),F(!1))}catch{d()&&(N(null),F(!0))}})();await Promise.allSettled([t,r])})();await Promise.allSettled([e,t])}finally{t=!1,d()&&(z(!1),n&&L(Date.now())),!r&&l.signal.aborted&&o()&&c()}},l=()=>{o()?c():e?.abort()},u=()=>{n=!1,l()},d=()=>{n=!0,l()},f=e=>{let t=e.detail;typeof t==`boolean`&&(window.__OPENCODEX_TRAY_VISIBLE__=t),l()};c();let g=setInterval(()=>void c(),6e4);return document.addEventListener(`visibilitychange`,l),window.addEventListener(`blur`,u),window.addEventListener(`focus`,d),window.addEventListener(`opencodex:tray-visibility`,f),()=>{r=!0,e?.abort(),clearInterval(g),document.documentElement.classList.remove(`tray-document`),document.removeEventListener(`visibilitychange`,l),window.removeEventListener(`blur`,u),window.removeEventListener(`focus`,d),window.removeEventListener(`opencodex:tray-visibility`,f)}},[B]);let U=e=>f(e)?o(e,n):`—`,W=t=>{let i=t?x(t):void 0,a=i?.cacheReadInputTokens??i?.cachedInputTokens,o=f(a)&&f(i?.inputTokens)&&i.inputTokens>0?`${Math.round(a/i.inputTokens*100)}%`:`—`;return(0,w.jsxs)(`dl`,{children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`usage.card.totalTokens`)}),(0,w.jsx)(`dd`,{children:U(i?.totalTokens)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`tray.input`)}),(0,w.jsxs)(`dd`,{children:[U(i?.inputTokens),` `,(0,w.jsx)(`small`,{title:e(`usage.card.cachedTokens`),children:e(`tray.cached`,{percent:o})})]})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`tray.output`)}),(0,w.jsx)(`dd`,{children:U(i?.outputTokens)})]}),r?.showCost&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{title:e(`logs.metric.estimatedCostTitle`),children:e(`tray.cost`)}),(0,w.jsx)(`dd`,{title:f(i?.requests)&&f(i?.pricedRequests)&&i.pricedRequests<i.requests?e(`usage.cost.unpricedNote`,{count:i.requests-i.pricedRequests}):e(`logs.metric.estimatedCostTitle`),children:f(i?.estimatedCostUsd)?new Intl.NumberFormat(n,{style:`currency`,currency:`USD`,maximumFractionDigits:2}).format(i.estimatedCostUsd)+(f(i.pricedRequests)&&f(i.requests)&&i.pricedRequests<i.requests?`*`:``):`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`dt`,{children:e(`usage.card.requests`)}),(0,w.jsx)(`dd`,{children:U(i?.requests)})]}),f(i?.requests)&&i.requests>0&&f(i.measuredRequests)&&i.measuredRequests<i.requests&&(0,w.jsxs)(`div`,{className:`tray-coverage`,title:e(`usage.coverage.note`),children:[(0,w.jsx)(`dt`,{children:e(`usage.card.coverage`)}),(0,w.jsxs)(`dd`,{children:[Math.round(i.measuredRequests/i.requests*100),`%`]})]})]})},G=new Set(r?.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":e(`sub.settings`),title:e(`sub.settings`),children:`⚙`})]}),u&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.companion.settingsUnavailable`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),!r&&!u&&(0,w.jsx)(`p`,{role:`status`,children:e(`common.loading`)}),r&&(0,w.jsxs)(`section`,{className:`tray-totals`,children:[r.showToday&&(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[e(`tray.today`),T(g[0])&&(0,w.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),W(g[0]?.summary)]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`h2`,{children:[e(`usage.range.30d`),T(g[1])&&(0,w.jsx)(`span`,{title:e(`usage.incomplete`),"aria-label":e(`usage.incomplete`),children:` *`})]}),W(g[1]?.summary)]})]}),E&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`usage.loadError`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),r?.showChart&&(0,w.jsx)(`section`,{className:`tray-chart`,children:(0,w.jsx)(l,{timeline:M,chartStyle:r.chartStyle,hours:r.chartHours,loading:!M&&!P,error:P?e(`usage.companion.timelineUnavailable`):null,onRetry:H,locale:n,t:e})}),r?.showModels&&!!g[0]?.models.length&&(0,w.jsx)(`section`,{className:`tray-models`,"aria-label":e(`usage.section.models`),children:g[0].models.map(t=>(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`span`,{title:`${t.provider}/${t.model}`,children:t.model}),(0,w.jsxs)(`span`,{className:`tray-model-metrics`,children:[(0,w.jsx)(`span`,{title:e(`usage.card.requests`),children:e(`pws.dashboard.requests`,{count:U(t.requests)})}),(0,w.jsx)(`span`,{title:e(`usage.card.totalTokens`),children:U(x(t).totalTokens)})]})]},`${t.provider}/${t.model}`))}),(r?.showAccounts??!0)&&(0,w.jsxs)(`section`,{className:`tray-providers`,"aria-label":e(`usage.section.providers`),children:[A&&(0,w.jsxs)(`p`,{role:`alert`,className:`tray-error`,children:[e(`startup.tray.unavailable`),` `,(0,w.jsx)(`button`,{onClick:H,children:e(`common.retry`)})]}),O.filter(e=>!G.has(e.name)).map(t=>(0,w.jsxs)(`div`,{className:`tray-provider`,children:[(0,w.jsx)(`h2`,{children:c(t.name,e)}),!t.accounts.length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:e(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),t.accounts.map(t=>(0,w.jsxs)(`div`,{className:`tray-account`,children:[(0,w.jsxs)(`div`,{className:`tray-account-name`,title:t.label,children:[t.label,(0,w.jsxs)(`span`,{className:`tray-account-meta`,children:[t.plan,t.active&&(0,w.jsx)(`span`,{title:e(`prov.activeBadge`),"aria-label":e(`prov.activeBadge`),children:` ●`})]})]}),t.email&&t.email!==t.label&&(0,w.jsx)(`div`,{className:`tray-account-email`,children:t.email}),!y(t.quota).length&&(0,w.jsx)(`div`,{className:`tray-missing`,children:e(t.unavailable?`startup.tray.unavailable`:`pws.dashboard.noQuota`)}),y(t.quota).map(t=>{let r=`key`in t?e(t.key):t.label,i=v(t.reset,n),a=f(t.percent)?Math.min(100,t.percent):null;return(0,w.jsxs)(`div`,{className:`tray-quota`,children:[(0,w.jsx)(`span`,{title:r,children:r}),(0,w.jsx)(`span`,{children:a===null?`—`:`${Math.round(a)}%`}),(0,w.jsx)(`span`,{className:`tray-bar`,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,w.jsx)(`i`,{style:{width:a===null?`0%`:`${a}%`}})}),(0,w.jsx)(`time`,{title:i.exact,children:i.text})]},t.id)})]},t.id))]},t.name))]}),(0,w.jsxs)(`div`,{className:`tray-refresh`,children:[(0,w.jsx)(`button`,{type:`button`,onClick:H,disabled:R,children:e(`startup.refresh`)}),(0,w.jsx)(`span`,{role:`status`,children:e(`tray.updated`,{time:I===null?`—`:new Date(I).toLocaleTimeString(n,{hour:`2-digit`,minute:`2-digit`})})})]}),(0,w.jsx)(`footer`,{children:(0,w.jsxs)(`a`,{href:`/?desktop=open#/usage`,children:[e(`nav.dashboard`),` `,(0,w.jsx)(`span`,{"aria-hidden":`true`,children:`↗`})]})})]})}export{E as default};