@cortexkit/opencode-anthropic-auth 1.6.1 → 1.7.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.
package/README.md CHANGED
@@ -333,7 +333,7 @@ Modes:
333
333
 
334
334
  - `explicit` keeps OpenCode's explicit cache breakpoints and adds `ttl: "1h"` to them.
335
335
  - `automatic` removes block-level cache controls and sends a top-level `cache_control` object.
336
- - `hybrid` (recommended) removes top-level automatic caching and uses explicit anchors on the first two messages plus a moving latest-user boundary. It keeps the last stable system block in normal turns, and uses that slot for the previous user boundary when a tool-heavy step would exceed Anthropic's 20-block lookback.
336
+ - `hybrid` (recommended) removes top-level automatic caching and uses explicit anchors for Magic Context's leading history plus a moving latest-user boundary. When the first message has multiple cacheable content blocks, hybrid anchors both the first and last block so a stable leading history block remains cached even if a volatile trailing block changes; otherwise it anchors the first two messages. It keeps the last stable system block in normal turns, and uses that slot for the previous user boundary when a tool-heavy step would exceed Anthropic's 20-block lookback.
337
337
 
338
338
  In OpenCode, subagent requests do not receive 1-hour TTL caching. The plugin detects child sessions through OpenCode's `x-parent-session-id` header, strips that internal header before forwarding to Anthropic, and leaves default ephemeral caching in place for those requests.
339
339
 
@@ -477,7 +477,7 @@ When enabled, the plugin writes artifacts under the OS temp directory:
477
477
  ls "$(node -p 'require("node:os").tmpdir()')/opencode-anthropic-auth-dumps"
