@cortexkit/opencode-anthropic-auth 1.15.0 → 1.16.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.
@@ -0,0 +1,422 @@
1
+ import{Hb as v$,Lb as q,Mb as u,Nb as M}from"./index-epg96jpt.js";import{fc as DC}from"./index-dbczmr1v.js";var E0="9d1c250a-e61b-44d9-88ed-5944d1962f5e",I1={console:"https://platform.claude.com/oauth/authorize",max:"https://claude.com/cai/oauth/authorize"},s0="https://platform.claude.com/oauth/code/callback",r0="https://platform.claude.com/v1/oauth/token",n0="axios/1.15.2",x1=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"],h1="user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload",Wf="mcp_";var w1="fast-mode-2026-02-01";function Lf($,C){let _=($??"").split(",").map((K)=>K.trim()).filter(Boolean);return[...new Set([..._,...C])].join(",")}function Ef($){return typeof $==="string"&&($.startsWith("claude-opus-4-6")||$.startsWith("claude-opus-4-7")||$.startsWith("claude-opus-4-8"))}var Uf="You are OpenCode",Vf="You are Claude Code, Anthropic's official CLI for Claude.",Mf=["<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 g="2.1.177",o0="3bf",T1="cli",k1="0.94.0",m1="v24.3.0",y1="claude-cli/2.1.177 (external, cli)",v1=["explicit","automatic","hybrid"],U0="explicit",Ff=["github.com/anomalyco/opencode","opencode.ai/docs"],Qf=[{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 l1($){let C="";for(let _ of $)C+=String.fromCharCode(_);return btoa(C).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function p1(){let $=new Uint8Array(64);crypto.getRandomValues($);let C=l1($),_=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(C));return{verifier:C,challenge:l1(new Uint8Array(_)),method:"S256"}}function t0($){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 a0 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=t0(_??void 0)}}function MC($){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 g1($){let C=$.fetchImpl??fetch,_=$.maxRetries??2,K=$.baseDelayMs??500;for(let f=0;f<=_;f++)try{if(f>0){let N=K*2**(f-1);await new Promise((J)=>setTimeout(J,N))}let G=await C(r0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":n0},body:JSON.stringify({grant_type:"refresh_token",refresh_token:$.refreshToken,client_id:E0,scope:h1})});if(!G.ok){if(G.status>=500&&f<_){await G.body?.cancel().catch(()=>{});continue}let N=await G.text().catch(()=>"");throw new a0(G.status,N,G.headers.get("retry-after"))}let j=await G.json(),H=$.now?.()??Date.now();return{access:j.access_token,refresh:j.refresh_token??$.refreshToken,expires:H+j.expires_in*1000,expiresIn:j.expires_in}}catch(G){if(G instanceof a0)throw G;if(f<_&&MC(G))continue;throw G}throw Error("Token refresh exhausted all retries")}function FC(){return crypto.randomUUID().replace(/-/g,"")}function QC($){let C=$.trim();try{let j=new URL(C),H=j.searchParams.get("code"),N=j.searchParams.get("state");if(H&&N)return{code:H,state:N}}catch{}let _=C.split("#");if(_.length===2&&_[0]&&_[1])return{code:_[0],state:_[1]};let K=new URLSearchParams(C),f=K.get("code"),G=K.get("state");if(f&&G)return{code:f,state:G};return null}async function bC($,C,_){let K=await fetch(r0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":n0},body:JSON.stringify({code:$.code,state:$.state,grant_type:"authorization_code",client_id:E0,redirect_uri:_,code_verifier:C})});if(!K.ok)return{type:"failed"};let f=await K.json();return{type:"success",refresh:f.refresh_token,access:f.access_token,expires:Date.now()+f.expires_in*1000}}async function Af($){let C=await p1(),_=FC(),K=new URL(I1[$],import.meta.url);return K.searchParams.set("code","true"),K.searchParams.set("client_id",E0),K.searchParams.set("response_type","code"),K.searchParams.set("redirect_uri",s0),K.searchParams.set("scope",x1.join(" ")),K.searchParams.set("code_challenge",C.challenge),K.searchParams.set("code_challenge_method","S256"),K.searchParams.set("state",_),{url:K.toString(),redirectUri:s0,state:_,verifier:C.verifier}}async function Rf($,C,_,K){let f=QC($);if(!f)return{type:"failed"};if(K&&f.state!==K)return{type:"failed"};return bC(f,C,_)}import{createHash as e1,randomUUID as H0}from"node:crypto";import{mkdir as f1,readFile as V0,rename as $$,rm as t,stat as d1,writeFile as M0}from"node:fs/promises";import{homedir as BC}from"node:os";import{dirname as G1,join as e}from"node:path";var SC=globalThis.setTimeout.bind(globalThis),AC=globalThis.clearTimeout.bind(globalThis),C$="anthropic-auth.json",RC="anthropic-auth-state.json",qC="https://api.anthropic.com/api/oauth/usage";function y($){return $.type==="oauth"}function mf($){return $.type==="api"}function PC($){let C=$?.trim();if(!C)return!1;try{let _=new URL(C);return(_.protocol==="http:"||_.protocol==="https:")&&!_.username&&!_.password}catch{return!1}}function yf($){return $.costZeroing?.enabled!==!1}var IC=[401,403,429],_$=240,xC=_$;var hC=300000,wC=3600000,K$=86400000,TC=60000,kC=900000,mC=300000,yC=5,i1={five_hour:0,seven_day:0},vC=!0,lC=60000,pC=60000,gC=600000,dC=1e4,iC=100;function uC(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return e(process.env.XDG_CONFIG_HOME||e(BC(),".config"),"opencode")}function V(){return process.env.OPENCODE_ANTHROPIC_AUTH_FILE?.trim()||e(uC(),C$)}function f$($=V()){let C=process.env.OPENCODE_ANTHROPIC_AUTH_STATE_FILE?.trim();if(C)return C;return $.endsWith(C$)?e(G1($),RC):`${$}.state.json`}function E($){return $!=null&&typeof $==="object"&&!Array.isArray($)}function u1($){return{id:typeof $.id==="string"&&$.id.trim()?$.id.trim():H0(),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 cC($){if(!E($))return null;if($.type==="api"){let C=typeof $.baseURL==="string"?$.baseURL.trim():"",_=typeof $.apiKey==="string"?$.apiKey.trim():"";if(!PC(C))return null;let K=$.authHeader==="x-api-key"?"x-api-key":"authorization-bearer";return{...u1($),type:"api",apiKey:_||void 0,baseURL:C,authHeader:K}}if($.type!=="oauth")return null;if(typeof $.refresh!=="string"||!$.refresh.trim())return null;return{...u1($),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:c1($.lastRefreshError),lastQuotaRefreshError:c1($.lastQuotaRefreshError),quota:sC($.quota)}}function c1($){if(!E($))return;if(typeof $.message!=="string")return;let C=Number($.checkedAt);if(!Number.isFinite(C))return;let _=Number($.nextRetryAt),K=Number($.retryCount),f=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(f)?f:void 0,permanent:typeof $.permanent==="boolean"?$.permanent:void 0}}function s1($){if(!E($))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 sC($){if(!E($))return;let C={};for(let _ of["five_hour","seven_day"]){let K=s1($[_]);if(K)C[_]=K}if(typeof $.checkedAt==="number"&&Number.isFinite($.checkedAt))C.checkedAt=$.checkedAt;if(Array.isArray($.scoped)){let _=$.scoped.map((K)=>{if(!E(K))return;let f=s1(K);if(!f)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 G=typeof K.modelId==="string"&&K.modelId.trim()?K.modelId.trim():void 0;return{...f,id:K.id.trim(),title:K.title.trim(),...G&&{modelId:G},modelName:K.modelName.trim()}}).filter((K)=>K!=null);C.scoped=_}return Object.keys(C).length?C:void 0}function P(){return{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]}}function rC($){if(!E($)||!Array.isArray($.accounts))return null;return{version:1,main:{type:"opencode",provider:"anthropic"},routing:E($.routing)?$.routing:void 0,fallbackOn:Array.isArray($.fallbackOn)?$.fallbackOn.filter((C)=>Number.isInteger(C)):void 0,refresh:E($.refresh)?$.refresh:void 0,quota:E($.quota)?$.quota:void 0,claudeCache:E($.claudeCache)?$.claudeCache:void 0,dump:E($.dump)?$.dump:void 0,claudeFast:E($.claudeFast)?$.claudeFast:void 0,costZeroing:E($.costZeroing)?$.costZeroing:void 0,cacheKeep:E($.cacheKeep)?$.cacheKeep:void 0,relay:E($.relay)?$.relay:void 0,logging:E($.logging)?$.logging:void 0,killswitch:E($.killswitch)?$.killswitch:void 0,accounts:$.accounts.map(cC).filter((C)=>C!=null)}}async function Q0($){try{return{exists:!0,value:JSON.parse(await V0($,"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 s($){return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0))}function F0($){return typeof $==="number"&&Number.isFinite($)?$:0}function _1($){return Math.max(F0($.lastRefreshedAt),F0($.lastUsed),F0($.addedAt))}function nC($,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 _1($)>_1(C)}function oC($,C){if(nC($,C)){let _={...C,...$},K=_1($);if(K>F0(_.lastRefreshedAt))_.lastRefreshedAt=K;return delete _.quota,delete _.lastRefreshError,delete _.lastQuotaRefreshError,_}return{...$,...C}}function aC($,C){if(!E($))return $;let _=E(C)?C:{},K=E(_.main)?_.main:void 0,f=E(_.accounts)?_.accounts:{},G=E($.quota)?$.quota:{},j=E($.refresh)?$.refresh:{},H=K??G,N=K??j,J=Array.isArray($.accounts)?$.accounts.map((Z)=>{if(!E(Z))return Z;let Y=typeof Z.id==="string"&&E(f[Z.id])?f[Z.id]:{};return oC(Z,Y)}):[];return{...$,refresh:s({...j,mainLastRefreshError:N.lastRefreshError,mainRefreshLeaseId:N.refreshLeaseId,mainRefreshLeaseUntil:N.refreshLeaseUntil,mainRefreshLeaseTokenHash:N.refreshLeaseTokenHash}),quota:s({...G,mainQuota:H.quota,mainQuotaCheckedAt:H.quotaCheckedAt,mainQuotaToken:H.quotaToken,mainLastQuotaApiError:H.lastQuotaApiError}),accounts:J}}async function D($=V()){let C=await Q0($),_=await Q0(f$($));if(!C.exists&&!_.exists)return null;let K=C.exists?C.value:P();return rC(aC(K,_.value))}async function tC($){let C=await Q0($);return E(C.value)?C.value:{}}function eC($){return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0))}function $_($){return s({id:$.id,label:$.label,type:$.type,enabled:$.enabled,addedAt:$.addedAt,baseURL:$.type==="api"?$.baseURL:void 0,authHeader:$.type==="api"?$.authHeader:void 0})}function C_($){if($.type==="api")return s({apiKey:$.apiKey,lastUsed:$.lastUsed});return s({access:$.access,refresh:$.refresh,expires:$.expires,lastUsed:$.lastUsed,lastRefreshedAt:$.lastRefreshedAt,lastRefreshError:$.lastRefreshError,lastQuotaRefreshError:$.lastQuotaRefreshError,quota:$.quota})}function N0($){return Math.max($?.five_hour?.checkedAt??0,$?.seven_day?.checkedAt??0,...$?.scoped?.map((C)=>C.checkedAt)??[],$?.checkedAt??0)}function __($,C){if(!E($))return C;let _=$,K=N0(_.quota),f=N0(C.quota),G=Boolean(_.access&&C.access&&_.access!==C.access||_.refresh&&C.refresh&&_.refresh!==C.refresh);if(K>f){let H=_.lastRefreshedAt??0,N=C.lastRefreshedAt??0;if(G&&N<=H){let Z={..._};if(typeof C.lastUsed==="number"&&(typeof _.lastUsed!=="number"||C.lastUsed>_.lastUsed))Z.lastUsed=C.lastUsed;return Z}let J={..._,...C};if(G){if("quota"in C)if(J.quota=_.quota,"lastQuotaRefreshError"in _)J.lastQuotaRefreshError=_.lastQuotaRefreshError;else delete J.lastQuotaRefreshError;else delete J.quota,delete J.lastQuotaRefreshError;if(!("lastRefreshError"in C))delete J.lastRefreshError;return J}return{...J,quota:_.quota,lastQuotaRefreshError:_.lastQuotaRefreshError}}let j={..._,...C};if(!("lastQuotaRefreshError"in C))delete j.lastQuotaRefreshError;if(!("lastRefreshError"in C))delete j.lastRefreshError;return j}function K_($){let C=$.refresh?s({enabled:$.refresh.enabled,intervalMinutes:$.refresh.intervalMinutes,refreshBeforeExpiryMinutes:$.refresh.refreshBeforeExpiryMinutes}):void 0,_=$.quota?s({enabled:$.quota.enabled,checkIntervalMinutes:$.quota.checkIntervalMinutes,refreshEveryNRequests:$.quota.refreshEveryNRequests,minimumRemaining:$.quota.minimumRemaining,failClosedOnUnknownQuota:$.quota.failClosedOnUnknownQuota,showToasts:$.quota.showToasts}):void 0;return eC({version:1,main:$.main,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($_)})}var r1=Promise.resolve();function G$($){return new Promise((C,_)=>{r1=r1.then(()=>$().then(C,_),()=>$().then(C,_))})}async function j$($,C){await f1(G1($),{recursive:!0});let _=`${$}.${H0()}.tmp`;await M0(_,`${JSON.stringify(C,null,2)}
3
+ `,{encoding:"utf8",mode:384});try{await $$(_,$)}catch(K){throw await t(_,{force:!0}).catch(()=>{}),K}}function n1($,C){return $.id===C.id||Boolean($.label&&C.label&&$.label===C.label)}function f_($,C,_){let K=new Set(_.removedAccountIds??[]),f=$.filter((J)=>!K.has(J.id)),G=C.filter((J)=>!K.has(J.id)),j=f.filter((J)=>!G.some((Z)=>n1(Z,J)));if(!j.length)return[...G];if(_.preserveExistingAccountOrder===!1)return[...G,...j];let H=new Set,N=f.map((J)=>{let Z=G.findIndex((U,W)=>!H.has(W)&&n1(U,J)),Y=G[Z];if(!Y)return J;return H.add(Z),Y});for(let J=0;J<G.length;J++){let Z=G[J];if(!H.has(J)&&Z)N.push(Z)}return N}var G_=1e4,j_=12000;async function H_($){await f1(G1($),{recursive:!0});let C=Date.now()+j_;while(!0){let _=await r({name:"config-write",ttlMs:G_,path:$,renew:!0});if(_)return _;if(Date.now()>=C)throw Error("Timed out waiting for the account configuration write lock");await new Promise((K)=>setTimeout(K,25))}}function B($,C=V(),_={}){let K=C;return G$(()=>N_($,K,_))}async function N_($,C,_){let K=await H_(C);try{let f=await D(C),G={...$,accounts:f_(f?.accounts??[],$.accounts,_)},H={...await tC(C),...K_(G)};await j$(C,H),await H$(G,C,{mainQuota:!0,mainRefresh:!0,accounts:!0})}finally{await K.release()}}function J_($,C){$.main=$.main??{};let _=typeof $.main.quotaCheckedAt==="number"?$.main.quotaCheckedAt:N0($.main.quota),K=typeof C.quota?.mainQuotaCheckedAt==="number"?C.quota.mainQuotaCheckedAt:N0(C.quota?.mainQuota);if(_>K)return;$.main.quota=C.quota?.mainQuota,$.main.quotaCheckedAt=C.quota?.mainQuotaCheckedAt,$.main.quotaToken=C.quota?.mainQuotaToken,$.main.lastQuotaApiError=C.quota?.mainLastQuotaApiError}function Z_($,C){$.main=$.main??{},$.main.lastRefreshError=C.refresh?.mainLastRefreshError,$.main.refreshLeaseId=C.refresh?.mainRefreshLeaseId,$.main.refreshLeaseUntil=C.refresh?.mainRefreshLeaseUntil,$.main.refreshLeaseTokenHash=C.refresh?.mainRefreshLeaseTokenHash}function K1($){if(Array.isArray($))return $.map(K1);if(!E($))return $;return Object.fromEntries(Object.entries($).filter(([,C])=>C!==void 0).map(([C,_])=>[C,K1(_)]))}function O_($,C=V(),_={mainQuota:!0,mainRefresh:!0,accounts:!0}){let K=C;return G$(()=>H$($,K,_))}async function H$($,C,_){let K=f$(C),f=(await Q0(K)).value,G=E(f)?{...f,version:1}:{version:1};if(_.mainQuota)J_(G,$);if(_.mainRefresh)Z_(G,$);if(_.accounts){let j=_.accounts===!0?null:new Set(_.accounts);G.accounts={...E(G.accounts)?G.accounts:{}};for(let H of $.accounts){if(j&&!j.has(H.id))continue;G.accounts[H.id]=__(G.accounts[H.id],C_(H))}if(j){for(let H of j)if(!$.accounts.some((N)=>N.id===H))delete G.accounts[H]}else{let H=new Set($.accounts.map((N)=>N.id));for(let N of Object.keys(G.accounts))if(!H.has(N))delete G.accounts[N]}}await j$(K,K1(G))}async function r($){let _=`${$.path??V()}.${$.name}.lock`,K=e(_,"owner.json"),f=H0(),G=$.now??Date.now,j=null,H=!1;async function N(){try{return JSON.parse(await V0(_,"utf8"))}catch(W){if(W.code!=="EISDIR")throw W;return JSON.parse(await V0(K,"utf8"))}}async function J(){await M0(_,`${JSON.stringify({ownerId:f,expiresAt:G()+$.ttlMs})}
4
+ `,{encoding:"utf8",mode:384})}async function Z(){try{return await M0(_,`${JSON.stringify({ownerId:f,expiresAt:G()+$.ttlMs})}
5
+ `,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(W){let z=W.code;if(z==="EEXIST"||z==="EISDIR")return!1;throw W}}function Y(){if(!$.renew||H)return;let W=$.renewIntervalMs??Math.max(1000,Math.floor($.ttlMs/3));if(j=SC(()=>{(async()=>{try{let z=await N(),L=G();if(H||z?.ownerId!==f||Number(z?.expiresAt)<=L)return;await J(),Y()}catch{}})()},W),"unref"in j)j.unref()}let U=await Z();if(!U){let W=`${_}.evicting`,z=e(W,"owner.json"),L=H0(),O=5000,x=8;async function w(){await new Promise((S)=>setTimeout(S,Math.floor(Math.random()*4)))}async function v(){try{let S=await N();return Number(S?.expiresAt)>G()}catch{try{return(await d1(_)).mtimeMs+$.ttlMs>G()}catch{return!1}}}async function m(){try{return JSON.parse(await V0(z,"utf8"))?.ownerId===L}catch{return!1}}async function X(){await f1(W);try{await M0(z,`${JSON.stringify({ownerId:L,createdAt:G()})}
6
+ `,{encoding:"utf8",mode:384,flag:"wx"})}catch(S){if(S.code==="ENOENT")return!1;throw await b(),S}return await $.onStep?.("eviction-marker-acquired"),!0}async function b(){if(await m())await t(W,{recursive:!0,force:!0}).catch(()=>{})}for(let S=0;S<8;S++){if(U=await Z(),U)break;if(await v())return null;try{if(!await X()){await w();continue}}catch(W0){if(W0.code!=="EEXIST")throw W0;let L0;try{L0=await d1(W)}catch(h){if(h.code==="ENOENT"){await w();continue}throw h}if(L0.mtimeMs+5000>G())return null;await $.onStep?.("stale-marker-stat");let p=`${W}.${H0()}`;try{await $$(W,p)}catch(h){if(h.code==="ENOENT"){await w();continue}throw h}await $.onStep?.("stale-marker-claimed"),await t(p,{recursive:!0,force:!0}).catch(()=>{}),await w();continue}try{if(await v())return null;if(!await m())return null;if(await $.onStep?.("stale-lock-confirmed"),!await m())return null;if(await t(_,{recursive:!0,force:!0}).catch(()=>{}),!await m())return null;if(U=await Z(),!U)return null;if(!await m())return await t(_,{recursive:!0,force:!0}).catch(()=>{}),U=!1,null;break}finally{await b()}}}if(!U)return null;return Y(),{release:async()=>{if(H=!0,j)AC(j),j=null;try{if((await N())?.ownerId!==f)return}catch{return}await t(_,{recursive:!0,force:!0}).catch(()=>{})}}}function vf($){return $?.claudeCache?.enabled===!0}function X_($){return typeof $==="string"&&v1.includes($)?$:U0}function Y_($){return X_($?.claudeCache?.mode)}async function lf($,C,_=V()){let K=await D(_)??P();return K.claudeCache={...K.claudeCache??{},enabled:$,mode:C??Y_(K)},await B(K,_),K}async function pf($,C=V()){let _=await D(C)??P();return _.claudeCache={..._.claudeCache??{},enabled:_.claudeCache?.enabled===!0,mode:$},await B(_,C),_}function gf($){return $?.dump?.enabled===!0}async function df($,C=V()){let _=await D(C)??P();return _.dump={..._.dump??{},enabled:$},await B(_,C),_}function uf($){return $?.claudeFast?.enabled===!0}async function cf($,C=V()){let _=await D(C)??P();return _.claudeFast={..._.claudeFast??{},enabled:$},await B(_,C),_}async function sf($,C,_=V()){let K=await D(_)??P();return K.cacheKeep={...K.cacheKeep??{},enabled:!0,always:!1,startHour:$,endHour:C},await B(K,_),K}async function rf($=V()){let C=await D($)??P();return C.cacheKeep={...C.cacheKeep??{},enabled:!0,always:!0},delete C.cacheKeep.startHour,delete C.cacheKeep.endHour,await B(C,$),C}async function nf($,C=V()){let _=await D(C)??P();return _.cacheKeep={..._.cacheKeep??{},enabled:$},await B(_,C),_}function of($){return $?.cacheKeep?.subagents===!0}async function af($,C=V()){let _=await D(C)??P();return _.cacheKeep={..._.cacheKeep??{},subagents:$},await B(_,C),_}function z_($){return $?.fallbackOn?.length?$.fallbackOn:IC}function tf($,C){return z_(C).includes($)}function B0($){let C=$?.quota?.minimumRemaining||{};return{five_hour:C.five_hour??C["5h"]??i1.five_hour,seven_day:C.seven_day??C["1w"]??i1.seven_day}}function J0($){return $?.quota?.enabled!==!1}function W_($){return $?.refresh?.enabled!==!1}function L_($){return Math.floor(Math.random()*Math.max(0,$))}function E_($){let C=$?.refresh?.refreshBeforeExpiryMinutes??xC;return Math.max(_$,C)*60000}function N$($){return e1("sha256").update($).digest("hex")}function U_($){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 V_($){let C=N$($.refreshToken),K=($.previous?.tokenHash===C?$.previous.retryCount??0:0)+1,f=$.error.retryAfter,G;if(typeof f==="number"&&f>0)G=f*1000;else if(U_($.error))G=Math.min(wC,hC*2**Math.min(K-1,6));else G=K$;let j=$.error.status,H=typeof j==="number"&&Number.isFinite(j)?j:void 0,N=C0($.error),Z=(typeof $.error.body==="string"?$.error.body:"").includes("invalid_grant")||N.includes("invalid_grant");return{message:N,checkedAt:$.now,nextRetryAt:$.now+G,retryCount:K,tokenHash:C,status:H,permanent:H===400&&Z}}function ef($){if(!$)return!1;if(typeof $.permanent==="boolean")return $.permanent;if(typeof $.status==="number")return $.status===400;if(typeof $.nextRetryAt==="number")return $.nextRetryAt-$.checkedAt>=K$;return!1}function j0($,C,_){if(!$?.nextRetryAt||$.nextRetryAt<=_)return!1;if(!C)return!0;return $.tokenHash===N$(C)}function e0($,C){return`Claude OAuth refresh is backed off for ${Math.max(1,Math.ceil((($.nextRetryAt??C)-C)/1000))}s after: ${$.message}`}function j1($){if($.status===403)return!0;return/Claude quota check failed: 403\b/.test(C0($))}function S0($){let _=($.previous?.retryCount??0)+1,K=Y$($.error)?Math.min(kC,TC*2**Math.min(_-1,6)):mC;return{message:C0($.error),checkedAt:$.now,nextRetryAt:$.now+K,retryCount:_}}function $0($,C){if(!$?.nextRetryAt||$.nextRetryAt<=C)return!1;return!0}function $G($,C){return`Quota API backed off for ${Math.max(1,Math.ceil((($.nextRetryAt??C)-C)/1000))}s after: ${$.message}`}function R($){let C=$?.quota?.checkIntervalMinutes??yC;return Math.max(1,C)*60000}function CG($){return $?.logging?.level}async function _G($,C=V()){let{setLogLevel:_}=await import("./logger-ta3qm0a2.js"),K=await D(C)??P();K.logging={...K.logging??{},level:$},await B(K,C),_($)}function J$($){if(!$?.quota?.mainQuota||!$.quota.mainQuotaCheckedAt)return null;return{quota:$.quota.mainQuota,checkedAt:$.quota.mainQuotaCheckedAt,tokenFingerprint:$.quota.mainQuotaToken}}function Z$($){let C=$?.quota?.refreshEveryNRequests;return typeof C==="number"&&Number.isFinite(C)&&C>0?Math.floor(C):0}function b0($){return $?.quota?.failClosedOnUnknownQuota??vC}function M_($){if(typeof $!=="string")return null;let C=$.toLowerCase();if(C.includes("fable"))return"fable";if(C.includes("mythos"))return"mythos";return null}function T($,C){let _=M_(C);if(!_)return;return $?.scoped?.find((K)=>{return[K.modelId,K.modelName,K.title].filter((G)=>typeof G==="string").join(" ").toLowerCase().includes(_)})}function F_($,C){let _=T($,C);return Boolean(_&&Number.isFinite(_.remainingPercent)&&_.remainingPercent<=0)}function o1($,C){return!F_($,C)}function O$($,C){if(!J0(C))return!0;let _=B0(C);for(let K of["five_hour","seven_day"]){let f=$?.[K];if(!f)return!b0(C);if(!Number.isFinite(f.remainingPercent))return!b0(C);if(f.remainingPercent<_[K])return!1}return!0}var c={five_hour:5,seven_day:10,scoped:0};function Z0($){let C=$?.five_hour??$?.["5h"],_=$?.seven_day??$?.["1w"],K=$?.scoped;return{five_hour:typeof C==="number"&&Number.isFinite(C)?C:c.five_hour,seven_day:typeof _==="number"&&Number.isFinite(_)?_:c.seven_day,scoped:typeof K==="number"&&Number.isFinite(K)?K:c.scoped}}function H1($){return $?.killswitch?.enabled===!0}function N1($,C){if(!$?.killswitch)return c;if(C&&$.killswitch.accounts?.[C])return Z0($.killswitch.accounts[C]);return Z0($.killswitch.main)}function KG($,C,_,K){if(!H1(C))return!0;let f=N1(C,_),G=!1;for(let j of["five_hour","seven_day"]){let H=$?.[j];if(!H){G=!0;continue}if(!Number.isFinite(H.remainingPercent)){G=!0;continue}if(H.remainingPercent<f[j])return!1}if(K){let j=T($,K);if(j&&Number.isFinite(j.remainingPercent)&&j.remainingPercent<=f.scoped)return!1}if(G)return!b0(C);return!0}function fG($,C,_,K){let f=[],G=[$,...C.map((j)=>j.quota)];for(let j of G)if(K){let N=T(j,K)?.resetsAt;if(!N)continue;let J=Date.parse(N);if(Number.isFinite(J)&&J>_)f.push(J)}else for(let H of["five_hour","seven_day"]){let N=j?.[H]?.resetsAt;if(!N)continue;let J=Date.parse(N);if(Number.isFinite(J)&&J>_)f.push(J)}if(!f.length)return 300;return Math.max(1,Math.ceil((Math.min(...f)-_)/1000))+60}function GG($){return $?.killswitch??{enabled:!1}}async function jG($,C=V()){let _=await D(C)??P();return _.killswitch=$,await B(_,C),_}async function HG($,C=V()){let _=await D(C);if(!_)return!1;let K=R_(_,$);if(K)await B(_,C,{removedAccountIds:[$]});return K}async function NG($,C=V()){let _=await D(C);if(!_)return;q_(_,$),await B(_,C,{preserveExistingAccountOrder:!1})}async function JG($,C,_=V()){let K=await D(_);if(!K)return!1;let f=P_(K,$,C);if(f)await B(K,_);return f}async function ZG($,C=V()){let _=await D(C)??P();A_(_,$),await B(_,C)}function J1($,C,_){if(!J0(C))return _+R(C);let K=B0(C),f=[];for(let G of["five_hour","seven_day"]){let j=$?.[G];if(!j)return _+R(C);if(j.remainingPercent>=K[G])continue;let H=j.resetsAt?Date.parse(j.resetsAt):Number.NaN;if(!Number.isFinite(H)||H<=_)return _+R(C);f.push(H)}if(!f.length)return _+R(C);return Math.min(...f)+60000}function i($,C,_){return!$.access||!$.expires||$.expires-_<=E_(C)}function X$($,C,_){if(!J0(C))return!0;let K=R(C);return["five_hour","seven_day"].every((f)=>{let G=$?.[f];return Boolean(G&&_-G.checkedAt<K)})}function $1($,C,_,K){if(!X$($.quota,C,_))return!0;let f=T($.quota,K);return Boolean(f&&_-f.checkedAt>=R(C))}function Q_($,C){if(!$)return!1;if(!$.resetsAt)return!0;let _=Date.parse($.resetsAt);return!Number.isFinite(_)||_>C}function b_($,C){return["five_hour","seven_day"].every((_)=>Q_($?.[_],C))}function Y$($){let C=$.status;if(typeof C==="number"&&Number.isFinite(C)){if(C===429||C>=500)return!0}let _=C0($);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:f}=$;return K.includes("fetch failed")||f==="ECONNRESET"||f==="ECONNREFUSED"||f==="ETIMEDOUT"||f==="UND_ERR_CONNECT_TIMEOUT"}function D_($,C,_,K){return Y$(_)&&O$($.quota,C)&&b_($.quota,K)}function D0($){if(!Number.isFinite($))return 0;if($<0)return 0;if($>100)return 100;return $}function C1($){return typeof $==="string"&&$.trim()?$.trim():void 0}function B_($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function S_($,C){if(!Array.isArray($))return[];let _=new Set,K=[];for(let f of $){if(f?.kind!=="weekly_scoped"||f.group!=="weekly")continue;if(typeof f.percent!=="number"||!Number.isFinite(f.percent))continue;let G=C1(f.scope?.model?.display_name);if(!G)continue;let j=C1(f.scope?.model?.id)??G,H=B_(j);if(!H)continue;let N=`claude-weekly-scoped-${H}`;if(_.has(N))continue;_.add(N);let J=D0(f.percent),Z=C1(f.scope?.model?.id);K.push({id:N,title:`${G} only`,...Z&&{modelId:Z},modelName:G,usedPercent:J,remainingPercent:D0(100-J),resetsAt:f.resets_at,checkedAt:C})}return K}function a1($,C){if(typeof $?.utilization!=="number")return;if(!Number.isFinite($.utilization))return;let _=D0($.utilization);return{usedPercent:_,remainingPercent:D0(100-_),resetsAt:$.resets_at,checkedAt:C}}async function A0($){let _=await($.fetchImpl??fetch)(qC,{method:"GET",headers:{Authorization:`Bearer ${$.accessToken}`,Accept:"application/json","Content-Type":"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":`claude-code/${g}`}});if(!_.ok){let G=await _.text().catch(()=>"");throw Object.assign(Error(`Claude quota check failed: ${_.status} — ${G}`),{status:_.status,retryAfter:t0(_.headers.get("Retry-After"))})}let K=$.now?.()??Date.now(),f=await _.json();return{five_hour:a1(f.five_hour,K),seven_day:a1(f.seven_day,K),scoped:S_(f.limits,K),checkedAt:K}}function A($,C){let _=$.accounts.findIndex((K)=>K.id===C.id);if(_>=0)$.accounts[_]=C}function A_($,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,lastRefreshedAt:C.lastRefreshedAt,lastRefreshError:C.lastRefreshError,lastQuotaRefreshError:C.lastQuotaRefreshError}};return}$.accounts.push(C)}function R_($,C){let _=$.accounts.findIndex((K)=>K.id===C);if(_<0)return!1;return $.accounts.splice(_,1),!0}function q_($,C){let _=new Map(C.map((G,j)=>[G,j])),K=$.accounts.filter((G)=>_.has(G.id)),f=$.accounts.filter((G)=>!_.has(G.id));K.sort((G,j)=>(_.get(G.id)??0)-(_.get(j.id)??0)),$.accounts=[...K,...f]}function P_($,C,_){let K=$.accounts.find((f)=>f.id===C);if(!K)return!1;return K.enabled=_,!0}function C0($){return $ instanceof Error?$.message:String($)}function z$($,C,_){$.lastRefreshError=V_({error:C,now:_,refreshToken:$.refresh,previous:$.lastRefreshError})}function t1($,C,_){if(j1(C))return;if($.lastQuotaRefreshError=S0({error:C,now:_,previous:$.lastQuotaRefreshError}),C.isRefreshError)z$($,C,_)}function I_($){return`fallback-oauth-refresh-${e1("sha256").update($).digest("hex").slice(0,16)}`}class x_{now;fetchImpl;configPath;refreshPromises=new Map;refreshTimer=null;quotaTimer=null;quotaManager;onFallbackStorageChanged;constructor($={}){this.now=$.now??Date.now,this.fetchImpl=$.fetchImpl??fetch,this.configPath=$.configPath??V(),this.quotaManager=$.quotaManager??null,this.onFallbackStorageChanged=$.onFallbackStorageChanged}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 f=R(C);this.quotaManager.setFallback($.id,{quota:$.quota,refreshAfter:_+f,checkedAt:_},$.access)}async load(){return D(this.configPath)}async save($,C){await O_($,this.configPath,{accounts:C??!0})}startBackgroundRefresh(){let $=async()=>{await this.refreshDueAccounts(),await this.refreshQuotaForDueAccounts()};if($().catch(()=>{}),!this.refreshTimer){if(this.refreshTimer=setInterval(()=>{$().catch(()=>{})},lC+L_(pC)),"unref"in this.refreshTimer)this.refreshTimer.unref()}}stopBackgroundRefresh(){if(this.refreshTimer)clearInterval(this.refreshTimer);if(this.quotaTimer)clearInterval(this.quotaTimer);this.refreshTimer=null,this.quotaTimer=null}async getUsableFallbackAccounts($,C={}){let _=$!==void 0?$:await this.load();if(!_)return[];let K=[],f=!1;for(let G of _.accounts){if(G.enabled===!1||!y(G))continue;try{let j=G;if(i(j,_,this.now())){let N=j.lastRefreshError;if(N&&j0(N,j.refresh,this.now()))throw Error(e0(N,this.now()));j=await this.refreshAccount(j,_),f=!0}if(this.seedFallbackQuota(j,_),(this.quotaManager?this.quotaManager.isFallbackStale(j.id,j.access,C.modelId):$1(j,_,this.now(),C.modelId))&&!$0(j.lastQuotaRefreshError,this.now()))j=await this.refreshAccountQuota(j,_),f=!0;if(this.accountPassesQuotaPolicy(this.quotaPolicyAccount(j),_,{modelId:C.modelId}))K.push(j)}catch(j){if(D_(G,_,j,this.now())){if(u("[refresh] fallback quota using cached quota after refresh error",{accountId:G.id,error:C0(j)}),this.accountPassesQuotaPolicy(this.quotaPolicyAccount(G),_,{modelId:C.modelId}))K.push(G)}else if(!b0(_)&&o1(G.quota,C.modelId))K.push(G)}}if(f)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 O$($.quota,C)&&o1($.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(!$||!W_($))return;let C=!1;for(let _ of $.accounts){if(_.enabled===!1||!y(_))continue;if(!i(_,$,this.now()))continue;if(j0(_.lastRefreshError,_.refresh,this.now()))continue;try{u("[refresh] fallback oauth background due",{accountId:_.id,expiresInMs:_.expires?_.expires-this.now():void 0}),await this.refreshAccount(_,$),C=!0}catch(K){q.warn("refresh","fallback oauth background failed",{accountId:_.id,error:K instanceof Error?K.message:String(K)}),z$(_,K,this.now()),A($,_),C=!0}}if(C)await this.save($)}async refreshQuotaForDueAccounts(){let $=await this.load();if(!$||!J0($))return;let C=!1;for(let _ of $.accounts){if(_.enabled===!1||!y(_))continue;let K=_;try{if(i(K,$,this.now())){if(j0(K.lastRefreshError,K.refresh,this.now()))continue;K=await this.refreshAccount(K,$),C=!0}if($0(K.lastQuotaRefreshError,this.now()))continue;if(this.seedFallbackQuota(K,$),!(this.quotaManager?this.quotaManager.isFallbackStale(K.id,K.access):$1(K,$,this.now())))continue;await this.refreshAccountQuota(K,$),C=!0}catch(f){t1(_,f,this.now()),A($,_),C=!0}}if(C)await this.save($),this.onFallbackStorageChanged?.()}async refreshQuotaForAllAccounts($={}){let C=await this.load(),_=[];if(!C||!J0(C))return{storage:C,errors:_};let K=$.force??!1,f=!1;for(let G of C.accounts){if(G.enabled===!1||!y(G))continue;let j=G;try{if(i(j,C,this.now())){let H=j.lastRefreshError;if(H&&j0(H,j.refresh,this.now()))throw Error(e0(H,this.now()));j=await this.refreshAccount(j,C),f=!0}if(!K&&!$1(j,C,this.now())){if(j.lastQuotaRefreshError)j.lastQuotaRefreshError=void 0,A(C,j),f=!0;continue}await this.refreshAccountQuota(j,C),f=!0}catch(H){t1(G,H,this.now()),A(C,G),f=!0,_.push({accountId:G.id,message:C0(H)})}}if(f)await this.save(C);return{storage:C,errors:_}}async refreshAccount($,C,_={}){let K=this.refreshPromises.get($.id);if(K){let j=await K;return A(C,j),j}let f=this.refreshAccountNow($,C,_).finally(()=>{this.refreshPromises.delete($.id)});this.refreshPromises.set($.id,f);let G=await f;return A(C,G),G}async waitForConcurrentFallbackRefresh($,C,_,K){let f=Date.now()+dC;while(Date.now()<f){await new Promise((J)=>setTimeout(J,iC));let G=await this.load(),j=G?.accounts.find((J)=>J.id===$.id&&y(J));if(!j)continue;if((j.access!==_.access||j.refresh!==_.refresh||(j.expires??0)>(_.expires??0)+60000)&&(K.force||!i(j,G,this.now())))return A(C,j),u("[refresh] fallback oauth joined concurrent refresh",{accountId:j.id,expiresInMs:j.expires?j.expires-this.now():void 0}),j;let N=j.lastRefreshError;if(N&&j0(N,j.refresh,this.now()))throw A(C,j),Error(e0(N,this.now()))}return null}async refreshAccountNow($,C,_){let K=await this.load(),f=K?.accounts.find((H)=>H.id===$.id&&y(H));if(f&&!_.force&&!i(f,K,this.now()))return A(C,f),f;let G=f??$,j=await r({name:I_(G.id),ttlMs:gC,path:this.configPath,now:this.now,renew:!0});if(!j){u("[refresh] fallback oauth refresh skipped file lock",{accountId:G.id});let H=await this.waitForConcurrentFallbackRefresh($,C,G,_);if(H)return H;throw Error("Fallback OAuth refresh is already in progress")}try{if(K=await this.load(),f=K?.accounts.find((J)=>J.id===$.id&&y(J)),f&&!_.force&&!i(f,K,this.now()))return A(C,f),f;G=f??G;let H=G.refresh;u("[refresh] fallback oauth refresh request start",{accountId:G.id,force:_.force===!0,expiresInMs:G.expires?G.expires-this.now():void 0});let N=await g1({refreshToken:H,fetchImpl:this.fetchImpl,now:this.now});return G.access=N.access,G.refresh=N.refresh,G.expires=N.expires,G.lastRefreshedAt=N.expires-N.expiresIn*1000,G.lastRefreshError=void 0,A(C,G),await this.save(C),u("[refresh] fallback oauth refresh succeeded",{accountId:G.id,expiresInMs:G.expires?G.expires-this.now():void 0}),G}finally{await j.release()}}async refreshAccountQuota($,C){let _=$;if(!_.access)throw Error(`Fallback account ${$.id} has no access token`);let K=(H)=>this.quotaManager?this.quotaManager.refreshFallback(_.id,H):A0({accessToken:H,fetchImpl:this.fetchImpl,now:this.now}),f=this.now();try{_.quota=await K(_.access)}catch(H){if(!(H instanceof Error?H.message:String(H)).includes("Claude quota check failed: 401"))throw H;if(_=await this.refreshAccount($,C,{force:!0}),!_.access)throw H;_.quota=await K(_.access)}let G=await this.load(),j=G?.accounts.find((H)=>H.id===_.id&&y(H));if(G&&j&&j.access!==_.access)return this.seedFallbackQuota(j,G),A(C,j),j;if(G&&j?.access===_.access&&j.quota&&N0(j.quota)>=f&&X$(j.quota,G,this.now()))return this.seedFallbackQuota(j,G),A(C,j),j;if(_.lastQuotaRefreshError=void 0,A(C,_),this.quotaManager&&_.quota){let H=this.now();this.quotaManager.setFallback(_.id,{quota:_.quota,refreshAfter:H+R(C),checkedAt:H},_.access)}return _}}var YG="claude-cache",W$="## Claude Cache Status",h_="## Claude Cache Enabled",w_="## Claude Cache Disabled",T_="## Claude Cache Usage",k_="Usage: `/claude-cache`, `/claude-cache on`, `/claude-cache off`, or `/claude-cache mode explicit|automatic|hybrid`.",R0=!1,q0=U0;function zG(){return R0}function WG(){return q0}function LG($){R0=$.enabled,q0=$.mode}function m_($){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 O0($){let C=$?.enabled??R0,_=$?.mode??q0;return[W$,"",`- 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 EG($){let C=m_($.argumentsText),_=$.enabled??R0,K=$.mode??q0;if(C.type==="status")return O0({enabled:_,mode:K});if(C.type==="enable")return[h_,"",O0({enabled:!0,mode:K})].join(`
8
+ `);if(C.type==="disable")return[w_,"",O0({enabled:!1,mode:K})].join(`
9
+ `);if(C.type==="mode")return[W$,"",`Mode updated to \`${C.mode}\`.`,"",O0({enabled:_,mode:C.mode})].join(`
10
+ `);return[T_,"",k_,"",O0({enabled:_,mode:K})].join(`
11
+ `)}import{randomBytes as y_,randomUUID as U$}from"node:crypto";var v_=1000,n=new Map;function X0($,C,_){if(!$.has(C)&&$.size>=v_){let K=$.keys().next().value;if(K!==void 0)$.delete(K)}$.set(C,_)}function V$($){let C=$||"anonymous",_=n.get(C);if(_)return _;let K={deviceId:y_(32).toString("hex"),sessionId:U$()};return X0(n,C,K),K}var l_=86400000,p_=300000,Z1=new Map,L$=new Map;async function g_($,C){if(!$.startsWith("sk-ant-oat"))return null;let _=new AbortController,K=setTimeout(()=>_.abort(),5000);try{let f=new URL("https://api.anthropic.com/api/claude_cli/bootstrap");if(f.searchParams.set("entrypoint",T1),C)f.searchParams.set("model",C);let G=await fetch(f,{method:"GET",headers:{accept:"application/json, text/plain, */*",authorization:`Bearer ${$}`,"content-type":"application/json","anthropic-beta":"oauth-2025-04-20","user-agent":`claude-code/${g}`},signal:_.signal});if(!G.ok)return null;let H=(await G.json().catch(()=>null))?.oauth_account?.account_uuid;return typeof H==="string"&&H?H:null}catch{return null}finally{clearTimeout(K)}}async function FG($,C){let _=V$($);if(!$.startsWith("sk-ant-oat"))return _;let K=Date.now(),f=L$.get($);if(f&&f.expiresAt>K){if(!f.accountUuid)return _;let J=`account:${f.accountUuid}`,Z=n.get(J);if(Z)return X0(n,$,Z),Z}let G=Z1.get($);if(!G)G=g_($,C),Z1.set($,G);let j=await G.finally(()=>{Z1.delete($)});if(X0(L$,$,{accountUuid:j,expiresAt:K+(j?l_:p_)}),!j)return _;let H=`account:${j}`,N=n.get(H);if(N)return X0(n,$,N),N;return _.accountUuid=j,X0(n,H,_),_}function o($){return $!=null&&typeof $==="object"&&!Array.isArray($)}function d_($){if(!$.accountUuid)return null;return JSON.stringify({device_id:$.deviceId,account_uuid:$.accountUuid,session_id:$.sessionId})}function QG($,C){let _=d_(C);if(!_){if(o($.metadata))delete $.metadata.user_id;return!1}if(!o($.metadata))$.metadata={};let K=$.metadata;if(o(K))K.user_id=_;return!0}var i_=["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"],u_=["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"],E$=["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 c_($){return $.output_config?.format?.type==="json_schema"}function s_($){return Array.isArray($.tools)&&$.tools.length>0&&Array.isArray($.system)&&o($.thinking)&&o($.context_management)&&o($.output_config)&&o($.diagnostics)}function r_($,C=[]){let _=$?s_($)?[...i_]:c_($)?[...u_]:[...E$]:[...E$];if($?.speed==="fast")_.push(w1);for(let K of C){let f=K.trim();if(f)_.push(f)}return[...new Set(_)].join(",")}function n_(){switch(process.platform){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return"Unknown"}}function o_(){switch(process.arch){case"arm64":return"arm64";case"x64":return"x64";case"ia32":return"x32";default:return process.arch}}function bG($,C,_={}){let K=_.identity??V$(C),G=[...($.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",y1),$.set("anthropic-beta",r_(_.body,G)),$.set("anthropic-dangerous-direct-browser-access","true"),$.set("anthropic-version","2023-06-01"),$.set("x-app","cli"),$.set("x-client-request-id",U$()),$.set("x-claude-code-session-id",K.sessionId),$.set("x-stainless-arch",o_()),$.set("x-stainless-lang","js"),$.set("x-stainless-os",n_()),$.set("x-stainless-package-version",k1),$.set("x-stainless-retry-count","0"),$.set("x-stainless-runtime","node"),$.set("x-stainless-runtime-version",m1),$.set("x-stainless-timeout","600"),$.delete("x-api-key"),$}var a_=["model","messages","system","tools","tool_choice","metadata","max_tokens","temperature","thinking","context_management","output_config","diagnostics","stream","speed"];function M$($){let C={};for(let _ of a_)if(Object.hasOwn($,_))C[_]=$[_];for(let[_,K]of Object.entries($))if(!Object.hasOwn(C,_))C[_]=K;return C}import{createHash as e_}from"node:crypto";var t_=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 F$(){return function($){let{exports:{mem:C,xxh32:_,xxh64:K,init32:f,update32:G,digest32:j,init64:H,update64:N,digest64:J}}=$,Z=new Uint8Array(C.buffer);function Y(X,b){if(C.buffer.byteLength<X+b){let S=Math.ceil((X+b-C.buffer.byteLength)/65536);C.grow(S),Z=new Uint8Array(C.buffer)}}function U(X,b,S,W0,P1,L0){Y(X);let p=new Uint8Array(X);return Z.set(p),S(0,b),p.set(Z.subarray(0,X)),{update(h){let c0;return Z.set(p),typeof h=="string"?(Y(3*h.length,X),c0=O.encodeInto(h,Z.subarray(X)).written):(Y(h.byteLength,X),Z.set(h,X),c0=h.byteLength),W0(0,X,c0),p.set(Z.subarray(0,X)),this},digest:()=>(Z.set(p),L0(P1(0)))}}function W(X){return X>>>0}let z=2n**64n-1n;function L(X){return X&z}let O=new TextEncoder,x=0,w=0n;function v(X,b=x){return Y(3*X.length,0),W(_(0,O.encodeInto(X,Z).written,b))}function m(X,b=w){return Y(3*X.length,0),L(K(0,O.encodeInto(X,Z).written,b))}return{h32:v,h32ToString:(X,b=x)=>v(X,b).toString(16).padStart(8,"0"),h32Raw:(X,b=x)=>(Y(X.byteLength,0),Z.set(X),W(_(0,X.byteLength,b))),create32:(X=x)=>U(48,X,f,G,j,W),h64:m,h64ToString:(X,b=w)=>m(X,b).toString(16).padStart(16,"0"),h64Raw:(X,b=w)=>(Y(X.byteLength,0),Z.set(X),L(K(0,X.byteLength,b))),create64:(X=w)=>U(88,X,H,N,J,L)}}((await WebAssembly.instantiate(t_)).instance)}var $6=0x6e52736ac806831en,C6="cch=00000;";var X1=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=([0-9a-f]{5});/,_6=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=00000;/,Q$=null,O1=null;async function K6(){if(O1)return;Q$??=(async()=>{O1=(await F$()).h64Raw})(),await Q$}async function f6($){return await K6(),((O1?.($,$6)??0n)&0xfffffn).toString(16).padStart(5,"0")}function G6($){return $.replace(X1,`$1${C6}`)}function b$($){return X1.exec($)?.[2]??null}async function D$($){if(!X1.test($))return $;let C=G6($),_=await f6(new TextEncoder().encode(C));return C.replace(_6,`$1cch=${_};`)}function j6($=g,C=new Date){if($===g)return o0;return e_("sha256").update($).digest("hex").slice(0,3)}function qG($,C=g,_,K=new Date){let f=j6(C,K);return`x-anthropic-billing-header: cc_version=${C}.${f}; cc_entrypoint=${_}; cch=00000;`}var wG="claude-cachekeep",Y1=3600000,P0=300000,H6=60000,TG="extended-cache-ttl-2025-04-11",N6=32,B$=16777216,J6=2*Y1,Z6=30000,S$="## Claude Cache Keep Status",A$="## Claude Cache Keep Enabled",O6="## Claude Cache Keep Disabled",X6="## Claude Cache Keep Usage",Y6="Usage: `/claude-cachekeep`, `/claude-cachekeep always`, `/claude-cachekeep off`, or `/claude-cachekeep HH-HH`.";function I0($){return String($).padStart(2,"0")}function z6($){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]),f=Number(_[2]);if(!Number.isInteger(K)||!Number.isInteger(f)||K<0||K>23||f<0||f>23||K===f)return{type:"usage"};return{type:"window",startHour:K,endHour:f}}function x0($){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 h0($){return $?.cacheKeep?.enabled===!0&&$.cacheKeep.always===!0}function I$($){return $?.cacheKeep?.enabled===!0&&(h0($)||!!x0($))}function W6($){return I$($)&&$?.claudeCache?.enabled===!0&&$.claudeCache.mode==="hybrid"}function L6($,C=new Date){if(!$)return!1;let _=C.getHours();if($.startHour<$.endHour)return _>=$.startHour&&_<$.endHour;return _>=$.startHour||_<$.endHour}function R$($,C=new Date){if($?.cacheKeep?.enabled!==!0)return!1;return h0($)||L6(x0($),C)}function q$($=new Date){return`${$.getFullYear()}-${I0($.getMonth()+1)}-${I0($.getDate())}`}function x$($,C=new Date){if($&&$.startHour>$.endHour&&C.getHours()<$.endHour){let _=new Date(C);return _.setDate(_.getDate()-1),q$(_)}return q$(C)}function P$($,C,_=new Date){return h0($)?"always":x$(C,_)}function _0($){let C=$.always?"always (while this process is running)":$.window?`${I0($.window.startHour)}-${I0($.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 kG($){let C=z6($.argumentsText),_={enabled:$.enabled??!1,always:$.always,window:$.window,trackedSessions:$.trackedSessions,trackedSessionDetails:$.trackedSessionDetails,nextPrewarmAt:$.nextPrewarmAt,hybridActive:$.hybridActive};if(C.type==="status")return[S$,"",_0(_)].join(`
13
+ `);if(C.type==="disable")return[O6,"",_0({..._,enabled:!1})].join(`
14
+ `);if(C.type==="always")return[A$,"",_0({..._,enabled:!0,always:!0,window:void 0})].join(`
15
+ `);if(C.type==="window")return[A$,"",_0({..._,enabled:!0,always:!1,window:{startHour:C.startHour,endHour:C.endHour}})].join(`
16
+ `);if(C.type==="subagents")return[S$,"",_0(_),"",`Subagent tracking: ${C.enabled?"enabled":"disabled"}`].join(`
17
+ `);return[X6,"",Y6,"",_0(_)].join(`
18
+ `)}function z1($){if(!$||typeof $!=="object")return!1;if(Array.isArray($))return $.some(z1);let C=$,_=C.cache_control;if(_&&typeof _==="object"&&_.type==="ephemeral")return!0;return Object.values(C).some(z1)}async function E6($){let C;try{C=JSON.parse($)}catch{return{ok:!1,reason:"body is not valid JSON"}}if(!z1(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 G=_.tool_choice;if(G?.type==="tool"||G?.type==="any")delete _.tool_choice;return{ok:!0,bodyText:await D$(JSON.stringify(M$(_)))}}class U6{options;targets=new Map;timer=null;constructor($){this.options=$}start(){if(this.timer)return;if(q.debug("cachekeep","started"),this.timer=setInterval(()=>{this.tick().catch(($)=>{q.warn("cachekeep","tick failed",{error:$ instanceof Error?$.message:String($)})})},H6),"unref"in this.timer)this.timer.unref()}stop(){if(!this.timer)return;q.debug("cachekeep","stopped"),clearInterval(this.timer),this.timer=null}stats($,C=this.options.now?.()??Date.now(),_=!1){let K=_?"always":x$($,new Date(C)),f=[...this.targets.values()].filter((j)=>j.dayKey===K),G=f.length?Math.min(...f.map((j)=>j.cacheExpiresAt-P0)):void 0;return{trackedSessions:f.length,nextPrewarmAt:G}}trackedSessions(){return[...this.targets.values()].map(($)=>({id:$.id,cacheExpiresAt:$.cacheExpiresAt,nextPrewarmAt:$.cacheExpiresAt-P0})).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)=>{q.warn("cachekeep","failed to publish tracked sessions",{error:C instanceof Error?C.message:String(C)})})}catch(C){q.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>J6)this.targets.delete(_)}while(this.targets.size>N6)this.evictOldestTarget();while(this.totalBodyBytes()>B$){let _=this.targets.size;if(this.evictOldestTarget(),this.targets.size===_)break}}track($){if(!$.sessionId)return{tracked:!1,reason:"missing session id"};if(!I$($.storage))return{tracked:!1,reason:"cachekeep disabled"};if($.cacheMode!=="hybrid")return{tracked:!1,reason:"cache mode is not hybrid"};if($.bodyText.length>B$)return{tracked:!1,reason:"body exceeds cachekeep memory budget"};let C=this.options.now?.()??Date.now(),_=x0($.storage);if(!R$($.storage,new Date(C)))return{tracked:!1,reason:"outside configured schedule"};let K=P$($.storage,_,new Date(C));if(this.pruneTargets(C,K),this.targets.has($.sessionId))this.targets.delete($.sessionId);let f={};return $.headers.forEach((G,j)=>{f[j]=G}),this.targets.set($.sessionId,{id:$.sessionId,url:$.url,headers:f,bodyText:$.bodyText,cacheExpiresAt:C+Y1,dayKey:K,oauthAccountId:$.oauthAccountId}),this.pruneTargets(C,K),this.publishTrackedSessions(),this.start(),{tracked:!0}}async prewarmNow($){let C={};$.headers.forEach((K,f)=>{C[f]=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=x0($),_=this.options.now?.()??Date.now(),K=P$($,C,new Date(_));if(h0($))for(let G of this.targets.values())G.dayKey="always";if(this.pruneTargets(_,K),!this.targets.size){this.publishTrackedSessions(),this.stop();return}if(!W6($)){this.publishTrackedSessions();return}if(!R$($,new Date(_))){this.publishTrackedSessions();return}q.debug("cachekeep","fired",{targets:this.targets.size});let f=_+P0;for(let G of this.targets.values()){if(G.cacheExpiresAt>f)continue;await this.prewarm(G,_)}this.publishTrackedSessions()}async sendPrewarm($){let C=await E6($.bodyText);if(!C.ok)return C;let _=this.options.fetchImpl??fetch,K={...$,bodyText:C.bodyText},f=this.options.prepareHeaders?await this.options.prepareHeaders(new Headers($.headers),K):new Headers($.headers);f.delete("content-length"),f.delete("transfer-encoding");let G=await _($.url,{method:"POST",headers:f,body:C.bodyText,signal:AbortSignal.timeout(this.options.prewarmTimeoutMs??Z6)});if(!G.ok)return{ok:!1,reason:await G.text().catch(()=>"").then((N)=>N||`HTTP ${G.status}`),status:G.status};let H=(await G.json().catch(()=>null))?.usage;return{ok:!0,...H&&{usage:H}}}async prewarm($,C){let _=await this.sendPrewarm($);if(!_.ok){if(_.status==null)q.debug("cachekeep","prewarm skipped",{session:$.id,reason:_.reason}),this.targets.delete($.id);else q.warn("cachekeep","prewarm failed",{session:$.id,status:_.status,reason:_.reason}),$.cacheExpiresAt=C+P0+300000;return}$.cacheExpiresAt=C+Y1,q.debug("cachekeep","prewarm succeeded",{session:$.id,..._.usage&&{usage:_.usage}})}}import{randomUUID as h$}from"node:crypto";import{mkdir as V6,readdir as M6,readFile as F6,rename as Q6,rm as w$,writeFile as b6}from"node:fs/promises";import{tmpdir as D6}from"node:os";import{join as W1}from"node:path";var B6=180000;function S6($){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 A6($){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=S6(_);return K?[K]:[]})}}function gG($){return W1(D6(),"opencode-anthropic-auth","cachekeep-sessions",$)}class R6{options;filePath;writeChain=Promise.resolve();constructor($){this.options=$;let C=$.instanceId??`${process.pid}-${h$()}`;this.filePath=W1($.directory,`${C}.json`)}publish($){let C=$.map((_)=>({..._}));return this.writeChain=this.writeChain.catch(()=>{}).then(async()=>{if(C.length===0){await w$(this.filePath,{force:!0});return}await V6(this.options.directory,{recursive:!0,mode:448});let _=`${this.filePath}.${h$()}.tmp`,K={version:1,updatedAt:this.options.now?.()??Date.now(),sessions:C};await b6(_,`${JSON.stringify(K)}
19
+ `,{mode:384}),await Q6(_,this.filePath)}),this.writeChain}async list($=[]){await this.writeChain.catch(()=>{});let C=this.options.now?.()??Date.now(),_=this.options.leaseMs??B6,K;try{K=(await M6(this.options.directory)).filter((j)=>j.endsWith(".json"))}catch{K=[]}let f=await Promise.all(K.map(async(j)=>{try{let H=await F6(W1(this.options.directory,j),"utf8");return A6(JSON.parse(H))}catch{return}})),G=new Map;for(let j of f){if(!j||C-j.updatedAt>_||j.updatedAt>C)continue;for(let H of j.sessions){let N=G.get(H.id);if(!N||H.cacheExpiresAt>N.cacheExpiresAt)G.set(H.id,H)}}for(let j of $){let H=G.get(j.id);if(!H||j.cacheExpiresAt>H.cacheExpiresAt)G.set(j.id,{...j})}return[...G.values()].sort((j,H)=>j.id.localeCompare(H.id))}async dispose(){await this.writeChain.catch(()=>{}),await w$(this.filePath,{force:!0})}}var iG="claude-account";function q6($){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 f=K,G,j,H=f.match(/--base-url\s+(\S+)/);if(H)G=H[1],f=f.replace(H[0],"").trim();let N=f.match(/--auth-header\s+(authorization-bearer|x-api-key)/);if(N)j=N[1],f=f.replace(N[0],"").trim();let J,Z=f.match(/--label\s+(.+)/);if(Z)J=Z[1]?.trim()||void 0,f=f.replace(Z[0],"").trim();let Y=f.indexOf(" ");if(Y===-1){if(!f)return{type:"usage"};return{type:"add-apikey",apiKey:f,baseURL:G,authHeader:j,label:J}}let U=f.slice(0,Y),W=f.slice(Y+1).trim();return{type:"add-apikey",apiKey:U,label:J??(W||void 0),baseURL:G,authHeader:j}}if(_==="add-oauth-start")return{type:"add-oauth-start"};if(_==="add-oauth-finish"&&K){let f=K,G,j=f.match(/--label\s+(.+)/);if(j)G=j[1]?.trim()||void 0,f=f.replace(j[0],"").trim();if(!f)return{type:"usage"};return{type:"add-oauth-finish",code:f,label:G}}return{type:"usage"}}function P6($){let C=[],_=$.quota?.mainQuota?.five_hour;C.push({id:"main",label:$.main?.provider==="anthropic"?"OpenCode anthropic":"Main",role:"main",enabled:!0,quotaPercent:_?.usedPercent??null});for(let K of $.accounts){let f=K.quota?.five_hour;C.push({id:K.id,label:K.label??K.id,role:"fallback",enabled:K.enabled!==!1,quotaPercent:f?.usedPercent??null})}return C}var L1=["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 uG($){let C=q6($.argumentsText),_=$.storage.accounts,K="main";if(C.type==="status"){let G=P6($.storage),j=["## Claude Accounts",""];for(let H of G){let N=H.quotaPercent!=null?` ${Math.round(H.quotaPercent)}%`:"",J=!H.enabled?" (disabled)":"";j.push(`- **${H.label}** [${H.role}]${J}${N}`)}return j.push("",L1),{text:j.join(`
21
+ `)}}if(C.type==="usage")return{text:L1};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 f=C.id;if(f==="main")return{text:`Cannot ${C.type} the main account (OpenCode managed).`};if(C.type==="enable"||C.type==="disable"){let G=_.find((j)=>j.id===f);if(!G)return{text:`Account "${f}" not found.`};return{text:`Account "${G.label??f}" ${C.type}d.`,updated:{id:f,action:C.type,enabled:C.type==="enable"}}}if(C.type==="remove"){let G=_.find((j)=>j.id===f);if(!G)return{text:`Account "${f}" not found.`};return{text:`Account "${G.label??f}" removed.`,updated:{id:f,action:"remove"}}}if(C.type==="move-up"){let G=_.findIndex((J)=>J.id===f);if(G<0)return{text:`Account "${f}" not found.`};if(G===0)return{text:`Account "${_[G]?.label??f}" is already first.`};let j=_.map((J)=>J.id),H=[..._];[H[G-1],H[G]]=[H[G],H[G-1]];let N=H.map((J)=>J.id);return{text:`Account "${_[G]?.label??f}" moved up.`,updated:{id:f,action:"reorder",previousOrder:j,newOrder:N}}}if(C.type==="move-down"){let G=_.findIndex((J)=>J.id===f);if(G<0)return{text:`Account "${f}" not found.`};if(G===_.length-1)return{text:`Account "${_[G]?.label??f}" is already last.`};let j=_.map((J)=>J.id),H=[..._];[H[G],H[G+1]]=[H[G+1],H[G]];let N=H.map((J)=>J.id);return{text:`Account "${_[G]?.label??f}" moved down.`,updated:{id:f,action:"reorder",previousOrder:j,newOrder:N}}}return{text:L1}}import{createHash as I6,randomBytes as x6}from"node:crypto";import{lstat as T$,mkdir as h6,readdir as w6,rename as T6,unlink as l$,writeFile as k6}from"node:fs/promises";import{tmpdir as m6}from"node:os";import{join as M1,resolve as k0}from"node:path";var eG="claude-dump",y6="## Claude Dump Status",v6="## Claude Dump Enabled",l6="## Claude Dump Disabled",p6="## Claude Dump Usage",g6="Usage: `/claude-dump`, `/claude-dump on`, or `/claude-dump off`.",d6="OPENCODE_ANTHROPIC_AUTH_DUMP_DIR",i6="OPENCODE_ANTHROPIC_AUTH_DUMP_MAX_BYTES",u6=M1(m6(),"opencode-anthropic-auth-dumps"),c6=536870912,s6=300000,r6=60000,n6=600000,o6=/\.(body|meta|relay|request)\.json$/,a6=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-\d{3}Z-\d{5,}-(.+)$/,U1="[a-zA-Z0-9._-]",t6=new RegExp(`^${U1}{1,80}-direct(?:-${U1}{1,80})?$`),e6=new RegExp(`^${U1}{1,80}-(?:http|websocket)-p[12]-(?:full_sync|patch)$`),Y0=!1,k$=0,m$=0,$K=100,K0=new Map;function $4($){Y0=$}function y0(){return process.env[d6]||u6}function CK(){let $=Number(process.env[i6]);return Number.isFinite($)&&$>=0?Math.floor($):c6}function _K($){return k0($)===k0(y0())}function V1($){let C=$.replace(o6,"");if(C===$)return!1;let K=a6.exec(C)?.[1];if(!K)return!1;return t6.test(K)||e6.test(K)}function KK($){if(!$.endsWith(".partial"))return!1;let C=$.slice(0,-8);if(V1(C))return!0;let _=C.lastIndexOf(".");if(_<0)return!1;let K=C.slice(_+1);return/^[a-f0-9]{24}$/.test(K)&&V1(C.slice(0,_))}async function w0($,C){for(let _=0;_<2;_+=1){let K=x6(12).toString("hex"),f=`${$}.${K}.partial`,G=!1;try{return await k6(f,C,{encoding:"utf8",flag:"wx"}),G=!0,await T6(f,$),!0}catch(j){if(j.code==="EEXIST")continue;if(G)await l$(f).catch(()=>{});throw j}}return!1}async function fK($){let C=$.dumpDir??y0(),_=$.maxBytes??CK(),K=$.now??Date.now(),f=$.minAgeMs??r6,G=$.partialStaleMs??n6,j={removed:0,freedBytes:0};if(!_K(C)||_<=0)return j;try{if((await T$(C)).isSymbolicLink())return j;let N=new Set(($.protectedPaths??[]).map((z)=>k0(z))),J=await w6(C,{withFileTypes:!0}),Z=[];await Promise.all(J.map(async(z)=>{if(!z.isFile())return;let L=KK(z.name);if(!L&&!V1(z.name))return;let O=M1(C,z.name);try{let x=await T$(O);if(!x.isFile()||x.isSymbolicLink())return;Z.push({path:O,size:x.size,mtimeMs:x.mtimeMs,partial:L})}catch{}}));let Y=Z.reduce((z,L)=>z+L.size,0);Z.sort((z,L)=>z.mtimeMs-L.mtimeMs||z.path.localeCompare(L.path));let U=0,W=0;for(let z of Z){if(N.has(k0(z.path)))continue;let L=K-z.mtimeMs,O=z.partial&&L>=G;if(!O&&Y<=_)continue;if(z.partial?!O:L<f)continue;try{await l$(z.path),Y-=z.size,W+=z.size,U+=1}catch{}}if(U>0)q.debug("dump","removed old dump files",{removed:U,freedBytes:W});return{removed:U,freedBytes:W}}catch{return j}}function GK($,C){let _=Date.now();if(_-m$<s6)return;m$=_,fK({dumpDir:$,protectedPaths:C}).catch(()=>{})}function jK($){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 T0($){let C=$?.enabled??Y0;return[y6,"",`- Enabled: ${C?"enabled":"disabled"}`,`- Directory: ${y0()}`,"- 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 C4($){let C=jK($.argumentsText),_=$.enabled??Y0;if(C.type==="status")return T0({enabled:_});if(C.type==="enable")return[v6,"",T0({enabled:!0})].join(`
23
+ `);if(C.type==="disable")return[l6,"",T0({enabled:!1})].join(`
24
+ `);return[p6,"",g6,"",T0({enabled:_})].join(`
25
+ `)}function y$($){return $.length<=16?$:`${$.slice(0,12)}…`}function p$($){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 HK($){if($.transport!=="direct")return`${$.transport}-p${$.protocol}-${$.mode}`;return`direct${$.route?`-${p$($.route)}`:""}`}function NK($){let C=$.affinity?.trim();if(C)return`session:${C}`;return`request:${$.route??"direct"}:${$.url??""}`}function JK($,C){if(!K0.has($))while(K0.size>=$K){let _=K0.keys().next().value;if(_===void 0)break;K0.delete(_)}K0.set($,C)}function ZK($){if($==null)return;return Object.fromEntries(new Headers($).entries())}function g$($){return I6("sha256").update($).digest("hex")}function OK($){return b$($)}function XK($,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,f=C.length-1;while(K>=_&&f>=_&&$[K]===C[f])K-=1,f-=1;return{changed:!0,firstByte:_,lastPreviousByte:K,lastCurrentByte:f,changedPreviousBytes:K-_+1,changedCurrentBytes:f-_+1,previousBytes:$.length,currentBytes:C.length}}function YK($){try{let C=JSON.parse($);return C!=null&&typeof C==="object"&&!Array.isArray(C)?C:null}catch(C){return M(`dump body parse failed: ${C instanceof Error?C.message:String(C)}`),null}}function E1($){return g$(JSON.stringify($))}function zK($){let C=YK($);if(!C)return{parseable:!1};let _=Array.isArray(C.messages)?C.messages:[],K=Array.isArray(C.system)?C.system:[],f=_[0],G=_.slice(1);return{parseable:!0,model:typeof C.model==="string"?C.model:void 0,stream:C.stream,systemCount:K.length,messagesCount:_.length,systemHash:E1(K),message0Hash:f===void 0?null:E1(f),message0Bytes:f===void 0?0:JSON.stringify(f).length,messagesAfter0Hash:E1(G),messagesAfter0Bytes:JSON.stringify(G).length,cch:OK($)}}function m0($){if(Array.isArray($))return $.map(m0);if($==null||typeof $!=="object")return $;let C={};for(let[_,K]of Object.entries($)){let f=_.toLowerCase();if(f==="authorization"||f==="x-api-key"||f==="cookie"||f==="set-cookie"||v$(_)){C[_]="[redacted]";continue}C[_]=m0(K)}return C}async function d$($){if(!Y0)return;k$+=1;let C=$.affinity?.trim()||"session-unknown",_=`${new Date().toISOString().replace(/[:.]/g,"-")}-${String(k$).padStart(6,"0")}-${p$(C)}-${HK($)}`,K=y0(),f=M1(K,_),G={body:`${f}.body.json`,metadata:`${f}.meta.json`};if($.payload!==void 0)G.relay=`${f}.relay.json`;if($.request!==void 0)G.request=`${f}.request.json`;try{await h6(K,{recursive:!0});let j={id:_,createdAt:new Date().toISOString(),session:y$(C),transport:$.transport,protocol:$.protocol,mode:$.mode,route:$.route,status:$.status,error:$.error,bodyBytes:$.bodyText.length,relayBytes:$.relayBytes,bodyHash:g$($.bodyText),diff:XK($.previousBodyText,$.bodyText),body:zK($.bodyText),files:G},H=[w0(G.body,$.bodyText),w0(G.metadata,`${JSON.stringify(j,null,2)}
26
+ `)];if($.payload!==void 0&&G.relay)H.push(w0(G.relay,`${JSON.stringify(m0($.payload),null,2)}
27
+ `));if($.request!==void 0&&G.request)H.push(w0(G.request,`${JSON.stringify(m0({...$.request,headers:ZK($.request.headers)}),null,2)}
28
+ `));await Promise.all(H),GK(K,Object.values(G)),M(`dumped request id=${_} session=${y$(C)} body=${G.body} meta=${G.metadata}`)}catch(j){M(`dump failed: ${j instanceof Error?j.message:String(j)}`)}}async function _4($){if(!Y0)return;let C=NK($),_=K0.get(C);await d$({affinity:$.affinity,transport:"direct",route:$.route,status:$.status,error:$.error,bodyText:$.bodyText,previousBodyText:_,request:{url:$.url,method:$.method,headers:$.headers}}),JK(C,$.bodyText)}async function i$($){await d$({affinity:$.affinity,transport:$.transport,protocol:$.protocol,mode:$.mode,status:$.status,bodyText:$.bodyText,previousBodyText:$.previousBodyText,payload:$.payload,relayBytes:$.relayBytes})}var f4="claude-fast";var l0=!1;function G4(){return l0}function j4($){l0=$}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 v0($){return["## Claude Fast Mode Status","",`- Enabled: ${$?.enabled??l0?"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, and claude-opus-4-8",'- 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 H4($){let C=WK($.argumentsText),_=$.enabled??l0;if(C.type==="status")return v0({enabled:_});if(C.type==="enable")return["## Claude Fast Mode Enabled","",v0({enabled:!0})].join(`
30
+ `);if(C.type==="disable")return["## Claude Fast Mode Disabled","",v0({enabled:!1})].join(`
31
+ `);return["## Claude Fast Mode Usage","","Usage: `/claude-fast`, `/claude-fast on`, or `/claude-fast off`.","",v0({enabled:_})].join(`
32
+ `)}var f0="claude-killswitch";function LK($){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 f=C[K]?.match(/^([^:]+):(\d+),(\d+)(?:,(\d+))?$/);if(!f)return{type:"usage"};let[,G,j,H,N]=f,J=typeof N==="string"&&N.length>0?Number.parseInt(N,10):void 0,Z={account:G,fh:Number.parseInt(j,10),sd:Number.parseInt(H,10)};if(J!==void 0)Z.scoped=J;_.push(Z)}if(_.length===0)return{type:"usage"};return{type:"set",entries:_}}return{type:"usage"}}function p0($,C){let _=$.enabled===!0,K=["## Killswitch","",`Status: **${_?"ON":"OFF"}**`];if(_){K.push(""),K.push("| Account | 5h threshold | 1w threshold | Scoped |"),K.push("| ------- | ------------ | ------------ | ------ |");let f=Z0($.main);K.push(`| main | ≥ ${f.five_hour}% | ≥ ${f.seven_day}% | ≤ ${f.scoped}% |`);for(let G of C){let j=Z0($.accounts?.[G]??$.main);K.push(`| ${G} | ≥ ${j.five_hour}% | ≥ ${j.seven_day}% | ≤ ${j.scoped}% |`)}}return K.join(`
33
+ `)}var u$=["## Killswitch Commands","","```",`/${f0} — show status`,`/${f0} on — enable with current or default thresholds`,`/${f0} off — disable`,`/${f0} set all:5,10 — set all accounts to 5h≥5%, 1w≥10%`,`/${f0} set main:3,8,0 — set 5h≥3%, 1w≥8%, scoped≤0%`,`/${f0} set main:3,8 work-alt:5,10 — per-account`,"```"].join(`
34
+ `);function Z4($){let C=LK($.argumentsText);if(C.type==="status")return{text:`${p0($.config,$.accountIds)}
35
+
36
+ ${u$}`};if(C.type==="on"){let K={...$.config,enabled:!0,main:$.config.main??{five_hour:c.five_hour,seven_day:c.seven_day}};return{text:`## Killswitch Enabled
37
+
38
+ ${p0(K,$.accountIds)}`,updatedConfig:K}}if(C.type==="off")return{text:"## Killswitch Disabled",updatedConfig:{...$.config,enabled:!1}};if(C.type==="set"){let K={...$.config.accounts??{}},f={...$.config,enabled:!0,accounts:K};for(let j of C.entries){let H={five_hour:j.fh,seven_day:j.sd};if(j.scoped!==void 0)H.scoped=j.scoped;if(j.account==="main")f.main=H;else if(j.account==="all"){f.main=H;for(let N of $.accountIds)K[N]=H}else K[j.account]=H}return{text:`## Killswitch Updated
39
+
40
+ ${p0(f,$.accountIds)}`,updatedConfig:f}}return{text:`${p0($.config,$.accountIds)}
41
+
42
+ ${u$}`}}var X4="claude-logging",EK=["error","warn","info","debug","trace"];function UK($){let C=$.trim().toLowerCase().split(/\s+/).filter(Boolean);if(C.length===0)return{type:"status"};if(C.length===1&&EK.includes(C[0]))return{type:"level",level:C[0]};return{type:"usage"}}function F1($){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 Y4($){let C=UK($.argumentsText),_=$.level??"info";if(C.type==="status")return F1({level:_});if(C.type==="level")return["## Claude Log Level Updated","",`Level set to \`${C.level}\`.`,"",...F1({level:C.level}).split(`
44
+ `).slice(2)].join(`
45
+ `);return["## Claude Log Level Usage","","Usage: `/claude-logging`, `/claude-logging error|warn|info|debug|trace`.","",...F1({level:_}).split(`
46
+ `).slice(2)].join(`
47
+ `)}var W4="claude-fable-5";var VK=["claude-fable-5","claude-mythos-5"],MK={type:"adaptive",display:"summarized"},L4={input:10,output:50,cacheRead:1,cacheWrite5m:12.5,cacheWrite1h:20},E4=1e6,U4=128000,V4="2026-06-09",M4={["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 s$($){return typeof $==="string"&&VK.some((C)=>$===C||$.startsWith(`${C}-`))}var c$="claude-sonnet-5",F4=MK;function Q4($){return typeof $==="string"&&($===c$||$.startsWith(`${c$}-`))}function b4($){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}}import{createHash as FK}from"node:crypto";var QK=globalThis.setTimeout;function k($){return FK("sha256").update($).digest("hex").slice(0,16)}class d{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!==k($))this.main=null,this.mainTokenFp=null;return this.main}getFallback($,C){let _=this.fallbacks.get($)??null;if(!C||!_)return _;if(this.fallbackTokenFps.get($)!==k(C))return this.fallbacks.delete($),this.fallbackTokenFps.delete($),null;return _}getAllFallbacks(){return this.fallbacks}setMain($,C){this.mainTokenFp=k($),this.main=C}setFallback($,C,_){if(this.fallbacks.set($,C),_)this.fallbackTokenFps.set($,k(_));else this.fallbackTokenFps.delete($)}async refreshMain($){let C=k($);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 _=d.fallbackInflightKey($,C),K=this.inflightFallbacks.get(_);if(K)return K;if(this.isFallbackBackedOff($,C)){let G=this.getFallback($,C);if(G)return G.quota;throw Error("Quota API rate-limited — try again later")}let f=this._fetchFallback($,C);return this.inflightFallbacks.set(_,f),f}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 _=T($.quota,C);return Boolean(_&&this.now()-_.checkedAt>=R(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=Z$(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 _=J$($);if(!_)return;let K=C?k(C):null;if(K&&_.tokenFingerprint&&_.tokenFingerprint!==K)return;let f={quota:_.quota,refreshAfter:J1(_.quota,$,_.checkedAt),checkedAt:_.checkedAt};if(this.main&&this.main.checkedAt>=f.checkedAt&&(!K||!this.mainTokenFp||this.mainTokenFp===K))return;this.main=f,this.mainTokenFp=_.tokenFingerprint??null}seedMainBackoffFromStorage($){let C=$?.quota?.mainLastQuotaApiError;this.mainLastApiError=C&&$0(C,this.now())?C:void 0}seedFallbacksFromAccounts($){let C=R(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 f=this.getFallback(_.id,_.access);if(f&&f.checkedAt>=K)continue;this.setFallback(_.id,{quota:_.quota,refreshAfter:K+C,checkedAt:K},_.access)}}isBackedOff(){return $0(this.mainLastApiError,this.now())}isFallbackBackedOff($,C){if(C){if(this.fallbackErrorTokenFps.get($)!==k(C))return!1}return $0(this.fallbackApiErrors.get($),this.now())}getLastApiError(){return this.mainLastApiError}static API_CALL_GAP_MS=1000;static fallbackInflightKey($,C){return JSON.stringify([$,k(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<d.API_CALL_GAP_MS)await new Promise((f)=>{let G=QK(f,d.API_CALL_GAP_MS-K);if(typeof G==="object"&&"unref"in G)G.unref()});return this.lastApiCallAt=this.now(),$()},_=this.apiGate.then(C,C);return this.apiGate=_.catch(()=>{}),_}async _fetchMain($){let C=k($);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 r({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(),f=await A0({accessToken:$,fetchImpl:this.fetchImpl,now:this.now}),G=this.now();return this.mainTokenFp=k($),this.main={quota:f,refreshAfter:J1(f,this.storage,G),checkedAt:G},this.mainLastApiError=void 0,this.onMainQuotaFetched?.(f,G,this.mainTokenFp,K),f}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 r({name:d.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 A0({accessToken:C,fetchImpl:this.fetchImpl,now:this.now}),f=this.now();return this.setFallback($,{quota:K,refreshAfter:f+R(this.storage),checkedAt:f},C),this.fallbackApiErrors.delete($),this.fallbackErrorTokenFps.delete($),K}finally{await _.release()}}catch(_){throw this._handleFallbackFetchError($,C,_),_}finally{this.inflightFallbacks.delete(d.fallbackInflightKey($,C))}})}static isAuthError($){if($.status===401||j1($))return!0;let _=$ instanceof Error?$.message:String($);return/quota check failed: 401\b/.test(_)}_handleMainFetchError($){if(d.isAuthError($))return;this.mainLastApiError=S0({error:$,now:this.now(),previous:this.mainLastApiError}),this.onApiError?.(this.mainLastApiError)}_handleFallbackFetchError($,C,_){if(d.isAuthError(_))return;let K=k(C),f=this.fallbackErrorTokenFps.get($)===K?this.fallbackApiErrors.get($):void 0;this.fallbackApiErrors.set($,S0({error:_,now:this.now(),previous:f})),this.fallbackErrorTokenFps.set($,K)}}var q4="claude-quota",r$={five_hour:"5h",seven_day:"1w"};function g0($){return`${Math.round($*10)/10}%`}function d0($,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 f=Math.floor(K/60),G=K%60;if(G===0)return`${f}h ago`;return`${f}h ${G}m ago`}function bK($,C){let _=Date.parse($);if(!Number.isFinite(_))return $;let K=_-C;if(K<=0)return"now";let f=Math.max(1,Math.ceil(K/60000));if(f<60)return`in ${f}m`;let G=Math.floor(f/60),j=f%60;if(j===0)return`in ${G}h`;return`in ${G}h ${j}m`}function o$($,C){if(!$)return"";return`, resets ${bK($,C)}`}function n$($,C,_){if(!C)return` - ${r$[$]}: unknown`;return[` - ${r$[$]}: ${g0(C.remainingPercent)} remaining`,` (${g0(C.usedPercent)} used`,`${o$(C.resetsAt,_)}, checked ${d0(C.checkedAt,_)})`].join("")}function DK($,C){return[` - ${$.title}: ${g0($.remainingPercent)} remaining`,` (${g0($.usedPercent)} used`,`${o$($.resetsAt,C)}, checked ${d0($.checkedAt,C)})`].join("")}function BK($){return $.label?.trim()||$.id}function SK($){return $.lastQuotaRefreshError?.message??$.lastRefreshError?.message}function P4($,C=new Map){if(!$?.accounts.length)return[];return $.accounts.filter(y).map((_)=>{let K=C.get(_.id)??SK(_);return{name:BK(_),role:"fallback",enabled:_.enabled!==!1,quota:_.quota,lastRefreshedAt:_.lastRefreshedAt,...K&&{error:K}}})}function I4($){let C=$.now??Date.now(),_=["## Claude Quotas",""];if($.refreshedAt)_.push(`Refreshed: ${d0($.refreshedAt,C)}`,"");if(!$.accounts.length)return _.push("No Claude OAuth accounts found yet."),_.join(`
48
+ `);for(let K of $.accounts){let f=K.role==="main"?"main":"fallback",G=K.enabled===!1?" disabled":"";if(_.push(`### ${K.name} (${f}${G})`),K.lastRefreshedAt)_.push(` - Last token refresh: ${d0(K.lastRefreshedAt,C)}`);if(K.error)_.push(` - Error: ${K.error}`);_.push(n$("five_hour",K.quota?.five_hour,C)),_.push(n$("seven_day",K.quota?.seven_day,C));for(let j of K.quota?.scoped??[])_.push(DK(j,C));_.push("")}return _.join(`
49
+ `).trimEnd()}import{Buffer as fC}from"node:buffer";import{createHash as AK,randomBytes as RK}from"node:crypto";class b1 extends Error{}class D1 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 l=new Map,a=new Map,a$=new Set,qK=7200000,PK=1800000,IK=128,xK=32,t$=0;function Q1(){return t$+=1,`req_${Date.now().toString(36)}_${t$.toString(36)}`}function i0($){if(a$.has($))return;a$.add($),M($)}function m4($){let C=$?.relay;if(!C)return i0("disabled: no relay config found"),null;if(C.enabled!==!0)return i0("disabled: relay.enabled is not true"),null;if(!C.url?.trim()||!C.token?.trim())return i0("disabled: missing relay url or token"),null;let _=C.transport==="http"?"http":"websocket";return i0(`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 y4(){return RK(32).toString("base64url")}function hK($){return`sha256:${AK("sha256").update($).digest("hex")}`}function e$($,C){let _=0,K=Math.min($.length,C.length);while(_<K&&$.charCodeAt(_)===C.charCodeAt(_))_++;let f=$.length,G=C.length;while(f>_&&G>_&&$.charCodeAt(f-1)===C.charCodeAt(G-1))f--,G--;return{start:_,deleteCount:f-_,insert:C.slice(_,G)}}function wK($){return $.deleteCount===0&&$.insert.length===0}function $C($){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 TK($,C,_,K){return`${$.slice(0,C)}${K}${$.slice(_)}`}function GC($,C){let _=$C($),K=$C(C);if(_&&K&&_.start===K.start&&_.end-_.start===K.end-K.start&&_.token!==K.token){let f={start:_.start,deleteCount:_.end-_.start,insert:K.token},G=TK($,_.start,_.end,K.token),j=e$(G,C);return wK(j)?f:[f,j]}return e$($,C)}function kK($,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 mK($){let C={};for(let[_,K]of $.entries()){if(_==="x-session-affinity"||_==="x-opencode-session")continue;C[_]=K}return C}async function CC($,C,_){let K=F(),f=JSON.stringify(C);return G0("http_payload_stringify",{session:Q(C.affinity),ms:I(F()-K),relayBytes:f.length,mode:C.mode}),fetch($.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":$.token},body:f,signal:_??void 0})}function Q($){return $.length>12?`${$.slice(0,12)}…`:$}function F(){return performance.now()}function I($){return Math.round($*10)/10}function yK(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function G0($,C){if(!yK())return;M(`[perf] relay ${$} ${JSON.stringify(C)}`)}function vK($){let{input:C,init:_,headers:K,bodyText:f,affinity:G,previous:j,nextHash:H}=$,N=C instanceof Request?C.url:C.toString(),J={protocol:1,type:"request",affinity:G,upstream:{url:N,method:_?.method||(C instanceof Request?C.method:"POST"),headers:mK(K)},next_hash:H};return j?{...J,mode:"patch",base_hash:j.hash,revision:j.revision+1,patch:GC(j.body,f)}:{...J,mode:"full_sync",revision:1,body:f}}function B1($,C){return{protocol:$.protocol,type:"request",affinity:$.affinity,upstream:$.upstream,next_hash:$.next_hash,mode:"full_sync",revision:1,body:C}}function jC($,C,_,K){let f=Date.now();l.delete($),l.set($,{body:C,hash:_,revision:K,updatedAt:f}),S1(f)}async function _C($){let{config:C,payload:_,bodyText:K,fallback:f,signal:G}=$,j=_,H=await CC(C,j,G);if(H.status===409&&j.mode==="patch")M(`state mismatch from relay session=${Q(j.affinity)}; retrying full_sync`),await H.body?.cancel().catch(()=>{}),j=B1(j,K),H=await CC(C,j,G);if(!H.ok&&H.status>=500&&C.fallbackToDirect)return M(`relay returned ${H.status}; falling back direct session=${Q(j.affinity)}`),await H.body?.cancel().catch(()=>{}),{response:await f(),payload:j,transport:"http",protocol:j.protocol,usedRelay:!1};return{response:H,payload:j,transport:"http",protocol:j.protocol,usedRelay:!0}}function lK($,C){let _=new URL($);return _.protocol=_.protocol==="http:"?"ws:":"wss:",_.pathname="/ws",_.searchParams.set("token",C),_.toString()}function pK($){return new Uint8Array(fC.from($,"base64"))}function gK($){if($ instanceof Uint8Array)return $;if($ instanceof ArrayBuffer)return new Uint8Array($);if(ArrayBuffer.isView($))return new Uint8Array($.buffer,$.byteOffset,$.byteLength);return new Uint8Array(fC.from(String($)))}function dK($){return JSON.parse($)}function KC($){let C=$,_=[`code=${C.code??"unknown"}`,`wasClean=${C.wasClean??"unknown"}`];if(C.reason)_.push(`reason=${JSON.stringify(C.reason)}`);return _.join(" ")}function iK($){let C=$.message||"relay websocket error";return $.status?`relay websocket error ${$.status}: ${C}`:C}class HC{config;affinity;socket;connecting;queue=Promise.resolve();pending;serverState;lastUsedAt=Date.now();constructor($,C){this.config=$,this.affinity=C}touch($=Date.now()){this.lastUsedAt=$}canEvict($=Date.now()){return!this.pending&&!this.connecting&&$-this.lastUsedAt>PK}dispose(){this.socket?.close(),this.socket=void 0,this.serverState=void 0,this.connecting=void 0}send($,C,_=!1){this.touch();let K=F(),f=this.queue.catch(()=>{}).then(()=>this.startQueued($,C,K,_)),G=f.then(async({response:j,getPayload:H})=>({response:await j,payload:H(),transport:"websocket",protocol:2,usedRelay:!0}));return this.queue=f.then(({done:j})=>j.catch(()=>{}),()=>{}),G}async startQueued($,C,_,K){let f=F();await this.ensureConnected();let G=F(),j=l.get(this.affinity),H=this.serverState?.hash,N={...$,protocol:2,id:Q1()};if(N.mode==="patch"&&(!H||H!==N.base_hash))N.mode="full_sync",N.revision=(this.serverState?.revision??0)+1,delete N.base_hash,delete N.patch,N.body=C;if(N.mode==="patch"&&j)N.patch=GC(j.body,C);M(`perf websocket send_start session=${Q(this.affinity)} request=${N.id} mode=${N.mode} queueMs=${I(G-_)} connectMs=${I(G-f)} bodyBytes=${C.length} relayBytes=${JSON.stringify(N).length}`);let J=N,Z=this.sendPayload(N,C,K);Z.done.catch(()=>{});let Y=Z.done,U=Z.response.catch((z)=>{if(!(z instanceof b1)||N.mode!=="patch")throw z;let L=B1(N,C);L.protocol=2,L.id=Q1(),L.revision=(this.serverState?.revision??0)+1,J=L;let O=this.sendPayload(L,C,K);return O.done.catch(()=>{}),Y=O.done,O.response}),W=U.then(()=>Y,()=>Y.catch(()=>{}));return{response:U,done:W,getPayload:()=>J}}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 _=lK(this.config.url,this.config.token),K=new URL(_);K.searchParams.set("affinity",this.affinity);let f=new WebSocket(K.toString());this.socket=f,this.serverState=void 0;let G=setTimeout(()=>{f.close(),C(Error("relay websocket ready timed out"))},15000);f.addEventListener("message",(j)=>{try{if(typeof j.data!=="string"){this.handleBinaryChunk(j.data);return}let H=dK(j.data);if(H.type==="ready"){clearTimeout(G),this.serverState=H.state,$();return}this.handleMessage(H)}catch(H){clearTimeout(G),C(H),this.failPending(H),f.close()}}),f.addEventListener("error",()=>{clearTimeout(G);let j=new D1("relay websocket error");C(j),this.failPending(j)}),f.addEventListener("close",(j)=>{if(clearTimeout(G),this.socket===f)this.socket=void 0,this.serverState=void 0,this.connecting=void 0;if(this.pending){if(this.pending.retryingBeforeResponse)return;let H=this.pending.responseStartedAt!=null,N=H?"closed after response_start before stream bytes":"closed before response";if(this.retryPendingBeforeResponse(this.pending,N,j))return;let J=H?new D1("relay websocket closed during response stream",j):Error("relay websocket closed before response");M(`websocket ${H?"closed during response stream":"closed before response without retry"} session=${Q(this.affinity)} request=${this.pending.payload.id} chunks=${this.pending.streamChunkCount} bytes=${this.pending.streamByteCount} ${KC(j)}`),this.failPending(J)}})}).finally(()=>{this.connecting=void 0}),await this.connecting}sendPayload($,C,_){let K=this.socket;if(!K||K.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");let f=F(),G,j,H=new Promise((J,Z)=>{G=J,j=Z});return{response:new Promise((J,Z)=>{let Y={payload:$,bodyText:C,resolve:J,reject:Z,streamDone:!1,accepted:!1,responseStarted:!1,resolveDone:G,rejectDone:j,sentAt:f,optimisticResponse:_,streamChunkCount:0,streamByteCount:0,retryAttempts:0,retryingBeforeResponse:!1};if(this.pending=Y,this.resetPendingTimeout(Y),K.send(JSON.stringify($)),_)this.resolvePendingResponse(Y,200,"OK",{"content-type":"text/event-stream","x-cortexkit-relay-optimistic":"true"})}),done:H}}resetPendingTimeout($){clearTimeout($.timeout),$.timeout=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,clearTimeout($.timeout);let K=$.retryAttempts,f=$.payload.id;return M(`websocket ${C}; reconnecting and retrying full_sync session=${Q(this.affinity)} request=${f} retry=${K} chunks=${$.streamChunkCount} bytes=${$.streamByteCount}${_?` ${KC(_)}`:""}`),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 G=B1($.payload,$.bodyText);G.protocol=2,G.id=Q1(),G.revision=(this.serverState?.revision??0)+1,$.payload=G,$.accepted=!1,$.acceptedAt=void 0,$.responseStartedAt=void 0,$.sentAt=F(),$.retryingBeforeResponse=!1;let j=this.socket;if(!j||j.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");this.resetPendingTimeout($),M(`perf websocket retry_send session=${Q(this.affinity)} request=${G.id} previous=${f} mode=full_sync retry=${K} bodyBytes=${$.bodyText.length} relayBytes=${JSON.stringify(G).length}`),j.send(JSON.stringify(G))}catch(G){if($.retryingBeforeResponse=!1,this.pending===$)this.failPending(G)}})(),!0}enqueueStreamChunk($,C){$.streamChunkCount+=1,$.streamByteCount+=C.byteLength,$.streamController?.enqueue(C)}handleBinaryChunk($){let C=this.pending;if(!C?.responseStarted)return;this.enqueueStreamChunk(C,gK($))}resolvePendingResponse($,C,_,K){if($.responseStarted)return;$.responseStarted=!0;let f=new ReadableStream({start:(G)=>{$.streamController=G},cancel:()=>{this.socket?.close()}});$.resolve(new Response(f,{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 _=F();C.accepted=!0,C.acceptedAt=_,M(`perf websocket accepted session=${Q(this.affinity)} request=${C.payload.id} sentMs=${I(_-C.sentAt)} mode=${C.payload.mode}`),this.serverState={hash:$.hash,revision:$.revision},jC(this.affinity,C.bodyText,$.hash,$.revision),this.resetPendingTimeout(C);return}if($.type==="response_start"){let _=F();if(C.responseStartedAt=_,M(`perf websocket response_start session=${Q(this.affinity)} request=${C.payload.id} sentMs=${I(_-C.sentAt)} upstreamMs=${C.acceptedAt==null?"unknown":I(_-C.acceptedAt)} status=${$.status}`),clearTimeout(C.timeout),this.resolvePendingResponse(C,$.status,$.statusText,$.headers),C.optimisticResponse&&$.status>=400)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,pK($.base64));return}if($.type==="done"){this.finishPending($);return}if($.type==="error"){if(C.optimisticResponse&&C.responseStartedAt!=null){M(`websocket relay error during optimistic response session=${Q(this.affinity)} request=${C.payload.id} status=${$.status} message=${$.message||"unknown"} chunks=${C.streamChunkCount} bytes=${C.streamByteCount}`),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 b1($.message||"state mismatch"):Error(iK($));this.failPending(_)}}finishPending($){let C=this.pending;if(!C)return;let _=F(),K=$&&"frames"in $?` upstreamChunks=${$.upstreamChunks??"unknown"} upstreamBytes=${$.upstreamBytes??"unknown"} frames=${$.frames} frameBytes=${$.frameBytes??"unknown"}`:"";if(M(`perf websocket done session=${Q(this.affinity)} request=${C.payload.id} sentMs=${I(_-C.sentAt)} streamMs=${C.responseStartedAt==null?"unknown":I(_-C.responseStartedAt)} chunks=${C.streamChunkCount} bytes=${C.streamByteCount}${K}`),clearTimeout(C.timeout),!C.streamDone)C.streamDone=!0,C.streamController?.close();C.resolveDone(),this.pending=void 0}failPending($){let C=this.pending;if(!C)return;if(clearTimeout(C.timeout),this.pending=void 0,C.responseStarted)C.streamController?.error($);else C.reject($);C.rejectDone($)}}function S1($=Date.now()){for(let[C,_]of l)if($-_.updatedAt>qK)l.delete(C);while(l.size>IK){let C=l.keys().next().value;if(C===void 0)break;l.delete(C)}for(let[C,_]of a)if(_.canEvict($))_.dispose(),a.delete(C);while(a.size>xK){let C=!1;for(let[_,K]of a){if(!K.canEvict($))continue;K.dispose(),a.delete(_),C=!0;break}if(!C)break}}function uK($,C){S1();let _=a.get(C);if(_)return _.touch(),_;let K=new HC($,C);return a.set(C,K),S1(),K}async function v4($){let{config:C,input:_,init:K,headers:f,body:G,fallback:j,affinity:H,optimisticResponse:N}=$;if(!C||!kK(_,G))return j();let J=H||f.get("x-session-affinity")||f.get("x-opencode-session");if(!J)return M("skipping relay: missing x-session-affinity header"),j();let Z=G,Y=F(),U=hK(Z);G0("hash_body",{session:Q(J),ms:I(F()-Y),bodyBytes:Z.length});let W=l.get(J),z=F(),L=vK({input:_,init:K,headers:f,bodyText:Z,affinity:J,previous:W,nextHash:U});G0("create_payload",{session:Q(J),ms:I(F()-z),mode:L.mode,bodyBytes:Z.length,previousBytes:W?.body.length});try{let O,x=F();if(C.transport==="websocket")try{O=await uK(C,J).send(L,Z,N===!0)}catch(X){M(`websocket relay failed session=${Q(J)}; trying http relay: ${X instanceof Error?X.message:String(X)}`),O=await _C({config:C,payload:L,bodyText:Z,fallback:j,signal:K?.signal})}else O=await _C({config:C,payload:L,bodyText:Z,fallback:j,signal:K?.signal});if(G0("send",{session:Q(J),ms:I(F()-x),transport:O.transport,protocol:O.protocol,mode:O.payload.mode,status:O.response.status,usedRelay:O.usedRelay}),!O.usedRelay)return O.response;if(O.transport==="http")jC(J,Z,O.payload.next_hash,O.payload.revision);let w=F(),v=JSON.stringify(O.payload).length;G0("payload_stringify",{session:Q(J),ms:I(F()-w),relayBytes:v}),M(`used relay transport=${O.transport} protocol=${O.protocol} mode=${O.payload.mode} status=${O.response.status} session=${Q(J)} bodyBytes=${Z.length} relayBytes=${v}`);let m=F();return await i$({affinity:J,transport:O.transport,protocol:O.protocol,mode:O.payload.mode,status:O.response.status,bodyText:Z,previousBodyText:W?.body,payload:O.payload,relayBytes:v}),G0("dump",{session:Q(J),ms:I(F()-m),enabled:!0}),O.response}catch(O){if(!C.fallbackToDirect)throw M(`relay failed session=${Q(J)} and fallbackToDirect=false: ${O instanceof Error?O.message:String(O)}`),O;return M(`relay failed; falling back direct session=${Q(J)}: ${O instanceof Error?O.message:String(O)}`),j()}}var l4=`
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 d4="claude-routing",A1=["main-first","fallback-first","sticky-balanced"],R1="main-first",NC="Usage: `/claude-routing`, `/claude-routing main-first`, `/claude-routing fallback-first`, `/claude-routing sticky-balanced`, or `/claude-routing reset`.";function cK($){return typeof $==="string"&&A1.includes($)?$:R1}function i4($){return cK($?.routing?.mode)}async function u4($,C=V()){let _=await D(C)??P();return _.routing={..._.routing??{},mode:$},await B(_,C),_}function sK($){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&&A1.includes(C[0]))return{type:"mode",mode:C[0]};if(C.length===2&&C[0]==="mode"&&A1.includes(C[1]))return{type:"mode",mode:C[1]};return{type:"usage"}}function rK($){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 u0($){let C=$?.mode??R1;return["## Claude Routing Status","",`- Mode: \`${C}\``,`- Behavior: ${rK(C)}`,"",NC].join(`
415
+ `)}function c4($){let C=sK($.argumentsText),_=$.mode??R1;if(C.type==="status")return u0({mode:_});if(C.type==="mode")return["## Claude Routing Updated","",`Mode updated to \`${C.mode}\`.`,"",...u0({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.","",...u0({mode:_}).split(`
418
+ `).slice(2)].join(`
419
+ `);return["## Claude Routing Usage","",NC,"",...u0({mode:_}).split(`
420
+ `).slice(2)].join(`
421
+ `)}import{createHash as EC,randomUUID as nK}from"node:crypto";import{mkdir as oK,readFile as aK,rename as tK,rm as eK,stat as $f,writeFile as Cf}from"node:fs/promises";import{basename as _f,dirname as UC,join as Kf}from"node:path";var ff="main",Gf=900000,JC=604800000,jf=3600000,Hf=1e4,Nf=5000,Jf=10,ZC=4096,Zf=0.000001;function q1($){return Boolean($)&&typeof $==="object"&&!Array.isArray($)}function z0($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function Of($){if(!q1($))return;if(typeof $.accountId!=="string"||!["fable","opus","general"].includes(String($.family)))return;let C=z0($.assignedAt),_=z0($.lastSeenAt),K=z0($.initialInputBytes),f=z0($.quotaCheckedAt);if(C===void 0||_===void 0||K===void 0||f===void 0)return;return{accountId:$.accountId,family:$.family,assignedAt:C,lastSeenAt:_,initialInputBytes:Math.max(0,K),quotaCheckedAt:f}}function Xf($){if(!q1($)||$.version!==1||!q1($.assignments))return;let C={};for(let[_,K]of Object.entries($.assignments)){let f=Of(K);if(f)C[_]=f}return{version:1,updatedAt:z0($.updatedAt)??0,assignments:C}}function OC($){return{version:1,updatedAt:$,assignments:{}}}function XC($){return EC("sha256").update($).digest("hex")}function VC($,C,_=Date.now(),K){let f=R(C);if(!["five_hour","seven_day"].every((H)=>{let N=$?.[H];return Boolean(N&&_-N.checkedAt<f)}))return!1;let j=T($,K);return!j||_-j.checkedAt<f}function YC($){return Math.max($.checkedAt??0,$.five_hour?.checkedAt??0,$.seven_day?.checkedAt??0,...($.scoped??[]).map((C)=>C.checkedAt??0))}function zC($,C,_){let K=B0($),f=_==="five_hour"?K.five_hour:_==="seven_day"?K.seven_day:0;if(!H1($))return f;let G=N1($,C===ff?void 0:C);return Math.max(f,G[_])}function WC($,C,_,K){let f=Math.max(0,$-C);if(f<=0)return 0;if(!_)return f;let G=Date.parse(_);if(!Number.isFinite(G)||G<=K)return f;let j=Math.max((G-K)/3600000,0.016666666666666666);return f/j}function e4($){if(s$($))return"fable";return typeof $==="string"&&$.toLowerCase().includes("opus")?"opus":"general"}function LC($){let C=$.now??Date.now(),{candidate:_,storage:K}=$;if(!VC(_.quota,K,C,$.modelId))return 0;let f=[];for(let G of["five_hour","seven_day"]){let j=_.quota[G];if(!j||!Number.isFinite(j.remainingPercent))return 0;f.push(WC(j.remainingPercent,zC(K,_.accountId,G),j.resetsAt,C))}if($.family==="fable"){let G=T(_.quota,$.modelId);if(G&&Number.isFinite(G.remainingPercent))f.push(WC(G.remainingPercent,zC(K,_.accountId,"scoped"),G.resetsAt,C))}return Math.min(...f)}function Yf($,C,_=Date.now()){let K=T($.quota,"claude-fable-5");return Boolean(K&&VC($.quota,C,_,"claude-fable-5")&&Number.isFinite(K.remainingPercent)&&K.remainingPercent<=0)}function $j($){let C=$.now??Date.now();if(!$.quota)return{action:"retain",reason:"unknown"};let _=T($.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 f=$.quota.five_hour;if(f&&Number.isFinite(f.remainingPercent)&&f.remainingPercent<=0){let G=f.resetsAt?Date.parse(f.resetsAt):NaN;if(Number.isFinite(G)&&G>C&&G-C<=Gf)return{action:"hold",reason:"five-hour-short-reset",retryAfterSeconds:Math.max(1,Math.ceil((G-C)/1000))};return{action:"migrate",reason:"five-hour"}}return{action:"retain",reason:"not-exhausted"}}function Cj($){let C=_f($),_=C.endsWith(".json")?C.slice(0,-5):C;return Kf(UC($),`${_}-routing-state.json`)}function _j($,C){let _=EC("sha256").update($).digest().readUInt32BE(0);return Math.max(1,Math.ceil(C))+_%21}class zf{options;loaded=!1;state;stateMtimeNs;touchChain=Promise.resolve();constructor($){this.options=$,this.state=OC(this.now())}now(){return this.options.now?.()??Date.now()}async readState(){try{let $=await aK(this.options.path,"utf8"),C=Xf(JSON.parse($));if(!C)throw Error(`Invalid sticky routing state at ${this.options.path}`);return C}catch($){if($.code==="ENOENT")return OC(this.now());throw $}}async readStateMtimeNs(){try{return(await $f(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 oK(UC(this.options.path),{recursive:!0,mode:448});let $=this.now()+Nf;while(!0){let C=await r({name:"write",path:this.options.path,ttlMs:Hf,renew:!0});if(C)return C;if(this.now()>=$)throw Error("Timed out acquiring sticky routing state lock");await new Promise((_)=>setTimeout(_,Jf))}}assignmentIsActive($){return $.lastSeenAt>=this.now()-(this.options.assignmentTtlMs??JC)}prune($){let C=this.now()-(this.options.assignmentTtlMs??JC);for(let[K,f]of Object.entries($.assignments))if(f.lastSeenAt<C)delete $.assignments[K];let _=Object.entries($.assignments);if(_.length<=ZC)return;_.sort((K,f)=>f[1].lastSeenAt-K[1].lastSeenAt).slice(ZC).forEach(([K])=>{delete $.assignments[K]})}async writeState($){this.prune($),$.updatedAt=this.now();let C=`${this.options.path}.${nK()}.tmp`;try{await Cf(C,`${JSON.stringify($)}
422
+ `,{mode:384}),await tK(C,this.options.path)}finally{await eK(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 f=C.filter((G)=>Yf(G,$.storage,this.now()));if(f.length>0)C=f}let _=C.flatMap((f)=>{let G=LC({candidate:f,family:$.family,modelId:$.modelId,storage:$.storage,now:this.now()});return G>0?[{candidate:f,weight:G}]:[]});if(_.length===0)return;let K=new Map;for(let f of Object.values($.state.assignments)){let G=_.find((j)=>j.candidate.accountId===f.accountId)?.candidate;if(!G)continue;if(f.quotaCheckedAt!==YC(G.quota))continue;K.set(f.accountId,(K.get(f.accountId)??0)+f.initialInputBytes)}return _.map(({candidate:f,weight:G})=>({candidate:f,score:((K.get(f.accountId)??0)+$.inputBytes)/Math.max(G,Zf)})).sort((f,G)=>f.score-G.score||f.candidate.order-G.candidate.order||f.candidate.accountId.localeCompare(G.candidate.accountId))[0]?.candidate}async resolve($){if(!$.sessionId)return null;await this.refreshStateIfChanged();let C=XC($.sessionId),_=this.state.assignments[C];if(_&&this.assignmentIsActive(_)&&$.retainAccountIds.has(_.accountId)&&!$.excludeAccountIds?.has(_.accountId)){if(this.now()-_.lastSeenAt>=jf)_.lastSeenAt=this.now(),this.scheduleTouch(C);return{accountId:_.accountId,assignment:{..._},created:!1,migrated:!1}}let K=await this.acquireLock();try{let f=await this.readState();this.prune(f);let G=f.assignments[C];if(G&&$.retainAccountIds.has(G.accountId)&&!$.excludeAccountIds?.has(G.accountId))return G.lastSeenAt=this.now(),await this.writeState(f),{accountId:G.accountId,assignment:{...G},created:!1,migrated:!1};let j=$.candidates.filter((Y)=>!$.excludeAccountIds?.has(Y.accountId)),N=($.preferredAccountId?j.find((Y)=>Y.accountId===$.preferredAccountId&&LC({candidate:Y,family:$.family,modelId:$.modelId,storage:$.storage,now:this.now()})>0):void 0)??this.selectCandidate({...$,candidates:j,state:f});if(!N){if(G)delete f.assignments[C],await this.writeState(f);return null}let J=this.now(),Z={accountId:N.accountId,family:$.family,assignedAt:J,lastSeenAt:J,initialInputBytes:Math.max(1,$.inputBytes),quotaCheckedAt:YC(N.quota)};return f.assignments[C]=Z,await this.writeState(f),{accountId:N.accountId,assignment:{...Z},created:!G,migrated:Boolean(G&&G.accountId!==N.accountId)}}finally{await K.release()}}async clear($){if(!$)return;let C=XC($),_=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{Wf as a,w1 as b,Lf as c,Ef as d,Uf as e,Vf as f,Mf as g,T1 as h,Ff as i,Qf as j,g1 as k,Af as l,Rf as m,y as n,mf as o,PC as p,yf as q,V as r,P as s,D as t,B as u,O_ as v,r as w,vf as x,Y_ as y,lf as z,pf as A,gf as B,df as C,uf as D,cf as E,sf as F,rf as G,nf as H,of as I,af as J,tf as K,N$ as L,V_ as M,ef as N,j0 as O,e0 as P,$G as Q,CG as R,_G as S,J$ as T,T as U,F_ as V,o1 as W,O$ as X,H1 as Y,N1 as Z,KG as _,fG as $,GG as aa,jG as ba,HG as ca,NG as da,JG as ea,ZG as fa,J1 as ga,x_ as ha,YG as ia,zG as ja,WG as ka,LG as la,m_ as ma,EG as na,D$ as oa,qG as pa,FG as qa,QG as ra,bG as sa,M$ as ta,wG as ua,TG as va,z6 as wa,x0 as xa,h0 as ya,I$ as za,W6 as Aa,kG as Ba,U6 as Ca,gG as Da,R6 as Ea,iG as Fa,q6 as Ga,P6 as Ha,uG as Ia,eG as Ja,$4 as Ka,jK as La,C4 as Ma,_4 as Na,f4 as Oa,G4 as Pa,j4 as Qa,WK as Ra,H4 as Sa,f0 as Ta,Z4 as Ua,X4 as Va,UK as Wa,Y4 as Xa,W4 as Ya,MK as Za,L4 as _a,E4 as $a,U4 as ab,V4 as bb,M4 as cb,s$ as db,F4 as eb,Q4 as fb,b4 as gb,d as hb,q4 as ib,P4 as jb,I4 as kb,m4 as lb,y4 as mb,v4 as nb,l4 as ob,d4 as pb,i4 as qb,u4 as rb,sK as sb,c4 as tb,ff as ub,VC as vb,e4 as wb,$j as xb,Cj as yb,_j as zb,zf as Ab};