@cortexkit/opencode-anthropic-auth 1.19.1 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +119 -2
  2. package/dist/cache-diagnostics.d.ts +79 -0
  3. package/dist/cli.js +2 -2
  4. package/dist/index-1db17bc2.js +2 -0
  5. package/dist/{index-dex8fs0m.js → index-4nz423bt.js} +1 -1
  6. package/dist/{index-dzs7w297.js → index-4x20896x.js} +1 -1
  7. package/dist/{index-2k47hc8b.js → index-w9d41yy9.js} +1 -1
  8. package/dist/index-wezdyxst.js +2 -0
  9. package/dist/{index-075t8qec.js → index-y0khnbt6.js} +1 -1
  10. package/dist/index-yskwj5e6.js +428 -0
  11. package/dist/index.d.ts +0 -37
  12. package/dist/index.js +23 -19
  13. package/dist/lane-start.d.ts +17 -0
  14. package/dist/{logger-n49md99d.js → logger-ftk4bg3p.js} +1 -1
  15. package/dist/prime-manager-registry.d.ts +7 -0
  16. package/dist/request-policy.d.ts +25 -0
  17. package/dist/rpc/port-file.js +1 -1
  18. package/dist/rpc/protocol.d.ts +2 -1
  19. package/dist/rpc/protocol.js +1 -0
  20. package/dist/rpc/rpc-client.js +1 -1
  21. package/dist/rpc/rpc-dir.js +1 -1
  22. package/dist/server-fallback.d.ts +2 -0
  23. package/dist/sidebar-state.d.ts +26 -1
  24. package/dist/sidebar-state.js +1 -1
  25. package/dist/transform.d.ts +13 -0
  26. package/dist/tui/command-dialogs.d.ts +16 -1
  27. package/dist/tui-preferences.js +1 -1
  28. package/package.json +4 -4
  29. package/src/rpc/protocol.ts +15 -10
  30. package/src/sidebar-state.ts +154 -17
  31. package/src/tui/command-dialogs.tsx +112 -0
  32. package/src/tui-compiled/rpc/protocol.ts +15 -10
  33. package/src/tui-compiled/sidebar-state.ts +154 -17
  34. package/src/tui-compiled/tui/command-dialogs.tsx +134 -18
  35. package/src/tui-compiled/tui.tsx +43 -1
  36. package/src/tui.tsx +28 -0
  37. package/dist/index-a13w4gm9.js +0 -2
  38. package/dist/index-vwgzgh5x.js +0 -422