478
478
  ```
479
479
 
480
- Each request gets:
480
+ Each filename includes a sanitized session/affinity segment so dumps from different sessions are easier to find. Each request gets:
481
481
 
482
482
  - `*.body.json` — final rewritten Anthropic request body.
483
483
  - `*.relay.json` — redacted relay payload/frame metadata.
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{Aa as k,m as y,n as w,p as l,q as u,r as m,ya as b}from"./index-vmrz4qdc.js";import{stdin as A,stdout as $}from"node:process";import{createInterface as R}from"node:readline/promises";function v(){return{version:1,main:{type:"opencode",provider:"anthropic"},fallbackOn:[401,403,429],refresh:{enabled:!0,intervalMinutes:10,refreshBeforeExpiryMinutes:240},quota:{enabled:!0,checkIntervalMinutes:5,minimumRemaining:{five_hour:10,seven_day:20},failClosedOnUnknownQuota:!0},accounts:[]}}function h(){console.log(`Usage:
2
+ import{Aa as k,m as y,n as w,p as l,q as u,r as m,ya as b}from"./index-ykvgffhr.js";import{stdin as A,stdout as $}from"node:process";import{createInterface as R}from"node:readline/promises";function v(){return{version:1,main:{type:"opencode",provider:"anthropic"},fallbackOn:[401,403,429],refresh:{enabled:!0,intervalMinutes:10,refreshBeforeExpiryMinutes:240},quota:{enabled:!0,checkIntervalMinutes:5,minimumRemaining:{five_hour:10,seven_day:20},failClosedOnUnknownQuota:!0},accounts:[]}}function h(){console.log(`Usage:
3
3
  opencode-anthropic-auth login [label]
4
4
  opencode-anthropic-auth list
5
5
  opencode-anthropic-auth relay setup
@@ -1,48 +1,48 @@
1
- var r="9d1c250a-e61b-44d9-88ed-5944d1962f5e",cf={console:"https://platform.claude.com/oauth/authorize",max:"https://claude.ai/oauth/authorize"},Kf="https://platform.claude.com/oauth/code/callback",Ff="https://platform.claude.com/v1/oauth/token",sf=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"],q_="mcp_";var rf="fast-mode-2026-02-01";function I_(f,m){let _=(f??"").split(",").map(($)=>$.trim()).filter(Boolean);return[...new Set([..._,...m])].join(",")}function i_(f){return typeof f==="string"&&(f.startsWith("claude-opus-4-6")||f.startsWith("claude-opus-4-7")||f.startsWith("claude-opus-4-8"))}var T_="You are OpenCode",w_="You are a Claude agent, built on Anthropic's Claude Agent SDK.",l_=["<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 x="2.1.141",Lf="67b",of="sdk-cli",af="0.94.0",ef="v24.3.0",fm="claude-cli/2.1.141 (external, sdk-cli)",mm=["explicit","automatic","hybrid"],o="explicit",y_=["github.com/anomalyco/opencode","opencode.ai/docs"],k_=[{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 _m(f){let m="";for(let _ of f)m+=String.fromCharCode(_);return btoa(m).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function $m(){let f=new Uint8Array(64);crypto.getRandomValues(f);let m=_m(f),_=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(m));return{verifier:m,challenge:_m(new Uint8Array(_)),method:"S256"}}function N0(f){if(!f)return;let m=Number(f);if(Number.isFinite(m)&&m>0)return Math.ceil(m);let _=Date.parse(f);if(Number.isFinite(_)){let $=Math.ceil((_-Date.now())/1000);return $>0?$:void 0}return}class P extends Error{status;body;retryAfter;constructor(f,m,_){super(`Claude OAuth refresh failed: ${f} — ${m}`);this.status=f,this.body=m,this.name="ClaudeOAuthRefreshError",this.retryAfter=N0(_??void 0)}}function H0(f){if(!(f instanceof Error))return!1;let m=f.code;return f.message.includes("fetch failed")||m==="ECONNRESET"||m==="ECONNREFUSED"||m==="ETIMEDOUT"||m==="UND_ERR_CONNECT_TIMEOUT"}async function Dm(f){let m=f.fetchImpl??fetch,_=f.maxRetries??2,$=f.baseDelayMs??500;for(let D=0;D<=_;D++)try{if(D>0){let S=$*2**(D-1);await new Promise((N)=>setTimeout(N,S))}let C=await m(Ff,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":"axios/1.13.6"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:f.refreshToken,client_id:r})});if(!C.ok){if(C.status>=500&&D<_){await C.body?.cancel().catch(()=>{});continue}let S=await C.text().catch(()=>"");throw new P(C.status,S,C.headers.get("retry-after"))}let E=await C.json(),M=f.now?.()??Date.now();return{access:E.access_token,refresh:E.refresh_token??f.refreshToken,expires:M+E.expires_in*1000,expiresIn:E.expires_in}}catch(C){if(C instanceof P)throw C;if(D<_&&H0(C))continue;throw C}throw Error("Token refresh exhausted all retries")}function U0(){return crypto.randomUUID().replace(/-/g,"")}function j0(f){let m=f.trim();try{let E=new URL(m),M=E.searchParams.get("code"),S=E.searchParams.get("state");if(M&&S)return{code:M,state:S}}catch{}let _=m.split("#");if(_.length===2&&_[0]&&_[1])return{code:_[0],state:_[1]};let $=new URLSearchParams(m),D=$.get("code"),C=$.get("state");if(D&&C)return{code:D,state:C};return null}async function K0(f,m,_){let $=await fetch(Ff,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":"axios/1.13.6"},body:JSON.stringify({code:f.code,state:f.state,grant_type:"authorization_code",client_id:r,redirect_uri:_,code_verifier:m})});if(!$.ok)return{type:"failed"};let D=await $.json();return{type:"success",refresh:D.refresh_token,access:D.access_token,expires:Date.now()+D.expires_in*1000}}async function n_(f){let m=await $m(),_=U0(),$=new URL(cf[f],import.meta.url);return $.searchParams.set("code","true"),$.searchParams.set("client_id",r),$.searchParams.set("response_type","code"),$.searchParams.set("redirect_uri",Kf),$.searchParams.set("scope",sf.join(" ")),$.searchParams.set("code_challenge",m.challenge),$.searchParams.set("code_challenge_method","S256"),$.searchParams.set("state",_),{url:$.toString(),redirectUri:Kf,state:_,verifier:m.verifier}}async function g_(f,m,_,$){let D=j0(f);if(!D)return{type:"failed"};if($&&D.state!==$)return{type:"failed"};return K0(D,m,_)}import*as Cm from"node:fs";import*as Em from"node:os";import*as Mm from"node:path";var F0=Mm.join(Em.tmpdir(),"opencode-anthropic-auth.log"),Sm=!1,L0=500,O0=50,p=[],l=null;function Of(){if(l)clearTimeout(l),l=null;if(p.length===0)return;let f=p.join("");p=[];try{Cm.appendFileSync(F0,f)}catch{}}function G0(){if(l)return;l=setTimeout(()=>{l=null,Of()},L0)}function J0(f){if(f===void 0)return"";if(f instanceof Error)return` ${f.message}${f.stack?`
1
+ var r="9d1c250a-e61b-44d9-88ed-5944d1962f5e",cf={console:"https://platform.claude.com/oauth/authorize",max:"https://claude.ai/oauth/authorize"},Kf="https://platform.claude.com/oauth/code/callback",Ff="https://platform.claude.com/v1/oauth/token",sf=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"],I_="mcp_";var rf="fast-mode-2026-02-01";function i_(f,m){let _=(f??"").split(",").map(($)=>$.trim()).filter(Boolean);return[...new Set([..._,...m])].join(",")}function T_(f){return typeof f==="string"&&(f.startsWith("claude-opus-4-6")||f.startsWith("claude-opus-4-7")||f.startsWith("claude-opus-4-8"))}var l_="You are OpenCode",w_="You are a Claude agent, built on Anthropic's Claude Agent SDK.",y_=["<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 x="2.1.141",Lf="67b",of="sdk-cli",af="0.94.0",ef="v24.3.0",fm="claude-cli/2.1.141 (external, sdk-cli)",mm=["explicit","automatic","hybrid"],o="explicit",k_=["github.com/anomalyco/opencode","opencode.ai/docs"],p_=[{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 _m(f){let m="";for(let _ of f)m+=String.fromCharCode(_);return btoa(m).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function $m(){let f=new Uint8Array(64);crypto.getRandomValues(f);let m=_m(f),_=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(m));return{verifier:m,challenge:_m(new Uint8Array(_)),method:"S256"}}function N0(f){if(!f)return;let m=Number(f);if(Number.isFinite(m)&&m>0)return Math.ceil(m);let _=Date.parse(f);if(Number.isFinite(_)){let $=Math.ceil((_-Date.now())/1000);return $>0?$:void 0}return}class P extends Error{status;body;retryAfter;constructor(f,m,_){super(`Claude OAuth refresh failed: ${f} — ${m}`);this.status=f,this.body=m,this.name="ClaudeOAuthRefreshError",this.retryAfter=N0(_??void 0)}}function H0(f){if(!(f instanceof Error))return!1;let m=f.code;return f.message.includes("fetch failed")||m==="ECONNRESET"||m==="ECONNREFUSED"||m==="ETIMEDOUT"||m==="UND_ERR_CONNECT_TIMEOUT"}async function Dm(f){let m=f.fetchImpl??fetch,_=f.maxRetries??2,$=f.baseDelayMs??500;for(let D=0;D<=_;D++)try{if(D>0){let S=$*2**(D-1);await new Promise((N)=>setTimeout(N,S))}let C=await m(Ff,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":"axios/1.13.6"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:f.refreshToken,client_id:r})});if(!C.ok){if(C.status>=500&&D<_){await C.body?.cancel().catch(()=>{});continue}let S=await C.text().catch(()=>"");throw new P(C.status,S,C.headers.get("retry-after"))}let E=await C.json(),M=f.now?.()??Date.now();return{access:E.access_token,refresh:E.refresh_token??f.refreshToken,expires:M+E.expires_in*1000,expiresIn:E.expires_in}}catch(C){if(C instanceof P)throw C;if(D<_&&H0(C))continue;throw C}throw Error("Token refresh exhausted all retries")}function U0(){return crypto.randomUUID().replace(/-/g,"")}function j0(f){let m=f.trim();try{let E=new URL(m),M=E.searchParams.get("code"),S=E.searchParams.get("state");if(M&&S)return{code:M,state:S}}catch{}let _=m.split("#");if(_.length===2&&_[0]&&_[1])return{code:_[0],state:_[1]};let $=new URLSearchParams(m),D=$.get("code"),C=$.get("state");if(D&&C)return{code:D,state:C};return null}async function K0(f,m,_){let $=await fetch(Ff,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/plain, */*","User-Agent":"axios/1.13.6"},body:JSON.stringify({code:f.code,state:f.state,grant_type:"authorization_code",client_id:r,redirect_uri:_,code_verifier:m})});if(!$.ok)return{type:"failed"};let D=await $.json();return{type:"success",refresh:D.refresh_token,access:D.access_token,expires:Date.now()+D.expires_in*1000}}async function g_(f){let m=await $m(),_=U0(),$=new URL(cf[f],import.meta.url);return $.searchParams.set("code","true"),$.searchParams.set("client_id",r),$.searchParams.set("response_type","code"),$.searchParams.set("redirect_uri",Kf),$.searchParams.set("scope",sf.join(" ")),$.searchParams.set("code_challenge",m.challenge),$.searchParams.set("code_challenge_method","S256"),$.searchParams.set("state",_),{url:$.toString(),redirectUri:Kf,state:_,verifier:m.verifier}}async function t_(f,m,_,$){let D=j0(f);if(!D)return{type:"failed"};if($&&D.state!==$)return{type:"failed"};return K0(D,m,_)}import*as Cm from"node:fs";import*as Em from"node:os";import*as Mm from"node:path";var F0=Mm.join(Em.tmpdir(),"opencode-anthropic-auth.log"),Sm=!1,L0=500,O0=50,p=[],w=null;function Of(){if(w)clearTimeout(w),w=null;if(p.length===0)return;let f=p.join("");p=[];try{Cm.appendFileSync(F0,f)}catch{}}function G0(){if(w)return;w=setTimeout(()=>{w=null,Of()},L0)}function J0(f){if(f===void 0)return"";if(f instanceof Error)return` ${f.message}${f.stack?`
3
3
  ${f.stack}`:""}`;return` ${JSON.stringify(f)}`}function Y(f,m){if(Sm)return;try{if(p.push(`[${new Date().toISOString()}] ${f}${J0(m)}
4
- `),p.length>=O0)Of();else G0()}catch{}}function j(f,m){Y(`[relay] ${f}`,m)}if(!Sm)process.on("exit",Of);import{createHash as Lm,randomUUID as zf}from"node:crypto";import{mkdir as B0,readFile as a,rename as z0,rm as bm,stat as A0,writeFile as Bf}from"node:fs/promises";import{homedir as W0}from"node:os";import{dirname as V0,join as e}from"node:path";var X0=globalThis.setTimeout.bind(globalThis),h0=globalThis.clearTimeout.bind(globalThis),Z0="anthropic-auth.json",Y0="https://api.anthropic.com/api/oauth/usage",Q0=[401,403,429],Om=240,x0=Om;var R0=300000,P0=3600000,q0=86400000,I0=60000,i0=900000,T0=300000,w0=5,Nm={five_hour:0,seven_day:0},l0=!0,y0=60000,k0=60000,p0=600000,u0=1e4,v0=100;function d0(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return e(process.env.XDG_CONFIG_HOME||e(W0(),".config"),"opencode")}function B(){return process.env.OPENCODE_ANTHROPIC_AUTH_FILE?.trim()||e(d0(),Z0)}function G(f){return f!=null&&typeof f==="object"&&!Array.isArray(f)}function n0(f){if(!G(f))return null;if(f.type!=="oauth")return null;if(typeof f.refresh!=="string"||!f.refresh.trim())return null;return{id:typeof f.id==="string"&&f.id.trim()?f.id.trim():zf(),label:typeof f.label==="string"?f.label:void 0,type:"oauth",access:typeof f.access==="string"?f.access:void 0,refresh:f.refresh,expires:typeof f.expires==="number"?f.expires:void 0,enabled:typeof f.enabled==="boolean"?f.enabled:void 0,addedAt:typeof f.addedAt==="number"?f.addedAt:void 0,lastUsed:typeof f.lastUsed==="number"?f.lastUsed:void 0,lastRefreshedAt:typeof f.lastRefreshedAt==="number"?f.lastRefreshedAt:void 0,lastRefreshError:Hm(f.lastRefreshError),lastQuotaRefreshError:Hm(f.lastQuotaRefreshError),quota:g0(f.quota)}}function Hm(f){if(!G(f))return;if(typeof f.message!=="string")return;let m=Number(f.checkedAt);if(!Number.isFinite(m))return;let _=Number(f.nextRetryAt),$=Number(f.retryCount);return{message:f.message,checkedAt:m,nextRetryAt:Number.isFinite(_)?_:void 0,retryCount:Number.isFinite($)?$:void 0,tokenHash:typeof f.tokenHash==="string"?f.tokenHash:void 0}}function g0(f){if(!G(f))return;let m={};for(let _ of["five_hour","seven_day"]){let $=f[_];if(!G($))continue;let D=Number($.usedPercent),C=Number($.remainingPercent),E=Number($.checkedAt);if(!Number.isFinite(D)||!Number.isFinite(C)||!Number.isFinite(E))continue;m[_]={usedPercent:D,remainingPercent:C,checkedAt:E,resetsAt:typeof $.resetsAt==="string"?$.resetsAt:void 0}}return Object.keys(m).length?m:void 0}function t0(f){if(!G(f)||!Array.isArray(f.accounts))return null;return{version:1,main:{type:"opencode",provider:"anthropic"},routing:G(f.routing)?f.routing:void 0,fallbackOn:Array.isArray(f.fallbackOn)?f.fallbackOn.filter((m)=>Number.isInteger(m)):void 0,refresh:G(f.refresh)?f.refresh:void 0,quota:G(f.quota)?f.quota:void 0,claudeCache:G(f.claudeCache)?f.claudeCache:void 0,dump:G(f.dump)?f.dump:void 0,claudeFast:G(f.claudeFast)?f.claudeFast:void 0,cacheKeep:G(f.cacheKeep)?f.cacheKeep:void 0,relay:G(f.relay)?f.relay:void 0,killswitch:G(f.killswitch)?f.killswitch:void 0,accounts:f.accounts.map(n0).filter((m)=>m!=null)}}async function h(f=B()){try{let m=await a(f,"utf8");return t0(JSON.parse(m))}catch(m){if(m.code==="ENOENT")return null;return null}}async function c0(f){try{let m=await a(f,"utf8"),_=JSON.parse(m);return G(_)?_:{}}catch{return{}}}function s0(f){return Object.fromEntries(Object.entries(f).filter(([,m])=>m!==void 0))}async function Z(f,m=B()){await B0(V0(m),{recursive:!0});let $={...await c0(m),...s0(f)},D=`${m}.${zf()}.tmp`;await Bf(D,`${JSON.stringify($,null,2)}
5
- `,{encoding:"utf8",mode:384}),await z0(D,m)}async function Af(f){let _=`${f.path??B()}.${f.name}.lock`,$=e(_,"owner.json"),D=zf(),C=f.now??Date.now,E=null,M=!1;async function S(){try{return JSON.parse(await a(_,"utf8"))}catch(F){if(F.code!=="EISDIR")throw F;return JSON.parse(await a($,"utf8"))}}async function N(){await Bf(_,`${JSON.stringify({ownerId:D,expiresAt:C()+f.ttlMs})}
6
- `,{encoding:"utf8",mode:384})}async function H(){try{return await Bf(_,`${JSON.stringify({ownerId:D,expiresAt:C()+f.ttlMs})}
7
- `,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(F){let L=F.code;if(L==="EEXIST"||L==="EISDIR")return!1;throw F}}function K(){if(!f.renew||M)return;let F=f.renewIntervalMs??Math.max(1000,Math.floor(f.ttlMs/3));if(E=X0(()=>{(async()=>{try{let L=await S(),U=C();if(M||L?.ownerId!==D||Number(L?.expiresAt)<=U)return;await N(),K()}catch{}})()},F),"unref"in E)E.unref()}if(!await H()){try{let F=await S();if(Number(F?.expiresAt)>C())return null}catch{try{if((await A0(_)).mtimeMs+f.ttlMs>Date.now())return null}catch{return null}}if(await bm(_,{recursive:!0,force:!0}).catch(()=>{}),!await H())return null}return K(),{release:async()=>{if(M=!0,E)h0(E),E=null;try{if((await S())?.ownerId!==D)return}catch{return}await bm(_,{recursive:!0,force:!0}).catch(()=>{})}}}function _$(f){return f?.claudeCache?.enabled===!0}function r0(f){return typeof f==="string"&&mm.includes(f)?f:o}function o0(f){return r0(f?.claudeCache?.mode)}async function $$(f,m,_=B()){let $=await h(_)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return $.claudeCache={...$.claudeCache??{},enabled:f,mode:m??o0($)},await Z($,_),$}async function D$(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.claudeCache={..._.claudeCache??{},enabled:_.claudeCache?.enabled===!0,mode:f},await Z(_,m),_}function C$(f){return f?.dump?.enabled===!0}async function E$(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.dump={..._.dump??{},enabled:f},await Z(_,m),_}function M$(f){return f?.claudeFast?.enabled===!0}async function S$(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.claudeFast={..._.claudeFast??{},enabled:f},await Z(_,m),_}async function b$(f,m,_=B()){let $=await h(_)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return $.cacheKeep={enabled:!0,startHour:f,endHour:m},await Z($,_),$}async function N$(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.cacheKeep={..._.cacheKeep??{},enabled:f},await Z(_,m),_}function a0(f){return f?.fallbackOn?.length?f.fallbackOn:Q0}function H$(f,m){return a0(m).includes(f)}function Gm(f){let m=f?.quota?.minimumRemaining||{};return{five_hour:m.five_hour??m["5h"]??Nm.five_hour,seven_day:m.seven_day??m["1w"]??Nm.seven_day}}function v(f){return f?.quota?.enabled!==!1}function e0(f){return f?.refresh?.enabled!==!1}function f1(f){return Math.floor(Math.random()*Math.max(0,f))}function m1(f){let m=f?.refresh?.refreshBeforeExpiryMinutes??x0;return Math.max(Om,m)*60000}function Jm(f){return Lm("sha256").update(f).digest("hex")}function _1(f){if(f instanceof P)return f.status===429||f.status>=500;if(!(f instanceof Error))return!1;return f.message.includes("fetch failed")||"code"in f&&(f.code==="ECONNRESET"||f.code==="ECONNREFUSED"||f.code==="ETIMEDOUT"||f.code==="UND_ERR_CONNECT_TIMEOUT")}function $1(f){let m=Jm(f.refreshToken),$=(f.previous?.tokenHash===m?f.previous.retryCount??0:0)+1,D;if(f.error instanceof P&&f.error.retryAfter)D=f.error.retryAfter*1000;else if(_1(f.error))D=Math.min(P0,R0*2**Math.min($-1,6));else D=q0;return{message:d(f.error),checkedAt:f.now,nextRetryAt:f.now+D,retryCount:$,tokenHash:m}}function u(f,m,_){if(!f?.nextRetryAt||f.nextRetryAt<=_)return!1;if(!m)return!0;return f.tokenHash===Jm(m)}function Gf(f,m){return`Claude OAuth refresh is backed off for ${Math.max(1,Math.ceil(((f.nextRetryAt??m)-m)/1000))}s after: ${f.message}`}function ff(f){let _=(f.previous?.retryCount??0)+1,$=Wm(f.error)?Math.min(i0,I0*2**Math.min(_-1,6)):T0;return{message:d(f.error),checkedAt:f.now,nextRetryAt:f.now+$,retryCount:_}}function y(f,m){if(!f?.nextRetryAt||f.nextRetryAt<=m)return!1;return!0}function U$(f,m){return`Quota API backed off for ${Math.max(1,Math.ceil(((f.nextRetryAt??m)-m)/1000))}s after: ${f.message}`}function V(f){let m=f?.quota?.checkIntervalMinutes??w0;return Math.max(1,m)*60000}function Bm(f){if(!f?.quota?.mainQuota||!f.quota.mainQuotaCheckedAt)return null;return{quota:f.quota.mainQuota,checkedAt:f.quota.mainQuotaCheckedAt,tokenFingerprint:f.quota.mainQuotaToken}}function zm(f){let m=f?.quota?.refreshEveryNRequests;return typeof m==="number"&&Number.isFinite(m)&&m>0?Math.floor(m):0}function Wf(f){return f?.quota?.failClosedOnUnknownQuota??l0}function Am(f,m){if(!v(m))return!0;let _=Gm(m);for(let $ of["five_hour","seven_day"]){let D=f?.[$];if(!D)return!Wf(m);if(D.remainingPercent<_[$])return!1}return!0}var X={five_hour:5,seven_day:10};function Um(f){return{five_hour:f?.five_hour??f?.["5h"]??X.five_hour,seven_day:f?.seven_day??f?.["1w"]??X.seven_day}}function D1(f){return f?.killswitch?.enabled===!0}function C1(f,m){if(!f?.killswitch)return X;if(m&&f.killswitch.accounts?.[m])return Um(f.killswitch.accounts[m]);return Um(f.killswitch.main)}function j$(f,m,_){if(!D1(m))return!0;let $=C1(m,_),D=!1;for(let C of["five_hour","seven_day"]){let E=f?.[C];if(!E){D=!0;continue}if(E.remainingPercent<$[C])return!1}if(D)return!Wf(m);return!0}function K$(f,m,_){let $=[],D=[f,...m.map((C)=>C.quota)];for(let C of D)for(let E of["five_hour","seven_day"]){let M=C?.[E]?.resetsAt;if(!M)continue;let S=Date.parse(M);if(Number.isFinite(S)&&S>_)$.push(S)}if(!$.length)return 300;return Math.max(1,Math.ceil((Math.min(...$)-_)/1000))+60}function F$(f){return f?.killswitch??{enabled:!1}}async function L$(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.killswitch=f,await Z(_,m),_}function Vf(f,m,_){if(!v(m))return _+V(m);let $=Gm(m),D=[];for(let C of["five_hour","seven_day"]){let E=f?.[C];if(!E)return _+V(m);if(E.remainingPercent>=$[C])continue;let M=E.resetsAt?Date.parse(E.resetsAt):Number.NaN;if(!Number.isFinite(M)||M<=_)return _+V(m);D.push(M)}if(!D.length)return _+V(m);return Math.min(...D)+60000}function q(f,m,_){return!f.access||!f.expires||f.expires-_<=m1(m)}function Jf(f,m,_){if(!v(m))return!1;let $=V(m);return["five_hour","seven_day"].some((D)=>{let C=f.quota?.[D];return!C||_-C.checkedAt>=$})}function E1(f,m){if(!f)return!1;if(!f.resetsAt)return!0;let _=Date.parse(f.resetsAt);return!Number.isFinite(_)||_>m}function M1(f,m){return["five_hour","seven_day"].every((_)=>E1(f?.[_],m))}function Wm(f){let m=d(f);if(/Claude quota check failed: (429|5\d\d)\b/.test(m))return!0;if(!(f instanceof Error))return!1;let _=f.code;return m.includes("fetch failed")||_==="ECONNRESET"||_==="ECONNREFUSED"||_==="ETIMEDOUT"||_==="UND_ERR_CONNECT_TIMEOUT"}function S1(f,m,_,$){return Wm(_)&&Am(f.quota,m)&&M1(f.quota,$)}function jm(f){if(!Number.isFinite(f))return 0;if(f<0)return 0;if(f>100)return 100;return f}function Km(f,m){if(typeof f?.utilization!=="number")return;let _=jm(f.utilization);return{usedPercent:_,remainingPercent:jm(100-_),resetsAt:f.resets_at,checkedAt:m}}async function mf(f){let _=await(f.fetchImpl??fetch)(Y0,{method:"GET",headers:{Authorization:`Bearer ${f.accessToken}`,Accept:"application/json","Content-Type":"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":`claude-code/${x}`}});if(!_.ok){let C=await _.text().catch(()=>"");throw Error(`Claude quota check failed: ${_.status} — ${C}`)}let $=f.now?.()??Date.now(),D=await _.json();return{five_hour:Km(D.five_hour,$),seven_day:Km(D.seven_day,$)}}function W(f,m){let _=f.accounts.findIndex(($)=>$.id===m.id);if(_>=0)f.accounts[_]=m}function d(f){return f instanceof Error?f.message:String(f)}function Vm(f,m,_){f.lastRefreshError=$1({error:m,now:_,refreshToken:f.refresh,previous:f.lastRefreshError})}function Fm(f,m,_){if(f.lastQuotaRefreshError=ff({error:m,now:_,previous:f.lastQuotaRefreshError}),m instanceof P)Vm(f,m,_)}function b1(f){return`fallback-oauth-refresh-${Lm("sha256").update(f).digest("hex").slice(0,16)}`}class N1{now;fetchImpl;configPath;refreshPromises=new Map;refreshTimer=null;quotaTimer=null;quotaManager;onFallbackStorageChanged;constructor(f={}){this.now=f.now??Date.now,this.fetchImpl=f.fetchImpl??fetch,this.configPath=f.configPath??B(),this.quotaManager=f.quotaManager??null,this.onFallbackStorageChanged=f.onFallbackStorageChanged}seedFallbackQuota(f,m){if(!this.quotaManager)return;if(this.quotaManager.getFallback(f.id,f.access))return;if(!f.quota)return;let _=Math.max(f.quota.five_hour?.checkedAt??0,f.quota.seven_day?.checkedAt??0);if(_<=0)return;let $=V(m);this.quotaManager.setFallback(f.id,{quota:f.quota,refreshAfter:_+$,checkedAt:_},f.access)}async load(){return h(this.configPath)}async save(f){await Z(f,this.configPath)}startBackgroundRefresh(){let f=async()=>{await this.refreshDueAccounts(),await this.refreshQuotaForDueAccounts()};if(f().catch(()=>{}),!this.refreshTimer){if(this.refreshTimer=setInterval(()=>{f().catch(()=>{})},y0+f1(k0)),"unref"in this.refreshTimer)this.refreshTimer.unref()}}stopBackgroundRefresh(){if(this.refreshTimer)clearInterval(this.refreshTimer);if(this.quotaTimer)clearInterval(this.quotaTimer);this.refreshTimer=null,this.quotaTimer=null}async getUsableFallbackAccounts(f){let m=f!==void 0?f:await this.load();if(!m)return[];let _=[],$=!1;for(let D of m.accounts){if(D.enabled===!1)continue;try{let C=D;if(q(C,m,this.now())){let M=C.lastRefreshError;if(M&&u(M,C.refresh,this.now()))throw Error(Gf(M,this.now()));C=await this.refreshAccount(C,m),$=!0}if(this.seedFallbackQuota(C,m),(this.quotaManager?this.quotaManager.isFallbackStale(C.id,C.access):Jf(C,m,this.now()))&&!y(C.lastQuotaRefreshError,this.now()))C=await this.refreshAccountQuota(C,m),$=!0;if(this.accountPassesQuotaPolicy(this.quotaPolicyAccount(C),m))_.push(C)}catch(C){if(S1(D,m,C,this.now()))Y("[refresh] fallback quota using cached quota after refresh error",{accountId:D.id,error:d(C)}),_.push(D);else if(!Wf(m))_.push(D)}}if($)await this.save(m);return _}async markUsed(f){let m=await this.load();if(!m)return;let _=m.accounts.find(($)=>$.id===f.id);if(!_)return;_.lastUsed=this.now(),await this.save(m)}accountPassesQuotaPolicy(f,m){return Am(f.quota,m)}quotaPolicyAccount(f){if(!this.quotaManager)return f;let m=this.quotaManager.getFallback(f.id,f.access)?.quota;return m?{...f,quota:m}:f}async refreshDueAccounts(){let f=await this.load();if(!f||!e0(f))return;let m=!1;for(let _ of f.accounts){if(_.enabled===!1)continue;if(!q(_,f,this.now()))continue;if(u(_.lastRefreshError,_.refresh,this.now()))continue;try{Y("[refresh] fallback oauth background due",{accountId:_.id,expiresInMs:_.expires?_.expires-this.now():void 0}),await this.refreshAccount(_,f),m=!0}catch($){Y("[refresh] fallback oauth background failed",{accountId:_.id,error:$ instanceof Error?$.message:String($)}),Vm(_,$,this.now()),W(f,_),m=!0}}if(m)await this.save(f)}async refreshQuotaForDueAccounts(){let f=await this.load();if(!f||!v(f))return;let m=!1;for(let _ of f.accounts){if(_.enabled===!1)continue;let $=_;try{if(q($,f,this.now())){if(u($.lastRefreshError,$.refresh,this.now()))continue;$=await this.refreshAccount($,f),m=!0}if(y($.lastQuotaRefreshError,this.now()))continue;if(this.seedFallbackQuota($,f),!(this.quotaManager?this.quotaManager.isFallbackStale($.id,$.access):Jf($,f,this.now())))continue;await this.refreshAccountQuota($,f),m=!0}catch(D){Fm(_,D,this.now()),W(f,_),m=!0}}if(m)await this.save(f),this.onFallbackStorageChanged?.()}async refreshQuotaForAllAccounts(f={}){let m=await this.load(),_=[];if(!m||!v(m))return{storage:m,errors:_};let $=f.force??!1,D=!1;for(let C of m.accounts){if(C.enabled===!1)continue;let E=C;try{if(q(E,m,this.now())){let M=E.lastRefreshError;if(M&&u(M,E.refresh,this.now()))throw Error(Gf(M,this.now()));E=await this.refreshAccount(E,m),D=!0}if(!$&&!Jf(E,m,this.now())){if(E.lastQuotaRefreshError)E.lastQuotaRefreshError=void 0,W(m,E),D=!0;continue}await this.refreshAccountQuota(E,m),D=!0}catch(M){Fm(C,M,this.now()),W(m,C),D=!0,_.push({accountId:C.id,message:d(M)})}}if(D)await this.save(m);return{storage:m,errors:_}}async refreshAccount(f,m,_={}){let $=this.refreshPromises.get(f.id);if($){let E=await $;return W(m,E),E}let D=this.refreshAccountNow(f,m,_).finally(()=>{this.refreshPromises.delete(f.id)});this.refreshPromises.set(f.id,D);let C=await D;return W(m,C),C}async waitForConcurrentFallbackRefresh(f,m,_,$){let D=Date.now()+u0;while(Date.now()<D){await new Promise((N)=>setTimeout(N,v0));let C=await this.load(),E=C?.accounts.find((N)=>N.id===f.id);if(!E)continue;if((E.access!==_.access||E.refresh!==_.refresh||(E.expires??0)>(_.expires??0)+60000)&&($.force||!q(E,C,this.now())))return W(m,E),Y("[refresh] fallback oauth joined concurrent refresh",{accountId:E.id,expiresInMs:E.expires?E.expires-this.now():void 0}),E;let S=E.lastRefreshError;if(S&&u(S,E.refresh,this.now()))throw W(m,E),Error(Gf(S,this.now()))}return null}async refreshAccountNow(f,m,_){let $=await this.load(),D=$?.accounts.find((M)=>M.id===f.id);if(D&&!_.force&&!q(D,$,this.now()))return W(m,D),D;let C=D??f,E=await Af({name:b1(C.id),ttlMs:p0,path:this.configPath,now:this.now,renew:!0});if(!E){Y("[refresh] fallback oauth refresh skipped file lock",{accountId:C.id});let M=await this.waitForConcurrentFallbackRefresh(f,m,C,_);if(M)return M;throw Error("Fallback OAuth refresh is already in progress")}try{if($=await this.load(),D=$?.accounts.find((N)=>N.id===f.id),D&&!_.force&&!q(D,$,this.now()))return W(m,D),D;C=D??C;let M=C.refresh;Y("[refresh] fallback oauth refresh request start",{accountId:C.id,force:_.force===!0,expiresInMs:C.expires?C.expires-this.now():void 0});let S=await Dm({refreshToken:M,fetchImpl:this.fetchImpl,now:this.now});return C.access=S.access,C.refresh=S.refresh,C.expires=S.expires,C.lastRefreshedAt=S.expires-S.expiresIn*1000,C.lastRefreshError=void 0,W(m,C),await this.save(m),Y("[refresh] fallback oauth refresh succeeded",{accountId:C.id,expiresInMs:C.expires?C.expires-this.now():void 0}),C}finally{await E.release()}}async refreshAccountQuota(f,m){let _=f;if(!_.access)throw Error(`Fallback account ${f.id} has no access token`);let $=(D)=>this.quotaManager?this.quotaManager.refreshFallback(_.id,D):mf({accessToken:D,fetchImpl:this.fetchImpl,now:this.now});try{_.quota=await $(_.access)}catch(D){if(!(D instanceof Error?D.message:String(D)).includes("Claude quota check failed: 401"))throw D;if(_=await this.refreshAccount(f,m,{force:!0}),!_.access)throw D;_.quota=await $(_.access)}if(_.lastQuotaRefreshError=void 0,W(m,_),this.quotaManager&&_.quota){let D=this.now();this.quotaManager.setFallback(_.id,{quota:_.quota,refreshAfter:D+V(m),checkedAt:D},_.access)}return _}}var J$="claude-cache",Xm="## Claude Cache Status",H1="## Claude Cache Enabled",U1="## Claude Cache Disabled",j1="## Claude Cache Usage",K1="Usage: `/claude-cache`, `/claude-cache on`, `/claude-cache off`, or `/claude-cache mode explicit|automatic|hybrid`.",_f=!1,$f=o;function B$(){return _f}function z$(){return $f}function A$(f){_f=f.enabled,$f=f.mode}function F1(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};if(m.length===2&&m[0]==="mode"&&(m[1]==="explicit"||m[1]==="automatic"||m[1]==="hybrid"))return{type:"mode",mode:m[1]};return{type:"usage"}}function n(f){let m=f?.enabled??_f,_=f?.mode??$f;return[Xm,"",`- Enabled: ${m?"enabled":"disabled"}`,`- Mode: ${_}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: main sessions only; subagent sessions keep default ephemeral cache behavior","- Modes: explicit = existing OpenCode breakpoints; automatic = top-level cache_control only; hybrid = system + messages[0] + top-level cache_control","- TTL: 1h when enabled for main sessions; default ephemeral cache behavior otherwise"].join(`
8
- `)}function W$(f){let m=F1(f.argumentsText),_=f.enabled??_f,$=f.mode??$f;if(m.type==="status")return n({enabled:_,mode:$});if(m.type==="enable")return[H1,"",n({enabled:!0,mode:$})].join(`
4
+ `),p.length>=O0)Of();else G0()}catch{}}function j(f,m){Y(`[relay] ${f}`,m)}if(!Sm)process.on("exit",Of);import{createHash as Lm,randomUUID as Af}from"node:crypto";import{mkdir as z0,readFile as a,rename as A0,rm as bm,stat as B0,writeFile as zf}from"node:fs/promises";import{homedir as W0}from"node:os";import{dirname as V0,join as e}from"node:path";var h0=globalThis.setTimeout.bind(globalThis),X0=globalThis.clearTimeout.bind(globalThis),Z0="anthropic-auth.json",Y0="https://api.anthropic.com/api/oauth/usage",Q0=[401,403,429],Om=240,x0=Om;var R0=300000,P0=3600000,q0=86400000,I0=60000,i0=900000,T0=300000,l0=5,Nm={five_hour:0,seven_day:0},w0=!0,y0=60000,k0=60000,p0=600000,u0=1e4,v0=100;function d0(){if(process.env.OPENCODE_CONFIG_DIR?.trim())return process.env.OPENCODE_CONFIG_DIR.trim();return e(process.env.XDG_CONFIG_HOME||e(W0(),".config"),"opencode")}function z(){return process.env.OPENCODE_ANTHROPIC_AUTH_FILE?.trim()||e(d0(),Z0)}function G(f){return f!=null&&typeof f==="object"&&!Array.isArray(f)}function n0(f){if(!G(f))return null;if(f.type!=="oauth")return null;if(typeof f.refresh!=="string"||!f.refresh.trim())return null;return{id:typeof f.id==="string"&&f.id.trim()?f.id.trim():Af(),label:typeof f.label==="string"?f.label:void 0,type:"oauth",access:typeof f.access==="string"?f.access:void 0,refresh:f.refresh,expires:typeof f.expires==="number"?f.expires:void 0,enabled:typeof f.enabled==="boolean"?f.enabled:void 0,addedAt:typeof f.addedAt==="number"?f.addedAt:void 0,lastUsed:typeof f.lastUsed==="number"?f.lastUsed:void 0,lastRefreshedAt:typeof f.lastRefreshedAt==="number"?f.lastRefreshedAt:void 0,lastRefreshError:Hm(f.lastRefreshError),lastQuotaRefreshError:Hm(f.lastQuotaRefreshError),quota:g0(f.quota)}}function Hm(f){if(!G(f))return;if(typeof f.message!=="string")return;let m=Number(f.checkedAt);if(!Number.isFinite(m))return;let _=Number(f.nextRetryAt),$=Number(f.retryCount);return{message:f.message,checkedAt:m,nextRetryAt:Number.isFinite(_)?_:void 0,retryCount:Number.isFinite($)?$:void 0,tokenHash:typeof f.tokenHash==="string"?f.tokenHash:void 0}}function g0(f){if(!G(f))return;let m={};for(let _ of["five_hour","seven_day"]){let $=f[_];if(!G($))continue;let D=Number($.usedPercent),C=Number($.remainingPercent),E=Number($.checkedAt);if(!Number.isFinite(D)||!Number.isFinite(C)||!Number.isFinite(E))continue;m[_]={usedPercent:D,remainingPercent:C,checkedAt:E,resetsAt:typeof $.resetsAt==="string"?$.resetsAt:void 0}}return Object.keys(m).length?m:void 0}function t0(f){if(!G(f)||!Array.isArray(f.accounts))return null;return{version:1,main:{type:"opencode",provider:"anthropic"},routing:G(f.routing)?f.routing:void 0,fallbackOn:Array.isArray(f.fallbackOn)?f.fallbackOn.filter((m)=>Number.isInteger(m)):void 0,refresh:G(f.refresh)?f.refresh:void 0,quota:G(f.quota)?f.quota:void 0,claudeCache:G(f.claudeCache)?f.claudeCache:void 0,dump:G(f.dump)?f.dump:void 0,claudeFast:G(f.claudeFast)?f.claudeFast:void 0,cacheKeep:G(f.cacheKeep)?f.cacheKeep:void 0,relay:G(f.relay)?f.relay:void 0,killswitch:G(f.killswitch)?f.killswitch:void 0,accounts:f.accounts.map(n0).filter((m)=>m!=null)}}async function X(f=z()){try{let m=await a(f,"utf8");return t0(JSON.parse(m))}catch(m){if(m.code==="ENOENT")return null;return null}}async function c0(f){try{let m=await a(f,"utf8"),_=JSON.parse(m);return G(_)?_:{}}catch{return{}}}function s0(f){return Object.fromEntries(Object.entries(f).filter(([,m])=>m!==void 0))}async function Z(f,m=z()){await z0(V0(m),{recursive:!0});let $={...await c0(m),...s0(f)},D=`${m}.${Af()}.tmp`;await zf(D,`${JSON.stringify($,null,2)}
5
+ `,{encoding:"utf8",mode:384}),await A0(D,m)}async function Bf(f){let _=`${f.path??z()}.${f.name}.lock`,$=e(_,"owner.json"),D=Af(),C=f.now??Date.now,E=null,M=!1;async function S(){try{return JSON.parse(await a(_,"utf8"))}catch(F){if(F.code!=="EISDIR")throw F;return JSON.parse(await a($,"utf8"))}}async function N(){await zf(_,`${JSON.stringify({ownerId:D,expiresAt:C()+f.ttlMs})}
6
+ `,{encoding:"utf8",mode:384})}async function H(){try{return await zf(_,`${JSON.stringify({ownerId:D,expiresAt:C()+f.ttlMs})}
7
+ `,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(F){let L=F.code;if(L==="EEXIST"||L==="EISDIR")return!1;throw F}}function K(){if(!f.renew||M)return;let F=f.renewIntervalMs??Math.max(1000,Math.floor(f.ttlMs/3));if(E=h0(()=>{(async()=>{try{let L=await S(),U=C();if(M||L?.ownerId!==D||Number(L?.expiresAt)<=U)return;await N(),K()}catch{}})()},F),"unref"in E)E.unref()}if(!await H()){try{let F=await S();if(Number(F?.expiresAt)>C())return null}catch{try{if((await B0(_)).mtimeMs+f.ttlMs>Date.now())return null}catch{return null}}if(await bm(_,{recursive:!0,force:!0}).catch(()=>{}),!await H())return null}return K(),{release:async()=>{if(M=!0,E)X0(E),E=null;try{if((await S())?.ownerId!==D)return}catch{return}await bm(_,{recursive:!0,force:!0}).catch(()=>{})}}}function $$(f){return f?.claudeCache?.enabled===!0}function r0(f){return typeof f==="string"&&mm.includes(f)?f:o}function o0(f){return r0(f?.claudeCache?.mode)}async function D$(f,m,_=z()){let $=await X(_)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return $.claudeCache={...$.claudeCache??{},enabled:f,mode:m??o0($)},await Z($,_),$}async function C$(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.claudeCache={..._.claudeCache??{},enabled:_.claudeCache?.enabled===!0,mode:f},await Z(_,m),_}function E$(f){return f?.dump?.enabled===!0}async function M$(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.dump={..._.dump??{},enabled:f},await Z(_,m),_}function S$(f){return f?.claudeFast?.enabled===!0}async function b$(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.claudeFast={..._.claudeFast??{},enabled:f},await Z(_,m),_}async function N$(f,m,_=z()){let $=await X(_)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return $.cacheKeep={enabled:!0,startHour:f,endHour:m},await Z($,_),$}async function H$(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.cacheKeep={..._.cacheKeep??{},enabled:f},await Z(_,m),_}function a0(f){return f?.fallbackOn?.length?f.fallbackOn:Q0}function U$(f,m){return a0(m).includes(f)}function Gm(f){let m=f?.quota?.minimumRemaining||{};return{five_hour:m.five_hour??m["5h"]??Nm.five_hour,seven_day:m.seven_day??m["1w"]??Nm.seven_day}}function v(f){return f?.quota?.enabled!==!1}function e0(f){return f?.refresh?.enabled!==!1}function f1(f){return Math.floor(Math.random()*Math.max(0,f))}function m1(f){let m=f?.refresh?.refreshBeforeExpiryMinutes??x0;return Math.max(Om,m)*60000}function Jm(f){return Lm("sha256").update(f).digest("hex")}function _1(f){if(f instanceof P)return f.status===429||f.status>=500;if(!(f instanceof Error))return!1;return f.message.includes("fetch failed")||"code"in f&&(f.code==="ECONNRESET"||f.code==="ECONNREFUSED"||f.code==="ETIMEDOUT"||f.code==="UND_ERR_CONNECT_TIMEOUT")}function $1(f){let m=Jm(f.refreshToken),$=(f.previous?.tokenHash===m?f.previous.retryCount??0:0)+1,D;if(f.error instanceof P&&f.error.retryAfter)D=f.error.retryAfter*1000;else if(_1(f.error))D=Math.min(P0,R0*2**Math.min($-1,6));else D=q0;return{message:d(f.error),checkedAt:f.now,nextRetryAt:f.now+D,retryCount:$,tokenHash:m}}function u(f,m,_){if(!f?.nextRetryAt||f.nextRetryAt<=_)return!1;if(!m)return!0;return f.tokenHash===Jm(m)}function Gf(f,m){return`Claude OAuth refresh is backed off for ${Math.max(1,Math.ceil(((f.nextRetryAt??m)-m)/1000))}s after: ${f.message}`}function ff(f){let _=(f.previous?.retryCount??0)+1,$=Wm(f.error)?Math.min(i0,I0*2**Math.min(_-1,6)):T0;return{message:d(f.error),checkedAt:f.now,nextRetryAt:f.now+$,retryCount:_}}function y(f,m){if(!f?.nextRetryAt||f.nextRetryAt<=m)return!1;return!0}function j$(f,m){return`Quota API backed off for ${Math.max(1,Math.ceil(((f.nextRetryAt??m)-m)/1000))}s after: ${f.message}`}function V(f){let m=f?.quota?.checkIntervalMinutes??l0;return Math.max(1,m)*60000}function zm(f){if(!f?.quota?.mainQuota||!f.quota.mainQuotaCheckedAt)return null;return{quota:f.quota.mainQuota,checkedAt:f.quota.mainQuotaCheckedAt,tokenFingerprint:f.quota.mainQuotaToken}}function Am(f){let m=f?.quota?.refreshEveryNRequests;return typeof m==="number"&&Number.isFinite(m)&&m>0?Math.floor(m):0}function Wf(f){return f?.quota?.failClosedOnUnknownQuota??w0}function Bm(f,m){if(!v(m))return!0;let _=Gm(m);for(let $ of["five_hour","seven_day"]){let D=f?.[$];if(!D)return!Wf(m);if(D.remainingPercent<_[$])return!1}return!0}var h={five_hour:5,seven_day:10};function Um(f){return{five_hour:f?.five_hour??f?.["5h"]??h.five_hour,seven_day:f?.seven_day??f?.["1w"]??h.seven_day}}function D1(f){return f?.killswitch?.enabled===!0}function C1(f,m){if(!f?.killswitch)return h;if(m&&f.killswitch.accounts?.[m])return Um(f.killswitch.accounts[m]);return Um(f.killswitch.main)}function K$(f,m,_){if(!D1(m))return!0;let $=C1(m,_),D=!1;for(let C of["five_hour","seven_day"]){let E=f?.[C];if(!E){D=!0;continue}if(E.remainingPercent<$[C])return!1}if(D)return!Wf(m);return!0}function F$(f,m,_){let $=[],D=[f,...m.map((C)=>C.quota)];for(let C of D)for(let E of["five_hour","seven_day"]){let M=C?.[E]?.resetsAt;if(!M)continue;let S=Date.parse(M);if(Number.isFinite(S)&&S>_)$.push(S)}if(!$.length)return 300;return Math.max(1,Math.ceil((Math.min(...$)-_)/1000))+60}function L$(f){return f?.killswitch??{enabled:!1}}async function O$(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.killswitch=f,await Z(_,m),_}function Vf(f,m,_){if(!v(m))return _+V(m);let $=Gm(m),D=[];for(let C of["five_hour","seven_day"]){let E=f?.[C];if(!E)return _+V(m);if(E.remainingPercent>=$[C])continue;let M=E.resetsAt?Date.parse(E.resetsAt):Number.NaN;if(!Number.isFinite(M)||M<=_)return _+V(m);D.push(M)}if(!D.length)return _+V(m);return Math.min(...D)+60000}function q(f,m,_){return!f.access||!f.expires||f.expires-_<=m1(m)}function Jf(f,m,_){if(!v(m))return!1;let $=V(m);return["five_hour","seven_day"].some((D)=>{let C=f.quota?.[D];return!C||_-C.checkedAt>=$})}function E1(f,m){if(!f)return!1;if(!f.resetsAt)return!0;let _=Date.parse(f.resetsAt);return!Number.isFinite(_)||_>m}function M1(f,m){return["five_hour","seven_day"].every((_)=>E1(f?.[_],m))}function Wm(f){let m=d(f);if(/Claude quota check failed: (429|5\d\d)\b/.test(m))return!0;if(!(f instanceof Error))return!1;let _=f.code;return m.includes("fetch failed")||_==="ECONNRESET"||_==="ECONNREFUSED"||_==="ETIMEDOUT"||_==="UND_ERR_CONNECT_TIMEOUT"}function S1(f,m,_,$){return Wm(_)&&Bm(f.quota,m)&&M1(f.quota,$)}function jm(f){if(!Number.isFinite(f))return 0;if(f<0)return 0;if(f>100)return 100;return f}function Km(f,m){if(typeof f?.utilization!=="number")return;let _=jm(f.utilization);return{usedPercent:_,remainingPercent:jm(100-_),resetsAt:f.resets_at,checkedAt:m}}async function mf(f){let _=await(f.fetchImpl??fetch)(Y0,{method:"GET",headers:{Authorization:`Bearer ${f.accessToken}`,Accept:"application/json","Content-Type":"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":`claude-code/${x}`}});if(!_.ok){let C=await _.text().catch(()=>"");throw Error(`Claude quota check failed: ${_.status} — ${C}`)}let $=f.now?.()??Date.now(),D=await _.json();return{five_hour:Km(D.five_hour,$),seven_day:Km(D.seven_day,$)}}function W(f,m){let _=f.accounts.findIndex(($)=>$.id===m.id);if(_>=0)f.accounts[_]=m}function d(f){return f instanceof Error?f.message:String(f)}function Vm(f,m,_){f.lastRefreshError=$1({error:m,now:_,refreshToken:f.refresh,previous:f.lastRefreshError})}function Fm(f,m,_){if(f.lastQuotaRefreshError=ff({error:m,now:_,previous:f.lastQuotaRefreshError}),m instanceof P)Vm(f,m,_)}function b1(f){return`fallback-oauth-refresh-${Lm("sha256").update(f).digest("hex").slice(0,16)}`}class N1{now;fetchImpl;configPath;refreshPromises=new Map;refreshTimer=null;quotaTimer=null;quotaManager;onFallbackStorageChanged;constructor(f={}){this.now=f.now??Date.now,this.fetchImpl=f.fetchImpl??fetch,this.configPath=f.configPath??z(),this.quotaManager=f.quotaManager??null,this.onFallbackStorageChanged=f.onFallbackStorageChanged}seedFallbackQuota(f,m){if(!this.quotaManager)return;if(this.quotaManager.getFallback(f.id,f.access))return;if(!f.quota)return;let _=Math.max(f.quota.five_hour?.checkedAt??0,f.quota.seven_day?.checkedAt??0);if(_<=0)return;let $=V(m);this.quotaManager.setFallback(f.id,{quota:f.quota,refreshAfter:_+$,checkedAt:_},f.access)}async load(){return X(this.configPath)}async save(f){await Z(f,this.configPath)}startBackgroundRefresh(){let f=async()=>{await this.refreshDueAccounts(),await this.refreshQuotaForDueAccounts()};if(f().catch(()=>{}),!this.refreshTimer){if(this.refreshTimer=setInterval(()=>{f().catch(()=>{})},y0+f1(k0)),"unref"in this.refreshTimer)this.refreshTimer.unref()}}stopBackgroundRefresh(){if(this.refreshTimer)clearInterval(this.refreshTimer);if(this.quotaTimer)clearInterval(this.quotaTimer);this.refreshTimer=null,this.quotaTimer=null}async getUsableFallbackAccounts(f){let m=f!==void 0?f:await this.load();if(!m)return[];let _=[],$=!1;for(let D of m.accounts){if(D.enabled===!1)continue;try{let C=D;if(q(C,m,this.now())){let M=C.lastRefreshError;if(M&&u(M,C.refresh,this.now()))throw Error(Gf(M,this.now()));C=await this.refreshAccount(C,m),$=!0}if(this.seedFallbackQuota(C,m),(this.quotaManager?this.quotaManager.isFallbackStale(C.id,C.access):Jf(C,m,this.now()))&&!y(C.lastQuotaRefreshError,this.now()))C=await this.refreshAccountQuota(C,m),$=!0;if(this.accountPassesQuotaPolicy(this.quotaPolicyAccount(C),m))_.push(C)}catch(C){if(S1(D,m,C,this.now()))Y("[refresh] fallback quota using cached quota after refresh error",{accountId:D.id,error:d(C)}),_.push(D);else if(!Wf(m))_.push(D)}}if($)await this.save(m);return _}async markUsed(f){let m=await this.load();if(!m)return;let _=m.accounts.find(($)=>$.id===f.id);if(!_)return;_.lastUsed=this.now(),await this.save(m)}accountPassesQuotaPolicy(f,m){return Bm(f.quota,m)}quotaPolicyAccount(f){if(!this.quotaManager)return f;let m=this.quotaManager.getFallback(f.id,f.access)?.quota;return m?{...f,quota:m}:f}async refreshDueAccounts(){let f=await this.load();if(!f||!e0(f))return;let m=!1;for(let _ of f.accounts){if(_.enabled===!1)continue;if(!q(_,f,this.now()))continue;if(u(_.lastRefreshError,_.refresh,this.now()))continue;try{Y("[refresh] fallback oauth background due",{accountId:_.id,expiresInMs:_.expires?_.expires-this.now():void 0}),await this.refreshAccount(_,f),m=!0}catch($){Y("[refresh] fallback oauth background failed",{accountId:_.id,error:$ instanceof Error?$.message:String($)}),Vm(_,$,this.now()),W(f,_),m=!0}}if(m)await this.save(f)}async refreshQuotaForDueAccounts(){let f=await this.load();if(!f||!v(f))return;let m=!1;for(let _ of f.accounts){if(_.enabled===!1)continue;let $=_;try{if(q($,f,this.now())){if(u($.lastRefreshError,$.refresh,this.now()))continue;$=await this.refreshAccount($,f),m=!0}if(y($.lastQuotaRefreshError,this.now()))continue;if(this.seedFallbackQuota($,f),!(this.quotaManager?this.quotaManager.isFallbackStale($.id,$.access):Jf($,f,this.now())))continue;await this.refreshAccountQuota($,f),m=!0}catch(D){Fm(_,D,this.now()),W(f,_),m=!0}}if(m)await this.save(f),this.onFallbackStorageChanged?.()}async refreshQuotaForAllAccounts(f={}){let m=await this.load(),_=[];if(!m||!v(m))return{storage:m,errors:_};let $=f.force??!1,D=!1;for(let C of m.accounts){if(C.enabled===!1)continue;let E=C;try{if(q(E,m,this.now())){let M=E.lastRefreshError;if(M&&u(M,E.refresh,this.now()))throw Error(Gf(M,this.now()));E=await this.refreshAccount(E,m),D=!0}if(!$&&!Jf(E,m,this.now())){if(E.lastQuotaRefreshError)E.lastQuotaRefreshError=void 0,W(m,E),D=!0;continue}await this.refreshAccountQuota(E,m),D=!0}catch(M){Fm(C,M,this.now()),W(m,C),D=!0,_.push({accountId:C.id,message:d(M)})}}if(D)await this.save(m);return{storage:m,errors:_}}async refreshAccount(f,m,_={}){let $=this.refreshPromises.get(f.id);if($){let E=await $;return W(m,E),E}let D=this.refreshAccountNow(f,m,_).finally(()=>{this.refreshPromises.delete(f.id)});this.refreshPromises.set(f.id,D);let C=await D;return W(m,C),C}async waitForConcurrentFallbackRefresh(f,m,_,$){let D=Date.now()+u0;while(Date.now()<D){await new Promise((N)=>setTimeout(N,v0));let C=await this.load(),E=C?.accounts.find((N)=>N.id===f.id);if(!E)continue;if((E.access!==_.access||E.refresh!==_.refresh||(E.expires??0)>(_.expires??0)+60000)&&($.force||!q(E,C,this.now())))return W(m,E),Y("[refresh] fallback oauth joined concurrent refresh",{accountId:E.id,expiresInMs:E.expires?E.expires-this.now():void 0}),E;let S=E.lastRefreshError;if(S&&u(S,E.refresh,this.now()))throw W(m,E),Error(Gf(S,this.now()))}return null}async refreshAccountNow(f,m,_){let $=await this.load(),D=$?.accounts.find((M)=>M.id===f.id);if(D&&!_.force&&!q(D,$,this.now()))return W(m,D),D;let C=D??f,E=await Bf({name:b1(C.id),ttlMs:p0,path:this.configPath,now:this.now,renew:!0});if(!E){Y("[refresh] fallback oauth refresh skipped file lock",{accountId:C.id});let M=await this.waitForConcurrentFallbackRefresh(f,m,C,_);if(M)return M;throw Error("Fallback OAuth refresh is already in progress")}try{if($=await this.load(),D=$?.accounts.find((N)=>N.id===f.id),D&&!_.force&&!q(D,$,this.now()))return W(m,D),D;C=D??C;let M=C.refresh;Y("[refresh] fallback oauth refresh request start",{accountId:C.id,force:_.force===!0,expiresInMs:C.expires?C.expires-this.now():void 0});let S=await Dm({refreshToken:M,fetchImpl:this.fetchImpl,now:this.now});return C.access=S.access,C.refresh=S.refresh,C.expires=S.expires,C.lastRefreshedAt=S.expires-S.expiresIn*1000,C.lastRefreshError=void 0,W(m,C),await this.save(m),Y("[refresh] fallback oauth refresh succeeded",{accountId:C.id,expiresInMs:C.expires?C.expires-this.now():void 0}),C}finally{await E.release()}}async refreshAccountQuota(f,m){let _=f;if(!_.access)throw Error(`Fallback account ${f.id} has no access token`);let $=(D)=>this.quotaManager?this.quotaManager.refreshFallback(_.id,D):mf({accessToken:D,fetchImpl:this.fetchImpl,now:this.now});try{_.quota=await $(_.access)}catch(D){if(!(D instanceof Error?D.message:String(D)).includes("Claude quota check failed: 401"))throw D;if(_=await this.refreshAccount(f,m,{force:!0}),!_.access)throw D;_.quota=await $(_.access)}if(_.lastQuotaRefreshError=void 0,W(m,_),this.quotaManager&&_.quota){let D=this.now();this.quotaManager.setFallback(_.id,{quota:_.quota,refreshAfter:D+V(m),checkedAt:D},_.access)}return _}}var z$="claude-cache",hm="## Claude Cache Status",H1="## Claude Cache Enabled",U1="## Claude Cache Disabled",j1="## Claude Cache Usage",K1="Usage: `/claude-cache`, `/claude-cache on`, `/claude-cache off`, or `/claude-cache mode explicit|automatic|hybrid`.",_f=!1,$f=o;function A$(){return _f}function B$(){return $f}function W$(f){_f=f.enabled,$f=f.mode}function F1(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};if(m.length===2&&m[0]==="mode"&&(m[1]==="explicit"||m[1]==="automatic"||m[1]==="hybrid"))return{type:"mode",mode:m[1]};return{type:"usage"}}function n(f){let m=f?.enabled??_f,_=f?.mode??$f;return[hm,"",`- Enabled: ${m?"enabled":"disabled"}`,`- Mode: ${_}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: main sessions only; subagent sessions keep default ephemeral cache behavior","- Modes: explicit = existing OpenCode breakpoints; automatic = top-level cache_control only; hybrid = system + messages[0] + top-level cache_control","- TTL: 1h when enabled for main sessions; default ephemeral cache behavior otherwise"].join(`
8
+ `)}function V$(f){let m=F1(f.argumentsText),_=f.enabled??_f,$=f.mode??$f;if(m.type==="status")return n({enabled:_,mode:$});if(m.type==="enable")return[H1,"",n({enabled:!0,mode:$})].join(`
9
9
  `);if(m.type==="disable")return[U1,"",n({enabled:!1,mode:$})].join(`
10
- `);if(m.type==="mode")return[Xm,"",`Mode updated to \`${m.mode}\`.`,"",n({enabled:_,mode:m.mode})].join(`
10
+ `);if(m.type==="mode")return[hm,"",`Mode updated to \`${m.mode}\`.`,"",n({enabled:_,mode:m.mode})].join(`
11
11
  `);return[j1,"",K1,"",n({enabled:_,mode:$})].join(`
12
- `)}import{randomBytes as L1,randomUUID as Zm}from"node:crypto";var O1=1000,g=new Map;function hf(f,m,_){if(!f.has(m)&&f.size>=O1){let $=f.keys().next().value;if($!==void 0)f.delete($)}f.set(m,_)}function Ym(f){let m=f||"anonymous",_=g.get(m);if(_)return _;let $={deviceId:L1(32).toString("hex"),sessionId:Zm()};return hf(g,m,$),$}var Xf=new Map;async function G1(f,m){if(!f.startsWith("sk-ant-oat"))return null;let _=new AbortController,$=setTimeout(()=>_.abort(),5000);try{let D=new URL("https://api.anthropic.com/api/claude_cli/bootstrap");if(D.searchParams.set("entrypoint",of),m)D.searchParams.set("model",m);let C=await fetch(D,{method:"GET",headers:{accept:"application/json, text/plain, */*",authorization:`Bearer ${f}`,"content-type":"application/json","anthropic-beta":"oauth-2025-04-20","user-agent":`claude-code/${x}`},signal:_.signal});if(!C.ok)return null;let M=(await C.json().catch(()=>null))?.oauth_account?.account_uuid;return typeof M==="string"&&M?M:null}catch{return null}finally{clearTimeout($)}}async function Z$(f,m){let _=Ym(f);if(!f.startsWith("sk-ant-oat"))return _;let $=Xf.get(f);if(!$)$=G1(f,m),Xf.set(f,$);let D=await $;if(!D)return Xf.delete(f),_;let C=`account:${D}`,E=g.get(C);if(E)return hf(g,f,E),E;return _.accountUuid=D,hf(g,C,_),_}function I(f){return f!=null&&typeof f==="object"&&!Array.isArray(f)}function J1(f){if(!f.accountUuid)return null;return JSON.stringify({device_id:f.deviceId,account_uuid:f.accountUuid,session_id:f.sessionId})}function Y$(f,m){let _=J1(m);if(!_){if(I(f.metadata))delete f.metadata.user_id;return!1}if(!I(f.metadata))f.metadata={};let $=f.metadata;if(I($))$.user_id=_;return!0}var B1=["claude-code-20250219","oauth-2025-04-20","interleaved-thinking-2025-05-14","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","advanced-tool-use-2025-11-20","context-1m-2025-08-07","effort-2025-11-24","extended-cache-ttl-2025-04-11","cache-diagnosis-2026-04-07"],z1=["oauth-2025-04-20","interleaved-thinking-2025-05-14","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"],hm=["oauth-2025-04-20","interleaved-thinking-2025-05-14","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","cache-diagnosis-2026-04-07"];function A1(f){return f.output_config?.format?.type==="json_schema"}function W1(f){return Array.isArray(f.tools)&&f.tools.length>0&&Array.isArray(f.system)&&I(f.thinking)&&I(f.context_management)&&I(f.output_config)&&I(f.diagnostics)}function V1(f,m=[]){let _=f?W1(f)?[...B1]:A1(f)?[...z1]:[...hm]:[...hm];if(f?.speed==="fast")_.push(rf);for(let $ of m){let D=$.trim();if(D)_.push(D)}return[...new Set(_)].join(",")}function X1(){switch(process.platform){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return"Unknown"}}function h1(){switch(process.arch){case"arm64":return"arm64";case"x64":return"x64";case"ia32":return"x32";default:return process.arch}}function Q$(f,m,_={}){let $=_.identity??Ym(m),C=[...(f.get("anthropic-beta")??"").split(",").map((E)=>E.trim()).filter(Boolean),..._.extraBetas??[]];return f.set("accept","application/json"),f.set("authorization",`Bearer ${m}`),f.set("content-type","application/json"),f.set("user-agent",fm),f.set("anthropic-beta",V1(_.body,C)),f.set("anthropic-dangerous-direct-browser-access","true"),f.set("anthropic-version","2023-06-01"),f.set("x-app","cli"),f.set("x-client-request-id",Zm()),f.set("x-claude-code-session-id",$.sessionId),f.set("x-stainless-arch",h1()),f.set("x-stainless-lang","js"),f.set("x-stainless-os",X1()),f.set("x-stainless-package-version",af),f.set("x-stainless-retry-count","0"),f.set("x-stainless-runtime","node"),f.set("x-stainless-runtime-version",ef),f.set("x-stainless-timeout","600"),f.delete("x-api-key"),f}var Z1=["model","messages","system","tools","tool_choice","metadata","max_tokens","temperature","thinking","context_management","output_config","diagnostics","stream","speed"];function Qm(f){let m={};for(let _ of Z1)if(Object.hasOwn(f,_))m[_]=f[_];for(let[_,$]of Object.entries(f))if(!Object.hasOwn(m,_))m[_]=$;return m}import{createHash as Q1}from"node:crypto";var Y1=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 xm(){return function(f){let{exports:{mem:m,xxh32:_,xxh64:$,init32:D,update32:C,digest32:E,init64:M,update64:S,digest64:N}}=f,H=new Uint8Array(m.buffer);function K(b,O){if(m.buffer.byteLength<b+O){let Uf=Math.ceil((b+O-m.buffer.byteLength)/65536);m.grow(Uf),H=new Uint8Array(m.buffer)}}function F(b,O,Uf,M0,S0,b0){K(b);let k=new Uint8Array(b);return H.set(k),Uf(0,O),k.set(H.subarray(0,b)),{update(w){let jf;return H.set(k),typeof w=="string"?(K(3*w.length,b),jf=A.encodeInto(w,H.subarray(b)).written):(K(w.byteLength,b),H.set(w,b),jf=w.byteLength),M0(0,b,jf),k.set(H.subarray(0,b)),this},digest:()=>(H.set(k),b0(S0(0)))}}function L(b){return b>>>0}let U=2n**64n-1n;function z(b){return b&U}let A=new TextEncoder,c=0,s=0n;function gf(b,O=c){return K(3*b.length,0),L(_(0,A.encodeInto(b,H).written,O))}function tf(b,O=s){return K(3*b.length,0),z($(0,A.encodeInto(b,H).written,O))}return{h32:gf,h32ToString:(b,O=c)=>gf(b,O).toString(16).padStart(8,"0"),h32Raw:(b,O=c)=>(K(b.byteLength,0),H.set(b),L(_(0,b.byteLength,O))),create32:(b=c)=>F(48,b,D,C,E,L),h64:tf,h64ToString:(b,O=s)=>tf(b,O).toString(16).padStart(16,"0"),h64Raw:(b,O=s)=>(K(b.byteLength,0),H.set(b),z($(0,b.byteLength,O))),create64:(b=s)=>F(88,b,M,S,N,z)}}((await WebAssembly.instantiate(Y1)).instance)}var x1=0x6e52736ac806831en,R1="cch=00000;";var Yf=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=([0-9a-f]{5});/,P1=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=00000;/,Rm=null,Zf=null;async function q1(){if(Zf)return;Rm??=(async()=>{Zf=(await xm()).h64Raw})(),await Rm}async function I1(f){return await q1(),((Zf?.(f,x1)??0n)&0xfffffn).toString(16).padStart(5,"0")}function i1(f){return f.replace(Yf,`$1${R1}`)}function Pm(f){return Yf.exec(f)?.[2]??null}async function qm(f){if(!Yf.test(f))return f;let m=i1(f),_=await I1(new TextEncoder().encode(m));return m.replace(P1,`$1cch=${_};`)}function T1(f=x,m=new Date){if(f===x)return Lf;let _=m.toISOString().slice(0,10);return Q1("sha256").update(`${_}${f}`).digest("hex").slice(0,3)}function i$(f,m=x,_,$=new Date){let D=T1(m,$);return`x-anthropic-billing-header: cc_version=${m}.${D}; cc_entrypoint=${_}; cch=00000;`}var y$="claude-cachekeep",Im=3600000,Qf=300000,w1=60000,k$="extended-cache-ttl-2025-04-11",l1="## Claude Cache Keep Status",y1="## Claude Cache Keep Enabled",k1="## Claude Cache Keep Disabled",p1="## Claude Cache Keep Usage",u1="Usage: `/claude-cachekeep`, `/claude-cachekeep off`, or `/claude-cachekeep HH-HH`.";function Cf(f){return String(f).padStart(2,"0")}function v1(f){let m=f.trim();if(!m)return{type:"status"};if(m==="off")return{type:"disable"};let _=/^(\d{1,2})-(\d{1,2})$/.exec(m);if(!_)return{type:"usage"};let $=Number(_[1]),D=Number(_[2]);if(!Number.isInteger($)||!Number.isInteger(D)||$<0||$>23||D<0||D>23||$===D)return{type:"usage"};return{type:"window",startHour:$,endHour:D}}function Rf(f){let m=Number(f?.cacheKeep?.startHour),_=Number(f?.cacheKeep?.endHour);if(!Number.isInteger(m)||!Number.isInteger(_)||m<0||m>23||_<0||_>23||m===_)return;return{startHour:m,endHour:_}}function wm(f){return f?.cacheKeep?.enabled===!0&&!!Rf(f)}function d1(f){return wm(f)&&f?.claudeCache?.enabled===!0&&f.claudeCache.mode==="hybrid"}function im(f,m=new Date){if(!f)return!1;let _=m.getHours();if(f.startHour<f.endHour)return _>=f.startHour&&_<f.endHour;return _>=f.startHour||_<f.endHour}function Tm(f=new Date){return`${f.getFullYear()}-${Cf(f.getMonth()+1)}-${Cf(f.getDate())}`}function xf(f,m=new Date){if(f&&f.startHour>f.endHour&&m.getHours()<f.endHour){let _=new Date(m);return _.setDate(_.getDate()-1),Tm(_)}return Tm(m)}function Df(f){let m=f.window?`${Cf(f.window.startHour)}-${Cf(f.window.endHour)}`:"not configured",_=[`Cache keep: ${f.enabled?"enabled":"disabled"}`,`Window: ${m}`,"Mode requirement: `/claude-cache mode hybrid` must be active."];if(typeof f.hybridActive==="boolean")_.push(`Hybrid active: ${f.hybridActive?"yes":"no"}`);if(typeof f.trackedSessions==="number")_.push(`Tracked sessions: ${f.trackedSessions}`);if(f.nextPrewarmAt)_.push(`Next prewarm: ${new Date(f.nextPrewarmAt).toLocaleString()}`);return _.join(`
13
- `)}function p$(f){let m=v1(f.argumentsText),_={enabled:f.enabled??!1,window:f.window,trackedSessions:f.trackedSessions,nextPrewarmAt:f.nextPrewarmAt,hybridActive:f.hybridActive};if(m.type==="status")return[l1,"",Df(_)].join(`
12
+ `)}import{randomBytes as L1,randomUUID as Zm}from"node:crypto";var O1=1000,g=new Map;function Xf(f,m,_){if(!f.has(m)&&f.size>=O1){let $=f.keys().next().value;if($!==void 0)f.delete($)}f.set(m,_)}function Ym(f){let m=f||"anonymous",_=g.get(m);if(_)return _;let $={deviceId:L1(32).toString("hex"),sessionId:Zm()};return Xf(g,m,$),$}var hf=new Map;async function G1(f,m){if(!f.startsWith("sk-ant-oat"))return null;let _=new AbortController,$=setTimeout(()=>_.abort(),5000);try{let D=new URL("https://api.anthropic.com/api/claude_cli/bootstrap");if(D.searchParams.set("entrypoint",of),m)D.searchParams.set("model",m);let C=await fetch(D,{method:"GET",headers:{accept:"application/json, text/plain, */*",authorization:`Bearer ${f}`,"content-type":"application/json","anthropic-beta":"oauth-2025-04-20","user-agent":`claude-code/${x}`},signal:_.signal});if(!C.ok)return null;let M=(await C.json().catch(()=>null))?.oauth_account?.account_uuid;return typeof M==="string"&&M?M:null}catch{return null}finally{clearTimeout($)}}async function Y$(f,m){let _=Ym(f);if(!f.startsWith("sk-ant-oat"))return _;let $=hf.get(f);if(!$)$=G1(f,m),hf.set(f,$);let D=await $;if(!D)return hf.delete(f),_;let C=`account:${D}`,E=g.get(C);if(E)return Xf(g,f,E),E;return _.accountUuid=D,Xf(g,C,_),_}function I(f){return f!=null&&typeof f==="object"&&!Array.isArray(f)}function J1(f){if(!f.accountUuid)return null;return JSON.stringify({device_id:f.deviceId,account_uuid:f.accountUuid,session_id:f.sessionId})}function Q$(f,m){let _=J1(m);if(!_){if(I(f.metadata))delete f.metadata.user_id;return!1}if(!I(f.metadata))f.metadata={};let $=f.metadata;if(I($))$.user_id=_;return!0}var z1=["claude-code-20250219","oauth-2025-04-20","interleaved-thinking-2025-05-14","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","advanced-tool-use-2025-11-20","context-1m-2025-08-07","effort-2025-11-24","extended-cache-ttl-2025-04-11","cache-diagnosis-2026-04-07"],A1=["oauth-2025-04-20","interleaved-thinking-2025-05-14","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"],Xm=["oauth-2025-04-20","interleaved-thinking-2025-05-14","context-management-2025-06-27","prompt-caching-scope-2026-01-05","advisor-tool-2026-03-01","cache-diagnosis-2026-04-07"];function B1(f){return f.output_config?.format?.type==="json_schema"}function W1(f){return Array.isArray(f.tools)&&f.tools.length>0&&Array.isArray(f.system)&&I(f.thinking)&&I(f.context_management)&&I(f.output_config)&&I(f.diagnostics)}function V1(f,m=[]){let _=f?W1(f)?[...z1]:B1(f)?[...A1]:[...Xm]:[...Xm];if(f?.speed==="fast")_.push(rf);for(let $ of m){let D=$.trim();if(D)_.push(D)}return[...new Set(_)].join(",")}function h1(){switch(process.platform){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return"Unknown"}}function X1(){switch(process.arch){case"arm64":return"arm64";case"x64":return"x64";case"ia32":return"x32";default:return process.arch}}function x$(f,m,_={}){let $=_.identity??Ym(m),C=[...(f.get("anthropic-beta")??"").split(",").map((E)=>E.trim()).filter(Boolean),..._.extraBetas??[]];return f.set("accept","application/json"),f.set("authorization",`Bearer ${m}`),f.set("content-type","application/json"),f.set("user-agent",fm),f.set("anthropic-beta",V1(_.body,C)),f.set("anthropic-dangerous-direct-browser-access","true"),f.set("anthropic-version","2023-06-01"),f.set("x-app","cli"),f.set("x-client-request-id",Zm()),f.set("x-claude-code-session-id",$.sessionId),f.set("x-stainless-arch",X1()),f.set("x-stainless-lang","js"),f.set("x-stainless-os",h1()),f.set("x-stainless-package-version",af),f.set("x-stainless-retry-count","0"),f.set("x-stainless-runtime","node"),f.set("x-stainless-runtime-version",ef),f.set("x-stainless-timeout","600"),f.delete("x-api-key"),f}var Z1=["model","messages","system","tools","tool_choice","metadata","max_tokens","temperature","thinking","context_management","output_config","diagnostics","stream","speed"];function Qm(f){let m={};for(let _ of Z1)if(Object.hasOwn(f,_))m[_]=f[_];for(let[_,$]of Object.entries(f))if(!Object.hasOwn(m,_))m[_]=$;return m}import{createHash as Q1}from"node:crypto";var Y1=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 xm(){return function(f){let{exports:{mem:m,xxh32:_,xxh64:$,init32:D,update32:C,digest32:E,init64:M,update64:S,digest64:N}}=f,H=new Uint8Array(m.buffer);function K(b,O){if(m.buffer.byteLength<b+O){let Uf=Math.ceil((b+O-m.buffer.byteLength)/65536);m.grow(Uf),H=new Uint8Array(m.buffer)}}function F(b,O,Uf,M0,S0,b0){K(b);let k=new Uint8Array(b);return H.set(k),Uf(0,O),k.set(H.subarray(0,b)),{update(l){let jf;return H.set(k),typeof l=="string"?(K(3*l.length,b),jf=B.encodeInto(l,H.subarray(b)).written):(K(l.byteLength,b),H.set(l,b),jf=l.byteLength),M0(0,b,jf),k.set(H.subarray(0,b)),this},digest:()=>(H.set(k),b0(S0(0)))}}function L(b){return b>>>0}let U=2n**64n-1n;function A(b){return b&U}let B=new TextEncoder,c=0,s=0n;function gf(b,O=c){return K(3*b.length,0),L(_(0,B.encodeInto(b,H).written,O))}function tf(b,O=s){return K(3*b.length,0),A($(0,B.encodeInto(b,H).written,O))}return{h32:gf,h32ToString:(b,O=c)=>gf(b,O).toString(16).padStart(8,"0"),h32Raw:(b,O=c)=>(K(b.byteLength,0),H.set(b),L(_(0,b.byteLength,O))),create32:(b=c)=>F(48,b,D,C,E,L),h64:tf,h64ToString:(b,O=s)=>tf(b,O).toString(16).padStart(16,"0"),h64Raw:(b,O=s)=>(K(b.byteLength,0),H.set(b),A($(0,b.byteLength,O))),create64:(b=s)=>F(88,b,M,S,N,A)}}((await WebAssembly.instantiate(Y1)).instance)}var x1=0x6e52736ac806831en,R1="cch=00000;";var Yf=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=([0-9a-f]{5});/,P1=/("system":\[\{"type":"text","text":"x-anthropic-billing-header: cc_version=[^;"]+; cc_entrypoint=[^;"]+; )cch=00000;/,Rm=null,Zf=null;async function q1(){if(Zf)return;Rm??=(async()=>{Zf=(await xm()).h64Raw})(),await Rm}async function I1(f){return await q1(),((Zf?.(f,x1)??0n)&0xfffffn).toString(16).padStart(5,"0")}function i1(f){return f.replace(Yf,`$1${R1}`)}function Pm(f){return Yf.exec(f)?.[2]??null}async function qm(f){if(!Yf.test(f))return f;let m=i1(f),_=await I1(new TextEncoder().encode(m));return m.replace(P1,`$1cch=${_};`)}function T1(f=x,m=new Date){if(f===x)return Lf;return Q1("sha256").update(f).digest("hex").slice(0,3)}function T$(f,m=x,_,$=new Date){let D=T1(m,$);return`x-anthropic-billing-header: cc_version=${m}.${D}; cc_entrypoint=${_}; cch=00000;`}var k$="claude-cachekeep",Im=3600000,Qf=300000,l1=60000,p$="extended-cache-ttl-2025-04-11",w1="## Claude Cache Keep Status",y1="## Claude Cache Keep Enabled",k1="## Claude Cache Keep Disabled",p1="## Claude Cache Keep Usage",u1="Usage: `/claude-cachekeep`, `/claude-cachekeep off`, or `/claude-cachekeep HH-HH`.";function Cf(f){return String(f).padStart(2,"0")}function v1(f){let m=f.trim();if(!m)return{type:"status"};if(m==="off")return{type:"disable"};let _=/^(\d{1,2})-(\d{1,2})$/.exec(m);if(!_)return{type:"usage"};let $=Number(_[1]),D=Number(_[2]);if(!Number.isInteger($)||!Number.isInteger(D)||$<0||$>23||D<0||D>23||$===D)return{type:"usage"};return{type:"window",startHour:$,endHour:D}}function Rf(f){let m=Number(f?.cacheKeep?.startHour),_=Number(f?.cacheKeep?.endHour);if(!Number.isInteger(m)||!Number.isInteger(_)||m<0||m>23||_<0||_>23||m===_)return;return{startHour:m,endHour:_}}function lm(f){return f?.cacheKeep?.enabled===!0&&!!Rf(f)}function d1(f){return lm(f)&&f?.claudeCache?.enabled===!0&&f.claudeCache.mode==="hybrid"}function im(f,m=new Date){if(!f)return!1;let _=m.getHours();if(f.startHour<f.endHour)return _>=f.startHour&&_<f.endHour;return _>=f.startHour||_<f.endHour}function Tm(f=new Date){return`${f.getFullYear()}-${Cf(f.getMonth()+1)}-${Cf(f.getDate())}`}function xf(f,m=new Date){if(f&&f.startHour>f.endHour&&m.getHours()<f.endHour){let _=new Date(m);return _.setDate(_.getDate()-1),Tm(_)}return Tm(m)}function Df(f){let m=f.window?`${Cf(f.window.startHour)}-${Cf(f.window.endHour)}`:"not configured",_=[`Cache keep: ${f.enabled?"enabled":"disabled"}`,`Window: ${m}`,"Mode requirement: `/claude-cache mode hybrid` must be active."];if(typeof f.hybridActive==="boolean")_.push(`Hybrid active: ${f.hybridActive?"yes":"no"}`);if(typeof f.trackedSessions==="number")_.push(`Tracked sessions: ${f.trackedSessions}`);if(f.nextPrewarmAt)_.push(`Next prewarm: ${new Date(f.nextPrewarmAt).toLocaleString()}`);return _.join(`
13
+ `)}function u$(f){let m=v1(f.argumentsText),_={enabled:f.enabled??!1,window:f.window,trackedSessions:f.trackedSessions,nextPrewarmAt:f.nextPrewarmAt,hybridActive:f.hybridActive};if(m.type==="status")return[w1,"",Df(_)].join(`
14
14
  `);if(m.type==="disable")return[k1,"",Df({..._,enabled:!1})].join(`
15
15
  `);if(m.type==="window")return[y1,"",Df({..._,enabled:!0,window:{startHour:m.startHour,endHour:m.endHour}})].join(`
16
16
  `);return[p1,"",u1,"",Df(_)].join(`
17
- `)}function Pf(f){if(!f||typeof f!=="object")return!1;if(Array.isArray(f))return f.some(Pf);let m=f,_=m.cache_control;if(_&&typeof _==="object"&&_.type==="ephemeral")return!0;return Object.values(m).some(Pf)}async function n1(f){let m;try{m=JSON.parse(f)}catch{return{ok:!1,reason:"body is not valid JSON"}}if(!Pf(m))return{ok:!1,reason:"body has no explicit cache breakpoints"};let _=structuredClone(m);if(_.max_tokens=0,delete _.stream,_.thinking?.type==="enabled")delete _.thinking;if(_.output_config?.format)delete _.output_config;let C=_.tool_choice;if(C?.type==="tool"||C?.type==="any")delete _.tool_choice;return{ok:!0,bodyText:await qm(JSON.stringify(Qm(_)))}}class g1{options;targets=new Map;timer=null;constructor(f){this.options=f}start(){if(this.timer)return;if(this.timer=setInterval(()=>{this.tick().catch((f)=>{this.options.log?.("[cachekeep] tick failed",{error:f instanceof Error?f.message:String(f)})})},w1),"unref"in this.timer)this.timer.unref()}stop(){if(this.timer)clearInterval(this.timer);this.timer=null}stats(f,m=this.options.now?.()??Date.now()){let _=xf(f,new Date(m)),$=[...this.targets.values()].filter((C)=>C.dayKey===_),D=$.length?Math.min(...$.map((C)=>C.cacheExpiresAt-Qf)):void 0;return{trackedSessions:$.length,nextPrewarmAt:D}}trackedCount(){return this.targets.size}track(f){if(!f.sessionId)return{tracked:!1,reason:"missing session id"};if(!wm(f.storage))return{tracked:!1,reason:"cachekeep disabled"};if(f.cacheMode!=="hybrid")return{tracked:!1,reason:"cache mode is not hybrid"};let m=this.options.now?.()??Date.now(),_=Rf(f.storage);if(!im(_,new Date(m)))return{tracked:!1,reason:"outside configured window"};let $={};return f.headers.forEach((D,C)=>{$[C]=D}),this.targets.set(f.sessionId,{id:f.sessionId,url:f.url,headers:$,bodyText:f.bodyText,cacheExpiresAt:m+Im,dayKey:xf(_,new Date(m))}),this.start(),{tracked:!0}}async tick(){let f=await this.options.loadStorage(),m=Rf(f),_=this.options.now?.()??Date.now(),$=xf(m,new Date(_));for(let[C,E]of this.targets)if(E.dayKey!==$)this.targets.delete(C);if(!this.targets.size){this.stop();return}if(!d1(f))return;if(!im(m,new Date(_)))return;let D=_+Qf;for(let C of this.targets.values()){if(C.cacheExpiresAt>D)continue;await this.prewarm(C,_)}}async prewarm(f,m){let _=await n1(f.bodyText);if(!_.ok){this.options.log?.("[cachekeep] prewarm skipped",{session:f.id,reason:_.reason}),this.targets.delete(f.id);return}let $=this.options.fetchImpl??fetch,D={...f,bodyText:_.bodyText},C=this.options.prepareHeaders?await this.options.prepareHeaders(new Headers(f.headers),D):new Headers(f.headers);C.delete("content-length"),C.delete("transfer-encoding");let E=await $(f.url,{method:"POST",headers:C,body:_.bodyText});if(!E.ok){this.options.log?.("[cachekeep] prewarm failed",{session:f.id,status:E.status,body:await E.text().catch(()=>"")}),f.cacheExpiresAt=m+Qf+300000;return}await E.body?.cancel().catch(()=>{}),f.cacheExpiresAt=m+Im,this.options.log?.("[cachekeep] prewarm succeeded",{session:f.id})}}import{createHash as t1}from"node:crypto";import{mkdir as c1,writeFile as qf}from"node:fs/promises";import{tmpdir as s1}from"node:os";import{join as km}from"node:path";var s$="claude-dump",r1="## Claude Dump Status",o1="## Claude Dump Enabled",a1="## Claude Dump Disabled",e1="## Claude Dump Usage",f_="Usage: `/claude-dump`, `/claude-dump on`, or `/claude-dump off`.",m_="OPENCODE_ANTHROPIC_AUTH_DUMP_DIR",__=km(s1(),"opencode-anthropic-auth-dumps"),Mf=!1,lm=0;function r$(f){Mf=f}function pm(){return process.env[m_]||__}function $_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};return{type:"usage"}}function Ef(f){let m=f?.enabled??Mf;return[r1,"",`- Enabled: ${m?"enabled":"disabled"}`,`- Directory: ${pm()}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Captures: final rewritten Anthropic body plus redacted relay payload metadata","- Warning: body dumps may contain prompt/session content; turn this off after debugging"].join(`
18
- `)}function o$(f){let m=$_(f.argumentsText),_=f.enabled??Mf;if(m.type==="status")return Ef({enabled:_});if(m.type==="enable")return[o1,"",Ef({enabled:!0})].join(`
17
+ `)}function Pf(f){if(!f||typeof f!=="object")return!1;if(Array.isArray(f))return f.some(Pf);let m=f,_=m.cache_control;if(_&&typeof _==="object"&&_.type==="ephemeral")return!0;return Object.values(m).some(Pf)}async function n1(f){let m;try{m=JSON.parse(f)}catch{return{ok:!1,reason:"body is not valid JSON"}}if(!Pf(m))return{ok:!1,reason:"body has no explicit cache breakpoints"};let _=structuredClone(m);if(_.max_tokens=0,delete _.stream,_.thinking?.type==="enabled")delete _.thinking;if(_.output_config?.format)delete _.output_config;let C=_.tool_choice;if(C?.type==="tool"||C?.type==="any")delete _.tool_choice;return{ok:!0,bodyText:await qm(JSON.stringify(Qm(_)))}}class g1{options;targets=new Map;timer=null;constructor(f){this.options=f}start(){if(this.timer)return;if(this.timer=setInterval(()=>{this.tick().catch((f)=>{this.options.log?.("[cachekeep] tick failed",{error:f instanceof Error?f.message:String(f)})})},l1),"unref"in this.timer)this.timer.unref()}stop(){if(this.timer)clearInterval(this.timer);this.timer=null}stats(f,m=this.options.now?.()??Date.now()){let _=xf(f,new Date(m)),$=[...this.targets.values()].filter((C)=>C.dayKey===_),D=$.length?Math.min(...$.map((C)=>C.cacheExpiresAt-Qf)):void 0;return{trackedSessions:$.length,nextPrewarmAt:D}}trackedCount(){return this.targets.size}track(f){if(!f.sessionId)return{tracked:!1,reason:"missing session id"};if(!lm(f.storage))return{tracked:!1,reason:"cachekeep disabled"};if(f.cacheMode!=="hybrid")return{tracked:!1,reason:"cache mode is not hybrid"};let m=this.options.now?.()??Date.now(),_=Rf(f.storage);if(!im(_,new Date(m)))return{tracked:!1,reason:"outside configured window"};let $={};return f.headers.forEach((D,C)=>{$[C]=D}),this.targets.set(f.sessionId,{id:f.sessionId,url:f.url,headers:$,bodyText:f.bodyText,cacheExpiresAt:m+Im,dayKey:xf(_,new Date(m))}),this.start(),{tracked:!0}}async tick(){let f=await this.options.loadStorage(),m=Rf(f),_=this.options.now?.()??Date.now(),$=xf(m,new Date(_));for(let[C,E]of this.targets)if(E.dayKey!==$)this.targets.delete(C);if(!this.targets.size){this.stop();return}if(!d1(f))return;if(!im(m,new Date(_)))return;let D=_+Qf;for(let C of this.targets.values()){if(C.cacheExpiresAt>D)continue;await this.prewarm(C,_)}}async prewarm(f,m){let _=await n1(f.bodyText);if(!_.ok){this.options.log?.("[cachekeep] prewarm skipped",{session:f.id,reason:_.reason}),this.targets.delete(f.id);return}let $=this.options.fetchImpl??fetch,D={...f,bodyText:_.bodyText},C=this.options.prepareHeaders?await this.options.prepareHeaders(new Headers(f.headers),D):new Headers(f.headers);C.delete("content-length"),C.delete("transfer-encoding");let E=await $(f.url,{method:"POST",headers:C,body:_.bodyText});if(!E.ok){this.options.log?.("[cachekeep] prewarm failed",{session:f.id,status:E.status,body:await E.text().catch(()=>"")}),f.cacheExpiresAt=m+Qf+300000;return}await E.body?.cancel().catch(()=>{}),f.cacheExpiresAt=m+Im,this.options.log?.("[cachekeep] prewarm succeeded",{session:f.id})}}import{createHash as t1}from"node:crypto";import{mkdir as c1,writeFile as qf}from"node:fs/promises";import{tmpdir as s1}from"node:os";import{join as km}from"node:path";var r$="claude-dump",r1="## Claude Dump Status",o1="## Claude Dump Enabled",a1="## Claude Dump Disabled",e1="## Claude Dump Usage",f_="Usage: `/claude-dump`, `/claude-dump on`, or `/claude-dump off`.",m_="OPENCODE_ANTHROPIC_AUTH_DUMP_DIR",__=km(s1(),"opencode-anthropic-auth-dumps"),Mf=!1,wm=0;function o$(f){Mf=f}function pm(){return process.env[m_]||__}function $_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};return{type:"usage"}}function Ef(f){let m=f?.enabled??Mf;return[r1,"",`- Enabled: ${m?"enabled":"disabled"}`,`- Directory: ${pm()}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Captures: final rewritten Anthropic body plus redacted relay payload metadata","- Warning: body dumps may contain prompt/session content; turn this off after debugging"].join(`
18
+ `)}function a$(f){let m=$_(f.argumentsText),_=f.enabled??Mf;if(m.type==="status")return Ef({enabled:_});if(m.type==="enable")return[o1,"",Ef({enabled:!0})].join(`
19
19
  `);if(m.type==="disable")return[a1,"",Ef({enabled:!1})].join(`
20
20
  `);return[e1,"",f_,"",Ef({enabled:_})].join(`
21
- `)}function ym(f){return f.length<=16?f:`${f.slice(0,12)}…`}function um(f){return t1("sha256").update(f).digest("hex")}function D_(f){return Pm(f)}function C_(f,m){if(f==null)return null;if(f===m)return{changed:!1,firstByte:-1,lastPreviousByte:-1,lastCurrentByte:-1,previousBytes:f.length,currentBytes:m.length};let _=0;while(_<f.length&&_<m.length&&f[_]===m[_])_+=1;let $=f.length-1,D=m.length-1;while($>=_&&D>=_&&f[$]===m[D])$-=1,D-=1;return{changed:!0,firstByte:_,lastPreviousByte:$,lastCurrentByte:D,changedPreviousBytes:$-_+1,changedCurrentBytes:D-_+1,previousBytes:f.length,currentBytes:m.length}}function E_(f){try{let m=JSON.parse(f);return m!=null&&typeof m==="object"&&!Array.isArray(m)?m:null}catch(m){return j(`dump body parse failed: ${m instanceof Error?m.message:String(m)}`),null}}function If(f){return um(JSON.stringify(f))}function M_(f){let m=E_(f);if(!m)return{parseable:!1};let _=Array.isArray(m.messages)?m.messages:[],$=Array.isArray(m.system)?m.system:[],D=_[0],C=_.slice(1);return{parseable:!0,model:typeof m.model==="string"?m.model:void 0,stream:m.stream,systemCount:$.length,messagesCount:_.length,systemHash:If($),message0Hash:D===void 0?null:If(D),message0Bytes:D===void 0?0:JSON.stringify(D).length,messagesAfter0Hash:If(C),messagesAfter0Bytes:JSON.stringify(C).length,cch:D_(f)}}function Tf(f){if(Array.isArray(f))return f.map(Tf);if(f==null||typeof f!=="object")return f;let m={};for(let[_,$]of Object.entries(f)){let D=_.toLowerCase();if(D==="authorization"||D==="x-api-key"||D==="cookie"||D==="set-cookie"){m[_]="[redacted]";continue}m[_]=Tf($)}return m}async function vm(f){if(!Mf)return;lm+=1;let m=`${new Date().toISOString().replace(/[:.]/g,"-")}-${String(lm).padStart(5,"0")}-${f.transport}-p${f.protocol}-${f.mode}`,_=pm(),$=km(_,m);try{await c1(_,{recursive:!0});let D={id:m,createdAt:new Date().toISOString(),session:ym(f.affinity),transport:f.transport,protocol:f.protocol,mode:f.mode,status:f.status,bodyBytes:f.bodyText.length,relayBytes:f.relayBytes,bodyHash:um(f.bodyText),diff:C_(f.previousBodyText,f.bodyText),body:M_(f.bodyText),files:{body:`${$}.body.json`,relay:`${$}.relay.json`,metadata:`${$}.meta.json`}};await Promise.all([qf(`${$}.body.json`,f.bodyText,"utf8"),qf(`${$}.relay.json`,`${JSON.stringify(Tf(f.payload),null,2)}
21
+ `)}function ym(f){return f.length<=16?f:`${f.slice(0,12)}…`}function D_(f){let m=f.trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!m)return"session-unknown";return m.length<=80?m:m.slice(0,80)}function um(f){return t1("sha256").update(f).digest("hex")}function C_(f){return Pm(f)}function E_(f,m){if(f==null)return null;if(f===m)return{changed:!1,firstByte:-1,lastPreviousByte:-1,lastCurrentByte:-1,previousBytes:f.length,currentBytes:m.length};let _=0;while(_<f.length&&_<m.length&&f[_]===m[_])_+=1;let $=f.length-1,D=m.length-1;while($>=_&&D>=_&&f[$]===m[D])$-=1,D-=1;return{changed:!0,firstByte:_,lastPreviousByte:$,lastCurrentByte:D,changedPreviousBytes:$-_+1,changedCurrentBytes:D-_+1,previousBytes:f.length,currentBytes:m.length}}function M_(f){try{let m=JSON.parse(f);return m!=null&&typeof m==="object"&&!Array.isArray(m)?m:null}catch(m){return j(`dump body parse failed: ${m instanceof Error?m.message:String(m)}`),null}}function If(f){return um(JSON.stringify(f))}function S_(f){let m=M_(f);if(!m)return{parseable:!1};let _=Array.isArray(m.messages)?m.messages:[],$=Array.isArray(m.system)?m.system:[],D=_[0],C=_.slice(1);return{parseable:!0,model:typeof m.model==="string"?m.model:void 0,stream:m.stream,systemCount:$.length,messagesCount:_.length,systemHash:If($),message0Hash:D===void 0?null:If(D),message0Bytes:D===void 0?0:JSON.stringify(D).length,messagesAfter0Hash:If(C),messagesAfter0Bytes:JSON.stringify(C).length,cch:C_(f)}}function Tf(f){if(Array.isArray(f))return f.map(Tf);if(f==null||typeof f!=="object")return f;let m={};for(let[_,$]of Object.entries(f)){let D=_.toLowerCase();if(D==="authorization"||D==="x-api-key"||D==="cookie"||D==="set-cookie"){m[_]="[redacted]";continue}m[_]=Tf($)}return m}async function vm(f){if(!Mf)return;wm+=1;let m=`${new Date().toISOString().replace(/[:.]/g,"-")}-${String(wm).padStart(5,"0")}-${D_(f.affinity)}-${f.transport}-p${f.protocol}-${f.mode}`,_=pm(),$=km(_,m);try{await c1(_,{recursive:!0});let D={id:m,createdAt:new Date().toISOString(),session:ym(f.affinity),transport:f.transport,protocol:f.protocol,mode:f.mode,status:f.status,bodyBytes:f.bodyText.length,relayBytes:f.relayBytes,bodyHash:um(f.bodyText),diff:E_(f.previousBodyText,f.bodyText),body:S_(f.bodyText),files:{body:`${$}.body.json`,relay:`${$}.relay.json`,metadata:`${$}.meta.json`}};await Promise.all([qf(`${$}.body.json`,f.bodyText,"utf8"),qf(`${$}.relay.json`,`${JSON.stringify(Tf(f.payload),null,2)}
22
22
  `,"utf8"),qf(`${$}.meta.json`,`${JSON.stringify(D,null,2)}
23
- `,"utf8")]),j(`dumped request id=${m} session=${ym(f.affinity)} body=${$}.body.json meta=${$}.meta.json`)}catch(D){j(`dump failed: ${D instanceof Error?D.message:String(D)}`)}}var e$="claude-fast";var bf=!1;function fD(){return bf}function mD(f){bf=f}function S_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};return{type:"usage"}}function Sf(f){return["## Claude Fast Mode Status","",`- Enabled: ${f?.enabled??bf?"enabled":"disabled"}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: adds Anthropic fast mode to supported Opus requests","- Supported models: claude-opus-4-6, claude-opus-4-7, and claude-opus-4-8",'- Request changes: adds `speed: "fast"` and the `fast-mode-2026-02-01` beta header',"- Note: fast and standard speeds do not share prompt-cache prefixes"].join(`
24
- `)}function _D(f){let m=S_(f.argumentsText),_=f.enabled??bf;if(m.type==="status")return Sf({enabled:_});if(m.type==="enable")return["## Claude Fast Mode Enabled","",Sf({enabled:!0})].join(`
23
+ `,"utf8")]),j(`dumped request id=${m} session=${ym(f.affinity)} body=${$}.body.json meta=${$}.meta.json`)}catch(D){j(`dump failed: ${D instanceof Error?D.message:String(D)}`)}}var fD="claude-fast";var bf=!1;function mD(){return bf}function _D(f){bf=f}function b_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"enable"};if(m.length===1&&m[0]==="off")return{type:"disable"};return{type:"usage"}}function Sf(f){return["## Claude Fast Mode Status","",`- Enabled: ${f?.enabled??bf?"enabled":"disabled"}`,"- Persisted: ~/.config/opencode/anthropic-auth.json","- Scope: adds Anthropic fast mode to supported Opus requests","- Supported models: claude-opus-4-6, claude-opus-4-7, and claude-opus-4-8",'- Request changes: adds `speed: "fast"` and the `fast-mode-2026-02-01` beta header',"- Note: fast and standard speeds do not share prompt-cache prefixes"].join(`
24
+ `)}function $D(f){let m=b_(f.argumentsText),_=f.enabled??bf;if(m.type==="status")return Sf({enabled:_});if(m.type==="enable")return["## Claude Fast Mode Enabled","",Sf({enabled:!0})].join(`
25
25
  `);if(m.type==="disable")return["## Claude Fast Mode Disabled","",Sf({enabled:!1})].join(`
26
26
  `);return["## Claude Fast Mode Usage","","Usage: `/claude-fast`, `/claude-fast on`, or `/claude-fast off`.","",Sf({enabled:_})].join(`
27
- `)}var t="claude-killswitch";function b_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"on"};if(m.length===1&&m[0]==="off")return{type:"off"};if(m[0]==="set"){let _=[];for(let $=1;$<m.length;$++){let D=m[$]?.match(/^([^:]+):(\d+),(\d+)$/);if(!D)return{type:"usage"};let[,C,E,M]=D;_.push({account:C,fh:Number.parseInt(E,10),sd:Number.parseInt(M,10)})}if(_.length===0)return{type:"usage"};return{type:"set",entries:_}}return{type:"usage"}}function Nf(f,m){let _=f.enabled===!0,$=["## Killswitch","",`Status: **${_?"ON":"OFF"}**`];if(_){$.push(""),$.push("| Account | 5h threshold | 1w threshold |"),$.push("| ------- | ------------ | ------------ |");let D=f.main??{},C=D.five_hour??D["5h"]??X.five_hour,E=D.seven_day??D["1w"]??X.seven_day;$.push(`| main | ≥ ${C}% | ≥ ${E}% |`);for(let M of m){let S=f.accounts?.[M]??f.main??{},N=S.five_hour??S["5h"]??X.five_hour,H=S.seven_day??S["1w"]??X.seven_day;$.push(`| ${M} | ≥ ${N}% | ≥ ${H}% |`)}}return $.join(`
27
+ `)}var t="claude-killswitch";function N_(f){let m=f.trim().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&m[0]==="on")return{type:"on"};if(m.length===1&&m[0]==="off")return{type:"off"};if(m[0]==="set"){let _=[];for(let $=1;$<m.length;$++){let D=m[$]?.match(/^([^:]+):(\d+),(\d+)$/);if(!D)return{type:"usage"};let[,C,E,M]=D;_.push({account:C,fh:Number.parseInt(E,10),sd:Number.parseInt(M,10)})}if(_.length===0)return{type:"usage"};return{type:"set",entries:_}}return{type:"usage"}}function Nf(f,m){let _=f.enabled===!0,$=["## Killswitch","",`Status: **${_?"ON":"OFF"}**`];if(_){$.push(""),$.push("| Account | 5h threshold | 1w threshold |"),$.push("| ------- | ------------ | ------------ |");let D=f.main??{},C=D.five_hour??D["5h"]??h.five_hour,E=D.seven_day??D["1w"]??h.seven_day;$.push(`| main | ≥ ${C}% | ≥ ${E}% |`);for(let M of m){let S=f.accounts?.[M]??f.main??{},N=S.five_hour??S["5h"]??h.five_hour,H=S.seven_day??S["1w"]??h.seven_day;$.push(`| ${M} | ≥ ${N}% | ≥ ${H}% |`)}}return $.join(`
28
28
  `)}var dm=["## Killswitch Commands","","```",`/${t} — show status`,`/${t} on — enable with current or default thresholds`,`/${t} off — disable`,`/${t} set all:5,10 — set all accounts to 5h≥5%, 1w≥10%`,`/${t} set main:3,8 work-alt:5,10 — per-account`,"```"].join(`
29
- `);function CD(f){let m=b_(f.argumentsText);if(m.type==="status")return{text:`${Nf(f.config,f.accountIds)}
29
+ `);function ED(f){let m=N_(f.argumentsText);if(m.type==="status")return{text:`${Nf(f.config,f.accountIds)}
30
30
 
31
- ${dm}`};if(m.type==="on"){let $={...f.config,enabled:!0,main:f.config.main??{five_hour:X.five_hour,seven_day:X.seven_day}};return{text:`## Killswitch Enabled
31
+ ${dm}`};if(m.type==="on"){let $={...f.config,enabled:!0,main:f.config.main??{five_hour:h.five_hour,seven_day:h.seven_day}};return{text:`## Killswitch Enabled
32
32
 
33
33
  ${Nf($,f.accountIds)}`,updatedConfig:$}}if(m.type==="off")return{text:"## Killswitch Disabled",updatedConfig:{...f.config,enabled:!1}};if(m.type==="set"){let $={...f.config.accounts??{}},D={...f.config,enabled:!0,accounts:$};for(let E of m.entries){let M={five_hour:E.fh,seven_day:E.sd};if(E.account==="main")D.main=M;else if(E.account==="all"){D.main=M;for(let S of f.accountIds)$[S]=M}else $[E.account]=M}return{text:`## Killswitch Updated
34
34
 
35
35
  ${Nf(D,f.accountIds)}`,updatedConfig:D}}return{text:`${Nf(f.config,f.accountIds)}
36
36
 
37
- ${dm}`}}import{createHash as N_}from"node:crypto";var H_=globalThis.setTimeout;function Q(f){return N_("sha256").update(f).digest("hex").slice(0,16)}class i{main=null;mainTokenFp=null;fallbacks=new Map;fallbackTokenFps=new Map;inflightMain=null;inflightFallbacks=new Map;mainLastApiError=void 0;fallbackApiErrors=new Map;fallbackErrorTokenFps=new Map;apiGate=Promise.resolve();lastApiCallAt=0;storage;fetchImpl;now;onMainQuotaFetched;onApiError;constructor(f){this.storage=f.storage,this.fetchImpl=f.fetchImpl??fetch,this.now=f.now??Date.now,this.onMainQuotaFetched=f.onMainQuotaFetched,this.onApiError=f.onApiError;let m=Bm(f.storage);if(m)this.main={quota:m.quota,refreshAfter:Vf(m.quota,f.storage,m.checkedAt),checkedAt:m.checkedAt},this.mainTokenFp=m.tokenFingerprint??null;let _=f.storage?.quota?.mainLastQuotaApiError;if(_&&y(_,this.now()))this.mainLastApiError=_}getMain(f){if(f&&this.main&&this.mainTokenFp&&this.mainTokenFp!==Q(f))this.main=null,this.mainTokenFp=null;return this.main}getFallback(f,m){let _=this.fallbacks.get(f)??null;if(!m||!_)return _;if(this.fallbackTokenFps.get(f)!==Q(m))return this.fallbacks.delete(f),this.fallbackTokenFps.delete(f),null;return _}getAllFallbacks(){return this.fallbacks}setMain(f,m){this.mainTokenFp=Q(f),this.main=m}setFallback(f,m,_){if(this.fallbacks.set(f,m),_)this.fallbackTokenFps.set(f,Q(_));else this.fallbackTokenFps.delete(f)}async refreshMain(f){let m=Q(f);if(this.mainTokenFp&&this.mainTokenFp!==m)this.main=null,this.mainTokenFp=null;if(this.inflightMain)return this.inflightMain;if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}return this.inflightMain=this._fetchMain(f),this.inflightMain}async refreshFallback(f,m){let _=i.fallbackInflightKey(f,m),$=this.inflightFallbacks.get(_);if($)return $;if(this.isFallbackBackedOff(f,m)){let C=this.getFallback(f,m);if(C)return C.quota;throw Error("Quota API rate-limited — try again later")}let D=this._fetchFallback(f,m);return this.inflightFallbacks.set(_,D),D}async refreshAllFallbacks(f){let m=this.now();for(let _ of f){if(_.enabled===!1)continue;if(!_.access)continue;let $=this.getFallback(_.id,_.access);if($&&m<$.refreshAfter)continue;try{await this.refreshFallback(_.id,_.access)}catch{}}}refreshMainInBackground(f){if(this.inflightMain)return;if(this.isBackedOff())return;this.refreshMain(f).catch(()=>{})}isMainStale(){if(!this.main)return!0;return this.now()>=this.main.refreshAfter}isFallbackStale(f,m){let _=this.getFallback(f,m);if(!_)return!0;return this.now()>=_.refreshAfter}shouldRefreshOnRequestCount(f){let m=zm(this.storage);if(m<=0)return!1;return f>0&&f%m===0}needsRefresh(f){return this.isMainStale()||this.shouldRefreshOnRequestCount(f)}updateStorage(f){this.storage=f}seedFallbacksFromAccounts(f){let m=V(this.storage);for(let _ of f){if(_.enabled===!1)continue;if(this.getFallback(_.id,_.access))continue;if(!_.quota)continue;let $=Math.max(_.quota.five_hour?.checkedAt??0,_.quota.seven_day?.checkedAt??0);if($<=0)continue;this.setFallback(_.id,{quota:_.quota,refreshAfter:$+m,checkedAt:$},_.access)}}isBackedOff(){return y(this.mainLastApiError,this.now())}isFallbackBackedOff(f,m){if(m){if(this.fallbackErrorTokenFps.get(f)!==Q(m))return!1}return y(this.fallbackApiErrors.get(f),this.now())}getLastApiError(){return this.mainLastApiError}static API_CALL_GAP_MS=1000;static fallbackInflightKey(f,m){return JSON.stringify([f,Q(m)])}_enqueueApiFetch(f){let m=async()=>{let $=this.now()-this.lastApiCallAt;if($<i.API_CALL_GAP_MS)await new Promise((D)=>{let C=H_(D,i.API_CALL_GAP_MS-$);if(typeof C==="object"&&"unref"in C)C.unref()});return this.lastApiCallAt=this.now(),f()},_=this.apiGate.then(m,m);return this.apiGate=_.catch(()=>{}),_}async _fetchMain(f){return this._enqueueApiFetch(async()=>{try{if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}let m=await Af({name:"opencode-main-quota-refresh",ttlMs:30000});if(!m){if(this.main)return this.main.quota;throw Error("Quota refresh is already in progress")}try{let _=await mf({accessToken:f,fetchImpl:this.fetchImpl,now:this.now}),$=this.now();return this.mainTokenFp=Q(f),this.main={quota:_,refreshAfter:Vf(_,this.storage,$),checkedAt:$},this.mainLastApiError=void 0,this.onMainQuotaFetched?.(_,$,this.mainTokenFp),_}catch(_){throw this._handleMainFetchError(_),_}finally{await m.release()}}finally{this.inflightMain=null}})}async _fetchFallback(f,m){return this._enqueueApiFetch(async()=>{try{if(this.isFallbackBackedOff(f,m)){let D=this.getFallback(f,m);if(D)return D.quota;throw Error("Quota API rate-limited — try again later")}let _=await mf({accessToken:m,fetchImpl:this.fetchImpl,now:this.now}),$=this.now();return this.setFallback(f,{quota:_,refreshAfter:$+V(this.storage),checkedAt:$},m),this.fallbackApiErrors.delete(f),this.fallbackErrorTokenFps.delete(f),_}catch(_){throw this._handleFallbackFetchError(f,m,_),_}finally{this.inflightFallbacks.delete(i.fallbackInflightKey(f,m))}})}static isAuthError(f){let m=f instanceof Error?f.message:String(f);return/quota check failed: 401\b/.test(m)}_handleMainFetchError(f){if(i.isAuthError(f))return;this.mainLastApiError=ff({error:f,now:this.now(),previous:this.mainLastApiError}),this.onApiError?.(this.mainLastApiError)}_handleFallbackFetchError(f,m,_){if(i.isAuthError(_))return;let $=Q(m),D=this.fallbackErrorTokenFps.get(f)===$?this.fallbackApiErrors.get(f):void 0;this.fallbackApiErrors.set(f,ff({error:_,now:this.now(),previous:D})),this.fallbackErrorTokenFps.set(f,$)}}var ND="claude-quota",nm={five_hour:"5h",seven_day:"1w"};function gm(f){return`${Math.round(f*10)/10}%`}function wf(f,m){let _=Math.max(0,m-f),$=Math.floor(_/60000);if($<1)return"just now";if($===1)return"1m ago";if($<60)return`${$}m ago`;let D=Math.floor($/60),C=$%60;if(C===0)return`${D}h ago`;return`${D}h ${C}m ago`}function U_(f,m){let _=Date.parse(f);if(!Number.isFinite(_))return f;let $=_-m;if($<=0)return"now";let D=Math.max(1,Math.ceil($/60000));if(D<60)return`in ${D}m`;let C=Math.floor(D/60),E=D%60;if(E===0)return`in ${C}h`;return`in ${C}h ${E}m`}function j_(f,m){if(!f)return"";return`, resets ${U_(f,m)}`}function tm(f,m,_){if(!m)return` - ${nm[f]}: unknown`;return[` - ${nm[f]}: ${gm(m.remainingPercent)} remaining`,` (${gm(m.usedPercent)} used`,`${j_(m.resetsAt,_)}, checked ${wf(m.checkedAt,_)})`].join("")}function K_(f){return f.label?.trim()||f.id}function F_(f){return f.lastQuotaRefreshError?.message??f.lastRefreshError?.message}function HD(f,m=new Map){if(!f?.accounts.length)return[];return f.accounts.map((_)=>{let $=m.get(_.id)??F_(_);return{name:K_(_),role:"fallback",enabled:_.enabled!==!1,quota:_.quota,lastRefreshedAt:_.lastRefreshedAt,...$&&{error:$}}})}function UD(f){let m=f.now??Date.now(),_=["## Claude Quotas",""];if(f.refreshedAt)_.push(`Refreshed: ${wf(f.refreshedAt,m)}`,"");if(!f.accounts.length)return _.push("No Claude OAuth accounts found yet."),_.join(`
38
- `);for(let $ of f.accounts){let D=$.role==="main"?"main":"fallback",C=$.enabled===!1?" disabled":"";if(_.push(`### ${$.name} (${D}${C})`),$.lastRefreshedAt)_.push(` - Last token refresh: ${wf($.lastRefreshedAt,m)}`);if($.error)_.push(` - Error: ${$.error}`);_.push(tm("five_hour",$.quota?.five_hour,m)),_.push(tm("seven_day",$.quota?.seven_day,m)),_.push("")}return _.join(`
39
- `).trimEnd()}import{Buffer as _0}from"node:buffer";import{createHash as L_,randomBytes as O_}from"node:crypto";class yf extends Error{}class kf extends Error{code="ECONNRESET";syscall="websocket";closeCode;closeReason;wasClean;constructor(f,m){super(f);this.name="RelayWebSocketConnectionResetError",this.closeCode=m?.code,this.closeReason=m?.reason,this.wasClean=m?.wasClean}}var uf=new Map,cm=new Map,sm=new Set,rm=0;function lf(){return rm+=1,`req_${Date.now().toString(36)}_${rm.toString(36)}`}function Hf(f){if(sm.has(f))return;sm.add(f),j(f)}function GD(f){let m=f?.relay;if(!m)return Hf("disabled: no relay config found"),null;if(m.enabled!==!0)return Hf("disabled: relay.enabled is not true"),null;if(!m.url?.trim()||!m.token?.trim())return Hf("disabled: missing relay url or token"),null;let _=m.transport==="http"?"http":"websocket";return Hf(`configured transport=${_} protocol=${_==="websocket"?2:1} url=${m.url.trim()} fallbackToDirect=${m.fallbackToDirect!==!1}`),{enabled:!0,url:m.url.trim(),token:m.token.trim(),fallbackToDirect:m.fallbackToDirect!==!1,transport:_}}function JD(){return O_(32).toString("base64url")}function G_(f){return`sha256:${L_("sha256").update(f).digest("hex")}`}function om(f,m){let _=0,$=Math.min(f.length,m.length);while(_<$&&f.charCodeAt(_)===m.charCodeAt(_))_++;let D=f.length,C=m.length;while(D>_&&C>_&&f.charCodeAt(D-1)===m.charCodeAt(C-1))D--,C--;return{start:_,deleteCount:D-_,insert:m.slice(_,C)}}function J_(f){return f.deleteCount===0&&f.insert.length===0}function am(f){let m=f.match(/\bcch=([0-9a-f]{5});/),_=m?.[1];if(!_||m.index==null)return null;let $=m.index+4;return{start:$,end:$+_.length,token:_}}function B_(f,m,_,$){return`${f.slice(0,m)}${$}${f.slice(_)}`}function $0(f,m){let _=am(f),$=am(m);if(_&&$&&_.start===$.start&&_.end-_.start===$.end-$.start&&_.token!==$.token){let D={start:_.start,deleteCount:_.end-_.start,insert:$.token},C=B_(f,_.start,_.end,$.token),E=om(C,m);return J_(E)?D:[D,E]}return om(f,m)}function z_(f,m){if(typeof m!=="string")return!1;try{let _=f instanceof Request?new URL(f.url):new URL(f.toString());return _.pathname==="/v1/messages"||_.pathname==="/messages"}catch{return!1}}function A_(f){let m={};for(let[_,$]of f.entries()){if(_==="x-session-affinity"||_==="x-opencode-session")continue;m[_]=$}return m}async function em(f,m){return fetch(f.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":f.token},body:JSON.stringify(m)})}function J(f){return f.length>12?`${f.slice(0,12)}…`:f}function R(){return performance.now()}function T(f){return Math.round(f*10)/10}function W_(f){let{input:m,init:_,headers:$,bodyText:D,affinity:C,previous:E,nextHash:M}=f,S=m instanceof Request?m.url:m.toString(),N={protocol:1,type:"request",affinity:C,upstream:{url:S,method:_?.method||(m instanceof Request?m.method:"POST"),headers:A_($)},next_hash:M};return E?{...N,mode:"patch",base_hash:E.hash,revision:E.revision+1,patch:$0(E.body,D)}:{...N,mode:"full_sync",revision:1,body:D}}function pf(f,m){return{protocol:f.protocol,type:"request",affinity:f.affinity,upstream:f.upstream,next_hash:f.next_hash,mode:"full_sync",revision:1,body:m}}function D0(f,m,_,$){uf.set(f,{body:m,hash:_,revision:$})}async function f0(f){let{config:m,payload:_,bodyText:$,fallback:D}=f,C=_,E=await em(m,C);if(E.status===409&&C.mode==="patch")j(`state mismatch from relay session=${J(C.affinity)}; retrying full_sync`),await E.body?.cancel().catch(()=>{}),C=pf(C,$),E=await em(m,C);if(!E.ok&&E.status>=500&&m.fallbackToDirect)return j(`relay returned ${E.status}; falling back direct session=${J(C.affinity)}`),await E.body?.cancel().catch(()=>{}),{response:await D(),payload:C,transport:"http",protocol:C.protocol,usedRelay:!1};return{response:E,payload:C,transport:"http",protocol:C.protocol,usedRelay:!0}}function V_(f,m){let _=new URL(f);return _.protocol=_.protocol==="http:"?"ws:":"wss:",_.pathname="/ws",_.searchParams.set("token",m),_.toString()}function X_(f){return new Uint8Array(_0.from(f,"base64"))}function h_(f){if(f instanceof Uint8Array)return f;if(f instanceof ArrayBuffer)return new Uint8Array(f);if(ArrayBuffer.isView(f))return new Uint8Array(f.buffer,f.byteOffset,f.byteLength);return new Uint8Array(_0.from(String(f)))}function Z_(f){return JSON.parse(f)}function m0(f){let m=f,_=[`code=${m.code??"unknown"}`,`wasClean=${m.wasClean??"unknown"}`];if(m.reason)_.push(`reason=${JSON.stringify(m.reason)}`);return _.join(" ")}function Y_(f){let m=f.message||"relay websocket error";return f.status?`relay websocket error ${f.status}: ${m}`:m}class C0{config;affinity;socket;connecting;queue=Promise.resolve();pending;serverState;constructor(f,m){this.config=f,this.affinity=m}send(f,m,_=!1){let $=R(),D=this.queue.catch(()=>{}).then(()=>this.startQueued(f,m,$,_)),C=D.then(async({response:E,getPayload:M})=>({response:await E,payload:M(),transport:"websocket",protocol:2,usedRelay:!0}));return this.queue=D.then(({done:E})=>E.catch(()=>{}),()=>{}),C}async startQueued(f,m,_,$){let D=R();await this.ensureConnected();let C=R(),E=uf.get(this.affinity),M=this.serverState?.hash,S={...f,protocol:2,id:lf()};if(S.mode==="patch"&&(!M||M!==S.base_hash))S.mode="full_sync",S.revision=(this.serverState?.revision??0)+1,delete S.base_hash,delete S.patch,S.body=m;if(S.mode==="patch"&&E)S.patch=$0(E.body,m);j(`perf websocket send_start session=${J(this.affinity)} request=${S.id} mode=${S.mode} queueMs=${T(C-_)} connectMs=${T(C-D)} bodyBytes=${m.length} relayBytes=${JSON.stringify(S).length}`);let N=S,H=this.sendPayload(S,m,$);H.done.catch(()=>{});let K=H.done,F=H.response.catch((U)=>{if(!(U instanceof yf)||S.mode!=="patch")throw U;let z=pf(S,m);z.protocol=2,z.id=lf(),z.revision=(this.serverState?.revision??0)+1,N=z;let A=this.sendPayload(z,m,$);return A.done.catch(()=>{}),K=A.done,A.response}),L=F.then(()=>K,()=>K.catch(()=>{}));return{response:F,done:L,getPayload:()=>N}}async ensureConnected(){if(this.socket?.readyState===WebSocket.OPEN&&this.serverState!==void 0)return;if(this.connecting)return await this.connecting;this.connecting=new Promise((f,m)=>{let _=V_(this.config.url,this.config.token),$=new URL(_);$.searchParams.set("affinity",this.affinity);let D=new WebSocket($.toString());this.socket=D,this.serverState=void 0;let C=setTimeout(()=>{D.close(),m(Error("relay websocket ready timed out"))},15000);D.addEventListener("message",(E)=>{try{if(typeof E.data!=="string"){this.handleBinaryChunk(E.data);return}let M=Z_(E.data);if(M.type==="ready"){clearTimeout(C),this.serverState=M.state,f();return}this.handleMessage(M)}catch(M){clearTimeout(C),m(M),this.failPending(M),D.close()}}),D.addEventListener("error",()=>{clearTimeout(C);let E=new kf("relay websocket error");m(E),this.failPending(E)}),D.addEventListener("close",(E)=>{if(clearTimeout(C),this.socket===D)this.socket=void 0,this.serverState=void 0,this.connecting=void 0;if(this.pending){if(this.pending.retryingBeforeResponse)return;let M=this.pending.responseStartedAt!=null,S=M?"closed after response_start before stream bytes":"closed before response";if(this.retryPendingBeforeResponse(this.pending,S,E))return;let N=M?new kf("relay websocket closed during response stream",E):Error("relay websocket closed before response");j(`websocket ${M?"closed during response stream":"closed before response without retry"} session=${J(this.affinity)} request=${this.pending.payload.id} chunks=${this.pending.streamChunkCount} bytes=${this.pending.streamByteCount} ${m0(E)}`),this.failPending(N)}})}).finally(()=>{this.connecting=void 0}),await this.connecting}sendPayload(f,m,_){let $=this.socket;if(!$||$.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");let D=R(),C,E,M=new Promise((N,H)=>{C=N,E=H});return{response:new Promise((N,H)=>{let K={payload:f,bodyText:m,resolve:N,reject:H,streamDone:!1,accepted:!1,responseStarted:!1,resolveDone:C,rejectDone:E,sentAt:D,optimisticResponse:_,streamChunkCount:0,streamByteCount:0,retryAttempts:0,retryingBeforeResponse:!1};if(this.pending=K,this.resetPendingTimeout(K),$.send(JSON.stringify(f)),_)this.resolvePendingResponse(K,200,"OK",{"content-type":"text/event-stream","x-cortexkit-relay-optimistic":"true"})}),done:M}}resetPendingTimeout(f){clearTimeout(f.timeout),f.timeout=setTimeout(()=>{if(this.pending!==f)return;if(this.retryPendingBeforeResponse(f,"response timed out"))return;this.failPending(Error("relay websocket response timed out")),this.socket?.close()},45000)}retryPendingBeforeResponse(f,m,_){if(f.responseStartedAt!=null&&f.streamByteCount>0)return!1;if(f.streamDone)return!1;if(f.retryAttempts>=1)return!1;f.retryAttempts+=1,f.retryingBeforeResponse=!0,clearTimeout(f.timeout);let $=f.retryAttempts,D=f.payload.id;return j(`websocket ${m}; reconnecting and retrying full_sync session=${J(this.affinity)} request=${D} retry=${$} chunks=${f.streamChunkCount} bytes=${f.streamByteCount}${_?` ${m0(_)}`:""}`),this.socket?.close(),this.socket=void 0,this.serverState=void 0,this.connecting=void 0,(async()=>{try{if(await this.ensureConnected(),this.pending!==f)return;let C=pf(f.payload,f.bodyText);C.protocol=2,C.id=lf(),C.revision=(this.serverState?.revision??0)+1,f.payload=C,f.accepted=!1,f.acceptedAt=void 0,f.responseStartedAt=void 0,f.sentAt=R(),f.retryingBeforeResponse=!1;let E=this.socket;if(!E||E.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");this.resetPendingTimeout(f),j(`perf websocket retry_send session=${J(this.affinity)} request=${C.id} previous=${D} mode=full_sync retry=${$} bodyBytes=${f.bodyText.length} relayBytes=${JSON.stringify(C).length}`),E.send(JSON.stringify(C))}catch(C){if(f.retryingBeforeResponse=!1,this.pending===f)this.failPending(C)}})(),!0}enqueueStreamChunk(f,m){f.streamChunkCount+=1,f.streamByteCount+=m.byteLength,f.streamController?.enqueue(m)}handleBinaryChunk(f){let m=this.pending;if(!m?.responseStarted)return;this.enqueueStreamChunk(m,h_(f))}resolvePendingResponse(f,m,_,$){if(f.responseStarted)return;f.responseStarted=!0;let D=new ReadableStream({start:(C)=>{f.streamController=C},cancel:()=>{this.socket?.close()}});f.resolve(new Response(D,{status:m,statusText:_,headers:$}))}handleMessage(f){if(f.type==="keepalive"){if(this.pending)this.resetPendingTimeout(this.pending);return}let m=this.pending;if(!m)return;if("id"in f&&f.id&&f.id!==m.payload.id)return;if(f.type==="accepted"){let _=R();m.accepted=!0,m.acceptedAt=_,j(`perf websocket accepted session=${J(this.affinity)} request=${m.payload.id} sentMs=${T(_-m.sentAt)} mode=${m.payload.mode}`),this.serverState={hash:f.hash,revision:f.revision},D0(this.affinity,m.bodyText,f.hash,f.revision),this.resetPendingTimeout(m);return}if(f.type==="response_start"){let _=R();if(m.responseStartedAt=_,j(`perf websocket response_start session=${J(this.affinity)} request=${m.payload.id} sentMs=${T(_-m.sentAt)} upstreamMs=${m.acceptedAt==null?"unknown":T(_-m.acceptedAt)} status=${f.status}`),clearTimeout(m.timeout),this.resolvePendingResponse(m,f.status,f.statusText,f.headers),m.optimisticResponse&&f.status>=400)m.streamController?.enqueue(new TextEncoder().encode(`event: error
37
+ ${dm}`}}import{createHash as H_}from"node:crypto";var U_=globalThis.setTimeout;function Q(f){return H_("sha256").update(f).digest("hex").slice(0,16)}class i{main=null;mainTokenFp=null;fallbacks=new Map;fallbackTokenFps=new Map;inflightMain=null;inflightFallbacks=new Map;mainLastApiError=void 0;fallbackApiErrors=new Map;fallbackErrorTokenFps=new Map;apiGate=Promise.resolve();lastApiCallAt=0;storage;fetchImpl;now;onMainQuotaFetched;onApiError;constructor(f){this.storage=f.storage,this.fetchImpl=f.fetchImpl??fetch,this.now=f.now??Date.now,this.onMainQuotaFetched=f.onMainQuotaFetched,this.onApiError=f.onApiError;let m=zm(f.storage);if(m)this.main={quota:m.quota,refreshAfter:Vf(m.quota,f.storage,m.checkedAt),checkedAt:m.checkedAt},this.mainTokenFp=m.tokenFingerprint??null;let _=f.storage?.quota?.mainLastQuotaApiError;if(_&&y(_,this.now()))this.mainLastApiError=_}getMain(f){if(f&&this.main&&this.mainTokenFp&&this.mainTokenFp!==Q(f))this.main=null,this.mainTokenFp=null;return this.main}getFallback(f,m){let _=this.fallbacks.get(f)??null;if(!m||!_)return _;if(this.fallbackTokenFps.get(f)!==Q(m))return this.fallbacks.delete(f),this.fallbackTokenFps.delete(f),null;return _}getAllFallbacks(){return this.fallbacks}setMain(f,m){this.mainTokenFp=Q(f),this.main=m}setFallback(f,m,_){if(this.fallbacks.set(f,m),_)this.fallbackTokenFps.set(f,Q(_));else this.fallbackTokenFps.delete(f)}async refreshMain(f){let m=Q(f);if(this.mainTokenFp&&this.mainTokenFp!==m)this.main=null,this.mainTokenFp=null;if(this.inflightMain)return this.inflightMain;if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}return this.inflightMain=this._fetchMain(f),this.inflightMain}async refreshFallback(f,m){let _=i.fallbackInflightKey(f,m),$=this.inflightFallbacks.get(_);if($)return $;if(this.isFallbackBackedOff(f,m)){let C=this.getFallback(f,m);if(C)return C.quota;throw Error("Quota API rate-limited — try again later")}let D=this._fetchFallback(f,m);return this.inflightFallbacks.set(_,D),D}async refreshAllFallbacks(f){let m=this.now();for(let _ of f){if(_.enabled===!1)continue;if(!_.access)continue;let $=this.getFallback(_.id,_.access);if($&&m<$.refreshAfter)continue;try{await this.refreshFallback(_.id,_.access)}catch{}}}refreshMainInBackground(f){if(this.inflightMain)return;if(this.isBackedOff())return;this.refreshMain(f).catch(()=>{})}isMainStale(){if(!this.main)return!0;return this.now()>=this.main.refreshAfter}isFallbackStale(f,m){let _=this.getFallback(f,m);if(!_)return!0;return this.now()>=_.refreshAfter}shouldRefreshOnRequestCount(f){let m=Am(this.storage);if(m<=0)return!1;return f>0&&f%m===0}needsRefresh(f){return this.isMainStale()||this.shouldRefreshOnRequestCount(f)}updateStorage(f){this.storage=f}seedFallbacksFromAccounts(f){let m=V(this.storage);for(let _ of f){if(_.enabled===!1)continue;if(this.getFallback(_.id,_.access))continue;if(!_.quota)continue;let $=Math.max(_.quota.five_hour?.checkedAt??0,_.quota.seven_day?.checkedAt??0);if($<=0)continue;this.setFallback(_.id,{quota:_.quota,refreshAfter:$+m,checkedAt:$},_.access)}}isBackedOff(){return y(this.mainLastApiError,this.now())}isFallbackBackedOff(f,m){if(m){if(this.fallbackErrorTokenFps.get(f)!==Q(m))return!1}return y(this.fallbackApiErrors.get(f),this.now())}getLastApiError(){return this.mainLastApiError}static API_CALL_GAP_MS=1000;static fallbackInflightKey(f,m){return JSON.stringify([f,Q(m)])}_enqueueApiFetch(f){let m=async()=>{let $=this.now()-this.lastApiCallAt;if($<i.API_CALL_GAP_MS)await new Promise((D)=>{let C=U_(D,i.API_CALL_GAP_MS-$);if(typeof C==="object"&&"unref"in C)C.unref()});return this.lastApiCallAt=this.now(),f()},_=this.apiGate.then(m,m);return this.apiGate=_.catch(()=>{}),_}async _fetchMain(f){return this._enqueueApiFetch(async()=>{try{if(this.isBackedOff()){if(this.main)return this.main.quota;throw Error("Quota API rate-limited — try again later")}let m=await Bf({name:"opencode-main-quota-refresh",ttlMs:30000});if(!m){if(this.main)return this.main.quota;throw Error("Quota refresh is already in progress")}try{let _=await mf({accessToken:f,fetchImpl:this.fetchImpl,now:this.now}),$=this.now();return this.mainTokenFp=Q(f),this.main={quota:_,refreshAfter:Vf(_,this.storage,$),checkedAt:$},this.mainLastApiError=void 0,this.onMainQuotaFetched?.(_,$,this.mainTokenFp),_}catch(_){throw this._handleMainFetchError(_),_}finally{await m.release()}}finally{this.inflightMain=null}})}async _fetchFallback(f,m){return this._enqueueApiFetch(async()=>{try{if(this.isFallbackBackedOff(f,m)){let D=this.getFallback(f,m);if(D)return D.quota;throw Error("Quota API rate-limited — try again later")}let _=await mf({accessToken:m,fetchImpl:this.fetchImpl,now:this.now}),$=this.now();return this.setFallback(f,{quota:_,refreshAfter:$+V(this.storage),checkedAt:$},m),this.fallbackApiErrors.delete(f),this.fallbackErrorTokenFps.delete(f),_}catch(_){throw this._handleFallbackFetchError(f,m,_),_}finally{this.inflightFallbacks.delete(i.fallbackInflightKey(f,m))}})}static isAuthError(f){let m=f instanceof Error?f.message:String(f);return/quota check failed: 401\b/.test(m)}_handleMainFetchError(f){if(i.isAuthError(f))return;this.mainLastApiError=ff({error:f,now:this.now(),previous:this.mainLastApiError}),this.onApiError?.(this.mainLastApiError)}_handleFallbackFetchError(f,m,_){if(i.isAuthError(_))return;let $=Q(m),D=this.fallbackErrorTokenFps.get(f)===$?this.fallbackApiErrors.get(f):void 0;this.fallbackApiErrors.set(f,ff({error:_,now:this.now(),previous:D})),this.fallbackErrorTokenFps.set(f,$)}}var HD="claude-quota",nm={five_hour:"5h",seven_day:"1w"};function gm(f){return`${Math.round(f*10)/10}%`}function lf(f,m){let _=Math.max(0,m-f),$=Math.floor(_/60000);if($<1)return"just now";if($===1)return"1m ago";if($<60)return`${$}m ago`;let D=Math.floor($/60),C=$%60;if(C===0)return`${D}h ago`;return`${D}h ${C}m ago`}function j_(f,m){let _=Date.parse(f);if(!Number.isFinite(_))return f;let $=_-m;if($<=0)return"now";let D=Math.max(1,Math.ceil($/60000));if(D<60)return`in ${D}m`;let C=Math.floor(D/60),E=D%60;if(E===0)return`in ${C}h`;return`in ${C}h ${E}m`}function K_(f,m){if(!f)return"";return`, resets ${j_(f,m)}`}function tm(f,m,_){if(!m)return` - ${nm[f]}: unknown`;return[` - ${nm[f]}: ${gm(m.remainingPercent)} remaining`,` (${gm(m.usedPercent)} used`,`${K_(m.resetsAt,_)}, checked ${lf(m.checkedAt,_)})`].join("")}function F_(f){return f.label?.trim()||f.id}function L_(f){return f.lastQuotaRefreshError?.message??f.lastRefreshError?.message}function UD(f,m=new Map){if(!f?.accounts.length)return[];return f.accounts.map((_)=>{let $=m.get(_.id)??L_(_);return{name:F_(_),role:"fallback",enabled:_.enabled!==!1,quota:_.quota,lastRefreshedAt:_.lastRefreshedAt,...$&&{error:$}}})}function jD(f){let m=f.now??Date.now(),_=["## Claude Quotas",""];if(f.refreshedAt)_.push(`Refreshed: ${lf(f.refreshedAt,m)}`,"");if(!f.accounts.length)return _.push("No Claude OAuth accounts found yet."),_.join(`
38
+ `);for(let $ of f.accounts){let D=$.role==="main"?"main":"fallback",C=$.enabled===!1?" disabled":"";if(_.push(`### ${$.name} (${D}${C})`),$.lastRefreshedAt)_.push(` - Last token refresh: ${lf($.lastRefreshedAt,m)}`);if($.error)_.push(` - Error: ${$.error}`);_.push(tm("five_hour",$.quota?.five_hour,m)),_.push(tm("seven_day",$.quota?.seven_day,m)),_.push("")}return _.join(`
39
+ `).trimEnd()}import{Buffer as _0}from"node:buffer";import{createHash as O_,randomBytes as G_}from"node:crypto";class yf extends Error{}class kf extends Error{code="ECONNRESET";syscall="websocket";closeCode;closeReason;wasClean;constructor(f,m){super(f);this.name="RelayWebSocketConnectionResetError",this.closeCode=m?.code,this.closeReason=m?.reason,this.wasClean=m?.wasClean}}var uf=new Map,cm=new Map,sm=new Set,rm=0;function wf(){return rm+=1,`req_${Date.now().toString(36)}_${rm.toString(36)}`}function Hf(f){if(sm.has(f))return;sm.add(f),j(f)}function JD(f){let m=f?.relay;if(!m)return Hf("disabled: no relay config found"),null;if(m.enabled!==!0)return Hf("disabled: relay.enabled is not true"),null;if(!m.url?.trim()||!m.token?.trim())return Hf("disabled: missing relay url or token"),null;let _=m.transport==="http"?"http":"websocket";return Hf(`configured transport=${_} protocol=${_==="websocket"?2:1} url=${m.url.trim()} fallbackToDirect=${m.fallbackToDirect!==!1}`),{enabled:!0,url:m.url.trim(),token:m.token.trim(),fallbackToDirect:m.fallbackToDirect!==!1,transport:_}}function zD(){return G_(32).toString("base64url")}function J_(f){return`sha256:${O_("sha256").update(f).digest("hex")}`}function om(f,m){let _=0,$=Math.min(f.length,m.length);while(_<$&&f.charCodeAt(_)===m.charCodeAt(_))_++;let D=f.length,C=m.length;while(D>_&&C>_&&f.charCodeAt(D-1)===m.charCodeAt(C-1))D--,C--;return{start:_,deleteCount:D-_,insert:m.slice(_,C)}}function z_(f){return f.deleteCount===0&&f.insert.length===0}function am(f){let m=f.match(/\bcch=([0-9a-f]{5});/),_=m?.[1];if(!_||m.index==null)return null;let $=m.index+4;return{start:$,end:$+_.length,token:_}}function A_(f,m,_,$){return`${f.slice(0,m)}${$}${f.slice(_)}`}function $0(f,m){let _=am(f),$=am(m);if(_&&$&&_.start===$.start&&_.end-_.start===$.end-$.start&&_.token!==$.token){let D={start:_.start,deleteCount:_.end-_.start,insert:$.token},C=A_(f,_.start,_.end,$.token),E=om(C,m);return z_(E)?D:[D,E]}return om(f,m)}function B_(f,m){if(typeof m!=="string")return!1;try{let _=f instanceof Request?new URL(f.url):new URL(f.toString());return _.pathname==="/v1/messages"||_.pathname==="/messages"}catch{return!1}}function W_(f){let m={};for(let[_,$]of f.entries()){if(_==="x-session-affinity"||_==="x-opencode-session")continue;m[_]=$}return m}async function em(f,m){return fetch(f.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":f.token},body:JSON.stringify(m)})}function J(f){return f.length>12?`${f.slice(0,12)}…`:f}function R(){return performance.now()}function T(f){return Math.round(f*10)/10}function V_(f){let{input:m,init:_,headers:$,bodyText:D,affinity:C,previous:E,nextHash:M}=f,S=m instanceof Request?m.url:m.toString(),N={protocol:1,type:"request",affinity:C,upstream:{url:S,method:_?.method||(m instanceof Request?m.method:"POST"),headers:W_($)},next_hash:M};return E?{...N,mode:"patch",base_hash:E.hash,revision:E.revision+1,patch:$0(E.body,D)}:{...N,mode:"full_sync",revision:1,body:D}}function pf(f,m){return{protocol:f.protocol,type:"request",affinity:f.affinity,upstream:f.upstream,next_hash:f.next_hash,mode:"full_sync",revision:1,body:m}}function D0(f,m,_,$){uf.set(f,{body:m,hash:_,revision:$})}async function f0(f){let{config:m,payload:_,bodyText:$,fallback:D}=f,C=_,E=await em(m,C);if(E.status===409&&C.mode==="patch")j(`state mismatch from relay session=${J(C.affinity)}; retrying full_sync`),await E.body?.cancel().catch(()=>{}),C=pf(C,$),E=await em(m,C);if(!E.ok&&E.status>=500&&m.fallbackToDirect)return j(`relay returned ${E.status}; falling back direct session=${J(C.affinity)}`),await E.body?.cancel().catch(()=>{}),{response:await D(),payload:C,transport:"http",protocol:C.protocol,usedRelay:!1};return{response:E,payload:C,transport:"http",protocol:C.protocol,usedRelay:!0}}function h_(f,m){let _=new URL(f);return _.protocol=_.protocol==="http:"?"ws:":"wss:",_.pathname="/ws",_.searchParams.set("token",m),_.toString()}function X_(f){return new Uint8Array(_0.from(f,"base64"))}function Z_(f){if(f instanceof Uint8Array)return f;if(f instanceof ArrayBuffer)return new Uint8Array(f);if(ArrayBuffer.isView(f))return new Uint8Array(f.buffer,f.byteOffset,f.byteLength);return new Uint8Array(_0.from(String(f)))}function Y_(f){return JSON.parse(f)}function m0(f){let m=f,_=[`code=${m.code??"unknown"}`,`wasClean=${m.wasClean??"unknown"}`];if(m.reason)_.push(`reason=${JSON.stringify(m.reason)}`);return _.join(" ")}function Q_(f){let m=f.message||"relay websocket error";return f.status?`relay websocket error ${f.status}: ${m}`:m}class C0{config;affinity;socket;connecting;queue=Promise.resolve();pending;serverState;constructor(f,m){this.config=f,this.affinity=m}send(f,m,_=!1){let $=R(),D=this.queue.catch(()=>{}).then(()=>this.startQueued(f,m,$,_)),C=D.then(async({response:E,getPayload:M})=>({response:await E,payload:M(),transport:"websocket",protocol:2,usedRelay:!0}));return this.queue=D.then(({done:E})=>E.catch(()=>{}),()=>{}),C}async startQueued(f,m,_,$){let D=R();await this.ensureConnected();let C=R(),E=uf.get(this.affinity),M=this.serverState?.hash,S={...f,protocol:2,id:wf()};if(S.mode==="patch"&&(!M||M!==S.base_hash))S.mode="full_sync",S.revision=(this.serverState?.revision??0)+1,delete S.base_hash,delete S.patch,S.body=m;if(S.mode==="patch"&&E)S.patch=$0(E.body,m);j(`perf websocket send_start session=${J(this.affinity)} request=${S.id} mode=${S.mode} queueMs=${T(C-_)} connectMs=${T(C-D)} bodyBytes=${m.length} relayBytes=${JSON.stringify(S).length}`);let N=S,H=this.sendPayload(S,m,$);H.done.catch(()=>{});let K=H.done,F=H.response.catch((U)=>{if(!(U instanceof yf)||S.mode!=="patch")throw U;let A=pf(S,m);A.protocol=2,A.id=wf(),A.revision=(this.serverState?.revision??0)+1,N=A;let B=this.sendPayload(A,m,$);return B.done.catch(()=>{}),K=B.done,B.response}),L=F.then(()=>K,()=>K.catch(()=>{}));return{response:F,done:L,getPayload:()=>N}}async ensureConnected(){if(this.socket?.readyState===WebSocket.OPEN&&this.serverState!==void 0)return;if(this.connecting)return await this.connecting;this.connecting=new Promise((f,m)=>{let _=h_(this.config.url,this.config.token),$=new URL(_);$.searchParams.set("affinity",this.affinity);let D=new WebSocket($.toString());this.socket=D,this.serverState=void 0;let C=setTimeout(()=>{D.close(),m(Error("relay websocket ready timed out"))},15000);D.addEventListener("message",(E)=>{try{if(typeof E.data!=="string"){this.handleBinaryChunk(E.data);return}let M=Y_(E.data);if(M.type==="ready"){clearTimeout(C),this.serverState=M.state,f();return}this.handleMessage(M)}catch(M){clearTimeout(C),m(M),this.failPending(M),D.close()}}),D.addEventListener("error",()=>{clearTimeout(C);let E=new kf("relay websocket error");m(E),this.failPending(E)}),D.addEventListener("close",(E)=>{if(clearTimeout(C),this.socket===D)this.socket=void 0,this.serverState=void 0,this.connecting=void 0;if(this.pending){if(this.pending.retryingBeforeResponse)return;let M=this.pending.responseStartedAt!=null,S=M?"closed after response_start before stream bytes":"closed before response";if(this.retryPendingBeforeResponse(this.pending,S,E))return;let N=M?new kf("relay websocket closed during response stream",E):Error("relay websocket closed before response");j(`websocket ${M?"closed during response stream":"closed before response without retry"} session=${J(this.affinity)} request=${this.pending.payload.id} chunks=${this.pending.streamChunkCount} bytes=${this.pending.streamByteCount} ${m0(E)}`),this.failPending(N)}})}).finally(()=>{this.connecting=void 0}),await this.connecting}sendPayload(f,m,_){let $=this.socket;if(!$||$.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");let D=R(),C,E,M=new Promise((N,H)=>{C=N,E=H});return{response:new Promise((N,H)=>{let K={payload:f,bodyText:m,resolve:N,reject:H,streamDone:!1,accepted:!1,responseStarted:!1,resolveDone:C,rejectDone:E,sentAt:D,optimisticResponse:_,streamChunkCount:0,streamByteCount:0,retryAttempts:0,retryingBeforeResponse:!1};if(this.pending=K,this.resetPendingTimeout(K),$.send(JSON.stringify(f)),_)this.resolvePendingResponse(K,200,"OK",{"content-type":"text/event-stream","x-cortexkit-relay-optimistic":"true"})}),done:M}}resetPendingTimeout(f){clearTimeout(f.timeout),f.timeout=setTimeout(()=>{if(this.pending!==f)return;if(this.retryPendingBeforeResponse(f,"response timed out"))return;this.failPending(Error("relay websocket response timed out")),this.socket?.close()},45000)}retryPendingBeforeResponse(f,m,_){if(f.responseStartedAt!=null&&f.streamByteCount>0)return!1;if(f.streamDone)return!1;if(f.retryAttempts>=1)return!1;f.retryAttempts+=1,f.retryingBeforeResponse=!0,clearTimeout(f.timeout);let $=f.retryAttempts,D=f.payload.id;return j(`websocket ${m}; reconnecting and retrying full_sync session=${J(this.affinity)} request=${D} retry=${$} chunks=${f.streamChunkCount} bytes=${f.streamByteCount}${_?` ${m0(_)}`:""}`),this.socket?.close(),this.socket=void 0,this.serverState=void 0,this.connecting=void 0,(async()=>{try{if(await this.ensureConnected(),this.pending!==f)return;let C=pf(f.payload,f.bodyText);C.protocol=2,C.id=wf(),C.revision=(this.serverState?.revision??0)+1,f.payload=C,f.accepted=!1,f.acceptedAt=void 0,f.responseStartedAt=void 0,f.sentAt=R(),f.retryingBeforeResponse=!1;let E=this.socket;if(!E||E.readyState!==WebSocket.OPEN)throw Error("relay websocket is not connected");this.resetPendingTimeout(f),j(`perf websocket retry_send session=${J(this.affinity)} request=${C.id} previous=${D} mode=full_sync retry=${$} bodyBytes=${f.bodyText.length} relayBytes=${JSON.stringify(C).length}`),E.send(JSON.stringify(C))}catch(C){if(f.retryingBeforeResponse=!1,this.pending===f)this.failPending(C)}})(),!0}enqueueStreamChunk(f,m){f.streamChunkCount+=1,f.streamByteCount+=m.byteLength,f.streamController?.enqueue(m)}handleBinaryChunk(f){let m=this.pending;if(!m?.responseStarted)return;this.enqueueStreamChunk(m,Z_(f))}resolvePendingResponse(f,m,_,$){if(f.responseStarted)return;f.responseStarted=!0;let D=new ReadableStream({start:(C)=>{f.streamController=C},cancel:()=>{this.socket?.close()}});f.resolve(new Response(D,{status:m,statusText:_,headers:$}))}handleMessage(f){if(f.type==="keepalive"){if(this.pending)this.resetPendingTimeout(this.pending);return}let m=this.pending;if(!m)return;if("id"in f&&f.id&&f.id!==m.payload.id)return;if(f.type==="accepted"){let _=R();m.accepted=!0,m.acceptedAt=_,j(`perf websocket accepted session=${J(this.affinity)} request=${m.payload.id} sentMs=${T(_-m.sentAt)} mode=${m.payload.mode}`),this.serverState={hash:f.hash,revision:f.revision},D0(this.affinity,m.bodyText,f.hash,f.revision),this.resetPendingTimeout(m);return}if(f.type==="response_start"){let _=R();if(m.responseStartedAt=_,j(`perf websocket response_start session=${J(this.affinity)} request=${m.payload.id} sentMs=${T(_-m.sentAt)} upstreamMs=${m.acceptedAt==null?"unknown":T(_-m.acceptedAt)} status=${f.status}`),clearTimeout(m.timeout),this.resolvePendingResponse(m,f.status,f.statusText,f.headers),m.optimisticResponse&&f.status>=400)m.streamController?.enqueue(new TextEncoder().encode(`event: error
40
40
  data: ${JSON.stringify({type:"error",error:{type:"relay_upstream_error",message:`Relay upstream returned HTTP ${f.status}`}})}
41
41
 
42
42
  `)),this.finishPending();return}if(f.type==="chunk"){this.enqueueStreamChunk(m,X_(f.base64));return}if(f.type==="done"){this.finishPending();return}if(f.type==="error"){if(m.optimisticResponse&&m.responseStartedAt!=null){j(`websocket relay error during optimistic response session=${J(this.affinity)} request=${m.payload.id} status=${f.status} message=${f.message||"unknown"} chunks=${m.streamChunkCount} bytes=${m.streamByteCount}`),m.streamController?.enqueue(new TextEncoder().encode(`event: error
43
43
  data: ${JSON.stringify({type:"error",error:{type:"relay_error",message:f.message||"relay error"}})}
44
44
 
45
- `)),this.finishPending(),this.socket?.close();return}if(f.status===409&&this.retryPendingBeforeResponse(m,f.message||"state mismatch"))return;let _=f.status===409?new yf(f.message||"state mismatch"):Error(Y_(f));this.failPending(_)}}finishPending(){let f=this.pending;if(!f)return;let m=R();if(j(`perf websocket done session=${J(this.affinity)} request=${f.payload.id} sentMs=${T(m-f.sentAt)} streamMs=${f.responseStartedAt==null?"unknown":T(m-f.responseStartedAt)} chunks=${f.streamChunkCount} bytes=${f.streamByteCount}`),clearTimeout(f.timeout),!f.streamDone)f.streamDone=!0,f.streamController?.close();f.resolveDone(),this.pending=void 0}failPending(f){let m=this.pending;if(!m)return;if(clearTimeout(m.timeout),this.pending=void 0,m.responseStarted)m.streamController?.error(f);else m.reject(f);m.rejectDone(f)}}function Q_(f,m){let _=cm.get(m);if(_)return _;let $=new C0(f,m);return cm.set(m,$),$}async function BD(f){let{config:m,input:_,init:$,headers:D,body:C,fallback:E,affinity:M,optimisticResponse:S}=f;if(!m||!z_(_,C))return E();let N=M||D.get("x-session-affinity")||D.get("x-opencode-session");if(!N)return j("skipping relay: missing x-session-affinity header"),E();let H=C,K=G_(H),F=uf.get(N),L=W_({input:_,init:$,headers:D,bodyText:H,affinity:N,previous:F,nextHash:K});try{let U;if(m.transport==="websocket")try{U=await Q_(m,N).send(L,H,S===!0)}catch(A){j(`websocket relay failed session=${J(N)}; trying http relay: ${A instanceof Error?A.message:String(A)}`),U=await f0({config:m,payload:L,bodyText:H,fallback:E})}else U=await f0({config:m,payload:L,bodyText:H,fallback:E});if(!U.usedRelay)return U.response;if(U.transport==="http")D0(N,H,U.payload.next_hash,U.payload.revision);let z=JSON.stringify(U.payload).length;return j(`used relay transport=${U.transport} protocol=${U.protocol} mode=${U.payload.mode} status=${U.response.status} session=${J(N)} bodyBytes=${H.length} relayBytes=${z}`),await vm({affinity:N,transport:U.transport,protocol:U.protocol,mode:U.payload.mode,status:U.response.status,bodyText:H,previousBodyText:F?.body,payload:U.payload,relayBytes:z}),U.response}catch(U){if(!m.fallbackToDirect)throw j(`relay failed session=${J(N)} and fallbackToDirect=false: ${U instanceof Error?U.message:String(U)}`),U;return j(`relay failed; falling back direct session=${J(N)}: ${U instanceof Error?U.message:String(U)}`),E()}}var zD=`
45
+ `)),this.finishPending(),this.socket?.close();return}if(f.status===409&&this.retryPendingBeforeResponse(m,f.message||"state mismatch"))return;let _=f.status===409?new yf(f.message||"state mismatch"):Error(Q_(f));this.failPending(_)}}finishPending(){let f=this.pending;if(!f)return;let m=R();if(j(`perf websocket done session=${J(this.affinity)} request=${f.payload.id} sentMs=${T(m-f.sentAt)} streamMs=${f.responseStartedAt==null?"unknown":T(m-f.responseStartedAt)} chunks=${f.streamChunkCount} bytes=${f.streamByteCount}`),clearTimeout(f.timeout),!f.streamDone)f.streamDone=!0,f.streamController?.close();f.resolveDone(),this.pending=void 0}failPending(f){let m=this.pending;if(!m)return;if(clearTimeout(m.timeout),this.pending=void 0,m.responseStarted)m.streamController?.error(f);else m.reject(f);m.rejectDone(f)}}function x_(f,m){let _=cm.get(m);if(_)return _;let $=new C0(f,m);return cm.set(m,$),$}async function AD(f){let{config:m,input:_,init:$,headers:D,body:C,fallback:E,affinity:M,optimisticResponse:S}=f;if(!m||!B_(_,C))return E();let N=M||D.get("x-session-affinity")||D.get("x-opencode-session");if(!N)return j("skipping relay: missing x-session-affinity header"),E();let H=C,K=J_(H),F=uf.get(N),L=V_({input:_,init:$,headers:D,bodyText:H,affinity:N,previous:F,nextHash:K});try{let U;if(m.transport==="websocket")try{U=await x_(m,N).send(L,H,S===!0)}catch(B){j(`websocket relay failed session=${J(N)}; trying http relay: ${B instanceof Error?B.message:String(B)}`),U=await f0({config:m,payload:L,bodyText:H,fallback:E})}else U=await f0({config:m,payload:L,bodyText:H,fallback:E});if(!U.usedRelay)return U.response;if(U.transport==="http")D0(N,H,U.payload.next_hash,U.payload.revision);let A=JSON.stringify(U.payload).length;return j(`used relay transport=${U.transport} protocol=${U.protocol} mode=${U.payload.mode} status=${U.response.status} session=${J(N)} bodyBytes=${H.length} relayBytes=${A}`),await vm({affinity:N,transport:U.transport,protocol:U.protocol,mode:U.payload.mode,status:U.response.status,bodyText:H,previousBodyText:F?.body,payload:U.payload,relayBytes:A}),U.response}catch(U){if(!m.fallbackToDirect)throw j(`relay failed session=${J(N)} and fallbackToDirect=false: ${U instanceof Error?U.message:String(U)}`),U;return j(`relay failed; falling back direct session=${J(N)}: ${U instanceof Error?U.message:String(U)}`),E()}}var BD=`
46
46
  async function hashBody(body) {
47
47
  const bytes = new TextEncoder().encode(body)
48
48
  const digest = await crypto.subtle.digest('SHA-256', bytes)
@@ -327,9 +327,9 @@ export default {
327
327
  }
328
328
  },
329
329
  }
330
- `;var VD="claude-routing",df=["main-first","fallback-first"],nf="main-first",E0="Usage: `/claude-routing`, `/claude-routing main-first`, or `/claude-routing fallback-first`.";function x_(f){return typeof f==="string"&&df.includes(f)?f:nf}function XD(f){return x_(f?.routing?.mode)}async function hD(f,m=B()){let _=await h(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.routing={..._.routing??{},mode:f},await Z(_,m),_}function R_(f){let m=f.trim().toLowerCase().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&df.includes(m[0]))return{type:"mode",mode:m[0]};if(m.length===2&&m[0]==="mode"&&df.includes(m[1]))return{type:"mode",mode:m[1]};return{type:"usage"}}function P_(f){if(f==="fallback-first")return"Try usable fallback accounts before the main account. If no fallback succeeds, try the main account.";return"Try the main account first. Use fallback accounts only when quota policy or fallback errors require it."}function vf(f){let m=f?.mode??nf;return["## Claude Routing Status","",`- Mode: \`${m}\``,`- Behavior: ${P_(m)}`,"",E0].join(`
331
- `)}function ZD(f){let m=R_(f.argumentsText),_=f.mode??nf;if(m.type==="status")return vf({mode:_});if(m.type==="mode")return["## Claude Routing Updated","",`Mode updated to \`${m.mode}\`.`,"",...vf({mode:m.mode}).split(`
330
+ `;var hD="claude-routing",df=["main-first","fallback-first"],nf="main-first",E0="Usage: `/claude-routing`, `/claude-routing main-first`, or `/claude-routing fallback-first`.";function R_(f){return typeof f==="string"&&df.includes(f)?f:nf}function XD(f){return R_(f?.routing?.mode)}async function ZD(f,m=z()){let _=await X(m)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};return _.routing={..._.routing??{},mode:f},await Z(_,m),_}function P_(f){let m=f.trim().toLowerCase().split(/\s+/).filter(Boolean);if(m.length===0)return{type:"status"};if(m.length===1&&df.includes(m[0]))return{type:"mode",mode:m[0]};if(m.length===2&&m[0]==="mode"&&df.includes(m[1]))return{type:"mode",mode:m[1]};return{type:"usage"}}function q_(f){if(f==="fallback-first")return"Try usable fallback accounts before the main account. If no fallback succeeds, try the main account.";return"Try the main account first. Use fallback accounts only when quota policy or fallback errors require it."}function vf(f){let m=f?.mode??nf;return["## Claude Routing Status","",`- Mode: \`${m}\``,`- Behavior: ${q_(m)}`,"",E0].join(`
331
+ `)}function YD(f){let m=P_(f.argumentsText),_=f.mode??nf;if(m.type==="status")return vf({mode:_});if(m.type==="mode")return["## Claude Routing Updated","",`Mode updated to \`${m.mode}\`.`,"",...vf({mode:m.mode}).split(`
332
332
  `).slice(2)].join(`
333
333
  `);return["## Claude Routing Usage","",E0,"",...vf({mode:_}).split(`
334
334
  `).slice(2)].join(`
335
- `)}export{q_ as a,rf as b,I_ as c,i_ as d,T_ as e,w_ as f,l_ as g,of as h,y_ as i,k_ as j,P as k,Dm as l,n_ as m,g_ as n,Y as o,B as p,h as q,Z as r,Af as s,_$ as t,o0 as u,$$ as v,D$ as w,C$ as x,E$ as y,M$ as z,S$ as A,b$ as B,N$ as C,H$ as D,Jm as E,$1 as F,u as G,Gf as H,U$ as I,Am as J,D1 as K,j$ as L,K$ as M,F$ as N,L$ as O,N1 as P,J$ as Q,B$ as R,z$ as S,A$ as T,F1 as U,W$ as V,qm as W,i$ as X,Z$ as Y,Y$ as Z,Q$ as _,Qm as $,y$ as aa,k$ as ba,v1 as ca,Rf as da,wm as ea,d1 as fa,p$ as ga,g1 as ha,s$ as ia,r$ as ja,$_ as ka,o$ as la,e$ as ma,fD as na,mD as oa,S_ as pa,_D as qa,t as ra,CD as sa,i as ta,ND as ua,HD as va,UD as wa,GD as xa,JD as ya,BD as za,zD as Aa,VD as Ba,XD as Ca,hD as Da,R_ as Ea,ZD as Fa};
335
+ `)}export{I_ as a,rf as b,i_ as c,T_ as d,l_ as e,w_ as f,y_ as g,of as h,k_ as i,p_ as j,P as k,Dm as l,g_ as m,t_ as n,Y as o,z as p,X as q,Z as r,Bf as s,$$ as t,o0 as u,D$ as v,C$ as w,E$ as x,M$ as y,S$ as z,b$ as A,N$ as B,H$ as C,U$ as D,Jm as E,$1 as F,u as G,Gf as H,j$ as I,Bm as J,D1 as K,K$ as L,F$ as M,L$ as N,O$ as O,N1 as P,z$ as Q,A$ as R,B$ as S,W$ as T,F1 as U,V$ as V,qm as W,T$ as X,Y$ as Y,Q$ as Z,x$ as _,Qm as $,k$ as aa,p$ as ba,v1 as ca,Rf as da,lm as ea,d1 as fa,u$ as ga,g1 as ha,r$ as ia,o$ as ja,$_ as ka,a$ as la,fD as ma,mD as na,_D as oa,b_ as pa,$D as qa,t as ra,ED as sa,i as ta,HD as ua,UD as va,jD as wa,JD as xa,zD as ya,AD as za,BD as Aa,hD as Ba,XD as Ca,ZD as Da,P_ as Ea,YD as Fa};
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import{$ as v1,A as p1,B as l1,Ba as f0,C as u1,Ca as j1,D as c0,Da as Pj,E as M0,Ea as zj,F as i1,Fa as J1,G as $0,H as n0,I as c1,J as P0,K as z0,L as v0,M as n1,N as o1,O as s1,P as r1,Q as F0,R as q0,S as E0,T as Q0,U as t1,V as C0,W as B1,X as H1,Y as o0,Z as U1,_ as M1,a as I1,aa as x0,b as O1,ba as a1,c as _0,ca as e1,d as B0,da as jj,e as L1,ea as Jj,f as K0,fa as s0,g as k1,ga as Zj,h as N1,ha as $j,i as w1,ia as S0,j as _1,ja as R0,k as d0,ka as Gj,l as f1,la as r0,m as p0,ma as T0,n as l0,na as t0,o as F,oa as y0,p as m1,pa as Vj,q as R,qa as a0,r as Y0,ra as A0,s as b1,sa as Dj,t as H0,ta as Kj,u as U0,ua as k0,v as h1,va as Xj,w as g1,wa as Wj,x as u0,xa as e0,y as d1,z as i0,za as Yj}from"./index-vmrz4qdc.js";import{Ja as Qj}from"./index-q0d64q8d.js";import{randomUUID as pj}from"node:crypto";function Z0(j){return typeof j==="object"&&j!==null}function Fj(j){if(Array.isArray(j))return j;if(Z0(j)&&Array.isArray(j.data))return j.data;return[]}function qj(j){if(!Z0(j)||!Z0(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function G1(j){if(!Z0(j)||!Z0(j.info))return null;let J=j.info,Z=Z0(J.model)?J.model:void 0,G=typeof J.agent==="string"?J.agent:void 0,V=typeof Z?.providerID==="string"?Z.providerID:typeof J.providerID==="string"?J.providerID:void 0,Y=typeof Z?.modelID==="string"?Z.modelID:typeof J.modelID==="string"?J.modelID:void 0,v=typeof Z?.variant==="string"?Z.variant:typeof J.variant==="string"?J.variant:void 0;if(!G&&(!V||!Y)&&!v)return null;let u={};if(G)u.agent=G;if(V&&Y)u.model={providerID:V,modelID:Y};if(v)u.variant=v;return u}function V1(j,J){return{agent:j.agent??J.agent,model:j.model??J.model,variant:j.variant??J.variant}}function D1(j){return Boolean(j.agent&&j.model&&j.variant)}async function K1(j,J){if(!j||!J)return null;let Z=j;if(typeof Z.session?.messages!=="function")return null;let G=[];try{G=Fj(await Promise.resolve(Z.session.messages({path:{id:J},query:{limit:100}})))}catch{return null}if(G.length===0)return null;let V={};for(let Y=G.length-1;Y>=0;Y--){if(qj(G[Y])!=="assistant")continue;let v=G1(G[Y]);if(!v)continue;if(V=V1(V,v),D1(V))return V}for(let Y=G.length-1;Y>=0;Y--){let v=G1(G[Y]);if(!v)continue;if(V=V1(V,v),D1(V))return V}if(!V.agent&&!V.model&&!V.variant)return null;return V}function X1(j){return`${I1}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function F1(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}var Ej=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function W1(j){let J=F1(j);if(J.startsWith("aft_"))return J;if(Ej.has(J))return`aft_${J}`;return null}function q1(j,J){let Z=new Headers;if(j instanceof Request)j.headers.forEach((V,Y)=>{Z.set(Y,V)});let G=J?.headers;if(G){if(G instanceof Headers)G.forEach((V,Y)=>{Z.set(Y,V)});else if(Array.isArray(G))for(let V of G){let[Y,v]=V;if(typeof v<"u")Z.set(Y,String(v))}else for(let[V,Y]of Object.entries(G))if(typeof Y<"u")Z.set(V,String(Y))}return Z}function g0(j){return j.set("anthropic-beta",_0(j.get("anthropic-beta"),[O1])),j}function X0(j,J,Z={}){return M1(j,J,Z)}function Cj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((J)=>({...J,name:J.name?X1(J.name):J.name}));if(j.messages&&Array.isArray(j.messages))j.messages=j.messages.map((J)=>{if(J.content&&Array.isArray(J.content))J.content=J.content.map((Z)=>{if(Z.type==="tool_use"&&Z.name)return{...Z,name:X1(Z.name)};return Z});return J});return JSON.stringify(v1(j))}function b0(j){return j.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(J,Z,G)=>{if(Z)return`"name": "${W1(G)??F1(G)}"`;let V=W1(G);return V?`"name": "${V}"`:J})}function Y1(j,J=!1){if(J)return{ready:b0(j),pending:""};let Z=j.length,G='"name"',V=Math.max(0,j.length-G.length+1);for(let v=V;v<j.length;v++)if(G.startsWith(j.slice(v))){Z=Math.min(Z,v);break}let Y=j.lastIndexOf(G);if(Y!==-1){let v=j.slice(Y);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(v))Z=Math.min(Z,Y)}if(Z<j.length)return{ready:b0(j.slice(0,Z)),pending:j.slice(Z)};return{ready:b0(j),pending:""}}function E1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function xj(){let j=process.env.ANTHROPIC_BASE_URL?.trim();if(!j)return null;try{let J=new URL(j);if(J.protocol!=="http:"&&J.protocol!=="https:"||J.username||J.password)return null;return J}catch{return null}}function C1(j){let J=null;try{if(typeof j==="string"||j instanceof URL)J=new URL(j.toString());else if(j instanceof Request)J=new URL(j.url)}catch{J=null}if(!J)return{input:j,url:null};let Z=J.href,G=xj();if(G)J.protocol=G.protocol,J.host=G.host;if(J.pathname==="/v1/messages"&&!J.searchParams.has("beta"))J.searchParams.set("beta","true");if(J.href===Z)return{input:j,url:J};return{input:j instanceof Request?new Request(J.toString(),j):J,url:J}}function L0(j){let G=j.split(/\n\n+/).filter((V)=>{if(V.includes(L1))return!1;for(let Y of w1)if(V.includes(Y))return!1;return!0}).join(`
1
+ import{$ as C1,A as i1,B as c1,Ba as b0,C as n1,Ca as Z1,D as r0,Da as zj,E as v0,Ea as Qj,F as o1,Fa as $1,G as Z0,H as s0,I as r1,J as P0,K as O0,L as q0,M as s1,N as t1,O as a1,P as e1,Q as C0,R as E0,S as x0,T as I0,U as jj,V as S0,W as U1,X as F1,Y as t0,Z as v1,_ as q1,a as _1,aa as R0,b as L1,ba as Gj,c as B0,ca as Jj,d as M0,da as Zj,e as w1,ea as $j,f as X0,fa as a0,g as b1,ga as Dj,h as H1,ha as Vj,i as B1,ia as T0,j as M1,ja as y0,k as u0,ka as Xj,l as h1,la as e0,m as i0,ma as A0,n as c0,na as j1,o as v,oa as f0,p as g1,pa as Kj,q as R,qa as G1,r as W0,ra as k0,s as p1,sa as Yj,t as U0,ta as Wj,u as F0,ua as m0,v as d1,va as Pj,w as l1,wa as Oj,x as n0,xa as J1,y as u1,z as o0,za as Ij}from"./index-ykvgffhr.js";import{Ja as Nj}from"./index-q0d64q8d.js";import{randomUUID as oj}from"node:crypto";function J0(j){return typeof j==="object"&&j!==null}function Ej(j){if(Array.isArray(j))return j;if(J0(j)&&Array.isArray(j.data))return j.data;return[]}function xj(j){if(!J0(j)||!J0(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function X1(j){if(!J0(j)||!J0(j.info))return null;let G=j.info,J=J0(G.model)?G.model:void 0,D=typeof G.agent==="string"?G.agent:void 0,$=typeof J?.providerID==="string"?J.providerID:typeof G.providerID==="string"?G.providerID:void 0,P=typeof J?.modelID==="string"?J.modelID:typeof G.modelID==="string"?G.modelID:void 0,F=typeof J?.variant==="string"?J.variant:typeof G.variant==="string"?G.variant:void 0;if(!D&&(!$||!P)&&!F)return null;let l={};if(D)l.agent=D;if($&&P)l.model={providerID:$,modelID:P};if(F)l.variant=F;return l}function K1(j,G){return{agent:j.agent??G.agent,model:j.model??G.model,variant:j.variant??G.variant}}function Y1(j){return Boolean(j.agent&&j.model&&j.variant)}async function W1(j,G){if(!j||!G)return null;let J=j;if(typeof J.session?.messages!=="function")return null;let D=[];try{D=Ej(await Promise.resolve(J.session.messages({path:{id:G},query:{limit:100}})))}catch{return null}if(D.length===0)return null;let $={};for(let P=D.length-1;P>=0;P--){if(xj(D[P])!=="assistant")continue;let F=X1(D[P]);if(!F)continue;if($=K1($,F),Y1($))return $}for(let P=D.length-1;P>=0;P--){let F=X1(D[P]);if(!F)continue;if($=K1($,F),Y1($))return $}if(!$.agent&&!$.model&&!$.variant)return null;return $}function P1(j){return`${_1}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function E1(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}var Sj=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function O1(j){let G=E1(j);if(G.startsWith("aft_"))return G;if(Sj.has(G))return`aft_${G}`;return null}function x1(j,G){let J=new Headers;if(j instanceof Request)j.headers.forEach(($,P)=>{J.set(P,$)});let D=G?.headers;if(D){if(D instanceof Headers)D.forEach(($,P)=>{J.set(P,$)});else if(Array.isArray(D))for(let $ of D){let[P,F]=$;if(typeof F<"u")J.set(P,String(F))}else for(let[$,P]of Object.entries(D))if(typeof P<"u")J.set($,String(P))}return J}function d0(j){return j.set("anthropic-beta",B0(j.get("anthropic-beta"),[L1])),j}function K0(j,G,J={}){return q1(j,G,J)}function Rj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((G)=>({...G,name:G.name?P1(G.name):G.name}));if(j.messages&&Array.isArray(j.messages))j.messages=j.messages.map((G)=>{if(G.content&&Array.isArray(G.content))G.content=G.content.map((J)=>{if(J.type==="tool_use"&&J.name)return{...J,name:P1(J.name)};return J});return G});return JSON.stringify(C1(j))}function p0(j){return j.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(G,J,D)=>{if(J)return`"name": "${O1(D)??E1(D)}"`;let $=O1(D);return $?`"name": "${$}"`:G})}function I1(j,G=!1){if(G)return{ready:p0(j),pending:""};let J=j.length,D='"name"',$=Math.max(0,j.length-D.length+1);for(let F=$;F<j.length;F++)if(D.startsWith(j.slice(F))){J=Math.min(J,F);break}let P=j.lastIndexOf(D);if(P!==-1){let F=j.slice(P);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(F))J=Math.min(J,P)}if(J<j.length)return{ready:p0(j.slice(0,J)),pending:j.slice(J)};return{ready:p0(j),pending:""}}function S1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function Tj(){let j=process.env.ANTHROPIC_BASE_URL?.trim();if(!j)return null;try{let G=new URL(j);if(G.protocol!=="http:"&&G.protocol!=="https:"||G.username||G.password)return null;return G}catch{return null}}function R1(j){let G=null;try{if(typeof j==="string"||j instanceof URL)G=new URL(j.toString());else if(j instanceof Request)G=new URL(j.url)}catch{G=null}if(!G)return{input:j,url:null};let J=G.href,D=Tj();if(D)G.protocol=D.protocol,G.host=D.host;if(G.pathname==="/v1/messages"&&!G.searchParams.has("beta"))G.searchParams.set("beta","true");if(G.href===J)return{input:j,url:G};return{input:j instanceof Request?new Request(G.toString(),j):G,url:G}}function _0(j){let D=j.split(/\n\n+/).filter(($)=>{if($.includes(w1))return!1;for(let P of B1)if($.includes(P))return!1;return!0}).join(`
2
2
 
3
- `);for(let V of _1)G=G.replace(V.match,V.replacement);return G.trim()}function f(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function Sj(j){let J={type:"text",text:K0};if(j==null)return[J];if(typeof j==="string"){let G=L0(j);if(G===K0)return[J];return[J,{type:"text",text:G}]}if(f(j)){let G=typeof j.type==="string"?j.type:"text",V=typeof j.text==="string"?j.text:"";return[J,{...j,type:G,text:L0(V)}]}if(!Array.isArray(j))return[J];let Z=j.map((G)=>{if(typeof G==="string")return{type:"text",text:L0(G)};if(f(G)&&G.type==="text"&&typeof G.text==="string")return{...G,type:"text",text:L0(G.text)};return{type:"text",text:String(G)}});if(Z[0]?.text===K0)return Z;return[J,...Z]}var x1={type:"ephemeral",ttl:"1h"},Rj=20;function Tj(j){if(f(j.cache_control))return j.cache_control;if(f(j.cacheControl))return j.cacheControl;return null}function h0(j,J){if(!f(j))return!1;return delete j.cacheControl,j.cache_control=J?{...x1}:{type:"ephemeral"},!0}function P1(j){if(!f(j))return;delete j.cache_control,delete j.cacheControl}function yj(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function N0(j,J){if(!f(j))return;let Z=Tj(j);if(Z?.type!=="ephemeral")return;if(J)Z.ttl="1h";else delete Z.ttl}function z1(j,J){if(Array.isArray(j.system))for(let Z of j.system)N0(Z,J);else N0(j.system,J);if(!Array.isArray(j.messages))return;for(let Z of j.messages)if(N0(Z,J),f(Z)&&Array.isArray(Z.content))for(let G of Z.content)N0(G,J)}function Aj(j,J){if(Array.isArray(j.system))for(let Z of j.system)J(Z);else J(j.system);if(!Array.isArray(j.messages))return;for(let Z of j.messages)if(J(Z),f(Z)&&Array.isArray(Z.content))for(let G of Z.content)J(G)}function S1(j){P1(j),Aj(j,P1)}function kj(j){S1(j),j.cache_control={...x1}}function w0(j){if(!f(j))return!1;let J=yj(j.content);if(!J?.length)return!1;let Z=[...J].reverse().find((G)=>f(G)&&G.type!=="thinking"&&G.type!=="redacted_thinking");if(!Z)return!1;return j.content=J,h0(Z,!0)}function fj(j){if(!f(j))return 0;let J=j.content;if(Array.isArray(J))return J.length;if(J==null)return 0;return 1}function mj(j){let J=[],Z=0;return j.forEach((G,V)=>{let Y=fj(G);if(f(G)&&G.role==="user"&&Y>0)J.push({index:V,blockPosition:Z+Y-1});Z+=Y}),J}function bj(j){let J=mj(j),Z=[...J].reverse().find((v)=>v.index>1);if(!Z)return{latest:void 0,bridge:void 0};let G=[...J].reverse().find((v)=>v.index<Z.index),V=G?Z.blockPosition-G.blockPosition+1:0,Y=G&&G.index>1&&V>Rj?G:void 0;return{latest:Z,bridge:Y}}function Q1(j){if(Array.isArray(j.system)){let J=j.system.findIndex((V)=>f(V)&&V.text===K0),Z=j.system.slice(J>=0?J+1:0).filter(f),G=Z[Z.length-1];h0(G,!0)}else h0(j.system,!0)}function hj(j){if(S1(j),!Array.isArray(j.messages)){Q1(j);return}let{latest:J,bridge:Z}=bj(j.messages);if(!Z)Q1(j);if(w0(j.messages[0]),w0(j.messages[1]),Z)w0(j.messages[Z.index]);if(J)w0(j.messages[J.index])}function gj(j,J){if(!J.enabled){z1(j,!1),delete j.cache_control,delete j.cacheControl;return}if(J.mode==="automatic"){kj(j);return}if(J.mode==="hybrid"){hj(j);return}z1(j,!0),delete j.cacheControl}function dj(j){if(!Array.isArray(j.messages))return;while(j.messages.length){let J=j.messages[j.messages.length-1];if(!f(J)||J.role!=="assistant")break;j.messages.pop()}}async function R1(j,J={}){try{let Z=JSON.parse(j);dj(Z);let G=Array.isArray(Z.messages)&&Z.messages.some((V)=>V.role==="user")?H1(Z.messages,void 0,N1):null;if(Z.system=Sj(Z.system),G&&Array.isArray(Z.system))Z.system.unshift({type:"text",text:G});if(gj(Z,{enabled:J.cache1hEnabled??!1,mode:J.cache1hMode??"explicit"}),J.fastModeEnabled&&B0(Z.model))Z.speed="fast";else if(Z.speed==="fast")delete Z.speed;if(J.identity)U1(Z,J.identity);return await B1(Cj(Z))}catch{return j}}function W0(j){if(!j.body)return j;let J=j.body.getReader(),Z=new TextDecoder,G=new TextEncoder,V="",Y=new ReadableStream({async pull(v){let{done:u,value:G0}=await J.read();if(u){let d=Y1(`${V}${Z.decode()}`,!0);if(d.ready)v.enqueue(G.encode(d.ready));v.close();return}let o=V+Z.decode(G0,{stream:!0}),e=Y1(o);if(V=e.pending,e.ready)v.enqueue(G.encode(e.ready))}});return new Response(Y,{status:j.status,statusText:j.statusText,headers:j.headers})}var lj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",uj=60000,ij=60000,cj=5000,T1=200,Ij=240,nj=Ij,oj=1,y1=!1;function m0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function q(){return performance.now()}function y(j){return Math.round(j*10)/10}function A1(j){return Math.floor(Math.random()*Math.max(0,j))}function sj(){if(y1||!1||!m0())return;y1=!0;let j=100,J=250,Z=q()+j;setInterval(()=>{let G=q(),V=G-Z;if(Z=G+j,V<J)return;F("[perf] opencode event_loop_lag",{lagMs:y(V),thresholdMs:J})},j).unref?.()}function rj(j){let J=q(),Z={requestId:String(oj++),start:J,last:J,mark(G,V){let Y=q();if(m0())F("[perf] opencode request stage",{requestId:Z.requestId,stage:G,deltaMs:y(Y-Z.last),totalMs:y(Y-Z.start),...V});Z.last=Y},done(G,V){let Y=q();if(m0())F("[perf] opencode request done",{requestId:Z.requestId,stage:G,deltaMs:y(Y-Z.last),totalMs:y(Y-Z.start),...V});Z.last=Y}};if(m0())F("[perf] opencode request start",{requestId:Z.requestId,...j});return Z}async function t(j,J,Z){let G=j.client.session,V=await K1(j.client,J),Y={path:{id:J},body:{noReply:!0,parts:[{type:"text",text:Z,ignored:!0}]}};if(V?.agent)Y.body.agent=V.agent;if(V?.model)Y.body.model=V.model;if(V?.variant)Y.body.variant=V.variant;if(typeof G?.promptAsync==="function"){await G.promptAsync(Y);return}if(typeof G?.prompt==="function"){await Promise.resolve(G.prompt(Y));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function a(){throw Error(lj)}function tj(j){if(j.sessionID==null)return!1;let J=j.model;return J?.providerID==="anthropic"||J?.api?.npm==="@ai-sdk/anthropic"||J?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function aj(j){if(j.some((J)=>J.includes("<use_parallel_tool_calls>")))return!1;return j.push(k1),!0}var XJ=async(j)=>{sj();let{client:J}=j,Z=m1(),G=await R(Z),V=new Kj({storage:G,onMainQuotaFetched:async($,D,X)=>{try{let W=await R(Z)??{version:1,accounts:[]};W.quota=W.quota??{},W.quota.mainQuota=$,W.quota.mainQuotaCheckedAt=D,W.quota.mainQuotaToken=X,W.quota.mainLastQuotaApiError=void 0,await Y0(W,Z)}catch(W){F("[quota] failed to persist main quota",{error:W instanceof Error?W.message:String(W)})}},onApiError:async($)=>{try{let D=await R(Z)??{version:1,accounts:[]};D.quota=D.quota??{},D.quota.mainLastQuotaApiError=$,await Y0(D,Z)}catch(D){F("[quota] failed to persist backoff state",{error:D instanceof Error?D.message:String(D)})}}}),Y=new r1({quotaManager:V,onFallbackStorageChanged:()=>{e()}});Y.startBackgroundRefresh();let v=null,u=new $j({loadStorage:()=>R(Z),prepareHeaders:async($,D)=>{if(!d)return $;let X=await d();if(X.type!=="oauth")return $;if(!X.access||X.expires&&X.expires<Date.now()){if(!v)return $;X.access=await v()}if(!X.access)return $;try{let W=JSON.parse(D.bodyText),P=await o0(X.access,typeof W.model==="string"?W.model:void 0);if($.delete("anthropic-beta"),X0($,X.access,{body:W,identity:P}),$.set("anthropic-beta",_0($.get("anthropic-beta"),[a1])),W.speed==="fast")g0($)}catch{X0($,X.access)}return $},log:F});Q0({enabled:H0(G),mode:U0(G)}),R0(u0(G)),y0(i0(G));let G0={activeId:"main",route:"main"};function o($,D){G0={activeId:D.activeId,route:D.route};let X=V.getMain(D.mainAccessToken),W=V.getLastApiError(),P=$?.refresh?.mainLastRefreshError,x={main:{quota:X?.quota??null,quotaBackedOff:V.isBackedOff(),quotaBackoffUntil:W?.nextRetryAt,refreshBackedOff:P?$0(P,D.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:P?.nextRetryAt},fallbacks:($?.accounts??[]).filter((E)=>E.enabled!==!1).map((E)=>({id:E.id,label:E.label,quota:E.access?V.getFallback(E.id,E.access)?.quota??null:null,enabled:E.enabled!==!1})),activeId:D.activeId,route:D.route,relay:(()=>{let E=e0($);return E?{enabled:!0,transport:E.transport??"http"}:null})(),fastMode:t0(),cacheKeep:{enabled:s0($),window:$?.cacheKeep?.startHour!=null&&$?.cacheKeep?.endHour!=null?`${$.cacheKeep.startHour}-${$.cacheKeep.endHour}`:void 0,trackedSessions:u.trackedCount()},lastUpdated:Date.now()};Qj(x).catch((E)=>F("[sidebar] state write failed",{error:E instanceof Error?E.message:String(E)}))}async function e(){let $=await R(Z),D,X;if(d)try{let W=await d();D=W.access,X=W.refresh}catch{}o($,{activeId:G0.activeId,route:G0.route,mainAccessToken:D,mainRefreshToken:X})}let d=null,j0=null,I0=0;function Oj($){let D=$?.refresh?.refreshBeforeExpiryMinutes??nj;return Math.max(Ij,D)*60000}function Lj($){return $?.refresh?.enabled!==!1}async function Z1($){if(!$)return;let D=await R(Z),X=D?.refresh?.mainLastRefreshError;if(!D?.refresh||!X?.tokenHash)return;let W=M0($);if(X.tokenHash===W)return;if(X.nextRetryAt&&X.nextRetryAt>Date.now()){F("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:X.nextRetryAt,retryCount:X.retryCount,remainingMs:X.nextRetryAt-Date.now()});return}D.refresh.mainLastRefreshError=void 0,await Y0(D,Z),F("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:X.checkedAt,previousNextRetryAt:X.nextRetryAt,previousRetryCount:X.retryCount})}async function Nj(){let $=[];if(d)try{let P=await d();if(P.type==="oauth"&&P.access){let x=await V.refreshMain(P.access);$.push({name:"OpenCode anthropic",role:"main",quota:x})}else if(P.type==="oauth")$.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(P){let x=P instanceof Error?P.message:String(P);$.push({name:"OpenCode anthropic",role:"main",error:x.includes("429")?"Usage API rate limited — try again in a moment":x})}let{storage:D,errors:X}=await Y.refreshQuotaForAllAccounts({force:!0}),W=new Map(X.map((P)=>[P.accountId,P.message]));if($.push(...Xj(D,W)),!d)$.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return Wj({accounts:$,refreshedAt:Date.now()})}async function wj($){let D=t1($);if(D.type==="enable"||D.type==="disable"){let x=D.type==="enable",E=await h1(x),h=U0(E);return Q0({enabled:x,mode:h}),C0({argumentsText:$,enabled:x,mode:h})}if(D.type==="mode"){let x=await g1(D.mode),E=H0(x);return Q0({enabled:E,mode:D.mode}),C0({argumentsText:$,enabled:E,mode:D.mode})}let X=await R(Z),W=H0(X),P=U0(X);return Q0({enabled:W,mode:P}),C0({argumentsText:$,enabled:W,mode:P})}async function _j($){let D=e1($),X=await R(Z);if(D.type==="window")X=await l1(D.startHour,D.endHour);else if(D.type==="disable")X=await u1(!1);let W=jj(X),P=u.stats(W);return Zj({argumentsText:$,enabled:Jj(X),window:W,hybridActive:s0(X),trackedSessions:P.trackedSessions,nextPrewarmAt:P.nextPrewarmAt})}async function Bj($){let D=Gj($);if(D.type==="enable"||D.type==="disable"){let P=D.type==="enable";return await d1(P),R0(P),r0({argumentsText:$,enabled:P})}let X=await R(Z),W=u0(X);return R0(W),r0({argumentsText:$,enabled:W})}async function Hj($){let D=Vj($);if(D.type==="enable"||D.type==="disable"){let P=D.type==="enable";return await p1(P),y0(P),a0({argumentsText:$,enabled:P})}let X=await R(Z),W=i0(X);return y0(W),a0({argumentsText:$,enabled:W})}async function Uj($){let D=zj($);if(D.type==="mode")return await Pj(D.mode),J1({argumentsText:$,mode:D.mode});let X=await R();return J1({argumentsText:$,mode:j1(X)})}function Mj($,D=10){let X=Math.max(0,Math.min(Math.round($/100*D),D));return"█".repeat(X)+"░".repeat(D-X)}function O0($,D){return`${$} ${Mj(D)} ${String(Math.round(D)).padStart(3)}%`}function $1($){if(!$)return"";let D=new Date($).getTime();if(Number.isNaN(D))return"";let X=D-Date.now();if(X<=0)return"resets now";let W=Math.floor(X/60000);if(W<1)return"resets <1m";if(W<60)return`resets ${W}m`;let P=Math.floor(W/60),x=W%60;return x>0?`resets ${P}h${x}m`:`resets ${P}h`}function vj($,D,X){let W=[],P=0;if($){let{five_hour:h,seven_day:p}=$;if(h||p){let i=X==="main"?"active":"idle",s=$1(h?.resetsAt),n=[`main · ${i}${s?` (${s})`:""}`];if(h)n.push(O0("5h",h.usedPercent)),P=Math.max(P,h.usedPercent);if(p)n.push(O0("7d",p.usedPercent)),P=Math.max(P,p.usedPercent);W.push(n.join(`
4
- `))}}if(D?.length)for(let h of D){let p=h.quota;if(!p)continue;let{five_hour:c,seven_day:i}=p;if(!c&&!i)continue;let s=h.label||"alt",V0=X===h.id?"active":"idle",r=$1(c?.resetsAt),D0=[`${s} · ${V0}${r?` (${r})`:""}`];if(c)D0.push(O0("5h",c.usedPercent)),P=Math.max(P,c.usedPercent);if(i)D0.push(O0("7d",i.usedPercent)),P=Math.max(P,i.usedPercent);W.push(D0.join(`
5
- `))}if(!W.length)return;let x=W.join(`
3
+ `);for(let $ of M1)D=D.replace($.match,$.replacement);return D.trim()}function y(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function yj(j){let G={type:"text",text:X0};if(j==null)return[G];if(typeof j==="string"){let D=_0(j);if(D===X0)return[G];return[G,{type:"text",text:D}]}if(y(j)){let D=typeof j.type==="string"?j.type:"text",$=typeof j.text==="string"?j.text:"";return[G,{...j,type:D,text:_0($)}]}if(!Array.isArray(j))return[G];let J=j.map((D)=>{if(typeof D==="string")return{type:"text",text:_0(D)};if(y(D)&&D.type==="text"&&typeof D.text==="string")return{...D,type:"text",text:_0(D.text)};return{type:"text",text:String(D)}});if(J[0]?.text===X0)return J;return[G,...J]}var T1={type:"ephemeral",ttl:"1h"},Aj=20;function fj(j){if(y(j.cache_control))return j.cache_control;if(y(j.cacheControl))return j.cacheControl;return null}function H0(j,G){if(!y(j))return!1;return delete j.cacheControl,j.cache_control=G?{...T1}:{type:"ephemeral"},!0}function z1(j){if(!y(j))return;delete j.cache_control,delete j.cacheControl}function kj(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function L0(j,G){if(!y(j))return;let J=fj(j);if(J?.type!=="ephemeral")return;if(G)J.ttl="1h";else delete J.ttl}function Q1(j,G){if(Array.isArray(j.system))for(let J of j.system)L0(J,G);else L0(j.system,G);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(L0(J,G),y(J)&&Array.isArray(J.content))for(let D of J.content)L0(D,G)}function mj(j,G){if(Array.isArray(j.system))for(let J of j.system)G(J);else G(j.system);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(G(J),y(J)&&Array.isArray(J.content))for(let D of J.content)G(D)}function y1(j){z1(j),mj(j,z1)}function bj(j){y1(j),j.cache_control={...T1}}function hj(j){return y(j)&&j.type!=="thinking"&&j.type!=="redacted_thinking"}function l0(j){let G=kj(j.content);if(!G?.length)return;let J=G.filter(hj);if(!J.length)return;return{content:G,cacheableBlocks:J}}function gj(j){if(!y(j))return!1;let G=l0(j);if(!G)return!1;return j.content=G.content,H0(G.cacheableBlocks[0],!0)}function w0(j){if(!y(j))return!1;let G=l0(j);if(!G)return!1;let J=G.cacheableBlocks[G.cacheableBlocks.length-1];return j.content=G.content,H0(J,!0)}function pj(j){if(!y(j))return!1;return(l0(j)?.cacheableBlocks.length??0)>1}function dj(j){if(!y(j))return 0;let G=j.content;if(Array.isArray(G))return G.length;if(G==null)return 0;return 1}function lj(j){let G=[],J=0;return j.forEach((D,$)=>{let P=dj(D);if(y(D)&&D.role==="user"&&P>0)G.push({index:$,blockPosition:J+P-1});J+=P}),G}function uj(j){let G=lj(j),J=[...G].reverse().find((F)=>F.index>1);if(!J)return{latest:void 0,bridge:void 0};let D=[...G].reverse().find((F)=>F.index<J.index),$=D?J.blockPosition-D.blockPosition+1:0,P=D&&D.index>1&&$>Aj?D:void 0;return{latest:J,bridge:P}}function N1(j){if(Array.isArray(j.system)){let G=j.system.findIndex(($)=>y($)&&$.text===X0),J=j.system.slice(G>=0?G+1:0).filter(y),D=J[J.length-1];H0(D,!0)}else H0(j.system,!0)}function ij(j){if(y1(j),!Array.isArray(j.messages)){N1(j);return}let{latest:G,bridge:J}=uj(j.messages);if(!J)N1(j);let D=pj(j.messages[0]);if(D)gj(j.messages[0]);if(w0(j.messages[0]),!D)w0(j.messages[1]);if(J)w0(j.messages[J.index]);if(G)w0(j.messages[G.index])}function cj(j,G){if(!G.enabled){Q1(j,!1),delete j.cache_control,delete j.cacheControl;return}if(G.mode==="automatic"){bj(j);return}if(G.mode==="hybrid"){ij(j);return}Q1(j,!0),delete j.cacheControl}function nj(j){if(!Array.isArray(j.messages))return;while(j.messages.length){let G=j.messages[j.messages.length-1];if(!y(G)||G.role!=="assistant")break;j.messages.pop()}}async function A1(j,G={}){try{let J=JSON.parse(j);nj(J);let D=Array.isArray(J.messages)&&J.messages.some(($)=>$.role==="user")?F1(J.messages,void 0,H1):null;if(J.system=yj(J.system),D&&Array.isArray(J.system))J.system.unshift({type:"text",text:D});if(cj(J,{enabled:G.cache1hEnabled??!1,mode:G.cache1hMode??"explicit"}),G.fastModeEnabled&&M0(J.model))J.speed="fast";else if(J.speed==="fast")delete J.speed;if(G.identity)v1(J,G.identity);return await U1(Rj(J))}catch{return j}}function Y0(j){if(!j.body)return j;let G=j.body.getReader(),J=new TextDecoder,D=new TextEncoder,$="",P=new ReadableStream({async pull(F){let{done:l,value:$0}=await G.read();if(l){let z0=I1(`${$}${J.decode()}`,!0);if(z0.ready)F.enqueue(D.encode(z0.ready));F.close();return}let o=$+J.decode($0,{stream:!0}),r=I1(o);if($=r.pending,r.ready)F.enqueue(D.encode(r.ready))}});return new Response(P,{status:j.status,statusText:j.statusText,headers:j.headers})}var rj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",sj=60000,tj=60000,aj=5000,f1=200,_j=240,ej=_j,jG=1,k1=!1;function h0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function q(){return performance.now()}function A(j){return Math.round(j*10)/10}function m1(j){return Math.floor(Math.random()*Math.max(0,j))}function GG(){if(k1||!1||!h0())return;k1=!0;let j=100,G=250,J=q()+j;setInterval(()=>{let D=q(),$=D-J;if(J=D+j,$<G)return;v("[perf] opencode event_loop_lag",{lagMs:A($),thresholdMs:G})},j).unref?.()}function JG(j){let G=q(),J={requestId:String(jG++),start:G,last:G,mark(D,$){let P=q();if(h0())v("[perf] opencode request stage",{requestId:J.requestId,stage:D,deltaMs:A(P-J.last),totalMs:A(P-J.start),...$});J.last=P},done(D,$){let P=q();if(h0())v("[perf] opencode request done",{requestId:J.requestId,stage:D,deltaMs:A(P-J.last),totalMs:A(P-J.start),...$});J.last=P}};if(h0())v("[perf] opencode request start",{requestId:J.requestId,...j});return J}async function a(j,G,J){let D=j.client.session,$=await W1(j.client,G),P={path:{id:G},body:{noReply:!0,parts:[{type:"text",text:J,ignored:!0}]}};if($?.agent)P.body.agent=$.agent;if($?.model)P.body.model=$.model;if($?.variant)P.body.variant=$.variant;if(typeof D?.promptAsync==="function"){await D.promptAsync(P);return}if(typeof D?.prompt==="function"){await Promise.resolve(D.prompt(P));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function e(){throw Error(rj)}function ZG(j){if(j.sessionID==null)return!1;let G=j.model;return G?.providerID==="anthropic"||G?.api?.npm==="@ai-sdk/anthropic"||G?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function $G(j){if(j.some((G)=>G.includes("<use_parallel_tool_calls>")))return!1;return j.push(b1),!0}var zG=async(j)=>{GG();let{client:G}=j,J=g1(),D=await R(J),$=new Wj({storage:D,onMainQuotaFetched:async(Z,V,K)=>{try{let Y=await R(J)??{version:1,accounts:[]};Y.quota=Y.quota??{},Y.quota.mainQuota=Z,Y.quota.mainQuotaCheckedAt=V,Y.quota.mainQuotaToken=K,Y.quota.mainLastQuotaApiError=void 0,await W0(Y,J)}catch(Y){v("[quota] failed to persist main quota",{error:Y instanceof Error?Y.message:String(Y)})}},onApiError:async(Z)=>{try{let V=await R(J)??{version:1,accounts:[]};V.quota=V.quota??{},V.quota.mainLastQuotaApiError=Z,await W0(V,J)}catch(V){v("[quota] failed to persist backoff state",{error:V instanceof Error?V.message:String(V)})}}}),P=new e1({quotaManager:$,onFallbackStorageChanged:()=>{r()}});P.startBackgroundRefresh();let F=null,l=new Vj({loadStorage:()=>R(J),prepareHeaders:async(Z,V)=>{if(!u)return Z;let K=await u();if(K.type!=="oauth")return Z;if(!K.access||K.expires&&K.expires<Date.now()){if(!F)return Z;K.access=await F()}if(!K.access)return Z;try{let Y=JSON.parse(V.bodyText),O=await t0(K.access,typeof Y.model==="string"?Y.model:void 0);if(Z.delete("anthropic-beta"),K0(Z,K.access,{body:Y,identity:O}),Z.set("anthropic-beta",B0(Z.get("anthropic-beta"),[Gj])),Y.speed==="fast")d0(Z)}catch{K0(Z,K.access)}return Z},log:v});I0({enabled:U0(D),mode:F0(D)}),y0(n0(D)),f0(o0(D));let $0={activeId:"main",route:"main"};function o(Z,V){$0={activeId:V.activeId,route:V.route};let K=$.getMain(V.mainAccessToken),Y=$.getLastApiError(),O=Z?.refresh?.mainLastRefreshError,x={main:{quota:K?.quota??null,quotaBackedOff:$.isBackedOff(),quotaBackoffUntil:Y?.nextRetryAt,refreshBackedOff:O?Z0(O,V.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:O?.nextRetryAt},fallbacks:(Z?.accounts??[]).filter((C)=>C.enabled!==!1).map((C)=>({id:C.id,label:C.label,quota:C.access?$.getFallback(C.id,C.access)?.quota??null:null,enabled:C.enabled!==!1})),activeId:V.activeId,route:V.route,relay:(()=>{let C=J1(Z);return C?{enabled:!0,transport:C.transport??"http"}:null})(),fastMode:j1(),cacheKeep:{enabled:a0(Z),window:Z?.cacheKeep?.startHour!=null&&Z?.cacheKeep?.endHour!=null?`${Z.cacheKeep.startHour}-${Z.cacheKeep.endHour}`:void 0,trackedSessions:l.trackedCount()},lastUpdated:Date.now()};Nj(x).catch((C)=>v("[sidebar] state write failed",{error:C instanceof Error?C.message:String(C)}))}async function r(){let Z=await R(J),V,K;if(u)try{let Y=await u();V=Y.access,K=Y.refresh}catch{}o(Z,{activeId:$0.activeId,route:$0.route,mainAccessToken:V,mainRefreshToken:K})}function z0(Z,V){if(!V)return;if(Z?.quota?.enabled!==!0)return;if($.getMain(V))return;if(g0)return;g0=!0,$.refreshMain(V).then(()=>r()).catch(()=>{}).finally(()=>{g0=!1})}let u=null,g0=!1,j0=null,Q0=0;function Lj(Z){let V=Z?.refresh?.refreshBeforeExpiryMinutes??ej;return Math.max(_j,V)*60000}function wj(Z){return Z?.refresh?.enabled!==!1}async function D1(Z){if(!Z)return;let V=await R(J),K=V?.refresh?.mainLastRefreshError;if(!V?.refresh||!K?.tokenHash)return;let Y=v0(Z);if(K.tokenHash===Y)return;if(K.nextRetryAt&&K.nextRetryAt>Date.now()){v("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:K.nextRetryAt,retryCount:K.retryCount,remainingMs:K.nextRetryAt-Date.now()});return}V.refresh.mainLastRefreshError=void 0,await W0(V,J),v("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:K.checkedAt,previousNextRetryAt:K.nextRetryAt,previousRetryCount:K.retryCount})}async function Hj(){let Z=[];if(u)try{let O=await u();if(O.type==="oauth"&&O.access){let x=await $.refreshMain(O.access);Z.push({name:"OpenCode anthropic",role:"main",quota:x})}else if(O.type==="oauth")Z.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(O){let x=O instanceof Error?O.message:String(O);Z.push({name:"OpenCode anthropic",role:"main",error:x.includes("429")?"Usage API rate limited — try again in a moment":x})}let{storage:V,errors:K}=await P.refreshQuotaForAllAccounts({force:!0}),Y=new Map(K.map((O)=>[O.accountId,O.message]));if(Z.push(...Pj(V,Y)),!u)Z.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return Oj({accounts:Z,refreshedAt:Date.now()})}async function Bj(Z){let V=jj(Z);if(V.type==="enable"||V.type==="disable"){let x=V.type==="enable",C=await d1(x),h=F0(C);return I0({enabled:x,mode:h}),S0({argumentsText:Z,enabled:x,mode:h})}if(V.type==="mode"){let x=await l1(V.mode),C=U0(x);return I0({enabled:C,mode:V.mode}),S0({argumentsText:Z,enabled:C,mode:V.mode})}let K=await R(J),Y=U0(K),O=F0(K);return I0({enabled:Y,mode:O}),S0({argumentsText:Z,enabled:Y,mode:O})}async function Mj(Z){let V=Jj(Z),K=await R(J);if(V.type==="window")K=await c1(V.startHour,V.endHour);else if(V.type==="disable")K=await n1(!1);let Y=Zj(K),O=l.stats(Y);return Dj({argumentsText:Z,enabled:$j(K),window:Y,hybridActive:a0(K),trackedSessions:O.trackedSessions,nextPrewarmAt:O.nextPrewarmAt})}async function Uj(Z){let V=Xj(Z);if(V.type==="enable"||V.type==="disable"){let O=V.type==="enable";return await u1(O),y0(O),e0({argumentsText:Z,enabled:O})}let K=await R(J),Y=n0(K);return y0(Y),e0({argumentsText:Z,enabled:Y})}async function Fj(Z){let V=Kj(Z);if(V.type==="enable"||V.type==="disable"){let O=V.type==="enable";return await i1(O),f0(O),G1({argumentsText:Z,enabled:O})}let K=await R(J),Y=o0(K);return f0(Y),G1({argumentsText:Z,enabled:Y})}async function vj(Z){let V=Qj(Z);if(V.type==="mode")return await zj(V.mode),$1({argumentsText:Z,mode:V.mode});let K=await R();return $1({argumentsText:Z,mode:Z1(K)})}function qj(Z,V=10){let K=Math.max(0,Math.min(Math.round(Z/100*V),V));return"█".repeat(K)+"░".repeat(V-K)}function N0(Z,V){return`${Z} ${qj(V)} ${String(Math.round(V)).padStart(3)}%`}function V1(Z){if(!Z)return"";let V=new Date(Z).getTime();if(Number.isNaN(V))return"";let K=V-Date.now();if(K<=0)return"resets now";let Y=Math.floor(K/60000);if(Y<1)return"resets <1m";if(Y<60)return`resets ${Y}m`;let O=Math.floor(Y/60),x=Y%60;return x>0?`resets ${O}h${x}m`:`resets ${O}h`}function Cj(Z,V,K){let Y=[],O=0;if(Z){let{five_hour:h,seven_day:p}=Z;if(h||p){let i=K==="main"?"active":"idle",s=V1(h?.resetsAt),n=[`main · ${i}${s?` (${s})`:""}`];if(h)n.push(N0("5h",h.usedPercent)),O=Math.max(O,h.usedPercent);if(p)n.push(N0("7d",p.usedPercent)),O=Math.max(O,p.usedPercent);Y.push(n.join(`
4
+ `))}}if(V?.length)for(let h of V){let p=h.quota;if(!p)continue;let{five_hour:c,seven_day:i}=p;if(!c&&!i)continue;let s=h.label||"alt",D0=K===h.id?"active":"idle",t=V1(c?.resetsAt),V0=[`${s} · ${D0}${t?` (${t})`:""}`];if(c)V0.push(N0("5h",c.usedPercent)),O=Math.max(O,c.usedPercent);if(i)V0.push(N0("7d",i.usedPercent)),O=Math.max(O,i.usedPercent);Y.push(V0.join(`
5
+ `))}if(!Y.length)return;let x=Y.join(`
6
6
 
7
- `),E=P>=90?"error":P>=70?"warning":"info";J.tui?.showToast?.({body:{title:"Claude Quota",message:x,variant:E,duration:E==="error"?8000:5000}})?.catch?.(()=>{})}return{config:async($)=>{$.command={...$.command??{},[F0]:{template:F0,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[x0]:{template:x0,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[k0]:{template:k0,description:"Show current Claude OAuth quota usage for all accounts."},[S0]:{template:S0,description:"Show or toggle Anthropic request dump capture for debugging."},[T0]:{template:T0,description:"Show or toggle Anthropic fast mode for supported Opus models."},[f0]:{template:f0,description:"Show or change Claude account routing between main-first and fallback-first."},[A0]:{template:A0,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async($,D)=>{if(!tj($))return;aj(D.system)},"command.execute.before":async($)=>{if($.command===F0)await t(j,$.sessionID,await wj($.arguments)),a();if($.command===x0)await t(j,$.sessionID,await _j($.arguments)),a();if($.command===k0){await t(j,$.sessionID,await Nj());let D=await R(),X=d?await d().catch(()=>{return}):void 0;o(D,{activeId:"main",route:"main",mainAccessToken:X?.access,mainRefreshToken:X?.refresh}),a()}if($.command===S0)await t(j,$.sessionID,await Bj($.arguments)),a();if($.command===T0)await t(j,$.sessionID,await Hj($.arguments)),a();if($.command===f0)await t(j,$.sessionID,await Uj($.arguments)),a();if($.command===A0){let D=await R(),X=o1(D),W=(D?.accounts??[]).filter((x)=>x.enabled!==!1).map((x)=>x.id),P=Dj({argumentsText:$.arguments,config:X,accountIds:W});if(P.updatedConfig)await s1(P.updatedConfig);await t(j,$.sessionID,P.text),a()}},auth:{provider:"anthropic",async loader($,D){d=$;let X=await $();if(X.type==="oauth"){let x=function(){if(j0)clearInterval(j0),j0=null;let Q=async()=>{try{let L=await R(Z);if(!Lj(L))return;let U=await $();if(U.type!=="oauth")return;if(await Z1(U.refresh),!U.expires)return;let N=U.expires-Date.now(),S=Oj(L);if(N>S)return;if(F("[refresh] opencode main oauth background due",{expiresInMs:N,refreshBeforeMs:S}),U.refresh&&$0(L?.refresh?.mainLastRefreshError,U.refresh,Date.now())){F("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:L?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:L?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:N});return}if(U.refresh&&L?.refresh?.mainRefreshLeaseUntil&&L.refresh.mainRefreshLeaseUntil>Date.now()&&L.refresh.mainRefreshLeaseTokenHash===M0(U.refresh))return;await P();let I=await $();F("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:I.expires?I.expires-Date.now():void 0})}catch(L){F("[refresh] opencode main oauth refresh failed",{message:L instanceof Error?L.message:String(L)})}};if(j0=setInterval(()=>{Q()},uj+A1(ij)),"unref"in j0)j0.unref()},E=function(Q,L){if(Q instanceof Request&&Q.body)return!1;return L==null||typeof L==="string"},h=function(Q){return Q.has("x-parent-session-id")},p=function(Q){return Q.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(Q)},c=function(Q){return Q?.quota?.enabled===!0},n=function(Q){return V.getFallback(Q.id,Q.access)?.quota??Q.quota};for(let Q of Object.values(D.models))Q.cost={input:0,output:0,cache:{read:0,write:0}};let W=null;async function P(){if(!W)W=(async()=>{let U=null,N=null,S=null;async function I(z){let H=await R(Z)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};H.refresh=H.refresh??{},z(H),await Y0(H,Z)}async function T(z){let H=Date.now()+cj;while(Date.now()<H){await new Promise((w)=>setTimeout(w,T1+A1(T1)));let K=await $();if(K.type!=="oauth"||!K.access)continue;if((K.access!==z.access||K.refresh!==z.refresh||(K.expires??0)>(z.expires??0)+60000)&&(!K.expires||K.expires>Date.now()))return F("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:K.expires?K.expires-Date.now():void 0}),K.access}return null}for(let z=0;z<=2;z++){let H=null;try{if(z>0){let C=500*2**(z-1);await new Promise((B)=>setTimeout(B,C))}if(H=await $(),!H.refresh)throw Error("Token refresh failed: missing refresh token");let K=await R(Z),_=M0(H.refresh),w=K?.refresh?.mainLastRefreshError;if(F("[refresh] opencode main oauth refresh check",{attempt:z,expiresInMs:H.expires?H.expires-Date.now():void 0,hasBackoff:Boolean(w),backoffActive:w?$0(w,H.refresh,Date.now()):!1,retryCount:w?.retryCount,nextRetryAt:w?.nextRetryAt}),w&&$0(w,H.refresh,Date.now()))throw F("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:w.nextRetryAt,retryCount:w.retryCount}),Error(n0(w,Date.now()));if(K?.refresh?.mainRefreshLeaseUntil&&K.refresh.mainRefreshLeaseUntil>Date.now()&&K.refresh.mainRefreshLeaseTokenHash===_){F("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:K.refresh.mainRefreshLeaseUntil});let C=await T(H);if(C)return C;throw Error("Claude OAuth refresh is already in progress")}let O=await b1({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!O){F("[refresh] opencode main oauth refresh skipped file lock");let C=await T(H);if(C)return C;throw Error("Claude OAuth refresh is already in progress")}S=O.release,U=pj(),N=_,await I((C)=>{C.refresh=C.refresh??{},C.refresh.mainRefreshLeaseId=U??void 0,C.refresh.mainRefreshLeaseUntil=Date.now()+120000,C.refresh.mainRefreshLeaseTokenHash=_});let g=await R(Z);if(F("[refresh] opencode main oauth refresh lease acquired",{attempt:z,leaseUntil:Date.now()+120000}),g?.refresh?.mainRefreshLeaseId!==U||g.refresh.mainRefreshLeaseTokenHash!==_)throw Error("Claude OAuth refresh is already in progress");F("[refresh] opencode main oauth refresh request start",{attempt:z});let m=await f1({refreshToken:H.refresh,maxRetries:0});return await J.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:m.refresh,access:m.access,expires:m.expires}}),await I((C)=>{if(!C?.refresh)return;if(C.refresh.mainLastRefreshError=void 0,C.refresh.mainRefreshLeaseId===U)C.refresh.mainRefreshLeaseId=void 0,C.refresh.mainRefreshLeaseUntil=void 0,C.refresh.mainRefreshLeaseTokenHash=void 0}),F("[refresh] opencode main oauth refresh succeeded",{attempt:z,expiresInMs:m.expires-Date.now()}),m.access}catch(K){let _=K instanceof Error&&(K.message.includes("fetch failed")||("code"in K)&&(K.code==="ECONNRESET"||K.code==="ECONNREFUSED"||K.code==="ETIMEDOUT"||K.code==="UND_ERR_CONNECT_TIMEOUT"));if(z<2&&(_||K instanceof d0&&K.status>=500))continue;F("[refresh] opencode main oauth refresh attempt failed",{attempt:z,error:K instanceof Error?K.message:String(K),transient:_});let w=H?.refresh;if(w&&K instanceof d0)await I((O)=>{O.refresh=O.refresh??{},O.refresh.mainLastRefreshError=i1({error:K,now:Date.now(),refreshToken:w,previous:O.refresh.mainLastRefreshError})});throw K}finally{if(U)await I((K)=>{if(!K?.refresh)return;if(K.refresh.mainRefreshLeaseId===U&&K.refresh.mainRefreshLeaseTokenHash===N)K.refresh.mainRefreshLeaseId=void 0,K.refresh.mainRefreshLeaseUntil=void 0,K.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await S?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{W=null});return W}v=P,x(),V.seedFallbacksFromAccounts(G?.accounts??[]),o(G,{activeId:"main",route:"main",mainAccessToken:X.access,mainRefreshToken:X.refresh});async function i(Q,L){if(!Q.body||Q.status!==200)return L?.mark("inspect_stream_skip",{status:Q.status}),{response:Q,rateLimited:!1};if(Q.headers.get("x-cortexkit-relay-optimistic")==="true")return L?.mark("inspect_stream_skip",{status:Q.status,reason:"optimistic_relay"}),{response:Q,rateLimited:!1};let U=q(),N=Q.body.getReader(),S=[],I=new TextDecoder,T="",z=0;while(!T.includes(`
7
+ `),C=O>=90?"error":O>=70?"warning":"info";G.tui?.showToast?.({body:{title:"Claude Quota",message:x,variant:C,duration:C==="error"?8000:5000}})?.catch?.(()=>{})}return{config:async(Z)=>{Z.command={...Z.command??{},[C0]:{template:C0,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[R0]:{template:R0,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[m0]:{template:m0,description:"Show current Claude OAuth quota usage for all accounts."},[T0]:{template:T0,description:"Show or toggle Anthropic request dump capture for debugging."},[A0]:{template:A0,description:"Show or toggle Anthropic fast mode for supported Opus models."},[b0]:{template:b0,description:"Show or change Claude account routing between main-first and fallback-first."},[k0]:{template:k0,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async(Z,V)=>{if(!ZG(Z))return;$G(V.system)},"command.execute.before":async(Z)=>{if(Z.command===C0)await a(j,Z.sessionID,await Bj(Z.arguments)),e();if(Z.command===R0)await a(j,Z.sessionID,await Mj(Z.arguments)),e();if(Z.command===m0){await a(j,Z.sessionID,await Hj());let V=await R(),K=u?await u().catch(()=>{return}):void 0;o(V,{activeId:"main",route:"main",mainAccessToken:K?.access,mainRefreshToken:K?.refresh}),e()}if(Z.command===T0)await a(j,Z.sessionID,await Uj(Z.arguments)),e();if(Z.command===A0)await a(j,Z.sessionID,await Fj(Z.arguments)),e();if(Z.command===b0)await a(j,Z.sessionID,await vj(Z.arguments)),e();if(Z.command===k0){let V=await R(),K=t1(V),Y=(V?.accounts??[]).filter((x)=>x.enabled!==!1).map((x)=>x.id),O=Yj({argumentsText:Z.arguments,config:K,accountIds:Y});if(O.updatedConfig)await a1(O.updatedConfig);await a(j,Z.sessionID,O.text),e()}},auth:{provider:"anthropic",async loader(Z,V){u=Z;let K=await Z();if(K.type==="oauth"){let x=function(){if(j0)clearInterval(j0),j0=null;let I=async()=>{try{let N=await R(J);if(!wj(N))return;let M=await Z();if(M.type!=="oauth")return;if(await D1(M.refresh),!M.expires)return;let _=M.expires-Date.now(),S=Lj(N);if(_>S)return;if(v("[refresh] opencode main oauth background due",{expiresInMs:_,refreshBeforeMs:S}),M.refresh&&Z0(N?.refresh?.mainLastRefreshError,M.refresh,Date.now())){v("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:N?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:N?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:_});return}if(M.refresh&&N?.refresh?.mainRefreshLeaseUntil&&N.refresh.mainRefreshLeaseUntil>Date.now()&&N.refresh.mainRefreshLeaseTokenHash===v0(M.refresh))return;await O();let z=await Z();v("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:z.expires?z.expires-Date.now():void 0})}catch(N){v("[refresh] opencode main oauth refresh failed",{message:N instanceof Error?N.message:String(N)})}};if(j0=setInterval(()=>{I()},sj+m1(tj)),"unref"in j0)j0.unref()},C=function(I,N){if(I instanceof Request&&I.body)return!1;return N==null||typeof N==="string"},h=function(I){return I.has("x-parent-session-id")},p=function(I){return I.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(I)},c=function(I){return I?.quota?.enabled===!0},n=function(I){return $.getFallback(I.id,I.access)?.quota??I.quota};for(let I of Object.values(V.models))I.cost={input:0,output:0,cache:{read:0,write:0}};let Y=null;async function O(){if(!Y)Y=(async()=>{let M=null,_=null,S=null;async function z(W){let B=await R(J)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};B.refresh=B.refresh??{},W(B),await W0(B,J)}async function T(W){let B=Date.now()+aj;while(Date.now()<B){await new Promise((L)=>setTimeout(L,f1+m1(f1)));let X=await Z();if(X.type!=="oauth"||!X.access)continue;if((X.access!==W.access||X.refresh!==W.refresh||(X.expires??0)>(W.expires??0)+60000)&&(!X.expires||X.expires>Date.now()))return v("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:X.expires?X.expires-Date.now():void 0}),X.access}return null}for(let W=0;W<=2;W++){let B=null;try{if(W>0){let E=500*2**(W-1);await new Promise((H)=>setTimeout(H,E))}if(B=await Z(),!B.refresh)throw Error("Token refresh failed: missing refresh token");let X=await R(J),w=v0(B.refresh),L=X?.refresh?.mainLastRefreshError;if(v("[refresh] opencode main oauth refresh check",{attempt:W,expiresInMs:B.expires?B.expires-Date.now():void 0,hasBackoff:Boolean(L),backoffActive:L?Z0(L,B.refresh,Date.now()):!1,retryCount:L?.retryCount,nextRetryAt:L?.nextRetryAt}),L&&Z0(L,B.refresh,Date.now()))throw v("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:L.nextRetryAt,retryCount:L.retryCount}),Error(s0(L,Date.now()));if(X?.refresh?.mainRefreshLeaseUntil&&X.refresh.mainRefreshLeaseUntil>Date.now()&&X.refresh.mainRefreshLeaseTokenHash===w){v("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:X.refresh.mainRefreshLeaseUntil});let E=await T(B);if(E)return E;throw Error("Claude OAuth refresh is already in progress")}let Q=await p1({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!Q){v("[refresh] opencode main oauth refresh skipped file lock");let E=await T(B);if(E)return E;throw Error("Claude OAuth refresh is already in progress")}S=Q.release,M=oj(),_=w,await z((E)=>{E.refresh=E.refresh??{},E.refresh.mainRefreshLeaseId=M??void 0,E.refresh.mainRefreshLeaseUntil=Date.now()+120000,E.refresh.mainRefreshLeaseTokenHash=w});let g=await R(J);if(v("[refresh] opencode main oauth refresh lease acquired",{attempt:W,leaseUntil:Date.now()+120000}),g?.refresh?.mainRefreshLeaseId!==M||g.refresh.mainRefreshLeaseTokenHash!==w)throw Error("Claude OAuth refresh is already in progress");v("[refresh] opencode main oauth refresh request start",{attempt:W});let m=await h1({refreshToken:B.refresh,maxRetries:0});return await G.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:m.refresh,access:m.access,expires:m.expires}}),await z((E)=>{if(!E?.refresh)return;if(E.refresh.mainLastRefreshError=void 0,E.refresh.mainRefreshLeaseId===M)E.refresh.mainRefreshLeaseId=void 0,E.refresh.mainRefreshLeaseUntil=void 0,E.refresh.mainRefreshLeaseTokenHash=void 0}),v("[refresh] opencode main oauth refresh succeeded",{attempt:W,expiresInMs:m.expires-Date.now()}),m.access}catch(X){let w=X instanceof Error&&(X.message.includes("fetch failed")||("code"in X)&&(X.code==="ECONNRESET"||X.code==="ECONNREFUSED"||X.code==="ETIMEDOUT"||X.code==="UND_ERR_CONNECT_TIMEOUT"));if(W<2&&(w||X instanceof u0&&X.status>=500))continue;v("[refresh] opencode main oauth refresh attempt failed",{attempt:W,error:X instanceof Error?X.message:String(X),transient:w});let L=B?.refresh;if(L&&X instanceof u0)await z((Q)=>{Q.refresh=Q.refresh??{},Q.refresh.mainLastRefreshError=o1({error:X,now:Date.now(),refreshToken:L,previous:Q.refresh.mainLastRefreshError})});throw X}finally{if(M)await z((X)=>{if(!X?.refresh)return;if(X.refresh.mainRefreshLeaseId===M&&X.refresh.mainRefreshLeaseTokenHash===_)X.refresh.mainRefreshLeaseId=void 0,X.refresh.mainRefreshLeaseUntil=void 0,X.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await S?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{Y=null});return Y}F=O,x(),$.seedFallbacksFromAccounts(D?.accounts??[]),o(D,{activeId:"main",route:"main",mainAccessToken:K.access,mainRefreshToken:K.refresh});async function i(I,N){if(!I.body||I.status!==200)return N?.mark("inspect_stream_skip",{status:I.status}),{response:I,rateLimited:!1};if(I.headers.get("x-cortexkit-relay-optimistic")==="true")return N?.mark("inspect_stream_skip",{status:I.status,reason:"optimistic_relay"}),{response:I,rateLimited:!1};let M=q(),_=I.body.getReader(),S=[],z=new TextDecoder,T="",W=0;while(!T.includes(`
8
8
 
9
- `)&&T.length<65536){let{done:K,value:_}=await N.read();if(K)break;if(S.push(_),z+=_.byteLength,T+=I.decode(_,{stream:!0}),p(T))break}if(p(T))return await N.cancel().catch(()=>{}),L?.mark("inspect_stream_first_event",{ms:y(q()-U),bytes:z,rateLimited:!0}),{response:Q,rateLimited:!0};let H=new ReadableStream({start(K){for(let _ of S)K.enqueue(_)},async pull(K){let{done:_,value:w}=await N.read();if(_){K.close();return}K.enqueue(w)},cancel(K){return N.cancel(K)}});return L?.mark("inspect_stream_first_event",{ms:y(q()-U),bytes:z,rateLimited:!1}),{response:new Response(H,{status:Q.status,statusText:Q.statusText,headers:Q.headers}),rateLimited:!1}}async function s(Q,L,U,N,S="unknown",I){let T=q(),z=I,H=async()=>{return z??=await R(Z),z},K=q1(Q,L),_=K.get("x-session-affinity")||K.get("x-opencode-session"),w=h(K);K.delete("x-parent-session-id"),K.delete("x-session-affinity"),K.delete("x-opencode-session");let O=L?.body,g;if(O&&typeof O==="string")try{let b=JSON.parse(O);if(typeof b.model==="string")g=b.model}catch{}let m=await o0(U,g),C=typeof O==="string"?O.length:void 0;if(O&&typeof O==="string"){let b=q(),J0=(()=>{if(!t0())return!1;try{return B0(JSON.parse(O).model)}catch{return!1}})();O=await R1(O,{cache1hEnabled:!w&&q0(),cache1hMode:E0(),fastModeEnabled:J0,identity:m});try{X0(K,U,{body:JSON.parse(O),identity:m})}catch{X0(K,U,{identity:m})}if(J0)g0(K);N?.mark("rewrite_body",{route:S,ms:y(q()-b),originalBytes:C,rewrittenBytes:O.length,cacheEnabled:!w&&q0(),cacheMode:E0(),fastModeEnabled:J0,subagent:w})}let B=C1(Q);if(S==="main"&&typeof O==="string"&&!w&&q0()&&E0()==="hybrid"){let b=await H();if(u.track({sessionId:_,url:B.url?.toString()??B.input.toString(),headers:K,bodyText:O,storage:b,cacheMode:"hybrid"}).tracked)N?.mark("cachekeep_track",{session:_})}let M=()=>fetch(B.input,{...L,body:O,headers:K,...E1()&&{tls:{rejectUnauthorized:!1}}}),k=e0(await H()),l=q(),A=await Yj({config:k,input:B.input,init:L,headers:K,body:O,fallback:M,affinity:_,optimisticResponse:k?.transport==="websocket"});return N?.mark("send_headers_received",{route:S,ms:y(q()-l),status:A.status,relayConfigured:k!=null,totalSendWithAccessMs:y(q()-T)}),A}async function V0(Q){let L=await Y.getUsableFallbackAccounts(Q);if(!z0(Q))return L;return L.filter((U)=>v0(n(U),Q,U.id))}async function r(Q,L,U,N,S,I,T){if(!U.length)return S??null;let z=T?.returnLastOnExhausted??!0;await S?.body?.cancel().catch(()=>{});let H=S??null;for(let[K,_]of U.entries()){let w=_.access;if(!w)continue;let O=await s(Q,L,w,I,`fallback_${K}`,N);H=O;let g=c0(O.status,N);if(!g){let m=await i(O,I);O=m.response,H=O,g=m.rateLimited}if(!g){if(await Y.markUsed(_),T?.onSuccess?.(_),w&&V.shouldRefreshOnRequestCount(I0))V.refreshFallback(_.id,w).then(()=>T?.onSuccess?.(_)).catch(()=>{});return O}if(K<U.length-1||!z)await O.body?.cancel().catch(()=>{})}return z?H:null}async function D0(Q,L,U,N,S,I,T){if(!E(Q,L?.body))return U;let z=q(),H=I??await R(Z);S?.mark("fallback_load_storage",{ms:y(q()-z),cached:!!I});let K=U,_=c0(K.status,H);if(!_){let O=await i(K,S);K=O.response,_=O.rateLimited}if(!_)return K;let w=N;if(!w){let O=q();w=await Y.getUsableFallbackAccounts(),S?.mark("fallback_get_accounts",{ms:y(q()-O),accounts:w.length})}if(z0(H)){let O=w.length;if(w=w.filter((g)=>v0(n(g),H,g.id)),w.length<O)F("[killswitch] filtered fallbacks",{before:O,after:w.length})}return await r(Q,L,w,H,K,S,{onSuccess:T})??K}return{apiKey:"",async fetch(Q,L){let U=L?.body,N=rj({bodyBytes:typeof U==="string"?U.length:void 0}),S=q(),I=await $();if(N.mark("get_auth",{ms:y(q()-S),authType:I.type,hasAccess:Boolean(I.access)}),I.type!=="oauth"){let B=await fetch(Q,L);return N.done("non_oauth_passthrough",{status:B.status}),B}await Z1(I.refresh);let T=q(),z=await R();N.mark("load_storage",{ms:y(q()-T)}),V.updateStorage(z),V.seedFallbacksFromAccounts(z?.accounts??[]);let H=E(Q,L?.body);if(H)I0++;let K=(B,M)=>o(z,{activeId:B,route:M,mainAccessToken:I.access,mainRefreshToken:I.refresh}),_;if(H&&j1(z)==="fallback-first")try{let B=q();_=await V0(z),N.mark("fallback_first_get_accounts",{ms:y(q()-B),accounts:_.length});let M=await r(Q,L,_,z,void 0,N,{returnLastOnExhausted:!1,onSuccess:(k)=>K(k.id,"fallback-first")});if(M)return N.done("return_fallback_first",{status:M.status}),W0(M);_=[]}catch(B){N.mark("fallback_first_error",{error:B instanceof Error?B.message:String(B)})}if(!I.access||!I.expires||I.expires<Date.now()){let M=(await R())?.refresh?.mainLastRefreshError;if(I.refresh&&M&&$0(M,I.refresh,Date.now()))throw F("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:M.nextRetryAt,retryCount:M.retryCount,expiresInMs:I.expires?I.expires-Date.now():void 0}),Error(n0(M,Date.now()));F("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(I.access),expiresInMs:I.expires?I.expires-Date.now():void 0,expiredAgoMs:I.expires&&I.expires<Date.now()?Date.now()-I.expires:void 0});let k=q();I.access=await P(),N.mark("refresh_main_access",{ms:y(q()-k)})}if(!I.access)throw N.done("missing_access_error"),Error("OAuth access token is missing after refresh");function w(){if(z?.quota?.showToasts!==!0)return;let B=V.getMain();if(!B)return;let M=(z?.accounts??[]).filter((A)=>A.enabled!==!1).map((A)=>({...A,quota:V.getFallback(A.id,A.access)?.quota??A.quota})),k=P0(B.quota,z),l;if(k)l="main";else l=M.find((A)=>P0(A.quota,z))?.id??"main";vj(B.quota,M,l)}if(H&&c(z))try{let B=q(),M=V.getMain(I.access)?.quota;if(!M)M=await V.refreshMain(I.access),w();else if(V.needsRefresh(I0))V.refreshMain(I.access).then(()=>{e(),w()}).catch(()=>{});if(o(z,{activeId:"main",route:"main",mainAccessToken:I.access,mainRefreshToken:I.refresh}),N.mark("main_quota_for_routing",{ms:y(q()-B),passes:P0(M,z)}),!P0(M,z)){let k=q();_=await V0(z),N.mark("preselect_fallback_accounts",{ms:y(q()-k),accounts:_.length});let l=await r(Q,L,_,z,void 0,N,{onSuccess:(A)=>K(A.id,"fallback")});if(l)return N.done("return_preselected_fallback",{status:l.status}),W0(l)}}catch(B){N.mark("main_quota_for_routing_error",{error:B instanceof Error?B.message:String(B)})}let O=V.getMain(I.access)?.quota;if(z?.quota?.failClosedOnUnknownQuota&&!O&&V.isBackedOff()){let B=V.getLastApiError(),M=B?c1(B,Date.now()):"Quota API unavailable";return F("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:B?.nextRetryAt,retryCount:B?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:M}}),{status:429,headers:{"content-type":"application/json","retry-after":String(B?.nextRetryAt?Math.max(1,Math.ceil((B.nextRetryAt-Date.now())/1000)):60)}})}if(z0(z)){if(V.needsRefresh(I0))try{let M=(z?.accounts??[]).filter((k)=>k.enabled!==!1&&k.access);await Promise.all([V.refreshMain(I.access),V.refreshAllFallbacks(M)])}catch(M){F("[quota] killswitch refresh failed",{error:M instanceof Error?M.message:String(M),backedOff:V.isBackedOff()})}O=V.getMain(I.access)?.quota}if(z0(z)&&!v0(O,z)){let M=E(Q,L?.body)?await V0(z):[];if(M.length>0){F("[route] skipping main (killswitch), trying fallbacks");let b=await r(Q,L,M,z,void 0,N,{onSuccess:(J0)=>K(J0.id,"fallback")});if(b)return N.done("return_killswitch_fallback",{status:b.status}),W0(b)}let k=Date.now(),l=(z?.accounts??[]).filter((b)=>b.enabled!==!1).map((b)=>({...b,quota:n(b)})),A=n1(O,l,k);return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:`Killswitch: no routable accounts. Retry in ${Math.floor(A/60)}m ${A%60}s.`}}),{status:429,headers:{"content-type":"application/json","retry-after":String(A)}})}let g=await s(Q,L,I.access,N,"main",z),m=!1,C=await D0(Q,L,g,_,N,z,(B)=>{m=!0,K(B.id,"fallback")});if(!m)K("main","main");return N.done("return_response",{status:C.status}),W0(C)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let $=await p0("max");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(D)=>{return l0(D,$.verifier,$.redirectUri,$.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let $=await p0("console");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(D)=>{let X=await l0(D,$.verifier,$.redirectUri,$.state);if(X.type==="failed")return X;return{type:"success",key:(await fetch("https://api.anthropic.com/api/oauth/claude_cli/create_api_key",{method:"POST",headers:{"Content-Type":"application/json",authorization:`Bearer ${X.access}`}}).then((P)=>P.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{XJ as AnthropicAuthPlugin};
9
+ `)&&T.length<65536){let{done:X,value:w}=await _.read();if(X)break;if(S.push(w),W+=w.byteLength,T+=z.decode(w,{stream:!0}),p(T))break}if(p(T))return await _.cancel().catch(()=>{}),N?.mark("inspect_stream_first_event",{ms:A(q()-M),bytes:W,rateLimited:!0}),{response:I,rateLimited:!0};let B=new ReadableStream({start(X){for(let w of S)X.enqueue(w)},async pull(X){let{done:w,value:L}=await _.read();if(w){X.close();return}X.enqueue(L)},cancel(X){return _.cancel(X)}});return N?.mark("inspect_stream_first_event",{ms:A(q()-M),bytes:W,rateLimited:!1}),{response:new Response(B,{status:I.status,statusText:I.statusText,headers:I.headers}),rateLimited:!1}}async function s(I,N,M,_,S="unknown",z){let T=q(),W=z,B=async()=>{return W??=await R(J),W},X=x1(I,N),w=X.get("x-session-affinity")||X.get("x-opencode-session"),L=h(X);X.delete("x-parent-session-id"),X.delete("x-session-affinity"),X.delete("x-opencode-session");let Q=N?.body,g;if(Q&&typeof Q==="string")try{let b=JSON.parse(Q);if(typeof b.model==="string")g=b.model}catch{}let m=await t0(M,g),E=typeof Q==="string"?Q.length:void 0;if(Q&&typeof Q==="string"){let b=q(),G0=(()=>{if(!j1())return!1;try{return M0(JSON.parse(Q).model)}catch{return!1}})();Q=await A1(Q,{cache1hEnabled:!L&&E0(),cache1hMode:x0(),fastModeEnabled:G0,identity:m});try{K0(X,M,{body:JSON.parse(Q),identity:m})}catch{K0(X,M,{identity:m})}if(G0)d0(X);_?.mark("rewrite_body",{route:S,ms:A(q()-b),originalBytes:E,rewrittenBytes:Q.length,cacheEnabled:!L&&E0(),cacheMode:x0(),fastModeEnabled:G0,subagent:L})}let H=R1(I);if(S==="main"&&typeof Q==="string"&&!L&&E0()&&x0()==="hybrid"){let b=await B();if(l.track({sessionId:w,url:H.url?.toString()??H.input.toString(),headers:X,bodyText:Q,storage:b,cacheMode:"hybrid"}).tracked)_?.mark("cachekeep_track",{session:w})}let U=()=>fetch(H.input,{...N,body:Q,headers:X,...S1()&&{tls:{rejectUnauthorized:!1}}}),k=J1(await B()),d=q(),f=await Ij({config:k,input:H.input,init:N,headers:X,body:Q,fallback:U,affinity:w,optimisticResponse:k?.transport==="websocket"});return _?.mark("send_headers_received",{route:S,ms:A(q()-d),status:f.status,relayConfigured:k!=null,totalSendWithAccessMs:A(q()-T)}),f}async function D0(I){let N=await P.getUsableFallbackAccounts(I);if(!O0(I))return N;return N.filter((M)=>q0(n(M),I,M.id))}async function t(I,N,M,_,S,z,T){if(!M.length)return S??null;let W=T?.returnLastOnExhausted??!0;await S?.body?.cancel().catch(()=>{});let B=S??null;for(let[X,w]of M.entries()){let L=w.access;if(!L)continue;let Q=await s(I,N,L,z,`fallback_${X}`,_);B=Q;let g=r0(Q.status,_);if(!g){let m=await i(Q,z);Q=m.response,B=Q,g=m.rateLimited}if(!g){if(await P.markUsed(w),T?.onSuccess?.(w),L&&$.shouldRefreshOnRequestCount(Q0))$.refreshFallback(w.id,L).then(()=>T?.onSuccess?.(w)).catch(()=>{});return Q}if(X<M.length-1||!W)await Q.body?.cancel().catch(()=>{})}return W?B:null}async function V0(I,N,M,_,S,z,T){if(!C(I,N?.body))return M;let W=q(),B=z??await R(J);S?.mark("fallback_load_storage",{ms:A(q()-W),cached:!!z});let X=M,w=r0(X.status,B);if(!w){let Q=await i(X,S);X=Q.response,w=Q.rateLimited}if(!w)return X;let L=_;if(!L){let Q=q();L=await P.getUsableFallbackAccounts(),S?.mark("fallback_get_accounts",{ms:A(q()-Q),accounts:L.length})}if(O0(B)){let Q=L.length;if(L=L.filter((g)=>q0(n(g),B,g.id)),L.length<Q)v("[killswitch] filtered fallbacks",{before:Q,after:L.length})}return await t(I,N,L,B,X,S,{onSuccess:T})??X}return{apiKey:"",async fetch(I,N){let M=N?.body,_=JG({bodyBytes:typeof M==="string"?M.length:void 0}),S=q(),z=await Z();if(_.mark("get_auth",{ms:A(q()-S),authType:z.type,hasAccess:Boolean(z.access)}),z.type!=="oauth"){let H=await fetch(I,N);return _.done("non_oauth_passthrough",{status:H.status}),H}await D1(z.refresh);let T=q(),W=await R();_.mark("load_storage",{ms:A(q()-T)}),$.updateStorage(W),$.seedFallbacksFromAccounts(W?.accounts??[]);let B=C(I,N?.body);if(B)Q0++;if(B&&z.access&&(!z.expires||z.expires>Date.now()))z0(W,z.access);let X=(H,U)=>o(W,{activeId:H,route:U,mainAccessToken:z.access,mainRefreshToken:z.refresh}),w;if(B&&Z1(W)==="fallback-first")try{let H=q();w=await D0(W),_.mark("fallback_first_get_accounts",{ms:A(q()-H),accounts:w.length});let U=await t(I,N,w,W,void 0,_,{returnLastOnExhausted:!1,onSuccess:(k)=>X(k.id,"fallback-first")});if(U)return _.done("return_fallback_first",{status:U.status}),Y0(U);w=[]}catch(H){_.mark("fallback_first_error",{error:H instanceof Error?H.message:String(H)})}if(!z.access||!z.expires||z.expires<Date.now()){let U=(await R())?.refresh?.mainLastRefreshError;if(z.refresh&&U&&Z0(U,z.refresh,Date.now()))throw v("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:U.nextRetryAt,retryCount:U.retryCount,expiresInMs:z.expires?z.expires-Date.now():void 0}),Error(s0(U,Date.now()));v("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(z.access),expiresInMs:z.expires?z.expires-Date.now():void 0,expiredAgoMs:z.expires&&z.expires<Date.now()?Date.now()-z.expires:void 0});let k=q();z.access=await O(),_.mark("refresh_main_access",{ms:A(q()-k)})}if(!z.access)throw _.done("missing_access_error"),Error("OAuth access token is missing after refresh");function L(){if(W?.quota?.showToasts!==!0)return;let H=$.getMain();if(!H)return;let U=(W?.accounts??[]).filter((f)=>f.enabled!==!1).map((f)=>({...f,quota:$.getFallback(f.id,f.access)?.quota??f.quota})),k=P0(H.quota,W),d;if(k)d="main";else d=U.find((f)=>P0(f.quota,W))?.id??"main";Cj(H.quota,U,d)}if(B&&c(W))try{let H=q(),U=$.getMain(z.access)?.quota;if(!U)U=await $.refreshMain(z.access),L();else if($.needsRefresh(Q0))$.refreshMain(z.access).then(()=>{r(),L()}).catch(()=>{});if(o(W,{activeId:"main",route:"main",mainAccessToken:z.access,mainRefreshToken:z.refresh}),_.mark("main_quota_for_routing",{ms:A(q()-H),passes:P0(U,W)}),!P0(U,W)){let k=q();w=await D0(W),_.mark("preselect_fallback_accounts",{ms:A(q()-k),accounts:w.length});let d=await t(I,N,w,W,void 0,_,{onSuccess:(f)=>X(f.id,"fallback")});if(d)return _.done("return_preselected_fallback",{status:d.status}),Y0(d)}}catch(H){_.mark("main_quota_for_routing_error",{error:H instanceof Error?H.message:String(H)})}let Q=$.getMain(z.access)?.quota;if(W?.quota?.failClosedOnUnknownQuota&&!Q&&$.isBackedOff()){let H=$.getLastApiError(),U=H?r1(H,Date.now()):"Quota API unavailable";return v("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:H?.nextRetryAt,retryCount:H?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:U}}),{status:429,headers:{"content-type":"application/json","retry-after":String(H?.nextRetryAt?Math.max(1,Math.ceil((H.nextRetryAt-Date.now())/1000)):60)}})}if(O0(W)){if($.needsRefresh(Q0))try{let U=(W?.accounts??[]).filter((k)=>k.enabled!==!1&&k.access);await Promise.all([$.refreshMain(z.access),$.refreshAllFallbacks(U)])}catch(U){v("[quota] killswitch refresh failed",{error:U instanceof Error?U.message:String(U),backedOff:$.isBackedOff()})}Q=$.getMain(z.access)?.quota}if(O0(W)&&!q0(Q,W)){let U=C(I,N?.body)?await D0(W):[];if(U.length>0){v("[route] skipping main (killswitch), trying fallbacks");let b=await t(I,N,U,W,void 0,_,{onSuccess:(G0)=>X(G0.id,"fallback")});if(b)return _.done("return_killswitch_fallback",{status:b.status}),Y0(b)}let k=Date.now(),d=(W?.accounts??[]).filter((b)=>b.enabled!==!1).map((b)=>({...b,quota:n(b)})),f=s1(Q,d,k);return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:`Killswitch: no routable accounts. Retry in ${Math.floor(f/60)}m ${f%60}s.`}}),{status:429,headers:{"content-type":"application/json","retry-after":String(f)}})}let g=await s(I,N,z.access,_,"main",W),m=!1,E=await V0(I,N,g,w,_,W,(H)=>{m=!0,X(H.id,"fallback")});if(!m)X("main","main");return _.done("return_response",{status:E.status}),Y0(E)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let Z=await i0("max");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(V)=>{return c0(V,Z.verifier,Z.redirectUri,Z.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let Z=await i0("console");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(V)=>{let K=await c0(V,Z.verifier,Z.redirectUri,Z.state);if(K.type==="failed")return K;return{type:"success",key:(await fetch("https://api.anthropic.com/api/oauth/claude_cli/create_api_key",{method:"POST",headers:{"Content-Type":"application/json",authorization:`Bearer ${K.access}`}}).then((O)=>O.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{zG as AnthropicAuthPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-anthropic-auth",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,7 +51,7 @@
51
51
  "@opencode-ai/plugin": "*"
52
52
  },
53
53
  "dependencies": {
54
- "@cortexkit/anthropic-auth-core": "1.6.1",
54
+ "@cortexkit/anthropic-auth-core": "1.7.0",
55
55
  "@opentui/core": ">=0.3.1",
56
56
  "@opentui/solid": ">=0.3.1",
57
57
  "solid-js": "^1.9.10"