@cortexkit/opencode-openai-auth 0.3.3 → 0.4.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/README.md +1 -0
- package/dist/cli.js +1 -1
- package/dist/codex-http.d.ts +3 -0
- package/dist/config.d.ts +3 -0
- package/dist/core/accounts.d.ts +9 -3
- package/dist/core/oauth.d.ts +1 -1
- package/dist/core/quota-manager.d.ts +2 -2
- package/dist/{index-k5zwf3j1.js → index-1anzb8jh.js} +1 -1
- package/dist/index-1r02s323.js +6 -0
- package/dist/index-2ng03cby.js +2 -0
- package/dist/{index-e7m7qbne.js → index-6y6ss1kc.js} +1 -1
- package/dist/{index-1xmasv0x.js → index-b6kp9ydc.js} +1 -1
- package/dist/index-cz1bkmjz.js +2 -0
- package/dist/index-dzg88nw2.js +89 -0
- package/dist/index-y67qn95a.js +2 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +65 -65
- package/dist/model-costs.d.ts +29 -0
- package/dist/prompt-context.d.ts +1 -1
- package/dist/quota-normalize-8yzxqy78.js +1 -0
- package/dist/quota-normalize.d.ts +13 -4
- package/dist/rpc/port-file.js +1 -1
- package/dist/rpc/rpc-client.js +1 -1
- package/dist/rpc/rpc-dir.js +1 -1
- package/dist/sidebar-state.d.ts +47 -2
- package/dist/sidebar-state.js +1 -1
- package/dist/token-util-h46jb3eg.js +1 -0
- package/dist/token-yzcb1p3e.js +1 -0
- package/dist/tui/command-dialogs.d.ts +8 -1
- package/dist/tui-preferences.js +1 -1
- package/dist/tui.d.ts +18 -1
- package/dist/version.d.ts +1 -1
- package/dist/ws-pool.d.ts +1 -0
- package/package.json +11 -8
- package/src/core/refresh-file-lock.ts +293 -0
- package/src/sidebar-state.ts +392 -13
- package/src/tui/command-dialogs.tsx +43 -25
- package/src/tui/entry.mjs +37 -0
- package/src/tui-compiled/logger.ts +161 -0
- package/src/tui-compiled/rpc/port-file.ts +70 -0
- package/src/tui-compiled/rpc/protocol.ts +31 -0
- package/src/tui-compiled/rpc/rpc-client.ts +78 -0
- package/src/tui-compiled/rpc/rpc-dir.ts +22 -0
- package/src/tui-compiled/sidebar-state.ts +695 -0
- package/src/tui-compiled/tui/command-dialogs.tsx +645 -0
- package/src/tui-compiled/tui-preferences.ts +328 -0
- package/src/tui-compiled/tui.tsx +1098 -0
- package/src/tui-compiled/util/open-url.ts +30 -0
- package/src/tui.tsx +158 -77
- package/dist/index-5s67238f.js +0 -2
- package/dist/index-d9hq0tmc.js +0 -2
- package/dist/index-mrg2fms9.js +0 -2
- package/dist/index-phrx93zy.js +0 -92
- package/dist/index-qdh7pt5a.js +0 -3
- package/dist/quota-normalize-dfdpwwm3.js +0 -1
- package/dist/token-01dcf92a.js +0 -1
- package/dist/token-util-rkqd82q9.js +0 -1
package/README.md
CHANGED
|
@@ -64,6 +64,7 @@ Settings resolve as environment variable → config file (`~/.config/opencode/op
|
|
|
64
64
|
| `webSearch` | `CORTEXKIT_OPENAI_AUTH_NO_WEB_SEARCH` (set to disable) | `true` | Inject the `web_search` prompt-cache stabilizer. |
|
|
65
65
|
| `webSockets` | `CORTEXKIT_OPENAI_AUTH_WEBSOCKETS` | `false` | Use the Codex Responses WebSocket transport instead of HTTP. |
|
|
66
66
|
| `rawWebSocket` | `CORTEXKIT_OPENAI_AUTH_RAW_WS` | `false` | Use the hand-rolled raw TCP/TLS client with Codex-style incremental streaming. Bun uses `Bun.connect`; Node/OpenCode Desktop uses `node:net`/`node:tls`. |
|
|
67
|
+
| `responsesLite` | `CORTEXKIT_OPENAI_AUTH_RESPONSES_LITE` | `false` | Send `gpt-5.6-sol`/`-terra`/`-luna` requests in Codex's Responses Lite shape, matching the Codex CLI. Bypasses the `web_search` stabilizer for these models. |
|
|
67
68
|
| `dump` | `CORTEXKIT_OPENAI_AUTH_DUMP` | `false` | Dump final Codex request bodies for cache debugging. |
|
|
68
69
|
| `dumpDir` | `OPENCODE_OPENAI_AUTH_DUMP_DIR` | OS temp dir: `opencode-openai-auth-dumps` | Directory for request dump files. |
|
|
69
70
|
| `codexApiEndpoint` | `CORTEXKIT_OPENAI_AUTH_CODEX_ENDPOINT` | `https://chatgpt.com/backend-api/codex/responses` | Send rewritten Codex requests to a compatible proxy/relay instead of ChatGPT's backend endpoint. |
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
2
|
+
import{E as q,I as B,J as V,r as Y,y as Z,z as $}from"./index-dzg88nw2.js";import"./index-1r02s323.js";import{ta as X}from"./index-6y6ss1kc.js";import{execFileSync as E}from"node:child_process";function Q(C,H=process.platform,D=E){try{if(H==="win32"){D("cmd",["/c","start","",C],{stdio:"ignore",timeout:3000});return}D(H==="darwin"?"open":"xdg-open",[C],{stdio:"ignore",timeout:3000})}catch{}}function T(){console.log(`Usage:
|
|
3
3
|
npx @cortexkit/opencode-openai-auth login [--label <name>] [--headless]
|
|
4
4
|
npx @cortexkit/opencode-openai-auth list
|
|
5
5
|
npx @cortexkit/opencode-openai-auth remove <id>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function hasWebSocketResponsesLiteMetadata(body: BodyInit | null | undefined): boolean;
|
|
2
|
+
export declare function sanitizeHttpFallbackBody(body: BodyInit | null | undefined): string | ArrayBuffer | ArrayBufferView<ArrayBuffer> | URLSearchParams | ReadableStream<any> | Blob | FormData | null | undefined;
|
|
3
|
+
export declare function sanitizeHttpFallbackInit(init: RequestInit | undefined): RequestInit | undefined;
|
package/dist/config.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface OpenAIAuthConfig {
|
|
|
7
7
|
webSockets?: boolean;
|
|
8
8
|
/** Use the hand-rolled raw TCP/TLS WebSocket client (incremental streaming). Default false. */
|
|
9
9
|
rawWebSocket?: boolean;
|
|
10
|
+
/** Use Codex's Responses Lite request shape. Default false. */
|
|
11
|
+
responsesLite?: boolean;
|
|
10
12
|
/** Dump final Codex request bodies for cache debugging. Default false. */
|
|
11
13
|
dump?: boolean | {
|
|
12
14
|
enabled?: boolean;
|
|
@@ -20,6 +22,7 @@ export interface ResolvedSettings {
|
|
|
20
22
|
webSearch: boolean;
|
|
21
23
|
webSockets: boolean;
|
|
22
24
|
rawWebSocket: boolean;
|
|
25
|
+
responsesLite: boolean;
|
|
23
26
|
dump: boolean;
|
|
24
27
|
dumpDir: string;
|
|
25
28
|
codexApiEndpoint: string;
|
package/dist/core/accounts.d.ts
CHANGED
|
@@ -11,8 +11,13 @@ export type AccountQuotaWindow = {
|
|
|
11
11
|
remainingPercent: number;
|
|
12
12
|
resetsAt?: string;
|
|
13
13
|
checkedAt: number;
|
|
14
|
+
windowMinutes?: number;
|
|
14
15
|
};
|
|
15
|
-
export
|
|
16
|
+
export interface OAuthQuotaSnapshot {
|
|
17
|
+
primary?: AccountQuotaWindow;
|
|
18
|
+
secondary?: AccountQuotaWindow;
|
|
19
|
+
resetCreditsAvailable?: number;
|
|
20
|
+
}
|
|
16
21
|
export type AccountBase = {
|
|
17
22
|
id: string;
|
|
18
23
|
label?: string;
|
|
@@ -37,7 +42,7 @@ export type OAuthAccount = AccountBase & {
|
|
|
37
42
|
lastRefreshedAt?: number;
|
|
38
43
|
lastRefreshError?: AccountOperationError;
|
|
39
44
|
lastQuotaRefreshError?: AccountOperationError;
|
|
40
|
-
quota?:
|
|
45
|
+
quota?: OAuthQuotaSnapshot;
|
|
41
46
|
};
|
|
42
47
|
export type ApiKeyAccount = AccountBase & {
|
|
43
48
|
type: 'api';
|
|
@@ -181,8 +186,9 @@ export declare function quotaSnapshotPassesPolicy(quota: OAuthQuotaSnapshot | un
|
|
|
181
186
|
export declare function isKillswitchEnabled(storage: AccountStorage | null): boolean;
|
|
182
187
|
export declare function killswitchPassesPolicy(quota: OAuthQuotaSnapshot | undefined, storage: AccountStorage | null, accountId?: string, now?: number): boolean;
|
|
183
188
|
export declare function killswitchRetryAfterSeconds(mainQuota: OAuthQuotaSnapshot | undefined, fallbackAccounts: Array<{
|
|
189
|
+
accountId: string;
|
|
184
190
|
quota?: OAuthQuotaSnapshot;
|
|
185
|
-
}>, now: number): number;
|
|
191
|
+
}>, now: number, storage: AccountStorage | null): number;
|
|
186
192
|
/**
|
|
187
193
|
* Migrate an existing single-slot token into the multi-account store.
|
|
188
194
|
*
|
package/dist/core/oauth.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export declare const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
|
2
2
|
export declare const ISSUER = "https://auth.openai.com";
|
|
3
3
|
export declare const OAUTH_PORT = 1455;
|
|
4
4
|
export declare const OAUTH_POLLING_SAFETY_MARGIN_MS = 3000;
|
|
5
|
-
export declare const USER_AGENT = "cortexkit-opencode-openai-auth/0.
|
|
5
|
+
export declare const USER_AGENT = "cortexkit-opencode-openai-auth/0.4.0";
|
|
6
6
|
export declare const RESERVED_ACCOUNT_ID = "main";
|
|
7
7
|
export declare const RESERVED_ACCOUNT_ID_ERROR = "\"main\" is a reserved account id; choose a different label.";
|
|
8
8
|
export interface PkceCodes {
|
|
@@ -82,7 +82,7 @@ export declare class QuotaManager {
|
|
|
82
82
|
*/
|
|
83
83
|
getFallback(accountId: string, accessToken?: string): QuotaEntry | null;
|
|
84
84
|
getAllFallbacks(): Map<string, QuotaEntry>;
|
|
85
|
-
setMain(accessToken: string, entry: QuotaEntry, accountId?: string): void;
|
|
85
|
+
setMain(accessToken: string, entry: QuotaEntry, accountId?: string, completeSnapshot?: boolean): void;
|
|
86
86
|
/**
|
|
87
87
|
* Non-invalidating read of the cached main quota for POLICY decisions
|
|
88
88
|
* (killswitch). Unlike getMain(token), a token mismatch does NOT drop the
|
|
@@ -102,7 +102,7 @@ export declare class QuotaManager {
|
|
|
102
102
|
* for the same account does not drop it (getFallback(id, token) would).
|
|
103
103
|
*/
|
|
104
104
|
peekFallbackForPolicy(accountId: string): QuotaEntry | null;
|
|
105
|
-
setFallback(accountId: string, entry: QuotaEntry, accessToken?: string): void;
|
|
105
|
+
setFallback(accountId: string, entry: QuotaEntry, accessToken?: string, completeSnapshot?: boolean): void;
|
|
106
106
|
/**
|
|
107
107
|
* Mark accountId ('main' or a fallback id) rate-limited until resetAtMs.
|
|
108
108
|
* Keeps the LATER reset: skips only when an existing mark is strictly
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{mkdir as u,readdir as l,readFile as c,rename as p,unlink as m,writeFile as d}from"node:fs/promises";import{join as a}from"node:path";function f(t){try{return process.kill(t,0),!0}catch(r){return r.code==="EPERM"}}async function b(t,r){await u(t,{recursive:!0});let s={...r,startedAt:Date.now()},e=a(t,`port-${r.pid}.json`),i=`${e}.${process.pid}.tmp`;return await d(i,JSON.stringify(s),{encoding:"utf8",mode:384}),await p(i,e),e}async function h(t,r){let s;try{s=await l(t)}catch{return null}let e=[];for(let n of s){if(!n.startsWith("port-")||!n.endsWith(".json"))continue;try{let o=JSON.parse(await c(a(t,n),"utf8"));if(Number.isFinite(o.port))if(f(o.pid))e.push(o);else m(a(t,n)).catch(()=>{})}catch{}}if(e.length===0)return null;let i=r!==void 0&&r>=1?e.filter((n)=>n.pid===r):[];return(i.length>0?i:e).sort((n,o)=>o.startedAt-n.startedAt)[0]??null}
|
|
2
|
-
export{b as
|
|
2
|
+
export{b as ma,h as na};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{appendFileSync as d,chmodSync as s,existsSync as M,renameSync as f,statSync as c}from"node:fs";import{tmpdir as l}from"node:os";import{join as i}from"node:path";var U={error:0,warn:1,info:2,debug:3,trace:4},a=!1,o=5242880;function m(){return process.env.OPENCODE_OPENAI_AUTH_LOG_FILE??i(l(),"opencode-openai-auth.log")}var A;function qH(H){if(H===void 0||H in U)A=H}function n(){if(A)return A;let H=process.env.OPENCODE_OPENAI_AUTH_LOG_LEVEL;if(H&&H in U)return H;return"info"}var t=/^(authorization|x-api-key|cookie|set-cookie|refresh|access|token)$/i;function r(H){if(t.test(H))return!0;let J=H.toLowerCase().replace(/[-_]/g,"");if(J==="chatgptaccountid")return!0;if(J.includes("apikey"))return!0;if(J.endsWith("secret")||J.endsWith("password"))return!0;if(J.endsWith("token")&&!J.endsWith("tokens"))return!0;return!1}var e=/\b(Bearer\s+[\w.-]+|sk-[\w-]+|eyJ[\w.-]+)\b/g;function HH(H){return R(H,new WeakSet)}function R(H,J){if(typeof H==="string")return H.replace(e,"***REDACTED***");if(Array.isArray(H)){if(J.has(H))return"[Circular]";J.add(H);let Q=H.map((Z)=>R(Z,J));return J.delete(H),Q}if(H&&typeof H==="object"){if(J.has(H))return"[Circular]";J.add(H);let Q={};for(let[Z,B]of Object.entries(H))Q[Z]=r(Z)?"***REDACTED***":R(B,J);return J.delete(H),Q}return H}var j=[],L,JH=3;function S(H){try{s(H,384)}catch{}}function QH(){try{let H=m();if(!(M(H)&&c(H).size>o))return;for(let Q=JH-1;Q>=1;Q--)if(M(`${H}.${Q}`)){let Z=`${H}.${Q+1}`;f(`${H}.${Q}`,Z),S(Z)}let J=`${H}.1`;f(H,J),S(J)}catch{}}function I(){if(!j.length)return;let H=j.join("");j=[];try{QH();let J=m();if(M(J))S(J);d(J,H,{encoding:"utf8",mode:384})}catch{}}function WH(){if(!L)L=setTimeout(()=>{L=void 0,I()},500)}if(!a)process.on("exit",I);function ZH(H){try{return` ${JSON.stringify(HH(H))}`}catch{return" [unserializable]"}}function x(H,J,Q,Z){if(U[J]>U[n()])return;let B=`[${new Date().toISOString()}] ${J.toUpperCase()} [${H}] ${Q}`+(Z===void 0?"":ZH(Z))+`
|
|
2
|
+
`;if(j.push(B),j.length>=50)I();else WH()}function FH(H){return{error:(J,Q)=>x(H,"error",J,Q),warn:(J,Q)=>x(H,"warn",J,Q),info:(J,Q)=>x(H,"info",J,Q),debug:(J,Q)=>x(H,"debug",J,Q),trace:(J,Q)=>x(H,"trace",J,Q)}}import{randomUUID as g}from"node:crypto";import{mkdir as $H,readFile as y,rename as zH,rm as D,stat as h,writeFile as O}from"node:fs/promises";import{homedir as BH}from"node:os";import{dirname as SH,join as b}from"node:path";var GH=globalThis.setTimeout.bind(globalThis),VH=globalThis.clearTimeout.bind(globalThis),XH="openai-auth.json";function YH(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return b(process.env.XDG_CONFIG_HOME||b(BH(),".config"),"opencode")}function KH(H){let J=H?.code;return J==="ENOENT"||J==="EINVAL"||J==="ENOTDIR"}function xH(){return process.env.OPENCODE_OPENAI_AUTH_FILE?.trim()||b(YH(),XH)}async function IH(H){let Q=`${H.path??xH()}.${H.name}.lock`,Z=b(Q,"owner.json"),B=g(),G=H.now??Date.now,X=null,q=!1;async function F(){try{return JSON.parse(await y(Q,"utf8"))}catch(W){if(W.code!=="EISDIR")throw W;return JSON.parse(await y(Z,"utf8"))}}async function u(){await O(Q,`${JSON.stringify({ownerId:B,expiresAt:G()+H.ttlMs})}
|
|
3
|
+
`,{encoding:"utf8",mode:384})}async function _(){try{return await O(Q,`${JSON.stringify({ownerId:B,expiresAt:G()+H.ttlMs})}
|
|
4
|
+
`,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(W){let z=W.code;if(z==="EEXIST"||z==="EISDIR")return!1;throw W}}function T(){if(!H.renew||q)return;let W=H.renewIntervalMs??Math.max(1000,Math.floor(H.ttlMs/3));if(X=GH(()=>{(async()=>{try{let z=await F(),N=G();if(q||z?.ownerId!==B||Number(z?.expiresAt)<=N)return;await u(),T()}catch{}})()},W),"unref"in X)X.unref()}let V=await _();if(!V){let W=`${Q}.evicting`,z=b(W,"owner.json"),N=g(),jH=5000,DH=8;async function C(){await new Promise(($)=>setTimeout($,Math.floor(Math.random()*4)))}async function P(){try{let $=await F();return Number($?.expiresAt)>G()}catch{try{return(await h(Q)).mtimeMs+H.ttlMs>G()}catch{return!1}}}async function Y(){try{return JSON.parse(await y(z,"utf8"))?.ownerId===N}catch{return!1}}async function v(){await $H(W);try{await O(z,`${JSON.stringify({ownerId:N,createdAt:G()})}
|
|
5
|
+
`,{encoding:"utf8",mode:384,flag:"wx"})}catch($){if(KH($))return!1;throw await E(),$}return await H.onStep?.("eviction-marker-acquired"),!0}async function E(){if(await Y())await D(W,{recursive:!0,force:!0}).catch(()=>{})}for(let $=0;$<8;$++){if(V=await _(),V)break;if(await P())return null;try{if(!await v()){await C();continue}}catch(p){if(p.code!=="EEXIST")throw p;let k;try{k=await h(W)}catch(K){if(K.code==="ENOENT"){await C();continue}throw K}if(k.mtimeMs+5000>G())return null;await H.onStep?.("stale-marker-stat");let w=`${W}.${g()}`;try{await zH(W,w)}catch(K){if(K.code==="ENOENT"){await C();continue}throw K}await H.onStep?.("stale-marker-claimed"),await D(w,{recursive:!0,force:!0}).catch(()=>{}),await C();continue}try{if(await P())return null;if(!await Y())return null;if(await H.onStep?.("stale-lock-confirmed"),!await Y())return null;if(await D(Q,{recursive:!0,force:!0}).catch(()=>{}),!await Y())return null;if(V=await _(),!V)return null;if(!await Y())return await D(Q,{recursive:!0,force:!0}).catch(()=>{}),V=!1,null;break}finally{await E()}}}if(!V)return null;return T(),{release:async()=>{if(q=!0,X)VH(X),X=null;try{if((await F())?.ownerId!==B)return}catch{return}await D(Q,{recursive:!0,force:!0}).catch(()=>{})}}}
|
|
6
|
+
export{qH as ia,HH as ja,FH as ka,IH as la};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function J(k){if(k==null||k==="")return;let q=typeof k==="number"?k:Number(k);if(Number.isFinite(q)){let B=q<100000000000?q*1000:q,G=new Date(B);return Number.isNaN(G.getTime())?void 0:G.toISOString()}let z=new Date(k);return Number.isNaN(z.getTime())?void 0:z.toISOString()}function K(k){let q=Number(k);return Number.isFinite(q)&&q>0?q:void 0}function O(k){return typeof k==="number"&&Number.isFinite(k)&&k>=0?k:void 0}function X(k,q){let z=k.get(q);if(z===null||z.trim()==="")return;let B=Number(z);if(!Number.isFinite(B)||B<0||B>100)return;let G=q.slice(0,-13),L=K(k.get(`${G}-window-minutes`)),V=J(k.get(`${G}-reset-at`)??void 0);if(B===0&&k.get(`${G}-window-minutes`)==="0"&&!V)return;return{usedPercent:B,remainingPercent:100-B,resetsAt:V,checkedAt:Date.now(),...L!==void 0?{windowMinutes:L}:{}}}var $=["x-codex-primary-used-percent","x-codex-secondary-used-percent"];function g(k,q){let z=k.get(q);if(z===null)return"absent";if(z.trim()==="")return"invalid";let B=Number(z);return Number.isFinite(B)&&B>=0&&B<=100?"valid":"invalid"}function Q(k){if($.some((G)=>g(k,G)==="invalid"))return{};let q={},z=X(k,"x-codex-primary-used-percent");if(z)q.primary=z;let B=X(k,"x-codex-secondary-used-percent");if(B)q.secondary=B;return q}function I(k){let q=$.map((z)=>g(k,z));return q.includes("valid")&&!q.includes("invalid")}function Y(k){if(!k)return;if(!Number.isFinite(k.used_percent)||k.used_percent<0||k.used_percent>100)return;let q=K(k.window_minutes),z=J(k.reset_at);if(k.used_percent===0&&q===void 0&&!z)return;return{usedPercent:k.used_percent,remainingPercent:100-k.used_percent,resetsAt:z,checkedAt:Date.now(),...q!==void 0?{windowMinutes:q}:{}}}function N(k){let q={},z=Y(k.rate_limits?.primary);if(z)q.primary=z;let B=Y(k.rate_limits?.secondary);if(B)q.secondary=B;return q}function Z(k){if(!k)return;if(!Number.isFinite(k.used_percent)||k.used_percent<0||k.used_percent>100)return;let q=K(k.limit_window_seconds),z=J(k.reset_at);if(k.used_percent===0&&q===void 0&&!z)return;return{usedPercent:k.used_percent,remainingPercent:100-k.used_percent,resetsAt:z,checkedAt:Date.now(),...q!==void 0?{windowMinutes:q/60}:{}}}function f(k){let q={},z=Z(k.rate_limit?.primary_window);if(z)q.primary=z;let B=Z(k.rate_limit?.secondary_window);if(B)q.secondary=B;let G=O(k.rate_limit_reset_credits?.available_count);if(G!==void 0)q.resetCreditsAvailable=G;return q}
|
|
2
|
+
export{J as c,Q as d,I as e,N as f,f as g};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as s}from"node:module";var j=Object.create;var{getPrototypeOf:k,defineProperty:f,getOwnPropertyNames:l}=Object;var m=Object.prototype.hasOwnProperty;function n(a){return this[a]}var o,p,t=(a,b,c)=>{var g=a!=null&&typeof a==="object";if(g){var h=b?o??=new WeakMap:p??=new WeakMap,i=h.get(a);if(i)return i}c=a!=null?j(k(a)):{};let d=b||!a||!a.__esModule?f(c,"default",{value:a,enumerable:!0}):c;for(let e of l(a))if(!m.call(d,e))f(d,e,{get:n.bind(a,e),enumerable:!0});if(g)h.set(a,d);return d};var u=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var q=(a)=>a;function r(a,b){this[a]=q.bind(null,b)}var v=(a,b)=>{for(var c in b)f(a,c,{get:b[c],enumerable:!0,configurable:!0,set:r.bind(b,c)})};var x=s(import.meta.url);
|
|
2
|
-
export{t as
|
|
2
|
+
export{t as qa,u as ra,v as sa,x as ta};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as z}from"node:crypto";import{homedir as A,tmpdir as K}from"node:os";import{join as q,resolve as B}from"node:path";var F="OPENCODE_OPENAI_AUTH_RPC_DIR";function M(f){let k=process.env[F]?.trim();if(k)return B(f,k);let w=z("sha256").update(f).digest("hex").slice(0,16),x=process.env.XDG_STATE_HOME||q(A(),".local","state");return q(x,"cortexkit","openai-auth","rpc",w)}export{K as
|
|
1
|
+
import{createHash as z}from"node:crypto";import{homedir as A,tmpdir as K}from"node:os";import{join as q,resolve as B}from"node:path";var F="OPENCODE_OPENAI_AUTH_RPC_DIR";function M(f){let k=process.env[F]?.trim();if(k)return B(f,k);let w=z("sha256").update(f).digest("hex").slice(0,16),x=process.env.XDG_STATE_HOME||q(A(),".local","state");return q(x,"cortexkit","openai-auth","rpc",w)}export{K as oa,M as pa};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ka as U,la as F}from"./index-1r02s323.js";import{randomUUID as p}from"node:crypto";import{mkdir as A,readFile as R,rename as E,rm as f,writeFile as m}from"node:fs/promises";import{tmpdir as S}from"node:os";import{dirname as c,join as g}from"node:path";var T=["primary","secondary"],k={primary:300,secondary:10080};function N(H){return Number.isInteger(H)?String(H):String(Math.round(H*10)/10)}function b(H,J){let Z=H!==void 0&&Number.isFinite(H)&&H>0?H:k[J];if(Z<60)return`${N(Z)}m`;if(Z<1440)return`${N(Z/60)}h`;return`${N(Z/1440)}d`}function _(H){if(!H)return[];let J=[];for(let Z of T){let $=H[Z];if(!$)continue;let x=$.windowMinutes,Q=x!==void 0&&Number.isFinite(x)&&x>0?x:k[Z];J.push({key:Z,label:b(Q,Z),window:$,windowMs:Q*60000})}return J}var w=U("sidebar"),u="OPENCODE_OPENAI_AUTH_SIDEBAR_STATE_FILE",d=g(S(),"opencode-openai-auth"),l=g(d,"sidebar-state.json");function o(H){return typeof H==="number"&&Number.isFinite(H)&&H>=0?H:void 0}function W(H){let J=o(H);return J!==void 0?{resetCredits:J}:{}}function s(H){if(H===null||typeof H!=="object"||Array.isArray(H))return;let J={};for(let[Z,$]of Object.entries(H)){if($===null||typeof $!=="object"||Array.isArray($))continue;let x=$;if(typeof x.activeId!=="string"||typeof x.route!=="string"||typeof x.updatedAt!=="number"||!Number.isFinite(x.updatedAt))continue;J[Z]={activeId:x.activeId,route:x.route,updatedAt:x.updatedAt}}return Object.keys(J).length>0?J:void 0}function z(){return process.env[u]||l}var K={main:{quota:null,killed:!1},fallbacks:[],activeId:void 0,route:"main",lastUpdated:0};function y(H){if(H===null||typeof H!=="object"||Array.isArray(H))return K;let J=H,Z=J.main,$;if(Z!==null&&typeof Z==="object"&&!Array.isArray(Z)){let j=Z;$={quota:"quota"in j?j.quota:null,killed:typeof j.killed==="boolean"?j.killed:!1,...typeof j.quotaBackedOff==="boolean"?{quotaBackedOff:j.quotaBackedOff}:{},...typeof j.quotaBackoffUntil==="number"?{quotaBackoffUntil:j.quotaBackoffUntil}:{},...typeof j.refreshBackedOff==="boolean"?{refreshBackedOff:j.refreshBackedOff}:{},...typeof j.refreshBackoffUntil==="number"?{refreshBackoffUntil:j.refreshBackoffUntil}:{},...W(j.resetCredits)}}else $={quota:null,killed:!1};let x=J.fallbacks,Q=Array.isArray(x)?x.filter((j)=>j!==null&&typeof j==="object"&&!Array.isArray(j)&&typeof j.id==="string").map((j)=>({id:j.id,label:typeof j.label==="string"?j.label:void 0,quota:"quota"in j?j.quota:null,killed:typeof j.killed==="boolean"?j.killed:!1,enabled:typeof j.enabled==="boolean"?j.enabled:!0,...W(j.resetCredits)})):[],Y=typeof J.activeId==="string"?J.activeId:void 0,V=typeof J.route==="string"?J.route:K.route,X=typeof J.lastUpdated==="number"?J.lastUpdated:0,O=typeof J.planType==="string"?J.planType:void 0,G=typeof J.credits==="number"?J.credits:void 0,q=s(J.activeRouting);return{main:$,fallbacks:Q,activeId:Y,route:V,lastUpdated:X,...q!==void 0?{activeRouting:q}:{},...O!==void 0?{planType:O}:{},...G!==void 0?{credits:G}:{}}}async function XH(){try{let H=await R(z(),"utf8");return y(JSON.parse(H))}catch{return K}}var r=3600000,D=128;function v(H,J,Z=Date.now()){if(!(H.updatedAt>=Z-r&&H.updatedAt<=Z))return!1;return H.activeId==="main"||J.some((x)=>x.enabled!==!1&&x.id===H.activeId)}function KH(H,J,Z=Date.now()){if(!J)return{activeId:H.activeId??"main",route:H.route};let $=J?H.activeRouting?.[J]:void 0;if($&&v($,H.fallbacks,Z))return{activeId:$.activeId,route:$.route};let x=H.fallbacks.find((Q)=>Q.enabled&&!Q.killed);return{activeId:H.route==="fallback-first"&&x?x.id:"main",route:H.route}}function M(H,J,Z=Date.now(),$){if(!H)return;let x=Object.entries(H).filter(([Y,V])=>Y!==$&&v(V,J,Z)),Q=x.length<=D?x:x.sort((Y,V)=>V[1].updatedAt-Y[1].updatedAt).slice(0,D);return Q.length>0?Object.fromEntries(Q):void 0}var P=Promise.resolve(),n=3,i=1e4,a=15000;function B(H){let J=P.then(H);return P=J.catch(()=>{}),J}function zH(H,J=z()){return B(()=>L(H,J))}async function t(H){try{return I(await h(H))}catch{return K}}async function h(H){try{return await R(H,"utf8")}catch(J){if(J.code==="ENOENT")return"";throw J}}function I(H){if(H==="")return K;try{return y(JSON.parse(H))}catch{return K}}async function e(H){let J=Date.now()+a;while(Date.now()<=J){let Z=await F({name:"sidebar-write",path:H,ttlMs:i,renew:!0});if(Z)return Z;await new Promise(($)=>setTimeout($,10))}throw Error("Timed out waiting for the sidebar state write lock")}async function C(H,J,Z){let $=await e(H);try{for(let Q=0;Q<n;Q+=1){let Y=await h(H),V=J(I(Y));if(Q===0)await Z?.beforeRecheck?.();if(await h(H)!==Y)continue;await L(V,H);return}let x=await t(H);await L(J(x),H)}finally{await $.release()}}function GH(H,J=z(),Z){return B(async()=>{await C(J,($)=>({...$,...H,activeId:$.activeId,activeRouting:$.activeRouting,lastUpdated:Math.max(Date.now(),$.lastUpdated+1)}),Z)})}function BH(H,J,Z=z(),$){return B(async()=>{await C(Z,(x)=>{let Q=M({...x.activeRouting,[H.sessionId]:{activeId:H.activeId,route:H.route,updatedAt:H.updatedAt}},J,Date.now());return{...x,activeId:H.activeId,route:H.route,activeRouting:Q,lastUpdated:Math.max(Date.now(),x.lastUpdated+1)}},$)})}function OH(H,J=z()){return B(async()=>{await C(J,(Z)=>({...Z,activeId:H.activeId,route:H.route,lastUpdated:Math.max(Date.now(),Z.lastUpdated+1)}))})}function qH(H,J,Z=z(),$){return B(async()=>{await C(Z,(x)=>{let Q=Date.now(),Y=M(x.activeRouting,J,Q,H);return{...x,activeRouting:Y,lastUpdated:Math.max(Date.now(),x.lastUpdated+1)}},$)})}async function L(H,J){let Z=`${J}.${p()}.tmp`;try{await A(c(J),{recursive:!0}),await m(Z,JSON.stringify(H),"utf8"),await E(Z,J)}catch($){throw await f(Z,{force:!0}).catch(()=>{}),w.warn("sidebar write failed",{pid:process.pid,error:$ instanceof Error?$.message:String($)}),$}}function CH(){return P}function NH(H){let J=H.activeId;if(J&&J!=="main"){let Z=H.fallbacks.find(($)=>$.enabled&&$.id===J);if(Z)return{id:Z.id,name:Z.label??Z.id,quota:Z.quota,killed:Z.killed}}return{id:"main",name:"main",quota:H.main.quota,killed:H.main.killed}}function PH(H){let J=H?.primary?.usedPercent??null,Z=H?.secondary?.usedPercent??null,$=_(H);return{primaryUsedPercent:J,secondaryUsedPercent:Z,text:$.length===0?null:$.map(({label:x,window:Q})=>`${x}: ${Math.round(Q.usedPercent)}%`).join(" ")}}var HH=300000,JH=0.01,ZH=1;function hH(H,J,Z){if(!H.resetsAt)return null;let $=new Date(H.resetsAt).getTime();if(!Number.isFinite($))return null;let x=$-J,Q=Z-x;if(Q<HH)return null;if(Q<J*JH)return null;if(Q>=J)return null;let Y=H.usedPercent,V=Math.min(Math.max(Q/J*100,0),100),X=Y-V,O=Math.abs(X)<ZH?"on-pace":X>0?"deficit":"reserve",G=null;if(Y>0){let q=Q*100/Y,j=x+q;if(j<$)G=new Date(j).toISOString()}return{pacePercent:V,deltaPercent:X,state:O,runsOutAt:G}}
|
|
2
|
+
export{b as Q,_ as R,z as S,K as T,y as U,XH as V,r as W,D as X,v as Y,KH as Z,M as _,zH as $,GH as aa,BH as ba,OH as ca,qH as da,CH as ea,NH as fa,PH as ga,hH as ha};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import{ka as R0,la as I}from"./index-1r02s323.js";import{ta as K4}from"./index-6y6ss1kc.js";import{createHash as v0}from"node:crypto";var p0=86400000,l0=300000,d0=3600000,g0=60000,i0=900000,u0=300000;function o(B){return B instanceof Error?B.message:String(B)}function s0(B){let Z=B?.status;if(typeof Z==="number")return Z===429||Z>=500;if(!(B instanceof Error))return!1;return B.message.includes("fetch failed")||"code"in B&&(B.code==="ECONNRESET"||B.code==="ECONNREFUSED"||B.code==="ETIMEDOUT"||B.code==="UND_ERR_CONNECT_TIMEOUT")}function t(B){let Z=o(B),$=B?.status;if(typeof $==="number")return $===429||$>=500;if(!(B instanceof Error))return!1;let W=B.code;return Z.includes("fetch failed")||W==="ECONNRESET"||W==="ECONNREFUSED"||W==="ETIMEDOUT"||W==="UND_ERR_CONNECT_TIMEOUT"}function H0(B){return v0("sha256").update(B).digest("hex")}function Q0(B){let Z=H0(B.refreshToken),W=(B.previous?.tokenHash===Z?B.previous.retryCount??0:0)+1,z,X=B.error?.retryAfter;if(typeof X==="number"&&X>0)z=X*1000;else if(s0(B.error))z=Math.min(d0,l0*2**Math.min(W-1,6));else z=p0;return{message:o(B.error),checkedAt:B.now,nextRetryAt:B.now+z,retryCount:W,tokenHash:Z}}function U(B,Z,$){if(!B?.nextRetryAt||B.nextRetryAt<=$)return!1;if(!Z)return!0;return B.tokenHash===H0(Z)}function d(B,Z){return`Codex OAuth refresh is backed off for ${Math.max(1,Math.ceil(((B.nextRetryAt??Z)-Z)/1000))}s after: ${B.message}`}function f(B){let $=(B.previous?.retryCount??0)+1,W,z=B.error?.retryAfter;if(typeof z==="number"&&z>0)W=z*1000;else if(t(B.error))W=Math.min(i0,g0*2**Math.min($-1,6));else W=u0;return{message:o(B.error),checkedAt:B.now,nextRetryAt:B.now+W,retryCount:$}}function x(B,Z){if(!B?.nextRetryAt||B.nextRetryAt<=Z)return!1;return!0}function e(B){if(!B)return;let Z=Number(B);if(Number.isFinite(Z)&&Z>0)return Math.ceil(Z);let $=Date.parse(B);if(Number.isFinite($)){let W=Math.ceil(($-Date.now())/1000);return W>0?W:void 0}return}import{createServer as r0}from"node:http";import{setTimeout as n0}from"node:timers/promises";var N0="0.4.0";var u="app_EMoamEEZ73f0CkXaXp7hrann",q="https://auth.openai.com",m=1455,c0=3000,L0=`cortexkit-opencode-openai-auth/${N0}`,F0="main",a0=`"${F0}" is a reserved account id; choose a different label.`;function O0(B){let Z=new Uint8Array(B),$=String.fromCharCode(...Z);return btoa($).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function o0(){let Z=Array.from(crypto.getRandomValues(new Uint8Array(43))).map((W)=>"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"[W%66]).join(""),$=O0(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(Z)));return{verifier:Z,challenge:$}}function P0(B){if(B.length>16384)return;let Z=B.split(".");if(Z.length!==3)return;let $=Z[1];if(!$||$.length>8192)return;try{return JSON.parse(Buffer.from($,"base64url").toString())}catch{return}}function V0(B){let Z=B.chatgpt_account_id;if(typeof Z==="string"&&Z.length>0)return Z;let $=B["https://api.openai.com/auth"];if($&&typeof $==="object"&&!Array.isArray($)&&typeof $.chatgpt_account_id==="string"&&$.chatgpt_account_id.length>0)return $.chatgpt_account_id;let W=B.organizations;if(Array.isArray(W)){let z=W[0];if(z&&typeof z==="object"&&!Array.isArray(z)&&typeof z.id==="string"&&z.id.length>0)return z.id}return}function i(B){if(B.id_token){let Z=P0(B.id_token),$=Z&&V0(Z);if($)return $}if(B.access_token){let Z=P0(B.access_token);return Z?V0(Z):void 0}return}function t0(B){return typeof B==="string"&&B.toLowerCase()===F0}function B0(B){if(t0(B))throw Error(a0);return B}function e0(B,Z,$){let W=new URLSearchParams({response_type:"code",client_id:u,redirect_uri:B,scope:"openid profile email offline_access",code_challenge:Z.challenge,code_challenge_method:"S256",id_token_add_organizations:"true",codex_cli_simplified_flow:"true",state:$,originator:"opencode"});return`${q}/oauth/authorize?${W.toString()}`}async function B4(B,Z,$){let W=await fetch(`${q}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:B,redirect_uri:Z,client_id:u,code_verifier:$.verifier}).toString()});if(!W.ok)throw Error(`Token exchange failed: ${W.status}`);return await W.json()}function Z4(B){return B.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}var $4=`<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CortexKit OpenAI Auth - Authorization Successful</title>
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
font-family:
|
|
8
|
+
system-ui,
|
|
9
|
+
-apple-system,
|
|
10
|
+
sans-serif;
|
|
11
|
+
display: flex;
|
|
12
|
+
justify-content: center;
|
|
13
|
+
align-items: center;
|
|
14
|
+
height: 100vh;
|
|
15
|
+
margin: 0;
|
|
16
|
+
background: #131010;
|
|
17
|
+
color: #f1ecec;
|
|
18
|
+
}
|
|
19
|
+
.container {
|
|
20
|
+
text-align: center;
|
|
21
|
+
padding: 2rem;
|
|
22
|
+
}
|
|
23
|
+
h1 {
|
|
24
|
+
color: #f1ecec;
|
|
25
|
+
margin-bottom: 1rem;
|
|
26
|
+
}
|
|
27
|
+
p {
|
|
28
|
+
color: #b7b1b1;
|
|
29
|
+
}
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<div class="container">
|
|
34
|
+
<h1>Authorization Successful</h1>
|
|
35
|
+
<p>You can close this window and return to OpenCode.</p>
|
|
36
|
+
</div>
|
|
37
|
+
<script>
|
|
38
|
+
setTimeout(() => window.close(), 2000)
|
|
39
|
+
</script>
|
|
40
|
+
</body>
|
|
41
|
+
</html>`,g=(B)=>`<!doctype html>
|
|
42
|
+
<html>
|
|
43
|
+
<head>
|
|
44
|
+
<title>CortexKit OpenAI Auth - Authorization Failed</title>
|
|
45
|
+
<style>
|
|
46
|
+
body {
|
|
47
|
+
font-family:
|
|
48
|
+
system-ui,
|
|
49
|
+
-apple-system,
|
|
50
|
+
sans-serif;
|
|
51
|
+
display: flex;
|
|
52
|
+
justify-content: center;
|
|
53
|
+
align-items: center;
|
|
54
|
+
height: 100vh;
|
|
55
|
+
margin: 0;
|
|
56
|
+
background: #131010;
|
|
57
|
+
color: #f1ecec;
|
|
58
|
+
}
|
|
59
|
+
.container {
|
|
60
|
+
text-align: center;
|
|
61
|
+
padding: 2rem;
|
|
62
|
+
}
|
|
63
|
+
h1 {
|
|
64
|
+
color: #fc533a;
|
|
65
|
+
margin-bottom: 1rem;
|
|
66
|
+
}
|
|
67
|
+
p {
|
|
68
|
+
color: #b7b1b1;
|
|
69
|
+
}
|
|
70
|
+
.error {
|
|
71
|
+
color: #ff917b;
|
|
72
|
+
font-family: monospace;
|
|
73
|
+
margin-top: 1rem;
|
|
74
|
+
padding: 1rem;
|
|
75
|
+
background: #3c140d;
|
|
76
|
+
border-radius: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
79
|
+
</head>
|
|
80
|
+
<body>
|
|
81
|
+
<div class="container">
|
|
82
|
+
<h1>Authorization Failed</h1>
|
|
83
|
+
<p>An error occurred during authorization.</p>
|
|
84
|
+
<div class="error">${Z4(B)}</div>
|
|
85
|
+
</div>
|
|
86
|
+
</body>
|
|
87
|
+
</html>`,k,w,L=new Map;function M(){return L.size}function C(B){if(L.delete(B),M()===0)_()}async function W4(){let B=`http://localhost:${m}/auth/callback`;if(k)return{port:m,redirectUri:B};if(w)return w;w=(async()=>{let Z=r0(($,W)=>{let z=new URL($.url||"/",`http://127.0.0.1:${m}`);if(z.pathname==="/auth/callback"){let X=z.searchParams.get("code"),G=z.searchParams.get("state"),K=z.searchParams.get("error"),Y=z.searchParams.get("error_description");if(K){let J=Y||K;if(G){let Q=L.get(G);if(Q)Q.reject(Error(J)),C(G);else if(M()===0)_()}else if(M()===0)_();W.writeHead(200,{"Content-Type":"text/html"}),W.end(g(J));return}if(!G){if(M()===0)_();W.writeHead(400,{"Content-Type":"text/html"}),W.end(g("Missing state parameter"));return}if(!X){if(M()===0)_();W.writeHead(400,{"Content-Type":"text/html"}),W.end(g("Missing authorization code"));return}let j=L.get(G);if(!j){if(M()===0)_();W.writeHead(400,{"Content-Type":"text/html"}),W.end(g("Unknown state — authorization may have expired"));return}C(G),B4(X,B,j.pkce).then((J)=>j.resolve(J)).catch((J)=>j.reject(J)),W.writeHead(200,{"Content-Type":"text/html"}),W.end($4);return}if(z.pathname==="/cancel"){let X=z.searchParams.get("state"),G=X?[X]:[...L.keys()];W.writeHead(200),W.end("Login cancelled");for(let K of G){let Y=L.get(K);if(!Y)continue;Y.reject(Error("Login cancelled")),C(K)}if(M()===0)_();return}W.writeHead(404),W.end("Not found")});return await new Promise(($,W)=>{Z.once("error",W),Z.listen(m,"127.0.0.1",()=>{Z.off("error",W),$()})}),k=Z,{port:m,redirectUri:B}})();try{return await w}finally{w=void 0}}function _(){if(k){let B=k;k=void 0,B.close(()=>{}),B.closeIdleConnections?.(),setTimeout(()=>{B.closeAllConnections?.()},25).unref?.()}}function z4(B,Z,$=300000,W){return new Promise((z,X)=>{if(W?.aborted){C(Z),X(Error("Login cancelled"));return}let G=setTimeout(()=>{if(L.get(Z))C(Z),X(Error("OAuth callback timeout — authorization took too long"))},$),K=()=>{if(clearTimeout(G),L.get(Z))C(Z),X(Error("Login cancelled"))};if(W)W.addEventListener("abort",K);L.set(Z,{pkce:B,state:Z,resolve:(Y)=>{if(clearTimeout(G),W)W.removeEventListener("abort",K);z(Y)},reject:(Y)=>{if(clearTimeout(G),W)W.removeEventListener("abort",K);X(Y)}})})}async function X4(){let B=await fetch(`${q}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":L0},body:JSON.stringify({client_id:u})});if(!B.ok)throw Error("Failed to initiate device authorization");let Z=await B.json();return{deviceData:Z,url:`${q}/codex/device`,instructions:`Enter code: ${Z.user_code}`}}async function G4(B,Z){let $=Math.max(parseInt(B.interval,10)||5,1)*1000,W=typeof B.expires_in==="number"?B.expires_in:parseInt(B.expires_in||"",10),z=!Number.isNaN(W)&&W>0?W*1000:900000,X=Date.now();while(!0){if(Z?.aborted)throw Error("Device authorization cancelled");if(Date.now()-X>z)throw Error("Device authorization expired");let G=await fetch(`${q}/api/accounts/deviceauth/token`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":L0},body:JSON.stringify({device_auth_id:B.device_auth_id,user_code:B.user_code})});if(G.ok){let j=await G.json(),J=await fetch(`${q}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:j.authorization_code,redirect_uri:`${q}/deviceauth/callback`,client_id:u,code_verifier:j.code_verifier}).toString()});if(!J.ok)throw Error(`Token exchange failed: ${J.status}`);return await J.json()}if(G.status!==403&&G.status!==404)throw Error(`Device authorization failed: ${G.status}`);let K=z-(Date.now()-X);if(K<=0)throw Error("Device authorization expired");let Y=Math.min($+c0,K);try{await n0(Y,void 0,{signal:Z})}catch(j){if(j instanceof Error&&j.name==="AbortError")throw Error("Device authorization cancelled");throw j}}}function MB(B,Z){let $=-1;if(Z.accountId)$=B.findIndex((W)=>W.accountId&&W.accountId===Z.accountId);if($<0)$=B.findIndex((W)=>W.id===Z.id);if($<0&&Z.label&&!Z.accountId)$=B.findIndex((W)=>W.label===Z.label);if($>=0)return B[$]={...B[$],...Z,addedAt:B[$]?.addedAt??Z.addedAt},$;return B.push(Z),B.length-1}async function _B(B={}){let{label:Z,headless:$=!1,signal:W}=B;if(B0(Z),$){let{deviceData:j,url:J,instructions:Q}=await X4(),y=(async()=>{let V=await G4(j,W),F=Date.now(),J0=i(V);return{id:B0(Z||J0||crypto.randomUUID()),label:Z||void 0,type:"oauth",access:V.access_token,refresh:V.refresh_token,expires:F+(V.expires_in??3600)*1000,enabled:!0,addedAt:F,lastUsed:F,lastRefreshedAt:F,accountId:J0}})();return{url:J,instructions:Q,completion:y}}let{redirectUri:z}=await W4(),X=await o0(),G=O0(crypto.getRandomValues(new Uint8Array(32)).buffer),K=e0(z,X,G),Y=(async()=>{try{if(W?.aborted)throw Error("Login cancelled");let j=await z4(X,G,void 0,W),J=Date.now(),Q=i(j);return{id:B0(Z||Q||crypto.randomUUID()),label:Z||void 0,type:"oauth",access:j.access_token,refresh:j.refresh_token,expires:J+(j.expires_in??3600)*1000,enabled:!0,addedAt:J,lastUsed:J,lastRefreshedAt:J,accountId:Q}}finally{C(G)}})();return{url:K,instructions:"Complete authorization in your browser. This window will close automatically.",completion:Y}}var Z0="primary",$0="secondary",Y4="app_EMoamEEZ73f0CkXaXp7hrann",j4="https://auth.openai.com";async function EB(B){let Z=await B.fetchImpl(`${j4}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:B.refreshToken,client_id:Y4}).toString()});if(!Z.ok){let W=e(Z.headers.get("retry-after"));throw Object.assign(Error(`Token refresh failed: ${Z.status}`),{status:Z.status,retryAfter:W,isRefreshError:!0})}let $=await Z.json();if(!$||typeof $.access_token!=="string"||!$.access_token||typeof $.refresh_token!=="string"||!$.refresh_token||typeof $.expires_in!=="number")throw Object.assign(Error("Token refresh failed: malformed response"),{status:Z.status,isRefreshError:!0});return{access:$.access_token,refresh:$.refresh_token,expires:B.now()+$.expires_in*1000,expiresIn:$.expires_in}}var J4="https://chatgpt.com/backend-api/wham/usage";async function SB(B){let Z=await B.fetchImpl(J4,{headers:{authorization:`Bearer ${B.accessToken}`,"chatgpt-account-id":B.accountId??"","oai-client-platform":"web","oai-client-version":"0","x-openai-target-path":"/backend-api/wham/usage"}});if(!Z.ok){let W=e(Z.headers.get("retry-after"));throw Object.assign(Error(`wham usage check failed: ${Z.status}`),{status:Z.status,retryAfter:W})}let{normalizeWham:$}=await import("./quota-normalize-8yzxqy78.js");return $(await Z.json())}import{createHash as H4}from"node:crypto";var Q4=globalThis.setTimeout,N4=5;function h(B){let Z=B?.quota?.checkIntervalMinutes??N4;return Math.max(1,Z)*60000}function P4(B){return B?.quota?.enabled!==!1}function s(B,Z){if(!B?.resetsAt)return!1;let $=Date.parse(B.resetsAt);return Number.isFinite($)&&$<=Z}function TB(B,Z,$,W){let z=Z===Z0?B?.primary:Z===$0?B?.secondary:void 0,X=z?.resetsAt?Date.parse(z.resetsAt):NaN;if(Number.isFinite(X)&&X>$)return X;return $+W}function V4(B){let Z=B?.quota?.minimumRemaining||{};return{primary:Z.primary??Z["5h"]??15,secondary:Z.secondary??Z["1w"]??10}}function b0(B,Z,$){if(!P4(Z))return $+h(Z);let W=V4(Z),z=[];for(let X of["primary","secondary"]){let G=B?.[X];if(!G)continue;if(G.remainingPercent>=W[X])continue;let K=G.resetsAt?Date.parse(G.resetsAt):Number.NaN;if(!Number.isFinite(K)||K<=$)return $+h(Z);z.push(K)}if(!z.length)return $+h(Z);return Math.min(...z)+60000}function L4(B){if(!B?.quota?.mainQuota||!B.quota.mainQuotaCheckedAt)return null;return{quota:B.quota.mainQuota,checkedAt:B.quota.mainQuotaCheckedAt,tokenFingerprint:B.quota.mainQuotaToken}}function F4(B){let Z=B?.quota?.refreshEveryNRequests;return typeof Z==="number"&&Number.isFinite(Z)&&Z>0?Math.floor(Z):0}function P(B){return H4("sha256").update(B).digest("hex").slice(0,16)}class O{main=null;mainTokenFp=null;mainQuotaAccountId=null;fallbacks=new Map;fallbackTokenFps=new Map;inflightMain=null;inflightMainFp=null;inflightFallbacks=new Map;mainLastApiError=void 0;fallbackApiErrors=new Map;fallbackErrorTokenFps=new Map;rateLimitedUntilMap=new Map;apiGate=Promise.resolve();lastApiCallAt=0;storage;fetchImpl;now;fetchQuotaFn;onMainQuotaFetched;onApiError;constructor(B){this.storage=B.storage,this.fetchImpl=B.fetchImpl??fetch,this.now=B.now??Date.now,this.fetchQuotaFn=B.fetchQuotaFn,this.onMainQuotaFetched=B.onMainQuotaFetched,this.onApiError=B.onApiError,this.seedMainFromStorage(B.storage),this.seedMainBackoffFromStorage(B.storage)}getMain(B){if(B&&this.main&&this.mainTokenFp&&this.mainTokenFp!==P(B))this.main=null,this.mainTokenFp=null;return this.main}getFallback(B,Z){let $=this.fallbacks.get(B)??null;if(!Z||!$)return $;if(this.fallbackTokenFps.get(B)!==P(Z))return this.fallbacks.delete(B),this.fallbackTokenFps.delete(B),null;return $}getAllFallbacks(){return this.fallbacks}setMain(B,Z,$,W=!1){if(!W&&!D0(Z.quota))return;if(this.mainTokenFp=P(B),$&&this.mainQuotaAccountId&&this.mainQuotaAccountId!==$)this.clearRateLimited("main");if($)this.mainQuotaAccountId=$;if(this.main=Z,W0(Z.quota))this.clearRateLimited("main")}peekMainForPolicy(B){if(B&&this.mainQuotaAccountId&&this.mainQuotaAccountId!==B)return null;return this.main}peekFallbackForPolicy(B){return this.fallbacks.get(B)??null}setFallback(B,Z,$,W=!1){if(!W&&!D0(Z.quota))return;if(this.fallbacks.set(B,Z),$)this.fallbackTokenFps.set(B,P($));else this.fallbackTokenFps.delete(B);if(W0(Z.quota))this.clearRateLimited(B)}markRateLimited(B,Z){let $=this.rateLimitedUntilMap.get(B);if($!==void 0&&$>Z)return;this.rateLimitedUntilMap.set(B,Z)}isRateLimited(B){let Z=this.rateLimitedUntilMap.get(B);return Z!==void 0&&this.now()<Z}rateLimitedUntil(B){return this.rateLimitedUntilMap.get(B)}clearRateLimited(B){this.rateLimitedUntilMap.delete(B)}async refreshMain(B){let Z=P(B);if(this.mainTokenFp&&this.mainTokenFp!==Z)this.main=null,this.mainTokenFp=null;if(this.inflightMain&&this.inflightMainFp===Z)return this.inflightMain;if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}return this.inflightMainFp=Z,this.inflightMain=this._fetchMain(B),this.inflightMain}async refreshFallback(B,Z){let $=O.fallbackInflightKey(B,Z),W=this.inflightFallbacks.get($);if(W)return W;if(this.isFallbackBackedOff(B,Z)){let X=this.getFallback(B,Z);if(X)return X.quota;throw Error("Quota API rate-limited — try again later")}let z=this._fetchFallback(B,Z);return this.inflightFallbacks.set($,z),z}async refreshAllFallbacks(B){let Z=this.now();for(let $ of B){if($.enabled===!1)continue;if(!$.access)continue;let W=this.getFallback($.id,$.access);if(W&&Z<W.refreshAfter)continue;try{await this.refreshFallback($.id,$.access)}catch{}}}refreshMainInBackground(B){let Z=P(B);if(this.inflightMain&&this.inflightMainFp===Z)return;if(this.isBackedOff())return;this.refreshMain(B).catch(()=>{})}isMainStale(){if(!this.main)return!0;return this.now()>=this.main.refreshAfter}isFallbackStale(B,Z){let $=this.getFallback(B,Z);if(!$)return!0;return this.now()>=$.refreshAfter}shouldRefreshOnRequestCount(B){let Z=F4(this.storage);if(Z<=0)return!1;return B>0&&B%Z===0}needsRefresh(B){return this.isMainStale()||this.shouldRefreshOnRequestCount(B)}updateStorage(B){this.storage=B,this.seedMainFromStorage(B),this.seedMainBackoffFromStorage(B)}seedMainFromStorage(B,Z){let $=L4(B);if(!$)return;let W=Z?P(Z):null;if(W&&$.tokenFingerprint&&$.tokenFingerprint!==W)return;let z={quota:$.quota,refreshAfter:b0($.quota,B,$.checkedAt),checkedAt:$.checkedAt};if(this.main&&this.main.checkedAt>=z.checkedAt&&(!W||!this.mainTokenFp||this.mainTokenFp===W))return;if(this.main=z,this.mainTokenFp=$.tokenFingerprint??null,B?.mainAccountId){if(this.mainQuotaAccountId&&this.mainQuotaAccountId!==B.mainAccountId)this.clearRateLimited("main");this.mainQuotaAccountId=B.mainAccountId}}seedMainBackoffFromStorage(B){let Z=B?.quota?.mainLastQuotaApiError;this.mainLastApiError=Z&&x(Z,this.now())?Z:void 0}seedFallbacksFromAccounts(B){let Z=h(this.storage);for(let $ of B){if($.enabled===!1)continue;if(!$.quota)continue;let W=Math.max($.quota.primary?.checkedAt??0,$.quota.secondary?.checkedAt??0);if(W<=0)continue;let z=this.getFallback($.id,$.access);if(z&&z.checkedAt>=W)continue;this.setFallback($.id,{quota:$.quota,refreshAfter:W+Z,checkedAt:W},$.access)}}isBackedOff(){return x(this.mainLastApiError,this.now())}isFallbackBackedOff(B,Z){if(Z){if(this.fallbackErrorTokenFps.get(B)!==P(Z))return!1}return x(this.fallbackApiErrors.get(B),this.now())}getLastApiError(){return this.mainLastApiError}static API_CALL_GAP_MS=1000;static fallbackInflightKey(B,Z){return JSON.stringify([B,P(Z)])}static quotaLockName(B){return`opencode-fallback-quota-refresh-${B.replace(/[^a-zA-Z0-9._-]+/g,"-")||"account"}`}_enqueueApiFetch(B){let Z=async()=>{let W=this.now()-this.lastApiCallAt;if(W<O.API_CALL_GAP_MS)await new Promise((z)=>{let X=Q4(z,O.API_CALL_GAP_MS-W);if(typeof X==="object"&&"unref"in X)X.unref()});return this.lastApiCallAt=this.now(),B()},$=this.apiGate.then(Z,Z);return this.apiGate=$.catch(()=>{}),$}async _fetchMain(B){let Z=P(B);return this._enqueueApiFetch(async()=>{try{if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}let $=await I({name:"opencode-main-quota-refresh",ttlMs:30000});if(!$){let W=this.main;if(W&&this.now()<W.refreshAfter)return W.quota;throw Error("Quota refresh is already in progress")}try{let W=this.now(),z=await this._fetchQuota(B),X=this.now();if(this.mainTokenFp=P(B),this.main={quota:z,refreshAfter:b0(z,this.storage,X),checkedAt:X},W0(z))this.clearRateLimited("main");return this.mainLastApiError=void 0,this.onMainQuotaFetched?.(z,X,this.mainTokenFp,W),z}catch(W){throw this._handleMainFetchError(W),W}finally{await $.release()}}finally{if(this.inflightMainFp===Z)this.inflightMain=null,this.inflightMainFp=null}})}async _fetchFallback(B,Z){return this._enqueueApiFetch(async()=>{try{if(this.isFallbackBackedOff(B,Z)){let W=this.getFallback(B,Z);if(W)return W.quota;throw Error("Quota API rate-limited — try again later")}let $=await I({name:O.quotaLockName(B),ttlMs:30000});if(!$){let W=this.getFallback(B,Z);if(W&&this.now()<W.refreshAfter)return W.quota;throw Error("Quota refresh is already in progress")}try{let W=await this._fetchQuota(Z),z=this.now();return this.setFallback(B,{quota:W,refreshAfter:z+h(this.storage),checkedAt:z},Z,!0),this.fallbackApiErrors.delete(B),this.fallbackErrorTokenFps.delete(B),W}finally{await $.release()}}catch($){throw this._handleFallbackFetchError(B,Z,$),$}finally{this.inflightFallbacks.delete(O.fallbackInflightKey(B,Z))}})}async _fetchQuota(B){if(!this.fetchQuotaFn)throw Error("Quota fetch not available — no fetchQuotaFn injected (push-only mode)");return this.fetchQuotaFn({accessToken:B,fetchImpl:this.fetchImpl,now:this.now})}static isAuthError(B){return B?.status===401}_handleMainFetchError(B){if(O.isAuthError(B))return;this.mainLastApiError=f({error:B,now:this.now(),previous:this.mainLastApiError}),this.onApiError?.(this.mainLastApiError)}_handleFallbackFetchError(B,Z,$){if(O.isAuthError($))return;let W=P(Z),z=this.fallbackErrorTokenFps.get(B)===W?this.fallbackApiErrors.get(B):void 0;this.fallbackApiErrors.set(B,f({error:$,now:this.now(),previous:z})),this.fallbackErrorTokenFps.set(B,W)}}function D0(B){return Boolean(B.primary||B.secondary)}function W0(B){let{primary:Z,secondary:$}=B;if(!Z&&!$)return!1;if(Z&&Z.usedPercent>=100)return!1;if($&&$.usedPercent>=100)return!1;return!0}import{createHash as q4,randomUUID as C4}from"node:crypto";import{homedir as E4}from"node:os";import{dirname as S4,join as r}from"node:path";import{setTimeout as R4}from"node:timers/promises";import{randomUUID as O4}from"node:crypto";import{mkdir as b4,rename as D4,rm as U4,writeFile as M4}from"node:fs/promises";import{dirname as _4}from"node:path";async function A(B,Z){await b4(_4(B),{recursive:!0});let $=`${B}.${O4()}.tmp`;await M4($,`${JSON.stringify(Z,null,2)}
|
|
88
|
+
`,{encoding:"utf8",mode:384});try{await D4($,B)}catch(W){throw await U4($,{force:!0}).catch(()=>{}),W}}import{readFile as v4}from"node:fs/promises";var E=R0("refresh"),U0=1e4,y4=50,y0="openai-auth.json",x4="openai-auth-state.json";function I4(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return r(process.env.XDG_CONFIG_HOME||r(E4(),".config"),"opencode")}function T(){return process.env.OPENCODE_OPENAI_AUTH_FILE?.trim()||r(I4(),y0)}function a(B=T()){let Z=process.env.OPENCODE_OPENAI_AUTH_STATE_FILE?.trim();if(Z)return Z;return A4(B)}function A4(B){return B.endsWith(y0)?r(S4(B),x4):`${B}.state.json`}function b(B){return B.type==="oauth"}function T4(B){let Z=B?.trim();if(!Z)return!1;try{let $=new URL(Z);return($.protocol==="http:"||$.protocol==="https:")&&!$.username&&!$.password}catch{return!1}}function aB(B){return B.costZeroing?.enabled!==!1}class n extends Error{code="ACCOUNT_REMOVED_DURING_REFRESH";constructor(B){super(`Fallback account ${B} was removed before refresh`);this.name="AccountRemovedDuringRefreshError"}}var f4=[401,403,429],M0={primary:0,secondary:0},m4=!1,G0={primary:5,secondary:10};function H(B){return B!=null&&typeof B==="object"&&!Array.isArray(B)}function w4(B){return B instanceof n||H(B)&&B.name==="AccountRemovedDuringRefreshError"&&B.code==="ACCOUNT_REMOVED_DURING_REFRESH"}function _0(B){return{id:typeof B.id==="string"&&B.id.trim()?B.id.trim():C4(),label:typeof B.label==="string"?B.label:void 0,enabled:typeof B.enabled==="boolean"?B.enabled:void 0,addedAt:typeof B.addedAt==="number"?B.addedAt:void 0,lastUsed:typeof B.lastUsed==="number"?B.lastUsed:void 0,accountId:typeof B.accountId==="string"?B.accountId:void 0}}function q0(B){if(!H(B))return;if(typeof B.message!=="string")return;let Z=Number(B.checkedAt);if(!Number.isFinite(Z))return;let $=Number(B.nextRetryAt),W=Number(B.retryCount);return{message:B.message,checkedAt:Z,nextRetryAt:Number.isFinite($)?$:void 0,retryCount:Number.isFinite(W)?W:void 0,tokenHash:typeof B.tokenHash==="string"?B.tokenHash:void 0}}function k4(B){if(!H(B))return;let Z={};for(let W of["primary","secondary"]){let z=B[W];if(!H(z))continue;let X=Number(z.usedPercent),G=Number(z.remainingPercent),K=Number(z.checkedAt);if(!Number.isFinite(X)||!Number.isFinite(G)||!Number.isFinite(K))continue;let Y=typeof z.windowMinutes==="number"?z.windowMinutes:Number.NaN;Z[W]={usedPercent:X,remainingPercent:G,checkedAt:K,resetsAt:typeof z.resetsAt==="string"?z.resetsAt:void 0,...Number.isFinite(Y)&&Y>0?{windowMinutes:Y}:{}}}let $=typeof B.resetCreditsAvailable==="number"?B.resetCreditsAvailable:Number.NaN;if(Number.isFinite($)&&$>=0)Z.resetCreditsAvailable=$;return Object.keys(Z).length?Z:void 0}function h4(B){if(!H(B))return null;if(B.type==="api"){let Z=typeof B.baseURL==="string"?B.baseURL.trim():"",$=typeof B.apiKey==="string"?B.apiKey.trim():"";if(!T4(Z))return null;let W=B.authHeader==="x-api-key"?"x-api-key":"authorization-bearer";return{..._0(B),type:"api",apiKey:$||void 0,baseURL:Z,authHeader:W}}if(B.type!=="oauth")return null;if(typeof B.refresh!=="string"||!B.refresh.trim())return null;return{..._0(B),type:"oauth",access:typeof B.access==="string"?B.access:void 0,refresh:B.refresh,expires:typeof B.expires==="number"?B.expires:void 0,lastRefreshedAt:typeof B.lastRefreshedAt==="number"?B.lastRefreshedAt:void 0,lastRefreshError:q0(B.lastRefreshError),lastQuotaRefreshError:q0(B.lastQuotaRefreshError),quota:k4(B.quota)}}function x0(B){if(!H(B)||!Array.isArray(B.accounts))return null;return{version:1,main:{type:"opencode",provider:"openai"},routing:H(B.routing)?B.routing:void 0,fallbackOn:Array.isArray(B.fallbackOn)?B.fallbackOn.filter((Z)=>Number.isInteger(Z)):void 0,refresh:H(B.refresh)?B.refresh:void 0,quota:H(B.quota)?B.quota:void 0,dump:H(B.dump)?B.dump:void 0,costZeroing:H(B.costZeroing)?B.costZeroing:void 0,killswitch:H(B.killswitch)?B.killswitch:void 0,logging:H(B.logging)?B.logging:void 0,cachekeep:H(B.cachekeep)?B.cachekeep:void 0,mainAccountId:typeof B.mainAccountId==="string"?B.mainAccountId:void 0,accounts:B.accounts.map(h4).filter((Z)=>Z!=null)}}async function R(B){try{return{exists:!0,value:JSON.parse(await v4(B,"utf8"))}}catch(Z){if(Z.code==="ENOENT")return{exists:!1,value:null};throw Z}}function D(B){return Object.fromEntries(Object.entries(B).filter(([,Z])=>Z!==void 0))}async function p4(B){let Z;try{Z=(await R(B)).value}catch{return null}if(!H(Z)||!Array.isArray(Z.accounts))return null;let $=new Set;for(let W of Z.accounts)if(H(W)&&typeof W.id==="string")$.add(W.id);return $}function I0(B,Z){if(!H(B))return B;let $=H(Z)?Z:{},W=H($.main)?$.main:void 0,z=H($.accounts)?$.accounts:{},X=H(B.quota)?B.quota:{},G=H(B.refresh)?B.refresh:{},K=W??X,Y=W??G,J=Array.isArray(B.accounts)?B.accounts.map((Q)=>{if(!H(Q))return Q;let y=typeof Q.id==="string"&&H(z[Q.id])?z[Q.id]:{};return{...Q,...y}}):void 0;return A0({...B,refresh:D({...G,mainLastRefreshError:Y.lastRefreshError,mainRefreshLeaseId:Y.refreshLeaseId,mainRefreshLeaseUntil:Y.refreshLeaseUntil,mainRefreshLeaseTokenHash:Y.refreshLeaseTokenHash}),quota:D({...X,mainQuota:K.quota,mainQuotaCheckedAt:K.quotaCheckedAt,mainQuotaToken:K.quotaToken,mainLastQuotaApiError:K.lastQuotaApiError}),accounts:J})}async function l4(B=T()){let Z=await R(B);if(!Z.exists)return null;let $=await R(a(B));return x0(I0(Z.value,$.value))}function A0(B){return Object.fromEntries(Object.entries(B).filter(([,Z])=>Z!==void 0))}function d4(B){return D({id:B.id,label:B.label,type:B.type,enabled:B.enabled,addedAt:B.addedAt,accountId:B.accountId,baseURL:B.type==="api"?B.baseURL:void 0,authHeader:B.type==="api"?B.authHeader:void 0})}function T0(B){if(B.type==="api")return D({apiKey:B.apiKey,lastUsed:B.lastUsed});return D({access:B.access,refresh:B.refresh,expires:B.expires,lastUsed:B.lastUsed,lastRefreshedAt:B.lastRefreshedAt,lastRefreshError:B.lastRefreshError,lastQuotaRefreshError:B.lastQuotaRefreshError,quota:B.quota})}function c(B){return Math.max(B?.primary?.checkedAt??0,B?.secondary?.checkedAt??0)}function v(B,Z,$){if($ in Z)B[$]=Z[$];else delete B[$]}function g4(B,Z){return B.access===Z.access&&B.refresh===Z.refresh&&B.expires===Z.expires&&B.lastRefreshedAt===Z.lastRefreshedAt}function i4(B,Z){if(!g4(B,Z))return Z;if(!("lastRefreshError"in Z))return B;if(!("lastRefreshError"in B))return Z;return(Z.lastRefreshError?.checkedAt??0)>(B.lastRefreshError?.checkedAt??0)?Z:B}function u4(B,Z,$){let W=Z.lastRefreshedAt??0,z=$.lastRefreshedAt??0,X=Z.expires??0,G=$.expires??0,K=z>W?$:W>z?Z:G>X?$:X>G?Z:i4(Z,$);v(B,K,"access"),v(B,K,"refresh"),v(B,K,"expires"),v(B,K,"lastRefreshedAt"),v(B,K,"lastRefreshError")}function s4(B,Z){if(!H(B))return Z;let $=B,W=c($.quota),z=c(Z.quota),X=W>z,G=X?{...$,...Z,quota:$.quota,lastQuotaRefreshError:$.lastQuotaRefreshError}:{...$,...Z};if(!X&&!("lastQuotaRefreshError"in Z))delete G.lastQuotaRefreshError;if(!("lastRefreshError"in Z))delete G.lastRefreshError;if(typeof $.lastUsed==="number"&&(typeof Z.lastUsed!=="number"||$.lastUsed>Z.lastUsed))G.lastUsed=$.lastUsed;return u4(G,$,Z),G}function f0(B){let Z=B.refresh?D({enabled:B.refresh.enabled,intervalMinutes:B.refresh.intervalMinutes,refreshBeforeExpiryMinutes:B.refresh.refreshBeforeExpiryMinutes}):void 0,$=B.quota?D({enabled:B.quota.enabled,checkIntervalMinutes:B.quota.checkIntervalMinutes,refreshEveryNRequests:B.quota.refreshEveryNRequests,minimumRemaining:B.quota.minimumRemaining,failClosedOnUnknownQuota:B.quota.failClosedOnUnknownQuota,showToasts:B.quota.showToasts}):void 0;return A0({version:1,main:B.main,routing:B.routing,fallbackOn:B.fallbackOn,refresh:Z,quota:$,dump:B.dump,costZeroing:B.costZeroing,killswitch:B.killswitch,logging:B.logging,cachekeep:B.cachekeep,mainAccountId:B.mainAccountId,accounts:B.accounts.map(d4)})}async function p(B){let Z=Date.now()+U0;while(Date.now()<=Z){let $=await I({name:"save",ttlMs:U0,path:B});if($)return $;let W=Z-Date.now();if(W<=0)break;await R4(Math.min(y4,W))}throw Error(`Timed out acquiring account store lock for ${B}; refusing to overwrite newer account data`)}function m0(B){let Z=Object.fromEntries(B.accounts.map(($)=>[$.id,T0($)]));return{version:1,main:D({quota:B.quota?.mainQuota,quotaCheckedAt:B.quota?.mainQuotaCheckedAt,quotaToken:B.quota?.mainQuotaToken,lastQuotaApiError:B.quota?.mainLastQuotaApiError,lastRefreshError:B.refresh?.mainLastRefreshError,refreshLeaseId:B.refresh?.mainRefreshLeaseId,refreshLeaseUntil:B.refresh?.mainRefreshLeaseUntil,refreshLeaseTokenHash:B.refresh?.mainRefreshLeaseTokenHash}),accounts:Z}}async function tB(B,Z=T()){let $=a(Z),W=await p(Z);try{let z=await p($);try{let X=await R(Z),G=await R($),K=(X.exists?x0(I0(X.value,G.value)):null)??r4(),Y=B(K)??K,J={...H(X.value)?X.value:{},...f0(Y)};return await A(Z,J),await A($,m0(Y)),Y}finally{await z.release()}}finally{await W.release()}}function r4(){return{version:1,main:{type:"opencode",provider:"openai"},accounts:[]}}function n4(B,Z){B.main=B.main??{};let $=typeof B.main.quotaCheckedAt==="number"?B.main.quotaCheckedAt:c(B.main.quota),W=typeof Z.quota?.mainQuotaCheckedAt==="number"?Z.quota.mainQuotaCheckedAt:c(Z.quota?.mainQuota);if($>W)return;B.main.quota=Z.quota?.mainQuota,B.main.quotaCheckedAt=Z.quota?.mainQuotaCheckedAt,B.main.quotaToken=Z.quota?.mainQuotaToken,B.main.lastQuotaApiError=Z.quota?.mainLastQuotaApiError}function c4(B,Z){B.main=B.main??{},B.main.lastRefreshError=Z.refresh?.mainLastRefreshError,B.main.refreshLeaseId=Z.refresh?.mainRefreshLeaseId,B.main.refreshLeaseUntil=Z.refresh?.mainRefreshLeaseUntil,B.main.refreshLeaseTokenHash=Z.refresh?.mainRefreshLeaseTokenHash}function K0(B){if(Array.isArray(B))return B.map(K0);if(!H(B))return B;return Object.fromEntries(Object.entries(B).filter(([,Z])=>Z!==void 0).map(([Z,$])=>[Z,K0($)]))}async function a4(B,Z=T(),$={mainQuota:!0,mainRefresh:!0,accounts:!0}){let W=a(Z),z=await p(W);try{let X=(await R(W)).value,G=H(X)?{...X,version:1}:{version:1};if($.mainQuota)n4(G,B);if($.mainRefresh)c4(G,B);if($.accounts){let K=$.accounts===!0?null:new Set($.accounts),Y=await p4(Z);G.accounts={...H(G.accounts)?G.accounts:{}};for(let j of B.accounts){if(K&&!K.has(j.id))continue;if(Y&&!Y.has(j.id))continue;G.accounts[j.id]=s4(G.accounts[j.id],T0(j))}if(K){for(let j of K)if(!B.accounts.some((J)=>J.id===j))delete G.accounts[j]}if(Y){for(let j of Object.keys(G.accounts))if(!Y.has(j))delete G.accounts[j]}}await A(W,K0(G))}finally{await z.release()}}function o4(B){return B?.fallbackOn?.length?B.fallbackOn:f4}function eB(B,Z){return o4(Z).includes(B)}function t4(B){let Z=B?.quota?.minimumRemaining||{};return{primary:Z.primary??Z["5h"]??M0.primary,secondary:Z.secondary??Z["1w"]??M0.secondary}}function Y0(B){return B?.quota?.enabled!==!1}function l(B){return B?.quota?.failClosedOnUnknownQuota??m4}function w0(B,Z,$=Date.now()){if(!Y0(Z))return!0;if(!B)return!l(Z);let W=t4(Z),z=l(Z);for(let X of["primary","secondary"]){let G=B[X];if(!G)continue;if(s(G,$)){if(z)return!1;continue}if(G.remainingPercent<W[X])return!1}return!0}function k0(B){return B?.killswitch?.enabled===!0}function C0(B){return{primary:B?.primary??B?.["5h"]??G0.primary,secondary:B?.secondary??B?.["1w"]??G0.secondary}}function h0(B,Z){if(!B?.killswitch)return G0;if(Z&&B.killswitch.accounts?.[Z])return C0(B.killswitch.accounts[Z]);return C0(B.killswitch.main)}function BZ(B,Z,$,W=Date.now()){if(!k0(Z))return!0;if(!B)return!l(Z);let z=h0(Z,$),X=l(Z);for(let G of["primary","secondary"]){let K=B[G];if(!K)continue;if(s(K,W)){if(X)return!1;continue}if(K.remainingPercent<z[G])return!1}return!0}function ZZ(B,Z,$,W){if(!k0(W))return 300;let z=[],X=[{accountId:void 0,quota:B},...Z];for(let{accountId:K,quota:Y}of X){if(!Y)continue;let j=h0(W,K),J=[],Q=!1;for(let y of["primary","secondary"]){let V=Y[y];if(!V||s(V,$))continue;if(V.remainingPercent>=j[y])continue;let F=V.resetsAt?Date.parse(V.resetsAt):NaN;if(!Number.isFinite(F)||F<=$){Q=!0;break}J.push(F)}if(Q||J.length===0)continue;z.push(Math.max(...J))}if(z.length===0)return 300;let G=Math.min(...z);return Math.max(1,Math.ceil((G-$)/1000))}function e4(B){return typeof B.version==="number"&&Array.isArray(B.accounts)}async function $Z(B,Z=T()){let $=a(Z),W=await p(Z);try{let z=await p($);try{let X=await R(Z);if(X.exists&&H(X.value)){if(e4(X.value))return}if(!B)return;let G={version:1,main:{type:"opencode",provider:"openai"},accounts:[]};if(B.access){let j=i({id_token:"",access_token:B.access,refresh_token:B.refresh});if(j)G.mainAccountId=j}let Y={...X.exists&&H(X.value)?X.value:{},...f0(G)};await A(Z,Y),await A($,m0(G))}finally{await z.release()}}finally{await W.release()}}function BB(B){return B?.refresh?.enabled!==!1}function ZB(B){return(B?.refresh?.refreshBeforeExpiryMinutes??240)*60000}function $B(B){return Math.floor(Math.random()*(B+1))}function S(B,Z,$){return!B.access||!B.expires||B.expires-$<=ZB(Z)}function WB(B,Z){return Boolean(B.access&&typeof B.expires==="number"&&B.expires>Z)}function zB(B,Z){return Boolean(B.mainAccountId&&Z.accountId&&Z.accountId===B.mainAccountId)}function N(B,Z){let $=B.accounts.findIndex((W)=>W.id===Z.id);if($!==-1)B.accounts[$]=Z}function z0(B){return B instanceof Error?B.message:String(B)}function j0(B,Z,$){B.lastRefreshError=Q0({error:Z,now:$,refreshToken:B.refresh,previous:B.lastRefreshError})}function X0(B,Z,$){if(B.lastQuotaRefreshError=f({error:Z,now:$,previous:B.lastQuotaRefreshError}),Z?.isRefreshError===!0)j0(B,Z,$)}function XB(B){return`fallback-oauth-refresh-${q4("sha256").update(B).digest("base64url").slice(0,16)}`}function E0(B,Z){if(!B)return!1;if(!B.resetsAt)return!0;let $=Date.parse(B.resetsAt);return Number.isFinite($)?$>Z:!0}function GB(B,Z){if(!B)return!1;return E0(B.primary,Z)||E0(B.secondary,Z)}function KB(B,Z,$){if(!B)return!1;let W=Z?.quota?.checkIntervalMinutes??5,z=Math.max(1,W)*60000,X=Math.max(B.primary?.checkedAt??0,B.secondary?.checkedAt??0);return $-X<z}function S0(B,Z,$){return!KB(B.quota,Z,$)}function YB(B,Z,$,W){return t($)&&w0(B.quota,Z,W)&&GB(B.quota,W)}function jB(B){let Z=B?.quota?.checkIntervalMinutes??5;return Math.max(1,Z)*60000}var JB=60000,HB=60000,QB=600000,NB=1e4,PB=100;var WZ=globalThis.setTimeout.bind(globalThis),zZ=globalThis.clearTimeout.bind(globalThis);class VB{now;fetchImpl;configPath;refreshPromises=new Map;refreshTimer=null;quotaTimer=null;quotaManager;onFallbackStorageChanged;options;constructor(B={}){this.options=B,this.now=B.now??Date.now,this.fetchImpl=B.fetchImpl??fetch,this.configPath=B.configPath??T(),this.quotaManager=B.quotaManager??null,this.onFallbackStorageChanged=B.onFallbackStorageChanged}seedFallbackQuota(B,Z){if(!this.quotaManager)return;if(!B.quota)return;let $=Math.max(B.quota.primary?.checkedAt??0,B.quota.secondary?.checkedAt??0);if($<=0)return;let W=this.quotaManager.getFallback(B.id,B.access);if(W&&W.checkedAt>=$)return;this.quotaManager.setFallback(B.id,{quota:B.quota,refreshAfter:$+jB(Z),checkedAt:$},B.access)}async load(){return l4(this.configPath)}async save(B,Z){await a4(B,this.configPath,{accounts:Z??!0})}startBackgroundRefresh(){let B=async()=>{if(await this.refreshDueAccounts(),this.options.fetchQuotaFn)await this.refreshQuotaForDueAccounts()};if(B().catch(()=>{}),!this.refreshTimer){if(this.refreshTimer=setInterval(()=>{B().catch(()=>{})},JB+$B(HB)),"unref"in this.refreshTimer)this.refreshTimer.unref()}}stopBackgroundRefresh(){if(this.refreshTimer)clearInterval(this.refreshTimer);if(this.quotaTimer)clearInterval(this.quotaTimer);this.refreshTimer=null,this.quotaTimer=null}async getUsableFallbackAccounts(B){let Z=B!==void 0?B:await this.load();if(!Z)return[];let $=[],W=!1;for(let z of Z.accounts){if(z.enabled===!1||!b(z))continue;if(zB(Z,z))continue;let X=!1,G=z;try{if(S(G,Z,this.now())){let K=G.lastRefreshError;if(K&&U(K,G.refresh,this.now()))throw X=!0,Error(d(K,this.now()));try{G=await this.refreshAccount(G,Z),W=!0}catch(Y){if(w4(Y))continue;X=!0;let j=Z.accounts.find((J)=>J.id===z.id&&b(J));if(j&&!U(j.lastRefreshError,j.refresh,this.now()))j0(j,Y,this.now()),N(Z,j),W=!0;throw Y}}if(this.seedFallbackQuota(G,Z),this.accountPassesQuotaPolicy(this.quotaPolicyAccount(G),Z))$.push(G)}catch(K){let Y=WB(G,this.now());if(X){if(!Y)continue}else if(!Y)continue;if(YB(G,Z,K,this.now()))E.debug("fallback quota using cached quota after refresh error",{pid:process.pid,accountId:G.id,error:z0(K)}),$.push(G);else if(!l(Z))$.push(G)}}if(W)await this.save(Z);return $}async markUsed(B){let Z=await this.load();if(!Z)return;let $=Z.accounts.find((W)=>W.id===B.id);if(!$)return;$.lastUsed=this.now(),await this.save(Z)}accountPassesQuotaPolicy(B,Z){return w0(B.quota,Z,this.now())}quotaPolicyAccount(B){if(!this.quotaManager)return B;let Z=this.quotaManager.getFallback(B.id,B.access)?.quota;return Z?{...B,quota:Z}:B}async refreshDueAccounts(){let B=await this.load();if(!B||!BB(B))return;let Z=!1;for(let $ of B.accounts){if($.enabled===!1||!b($))continue;if(!S($,B,this.now()))continue;if(U($.lastRefreshError,$.refresh,this.now()))continue;try{E.debug("fallback oauth background due",{pid:process.pid,accountId:$.id,expiresInMs:$.expires?$.expires-this.now():void 0}),await this.refreshAccount($,B),Z=!0}catch(W){E.warn("fallback oauth background failed",{pid:process.pid,accountId:$.id,error:z0(W)}),j0($,W,this.now()),N(B,$),Z=!0}}if(Z)await this.save(B)}async refreshQuotaForDueAccounts(){let B=await this.load();if(!B||!Y0(B))return;if(!this.options.fetchQuotaFn)return;let Z=!1;for(let $ of B.accounts){if($.enabled===!1||!b($))continue;let W=$;try{if(S(W,B,this.now())){if(U(W.lastRefreshError,W.refresh,this.now()))continue;W=await this.refreshAccount(W,B),Z=!0}if(x(W.lastQuotaRefreshError,this.now()))continue;if(this.seedFallbackQuota(W,B),!(this.quotaManager?this.quotaManager.isFallbackStale(W.id,W.access):S0(W,B,this.now())))continue;await this.refreshAccountQuota(W,B),Z=!0}catch(z){X0($,z,this.now()),N(B,$),Z=!0}}if(Z)await this.save(B),this.onFallbackStorageChanged?.()}async refreshQuotaForAllAccounts(B={}){let Z=await this.load(),$=[];if(!Z||!Y0(Z))return{storage:Z,errors:$};if(!this.options.fetchQuotaFn)return{storage:Z,errors:$};let W=B.force??!1,z=!1;for(let X of Z.accounts){if(X.enabled===!1||!b(X))continue;let G=X;try{if(S(G,Z,this.now())){let K=G.lastRefreshError;if(K&&U(K,G.refresh,this.now()))throw Error(d(K,this.now()));G=await this.refreshAccount(G,Z),z=!0}if(!W&&!S0(G,Z,this.now())){if(G.lastQuotaRefreshError)G.lastQuotaRefreshError=void 0,N(Z,G),z=!0;continue}await this.refreshAccountQuota(G,Z),z=!0}catch(K){X0(X,K,this.now()),N(Z,X),z=!0,$.push({accountId:X.id,message:z0(K)})}}if(z)await this.save(Z);return{storage:Z,errors:$}}async refreshAccount(B,Z,$={}){let W=this.refreshPromises.get(B.id);if(W){let G=await W;return N(Z,G),G}let z=this.refreshAccountNow(B,Z,$).finally(()=>{this.refreshPromises.delete(B.id)});this.refreshPromises.set(B.id,z);let X=await z;return N(Z,X),X}async waitForConcurrentFallbackRefresh(B,Z,$,W){let z=Date.now()+NB;while(Date.now()<z){await new Promise((j)=>setTimeout(j,PB));let X=await this.load(),G=X?.accounts.find((j)=>j.id===B.id&&b(j));if(!G)continue;if((G.access!==$.access||G.refresh!==$.refresh||(G.expires??0)>($.expires??0)+60000)&&(W.force||!S(G,X,this.now())))return N(Z,G),E.debug("fallback oauth joined concurrent refresh",{pid:process.pid,accountId:G.id,expiresInMs:G.expires?G.expires-this.now():void 0}),G;let Y=G.lastRefreshError;if(Y&&U(Y,G.refresh,this.now()))throw N(Z,G),Error(d(Y,this.now()))}return null}async refreshAccountNow(B,Z,$){let W=await this.load(),z=W?.accounts.find((K)=>K.id===B.id&&b(K));if(z&&!$.force&&!S(z,W,this.now()))return N(Z,z),z;let X=z??B,G=await I({name:XB(X.id),ttlMs:QB,path:this.configPath,now:this.now,renew:!0});if(!G){E.debug("fallback oauth refresh skipped file lock",{pid:process.pid,accountId:X.id});let K=await this.waitForConcurrentFallbackRefresh(B,Z,X,$);if(K)return K;throw Error("Fallback OAuth refresh is already in progress")}try{if(W=await this.load(),z=W?.accounts.find((J)=>J.id===B.id&&b(J)),z&&!$.force&&!S(z,W,this.now()))return N(Z,z),z;if(!z)throw new n(B.id);X=z;let K=this.options.refreshFn??(async()=>{throw Error("No refreshFn injected into FallbackAccountManager")});E.debug("fallback oauth refresh request start",{pid:process.pid,accountId:X.id,force:$.force===!0,expiresInMs:X.expires?X.expires-this.now():void 0});let Y=await K({refreshToken:X.refresh,fetchImpl:this.fetchImpl,now:this.now});if(X.access=Y.access,X.refresh=Y.refresh,X.expires=Y.expires,X.lastRefreshedAt=Y.expires-Y.expiresIn*1000,X.lastRefreshError=void 0,N(Z,X),await this.save(Z),!(await this.load())?.accounts.some((J)=>J.id===B.id))throw new n(B.id);return E.debug("fallback oauth refresh succeeded",{pid:process.pid,accountId:X.id,expiresInMs:X.expires?X.expires-this.now():void 0}),X}finally{await G.release()}}async refreshAccountQuota(B,Z){let $=B;if(!$.access)throw Error(`Fallback account ${B.id} has no access token`);if(!this.options.fetchQuotaFn)throw Error("No fetchQuotaFn injected — wham/usage supplement is disabled");let W=this.options.fetchQuotaFn??(async()=>{throw Error("No fetchQuotaFn injected — wham/usage supplement is disabled")}),z=(X)=>this.quotaManager?this.quotaManager.refreshFallback($.id,X):W({accessToken:X,fetchImpl:this.fetchImpl,now:this.now});try{if(!$.access)throw Error(`Fallback account ${B.id} has no access token`);let X=await z($.access);$.quota=X,$.lastQuotaRefreshError=void 0,N(Z,$),await this.save(Z)}catch(X){throw X0(B,X,this.now()),N(Z,B),X}}}
|
|
89
|
+
export{H0 as h,Q0 as i,U as j,d as k,L0 as l,O0 as m,o0 as n,P0 as o,V0 as p,i as q,B0 as r,e0 as s,C as t,W4 as u,z4 as v,X4 as w,G4 as x,MB as y,_B as z,EB as A,SB as B,TB as C,O as D,T as E,b as F,aB as G,G0 as H,l4 as I,tB as J,eB as K,k0 as L,BZ as M,ZZ as N,$Z as O,VB as P};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ra as Z,ta as W}from"./index-6y6ss1kc.js";var R=Z(($G,E)=>{var{defineProperty:N,getOwnPropertyDescriptor:Kz,getOwnPropertyNames:Qz}=Object,Wz=Object.prototype.hasOwnProperty,Xz=(z,G)=>{for(var H in G)N(z,H,{get:G[H],enumerable:!0})},Yz=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of Qz(G))if(!Wz.call(z,K)&&K!==H)N(z,K,{get:()=>G[K],enumerable:!(Q=Kz(G,K))||Q.enumerable})}return z},Zz=(z)=>Yz(N({},"__esModule",{value:!0}),z),O={};Xz(O,{VercelOidcTokenError:()=>S});E.exports=Zz(O);class S extends Error{constructor(z,G){super(z);this.name="VercelOidcTokenError",this.cause=G}toString(){if(this.cause)return`${this.name}: ${this.message}: ${this.cause}`;return`${this.name}: ${this.message}`}}});var P=Z((qG,y)=>{var{create:$z,defineProperty:L,getOwnPropertyDescriptor:qz,getOwnPropertyNames:vz,getPrototypeOf:Bz}=Object,Fz=Object.prototype.hasOwnProperty,Uz=(z,G)=>{for(var H in G)L(z,H,{get:G[H],enumerable:!0})},C=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of vz(G))if(!Fz.call(z,K)&&K!==H)L(z,K,{get:()=>G[K],enumerable:!(Q=qz(G,K))||Q.enumerable})}return z},I=(z,G,H)=>(H=z!=null?$z(Bz(z)):{},C(G||!z||!z.__esModule?L(H,"default",{value:z,enumerable:!0}):H,z)),Lz=(z)=>C(L({},"__esModule",{value:!0}),z),x={};Uz(x,{findRootDir:()=>Jz,getUserDataDir:()=>Nz});y.exports=Lz(x);var B=I(W("path")),bz=I(W("fs")),A=I(W("os")),Vz=R();function Jz(){try{let z=process.cwd();while(z!==B.default.dirname(z)){let G=B.default.join(z,".vercel");if(bz.default.existsSync(G))return z;z=B.default.dirname(z)}}catch(z){throw new Vz.VercelOidcTokenError("Token refresh only supported in node server environments")}return null}function Nz(){if(process.env.XDG_DATA_HOME)return process.env.XDG_DATA_HOME;switch(A.default.platform()){case"darwin":return B.default.join(A.default.homedir(),"Library/Application Support");case"linux":return B.default.join(A.default.homedir(),".local/share");case"win32":if(process.env.LOCALAPPDATA)return process.env.LOCALAPPDATA;return null;default:return null}}});var i=Z((vG,c)=>{var{create:Rz,defineProperty:b,getOwnPropertyDescriptor:Az,getOwnPropertyNames:Iz,getPrototypeOf:Dz}=Object,wz=Object.prototype.hasOwnProperty,Tz=(z,G)=>{for(var H in G)b(z,H,{get:G[H],enumerable:!0})},u=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of Iz(G))if(!wz.call(z,K)&&K!==H)b(z,K,{get:()=>G[K],enumerable:!(Q=Az(G,K))||Q.enumerable})}return z},l=(z,G,H)=>(H=z!=null?Rz(Dz(z)):{},u(G||!z||!z.__esModule?b(H,"default",{value:z,enumerable:!0}):H,z)),jz=(z)=>u(b({},"__esModule",{value:!0}),z),g={};Tz(g,{isValidAccessToken:()=>Ez,readAuthConfig:()=>Oz,writeAuthConfig:()=>Sz});c.exports=jz(g);var F=l(W("fs")),h=l(W("path")),Mz=f();function k(){let z=(0,Mz.getVercelDataDir)();if(!z)throw Error(`Unable to find Vercel CLI data directory. Your platform: ${process.platform}. Supported: darwin, linux, win32.`);return h.join(z,"auth.json")}function Oz(){try{let z=k();if(!F.existsSync(z))return null;let G=F.readFileSync(z,"utf8");if(!G)return null;return JSON.parse(G)}catch(z){return null}}function Sz(z){let G=k(),H=h.dirname(G);if(!F.existsSync(H))F.mkdirSync(H,{mode:504,recursive:!0});F.writeFileSync(G,JSON.stringify(z,null,2),{mode:384})}function Ez(z,G=0){if(!z.token)return!1;if(typeof z.expiresAt!=="number")return!0;let H=Math.floor(Date.now()/1000),Q=G/1000;return z.expiresAt>=H+Q}});var a=Z((BG,s)=>{var{defineProperty:T,getOwnPropertyDescriptor:Cz,getOwnPropertyNames:xz}=Object,yz=Object.prototype.hasOwnProperty,Pz=(z,G)=>{for(var H in G)T(z,H,{get:G[H],enumerable:!0})},uz=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of xz(G))if(!yz.call(z,K)&&K!==H)T(z,K,{get:()=>G[K],enumerable:!(Q=Cz(G,K))||Q.enumerable})}return z},lz=(z)=>uz(T({},"__esModule",{value:!0}),z),d={};Pz(d,{processTokenResponse:()=>iz,refreshTokenRequest:()=>cz});s.exports=lz(d);var D=W("os"),gz="https://vercel.com",hz="cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp",p=`@vercel/oidc node-${process.version} ${(0,D.platform)()} (${(0,D.arch)()}) ${(0,D.hostname)()}`,w=null;async function kz(){if(w)return w;let z=`${gz}/.well-known/openid-configuration`,G=await fetch(z,{headers:{"user-agent":p}});if(!G.ok)throw Error("Failed to discover OAuth endpoints");let H=await G.json();if(!H||typeof H.token_endpoint!=="string")throw Error("Invalid OAuth discovery response");let Q=H.token_endpoint;return w=Q,Q}async function cz(z){let G=await kz();return await fetch(G,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","user-agent":p},body:new URLSearchParams({client_id:hz,grant_type:"refresh_token",...z})})}async function iz(z){let G=await z.json();if(!z.ok){let H=typeof G==="object"&&G&&"error"in G?String(G.error):"Token refresh failed";return[Error(H)]}if(typeof G!=="object"||G===null)return[Error("Invalid token response")];if(typeof G.access_token!=="string")return[Error("Missing access_token in response")];if(G.token_type!=="Bearer")return[Error("Invalid token_type in response")];if(typeof G.expires_in!=="number")return[Error("Missing expires_in in response")];return[null,G]}});var t=Z((FG,r)=>{var{defineProperty:j,getOwnPropertyDescriptor:fz,getOwnPropertyNames:dz}=Object,pz=Object.prototype.hasOwnProperty,sz=(z,G)=>{for(var H in G)j(z,H,{get:G[H],enumerable:!0})},az=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of dz(G))if(!pz.call(z,K)&&K!==H)j(z,K,{get:()=>G[K],enumerable:!(Q=fz(G,K))||Q.enumerable})}return z},_z=(z)=>az(j({},"__esModule",{value:!0}),z),_={};sz(_,{AccessTokenMissingError:()=>m,RefreshAccessTokenFailedError:()=>n});r.exports=_z(_);class m extends Error{constructor(){super("No authentication found. Please log in with the Vercel CLI (vercel login).");this.name="AccessTokenMissingError"}}class n extends Error{constructor(z){super("Failed to refresh authentication token.",{cause:z});this.name="RefreshAccessTokenFailedError"}}});var f=Z((UG,Hz)=>{var{create:mz,defineProperty:V,getOwnPropertyDescriptor:nz,getOwnPropertyNames:rz,getPrototypeOf:tz}=Object,ez=Object.prototype.hasOwnProperty,oz=(z,G)=>{for(var H in G)V(z,H,{get:G[H],enumerable:!0})},o=(z,G,H,Q)=>{if(G&&typeof G==="object"||typeof G==="function"){for(let K of rz(G))if(!ez.call(z,K)&&K!==H)V(z,K,{get:()=>G[K],enumerable:!(Q=nz(G,K))||Q.enumerable})}return z},zz=(z,G,H)=>(H=z!=null?mz(tz(z)):{},o(G||!z||!z.__esModule?V(H,"default",{value:z,enumerable:!0}):H,z)),zG=(z)=>o(V({},"__esModule",{value:!0}),z),Gz={};oz(Gz,{assertVercelOidcTokenResponse:()=>M,findProjectInfo:()=>QG,getTokenPayload:()=>YG,getVercelDataDir:()=>GG,getVercelOidcToken:()=>KG,getVercelToken:()=>HG,isExpired:()=>ZG,loadToken:()=>XG,saveToken:()=>WG});Hz.exports=zG(Gz);var U=zz(W("path")),X=zz(W("fs")),v=R(),J=P(),$=i(),e=a(),q=t();function GG(){let G=(0,J.getUserDataDir)();if(!G)return null;return U.join(G,"com.vercel.cli")}async function HG(z){let G=(0,$.readAuthConfig)();if(!G?.token)throw new q.AccessTokenMissingError;if((0,$.isValidAccessToken)(G,z?.expirationBufferMs))return G.token;if(!G.refreshToken)throw(0,$.writeAuthConfig)({}),new q.RefreshAccessTokenFailedError("No refresh token available");try{let H=await(0,e.refreshTokenRequest)({refresh_token:G.refreshToken}),[Q,K]=await(0,e.processTokenResponse)(H);if(Q||!K)throw(0,$.writeAuthConfig)({}),new q.RefreshAccessTokenFailedError(Q);let Y={token:K.access_token,expiresAt:Math.floor(Date.now()/1000)+K.expires_in};if(K.refresh_token)Y.refreshToken=K.refresh_token;return(0,$.writeAuthConfig)(Y),Y.token}catch(H){if((0,$.writeAuthConfig)({}),H instanceof q.AccessTokenMissingError||H instanceof q.RefreshAccessTokenFailedError)throw H;throw new q.RefreshAccessTokenFailedError(H)}}async function KG(z,G,H){let Q=`https://api.vercel.com/v1/projects/${G}/token?source=vercel-oidc-refresh${H?`&teamId=${H}`:""}`,K=await fetch(Q,{method:"POST",headers:{Authorization:`Bearer ${z}`}});if(!K.ok)throw new v.VercelOidcTokenError(`Failed to refresh OIDC token: ${K.statusText}`);let Y=await K.json();return M(Y),Y}function M(z){if(!z||typeof z!=="object")throw TypeError("Vercel OIDC token is malformed. Expected an object. Please run `vc env pull` and try again");if(!("token"in z)||typeof z.token!=="string")throw TypeError("Vercel OIDC token is malformed. Expected a string-valued token property. Please run `vc env pull` and try again")}function QG(){let z=(0,J.findRootDir)();if(!z)throw new v.VercelOidcTokenError("Unable to find project root directory. Have you linked your project with `vc link?`");let G=U.join(z,".vercel","project.json");if(!X.existsSync(G))throw new v.VercelOidcTokenError("project.json not found, have you linked your project with `vc link?`");let H=JSON.parse(X.readFileSync(G,"utf8"));if(typeof H.projectId!=="string"&&typeof H.orgId!=="string")throw TypeError("Expected a string-valued projectId property. Try running `vc link` to re-link your project.");return{projectId:H.projectId,teamId:H.orgId}}function WG(z,G){let H=(0,J.getUserDataDir)();if(!H)throw new v.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support.");let Q=U.join(H,"com.vercel.token",`${G}.json`),K=JSON.stringify(z);X.mkdirSync(U.dirname(Q),{mode:504,recursive:!0}),X.writeFileSync(Q,K),X.chmodSync(Q,432);return}function XG(z){let G=(0,J.getUserDataDir)();if(!G)throw new v.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support.");let H=U.join(G,"com.vercel.token",`${z}.json`);if(!X.existsSync(H))return null;let Q=JSON.parse(X.readFileSync(H,"utf8"));return M(Q),Q}function YG(z){let G=z.split(".");if(G.length!==3)throw new v.VercelOidcTokenError("Invalid token. Please run `vc env pull` and try again");let H=G[1].replace(/-/g,"+").replace(/_/g,"/"),Q=H.padEnd(H.length+(4-H.length%4)%4,"=");return JSON.parse(Buffer.from(Q,"base64").toString("utf8"))}function ZG(z,G=0){return z.exp*1000<Date.now()+G}});
|
|
2
|
+
export{R as a,f as b};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Hooks, Plugin, PluginInput } from '@opencode-ai/plugin';
|
|
2
|
-
import { type FallbackAccount, type OAuthAccount } from './core/accounts';
|
|
2
|
+
import { type AccountStorage, type FallbackAccount, type OAuthAccount, type OAuthQuotaSnapshot } from './core/accounts';
|
|
3
|
+
import { QuotaManager } from './core/quota-manager';
|
|
4
|
+
import { type SidebarMachineState, type SidebarState } from './sidebar-state';
|
|
3
5
|
export declare const MAIN_REFRESH_LOCK_TTL_MS: number;
|
|
4
6
|
export declare const MAIN_REFRESH_LEASE_TTL_MS = 90000;
|
|
5
7
|
export declare class AuthPersistError extends Error {
|
|
@@ -11,8 +13,13 @@ interface CodexAuthPluginOptions {
|
|
|
11
13
|
issuer?: string;
|
|
12
14
|
codexApiEndpoint?: string;
|
|
13
15
|
experimentalWebSockets?: boolean;
|
|
16
|
+
responsesLite?: boolean;
|
|
14
17
|
}
|
|
15
18
|
export declare function findCachekeepFallbackAccount(accounts: FallbackAccount[], accountId: string): OAuthAccount | undefined;
|
|
19
|
+
export declare function mergePushedQuotaMetadata(incoming: OAuthQuotaSnapshot, previous: OAuthQuotaSnapshot | undefined): OAuthQuotaSnapshot;
|
|
20
|
+
export declare function buildSidebarMachineState(qm: QuotaManager, store: AccountStorage, now?: number): SidebarMachineState;
|
|
21
|
+
export declare function buildSidebarState(qm: QuotaManager, store: AccountStorage, activeId: string, now?: number): SidebarState;
|
|
22
|
+
export declare function resolveSidebarSessionId(headers: Headers): string | undefined;
|
|
16
23
|
export declare function CodexAuthPlugin(input: PluginInput, options?: CodexAuthPluginOptions): Promise<Hooks>;
|
|
17
24
|
export declare const OpenAIAuthPlugin: Plugin;
|
|
18
25
|
declare const _default: {
|