@@ -1,422 +0,0 @@
1
- import{ic as CC,mc as h,nc as r,oc as E}from"./index-dex8fs0m.js";import{vc as uC}from"./index-dzs7w297.js";var Q0="9d1c250a-e61b-44d9-88ed-5944d1962f5e",p$={console:"https://platform.claude.com/oauth/authorize",max:"https://claude.com/cai/oauth/authorize"},C$="https://platform.claude.com/oauth/code/callback",_$="https://platform.claude.com/v1/oauth/token",K$="axios/1.15.2",g$=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"],d$="user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload",lG="mcp_";var u$="fast-mode-2026-02-01";function pG($,C){let _=($??"").split(",").map((K)=>K.trim()).filter(Boolean);return[...new Set([..._,...C])].join(",")}function gG($){return typeof $==="string"&&($.startsWith("claude-opus-4-6")||$.startsWith("claude-opus-4-7")||$.startsWith("claude-opus-4-8")||$.startsWith("claude-opus-5"))}var dG="You are OpenCode",uG="You are Claude Code, Anthropic's official CLI for Claude.",iG=["<use_parallel_tool_calls>","For maximum efficiency, whenever you perform multiple independent operations, invoke all relevant tools simultaneously rather than sequentially. Prioritize calling independent tools in parallel whenever possible. For example, when reading 3 known files, run 3 tool calls in parallel to read all 3 files into context at the same time. When running multiple independent read-only commands like `ls` or `list_dir`, run all of those commands in parallel. Err on the side of maximizing parallel tool calls for independent work rather than running too many tools sequentially.","","Do not parallelize tool calls when one call depends on the output of another call. If a tool call needs an ID, filename, search result, or any other value returned by a previous tool call, run the first call, wait for its result, then run the dependent call using the real returned value. Never invent placeholder IDs, guessed task IDs, or other guessed values for dependent tool calls just to place them in the same parallel block.","</use_parallel_tool_calls>"].join(`
2
- `);var d="2.1.177",G$="3bf",i$="cli",c$="0.94.0",r$="v24.3.0",s$="claude-cli/2.1.177 (external, cli)",n$=["explicit","automatic","hybrid"],B0="explicit",cG=["github.com/anomalyco/opencode","opencode.ai/docs"],rG=[{match:"if OpenCode honestly",replacement:"if the assistant honestly"},{match:"Here is some useful information about the environment you are running in:",replacement:"Environment context you are running in:"}];function o$($){let C="";for(let _ of $)C+=String.fromCharCode(_);return btoa(C).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function a$(){let $=new Uint8Array(64);crypto.getRandomValues($);let C=o$($),_=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(C));return{verifier:C,challenge:o$(new Uint8Array(_)),method:"S256"}}function J$($){if(!$)return;let C=Number($);if(Number.isFinite(C)&&C>0)return Math.ceil(C);let _=Date.parse($);if(Number.isFinite(_)){let K=Math.ceil((_-Date.now())/1000);return K>0?K:void 0}return}class j$ extends Error{status;body;retryAfter;isRefreshError=!0;constructor($,C,_){super(`Claude OAuth refresh failed: ${$} — ${C}`);this.status=$,this.body=C,this.name="ClaudeOAuthRefreshError",this.retryAfter=J$(_??void 0)}}function vC($){if(!($ instanceof Error))return!1;let C=$.code;return $.message.includes("fetch failed")||C==="ECONNRESET"||C==="ECONNREFUSED"||C==="ETIMEDOUT"||C==="UND_ERR_CONNECT_TIMEOUT"}async function t$($){let C=$.fetchImpl??fetch,_=$.maxRetries??2,K=$.baseDelayMs??500,G=$.setTimeoutImpl??globalThis.setTimeout;for(let j=0;j<=_;j++)try{if(j>0){let X=K*2**(j-1);await new Promise((Y)=>G(Y,X))}let J=await C(_$,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":K$},body:JSON.stringify({grant_type:"refresh_token",refresh_token:$.refreshToken,client_id:Q0,scope:d$})});if(!J.ok){if(J.status>=500&&j<_){await J.body?.cancel().catch(()=>{});continue}let X=await J.text().catch(()=>"");throw new j$(J.status,X,J.headers.get("retry-after"))}let Z=await J.json(),z=$.now?.()??Date.now();return{access:Z.access_token,refresh:Z.refresh_token??$.refreshToken,expires:z+Z.expires_in*1000,expiresIn:Z.expires_in}}catch(J){if(J instanceof j$)throw J;if(j<_&&vC(J))continue;throw J}throw Error("Token refresh exhausted all retries")}function lC(){return crypto.randomUUID().replace(/-/g,"")}function pC($){let C=$.trim();try{let J=new URL(C),Z=J.searchParams.get("code"),z=J.searchParams.get("state");if(Z&&z)return{code:Z,state:z}}catch{}let _=C.split("#");if(_.length===2&&_[0]&&_[1])return{code:_[0],state:_[1]};let K=new URLSearchParams(C),G=K.get("code"),j=K.get("state");if(G&&j)return{code:G,state:j};return null}async function gC($,C,_){let K=await fetch(_$,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":K$},body:JSON.stringify({code:$.code,state:$.state,grant_type:"authorization_code",client_id:Q0,redirect_uri:_,code_verifier:C})});if(!K.ok)return{type:"failed"};let G=await K.json();return{type:"success",refresh:G.refresh_token,access:G.access_token,expires:Date.now()+G.expires_in*1000}}async function tG($){let C=await a$(),_=lC(),K=new URL(p$[$],import.meta.url);return K.searchParams.set("code","true"),K.searchParams.set("client_id",Q0),K.searchParams.set("response_type","code"),K.searchParams.set("redirect_uri",C$),K.searchParams.set("scope",g$.join(" ")),K.searchParams.set("code_challenge",C.challenge),K.searchParams.set("code_challenge_method","S256"),K.searchParams.set("state",_),{url:K.toString(),redirectUri:C$,state:_,verifier:C.verifier}}async function eG($,C,_,K){let G=pC($);if(!G)return{type:"failed"};if(K&&G.state!==K)return{type:"failed"};return gC(G,C,_)}import{createHash as dC}from"node:crypto";function D($){return dC("sha256").update($).digest("hex").slice(0,16)}import{createHash as Y1,randomUUID as N0}from"node:crypto";import{mkdir as Y$,readFile as D0,rename as O1,rm as $0,stat as e$,writeFile as S0}from"node:fs/promises";import{homedir as iC}from"node:os";import{dirname as O$,join as C0}from"node:path";var cC=globalThis.setTimeout.bind(globalThis),rC=globalThis.clearTimeout.bind(globalThis),N1="anthropic-auth.json",sC="anthropic-auth-state.json",nC="https://api.anthropic.com/api/oauth/usage";function m($){return $.type==="oauth"}function O2($){return $.type==="api"}function oC($){let C=$?.trim();if(!C)return!1;try{let _=new URL(C);return(_.protocol==="http:"||_.protocol==="https:")&&!_.username&&!_.password}catch{return!1}}function N2($){return $.costZeroing?.enabled!==!1}var aC=[401,403,429],L1=240,tC=L1;var eC=300000,$6=3600000,W1=86400000,C6=60000,_6=900000,K6=300000,G6=5,$1={five_hour:0,seven_day:0},j6=!0,J6=60000,Z6=60000,z6=600000,X6=1e4,Y6=100;function O6(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return C0(process.env.XDG_CONFIG_HOME||C0(iC(),".config"),"opencode")}function M(){return process.env.OPENCODE_ANTHROPIC_AUTH_FILE?.trim()||C0(O6(),N1)}function N$($=M()){let C=process.env.OPENCODE_ANTHROPIC_AUTH_STATE_FILE?.trim();if(C)return C;return $.endsWith(N1)?C0(O$($),sC):`${$}.state.json`}function U($){return $!=null&&typeof $==="object"&&!Array.isArray($)}function C1($){return{id:typeof $.id==="string"&&$.id.trim()?$.id.trim():N0(),label:typeof $.label==="string"?$.label:void 0,enabled:typeof $.enabled==="boolean"?$.enabled:void 0,addedAt:typeof $.addedAt==="number"?$.addedAt:void 0,lastUsed:typeof $.lastUsed==="number"?$.lastUsed:void 0}}function N6($){if(!U($))return null;if($.type==="api"){let C=typeof $.baseURL==="string"?$.baseURL.trim():"",_=typeof $.apiKey==="string"?$.apiKey.trim():"";if(!oC(C))return null;let K=$.authHeader==="x-api-key"?"x-api-key":"authorization-bearer";return{...C1($),type:"api",apiKey:_||void 0,baseURL:C,authHeader:K}}if($.type!=="oauth")return null;if(typeof $.refresh!=="string"||!$.refresh.trim())return null;return{...C1($),type:"oauth",access:typeof $.access==="string"?$.access:void 0,refresh:$.refresh,expires:typeof $.expires==="number"?$.expires:void 0,lastRefreshedAt:typeof $.lastRefreshedAt==="number"?$.lastRefreshedAt:void 0,lastRefreshError:_1($.lastRefreshError),lastQuotaRefreshError:_1($.lastQuotaRefreshError),quota:L6($.quota),profile:L0($.profile)}}function L0($){if(!U($))return;if(typeof $.tier!=="string"||!$.tier.trim()||typeof $.orgType!=="string"||!$.orgType.trim()||typeof $.checkedAt!=="number"||!Number.isFinite($.checkedAt))return;return{tier:$.tier.trim(),orgType:$.orgType.trim(),checkedAt:$.checkedAt,...typeof $.tokenFingerprint==="string"&&$.tokenFingerprint.trim()&&{tokenFingerprint:$.tokenFingerprint.trim()}}}function _1($){if(!U($))return;if(typeof $.message!=="string")return;let C=Number($.checkedAt);if(!Number.isFinite(C))return;let _=Number($.nextRetryAt),K=Number($.retryCount),G=Number($.status);return{message:$.message,checkedAt:C,nextRetryAt:Number.isFinite(_)?_:void 0,retryCount:Number.isFinite(K)?K:void 0,tokenHash:typeof $.tokenHash==="string"?$.tokenHash:void 0,status:Number.isFinite(G)?G:void 0,permanent:typeof $.permanent==="boolean"?$.permanent:void 0}}function K1($){if(!U($))return;let C=Number($.usedPercent),_=Number($.remainingPercent),K=Number($.checkedAt);if(!Number.isFinite(C)||!Number.isFinite(_)||!Number.isFinite(K))return;return{usedPercent:C,remainingPercent:_,checkedAt:K,resetsAt:typeof $.resetsAt==="string"?$.resetsAt:void 0}}function L6($){if(!U($))return;let C={};for(let _ of["five_hour","seven_day"]){let K=K1($[_]);if(K)C[_]=K}if(typeof $.checkedAt==="number"&&Number.isFinite($.checkedAt))C.checkedAt=$.checkedAt;if(Array.isArray($.scoped)){let _=$.scoped.map((K)=>{if(!U(K))return;let G=K1(K);if(!G)return;if(typeof K.id!=="string"||!K.id.trim())return;if(typeof K.title!=="string"||!K.title.trim())return;if(typeof K.modelName!=="string"||!K.modelName.trim())return;let j=typeof K.modelId==="string"&&K.modelId.trim()?K.modelId.trim():void 0;return{...G,id:K.id.trim(),title:K.title.trim(),...j&&{modelId:j},modelName:K.modelName.trim()}}).filter((K)=>K!=null);C.scoped=_}if(U($.extraUsage)){let _=G1($.extraUsage.used),K=G1($.extraUsage.limit);if(_&&K&&typeof $.extraUsage.exhausted==="boolean")C.extraUsage={used:_,limit:K,...typeof $.extraUsage.utilizationPercent==="number"&&Number.isFinite($.extraUsage.utilizationPercent)&&{utilizationPercent:$.extraUsage.utilizationPercent},...typeof $.extraUsage.severity==="string"&&{severity:$.extraUsage.severity},exhausted:$.extraUsage.exhausted}}if(typeof $.bindingWindow==="string"&&$.bindingWindow.trim())C.bindingWindow=$.bindingWindow.trim();if($.bindingWindowSource==="poll"||$.bindingWindowSource==="headers")C.bindingWindowSource=$.bindingWindowSource;if(typeof $.fallbackAdvised==="boolean")C.fallbackAdvised=$.fallbackAdvised;if($.source==="poll"||$.source==="headers")C.source=$.source;return Object.keys(C).length?C:void 0}function G1($){if(!U($))return;if(typeof $.amountMinor!=="number"||!Number.isFinite($.amountMinor)||typeof $.currency!=="string"||!$.currency.trim()||typeof $.exponent!=="number"||!Number.isFinite($.exponent))return;return{amountMinor:$.amountMinor,currency:$.currency.trim(),exponent:$.exponent}}function T(){return{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]}}function W6($){if(!U($)||!Array.isArray($.accounts))return null;return{version:1,main:{type:"opencode",provider:"anthropic",profile:L0(U($.main)?$.main.profile:void 0)},routing:U($.routing)?$.routing:void 0,fallbackOn:Array.isArray($.fallbackOn)?$.fallbackOn.filter((C)=>Number.isInteger(C)):void 0,refresh:U($.refresh)?$.refresh:void 0,quota:U($.quota)?$.quota:void 0,claudeCache:U($.claudeCache)?$.claudeCache:void 0,dump:U($.dump)?$.dump:void 0,claudeFast:U($.claudeFast)?$.claudeFast:void 0,costZeroing:U($.costZeroing)?$.costZeroing:void 0,cacheKeep:U($.cacheKeep)?$.cacheKeep:void 0,relay:U($.relay)?$.relay:void 0,logging:U($.logging)?$.logging:void 0,killswitch:U($.killswitch)?$.killswitch:void 0,accounts:$.accounts.map(N6).filter((C)=>C!=null)}}async function W0($){try{return{exists:!0,value:JSON.parse(await D0($,"utf8"))}}catch(C){if(C.code==="ENOENT")return{exists:!1,value:null};let _=C instanceof Error?C.message:String(C);throw Error(`account store at ${$} is corrupt or unreadable (${_}) — fix or remove it`)}}function n($){return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0))}function R0($){return typeof $==="number"&&Number.isFinite($)?$:0}function X$($){return Math.max(R0($.lastRefreshedAt),R0($.lastUsed),R0($.addedAt))}function H6($,C){if($.type!=="oauth")return!1;if(typeof $.refresh!=="string"||!$.refresh.trim())return!1;if(!Boolean(typeof $.access==="string"&&typeof C.access==="string"&&$.access!==C.access||typeof $.refresh==="string"&&typeof C.refresh==="string"&&$.refresh!==C.refresh))return!1;return X$($)>X$(C)}function F6($,C){if(H6($,C)){let _={...C,...$},K=X$($);if(K>R0(_.lastRefreshedAt))_.lastRefreshedAt=K;return delete _.quota,delete _.lastRefreshError,delete _.lastQuotaRefreshError,_}return{...$,...C}}function U6($,C){if(!U($))return $;let _=U(C)?C:{},K=U(_.main)?_.main:void 0,G=U(_.accounts)?_.accounts:{},j=U($.quota)?$.quota:{},J=U($.refresh)?$.refresh:{},Z=K??j,z=K??J,X=Array.isArray($.accounts)?$.accounts.map((Y)=>{if(!U(Y))return Y;let N=typeof Y.id==="string"&&U(G[Y.id])?G[Y.id]:{};return F6(Y,N)}):[];return{...$,main:{type:"opencode",provider:"anthropic",profile:L0(K?.profile)},refresh:n({...J,mainLastRefreshError:z.lastRefreshError,mainRefreshLeaseId:z.refreshLeaseId,mainRefreshLeaseUntil:z.refreshLeaseUntil,mainRefreshLeaseTokenHash:z.refreshLeaseTokenHash}),quota:n({...j,mainQuota:Z.quota,mainQuotaCheckedAt:Z.quotaCheckedAt,mainQuotaToken:Z.quotaToken,mainLastQuotaApiError:Z.lastQuotaApiError}),accounts:X}}async function S($=M()){let C=await W0($),_=await W0(N$($));if(!C.exists&&!_.exists)return null;let K=C.exists?C.value:T();return W6(U6(K,_.value))}async function V6($){let C=await W0($);return U(C.value)?C.value:{}}function b6($){return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0))}function M6($){return n({id:$.id,label:$.label,type:$.type,enabled:$.enabled,addedAt:$.addedAt,baseURL:$.type==="api"?$.baseURL:void 0,authHeader:$.type==="api"?$.authHeader:void 0})}function E6($){if($.type==="api")return n({apiKey:$.apiKey,lastUsed:$.lastUsed});return n({access:$.access,refresh:$.refresh,expires:$.expires,lastUsed:$.lastUsed,lastRefreshedAt:$.lastRefreshedAt,lastRefreshError:$.lastRefreshError,lastQuotaRefreshError:$.lastQuotaRefreshError,quota:$.quota,profile:$.profile})}function H0($){return Math.max($?.five_hour?.checkedAt??0,$?.seven_day?.checkedAt??0,...$?.scoped?.map((C)=>C.checkedAt)??[],$?.checkedAt??0)}function _0($){if($?.source==="poll")return 2;if($?.source==="headers")return 1;return 0}function f6($,C){if(!("scoped"in $))return C.scoped;if(!Array.isArray($.scoped)||$.scoped.length===0)return $.scoped;if(!Array.isArray(C.scoped)||C.scoped.length===0)return $.scoped;let _=new Map(C.scoped.map((K)=>[K.id,K]));for(let K of $.scoped){let G=_.get(K.id);if(!G||K.checkedAt>=G.checkedAt)_.set(K.id,K)}return[..._.values()]}function j1($,C,_){let K=$[_],G=C[_];if(!G)return K;if(!K)return G;if(G.checkedAt>K.checkedAt)return G;if(G.checkedAt<K.checkedAt)return K;return _0($)>_0(C)?K:G}function H1($,C){if(!$||C.source!=="headers")return C;let _=$.bindingWindowSource==="poll";return{...$,...C,five_hour:j1($,C,"five_hour"),seven_day:j1($,C,"seven_day"),scoped:f6($,C),extraUsage:$.extraUsage??C.extraUsage,bindingWindow:_?$.bindingWindow:C.bindingWindow??$.bindingWindow,bindingWindowSource:_?"poll":C.bindingWindowSource??$.bindingWindowSource}}function Q6($,C){if(!U($))return C;let _=$,K=Boolean(_.access&&C.access&&_.access!==C.access||_.refresh&&C.refresh&&_.refresh!==C.refresh),G=Boolean(!K&&C.quota?.source==="headers"),j=G&&C.quota?{...C,quota:H1(_.quota,C.quota)}:C,J=H0(_.quota),Z=H0(j.quota),z=Boolean(J===Z&&_0(_.quota)>_0(j.quota));if(!G&&(J>Z||z)){let Y=_.lastRefreshedAt??0,N=j.lastRefreshedAt??0;if(K&&N<=Y){let L={..._};if(typeof j.lastUsed==="number"&&(typeof _.lastUsed!=="number"||j.lastUsed>_.lastUsed))L.lastUsed=j.lastUsed;return L}let O={..._,...j};if(K){if(!("profile"in j))delete O.profile;if(j.quota?.source)O.quota=j.quota;else delete O.quota;if(!("lastQuotaRefreshError"in j))delete O.lastQuotaRefreshError;if(!("lastRefreshError"in j))delete O.lastRefreshError;return O}return{...O,quota:_.quota,lastQuotaRefreshError:_.lastQuotaRefreshError}}let X={..._,...j};if(K){if(!("profile"in j))delete X.profile;if(!j.quota?.source)delete X.quota}if(!("lastQuotaRefreshError"in j))delete X.lastQuotaRefreshError;if(!("lastRefreshError"in j))delete X.lastRefreshError;return X}function B6($){let C=$.refresh?n({enabled:$.refresh.enabled,intervalMinutes:$.refresh.intervalMinutes,refreshBeforeExpiryMinutes:$.refresh.refreshBeforeExpiryMinutes}):void 0,_=$.quota?n({enabled:$.quota.enabled,checkIntervalMinutes:$.quota.checkIntervalMinutes,refreshEveryNRequests:$.quota.refreshEveryNRequests,minimumRemaining:$.quota.minimumRemaining,failClosedOnUnknownQuota:$.quota.failClosedOnUnknownQuota,showToasts:$.quota.showToasts}):void 0;return b6({version:1,main:{type:"opencode",provider:"anthropic"},routing:$.routing,fallbackOn:$.fallbackOn,refresh:C,quota:_,claudeCache:$.claudeCache,dump:$.dump,logging:$.logging,claudeFast:$.claudeFast,costZeroing:$.costZeroing,cacheKeep:$.cacheKeep,relay:$.relay,killswitch:$.killswitch,accounts:$.accounts.map(M6)})}var J1=Promise.resolve();function L$($){return new Promise((C,_)=>{J1=J1.then(()=>$().then(C,_),()=>$().then(C,_))})}async function W$($,C){await Y$(O$($),{recursive:!0});let _=`${$}.${N0()}.tmp`;await S0(_,`${JSON.stringify(C,null,2)}
3
- `,{encoding:"utf8",mode:384});try{await O1(_,$)}catch(K){throw await $0(_,{force:!0}).catch(()=>{}),K}}function Z1($,C){return $.id===C.id||Boolean($.label&&C.label&&$.label===C.label)}function D6($,C,_){let K=new Set(_.removedAccountIds??[]),G=$.filter((X)=>!K.has(X.id)),j=C.filter((X)=>!K.has(X.id)),J=G.filter((X)=>!j.some((Y)=>Z1(Y,X)));if(!J.length)return[...j];if(_.preserveExistingAccountOrder===!1)return[...j,...J];let Z=new Set,z=G.map((X)=>{let Y=j.findIndex((O,L)=>!Z.has(L)&&Z1(O,X)),N=j[Y];if(!N)return X;return Z.add(Y),N});for(let X=0;X<j.length;X++){let Y=j[X];if(!Z.has(X)&&Y)z.push(Y)}return z}var S6=1e4,R6=12000,A6=1e4,q6=12000;async function F1($){let{path:C,name:_,ttlMs:K,waitMs:G,description:j}=$;await Y$(O$(C),{recursive:!0});let J=Date.now()+G;while(!0){let Z=await o({name:_,ttlMs:K,path:C,renew:!0});if(Z)return Z;if(Date.now()>=J)throw Error(`Timed out waiting for the account ${j} lock`);await new Promise((z)=>setTimeout(z,25))}}function U1($){return F1({path:$,name:"config-write",ttlMs:S6,waitMs:R6,description:"configuration write"})}function H$($){return F1({path:$,name:"state-write",ttlMs:A6,waitMs:q6,description:"state write"})}function q($,C=M(),_={}){let K=C;return L$(()=>P6($,K,_))}async function P6($,C,_){let K=await U1(C);try{let G=await S(C),j={...$,accounts:D6(G?.accounts??[],$.accounts,_)},Z={...await V6(C),...B6(j)};await W$(C,Z);let z=await H$(C);try{await V1(j,C,{mainQuota:!0,mainRefresh:!0,accounts:!0})}finally{await z.release()}}finally{await K.release()}}function I6($,C){$.main=$.main??{},$.main.profile=C.main?.profile}function h6($,C){$.main=$.main??{};let _=C.quota?.mainQuota,K=Boolean($.main.quotaToken&&C.quota?.mainQuotaToken&&$.main.quotaToken===C.quota.mainQuotaToken),G=K&&_?.source==="headers"?H1($.main.quota,_):_,j=Boolean(K&&_?.source==="headers"),J=typeof $.main.quotaCheckedAt==="number"?$.main.quotaCheckedAt:H0($.main.quota),Z=typeof C.quota?.mainQuotaCheckedAt==="number"?C.quota.mainQuotaCheckedAt:H0(G);if(!j&&(J>Z||J===Z&&_0($.main.quota)>_0(G)))return;$.main.quota=G,$.main.quotaCheckedAt=j?Math.max(J,Z):C.quota?.mainQuotaCheckedAt,$.main.quotaToken=C.quota?.mainQuotaToken,$.main.lastQuotaApiError=C.quota?.mainLastQuotaApiError}function T6($,C){$.main=$.main??{},$.main.lastRefreshError=C.refresh?.mainLastRefreshError,$.main.refreshLeaseId=C.refresh?.mainRefreshLeaseId,$.main.refreshLeaseUntil=C.refresh?.mainRefreshLeaseUntil,$.main.refreshLeaseTokenHash=C.refresh?.mainRefreshLeaseTokenHash}function A0($){if(Array.isArray($))return $.map(A0);if(!U($))return $;return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0).map(([C,_])=>[C,A0(_)]))}function w6($,C=M(),_={mainProfile:!0,mainQuota:!0,mainRefresh:!0,accounts:!0}){let K=C;return L$(async()=>{let G=await H$(K);try{await V1($,K,_)}finally{await G.release()}})}function L2($,C=M()){let _=C;return L$(async()=>{let K=await U1(_);try{let G=await H$(_);try{let j=await S(_),J=N$(_),Z=(await W0(J)).value,z=U(Z)?{...Z,version:1}:{version:1},{accountId:X,expectedTokenFingerprint:Y,profile:N}=$;if(N?.tokenFingerprint&&N.tokenFingerprint!==Y)return!1;if(X==="main"){z.main={...z.main??{}};let O=L0(z.main.profile),L=z.main.profileToken??O?.tokenFingerprint;if(!N&&O&&L===Y)return!1;if(N){if(L&&L!==Y)return!1;if(O&&O.checkedAt>N.checkedAt)return!1}z.main.profile=N,z.main.profileToken=Y}else{let O=j?.accounts.find((V)=>V.id===X&&m(V));if(!O?.access||D(O.access)!==Y)return!1;z.accounts={...U(z.accounts)?z.accounts:{}};let L=U(z.accounts[X])?{...z.accounts[X]}:{},F=L0(L.profile);if(!N&&F?.tokenFingerprint===Y)return!1;if(N&&F&&F.checkedAt>N.checkedAt)return!1;L.profile=N,z.accounts[X]=L}return await W$(J,A0(z)),!0}finally{await G.release()}}finally{await K.release()}})}async function V1($,C,_){let K=N$(C),G=(await W0(K)).value,j=U(G)?{...G,version:1}:{version:1};if(_.mainProfile)I6(j,$);if(_.mainQuota)h6(j,$);if(_.mainRefresh)T6(j,$);if(_.accounts){let J=_.accounts===!0?null:new Set(_.accounts);j.accounts={...U(j.accounts)?j.accounts:{}};for(let Z of $.accounts){if(J&&!J.has(Z.id))continue;j.accounts[Z.id]=Q6(j.accounts[Z.id],E6(Z))}if(J){for(let Z of J)if(!$.accounts.some((z)=>z.id===Z))delete j.accounts[Z]}else{let Z=new Set($.accounts.map((z)=>z.id));for(let z of Object.keys(j.accounts))if(!Z.has(z))delete j.accounts[z]}}await W$(K,A0(j))}async function o($){let _=`${$.path??M()}.${$.name}.lock`,K=C0(_,"owner.json"),G=N0(),j=$.now??Date.now,J=null,Z=!1;async function z(){try{return JSON.parse(await D0(_,"utf8"))}catch(L){if(L.code!=="EISDIR")throw L;return JSON.parse(await D0(K,"utf8"))}}async function X(){await S0(_,`${JSON.stringify({ownerId:G,expiresAt:j()+$.ttlMs})}
4
- `,{encoding:"utf8",mode:384})}async function Y(){try{return await S0(_,`${JSON.stringify({ownerId:G,expiresAt:j()+$.ttlMs})}
5
- `,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(L){let F=L.code;if(F==="EEXIST"||F==="EISDIR")return!1;throw L}}function N(){if(!$.renew||Z)return;let L=$.renewIntervalMs??Math.max(1000,Math.floor($.ttlMs/3));if(J=cC(()=>{(async()=>{try{let F=await z(),V=j();if(Z||F?.ownerId!==G||Number(F?.expiresAt)<=V)return;await X(),N()}catch{}})()},L),"unref"in J)J.unref()}let O=await Y();if(!O){let L=`${_}.evicting`,F=C0(L,"owner.json"),V=N0(),f=5000,A=8;async function P(){await new Promise((R)=>setTimeout(R,Math.floor(Math.random()*4)))}async function H(){try{let R=await z();return Number(R?.expiresAt)>j()}catch{try{return(await e$(_)).mtimeMs+$.ttlMs>j()}catch{return!1}}}async function v(){try{return JSON.parse(await D0(F,"utf8"))?.ownerId===V}catch{return!1}}async function W(){await Y$(L);try{await S0(F,`${JSON.stringify({ownerId:V,createdAt:j()})}
6
- `,{encoding:"utf8",mode:384,flag:"wx"})}catch(R){let x=R.code;if(x==="ENOENT"||x==="EINVAL")return!1;throw await b(),R}return await $.onStep?.("eviction-marker-acquired"),!0}async function b(){if(await v())await $0(L,{recursive:!0,force:!0}).catch(()=>{})}for(let R=0;R<8;R++){if(O=await Y(),O)break;if(await H())return null;try{if(!await W()){await P();continue}}catch(x){if(x.code!=="EEXIST")throw x;let f0;try{f0=await e$(L)}catch(k){if(k.code==="ENOENT"){await P();continue}throw k}if(f0.mtimeMs+5000>j())return null;await $.onStep?.("stale-marker-stat");let g=`${L}.${N0()}`;try{await O1(L,g)}catch(k){if(k.code==="ENOENT"){await P();continue}throw k}await $.onStep?.("stale-marker-claimed"),await $0(g,{recursive:!0,force:!0}).catch(()=>{}),await P();continue}try{if(await H())return null;if(!await v())return null;if(await $.onStep?.("stale-lock-confirmed"),!await v())return null;if(await $0(_,{recursive:!0,force:!0}).catch(()=>{}),!await v())return null;if(O=await Y(),!O)return null;if(!await v())return await $0(_,{recursive:!0,force:!0}).catch(()=>{}),O=!1,null;break}finally{await b()}}}if(!O)return null;return N(),{release:async()=>{if(Z=!0,J)rC(J),J=null;try{if((await z())?.ownerId!==G)return}catch{return}await $0(_,{recursive:!0,force:!0}).catch(()=>{})}}}function W2($){return $?.claudeCache?.enabled===!0}function x6($){return typeof $==="string"&&n$.includes($)?$:B0}function k6($){return x6($?.claudeCache?.mode)}async function H2($,C,_=M()){let K=await S(_)??T();return K.claudeCache={...K.claudeCache??{},enabled:$,mode:C??k6(K)},await q(K,_),K}async function F2($,C=M()){let _=await S(C)??T();return _.claudeCache={..._.claudeCache??{},enabled:_.claudeCache?.enabled===!0,mode:$},await q(_,C),_}function U2($){return $?.dump?.enabled===!0}async function V2($,C=M()){let _=await S(C)??T();return _.dump={..._.dump??{},enabled:$},await q(_,C),_}function b2($){return $?.claudeFast?.enabled===!0}async function M2($,C=M()){let _=await S(C)??T();return _.claudeFast={..._.claudeFast??{},enabled:$},await q(_,C),_}async function E2($,C,_=M()){let K=await S(_)??T();return K.cacheKeep={...K.cacheKeep??{},enabled:!0,always:!1,startHour:$,endHour:C},await q(K,_),K}async function f2($=M()){let C=await S($)??T();return C.cacheKeep={...C.cacheKeep??{},enabled:!0,always:!0},delete C.cacheKeep.startHour,delete C.cacheKeep.endHour,await q(C,$),C}async function Q2($,C=M()){let _=await S(C)??T();return _.cacheKeep={..._.cacheKeep??{},enabled:$},await q(_,C),_}function B2($){return $?.cacheKeep?.subagents===!0}async function D2($,C=M()){let _=await S(C)??T();return _.cacheKeep={..._.cacheKeep??{},subagents:$},await q(_,C),_}function y6($){return $?.fallbackOn?.length?$.fallbackOn:aC}function S2($,C){return y6(C).includes($)}function h0($){let C=$?.quota?.minimumRemaining||{};return{five_hour:C.five_hour??C["5h"]??$1.five_hour,seven_day:C.seven_day??C["1w"]??$1.seven_day}}function F0($){return $?.quota?.enabled!==!1}function m6($){return $?.refresh?.enabled!==!1}function v6($){return Math.floor(Math.random()*Math.max(0,$))}function l6($){let C=$?.refresh?.refreshBeforeExpiryMinutes??tC;return Math.max(L1,C)*60000}function b1($){return Y1("sha256").update($).digest("hex")}function p6($){let C=$.status;if(typeof C==="number"&&Number.isFinite(C))return C===429||C>=500;if(!($ instanceof Error))return!1;return $.message.includes("fetch failed")||"code"in $&&($.code==="ECONNRESET"||$.code==="ECONNREFUSED"||$.code==="ETIMEDOUT"||$.code==="UND_ERR_CONNECT_TIMEOUT")}function g6($){let C=b1($.refreshToken),K=($.previous?.tokenHash===C?$.previous.retryCount??0:0)+1,G=$.error.retryAfter,j;if(typeof G==="number"&&G>0)j=G*1000;else if(p6($.error))j=Math.min($6,eC*2**Math.min(K-1,6));else j=W1;let J=$.error.status,Z=typeof J==="number"&&Number.isFinite(J)?J:void 0,z=G0($.error),Y=(typeof $.error.body==="string"?$.error.body:"").includes("invalid_grant")||z.includes("invalid_grant");return{message:z,checkedAt:$.now,nextRetryAt:$.now+j,retryCount:K,tokenHash:C,status:Z,permanent:Z===400&&Y}}function M1($){if(!$)return!1;if(typeof $.permanent==="boolean")return $.permanent;if(typeof $.status==="number")return $.status===400;if(typeof $.nextRetryAt==="number")return $.nextRetryAt-$.checkedAt>=W1;return!1}function O0($,C,_){if(!$?.nextRetryAt||$.nextRetryAt<=_)return!1;if(!C)return!0;return $.tokenHash===b1(C)}function Z$($,C){return`Claude OAuth refresh is backed off for ${Math.max(1,Math.ceil((($.nextRetryAt??C)-C)/1000))}s after: ${$.message}`}function F$($){if($.status===403)return!0;return/Claude quota check failed: 403\b/.test(G0($))}function T0($){let _=($.previous?.retryCount??0)+1,K=S1($.error)?Math.min(_6,C6*2**Math.min(_-1,6)):K6;return{message:G0($.error),checkedAt:$.now,nextRetryAt:$.now+K,retryCount:_}}function K0($,C){if(!$?.nextRetryAt||$.nextRetryAt<=C)return!1;return!0}function R2($,C){return`Quota API backed off for ${Math.max(1,Math.ceil((($.nextRetryAt??C)-C)/1000))}s after: ${$.message}`}function l($){let C=$?.quota?.checkIntervalMinutes??G6;return Math.max(1,C)*60000}function A2($){return $?.logging?.level}async function q2($,C=M()){let{setLogLevel:_}=await import("./logger-n49md99d.js"),K=await S(C)??T();K.logging={...K.logging??{},level:$},await q(K,C),_($)}function E1($){if(!$?.quota?.mainQuota||!$.quota.mainQuotaCheckedAt)return null;return{quota:$.quota.mainQuota,checkedAt:$.quota.mainQuotaCheckedAt,tokenFingerprint:$.quota.mainQuotaToken}}function f1($){let C=$?.quota?.refreshEveryNRequests;return typeof C==="number"&&Number.isFinite(C)&&C>0?Math.floor(C):0}function q0($){return $?.quota?.failClosedOnUnknownQuota??j6}function d6($){if(typeof $!=="string")return null;let C=$.toLowerCase();if(C.includes("fable"))return"fable";if(C.includes("mythos"))return"mythos";return null}function y($,C){let _=d6(C);if(!_)return;return $?.scoped?.find((K)=>{return[K.modelId,K.modelName,K.title].filter((j)=>typeof j==="string").join(" ").toLowerCase().includes(_)})}function u6($,C){let _=y($,C);return Boolean(_&&Number.isFinite(_.remainingPercent)&&_.remainingPercent<=0)}function P0($,C){return!u6($,C)}function Q1($,C){if(!F0(C))return!0;let _=h0(C);for(let K of["five_hour","seven_day"]){let G=$?.[K];if(!G)return!q0(C);if(!Number.isFinite(G.remainingPercent))return!q0(C);if(G.remainingPercent<_[K])return!1}return!0}var s={five_hour:5,seven_day:10,scoped:0};function U0($){let C=$?.five_hour??$?.["5h"],_=$?.seven_day??$?.["1w"],K=$?.scoped;return{five_hour:typeof C==="number"&&Number.isFinite(C)?C:s.five_hour,seven_day:typeof _==="number"&&Number.isFinite(_)?_:s.seven_day,scoped:typeof K==="number"&&Number.isFinite(K)?K:s.scoped}}function U$($){return $?.killswitch?.enabled===!0}function V$($,C){if(!$?.killswitch)return s;if(C&&$.killswitch.accounts?.[C])return U0($.killswitch.accounts[C]);return U0($.killswitch.main)}function P2($,C,_,K){if(!U$(C))return!0;let G=V$(C,_),j=!1;for(let J of["five_hour","seven_day"]){let Z=$?.[J];if(!Z){j=!0;continue}if(!Number.isFinite(Z.remainingPercent)){j=!0;continue}if(Z.remainingPercent<G[J])return!1}if(K){let J=y($,K);if(J&&Number.isFinite(J.remainingPercent)&&J.remainingPercent<=G.scoped)return!1}if(j)return!q0(C);return!0}function B1($,C,_,K){let G=[],j=[$,...C.map((J)=>J.quota)];for(let J of j)if(K){let z=y(J,K)?.resetsAt;if(!z)continue;let X=Date.parse(z);if(Number.isFinite(X)&&X>_)G.push(X)}else for(let Z of["five_hour","seven_day"]){let z=J?.[Z]?.resetsAt;if(!z)continue;let X=Date.parse(z);if(Number.isFinite(X)&&X>_)G.push(X)}if(!G.length)return 300;return Math.max(1,Math.ceil((Math.min(...G)-_)/1000))+60}function I2($){return $?.killswitch??{enabled:!1}}async function h2($,C=M()){let _=await S(C)??T();return _.killswitch=$,await q(_,C),_}async function T2($,C=M()){let _=await S(C);if(!_)return!1;let K=t6(_,$);if(K)await q(_,C,{removedAccountIds:[$]});return K}async function w2($,C=M()){let _=await S(C);if(!_)return;e6(_,$),await q(_,C,{preserveExistingAccountOrder:!1})}async function x2($,C,_=M()){let K=await S(_);if(!K)return!1;let G=$_(K,$,C);if(G)await q(K,_);return G}async function k2($,C=M()){let _=await S(C)??T();a6(_,$),await q(_,C)}function j0($,C,_){let K=l(C);if(!F0(C))return _+K;let G=Math.min(...[...["five_hour","seven_day"].map((z)=>$?.[z]?.checkedAt),...($?.scoped??[]).map((z)=>z.checkedAt)].filter((z)=>Number.isFinite(z)).map((z)=>z+K)),j=(z)=>Number.isFinite(G)?Math.min(z,G):z,J=h0(C),Z=[];for(let z of["five_hour","seven_day"]){let X=$?.[z];if(!X)return j(_+K);if(X.remainingPercent>=J[z])continue;let Y=X.resetsAt?Date.parse(X.resetsAt):Number.NaN;if(!Number.isFinite(Y)||Y<=_)return j(_+K);Z.push(Y)}if(!Z.length)return j(_+K);return j(Math.min(...Z)+60000)}function c($,C,_){return!$.access||!$.expires||$.expires-_<=l6(C)}function D1($,C,_){if(!F0(C))return!0;let K=l(C);return["five_hour","seven_day"].every((G)=>{let j=$?.[G];return Boolean(j&&_-j.checkedAt<K)})}function z$($,C,_,K){if(!D1($.quota,C,_))return!0;let G=y($.quota,K);return Boolean(G&&_-G.checkedAt>=l(C))}function i6($,C){if(!$)return!1;if(!$.resetsAt)return!0;let _=Date.parse($.resetsAt);return!Number.isFinite(_)||_>C}function c6($,C){return["five_hour","seven_day"].every((_)=>i6($?.[_],C))}function S1($){let C=$.status;if(typeof C==="number"&&Number.isFinite(C)){if(C===429||C>=500)return!0}let _=G0($);if(/Claude quota check failed: (429|5\d\d)\b/.test(_))return!0;if(_.includes("Quota refresh is already in progress"))return!0;if(!($ instanceof Error))return!1;let{message:K,code:G}=$;return K.includes("fetch failed")||G==="ECONNRESET"||G==="ECONNREFUSED"||G==="ETIMEDOUT"||G==="UND_ERR_CONNECT_TIMEOUT"}function r6($,C,_,K){return S1(_)&&Q1($.quota,C)&&c6($.quota,K)}function I0($){if(!Number.isFinite($))return 0;if($<0)return 0;if($>100)return 100;return $}function u($){return typeof $==="string"&&$.trim()?$.trim():void 0}function R1($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function s6($,C){if(!Array.isArray($))return[];let _=new Set,K=[];for(let G of $){if(G?.kind!=="weekly_scoped"||G.group!=="weekly")continue;if(typeof G.percent!=="number"||!Number.isFinite(G.percent))continue;let j=u(G.scope?.model?.display_name);if(!j)continue;let J=u(G.scope?.model?.id)??j,Z=R1(J);if(!Z)continue;let z=`claude-weekly-scoped-${Z}`;if(_.has(z))continue;_.add(z);let X=I0(G.percent),Y=u(G.scope?.model?.id);K.push({id:z,title:`${j} only`,...Y&&{modelId:Y},modelName:j,usedPercent:X,remainingPercent:I0(100-X),resetsAt:G.resets_at,checkedAt:C})}return K}function n6($){if($.extra_usage?.is_enabled!==!0)return;let C=$.extra_usage.used_credits,_=$.extra_usage.monthly_limit;if(typeof C!=="number"||!Number.isFinite(C)||typeof _!=="number"||!Number.isFinite(_))return;let K=$.spend?.limit?.currency,G=K==null?"USD":u(K),j=$.spend?.limit?.exponent,J=j==null?2:j;if(!G||!/^[A-Za-z]{3}$/.test(G)||!Number.isInteger(J)||J<0||J>20)return;return{used:{amountMinor:C,currency:G,exponent:J},limit:{amountMinor:_,currency:G,exponent:J},...typeof $.extra_usage.utilization==="number"&&Number.isFinite($.extra_usage.utilization)&&{utilizationPercent:$.extra_usage.utilization},...u($.spend?.severity)&&{severity:u($.spend?.severity)},exhausted:C>=_}}function o6($){if(!Array.isArray($))return;let C=$.find((j)=>j?.is_active===!0);if(!C)return;if(C.kind==="session")return"five_hour";if(C.kind==="weekly_all")return"seven_day";if(C.kind!=="weekly_scoped"||C.group!=="weekly")return;let _=u(C.scope?.model?.display_name);if(!_)return;let K=u(C.scope?.model?.id)??_,G=R1(K);return G?`claude-weekly-scoped-${G}`:void 0}function z1($,C){if(typeof $?.utilization!=="number")return;if(!Number.isFinite($.utilization))return;let _=I0($.utilization);return{usedPercent:_,remainingPercent:I0(100-_),resetsAt:$.resets_at,checkedAt:C}}async function w0($){let _=await($.fetchImpl??fetch)(nC,{method:"GET",headers:{Authorization:`Bearer ${$.accessToken}`,Accept:"application/json","Content-Type":"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":`claude-code/${d}`}});if(!_.ok){let J=await _.text().catch(()=>"");throw Object.assign(Error(`Claude quota check failed: ${_.status} — ${J}`),{status:_.status,retryAfter:J$(_.headers.get("Retry-After"))})}let K=$.now?.()??Date.now(),G=await _.json(),j=o6(G.limits);return{five_hour:z1(G.five_hour,K),seven_day:z1(G.seven_day,K),scoped:s6(G.limits,K),extraUsage:n6(G),...j&&{bindingWindow:j,bindingWindowSource:"poll"},source:"poll",checkedAt:K}}function I($,C){let _=$.accounts.findIndex((K)=>K.id===C.id);if(_>=0)$.accounts[_]=C}function a6($,C){let _=$.accounts.findIndex((K)=>K.id===C.id||C.label&&K.label===C.label);if(_>=0){$.accounts[_]={...$.accounts[_],...C,addedAt:$.accounts[_]?.addedAt??C.addedAt,...C.type==="oauth"&&{quota:C.quota,profile:C.profile,lastRefreshedAt:C.lastRefreshedAt,lastRefreshError:C.lastRefreshError,lastQuotaRefreshError:C.lastQuotaRefreshError}};return}$.accounts.push(C)}function t6($,C){let _=$.accounts.findIndex((K)=>K.id===C);if(_<0)return!1;return $.accounts.splice(_,1),!0}function e6($,C){let _=new Map(C.map((j,J)=>[j,J])),K=$.accounts.filter((j)=>_.has(j.id)),G=$.accounts.filter((j)=>!_.has(j.id));K.sort((j,J)=>(_.get(j.id)??0)-(_.get(J.id)??0)),$.accounts=[...K,...G]}function $_($,C,_){let K=$.accounts.find((G)=>G.id===C);if(!K)return!1;return K.enabled=_,!0}function G0($){return $ instanceof Error?$.message:String($)}function A1($,C,_){$.lastRefreshError=g6({error:C,now:_,refreshToken:$.refresh,previous:$.lastRefreshError})}function X1($,C,_){if(F$(C))return;if($.lastQuotaRefreshError=T0({error:C,now:_,previous:$.lastQuotaRefreshError}),C.isRefreshError)A1($,C,_)}function C_($){return`fallback-oauth-refresh-${Y1("sha256").update($).digest("hex").slice(0,16)}`}class __{now;fetchImpl;configPath;refreshPromises=new Map;refreshTimer=null;quotaTimer=null;quotaManager;onFallbackStorageChanged;setIntervalImpl;clearIntervalImpl;constructor($={}){this.now=$.now??Date.now,this.fetchImpl=$.fetchImpl??fetch,this.configPath=$.configPath??M(),this.quotaManager=$.quotaManager??null,this.onFallbackStorageChanged=$.onFallbackStorageChanged,this.setIntervalImpl=$.setIntervalImpl??globalThis.setInterval,this.clearIntervalImpl=$.clearIntervalImpl??globalThis.clearInterval}seedFallbackQuota($,C){if(!this.quotaManager)return;if(!$.quota)return;let _=Math.max($.quota.five_hour?.checkedAt??0,$.quota.seven_day?.checkedAt??0);if(_<=0)return;let K=this.quotaManager.getFallback($.id,$.access);if(K&&K.checkedAt>=_)return;let G=l(C);this.quotaManager.setFallback($.id,{quota:$.quota,refreshAfter:_+G,checkedAt:_},$.access)}async load(){return S(this.configPath)}async save($,C){await w6($,this.configPath,{accounts:C??!0})}startBackgroundRefresh(){let $=async()=>{await this.refreshDueAccounts(),await this.refreshQuotaForDueAccounts()};if($().catch(()=>{}),!this.refreshTimer){if(this.refreshTimer=this.setIntervalImpl(()=>{$().catch(()=>{})},J6+v6(Z6)),"unref"in this.refreshTimer)this.refreshTimer.unref()}}stopBackgroundRefresh(){if(this.refreshTimer)this.clearIntervalImpl(this.refreshTimer);if(this.quotaTimer)this.clearIntervalImpl(this.quotaTimer);this.refreshTimer=null,this.quotaTimer=null}async getUsableFallbackAccounts($,C={}){let _=$!==void 0?$:await this.load();if(!_)return[];let K=[],G=!1;for(let j of _.accounts){if(j.enabled===!1||!m(j))continue;try{let J=j;if(c(J,_,this.now())){let z=J.lastRefreshError;if(z&&O0(z,J.refresh,this.now()))throw Error(Z$(z,this.now()));J=await this.refreshAccount(J,_),G=!0}if(this.seedFallbackQuota(J,_),(this.quotaManager?this.quotaManager.isFallbackStale(J.id,J.access,C.modelId):z$(J,_,this.now(),C.modelId))&&!K0(J.lastQuotaRefreshError,this.now()))J=await this.refreshAccountQuota(J,_),G=!0;if(this.accountPassesQuotaPolicy(this.quotaPolicyAccount(J),_,{modelId:C.modelId}))K.push(J)}catch(J){if(r6(j,_,J,this.now())){if(r("[refresh] fallback quota using cached quota after refresh error",{accountId:j.id,error:G0(J)}),this.accountPassesQuotaPolicy(this.quotaPolicyAccount(j),_,{modelId:C.modelId}))K.push(j)}else if(!q0(_)&&P0(j.quota,C.modelId))K.push(j)}}if(G)await this.save(_);return K}async markUsed($){let C=await this.load();if(!C)return;let _=C.accounts.find((K)=>K.id===$.id);if(!_)return;_.lastUsed=this.now(),await this.save(C)}accountPassesQuotaPolicy($,C,_={}){return Q1($.quota,C)&&P0($.quota,_.modelId)}quotaPolicyAccount($){if(!this.quotaManager)return $;let C=this.quotaManager.getFallback($.id,$.access)?.quota;return C?{...$,quota:C}:$}async refreshDueAccounts(){let $=await this.load();if(!$||!m6($))return;let C=!1;for(let _ of $.accounts){if(_.enabled===!1||!m(_))continue;if(!c(_,$,this.now()))continue;if(O0(_.lastRefreshError,_.refresh,this.now()))continue;try{r("[refresh] fallback oauth background due",{accountId:_.id,expiresInMs:_.expires?_.expires-this.now():void 0}),await this.refreshAccount(_,$),C=!0}catch(K){h.warn("refresh","fallback oauth background failed",{accountId:_.id,error:K instanceof Error?K.message:String(K)}),A1(_,K,this.now()),I($,_),C=!0}}if(C)await this.save($)}async refreshQuotaForDueAccounts(){let $=await this.load();if(!$||!F0($))return;let C=!1;for(let _ of $.accounts){if(_.enabled===!1||!m(_))continue;let K=_;try{if(c(K,$,this.now())){if(O0(K.lastRefreshError,K.refresh,this.now()))continue;K=await this.refreshAccount(K,$),C=!0}if(K0(K.lastQuotaRefreshError,this.now()))continue;if(this.seedFallbackQuota(K,$),!(this.quotaManager?this.quotaManager.isFallbackStale(K.id,K.access):z$(K,$,this.now())))continue;await this.refreshAccountQuota(K,$),C=!0}catch(G){X1(_,G,this.now()),I($,_),C=!0}}if(C)await this.save($),this.onFallbackStorageChanged?.()}async refreshQuotaForAllAccounts($={}){let C=await this.load(),_=[];if(!C||!F0(C))return{storage:C,errors:_};let K=$.force??!1,G=!1;for(let j of C.accounts){if(j.enabled===!1||!m(j))continue;let J=j;try{if(c(J,C,this.now())){let Z=J.lastRefreshError;if(Z&&O0(Z,J.refresh,this.now()))throw Error(Z$(Z,this.now()));J=await this.refreshAccount(J,C),G=!0}if(!K&&!z$(J,C,this.now())){if(J.lastQuotaRefreshError)J.lastQuotaRefreshError=void 0,I(C,J),G=!0;continue}await this.refreshAccountQuota(J,C),G=!0}catch(Z){X1(j,Z,this.now()),I(C,j),G=!0,_.push({accountId:j.id,message:G0(Z)})}}if(G)await this.save(C);return{storage:C,errors:_}}async refreshAccount($,C,_={}){let K=this.refreshPromises.get($.id);if(K){let J=await K;return I(C,J),J}let G=this.refreshAccountNow($,C,_).finally(()=>{this.refreshPromises.delete($.id)});this.refreshPromises.set($.id,G);let j=await G;return I(C,j),j}async waitForConcurrentFallbackRefresh($,C,_,K){let G=Date.now()+X6;while(Date.now()<G){await new Promise((X)=>setTimeout(X,Y6));let j=await this.load(),J=j?.accounts.find((X)=>X.id===$.id&&m(X));if(!J)continue;if((J.access!==_.access||J.refresh!==_.refresh||(J.expires??0)>(_.expires??0)+60000)&&(K.force||!c(J,j,this.now())))return I(C,J),r("[refresh] fallback oauth joined concurrent refresh",{accountId:J.id,expiresInMs:J.expires?J.expires-this.now():void 0}),J;let z=J.lastRefreshError;if(z&&O0(z,J.refresh,this.now()))throw I(C,J),Error(Z$(z,this.now()))}return null}async refreshAccountNow($,C,_){let K=await this.load(),G=K?.accounts.find((Z)=>Z.id===$.id&&m(Z));if(G&&!_.force&&!c(G,K,this.now()))return I(C,G),G;let j=G??$,J=await o({name:C_(j.id),ttlMs:z6,path:this.configPath,now:this.now,renew:!0});if(!J){r("[refresh] fallback oauth refresh skipped file lock",{accountId:j.id});let Z=await this.waitForConcurrentFallbackRefresh($,C,j,_);if(Z)return Z;throw Error("Fallback OAuth refresh is already in progress")}try{if(K=await this.load(),G=K?.accounts.find((X)=>X.id===$.id&&m(X)),G&&!_.force&&!c(G,K,this.now()))return I(C,G),G;j=G??j;let Z=j.refresh;r("[refresh] fallback oauth refresh request start",{accountId:j.id,force:_.force===!0,expiresInMs:j.expires?j.expires-this.now():void 0});let z=await t$({refreshToken:Z,fetchImpl:this.fetchImpl,now:this.now});return j.access=z.access,j.refresh=z.refresh,j.expires=z.expires,j.lastRefreshedAt=z.expires-z.expiresIn*1000,j.lastRefreshError=void 0,I(C,j),await this.save(C),r("[refresh] fallback oauth refresh succeeded",{accountId:j.id,expiresInMs:j.expires?j.expires-this.now():void 0}),j}finally{await J.release()}}async refreshAccountQuota($,C){let _=$;if(!_.access)throw Error(`Fallback account ${$.id} has no access token`);let K=(Z)=>this.quotaManager?this.quotaManager.refreshFallback(_.id,Z):w0({accessToken:Z,fetchImpl:this.fetchImpl,now:this.now}),G=this.now();try{_.quota=await K(_.access)}catch(Z){if(!(Z instanceof Error?Z.message:String(Z)).includes("Claude quota check failed: 401"))throw Z;if(_=await this.refreshAccount($,C,{force:!0}),!_.access)throw Z;_.quota=await K(_.access)}let j=await this.load(),J=j?.accounts.find((Z)=>Z.id===_.id&&m(Z));if(j&&J&&J.access!==_.access)return this.seedFallbackQuota(J,j),I(C,J),J;if(j&&J?.access===_.access&&J.quota&&H0(J.quota)>=G&&D1(J.quota,j,this.now()))return this.seedFallbackQuota(J,j),I(C,J),J;if(_.lastQuotaRefreshError=void 0,I(C,_),this.quotaManager&&_.quota){let Z=this.now();this.quotaManager.setFallback(_.id,{quota:_.quota,refreshAfter:Z+l(C),checkedAt:Z},_.access)}return _}}var v2="claude-cache",q1="## Claude Cache Status",K_="## Claude Cache Enabled",G_="## Claude Cache Disabled",j_="## Claude Cache Usage",J_="Usage: `/claude-cache`, `/claude-cache on`, `/claude-cache off`, or `/claude-cache mode explicit|automatic|hybrid`.",x0=!1,k0=B0;function l2(){return x0}function p2(){return k0}function g2($){x0=$.enabled,k0=$.mode}function Z_($){let C=$.trim().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&C[0]==="on")return{type:"enable"};if(C.length===1&&C[0]==="off")return{type:"disable"};if(C.length===2&&C[0]==="mode"&&(C[1]==="explicit"||C[1]==="automatic"||C[1]==="hybrid"))return{type:"mode",mode:C[1]};return{type:"usage"}}function V0($){let C=$?.enabled??x0,_=$?.mode??k0;return[q1,"",`- Enabled: ${C?"enabled":"disabled"}`,`- Mode: ${_}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: main sessions only; subagent sessions keep default ephemeral cache behavior","- Modes: explicit = existing OpenCode breakpoints; automatic = top-level cache_control only; hybrid = system + messages[0] + top-level cache_control","- TTL: 1h when enabled for main sessions; default ephemeral cache behavior otherwise"].join(`
7
- `)}function d2($){let C=Z_($.argumentsText),_=$.enabled??x0,K=$.mode??k0;if(C.type==="status")return V0({enabled:_,mode:K});if(C.type==="enable")return[K_,"",V0({enabled:!0,mode:K})].join(`
8
- `);if(C.type==="disable")return[G_,"",V0({enabled:!1,mode:K})].join(`
9
- `);if(C.type==="mode")return[q1,"",`Mode updated to \`${C.mode}\`.`,"",V0({enabled:_,mode:C.mode})].join(`
10
- `);return[j_,"",J_,"",V0({enabled:_,mode:K})].join(`
11
- `)}import{randomBytes as z_,randomUUID as h1}from"node:crypto";var X_=1000,a=new Map;function b0($,C,_){if(!$.has(C)&&$.size>=X_){let K=$.keys().next().value;if(K!==void 0)$.delete(K)}$.set(C,_)}function T1($){let C=$||"anonymous",_=a.get(C);if(_)return _;let K={deviceId:z_(32).toString("hex"),sessionId:h1()};return b0(a,C,K),K}var Y_=86400000,O_=300000,b$=new Map,P1=new Map;async function N_($,C){if(!$.startsWith("sk-ant-oat"))return null;let _=new AbortController,K=setTimeout(()=>_.abort(),5000);try{let G=new URL("https://api.anthropic.com/api/claude_cli/bootstrap");if(G.searchParams.set("entrypoint",i$),C)G.searchParams.set("model",C);let j=await fetch(G,{method:"GET",headers:{accept:"application/json, text/plain, */*",authorization:`Bearer ${$}`,"content-type":"application/json","anthropic-beta":"oauth-2025-04-20","user-agent":`claude-code/${d}`},signal:_.signal});if(!j.ok)return null;let Z=(await j.json().catch(()=>null))?.oauth_account?.account_uuid;return typeof Z==="string"&&Z?Z:null}catch{return null}finally{clearTimeout(K)}}async function r2($,C){let _=T1($);if(!$.startsWith("sk-ant-oat"))return _;let K=Date.now(),G=P1.get($);if(G&&G.expiresAt>K){if(!G.accountUuid)return _;let X=`account:${G.accountUuid}`,Y=a.get(X);if(Y)return b0(a,$,Y),Y}let j=b$.get($);if(!j)j=N_($,C),b$.set($,j);let J=await j.finally(()=>{b$.delete($)});if(b0(P1,$,{accountUuid:J,expiresAt:K+(J?Y_:O_)}),!J)return _;let Z=`account:${J}`,z=a.get(Z);if(z)return b0(a,$,z),z;return _.accountUuid=J,b0(a,Z,_),_}function t($){return $!=null&&typeof $==="object"&&!Array.isArray($)}function L_($){if(!$.accountUuid)return null;return JSON.stringify({device_id:$.deviceId,account_uuid:$.accountUuid,session_id:$.sessionId})}function s2($,C){let _=L_(C);if(!_){if(t($.metadata))delete $.metadata.user_id;return!1}if(!t($.metadata))$.metadata={};let K=$.metadata;if(t(K))K.user_id=_;return!0}var W_=["oauth-2025-04-20","interleaved-thinking-2025-05-14","thinking-token-count-2026-05-13","context-management-2025-06-27","prompt-caching-scope-2026-01-05","claude-code-20250219","advisor-tool-2026-03-01","advanced-tool-use-2025-11-20","extended-cache-ttl-2025-04-11","cache-diagnosis-2026-04-07"],H_=["oauth-2025-04-20","interleaved-thinking-2025-05-14","thinking-token-count-2026-05-13","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","structured-outputs-2025-12-15","cache-diagnosis-2026-04-07"],I1=["oauth-2025-04-20","interleaved-thinking-2025-05-14","thinking-token-count-2026-05-13","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","advanced-tool-use-2025-11-20","extended-cache-ttl-2025-04-11","cache-diagnosis-2026-04-07"];function F_($){return $.output_config?.format?.type==="json_schema"}function U_($){return Array.isArray($.tools)&&$.tools.length>0&&Array.isArray($.system)&&t($.thinking)&&t($.context_management)&&t($.output_config)&&t($.diagnostics)}function V_($,C=[]){let _=$?U_($)?[...W_]:F_($)?[...H_]:[...I1]:[...I1];if($?.speed==="fast")_.push(u$);for(let K of C){let G=K.trim();if(G)_.push(G)}return[...new Set(_)].join(",")}function b_(){switch(process.platform){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return"Unknown"}}function M_(){switch(process.arch){case"arm64":return"arm64";case"x64":return"x64";case"ia32":return"x32";default:return process.arch}}function n2($,C,_={}){let K=_.identity??T1(C),j=[...($.get("anthropic-beta")??"").split(",").map((J)=>J.trim()).filter(Boolean),..._.extraBetas??[]];return $.set("accept","application/json"),$.set("authorization",`Bearer ${C}`),$.set("content-type","application/json"),$.set("user-agent",s$),$.set("anthropic-beta",V_(_.body,j)),$.set("anthropic-dangerous-direct-browser-access","true"),$.set("anthropic-version","2023-06-01"),$.set("x-app","cli"),$.set("x-client-request-id",h1()),$.set("x-claude-code-session-id",K.sessionId),$.set("x-stainless-arch",M_()),$.set("x-stainless-lang","js"),$.set("x-stainless-os",b_()),$.set("x-stainless-package-version",c$),$.set("x-stainless-retry-count","0"),$.set("x-stainless-runtime","node"),$.set("x-stainless-runtime-version",r$),$.set("x-stainless-timeout","600"),$.delete("x-api-key"),$}var E_=["model","messages","system","tools","tool_choice","metadata","max_tokens","temperature","thinking","context_management","output_config","diagnostics","stream","speed"];function w1($){let C={};for(let _ of E_)if(Object.hasOwn($,_))C[_]=$[_];for(let[_,K]of Object.entries($))if(!Object.hasOwn(C,_))C[_]=K;return C}import{createHash as Q_}from"node:crypto";var f_=new Uint8Array([0,97,115,109,1,0,0,0,1,48,8,96,3,127,127,127,1,127,96,3,127,127,127,0,96,2,127,127,0,96,1,127,1,127,96,3,127,127,126,1,126,96,3,126,127,127,1,126,96,2,127,126,0,96,1,127,1,126,3,11,10,0,0,2,1,3,4,5,6,1,7,5,3,1,0,1,7,85,9,3,109,101,109,2,0,5,120,120,104,51,50,0,0,6,105,110,105,116,51,50,0,2,8,117,112,100,97,116,101,51,50,0,3,8,100,105,103,101,115,116,51,50,0,4,5,120,120,104,54,52,0,5,6,105,110,105,116,54,52,0,7,8,117,112,100,97,116,101,54,52,0,8,8,100,105,103,101,115,116,54,52,0,9,10,251,22,10,242,1,1,4,127,32,0,32,1,106,33,3,32,1,65,16,79,4,127,32,3,65,16,107,33,6,32,2,65,168,136,141,161,2,106,33,3,32,2,65,137,235,208,208,7,107,33,4,32,2,65,207,140,162,142,6,106,33,5,3,64,32,3,32,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,4,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,4,32,2,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,5,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,6,32,0,65,4,106,34,0,79,13,0,11,32,2,65,12,119,32,5,65,18,119,106,32,4,65,7,119,106,32,3,65,1,119,106,5,32,2,65,177,207,217,178,1,106,11,32,1,106,32,0,32,1,65,15,113,16,1,11,146,1,0,32,1,32,2,106,33,2,3,64,32,1,65,4,106,32,2,75,69,4,64,32,0,32,1,40,2,0,65,189,220,202,149,124,108,106,65,17,119,65,175,214,211,190,2,108,33,0,32,1,65,4,106,33,1,12,1,11,11,3,64,32,1,32,2,79,69,4,64,32,0,32,1,45,0,0,65,177,207,217,178,1,108,106,65,11,119,65,177,243,221,241,121,108,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,65,15,118,115,65,247,148,175,175,120,108,34,0,65,13,118,32,0,115,65,189,220,202,149,124,108,34,0,65,16,118,32,0,115,11,63,0,32,0,65,8,106,32,1,65,168,136,141,161,2,106,54,2,0,32,0,65,12,106,32,1,65,137,235,208,208,7,107,54,2,0,32,0,65,16,106,32,1,54,2,0,32,0,65,20,106,32,1,65,207,140,162,142,6,106,54,2,0,11,195,4,1,6,127,32,1,32,2,106,33,6,32,0,65,24,106,33,4,32,0,65,40,106,40,2,0,33,3,32,0,32,0,40,2,0,32,2,106,54,2,0,32,0,65,4,106,34,5,32,5,40,2,0,32,2,65,16,79,32,0,40,2,0,65,16,79,114,114,54,2,0,32,2,32,3,106,65,16,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,40,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,16,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,40,2,0,32,4,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,12,106,34,3,32,3,40,2,0,32,4,65,4,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,16,106,34,3,32,3,40,2,0,32,4,65,8,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,20,106,34,3,32,3,40,2,0,32,4,65,12,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,40,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,32,6,65,16,107,77,4,64,32,6,65,16,107,33,8,32,0,65,8,106,40,2,0,33,2,32,0,65,12,106,40,2,0,33,3,32,0,65,16,106,40,2,0,33,5,32,0,65,20,106,40,2,0,33,7,3,64,32,2,32,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,3,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,5,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,7,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,7,32,8,32,1,65,4,106,34,1,79,13,0,11,32,0,65,8,106,32,2,54,2,0,32,0,65,12,106,32,3,54,2,0,32,0,65,16,106,32,5,54,2,0,32,0,65,20,106,32,7,54,2,0,11,32,1,32,6,73,4,64,32,4,32,1,32,6,32,1,107,34,1,252,10,0,0,32,0,65,40,106,32,1,54,2,0,11,11,97,1,1,127,32,0,65,16,106,40,2,0,33,1,32,0,65,4,106,40,2,0,4,127,32,1,65,12,119,32,0,65,20,106,40,2,0,65,18,119,106,32,0,65,12,106,40,2,0,65,7,119,106,32,0,65,8,106,40,2,0,65,1,119,106,5,32,1,65,177,207,217,178,1,106,11,32,0,40,2,0,106,32,0,65,24,106,32,0,65,40,106,40,2,0,16,1,11,255,3,2,3,126,1,127,32,0,32,1,106,33,6,32,1,65,32,79,4,126,32,6,65,32,107,33,6,32,2,66,214,235,130,238,234,253,137,245,224,0,124,33,3,32,2,66,177,169,172,193,173,184,212,166,61,125,33,4,32,2,66,249,234,208,208,231,201,161,228,225,0,124,33,5,3,64,32,3,32,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,3,32,4,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,4,32,2,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,2,32,5,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,5,32,6,32,0,65,8,106,34,0,79,13,0,11,32,2,66,12,137,32,5,66,18,137,124,32,4,66,7,137,124,32,3,66,1,137,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,2,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,2,66,197,207,217,178,241,229,186,234,39,124,11,32,1,173,124,32,0,32,1,65,31,113,16,6,11,134,2,0,32,1,32,2,106,33,2,3,64,32,2,32,1,65,8,106,79,4,64,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,32,0,133,66,27,137,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,33,0,32,1,65,8,106,33,1,12,1,11,11,32,1,65,4,106,32,2,77,4,64,32,0,32,1,53,2,0,66,135,149,175,175,152,182,222,155,158,127,126,133,66,23,137,66,207,214,211,190,210,199,171,217,66,126,66,249,243,221,241,153,246,153,171,22,124,33,0,32,1,65,4,106,33,1,11,3,64,32,1,32,2,73,4,64,32,0,32,1,49,0,0,66,197,207,217,178,241,229,186,234,39,126,133,66,11,137,66,135,149,175,175,152,182,222,155,158,127,126,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,66,33,136,133,66,207,214,211,190,210,199,171,217,66,126,34,0,32,0,66,29,136,133,66,249,243,221,241,153,246,153,171,22,126,34,0,32,0,66,32,136,133,11,77,0,32,0,65,8,106,32,1,66,214,235,130,238,234,253,137,245,224,0,124,55,3,0,32,0,65,16,106,32,1,66,177,169,172,193,173,184,212,166,61,125,55,3,0,32,0,65,24,106,32,1,55,3,0,32,0,65,32,106,32,1,66,249,234,208,208,231,201,161,228,225,0,124,55,3,0,11,244,4,2,3,127,4,126,32,1,32,2,106,33,5,32,0,65,40,106,33,4,32,0,65,200,0,106,40,2,0,33,3,32,0,32,0,41,3,0,32,2,173,124,55,3,0,32,2,32,3,106,65,32,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,200,0,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,32,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,41,3,0,32,4,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,16,106,34,3,32,3,41,3,0,32,4,65,8,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,24,106,34,3,32,3,41,3,0,32,4,65,16,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,32,106,34,3,32,3,41,3,0,32,4,65,24,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,200,0,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,65,32,106,32,5,77,4,64,32,5,65,32,107,33,2,32,0,65,8,106,41,3,0,33,6,32,0,65,16,106,41,3,0,33,7,32,0,65,24,106,41,3,0,33,8,32,0,65,32,106,41,3,0,33,9,3,64,32,6,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,6,32,7,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,7,32,8,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,8,32,9,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,9,32,2,32,1,65,8,106,34,1,79,13,0,11,32,0,65,8,106,32,6,55,3,0,32,0,65,16,106,32,7,55,3,0,32,0,65,24,106,32,8,55,3,0,32,0,65,32,106,32,9,55,3,0,11,32,1,32,5,73,4,64,32,4,32,1,32,5,32,1,107,34,1,252,10,0,0,32,0,65,200,0,106,32,1,54,2,0,11,11,188,2,1,5,126,32,0,65,24,106,41,3,0,33,1,32,0,41,3,0,34,2,66,32,90,4,126,32,0,65,8,106,41,3,0,34,3,66,1,137,32,0,65,16,106,41,3,0,34,4,66,7,137,124,32,1,66,12,137,32,0,65,32,106,41,3,0,34,5,66,18,137,124,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,1,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,1,66,197,207,217,178,241,229,186,234,39,124,11,32,2,124,32,0,65,40,106,32,2,66,31,131,167,16,6,11]);async function x1(){return function($){let{exports:{mem:C,xxh32:_,xxh64:K,init32:G,update32:j,digest32:J,init64:Z,update64:z,digest64:X}}=$,Y=new Uint8Array(C.buffer);function N(W,b){if(C.buffer.byteLength<W+b){let R=Math.ceil((W+b-C.buffer.byteLength)/65536);C.grow(R),Y=new Uint8Array(C.buffer)}}function O(W,b,R,x,l$,f0){N(W);let g=new Uint8Array(W);return Y.set(g),R(0,b),g.set(Y.subarray(0,W)),{update(k){let $$;return Y.set(g),typeof k=="string"?(N(3*k.length,W),$$=f.encodeInto(k,Y.subarray(W)).written):(N(k.byteLength,W),Y.set(k,W),$$=k.byteLength),x(0,W,$$),g.set(Y.subarray(0,W)),this},digest:()=>(Y.set(g),f0(l$(0)))}}function L(W){return W>>>0}let F=2n**64n-1n;function V(W){return W&F}let f=new TextEncoder,A=0,P=0n;function H(W,b=A){return N(3*W.length,0),L(_(0,f.encodeInto(W,Y).written,b))}function v(W,b=P){return N(3*W.length,0),V(K(0,f.encodeInto(W,Y).written,b))}return{h32:H,h32ToString:(W,b=A)=>H(W,b).toString(16).padStart(8,"0"),h32Raw:(W,b=A)=>(N(W.byteLength,0),Y.set(W),L(_(0,W.byteLength,b))),create32:(W=A)=>O(48,W,G,j,J,L),h64:v,h64ToString:(W,b=P)=>v(W,b).toString(16).padStart(16,"0"),h64Raw:(W,b=P)=>(N(W.byteLength,0),Y.set(W),V(K(0,W.byteLength,b))),create64:(W=P)=>O(88,W,Z,z,X,V)}}((await WebAssembly.instantiate(f_)).instance)}var B_=0x6e52736ac806831en,D_="cch=00000;";var E$=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=([0-9a-f]{5});/,S_=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=00000;/,k1=null,M$=null;async function R_(){if(M$)return;k1??=(async()=>{M$=(await x1()).h64Raw})(),await k1}async function A_($){return await R_(),((M$?.($,B_)??0n)&0xfffffn).toString(16).padStart(5,"0")}function q_($){return $.replace(E$,`$1${D_}`)}function y1($){return E$.exec($)?.[2]??null}async function m1($){if(!E$.test($))return $;let C=q_($),_=await A_(new TextEncoder().encode(C));return C.replace(S_,`$1cch=${_};`)}function P_($=d,C=new Date){if($===d)return G$;return Q_("sha256").update($).digest("hex").slice(0,3)}function C4($,C=d,_,K=new Date){let G=P_(C,K);return`x-anthropic-billing-header: cc_version=${C}.${G}; cc_entrypoint=${_}; cch=00000;`}var J4="claude-cachekeep",f$=3600000,y0=300000,I_=60000,Z4="extended-cache-ttl-2025-04-11",h_=32,v1=16777216,T_=2*f$,w_=30000,l1="## Claude Cache Keep Status",p1="## Claude Cache Keep Enabled",x_="## Claude Cache Keep Disabled",k_="## Claude Cache Keep Usage",y_="Usage: `/claude-cachekeep`, `/claude-cachekeep always`, `/claude-cachekeep off`, or `/claude-cachekeep HH-HH`.";function m0($){return String($).padStart(2,"0")}function m_($){let C=$.trim();if(!C)return{type:"status"};if(C==="off")return{type:"disable"};if(C==="always")return{type:"always"};if(C==="subagents on")return{type:"subagents",enabled:!0};if(C==="subagents off")return{type:"subagents",enabled:!1};let _=/^(\d{1,2})-(\d{1,2})$/.exec(C);if(!_)return{type:"usage"};let K=Number(_[1]),G=Number(_[2]);if(!Number.isInteger(K)||!Number.isInteger(G)||K<0||K>23||G<0||G>23||K===G)return{type:"usage"};return{type:"window",startHour:K,endHour:G}}function v0($){let C=Number($?.cacheKeep?.startHour),_=Number($?.cacheKeep?.endHour);if(!Number.isInteger(C)||!Number.isInteger(_)||C<0||C>23||_<0||_>23||C===_)return;return{startHour:C,endHour:_}}function l0($){return $?.cacheKeep?.enabled===!0&&$.cacheKeep.always===!0}function i1($){return $?.cacheKeep?.enabled===!0&&(l0($)||!!v0($))}function v_($){return i1($)&&$?.claudeCache?.enabled===!0&&$.claudeCache.mode==="hybrid"}function l_($,C=new Date){if(!$)return!1;let _=C.getHours();if($.startHour<$.endHour)return _>=$.startHour&&_<$.endHour;return _>=$.startHour||_<$.endHour}function g1($,C=new Date){if($?.cacheKeep?.enabled!==!0)return!1;return l0($)||l_(v0($),C)}function d1($=new Date){return`${$.getFullYear()}-${m0($.getMonth()+1)}-${m0($.getDate())}`}function c1($,C=new Date){if($&&$.startHour>$.endHour&&C.getHours()<$.endHour){let _=new Date(C);return _.setDate(_.getDate()-1),d1(_)}return d1(C)}function u1($,C,_=new Date){return l0($)?"always":c1(C,_)}function J0($){let C=$.always?"always (while this process is running)":$.window?`${m0($.window.startHour)}-${m0($.window.endHour)}`:"not configured",_=[`Cache keep: ${$.enabled?"enabled":"disabled"}`,`Schedule: ${C}`,"Mode requirement: `/claude-cache mode hybrid` must be active."];if(typeof $.hybridActive==="boolean")_.push(`Hybrid active: ${$.hybridActive?"yes":"no"}`);if(typeof $.trackedSessions==="number")_.push(`Tracked sessions: ${$.trackedSessions}`);if($.trackedSessionDetails?.length){_.push("Sessions:");for(let K of $.trackedSessionDetails)_.push(`- ${K.id}`)}if($.nextPrewarmAt)_.push(`Next prewarm: ${new Date($.nextPrewarmAt).toLocaleString()}`);return _.join(`
12
- `)}function z4($){let C=m_($.argumentsText),_={enabled:$.enabled??!1,always:$.always,window:$.window,trackedSessions:$.trackedSessions,trackedSessionDetails:$.trackedSessionDetails,nextPrewarmAt:$.nextPrewarmAt,hybridActive:$.hybridActive};if(C.type==="status")return[l1,"",J0(_)].join(`
13
- `);if(C.type==="disable")return[x_,"",J0({..._,enabled:!1})].join(`
14
- `);if(C.type==="always")return[p1,"",J0({..._,enabled:!0,always:!0,window:void 0})].join(`
15
- `);if(C.type==="window")return[p1,"",J0({..._,enabled:!0,always:!1,window:{startHour:C.startHour,endHour:C.endHour}})].join(`
16
- `);if(C.type==="subagents")return[l1,"",J0(_),"",`Subagent tracking: ${C.enabled?"enabled":"disabled"}`].join(`
17
- `);return[k_,"",y_,"",J0(_)].join(`
18
- `)}function Q$($){if(!$||typeof $!=="object")return!1;if(Array.isArray($))return $.some(Q$);let C=$,_=C.cache_control;if(_&&typeof _==="object"&&_.type==="ephemeral")return!0;return Object.values(C).some(Q$)}async function p_($){let C;try{C=JSON.parse($)}catch{return{ok:!1,reason:"body is not valid JSON"}}if(!Q$(C))return{ok:!1,reason:"body has no explicit cache breakpoints"};let _=structuredClone(C);if(_.max_tokens=0,delete _.stream,_.thinking?.type==="enabled")delete _.thinking;if(_.output_config?.format)delete _.output_config;let j=_.tool_choice;if(j?.type==="tool"||j?.type==="any")delete _.tool_choice;return{ok:!0,bodyText:await m1(JSON.stringify(w1(_)))}}class g_{options;targets=new Map;timer=null;constructor($){this.options=$}start(){if(this.timer)return;if(h.debug("cachekeep","started"),this.timer=(this.options.setIntervalImpl??globalThis.setInterval)(()=>{this.tick().catch(($)=>{h.warn("cachekeep","tick failed",{error:$ instanceof Error?$.message:String($)})})},I_),"unref"in this.timer)this.timer.unref()}stop(){if(!this.timer)return;h.debug("cachekeep","stopped"),(this.options.clearIntervalImpl??globalThis.clearInterval)(this.timer),this.timer=null}stats($,C=this.options.now?.()??Date.now(),_=!1){let K=_?"always":c1($,new Date(C)),G=[...this.targets.values()].filter((J)=>J.dayKey===K),j=G.length?Math.min(...G.map((J)=>J.cacheExpiresAt-y0)):void 0;return{trackedSessions:G.length,nextPrewarmAt:j}}trackedSessions(){return[...this.targets.values()].map(($)=>({id:$.id,cacheExpiresAt:$.cacheExpiresAt,nextPrewarmAt:$.cacheExpiresAt-y0})).sort(($,C)=>$.id.localeCompare(C.id))}trackedOAuthRoute($){let C=this.targets.get($);return C?{oauthAccountId:C.oauthAccountId}:void 0}trackedCount(){return this.targets.size}publishTrackedSessions(){let $=this.options.onTrackedSessionsChanged;if(!$)return;try{Promise.resolve($(this.trackedSessions())).catch((C)=>{h.warn("cachekeep","failed to publish tracked sessions",{error:C instanceof Error?C.message:String(C)})})}catch(C){h.warn("cachekeep","failed to publish tracked sessions",{error:C instanceof Error?C.message:String(C)})}}totalBodyBytes(){return[...this.targets.values()].reduce(($,C)=>$+C.bodyText.length,0)}evictOldestTarget(){let $=this.targets.keys().next().value;if($!==void 0)this.targets.delete($)}pruneTargets($,C){for(let[_,K]of this.targets){if(C&&K.dayKey!==C){this.targets.delete(_);continue}if($-K.cacheExpiresAt>T_)this.targets.delete(_)}while(this.targets.size>h_)this.evictOldestTarget();while(this.totalBodyBytes()>v1){let _=this.targets.size;if(this.evictOldestTarget(),this.targets.size===_)break}}track($){if(!$.sessionId)return{tracked:!1,reason:"missing session id"};if(!i1($.storage))return{tracked:!1,reason:"cachekeep disabled"};if($.cacheMode!=="hybrid")return{tracked:!1,reason:"cache mode is not hybrid"};if($.bodyText.length>v1)return{tracked:!1,reason:"body exceeds cachekeep memory budget"};let C=this.options.now?.()??Date.now(),_=v0($.storage);if(!g1($.storage,new Date(C)))return{tracked:!1,reason:"outside configured schedule"};let K=u1($.storage,_,new Date(C));if(this.pruneTargets(C,K),this.targets.has($.sessionId))this.targets.delete($.sessionId);let G={};return $.headers.forEach((j,J)=>{G[J]=j}),this.targets.set($.sessionId,{id:$.sessionId,url:$.url,headers:G,bodyText:$.bodyText,cacheExpiresAt:C+f$,dayKey:K,oauthAccountId:$.oauthAccountId}),this.pruneTargets(C,K),this.publishTrackedSessions(),this.start(),{tracked:!0}}async prewarmNow($){let C={};$.headers.forEach((K,G)=>{C[G]=K});let _={id:$.sessionId,url:$.url,headers:C,bodyText:$.bodyText,cacheExpiresAt:this.options.now?.()??Date.now(),dayKey:"",oauthAccountId:$.oauthAccountId};return this.sendPrewarm(_)}async tick(){let $=await this.options.loadStorage(),C=v0($),_=this.options.now?.()??Date.now(),K=u1($,C,new Date(_));if(l0($))for(let j of this.targets.values())j.dayKey="always";if(this.pruneTargets(_,K),!this.targets.size){this.publishTrackedSessions(),this.stop();return}if(!v_($)){this.publishTrackedSessions();return}if(!g1($,new Date(_))){this.publishTrackedSessions();return}h.debug("cachekeep","fired",{targets:this.targets.size});let G=_+y0;for(let j of this.targets.values()){if(j.cacheExpiresAt>G)continue;await this.prewarm(j,_)}this.publishTrackedSessions()}async sendPrewarm($){let C=await p_($.bodyText);if(!C.ok)return C;let _=this.options.fetchImpl??fetch,K={...$,bodyText:C.bodyText},G=this.options.prepareHeaders?await this.options.prepareHeaders(new Headers($.headers),K):new Headers($.headers);G.delete("content-length"),G.delete("transfer-encoding");let j=await _($.url,{method:"POST",headers:G,body:C.bodyText,signal:AbortSignal.timeout(this.options.prewarmTimeoutMs??w_)});if(!j.ok)return{ok:!1,reason:await j.text().catch(()=>"").then((z)=>z||`HTTP ${j.status}`),status:j.status};let Z=(await j.json().catch(()=>null))?.usage;return{ok:!0,...Z&&{usage:Z}}}async prewarm($,C){let _=await this.sendPrewarm($);if(!_.ok){if(_.status==null)h.debug("cachekeep","prewarm skipped",{session:$.id,reason:_.reason}),this.targets.delete($.id);else h.warn("cachekeep","prewarm failed",{session:$.id,status:_.status,reason:_.reason}),$.cacheExpiresAt=C+y0+300000;return}$.cacheExpiresAt=C+f$,h.debug("cachekeep","prewarm succeeded",{session:$.id,..._.usage&&{usage:_.usage}})}}import{randomUUID as r1}from"node:crypto";import{mkdir as d_,readdir as u_,readFile as i_,rename as c_,rm as s1,writeFile as r_}from"node:fs/promises";import{tmpdir as s_}from"node:os";import{join as B$}from"node:path";var n_=180000;function o_($){if(!$||typeof $!=="object"||Array.isArray($))return;let C=$;if(typeof C.id!=="string"||C.id.length===0||typeof C.cacheExpiresAt!=="number"||!Number.isFinite(C.cacheExpiresAt)||typeof C.nextPrewarmAt!=="number"||!Number.isFinite(C.nextPrewarmAt))return;return{id:C.id,cacheExpiresAt:C.cacheExpiresAt,nextPrewarmAt:C.nextPrewarmAt}}function a_($){if(!$||typeof $!=="object"||Array.isArray($))return;let C=$;if(C.version!==1||typeof C.updatedAt!=="number"||!Number.isFinite(C.updatedAt)||!Array.isArray(C.sessions))return;return{version:1,updatedAt:C.updatedAt,sessions:C.sessions.flatMap((_)=>{let K=o_(_);return K?[K]:[]})}}function W4($){return B$(s_(),"opencode-anthropic-auth","cachekeep-sessions",$)}class t_{options;filePath;writeChain=Promise.resolve();constructor($){this.options=$;let C=$.instanceId??`${process.pid}-${r1()}`;this.filePath=B$($.directory,`${C}.json`)}publish($){let C=$.map((_)=>({..._}));return this.writeChain=this.writeChain.catch(()=>{}).then(async()=>{if(C.length===0){await s1(this.filePath,{force:!0});return}await d_(this.options.directory,{recursive:!0,mode:448});let _=`${this.filePath}.${r1()}.tmp`,K={version:1,updatedAt:this.options.now?.()??Date.now(),sessions:C};await r_(_,`${JSON.stringify(K)}
19
- `,{mode:384}),await c_(_,this.filePath)}),this.writeChain}async list($=[]){await this.writeChain.catch(()=>{});let C=this.options.now?.()??Date.now(),_=this.options.leaseMs??n_,K;try{K=(await u_(this.options.directory)).filter((J)=>J.endsWith(".json"))}catch{K=[]}let G=await Promise.all(K.map(async(J)=>{try{let Z=await i_(B$(this.options.directory,J),"utf8");return a_(JSON.parse(Z))}catch{return}})),j=new Map;for(let J of G){if(!J||C-J.updatedAt>_||J.updatedAt>C)continue;for(let Z of J.sessions){let z=j.get(Z.id);if(!z||Z.cacheExpiresAt>z.cacheExpiresAt)j.set(Z.id,Z)}}for(let J of $){let Z=j.get(J.id);if(!Z||J.cacheExpiresAt>Z.cacheExpiresAt)j.set(J.id,{...J})}return[...j.values()].sort((J,Z)=>J.id.localeCompare(Z.id))}async dispose(){await this.writeChain.catch(()=>{}),await s1(this.filePath,{force:!0})}}var n1={"5h":"five_hour","7d":"seven_day"};function F4($){return Object.keys(n1).some((C)=>Number.isFinite(D$($,`anthropic-ratelimit-unified-${C}-utilization`)))}function D$($,C){let _=$.get(C);if(_==null||_.trim()==="")return;let K=Number(_);return Number.isFinite(K)?K:void 0}function e_($,C,_){let K=D$($,`anthropic-ratelimit-unified-${C}-utilization`);if(K==null)return;let G=Math.min(100,Math.max(0,Math.round(K*100))),j=D$($,`anthropic-ratelimit-unified-${C}-reset`),J=j==null?void 0:new Date(j*1000),Z=J&&Number.isFinite(J.getTime())?J.toISOString():void 0;return{usedPercent:G,remainingPercent:100-G,...Z&&{resetsAt:Z},checkedAt:_}}function U4($,C=Date.now()){let _={fallbackAdvised:$.get("anthropic-ratelimit-unified-fallback")==="available",source:"headers",checkedAt:C};for(let[G,j]of Object.entries(n1)){let J=e_($,G,C);if(J)_[j]=J}let K=$.get("anthropic-ratelimit-unified-representative-claim");if(K)_.bindingWindow=K,_.bindingWindowSource="headers";return _}function p0($,C){return{...$,...C,scoped:$&&"scoped"in $?$.scoped:void 0,extraUsage:$?.extraUsage,bindingWindow:$?.bindingWindowSource==="poll"?$.bindingWindow:C.bindingWindow??$?.bindingWindow,bindingWindowSource:$?.bindingWindowSource==="poll"?"poll":C.bindingWindowSource??$?.bindingWindowSource,source:"headers"}}var $K=globalThis.setTimeout;function o1($,C){if($?.source!=="headers")return C;let _=Boolean($.five_hour&&$.five_hour.checkedAt>(C.five_hour?.checkedAt??0)),K=Boolean($.seven_day&&$.seven_day.checkedAt>(C.seven_day?.checkedAt??0));if(!_&&!K)return C;return p0(C,{..._&&{five_hour:$.five_hour},...K&&{seven_day:$.seven_day},fallbackAdvised:$.fallbackAdvised,...$.bindingWindowSource==="headers"&&{bindingWindow:$.bindingWindow,bindingWindowSource:$.bindingWindowSource},source:"headers",checkedAt:Math.max(_?$.five_hour?.checkedAt??0:0,K?$.seven_day?.checkedAt??0:0)})}class i{main=null;mainTokenFp=null;fallbacks=new Map;fallbackTokenFps=new Map;inflightMain=null;inflightMainFp=null;inflightFallbacks=new Map;mainLastApiError=void 0;fallbackApiErrors=new Map;fallbackErrorTokenFps=new Map;apiGate=Promise.resolve();lastApiCallAt=0;storage;fetchImpl;now;onMainQuotaFetched;onApiError;constructor($){this.storage=$.storage,this.fetchImpl=$.fetchImpl??fetch,this.now=$.now??Date.now,this.onMainQuotaFetched=$.onMainQuotaFetched,this.onApiError=$.onApiError,this.seedMainFromStorage($.storage),this.seedMainBackoffFromStorage($.storage)}getMain($){if($&&this.main&&this.mainTokenFp&&this.mainTokenFp!==D($))this.main=null,this.mainTokenFp=null;return this.main}getFallback($,C){let _=this.fallbacks.get($)??null;if(!C||!_)return _;if(this.fallbackTokenFps.get($)!==D(C))return this.fallbacks.delete($),this.fallbackTokenFps.delete($),null;return _}getAllFallbacks(){return this.fallbacks}setMain($,C){this.mainTokenFp=D($),this.main=C}setFallback($,C,_){if(this.fallbacks.set($,C),_)this.fallbackTokenFps.set($,D(_));else this.fallbackTokenFps.delete($)}pushMainFromHeaders($,C){let _=C.checkedAt??this.now(),K=D($),G=p0(this.mainTokenFp===K?this.main?.quota:void 0,C),j={quota:G,checkedAt:_,refreshAfter:j0(G,this.storage,_)};return this.setMain($,j),j}pushFallbackFromHeaders($,C,_){let K=_.checkedAt??this.now(),G=p0(this.getFallback($,C)?.quota,_),j={quota:G,checkedAt:K,refreshAfter:j0(G,this.storage,K)};return this.setFallback($,j,C),j}async refreshMain($){let C=D($);if(this.mainTokenFp&&this.mainTokenFp!==C)this.main=null,this.mainTokenFp=null;if(this.inflightMain&&this.inflightMainFp===C)return this.inflightMain;if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}return this.inflightMainFp=C,this.inflightMain=this._fetchMain($),this.inflightMain}async refreshFallback($,C){let _=i.fallbackInflightKey($,C),K=this.inflightFallbacks.get(_);if(K)return K;if(this.isFallbackBackedOff($,C)){let j=this.getFallback($,C);if(j)return j.quota;throw Error("Quota API rate-limited — try again later")}let G=this._fetchFallback($,C);return this.inflightFallbacks.set(_,G),G}async refreshAllFallbacks($){let C=this.now();for(let _ of $){if(_.enabled===!1)continue;if(!_.access)continue;let K=this.getFallback(_.id,_.access);if(K&&C<K.refreshAfter)continue;try{await this.refreshFallback(_.id,_.access)}catch{}}}refreshMainInBackground($){if(this.inflightMain)return;if(this.isBackedOff())return;this.refreshMain($).catch(()=>{})}scopedWindowIsStale($,C){let _=y($.quota,C);return Boolean(_&&this.now()-_.checkedAt>=l(this.storage))}isMainStale($){if(!this.main)return!0;return this.now()>=this.main.refreshAfter||this.scopedWindowIsStale(this.main,$)}isFallbackStale($,C,_){let K=this.getFallback($,C);if(!K)return!0;return this.now()>=K.refreshAfter||this.scopedWindowIsStale(K,_)}shouldRefreshOnRequestCount($){let C=f1(this.storage);if(C<=0)return!1;return $>0&&$%C===0}needsRefresh($,C){return this.isMainStale(C)||this.shouldRefreshOnRequestCount($)}updateStorage($){this.storage=$,this.seedMainFromStorage($),this.seedMainBackoffFromStorage($)}seedMainFromStorage($,C){let _=E1($);if(!_)return;let K=C?D(C):null;if(K&&_.tokenFingerprint&&_.tokenFingerprint!==K)return;let G={quota:_.quota,refreshAfter:j0(_.quota,$,_.checkedAt),checkedAt:_.checkedAt};if(this.main&&this.main.checkedAt>=G.checkedAt&&(!K||!this.mainTokenFp||this.mainTokenFp===K))return;this.main=G,this.mainTokenFp=_.tokenFingerprint??null}seedMainBackoffFromStorage($){let C=$?.quota?.mainLastQuotaApiError;this.mainLastApiError=C&&K0(C,this.now())?C:void 0}seedFallbacksFromAccounts($){let C=l(this.storage);for(let _ of $){if(_.enabled===!1)continue;if(!_.quota)continue;let K=Math.max(_.quota.five_hour?.checkedAt??0,_.quota.seven_day?.checkedAt??0);if(K<=0)continue;let G=this.getFallback(_.id,_.access);if(G&&G.checkedAt>=K)continue;this.setFallback(_.id,{quota:_.quota,refreshAfter:K+C,checkedAt:K},_.access)}}isBackedOff(){return K0(this.mainLastApiError,this.now())}isFallbackBackedOff($,C){if(C){if(this.fallbackErrorTokenFps.get($)!==D(C))return!1}return K0(this.fallbackApiErrors.get($),this.now())}getLastApiError(){return this.mainLastApiError}static API_CALL_GAP_MS=1000;static fallbackInflightKey($,C){return JSON.stringify([$,D(C)])}static quotaLockName($){return`opencode-fallback-quota-refresh-${$.replace(/[^a-zA-Z0-9._-]+/g,"-")||"account"}`}_enqueueApiFetch($){let C=async()=>{let K=this.now()-this.lastApiCallAt;if(K<i.API_CALL_GAP_MS)await new Promise((G)=>{let j=$K(G,i.API_CALL_GAP_MS-K);if(typeof j==="object"&&"unref"in j)j.unref()});return this.lastApiCallAt=this.now(),$()},_=this.apiGate.then(C,C);return this.apiGate=_.catch(()=>{}),_}async _fetchMain($){let C=D($);return this._enqueueApiFetch(async()=>{try{if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}let _=await o({name:"opencode-main-quota-refresh",ttlMs:30000});if(!_){let K=this.main;if(K&&this.now()<K.refreshAfter)return K.quota;throw Error("Quota refresh is already in progress")}try{let K=this.now(),G=await w0({accessToken:$,fetchImpl:this.fetchImpl,now:this.now}),j=this.now(),J=o1(this.mainTokenFp===C?this.main?.quota:void 0,G);return this.mainTokenFp=D($),this.main={quota:J,refreshAfter:j0(J,this.storage,j),checkedAt:J.checkedAt??j},this.mainLastApiError=void 0,this.onMainQuotaFetched?.(J,j,this.mainTokenFp,K),J}catch(K){throw this._handleMainFetchError(K),K}finally{await _.release()}}finally{if(this.inflightMainFp===C)this.inflightMain=null,this.inflightMainFp=null}})}async _fetchFallback($,C){return this._enqueueApiFetch(async()=>{try{if(this.isFallbackBackedOff($,C)){let K=this.getFallback($,C);if(K)return K.quota;throw Error("Quota API rate-limited — try again later")}let _=await o({name:i.quotaLockName($),ttlMs:30000});if(!_){let K=this.getFallback($,C);if(K&&this.now()<K.refreshAfter)return K.quota;throw Error("Quota refresh is already in progress")}try{let K=await w0({accessToken:C,fetchImpl:this.fetchImpl,now:this.now}),G=this.now(),j=o1(this.getFallback($,C)?.quota,K);return this.setFallback($,{quota:j,refreshAfter:j0(j,this.storage,G),checkedAt:j.checkedAt??G},C),this.fallbackApiErrors.delete($),this.fallbackErrorTokenFps.delete($),j}finally{await _.release()}}catch(_){throw this._handleFallbackFetchError($,C,_),_}finally{this.inflightFallbacks.delete(i.fallbackInflightKey($,C))}})}static isAuthError($){if($.status===401||F$($))return!0;let _=$ instanceof Error?$.message:String($);return/quota check failed: 401\b/.test(_)}_handleMainFetchError($){if(i.isAuthError($))return;this.mainLastApiError=T0({error:$,now:this.now(),previous:this.mainLastApiError}),this.onApiError?.(this.mainLastApiError)}_handleFallbackFetchError($,C,_){if(i.isAuthError(_))return;let K=D(C),G=this.fallbackErrorTokenFps.get($)===K?this.fallbackApiErrors.get($):void 0;this.fallbackApiErrors.set($,T0({error:_,now:this.now(),previous:G})),this.fallbackErrorTokenFps.set($,K)}}var CK="https://api.anthropic.com/api/oauth/profile",_K=604800000;async function D4($){let C=await($.fetchImpl??fetch)(CK,{method:"GET",signal:$.signal,headers:{Authorization:`Bearer ${$.accessToken}`,Accept:"application/json","anthropic-beta":"oauth-2025-04-20"}});if(!C.ok)throw Error(`Claude profile check failed: ${C.status}`);let _=await C.json(),K=_.organization?.rate_limit_tier,G=_.organization?.organization_type;if(typeof K!=="string"||K.trim()===""||typeof G!=="string"||G.trim()==="")throw Error("Claude profile response is missing account metadata");return{tier:K,orgType:G,checkedAt:$.now?.()??Date.now(),tokenFingerprint:D($.accessToken)}}function S4($,C){return $?.tokenFingerprint===D(C)}function R4($,C=Date.now()){return Boolean($&&Number.isFinite($.checkedAt)&&C>=$.checkedAt&&C-$.checkedAt<_K)}function Z0($){let C=$?.tier.match(/^default_claude_max_(\d+)x$/);if(!C)return;let _=`Max ${C[1]}x`;return $?.orgType==="claude_team"?`Team · ${_}`:_}var P4="claude-account";function KK($){let C=$.trim().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};let _=C[0],K=C.slice(1).join(" ");if(_==="enable"&&K)return{type:"enable",id:K};if(_==="disable"&&K)return{type:"disable",id:K};if(_==="remove"&&K)return{type:"remove",id:K};if(_==="move-up"&&K)return{type:"move-up",id:K};if(_==="move-down"&&K)return{type:"move-down",id:K};if(_==="add-apikey"&&K){let G=K,j,J,Z=G.match(/--base-url\s+(\S+)/);if(Z)j=Z[1],G=G.replace(Z[0],"").trim();let z=G.match(/--auth-header\s+(authorization-bearer|x-api-key)/);if(z)J=z[1],G=G.replace(z[0],"").trim();let X,Y=G.match(/--label\s+(.+)/);if(Y)X=Y[1]?.trim()||void 0,G=G.replace(Y[0],"").trim();let N=G.indexOf(" ");if(N===-1){if(!G)return{type:"usage"};return{type:"add-apikey",apiKey:G,baseURL:j,authHeader:J,label:X}}let O=G.slice(0,N),L=G.slice(N+1).trim();return{type:"add-apikey",apiKey:O,label:X??(L||void 0),baseURL:j,authHeader:J}}if(_==="add-oauth-start")return{type:"add-oauth-start"};if(_==="add-oauth-finish"&&K){let G=K,j,J=G.match(/--label\s+(.+)/);if(J)j=J[1]?.trim()||void 0,G=G.replace(J[0],"").trim();if(!G)return{type:"usage"};return{type:"add-oauth-finish",code:G,label:j}}return{type:"usage"}}function GK($){let C=[],_=$.quota?.mainQuota?.five_hour;C.push({id:"main",label:$.main?.provider==="anthropic"?"OpenCode anthropic":"Main",role:"main",enabled:!0,quotaPercent:_?.usedPercent??null,tierLabel:Z0($.main?.profile)});for(let K of $.accounts){let G=K.quota?.five_hour;C.push({id:K.id,label:K.label??K.id,role:"fallback",enabled:K.enabled!==!1,quotaPercent:G?.usedPercent??null,tierLabel:K.type==="oauth"?Z0(K.profile):void 0})}return C}var S$=["Usage:"," /claude-account Show account list"," /claude-account enable <id> Enable a fallback account"," /claude-account disable <id> Disable a fallback account"," /claude-account remove <id> Remove a fallback account"," /claude-account move-up <id> Move a fallback account up"," /claude-account move-down <id> Move a fallback account down"," /claude-account add-apikey <key> Add an API key fallback account"," /claude-account add-oauth-start Start OAuth device flow"," /claude-account add-oauth-finish <code> Complete OAuth flow"].join(`
20
- `);function I4($){let C=KK($.argumentsText),_=$.storage.accounts,K="main";if(C.type==="status"){let j=GK($.storage),J=["## Claude Accounts",""];for(let Z of j){let z=Z.quotaPercent!=null?` ${Math.round(Z.quotaPercent)}%`:"",X=!Z.enabled?" (disabled)":"",Y=Z.tierLabel?` · ${Z.tierLabel}`:"";J.push(`- **${Z.label}** [${Z.role}]${Y}${X}${z}`)}return J.push("",S$),{text:J.join(`
21
- `)}}if(C.type==="usage")return{text:S$};if(C.type==="add-apikey")return{text:"add-apikey"};if(C.type==="add-oauth-start")return{text:"add-oauth-start"};if(C.type==="add-oauth-finish")return{text:"add-oauth-finish"};let G=C.id;if(G==="main")return{text:`Cannot ${C.type} the main account (OpenCode managed).`};if(C.type==="enable"||C.type==="disable"){let j=_.find((J)=>J.id===G);if(!j)return{text:`Account "${G}" not found.`};return{text:`Account "${j.label??G}" ${C.type}d.`,updated:{id:G,action:C.type,enabled:C.type==="enable"}}}if(C.type==="remove"){let j=_.find((J)=>J.id===G);if(!j)return{text:`Account "${G}" not found.`};return{text:`Account "${j.label??G}" removed.`,updated:{id:G,action:"remove"}}}if(C.type==="move-up"){let j=_.findIndex((X)=>X.id===G);if(j<0)return{text:`Account "${G}" not found.`};if(j===0)return{text:`Account "${_[j]?.label??G}" is already first.`};let J=_.map((X)=>X.id),Z=[..._];[Z[j-1],Z[j]]=[Z[j],Z[j-1]];let z=Z.map((X)=>X.id);return{text:`Account "${_[j]?.label??G}" moved up.`,updated:{id:G,action:"reorder",previousOrder:J,newOrder:z}}}if(C.type==="move-down"){let j=_.findIndex((X)=>X.id===G);if(j<0)return{text:`Account "${G}" not found.`};if(j===_.length-1)return{text:`Account "${_[j]?.label??G}" is already last.`};let J=_.map((X)=>X.id),Z=[..._];[Z[j],Z[j+1]]=[Z[j+1],Z[j]];let z=Z.map((X)=>X.id);return{text:`Account "${_[j]?.label??G}" moved down.`,updated:{id:G,action:"reorder",previousOrder:J,newOrder:z}}}return{text:S$}}import{createHash as jK,randomBytes as JK}from"node:crypto";import{lstat as a1,mkdir as ZK,readdir as zK,rename as XK,unlink as _C,writeFile as YK}from"node:fs/promises";import{tmpdir as OK}from"node:os";import{join as P$,resolve as u0}from"node:path";var v4="claude-dump",NK="## Claude Dump Status",LK="## Claude Dump Enabled",WK="## Claude Dump Disabled",HK="## Claude Dump Usage",FK="Usage: `/claude-dump`, `/claude-dump on`, or `/claude-dump off`.",UK="OPENCODE_ANTHROPIC_AUTH_DUMP_DIR",VK="OPENCODE_ANTHROPIC_AUTH_DUMP_MAX_BYTES",bK=P$(OK(),"opencode-anthropic-auth-dumps"),MK=536870912,EK=300000,fK=60000,QK=600000,BK=/\.(body|meta|relay|request)\.json$/,DK=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-\d{3}Z-\d{5,}-(.+)$/,A$="[a-zA-Z0-9._-]",SK=new RegExp(`^${A$}{1,80}-direct(?:-${A$}{1,80})?$`),RK=new RegExp(`^${A$}{1,80}-(?:http|websocket)-p[12]-(?:full_sync|patch)$`),M0=!1,t1=0,e1=0,AK=100,z0=new Map;function l4($){M0=$}function c0(){return process.env[UK]||bK}function qK(){let $=Number(process.env[VK]);return Number.isFinite($)&&$>=0?Math.floor($):MK}function PK($){return u0($)===u0(c0())}function q$($){let C=$.replace(BK,"");if(C===$)return!1;let K=DK.exec(C)?.[1];if(!K)return!1;return SK.test(K)||RK.test(K)}function IK($){if(!$.endsWith(".partial"))return!1;let C=$.slice(0,-8);if(q$(C))return!0;let _=C.lastIndexOf(".");if(_<0)return!1;let K=C.slice(_+1);return/^[a-f0-9]{24}$/.test(K)&&q$(C.slice(0,_))}async function g0($,C){for(let _=0;_<2;_+=1){let K=JK(12).toString("hex"),G=`${$}.${K}.partial`,j=!1;try{return await YK(G,C,{encoding:"utf8",flag:"wx"}),j=!0,await XK(G,$),!0}catch(J){if(J.code==="EEXIST")continue;if(j)await _C(G).catch(()=>{});throw J}}return!1}async function hK($){let C=$.dumpDir??c0(),_=$.maxBytes??qK(),K=$.now??Date.now(),G=$.minAgeMs??fK,j=$.partialStaleMs??QK,J={removed:0,freedBytes:0};if(!PK(C)||_<=0)return J;try{if((await a1(C)).isSymbolicLink())return J;let z=new Set(($.protectedPaths??[]).map((F)=>u0(F))),X=await zK(C,{withFileTypes:!0}),Y=[];await Promise.all(X.map(async(F)=>{if(!F.isFile())return;let V=IK(F.name);if(!V&&!q$(F.name))return;let f=P$(C,F.name);try{let A=await a1(f);if(!A.isFile()||A.isSymbolicLink())return;Y.push({path:f,size:A.size,mtimeMs:A.mtimeMs,partial:V})}catch{}}));let N=Y.reduce((F,V)=>F+V.size,0);Y.sort((F,V)=>F.mtimeMs-V.mtimeMs||F.path.localeCompare(V.path));let O=0,L=0;for(let F of Y){if(z.has(u0(F.path)))continue;let V=K-F.mtimeMs,f=F.partial&&V>=j;if(!f&&N<=_)continue;if(F.partial?!f:V<G)continue;try{await _C(F.path),N-=F.size,L+=F.size,O+=1}catch{}}if(O>0)h.debug("dump","removed old dump files",{removed:O,freedBytes:L});return{removed:O,freedBytes:L}}catch{return J}}function TK($,C){let _=Date.now();if(_-e1<EK)return;e1=_,hK({dumpDir:$,protectedPaths:C}).catch(()=>{})}function wK($){let C=$.trim().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&C[0]==="on")return{type:"enable"};if(C.length===1&&C[0]==="off")return{type:"disable"};return{type:"usage"}}function d0($){let C=$?.enabled??M0;return[NK,"",`- Enabled: ${C?"enabled":"disabled"}`,`- Directory: ${c0()}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Captures: final rewritten Anthropic body in direct and relay modes; request/relay metadata is redacted","- Warning: body dumps may contain prompt/session content; turn this off after debugging"].join(`
22
- `)}function p4($){let C=wK($.argumentsText),_=$.enabled??M0;if(C.type==="status")return d0({enabled:_});if(C.type==="enable")return[LK,"",d0({enabled:!0})].join(`
23
- `);if(C.type==="disable")return[WK,"",d0({enabled:!1})].join(`
24
- `);return[HK,"",FK,"",d0({enabled:_})].join(`
25
- `)}function $C($){return $.length<=16?$:`${$.slice(0,12)}…`}function KC($){let C=$.trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!C)return"session-unknown";return C.length<=80?C:C.slice(0,80)}function xK($){if($.transport!=="direct")return`${$.transport}-p${$.protocol}-${$.mode}`;return`direct${$.route?`-${KC($.route)}`:""}`}function kK($){let C=$.affinity?.trim();if(C)return`session:${C}`;return`request:${$.route??"direct"}:${$.url??""}`}function yK($,C){if(!z0.has($))while(z0.size>=AK){let _=z0.keys().next().value;if(_===void 0)break;z0.delete(_)}z0.set($,C)}function mK($){if($==null)return;return Object.fromEntries(new Headers($).entries())}function GC($){return jK("sha256").update($).digest("hex")}function vK($){return y1($)}function lK($,C){if($==null)return null;if($===C)return{changed:!1,firstByte:-1,lastPreviousByte:-1,lastCurrentByte:-1,previousBytes:$.length,currentBytes:C.length};let _=0;while(_<$.length&&_<C.length&&$[_]===C[_])_+=1;let K=$.length-1,G=C.length-1;while(K>=_&&G>=_&&$[K]===C[G])K-=1,G-=1;return{changed:!0,firstByte:_,lastPreviousByte:K,lastCurrentByte:G,changedPreviousBytes:K-_+1,changedCurrentBytes:G-_+1,previousBytes:$.length,currentBytes:C.length}}function pK($){try{let C=JSON.parse($);return C!=null&&typeof C==="object"&&!Array.isArray(C)?C:null}catch(C){return E(`dump body parse failed: ${C instanceof Error?C.message:String(C)}`),null}}function R$($){return GC(JSON.stringify($))}function gK($){let C=pK($);if(!C)return{parseable:!1};let _=Array.isArray(C.messages)?C.messages:[],K=Array.isArray(C.system)?C.system:[],G=_[0],j=_.slice(1);return{parseable:!0,model:typeof C.model==="string"?C.model:void 0,stream:C.stream,systemCount:K.length,messagesCount:_.length,systemHash:R$(K),message0Hash:G===void 0?null:R$(G),message0Bytes:G===void 0?0:JSON.stringify(G).length,messagesAfter0Hash:R$(j),messagesAfter0Bytes:JSON.stringify(j).length,cch:vK($)}}function i0($){if(Array.isArray($))return $.map(i0);if($==null||typeof $!=="object")return $;let C={};for(let[_,K]of Object.entries($)){let G=_.toLowerCase();if(G==="authorization"||G==="x-api-key"||G==="cookie"||G==="set-cookie"||CC(_)){C[_]="[redacted]";continue}C[_]=i0(K)}return C}async function jC($){if(!M0)return;t1+=1;let C=$.affinity?.trim()||"session-unknown",_=`${new Date().toISOString().replace(/[:.]/g,"-")}-${String(t1).padStart(6,"0")}-${KC(C)}-${xK($)}`,K=c0(),G=P$(K,_),j={body:`${G}.body.json`,metadata:`${G}.meta.json`};if($.payload!==void 0)j.relay=`${G}.relay.json`;if($.request!==void 0)j.request=`${G}.request.json`;try{await ZK(K,{recursive:!0});let J={id:_,createdAt:new Date().toISOString(),session:$C(C),transport:$.transport,protocol:$.protocol,mode:$.mode,route:$.route,status:$.status,error:$.error,bodyBytes:$.bodyText.length,relayBytes:$.relayBytes,bodyHash:GC($.bodyText),diff:lK($.previousBodyText,$.bodyText),body:gK($.bodyText),files:j},Z=[g0(j.body,$.bodyText),g0(j.metadata,`${JSON.stringify(J,null,2)}
26
- `)];if($.payload!==void 0&&j.relay)Z.push(g0(j.relay,`${JSON.stringify(i0($.payload),null,2)}
27
- `));if($.request!==void 0&&j.request)Z.push(g0(j.request,`${JSON.stringify(i0({...$.request,headers:mK($.request.headers)}),null,2)}
28
- `));await Promise.all(Z),TK(K,Object.values(j)),E(`dumped request id=${_} session=${$C(C)} body=${j.body} meta=${j.metadata}`)}catch(J){E(`dump failed: ${J instanceof Error?J.message:String(J)}`)}}async function g4($){if(!M0)return;let C=kK($),_=z0.get(C);await jC({affinity:$.affinity,transport:"direct",route:$.route,status:$.status,error:$.error,bodyText:$.bodyText,previousBodyText:_,request:{url:$.url,method:$.method,headers:$.headers}}),yK(C,$.bodyText)}async function JC($){await jC({affinity:$.affinity,transport:$.transport,protocol:$.protocol,mode:$.mode,status:$.status,bodyText:$.bodyText,previousBodyText:$.previousBodyText,payload:$.payload,relayBytes:$.relayBytes})}var u4="claude-fast";var s0=!1;function i4(){return s0}function c4($){s0=$}function dK($){let C=$.trim().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&C[0]==="on")return{type:"enable"};if(C.length===1&&C[0]==="off")return{type:"disable"};return{type:"usage"}}function r0($){return["## Claude Fast Mode Status","",`- Enabled: ${$?.enabled??s0?"enabled":"disabled"}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: adds Anthropic fast mode to supported Opus requests","- Supported models: claude-opus-4-6, claude-opus-4-7, claude-opus-4-8, and claude-opus-5",'- Request changes: adds `speed: "fast"` and the `fast-mode-2026-02-01` beta header',"- Note: fast and standard speeds do not share prompt-cache prefixes"].join(`
29
- `)}function r4($){let C=dK($.argumentsText),_=$.enabled??s0;if(C.type==="status")return r0({enabled:_});if(C.type==="enable")return["## Claude Fast Mode Enabled","",r0({enabled:!0})].join(`
30
- `);if(C.type==="disable")return["## Claude Fast Mode Disabled","",r0({enabled:!1})].join(`
31
- `);return["## Claude Fast Mode Usage","","Usage: `/claude-fast`, `/claude-fast on`, or `/claude-fast off`.","",r0({enabled:_})].join(`
32
- `)}var X0="claude-killswitch";function uK($){let C=$.trim().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&C[0]==="on")return{type:"on"};if(C.length===1&&C[0]==="off")return{type:"off"};if(C[0]==="set"){let _=[];for(let K=1;K<C.length;K++){let G=C[K]?.match(/^([^:]+):(\d+),(\d+)(?:,(\d+))?$/);if(!G)return{type:"usage"};let[,j,J,Z,z]=G,X=typeof z==="string"&&z.length>0?Number.parseInt(z,10):void 0,Y={account:j,fh:Number.parseInt(J,10),sd:Number.parseInt(Z,10)};if(X!==void 0)Y.scoped=X;_.push(Y)}if(_.length===0)return{type:"usage"};return{type:"set",entries:_}}return{type:"usage"}}function n0($,C){let _=$.enabled===!0,K=["## Killswitch","",`Status: **${_?"ON":"OFF"}**`];if(_){K.push(""),K.push("| Account | 5h threshold | 1w threshold | Scoped |"),K.push("| ------- | ------------ | ------------ | ------ |");let G=U0($.main);K.push(`| main | ≥ ${G.five_hour}% | ≥ ${G.seven_day}% | ≤ ${G.scoped}% |`);for(let j of C){let J=U0($.accounts?.[j]??$.main);K.push(`| ${j} | ≥ ${J.five_hour}% | ≥ ${J.seven_day}% | ≤ ${J.scoped}% |`)}}return K.join(`
33
- `)}var ZC=["## Killswitch Commands","","```",`/${X0} — show status`,`/${X0} on — enable with current or default thresholds`,`/${X0} off — disable`,`/${X0} set all:5,10 — set all accounts to 5h≥5%, 1w≥10%`,`/${X0} set main:3,8,0 — set 5h≥3%, 1w≥8%, scoped≤0%`,`/${X0} set main:3,8 work-alt:5,10 — per-account`,"```"].join(`
34
- `);function o4($){let C=uK($.argumentsText);if(C.type==="status")return{text:`${n0($.config,$.accountIds)}
35
-
36
- ${ZC}`};if(C.type==="on"){let K={...$.config,enabled:!0,main:$.config.main??{five_hour:s.five_hour,seven_day:s.seven_day}};return{text:`## Killswitch Enabled
37
-
38
- ${n0(K,$.accountIds)}`,updatedConfig:K}}if(C.type==="off")return{text:"## Killswitch Disabled",updatedConfig:{...$.config,enabled:!1}};if(C.type==="set"){let K={...$.config.accounts??{}},G={...$.config,enabled:!0,accounts:K};for(let J of C.entries){let Z={five_hour:J.fh,seven_day:J.sd};if(J.scoped!==void 0)Z.scoped=J.scoped;if(J.account==="main")G.main=Z;else if(J.account==="all"){G.main=Z;for(let z of $.accountIds)K[z]=Z}else K[J.account]=Z}return{text:`## Killswitch Updated
39
-
40
- ${n0(G,$.accountIds)}`,updatedConfig:G}}return{text:`${n0($.config,$.accountIds)}
41
-
42
- ${ZC}`}}var t4="claude-logging",iK=["error","warn","info","debug","trace"];function cK($){let C=$.trim().toLowerCase().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&iK.includes(C[0]))return{type:"level",level:C[0]};return{type:"usage"}}function I$($){return["## Claude Log Level","",`Current log level: \`${$?.level??"info"}\``,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Valid levels: error, warn, info, debug, trace","","Usage: `/claude-logging`, `/claude-logging error|warn|info|debug|trace`."].join(`
43
- `)}function e4($){let C=cK($.argumentsText),_=$.level??"info";if(C.type==="status")return I$({level:_});if(C.type==="level")return["## Claude Log Level Updated","",`Level set to \`${C.level}\`.`,"",...I$({level:C.level}).split(`
44
- `).slice(2)].join(`
45
- `);return["## Claude Log Level Usage","","Usage: `/claude-logging`, `/claude-logging error|warn|info|debug|trace`.","",...I$({level:_}).split(`
46
- `).slice(2)].join(`
47
- `)}var Cj="claude-fable-5";var rK=["claude-fable-5","claude-mythos-5"],YC={type:"adaptive",display:"summarized"},_j={input:10,output:50,cacheRead:1,cacheWrite5m:12.5,cacheWrite1h:20},Kj=1e6,Gj=128000,jj="2026-06-09",Jj={["claude-fable-5"]:{id:"claude-fable-5",name:"Claude Fable 5"},["claude-mythos-5"]:{id:"claude-mythos-5",name:"Claude Mythos 5",limited:!0}};function OC($){return typeof $==="string"&&rK.some((C)=>$===C||$.startsWith(`${C}-`))}var zC="claude-sonnet-5",Zj=YC;function zj($){return typeof $==="string"&&($===zC||$.startsWith(`${zC}-`))}var XC="claude-opus-5",Xj=YC;function Yj($){return typeof $==="string"&&($===XC||$.startsWith(`${XC}-`))}function Oj($){if(typeof $!=="string")return!1;if($.startsWith("gAAAA"))return!0;if(!$.startsWith("{"))return!1;try{let C=JSON.parse($);return C.type==="reasoning"&&typeof C.id==="string"&&C.id.startsWith("rs_")&&typeof C.encrypted_content==="string"&&C.encrypted_content.startsWith("gAAAA")}catch{return!1}}var Hj="claude-quota",NC={five_hour:"5h",seven_day:"1w"};function o0($){return`${Math.round($*10)/10}%`}function a0($,C){let _=Math.max(0,C-$),K=Math.floor(_/60000);if(K<1)return"just now";if(K===1)return"1m ago";if(K<60)return`${K}m ago`;let G=Math.floor(K/60),j=K%60;if(j===0)return`${G}h ago`;return`${G}h ${j}m ago`}function sK($,C){let _=Date.parse($);if(!Number.isFinite(_))return $;let K=_-C;if(K<=0)return"now";let G=Math.max(1,Math.ceil(K/60000));if(G<60)return`in ${G}m`;let j=Math.floor(G/60),J=G%60;if(J===0)return`in ${j}h`;return`in ${j}h ${J}m`}function HC($,C){if(!$)return"";return`, resets ${sK($,C)}`}function LC($,C,_,K){if(!C)return` - ${NC[$]}: unknown`;let G=[` - ${NC[$]}: ${o0(C.remainingPercent)} remaining`,` (${o0(C.usedPercent)} used`,`${HC(C.resetsAt,_)}, checked ${a0(C.checkedAt,_)})`].join("");return K===$?`${G} •`:G}function WC($){try{return new Intl.NumberFormat("en-US",{style:"currency",currency:$.currency,minimumFractionDigits:$.exponent,maximumFractionDigits:$.exponent}).format($.amountMinor/10**$.exponent)}catch{return`${$.amountMinor} ${$.currency}`}}function nK($,C){return[` - ${$.title}: ${o0($.remainingPercent)} remaining`,` (${o0($.usedPercent)} used`,`${HC($.resetsAt,C)}, checked ${a0($.checkedAt,C)})`].join("")}function oK($){return $.label?.trim()||$.id}function aK($){return $.lastQuotaRefreshError?.message??$.lastRefreshError?.message}function Fj($,C=new Map){if(!$?.accounts.length)return[];return $.accounts.filter(m).map((_)=>{let K=C.get(_.id)??aK(_);return{name:oK(_),role:"fallback",enabled:_.enabled!==!1,quota:_.quota,...Z0(_.profile)&&{tierLabel:Z0(_.profile)},lastRefreshedAt:_.lastRefreshedAt,...K&&{error:K}}})}function Uj($){let C=$.now??Date.now(),_=["## Claude Quotas",""];if($.refreshedAt)_.push(`Refreshed: ${a0($.refreshedAt,C)}`,"");if(!$.accounts.length)return _.push("No Claude OAuth accounts found yet."),_.join(`
48
- `);for(let K of $.accounts){let G=K.role==="main"?"main":"fallback",j=K.enabled===!1?" disabled":"";if(_.push(`### ${K.name} (${G}${j})`),K.tierLabel)_.push(` - Tier: ${K.tierLabel}`);if(K.lastRefreshedAt)_.push(` - Last token refresh: ${a0(K.lastRefreshedAt,C)}`);if(K.error)_.push(` - Error: ${K.error}`);_.push(LC("five_hour",K.quota?.five_hour,C,K.quota?.bindingWindow)),_.push(LC("seven_day",K.quota?.seven_day,C,K.quota?.bindingWindow));for(let Z of K.quota?.scoped??[]){let z=nK(Z,C);_.push(K.quota?.bindingWindow===Z.id?`${z} •`:z)}let J=K.quota?.extraUsage;if(J){let Z=WC(J.used),z=WC(J.limit);_.push(` - credits ${Z}/${z}${J.exhausted?" · exhausted":""}`)}if(K.quota?.fallbackAdvised===!0)_.push(" - → fallback advised");_.push("")}return _.join(`
49
- `).trimEnd()}import{Buffer as QC}from"node:buffer";import{createHash as tK,randomBytes as eK}from"node:crypto";class T$ extends Error{}class w$ extends Error{code="ECONNRESET";syscall="websocket";closeCode;closeReason;wasClean;constructor($,C){super($);this.name="RelayWebSocketConnectionResetError",this.closeCode=C?.code,this.closeReason=C?.reason,this.wasClean=C?.wasClean}}var p=new Map,e=new Map,FC=new Set,$G=7200000,CG=1800000,_G=128,KG=32,UC=0;function h$(){return UC+=1,`req_${Date.now().toString(36)}_${UC.toString(36)}`}function t0($){if(FC.has($))return;FC.add($),E($)}function Qj($){let C=$?.relay;if(!C)return t0("disabled: no relay config found"),null;if(C.enabled!==!0)return t0("disabled: relay.enabled is not true"),null;if(!C.url?.trim()||!C.token?.trim())return t0("disabled: missing relay url or token"),null;let _=C.transport==="http"?"http":"websocket";return t0(`configured transport=${_} protocol=${_==="websocket"?2:1} url=${C.url.trim()} fallbackToDirect=${C.fallbackToDirect!==!1}`),{enabled:!0,url:C.url.trim(),token:C.token.trim(),fallbackToDirect:C.fallbackToDirect!==!1,transport:_}}function Bj(){return eK(32).toString("base64url")}function GG($){return`sha256:${tK("sha256").update($).digest("hex")}`}function VC($,C){let _=0,K=Math.min($.length,C.length);while(_<K&&$.charCodeAt(_)===C.charCodeAt(_))_++;let G=$.length,j=C.length;while(G>_&&j>_&&$.charCodeAt(G-1)===C.charCodeAt(j-1))G--,j--;return{start:_,deleteCount:G-_,insert:C.slice(_,j)}}function jG($){return $.deleteCount===0&&$.insert.length===0}function bC($){let C=$.match(/\bcch=([0-9a-f]{5});/),_=C?.[1];if(!_||C.index==null)return null;let K=C.index+4;return{start:K,end:K+_.length,token:_}}function JG($,C,_,K){return`${$.slice(0,C)}${K}${$.slice(_)}`}function BC($,C){let _=bC($),K=bC(C);if(_&&K&&_.start===K.start&&_.end-_.start===K.end-K.start&&_.token!==K.token){let G={start:_.start,deleteCount:_.end-_.start,insert:K.token},j=JG($,_.start,_.end,K.token),J=VC(j,C);return jG(J)?G:[G,J]}return VC($,C)}function ZG($,C){if(typeof C!=="string")return!1;try{let _=$ instanceof Request?new URL($.url):new URL($.toString());return _.pathname==="/v1/messages"||_.pathname==="/messages"}catch{return!1}}function zG($){let C={};for(let[_,K]of $.entries()){if(_==="x-session-affinity"||_==="x-opencode-session")continue;C[_]=K}return C}async function MC($,C,_){let K=Q(),G=JSON.stringify(C);return Y0("http_payload_stringify",{session:B(C.affinity),ms:w(Q()-K),relayBytes:G.length,mode:C.mode}),fetch($.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":$.token},body:G,signal:_??void 0})}function B($){return $.length>12?`${$.slice(0,12)}…`:$}function Q(){return performance.now()}function w($){return Math.round($*10)/10}function XG(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function Y0($,C){if(!XG())return;E(`[perf] relay ${$} ${JSON.stringify(C)}`)}function YG($){let{input:C,init:_,headers:K,bodyText:G,affinity:j,previous:J,nextHash:Z}=$,z=C instanceof Request?C.url:C.toString(),X={protocol:1,type:"request",affinity:j,upstream:{url:z,method:_?.method||(C instanceof Request?C.method:"POST"),headers:zG(K)},next_hash:Z};return J?{...X,mode:"patch",base_hash:J.hash,revision:J.revision+1,patch:BC(J.body,G)}:{...X,mode:"full_sync",revision:1,body:G}}function x$($,C){return{protocol:$.protocol,type:"request",affinity:$.affinity,upstream:$.upstream,next_hash:$.next_hash,mode:"full_sync",revision:1,body:C}}function DC($,C,_,K){let G=Date.now();p.delete($),p.set($,{body:C,hash:_,revision:K,updatedAt:G}),k$(G)}async function EC($){let{config:C,payload:_,bodyText:K,fallback:G,signal:j}=$,J=_,Z=await MC(C,J,j);if(Z.status===409&&J.mode==="patch")E(`state mismatch from relay session=${B(J.affinity)}; retrying full_sync`),await Z.body?.cancel().catch(()=>{}),J=x$(J,K),Z=await MC(C,J,j);if(!Z.ok&&Z.status>=500&&C.fallbackToDirect)return E(`relay returned ${Z.status}; falling back direct session=${B(J.affinity)}`),await Z.body?.cancel().catch(()=>{}),{response:await G(),payload:J,transport:"http",protocol:J.protocol,usedRelay:!1};return{response:Z,payload:J,transport:"http",protocol:J.protocol,usedRelay:!0}}function OG($,C){let _=new URL($);return _.protocol=_.protocol==="http:"?"ws:":"wss:",_.pathname="/ws",_.searchParams.set("token",C),_.toString()}function NG($){return new Uint8Array(QC.from($,"base64"))}function LG($){if($ instanceof Uint8Array)return $;if($ instanceof ArrayBuffer)return new Uint8Array($);if(ArrayBuffer.isView($))return new Uint8Array($.buffer,$.byteOffset,$.byteLength);return new Uint8Array(QC.from(String($)))}function WG($){return JSON.parse($)}function fC($){let C=$,_=[`code=${C.code??"unknown"}`,`wasClean=${C.wasClean??"unknown"}`];if(C.reason)_.push(`reason=${JSON.stringify(C.reason)}`);return _.join(" ")}function HG($){let C=$.message||"relay websocket error";return $.status?`relay websocket error ${$.status}: ${C}`:C}class SC{config;affinity;timers;socket;connecting;queue=Promise.resolve();pending;serverState;lastUsedAt=Date.now();constructor($,C,_){this.config=$,this.affinity=C,this.timers=_}touch($=Date.now()){this.lastUsedAt=$}canEvict($=Date.now()){return!this.pending&&!this.connecting&&$-this.lastUsedAt>CG}dispose(){this.socket?.close(),this.socket=void 0,this.serverState=void 0,this.connecting=void 0}send($,C,_=!1,K){this.touch();let G=Q(),j=this.queue.catch(()=>{}).then(()=>this.startQueued($,C,G,_,K)),J=j.then(async({response:Z,getPayload:z})=>({response:await Z,payload:z(),transport:"websocket",protocol:2,usedRelay:!0}));return this.queue=j.then(({done:Z})=>Z.catch(()=>{}),()=>{}),J}async startQueued($,C,_,K,G){let j=Q();await this.ensureConnected();let J=Q(),Z=p.get(this.affinity),z=this.serverState?.hash,X={...$,protocol:2,id:h$()};if(X.mode==="patch"&&(!z||z!==X.base_hash))X.mode="full_sync",X.revision=(this.serverState?.revision??0)+1,delete X.base_hash,delete X.patch,X.body=C;if(X.mode==="patch"&&Z)X.patch=BC(Z.body,C);E(`perf websocket send_start session=${B(this.affinity)} request=${X.id} mode=${X.mode} queueMs=${w(J-_)} connectMs=${w(J-j)} bodyBytes=${C.length} relayBytes=${JSON.stringify(X).length}`);let Y=X,N=this.sendPayload(X,C,K,G);N.done.catch(()=>{});let O=N.done,L=N.response.catch((V)=>{if(!(V instanceof T$)||X.mode!=="patch")throw V;let f=x$(X,C);f.protocol=2,f.id=h$(),f.revision=(this.serverState?.revision??0)+1,Y=f;let A=this.sendPayload(f,C,K,G);return A.done.catch(()=>{}),O=A.done,A.response}),F=L.then(()=>O,()=>O.catch(()=>{}));return{response:L,done:F,getPayload:()=>Y}}async ensureConnected(){if(this.socket?.readyState===WebSocket.OPEN&&this.serverState!==void 0)return;if(this.connecting)return await this.connecting;this.connecting=new Promise(($,C)=>{let _=OG(this.config.url,this.config.token),K=new URL(_);K.searchParams.set("affinity",this.affinity);let G=new WebSocket(K.toString());this.socket=G,this.serverState=void 0;let j=this.timers.setTimeout(()=>{G.close(),C(Error("relay websocket ready timed out"))},15000);G.addEventListener("message",(J)=>{try{if(typeof J.data!=="string"){this.handleBinaryChunk(J.data);return}let Z=WG(J.data);if(Z.type==="ready"){this.timers.clearTimeout(j),this.serverState=Z.state,$();return}this.handleMessage(Z)}catch(Z){this.timers.clearTimeout(j),C(Z),this.failPending(Z),G.close()}}),G.addEventListener("error",()=>{this.timers.clearTimeout(j);let J=new w$("relay websocket error");C(J),this.failPending(J)}),G.addEventListener("close",(J)=>{if(this.timers.clearTimeout(j),this.socket===G)this.socket=void 0,this.serverState=void 0,this.connecting=void 0;if(this.pending){if(this.pending.retryingBeforeResponse)return;let Z=this.pending.responseStartedAt!=null,z=Z?"closed after response_start before stream bytes":"closed before response";if(this.retryPendingBeforeResponse(this.pending,z,J))return;let X=Z?new w$("relay websocket closed during response stream",J):Error("relay websocket closed before response");E(`websocket ${Z?"closed during response stream":"closed before response without retry"} session=${B(this.affinity)} request=${this.pending.payload.id} chunks=${this.pending.streamChunkCount} bytes=${this.pending.streamByteCount} ${fC(J)}`),this.failPending(X)}})}).finally(()=>{this.connecting=void 0}),await this.connecting}sendPayload($,C,_,K){let G=this.socket;if(!G||G.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");let j=Q(),J,Z,z=new Promise((Y,N)=>{J=Y,Z=N});return{response:new Promise((Y,N)=>{let O={payload:$,bodyText:C,resolve:Y,reject:N,streamDone:!1,accepted:!1,responseStarted:!1,resolveDone:J,rejectDone:Z,sentAt:j,optimisticResponse:_,streamChunkCount:0,streamByteCount:0,retryAttempts:0,retryingBeforeResponse:!1,onResponseHeaders:K,stagedResponseHeaders:void 0,responseHeadersDelivered:!1};if(this.pending=O,this.resetPendingTimeout(O),G.send(JSON.stringify($)),_)this.resolvePendingResponse(O,200,"OK",{"content-type":"text/event-stream","x-cortexkit-relay-optimistic":"true"})}),done:z}}resetPendingTimeout($){this.timers.clearTimeout($.timeout),$.timeout=this.timers.setTimeout(()=>{if(this.pending!==$)return;if(this.retryPendingBeforeResponse($,"response timed out"))return;this.failPending(Error("relay websocket response timed out")),this.socket?.close()},45000)}retryPendingBeforeResponse($,C,_){if($.responseStartedAt!=null&&$.streamByteCount>0)return!1;if($.streamDone)return!1;if($.retryAttempts>=1)return!1;$.retryAttempts+=1,$.retryingBeforeResponse=!0,this.timers.clearTimeout($.timeout);let K=$.retryAttempts,G=$.payload.id;return E(`websocket ${C}; reconnecting and retrying full_sync session=${B(this.affinity)} request=${G} retry=${K} chunks=${$.streamChunkCount} bytes=${$.streamByteCount}${_?` ${fC(_)}`:""}`),this.socket?.close(),this.socket=void 0,this.serverState=void 0,this.connecting=void 0,(async()=>{try{if(await this.ensureConnected(),this.pending!==$)return;let j=x$($.payload,$.bodyText);j.protocol=2,j.id=h$(),j.revision=(this.serverState?.revision??0)+1,$.payload=j,$.accepted=!1,$.acceptedAt=void 0,$.responseStartedAt=void 0,$.stagedResponseHeaders=void 0,$.responseHeadersDelivered=!1,$.sentAt=Q(),$.retryingBeforeResponse=!1;let J=this.socket;if(!J||J.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");this.resetPendingTimeout($),E(`perf websocket retry_send session=${B(this.affinity)} request=${j.id} previous=${G} mode=full_sync retry=${K} bodyBytes=${$.bodyText.length} relayBytes=${JSON.stringify(j).length}`),J.send(JSON.stringify(j))}catch(j){if($.retryingBeforeResponse=!1,this.pending===$)this.failPending(j)}})(),!0}enqueueStreamChunk($,C){this.deliverResponseHeaders($),$.streamChunkCount+=1,$.streamByteCount+=C.byteLength,$.streamController?.enqueue(C)}deliverResponseHeaders($){if($.responseHeadersDelivered||$.stagedResponseHeaders==null)return;$.responseHeadersDelivered=!0;try{$.onResponseHeaders?.($.stagedResponseHeaders)}catch{}}handleBinaryChunk($){let C=this.pending;if(!C?.responseStarted)return;this.enqueueStreamChunk(C,LG($))}resolvePendingResponse($,C,_,K){if($.responseStarted)return;$.responseStarted=!0;let G=new ReadableStream({start:(j)=>{$.streamController=j},cancel:()=>{this.socket?.close()}});$.resolve(new Response(G,{status:C,statusText:_,headers:K}))}handleMessage($){if($.type==="keepalive"){if(this.pending)this.resetPendingTimeout(this.pending);return}let C=this.pending;if(!C)return;if("id"in $&&$.id&&$.id!==C.payload.id)return;if($.type==="accepted"){let _=Q();C.accepted=!0,C.acceptedAt=_,E(`perf websocket accepted session=${B(this.affinity)} request=${C.payload.id} sentMs=${w(_-C.sentAt)} mode=${C.payload.mode}`),this.serverState={hash:$.hash,revision:$.revision},DC(this.affinity,C.bodyText,$.hash,$.revision),this.resetPendingTimeout(C);return}if($.type==="response_start"){if(C.responseStartedAt!=null)return;let _=Q();if(C.responseStartedAt=_,E(`perf websocket response_start session=${B(this.affinity)} request=${C.payload.id} sentMs=${w(_-C.sentAt)} upstreamMs=${C.acceptedAt==null?"unknown":w(_-C.acceptedAt)} status=${$.status}`),clearTimeout(C.timeout),$.headers)C.stagedResponseHeaders=new Headers($.headers);if(this.resolvePendingResponse(C,$.status,$.statusText,$.headers),C.optimisticResponse&&$.status>=400)this.deliverResponseHeaders(C),C.streamController?.enqueue(new TextEncoder().encode(`event: error
50
- data: ${JSON.stringify({type:"error",error:{type:"relay_upstream_error",message:`Relay upstream returned HTTP ${$.status}`}})}
51
-
52
- `)),this.finishPending();return}if($.type==="chunk"){this.enqueueStreamChunk(C,NG($.base64));return}if($.type==="done"){this.finishPending($);return}if($.type==="error"){if(C.optimisticResponse&&C.responseStartedAt!=null){E(`websocket relay error during optimistic response session=${B(this.affinity)} request=${C.payload.id} status=${$.status} message=${$.message||"unknown"} chunks=${C.streamChunkCount} bytes=${C.streamByteCount}`),this.deliverResponseHeaders(C),C.streamController?.enqueue(new TextEncoder().encode(`event: error
53
- data: ${JSON.stringify({type:"error",error:{type:"relay_error",message:$.message||"relay error"}})}
54
-
55
- `)),this.finishPending(),this.socket?.close();return}if($.status===409&&this.retryPendingBeforeResponse(C,$.message||"state mismatch"))return;let _=$.status===409?new T$($.message||"state mismatch"):Error(HG($));this.failPending(_)}}finishPending($){let C=this.pending;if(!C)return;let _=Q(),K=$&&"frames"in $?` upstreamChunks=${$.upstreamChunks??"unknown"} upstreamBytes=${$.upstreamBytes??"unknown"} frames=${$.frames} frameBytes=${$.frameBytes??"unknown"}`:"";if(E(`perf websocket done session=${B(this.affinity)} request=${C.payload.id} sentMs=${w(_-C.sentAt)} streamMs=${C.responseStartedAt==null?"unknown":w(_-C.responseStartedAt)} chunks=${C.streamChunkCount} bytes=${C.streamByteCount}${K}`),this.timers.clearTimeout(C.timeout),!C.streamDone)this.deliverResponseHeaders(C),C.streamDone=!0,C.streamController?.close();C.resolveDone(),this.pending=void 0}failPending($){let C=this.pending;if(!C)return;if(this.timers.clearTimeout(C.timeout),this.pending=void 0,C.responseStarted)C.streamController?.error($);else C.reject($);C.rejectDone($)}}function k$($=Date.now()){for(let[C,_]of p)if($-_.updatedAt>$G)p.delete(C);while(p.size>_G){let C=p.keys().next().value;if(C===void 0)break;p.delete(C)}for(let[C,_]of e)if(_.canEvict($))_.dispose(),e.delete(C);while(e.size>KG){let C=!1;for(let[_,K]of e){if(!K.canEvict($))continue;K.dispose(),e.delete(_),C=!0;break}if(!C)break}}function FG($,C,_){k$();let K=e.get(C);if(K)return K.touch(),K;let G=new SC($,C,_);return e.set(C,G),k$(),G}async function Dj($){let{config:C,input:_,init:K,headers:G,body:j,fallback:J,affinity:Z,optimisticResponse:z,onResponseHeaders:X,setTimeoutImpl:Y=globalThis.setTimeout,clearTimeoutImpl:N=globalThis.clearTimeout}=$;if(!C||!ZG(_,j))return J();let O=Z||G.get("x-session-affinity")||G.get("x-opencode-session");if(!O)return E("skipping relay: missing x-session-affinity header"),J();let L=j,F=Q(),V=GG(L);Y0("hash_body",{session:B(O),ms:w(Q()-F),bodyBytes:L.length});let f=p.get(O),A=Q(),P=YG({input:_,init:K,headers:G,bodyText:L,affinity:O,previous:f,nextHash:V});Y0("create_payload",{session:B(O),ms:w(Q()-A),mode:P.mode,bodyBytes:L.length,previousBytes:f?.body.length});try{let H,v=Q();if(C.transport==="websocket")try{H=await FG(C,O,{setTimeout:Y,clearTimeout:N}).send(P,L,z===!0,X)}catch(x){E(`websocket relay failed session=${B(O)}; trying http relay: ${x instanceof Error?x.message:String(x)}`),H=await EC({config:C,payload:P,bodyText:L,fallback:J,signal:K?.signal})}else H=await EC({config:C,payload:P,bodyText:L,fallback:J,signal:K?.signal});if(Y0("send",{session:B(O),ms:w(Q()-v),transport:H.transport,protocol:H.protocol,mode:H.payload.mode,status:H.response.status,usedRelay:H.usedRelay}),!H.usedRelay)return H.response;if(H.transport==="http")try{X?.(H.response.headers)}catch{}if(H.transport==="http")DC(O,L,H.payload.next_hash,H.payload.revision);let W=Q(),b=JSON.stringify(H.payload).length;Y0("payload_stringify",{session:B(O),ms:w(Q()-W),relayBytes:b}),E(`used relay transport=${H.transport} protocol=${H.protocol} mode=${H.payload.mode} status=${H.response.status} session=${B(O)} bodyBytes=${L.length} relayBytes=${b}`);let R=Q();return await JC({affinity:O,transport:H.transport,protocol:H.protocol,mode:H.payload.mode,status:H.response.status,bodyText:L,previousBodyText:f?.body,payload:H.payload,relayBytes:b}),Y0("dump",{session:B(O),ms:w(Q()-R),enabled:!0}),H.response}catch(H){if(!C.fallbackToDirect)throw E(`relay failed session=${B(O)} and fallbackToDirect=false: ${H instanceof Error?H.message:String(H)}`),H;return E(`relay failed; falling back direct session=${B(O)}: ${H instanceof Error?H.message:String(H)}`),J()}}var Sj=`
56
- async function hashBody(body) {
57
- const bytes = new TextEncoder().encode(body)
58
- const digest = await crypto.subtle.digest('SHA-256', bytes)
59
- const hex = [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, '0')).join('')
60
- return 'sha256:' + hex
61
- }
62
-
63
- function applyPatch(base, patch) {
64
- return base.slice(0, patch.start) + patch.insert + base.slice(patch.start + patch.deleteCount)
65
- }
66
-
67
- function applyPatchSet(base, patch) {
68
- if (!Array.isArray(patch)) return applyPatch(base, patch)
69
- if (patch.length === 0) return base
70
-
71
- let result = ''
72
- let cursor = 0
73
- for (const item of patch) {
74
- if (item.start < cursor) return { error: 'overlapping patch', status: 400 }
75
- result += base.slice(cursor, item.start)
76
- result += item.insert
77
- cursor = item.start + item.deleteCount
78
- }
79
- return result + base.slice(cursor)
80
- }
81
-
82
- async function readState(env, affinity) {
83
- const raw = await env.RELAY_STATE.get('session:' + affinity)
84
- return raw ? JSON.parse(raw) : null
85
- }
86
-
87
- async function writeState(env, affinity, state) {
88
- await env.RELAY_STATE.put('session:' + affinity, JSON.stringify(state), { expirationTtl: 86400 })
89
- }
90
-
91
- async function resolveBody(env, payload) {
92
- if (payload.mode === 'full_sync') return payload.body
93
- if (payload.mode === 'patch') {
94
- const state = await readState(env, payload.affinity)
95
- if (!state || state.hash !== payload.base_hash) {
96
- return { error: 'state mismatch', status: 409 }
97
- }
98
- return applyPatchSet(state.body, payload.patch)
99
- }
100
- return { error: 'unknown mode', status: 400 }
101
- }
102
-
103
- async function prepareUpstream(env, payload) {
104
- if ((payload.protocol !== 1 && payload.protocol !== 2) || payload.type !== 'request' || !payload.affinity || !payload.upstream?.url || !payload.next_hash) {
105
- return { error: 'invalid payload', status: 400 }
106
- }
107
-
108
- const body = await resolveBody(env, payload)
109
- if (body && typeof body === 'object' && 'error' in body) return body
110
-
111
- if (typeof body !== 'string' || (await hashBody(body)) !== payload.next_hash) {
112
- return { error: 'hash mismatch', status: 409 }
113
- }
114
-
115
- const stateWrite = writeState(env, payload.affinity, { body, hash: payload.next_hash, revision: payload.revision }).catch(() => {})
116
- console.log(JSON.stringify({
117
- relay: 'opencode-anthropic-auth',
118
- transport: 'relay',
119
- mode: payload.mode,
120
- revision: payload.revision,
121
- affinity: String(payload.affinity).slice(0, 12),
122
- bodyBytes: body.length,
123
- }))
124
-
125
- return { body, stateWrite }
126
- }
127
-
128
- function resolveBodyFromState(state, payload) {
129
- if (payload.mode === 'full_sync') return payload.body
130
- if (payload.mode === 'patch') {
131
- if (!state || state.hash !== payload.base_hash) {
132
- return { error: 'state mismatch', status: 409 }
133
- }
134
- return applyPatchSet(state.body, payload.patch)
135
- }
136
- return { error: 'unknown mode', status: 400 }
137
- }
138
-
139
- function deferWorkerTask(task) {
140
- return new Promise((resolve) => setTimeout(resolve, 0)).then(task)
141
- }
142
-
143
- const WEBSOCKET_STREAM_FLUSH_BYTES = 1024
144
- const WEBSOCKET_STREAM_FLUSH_MS = 20
145
-
146
- function createWebSocketStreamCoalescer(socket, options = {}) {
147
- const flushBytes = options.flushBytes || WEBSOCKET_STREAM_FLUSH_BYTES
148
- const flushMs = options.flushMs ?? WEBSOCKET_STREAM_FLUSH_MS
149
- let chunks = []
150
- let byteLength = 0
151
- let flushTimer = null
152
- const stats = {
153
- upstreamChunks: 0,
154
- upstreamBytes: 0,
155
- frames: 0,
156
- frameBytes: 0,
157
- }
158
-
159
- const clearFlushTimer = () => {
160
- if (flushTimer === null) return
161
- clearTimeout(flushTimer)
162
- flushTimer = null
163
- }
164
-
165
- const mergeChunks = () => {
166
- if (chunks.length === 1) return chunks[0]
167
- const frame = new Uint8Array(byteLength)
168
- let offset = 0
169
- for (const chunk of chunks) {
170
- frame.set(chunk, offset)
171
- offset += chunk.byteLength
172
- }
173
- return frame
174
- }
175
-
176
- const flush = () => {
177
- clearFlushTimer()
178
- if (byteLength === 0) return
179
- const frame = mergeChunks()
180
- chunks = []
181
- byteLength = 0
182
- socket.send(frame)
183
- stats.frames += 1
184
- stats.frameBytes += frame.byteLength
185
- }
186
-
187
- const scheduleFlush = () => {
188
- if (flushTimer !== null) return
189
- flushTimer = setTimeout(flush, flushMs)
190
- }
191
-
192
- return {
193
- push(value) {
194
- const chunk = value instanceof Uint8Array ? value : new Uint8Array(value)
195
- if (chunk.byteLength === 0) return
196
- stats.upstreamChunks += 1
197
- stats.upstreamBytes += chunk.byteLength
198
- chunks.push(chunk)
199
- byteLength += chunk.byteLength
200
- if (byteLength >= flushBytes) flush()
201
- else scheduleFlush()
202
- },
203
- flush,
204
- stats() {
205
- return { ...stats, pendingBytes: byteLength }
206
- },
207
- }
208
- }
209
-
210
- function checkpointWebSocketState(env, payload, body, nextState) {
211
- return deferWorkerTask(async () => {
212
- try {
213
- if ((await hashBody(body)) !== payload.next_hash) {
214
- throw new Error('hash mismatch')
215
- }
216
- await writeState(env, payload.affinity, nextState)
217
- } catch (error) {
218
- console.log(JSON.stringify({
219
- relay: 'opencode-anthropic-auth',
220
- transport: 'websocket',
221
- event: 'checkpoint_write_failed',
222
- affinity: String(payload.affinity).slice(0, 12),
223
- message: error instanceof Error ? error.message : String(error),
224
- }))
225
- }
226
- })
227
- }
228
-
229
- async function prepareWebSocketUpstream(env, state, payload) {
230
- if (payload.protocol !== 2 || payload.type !== 'request' || !payload.id || !payload.affinity || !payload.upstream?.url || !payload.next_hash) {
231
- return { error: 'invalid payload', status: 400 }
232
- }
233
-
234
- const body = resolveBodyFromState(state, payload)
235
- if (body && typeof body === 'object' && 'error' in body) return body
236
- if (typeof body !== 'string') return { error: 'invalid body', status: 400 }
237
- if ((await hashBody(body)) !== payload.next_hash) {
238
- return { error: 'hash mismatch', status: 409 }
239
- }
240
-
241
- const nextState = { body, hash: payload.next_hash, revision: payload.revision }
242
- const checkpoint = checkpointWebSocketState(env, payload, body, nextState)
243
- const logAccepted = () => console.log(JSON.stringify({
244
- relay: 'opencode-anthropic-auth',
245
- transport: 'websocket',
246
- mode: payload.mode,
247
- revision: payload.revision,
248
- affinity: String(payload.affinity).slice(0, 12),
249
- bodyBytes: body.length,
250
- }))
251
-
252
- return { body, state: nextState, checkpoint, logAccepted }
253
- }
254
-
255
- function headersToObject(headers) {
256
- const result = {}
257
- for (const [key, value] of headers.entries()) result[key] = value
258
- return result
259
- }
260
-
261
- async function handleRelayPayload(env, payload) {
262
- const prepared = await prepareUpstream(env, payload)
263
- if (prepared.error) return prepared
264
- const upstream = await fetch(payload.upstream.url, {
265
- method: payload.upstream.method || 'POST',
266
- headers: payload.upstream.headers,
267
- body: prepared.body,
268
- })
269
- return { upstream, stateWrite: prepared.stateWrite }
270
- }
271
-
272
- async function handleWebSocket(socket, env, ctx, payload, getState, setState) {
273
- const heartbeat = setInterval(() => {
274
- try {
275
- socket.send(JSON.stringify({ protocol: 2, type: 'keepalive' }))
276
- } catch {
277
- clearInterval(heartbeat)
278
- }
279
- }, 15000)
280
- let streamCoalescer = null
281
- try {
282
- const result = await prepareWebSocketUpstream(env, getState(), payload)
283
- if (result.error) {
284
- socket.send(JSON.stringify({ protocol: 2, type: 'error', id: payload.id, status: result.status, message: result.error }))
285
- return
286
- }
287
-
288
- setState(result.state)
289
- socket.send(JSON.stringify({ protocol: 2, type: 'accepted', id: payload.id, hash: result.state.hash, revision: result.state.revision }))
290
- ctx?.waitUntil?.(deferWorkerTask(result.logAccepted))
291
-
292
- const upstreamPromise = fetch(payload.upstream.url, {
293
- method: payload.upstream.method || 'POST',
294
- headers: payload.upstream.headers,
295
- body: result.body,
296
- })
297
- ctx?.waitUntil?.(result.checkpoint)
298
- const upstream = await upstreamPromise
299
- socket.send(JSON.stringify({
300
- protocol: 2,
301
- type: 'response_start',
302
- id: payload.id,
303
- status: upstream.status,
304
- statusText: upstream.statusText,
305
- headers: headersToObject(upstream.headers),
306
- }))
307
-
308
- const reader = upstream.body?.getReader()
309
- if (reader) {
310
- streamCoalescer = createWebSocketStreamCoalescer(socket)
311
- while (true) {
312
- const { done, value } = await reader.read()
313
- if (done) break
314
- streamCoalescer.push(value)
315
- }
316
- streamCoalescer.flush()
317
- }
318
- const stats = streamCoalescer?.stats?.() || {}
319
- socket.send(JSON.stringify({ protocol: 2, type: 'done', id: payload.id, ...stats }))
320
- } catch (error) {
321
- try {
322
- streamCoalescer?.flush?.()
323
- } catch {}
324
- socket.send(JSON.stringify({ protocol: 2, type: 'error', id: payload.id, status: 500, message: error instanceof Error ? error.message : String(error) }))
325
- } finally {
326
- clearInterval(heartbeat)
327
- }
328
- }
329
-
330
- export default {
331
- async fetch(request, env, ctx) {
332
- if (request.headers.get('Upgrade') === 'websocket') {
333
- const url = new URL(request.url)
334
- const token = url.searchParams.get('token')
335
- const affinity = url.searchParams.get('affinity')
336
- if (token !== env.RELAY_TOKEN) return new Response('unauthorized', { status: 401 })
337
- if (!affinity) return new Response('missing affinity', { status: 400 })
338
- const pair = new WebSocketPair()
339
- const client = pair[0]
340
- const server = pair[1]
341
- server.binaryType = 'arraybuffer'
342
- let state = null
343
- let ready = false
344
- server.accept()
345
- const loadState = readState(env, affinity).then((loadedState) => {
346
- state = loadedState
347
- ready = true
348
- server.send(JSON.stringify({
349
- protocol: 2,
350
- type: 'ready',
351
- state: state ? { hash: state.hash, revision: state.revision } : null,
352
- }))
353
- }).catch((error) => {
354
- server.send(JSON.stringify({ protocol: 2, type: 'error', status: 500, message: error instanceof Error ? error.message : String(error) }))
355
- server.close(1011, 'state load failed')
356
- })
357
- ctx?.waitUntil?.(loadState)
358
- if (!ctx?.waitUntil) void loadState
359
- let busy = false
360
- server.addEventListener('message', (event) => {
361
- if (!ready) {
362
- server.send(JSON.stringify({ protocol: 2, type: 'error', status: 425, message: 'relay state is not ready' }))
363
- return
364
- }
365
- if (busy) {
366
- server.send(JSON.stringify({ protocol: 2, type: 'error', status: 429, message: 'request already in flight' }))
367
- return
368
- }
369
- let payload
370
- try {
371
- payload = JSON.parse(event.data)
372
- } catch {
373
- server.send(JSON.stringify({ protocol: 2, type: 'error', status: 400, message: 'invalid JSON payload' }))
374
- return
375
- }
376
- payload.affinity = affinity
377
- busy = true
378
- const run = handleWebSocket(server, env, ctx, payload, () => state, (nextState) => { state = nextState }).finally(() => { busy = false })
379
- ctx?.waitUntil?.(run)
380
- if (!ctx?.waitUntil) void run
381
- })
382
- return new Response(null, { status: 101, webSocket: client })
383
- }
384
-
385
- if (request.method === 'GET') {
386
- return Response.json({ status: 'ok', transports: ['http', 'websocket'] })
387
- }
388
- if (request.method !== 'POST') return new Response('method not allowed', { status: 405 })
389
- if (request.headers.get('x-relay-token') !== env.RELAY_TOKEN) {
390
- return new Response('unauthorized', { status: 401 })
391
- }
392
-
393
- try {
394
- const payload = await request.json()
395
- const result = await handleRelayPayload(env, payload)
396
- if (result.error) return Response.json({ error: result.error }, { status: result.status })
397
-
398
- if (result.stateWrite) ctx.waitUntil(result.stateWrite)
399
-
400
- const upstream = result.upstream
401
- return new Response(upstream.body, {
402
- status: upstream.status,
403
- statusText: upstream.statusText,
404
- headers: upstream.headers,
405
- })
406
- } catch (error) {
407
- return Response.json(
408
- { error: error instanceof Error ? error.message : 'internal relay error' },
409
- { status: 502 },
410
- )
411
- }
412
- },
413
- }
414
- `;var qj="claude-routing",y$=["main-first","fallback-first","sticky-balanced"],m$="main-first",RC="Usage: `/claude-routing`, `/claude-routing main-first`, `/claude-routing fallback-first`, `/claude-routing sticky-balanced`, or `/claude-routing reset`.";function UG($){return typeof $==="string"&&y$.includes($)?$:m$}function Pj($){return UG($?.routing?.mode)}async function Ij($,C=M()){let _=await S(C)??T();return _.routing={..._.routing??{},mode:$},await q(_,C),_}function VG($){let C=$.trim().toLowerCase().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&C[0]==="reset")return{type:"reset"};if(C.length===1&&y$.includes(C[0]))return{type:"mode",mode:C[0]};if(C.length===2&&C[0]==="mode"&&y$.includes(C[1]))return{type:"mode",mode:C[1]};return{type:"usage"}}function bG($){if($==="fallback-first")return"Try usable fallback accounts before the main account. If no fallback succeeds, try the main account.";if($==="sticky-balanced")return"Assign each session to a quota-weighted OAuth account, keep it sticky across transient failures, and migrate only for confirmed long-lived exhaustion or permanent account failure.";return"Try the main account first. Use fallback accounts only when quota policy or fallback errors require it."}function e0($){let C=$?.mode??m$;return["## Claude Routing Status","",`- Mode: \`${C}\``,`- Behavior: ${bG(C)}`,"",RC].join(`
415
- `)}function hj($){let C=VG($.argumentsText),_=$.mode??m$;if(C.type==="status")return e0({mode:_});if(C.type==="mode")return["## Claude Routing Updated","",`Mode updated to \`${C.mode}\`.`,"",...e0({mode:C.mode}).split(`
416
- `).slice(2)].join(`
417
- `);if(C.type==="reset")return["## Claude Routing Assignment Reset","","The current session will be assigned again on its next request.","",...e0({mode:_}).split(`
418
- `).slice(2)].join(`
419
- `);return["## Claude Routing Usage","",RC,"",...e0({mode:_}).split(`
420
- `).slice(2)].join(`
421
- `)}import{createHash as kC,randomUUID as MG}from"node:crypto";import{mkdir as EG,readFile as fG,rename as QG,rm as BG,stat as DG,writeFile as SG}from"node:fs/promises";import{basename as RG,dirname as yC,join as AG}from"node:path";var qG="main",PG=900000,AC=604800000,IG=3600000,hG=1e4,TG=5000,wG=10,qC=4096,xG=0.000001;function vj($){let C=$.modelId,_=C?$.routeQuotas.map((N)=>y(N,C)).find(Boolean)?.modelName:void 0;if(M1($.mainRefreshError)){let N=_?`Main Claude OAuth account requires re-login, and no fallback OAuth account is currently routable for ${_}.`:"Main Claude OAuth account requires re-login, and no fallback OAuth account is currently routable.";return new Response(JSON.stringify({type:"error",error:{type:"authentication_error",message:N}}),{status:401,headers:{"content-type":"application/json"}})}let K=Boolean(C&&$.routeQuotas.length>0&&$.routeQuotas.every((N)=>!P0(N,C))),[G,...j]=$.routeQuotas,J=B1(G,j.map((N)=>({quota:N})),$.now??Date.now(),K?C:void 0),Z=Math.floor(J/60),z=J%60,Y=`${K&&_?`${_} weekly limit reached, no routable OAuth accounts.`:"No OAuth account currently satisfies sticky-balanced quota policy."} Retry in ${Z}m ${z}s.`;return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:Y}}),{status:429,headers:{"content-type":"application/json","retry-after":String(J)}})}function v$($){return Boolean($)&&typeof $==="object"&&!Array.isArray($)}function E0($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function kG($){if(!v$($))return;if(typeof $.accountId!=="string"||!["fable","opus","general"].includes(String($.family)))return;let C=E0($.assignedAt),_=E0($.lastSeenAt),K=E0($.initialInputBytes),G=E0($.quotaCheckedAt);if(C===void 0||_===void 0||K===void 0||G===void 0)return;return{accountId:$.accountId,family:$.family,assignedAt:C,lastSeenAt:_,initialInputBytes:Math.max(0,K),quotaCheckedAt:G}}function yG($){if(!v$($)||$.version!==1||!v$($.assignments))return;let C={};for(let[_,K]of Object.entries($.assignments)){let G=kG(K);if(G)C[_]=G}return{version:1,updatedAt:E0($.updatedAt)??0,assignments:C}}function PC($){return{version:1,updatedAt:$,assignments:{}}}function IC($){return kC("sha256").update($).digest("hex")}function mC($,C,_=Date.now(),K){let G=l(C);if(!["five_hour","seven_day"].every((Z)=>{let z=$?.[Z];return Boolean(z&&_-z.checkedAt<G)}))return!1;let J=y($,K);return!J||_-J.checkedAt<G}function hC($){return Math.max($.checkedAt??0,$.five_hour?.checkedAt??0,$.seven_day?.checkedAt??0,...($.scoped??[]).map((C)=>C.checkedAt??0))}function TC($,C,_){let K=h0($),G=_==="five_hour"?K.five_hour:_==="seven_day"?K.seven_day:0;if(!U$($))return G;let j=V$($,C===qG?void 0:C);return Math.max(G,j[_])}function wC($,C,_,K){let G=Math.max(0,$-C);if(G<=0)return 0;if(!_)return G;let j=Date.parse(_);if(!Number.isFinite(j)||j<=K)return G;let J=Math.max((j-K)/3600000,0.016666666666666666);return G/J}function lj($){if(OC($))return"fable";return typeof $==="string"&&$.toLowerCase().includes("opus")?"opus":"general"}function xC($){let C=$.now??Date.now(),{candidate:_,storage:K}=$;if(!mC(_.quota,K,C,$.modelId))return 0;let G=[];for(let j of["five_hour","seven_day"]){let J=_.quota[j];if(!J||!Number.isFinite(J.remainingPercent))return 0;G.push(wC(J.remainingPercent,TC(K,_.accountId,j),J.resetsAt,C))}if($.family==="fable"){let j=y(_.quota,$.modelId);if(j&&Number.isFinite(j.remainingPercent))G.push(wC(j.remainingPercent,TC(K,_.accountId,"scoped"),j.resetsAt,C))}return Math.min(...G)}function mG($,C,_=Date.now()){let K=y($.quota,"claude-fable-5");return Boolean(K&&mC($.quota,C,_,"claude-fable-5")&&Number.isFinite(K.remainingPercent)&&K.remainingPercent<=0)}function pj($){let C=$.now??Date.now();if(!$.quota)return{action:"retain",reason:"unknown"};let _=y($.quota,$.modelId);if(_&&Number.isFinite(_.remainingPercent)&&_.remainingPercent<=0)return{action:"migrate",reason:"model-scoped"};let K=$.quota.seven_day;if(K&&Number.isFinite(K.remainingPercent)&&K.remainingPercent<=0)return{action:"migrate",reason:"seven-day"};let G=$.quota.five_hour;if(G&&Number.isFinite(G.remainingPercent)&&G.remainingPercent<=0){let j=G.resetsAt?Date.parse(G.resetsAt):NaN;if(Number.isFinite(j)&&j>C&&j-C<=PG)return{action:"hold",reason:"five-hour-short-reset",retryAfterSeconds:Math.max(1,Math.ceil((j-C)/1000))};return{action:"migrate",reason:"five-hour"}}return{action:"retain",reason:"not-exhausted"}}function gj($){let C=RG($),_=C.endsWith(".json")?C.slice(0,-5):C;return AG(yC($),`${_}-routing-state.json`)}function dj($,C){let _=kC("sha256").update($).digest().readUInt32BE(0);return Math.max(1,Math.ceil(C))+_%21}class vG{options;loaded=!1;state;stateMtimeNs;touchChain=Promise.resolve();constructor($){this.options=$,this.state=PC(this.now())}now(){return this.options.now?.()??Date.now()}async readState(){try{let $=await fG(this.options.path,"utf8"),C=yG(JSON.parse($));if(!C)throw Error(`Invalid sticky routing state at ${this.options.path}`);return C}catch($){if($.code==="ENOENT")return PC(this.now());throw $}}async readStateMtimeNs(){try{return(await DG(this.options.path,{bigint:!0})).mtimeNs}catch($){if($.code==="ENOENT")return 0n;throw $}}async refreshStateIfChanged(){for(let $=0;$<3;$++){let C=await this.readStateMtimeNs();if(this.loaded&&C===this.stateMtimeNs)return;let _=await this.readState(),K=await this.readStateMtimeNs();if(C!==K)continue;this.state=_,this.stateMtimeNs=K,this.loaded=!0;return}this.state=await this.readState(),this.stateMtimeNs=await this.readStateMtimeNs(),this.loaded=!0}async acquireLock(){await EG(yC(this.options.path),{recursive:!0,mode:448});let $=this.now()+TG;while(!0){let C=await o({name:"write",path:this.options.path,ttlMs:hG,renew:!0});if(C)return C;if(this.now()>=$)throw Error("Timed out acquiring sticky routing state lock");await new Promise((_)=>setTimeout(_,wG))}}assignmentIsActive($){return $.lastSeenAt>=this.now()-(this.options.assignmentTtlMs??AC)}prune($){let C=this.now()-(this.options.assignmentTtlMs??AC);for(let[K,G]of Object.entries($.assignments))if(G.lastSeenAt<C)delete $.assignments[K];let _=Object.entries($.assignments);if(_.length<=qC)return;_.sort((K,G)=>G[1].lastSeenAt-K[1].lastSeenAt).slice(qC).forEach(([K])=>{delete $.assignments[K]})}async writeState($){this.prune($),$.updatedAt=this.now();let C=`${this.options.path}.${MG()}.tmp`;try{await SG(C,`${JSON.stringify($)}
422
- `,{mode:384}),await QG(C,this.options.path)}finally{await BG(C,{force:!0}).catch(()=>{})}this.state=$,this.stateMtimeNs=await this.readStateMtimeNs(),this.loaded=!0}scheduleTouch($){this.touchChain=this.touchChain.catch(()=>{}).then(async()=>{let C=await this.acquireLock();try{let _=await this.readState(),K=_.assignments[$];if(!K)return;K.lastSeenAt=this.now(),await this.writeState(_)}finally{await C.release()}}).catch(()=>{})}selectCandidate($){let C=[...$.candidates];if($.family==="opus"){let G=C.filter((j)=>mG(j,$.storage,this.now()));if(G.length>0)C=G}let _=C.flatMap((G)=>{let j=xC({candidate:G,family:$.family,modelId:$.modelId,storage:$.storage,now:this.now()});return j>0?[{candidate:G,weight:j}]:[]});if(_.length===0)return;let K=new Map;for(let G of Object.values($.state.assignments)){let j=_.find((J)=>J.candidate.accountId===G.accountId)?.candidate;if(!j)continue;if(G.quotaCheckedAt!==hC(j.quota))continue;K.set(G.accountId,(K.get(G.accountId)??0)+G.initialInputBytes)}return _.map(({candidate:G,weight:j})=>({candidate:G,score:((K.get(G.accountId)??0)+$.inputBytes)/Math.max(j,xG)})).sort((G,j)=>G.score-j.score||G.candidate.order-j.candidate.order||G.candidate.accountId.localeCompare(j.candidate.accountId))[0]?.candidate}async resolve($){if(!$.sessionId)return null;await this.refreshStateIfChanged();let C=IC($.sessionId),_=this.state.assignments[C];if(_&&this.assignmentIsActive(_)&&$.retainAccountIds.has(_.accountId)&&!$.excludeAccountIds?.has(_.accountId)){if(this.now()-_.lastSeenAt>=IG)_.lastSeenAt=this.now(),this.scheduleTouch(C);return{accountId:_.accountId,assignment:{..._},created:!1,migrated:!1}}let K=await this.acquireLock();try{let G=await this.readState();this.prune(G);let j=G.assignments[C];if(j&&$.retainAccountIds.has(j.accountId)&&!$.excludeAccountIds?.has(j.accountId))return j.lastSeenAt=this.now(),await this.writeState(G),{accountId:j.accountId,assignment:{...j},created:!1,migrated:!1};let J=$.candidates.filter((N)=>!$.excludeAccountIds?.has(N.accountId)),z=($.preferredAccountId?J.find((N)=>N.accountId===$.preferredAccountId&&xC({candidate:N,family:$.family,modelId:$.modelId,storage:$.storage,now:this.now()})>0):void 0)??this.selectCandidate({...$,candidates:J,state:G});if(!z){if(j)delete G.assignments[C],await this.writeState(G);return null}let X=this.now(),Y={accountId:z.accountId,family:$.family,assignedAt:X,lastSeenAt:X,initialInputBytes:Math.max(1,$.inputBytes),quotaCheckedAt:hC(z.quota)};return G.assignments[C]=Y,await this.writeState(G),{accountId:z.accountId,assignment:{...Y},created:!j,migrated:Boolean(j&&j.accountId!==z.accountId)}}finally{await K.release()}}async clear($){if(!$)return;let C=IC($),_=await this.acquireLock();try{let K=await this.readState();if(!(C in K.assignments))return;delete K.assignments[C],await this.writeState(K)}finally{await _.release()}}}export{lG as s,u$ as t,pG as u,gG as v,dG as w,uG as x,iG as y,i$ as z,cG as A,rG as B,t$ as C,tG as D,eG as E,D as F,m as G,O2 as H,oC as I,N2 as J,M as K,T as L,S as M,q as N,w6 as O,L2 as P,o as Q,W2 as R,k6 as S,H2 as T,F2 as U,U2 as V,V2 as W,b2 as X,M2 as Y,E2 as Z,f2 as _,Q2 as $,B2 as aa,D2 as ba,S2 as ca,b1 as da,g6 as ea,M1 as fa,O0 as ga,Z$ as ha,R2 as ia,A2 as ja,q2 as ka,E1 as la,y as ma,u6 as na,P0 as oa,Q1 as pa,U$ as qa,V$ as ra,P2 as sa,B1 as ta,I2 as ua,h2 as va,T2 as wa,w2 as xa,x2 as ya,k2 as za,j0 as Aa,__ as Ba,v2 as Ca,l2 as Da,p2 as Ea,g2 as Fa,Z_ as Ga,d2 as Ha,m1 as Ia,C4 as Ja,r2 as Ka,s2 as La,n2 as Ma,w1 as Na,J4 as Oa,Z4 as Pa,m_ as Qa,v0 as Ra,l0 as Sa,i1 as Ta,v_ as Ua,z4 as Va,g_ as Wa,W4 as Xa,t_ as Ya,F4 as Za,U4 as _a,i as $a,D4 as ab,S4 as bb,R4 as cb,Z0 as db,P4 as eb,KK as fb,GK as gb,I4 as hb,v4 as ib,l4 as jb,wK as kb,p4 as lb,g4 as mb,u4 as nb,i4 as ob,c4 as pb,dK as qb,r4 as rb,X0 as sb,o4 as tb,t4 as ub,cK as vb,e4 as wb,Cj as xb,YC as yb,_j as zb,Kj as Ab,Gj as Bb,jj as Cb,Jj as Db,OC as Eb,Zj as Fb,zj as Gb,Xj as Hb,Yj as Ib,Oj as Jb,Hj as Kb,Fj as Lb,Uj as Mb,Qj as Nb,Bj as Ob,Dj as Pb,Sj as Qb,qj as Rb,Pj as Sb,Ij as Tb,VG as Ub,hj as Vb,qG as Wb,vj as Xb,mC as Yb,lj as Zb,pj as _b,gj as $b,dj as ac,vG as bc};