@cortexkit/opencode-anthropic-auth 1.19.1 → 1.20.0

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