@bitkyc08/opencodex 2.87.0 → 2.88.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.
- package/gui/dist/assets/{App-ZfYbLHkB.js → App-CHC89EXQ.js} +3 -3
- package/gui/dist/assets/{Tray-DCd-A1az.js → Tray-B5bC7AWL.js} +1 -1
- package/gui/dist/assets/index-B5bsvxor.js +94 -0
- package/gui/dist/assets/{quota-summary-ChvmKGOk.js → quota-summary-D8y2wTsB.js} +1 -1
- package/gui/dist/index.html +1 -1
- package/package.json +1 -1
- package/src/adapters/anthropic-rejection-memo.ts +71 -0
- package/src/adapters/anthropic-replay.ts +135 -0
- package/src/adapters/anthropic-tool-catalog.ts +11 -0
- package/src/adapters/anthropic.ts +76 -45
- package/src/adapters/google-progress-history.ts +53 -0
- package/src/adapters/google.ts +17 -1
- package/src/bridge/internal.ts +6 -2
- package/src/bridge/response-json.ts +2 -2
- package/src/bridge/sse.ts +7 -6
- package/src/claude/inbound-content-options.ts +66 -0
- package/src/claude/outbound.ts +13 -5
- package/src/cli/cross-home-owner.ts +16 -2
- package/src/cli/loopback-family.ts +31 -0
- package/src/codex/catalog/routed-gather.ts +3 -1
- package/src/codex/websocket-activity.ts +161 -0
- package/src/codex/websocket-registry.ts +25 -1
- package/src/config/opencode-zen-upgrade.ts +9 -8
- package/src/generated/compatibility-version.json +88 -52
- package/src/images/loop.ts +72 -21
- package/src/lib/request-failure-model.ts +2 -0
- package/src/oauth/generic-account-failover.ts +7 -4
- package/src/protocols/encoders/adapter-events.ts +5 -5
- package/src/protocols/encoders/messages.ts +2 -2
- package/src/providers/opencode-zen-rate-limit.ts +7 -2
- package/src/responses/reasoning-replay-cache.ts +50 -4
- package/src/routing/analytics.ts +7 -15
- package/src/server/claude-messages.ts +2 -1
- package/src/server/index/live-sideband.ts +3 -2
- package/src/server/index/serve-options.ts +11 -5
- package/src/server/index/websocket-handler.ts +18 -4
- package/src/server/index.ts +7 -7
- package/src/server/lifecycle.ts +13 -1
- package/src/server/messages-native.ts +16 -3
- package/src/server/responses/adapter-continuation.ts +34 -18
- package/src/server/responses/adapter-delivery.ts +53 -6
- package/src/server/responses/adapter-dispatch.ts +27 -1
- package/src/server/responses/anthropic-thinking-recovery.ts +153 -0
- package/src/server/responses/combo-stream-preflight.ts +3 -2
- package/src/server/responses/compaction-recovery.ts +2 -0
- package/src/server/responses/core-codex-account.ts +2 -2
- package/src/server/responses/core-combo.ts +3 -2
- package/src/server/responses/core-lifetime.ts +3 -2
- package/src/server/responses/core-options.ts +2 -0
- package/src/server/responses/core-replay.ts +5 -1
- package/src/server/responses/passthrough-execution.ts +3 -2
- package/src/server/responses/request-prepare.ts +1 -0
- package/src/server/responses/response-effects.ts +1 -0
- package/src/server/responses/response-tool-ownership.ts +21 -0
- package/src/server/responses/sidecar-execution.ts +43 -7
- package/src/server/responses/sidecar-send-budget.ts +2 -2
- package/src/server/responses-undeclared-tool-guard.ts +1 -1
- package/src/server/ws-bridge.ts +2 -0
- package/src/types/opencode-zen.ts +9 -3
- package/src/types/request.ts +10 -2
- package/src/types/wire.ts +4 -2
- package/src/types.ts +1 -0
- package/src/usage/summary.ts +9 -3
- package/src/usage/telemetry-contract.ts +1 -0
- package/src/web-search/anthropic-history.ts +59 -0
- package/src/web-search/loop.ts +181 -68
- package/src/web-search/progress-stream.ts +11 -1
- package/gui/dist/assets/index-CfYDMj34.js +0 -94
|
@@ -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-CfYDMj34.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-ChvmKGOk.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-B5bsvxor.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-D8y2wTsB.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};
|