@cortexkit/opencode-openai-auth 1.0.2 → 1.0.3

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,2 +1,2 @@
1
- import{Lb as n,Pb as i,Qb as t,Rb as p,Sb as b}from"./index-jyr8y8k4.js";import{fc as ZZ,gc as $Z,ic as xZ}from"./index-bmd7x5aq.js";var L="all",tZ=Object.freeze(["primary"]);function LZ(Z){return Z.kind==="retired"?Z.retiredAt:Z.checkedAt}function q(Z,$){return JSON.stringify([Z,$])}function l(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}function N(Z){return typeof Z==="number"&&Number.isFinite(Z)}function HZ(Z){return typeof Z==="string"&&Z.length>0}function T(Z,$,J){return Z[$]===void 0||J(Z[$])}function eZ(Z){return N(Z)&&Z>0}function u(Z){return typeof Z==="string"}function Z1(Z){if(!l(Z)||!HZ(Z.scope)||!HZ(Z.label))return!1;switch(Z.kind){case"reading":return N(Z.checkedAt)&&N(Z.usedPercent)&&T(Z,"resetsAt",u)&&T(Z,"windowMinutes",eZ);case"retired":return N(Z.retiredAt);case"absent":return N(Z.checkedAt);default:return!1}}function $1(Z){if(!l(Z)||!N(Z.checkedAt))return!1;if(Z.kind==="cleared")return!0;return Z.kind==="reading"&&typeof Z.reached==="boolean"&&T(Z,"remainingPercent",N)&&T(Z,"usedPercent",N)&&T(Z,"resetsAt",u)&&T(Z,"limit",N)&&T(Z,"used",N)&&T(Z,"remaining",N)&&T(Z,"unit",u)}function I(Z){if(!l(Z)||!Array.isArray(Z.limits))return!1;let $=new Set;for(let J of Z.limits){if(!Z1(J))return!1;let X=q(J.scope,J.label);if($.has(X))return!1;$.add(X)}return T(Z,"budget",$1)}class w extends TypeError{constructor(Z){super(Z);this.name="QuotaCodecError"}}function v(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}function y(Z){return typeof Z==="number"&&Number.isFinite(Z)}function NZ(Z){return Z===void 0||typeof Z==="string"&&Z!==""}function RZ(Z){return typeof Z==="string"&&Z!==""}function S(Z,$){return Z[$]===void 0||y(Z[$])}function r(Z,$){return Z[$]===void 0||typeof Z[$]==="string"}function J1(Z){return v(Z)&&NZ(Z.scope)&&RZ(Z.label)&&y(Z.usedPercent)&&r(Z,"resetsAt")&&(Z.windowMinutes===void 0||y(Z.windowMinutes)&&Z.windowMinutes>0)}function X1(Z){return v(Z)&&NZ(Z.scope)&&RZ(Z.label)}function V1(Z){if(!v(Z))return!1;if(Z.kind==="cleared")return!0;return Z.kind==="reading"&&typeof Z.reached==="boolean"&&S(Z,"remainingPercent")&&S(Z,"usedPercent")&&r(Z,"resetsAt")&&S(Z,"limit")&&S(Z,"used")&&S(Z,"remaining")&&r(Z,"unit")}function TZ(Z){if(!v(Z)||!y(Z.checkedAt))return!1;let $=Z.readings??[],J=Z.coverage??[];if(!Array.isArray($)||!Array.isArray(J))return!1;let X=new Set;for(let V of $){if(!J1(V))return!1;let Y=q(V.scope??L,V.label);if(X.has(Y))return!1;X.add(Y)}if(!J.every(X1))return!1;return Z.budget===void 0||V1(Z.budget)}function Y1(Z,$){if(Z.scope!==$.scope)return Z.scope<$.scope?-1:1;if(Z.label!==$.label)return Z.label<$.label?-1:1;return 0}function z1(Z,$,J){if($===void 0)return Z;if(Z!==void 0&&J<Z.checkedAt)return Z;return{...$,checkedAt:J}}function o(Z,$){if(Z!==void 0&&!I(Z))throw new w("stored quota map is malformed");if(!TZ($))throw new w("quota observation is malformed");let J=Z??{limits:[]},X=$.checkedAt,V=new Map;for(let K of J.limits)V.set(q(K.scope,K.label),K);let Y=(K)=>{let Q=V.get(K);return Q===void 0||X>=LZ(Q)},G=new Set;for(let K of $.readings??[]){let Q=K.scope??L,U=q(Q,K.label);if(G.add(U),!Y(U))continue;V.set(U,{scope:Q,label:K.label,kind:"reading",checkedAt:X,usedPercent:K.usedPercent,...K.resetsAt===void 0?{}:{resetsAt:K.resetsAt},...K.windowMinutes===void 0?{}:{windowMinutes:K.windowMinutes}})}for(let K of $.coverage??[]){let Q=K.scope??L,U=q(Q,K.label);if(G.has(U)||!Y(U))continue;let P=V.get(U);V.set(U,P===void 0||P.kind==="absent"?{scope:Q,label:K.label,kind:"absent",checkedAt:X}:{scope:Q,label:K.label,kind:"retired",retiredAt:X})}let{limits:z,budget:j,...B}=J,D=z1(J.budget,$.budget,X);return{...B,limits:[...V.values()].sort(Y1),...D===void 0?{}:{budget:D}}}var G1=Object.freeze({validate:I,merge:o});var MZ=900000,CZ="no quota reading yet",FZ="no limits reported";function EZ(Z){let $=Math.max(1,Math.round(Z/60000));if($<60)return`${$}m`;let J=Math.round($/60);if(J<24)return`${J}h`;return`${Math.max(1,Math.round($/1440))}d`}function j1(Z){if(Z%1440===0)return`${Z/1440}d`;if(Z%60===0)return`${Z/60}h`;return`${Z}m`}function h(Z){if(Z.scope!==L||Z.windowMinutes===void 0)return Z.label;return j1(Z.windowMinutes)}function OZ(Z){return`${Math.round(Math.min(100,Math.max(0,Z)))}% left`}function _Z(Z,$){if(Z===void 0)return"";let J=Date.parse(Z);if(!Number.isFinite(J)||J<=$)return"";return`, resets ${EZ(J-$)}`}function U1(Z,$){let J=Z.windowMinutes,X=$.windowMinutes;if(J!==void 0&&X!==void 0&&J!==X)return J-X;if(J===void 0!==(X===void 0))return J===void 0?1:-1;if(Z.scope!==$.scope){if(Z.scope===L)return-1;if($.scope===L)return 1;return Z.scope<$.scope?-1:1}return Z.label<$.label?-1:Z.label>$.label?1:0}function qZ(Z,$){if(!Z)return[];let{now:J}=$,X=($.form??"full")==="full",V=[],Y=[],G=Z.limits.filter((j)=>j.kind==="reading"&&j.remainingPercent!==void 0).sort(U1);for(let j of G)Y.push(j.checkedAt),V.push(`${h(j)} ${OZ(j.remainingPercent??0)}${X?_Z(j.resetsAt,J):""}`);let z=Z.budget;if(z){Y.push(z.checkedAt);let j=z.reached?"credits spent":z.remainingPercent!==void 0?`credits ${OZ(z.remainingPercent)}`:"credits available";V.push(`${j}${X?_Z(z.resetsAt,J):""}`)}if(Y.length>0){let j=J-Math.min(...Y);if(j>($.staleAfterMs??MZ))V.push(`checked ${EZ(j)} ago`)}return V}function a(Z,$){let J=qZ(Z,$);if(J.length>0)return J.join(" · ");return Z&&Z.limits.length>0?FZ:CZ}function B1(Z){if(Z.kind==="retired")return{scope:Z.scope,label:Z.label,kind:"retired",checkedAt:Z.retiredAt};if(Z.kind==="absent")return{scope:Z.scope,label:Z.label,kind:"absent",checkedAt:Z.checkedAt};return{scope:Z.scope,label:Z.label,kind:"reading",checkedAt:Z.checkedAt,usedPercent:Z.usedPercent,remainingPercent:100-Z.usedPercent,...Z.windowMinutes===void 0?{}:{windowMinutes:Z.windowMinutes},...Z.resetsAt===void 0?{}:{resetsAt:Z.resetsAt}}}function Q1(Z,$){let J=Z.windowMinutes!==void 0,X=$.windowMinutes!==void 0;if(J!==X)return J?-1:1;if(J&&X&&Z.windowMinutes!==$.windowMinutes)return($.windowMinutes??0)-(Z.windowMinutes??0);if(Z.label!==$.label)return Z.label<$.label?-1:1;return 0}function K1(Z){return{checkedAt:Z.checkedAt,reached:Z.reached,...Z.remainingPercent===void 0?{}:{remainingPercent:Z.remainingPercent},...Z.resetsAt===void 0?{}:{resetsAt:Z.resetsAt}}}function s(Z,$=L){let J=new Map;for(let j of Z?.limits??[]){if(j.scope!==$&&j.scope!==L)continue;let B=J.get(j.label);if(B===void 0){J.set(j.label,j);continue}let D=j.scope===L?B:j,K=j.scope===L?j:B;J.set(j.label,D.kind==="reading"?D:K)}let X=[...J.values()].map(B1).sort(Q1),V=X.filter((j)=>j.kind==="reading"),Y=V.length>0?V:X,G=Y.length>0?Math.min(...Y.map((j)=>j.checkedAt)):void 0,z=Z?.budget?.kind==="reading"?K1(Z.budget):void 0;return{scope:$,limits:X,...G===void 0?{}:{checkedAt:G},...z===void 0?{}:{budget:z}}}function D1(Z,$){let J=Z?.budget;if(J?.reached!==!0||typeof J.resetsAt!=="string")return;let X=Date.parse(J.resetsAt);if(!Number.isFinite(X)||X<=$)return;return{resetsAt:J.resetsAt,resetAtMs:X}}function P1(Z){return Z.kind==="reading"&&typeof Z.usedPercent==="number"&&Number.isFinite(Z.usedPercent)&&Z.usedPercent>=100}function W1(Z,$){if(typeof Z.resetsAt!=="string")return;let J=Date.parse(Z.resetsAt);return Number.isFinite(J)&&J>$?J:void 0}import{createHash as q1}from"node:crypto";import{constants as x1,copyFileSync as I1,mkdirSync as S1,statSync as b1}from"node:fs";import{readFile as f1}from"node:fs/promises";import{homedir as A1,tmpdir as k1}from"node:os";import{dirname as w1,join as XZ}from"node:path";import{chmod as H1,mkdir as L1,readFile as N1}from"node:fs/promises";import{dirname as R1}from"node:path";function e(Z){let{path:$,defaultValue:J,normalize:X}=Z,V=Promise.resolve(),Y=(U)=>{if(U==="")return J;try{return X(JSON.parse(U))}catch{return J}},G=async()=>{try{return await N1($,"utf8")}catch(U){if(U.code==="ENOENT")return"";throw U}},z=async()=>{try{return Y(await G())}catch{return J}},j=(U,P)=>{let W=V.then(U).then((H)=>P?.onResult?.(H));return V=W.catch(()=>{}),W},B={...b.sidebar,name:Z.lockName??b.sidebar.name,timeoutMs:Z.timeoutMs??b.sidebar.timeoutMs},D=async(U,P,W)=>{await n($,P,{serialize:JSON.stringify,beforeRename:async()=>{await W?.beforeCommit?.(),await U.assertOwned()}}),await W?.afterRename?.();try{return await U.assertOwned(),!0}catch(H){if(H instanceof t)return!1;throw H}},K=async(U,P,W)=>{Z.logger?.warn("sidebar lock lost after rename; repairing write",{path:$});try{let H=await p($,B,async(O)=>{let R=U(await z(),P);if(R===void 0)return"skipped";return await D(O,R,W)?"written":"lost-again"});if(H==="lost-again")Z.logger?.warn("sidebar repair lost its lock after rename",{path:$});return{status:"lost-after-rename",repair:H}}catch(H){if(!(H instanceof i))throw H;return Z.logger?.warn("sidebar repair lock unavailable; repair skipped",{path:$}),{status:"lost-after-rename",repair:"lock-unavailable"}}},Q=async(U,P)=>{let W=P,H=R1($),O=Z.secureDir??!0;if(await L1(H,{recursive:!0,mode:448}),O)await H1(H,448).catch((x)=>{Z.logger?.warn("sidebar directory permission remediation failed",{error:x instanceof Error?x.message:String(x)})});let R=await p($,B,async(x)=>{let KZ=async(E)=>({value:E,held:await D(x,E,W)});for(let E=0;E<3;E+=1){let PZ=await G(),WZ=U(Y(PZ));if(WZ===void 0)return;if(E===0)await W?.beforeRecheck?.();if(await G()!==PZ)continue;return await KZ(WZ)}let DZ=U(await z());return DZ===void 0?void 0:await KZ(DZ)});if(R===void 0)return{status:"skipped"};if(R.held)return{status:"written"};let QZ=P?.repair??Z.repair;if(!QZ)return Z.logger?.warn("sidebar lock lost after rename; write not repaired",{path:$}),{status:"lost-after-rename",repair:"none"};return await K(QZ,R.value,W)};return{read:z,write:(U,P)=>j(()=>Q(()=>U,P),P),update:(U,P)=>j(()=>Q(U,P),P)}}import{tmpdir as T1}from"node:os";import{join as O1}from"node:path";var _1=["error","warn","info","debug","trace"];function M1(){return process.env.OPENCODE_OPENAI_AUTH_LOG_FILE??O1(T1(),"opencode-openai-auth.log")}function C1(){let Z=process.env.OPENCODE_OPENAI_AUTH_LOG_LEVEL;return Z&&_1.includes(Z)?Z:void 0}xZ({file:M1,level:C1});process.on("exit",ZZ);var zZ=["primary","secondary"],F1={primary:300,secondary:10080};function E1(Z,$){return h({scope:"all",label:$,windowMinutes:Z})}function c3(Z){if(!Z)return[];let $=[];for(let J of zZ){let X=Z[J];if(!X)continue;let V=X.windowMinutes,Y=V!==void 0&&Number.isFinite(V)&&V>0?V:F1[J];$.push({key:J,label:E1(V,J),window:X,windowMs:Y*60000})}return $}var f=$Z("sidebar"),y1="OPENCODE_OPENAI_AUTH_SIDEBAR_STATE_FILE";function vZ(){let Z=process.env.XDG_STATE_HOME||XZ(A1(),".local","state");return XZ(Z,"cortexkit","openai-auth","sidebar-state.json")}var hZ=XZ(k1(),"opencode-openai-auth","sidebar-state.json");function i3(Z){hZ=Z,VZ.clear()}var v1=/^[a-f0-9]{64}$/,GZ=604800000,pZ=256,mZ=3600000;function C(Z){return q1("sha256").update(Z).digest("hex")}function h1(Z){return typeof Z==="number"&&Number.isFinite(Z)&&Z>=0?Z:void 0}function gZ(Z){let $=h1(Z);return $!==void 0?{resetCredits:$}:{}}function p1(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return;let $={};for(let[J,X]of Object.entries(Z)){if(X===null||typeof X!=="object"||Array.isArray(X))continue;let V=X;if(typeof V.activeId!=="string"||typeof V.route!=="string"||typeof V.updatedAt!=="number"||!Number.isFinite(V.updatedAt))continue;$[J]={activeId:V.activeId,route:V.route,updatedAt:V.updatedAt}}return Object.keys($).length>0?$:void 0}function m1(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return;let $={};for(let[J,X]of Object.entries(Z)){if(!v1.test(J)||X===null||typeof X!=="object"||Array.isArray(X))continue;let V=X;if(typeof V.accountId!=="string"||V.accountId.length===0||typeof V.assignedAt!=="number"||!Number.isFinite(V.assignedAt)||V.assignedAt<0||typeof V.lastSeenAt!=="number"||!Number.isFinite(V.lastSeenAt)||V.lastSeenAt<0||typeof V.inputBytes!=="number"||!Number.isFinite(V.inputBytes)||V.inputBytes<0)continue;let Y=V.quotaCheckedAt;if(Y!==void 0&&(typeof Y!=="number"||!Number.isFinite(Y)||Y<0))continue;let G=V.wireAccountId;$[J]={accountId:V.accountId,assignedAt:V.assignedAt,lastSeenAt:V.lastSeenAt,inputBytes:V.inputBytes,...Y===void 0?{}:{quotaCheckedAt:Y},...typeof G==="string"?{wireAccountId:G}:{}}}return Object.keys($).length>0?$:void 0}function _(){let Z=process.env[y1];if(Z)return Z;let $=vZ();if(!VZ.has($))VZ.add($),g1($,hZ);return $}var VZ=new Set;function g1(Z,$){try{S1(w1(Z),{recursive:!0,mode:448}),I1($,Z,x1.COPYFILE_EXCL)}catch{}}var A={main:{quota:null,killed:!1},fallbacks:[],activeId:void 0,route:"main",lastUpdated:0};function c(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return A;let $=Z,J=$.main,X;if(J!==null&&typeof J==="object"&&!Array.isArray(J)){let U=J;X={quota:"quota"in U?U.quota:null,killed:typeof U.killed==="boolean"?U.killed:!1,...typeof U.mainAccountId==="string"?{mainAccountId:U.mainAccountId}:{},...typeof U.quotaBackedOff==="boolean"?{quotaBackedOff:U.quotaBackedOff}:{},...typeof U.quotaBackoffUntil==="number"?{quotaBackoffUntil:U.quotaBackoffUntil}:{},...typeof U.refreshBackedOff==="boolean"?{refreshBackedOff:U.refreshBackedOff}:{},...typeof U.refreshBackoffUntil==="number"?{refreshBackoffUntil:U.refreshBackoffUntil}:{},...gZ(U.resetCredits)}}else X={quota:null,killed:!1};let V=IZ($.fallbacks),Y=Array.isArray($.vaultAccounts)?IZ($.vaultAccounts):void 0,G=typeof $.activeId==="string"?$.activeId:void 0,z=typeof $.route==="string"?$.route:A.route,j=typeof $.lastUpdated==="number"?$.lastUpdated:0,B=typeof $.planType==="string"?$.planType:void 0,D=typeof $.credits==="number"?$.credits:void 0,K=p1($.activeRouting),Q=m1($.stickyAssignments);return{main:X,fallbacks:V,activeId:G,route:z,lastUpdated:j,...K!==void 0?{activeRouting:K}:{},...Q!==void 0?{stickyAssignments:Q}:{},...B!==void 0?{planType:B}:{},...D!==void 0?{credits:D}:{},...$.accountPool===!0?{accountPool:!0}:{},...Y!==void 0?{vaultAccounts:Y}:{}}}function IZ(Z){if(!Array.isArray(Z))return[];return Z.filter(($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&typeof $.id==="string").map(($)=>({id:$.id,label:typeof $.label==="string"?$.label:void 0,...typeof $.accountId==="string"?{accountId:$.accountId}:{},quota:"quota"in $?$.quota:null,killed:typeof $.killed==="boolean"?$.killed:!1,enabled:typeof $.enabled==="boolean"?$.enabled:!0,...gZ($.resetCredits)}))}function jZ(Z){return[...Z.fallbacks,...Z.vaultAccounts??[]]}async function d1(Z=_()){try{let $=await f1(Z,"utf8");return c(JSON.parse($))}catch{return A}}var c1=3600000,SZ=128;function dZ(Z,$,J=Date.now()){if(!(Z.updatedAt>=J-c1&&Z.updatedAt<=J))return!1;if($===void 0)return!0;return Z.activeId==="main"||$.some((V)=>V.enabled!==!1&&V.killed!==!0&&V.id===Z.activeId)}function u1(Z,$=Date.now()){let J=Z?.spendControl;if(J?.reached!==!0||typeof J.resetsAt!=="string")return;let X=Date.parse(J.resetsAt);if(!Number.isFinite(X)||X<=$)return;return{resetsAt:J.resetsAt,resetAtMs:X}}function l1(Z,$=Date.now()){let J;for(let V of zZ){let Y=Z?.[V];if(typeof Y?.resetsAt!=="string"||!Number.isFinite(Y.usedPercent)||Y.usedPercent<100)continue;let G=Date.parse(Y.resetsAt);if(!Number.isFinite(G)||G<=$)continue;if(!J||G<J.resetAtMs)J={resetsAt:Y.resetsAt,resetAtMs:G}}let X=u1(Z,$);if(X&&(!J||X.resetAtMs<J.resetAtMs))J=X;return J}function m(Z,$=Date.now()){return l1(Z,$)!==void 0}function r1(Z,$,J=Date.now()){if(!$||Z.route!=="sticky-balanced")return;let X=Z.stickyAssignments?.[C($)];if(!X||X.lastSeenAt<J-GZ)return;if(X.accountId==="main")return Z.main?.killed||m(Z.main?.quota,J)?void 0:"main";let V=jZ(Z).find((Y)=>Y.id===X.accountId);if(!V||V.enabled===!1||V.killed===!0||m(V.quota,J))return;return V.id}function t3(Z,$,J=Date.now()){if(!$)return{activeId:Z.activeId??"main",route:Z.route};let X=$?Z.activeRouting?.[$]:void 0,V=jZ(Z),Y=X?.activeId==="main"?Z.main.quota:V.find((D)=>D.id===X?.activeId)?.quota;if(X&&dZ(X,V,J)&&!m(Y,J))return{activeId:X.activeId,route:X.route};let G=r1(Z,$,J);if(G)return{activeId:G,route:Z.route};let z=Z.vaultAccounts!==void 0,j=(z?Z.vaultAccounts??[]:Z.fallbacks).filter((D)=>D.enabled&&!D.killed),B=j.find((D)=>!m(D.quota,J))??j[0];return{activeId:(z||Z.route==="fallback-first")&&B?B.id:"main",route:Z.route}}function cZ(Z,$,J=Date.now(),X){if(!Z)return;let V=Object.entries(Z).filter(([G,z])=>G!==X&&dZ(z,$,J)),Y=V.length<=SZ?V:V.sort((G,z)=>z[1].updatedAt-G[1].updatedAt).slice(0,SZ);return Y.length>0?Object.fromEntries(Y):void 0}function k(Z,$,J=Date.now(),X){if(!Z)return;let V=0,Y=0,G=0,z=[];for(let[B,D]of Object.entries(Z)){if(B===X){G+=1;continue}if(D.lastSeenAt<J-GZ){Y+=1;continue}if($!==void 0&&!$.has(D.accountId)){V+=1;continue}z.push([B,D])}let j=V+Y+G;if(j>0)f.debug("pruned sticky assignments",{pid:process.pid,removed:j,reasons:{"account-not-in-roster":V,expired:Y,"explicit-removal":G}});return z.length>0?Object.fromEntries(z):void 0}function uZ(Z,$){let J=Object.keys(Z).length-pZ;if(J<=0)return Z;let X=new Set(Object.entries(Z).filter(([V])=>V!==$).sort(([V,Y],[G,z])=>Y.lastSeenAt-z.lastSeenAt||V.localeCompare(G)).slice(0,J).map(([V])=>V));return Object.fromEntries(Object.entries(Z).filter(([V])=>!X.has(V)))}function lZ(Z,$){if(Z===$)return!0;if(!Z||!$)return!1;let J=Object.entries(Z);if(J.length!==Object.keys($).length)return!1;return J.every(([X,V])=>Object.is($[X],V))}function rZ(Z,$,J,X){return Z!==void 0&&$.has(Z.accountId)&&!J.has(Z.accountId)&&Z.lastSeenAt>=X-GZ}function oZ(Z,$,J,X){return $>Z.inputBytes||J-Z.lastSeenAt>=mZ||Z.wireAccountId===void 0&&X!==void 0}function aZ(Z,$){return typeof Z.wireAccountId==="string"&&typeof $==="string"&&Z.wireAccountId!==$}function o1(Z){let $=new Map(Z),J={get size(){return $.size},has:(X)=>$.has(X),get:(X)=>$.get(X),entries:()=>$.entries(),keys:()=>$.keys(),values:()=>$.values(),forEach:(X,V)=>{$.forEach((Y,G)=>{X.call(V,Y,G,J)})},[Symbol.iterator]:()=>$[Symbol.iterator]()};return Object.freeze(J)}function a1(Z,$,J){let X=new Map;for(let[V,Y]of Object.entries(Z??{})){if(V===J)continue;if(Y.quotaCheckedAt!==$[Y.accountId])continue;X.set(Y.accountId,(X.get(Y.accountId)??0)+Y.inputBytes)}return o1(X)}function UZ(Z){if(Z===void 0)return;return new Set(["main",...Z.filter(($)=>$.enabled!==!1&&$.killed!==!0).map(($)=>$.id)])}var YZ=Promise.resolve();function M(Z){let $=YZ.then(Z);return YZ=$.catch(()=>{}),$}var bZ=new Map;function BZ(Z){let $=bZ.get(Z);if(!$)$=e({path:Z,defaultValue:A,normalize:c,secureDir:Z===vZ(),logger:f}),bZ.set(Z,$);return $}var JZ=new Set;async function sZ(Z,$){try{await $}catch(J){let X={pid:process.pid,error:J instanceof Error?J.message:String(J)};if(JZ.has(Z))f.debug("sidebar write failed again",X);else JZ.add(Z),f.warn("sidebar write failed",X);throw J}if(JZ.delete(Z))f.info("sidebar write recovered",{pid:process.pid})}function e3(Z,$=_()){return M(()=>sZ($,BZ($).write(c(Z))))}function s1(Z){return BZ(Z).read()}function F(Z,$,J){let X=Symbol("sidebar authority changed");return sZ(Z,BZ(Z).update((V)=>{if(J?.canWrite&&!J.canWrite())return;let Y=$(V);return Y===void 0?void 0:c(Y)},{beforeRecheck:async(...V)=>{if(await J?.beforeRecheck?.(...V),J?.canWrite&&!J.canWrite())throw X}}).catch((V)=>{if(V!==X)throw V}))}function g(Z){let $;for(let J of[Z?.primary?.checkedAt,Z?.secondary?.checkedAt,Z?.checkedAt])if(typeof J==="number"&&Number.isFinite(J))$=$===void 0?J:Math.max($,J);return $}function fZ(Z,$){let J=g(Z),X=g($);if(X!==void 0&&(J===void 0||X>J))return $;return Z}function AZ(Z,$){return Z!==void 0&&$!==void 0&&Z===$}function d(Z,$){let J=Z?.checkedAt;if(typeof J==="number"&&Number.isFinite(J))return J;if(typeof $==="number"&&Number.isFinite($))return $;return}function kZ(Z,$,J,X,V){if(Z&&$){let Y=d(Z,X),G=d($,V);if(G!==void 0&&(Y===void 0||G>Y))return $;return Z}return J?$:Z}function wZ(Z,$){if(Z.spendControl!==void 0)return Z.spendControl;if(Z.spendControlCleared===!0)return;return $.spendControl}function yZ(Z,$){if(!Z)return $;if(!$)return Z;let J=g(Z),X=g($),V=X!==void 0&&(J===void 0||X>J),Y=kZ(Z.primary,$.primary,V,Z.checkedAt,$.checkedAt),G=kZ(Z.secondary,$.secondary,V,Z.checkedAt,$.checkedAt),z=V?wZ($,Z):wZ(Z,$),j=z===void 0&&(Z.spendControlCleared===!0||$.spendControlCleared===!0),B;for(let U of[d(Y),d(G)])if(U!==void 0)B=B===void 0?U:Math.max(B,U);let{spendControl:D,spendControlCleared:K,...Q}=Z;return{...Q,primary:Y,secondary:G,...z!==void 0?{spendControl:z}:{},...j?{spendControlCleared:!0}:{},checkedAt:B??Z.checkedAt}}function Z4(Z,$=_(),J){return M(async()=>{await F($,(X)=>{let V=new Map(X.fallbacks.map((B)=>[B.id,B])),Y=AZ(Z.main.mainAccountId,X.main.mainAccountId),G=Y?yZ(Z.main.quota,X.main.quota):fZ(Z.main.quota,X.main.quota),z=Date.now(),j=k(X.stickyAssignments,UZ(jZ(Z)),z);return{...X,...Z,main:{...Z.main,quota:G,mainAccountId:Y?Z.main.mainAccountId:G===X.main.quota&&G!==Z.main.quota?X.main.mainAccountId:Z.main.mainAccountId},fallbacks:Z.fallbacks.map((B)=>{let D=V.get(B.id),K=AZ(B.accountId,D?.accountId),Q=K?yZ(B.quota,D?.quota??null):fZ(B.quota,D?.quota??null);return{...B,quota:Q,accountId:K?B.accountId:Q===D?.quota&&Q!==B.quota?D?.accountId:B.accountId}}),activeId:X.activeId,activeRouting:X.activeRouting,stickyAssignments:j,lastUpdated:Math.max(z,X.lastUpdated+1),accountPool:Z.accountPool===!0?!0:void 0,vaultAccounts:Z.vaultAccounts}},J)})}function $4(Z,$,J=_(),X){return M(async()=>{await F(J,(V)=>{let Y=cZ({...V.activeRouting,[Z.sessionId]:{activeId:Z.activeId,route:Z.route,updatedAt:Z.updatedAt}},$,Date.now()),G=k(V.stickyAssignments,UZ($),Date.now());return{...V,activeId:Z.activeId,route:Z.route,activeRouting:Y,stickyAssignments:G,lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}},X)})}function J4(Z,$=_(),J){return M(async()=>{await F($,(X)=>({...X,activeId:Z.activeId,route:Z.route,lastUpdated:Math.max(Date.now(),X.lastUpdated+1)}),J)})}function X4(Z,$,J=_(),X){return M(async()=>{await F(J,(V)=>{let Y=Date.now(),G=cZ(V.activeRouting,$,Y,Z),z=k(V.stickyAssignments,UZ($),Y,C(Z));return{...V,activeRouting:G,stickyAssignments:z,lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}},X)})}function nZ(Z,$){return rZ(Z,new Set($.validPinnedAccountIds),new Set($.excludeAccountIds),$.now)&&!aZ(Z,$.wireAccountIdByAccount?.[Z.accountId])&&!oZ(Z,$.requestBytes,$.now,$.wireAccountIdByAccount?.[Z.accountId])}function iZ(Z,$){let J=C($.sessionId),X=new Set($.validPinnedAccountIds),V=new Set($.excludeAccountIds),Y=k(Z.stickyAssignments,X,$.now),G=!lZ(Z.stickyAssignments,Y),z=Y?.[J],j=z!==void 0&&aZ(z,$.wireAccountIdByAccount?.[z.accountId]);if(rZ(z,X,V,$.now)&&!j){let K=oZ(z,$.requestBytes,$.now,$.wireAccountIdByAccount?.[z.accountId]),Q=K?{...z,inputBytes:Math.max(z.inputBytes,$.requestBytes),...z.wireAccountId===void 0&&$.wireAccountIdByAccount?.[z.accountId]!==void 0?{wireAccountId:$.wireAccountIdByAccount?.[z.accountId]}:{},...$.now-z.lastSeenAt>=mZ?{lastSeenAt:$.now}:{}}:z;if(!G&&!K)return{assignment:Q,next:void 0};return{assignment:Q,next:{...Z,stickyAssignments:{...Y,[J]:Q},lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}let B=$.choose(a1(Y,$.quotaCheckedAtByAccount,j?J:void 0));if(!B){if(!G)return{assignment:void 0,next:void 0};return{assignment:void 0,next:{...Z,stickyAssignments:Y,lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}let D={accountId:B.accountId,assignedAt:$.now,lastSeenAt:$.now,inputBytes:$.requestBytes,...B.quotaCheckedAt===void 0?{}:{quotaCheckedAt:B.quotaCheckedAt},...$.wireAccountIdByAccount?.[B.accountId]===void 0?{}:{wireAccountId:$.wireAccountIdByAccount?.[B.accountId]}};return{assignment:D,next:{...Z,stickyAssignments:uZ({...Y,[J]:D},J),lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}async function V4(Z,$=_(),J){let X=C(Z.sessionId),V=(await s1($)).stickyAssignments?.[X];if(nZ(V,Z))return V;let Y;return await M(async()=>{await F($,(G)=>{let z=iZ(G,Z);return Y=z.assignment,z.next},J)}),Y}function Y4(Z,$){let J=Z.stickyAssignments?.[C($.sessionId)];if(nZ(J,$))return{assignment:J,next:void 0};return iZ(Z,$)}function z4(Z,$=_()){let J=C(Z.sessionId),X=new Set(Z.validPinnedAccountIds);return M(async()=>{await F($,(V)=>{let Y=Date.now(),G=k(V.stickyAssignments,X,Y),z=G?.[J];if(z&&z.assignedAt>Z.assignment.assignedAt){if(lZ(V.stickyAssignments,G))return;return{...V,stickyAssignments:G,lastUpdated:Math.max(Y,V.lastUpdated+1)}}let B=z!==void 0&&z.accountId===Z.assignment.accountId&&z.assignedAt===Z.assignment.assignedAt?{...Z.assignment,inputBytes:Math.max(z.inputBytes,Z.assignment.inputBytes),lastSeenAt:Math.max(z.lastSeenAt,Z.assignment.lastSeenAt)}:Z.assignment;return{...V,stickyAssignments:uZ({...G,[J]:B},J),lastUpdated:Math.max(Y,V.lastUpdated+1)}})})}async function G4(Z,$=_()){let J=C(Z),X=!1;return await M(async()=>{await F($,(V)=>{let Y=V.stickyAssignments;if(Y?.[J]===void 0){X=!1;return}X=!0;let{[J]:G,...z}=Y;return{...V,...Object.keys(z).length>0?{stickyAssignments:z}:{stickyAssignments:void 0},lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}})}),X}function j4(){return YZ}var n1=500;function i1(Z,$,J){return new Promise((X,V)=>{let Y=setTimeout(()=>X(J()),$);Y.unref?.(),Z.then((G)=>{clearTimeout(Y),X(G)},(G)=>{clearTimeout(Y),V(G)})})}function U4(Z,$={}){let J=$.readBudgetMs??n1,X,V,Y=()=>{try{let z=b1(Z);return`${z.ino}:${z.size}:${z.mtimeMs}`}catch{return}},G=(z)=>{if(V&&V.key===z)return V.promise;let j=Date.now(),B=d1(Z).then((Q)=>{if(!X||X.readAt<=j)X={state:Q,readAt:j,key:z};return{state:Q,readAt:j}}),D={key:z,promise:B};V=D;let K=()=>{if(V===D)V=void 0};return B.then(K,K),B};return{get(){let z=Y();if(X&&X.key===z)return Promise.resolve({state:X.state,readAt:X.readAt});return i1(G(z),J,()=>X?{state:X.state,readAt:X.readAt}:{state:A,readAt:0})},read(){return G(Y())},refreshInBackground(){let z=Y();if(X?.key===z)return;G(z)}}}function B4(Z,$,J){let X={assignment:J};Z.delete($),Z.set($,X);while(Z.size>pZ){let V=Z.keys().next().value;if(V===void 0)break;Z.delete(V)}return X}function Q4(Z,$){if($.size===0)return Z.state;let J={...Z.state.stickyAssignments},X=!1;for(let[V,Y]of $){if(Y.persistedAt!==void 0&&Z.readAt>Y.persistedAt){$.delete(V);continue}J[V]=Y.assignment,X=!0}if(!X)return Z.state;return{...Z.state,stickyAssignments:J}}function K4(Z){let $=Z.retryDelayMs??500,J=Z.maxRetryDelayMs??30000,X=new Map,V=new Map,Y=new Set,G=0,z=$,j,B=!1,D=()=>{if(j||B||V.size===0)return;j=setTimeout(()=>{j=void 0;let Q=[...V];V.clear(),z=Math.min(z*2,J);for(let[U,P]of Q){let W=X.get(U);if(W!==void 0)K(U,P.label,P.write,W)}},z),j.unref?.()},K=(Q,U,P,W)=>{let H;try{H=P()}catch(O){H=Promise.reject(O)}H.then(()=>{if(X.get(Q)!==W)return;if(X.delete(Q),Y.delete(Q))Z.logger.info("sidebar bookkeeping write recovered",{pid:process.pid,write:U});if(Y.size===0)z=$;Z.onWritten?.()},(O)=>{if(X.get(Q)!==W)return;let R={pid:process.pid,write:U,error:O instanceof Error?O.message:String(O)};if(B){X.delete(Q),Z.logger.debug("sidebar bookkeeping write dropped",R);return}if(Y.has(Q))Z.logger.debug("sidebar bookkeeping write failed again",R);else Y.add(Q),Z.logger.warn("sidebar bookkeeping write failed; retrying in the background",R);V.set(Q,{label:U,write:P}),D()})};return{enqueue(Q,U,P){G+=1,X.set(Q,G),V.delete(Q),K(Q,U,P,G)},cancel(Q){X.delete(Q),V.delete(Q),Y.delete(Q)},stop(){if(B=!0,j)clearTimeout(j);j=void 0,V.clear()}}}function D4(Z){let $=Z.activeId;if(Z.vaultAccounts!==void 0){let J=Z.vaultAccounts.filter((V)=>V.enabled),X=J.find((V)=>V.id===$)??J[0];return X?{id:X.id,name:X.label??X.id,quota:X.quota,killed:X.killed}:{id:"vault",name:"vault",quota:null,killed:!1}}if($&&$!=="main"){let J=Z.fallbacks.find((X)=>X.enabled&&X.id===$);if(J)return{id:J.id,name:J.label??J.id,quota:J.quota,killed:J.killed}}return{id:"main",name:"main",quota:Z.main.quota,killed:Z.main.killed}}function t1(Z,$=Date.now()){if(!Z)return;return s({limits:zZ.flatMap((J)=>{let X=Z[J];return X?[{kind:"reading",scope:"all",label:J,usedPercent:X.usedPercent,checkedAt:X.checkedAt??Z.checkedAt??$,windowMinutes:X.windowMinutes,resetsAt:X.resetsAt}]:[]}),...Z.spendControl?{budget:{...Z.spendControl,kind:"reading",checkedAt:Z.checkedAt??$}}:{}})}function P4(Z,$=Date.now()){let J=Z?.primary?.usedPercent??null,X=Z?.secondary?.usedPercent??null,V=t1(Z,$);return{primaryUsedPercent:J,secondaryUsedPercent:X,text:!V||V.limits.length===0&&!V.budget?null:a(V,{now:$,form:"compact"})}}var e1=300000,Z3=0.01,$3=1;function W4(Z,$,J){if(!Z.resetsAt)return null;let X=new Date(Z.resetsAt).getTime();if(!Number.isFinite(X))return null;let V=X-$,Y=J-V;if(Y<e1)return null;if(Y<$*Z3)return null;if(Y>=$)return null;let G=Z.usedPercent,z=Math.min(Math.max(Y/$*100,0),100),j=G-z,B=Math.abs(j)<$3?"on-pace":j>0?"deficit":"reserve",D=null;if(G>0){let K=Y*100/G,Q=V+K;if(Q<X)D=new Date(Q).toISOString()}return{pacePercent:z,deltaPercent:j,state:B,runsOutAt:D}}
1
+ import{Lb as n,Pb as i,Qb as t,Rb as p,Sb as b}from"./index-jyr8y8k4.js";import{fc as ZZ,gc as $Z,ic as xZ}from"./index-bmd7x5aq.js";var L="all",tZ=Object.freeze(["primary"]);function LZ(Z){return Z.kind==="retired"?Z.retiredAt:Z.checkedAt}function q(Z,$){return JSON.stringify([Z,$])}function l(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}function N(Z){return typeof Z==="number"&&Number.isFinite(Z)}function HZ(Z){return typeof Z==="string"&&Z.length>0}function T(Z,$,J){return Z[$]===void 0||J(Z[$])}function eZ(Z){return N(Z)&&Z>0}function u(Z){return typeof Z==="string"}function Z1(Z){if(!l(Z)||!HZ(Z.scope)||!HZ(Z.label))return!1;switch(Z.kind){case"reading":return N(Z.checkedAt)&&N(Z.usedPercent)&&T(Z,"resetsAt",u)&&T(Z,"windowMinutes",eZ);case"retired":return N(Z.retiredAt);case"absent":return N(Z.checkedAt);default:return!1}}function $1(Z){if(!l(Z)||!N(Z.checkedAt))return!1;if(Z.kind==="cleared")return!0;return Z.kind==="reading"&&typeof Z.reached==="boolean"&&T(Z,"remainingPercent",N)&&T(Z,"usedPercent",N)&&T(Z,"resetsAt",u)&&T(Z,"limit",N)&&T(Z,"used",N)&&T(Z,"remaining",N)&&T(Z,"unit",u)}function I(Z){if(!l(Z)||!Array.isArray(Z.limits))return!1;let $=new Set;for(let J of Z.limits){if(!Z1(J))return!1;let X=q(J.scope,J.label);if($.has(X))return!1;$.add(X)}return T(Z,"budget",$1)}class w extends TypeError{constructor(Z){super(Z);this.name="QuotaCodecError"}}function v(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}function y(Z){return typeof Z==="number"&&Number.isFinite(Z)}function NZ(Z){return Z===void 0||typeof Z==="string"&&Z!==""}function RZ(Z){return typeof Z==="string"&&Z!==""}function S(Z,$){return Z[$]===void 0||y(Z[$])}function r(Z,$){return Z[$]===void 0||typeof Z[$]==="string"}function J1(Z){return v(Z)&&NZ(Z.scope)&&RZ(Z.label)&&y(Z.usedPercent)&&r(Z,"resetsAt")&&(Z.windowMinutes===void 0||y(Z.windowMinutes)&&Z.windowMinutes>0)}function X1(Z){return v(Z)&&NZ(Z.scope)&&RZ(Z.label)}function V1(Z){if(!v(Z))return!1;if(Z.kind==="cleared")return!0;return Z.kind==="reading"&&typeof Z.reached==="boolean"&&S(Z,"remainingPercent")&&S(Z,"usedPercent")&&r(Z,"resetsAt")&&S(Z,"limit")&&S(Z,"used")&&S(Z,"remaining")&&r(Z,"unit")}function TZ(Z){if(!v(Z)||!y(Z.checkedAt))return!1;let $=Z.readings??[],J=Z.coverage??[];if(!Array.isArray($)||!Array.isArray(J))return!1;let X=new Set;for(let V of $){if(!J1(V))return!1;let Y=q(V.scope??L,V.label);if(X.has(Y))return!1;X.add(Y)}if(!J.every(X1))return!1;return Z.budget===void 0||V1(Z.budget)}function Y1(Z,$){if(Z.scope!==$.scope)return Z.scope<$.scope?-1:1;if(Z.label!==$.label)return Z.label<$.label?-1:1;return 0}function z1(Z,$,J){if($===void 0)return Z;if(Z!==void 0&&J<Z.checkedAt)return Z;return{...$,checkedAt:J}}function o(Z,$){if(Z!==void 0&&!I(Z))throw new w("stored quota map is malformed");if(!TZ($))throw new w("quota observation is malformed");let J=Z??{limits:[]},X=$.checkedAt,V=new Map;for(let K of J.limits)V.set(q(K.scope,K.label),K);let Y=(K)=>{let B=V.get(K);return B===void 0||X>=LZ(B)},G=new Set;for(let K of $.readings??[]){let B=K.scope??L,U=q(B,K.label);if(G.add(U),!Y(U))continue;V.set(U,{scope:B,label:K.label,kind:"reading",checkedAt:X,usedPercent:K.usedPercent,...K.resetsAt===void 0?{}:{resetsAt:K.resetsAt},...K.windowMinutes===void 0?{}:{windowMinutes:K.windowMinutes}})}for(let K of $.coverage??[]){let B=K.scope??L,U=q(B,K.label);if(G.has(U)||!Y(U))continue;let P=V.get(U);V.set(U,P===void 0||P.kind==="absent"?{scope:B,label:K.label,kind:"absent",checkedAt:X}:{scope:B,label:K.label,kind:"retired",retiredAt:X})}let{limits:z,budget:j,...D}=J,Q=z1(J.budget,$.budget,X);return{...D,limits:[...V.values()].sort(Y1),...Q===void 0?{}:{budget:Q}}}var G1=Object.freeze({validate:I,merge:o});var MZ=900000,CZ="no quota reading yet",FZ="no limits reported";function EZ(Z){let $=Math.max(1,Math.round(Z/60000));if($<60)return`${$}m`;let J=Math.round($/60);if(J<24)return`${J}h`;return`${Math.max(1,Math.round($/1440))}d`}function j1(Z){if(Z%1440===0)return`${Z/1440}d`;if(Z%60===0)return`${Z/60}h`;return`${Z}m`}function h(Z){if(Z.scope!==L||Z.windowMinutes===void 0)return Z.label;return j1(Z.windowMinutes)}function OZ(Z){return`${Math.round(Math.min(100,Math.max(0,Z)))}% left`}function _Z(Z,$){if(Z===void 0)return"";let J=Date.parse(Z);if(!Number.isFinite(J)||J<=$)return"";return`, resets ${EZ(J-$)}`}function U1(Z,$){let J=Z.windowMinutes,X=$.windowMinutes;if(J!==void 0&&X!==void 0&&J!==X)return J-X;if(J===void 0!==(X===void 0))return J===void 0?1:-1;if(Z.scope!==$.scope){if(Z.scope===L)return-1;if($.scope===L)return 1;return Z.scope<$.scope?-1:1}return Z.label<$.label?-1:Z.label>$.label?1:0}function qZ(Z,$){if(!Z)return[];let{now:J}=$,X=($.form??"full")==="full",V=[],Y=[],G=Z.limits.filter((j)=>j.kind==="reading"&&j.remainingPercent!==void 0).sort(U1);for(let j of G)Y.push(j.checkedAt),V.push(`${h(j)} ${OZ(j.remainingPercent??0)}${X?_Z(j.resetsAt,J):""}`);let z=Z.budget;if(z){Y.push(z.checkedAt);let j=z.reached?"credits spent":z.remainingPercent!==void 0?`credits ${OZ(z.remainingPercent)}`:"credits available";V.push(`${j}${X?_Z(z.resetsAt,J):""}`)}if(Y.length>0){let j=J-Math.min(...Y);if(j>($.staleAfterMs??MZ))V.push(`checked ${EZ(j)} ago`)}return V}function a(Z,$){let J=qZ(Z,$);if(J.length>0)return J.join(" · ");return Z&&Z.limits.length>0?FZ:CZ}function B1(Z){if(Z.kind==="retired")return{scope:Z.scope,label:Z.label,kind:"retired",checkedAt:Z.retiredAt};if(Z.kind==="absent")return{scope:Z.scope,label:Z.label,kind:"absent",checkedAt:Z.checkedAt};return{scope:Z.scope,label:Z.label,kind:"reading",checkedAt:Z.checkedAt,usedPercent:Z.usedPercent,remainingPercent:100-Z.usedPercent,...Z.windowMinutes===void 0?{}:{windowMinutes:Z.windowMinutes},...Z.resetsAt===void 0?{}:{resetsAt:Z.resetsAt}}}function Q1(Z,$){let J=Z.windowMinutes!==void 0,X=$.windowMinutes!==void 0;if(J!==X)return J?-1:1;if(J&&X&&Z.windowMinutes!==$.windowMinutes)return($.windowMinutes??0)-(Z.windowMinutes??0);if(Z.label!==$.label)return Z.label<$.label?-1:1;return 0}function K1(Z){return{checkedAt:Z.checkedAt,reached:Z.reached,...Z.remainingPercent===void 0?{}:{remainingPercent:Z.remainingPercent},...Z.resetsAt===void 0?{}:{resetsAt:Z.resetsAt}}}function s(Z,$=L){let J=new Map;for(let j of Z?.limits??[]){if(j.scope!==$&&j.scope!==L)continue;let D=J.get(j.label);if(D===void 0){J.set(j.label,j);continue}let Q=j.scope===L?D:j,K=j.scope===L?j:D;J.set(j.label,Q.kind==="reading"?Q:K)}let X=[...J.values()].map(B1).sort(Q1),V=X.filter((j)=>j.kind==="reading"),Y=V.length>0?V:X,G=Y.length>0?Math.min(...Y.map((j)=>j.checkedAt)):void 0,z=Z?.budget?.kind==="reading"?K1(Z.budget):void 0;return{scope:$,limits:X,...G===void 0?{}:{checkedAt:G},...z===void 0?{}:{budget:z}}}function D1(Z,$){let J=Z?.budget;if(J?.reached!==!0||typeof J.resetsAt!=="string")return;let X=Date.parse(J.resetsAt);if(!Number.isFinite(X)||X<=$)return;return{resetsAt:J.resetsAt,resetAtMs:X}}function P1(Z){return Z.kind==="reading"&&typeof Z.usedPercent==="number"&&Number.isFinite(Z.usedPercent)&&Z.usedPercent>=100}function W1(Z,$){if(typeof Z.resetsAt!=="string")return;let J=Date.parse(Z.resetsAt);return Number.isFinite(J)&&J>$?J:void 0}import{createHash as q1}from"node:crypto";import{constants as x1,copyFileSync as I1,mkdirSync as S1,statSync as b1}from"node:fs";import{readFile as f1}from"node:fs/promises";import{homedir as A1,tmpdir as k1}from"node:os";import{dirname as w1,join as XZ}from"node:path";import{chmod as H1,mkdir as L1,readFile as N1}from"node:fs/promises";import{dirname as R1}from"node:path";function e(Z){let{path:$,defaultValue:J,normalize:X}=Z,V=Promise.resolve(),Y=(U)=>{if(U==="")return J;try{return X(JSON.parse(U))}catch{return J}},G=async()=>{try{return await N1($,"utf8")}catch(U){if(U.code==="ENOENT")return"";throw U}},z=async()=>{try{return Y(await G())}catch{return J}},j=(U,P)=>{let W=V.then(U).then((H)=>P?.onResult?.(H));return V=W.catch(()=>{}),W},D={...b.sidebar,name:Z.lockName??b.sidebar.name,timeoutMs:Z.timeoutMs??b.sidebar.timeoutMs},Q=async(U,P,W)=>{await n($,P,{serialize:JSON.stringify,beforeRename:async()=>{await W?.beforeCommit?.(),await U.assertOwned()}}),await W?.afterRename?.();try{return await U.assertOwned(),!0}catch(H){if(H instanceof t)return!1;throw H}},K=async(U,P,W)=>{Z.logger?.warn("sidebar lock lost after rename; repairing write",{path:$});try{let H=await p($,D,async(O)=>{let R=U(await z(),P);if(R===void 0)return"skipped";return await Q(O,R,W)?"written":"lost-again"});if(H==="lost-again")Z.logger?.warn("sidebar repair lost its lock after rename",{path:$});return{status:"lost-after-rename",repair:H}}catch(H){if(!(H instanceof i))throw H;return Z.logger?.warn("sidebar repair lock unavailable; repair skipped",{path:$}),{status:"lost-after-rename",repair:"lock-unavailable"}}},B=async(U,P)=>{let W=P,H=R1($),O=Z.secureDir??!0;if(await L1(H,{recursive:!0,mode:448}),O)await H1(H,448).catch((x)=>{Z.logger?.warn("sidebar directory permission remediation failed",{error:x instanceof Error?x.message:String(x)})});let R=await p($,D,async(x)=>{let KZ=async(E)=>({value:E,held:await Q(x,E,W)});for(let E=0;E<3;E+=1){let PZ=await G(),WZ=U(Y(PZ));if(WZ===void 0)return;if(E===0)await W?.beforeRecheck?.();if(await G()!==PZ)continue;return await KZ(WZ)}let DZ=U(await z());return DZ===void 0?void 0:await KZ(DZ)});if(R===void 0)return{status:"skipped"};if(R.held)return{status:"written"};let QZ=P?.repair??Z.repair;if(!QZ)return Z.logger?.warn("sidebar lock lost after rename; write not repaired",{path:$}),{status:"lost-after-rename",repair:"none"};return await K(QZ,R.value,W)};return{read:z,write:(U,P)=>j(()=>B(()=>U,P),P),update:(U,P)=>j(()=>B(U,P),P)}}import{tmpdir as T1}from"node:os";import{join as O1}from"node:path";var _1=["error","warn","info","debug","trace"];function M1(){return process.env.OPENCODE_OPENAI_AUTH_LOG_FILE??O1(T1(),"opencode-openai-auth.log")}function C1(){let Z=process.env.OPENCODE_OPENAI_AUTH_LOG_LEVEL;return Z&&_1.includes(Z)?Z:void 0}xZ({file:M1,level:C1});process.on("exit",ZZ);var zZ=["primary","secondary"],F1={primary:300,secondary:10080};function E1(Z,$){return h({scope:"all",label:$,windowMinutes:Z})}function c3(Z){if(!Z)return[];let $=[];for(let J of zZ){let X=Z[J];if(!X)continue;let V=X.windowMinutes,Y=V!==void 0&&Number.isFinite(V)&&V>0?V:F1[J];$.push({key:J,label:E1(V,J),window:X,windowMs:Y*60000})}return $}var f=$Z("sidebar"),y1="OPENCODE_OPENAI_AUTH_SIDEBAR_STATE_FILE";function vZ(){let Z=process.env.XDG_STATE_HOME||XZ(A1(),".local","state");return XZ(Z,"cortexkit","openai-auth","sidebar-state.json")}var hZ=XZ(k1(),"opencode-openai-auth","sidebar-state.json");function i3(Z){hZ=Z,VZ.clear()}var v1=/^[a-f0-9]{64}$/,GZ=604800000,pZ=256,mZ=3600000;function C(Z){return q1("sha256").update(Z).digest("hex")}function h1(Z){return typeof Z==="number"&&Number.isFinite(Z)&&Z>=0?Z:void 0}function gZ(Z){let $=h1(Z);return $!==void 0?{resetCredits:$}:{}}function p1(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return;let $={};for(let[J,X]of Object.entries(Z)){if(X===null||typeof X!=="object"||Array.isArray(X))continue;let V=X;if(typeof V.activeId!=="string"||typeof V.route!=="string"||typeof V.updatedAt!=="number"||!Number.isFinite(V.updatedAt))continue;$[J]={activeId:V.activeId,route:V.route,updatedAt:V.updatedAt}}return Object.keys($).length>0?$:void 0}function m1(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return;let $={};for(let[J,X]of Object.entries(Z)){if(!v1.test(J)||X===null||typeof X!=="object"||Array.isArray(X))continue;let V=X;if(typeof V.accountId!=="string"||V.accountId.length===0||typeof V.assignedAt!=="number"||!Number.isFinite(V.assignedAt)||V.assignedAt<0||typeof V.lastSeenAt!=="number"||!Number.isFinite(V.lastSeenAt)||V.lastSeenAt<0||typeof V.inputBytes!=="number"||!Number.isFinite(V.inputBytes)||V.inputBytes<0)continue;let Y=V.quotaCheckedAt;if(Y!==void 0&&(typeof Y!=="number"||!Number.isFinite(Y)||Y<0))continue;let G=V.wireAccountId;$[J]={accountId:V.accountId,assignedAt:V.assignedAt,lastSeenAt:V.lastSeenAt,inputBytes:V.inputBytes,...Y===void 0?{}:{quotaCheckedAt:Y},...typeof G==="string"?{wireAccountId:G}:{}}}return Object.keys($).length>0?$:void 0}function _(){let Z=process.env[y1];if(Z)return Z;let $=vZ();if(!VZ.has($))VZ.add($),g1($,hZ);return $}var VZ=new Set;function g1(Z,$){try{S1(w1(Z),{recursive:!0,mode:448}),I1($,Z,x1.COPYFILE_EXCL)}catch{}}var A={main:{quota:null,killed:!1},fallbacks:[],activeId:void 0,route:"main",lastUpdated:0};function c(Z){if(Z===null||typeof Z!=="object"||Array.isArray(Z))return A;let $=Z,J=$.main,X;if(J!==null&&typeof J==="object"&&!Array.isArray(J)){let U=J;X={quota:"quota"in U?U.quota:null,killed:typeof U.killed==="boolean"?U.killed:!1,...typeof U.mainAccountId==="string"?{mainAccountId:U.mainAccountId}:{},...typeof U.quotaBackedOff==="boolean"?{quotaBackedOff:U.quotaBackedOff}:{},...typeof U.quotaBackoffUntil==="number"?{quotaBackoffUntil:U.quotaBackoffUntil}:{},...typeof U.refreshBackedOff==="boolean"?{refreshBackedOff:U.refreshBackedOff}:{},...typeof U.refreshBackoffUntil==="number"?{refreshBackoffUntil:U.refreshBackoffUntil}:{},...gZ(U.resetCredits)}}else X={quota:null,killed:!1};let V=IZ($.fallbacks),Y=Array.isArray($.vaultAccounts)?IZ($.vaultAccounts):void 0,G=typeof $.activeId==="string"?$.activeId:void 0,z=typeof $.route==="string"?$.route:A.route,j=typeof $.lastUpdated==="number"?$.lastUpdated:0,D=typeof $.planType==="string"?$.planType:void 0,Q=typeof $.credits==="number"?$.credits:void 0,K=p1($.activeRouting),B=m1($.stickyAssignments);return{main:X,fallbacks:V,activeId:G,route:z,lastUpdated:j,...K!==void 0?{activeRouting:K}:{},...B!==void 0?{stickyAssignments:B}:{},...D!==void 0?{planType:D}:{},...Q!==void 0?{credits:Q}:{},...$.accountPool===!0?{accountPool:!0}:{},...Y!==void 0?{vaultAccounts:Y}:{}}}function IZ(Z){if(!Array.isArray(Z))return[];return Z.filter(($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&typeof $.id==="string").map(($)=>({id:$.id,label:typeof $.label==="string"?$.label:void 0,...typeof $.accountId==="string"?{accountId:$.accountId}:{},quota:"quota"in $?$.quota:null,killed:typeof $.killed==="boolean"?$.killed:!1,enabled:typeof $.enabled==="boolean"?$.enabled:!0,...gZ($.resetCredits)}))}function jZ(Z){return[...Z.fallbacks,...Z.vaultAccounts??[]]}async function d1(Z=_()){try{let $=await f1(Z,"utf8");return c(JSON.parse($))}catch{return A}}var c1=3600000,SZ=128;function dZ(Z,$,J=Date.now()){if(!(Z.updatedAt>=J-c1&&Z.updatedAt<=J))return!1;if($===void 0)return!0;return Z.activeId==="main"||$.some((V)=>V.enabled!==!1&&V.killed!==!0&&V.id===Z.activeId)}function u1(Z,$=Date.now()){let J=Z?.spendControl;if(J?.reached!==!0||typeof J.resetsAt!=="string")return;let X=Date.parse(J.resetsAt);if(!Number.isFinite(X)||X<=$)return;return{resetsAt:J.resetsAt,resetAtMs:X}}function l1(Z,$=Date.now()){let J;for(let V of zZ){let Y=Z?.[V];if(typeof Y?.resetsAt!=="string"||!Number.isFinite(Y.usedPercent)||Y.usedPercent<100)continue;let G=Date.parse(Y.resetsAt);if(!Number.isFinite(G)||G<=$)continue;if(!J||G<J.resetAtMs)J={resetsAt:Y.resetsAt,resetAtMs:G}}let X=u1(Z,$);if(X&&(!J||X.resetAtMs<J.resetAtMs))J=X;return J}function m(Z,$=Date.now()){return l1(Z,$)!==void 0}function r1(Z,$,J=Date.now()){if(!$||Z.route!=="sticky-balanced")return;let X=Z.stickyAssignments?.[C($)];if(!X||X.lastSeenAt<J-GZ)return;if(X.accountId==="main")return Z.main?.killed||m(Z.main?.quota,J)?void 0:"main";let V=jZ(Z).find((Y)=>Y.id===X.accountId);if(!V||V.enabled===!1||V.killed===!0||m(V.quota,J))return;return V.id}function t3(Z,$,J=Date.now()){if(!$)return{activeId:Z.activeId??"main",route:Z.route};let X=$?Z.activeRouting?.[$]:void 0,V=jZ(Z),Y=X?.activeId==="main"?Z.main.quota:V.find((Q)=>Q.id===X?.activeId)?.quota;if(X&&dZ(X,V,J)&&!m(Y,J))return{activeId:X.activeId,route:X.route};let G=r1(Z,$,J);if(G)return{activeId:G,route:Z.route};let z=Z.vaultAccounts!==void 0,j=(z?Z.vaultAccounts??[]:Z.fallbacks).filter((Q)=>Q.enabled&&!Q.killed),D=j.find((Q)=>!m(Q.quota,J))??j[0];return{activeId:(z||Z.route==="fallback-first")&&D?D.id:"main",route:Z.route}}function cZ(Z,$,J=Date.now(),X){if(!Z)return;let V=Object.entries(Z).filter(([G,z])=>G!==X&&dZ(z,$,J)),Y=V.length<=SZ?V:V.sort((G,z)=>z[1].updatedAt-G[1].updatedAt).slice(0,SZ);return Y.length>0?Object.fromEntries(Y):void 0}function k(Z,$,J=Date.now(),X){if(!Z)return;let V=0,Y=0,G=0,z=[];for(let[D,Q]of Object.entries(Z)){if(D===X){G+=1;continue}if(Q.lastSeenAt<J-GZ){Y+=1;continue}if($!==void 0&&!$.has(Q.accountId)){V+=1;continue}z.push([D,Q])}let j=V+Y+G;if(j>0)f.debug("pruned sticky assignments",{pid:process.pid,removed:j,reasons:{"account-not-in-roster":V,expired:Y,"explicit-removal":G}});return z.length>0?Object.fromEntries(z):void 0}function uZ(Z,$){let J=Object.keys(Z).length-pZ;if(J<=0)return Z;let X=new Set(Object.entries(Z).filter(([V])=>V!==$).sort(([V,Y],[G,z])=>Y.lastSeenAt-z.lastSeenAt||V.localeCompare(G)).slice(0,J).map(([V])=>V));return Object.fromEntries(Object.entries(Z).filter(([V])=>!X.has(V)))}function lZ(Z,$){if(Z===$)return!0;if(!Z||!$)return!1;let J=Object.entries(Z);if(J.length!==Object.keys($).length)return!1;return J.every(([X,V])=>Object.is($[X],V))}function rZ(Z,$,J,X){return Z!==void 0&&$.has(Z.accountId)&&!J.has(Z.accountId)&&Z.lastSeenAt>=X-GZ}function oZ(Z,$,J,X){return $>Z.inputBytes||J-Z.lastSeenAt>=mZ||Z.wireAccountId===void 0&&X!==void 0}function aZ(Z,$){return typeof Z.wireAccountId==="string"&&typeof $==="string"&&Z.wireAccountId!==$}function o1(Z){let $=new Map(Z),J={get size(){return $.size},has:(X)=>$.has(X),get:(X)=>$.get(X),entries:()=>$.entries(),keys:()=>$.keys(),values:()=>$.values(),forEach:(X,V)=>{$.forEach((Y,G)=>{X.call(V,Y,G,J)})},[Symbol.iterator]:()=>$[Symbol.iterator]()};return Object.freeze(J)}function a1(Z,$,J){let X=new Map;for(let[V,Y]of Object.entries(Z??{})){if(V===J)continue;if(Y.quotaCheckedAt!==$[Y.accountId])continue;X.set(Y.accountId,(X.get(Y.accountId)??0)+Y.inputBytes)}return o1(X)}function UZ(Z){if(Z===void 0)return;return new Set(["main",...Z.filter(($)=>$.enabled!==!1&&$.killed!==!0).map(($)=>$.id)])}var YZ=Promise.resolve();function M(Z){let $=YZ.then(Z);return YZ=$.catch(()=>{}),$}var bZ=new Map;function BZ(Z){let $=bZ.get(Z);if(!$)$=e({path:Z,defaultValue:A,normalize:c,secureDir:Z===vZ(),logger:f}),bZ.set(Z,$);return $}var JZ=new Set;async function sZ(Z,$){try{await $}catch(J){let X={pid:process.pid,error:J instanceof Error?J.message:String(J)};if(JZ.has(Z))f.debug("sidebar write failed again",X);else JZ.add(Z),f.warn("sidebar write failed",X);throw J}if(JZ.delete(Z))f.info("sidebar write recovered",{pid:process.pid})}function e3(Z,$=_()){return M(()=>sZ($,BZ($).write(c(Z))))}function s1(Z){return BZ(Z).read()}function F(Z,$,J){let X=Symbol("sidebar authority changed");return sZ(Z,BZ(Z).update((V)=>{if(J?.canWrite&&!J.canWrite())return;let Y=$(V);return Y===void 0?void 0:c(Y)},{beforeRecheck:async(...V)=>{if(await J?.beforeRecheck?.(...V),J?.canWrite&&!J.canWrite())throw X}}).catch((V)=>{if(V!==X)throw V}))}function g(Z){let $;for(let J of[Z?.primary?.checkedAt,Z?.secondary?.checkedAt,Z?.checkedAt])if(typeof J==="number"&&Number.isFinite(J))$=$===void 0?J:Math.max($,J);return $}function fZ(Z,$){let J=g(Z),X=g($);if(X!==void 0&&(J===void 0||X>J))return $;return Z}function AZ(Z,$){return Z!==void 0&&$!==void 0&&Z===$}function d(Z,$){let J=Z?.checkedAt;if(typeof J==="number"&&Number.isFinite(J))return J;if(typeof $==="number"&&Number.isFinite($))return $;return}function kZ(Z,$,J,X,V){if(Z&&$){let Y=d(Z,X),G=d($,V);if(G!==void 0&&(Y===void 0||G>Y))return $;return Z}return J?$:Z}function wZ(Z,$){if(Z.spendControl!==void 0)return Z.spendControl;if(Z.spendControlCleared===!0)return;return $.spendControl}function yZ(Z,$){if(!Z)return $;if(!$)return Z;let J=g(Z),X=g($),V=X!==void 0&&(J===void 0||X>J),Y=kZ(Z.primary,$.primary,V,Z.checkedAt,$.checkedAt),G=kZ(Z.secondary,$.secondary,V,Z.checkedAt,$.checkedAt),z=V?wZ($,Z):wZ(Z,$),j=z===void 0&&(Z.spendControlCleared===!0||$.spendControlCleared===!0),D;for(let U of[d(Y),d(G)])if(U!==void 0)D=D===void 0?U:Math.max(D,U);let{spendControl:Q,spendControlCleared:K,...B}=Z;return{...B,primary:Y,secondary:G,...z!==void 0?{spendControl:z}:{},...j?{spendControlCleared:!0}:{},checkedAt:D??Z.checkedAt}}function Z4(Z,$=_(),J){return M(async()=>{await F($,(X)=>{let V=new Map(X.fallbacks.map((Q)=>[Q.id,Q])),Y=Z.vaultAccounts!==void 0,G=AZ(Z.main.mainAccountId,X.main.mainAccountId),z=G?yZ(Z.main.quota,X.main.quota):fZ(Z.main.quota,X.main.quota),j=Date.now(),D=k(X.stickyAssignments,UZ(jZ(Z)),j);return{...X,...Z,main:Y?Z.main:{...Z.main,quota:z,mainAccountId:G?Z.main.mainAccountId:z===X.main.quota&&z!==Z.main.quota?X.main.mainAccountId:Z.main.mainAccountId},fallbacks:Y?Z.fallbacks:Z.fallbacks.map((Q)=>{let K=V.get(Q.id),B=AZ(Q.accountId,K?.accountId),U=B?yZ(Q.quota,K?.quota??null):fZ(Q.quota,K?.quota??null);return{...Q,quota:U,accountId:B?Q.accountId:U===K?.quota&&U!==Q.quota?K?.accountId:Q.accountId}}),activeId:X.activeId,activeRouting:X.activeRouting,stickyAssignments:D,lastUpdated:Math.max(j,X.lastUpdated+1),accountPool:Z.accountPool===!0?!0:void 0,vaultAccounts:Z.vaultAccounts}},J)})}function $4(Z,$,J=_(),X){return M(async()=>{await F(J,(V)=>{let Y=cZ({...V.activeRouting,[Z.sessionId]:{activeId:Z.activeId,route:Z.route,updatedAt:Z.updatedAt}},$,Date.now()),G=k(V.stickyAssignments,UZ($),Date.now());return{...V,activeId:Z.activeId,route:Z.route,activeRouting:Y,stickyAssignments:G,lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}},X)})}function J4(Z,$=_(),J){return M(async()=>{await F($,(X)=>({...X,activeId:Z.activeId,route:Z.route,lastUpdated:Math.max(Date.now(),X.lastUpdated+1)}),J)})}function X4(Z,$,J=_(),X){return M(async()=>{await F(J,(V)=>{let Y=Date.now(),G=cZ(V.activeRouting,$,Y,Z),z=k(V.stickyAssignments,UZ($),Y,C(Z));return{...V,activeRouting:G,stickyAssignments:z,lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}},X)})}function nZ(Z,$){return rZ(Z,new Set($.validPinnedAccountIds),new Set($.excludeAccountIds),$.now)&&!aZ(Z,$.wireAccountIdByAccount?.[Z.accountId])&&!oZ(Z,$.requestBytes,$.now,$.wireAccountIdByAccount?.[Z.accountId])}function iZ(Z,$){let J=C($.sessionId),X=new Set($.validPinnedAccountIds),V=new Set($.excludeAccountIds),Y=k(Z.stickyAssignments,X,$.now),G=!lZ(Z.stickyAssignments,Y),z=Y?.[J],j=z!==void 0&&aZ(z,$.wireAccountIdByAccount?.[z.accountId]);if(rZ(z,X,V,$.now)&&!j){let K=oZ(z,$.requestBytes,$.now,$.wireAccountIdByAccount?.[z.accountId]),B=K?{...z,inputBytes:Math.max(z.inputBytes,$.requestBytes),...z.wireAccountId===void 0&&$.wireAccountIdByAccount?.[z.accountId]!==void 0?{wireAccountId:$.wireAccountIdByAccount?.[z.accountId]}:{},...$.now-z.lastSeenAt>=mZ?{lastSeenAt:$.now}:{}}:z;if(!G&&!K)return{assignment:B,next:void 0};return{assignment:B,next:{...Z,stickyAssignments:{...Y,[J]:B},lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}let D=$.choose(a1(Y,$.quotaCheckedAtByAccount,j?J:void 0));if(!D){if(!G)return{assignment:void 0,next:void 0};return{assignment:void 0,next:{...Z,stickyAssignments:Y,lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}let Q={accountId:D.accountId,assignedAt:$.now,lastSeenAt:$.now,inputBytes:$.requestBytes,...D.quotaCheckedAt===void 0?{}:{quotaCheckedAt:D.quotaCheckedAt},...$.wireAccountIdByAccount?.[D.accountId]===void 0?{}:{wireAccountId:$.wireAccountIdByAccount?.[D.accountId]}};return{assignment:Q,next:{...Z,stickyAssignments:uZ({...Y,[J]:Q},J),lastUpdated:Math.max($.now,Z.lastUpdated+1)}}}async function V4(Z,$=_(),J){let X=C(Z.sessionId),V=(await s1($)).stickyAssignments?.[X];if(nZ(V,Z))return V;let Y;return await M(async()=>{await F($,(G)=>{let z=iZ(G,Z);return Y=z.assignment,z.next},J)}),Y}function Y4(Z,$){let J=Z.stickyAssignments?.[C($.sessionId)];if(nZ(J,$))return{assignment:J,next:void 0};return iZ(Z,$)}function z4(Z,$=_()){let J=C(Z.sessionId),X=new Set(Z.validPinnedAccountIds);return M(async()=>{await F($,(V)=>{let Y=Date.now(),G=k(V.stickyAssignments,X,Y),z=G?.[J];if(z&&z.assignedAt>Z.assignment.assignedAt){if(lZ(V.stickyAssignments,G))return;return{...V,stickyAssignments:G,lastUpdated:Math.max(Y,V.lastUpdated+1)}}let D=z!==void 0&&z.accountId===Z.assignment.accountId&&z.assignedAt===Z.assignment.assignedAt?{...Z.assignment,inputBytes:Math.max(z.inputBytes,Z.assignment.inputBytes),lastSeenAt:Math.max(z.lastSeenAt,Z.assignment.lastSeenAt)}:Z.assignment;return{...V,stickyAssignments:uZ({...G,[J]:D},J),lastUpdated:Math.max(Y,V.lastUpdated+1)}})})}async function G4(Z,$=_()){let J=C(Z),X=!1;return await M(async()=>{await F($,(V)=>{let Y=V.stickyAssignments;if(Y?.[J]===void 0){X=!1;return}X=!0;let{[J]:G,...z}=Y;return{...V,...Object.keys(z).length>0?{stickyAssignments:z}:{stickyAssignments:void 0},lastUpdated:Math.max(Date.now(),V.lastUpdated+1)}})}),X}function j4(){return YZ}var n1=500;function i1(Z,$,J){return new Promise((X,V)=>{let Y=setTimeout(()=>X(J()),$);Y.unref?.(),Z.then((G)=>{clearTimeout(Y),X(G)},(G)=>{clearTimeout(Y),V(G)})})}function U4(Z,$={}){let J=$.readBudgetMs??n1,X,V,Y=()=>{try{let z=b1(Z);return`${z.ino}:${z.size}:${z.mtimeMs}`}catch{return}},G=(z)=>{if(V&&V.key===z)return V.promise;let j=Date.now(),D=d1(Z).then((B)=>{if(!X||X.readAt<=j)X={state:B,readAt:j,key:z};return{state:B,readAt:j}}),Q={key:z,promise:D};V=Q;let K=()=>{if(V===Q)V=void 0};return D.then(K,K),D};return{get(){let z=Y();if(X&&X.key===z)return Promise.resolve({state:X.state,readAt:X.readAt});return i1(G(z),J,()=>X?{state:X.state,readAt:X.readAt}:{state:A,readAt:0})},read(){return G(Y())},refreshInBackground(){let z=Y();if(X?.key===z)return;G(z)}}}function B4(Z,$,J){let X={assignment:J};Z.delete($),Z.set($,X);while(Z.size>pZ){let V=Z.keys().next().value;if(V===void 0)break;Z.delete(V)}return X}function Q4(Z,$){if($.size===0)return Z.state;let J={...Z.state.stickyAssignments},X=!1;for(let[V,Y]of $){if(Y.persistedAt!==void 0&&Z.readAt>Y.persistedAt){$.delete(V);continue}J[V]=Y.assignment,X=!0}if(!X)return Z.state;return{...Z.state,stickyAssignments:J}}function K4(Z){let $=Z.retryDelayMs??500,J=Z.maxRetryDelayMs??30000,X=new Map,V=new Map,Y=new Set,G=0,z=$,j,D=!1,Q=()=>{if(j||D||V.size===0)return;j=setTimeout(()=>{j=void 0;let B=[...V];V.clear(),z=Math.min(z*2,J);for(let[U,P]of B){let W=X.get(U);if(W!==void 0)K(U,P.label,P.write,W)}},z),j.unref?.()},K=(B,U,P,W)=>{let H;try{H=P()}catch(O){H=Promise.reject(O)}H.then(()=>{if(X.get(B)!==W)return;if(X.delete(B),Y.delete(B))Z.logger.info("sidebar bookkeeping write recovered",{pid:process.pid,write:U});if(Y.size===0)z=$;Z.onWritten?.()},(O)=>{if(X.get(B)!==W)return;let R={pid:process.pid,write:U,error:O instanceof Error?O.message:String(O)};if(D){X.delete(B),Z.logger.debug("sidebar bookkeeping write dropped",R);return}if(Y.has(B))Z.logger.debug("sidebar bookkeeping write failed again",R);else Y.add(B),Z.logger.warn("sidebar bookkeeping write failed; retrying in the background",R);V.set(B,{label:U,write:P}),Q()})};return{enqueue(B,U,P){G+=1,X.set(B,G),V.delete(B),K(B,U,P,G)},cancel(B){X.delete(B),V.delete(B),Y.delete(B)},stop(){if(D=!0,j)clearTimeout(j);j=void 0,V.clear()}}}function D4(Z){let $=Z.activeId;if(Z.vaultAccounts!==void 0){let J=Z.vaultAccounts.filter((V)=>V.enabled),X=J.find((V)=>V.id===$)??J[0];return X?{id:X.id,name:X.label??X.id,quota:X.quota,killed:X.killed}:{id:"vault",name:"vault",quota:null,killed:!1}}if($&&$!=="main"){let J=Z.fallbacks.find((X)=>X.enabled&&X.id===$);if(J)return{id:J.id,name:J.label??J.id,quota:J.quota,killed:J.killed}}return{id:"main",name:"main",quota:Z.main.quota,killed:Z.main.killed}}function t1(Z,$=Date.now()){if(!Z)return;return s({limits:zZ.flatMap((J)=>{let X=Z[J];return X?[{kind:"reading",scope:"all",label:J,usedPercent:X.usedPercent,checkedAt:X.checkedAt??Z.checkedAt??$,windowMinutes:X.windowMinutes,resetsAt:X.resetsAt}]:[]}),...Z.spendControl?{budget:{...Z.spendControl,kind:"reading",checkedAt:Z.checkedAt??$}}:{}})}function P4(Z,$=Date.now()){let J=Z?.primary?.usedPercent??null,X=Z?.secondary?.usedPercent??null,V=t1(Z,$);return{primaryUsedPercent:J,secondaryUsedPercent:X,text:!V||V.limits.length===0&&!V.budget?null:a(V,{now:$,form:"compact"})}}var e1=300000,Z3=0.01,$3=1;function W4(Z,$,J){if(!Z.resetsAt)return null;let X=new Date(Z.resetsAt).getTime();if(!Number.isFinite(X))return null;let V=X-$,Y=J-V;if(Y<e1)return null;if(Y<$*Z3)return null;if(Y>=$)return null;let G=Z.usedPercent,z=Math.min(Math.max(Y/$*100,0),100),j=G-z,D=Math.abs(j)<$3?"on-pace":j>0?"deficit":"reserve",Q=null;if(G>0){let K=Y*100/G,B=V+K;if(B<X)Q=new Date(B).toISOString()}return{pacePercent:z,deltaPercent:j,state:D,runsOutAt:Q}}
2
2
  export{L as La,tZ as Ma,I as Na,o as Oa,G1 as Pa,h as Qa,qZ as Ra,a as Sa,s as Ta,D1 as Ua,P1 as Va,W1 as Wa,E1 as Xa,c3 as Ya,i3 as Za,GZ as _a,pZ as $a,C as ab,_ as bb,A as cb,c as db,d1 as eb,c1 as fb,SZ as gb,dZ as hb,u1 as ib,l1 as jb,m as kb,r1 as lb,t3 as mb,cZ as nb,k as ob,e3 as pb,Z4 as qb,$4 as rb,J4 as sb,X4 as tb,iZ as ub,V4 as vb,Y4 as wb,z4 as xb,G4 as yb,j4 as zb,n1 as Ab,i1 as Bb,U4 as Cb,B4 as Db,Q4 as Eb,K4 as Fb,D4 as Gb,t1 as Hb,P4 as Ib,W4 as Jb};
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { c as TokenResponse, d as parseJwtClaims, f as AccountPaths, l as beginAccountLogin, p as PoolStore, r as OpenAiVault, s as IdTokenClaims, t as PoolLifecycleDeps, u as extractAccountIdFromClaims } from "./pool-lifecycle-DbDmgabd.js";
1
+ import { c as TokenResponse, d as parseJwtClaims, f as AccountPaths, l as beginAccountLogin, p as PoolStore, r as OpenAiVault, s as IdTokenClaims, t as PoolLifecycleDeps, u as extractAccountIdFromClaims } from "./pool-lifecycle-YLz2B8A5.js";
2
2
  import { _ as SidebarMachineState, b as SidebarState } from "./sidebar-state-D6cUKgkm.js";
3
3
  import { Hooks, Plugin, PluginInput } from "@opencode-ai/plugin";
4
4
  //#region ../core/dist/provider.d.ts
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{Aa as u,Ba as v,Ca as w,Da as x,Ea as y,Fa as z,Ga as A,Ha as B,Ia as C,Ja as D,Ka as E,e as a,f as b,ia as c,ja as d,ka as e,la as f,ma as g,na as h,oa as i,pa as j,qa as k,ra as l,sa as m,ta as n,ua as o,va as p,wa as q,xa as r,ya as s,za as t}from"./index-m9d2bfkn.js";import"./index-eqh53k8v.js";import"./index-jyr8y8k4.js";import"./index-rv08jmd4.js";import"./index-8kj7sa1p.js";import"./index-bmd7x5aq.js";import"./index-766sfrh5.js";import"./index-b3q3j39x.js";export{B as rewriteResponsesLiteBody,z as resolveSidebarSessionId,a as parseJwtClaims,w as mergePushedQuotaMetadata,k as getMainRefreshLockName,v as findCachekeepFallbackAccount,b as extractAccountIdFromClaims,E as default,r as createResetTargetResolver,e as codexOAuthModelListed,f as codexOAuthModelLimit,y as buildSidebarState,x as buildSidebarMachineState,s as buildResetRedemptionDeps,o as __resetBootQuotaSeedForTest,t as __menuContextForTest,n as __bootQuotaSeedPromiseForTest,q as ResetTargetResolutionError,h as RESPONSES_LITE_MODELS,u as POOL_MIGRATION_ENABLED,D as OpenAIAuthPlugin,A as MID_CONVERSATION_EFFORT_MODELS,l as MAIN_REFRESH_LOCK_TTL_MS,m as MAIN_REFRESH_LEASE_TTL_MS,g as EMPTY_BEARER_MESSAGE,d as DISALLOWED_MODELS,C as CodexAuthPlugin,i as CODEX_VERSION,j as CODEX_USER_AGENT,p as AuthPersistError,c as ALLOWED_MODELS};
1
+ import{Aa as u,Ba as v,Ca as w,Da as x,Ea as y,Fa as z,Ga as A,Ha as B,Ia as C,Ja as D,Ka as E,c as a,d as b,ia as c,ja as d,ka as e,la as f,ma as g,na as h,oa as i,pa as j,qa as k,ra as l,sa as m,ta as n,ua as o,va as p,wa as q,xa as r,ya as s,za as t}from"./index-ff1jy44a.js";import"./index-sjx8t1nr.js";import"./index-jyr8y8k4.js";import"./index-rv08jmd4.js";import"./index-8kj7sa1p.js";import"./index-bmd7x5aq.js";import"./index-766sfrh5.js";import"./index-b3q3j39x.js";export{B as rewriteResponsesLiteBody,z as resolveSidebarSessionId,a as parseJwtClaims,w as mergePushedQuotaMetadata,k as getMainRefreshLockName,v as findCachekeepFallbackAccount,b as extractAccountIdFromClaims,E as default,r as createResetTargetResolver,e as codexOAuthModelListed,f as codexOAuthModelLimit,y as buildSidebarState,x as buildSidebarMachineState,s as buildResetRedemptionDeps,o as __resetBootQuotaSeedForTest,t as __menuContextForTest,n as __bootQuotaSeedPromiseForTest,q as ResetTargetResolutionError,h as RESPONSES_LITE_MODELS,u as POOL_MIGRATION_ENABLED,D as OpenAIAuthPlugin,A as MID_CONVERSATION_EFFORT_MODELS,l as MAIN_REFRESH_LOCK_TTL_MS,m as MAIN_REFRESH_LEASE_TTL_MS,g as EMPTY_BEARER_MESSAGE,d as DISALLOWED_MODELS,C as CodexAuthPlugin,i as CODEX_VERSION,j as CODEX_USER_AGENT,p as AuthPersistError,c as ALLOWED_MODELS};
@@ -2002,6 +2002,10 @@ interface ClaustrumEnrollmentPaths {
2002
2002
  tokenPath: string;
2003
2003
  }
2004
2004
  //#endregion
2005
+ //#region ../core/dist/pool-routing.d.ts
2006
+ /** Existing callbacks may return a promise for an in-progress quota poll. */
2007
+ type QuotaReadingRequest = ((id: string) => void) | ((id: string) => Promise<unknown> | undefined);
2008
+ //#endregion
2005
2009
  //#region ../core/dist/vault.d.ts
2006
2010
  type VaultHost = 'opencode' | 'pi';
2007
2011
  interface VaultPaths extends ClaustrumEnrollmentPaths {
@@ -2145,7 +2149,7 @@ declare class OpenAiVault {
2145
2149
  * the background; a failure is logged.
2146
2150
  */
2147
2151
  recordSnapshot(routeId: string, snapshot: unknown, complete: boolean, receipt: QuotaReceipt): Promise<void>;
2148
- /** Takes one quota reading for a vault account through the usage endpoint. */
2152
+ /** Joins an existing quota poll, or starts one through the usage endpoint. */
2149
2153
  pollQuota(routeId: string): Promise<{
2150
2154
  ok: boolean;
2151
2155
  error?: string;
@@ -2155,7 +2159,7 @@ declare class OpenAiVault {
2155
2159
  * because it has no reading yet. At most one reading per account is in
2156
2160
  * flight.
2157
2161
  */
2158
- requestReading(routeId: string): void;
2162
+ requestReading(routeId: string): ReturnType<QuotaReadingRequest>;
2159
2163
  /** Readings for the routable vault accounts whose last one is older than `maxAgeMs`. */
2160
2164
  pollStale(maxAgeMs: number): Promise<Array<{
2161
2165
  id: string;
@@ -1 +1 @@
1
- import{$a as e,Ab as F,Bb as G,Cb as H,Db as I,Eb as J,Fb as K,Gb as L,Hb as M,Ib as N,Jb as O,Xa as a,Ya as b,Za as c,_a as d,ab as f,bb as g,cb as h,db as i,eb as j,fb as k,gb as l,hb as m,ib as n,jb as o,kb as p,lb as q,mb as r,nb as s,ob as t,pb as u,qb as v,rb as w,sb as x,tb as y,ub as z,vb as A,wb as B,xb as C,yb as D,zb as E}from"./index-eqh53k8v.js";import"./index-jyr8y8k4.js";import"./index-bmd7x5aq.js";import"./index-b3q3j39x.js";export{w as upsertSidebarActiveRouting,n as spendControlExhaustedResetAt,M as sidebarQuotaProjection,G as settleWithinBudget,u as setSidebarState,v as setSidebarMachineState,x as setSidebarLegacyRouting,c as setLegacySidebarStateFileForTest,A as resolveSidebarStickyAssignment,q as resolveSessionStickyAccount,r as resolveSessionSidebarRouting,L as resolveActiveAccount,y as removeSidebarActiveRouting,I as rememberStickyPin,t as pruneStickyAssignments,s as pruneActiveRouting,B as planSidebarStickyAssignmentFromSnapshot,z as planSidebarStickyAssignment,C as persistSidebarStickyAssignment,i as normalizeSidebarState,m as isUsableRoutingEntry,p as isQuotaExhausted,f as hashSidebarSessionId,g as getSidebarStateFile,j as getSidebarState,b as getPresentQuotaWindows,N as getCollapsedQuotaSummary,a as formatWindowLabel,o as exhaustedQuotaResetAt,E as drainSidebarWrites,H as createSidebarStateCache,K as createSidebarBookkeepingQueue,O as computeQuotaPacing,D as clearSidebarStickyAssignment,J as applyStickyPinOverlay,e as STICKY_ASSIGNMENT_MAX_ENTRIES,d as STICKY_ASSIGNMENT_MAX_AGE_MS,F as HOT_PATH_READ_BUDGET_MS,h as DEFAULT_SIDEBAR_STATE,l as ACTIVE_ROUTING_MAX_ENTRIES,k as ACTIVE_ROUTING_MAX_AGE_MS};
1
+ import{$a as e,Ab as F,Bb as G,Cb as H,Db as I,Eb as J,Fb as K,Gb as L,Hb as M,Ib as N,Jb as O,Xa as a,Ya as b,Za as c,_a as d,ab as f,bb as g,cb as h,db as i,eb as j,fb as k,gb as l,hb as m,ib as n,jb as o,kb as p,lb as q,mb as r,nb as s,ob as t,pb as u,qb as v,rb as w,sb as x,tb as y,ub as z,vb as A,wb as B,xb as C,yb as D,zb as E}from"./index-sjx8t1nr.js";import"./index-jyr8y8k4.js";import"./index-bmd7x5aq.js";import"./index-b3q3j39x.js";export{w as upsertSidebarActiveRouting,n as spendControlExhaustedResetAt,M as sidebarQuotaProjection,G as settleWithinBudget,u as setSidebarState,v as setSidebarMachineState,x as setSidebarLegacyRouting,c as setLegacySidebarStateFileForTest,A as resolveSidebarStickyAssignment,q as resolveSessionStickyAccount,r as resolveSessionSidebarRouting,L as resolveActiveAccount,y as removeSidebarActiveRouting,I as rememberStickyPin,t as pruneStickyAssignments,s as pruneActiveRouting,B as planSidebarStickyAssignmentFromSnapshot,z as planSidebarStickyAssignment,C as persistSidebarStickyAssignment,i as normalizeSidebarState,m as isUsableRoutingEntry,p as isQuotaExhausted,f as hashSidebarSessionId,g as getSidebarStateFile,j as getSidebarState,b as getPresentQuotaWindows,N as getCollapsedQuotaSummary,a as formatWindowLabel,o as exhaustedQuotaResetAt,E as drainSidebarWrites,H as createSidebarStateCache,K as createSidebarBookkeepingQueue,O as computeQuotaPacing,D as clearSidebarStickyAssignment,J as applyStickyPinOverlay,e as STICKY_ASSIGNMENT_MAX_ENTRIES,d as STICKY_ASSIGNMENT_MAX_AGE_MS,F as HOT_PATH_READ_BUDGET_MS,h as DEFAULT_SIDEBAR_STATE,l as ACTIVE_ROUTING_MAX_ENTRIES,k as ACTIVE_ROUTING_MAX_AGE_MS};
@@ -1,4 +1,4 @@
1
- import { a as BeginAccountLoginOptions, f as AccountPaths, i as OpenAiVaultOptions, n as HostSlotAdapter, o as BeginAccountLoginResult, t as PoolLifecycleDeps } from "../pool-lifecycle-DbDmgabd.js";
1
+ import { a as BeginAccountLoginOptions, f as AccountPaths, i as OpenAiVaultOptions, n as HostSlotAdapter, o as BeginAccountLoginResult, t as PoolLifecycleDeps } from "../pool-lifecycle-YLz2B8A5.js";
2
2
  import { Plugin } from "@opencode/plugin";
3
3
  import "@opencode/plugin/promise/session";
4
4
  import "@opencode/plugin/promise/integration";
package/dist/v2/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import{$ as F1,A as N1,Aa as W$,B as D1,C as a1,D as o1,E as r1,F as t1,G as e1,Ga as t2,H as I2,Ha as e2,I as $$,J as A1,K as Y$,Ka as H$,L as Z$,M as K$,N as O1,O as x1,P as k2,Q as j2,R as U2,S as z$,T as X$,U as J$,V as j$,W as v2,X as Q$,Y as G$,Z as R2,_ as C1,aa as P1,ba as T1,c as h1,ca as M1,d as f1,da as L1,e as W2,ea as B$,f as H2,fa as V$,g as l1,ga as V2,h as p1,ha as _1,i as J1,j as j1,k as Q1,ka as w1,l as E1,la as I1,m as R1,n as c1,na as a2,o as d1,oa as o2,p as G1,pa as r2,q as i1,r as B1,s as V1,t as W1,u as H1,v as N2,w as n1,x as B2,y as s1,z as U1}from"../index-m9d2bfkn.js";import{Na as X1}from"../index-eqh53k8v.js";import"../index-jyr8y8k4.js";import"../index-rv08jmd4.js";import"../index-8kj7sa1p.js";import{gc as J2}from"../index-bmd7x5aq.js";import"../index-766sfrh5.js";import{wc as g1,xc as u1}from"../index-b3q3j39x.js";class d extends Error{kind;providerID;sessionID;requestKind;constructor($){super($.message??`${$.providerID} ${$.requestKind} request refused (${$.kind})`);this.name="OpenCode2AuthError",this.kind=$.kind,this.providerID=$.providerID,this.sessionID=$.sessionID,this.requestKind=$.requestKind}}function s($){return`common-auth-placeholder.${$}`}function i2($){let Z=s($.integrationID);return{type:"oauth",methodID:$.methodID,access:Z,refresh:Z,expires:$.now+31536000000,metadata:{["commonAuthPlaceholder"]:!0}}}function z2($,Z){if($?.type!=="oauth")return!1;let X=Z===void 0?void 0:s(Z),z=(j)=>X===void 0?j.startsWith("common-auth-placeholder."):j===X;return z($.access)&&z($.refresh)}var n2="No browser sign-in: this connects the plugin to the accounts in its vault.";async function M2($,Z){let X=Z.now??Date.now,{integrationID:z}=Z,j=(P)=>i2({integrationID:z,methodID:P,now:X()}),B=async(P,A)=>{return await Z.onLogin(P,{integrationID:z,methodID:A}),j(A)},F=(P)=>async(A)=>{let H=P.method.id,W=await P.authorize(A),O={url:W.url,instructions:W.instructions,...W.expiresAt===void 0?{}:{expiresAt:W.expiresAt}};if(W.mode==="auto")return{...O,mode:"auto",callback:W.callback.then((x)=>B(x,H))};let w=W.callback;return{...O,mode:"code",callback:async(x)=>B(await w(x),H)}};return $.integration.transform((P)=>{let A=Z.label===void 0?{}:{label:()=>Z.label};for(let O of Z.methods)P.method.update({integrationID:z,method:O.method,authorize:F(O),refresh:async(w)=>{if(!z2(w,z))throw Error("This login method refreshes only its pool placeholder; sign in again with the plugin's login method.");return j(w.methodID)},...A});let H=Z.vault;if(H===void 0)return;let W=H.method.id;P.method.update({integrationID:z,method:H.method,authorize:async()=>({url:"",instructions:H.instructions??n2,mode:"auto",callback:Promise.resolve().then(()=>H.activate({integrationID:z,methodID:W})).then(()=>j(W))}),refresh:async(O)=>{if(!z2(O,z)||O.methodID!==W)throw Error("This login method refreshes only its vault placeholder; choose the plugin's vault login method again.");return j(W)},...A})})}function F$($){let Z=[],X;for(let z of $.split(/\r?\n/))if(z.startsWith("data:"))Z.push(z.slice(5).replace(/^ /,""));else if(z.startsWith("event:"))X=z.slice(6).trim();if(Z.length===0)return;return X===void 0?{data:Z.join(`
1
+ import{$ as P1,A as f1,Aa as W$,B as a1,C as o1,D as r1,E as t1,F as e1,G as I2,Ga as t2,H as $$,Ha as e2,I as O1,J as Y$,K as Z$,Ka as H$,L as K$,M as b1,N as E1,O as k2,P as G2,Q as C2,R as z$,S as X$,T as J$,U as j$,V as h2,W as G$,X as Q$,Y as R2,Z as N1,_ as F1,aa as T1,ba as M1,c as H2,ca as L1,d as U2,da as _1,e as l1,ea as B$,f as p1,fa as V$,g as J1,ga as W2,h as j1,ha as q1,i as G1,j as R1,k as A1,ka as I1,l as c1,la as h1,m as d1,n as Q1,na as a2,o as i1,oa as o2,p as B1,pa as r2,q as V1,r as W1,s as H1,t as N2,u as n1,v as V2,w as s1,x as U1,y as C1,z as D1}from"../index-ff1jy44a.js";import{Na as X1}from"../index-sjx8t1nr.js";import"../index-jyr8y8k4.js";import"../index-rv08jmd4.js";import"../index-8kj7sa1p.js";import{gc as j2}from"../index-bmd7x5aq.js";import"../index-766sfrh5.js";import{wc as g1,xc as u1}from"../index-b3q3j39x.js";class c extends Error{kind;providerID;sessionID;requestKind;constructor($){super($.message??`${$.providerID} ${$.requestKind} request refused (${$.kind})`);this.name="OpenCode2AuthError",this.kind=$.kind,this.providerID=$.providerID,this.sessionID=$.sessionID,this.requestKind=$.requestKind}}function a($){return`common-auth-placeholder.${$}`}function i2($){let Z=a($.integrationID);return{type:"oauth",methodID:$.methodID,access:Z,refresh:Z,expires:$.now+31536000000,metadata:{["commonAuthPlaceholder"]:!0}}}function X2($,Z){if($?.type!=="oauth")return!1;let X=Z===void 0?void 0:a(Z),z=(j)=>X===void 0?j.startsWith("common-auth-placeholder."):j===X;return z($.access)&&z($.refresh)}var n2="No browser sign-in: this connects the plugin to the accounts in its vault.";async function M2($,Z){let X=Z.now??Date.now,{integrationID:z}=Z,j=(F)=>i2({integrationID:z,methodID:F,now:X()}),B=async(F,O)=>{return await Z.onLogin(F,{integrationID:z,methodID:O}),j(O)},q=(F)=>async(O)=>{let H=F.method.id,W=await F.authorize(O),k={url:W.url,instructions:W.instructions,...W.expiresAt===void 0?{}:{expiresAt:W.expiresAt}};if(W.mode==="auto")return{...k,mode:"auto",callback:W.callback.then((S)=>B(S,H))};let b=W.callback;return{...k,mode:"code",callback:async(S)=>B(await b(S),H)}};return $.integration.transform((F)=>{let O=Z.label===void 0?{}:{label:()=>Z.label};for(let k of Z.methods)F.method.update({integrationID:z,method:k.method,authorize:q(k),refresh:async(b)=>{if(!X2(b,z))throw Error("This login method refreshes only its pool placeholder; sign in again with the plugin's login method.");return j(b.methodID)},...O});let H=Z.vault;if(H===void 0)return;let W=H.method.id;F.method.update({integrationID:z,method:H.method,authorize:async()=>({url:"",instructions:H.instructions??n2,mode:"auto",callback:Promise.resolve().then(()=>H.activate({integrationID:z,methodID:W})).then(()=>j(W))}),refresh:async(k)=>{if(!X2(k,z)||k.methodID!==W)throw Error("This login method refreshes only its vault placeholder; choose the plugin's vault login method again.");return j(W)},...O})})}function F$($){let Z=[],X;for(let z of $.split(/\r?\n/))if(z.startsWith("data:"))Z.push(z.slice(5).replace(/^ /,""));else if(z.startsWith("event:"))X=z.slice(6).trim();if(Z.length===0)return;return X===void 0?{data:Z.join(`
2
2
  `)}:{event:X,data:Z.join(`
3
- `)}}function L2($,Z){let X=new TextDecoder,z="",j=(F)=>{let P=F$(F);if(!P)return;try{$(P)}catch(A){Z(A)}},B=()=>{for(;;){let F=/\r?\n\r?\n/.exec(z);if(!F)return;let P=z.slice(0,F.index);z=z.slice(F.index+F[0].length),j(P)}};return new TransformStream({transform(F,P){P.enqueue(F),z+=X.decode(F,{stream:!0}),B()},flush(){if(z+=X.decode(),B(),z.trim()!=="")j(z);z=""}})}var s2=512,$2="x-common-auth-attempt",e=($,Z)=>JSON.stringify([$,Z]),a=($)=>({providerID:$.model.providerID,modelID:$.model.id,sessionID:$.sessionID,agent:$.agent,kind:$.kind});function P$($){let Z=$.headers;return typeof Z==="object"&&Z!==null}function T$($,Z){let X=$.getReader();return new ReadableStream({async pull(z){let j;try{j=await X.read()}catch(B){Z({reason:"failed",message:B instanceof Error?B.message:String(B)}),z.error(B);return}if(j.done)Z(),z.close();else z.enqueue(j.value)},async cancel(z){Z({reason:"cancelled",...z===void 0?{}:{message:String(z)}}),await X.cancel(z)}})}function _2($,Z){for(let[X,z]of Object.entries(Z)){let j=X.toLowerCase();for(let B of Object.keys($))if(B.toLowerCase()===j)delete $[B];if(z!==null)$[X]=z}}function M$($,Z){for(let[X,z]of Object.entries(Z))if(z===null)$.delete(X);else $.set(X,z)}async function q2($,Z,X={}){let{providerID:z}=Z,j=X.gateOnPlaceholder,B=(Y)=>j===void 0||j.credential(Y)===s(z),F=X.logger,P=Math.max(1,X.maxRecords??s2),A=[...X.hostCredentials??[s(z)],...j?[s(z)]:[]].filter((Y)=>Y!==""),H=new Map,W=new WeakMap,O=new Map,w=new Set,x=new Map,b=!1,r=!1,c=new Map,v=0,u=!1,m=new Map,I=(Y,K)=>{try{F?.warn(Y,K)}catch{}},J=(Y)=>Y instanceof Error?Y.message:String(Y),V=async(Y,K)=>{let Q=c.get(Y);if(!Q||Q.size===0)return;await Promise.all([...Q].map(async(G)=>{try{await G(K)}catch(_){I("opencode2 auth listener threw; the request is unaffected",{event:Y,error:J(_)})}}))},M=async(Y,K)=>{try{await Z.onAttemptEnd?.(Y,K)}catch(Q){I("opencode2 auth onAttemptEnd threw; the request is unaffected",{attemptId:Y.attemptId,error:J(Q)})}},T=(Y,K)=>{if(Y.ended||!Y.attempt)return;let Q={...Y.status===void 0?{}:{status:Y.status},outputStarted:Y.outputStarted,...Y.limit?{limit:Y.limit.signal}:{},...K?{error:K}:{}};if(K)Y.endError=K;Y.ended=M(Y.attempt,Q)},R=(Y,K)=>T(Y,{reason:"abandoned",message:K}),L=(Y)=>[...H.values()].filter((K)=>K.key===Y),D=(Y)=>L(Y).at(-1),k=(Y)=>{if(H.delete(Y.id),!L(Y.key).length)O.delete(Y.key)},S=(Y)=>{H.set(Y.id,Y);while(H.size>P){let K=H.values().next().value;if(K===void 0)break;R(K,"dropped to keep the record bound"),k(K)}},g=(Y)=>Y.accountId===void 0?void 0:{...Y.scope,accountId:Y.accountId},p=(Y,K)=>new d({kind:"no-account",providerID:z,sessionID:Y.sessionID,requestKind:Y.kind,...K===void 0?{}:{message:K}}),l=(Y)=>{m.get(Y)?.clear(),m.delete(Y)},U=async(Y,K)=>{let Q=()=>p(Y,`${z} ${Y.kind} request has no account: its auth selection was revoked by session forgetting or installation disposal`);if(u)throw Q();let G=m.get(Y.sessionID);if(!G)G=new Set,m.set(Y.sessionID,G);let _={};G.add(_);let E=()=>{if(!G.has(_))throw Q()};try{return await K(E)}finally{if(G.delete(_),G.size===0&&m.get(Y.sessionID)===G)m.delete(Y.sessionID)}},N=(Y,K)=>{for(let[Q,G]of K)if(A.some((_)=>G.includes(_)))throw new d({kind:"host-credential-on-wire",providerID:z,sessionID:Y.sessionID,requestKind:Y.kind,message:`${z} ${Y.kind} request still carries the host's placeholder credential in ${Q}; the adapter's account headers must replace it`})},h=(Y)=>{for(let K of L(Y))if(K.ended||!K.attempt)k(K);else if(K.transport==="ws"||K.judged)R(K,"a newer attempt of its session and kind began"),k(K)},f=async(Y,K,Q,G)=>{let _=e(Y.sessionID,Y.kind),E=O.get(_);O.delete(_);let C=E?.accountId??D(_)?.accountId;h(_);let q={...Y,...C===void 0?{}:{previousAccountId:C},...E?.rerouteFrom===void 0?{}:{rerouteFrom:E.rerouteFrom}},y=await Z.chooseAccount(q);Q();let n={},c2;if(y!==void 0){let Q2=await Z.accountHeaders({...Y,accountId:y});if(Q(),P$(Q2))n=Q2.headers,c2=Q2.attempt;else n=Q2}let d2=`attempt-${++v}`,K2={id:d2,key:_,scope:Y,accountId:y,headers:n,attempt:y===void 0?void 0:{...Y,accountId:y,attemptId:d2,transport:G,data:c2},...G===void 0?{}:{transport:G},outputStarted:!1};if(S(K2),K2.attempt)V("select",{...Y,accountId:K2.attempt.accountId,hook:K,...q.previousAccountId===void 0?{}:{previousAccountId:q.previousAccountId},...q.rerouteFrom===void 0?{}:{rerouteFrom:q.rerouteFrom},handle:K2.attempt});return K2},Z2=async(Y,K,Q,G,_)=>{let E=e(Y.sessionID,Y.kind),C=G===void 0?void 0:H.get(G);if(C?.key!==E)C=void 0;if(!C){if(C=D(E),L(E).filter((y)=>y.transport===void 0&&!y.ended).length>1&&!r)r=!0,I("opencode2 auth tied a send without its attempt mark to the newest of several waiting attempts",{sessionID:Y.sessionID,kind:Y.kind})}if(!C||C.transport!==void 0||C.ended)C=await f(Y,K,_,Q);else if(C.transport=Q,C.attempt)C.attempt.transport=Q;if(Q==="ws"){for(let q of L(E))if(q!==C&&q.transport==="ws")R(q,"a newer attempt of its session and kind went out over WebSocket")}return C},F2=async(Y,K)=>{try{return await K()}catch(Q){throw T(Y,{reason:"failed",message:J(Q)}),Q}},f2=(Y,K)=>{let Q=L(e(Y,K)).filter((G)=>G.transport==="ws").at(-1);return Q?.attempt!==void 0&&!Q.ended?Q:void 0},P2=(Y,K,Q)=>{let G=g(Y);if(!G||!Y.attempt||Y.limit)return;Y.limit={signal:K,delivered:V("limit",{...G,via:Q,limit:K,outputStarted:Y.outputStarted,handle:Y.attempt})}},m2=(Y,K,Q,G)=>{let _=g(Y);if(!_||!Y.attempt)return;V("quota",{..._,transport:K,...G===void 0?{}:{status:G},quota:Q,handle:Y.attempt})},g2=(Y,K,Q,G)=>{let _=Y.attempt;if(!_)return;let E=Z.inspectEvent?.(G===void 0?{transport:K,data:Q,attempt:_}:{transport:K,data:Q,event:G,attempt:_});if(!E)return;if(E.quota!==void 0)m2(Y,K,E.quota);if(E.outputStarted)Y.outputStarted=!0;if(E.limit)P2(Y,E.limit,K);if(E.error!==void 0)T(Y,{reason:"failed",message:E.error});else if(E.done)T(Y)},U$=(Y,K)=>{let Q=Y.attempt;if(!Q||K.accountId===Y.accountId)return;if(Q.reboundFrom??=Q.accountId,Q.accountId=K.accountId,"data"in K)Q.data=K.data;Y.accountId=K.accountId},N$=(Y)=>!Y.attempt||Y.endError!==void 0||Y.status!==void 0&&Y.status>=400,C$=(Y)=>{let K=[...H.values()].filter((q)=>q.scope.sessionID===Y),Q=K.filter((q)=>q.limit&&!q.rerouted).at(-1);if(Q)return Q;let G=K.filter((q)=>q.scope.kind==="primary"),_=G.length>0?G:K;if(_.length<=1)return _[0];let E=_.filter((q)=>!q.judged&&N$(q)).at(-1);if(E)return E;let C=_.filter((q)=>q.attempt&&!q.ended);if(C.length>1)return"ambiguous";return C[0]??_.at(-1)},t={providerID:z},o=[];o.push(await $.session.hook("model.request",(Y)=>{if(j)return;return U(a(Y),async(K)=>{let Q=await f(a(Y),"model.request",K);if(K(),Q.accountId===void 0)throw p(Q.scope);_2(Y.headers,{...Q.headers,[$2]:Q.id})})},t)),o.push(await $.session.hook("http.request",(Y)=>{if(j){let K=B(Y.request.headers);if(x.set(Y.sessionID,K),!K)return}return U(a(Y),async(K)=>{let Q=Y.request.headers.get($2)??void 0,G=j?await f(a(Y),"http.request",K,"http"):await Z2(a(Y),"http.request","http",Q,K);K();let _=g(G),E=G.attempt;if(!_||!E)throw p(G.scope);await F2(G,async()=>{let C=Y.request;if(Z.rewriteRequest){if(Q!==void 0){let n=new Headers(C.headers);n.delete($2),C=new Request(C,{headers:n})}C=await Z.rewriteRequest({..._,request:C,attempt:E})??C,K()}let q=new Headers(C.headers);q.delete($2),M$(q,G.headers),N(G.scope,q.entries());let y=new Request(C,{headers:q});W.set(y,G),Y.request=y})})},t)),o.push(await $.session.hook("http.response",async(Y)=>{let K=W.get(Y.request);if(!K){if(j)return;if(!b)b=!0,I("opencode2 auth dropped an http.response whose request it did not produce",{sessionID:Y.sessionID,kind:Y.kind});return}let Q=Y.response;if(Z.answeredBy&&K.attempt){let q=K.attempt,y=await F2(K,async()=>Z.answeredBy?.({request:Y.request,response:Q,attempt:q}));if(y)U$(K,y)}let G=g(K),_=K.attempt;if(!G||!_)return;K.status=Q.status;let E=Z.quotaFromHeaders?.(Q.headers,Q.status,_);if(E!==void 0)m2(K,"http",E,Q.status);if(!Q.ok&&Z.limitFromResponse){let q=await Z.limitFromResponse({status:Q.status,headers:Q.headers,body:()=>Q.clone().text(),attempt:_});if(q)P2(K,q,"http")}if(!Q.ok||!Q.body)T(K);let C=Q;if(Q.body&&(Z.inspectEvent||Z.onAttemptEnd)){let q=Q.body;if(Z.inspectEvent)q=q.pipeThrough(L2((y)=>g2(K,"http",y.data,y.event),(y)=>I("opencode2 auth event inspection threw",{error:J(y)})));C=new Response(T$(q,(y)=>T(K,y)),{status:Q.status,statusText:Q.statusText,headers:Q.headers})}if(Z.rewriteResponse)C=await Z.rewriteResponse({...G,request:Y.request,response:C,attempt:_})??C;if(C!==Q)Y.response=C},t)),o.push(await $.session.hook("experimental.ws.handshake",(Y)=>{if(j){let K=B(new Headers(Y.headers)),Q=e(Y.sessionID,Y.kind);if(x.set(Y.sessionID,K),w.delete(Q),!K)return}return U(a(Y),async(K)=>{let Q;for(let C of Object.keys(Y.headers)){if(C.toLowerCase()!==$2)continue;Q??=Y.headers[C],delete Y.headers[C]}let G=j?await f(a(Y),"experimental.ws.handshake",K,"ws"):await Z2(a(Y),"experimental.ws.handshake","ws",Q,K);K();let _=g(G),E=G.attempt;if(!_||!E)throw p(G.scope);await F2(G,async()=>{_2(Y.headers,G.headers);let C=Z.rewriteHandshakeURL?.({..._,url:Y.url,attempt:E});if(C!==void 0)Y.url=C;if(N(G.scope,Object.entries(Y.headers)),j)w.add(G.key)})})},t));let u2=Z.rewriteWebSocketFrame?.bind(Z);if(u2)o.push(await $.session.hook("experimental.ws.send",async(Y)=>{let K=a(Y);if(j&&!w.has(e(K.sessionID,K.kind)))return;let Q=f2(K.sessionID,K.kind),G=await u2({...K,attempt:Q?.attempt,frame:Y.frame});if(G!==void 0)Y.frame=G},t));o.push(await $.session.hook("experimental.ws.receive",(Y)=>{if(j&&!w.has(e(Y.sessionID,Y.kind)))return;let K=f2(Y.sessionID,Y.kind);if(!K)return;try{g2(K,"ws",Y.frame)}catch(Q){I("opencode2 auth frame inspection threw",{error:J(Q)})}},t)),o.push(await $.session.hook("retry",async(Y)=>{if(j&&x.get(Y.sessionID)!==!0)return;let K=C$(Y.sessionID);if(!K)return;let Q=Y.decision;if(K==="ambiguous"){await V("retry",{sessionID:Y.sessionID,attempt:Y.attempt,reason:"host-decides",hostDecision:Q,decision:Q});return}let G=K;await U(G.scope,async(_)=>{G.judged=!0;let E=Q,C,q,y=G.attempt;if(G.accountId===void 0||!y)E={retry:!1},C="no-account";else if(G.outputStarted)E={retry:!1},C="output-started";else{if(!G.limit){let n=Z.limitFromError?.(Y.error,y);if(n)P2(G,n,"error")}if(G.ended)await G.ended,_();if(G.limit)await G.limit.delivered,_(),G.rerouted=!0,q={accountId:G.accountId,limit:G.limit.signal},E={retry:!0,delay:0},C="reroute";else C="host-decides"}if(Y.decision=E,E.retry&&G.accountId!==void 0)O.set(G.key,{sessionID:G.scope.sessionID,accountId:G.accountId,...q===void 0?{}:{rerouteFrom:q}});await V("retry",{sessionID:Y.sessionID,...G.accountId===void 0?{}:{accountId:G.accountId},kind:G.scope.kind,attempt:Y.attempt,reason:C,hostDecision:Q,decision:E,...y===void 0?{}:{handle:y}})})},t));let l2=(Y)=>{l(Y),x.delete(Y);for(let K of w)if(JSON.parse(K)[0]===Y)w.delete(K);for(let K of[...H.values()]){if(K.scope.sessionID!==Y)continue;R(K,"its session was forgotten"),H.delete(K.id)}for(let[K,Q]of O)if(Q.sessionID===Y)O.delete(K)},T2=new AbortController,p2=$.event;if(p2)(async()=>{try{for await(let Y of p2.subscribe({signal:T2.signal}))if(Y.type==="session.deleted")l2(Y.data.sessionID)}catch(Y){if(!T2.signal.aborted)I("opencode2 auth stopped listening for session deletion",{error:J(Y)})}})();return{on(Y,K){let Q=c.get(Y);if(!Q)Q=new Set,c.set(Y,Q);let G=K;return Q.add(G),()=>{Q.delete(G)}},accountFor(Y,K){return D(e(Y,K))?.accountId},forgetSession:l2,get size(){return H.size},async dispose(){if(u)return;u=!0;for(let Y of m.keys())l(Y);T2.abort();for(let Y of H.values())R(Y,"the installation was disposed");H.clear(),O.clear(),w.clear(),x.clear(),c.clear(),await Promise.all(o.map(async(Y)=>{try{await Y.dispose()}catch(K){I("opencode2 auth hook did not dispose cleanly",{error:J(K)})}}))}}}var x2={version:o2,"user-agent":r2,originator:"codex_exec"},L$="x-openai-internal-codex-responses-lite",_$=1024,q$=/(?:^|\/)gpt-6-(?:astra|sol|luna)$/i,G2=($)=>typeof $==="object"&&$!==null&&!Array.isArray($),x$=($)=>G2($)&&($.type==="message"||("role"in $))&&$.role==="user",S$=($)=>G2($)&&$.type==="configuration_update";class S2{#$=new Map;apply($,Z,X){if(Z.kind!=="primary")return!1;let z=typeof $.model==="string"?$.model:"";if(!t2.has(z))return!1;if(q$.test(z))return!1;let j=G2($.reasoning)?$.reasoning:void 0,B=typeof j?.effort==="string"?j.effort:void 0;if(!B)return!1;let F=this.#$.get(Z.sessionID);if(F===void 0)return this.#Y(Z.sessionID,B),!1;if(B===F)return!1;let P=Array.isArray($.input)?$.input:void 0;if(!P||P.length===0)return!1;let A=P.findLastIndex(x$);if(A<0){if(X==="http")return!1;return $.reasoning={...j,effort:F},!0}if($.reasoning={...j,effort:F},!S$(P[A-1]))P.splice(A,0,{type:"configuration_update",reasoning:{effort:B}});return!0}forget($){this.#$.delete($)}#Y($,Z){this.#$.set($,Z);while(this.#$.size>_$){let X=this.#$.keys().next().value;if(X===void 0)break;this.#$.delete(X)}}}function E$($){if(typeof $.model!=="string"||!a2.has($.model))return!1;return e2($),!0}function $1($){try{let Z=JSON.parse($);return G2(Z)?Z:void 0}catch{return}}async function Y1($,Z,X,z){if($.method.toUpperCase()!=="POST"||$.body===null)return;if(!/\/responses\/?$/.test(new URL($.url).pathname))return;let j=$1(await $.clone().text());if(!j)return;let B="max_output_tokens"in j;delete j.max_output_tokens;let F=X.apply(j,Z,"http"),P=z&&E$(j);if(!B&&!F&&!P)return;let A=new Headers($.headers);if(A.delete("content-length"),P)A.set(L$,"true");return new Request($,{headers:A,body:JSON.stringify(j)})}function Z1($,Z,X){let z=$1($);if(z?.type!=="response.create")return;let j="max_output_tokens"in z;delete z.max_output_tokens;let B=X.apply(z,Z,"ws");return j||B?JSON.stringify(z):void 0}function R$($){return $.replace(/\/responses\/?$/,"").replace(/\/$/,"")}function E2($,Z){let X=new URL($);if(X.origin!=="https://api.openai.com"&&X.origin!=="wss://api.openai.com"||!/\/responses\/?$/.test(X.pathname))return $;let z=new URL(`${R$(Z)}/responses`);if(z.search=X.search,X.protocol==="ws:"||X.protocol==="wss:")z.protocol=z.protocol==="https:"?"wss:":"ws:";return z.href}var i="openai",D$=60000,K1=1,A$="request refused: no account with a usable credential",O$=1024,Y2=($)=>typeof $==="object"&&$!==null&&!Array.isArray($);function D2($){try{return JSON.parse($)}catch{return}}function z1($){let Z=W2($);return Z?H2(Z):void 0}var b$=new Set(["usage_limit_reached","rate_limit_exceeded"]);function A2($,Z,X){return{reason:$.window,...X!==void 0?{status:X}:{},...$.resetAt!==void 0?{retryAfterMs:Math.max(0,$.resetAt-Z)}:{}}}function k$($,Z){let X=V2($);if(X){let B=typeof $.status==="number"?$.status:void 0;return A2(X,Z,B)}if($.type!=="response.failed"||!Y2($.response))return;let z=$.response.failed;if(Y2(z)&&typeof z.rate_limit_reached_type==="string")return{reason:z.rate_limit_reached_type};let j=$.response.error;if(Y2(j)){let B=typeof j.code==="string"?j.code:typeof j.type==="string"?j.type:void 0;if(B&&b$.has(B))return{reason:B}}return}function y$($,Z){let X=D2($);if(!Y2(X))return;let z=typeof X.type==="string"?X.type:void 0;if(z==="codex.rate_limits")return{quota:{snapshot:Q1(X),complete:!0}};let j=k$(X,Z);if(j)return{limit:j};if(z===void 0||z==="error")return;return _1(z)?void 0:{outputStarted:!0}}function w$($){let Z=!1;for(let X of $.keys())if(X.toLowerCase().startsWith("x-codex-")){Z=!0;break}if(!Z)return;return{snapshot:J1($),complete:j1($)}}function I$($){let Z=$.get("retry-after");if(Z===null)return;let X=Number(Z);return Number.isFinite(X)&&X>=0?X*1000:void 0}function q1($){let{source:Z,pins:X}=$,z=$.now??Date.now,j=$.log,B=$.vault,F=new S2,P=new Map,A=(J)=>`${J.sessionID}\x00${J.kind}\x00${J.accountId}`,H=new Map,W=new Map,O=(J,V)=>{W.delete(J),W.set(J,V);while(W.size>O$){let M=W.keys().next().value;if(M===void 0)break;W.delete(M)}},w=(J,V,M)=>{let T=M?[]:L1(Z.peek().rows,J,V,B?.identities()??new Set),R=(B?.routes()??[]).filter((L)=>L.kind==="oauth"&&B1(B2(L.quota),J,V));return[...T.map((L)=>({id:L.id,...L.identity!==void 0?{identity:L.identity}:{},quota:L.quota,row:L})),...R.map((L)=>({id:L.id,...L.identity!==void 0?{identity:L.identity}:{},quota:L.quota}))]},x=(J,V,M)=>{let T=new Map;if(V1(V))for(let S of J)T.set(S.id,H1(B2(S.quota),V,S.id===R2?void 0:S.id,M));let R=J.map((S)=>({id:S.id,kind:"oauth",...X1(S.quota)?{quota:S.quota}:{}})),L=J.flatMap((S)=>S.row?[S.row]:[]),D=new Set(J.filter((S)=>!S.row).map((S)=>S.id)),k=Z.rateLimitMarks(L);for(let S of D){let g=H.get(S);if(g===void 0)continue;if(g<=M)H.delete(S);else k.set(S,g)}return{rows:R,now:M,rateLimitMarks:k,refreshBackoff:Z.refreshBackoffFor(L),killswitch:T,requestPull:(S)=>D.has(S)?B?.requestReading(S):Z.requestReading(S)}},b=(J,V,M,T)=>{let R=F1({...J,placement:C1(V)});if(R.kind==="block"){j?.debug("pool admission refused the request",{reason:R.block.reason});return}let L=R.order.filter((D)=>!M.has(D));if(T!==void 0&&L.includes(T))return T;return L[0]},r=(J,V,M,T,R,L)=>{let D={requestBytes:K1,reservePercent:(N)=>W1(M,N===R2?void 0:N),resetCredits:()=>{return}},k=P1(J),S=(N,h)=>X.place({sessionId:T,requestBytes:K1,validPinnedAccountIds:J.rows.map((f)=>f.id).filter((f)=>!k.excluded.has(f)),excludeAccountIds:N,quotaCheckedAtByAccount:Object.fromEntries(J.rows.map((f)=>[f.id,k.projections.get(f.id)?.checkedAt])),wireAccountIdByAccount:Object.fromEntries(V.map((f)=>[f.id,f.identity])),select:(f)=>T1(J,D,new Set(N),f),persist:h}),g=[...R],p=S(g,L);if(!p)return;let l=p.accountId,U=M1(J,D,l);if(U.kind==="none")return;if(U.kind==="move"){let N=S([...g,l],L);if(N)return N.accountId;return U.reason==="killswitch"?void 0:l}if(U.kind==="detour")return S([...g,l],!1)?.accountId;return l},u={providerID:i,chooseAccount:async(J)=>{let V=await B?.authority(),M=await $.storage(),T=V!==void 0&&V!=="local",R=()=>{throw new d({kind:"no-account",providerID:i,sessionID:J.sessionID,requestKind:J.kind,message:U2})};if(T)await $.awaitVaultRoster?.();else{if(!(await Z.current()).active){if(await $.slotPlaceholderWithoutMain?.())R();j?.warn("the account pool does not serve requests yet; refusing the request",{kind:J.kind});return}await Z.prepareTokens(Z.peek().rows,M)}let L=z(),D=w(M,L,T),k=new Map(D.map((h)=>[h.id,h])),S=x(D,M,L),g=new Set(J.rerouteFrom?[J.rerouteFrom.accountId]:[]),p=M?.routing?.mode??"main-first",l=J.kind==="primary",U=new Set,N;for(;;){let h=new Set([...g,...U]);if(N=void 0,p==="sticky-balanced")N=r(S,D,M,J.sessionID,h,l&&U.size===0);if(N??=b(S,p,h,l?void 0:W.get(J.sessionID)),N===void 0||U.has(N)){N=void 0;break}let f=k.get(N)?.row;if(f){if(Z.usableToken(f)!==void 0)break;j?.debug("pool row holds no usable token; choosing again",{accountId:N})}else{if(!B)break;let Z2=await B.authorize(N);if(Z2){P.set(A({...J,accountId:N}),Z2);break}j?.debug("the vault refused to serve an account; choosing again",{accountId:N})}U.add(N)}if(N===void 0&&!T&&D.length===0&&await $.slotPlaceholderWithoutMain?.())R();if(N===void 0&&T&&B&&(D.length===0||U.size>0)){let h=U.size>0?"vault-refused":N1(B);throw j?.warn("vault mode: no vault account can serve; refusing the request",{cause:h}),new d({kind:"no-account",providerID:i,sessionID:J.sessionID,requestKind:J.kind,message:U1[h]})}if(N!==void 0&&l)O(J.sessionID,N);return j?.debug("pool account chosen",{kind:J.kind,accountId:N,mode:p,...J.rerouteFrom?{rerouteFrom:J.rerouteFrom.accountId}:{}}),N},accountHeaders:async(J)=>{let{accountId:V}=J,M=()=>new d({kind:"no-account",providerID:i,sessionID:J.sessionID,requestKind:J.kind,message:A$}),T=B&&await B.authority()!=="local"?void 0:Z.peek().rows.find((D)=>D.id===V);if(!T&&B){let D=A(J),k=P.get(D)??await B.authorize(V);if(P.delete(D),!k)throw j?.warn("the vault refused to serve an account; refusing the request",{accountId:V}),M();return{headers:{...x2,"session-id":J.sessionID,authorization:`Bearer ${k.accessToken}`,"chatgpt-account-id":k.accountIdentity??z1(k.accessToken)??null},attempt:{kind:"vault",routeId:V,receipt:k}}}let R=T?Z.usableToken(T):void 0;if(!T||!R)throw j?.warn("pool row holds no usable token; refusing the request",{accountId:V}),M();let L=T.identity??z1(R);return{headers:{...x2,"session-id":J.sessionID,authorization:`Bearer ${R}`,"chatgpt-account-id":L??null},attempt:{kind:"pool",token:R,credentialEpoch:T.credentialEpoch}}},async rewriteRequest({request:J,sessionID:V,kind:M}){let T=$.codexEndpoint?E2(J.url,$.codexEndpoint()):J.url,R=T===J.url?J:new Request(T,J);return await Y1(R,{sessionID:V,kind:M},F,$.responsesLite?.()??!1)??R},rewriteHandshakeURL:({url:J})=>$.codexEndpoint?E2(J,$.codexEndpoint()):void 0,rewriteWebSocketFrame:({frame:J,sessionID:V,kind:M})=>Z1(J,{sessionID:V,kind:M},F),quotaFromHeaders:(J)=>w$(J),async limitFromResponse({status:J,headers:V,body:M}){if(J<400)return;let T=D2(await M().catch(()=>"")),R=V2({...Y2(T)?T:{},status:J});if(!R)return;let L=z(),D=A2(R,L,J);if(D.retryAfterMs!==void 0)return D;let k=I$(V);return k===void 0?D:{...D,retryAfterMs:k}},inspectEvent:({data:J})=>y$(J,z()),limitFromError(J){let V=D2(J.message),M=V2({...Y2(V)?V:{},...J.status!==void 0?{status:J.status}:{}})??(J.message.includes("usage_limit_reached")?{window:"usage_limit_reached"}:void 0);return M?A2(M,z(),J.status):void 0},async onAttemptEnd(J,V){let M=J.data;if(M?.kind!=="vault"||V.status!==401)return;j?.warn("a vault account answered 401; reporting it to the vault",{accountId:J.accountId}),await B?.reportFailure(M.receipt,401)}},m=(J,V,M)=>{let T=M.data;if(T?.kind==="vault"){B?.recordSnapshot(J,V.snapshot,V.complete,T.receipt);return}if(T?.kind!=="pool")return;if(Z.peek().rows.find((L)=>L.id===J)?.credentialEpoch!==T.credentialEpoch){j?.debug("quota reading dropped: the row holds another credential",{accountId:J});return}Z.recordSnapshot(J,V.snapshot,T.token,V.complete)},I=(J,V,M)=>{let T=z(),R=M.data?.kind==="vault",L=R?B?.routes().find((S)=>S.id===J)?.quota:Z.peek().rows.find((S)=>S.id===J)?.quota,D=G1(B2(L),V.reason,T,D$,V.retryAfterMs!==void 0?T+V.retryAfterMs:void 0);if(!R){Z.markRateLimited(J,D);return}let k=H.get(J);if(k===void 0||k<D)H.set(J,D)};return{adapter:u,attach(J){J.on("quota",(V)=>m(V.accountId,V.quota,V.handle)),J.on("limit",(V)=>{I(V.accountId,V.limit,V.handle),j?.debug("pool row refused the request",{accountId:V.accountId,via:V.via,reason:V.limit.reason,outputStarted:V.outputStarted})})},forgetSession(J){X.forget(J),W.delete(J),F.forget(J)}}}import{randomUUID as v$}from"node:crypto";import{chmod as h$,mkdir as f$,readFile as m$,rename as g$,rm as u$,stat as l$,writeFile as p$}from"node:fs/promises";import{dirname as c$,resolve as d$}from"node:path";var i$="(no OpenCode 1 logins on this machine)";function n$($=process.env){return x1($)}async function O2($){let Z;try{Z=await m$($,"utf8")}catch(z){if(z.code==="ENOENT")return;throw z}let X=JSON.parse(Z);if(!X||typeof X!=="object"||Array.isArray(X))throw Error(`${$} does not hold a JSON object`);return X}function b2($){return $===void 0?void 0:JSON.stringify($)}async function s$($){try{return(await l$($)).mode&511}catch(Z){if(Z.code==="ENOENT")return;throw Z}}function S1($=n$()){let Z=new Map;return{path:d$($),async get(X){let z=(await O2($))?.[X.path.id];return Z.set(X.path.id,b2(z)),z},async set(X){let z=X.path.id,j=await s$($),B=await O2($)??{};if(!Z.has(z)||Z.get(z)!==b2(B[z]))throw new k2;B[z]=X.body,await f$(c$($),{recursive:!0});let F=`${$}.${v$()}.tmp`;try{await p$(F,`${JSON.stringify(B,null,2)}
4
- `,{mode:j??384}),await h$(F,j??384),await g$(F,$)}catch(P){throw await u$(F,{force:!0}).catch(()=>{}),P}return Z.set(z,b2(X.body)),!0},async all(){let X=await O2($);if(!X||Object.keys(X).length===0)return{[i$]:!0};return X}}}var a$="openai-auth-pool-browser",o$="openai-auth-pool-headless",r$="openai-auth-vault",t$="Vault login requires this OpenCode host to be enrolled in the Claustrum vault. Connect to the vault or disconnect this host before trying again.";async function X2($){if(await $.authority()!=="local")throw Error("This host is connected to the credential vault or its enrollment is unreadable; the login was not stored. Disconnect this host from the vault to add a local login.")}function b1($){return{method:{id:r$,type:"oauth",label:"ChatGPT accounts in the vault"},async activate(){if(await E1($.paths,$.name)!=="vault")throw Error(t$)}}}function k1($){let Z=(X,z,j)=>({method:{id:X,type:"oauth",label:z},async authorize(){if($.vault)await X2($.vault);let B=await $.beginLogin({version:$.version,headless:j});return{url:B.url,instructions:B.instructions,mode:"auto",callback:B.completion}}});return[Z(a$,"ChatGPT (openai-auth pool, browser)",!1),Z(o$,"ChatGPT (openai-auth pool, headless)",!0)]}function y2($){let Z=(X)=>typeof X==="string"?X:"";return z2({type:"oauth",access:Z($.access),refresh:Z($.refresh)})||$.refresh===A1||R1($)}function e$($){if($.accountId)return $.accountId;let Z=$.access?W2($.access):void 0;return Z?H2(Z):void 0}async function y1($,Z,X,z={}){if(z.vault)await X2(z.vault);if(y2(X))throw Error("the credential is not a ChatGPT login (a placeholder or a tombstone); it was not stored");let j=D1($,{rowLocks:(x)=>O1(Z,x)}),B=await j.read();if(B.status!=="ready")throw Error(`the account pool cannot be read (${B.status}); the login was not stored`);let F={type:"oauth",refresh:X.refresh,...X.access!==void 0?{access:X.access}:{},...X.expires!==void 0?{expires:X.expires}:{}},P=e$(X);if(z.vault)await X2(z.vault);let A=P!==void 0?{identity:P}:{};if(z.origin==="import"){let x=B.rows.find((b)=>P!==void 0&&b.identity===P||b.credential?.type==="oauth"&&b.credential.refresh===X.refresh);if(x)return{id:x.id,operation:"kept"}}let H=B.rows.filter((x)=>x.type==="oauth"&&!x.invalid),W=P?H.find((x)=>x.identity===P):void 0,O=B.rows.find((x)=>x.id===N2);if(W)return{id:(await j.replace(W.id,F,A)).id,operation:"replaced"};if(!O){let x=await j.add({id:N2,credential:F,...A,...X.label!==void 0?{label:X.label}:{}});return{id:x.id,operation:x.outcome==="added-disabled"?"added-disabled":"added"}}if(!O.invalid&&!O.credential)return{id:(await j.replace(N2,F,A)).id,operation:"replaced"};let w=await j.add({id:X.id,credential:F,...A,...X.label!==void 0?{label:X.label}:{}});return{id:w.id,operation:w.outcome==="added-disabled"?"added-disabled":w.outcome==="rotated"?"replaced":"added"}}function $Y($){if(!w1($.modelID??$.id)){$.enabled=!1;return}let Z=I1($.id);if(Z)$.limit={...Z}}function v1($){return $.model.transform((Z)=>{for(let X of Z.list(i))Z.update(i,String(X.id),(z)=>$Y(z))})}var YY=1024;class w2{pins=new Map;limit;constructor($=YY){this.limit=Math.max(1,$)}get($){return this.pins.get($)?.accountId}forget($){this.pins.delete($)}get size(){return this.pins.size}set($,Z){this.pins.delete($),this.pins.set($,Z);while(this.pins.size>this.limit){let X=this.pins.keys().next().value;if(X===void 0)break;this.pins.delete(X)}}place($){let Z=this.pins.get($.sessionId),X=new Set($.validPinnedAccountIds);if(Z&&!$.excludeAccountIds.includes(Z.accountId)&&h1(Z,X,$.wireAccountIdByAccount[Z.accountId])){if($.persist){let F=$.quotaCheckedAtByAccount[Z.accountId];this.set($.sessionId,{accountId:Z.accountId,inputBytes:$.requestBytes,...Z.wireIdentity!==void 0?{wireIdentity:Z.wireIdentity}:{},...F!==void 0?{quotaCheckedAt:F}:{}})}return{accountId:Z.accountId}}let z=new Map(Object.entries($.quotaCheckedAtByAccount)),j=f1(this.pins,z,$.sessionId),B=$.select(j);if(!B)return;if($.persist){let F=$.wireAccountIdByAccount[B.accountId];this.set($.sessionId,{accountId:B.accountId,inputBytes:$.requestBytes,...F!==void 0?{wireIdentity:F}:{},...B.quotaCheckedAt!==void 0?{quotaCheckedAt:B.quotaCheckedAt}:{}})}return{accountId:B.accountId}}}var C2="cortexkit-openai-auth",ZY=5000;async function m1($,Z,X){let z=new Map,j=new Map,B=(H)=>{j.delete(H);for(let W of z.keys())if(W.startsWith(`${H}:`))z.delete(W)},P=await q2({session:{hook:(H,W,O)=>$.session.hook(H,async(w)=>{let x=H==="http.request"?w:void 0,b=H==="experimental.ws.handshake"?w:void 0,c=(x?x.request.headers:b?new Headers(b.headers):void 0)?.get("authorization")===`Bearer ${s(Z.providerID)}`;try{await W(w)}catch(v){if(c&&!(v instanceof d))throw o1(v);throw v}if(x||b){let v=x??b;if(!v)return;let m=(x?x.request.headers:new Headers(v.headers)).get("authorization")?.replace(/^Bearer /,"");if(c&&m)j.set(v.sessionID,m);else j.delete(v.sessionID);if(b){let I=`${b.sessionID}:${b.kind}`;if(c&&m)z.set(I,m);else z.delete(I)}if(j.size>512){let I=j.keys().next().value;if(I)j.delete(I)}if(z.size>512){let I=z.keys().next().value;if(I)z.delete(I)}}else if(H==="experimental.ws.receive"){let v=w,u=z.get(`${v.sessionID}:${v.kind}`);if(u)v.frame=r1(v.frame,u)}else if(H==="retry"){let v=w,u=j.get(v.sessionID);if(u)Object.assign(v.error,{message:a1(v.error.message,u)})}},O)},event:{subscribe:(H)=>async function*(){for await(let W of $.event.subscribe(H)){if(W.type==="session.deleted")B(W.data.sessionID);yield W}}()}},{...Z,rewriteResponse:async(H)=>{let W=await Z.rewriteResponse?.(H)??H.response;return t1(W,H.request.headers.get("authorization")?.replace(/^Bearer /,""),"event-stream")}},{gateOnPlaceholder:{credential:(H)=>{let W=H.get("authorization");return W?.startsWith("Bearer ")?W.slice(7):void 0}},logger:{warn:(H,W)=>X.warn(H,{data:W})}}),A=P.dispose;return{...P,dispose:async()=>{j.clear(),z.clear(),await A()}}}function h2($={}){return{id:C2,setup:(Z)=>KY(Z,$)}}async function KY($,Z={}){let S=[];try{let X=J2("opencode2");let z=J2("quota");let j=Z.paths??(()=>$$(e1()));let B=Z.fetch??fetch;let F=Z.version??X$;let P=Z.poolMigration??W$;if(!P&&!j2(j().configPath)){X.info("openai-auth stands aside on OpenCode 2: this install has not moved into the account pool and the migration is switched off, so OpenCode 2 serves its own ChatGPT login");let U=(h)=>{throw new d({kind:"no-account",providerID:i,sessionID:h.sessionID,requestKind:h.kind,message:U2})},N=await m1($,{providerID:i,chooseAccount:U,accountHeaders:U},X);return()=>N.dispose()}let A=Z.vault?.firstRosterWaitMs??j$;let H=V$({host:"opencode",stateDir:Z.vault?.stateDir??s1(j().statePath),reservedRouteIds:()=>b.peek().rows.map((U)=>U.id),...Z.vault?.connectionFile?{connectionFile:Z.vault.connectionFile}:{},...Z.vault?.connectScoped?{connectScoped:Z.vault.connectScoped}:{},...Z.vault?.connectEnrollment?{connectEnrollment:Z.vault.connectEnrollment}:{},...Z.vault?.pollIntervalMs!==void 0?{pollIntervalMs:Z.vault.pollIntervalMs}:{},fetchImpl:()=>B},j());let W=H.vault;let O=!1;const w=g1(S,{[Symbol.dispose](){if(!O)H.release()}},0);await W.authority();let x=H.firstRoster;let b=new Q$({paths:j,refreshProvider:async(U)=>{let N=await c1({refreshToken:U.refresh,fetchImpl:B,now:Date.now}),h=l1({id_token:"",access_token:N.access,refresh_token:N.refresh});return{...N,...h?{identity:h}:{}}},pullQuota:async(U)=>{let N=U.credential;if(N.type!=="oauth"||!N.access)throw Error("the row holds no access token to poll with");let h=await d1({accessToken:N.access,fetchImpl:B,now:Date.now,...U.identity?{accountId:U.identity}:{},accountKey:U.id,logger:z});return n1(h,Date.now(),!0)},vaultIdentities:()=>W.identities(),vaultMode:()=>W.enrolled(),vaultAuthority:()=>W.authority(),vaultFirstRoster:x,vaultFirstRosterBackgroundWaitMs:A,log:J2("pool")});await b.load();let r=Z.heartbeat===!1?void 0:await B$({version:F,logger:J2("heartbeat")});let c=Z.fence??(()=>z$({currentVersion:F}));let v=Z.slot??S1();let u=async()=>Y$(j(),await v.get({path:{id:"openai"}}));let m=!1;let I=P?G$({paths:j,slot:v,version:F,fence:c,runDeps:{vaultServes:()=>W.serves()},paused:async()=>await W.authority()!=="local",migrate:async(U)=>{let N=await Z$(U);return m=N.status==="refused",b.load(),N},adopt:async(U)=>{if(!await v2(x,A))return{status:"retry",reason:"vault-roster-pending"};let N=await K$(U);return b.load(),N}}):void 0;I?.start();H.start();let J=new w2;let V=q1({source:b,slotPlaceholderWithoutMain:u,storage:()=>i1(j()),pins:J,vault:W,awaitVaultRoster:async()=>{await v2(x,J$)},responsesLite:()=>I2().responsesLite,codexEndpoint:()=>I2().codexApiEndpoint,log:X});let M=await m1($,V.adapter,X);V.attach(M);let T=async(U)=>{if(await X2(W),j2(j().configPath))return;if(await I?.idle(),j2(j().configPath))return;if(m&&!y2(U)&&(await c()).open){await b.poolStore().initialize();return}throw Error("OpenAI accounts move to the shared account pool once every OpenCode process on this machine runs this version of openai-auth; the login was not stored. Update or close the older processes and sign in again.")};let R=async(U)=>{await T(U);let N=await y1(b.poolStore(),j(),U,{vault:W});if(!j2(j().configPath))await I?.requestAdoption();await b.load(),X.info("ChatGPT login stored in the account pool",N)};let L=await M2($,{integrationID:i,methods:k1({beginLogin:Z.beginLogin??p1,version:F,vault:W}),onLogin:(U)=>R(U),label:"ChatGPT (openai-auth account pool)",vault:b1(W)});let D=await v1($);let k=new AbortController;(async()=>{try{for await(let U of $.event.subscribe({signal:k.signal}))if(U.type==="session.deleted")V.forgetSession(U.data.sessionID)}catch(U){if(!k.signal.aborted)X.warn("stopped listening for session deletion",{error:U instanceof Error?U.message:String(U)})}})();O=!0;return async()=>{k.abort(),I?.dispose(),await Promise.allSettled([M.dispose(),L.dispose(),D.dispose()]),await Promise.race([b.settled(),new Promise((U)=>setTimeout(U,ZY).unref?.())]),H.release(),b.dispose(),await r?.release()}}catch(g){var p=g,l=1}finally{u1(S,p,l)}}var zY=h2(),_Z={id:C2,setup:zY.setup,server:H$.server};export{_Z as default,h2 as createOpenAIAuthPlugin,C2 as OPENAI_AUTH_PLUGIN_ID};
3
+ `)}}function L2($,Z){let X=new TextDecoder,z="",j=(q)=>{let F=F$(q);if(!F)return;try{$(F)}catch(O){Z(O)}},B=()=>{for(;;){let q=/\r?\n\r?\n/.exec(z);if(!q)return;let F=z.slice(0,q.index);z=z.slice(q.index+q[0].length),j(F)}};return new TransformStream({transform(q,F){F.enqueue(q),z+=X.decode(q,{stream:!0}),B()},flush(){if(z+=X.decode(),B(),z.trim()!=="")j(z);z=""}})}var s2=512,Y2="x-common-auth-attempt",e=($,Z)=>JSON.stringify([$,Z]),o=($)=>({providerID:$.model.providerID,modelID:$.model.id,sessionID:$.sessionID,agent:$.agent,kind:$.kind});function P$($){let Z=$.headers;return typeof Z==="object"&&Z!==null}function T$($,Z){let X=$.getReader();return new ReadableStream({async pull(z){let j;try{j=await X.read()}catch(B){Z({reason:"failed",message:B instanceof Error?B.message:String(B)}),z.error(B);return}if(j.done)Z(),z.close();else z.enqueue(j.value)},async cancel(z){Z({reason:"cancelled",...z===void 0?{}:{message:String(z)}}),await X.cancel(z)}})}function _2($,Z){for(let[X,z]of Object.entries(Z)){let j=X.toLowerCase();for(let B of Object.keys($))if(B.toLowerCase()===j)delete $[B];if(z!==null)$[X]=z}}function M$($,Z){for(let[X,z]of Object.entries(Z))if(z===null)$.delete(X);else $.set(X,z)}async function q2($,Z,X={}){let{providerID:z}=Z,j=X.gateOnPlaceholder,B=(Y)=>j===void 0||j.credential(Y)===a(z),q=X.logger,F=Math.max(1,X.maxRecords??s2),O=[...X.hostCredentials??[a(z)],...j?[a(z)]:[]].filter((Y)=>Y!==""),H=new Map,W=new WeakMap,k=new Map,b=new Set,S=new Map,v=!1,m=!1,d=new Map,I=0,u=!1,g=new Map,h=(Y,K)=>{try{q?.warn(Y,K)}catch{}},J=(Y)=>Y instanceof Error?Y.message:String(Y),V=async(Y,K)=>{let G=d.get(Y);if(!G||G.size===0)return;await Promise.all([...G].map(async(Q)=>{try{await Q(K)}catch(M){h("opencode2 auth listener threw; the request is unaffected",{event:Y,error:J(M)})}}))},P=async(Y,K)=>{try{await Z.onAttemptEnd?.(Y,K)}catch(G){h("opencode2 auth onAttemptEnd threw; the request is unaffected",{attemptId:Y.attemptId,error:J(G)})}},C=(Y,K)=>{if(Y.ended||!Y.attempt)return;let G={...Y.status===void 0?{}:{status:Y.status},outputStarted:Y.outputStarted,...Y.limit?{limit:Y.limit.signal}:{},...K?{error:K}:{}};if(K)Y.endError=K;Y.ended=P(Y.attempt,G)},A=(Y,K)=>C(Y,{reason:"abandoned",message:K}),T=(Y)=>[...H.values()].filter((K)=>K.key===Y),D=(Y)=>T(Y).at(-1),y=(Y)=>{if(H.delete(Y.id),!T(Y.key).length)k.delete(Y.key)},x=(Y)=>{H.set(Y.id,Y);while(H.size>F){let K=H.values().next().value;if(K===void 0)break;A(K,"dropped to keep the record bound"),y(K)}},f=(Y)=>Y.accountId===void 0?void 0:{...Y.scope,accountId:Y.accountId},i=(Y,K)=>new c({kind:"no-account",providerID:z,sessionID:Y.sessionID,requestKind:Y.kind,...K===void 0?{}:{message:K}}),p=(Y)=>{g.get(Y)?.clear(),g.delete(Y)},l=async(Y,K)=>{let G=()=>i(Y,`${z} ${Y.kind} request has no account: its auth selection was revoked by session forgetting or installation disposal`);if(u)throw G();let Q=g.get(Y.sessionID);if(!Q)Q=new Set,g.set(Y.sessionID,Q);let M={};Q.add(M);let E=()=>{if(!Q.has(M))throw G()};try{return await K(E)}finally{if(Q.delete(M),Q.size===0&&g.get(Y.sessionID)===Q)g.delete(Y.sessionID)}},U=(Y,K)=>{for(let[G,Q]of K)if(O.some((M)=>Q.includes(M)))throw new c({kind:"host-credential-on-wire",providerID:z,sessionID:Y.sessionID,requestKind:Y.kind,message:`${z} ${Y.kind} request still carries the host's placeholder credential in ${G}; the adapter's account headers must replace it`})},L=(Y)=>{for(let K of T(Y))if(K.ended||!K.attempt)y(K);else if(K.transport==="ws"||K.judged)A(K,"a newer attempt of its session and kind began"),y(K)},R=async(Y,K,G,Q)=>{let M=e(Y.sessionID,Y.kind),E=k.get(M);k.delete(M);let N=E?.accountId??D(M)?.accountId;L(M);let _={...Y,...N===void 0?{}:{previousAccountId:N},...E?.rerouteFrom===void 0?{}:{rerouteFrom:E.rerouteFrom}},w=await Z.chooseAccount(_);G();let s={},c2;if(w!==void 0){let Q2=await Z.accountHeaders({...Y,accountId:w});if(G(),P$(Q2))s=Q2.headers,c2=Q2.attempt;else s=Q2}let d2=`attempt-${++I}`,z2={id:d2,key:M,scope:Y,accountId:w,headers:s,attempt:w===void 0?void 0:{...Y,accountId:w,attemptId:d2,transport:Q,data:c2},...Q===void 0?{}:{transport:Q},outputStarted:!1};if(x(z2),z2.attempt)V("select",{...Y,accountId:z2.attempt.accountId,hook:K,..._.previousAccountId===void 0?{}:{previousAccountId:_.previousAccountId},..._.rerouteFrom===void 0?{}:{rerouteFrom:_.rerouteFrom},handle:z2.attempt});return z2},K2=async(Y,K,G,Q,M)=>{let E=e(Y.sessionID,Y.kind),N=Q===void 0?void 0:H.get(Q);if(N?.key!==E)N=void 0;if(!N){if(N=D(E),T(E).filter((w)=>w.transport===void 0&&!w.ended).length>1&&!m)m=!0,h("opencode2 auth tied a send without its attempt mark to the newest of several waiting attempts",{sessionID:Y.sessionID,kind:Y.kind})}if(!N||N.transport!==void 0||N.ended)N=await R(Y,K,M,G);else if(N.transport=G,N.attempt)N.attempt.transport=G;if(G==="ws"){for(let _ of T(E))if(_!==N&&_.transport==="ws")A(_,"a newer attempt of its session and kind went out over WebSocket")}return N},$2=async(Y,K)=>{try{return await K()}catch(G){throw C(Y,{reason:"failed",message:J(G)}),G}},f2=(Y,K)=>{let G=T(e(Y,K)).filter((Q)=>Q.transport==="ws").at(-1);return G?.attempt!==void 0&&!G.ended?G:void 0},P2=(Y,K,G)=>{let Q=f(Y);if(!Q||!Y.attempt||Y.limit)return;Y.limit={signal:K,delivered:V("limit",{...Q,via:G,limit:K,outputStarted:Y.outputStarted,handle:Y.attempt})}},m2=(Y,K,G,Q)=>{let M=f(Y);if(!M||!Y.attempt)return;V("quota",{...M,transport:K,...Q===void 0?{}:{status:Q},quota:G,handle:Y.attempt})},g2=(Y,K,G,Q)=>{let M=Y.attempt;if(!M)return;let E=Z.inspectEvent?.(Q===void 0?{transport:K,data:G,attempt:M}:{transport:K,data:G,event:Q,attempt:M});if(!E)return;if(E.quota!==void 0)m2(Y,K,E.quota);if(E.outputStarted)Y.outputStarted=!0;if(E.limit)P2(Y,E.limit,K);if(E.error!==void 0)C(Y,{reason:"failed",message:E.error});else if(E.done)C(Y)},U$=(Y,K)=>{let G=Y.attempt;if(!G||K.accountId===Y.accountId)return;if(G.reboundFrom??=G.accountId,G.accountId=K.accountId,"data"in K)G.data=K.data;Y.accountId=K.accountId},C$=(Y)=>!Y.attempt||Y.endError!==void 0||Y.status!==void 0&&Y.status>=400,N$=(Y)=>{let K=[...H.values()].filter((_)=>_.scope.sessionID===Y),G=K.filter((_)=>_.limit&&!_.rerouted).at(-1);if(G)return G;let Q=K.filter((_)=>_.scope.kind==="primary"),M=Q.length>0?Q:K;if(M.length<=1)return M[0];let E=M.filter((_)=>!_.judged&&C$(_)).at(-1);if(E)return E;let N=M.filter((_)=>_.attempt&&!_.ended);if(N.length>1)return"ambiguous";return N[0]??M.at(-1)},t={providerID:z},r=[];r.push(await $.session.hook("model.request",(Y)=>{if(j)return;return l(o(Y),async(K)=>{let G=await R(o(Y),"model.request",K);if(K(),G.accountId===void 0)throw i(G.scope);_2(Y.headers,{...G.headers,[Y2]:G.id})})},t)),r.push(await $.session.hook("http.request",(Y)=>{if(j){let K=B(Y.request.headers);if(S.set(Y.sessionID,K),!K)return}return l(o(Y),async(K)=>{let G=Y.request.headers.get(Y2)??void 0,Q=j?await R(o(Y),"http.request",K,"http"):await K2(o(Y),"http.request","http",G,K);K();let M=f(Q),E=Q.attempt;if(!M||!E)throw i(Q.scope);await $2(Q,async()=>{let N=Y.request;if(Z.rewriteRequest){if(G!==void 0){let s=new Headers(N.headers);s.delete(Y2),N=new Request(N,{headers:s})}N=await Z.rewriteRequest({...M,request:N,attempt:E})??N,K()}let _=new Headers(N.headers);_.delete(Y2),M$(_,Q.headers),U(Q.scope,_.entries());let w=new Request(N,{headers:_});W.set(w,Q),Y.request=w})})},t)),r.push(await $.session.hook("http.response",async(Y)=>{let K=W.get(Y.request);if(!K){if(j)return;if(!v)v=!0,h("opencode2 auth dropped an http.response whose request it did not produce",{sessionID:Y.sessionID,kind:Y.kind});return}let G=Y.response;if(Z.answeredBy&&K.attempt){let _=K.attempt,w=await $2(K,async()=>Z.answeredBy?.({request:Y.request,response:G,attempt:_}));if(w)U$(K,w)}let Q=f(K),M=K.attempt;if(!Q||!M)return;K.status=G.status;let E=Z.quotaFromHeaders?.(G.headers,G.status,M);if(E!==void 0)m2(K,"http",E,G.status);if(!G.ok&&Z.limitFromResponse){let _=await Z.limitFromResponse({status:G.status,headers:G.headers,body:()=>G.clone().text(),attempt:M});if(_)P2(K,_,"http")}if(!G.ok||!G.body)C(K);let N=G;if(G.body&&(Z.inspectEvent||Z.onAttemptEnd)){let _=G.body;if(Z.inspectEvent)_=_.pipeThrough(L2((w)=>g2(K,"http",w.data,w.event),(w)=>h("opencode2 auth event inspection threw",{error:J(w)})));N=new Response(T$(_,(w)=>C(K,w)),{status:G.status,statusText:G.statusText,headers:G.headers})}if(Z.rewriteResponse)N=await Z.rewriteResponse({...Q,request:Y.request,response:N,attempt:M})??N;if(N!==G)Y.response=N},t)),r.push(await $.session.hook("experimental.ws.handshake",(Y)=>{if(j){let K=B(new Headers(Y.headers)),G=e(Y.sessionID,Y.kind);if(S.set(Y.sessionID,K),b.delete(G),!K)return}return l(o(Y),async(K)=>{let G;for(let N of Object.keys(Y.headers)){if(N.toLowerCase()!==Y2)continue;G??=Y.headers[N],delete Y.headers[N]}let Q=j?await R(o(Y),"experimental.ws.handshake",K,"ws"):await K2(o(Y),"experimental.ws.handshake","ws",G,K);K();let M=f(Q),E=Q.attempt;if(!M||!E)throw i(Q.scope);await $2(Q,async()=>{_2(Y.headers,Q.headers);let N=Z.rewriteHandshakeURL?.({...M,url:Y.url,attempt:E});if(N!==void 0)Y.url=N;if(U(Q.scope,Object.entries(Y.headers)),j)b.add(Q.key)})})},t));let u2=Z.rewriteWebSocketFrame?.bind(Z);if(u2)r.push(await $.session.hook("experimental.ws.send",async(Y)=>{let K=o(Y);if(j&&!b.has(e(K.sessionID,K.kind)))return;let G=f2(K.sessionID,K.kind),Q=await u2({...K,attempt:G?.attempt,frame:Y.frame});if(Q!==void 0)Y.frame=Q},t));r.push(await $.session.hook("experimental.ws.receive",(Y)=>{if(j&&!b.has(e(Y.sessionID,Y.kind)))return;let K=f2(Y.sessionID,Y.kind);if(!K)return;try{g2(K,"ws",Y.frame)}catch(G){h("opencode2 auth frame inspection threw",{error:J(G)})}},t)),r.push(await $.session.hook("retry",async(Y)=>{if(j&&S.get(Y.sessionID)!==!0)return;let K=N$(Y.sessionID);if(!K)return;let G=Y.decision;if(K==="ambiguous"){await V("retry",{sessionID:Y.sessionID,attempt:Y.attempt,reason:"host-decides",hostDecision:G,decision:G});return}let Q=K;await l(Q.scope,async(M)=>{Q.judged=!0;let E=G,N,_,w=Q.attempt;if(Q.accountId===void 0||!w)E={retry:!1},N="no-account";else if(Q.outputStarted)E={retry:!1},N="output-started";else{if(!Q.limit){let s=Z.limitFromError?.(Y.error,w);if(s)P2(Q,s,"error")}if(Q.ended)await Q.ended,M();if(Q.limit)await Q.limit.delivered,M(),Q.rerouted=!0,_={accountId:Q.accountId,limit:Q.limit.signal},E={retry:!0,delay:0},N="reroute";else N="host-decides"}if(Y.decision=E,E.retry&&Q.accountId!==void 0)k.set(Q.key,{sessionID:Q.scope.sessionID,accountId:Q.accountId,..._===void 0?{}:{rerouteFrom:_}});await V("retry",{sessionID:Y.sessionID,...Q.accountId===void 0?{}:{accountId:Q.accountId},kind:Q.scope.kind,attempt:Y.attempt,reason:N,hostDecision:G,decision:E,...w===void 0?{}:{handle:w}})})},t));let l2=(Y)=>{p(Y),S.delete(Y);for(let K of b)if(JSON.parse(K)[0]===Y)b.delete(K);for(let K of[...H.values()]){if(K.scope.sessionID!==Y)continue;A(K,"its session was forgotten"),H.delete(K.id)}for(let[K,G]of k)if(G.sessionID===Y)k.delete(K)},T2=new AbortController,p2=$.event;if(p2)(async()=>{try{for await(let Y of p2.subscribe({signal:T2.signal}))if(Y.type==="session.deleted")l2(Y.data.sessionID)}catch(Y){if(!T2.signal.aborted)h("opencode2 auth stopped listening for session deletion",{error:J(Y)})}})();return{on(Y,K){let G=d.get(Y);if(!G)G=new Set,d.set(Y,G);let Q=K;return G.add(Q),()=>{G.delete(Q)}},accountFor(Y,K){return D(e(Y,K))?.accountId},forgetSession:l2,get size(){return H.size},async dispose(){if(u)return;u=!0;for(let Y of g.keys())p(Y);T2.abort();for(let Y of H.values())A(Y,"the installation was disposed");H.clear(),k.clear(),b.clear(),S.clear(),d.clear(),await Promise.all(r.map(async(Y)=>{try{await Y.dispose()}catch(K){h("opencode2 auth hook did not dispose cleanly",{error:J(K)})}}))}}}var x2={version:o2,"user-agent":r2,originator:"codex_exec"},L$="x-openai-internal-codex-responses-lite",_$=1024,q$=/(?:^|\/)gpt-6-(?:astra|sol|luna)$/i,B2=($)=>typeof $==="object"&&$!==null&&!Array.isArray($),x$=($)=>B2($)&&($.type==="message"||("role"in $))&&$.role==="user",E$=($)=>B2($)&&$.type==="configuration_update";class E2{#$=new Map;apply($,Z,X){if(Z.kind!=="primary")return!1;let z=typeof $.model==="string"?$.model:"";if(!t2.has(z))return!1;if(q$.test(z))return!1;let j=B2($.reasoning)?$.reasoning:void 0,B=typeof j?.effort==="string"?j.effort:void 0;if(!B)return!1;let q=this.#$.get(Z.sessionID);if(q===void 0)return this.#Y(Z.sessionID,B),!1;if(B===q)return!1;let F=Array.isArray($.input)?$.input:void 0;if(!F||F.length===0)return!1;let O=F.findLastIndex(x$);if(O<0){if(X==="http")return!1;return $.reasoning={...j,effort:q},!0}if($.reasoning={...j,effort:q},!E$(F[O-1]))F.splice(O,0,{type:"configuration_update",reasoning:{effort:B}});return!0}forget($){this.#$.delete($)}#Y($,Z){this.#$.set($,Z);while(this.#$.size>_$){let X=this.#$.keys().next().value;if(X===void 0)break;this.#$.delete(X)}}}function S$($){if(typeof $.model!=="string"||!a2.has($.model))return!1;return e2($),!0}function $1($){try{let Z=JSON.parse($);return B2(Z)?Z:void 0}catch{return}}async function Y1($,Z,X,z){if($.method.toUpperCase()!=="POST"||$.body===null)return;if(!/\/responses\/?$/.test(new URL($.url).pathname))return;let j=$1(await $.clone().text());if(!j)return;let B="max_output_tokens"in j;delete j.max_output_tokens;let q=X.apply(j,Z,"http"),F=z&&S$(j);if(!B&&!q&&!F)return;let O=new Headers($.headers);if(O.delete("content-length"),F)O.set(L$,"true");return new Request($,{headers:O,body:JSON.stringify(j)})}function Z1($,Z,X){let z=$1($);if(z?.type!=="response.create")return;let j="max_output_tokens"in z;delete z.max_output_tokens;let B=X.apply(z,Z,"ws");return j||B?JSON.stringify(z):void 0}function R$($){return $.replace(/\/responses\/?$/,"").replace(/\/$/,"")}function S2($,Z){let X=new URL($);if(X.origin!=="https://api.openai.com"&&X.origin!=="wss://api.openai.com"||!/\/responses\/?$/.test(X.pathname))return $;let z=new URL(`${R$(Z)}/responses`);if(z.search=X.search,X.protocol==="ws:"||X.protocol==="wss:")z.protocol=z.protocol==="https:"?"wss:":"ws:";return z.href}var n="openai",A$=60000,K1=1,D$="request refused: no account with a usable credential",O$=1024,Z2=($)=>typeof $==="object"&&$!==null&&!Array.isArray($);function A2($){try{return JSON.parse($)}catch{return}}function z1($){let Z=H2($);return Z?U2(Z):void 0}var b$=new Set(["usage_limit_reached","rate_limit_exceeded"]);function D2($,Z,X){return{reason:$.window,...X!==void 0?{status:X}:{},...$.resetAt!==void 0?{retryAfterMs:Math.max(0,$.resetAt-Z)}:{}}}function k$($,Z){let X=W2($);if(X){let B=typeof $.status==="number"?$.status:void 0;return D2(X,Z,B)}if($.type!=="response.failed"||!Z2($.response))return;let z=$.response.failed;if(Z2(z)&&typeof z.rate_limit_reached_type==="string")return{reason:z.rate_limit_reached_type};let j=$.response.error;if(Z2(j)){let B=typeof j.code==="string"?j.code:typeof j.type==="string"?j.type:void 0;if(B&&b$.has(B))return{reason:B}}return}function y$($,Z){let X=A2($);if(!Z2(X))return;let z=typeof X.type==="string"?X.type:void 0;if(z==="codex.rate_limits")return{quota:{snapshot:G1(X),complete:!0}};let j=k$(X,Z);if(j)return{limit:j};if(z===void 0||z==="error")return;return q1(z)?void 0:{outputStarted:!0}}function w$($){let Z=!1;for(let X of $.keys())if(X.toLowerCase().startsWith("x-codex-")){Z=!0;break}if(!Z)return;return{snapshot:J1($),complete:j1($)}}function I$($){let Z=$.get("retry-after");if(Z===null)return;let X=Number(Z);return Number.isFinite(X)&&X>=0?X*1000:void 0}function x1($){let{source:Z,pins:X}=$,z=$.now??Date.now,j=$.log,B=$.vault,q=new E2,F=new Map,O=(J)=>`${J.sessionID}\x00${J.kind}\x00${J.accountId}`,H=new Map,W=new Map,k=(J,V)=>{W.delete(J),W.set(J,V);while(W.size>O$){let P=W.keys().next().value;if(P===void 0)break;W.delete(P)}},b=(J,V,P)=>{let C=P?[]:_1(Z.peek().rows,J,V,B?.identities()??new Set),A=(B?.routes()??[]).filter((T)=>T.kind==="oauth"&&B1(V2(T.quota),J,V));return[...C.map((T)=>({id:T.id,...T.identity!==void 0?{identity:T.identity}:{},quota:T.quota,row:T})),...A.map((T)=>({id:T.id,...T.identity!==void 0?{identity:T.identity}:{},quota:T.quota}))]},S=(J,V,P)=>{let C=new Map;if(V1(V))for(let x of J)C.set(x.id,H1(V2(x.quota),V,x.id===R2?void 0:x.id,P));let A=J.map((x)=>({id:x.id,kind:"oauth",...X1(x.quota)?{quota:x.quota}:{}})),T=J.flatMap((x)=>x.row?[x.row]:[]),D=new Set(J.filter((x)=>!x.row).map((x)=>x.id)),y=Z.rateLimitMarks(T);for(let x of D){let f=H.get(x);if(f===void 0)continue;if(f<=P)H.delete(x);else y.set(x,f)}return{rows:A,now:P,rateLimitMarks:y,refreshBackoff:Z.refreshBackoffFor(T),killswitch:C,requestPull:(x)=>D.has(x)?B?.requestReading(x):Z.requestReading(x)}},v=(J,V,P,C)=>{let A=P1({...J,placement:N1(V)});if(A.kind==="block"){j?.debug("pool admission refused the request",{reason:A.block.reason});return}let T=A.order.filter((D)=>!P.has(D));if(C!==void 0&&T.includes(C))return C;return T[0]},m=(J,V,P,C,A,T)=>{let D={requestBytes:K1,reservePercent:(U)=>W1(P,U===R2?void 0:U),resetCredits:()=>{return}},y=T1(J),x=(U,L)=>X.place({sessionId:C,requestBytes:K1,validPinnedAccountIds:J.rows.map((R)=>R.id).filter((R)=>!y.excluded.has(R)),excludeAccountIds:U,quotaCheckedAtByAccount:Object.fromEntries(J.rows.map((R)=>[R.id,y.projections.get(R.id)?.checkedAt])),wireAccountIdByAccount:Object.fromEntries(V.map((R)=>[R.id,R.identity])),select:(R)=>M1(J,D,new Set(U),R),persist:L}),f=[...A],i=x(f,T);if(!i)return;let p=i.accountId,l=L1(J,D,p);if(l.kind==="none")return;if(l.kind==="move"){let U=x([...f,p],T);if(U)return U.accountId;return l.reason==="killswitch"?void 0:p}if(l.kind==="detour")return x([...f,p],!1)?.accountId;return p},u={providerID:n,chooseAccount:async(J)=>{let V=await B?.authority(),P=await $.storage(),C=V!==void 0&&V!=="local",A=()=>{throw new c({kind:"no-account",providerID:n,sessionID:J.sessionID,requestKind:J.kind,message:C2})};if(C)await $.awaitVaultRoster?.();else{if(!(await Z.current()).active){if(await $.slotPlaceholderWithoutMain?.())A();j?.warn("the account pool does not serve requests yet; refusing the request",{kind:J.kind});return}await Z.prepareTokens(Z.peek().rows,P)}let T=z(),D=b(P,T,C),y=F1(S(D.filter((R)=>R.id!==J.rerouteFrom?.accountId),P,T));if(y)await y,T=z(),D=b(P,T,C);let x=new Map(D.map((R)=>[R.id,R])),f=S(D,P,T),i=new Set(J.rerouteFrom?[J.rerouteFrom.accountId]:[]),p=P?.routing?.mode??"main-first",l=J.kind==="primary",U=new Set,L;for(;;){let R=new Set([...i,...U]);if(L=void 0,p==="sticky-balanced")L=m(f,D,P,J.sessionID,R,l&&U.size===0);if(L??=v(f,p,R,l?void 0:W.get(J.sessionID)),L===void 0||U.has(L)){L=void 0;break}let K2=x.get(L)?.row;if(K2){if(Z.usableToken(K2)!==void 0)break;j?.debug("pool row holds no usable token; choosing again",{accountId:L})}else{if(!B)break;let $2=await B.authorize(L);if($2){F.set(O({...J,accountId:L}),$2);break}j?.debug("the vault refused to serve an account; choosing again",{accountId:L})}U.add(L)}if(L===void 0&&!C&&D.length===0&&await $.slotPlaceholderWithoutMain?.())A();if(L===void 0&&C&&B&&(D.length===0||U.size>0)){let R=U.size>0?"vault-refused":C1(B);throw j?.warn("vault mode: no vault account can serve; refusing the request",{cause:R}),new c({kind:"no-account",providerID:n,sessionID:J.sessionID,requestKind:J.kind,message:U1[R]})}if(L!==void 0&&l)k(J.sessionID,L);return j?.debug("pool account chosen",{kind:J.kind,accountId:L,mode:p,...J.rerouteFrom?{rerouteFrom:J.rerouteFrom.accountId}:{}}),L},accountHeaders:async(J)=>{let{accountId:V}=J,P=()=>new c({kind:"no-account",providerID:n,sessionID:J.sessionID,requestKind:J.kind,message:D$}),C=B&&await B.authority()!=="local"?void 0:Z.peek().rows.find((D)=>D.id===V);if(!C&&B){let D=O(J),y=F.get(D)??await B.authorize(V);if(F.delete(D),!y)throw j?.warn("the vault refused to serve an account; refusing the request",{accountId:V}),P();return{headers:{...x2,"session-id":J.sessionID,authorization:`Bearer ${y.accessToken}`,"chatgpt-account-id":y.accountIdentity??z1(y.accessToken)??null},attempt:{kind:"vault",routeId:V,receipt:y}}}let A=C?Z.usableToken(C):void 0;if(!C||!A)throw j?.warn("pool row holds no usable token; refusing the request",{accountId:V}),P();let T=C.identity??z1(A);return{headers:{...x2,"session-id":J.sessionID,authorization:`Bearer ${A}`,"chatgpt-account-id":T??null},attempt:{kind:"pool",token:A,credentialEpoch:C.credentialEpoch}}},async rewriteRequest({request:J,sessionID:V,kind:P}){let C=$.codexEndpoint?S2(J.url,$.codexEndpoint()):J.url,A=C===J.url?J:new Request(C,J);return await Y1(A,{sessionID:V,kind:P},q,$.responsesLite?.()??!1)??A},rewriteHandshakeURL:({url:J})=>$.codexEndpoint?S2(J,$.codexEndpoint()):void 0,rewriteWebSocketFrame:({frame:J,sessionID:V,kind:P})=>Z1(J,{sessionID:V,kind:P},q),quotaFromHeaders:(J)=>w$(J),async limitFromResponse({status:J,headers:V,body:P}){if(J<400)return;let C=A2(await P().catch(()=>"")),A=W2({...Z2(C)?C:{},status:J});if(!A)return;let T=z(),D=D2(A,T,J);if(D.retryAfterMs!==void 0)return D;let y=I$(V);return y===void 0?D:{...D,retryAfterMs:y}},inspectEvent:({data:J})=>y$(J,z()),limitFromError(J){let V=A2(J.message),P=W2({...Z2(V)?V:{},...J.status!==void 0?{status:J.status}:{}})??(J.message.includes("usage_limit_reached")?{window:"usage_limit_reached"}:void 0);return P?D2(P,z(),J.status):void 0},async onAttemptEnd(J,V){let P=J.data;if(P?.kind!=="vault"||V.status!==401)return;j?.warn("a vault account answered 401; reporting it to the vault",{accountId:J.accountId}),await B?.reportFailure(P.receipt,401)}},g=(J,V,P)=>{let C=P.data;if(C?.kind==="vault"){B?.recordSnapshot(J,V.snapshot,V.complete,C.receipt);return}if(C?.kind!=="pool")return;if(Z.peek().rows.find((T)=>T.id===J)?.credentialEpoch!==C.credentialEpoch){j?.debug("quota reading dropped: the row holds another credential",{accountId:J});return}Z.recordSnapshot(J,V.snapshot,C.token,V.complete)},h=(J,V,P)=>{let C=z(),A=P.data?.kind==="vault",T=A?B?.routes().find((x)=>x.id===J)?.quota:Z.peek().rows.find((x)=>x.id===J)?.quota,D=Q1(V2(T),V.reason,C,A$,V.retryAfterMs!==void 0?C+V.retryAfterMs:void 0);if(!A){Z.markRateLimited(J,D);return}let y=H.get(J);if(y===void 0||y<D)H.set(J,D)};return{adapter:u,attach(J){J.on("quota",(V)=>g(V.accountId,V.quota,V.handle)),J.on("limit",(V)=>{h(V.accountId,V.limit,V.handle),j?.debug("pool row refused the request",{accountId:V.accountId,via:V.via,reason:V.limit.reason,outputStarted:V.outputStarted})})},forgetSession(J){X.forget(J),W.delete(J),q.forget(J)}}}import{randomUUID as h$}from"node:crypto";import{chmod as v$,mkdir as f$,readFile as m$,rename as g$,rm as u$,stat as l$,writeFile as p$}from"node:fs/promises";import{dirname as c$,resolve as d$}from"node:path";var i$="(no OpenCode 1 logins on this machine)";function n$($=process.env){return E1($)}async function O2($){let Z;try{Z=await m$($,"utf8")}catch(z){if(z.code==="ENOENT")return;throw z}let X=JSON.parse(Z);if(!X||typeof X!=="object"||Array.isArray(X))throw Error(`${$} does not hold a JSON object`);return X}function b2($){return $===void 0?void 0:JSON.stringify($)}async function s$($){try{return(await l$($)).mode&511}catch(Z){if(Z.code==="ENOENT")return;throw Z}}function S1($=n$()){let Z=new Map;return{path:d$($),async get(X){let z=(await O2($))?.[X.path.id];return Z.set(X.path.id,b2(z)),z},async set(X){let z=X.path.id,j=await s$($),B=await O2($)??{};if(!Z.has(z)||Z.get(z)!==b2(B[z]))throw new k2;B[z]=X.body,await f$(c$($),{recursive:!0});let q=`${$}.${h$()}.tmp`;try{await p$(q,`${JSON.stringify(B,null,2)}
4
+ `,{mode:j??384}),await v$(q,j??384),await g$(q,$)}catch(F){throw await u$(q,{force:!0}).catch(()=>{}),F}return Z.set(z,b2(X.body)),!0},async all(){let X=await O2($);if(!X||Object.keys(X).length===0)return{[i$]:!0};return X}}}var a$="openai-auth-pool-browser",o$="openai-auth-pool-headless",r$="openai-auth-vault",t$="Vault login requires this OpenCode host to be enrolled in the Claustrum vault. Connect to the vault or disconnect this host before trying again.";async function J2($){if(await $.authority()!=="local")throw Error("This host is connected to the credential vault or its enrollment is unreadable; the login was not stored. Disconnect this host from the vault to add a local login.")}function k1($){return{method:{id:r$,type:"oauth",label:"ChatGPT accounts in the vault"},async activate(){if(await R1($.paths,$.name)!=="vault")throw Error(t$)}}}function y1($){let Z=(X,z,j)=>({method:{id:X,type:"oauth",label:z},async authorize(){if($.vault)await J2($.vault);let B=await $.beginLogin({version:$.version,headless:j});return{url:B.url,instructions:B.instructions,mode:"auto",callback:B.completion}}});return[Z(a$,"ChatGPT (openai-auth pool, browser)",!1),Z(o$,"ChatGPT (openai-auth pool, headless)",!0)]}function y2($){let Z=(X)=>typeof X==="string"?X:"";return X2({type:"oauth",access:Z($.access),refresh:Z($.refresh)})||$.refresh===O1||A1($)}function e$($){if($.accountId)return $.accountId;let Z=$.access?H2($.access):void 0;return Z?U2(Z):void 0}async function w1($,Z,X,z={}){if(z.vault)await J2(z.vault);if(y2(X))throw Error("the credential is not a ChatGPT login (a placeholder or a tombstone); it was not stored");let j=D1($,{rowLocks:(S)=>b1(Z,S)}),B=await j.read();if(B.status!=="ready")throw Error(`the account pool cannot be read (${B.status}); the login was not stored`);let q={type:"oauth",refresh:X.refresh,...X.access!==void 0?{access:X.access}:{},...X.expires!==void 0?{expires:X.expires}:{}},F=e$(X);if(z.vault)await J2(z.vault);let O=F!==void 0?{identity:F}:{};if(z.origin==="import"){let S=B.rows.find((v)=>F!==void 0&&v.identity===F||v.credential?.type==="oauth"&&v.credential.refresh===X.refresh);if(S)return{id:S.id,operation:"kept"}}let H=B.rows.filter((S)=>S.type==="oauth"&&!S.invalid),W=F?H.find((S)=>S.identity===F):void 0,k=B.rows.find((S)=>S.id===N2);if(W)return{id:(await j.replace(W.id,q,O)).id,operation:"replaced"};if(!k){let S=await j.add({id:N2,credential:q,...O,...X.label!==void 0?{label:X.label}:{}});return{id:S.id,operation:S.outcome==="added-disabled"?"added-disabled":"added"}}if(!k.invalid&&!k.credential)return{id:(await j.replace(N2,q,O)).id,operation:"replaced"};let b=await j.add({id:X.id,credential:q,...O,...X.label!==void 0?{label:X.label}:{}});return{id:b.id,operation:b.outcome==="added-disabled"?"added-disabled":b.outcome==="rotated"?"replaced":"added"}}function $Y($){if(!I1($.modelID??$.id)){$.enabled=!1;return}let Z=h1($.id);if(Z)$.limit={...Z}}function v1($){return $.model.transform((Z)=>{for(let X of Z.list(n))Z.update(n,String(X.id),(z)=>$Y(z))})}var YY=1024;class w2{pins=new Map;limit;constructor($=YY){this.limit=Math.max(1,$)}get($){return this.pins.get($)?.accountId}forget($){this.pins.delete($)}get size(){return this.pins.size}set($,Z){this.pins.delete($),this.pins.set($,Z);while(this.pins.size>this.limit){let X=this.pins.keys().next().value;if(X===void 0)break;this.pins.delete(X)}}place($){return f1(this.pins,$,(Z,X)=>this.set(Z,X))}}var F2="cortexkit-openai-auth",ZY=5000;async function m1($,Z,X){let z=new Map,j=new Map,B=(H)=>{j.delete(H);for(let W of z.keys())if(W.startsWith(`${H}:`))z.delete(W)},F=await q2({session:{hook:(H,W,k)=>$.session.hook(H,async(b)=>{let S=H==="http.request"?b:void 0,v=H==="experimental.ws.handshake"?b:void 0,d=(S?S.request.headers:v?new Headers(v.headers):void 0)?.get("authorization")===`Bearer ${a(Z.providerID)}`;try{await W(b)}catch(I){if(d&&!(I instanceof c))throw o1(I);throw I}if(S||v){let I=S??v;if(!I)return;let g=(S?S.request.headers:new Headers(I.headers)).get("authorization")?.replace(/^Bearer /,"");if(d&&g)j.set(I.sessionID,g);else j.delete(I.sessionID);if(v){let h=`${v.sessionID}:${v.kind}`;if(d&&g)z.set(h,g);else z.delete(h)}if(j.size>512){let h=j.keys().next().value;if(h)j.delete(h)}if(z.size>512){let h=z.keys().next().value;if(h)z.delete(h)}}else if(H==="experimental.ws.receive"){let I=b,u=z.get(`${I.sessionID}:${I.kind}`);if(u)I.frame=r1(I.frame,u)}else if(H==="retry"){let I=b,u=j.get(I.sessionID);if(u)Object.assign(I.error,{message:a1(I.error.message,u)})}},k)},event:{subscribe:(H)=>async function*(){for await(let W of $.event.subscribe(H)){if(W.type==="session.deleted")B(W.data.sessionID);yield W}}()}},{...Z,rewriteResponse:async(H)=>{let W=await Z.rewriteResponse?.(H)??H.response;return t1(W,H.request.headers.get("authorization")?.replace(/^Bearer /,""),"event-stream")}},{gateOnPlaceholder:{credential:(H)=>{let W=H.get("authorization");return W?.startsWith("Bearer ")?W.slice(7):void 0}},logger:{warn:(H,W)=>X.warn(H,{data:W})}}),O=F.dispose;return{...F,dispose:async()=>{j.clear(),z.clear(),await O()}}}function v2($={}){return{id:F2,setup:(Z)=>KY(Z,$)}}async function KY($,Z={}){let f=[];try{let X=j2("opencode2");let z=j2("quota");let j=Z.paths??(()=>$$(e1()));let B=Z.fetch??fetch;let q=Z.version??X$;let F=Z.poolMigration??W$;if(!F&&!G2(j().configPath)){X.info("openai-auth stands aside on OpenCode 2: this install has not moved into the account pool and the migration is switched off, so OpenCode 2 serves its own ChatGPT login");let U=(R)=>{throw new c({kind:"no-account",providerID:n,sessionID:R.sessionID,requestKind:R.kind,message:C2})},L=await m1($,{providerID:n,chooseAccount:U,accountHeaders:U},X);return()=>L.dispose()}let O=Z.vault?.firstRosterWaitMs??j$;let H=V$({host:"opencode",stateDir:Z.vault?.stateDir??s1(j().statePath),reservedRouteIds:()=>m.peek().rows.map((U)=>U.id),...Z.vault?.connectionFile?{connectionFile:Z.vault.connectionFile}:{},...Z.vault?.connectScoped?{connectScoped:Z.vault.connectScoped}:{},...Z.vault?.connectEnrollment?{connectEnrollment:Z.vault.connectEnrollment}:{},...Z.vault?.pollIntervalMs!==void 0?{pollIntervalMs:Z.vault.pollIntervalMs}:{},fetchImpl:()=>B},j());let W=H.vault;let k=!1;let b=!1;const S=g1(f,{[Symbol.dispose](){if(!k)H.release()}},0);await W.authority();let v=H.firstRoster;let m=new G$({paths:j,refreshProvider:async(U)=>{let L=await c1({refreshToken:U.refresh,fetchImpl:B,now:Date.now}),R=l1({id_token:"",access_token:L.access,refresh_token:L.refresh});return{...L,...R?{identity:R}:{}}},pullQuota:async(U)=>{let L=U.credential;if(L.type!=="oauth"||!L.access)throw Error("the row holds no access token to poll with");let R=await d1({accessToken:L.access,fetchImpl:B,now:Date.now,...U.identity?{accountId:U.identity}:{},accountKey:U.id,logger:z});return n1(R,Date.now(),!0)},vaultIdentities:()=>W.identities(),vaultMode:()=>W.enrolled(),vaultAuthority:()=>W.authority(),vaultFirstRoster:v,vaultFirstRosterBackgroundWaitMs:O,log:j2("pool")});await m.load();let d=Z.heartbeat===!1?void 0:await B$({version:q,logger:j2("heartbeat")});let I=Z.fence??(()=>z$({currentVersion:q}));let u=Z.slot??S1();let g=async()=>Y$(j(),await u.get({path:{id:"openai"}}));let h=!1;let J=F?Q$({paths:j,slot:u,version:q,fence:I,runDeps:{vaultServes:()=>W.serves()},paused:async()=>await W.authority()!=="local",migrate:async(U)=>{let L=await Z$(U);if(h=L.status==="refused",!b)await m.load();return L},adopt:async(U)=>{if(b)return{status:"retry",reason:"unsettled"};if(!await h2(v,O))return{status:"retry",reason:"vault-roster-pending"};if(b)return{status:"retry",reason:"unsettled"};let L=await K$(U);if(!b)await m.load();return L}}):void 0;J?.start();H.start();let V=new w2;let P=x1({source:m,slotPlaceholderWithoutMain:g,storage:()=>i1(j()),pins:V,vault:W,awaitVaultRoster:async()=>{await h2(v,J$)},responsesLite:()=>I2().responsesLite,codexEndpoint:()=>I2().codexApiEndpoint,log:X});let C=await m1($,P.adapter,X);P.attach(C);let A=async(U)=>{if(await J2(W),G2(j().configPath))return;if(await J?.idle(),G2(j().configPath))return;if(h&&!y2(U)&&(await I()).open){await m.poolStore().initialize();return}throw Error("OpenAI accounts move to the shared account pool once every OpenCode process on this machine runs this version of openai-auth; the login was not stored. Update or close the older processes and sign in again.")};let T=async(U)=>{await A(U);let L=await w1(m.poolStore(),j(),U,{vault:W});if(!G2(j().configPath))await J?.requestAdoption();await m.load(),X.info("ChatGPT login stored in the account pool",L)};let D=await M2($,{integrationID:n,methods:y1({beginLogin:Z.beginLogin??p1,version:q,vault:W}),onLogin:(U)=>T(U),label:"ChatGPT (openai-auth account pool)",vault:k1(W)});let y=await v1($);let x=new AbortController;(async()=>{try{for await(let U of $.event.subscribe({signal:x.signal}))if(U.type==="session.deleted")P.forgetSession(U.data.sessionID)}catch(U){if(!x.signal.aborted)X.warn("stopped listening for session deletion",{error:U instanceof Error?U.message:String(U)})}})();k=!0;return async()=>{b=!0,x.abort(),J?.dispose(),m.dispose(),await Promise.allSettled([C.dispose(),D.dispose(),y.dispose()]);let U;try{await Promise.race([Promise.all([J?.idle(),m.settled()]),new Promise((L)=>{U=setTimeout(L,ZY),U.unref?.()})])}finally{clearTimeout(U),H.release(),await d?.release()}}}catch(i){var p=i,l=1}finally{u1(f,p,l)}}var zY=v2(),_Z={id:F2,setup:zY.setup,server:H$.server};export{_Z as default,v2 as createOpenAIAuthPlugin,F2 as OPENAI_AUTH_PLUGIN_ID};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-openai-auth",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
@@ -493,16 +493,16 @@ function mergeQuotaByWindow(incoming, existing) {
493
493
  export function setSidebarMachineState(machineState, file = getSidebarStateFile(), hooks) {
494
494
  return enqueueSidebarWrite(async () => {
495
495
  await writeMergedSidebarState(file, (latest) => {
496
- const latestFallbacks = new Map(latest.fallbacks.map((account) => [account.id, account])), mainSameIdentity = sameAccountIdentity(machineState.main.mainAccountId, latest.main.mainAccountId), mergedMainQuota = mainSameIdentity ? mergeQuotaByWindow(machineState.main.quota, latest.main.quota) : freshestQuota(machineState.main.quota, latest.main.quota), now = Date.now(), stickyAssignments = pruneStickyAssignments(latest.stickyAssignments, usableRoutingAccountIds(routingAccountsOf(machineState)), now);
496
+ const latestFallbacks = new Map(latest.fallbacks.map((account) => [account.id, account])), vaultMode = machineState.vaultAccounts !== void 0, mainSameIdentity = sameAccountIdentity(machineState.main.mainAccountId, latest.main.mainAccountId), mergedMainQuota = mainSameIdentity ? mergeQuotaByWindow(machineState.main.quota, latest.main.quota) : freshestQuota(machineState.main.quota, latest.main.quota), now = Date.now(), stickyAssignments = pruneStickyAssignments(latest.stickyAssignments, usableRoutingAccountIds(routingAccountsOf(machineState)), now);
497
497
  return {
498
498
  ...latest,
499
499
  ...machineState,
500
- main: {
500
+ main: vaultMode ? machineState.main : {
501
501
  ...machineState.main,
502
502
  quota: mergedMainQuota,
503
503
  mainAccountId: mainSameIdentity ? machineState.main.mainAccountId : mergedMainQuota === latest.main.quota && mergedMainQuota !== machineState.main.quota ? latest.main.mainAccountId : machineState.main.mainAccountId
504
504
  },
505
- fallbacks: machineState.fallbacks.map((account) => {
505
+ fallbacks: vaultMode ? machineState.fallbacks : machineState.fallbacks.map((account) => {
506
506
  const existing = latestFallbacks.get(account.id), fallbackSameIdentity = sameAccountIdentity(account.accountId, existing?.accountId), mergedQuota = fallbackSameIdentity ? mergeQuotaByWindow(account.quota, existing?.quota ?? null) : freshestQuota(account.quota, existing?.quota ?? null);
507
507
  return {
508
508
  ...account,
@@ -493,16 +493,16 @@ function mergeQuotaByWindow(incoming, existing) {
493
493
  export function setSidebarMachineState(machineState, file = getSidebarStateFile(), hooks) {
494
494
  return enqueueSidebarWrite(async () => {
495
495
  await writeMergedSidebarState(file, (latest) => {
496
- const latestFallbacks = new Map(latest.fallbacks.map((account) => [account.id, account])), mainSameIdentity = sameAccountIdentity(machineState.main.mainAccountId, latest.main.mainAccountId), mergedMainQuota = mainSameIdentity ? mergeQuotaByWindow(machineState.main.quota, latest.main.quota) : freshestQuota(machineState.main.quota, latest.main.quota), now = Date.now(), stickyAssignments = pruneStickyAssignments(latest.stickyAssignments, usableRoutingAccountIds(routingAccountsOf(machineState)), now);
496
+ const latestFallbacks = new Map(latest.fallbacks.map((account) => [account.id, account])), vaultMode = machineState.vaultAccounts !== void 0, mainSameIdentity = sameAccountIdentity(machineState.main.mainAccountId, latest.main.mainAccountId), mergedMainQuota = mainSameIdentity ? mergeQuotaByWindow(machineState.main.quota, latest.main.quota) : freshestQuota(machineState.main.quota, latest.main.quota), now = Date.now(), stickyAssignments = pruneStickyAssignments(latest.stickyAssignments, usableRoutingAccountIds(routingAccountsOf(machineState)), now);
497
497
  return {
498
498
  ...latest,
499
499
  ...machineState,
500
- main: {
500
+ main: vaultMode ? machineState.main : {
501
501
  ...machineState.main,
502
502
  quota: mergedMainQuota,
503
503
  mainAccountId: mainSameIdentity ? machineState.main.mainAccountId : mergedMainQuota === latest.main.quota && mergedMainQuota !== machineState.main.quota ? latest.main.mainAccountId : machineState.main.mainAccountId
504
504
  },
505
- fallbacks: machineState.fallbacks.map((account) => {
505
+ fallbacks: vaultMode ? machineState.fallbacks : machineState.fallbacks.map((account) => {
506
506
  const existing = latestFallbacks.get(account.id), fallbackSameIdentity = sameAccountIdentity(account.accountId, existing?.accountId), mergedQuota = fallbackSameIdentity ? mergeQuotaByWindow(account.quota, existing?.quota ?? null) : freshestQuota(account.quota, existing?.quota ?? null);
507
507
  return {
508
508
  ...account,