@cortexkit/opencode-openai-auth 0.4.1 → 0.4.2

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.
@@ -1 +1 @@
1
- import{c as a,d as b,e as c,f as d,g as e}from"./index-2ng03cby.js";import"./index-6y6ss1kc.js";export{a as toResetIso,d as normalizeWsFrame,e as normalizeWham,b as normalizeQuotaHeaders,c as isCompleteQuotaHeaderFrame};
1
+ import{c as a,d as b,e as c,f as d,g as e}from"./index-2ng03cby.js";import"./index-jpx7h5gc.js";export{a as toResetIso,d as normalizeWsFrame,e as normalizeWham,b as normalizeQuotaHeaders,c as isCompleteQuotaHeaderFrame};
@@ -1 +1 @@
1
- import{ma as a,na as b}from"../index-1anzb8jh.js";import"../index-6y6ss1kc.js";export{a as writePortFile,b as discoverPortFile};
1
+ import{na as a,oa as b}from"../index-qnd9x5jh.js";import"../index-jpx7h5gc.js";export{a as writePortFile,b as discoverPortFile};
@@ -1 +1 @@
1
- import{na as c}from"../index-1anzb8jh.js";import"../index-6y6ss1kc.js";async function p(n,r,l,o,i){let t=await c(n,r);if(l?.(t),!t)return null;let e=new AbortController,s=setTimeout(()=>e.abort(),2000);try{let a=await fetch(`http://127.0.0.1:${t.port}/rpc/${o}`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t.token}`},body:JSON.stringify(i),signal:e.signal});if(!a.ok)return null;return await a.json()}catch{return null}finally{clearTimeout(s)}}function y(n,r,l){let o=!1,i=(t)=>{if(o)return;o=!0,l?.(t)};return{async pending(t,e){return(await p(n,r,i,"pending-notifications",{lastReceivedId:t,sessionId:e}))?.messages??[]},async apply(t){return await p(n,r,i,"apply",{...t})??{text:"apply failed",knobs:{}}}}}export{y as createRpcClient};
1
+ import{oa as c}from"../index-qnd9x5jh.js";import"../index-jpx7h5gc.js";async function p(n,r,l,o,i){let t=await c(n,r);if(l?.(t),!t)return null;let e=new AbortController,s=setTimeout(()=>e.abort(),2000);try{let a=await fetch(`http://127.0.0.1:${t.port}/rpc/${o}`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t.token}`},body:JSON.stringify(i),signal:e.signal});if(!a.ok)return null;return await a.json()}catch{return null}finally{clearTimeout(s)}}function y(n,r,l){let o=!1,i=(t)=>{if(o)return;o=!0,l?.(t)};return{async pending(t,e){return(await p(n,r,i,"pending-notifications",{lastReceivedId:t,sessionId:e}))?.messages??[]},async apply(t){return await p(n,r,i,"apply",{...t})??{text:"apply failed",knobs:{}}}}}export{y as createRpcClient};
@@ -1 +1 @@
1
- import{oa as a,pa as b}from"../index-b6kp9ydc.js";import"../index-6y6ss1kc.js";export{a as tmpdir,b as getRpcDir};
1
+ import{pa as a,qa as b}from"../index-hjgzqz1c.js";import"../index-jpx7h5gc.js";export{a as tmpdir,b as getRpcDir};
@@ -1 +1 @@
1
- import{$ as l,Q as a,R as b,S as c,T as d,U as e,V as f,W as g,X as h,Y as i,Z as j,_ as k,aa as m,ba as n,ca as o,da as p,ea as q,fa as r,ga as s,ha as t}from"./index-fbfpefx6.js";import"./index-1r02s323.js";import"./index-6y6ss1kc.js";export{n as upsertSidebarActiveRouting,l as setSidebarState,m as setSidebarMachineState,o as setSidebarLegacyRouting,j as resolveSessionSidebarRouting,r as resolveActiveAccount,p as removeSidebarActiveRouting,k as pruneActiveRouting,e as normalizeSidebarState,i as isUsableRoutingEntry,c as getSidebarStateFile,f as getSidebarState,b as getPresentQuotaWindows,s as getCollapsedQuotaSummary,a as formatWindowLabel,q as drainSidebarWrites,t as computeQuotaPacing,d as DEFAULT_SIDEBAR_STATE,h as ACTIVE_ROUTING_MAX_ENTRIES,g as ACTIVE_ROUTING_MAX_AGE_MS};
1
+ import{$ as k,R as a,S as b,T as c,U as d,V as e,W as f,X as g,Y as h,Z as i,_ as j,aa as l,ba as m,ca as n,da as o,ea as p,fa as q,ga as r,ha as s,ia as t}from"./index-wpk440dz.js";import"./index-72cas5ht.js";import"./index-jpx7h5gc.js";export{n as upsertSidebarActiveRouting,l as setSidebarState,m as setSidebarMachineState,o as setSidebarLegacyRouting,j as resolveSessionSidebarRouting,r as resolveActiveAccount,p as removeSidebarActiveRouting,k as pruneActiveRouting,e as normalizeSidebarState,i as isUsableRoutingEntry,c as getSidebarStateFile,f as getSidebarState,b as getPresentQuotaWindows,s as getCollapsedQuotaSummary,a as formatWindowLabel,q as drainSidebarWrites,t as computeQuotaPacing,d as DEFAULT_SIDEBAR_STATE,h as ACTIVE_ROUTING_MAX_ENTRIES,g as ACTIVE_ROUTING_MAX_AGE_MS};
@@ -1 +1 @@
1
- import{a as U,b as V}from"./index-y67qn95a.js";import{ra as R}from"./index-6y6ss1kc.js";var E=R((M,Q)=>{var{defineProperty:H,getOwnPropertyDescriptor:W,getOwnPropertyNames:X}=Object,Y=Object.prototype.hasOwnProperty,Z=(z,q)=>{for(var B in q)H(z,B,{get:q[B],enumerable:!0})},$=(z,q,B,F)=>{if(q&&typeof q==="object"||typeof q==="function"){for(let v of X(q))if(!Y.call(z,v)&&v!==B)H(z,v,{get:()=>q[v],enumerable:!(F=W(q,v))||F.enumerable})}return z},A=(z)=>$(H({},"__esModule",{value:!0}),z),L={};Z(L,{refreshToken:()=>D});Q.exports=A(L);var K=U(),G=V();async function D(z){let q=z?.project,B=z?.team;if(!q&&!B){let v=(0,G.findProjectInfo)();q=v.projectId,B=v.teamId}else if(!q||!B){let v=(0,G.findProjectInfo)();q=q??v.projectId,B=B??v.teamId}if(!q)throw new K.VercelOidcTokenError("Failed to refresh OIDC token: No project specified. Try re-linking your project with `vc link`");let F=(0,G.loadToken)(q);if(!F||(0,G.isExpired)((0,G.getTokenPayload)(F.token),z?.expirationBufferMs)){let v=await(0,G.getVercelToken)({expirationBufferMs:z?.expirationBufferMs});if(F=await(0,G.getVercelOidcToken)(v,q,B),!F)throw new K.VercelOidcTokenError("Failed to refresh OIDC token");(0,G.saveToken)(F,q)}process.env.VERCEL_OIDC_TOKEN=F.token;return}});export default E();
1
+ import{a as U,b as V}from"./index-x1c39tzz.js";import{sa as R}from"./index-jpx7h5gc.js";var E=R((M,Q)=>{var{defineProperty:H,getOwnPropertyDescriptor:W,getOwnPropertyNames:X}=Object,Y=Object.prototype.hasOwnProperty,Z=(z,q)=>{for(var B in q)H(z,B,{get:q[B],enumerable:!0})},$=(z,q,B,F)=>{if(q&&typeof q==="object"||typeof q==="function"){for(let v of X(q))if(!Y.call(z,v)&&v!==B)H(z,v,{get:()=>q[v],enumerable:!(F=W(q,v))||F.enumerable})}return z},A=(z)=>$(H({},"__esModule",{value:!0}),z),L={};Z(L,{refreshToken:()=>D});Q.exports=A(L);var K=U(),G=V();async function D(z){let q=z?.project,B=z?.team;if(!q&&!B){let v=(0,G.findProjectInfo)();q=v.projectId,B=v.teamId}else if(!q||!B){let v=(0,G.findProjectInfo)();q=q??v.projectId,B=B??v.teamId}if(!q)throw new K.VercelOidcTokenError("Failed to refresh OIDC token: No project specified. Try re-linking your project with `vc link`");let F=(0,G.loadToken)(q);if(!F||(0,G.isExpired)((0,G.getTokenPayload)(F.token),z?.expirationBufferMs)){let v=await(0,G.getVercelToken)({expirationBufferMs:z?.expirationBufferMs});if(F=await(0,G.getVercelOidcToken)(v,q,B),!F)throw new K.VercelOidcTokenError("Failed to refresh OIDC token");(0,G.saveToken)(F,q)}process.env.VERCEL_OIDC_TOKEN=F.token;return}});export default E();
@@ -0,0 +1 @@
1
+ import{b as a}from"./index-x1c39tzz.js";import"./index-jpx7h5gc.js";export default a();
@@ -1,4 +1,4 @@
1
- import{qa as P,ra as C,ta as _}from"./index-6y6ss1kc.js";var g=C((T,L)=>{(function(Q){if(typeof L==="object"&&typeof L.exports==="object"){var J=Q(_,T);if(J!==void 0)L.exports=J}else if(typeof define==="function"&&define.amd)define(["require","exports","./impl/format","./impl/edit","./impl/scanner","./impl/parser"],Q)})(function(Q,J){Object.defineProperty(J,"__esModule",{value:!0}),J.applyEdits=J.modify=J.format=J.printParseErrorCode=J.ParseErrorCode=J.stripComments=J.visit=J.getNodeValue=J.getNodePath=J.findNodeAtOffset=J.findNodeAtLocation=J.parseTree=J.parse=J.getLocation=J.SyntaxKind=J.ScanError=J.createScanner=void 0;let X=Q("./impl/format"),Z=Q("./impl/edit"),G=Q("./impl/scanner"),$=Q("./impl/parser");J.createScanner=G.createScanner;var W;(function(z){z[z.None=0]="None",z[z.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=2]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",z[z.InvalidUnicode=4]="InvalidUnicode",z[z.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",z[z.InvalidCharacter=6]="InvalidCharacter"})(W||(J.ScanError=W={}));var H;(function(z){z[z.OpenBraceToken=1]="OpenBraceToken",z[z.CloseBraceToken=2]="CloseBraceToken",z[z.OpenBracketToken=3]="OpenBracketToken",z[z.CloseBracketToken=4]="CloseBracketToken",z[z.CommaToken=5]="CommaToken",z[z.ColonToken=6]="ColonToken",z[z.NullKeyword=7]="NullKeyword",z[z.TrueKeyword=8]="TrueKeyword",z[z.FalseKeyword=9]="FalseKeyword",z[z.StringLiteral=10]="StringLiteral",z[z.NumericLiteral=11]="NumericLiteral",z[z.LineCommentTrivia=12]="LineCommentTrivia",z[z.BlockCommentTrivia=13]="BlockCommentTrivia",z[z.LineBreakTrivia=14]="LineBreakTrivia",z[z.Trivia=15]="Trivia",z[z.Unknown=16]="Unknown",z[z.EOF=17]="EOF"})(H||(J.SyntaxKind=H={})),J.getLocation=$.getLocation,J.parse=$.parse,J.parseTree=$.parseTree,J.findNodeAtLocation=$.findNodeAtLocation,J.findNodeAtOffset=$.findNodeAtOffset,J.getNodePath=$.getNodePath,J.getNodeValue=$.getNodeValue,J.visit=$.visit,J.stripComments=$.stripComments;var q;(function(z){z[z.InvalidSymbol=1]="InvalidSymbol",z[z.InvalidNumberFormat=2]="InvalidNumberFormat",z[z.PropertyNameExpected=3]="PropertyNameExpected",z[z.ValueExpected=4]="ValueExpected",z[z.ColonExpected=5]="ColonExpected",z[z.CommaExpected=6]="CommaExpected",z[z.CloseBraceExpected=7]="CloseBraceExpected",z[z.CloseBracketExpected=8]="CloseBracketExpected",z[z.EndOfFileExpected=9]="EndOfFileExpected",z[z.InvalidCommentToken=10]="InvalidCommentToken",z[z.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=12]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",z[z.InvalidUnicode=14]="InvalidUnicode",z[z.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",z[z.InvalidCharacter=16]="InvalidCharacter"})(q||(J.ParseErrorCode=q={}));function D(z){switch(z){case 1:return"InvalidSymbol";case 2:return"InvalidNumberFormat";case 3:return"PropertyNameExpected";case 4:return"ValueExpected";case 5:return"ColonExpected";case 6:return"CommaExpected";case 7:return"CloseBraceExpected";case 8:return"CloseBracketExpected";case 9:return"EndOfFileExpected";case 10:return"InvalidCommentToken";case 11:return"UnexpectedEndOfComment";case 12:return"UnexpectedEndOfString";case 13:return"UnexpectedEndOfNumber";case 14:return"InvalidUnicode";case 15:return"InvalidEscapeCharacter";case 16:return"InvalidCharacter"}return"<unknown ParseErrorCode>"}J.printParseErrorCode=D;function m(z,U,j){return X.format(z,U,j)}J.format=m;function f(z,U,j,A){return Z.setProperty(z,U,j,A)}J.modify=f;function u(z,U){let j=U.slice(0).sort((I,Y)=>{let F=I.offset-Y.offset;if(F===0)return I.length-Y.length;return F}),A=z.length;for(let I=j.length-1;I>=0;I--){let Y=j[I];if(Y.offset+Y.length<=A)z=Z.applyEdit(z,Y);else throw Error("Overlapping edit");A=Y.offset}return z}J.applyEdits=u})});var M=P(g(),1);import{watch as K}from"node:fs";import{mkdir as c,readFile as O,rename as y,writeFile as S}from"node:fs/promises";import{homedir as E}from"node:os";import{basename as l,dirname as v,join as k}from"node:path";var p="OPENCODE_TUI_PREFERENCES_FILE",x="tui-preferences.jsonc";function w(){let Q=process.env[p];if(Q)return Q;let J=process.env.OPENCODE_CONFIG_DIR||k(process.env.XDG_CONFIG_HOME||k(E(),".config"),"opencode");return k(J,x)}function N(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}async function Xz(){try{let Q=await O(w(),"utf8"),J=[],X=M.parse(Q,J,{allowTrailingComma:!0});if(J.length>0)return{};return N(X)?X:{}}catch{return{}}}var i="openai-auth",s=160,b={forceToTop:!1,order:s,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"OPENAI",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function V(Q,J){return typeof Q==="boolean"?Q:J}function B(Q,J,X,Z){if(typeof Q!=="number"||!Number.isFinite(Q))return J;return Math.min(Math.max(Math.round(Q),X),Z)}function d(Q,J,X){if(typeof Q!=="string"||Q.length===0)return J;return Q.slice(0,X)}function h(Q,J){if(typeof Q!=="string")return J;return[...Q][0]??J}function Zz(Q){let J=Q[i];if(!N(J))return structuredClone(b);let X=b,Z=N(J.header)?J.header:{},G=N(J.sections)?J.sections:{},$=N(J.appearance)?J.appearance:{},W=B($.warnThreshold,X.appearance.warnThreshold,0,99),H=Math.max(B($.errorThreshold,X.appearance.errorThreshold,0,100),Math.min(W+1,100));return{forceToTop:V(J.forceToTop,X.forceToTop),order:B(J.order,X.order,-1e4,1e4),startCollapsed:V(J.startCollapsed,X.startCollapsed),rememberCollapsed:V(J.rememberCollapsed,X.rememberCollapsed),collapsed:typeof J.collapsed==="boolean"?J.collapsed:null,pollMs:B(J.pollMs,X.pollMs,500,30000),refreshDebounceMs:B(J.refreshDebounceMs,X.refreshDebounceMs,50,5000),header:{label:d(Z.label,X.header.label,20),showVersion:V(Z.showVersion,X.header.showVersion)},sections:{quota:V(G.quota,X.sections.quota),fallbackAccounts:V(G.fallbackAccounts,X.sections.fallbackAccounts),routing:V(G.routing,X.sections.routing),health:V(G.health,X.sections.health),pacing:V(G.pacing,X.sections.pacing)},appearance:{barWidth:B($.barWidth,X.appearance.barWidth,4,40),barFilledChar:h($.barFilledChar,X.appearance.barFilledChar),barEmptyChar:h($.barEmptyChar,X.appearance.barEmptyChar),warnThreshold:W,errorThreshold:H}}}var n=-1e5;function $z(Q,J,X){let Z=Q[J];if(!N(Z))return X;if(Z.forceToTop===!0)return n+Object.keys(Q).indexOf(J);return B(Z.order,X,-1e4,1e4)}var t=`// Shared preferences for opencode TUI plugins.
1
+ import{ra as P,sa as C,ua as _}from"./index-jpx7h5gc.js";var g=C((T,L)=>{(function(Q){if(typeof L==="object"&&typeof L.exports==="object"){var J=Q(_,T);if(J!==void 0)L.exports=J}else if(typeof define==="function"&&define.amd)define(["require","exports","./impl/format","./impl/edit","./impl/scanner","./impl/parser"],Q)})(function(Q,J){Object.defineProperty(J,"__esModule",{value:!0}),J.applyEdits=J.modify=J.format=J.printParseErrorCode=J.ParseErrorCode=J.stripComments=J.visit=J.getNodeValue=J.getNodePath=J.findNodeAtOffset=J.findNodeAtLocation=J.parseTree=J.parse=J.getLocation=J.SyntaxKind=J.ScanError=J.createScanner=void 0;let X=Q("./impl/format"),Z=Q("./impl/edit"),G=Q("./impl/scanner"),$=Q("./impl/parser");J.createScanner=G.createScanner;var W;(function(z){z[z.None=0]="None",z[z.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=2]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",z[z.InvalidUnicode=4]="InvalidUnicode",z[z.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",z[z.InvalidCharacter=6]="InvalidCharacter"})(W||(J.ScanError=W={}));var H;(function(z){z[z.OpenBraceToken=1]="OpenBraceToken",z[z.CloseBraceToken=2]="CloseBraceToken",z[z.OpenBracketToken=3]="OpenBracketToken",z[z.CloseBracketToken=4]="CloseBracketToken",z[z.CommaToken=5]="CommaToken",z[z.ColonToken=6]="ColonToken",z[z.NullKeyword=7]="NullKeyword",z[z.TrueKeyword=8]="TrueKeyword",z[z.FalseKeyword=9]="FalseKeyword",z[z.StringLiteral=10]="StringLiteral",z[z.NumericLiteral=11]="NumericLiteral",z[z.LineCommentTrivia=12]="LineCommentTrivia",z[z.BlockCommentTrivia=13]="BlockCommentTrivia",z[z.LineBreakTrivia=14]="LineBreakTrivia",z[z.Trivia=15]="Trivia",z[z.Unknown=16]="Unknown",z[z.EOF=17]="EOF"})(H||(J.SyntaxKind=H={})),J.getLocation=$.getLocation,J.parse=$.parse,J.parseTree=$.parseTree,J.findNodeAtLocation=$.findNodeAtLocation,J.findNodeAtOffset=$.findNodeAtOffset,J.getNodePath=$.getNodePath,J.getNodeValue=$.getNodeValue,J.visit=$.visit,J.stripComments=$.stripComments;var q;(function(z){z[z.InvalidSymbol=1]="InvalidSymbol",z[z.InvalidNumberFormat=2]="InvalidNumberFormat",z[z.PropertyNameExpected=3]="PropertyNameExpected",z[z.ValueExpected=4]="ValueExpected",z[z.ColonExpected=5]="ColonExpected",z[z.CommaExpected=6]="CommaExpected",z[z.CloseBraceExpected=7]="CloseBraceExpected",z[z.CloseBracketExpected=8]="CloseBracketExpected",z[z.EndOfFileExpected=9]="EndOfFileExpected",z[z.InvalidCommentToken=10]="InvalidCommentToken",z[z.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=12]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",z[z.InvalidUnicode=14]="InvalidUnicode",z[z.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",z[z.InvalidCharacter=16]="InvalidCharacter"})(q||(J.ParseErrorCode=q={}));function D(z){switch(z){case 1:return"InvalidSymbol";case 2:return"InvalidNumberFormat";case 3:return"PropertyNameExpected";case 4:return"ValueExpected";case 5:return"ColonExpected";case 6:return"CommaExpected";case 7:return"CloseBraceExpected";case 8:return"CloseBracketExpected";case 9:return"EndOfFileExpected";case 10:return"InvalidCommentToken";case 11:return"UnexpectedEndOfComment";case 12:return"UnexpectedEndOfString";case 13:return"UnexpectedEndOfNumber";case 14:return"InvalidUnicode";case 15:return"InvalidEscapeCharacter";case 16:return"InvalidCharacter"}return"<unknown ParseErrorCode>"}J.printParseErrorCode=D;function m(z,U,j){return X.format(z,U,j)}J.format=m;function f(z,U,j,A){return Z.setProperty(z,U,j,A)}J.modify=f;function u(z,U){let j=U.slice(0).sort((I,Y)=>{let F=I.offset-Y.offset;if(F===0)return I.length-Y.length;return F}),A=z.length;for(let I=j.length-1;I>=0;I--){let Y=j[I];if(Y.offset+Y.length<=A)z=Z.applyEdit(z,Y);else throw Error("Overlapping edit");A=Y.offset}return z}J.applyEdits=u})});var M=P(g(),1);import{watch as K}from"node:fs";import{mkdir as c,readFile as O,rename as y,writeFile as S}from"node:fs/promises";import{homedir as E}from"node:os";import{basename as l,dirname as v,join as k}from"node:path";var p="OPENCODE_TUI_PREFERENCES_FILE",x="tui-preferences.jsonc";function w(){let Q=process.env[p];if(Q)return Q;let J=process.env.OPENCODE_CONFIG_DIR||k(process.env.XDG_CONFIG_HOME||k(E(),".config"),"opencode");return k(J,x)}function N(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}async function Xz(){try{let Q=await O(w(),"utf8"),J=[],X=M.parse(Q,J,{allowTrailingComma:!0});if(J.length>0)return{};return N(X)?X:{}}catch{return{}}}var i="openai-auth",s=160,b={forceToTop:!1,order:s,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"OPENAI",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function V(Q,J){return typeof Q==="boolean"?Q:J}function B(Q,J,X,Z){if(typeof Q!=="number"||!Number.isFinite(Q))return J;return Math.min(Math.max(Math.round(Q),X),Z)}function d(Q,J,X){if(typeof Q!=="string"||Q.length===0)return J;return Q.slice(0,X)}function h(Q,J){if(typeof Q!=="string")return J;return[...Q][0]??J}function Zz(Q){let J=Q[i];if(!N(J))return structuredClone(b);let X=b,Z=N(J.header)?J.header:{},G=N(J.sections)?J.sections:{},$=N(J.appearance)?J.appearance:{},W=B($.warnThreshold,X.appearance.warnThreshold,0,99),H=Math.max(B($.errorThreshold,X.appearance.errorThreshold,0,100),Math.min(W+1,100));return{forceToTop:V(J.forceToTop,X.forceToTop),order:B(J.order,X.order,-1e4,1e4),startCollapsed:V(J.startCollapsed,X.startCollapsed),rememberCollapsed:V(J.rememberCollapsed,X.rememberCollapsed),collapsed:typeof J.collapsed==="boolean"?J.collapsed:null,pollMs:B(J.pollMs,X.pollMs,500,30000),refreshDebounceMs:B(J.refreshDebounceMs,X.refreshDebounceMs,50,5000),header:{label:d(Z.label,X.header.label,20),showVersion:V(Z.showVersion,X.header.showVersion)},sections:{quota:V(G.quota,X.sections.quota),fallbackAccounts:V(G.fallbackAccounts,X.sections.fallbackAccounts),routing:V(G.routing,X.sections.routing),health:V(G.health,X.sections.health),pacing:V(G.pacing,X.sections.pacing)},appearance:{barWidth:B($.barWidth,X.appearance.barWidth,4,40),barFilledChar:h($.barFilledChar,X.appearance.barFilledChar),barEmptyChar:h($.barEmptyChar,X.appearance.barEmptyChar),warnThreshold:W,errorThreshold:H}}}var n=-1e5;function $z(Q,J,X){let Z=Q[J];if(!N(Z))return X;if(Z.forceToTop===!0)return n+Object.keys(Q).indexOf(J);return B(Z.order,X,-1e4,1e4)}var t=`// Shared preferences for opencode TUI plugins.
2
2
  // One top-level key per plugin (short name). See each plugin's README for
3
3
  // its supported settings. This file is safe to hand-edit; plugins update
4
4
  // individual keys in place and preserve comments.
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const PackageVersion = "0.4.1";
1
+ export declare const PackageVersion = "0.4.2";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-openai-auth",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
@@ -61,9 +61,9 @@
61
61
  "@opencode-ai/plugin": "*"
62
62
  },
63
63
  "dependencies": {
64
- "@opentui/core": ">=0.4.4",
65
- "@opentui/solid": ">=0.4.4",
66
- "ai": "^7.0.30",
64
+ "@opentui/core": ">=0.4.5",
65
+ "@opentui/solid": ">=0.4.5",
66
+ "ai": "^7.0.34",
67
67
  "jsonc-parser": "^3.3.1",
68
68
  "solid-js": "1.9.12"
69
69
  }
@@ -95,6 +95,22 @@ export async function acquireRefreshFileLock(options: {
95
95
  } catch (error) {
96
96
  const code = (error as NodeJS.ErrnoException).code
97
97
  if (code === 'EEXIST' || code === 'EISDIR') return false
98
+ if (code === 'ENOENT') {
99
+ // Reboots can clear runtime temp directories before the next lock acquisition.
100
+ await mkdir(dirname(lockPath), { recursive: true })
101
+ try {
102
+ await writeFile(
103
+ lockPath,
104
+ `${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
105
+ { encoding: 'utf8', mode: 0o600, flag: 'wx' },
106
+ )
107
+ return true
108
+ } catch (retryError) {
109
+ const retryCode = (retryError as NodeJS.ErrnoException).code
110
+ if (retryCode === 'EEXIST' || retryCode === 'EISDIR') return false
111
+ throw retryError
112
+ }
113
+ }
98
114
  throw error
99
115
  }
100
116
  }
@@ -0,0 +1,309 @@
1
+ import { randomUUID } from 'node:crypto'
2
+ import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises'
3
+ import { homedir } from 'node:os'
4
+ import { dirname, join } from 'node:path'
5
+
6
+ const setRefreshLockRenewalTimeout = globalThis.setTimeout.bind(globalThis)
7
+ const clearRefreshLockRenewalTimeout = globalThis.clearTimeout.bind(globalThis)
8
+
9
+ export const ACCOUNT_FILE_NAME = 'openai-auth.json'
10
+ export const ACCOUNT_STATE_FILE_NAME = 'openai-auth-state.json'
11
+
12
+ function getConfigDir() {
13
+ if (process.env.OPENCODE_CONFIG_DIR?.trim()) {
14
+ return process.env.OPENCODE_CONFIG_DIR.trim()
15
+ }
16
+ return join(
17
+ process.env.XDG_CONFIG_HOME || join(homedir(), '.config'),
18
+ 'opencode',
19
+ )
20
+ }
21
+
22
+ // A concurrent contender renaming the freshly-created eviction-marker directory
23
+ // away surfaces the vanished parent differently per platform: ENOENT on Linux,
24
+ // EINVAL or ENOTDIR on macOS/APFS. All three mean the marker is no longer ours
25
+ // to hold — a lost race the caller should retry, not a fatal lock error.
26
+ export function isLostMarkerRaceError(error: unknown): boolean {
27
+ const code = (error as NodeJS.ErrnoException | null)?.code
28
+ return code === 'ENOENT' || code === 'EINVAL' || code === 'ENOTDIR'
29
+ }
30
+
31
+ export function getAccountStoragePath() {
32
+ return (
33
+ process.env.OPENCODE_OPENAI_AUTH_FILE?.trim() ||
34
+ join(getConfigDir(), ACCOUNT_FILE_NAME)
35
+ )
36
+ }
37
+
38
+ export function getAccountStatePath(configPath = getAccountStoragePath()) {
39
+ const explicit = process.env.OPENCODE_OPENAI_AUTH_STATE_FILE?.trim()
40
+ if (explicit) return explicit
41
+ return configPath.endsWith(ACCOUNT_FILE_NAME)
42
+ ? join(dirname(configPath), ACCOUNT_STATE_FILE_NAME)
43
+ : `${configPath}.state.json`
44
+ }
45
+
46
+ export async function acquireRefreshFileLock(options: {
47
+ name: string
48
+ ttlMs: number
49
+ path?: string
50
+ now?: () => number
51
+ renew?: boolean
52
+ renewIntervalMs?: number
53
+ onStep?: (
54
+ step:
55
+ | 'stale-marker-stat'
56
+ | 'stale-marker-claimed'
57
+ | 'stale-lock-confirmed'
58
+ | 'eviction-marker-acquired',
59
+ ) => void | Promise<void>
60
+ }): Promise<{ release: () => Promise<void> } | null> {
61
+ const accountPath = options.path ?? getAccountStoragePath()
62
+ const lockPath = `${accountPath}.${options.name}.lock`
63
+ const legacyOwnerPath = join(lockPath, 'owner.json')
64
+ const ownerId = randomUUID()
65
+ const now = options.now ?? Date.now
66
+ let renewTimer: ReturnType<typeof setTimeout> | null = null
67
+ let released = false
68
+
69
+ async function readOwner() {
70
+ try {
71
+ return JSON.parse(await readFile(lockPath, 'utf8'))
72
+ } catch (error) {
73
+ const code = (error as NodeJS.ErrnoException).code
74
+ if (code !== 'EISDIR') throw error
75
+ return JSON.parse(await readFile(legacyOwnerPath, 'utf8'))
76
+ }
77
+ }
78
+
79
+ async function writeOwner() {
80
+ await writeFile(
81
+ lockPath,
82
+ `${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
83
+ { encoding: 'utf8', mode: 0o600 },
84
+ )
85
+ }
86
+
87
+ async function tryAcquire() {
88
+ try {
89
+ await writeFile(
90
+ lockPath,
91
+ `${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
92
+ { encoding: 'utf8', mode: 0o600, flag: 'wx' },
93
+ )
94
+ return true
95
+ } catch (error) {
96
+ const code = (error as NodeJS.ErrnoException).code
97
+ if (code === 'EEXIST' || code === 'EISDIR') return false
98
+ if (code === 'ENOENT') {
99
+ // Reboots can clear runtime temp directories before the next lock acquisition.
100
+ await mkdir(dirname(lockPath), { recursive: true })
101
+ try {
102
+ await writeFile(
103
+ lockPath,
104
+ `${JSON.stringify({ ownerId, expiresAt: now() + options.ttlMs })}\n`,
105
+ { encoding: 'utf8', mode: 0o600, flag: 'wx' },
106
+ )
107
+ return true
108
+ } catch (retryError) {
109
+ const retryCode = (retryError as NodeJS.ErrnoException).code
110
+ if (retryCode === 'EEXIST' || retryCode === 'EISDIR') return false
111
+ throw retryError
112
+ }
113
+ }
114
+ throw error
115
+ }
116
+ }
117
+
118
+ function scheduleRenewal() {
119
+ if (!options.renew || released) return
120
+ const intervalMs =
121
+ options.renewIntervalMs ?? Math.max(1_000, Math.floor(options.ttlMs / 3))
122
+ renewTimer = setRefreshLockRenewalTimeout(() => {
123
+ void (async () => {
124
+ try {
125
+ const owner = await readOwner()
126
+ const currentNow = now()
127
+ if (
128
+ released ||
129
+ owner?.ownerId !== ownerId ||
130
+ Number(owner?.expiresAt) <= currentNow
131
+ ) {
132
+ return
133
+ }
134
+ await writeOwner()
135
+ scheduleRenewal()
136
+ } catch {
137
+ // If renewal fails, contenders will wait until the last written expiry.
138
+ }
139
+ })()
140
+ }, intervalMs)
141
+ if ('unref' in renewTimer) renewTimer.unref()
142
+ }
143
+
144
+ let acquired = await tryAcquire()
145
+ if (!acquired) {
146
+ // Fencing-token eviction: a directory-based marker (mkdir O_EXCL) serializes
147
+ // destructive removal to one contender at a time. The marker holds an owner
148
+ // file so ownership survives a stale-marker recovery rename: the recovering
149
+ // contender renames the stale directory, then must re-check ownership before
150
+ // acting — preventing the 3rd interleaving where a stale observer renames the
151
+ // FRESH marker the mkdir-winner created.
152
+ const evictPath = `${lockPath}.evicting`
153
+ const evictOwnerPath = join(evictPath, 'owner.json')
154
+ const evictOwnerId = randomUUID()
155
+ const EVICT_TTL = 5_000
156
+ const MAX_STEAL_ATTEMPTS = 8
157
+
158
+ async function backoff() {
159
+ await new Promise((resolve) =>
160
+ setTimeout(resolve, Math.floor(Math.random() * 4)),
161
+ )
162
+ }
163
+
164
+ async function lockIsLive() {
165
+ try {
166
+ const currentOwner = await readOwner()
167
+ return Number(currentOwner?.expiresAt) > now()
168
+ } catch {
169
+ try {
170
+ const current = await stat(lockPath)
171
+ return current.mtimeMs + options.ttlMs > now()
172
+ } catch {
173
+ // Lock doesn't exist — safe to acquire.
174
+ return false
175
+ }
176
+ }
177
+ }
178
+
179
+ // Fail-closed: any read error means we do NOT own the marker.
180
+ async function ownsEvictionMarker() {
181
+ try {
182
+ const owner = JSON.parse(await readFile(evictOwnerPath, 'utf8'))
183
+ return owner?.ownerId === evictOwnerId
184
+ } catch {
185
+ return false
186
+ }
187
+ }
188
+
189
+ async function tryAcquireEvictionMarker() {
190
+ await mkdir(evictPath)
191
+ try {
192
+ await writeFile(
193
+ evictOwnerPath,
194
+ `${JSON.stringify({ ownerId: evictOwnerId, createdAt: now() })}\n`,
195
+ { encoding: 'utf8', mode: 0o600, flag: 'wx' },
196
+ )
197
+ } catch (error) {
198
+ // A competing contender can rename our just-created marker directory
199
+ // away between the mkdir above and this write (the stale-marker steal
200
+ // path below does exactly that). That is a lost race, not a failure, so
201
+ // report it as such and let the caller back off and retry rather than
202
+ // failing the whole lock acquisition.
203
+ if (isLostMarkerRaceError(error)) return false
204
+ await releaseEvictionMarker()
205
+ throw error
206
+ }
207
+ await options.onStep?.('eviction-marker-acquired')
208
+ return true
209
+ }
210
+
211
+ async function releaseEvictionMarker() {
212
+ if (await ownsEvictionMarker()) {
213
+ await rm(evictPath, { recursive: true, force: true }).catch(() => {})
214
+ }
215
+ }
216
+
217
+ for (let attempt = 0; attempt < MAX_STEAL_ATTEMPTS; attempt++) {
218
+ acquired = await tryAcquire()
219
+ if (acquired) break
220
+ if (await lockIsLive()) return null
221
+
222
+ try {
223
+ if (!(await tryAcquireEvictionMarker())) {
224
+ await backoff()
225
+ continue
226
+ }
227
+ } catch (evictError) {
228
+ const code = (evictError as NodeJS.ErrnoException).code
229
+ if (code !== 'EEXIST') throw evictError
230
+
231
+ let evictStat: Awaited<ReturnType<typeof stat>>
232
+ try {
233
+ evictStat = await stat(evictPath)
234
+ } catch (statError) {
235
+ if ((statError as NodeJS.ErrnoException).code === 'ENOENT') {
236
+ await backoff()
237
+ continue
238
+ }
239
+ throw statError
240
+ }
241
+ if (evictStat.mtimeMs + EVICT_TTL > now()) return null
242
+
243
+ await options.onStep?.('stale-marker-stat')
244
+ const claimedPath = `${evictPath}.${randomUUID()}`
245
+ try {
246
+ await rename(evictPath, claimedPath)
247
+ } catch (renameError) {
248
+ if ((renameError as NodeJS.ErrnoException).code === 'ENOENT') {
249
+ await backoff()
250
+ continue
251
+ }
252
+ throw renameError
253
+ }
254
+ await options.onStep?.('stale-marker-claimed')
255
+ await rm(claimedPath, { recursive: true, force: true }).catch(() => {})
256
+ await backoff()
257
+ continue
258
+ }
259
+
260
+ try {
261
+ if (await lockIsLive()) return null
262
+ // Fence check 1: verify we still own the marker before acting on the
263
+ // stale-lock-confirmed decision.
264
+ if (!(await ownsEvictionMarker())) return null
265
+ await options.onStep?.('stale-lock-confirmed')
266
+ // Fence check 2: re-verify ownership after the seam (another contender
267
+ // may have renamed our fresh marker while we were paused here).
268
+ if (!(await ownsEvictionMarker())) return null
269
+ await rm(lockPath, { recursive: true, force: true }).catch(() => {})
270
+ // Fence check 3: re-verify ownership after removing the stale lock.
271
+ if (!(await ownsEvictionMarker())) return null
272
+ acquired = await tryAcquire()
273
+ if (!acquired) return null
274
+ // Fence check 4: re-verify ownership after acquiring the lock. If the
275
+ // marker was stolen between tryAcquire and this check, release the
276
+ // just-acquired lock and return null (fail-closed).
277
+ if (!(await ownsEvictionMarker())) {
278
+ await rm(lockPath, { recursive: true, force: true }).catch(() => {})
279
+ acquired = false
280
+ return null
281
+ }
282
+ break
283
+ } finally {
284
+ await releaseEvictionMarker()
285
+ }
286
+ }
287
+ }
288
+
289
+ if (!acquired) return null
290
+
291
+ scheduleRenewal()
292
+
293
+ return {
294
+ release: async () => {
295
+ released = true
296
+ if (renewTimer) {
297
+ clearRefreshLockRenewalTimeout(renewTimer)
298
+ renewTimer = null
299
+ }
300
+ try {
301
+ const owner = await readOwner()
302
+ if (owner?.ownerId !== ownerId) return
303
+ } catch {
304
+ return
305
+ }
306
+ await rm(lockPath, { recursive: true, force: true }).catch(() => {})
307
+ },
308
+ }
309
+ }
@@ -1,89 +0,0 @@
1
- import{ka as R0,la as I}from"./index-1r02s323.js";import{ta as K1}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.1";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 B1(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 Z1(B){return B.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}var $1=`<!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">${Z1(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 W1(){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),B1(X,B,j.pkce).then((J)=>j.resolve(J)).catch((J)=>j.reject(J)),W.writeHead(200,{"Content-Type":"text/html"}),W.end($1);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 z1(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 X1(){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 G1(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 M4(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 _4(B={}){let{label:Z,headless:$=!1,signal:W}=B;if(B0(Z),$){let{deviceData:j,url:J,instructions:Q}=await X1(),y=(async()=>{let V=await G1(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 W1(),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 z1(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",Y1="app_EMoamEEZ73f0CkXaXp7hrann",j1="https://auth.openai.com";async function E4(B){let Z=await B.fetchImpl(`${j1}/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:Y1}).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 J1="https://chatgpt.com/backend-api/wham/usage";async function S4(B){let Z=await B.fetchImpl(J1,{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 H1}from"node:crypto";var Q1=globalThis.setTimeout,N1=5;function h(B){let Z=B?.quota?.checkIntervalMinutes??N1;return Math.max(1,Z)*60000}function P1(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 T4(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 V1(B){let Z=B?.quota?.minimumRemaining||{};return{primary:Z.primary??Z["5h"]??15,secondary:Z.secondary??Z["1w"]??10}}function b0(B,Z,$){if(!P1(Z))return $+h(Z);let W=V1(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 L1(B){if(!B?.quota?.mainQuota||!B.quota.mainQuotaCheckedAt)return null;return{quota:B.quota.mainQuota,checkedAt:B.quota.mainQuotaCheckedAt,tokenFingerprint:B.quota.mainQuotaToken}}function F1(B){let Z=B?.quota?.refreshEveryNRequests;return typeof Z==="number"&&Number.isFinite(Z)&&Z>0?Math.floor(Z):0}function P(B){return H1("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=F1(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 $=L1(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=Q1(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 q1,randomUUID as C1}from"node:crypto";import{homedir as E1}from"node:os";import{dirname as S1,join as r}from"node:path";import{setTimeout as R1}from"node:timers/promises";import{randomUUID as O1}from"node:crypto";import{mkdir as b1,rename as D1,rm as U1,writeFile as M1}from"node:fs/promises";import{dirname as _1}from"node:path";async function A(B,Z){await b1(_1(B),{recursive:!0});let $=`${B}.${O1()}.tmp`;await M1($,`${JSON.stringify(Z,null,2)}
88
- `,{encoding:"utf8",mode:384});try{await D1($,B)}catch(W){throw await U1($,{force:!0}).catch(()=>{}),W}}import{readFile as v1}from"node:fs/promises";var E=R0("refresh"),U0=1e4,y1=50,y0="openai-auth.json",x1="openai-auth-state.json";function I1(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return r(process.env.XDG_CONFIG_HOME||r(E1(),".config"),"opencode")}function T(){return process.env.OPENCODE_OPENAI_AUTH_FILE?.trim()||r(I1(),y0)}function a(B=T()){let Z=process.env.OPENCODE_OPENAI_AUTH_STATE_FILE?.trim();if(Z)return Z;return A1(B)}function A1(B){return B.endsWith(y0)?r(S1(B),x1):`${B}.state.json`}function b(B){return B.type==="oauth"}function T1(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 a4(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 f1=[401,403,429],M0={primary:0,secondary:0},m1=!1,G0={primary:5,secondary:10};function H(B){return B!=null&&typeof B==="object"&&!Array.isArray(B)}function w1(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():C1(),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 k1(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 h1(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(!T1(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:k1(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(h1).filter((Z)=>Z!=null)}}async function R(B){try{return{exists:!0,value:JSON.parse(await v1(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 p1(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 l1(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 d1(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 g1(B,Z){return B.access===Z.access&&B.refresh===Z.refresh&&B.expires===Z.expires&&B.lastRefreshedAt===Z.lastRefreshedAt}function i1(B,Z){if(!g1(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 u1(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:i1(Z,$);v(B,K,"access"),v(B,K,"refresh"),v(B,K,"expires"),v(B,K,"lastRefreshedAt"),v(B,K,"lastRefreshError")}function s1(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 u1(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(d1)})}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 R1(Math.min(y1,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 t4(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)??r1(),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 r1(){return{version:1,main:{type:"opencode",provider:"openai"},accounts:[]}}function n1(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 c1(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 a1(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)n1(G,B);if($.mainRefresh)c1(G,B);if($.accounts){let K=$.accounts===!0?null:new Set($.accounts),Y=await p1(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]=s1(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 o1(B){return B?.fallbackOn?.length?B.fallbackOn:f1}function e4(B,Z){return o1(Z).includes(B)}function t1(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??m1}function w0(B,Z,$=Date.now()){if(!Y0(Z))return!0;if(!B)return!l(Z);let W=t1(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 BB(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 ZB(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 e1(B){return typeof B.version==="number"&&Array.isArray(B.accounts)}async function $B(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(e1(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 B4(B){return B?.refresh?.enabled!==!1}function Z4(B){return(B?.refresh?.refreshBeforeExpiryMinutes??240)*60000}function $4(B){return Math.floor(Math.random()*(B+1))}function S(B,Z,$){return!B.access||!B.expires||B.expires-$<=Z4(Z)}function W4(B,Z){return Boolean(B.access&&typeof B.expires==="number"&&B.expires>Z)}function z4(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 X4(B){return`fallback-oauth-refresh-${q1("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 G4(B,Z){if(!B)return!1;return E0(B.primary,Z)||E0(B.secondary,Z)}function K4(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!K4(B.quota,Z,$)}function Y4(B,Z,$,W){return t($)&&w0(B.quota,Z,W)&&G4(B.quota,W)}function j4(B){let Z=B?.quota?.checkIntervalMinutes??5;return Math.max(1,Z)*60000}var J4=60000,H4=60000,Q4=600000,N4=1e4,P4=100;var WB=globalThis.setTimeout.bind(globalThis),zB=globalThis.clearTimeout.bind(globalThis);class V4{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:$+j4(Z),checkedAt:$},B.access)}async load(){return l1(this.configPath)}async save(B,Z){await a1(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(()=>{})},J4+$4(H4)),"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(z4(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(w1(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=W4(G,this.now());if(X){if(!Y)continue}else if(!Y)continue;if(Y4(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||!B4(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()+N4;while(Date.now()<z){await new Promise((j)=>setTimeout(j,P4));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:X4(X.id),ttlMs:Q4,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,W1 as u,z1 as v,X1 as w,G1 as x,M4 as y,_4 as z,E4 as A,S4 as B,T4 as C,O as D,T as E,b as F,a4 as G,G0 as H,l1 as I,t4 as J,e4 as K,k0 as L,BB as M,ZB as N,$B as O,V4 as P};
@@ -1,6 +0,0 @@
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};