@cortexkit/opencode-anthropic-auth 1.18.0 → 1.19.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
@@ -32,7 +32,7 @@ This repo is a Bun workspace monorepo with two user-facing integrations and one
32
32
  - **Cache keepalive**: use `/claude-cachekeep always` or `/claude-cachekeep HH-HH` to pre-warm hybrid cache anchors for active sessions before the 1-hour TTL expires.
33
33
  - **Fast mode toggle**: use `/claude-fast on|off` to request Anthropic fast mode for supported Opus models.
34
34
  - **Adaptive reasoning visibility**: request summarized adaptive thinking for Claude Fable 5, Mythos 5, and Opus 5. OpenCode receives native `low`, `medium`, `high`, `xhigh`, and `max` Opus 5 effort variants rather than legacy manual-thinking budgets.
35
- - **Fable/Opus 5 content-filter recovery**: when Fable or Opus 5 ends a session response with Anthropic's `refusal` content-filter reason, transparently retry that source-model family with Opus 4.8 for 10 successful model responses. Recovery state and pending cache warms remain independent when a session switches between Fable and Opus 5. After each downgraded response, a zero-output prewarm advances the source model's prompt cache using the OAuth account that served the filtered request. The latest Opus cache boundary is retained so a later refusal can bridge back even after more than 20 content blocks. The TUI sidebar and OpenCode Desktop report both transitions while preserving the selected model.
35
+ - **Fable/Opus 5 safety fallback**: eligible OAuth requests opt into Anthropic's server-side safety fallback by default. The plugin preserves Anthropic's fallback conversation boundary across OpenCode history, and the TUI sidebar and OpenCode Desktop report the active target model and restoration. Set `OPENCODE_ANTHROPIC_AUTH_FALLBACK_MODE=legacy` to restore the previous deterministic 10-response Opus 4.8 recovery with source-model prewarming.
36
36
  - **Live quota visibility**: use `/claude-quota` to see main and fallback quota state, reset times, and refresh errors.
37
37
  - **Killswitch**: per-account hard-block thresholds that stop requests before hitting Anthropic's rate limits, with synthetic 429 retry-after when all accounts are exhausted.
38
38
  - **User-owned Cloudflare relay**: optionally provision your own Worker relay to reduce repeated client upload bytes for large OpenCode or Pi requests.
@@ -289,6 +289,20 @@ In OpenCode, this includes the main Anthropic account and sidecar fallback accou
289
289
 
290
290
  Reset times are rendered as relative durations, such as `resets in 10m` or `resets in 1h 15m`.
291
291
 
292
+ ## Safety fallback
293
+
294
+ Eligible Fable 5 and Opus 5 OAuth requests use Anthropic's server-side safety fallback by default. The plugin sends `fallbacks: "default"` with Anthropic's server-side fallback beta, preserves fallback conversation boundaries in OpenCode history, and reports model handoffs and restoration in the TUI sidebar or OpenCode Desktop. Follow-up requests may remain on Anthropic's selected fallback model for approximately one hour.
295
+
296
+ Custom API-key routes do not receive the server-side fallback beta or request field.
297
+
298
+ To return to CortexKit's previous deterministic recovery mechanism, start OpenCode with:
299
+
300
+ ```bash
301
+ OPENCODE_ANTHROPIC_AUTH_FALLBACK_MODE=legacy opencode
302
+ ```
303
+
304
+ Legacy mode routes a refused Fable 5 or Opus 5 session through Opus 4.8 for 10 successful responses, prewarms the selected source model's cache, and then restores that model. Unset the variable and restart OpenCode to use Anthropic's server-side fallback again.
305
+
292
306
  ## Killswitch
293
307
 
294
308
  The killswitch is a per-account hard-block that stops requests when remaining quota drops below configured thresholds, even if Anthropic's API would still accept them. Unlike `minimumRemaining` (which routes to fallback accounts), the killswitch removes accounts from the routing pool entirely.
@@ -517,6 +531,7 @@ Dump state is persisted in the active sidecar config as `dump.enabled` (`~/.conf
517
531
  | `ANTHROPIC_BASE_URL` | Override the Anthropic API endpoint. Must be HTTP(S). |
518
532
  | `ANTHROPIC_INSECURE` | Set to `1` or `true` to skip TLS verification when `ANTHROPIC_BASE_URL` is set. |
519
533
  | `OPENCODE_ANTHROPIC_AUTH_FILE` | Override the OpenCode sidecar config path. |
534
+ | `OPENCODE_ANTHROPIC_AUTH_FALLBACK_MODE` | Set to `legacy` to use the previous deterministic 10-response client-side refusal recovery. The default is Anthropic server-side safety fallback. |
520
535
  | `PI_ANTHROPIC_AUTH_FILE` | Override the Pi sidecar config path. |
521
536
  | `PI_AGENT_DIR` | Override Pi's agent directory when deriving the default sidecar path. |
522
537
  | `CLOUDFLARE_API_TOKEN` | Cloudflare token used by `bunx @cortexkit/opencode-anthropic-auth relay setup`. Not stored. |
@@ -532,7 +547,8 @@ For Claude Pro/Max OAuth requests, the plugin works at the final Anthropic wire-
532
547
  4. Prepends Claude Code identity and billing-header blocks.
533
548
  5. Rewrites cache controls according to `/claude-cache` mode.
534
549
  6. Renames MCP tool names into Claude-compatible PascalCase form.
535
- 7. Computes final-body `cch` over the fully serialized request body.
550
+ 7. Opts eligible Fable 5 and Opus 5 OAuth requests into Anthropic's server-side safety fallback and restores stored fallback boundary markers.
551
+ 8. Computes final-body `cch` over the fully serialized request body.
536
552
 
537
553
  The sanitizer is anchor-based: it removes paragraphs containing known OpenCode documentation or source anchors, performs a small set of inline replacements, and preserves the rest of the prompt including user/project instructions, tool policy, environment context, and file paths.
538
554
 
@@ -19,6 +19,18 @@ export type FableFallbackPlan = {
19
19
  requestSequence?: number;
20
20
  completed?: boolean;
21
21
  };
22
+ /**
23
+ * Models whose content-filter refusal we recover from by downgrading to Opus 4.8
24
+ * for a short window. Fable 5 is the original case; Opus 5 is identical in
25
+ * shape (cyber safety classifiers that can return `stop_reason: "refusal"`,
26
+ * Anthropic's own fallback default is `claude-opus-4-8`, same pricing). Mythos
27
+ * has no classifiers and Sonnet 5 is not flagged — both stay outside this
28
+ * gate. The single shared fallback id matches Anthropic's default for both
29
+ * source models, so the recovery period is uniform.
30
+ */
31
+ export type RecoverableRefusalFamily = 'fable-5' | 'opus-5';
32
+ export declare function recoverableRefusalFamily(model: unknown): RecoverableRefusalFamily | null;
33
+ export declare function isRecoverableRefusalModel(model: unknown): model is string;
22
34
  export declare class FableFallbackManager {
23
35
  private readonly now;
24
36
  private readonly recoveries;
@@ -0,0 +1,2 @@
1
+ import{lc as Q}from"./index-1ets4bf8.js";import{randomUUID as H}from"node:crypto";import{mkdir as R,readFile as T,rename as _,rm as O,rmdir as p,stat as P,unlink as S,writeFile as A}from"node:fs/promises";import{tmpdir as k}from"node:os";import{dirname as F,join as f}from"node:path";var m="OPENCODE_ANTHROPIC_AUTH_SIDEBAR_STATE_FILE",w=f(k(),"opencode-anthropic-auth"),y=f(w,"sidebar-state.json");function g(){return process.env[m]||y}var C={main:{quota:null},fallbacks:[],activeId:void 0,route:"main",relay:null,fastMode:!1,lastUpdated:0};function N(J){return J!==null&&typeof J==="object"&&!Array.isArray(J)}function q(J){if(!N(J))return;let $=Number(J.usedPercent),V=Number(J.remainingPercent);if(!Number.isFinite($)||!Number.isFinite(V))return;return{usedPercent:$,remainingPercent:V,resetsAt:typeof J.resetsAt==="string"?J.resetsAt:void 0}}function L(J){if(!N(J))return null;let $={},V=q(J.five_hour),x=q(J.seven_day);if(V)$.five_hour=V;if(x)$.seven_day=x;if(Array.isArray(J.scoped)){let G=J.scoped.map((X)=>{if(!N(X))return;let Z=q(X);if(!Z)return;if(typeof X.id!=="string"||!X.id.trim())return;if(typeof X.title!=="string"||!X.title.trim())return;if(typeof X.modelName!=="string"||!X.modelName.trim())return;let j=typeof X.modelId==="string"&&X.modelId.trim()?X.modelId.trim():void 0;return{...Z,id:X.id.trim(),title:X.title.trim(),...j&&{modelId:j},modelName:X.modelName.trim()}}).filter((X)=>X!=null);$.scoped=G}if(N(J.extraUsage)){let G=M(J.extraUsage.used),X=M(J.extraUsage.limit);if(G&&X&&typeof J.extraUsage.exhausted==="boolean")$.extraUsage={used:G,limit:X,...typeof J.extraUsage.utilizationPercent==="number"&&Number.isFinite(J.extraUsage.utilizationPercent)&&{utilizationPercent:J.extraUsage.utilizationPercent},...typeof J.extraUsage.severity==="string"&&{severity:J.extraUsage.severity},exhausted:J.extraUsage.exhausted}}if(typeof J.bindingWindow==="string"&&J.bindingWindow.trim())$.bindingWindow=J.bindingWindow.trim();if(typeof J.fallbackAdvised==="boolean")$.fallbackAdvised=J.fallbackAdvised;return Object.keys($).length?$:null}function M(J){if(!N(J))return;if(!Number.isInteger(J.amountMinor)||typeof J.currency!=="string"||!/^[A-Za-z]{3}$/.test(J.currency.trim())||!Number.isInteger(J.exponent)||J.exponent<0||J.exponent>20)return;return{amountMinor:J.amountMinor,currency:J.currency.trim(),exponent:J.exponent}}function u(J){if(!N(J))return{...C};let $={quota:null};if(N(J.main)){let Z=J.main;if($.quota=L(Z.quota),typeof Z.tierLabel==="string"&&Z.tierLabel.trim())$.tierLabel=Z.tierLabel.trim();if(typeof Z.quotaBackedOff==="boolean")$.quotaBackedOff=Z.quotaBackedOff;if(typeof Z.quotaBackoffUntil==="number")$.quotaBackoffUntil=Z.quotaBackoffUntil;if(typeof Z.refreshBackedOff==="boolean")$.refreshBackedOff=Z.refreshBackedOff;if(typeof Z.refreshBackoffUntil==="number")$.refreshBackoffUntil=Z.refreshBackoffUntil}let V=Array.isArray(J.fallbacks)?J.fallbacks.filter(N).filter((Z)=>typeof Z.id==="string").map((Z)=>({id:Z.id,label:typeof Z.label==="string"?Z.label:void 0,quota:L(Z.quota),enabled:typeof Z.enabled==="boolean"?Z.enabled:!1,needsReauth:typeof Z.needsReauth==="boolean"?Z.needsReauth:!1,tierLabel:typeof Z.tierLabel==="string"&&Z.tierLabel.trim()?Z.tierLabel.trim():void 0})):[],x=null;if(N(J.relay)){let Z=J.relay;if(typeof Z.enabled==="boolean"&&typeof Z.transport==="string")x={enabled:Z.enabled,transport:Z.transport}}let G;if(N(J.cacheKeep)){let Z=J.cacheKeep;if(typeof Z.enabled==="boolean")G={enabled:Z.enabled,window:typeof Z.window==="string"?Z.window:void 0,trackedSessions:typeof Z.trackedSessions==="number"?Z.trackedSessions:void 0}}let X=Array.isArray(J.fableRecoveries)?J.fableRecoveries.filter(N).flatMap((Z)=>{if(typeof Z.sessionId!=="string"||Z.mode!=="opus"&&Z.mode!=="fable"&&Z.mode!=="server"||typeof Z.remaining!=="number"||!Number.isFinite(Z.remaining)||typeof Z.changedAt!=="number"||!Number.isFinite(Z.changedAt))return[];return[{sessionId:Z.sessionId,mode:Z.mode,remaining:Math.max(0,Math.floor(Z.remaining)),changedAt:Z.changedAt,requestedModelId:typeof Z.requestedModelId==="string"?Z.requestedModelId:void 0,targetModelId:typeof Z.targetModelId==="string"?Z.targetModelId:void 0}]}):[];return{main:$,fallbacks:V,activeId:typeof J.activeId==="string"?J.activeId:void 0,route:typeof J.route==="string"?J.route:C.route,relay:x,fastMode:typeof J.fastMode==="boolean"?J.fastMode:C.fastMode,cacheKeep:G,fableRecoveries:X.length>0?X:void 0,lastUpdated:typeof J.lastUpdated==="number"?J.lastUpdated:0}}var h=Promise.resolve(),v=1000,c=2000,d=5,n=15,z=null;function VJ(J){z=J}var b=null;function XJ(J){b=J}function xJ(){return b}function l(J){return new Promise(($)=>setTimeout($,J))}async function D(J){let $=`${J}.lock`,V=z?.lockBudgetMs??v,x=z?.lockRetryMinMs??d,G=z?.lockRetryMaxMs??n,X=Date.now()+V;while(!0){try{await R($);let Y=H(),K=f($,Y);return await A(K,"",{encoding:"utf8",mode:384,flag:"wx"}),await z?.onLockAcquired?.($),{ownsLock:async()=>{try{return await P(K),!0}catch{return!1}},release:async()=>{try{await S(K)}catch{return}await z?.beforeReleaseDirectoryRemoval?.($),await p($).catch(()=>{})}}}catch(Y){if(Y.code!=="EEXIST")return Q.trace("sidebar","state lock unavailable; write skipped",{stateFile:J,error:Y instanceof Error?Y.message:String(Y)}),null}try{let Y=await P($);if(Date.now()-Y.mtimeMs>c){await z?.afterStaleLockStat?.($);let K=`${$}.evict-${process.pid}-${H()}`;try{await _($,K)}catch(B){if(B.code==="ENOENT")continue;throw B}await z?.onStaleLockClaimed?.($),await O(K,{recursive:!0,force:!0}).catch(()=>{});continue}}catch(Y){if(Y.code==="ENOENT")continue;return Q.trace("sidebar","state lock inspection failed; write skipped",{stateFile:J,error:Y instanceof Error?Y.message:String(Y)}),null}let Z=X-Date.now();if(Z<=0)return Q.warn("sidebar","lock budget exhausted, write skipped",{stateFile:J,budgetMs:V}),null;let j=x+Math.floor(Math.random()*(G-x+1));await l(Math.min(j,Z))}}async function YJ(J){return(await D(J))?.release??null}async function i(J,$,V){let x=`${J}.${process.pid}.${H()}.tmp`;await A(x,JSON.stringify($),{encoding:"utf8",mode:384});try{if(!await V())return Q.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await O(x,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await z?.beforeRename?.(J,x),!await V())return Q.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await O(x,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await _(x,J),await z?.afterRename?.(J),!await V())return"lock-lost-after-rename";return"written"}catch(G){throw await O(x,{force:!0}).catch(()=>{}),G}}async function E(J=g()){try{let $=await T(J,"utf8");return u(JSON.parse($))}catch{return C}}async function GJ(J,$=g(),V={}){return h=h.then(async()=>{await R(F($),{recursive:!0});for(let x=0;x<2;x++){let G=x===1,X=await D($);if(!X){if(G)Q.warn("sidebar","post-rename repair lock unavailable; write skipped",{stateFile:$});return}let Z=J,j;try{if(V.routingAuthoritative===!1){let Y=await E($),K=await V.resolvePreservedRouting?.(Y);if(K){let B=K.state??J;Z={...B,activeId:K.activeId,route:K.route,lastUpdated:Math.max(B.lastUpdated,Y.lastUpdated)}}await z?.afterMergeRead?.($)}else if(G){let Y=await E($);Z={...Y,activeId:J.activeId,route:J.route,relay:J.relay,fastMode:J.fastMode,cacheKeep:J.cacheKeep,lastUpdated:Math.max(Y.lastUpdated,J.lastUpdated)}}j=await i($,Z,X.ownsLock)}finally{await X.release()}if(j==="lock-lost-after-rename"){if(G){Q.warn("sidebar","post-rename repair lost lock; write skipped",{stateFile:$});return}Q.warn("sidebar","state lock lost after rename; repairing write",{stateFile:$});continue}if(j==="lock-lost-before-rename")return;V.onRoutingResolved?.({activeId:Z.activeId,route:Z.route});return}}).catch(()=>{}),h}async function jJ(){return h}function KJ(J){let $=J.activeId;if($&&$!=="main"){let V=J.fallbacks?.find((x)=>x.enabled&&x.id===$);if(V)return{id:V.id,name:V.label??V.id,quota:V.quota}}return{id:"main",name:"main",quota:J.main?.quota??null}}function s(J){let $=J.replace(/\s+only$/i,"").trim();return/^fable$/i.test($)?"Fa":$}function W(J){if(J==="claude-fable-5"||J?.startsWith("claude-fable-5-"))return"Fable 5";if(J==="claude-opus-5"||J?.startsWith("claude-opus-5-"))return"Opus 5";if(J==="claude-opus-4-8"||J?.startsWith("claude-opus-4-8-"))return"Opus 4.8";return J??"Fable 5"}function zJ(J,$){let V=J.fableRecoveries?.find((x)=>x.sessionId===$);if(!V)return;if(V.mode==="fable")return`${W(V.requestedModelId)} · restored`;if(V.mode==="server")return`${W(V.requestedModelId)}→${W(V.targetModelId)} · safety`;return`Opus 4.8 · ${V.remaining} left`}function NJ(J){let $=J?.five_hour?.usedPercent??null,V=J?.seven_day?.usedPercent??null,x=J?.scoped??[],G=x.map((j)=>j.usedPercent);if($==null&&V==null&&x.length===0)return{fiveHourUsedPercent:$,sevenDayUsedPercent:V,scopedUsedPercents:G,text:null};let X=x.map((j)=>`${s(j.title)}: ${Math.round(j.usedPercent)}%`),Z=$==null&&V==null?[]:[`5h: ${$==null?"—":`${Math.round($)}%`}`,`7d: ${V==null?"—":`${Math.round(V)}%`}`];return{fiveHourUsedPercent:$,sevenDayUsedPercent:V,scopedUsedPercents:G,text:[...Z,...X].join(" ")}}var QJ=18000000,BJ=604800000,o=300000,a=0.01,r=1;function OJ(J,$,V){if(!J.resetsAt)return null;let x=new Date(J.resetsAt).getTime();if(!Number.isFinite(x))return null;let G=x-$,X=V-G;if(X<o)return null;if(X<$*a)return null;if(X>=$)return null;let Z=J.usedPercent,j=Math.min(Math.max(X/$*100,0),100),Y=Z-j,K=Math.abs(Y)<r?"on-pace":Y>0?"deficit":"reserve",B=null;if(Z>0){let I=X*100/Z,U=G+I;if(U<x)B=new Date(U).toISOString()}return{pacePercent:j,deltaPercent:Y,state:K,runsOutAt:B}}
2
+ export{g as a,C as b,u as c,VJ as d,XJ as e,xJ as f,YJ as g,E as h,GJ as i,jJ as j,KJ as k,s as l,W as m,zJ as n,NJ as o,QJ as p,BJ as q,OJ as r};
package/dist/index.js CHANGED
@@ -1,17 +1,25 @@
1
- import{a as Lj,f as GN,h as Mj,i as Bj}from"./index-xjvcfyt6.js";import{$ as T4,$a as e4,$b as Qj,A as RW,Aa as p4,Ab as Gj,B as kW,Ba as i4,Bb as Xj,C as w4,Ca as vN,Cb as Yj,D as c1,Da as Y1,Db as Dj,E as u1,Ea as D1,Eb as iW,F as n1,Fa as x1,Fb as dW,G as N0,Ga as d4,Gb as lW,H as G1,Ha as NN,Hb as cW,I as o1,Ia as gW,Ib as R0,J as P4,Ja as yW,Jb as uW,K as Q4,Ka as qN,Kb as cN,L as H0,La as hW,Lb as Vj,M as q,Ma as mW,Mb as _j,Na as bW,Nb as uN,O as a0,Oa as AN,P as C4,Pa as l4,Pb as Kj,Q as H4,Qa as c4,R as B1,Ra as fN,Rb as nN,S as I1,Sa as RN,Sb as _1,T as L4,Ta as u4,Tb as zj,U as M4,Ua as kN,Ub as wj,V as r1,Va as n4,Vb as oN,W as B4,Wa as o4,Wb as g0,X as s1,Xa as r4,Xb as V1,Y as I4,Ya as s4,Yb as Uj,Z as F4,Za as a4,Zb as ZN,_ as x4,_a as t4,_b as Pj,aa as E4,ab as Nj,ac as Cj,ba as S4,bb as WN,ca as a1,cb as gN,da as t1,db as jN,ea as v4,eb as yN,fa as X1,fb as Wj,ga as t0,gb as k0,ha as FN,hb as jj,ia as q4,ib as hN,ja as e1,jb as JN,ka as A4,kb as Jj,la as f4,lb as mN,ma as R4,mb as T1,na as xN,nb as bN,oa as TN,ob as ON,pa as F1,pb as $N,qa as e0,qb as Oj,ra as k4,rb as pN,s as vW,sa as N1,sb as iN,t as qW,ta as g4,tb as $j,u as H1,ua as EN,ub as dN,v as L1,va as y4,vb as Zj,w as AW,wa as h4,wb as lN,x as Z1,xa as m4,xb as Q1,y as z4,ya as b4,yb as pW,z as fW,za as SN,zb as E1}from"./index-h0pmqm96.js";import{cc as U4,lc as k,mc as a}from"./index-1ets4bf8.js";import{oc as PW}from"./index-kckdabb4.js";import{rc as Hj}from"./index-k5enth8h.js";import"./index-9aeag0wm.js";import{randomUUID as IN}from"node:crypto";var $W="claude-opus-4-8",ij=10,dj=128,lj=86400000;function GW(N){if(typeof N!=="string")return null;if(R0(N))return"opus-5";if(N===Q1||N.startsWith(`${Q1}-`))return"fable-5";return null}function ZW(N){return GW(N)!==null}function cj(N,W){let j=GW(W);return j?`${N}\x00${j}`:null}function uj(N){try{let W=JSON.parse(N);return typeof W.model==="string"?{body:W,model:W.model}:null}catch{return null}}class KN{now;recoveries=new Map;nextCycle=1;constructor(N=Date.now){this.now=N}prune(){let N=this.now();for(let[W,j]of this.recoveries)if(N-j.updatedAt>=lj)this.recoveries.delete(W);while(this.recoveries.size>dj){let W=this.recoveries.keys().next().value;if(typeof W!=="string")break;this.recoveries.delete(W)}}plan(N,W){if(!N||typeof W!=="string")return null;let j=uj(W);if(!j||!ZW(j.model))return null;let J=cj(N,j.model);if(!J)return null;this.prune();let Z=this.recoveries.get(J);if(!Z||Z.remaining<=0)return{sessionId:N,recoveryKey:J,requestedModel:j.model,effectiveModel:j.model,bodyText:W,downgraded:!1,standbyCacheAnchor:Z?.standbyCacheAnchor};return Z.updatedAt=this.now(),Z.nextRequestSequence++,this.recoveries.delete(J),this.recoveries.set(J,Z),j.body.model=$W,{sessionId:N,recoveryKey:J,requestedModel:Z.model,effectiveModel:$W,bodyText:JSON.stringify(j.body),downgraded:!0,cycle:Z.cycle,cacheAccountId:Z.cacheAccountId,standbyCacheAnchor:Z.standbyCacheAnchor,requestSequence:Z.nextRequestSequence}}recoveryAccount(N){if(N.cycle===void 0)return N.cacheAccountId;let W=this.recoveries.get(N.recoveryKey);return W?.cycle===N.cycle?W.cacheAccountId:N.cacheAccountId}bindRecoveryAccount(N,W){if(!N.downgraded||N.cycle===void 0)return!1;let j=this.recoveries.get(N.recoveryKey);if(!j||j.cycle!==N.cycle)return!1;if(j.cacheAccountId===W)return!1;return j.cacheAccountId=W,j.standbyCacheAnchor=void 0,j.standbyAnchorSequence=0,j.updatedAt=this.now(),N.cacheAccountId=W,N.standbyCacheAnchor=void 0,!0}activate(N,W){if(N.downgraded||!ZW(N.requestedModel))return this.remaining(N);let j={model:N.requestedModel,remaining:ij,cycle:this.nextCycle++,cacheAccountId:W,standbyCacheAnchor:N.standbyCacheAnchor,nextRequestSequence:0,standbyAnchorSequence:0,updatedAt:this.now()};return this.recoveries.delete(N.recoveryKey),this.recoveries.set(N.recoveryKey,j),this.prune(),j.remaining}complete(N,W){if(!N.downgraded||N.cycle==null||N.completed)return{counted:!1,remaining:this.remaining(N)};N.completed=!0;let j=this.recoveries.get(N.recoveryKey);if(!j||j.cycle!==N.cycle||j.remaining<=0)return{counted:!1,remaining:j?.remaining??0};if(j.remaining--,W&&(!j.cacheAccountId||W.oauthAccountId===j.cacheAccountId)&&N.requestSequence!=null&&N.requestSequence>=j.standbyAnchorSequence)j.standbyCacheAnchor=W,j.standbyAnchorSequence=N.requestSequence;return j.updatedAt=this.now(),this.recoveries.delete(N.recoveryKey),this.recoveries.set(N.recoveryKey,j),{counted:!0,remaining:j.remaining}}remaining(N){return this.prune(),this.recoveries.get(N.recoveryKey)?.remaining??0}}function $1(N){return typeof N==="object"&&N!==null}function nj(N){if(Array.isArray(N))return N;if($1(N)&&Array.isArray(N.data))return N.data;return[]}function _W(N){if(!$1(N)||!$1(N.info))return;return N.info}function XW(N){let W=_W(N);return typeof W?.role==="string"?W.role:void 0}function oj(N){let W=_W(N);return typeof W?.id==="string"?W.id:void 0}function YW(N){if(!$1(N)||!$1(N.info))return null;let W=N.info,j=$1(W.model)?W.model:void 0,J=typeof W.agent==="string"?W.agent:void 0,Z=typeof j?.providerID==="string"?j.providerID:typeof W.providerID==="string"?W.providerID:void 0,V=typeof j?.modelID==="string"?j.modelID:typeof W.modelID==="string"?W.modelID:void 0,_=typeof j?.variant==="string"?j.variant:typeof W.variant==="string"?W.variant:void 0;if(!J&&(!Z||!V)&&!_)return null;let B={};if(J)B.agent=J;if(Z&&V)B.model={providerID:Z,modelID:V};if(_)B.variant=_;return B}function DW(N,W){return{agent:N.agent??W.agent,model:N.model??W.model,variant:N.variant??W.variant,latestAssistantMessageId:N.latestAssistantMessageId??W.latestAssistantMessageId,latestUserMessageId:N.latestUserMessageId??W.latestUserMessageId}}function VW(N){return Boolean(N.agent&&N.model&&N.variant)}async function KW(N,W){if(!N||!W)return null;let j=N;if(typeof j.session?.messages!=="function")return null;let J=[];try{J=nj(await Promise.resolve(j.session.messages({path:{id:W},query:{limit:100}})))}catch{return null}if(J.length===0)return null;let Z,V;for(let B of J){let y=oj(B);if(!y)continue;let r=XW(B);if(r==="assistant"&&(!Z||y>Z))Z=y;if(r==="user"&&(!V||y>V))V=y}let _={latestAssistantMessageId:Z,latestUserMessageId:V};for(let B=J.length-1;B>=0;B--){if(XW(J[B])!=="assistant")continue;let y=YW(J[B]);if(!y)continue;if(_=DW(_,y),VW(_))return _}for(let B=J.length-1;B>=0;B--){let y=YW(J[B]);if(!y)continue;if(_=DW(_,y),VW(_))return _}if(!_.agent&&!_.model&&!_.variant&&!_.latestAssistantMessageId&&!_.latestUserMessageId)return null;return _}var d0=[],rj=1,zN=0,zW=new Map;function wW(N,W){if(d0.push({id:rj++,type:"open-dialog",payload:N,sessionId:W}),d0.length>100)d0=d0.slice(d0.length-100)}function UW(N=0,W){let j=Date.now();if(zN=j,W!==void 0)zW.set(W,j);let J=(Z)=>W===void 0||Z.sessionId===void 0||Z.sessionId===W;if(N>0)d0=d0.filter((Z)=>{if(Z.id>N)return!0;if(W===void 0)return!1;return Z.sessionId!==W});return d0.filter((Z)=>Z.id>N&&J(Z))}function wN(N){let W=Date.now();if(N!==void 0){let j=zW.get(N)??0;return j>0&&W-j<3000}return zN>0&&W-zN<3000}import{randomBytes as sj,timingSafeEqual as aj}from"node:crypto";import{unlink as tj}from"node:fs/promises";import{createServer as ej}from"node:http";import{join as NJ}from"node:path";function WJ(N){return new Promise((W,j)=>{let J=[],Z=0;N.on("data",(V)=>{if(Z+=V.length,Z>1e6){N.destroy(),j(Error("body too large"));return}J.push(V)}),N.on("end",()=>W(Buffer.concat(J).toString("utf8"))),N.on("error",j)})}function jJ(N,W){if(!N?.startsWith("Bearer "))return!1;let j=Buffer.from(N.slice(7)),J=Buffer.from(W);return j.length===J.length&&aj(j,J)}async function QW(N){let W=sj(32).toString("hex"),j=ej((V,_)=>{J(V,_)});async function J(V,_){let B=(y,r)=>{_.writeHead(y,{"content-type":"application/json"}),_.end(JSON.stringify(r))};try{let y=V.url??"";if(V.method==="GET"&&y==="/health")return B(200,{ok:!0});if(V.method!=="POST"||!y.startsWith("/rpc/"))return B(404,{error:"not found"});if(!jJ(V.headers.authorization,W))return B(401,{error:"unauthorized"});let r=y.slice(5),l=JSON.parse(await WJ(V)||"{}");if(r==="pending-notifications"){let d=N.drain(Number(l.lastReceivedId??0),typeof l.sessionId==="string"?l.sessionId:void 0);return B(200,{messages:d})}if(r==="apply"){let d=await N.apply(l);return B(200,d)}return B(404,{error:"unknown method"})}catch(y){if(!_.headersSent&&!_.writableEnded&&!_.destroyed)B(500,{error:y instanceof Error?y.message:String(y)})}}let Z=await new Promise((V,_)=>{j.on("error",_),j.listen(0,"127.0.0.1",()=>{let B=j.address();if(B&&typeof B==="object")V(B.port);else _(Error("no port"))})});j.unref();try{await PW(N.dir,{port:Z,token:W,pid:process.pid})}catch(V){throw await new Promise((_)=>j.close(()=>_())),V}return{port:Z,token:W,async stop(){await new Promise((V)=>j.close(()=>V())),await tj(NJ(N.dir,`port-${process.pid}.json`)).catch(()=>{})}}}import{createHash as JJ}from"node:crypto";function CW(N,W){let j=new Map,J=0,Z=0,V=0,_=0,B=0,y=(d)=>{let D0=performance.now(),I=N(d);return B+=performance.now()-D0,V++,I};return{call:(d)=>{if(!W.enabled())return y(d);let D0=j.get(d);if(D0!==void 0)return Z++,j.delete(d),j.set(d,D0),D0;let I=y(d),T0=d.length+I.length;if(T0>W.maxBytes)return I;j.set(d,I),J+=T0;while(J>W.maxBytes&&j.size>1){let P0=j.keys().next().value,E0=j.get(P0)??"";j.delete(P0),J-=P0.length+E0.length,_++}return I},stats:()=>({hits:Z,misses:V,evictions:_,entries:j.size,cacheBytes:J,computeMsTotal:B})}}function HW(N){return`${vW}${N.charAt(0).toUpperCase()}${N.slice(1)}`}function nW(N){if(N==="StructuredOutput")return N;return`${N.charAt(0).toLowerCase()}${N.slice(1)}`}var OJ=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function LW(N){let W=nW(N);if(W.startsWith("aft_"))return W;if(OJ.has(W))return`aft_${W}`;return null}function b1(N,W){let j=new Headers;if(N instanceof Request)N.headers.forEach((Z,V)=>{j.set(V,Z)});let J=W?.headers;if(J){if(J instanceof Headers)J.forEach((Z,V)=>{j.set(V,Z)});else if(Array.isArray(J))for(let Z of J){let[V,_]=Z;if(typeof _<"u")j.set(V,String(_))}else for(let[Z,V]of Object.entries(J))if(typeof V<"u")j.set(Z,String(V))}return j}function p1(N){return N.set("anthropic-beta",H1(N.get("anthropic-beta"),[qW])),N}function M1(N,W,j={}){return mW(N,W,j)}function $J(N){if(N.tools&&Array.isArray(N.tools))N.tools=N.tools.map((W)=>({...W,name:W.name?HW(W.name):W.name}));if(N.messages&&Array.isArray(N.messages))N.messages=N.messages.map((W)=>{if(W.content&&Array.isArray(W.content))W.content=W.content.map((j)=>{if(j.type==="tool_use"&&j.name)return{...j,name:HW(j.name)};return j});return W});return JSON.stringify(bW(N))}function UN(N){return N.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(W,j,J)=>{if(j)return`"name": "${LW(J)??nW(J)}"`;let Z=LW(J);return Z?`"name": "${Z}"`:W})}function MW(N,W=!1){if(W)return{ready:UN(N),pending:""};let j=N.length,J='"name"',Z=Math.max(0,N.length-J.length+1);for(let _=Z;_<N.length;_++)if(J.startsWith(N.slice(_))){j=Math.min(j,_);break}let V=N.lastIndexOf(J);if(V!==-1){let _=N.slice(V);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(_))j=Math.min(j,V)}if(j<N.length)return{ready:UN(N.slice(0,j)),pending:N.slice(j)};return{ready:UN(N),pending:""}}function CN(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let N=process.env.ANTHROPIC_INSECURE?.trim();return N==="1"||N==="true"}function oW(N){let W=N?.trim();if(!W)return null;try{let j=new URL(W);if(j.protocol!=="http:"&&j.protocol!=="https:"||j.username||j.password)return null;return j}catch{return null}}function ZJ(){return oW(process.env.ANTHROPIC_BASE_URL)}function HN(N,W={}){let j=null;try{if(typeof N==="string"||N instanceof URL)j=new URL(N.toString());else if(N instanceof Request)j=new URL(N.url)}catch{j=null}if(!j)return{input:N,url:null};let J=j.href,Z=W.baseURL?oW(W.baseURL):ZJ();if(Z){if(j.protocol=Z.protocol,j.host=Z.host,W.baseURL)j.pathname=`${Z.pathname.replace(/\/$/,"")}${j.pathname}`}if(j.pathname.endsWith("/v1/messages")&&!j.searchParams.has("beta"))j.searchParams.set("beta","true");if(j.href===J)return{input:N,url:j};return{input:N instanceof Request?new Request(j.toString(),N):j,url:j}}function GJ(N){let J=N.split(/\n\n+/).filter((Z)=>{if(Z.includes(AW))return!1;for(let V of RW)if(Z.includes(V))return!1;return!0}).join(`
1
+ import{a as mJ,f as w4,h as bJ,i as pJ}from"./index-szybnfvk.js";import{$ as dW,$a as QJ,$b as gJ,A as aj,Aa as $J,Ab as MJ,B as ej,Ba as ZJ,Bb as xJ,C as vW,Ca as c4,Cb as FJ,D as J4,Da as Q1,Db as EJ,E as N4,Ea as w1,Eb as ZW,F as O4,Fa as g1,Fb as YW,G as $0,Ga as YJ,Gb as DW,H as U1,Ha as V4,Hb as GW,I as $4,Ia as jW,Ib as A0,J as kW,Ja as WW,Jb as XW,K as gW,Ka as l4,Kb as Oj,L as T0,La as JW,Lb as SJ,M as k,Ma as NW,Mb as qJ,Na as OW,Nb as $j,O as N1,Oa as d4,P as hW,Pa as DJ,Pb as AJ,Q as yW,Qa as GJ,R as v1,Ra as u4,Rb as Zj,S as R1,Sa as n4,Sb as C1,T as mW,Ta as XJ,Tb as fJ,U as bW,Ua as o4,Ub as vJ,V as Z4,Va as VJ,Vb as Yj,W as pW,Wa as zJ,Wb as b0,X as Y4,Xa as KJ,Xb as H1,Y as iW,Ya as _J,Yb as RJ,Z as cW,Za as UJ,Zb as Q4,_ as lW,_a as PJ,_b as kJ,aa as uW,ab as wJ,ac as hJ,ba as nW,bb as z4,ca as D4,cb as r4,da as G4,db as K4,ea as oW,eb as s4,fa as P1,fb as HJ,ga as O1,gb as m0,ha as y4,hb as CJ,ia as rW,ib as t4,ja as X4,jb as _4,ka as sW,kb as LJ,la as tW,lb as a4,ma as aW,mb as h1,na as m4,nb as e4,oa as b4,ob as U4,pa as k1,pb as P4,qa as $1,qb as BJ,ra as eW,rb as jj,s as oj,sa as Z1,sb as Wj,t as rj,ta as jJ,tb as IJ,u as q1,ua as p4,ub as Jj,v as A1,va as WJ,vb as TJ,w as sj,wa as JJ,wb as Nj,x as _1,xa as NJ,xb as E1,y as fW,ya as OJ,yb as $W,z as tj,za as i4,zb as y1}from"./index-h0pmqm96.js";import{cc as RW,lc as h,mc as N0}from"./index-1ets4bf8.js";import{oc as Sj}from"./index-kckdabb4.js";import{rc as yJ}from"./index-k5enth8h.js";import"./index-9aeag0wm.js";import{randomUUID as h4}from"node:crypto";var Hj="claude-opus-4-8",G3=10,X3=128,V3=86400000;function y0(j){if(typeof j!=="string")return null;if(A0(j))return"opus-5";if(j===E1||j.startsWith(`${E1}-`))return"fable-5";return null}function X1(j){return y0(j)!==null}function z3(j,W){let J=y0(W);return J?`${j}\x00${J}`:null}function K3(j){try{let W=JSON.parse(j);return typeof W.model==="string"?{body:W,model:W.model}:null}catch{return null}}class x4{now;recoveries=new Map;nextCycle=1;constructor(j=Date.now){this.now=j}prune(){let j=this.now();for(let[W,J]of this.recoveries)if(j-J.updatedAt>=V3)this.recoveries.delete(W);while(this.recoveries.size>X3){let W=this.recoveries.keys().next().value;if(typeof W!=="string")break;this.recoveries.delete(W)}}plan(j,W){if(!j||typeof W!=="string")return null;let J=K3(W);if(!J||!X1(J.model))return null;let N=z3(j,J.model);if(!N)return null;this.prune();let Z=this.recoveries.get(N);if(!Z||Z.remaining<=0)return{sessionId:j,recoveryKey:N,requestedModel:J.model,effectiveModel:J.model,bodyText:W,downgraded:!1,standbyCacheAnchor:Z?.standbyCacheAnchor};return Z.updatedAt=this.now(),Z.nextRequestSequence++,this.recoveries.delete(N),this.recoveries.set(N,Z),J.body.model=Hj,{sessionId:j,recoveryKey:N,requestedModel:Z.model,effectiveModel:Hj,bodyText:JSON.stringify(J.body),downgraded:!0,cycle:Z.cycle,cacheAccountId:Z.cacheAccountId,standbyCacheAnchor:Z.standbyCacheAnchor,requestSequence:Z.nextRequestSequence}}recoveryAccount(j){if(j.cycle===void 0)return j.cacheAccountId;let W=this.recoveries.get(j.recoveryKey);return W?.cycle===j.cycle?W.cacheAccountId:j.cacheAccountId}bindRecoveryAccount(j,W){if(!j.downgraded||j.cycle===void 0)return!1;let J=this.recoveries.get(j.recoveryKey);if(!J||J.cycle!==j.cycle)return!1;if(J.cacheAccountId===W)return!1;return J.cacheAccountId=W,J.standbyCacheAnchor=void 0,J.standbyAnchorSequence=0,J.updatedAt=this.now(),j.cacheAccountId=W,j.standbyCacheAnchor=void 0,!0}activate(j,W){if(j.downgraded||!X1(j.requestedModel))return this.remaining(j);let J={model:j.requestedModel,remaining:G3,cycle:this.nextCycle++,cacheAccountId:W,standbyCacheAnchor:j.standbyCacheAnchor,nextRequestSequence:0,standbyAnchorSequence:0,updatedAt:this.now()};return this.recoveries.delete(j.recoveryKey),this.recoveries.set(j.recoveryKey,J),this.prune(),J.remaining}complete(j,W){if(!j.downgraded||j.cycle==null||j.completed)return{counted:!1,remaining:this.remaining(j)};j.completed=!0;let J=this.recoveries.get(j.recoveryKey);if(!J||J.cycle!==j.cycle||J.remaining<=0)return{counted:!1,remaining:J?.remaining??0};if(J.remaining--,W&&(!J.cacheAccountId||W.oauthAccountId===J.cacheAccountId)&&j.requestSequence!=null&&j.requestSequence>=J.standbyAnchorSequence)J.standbyCacheAnchor=W,J.standbyAnchorSequence=j.requestSequence;return J.updatedAt=this.now(),this.recoveries.delete(j.recoveryKey),this.recoveries.set(j.recoveryKey,J),{counted:!0,remaining:J.remaining}}remaining(j){return this.prune(),this.recoveries.get(j.recoveryKey)?.remaining??0}}function V1(j){return typeof j==="object"&&j!==null}function _3(j){if(Array.isArray(j))return j;if(V1(j)&&Array.isArray(j.data))return j.data;return[]}function Tj(j){if(!V1(j)||!V1(j.info))return;return j.info}function Cj(j){let W=Tj(j);return typeof W?.role==="string"?W.role:void 0}function U3(j){let W=Tj(j);return typeof W?.id==="string"?W.id:void 0}function Lj(j){if(!V1(j)||!V1(j.info))return null;let W=j.info,J=V1(W.model)?W.model:void 0,N=typeof W.agent==="string"?W.agent:void 0,Z=typeof J?.providerID==="string"?J.providerID:typeof W.providerID==="string"?W.providerID:void 0,G=typeof J?.modelID==="string"?J.modelID:typeof W.modelID==="string"?W.modelID:void 0,V=typeof J?.variant==="string"?J.variant:typeof W.variant==="string"?W.variant:void 0;if(!N&&(!Z||!G)&&!V)return null;let B={};if(N)B.agent=N;if(Z&&G)B.model={providerID:Z,modelID:G};if(V)B.variant=V;return B}function Bj(j,W){return{agent:j.agent??W.agent,model:j.model??W.model,variant:j.variant??W.variant,latestAssistantMessageId:j.latestAssistantMessageId??W.latestAssistantMessageId,latestUserMessageId:j.latestUserMessageId??W.latestUserMessageId}}function Ij(j){return Boolean(j.agent&&j.model&&j.variant)}async function Mj(j,W){if(!j||!W)return null;let J=j;if(typeof J.session?.messages!=="function")return null;let N=[];try{N=_3(await Promise.resolve(J.session.messages({path:{id:W},query:{limit:100}})))}catch{return null}if(N.length===0)return null;let Z,G;for(let B of N){let f=U3(B);if(!f)continue;let r=Cj(B);if(r==="assistant"&&(!Z||f>Z))Z=f;if(r==="user"&&(!G||f>G))G=f}let V={latestAssistantMessageId:Z,latestUserMessageId:G};for(let B=N.length-1;B>=0;B--){if(Cj(N[B])!=="assistant")continue;let f=Lj(N[B]);if(!f)continue;if(V=Bj(V,f),Ij(V))return V}for(let B=N.length-1;B>=0;B--){let f=Lj(N[B]);if(!f)continue;if(V=Bj(V,f),Ij(V))return V}if(!V.agent&&!V.model&&!V.variant&&!V.latestAssistantMessageId&&!V.latestUserMessageId)return null;return V}var d0=[],P3=1,F4=0,xj=new Map;function Fj(j,W){if(d0.push({id:P3++,type:"open-dialog",payload:j,sessionId:W}),d0.length>100)d0=d0.slice(d0.length-100)}function Ej(j=0,W){let J=Date.now();if(F4=J,W!==void 0)xj.set(W,J);let N=(Z)=>W===void 0||Z.sessionId===void 0||Z.sessionId===W;if(j>0)d0=d0.filter((Z)=>{if(Z.id>j)return!0;if(W===void 0)return!1;return Z.sessionId!==W});return d0.filter((Z)=>Z.id>j&&N(Z))}function E4(j){let W=Date.now();if(j!==void 0){let J=xj.get(j)??0;return J>0&&W-J<3000}return F4>0&&W-F4<3000}import{randomBytes as Q3,timingSafeEqual as w3}from"node:crypto";import{unlink as H3}from"node:fs/promises";import{createServer as C3}from"node:http";import{join as L3}from"node:path";function B3(j){return new Promise((W,J)=>{let N=[],Z=0;j.on("data",(G)=>{if(Z+=G.length,Z>1e6){j.destroy(),J(Error("body too large"));return}N.push(G)}),j.on("end",()=>W(Buffer.concat(N).toString("utf8"))),j.on("error",J)})}function I3(j,W){if(!j?.startsWith("Bearer "))return!1;let J=Buffer.from(j.slice(7)),N=Buffer.from(W);return J.length===N.length&&w3(J,N)}async function qj(j){let W=Q3(32).toString("hex"),J=C3((G,V)=>{N(G,V)});async function N(G,V){let B=(f,r)=>{V.writeHead(f,{"content-type":"application/json"}),V.end(JSON.stringify(r))};try{let f=G.url??"";if(G.method==="GET"&&f==="/health")return B(200,{ok:!0});if(G.method!=="POST"||!f.startsWith("/rpc/"))return B(404,{error:"not found"});if(!I3(G.headers.authorization,W))return B(401,{error:"unauthorized"});let r=f.slice(5),E=JSON.parse(await B3(G)||"{}");if(r==="pending-notifications"){let v=j.drain(Number(E.lastReceivedId??0),typeof E.sessionId==="string"?E.sessionId:void 0);return B(200,{messages:v})}if(r==="apply"){let v=await j.apply(E);return B(200,v)}return B(404,{error:"unknown method"})}catch(f){if(!V.headersSent&&!V.writableEnded&&!V.destroyed)B(500,{error:f instanceof Error?f.message:String(f)})}}let Z=await new Promise((G,V)=>{J.on("error",V),J.listen(0,"127.0.0.1",()=>{let B=J.address();if(B&&typeof B==="object")G(B.port);else V(Error("no port"))})});J.unref();try{await Sj(j.dir,{port:Z,token:W,pid:process.pid})}catch(G){throw await new Promise((V)=>J.close(()=>V())),G}return{port:Z,token:W,async stop(){await new Promise((G)=>J.close(()=>G())),await H3(L3(j.dir,`port-${process.pid}.json`)).catch(()=>{})}}}var fj="server-side-fallback-2026-07-01",vj="⁠",u1="cortexkit-server-fallback-v1:";function f0(j){return j!==null&&typeof j==="object"&&!Array.isArray(j)?j:void 0}function z1(j,W){let J=j?.[W];return typeof J==="string"?J:void 0}function K1(j){return typeof j==="string"&&j.length>0&&j.length<=128&&/^claude-[a-z0-9-]+$/i.test(j)}function T3(j){return`${u1}${j.fromModel}|${j.toModel}`}function M3(j){if(typeof j!=="string"||!j.startsWith(u1))return null;let W=j.slice(u1.length),J=W.indexOf("|");if(J<=0||J!==W.lastIndexOf("|"))return null;let N=W.slice(0,J),Z=W.slice(J+1);if(!K1(N)||!K1(Z))return null;return{fromModel:N,toModel:Z}}function x3(j){if(j.type!=="fallback")return null;let W=z1(f0(j.from),"model"),J=z1(f0(j.to),"model");if(!K1(W)||!K1(J))return null;return{fromModel:W,toModel:J}}function F3(j){return{type:"fallback",from:{model:j.fromModel},to:{model:j.toModel}}}function E3(j,W){let J=0,N=0;if(!Array.isArray(j.messages))return{restoredMarkers:J,droppedMarkers:N};for(let Z of j.messages){let G=f0(Z);if(G?.role!=="assistant"||!Array.isArray(G.content))continue;let V=[];for(let B of G.content){let f=f0(B);if(!(f?.type==="thinking"&&(f.thinking===vj||f.thinking==="")&&typeof f.signature==="string"&&f.signature.startsWith(u1))){V.push(B);continue}let E=M3(f.signature);if(W&&E)V.push(F3(E)),J++;else N++}G.content=V}return{restoredMarkers:J,droppedMarkers:N}}function Rj(j){return j?.trim().toLowerCase()==="legacy"?"legacy":"server"}function kj(j,W){let J=W&&X1(j.model),N=E3(j,J);if(J)j.fallbacks="default";else if(j.fallbacks==="default")delete j.fallbacks;return{enabled:J,...N}}function S3(j){let W,J=[];for(let Z of j.split(/\r?\n/))if(Z.startsWith("event:"))W=Z.slice(6).trim();else if(Z.startsWith("data:")){let G=Z.slice(5);J.push(G.startsWith(" ")?G.slice(1):G)}let N=J.join(`
2
+ `);if(!N||N==="[DONE]")return{event:W};try{return{event:W,data:f0(JSON.parse(N))}}catch{return{event:W}}}function q3(j){let W=j.indexOf(`
2
3
 
3
- `);for(let Z of kW)J=J.replace(Z.match,Z.replacement);return J.trim()}var XJ=8388608;function YJ(){return process.env.OPENCODE_ANTHROPIC_AUTH_MEMO!=="0"}var DJ=CW(GJ,{maxBytes:XJ,enabled:YJ});function g1(N){return DJ.call(N)}function n(N){return N!=null&&typeof N==="object"&&!Array.isArray(N)}function VJ(N){let W={type:"text",text:Z1};if(N==null)return[W];if(typeof N==="string"){let J=g1(N);if(J===Z1)return[W];return[W,{type:"text",text:J}]}if(n(N)){let J=typeof N.type==="string"?N.type:"text",Z=typeof N.text==="string"?N.text:"";return[W,{...N,type:J,text:g1(Z)}]}if(!Array.isArray(N))return[W];let j=N.map((J)=>{if(typeof J==="string")return{type:"text",text:g1(J)};if(n(J)&&J.type==="text"&&typeof J.text==="string")return{...J,type:"text",text:g1(J.text)};return{type:"text",text:String(J)}});if(j[0]?.text===Z1)return j;return[W,...j]}var rW={type:"ephemeral",ttl:"1h"},BW=20;function sW(N){if(n(N.cache_control))return N.cache_control;if(n(N.cacheControl))return N.cacheControl;return null}function C1(N,W){if(!n(N))return!1;return delete N.cacheControl,N.cache_control=W?{...rW}:{type:"ephemeral"},!0}function IW(N){if(!n(N))return;delete N.cache_control,delete N.cacheControl}function LN(N){if(Array.isArray(N))return N;if(typeof N==="string")return[{type:"text",text:N}];return null}function QN(N){if(Array.isArray(N))return N.map(QN);if(!n(N))return N;let W={};for(let j of Object.keys(N).sort()){if(j==="cache_control"||j==="cacheControl")continue;W[j]=QN(N[j])}return W}function aW(N){if(!n(N))return;let W=LN(N.content);if(!W?.length)return;let j=QN({...N,content:W});return JJ("sha256").update(JSON.stringify(j)).digest("hex")}function _J(N){if(!n(N))return!1;let W=LN(N.content);return Boolean(W?.some((j)=>n(j)&&sW(j)?.type==="ephemeral"))}function tW(N){try{let W=JSON.parse(N);if(!Array.isArray(W.messages))return;for(let j=W.messages.length-1;j>1;j--){let J=W.messages[j];if(!n(J)||J.role!=="user"||!_J(J))continue;let Z=aW(J);if(!Z)return;return{fingerprint:Z,messageIndex:j,messageCount:W.messages.length}}return}catch{return}}function y1(N,W){if(!n(N))return;let j=sW(N);if(j?.type!=="ephemeral")return;if(W)j.ttl="1h";else delete j.ttl}function FW(N,W){if(Array.isArray(N.system))for(let j of N.system)y1(j,W);else y1(N.system,W);if(!Array.isArray(N.messages))return;for(let j of N.messages)if(y1(j,W),n(j)&&Array.isArray(j.content))for(let J of j.content)y1(J,W)}function KJ(N,W){if(Array.isArray(N.system))for(let j of N.system)W(j);else W(N.system);if(!Array.isArray(N.messages))return;for(let j of N.messages)if(W(j),n(j)&&Array.isArray(j.content))for(let J of j.content)W(J)}function eW(N){IW(N),KJ(N,IW)}function zJ(N){eW(N),N.cache_control={...rW}}function wJ(N){return n(N)&&N.type!=="thinking"&&N.type!=="redacted_thinking"}function i1(N){let W=LN(N.content);if(!W?.length)return;let j=W.filter(wJ);if(!j.length)return;return{content:W,cacheableBlocks:j}}function UJ(N){if(!n(N))return!1;let W=i1(N);if(!W)return!1;return N.content=W.content,C1(W.cacheableBlocks[0],!0)}function PJ(N){if(!n(N))return!1;let W=i1(N);if(!W||W.cacheableBlocks.length<2)return!1;return N.content=W.content,C1(W.cacheableBlocks[1],!0)}function h1(N){if(!n(N))return!1;let W=i1(N);if(!W)return!1;let j=W.cacheableBlocks[W.cacheableBlocks.length-1];return N.content=W.content,C1(j,!0)}function QJ(N){if(!n(N))return!1;return(i1(N)?.cacheableBlocks.length??0)>1}function CJ(N){if(!n(N))return 0;let W=N.content;if(Array.isArray(W))return W.length;if(W==null)return 0;return 1}function HJ(N){let W=[],j=0;return N.forEach((J,Z)=>{let V=CJ(J);if(n(J)&&J.role==="user"&&V>0)W.push({index:Z,blockPosition:j+V-1});j+=V}),W}function LJ(N,W,j,J){if(!J)return;let Z=[],V=W.find((_)=>_.index===J.messageIndex&&_.index>1&&_.index<j.index);if(V)Z.push(V);for(let _ of[...W].reverse()){if(_.index<=1||_.index>=j.index||_.index===V?.index)continue;Z.push(_)}for(let _ of Z)if(aW(N[_.index])===J.fingerprint)return _;return}function MJ(N,W){let j=HJ(N),J=[...j].reverse().find((l)=>l.index>1);if(!J)return{latest:void 0,bridge:void 0,standbyAnchorMatched:!1,standbyBridgeApplied:!1};let Z=LJ(N,j,J,W),V=Z?J.blockPosition-Z.blockPosition+1:void 0,_=Z&&V!=null&&V>BW?Z:void 0,B=[...j].reverse().find((l)=>l.index<J.index),y=B?J.blockPosition-B.blockPosition+1:0,r=B&&B.index>1&&y>BW?B:void 0;return{latest:J,bridge:_??r,standbyAnchorMatched:Boolean(Z),standbyDistanceBlocks:V,standbyBridgeApplied:Boolean(_)}}function PN(N){return n(N)&&typeof N.text==="string"?N.text:""}function BJ(N){if(!Array.isArray(N.system))return;let W=N.system,j=0;if(PN(W[j]).startsWith("x-anthropic-billing-header:"))j++;if(PN(W[j])===Z1)j++;let J=j+1;if(J>=W.length-1)return;let Z=W[J];if(!n(Z))return;let V=W.slice(J).map(PN).join(`
4
- `);W.splice(J,W.length-J,{...Z,type:"text",text:V})}function xW(N){if(Array.isArray(N.system)){let W=N.system.findIndex((Z)=>n(Z)&&Z.text===Z1),j=N.system.slice(W>=0?W+1:0).filter(n),J=j[j.length-1];C1(J,!0)}else C1(N.system,!0)}function IJ(N,W){if(eW(N),BJ(N),!Array.isArray(N.messages))return xW(N),{standbyAnchorMatched:!1,standbyBridgeApplied:!1};let{latest:j,bridge:J,standbyAnchorMatched:Z,standbyDistanceBlocks:V,standbyBridgeApplied:_}=MJ(N.messages,W);if(!J)xW(N);if(QJ(N.messages[0]))UJ(N.messages[0]),PJ(N.messages[0]);else h1(N.messages[0]),h1(N.messages[1]);if(J)h1(N.messages[J.index]);if(j)h1(N.messages[j.index]);return{standbyAnchorMatched:Z,standbyDistanceBlocks:V,standbyBridgeApplied:_,..._&&J?{standbyBridgeMessageIndex:J.index}:{}}}function FJ(N){if(!Array.isArray(N.messages))return 0;let W=0;return N.messages=N.messages.filter((j)=>{if(!n(j)||!Array.isArray(j.content))return!0;if(j.role!=="assistant")return!0;let J=j.content.filter((Z)=>{if(!n(Z)||Z.type!=="thinking")return!0;if(!uW(Z.signature))return!0;return W+=1,!1});if(J.length===j.content.length)return!0;return j.content=J,J.length>0}),W}function N4(N){if(!iW(N.model))return null;let W=Object.hasOwn(N,"thinking");return N.thinking={...pW},{replacedExisting:W}}function xJ(N){if(!lW(N.model))return null;let W=Object.hasOwn(N,"thinking"),j=N.thinking;if(n(j)&&j.type==="disabled")return N.thinking={type:"disabled"},{replacedExisting:W,display:"disabled"};return N.thinking={...dW},{replacedExisting:W,display:"summarized"}}function W4(N){if(!R0(N.model))return null;let W=Object.hasOwn(N,"thinking"),j=N.thinking;if(n(j)&&j.type==="disabled"){N.thinking={type:"disabled"};let J=N.output_config;if(n(J)&&J.effort==="xhigh")J.effort="high";else if(n(J)&&J.effort==="max")J.effort="high";return{replacedExisting:W,display:"disabled"}}return N.thinking={...cW},{replacedExisting:W,display:"summarized"}}function j4(N,W=Q1){try{let j=JSON.parse(N);return j.model=W,delete j.speed,N4(j),W4(j),{ok:!0,bodyText:JSON.stringify(j)}}catch{return{ok:!1,reason:"body is not valid JSON"}}}function TJ(N,W){if(!W.enabled)return FW(N,!1),delete N.cache_control,delete N.cacheControl,{};if(W.mode==="automatic")return zJ(N),{};if(W.mode==="hybrid")return IJ(N,W.hybridStandbyAnchor);return FW(N,!0),delete N.cacheControl,{}}function EJ(N){if(!Array.isArray(N.messages))return;while(N.messages.length){let W=N.messages[N.messages.length-1];if(!n(W)||W.role!=="assistant")break;N.messages.pop()}}function o(){return performance.now()}function x0(N){return Math.round(N*10)/10}function TW(N){let W=0,j=0,J=0,Z=Array.isArray(N.messages)?N.messages:[];W=Z.length;for(let V of Z){if(!V||typeof V!=="object")continue;let _=V.content;if(!Array.isArray(_))continue;j+=_.length;for(let B of _)if(B&&typeof B==="object"&&B.type==="tool_use")J++}return{messageCount:W,contentBlockCount:j,toolDefinitionCount:Array.isArray(N.tools)?N.tools.length:0,toolUseCount:J,systemBlockCount:Array.isArray(N.system)?N.system.length:0}}async function MN(N,W={}){try{let j=o(),J=JSON.parse(N);W.perf?.("parse",{ms:x0(o()-j),inputBytes:N.length,...TW(J)});let Z=o(),V=Array.isArray(J.messages)?J.messages.length:void 0;EJ(J);let _=Array.isArray(J.messages)?J.messages.length:void 0;W.perf?.("strip_trailing_assistant",{ms:x0(o()-Z),removedMessages:typeof V==="number"&&typeof _==="number"?V-_:void 0});let B=o(),y=FJ(J),r=N4(J),l=xJ(J),d=W4(J);W.perf?.("model_normalize",{ms:x0(o()-B),model:typeof J.model==="string"?J.model:void 0,fableMythosThinkingDisplay:r?"summarized":void 0,replacedFableMythosThinking:r?.replacedExisting??!1,sonnet5ThinkingDisplay:l?.display,replacedSonnet5Thinking:l?.replacedExisting??!1,opus5ThinkingDisplay:d?.display,replacedOpus5Thinking:d?.replacedExisting??!1,removedNonAnthropicThinking:y,hasOutputConfig:Object.hasOwn(J,"output_config")});let D0=o(),I=Array.isArray(J.messages)&&J.messages.some((L0)=>L0.role==="user")?yW(J.messages,void 0,fW):null;W.perf?.("billing_header",{ms:x0(o()-D0),hasBillingHeader:Boolean(I)});let T0=o();if(J.system=VJ(J.system),W.perf?.("system_identity",{ms:x0(o()-T0),systemBlockCount:Array.isArray(J.system)?J.system.length:0}),I&&Array.isArray(J.system))J.system.unshift({type:"text",text:I});let P0=o(),E0=TJ(J,{enabled:W.cache1hEnabled??!1,mode:W.cache1hMode??"explicit",hybridStandbyAnchor:W.hybridStandbyAnchor});if(W.perf?.("cache_strategy",{ms:x0(o()-P0),enabled:W.cache1hEnabled??!1,mode:W.cache1hMode??"explicit",...E0}),W.fastModeEnabled&&L1(J.model))J.speed="fast";else if(J.speed==="fast")delete J.speed;let b0=o();if(W.identity)hW(J,W.identity);W.perf?.("metadata",{ms:x0(o()-b0),hasAccountUuid:Boolean(W.identity?.accountUuid)});let c0=o(),v0=$J(J);W.perf?.("prefix_tools_stringify",{ms:x0(o()-c0),outputBytesBeforeSign:v0.length,...TW(J)});let K1=o(),W1=await gW(v0);return W.perf?.("cch_sign",{ms:x0(o()-K1),outputBytes:W1.length}),W1}catch{return N}}var SJ=new TextEncoder;function vJ(){return{pending:"",events:0,parseErrors:0,eventCounts:{},typeCounts:{},deltaTypeCounts:{},contentBlockTypeCounts:{},textDeltaBytes:0,thinkingDeltaBytes:0,inputJsonDeltaBytes:0,signatureDeltaBytes:0,redactedThinkingBytes:0}}function m1(N,W){if(!W)return;N[W]=(N[W]??0)+1}function s0(N){return SJ.encode(N).byteLength}function l0(N){return N&&typeof N==="object"&&!Array.isArray(N)?N:void 0}function U0(N,W){let j=N?.[W];return typeof j==="string"?j:void 0}function qJ(N,W){let j=N?.[W];return typeof j==="number"?j:void 0}function J4(N){if(!N.trim())return null;let W,j=[];for(let d of N.split(/\r?\n/)){if(d.startsWith("event:")){W=d.slice(6).trim();continue}if(d.startsWith("data:")){let D0=d.slice(5);j.push(D0.startsWith(" ")?D0.slice(1):D0)}}let J=j.join(`
5
- `),Z={event:W,rawBytes:s0(N),dataBytes:s0(J)};if(!J||J==="[DONE]")return Z.type=J==="[DONE]"?"done":void 0,Z.event??=Z.type,Z;let V;try{V=JSON.parse(J)}catch{return Z}let _=l0(V),B=l0(_?.delta),y=l0(_?.content_block),r=l0(_?.message),l=l0(_?.usage)??l0(r?.usage);if(Z.type=U0(_,"type"),Z.event??=Z.type,Z.index=qJ(_,"index"),Z.contentBlockType=U0(y,"type"),Z.deltaType=U0(B,"type"),Z.stopReason=U0(B,"stop_reason")??U0(_,"stop_reason"),Z.deltaType==="text_delta")Z.textDeltaBytes=s0(U0(B,"text")??"");if(Z.deltaType==="thinking_delta")Z.thinkingDeltaBytes=s0(U0(B,"thinking")??"");if(Z.deltaType==="input_json_delta")Z.inputJsonDeltaBytes=s0(U0(B,"partial_json")??"");if(Z.deltaType==="signature_delta")Z.signatureDeltaBytes=s0(U0(B,"signature")??"");if(Z.contentBlockType==="redacted_thinking")Z.redactedThinkingBytes=s0(U0(y,"data")??"");if(l)Z.stopReason??=U0(r,"stop_reason");return Z}function BN(N){let W=N.indexOf(`
4
+ `),J=j.indexOf(`\r
5
+ \r
6
+ `);if(W===-1)return J===-1?null:{index:J,length:4};if(J===-1||W<J)return{index:W,length:2};return{index:J,length:4}}function Aj(j,W){return`event: ${j}
7
+ data: ${JSON.stringify(W)}
8
+
9
+ `}function A3(j,W){return Aj("content_block_start",{type:"content_block_start",index:j,content_block:{type:"thinking",thinking:vj}})+Aj("content_block_delta",{type:"content_block_delta",index:j,delta:{type:"signature_delta",signature:T3(W)}})}function f3(j,W){let J=y0(j),N=y0(W);if(J&&N)return J===N;return j===W}function gj(j){let W="",J,N,Z,G=!1,V=(E)=>{if(!Array.isArray(E?.iterations))return;for(let v of E.iterations){let n=f0(v);if(n?.type!=="fallback_message")continue;let l=z1(n,"model");if(K1(l))Z=l}},B=(E)=>{if(G)return;G=!0;let v=N?.toModel??Z??(J&&!f3(j.requestedModel,J)?J:void 0);j.onOutcome?.({requestedModel:j.requestedModel,servedModel:J,targetModel:v,fallback:Boolean(v),handoff:Boolean(N),stopReason:E})},f=(E,v)=>{let n=S3(E),l=n.data,Y0=z1(l,"type")??n.event;if(Y0==="message_start"){let t=f0(l?.message),w0=z1(t,"model");if(K1(w0))J=w0;V(f0(t?.usage))}else if(Y0==="content_block_start"){let t=f0(l?.content_block),w0=t?x3(t):null;if(w0){N=w0;let F=l?.index;if(typeof F==="number"&&Number.isInteger(F)&&F>=0)return A3(F,w0)}}else if(Y0==="message_delta"){V(f0(l?.usage));let t=z1(f0(l?.delta),"stop_reason");if(t)B(t)}return E+v},r=()=>{let E="";while(!0){let v=q3(W);if(!v)break;let n=W.slice(0,v.index),l=W.slice(v.index,v.index+v.length);W=W.slice(v.index+v.length),E+=f(n,l)}return E};return{push(E){return W+=E,r()},flush(){let E=r();if(!W)return E;let v=f(W,"");return W="",E+v}}}import{createHash as v3}from"node:crypto";function hj(j,W){let J=new Map,N=0,Z=0,G=0,V=0,B=0,f=(v)=>{let n=performance.now(),l=j(v);return B+=performance.now()-n,G++,l};return{call:(v)=>{if(!W.enabled())return f(v);let n=J.get(v);if(n!==void 0)return Z++,J.delete(v),J.set(v,n),n;let l=f(v),Y0=v.length+l.length;if(Y0>W.maxBytes)return l;J.set(v,l),N+=Y0;while(N>W.maxBytes&&J.size>1){let t=J.keys().next().value,w0=J.get(t)??"";J.delete(t),N-=t.length+w0.length,V++}return l},stats:()=>({hits:Z,misses:G,evictions:V,entries:J.size,cacheBytes:N,computeMsTotal:B})}}function yj(j){return`${oj}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function VW(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}var R3=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function mj(j){let W=VW(j);if(W.startsWith("aft_"))return W;if(R3.has(W))return`aft_${W}`;return null}function t1(j,W){let J=new Headers;if(j instanceof Request)j.headers.forEach((Z,G)=>{J.set(G,Z)});let N=W?.headers;if(N){if(N instanceof Headers)N.forEach((Z,G)=>{J.set(G,Z)});else if(Array.isArray(N))for(let Z of N){let[G,V]=Z;if(typeof V<"u")J.set(G,String(V))}else for(let[Z,G]of Object.entries(N))if(typeof G<"u")J.set(Z,String(G))}return J}function a1(j){return j.set("anthropic-beta",q1(j.get("anthropic-beta"),[rj])),j}function f1(j,W,J={}){return NW(j,W,{...J,extraBetas:J.body?.fallbacks==="default"?[fj]:void 0})}function k3(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((W)=>({...W,name:W.name?yj(W.name):W.name}));if(j.messages&&Array.isArray(j.messages))j.messages=j.messages.map((W)=>{if(W.content&&Array.isArray(W.content))W.content=W.content.map((J)=>{if(J.type==="tool_use"&&J.name)return{...J,name:yj(J.name)};return J});return W});return JSON.stringify(OW(j))}function S4(j){return j.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(W,J,N)=>{if(J)return`"name": "${mj(N)??VW(N)}"`;let Z=mj(N);return Z?`"name": "${Z}"`:W})}function bj(j,W=!1){if(W)return{ready:S4(j),pending:""};let J=j.length,N='"name"',Z=Math.max(0,j.length-N.length+1);for(let V=Z;V<j.length;V++)if(N.startsWith(j.slice(V))){J=Math.min(J,V);break}let G=j.lastIndexOf(N);if(G!==-1){let V=j.slice(G);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(V))J=Math.min(J,G)}if(J<j.length)return{ready:S4(j.slice(0,J)),pending:j.slice(J)};return{ready:S4(j),pending:""}}function f4(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function zW(j){let W=j?.trim();if(!W)return null;try{let J=new URL(W);if(J.protocol!=="http:"&&J.protocol!=="https:"||J.username||J.password)return null;return J}catch{return null}}function g3(){return zW(process.env.ANTHROPIC_BASE_URL)}function v4(j,W={}){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 N=J.href,Z=W.baseURL?zW(W.baseURL):g3();if(Z){if(J.protocol=Z.protocol,J.host=Z.host,W.baseURL)J.pathname=`${Z.pathname.replace(/\/$/,"")}${J.pathname}`}if(J.pathname.endsWith("/v1/messages")&&!J.searchParams.has("beta"))J.searchParams.set("beta","true");if(J.href===N)return{input:j,url:J};return{input:j instanceof Request?new Request(J.toString(),j):J,url:J}}function h3(j){let N=j.split(/\n\n+/).filter((Z)=>{if(Z.includes(sj))return!1;for(let G of aj)if(Z.includes(G))return!1;return!0}).join(`
10
+
11
+ `);for(let Z of ej)N=N.replace(Z.match,Z.replacement);return N.trim()}var y3=8388608;function m3(){return process.env.OPENCODE_ANTHROPIC_AUTH_MEMO!=="0"}var b3=hj(h3,{maxBytes:y3,enabled:m3});function n1(j){return b3.call(j)}function c(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function p3(j){let W={type:"text",text:_1};if(j==null)return[W];if(typeof j==="string"){let N=n1(j);if(N===_1)return[W];return[W,{type:"text",text:N}]}if(c(j)){let N=typeof j.type==="string"?j.type:"text",Z=typeof j.text==="string"?j.text:"";return[W,{...j,type:N,text:n1(Z)}]}if(!Array.isArray(j))return[W];let J=j.map((N)=>{if(typeof N==="string")return{type:"text",text:n1(N)};if(c(N)&&N.type==="text"&&typeof N.text==="string")return{...N,type:"text",text:n1(N.text)};return{type:"text",text:String(N)}});if(J[0]?.text===_1)return J;return[W,...J]}var KW={type:"ephemeral",ttl:"1h"},pj=20;function _W(j){if(c(j.cache_control))return j.cache_control;if(c(j.cacheControl))return j.cacheControl;return null}function S1(j,W){if(!c(j))return!1;return delete j.cacheControl,j.cache_control=W?{...KW}:{type:"ephemeral"},!0}function ij(j){if(!c(j))return;delete j.cache_control,delete j.cacheControl}function R4(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function A4(j){if(Array.isArray(j))return j.map(A4);if(!c(j))return j;let W={};for(let J of Object.keys(j).sort()){if(J==="cache_control"||J==="cacheControl")continue;W[J]=A4(j[J])}return W}function UW(j){if(!c(j))return;let W=R4(j.content);if(!W?.length)return;let J=A4({...j,content:W});return v3("sha256").update(JSON.stringify(J)).digest("hex")}function i3(j){if(!c(j))return!1;let W=R4(j.content);return Boolean(W?.some((J)=>c(J)&&_W(J)?.type==="ephemeral"))}function PW(j){try{let W=JSON.parse(j);if(!Array.isArray(W.messages))return;for(let J=W.messages.length-1;J>1;J--){let N=W.messages[J];if(!c(N)||N.role!=="user"||!i3(N))continue;let Z=UW(N);if(!Z)return;return{fingerprint:Z,messageIndex:J,messageCount:W.messages.length}}return}catch{return}}function o1(j,W){if(!c(j))return;let J=_W(j);if(J?.type!=="ephemeral")return;if(W)J.ttl="1h";else delete J.ttl}function cj(j,W){if(Array.isArray(j.system))for(let J of j.system)o1(J,W);else o1(j.system,W);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(o1(J,W),c(J)&&Array.isArray(J.content))for(let N of J.content)o1(N,W)}function c3(j,W){if(Array.isArray(j.system))for(let J of j.system)W(J);else W(j.system);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(W(J),c(J)&&Array.isArray(J.content))for(let N of J.content)W(N)}function QW(j){ij(j),c3(j,ij)}function l3(j){QW(j),j.cache_control={...KW}}function d3(j){return c(j)&&j.type!=="thinking"&&j.type!=="redacted_thinking"}function e1(j){let W=R4(j.content);if(!W?.length)return;let J=W.filter(d3);if(!J.length)return;return{content:W,cacheableBlocks:J}}function u3(j){if(!c(j))return!1;let W=e1(j);if(!W)return!1;return j.content=W.content,S1(W.cacheableBlocks[0],!0)}function n3(j){if(!c(j))return!1;let W=e1(j);if(!W||W.cacheableBlocks.length<2)return!1;return j.content=W.content,S1(W.cacheableBlocks[1],!0)}function r1(j){if(!c(j))return!1;let W=e1(j);if(!W)return!1;let J=W.cacheableBlocks[W.cacheableBlocks.length-1];return j.content=W.content,S1(J,!0)}function o3(j){if(!c(j))return!1;return(e1(j)?.cacheableBlocks.length??0)>1}function r3(j){if(!c(j))return 0;let W=j.content;if(Array.isArray(W))return W.length;if(W==null)return 0;return 1}function s3(j){let W=[],J=0;return j.forEach((N,Z)=>{let G=r3(N);if(c(N)&&N.role==="user"&&G>0)W.push({index:Z,blockPosition:J+G-1});J+=G}),W}function t3(j,W,J,N){if(!N)return;let Z=[],G=W.find((V)=>V.index===N.messageIndex&&V.index>1&&V.index<J.index);if(G)Z.push(G);for(let V of[...W].reverse()){if(V.index<=1||V.index>=J.index||V.index===G?.index)continue;Z.push(V)}for(let V of Z)if(UW(j[V.index])===N.fingerprint)return V;return}function a3(j,W){let J=s3(j),N=[...J].reverse().find((E)=>E.index>1);if(!N)return{latest:void 0,bridge:void 0,standbyAnchorMatched:!1,standbyBridgeApplied:!1};let Z=t3(j,J,N,W),G=Z?N.blockPosition-Z.blockPosition+1:void 0,V=Z&&G!=null&&G>pj?Z:void 0,B=[...J].reverse().find((E)=>E.index<N.index),f=B?N.blockPosition-B.blockPosition+1:0,r=B&&B.index>1&&f>pj?B:void 0;return{latest:N,bridge:V??r,standbyAnchorMatched:Boolean(Z),standbyDistanceBlocks:G,standbyBridgeApplied:Boolean(V)}}function q4(j){return c(j)&&typeof j.text==="string"?j.text:""}function e3(j){if(!Array.isArray(j.system))return;let W=j.system,J=0;if(q4(W[J]).startsWith("x-anthropic-billing-header:"))J++;if(q4(W[J])===_1)J++;let N=J+1;if(N>=W.length-1)return;let Z=W[N];if(!c(Z))return;let G=W.slice(N).map(q4).join(`
12
+ `);W.splice(N,W.length-N,{...Z,type:"text",text:G})}function lj(j){if(Array.isArray(j.system)){let W=j.system.findIndex((Z)=>c(Z)&&Z.text===_1),J=j.system.slice(W>=0?W+1:0).filter(c),N=J[J.length-1];S1(N,!0)}else S1(j.system,!0)}function j7(j,W){if(QW(j),e3(j),!Array.isArray(j.messages))return lj(j),{standbyAnchorMatched:!1,standbyBridgeApplied:!1};let{latest:J,bridge:N,standbyAnchorMatched:Z,standbyDistanceBlocks:G,standbyBridgeApplied:V}=a3(j.messages,W);if(!N)lj(j);if(o3(j.messages[0]))u3(j.messages[0]),n3(j.messages[0]);else r1(j.messages[0]),r1(j.messages[1]);if(N)r1(j.messages[N.index]);if(J)r1(j.messages[J.index]);return{standbyAnchorMatched:Z,standbyDistanceBlocks:G,standbyBridgeApplied:V,...V&&N?{standbyBridgeMessageIndex:N.index}:{}}}function W7(j){if(!Array.isArray(j.messages))return 0;let W=0;return j.messages=j.messages.filter((J)=>{if(!c(J)||!Array.isArray(J.content))return!0;if(J.role!=="assistant")return!0;let N=J.content.filter((Z)=>{if(!c(Z)||Z.type!=="thinking")return!0;if(!XW(Z.signature))return!0;return W+=1,!1});if(N.length===J.content.length)return!0;return J.content=N,N.length>0}),W}function wW(j){if(!ZW(j.model))return null;let W=Object.hasOwn(j,"thinking");return j.thinking={...$W},{replacedExisting:W}}function J7(j){if(!DW(j.model))return null;let W=Object.hasOwn(j,"thinking"),J=j.thinking;if(c(J)&&J.type==="disabled")return j.thinking={type:"disabled"},{replacedExisting:W,display:"disabled"};return j.thinking={...YW},{replacedExisting:W,display:"summarized"}}function HW(j){if(!A0(j.model))return null;let W=Object.hasOwn(j,"thinking"),J=j.thinking;if(c(J)&&J.type==="disabled"){j.thinking={type:"disabled"};let N=j.output_config;if(c(N)&&N.effort==="xhigh")N.effort="high";else if(c(N)&&N.effort==="max")N.effort="high";return{replacedExisting:W,display:"disabled"}}return j.thinking={...GW},{replacedExisting:W,display:"summarized"}}function CW(j,W=E1){try{let J=JSON.parse(j);return J.model=W,delete J.speed,wW(J),HW(J),{ok:!0,bodyText:JSON.stringify(J)}}catch{return{ok:!1,reason:"body is not valid JSON"}}}function N7(j,W){if(!W.enabled)return cj(j,!1),delete j.cache_control,delete j.cacheControl,{};if(W.mode==="automatic")return l3(j),{};if(W.mode==="hybrid")return j7(j,W.hybridStandbyAnchor);return cj(j,!0),delete j.cacheControl,{}}function O7(j){if(!Array.isArray(j.messages))return;while(j.messages.length){let W=j.messages[j.messages.length-1];if(!c(W)||W.role!=="assistant")break;j.messages.pop()}}function $7(j){if(!Array.isArray(j.messages))return 0;for(let W=j.messages.length-1;W>=0;W--){let J=j.messages[W];if(!c(J)||J.role!=="assistant")continue;if(!Array.isArray(J.content))return 0;if(!J.content.some((Z)=>c(Z)&&Z.type==="tool_use"))return 0;let N=0;while(J.content.length){let Z=J.content[J.content.length-1];if(!c(Z)||Z.type!=="text"||typeof Z.text!=="string"||Z.text.trim())break;J.content.pop(),N++}return N}return 0}function a(){return performance.now()}function q0(j){return Math.round(j*10)/10}function dj(j){let W=0,J=0,N=0,Z=Array.isArray(j.messages)?j.messages:[];W=Z.length;for(let G of Z){if(!G||typeof G!=="object")continue;let V=G.content;if(!Array.isArray(V))continue;J+=V.length;for(let B of V)if(B&&typeof B==="object"&&B.type==="tool_use")N++}return{messageCount:W,contentBlockCount:J,toolDefinitionCount:Array.isArray(j.tools)?j.tools.length:0,toolUseCount:N,systemBlockCount:Array.isArray(j.system)?j.system.length:0}}async function k4(j,W={}){try{let J=a(),N=JSON.parse(j);W.perf?.("parse",{ms:q0(a()-J),inputBytes:j.length,...dj(N)});let Z=a(),G=Array.isArray(N.messages)?N.messages.length:void 0;O7(N);let V=$7(N),B=Array.isArray(N.messages)?N.messages.length:void 0;W.perf?.("strip_trailing_assistant",{ms:q0(a()-Z),removedMessages:typeof G==="number"&&typeof B==="number"?G-B:void 0,removedWhitespaceBlocks:V});let f=a(),r=W7(N),E=kj(N,W.serverSideFallbackEnabled===!0),v=wW(N),n=J7(N),l=HW(N);W.perf?.("model_normalize",{ms:q0(a()-f),model:typeof N.model==="string"?N.model:void 0,fableMythosThinkingDisplay:v?"summarized":void 0,replacedFableMythosThinking:v?.replacedExisting??!1,sonnet5ThinkingDisplay:n?.display,replacedSonnet5Thinking:n?.replacedExisting??!1,opus5ThinkingDisplay:l?.display,replacedOpus5Thinking:l?.replacedExisting??!1,removedNonAnthropicThinking:r,serverSideFallbackEnabled:E.enabled,serverFallbackMarkersRestored:E.restoredMarkers,serverFallbackMarkersDropped:E.droppedMarkers,hasOutputConfig:Object.hasOwn(N,"output_config")});let Y0=a(),t=Array.isArray(N.messages)&&N.messages.some((L1)=>L1.role==="user")?WW(N.messages,void 0,tj):null;W.perf?.("billing_header",{ms:q0(a()-Y0),hasBillingHeader:Boolean(t)});let w0=a();if(N.system=p3(N.system),W.perf?.("system_identity",{ms:q0(a()-w0),systemBlockCount:Array.isArray(N.system)?N.system.length:0}),t&&Array.isArray(N.system))N.system.unshift({type:"text",text:t});let F=a(),x0=N7(N,{enabled:W.cache1hEnabled??!1,mode:W.cache1hMode??"explicit",hybridStandbyAnchor:W.hybridStandbyAnchor});if(W.perf?.("cache_strategy",{ms:q0(a()-F),enabled:W.cache1hEnabled??!1,mode:W.cache1hMode??"explicit",...x0}),W.fastModeEnabled&&A1(N.model))N.speed="fast";else if(N.speed==="fast")delete N.speed;let n0=a();if(W.identity)JW(N,W.identity);W.perf?.("metadata",{ms:q0(a()-n0),hasAccountUuid:Boolean(W.identity?.accountUuid)});let F0=a(),i0=k3(N);W.perf?.("prefix_tools_stringify",{ms:q0(a()-F0),outputBytesBeforeSign:i0.length,...dj(N)});let Y1=a(),E0=await jW(i0);return W.perf?.("cch_sign",{ms:q0(a()-Y1),outputBytes:E0.length}),E0}catch{return j}}var Z7=new TextEncoder;function Y7(){return{pending:"",events:0,parseErrors:0,eventCounts:{},typeCounts:{},deltaTypeCounts:{},contentBlockTypeCounts:{},textDeltaBytes:0,thinkingDeltaBytes:0,inputJsonDeltaBytes:0,signatureDeltaBytes:0,redactedThinkingBytes:0}}function s1(j,W){if(!W)return;j[W]=(j[W]??0)+1}function J1(j){return Z7.encode(j).byteLength}function u0(j){return j&&typeof j==="object"&&!Array.isArray(j)?j:void 0}function L0(j,W){let J=j?.[W];return typeof J==="string"?J:void 0}function D7(j,W){let J=j?.[W];return typeof J==="number"?J:void 0}function LW(j){if(!j.trim())return null;let W,J=[];for(let v of j.split(/\r?\n/)){if(v.startsWith("event:")){W=v.slice(6).trim();continue}if(v.startsWith("data:")){let n=v.slice(5);J.push(n.startsWith(" ")?n.slice(1):n)}}let N=J.join(`
13
+ `),Z={event:W,rawBytes:J1(j),dataBytes:J1(N)};if(!N||N==="[DONE]")return Z.type=N==="[DONE]"?"done":void 0,Z.event??=Z.type,Z;let G;try{G=JSON.parse(N)}catch{return Z}let V=u0(G),B=u0(V?.delta),f=u0(V?.content_block),r=u0(V?.message),E=u0(V?.usage)??u0(r?.usage);if(Z.type=L0(V,"type"),Z.event??=Z.type,Z.index=D7(V,"index"),Z.contentBlockType=L0(f,"type"),Z.deltaType=L0(B,"type"),Z.stopReason=L0(B,"stop_reason")??L0(V,"stop_reason"),Z.deltaType==="text_delta")Z.textDeltaBytes=J1(L0(B,"text")??"");if(Z.deltaType==="thinking_delta")Z.thinkingDeltaBytes=J1(L0(B,"thinking")??"");if(Z.deltaType==="input_json_delta")Z.inputJsonDeltaBytes=J1(L0(B,"partial_json")??"");if(Z.deltaType==="signature_delta")Z.signatureDeltaBytes=J1(L0(B,"signature")??"");if(Z.contentBlockType==="redacted_thinking")Z.redactedThinkingBytes=J1(L0(f,"data")??"");if(E)Z.stopReason??=L0(r,"stop_reason");return Z}function g4(j){let W=j.indexOf(`
6
14
 
7
- `),j=N.indexOf(`\r
15
+ `),J=j.indexOf(`\r
8
16
  \r
9
- `);if(W===-1)return j===-1?null:{index:j,length:4};if(j===-1||W<j)return{index:W,length:2};return{index:j,length:4}}function EW(N,W){if(!W)return;N.pending+=W;while(!0){let j=BN(N.pending);if(!j)break;let J=N.pending.slice(0,j.index);N.pending=N.pending.slice(j.index+j.length);let Z=J4(J);if(!Z)continue;if(N.events++,m1(N.eventCounts,Z.event??"unknown"),m1(N.typeCounts,Z.type),m1(N.deltaTypeCounts,Z.deltaType),m1(N.contentBlockTypeCounts,Z.contentBlockType),N.textDeltaBytes+=Z.textDeltaBytes??0,N.thinkingDeltaBytes+=Z.thinkingDeltaBytes??0,N.inputJsonDeltaBytes+=Z.inputJsonDeltaBytes??0,N.signatureDeltaBytes+=Z.signatureDeltaBytes??0,N.redactedThinkingBytes+=Z.redactedThinkingBytes??0,N.last=Z,Z.dataBytes>0&&!Z.type&&!Z.event)N.parseErrors++}}function AJ(){return{pending:"",completed:!1}}function fJ(N,W){if(!W||N.completed)return null;N.pending+=W;while(!0){let j=BN(N.pending);if(!j)return null;let J=N.pending.slice(0,j.index);N.pending=N.pending.slice(j.index+j.length);let Z=J4(J);if(Z?.type!=="message_delta"||!Z.stopReason)continue;return N.completed=!0,Z.stopReason==="refusal"?{type:"content-filter"}:{type:"complete",finishReason:Z.stopReason}}}function RJ(){return{pending:""}}function kJ(N,W){let j=N?.toLowerCase(),J=W.toLowerCase();return j==="api_error"||j==="overloaded_error"||j==="server_error"||j==="internal_server_error"||J.includes("internal server error")||J.includes("server overloaded")}function gJ(N,W){let j=N?`${N}: ${W}`:W,J=Error(`Anthropic stream error: ${j}`);if(J.code="ECONNRESET",J.syscall="anthropic-sse",N)J.providerErrorType=N;return J}function yJ(N){let W=R0(N)?"Opus 5":"Fable",j=Error(`${W} response was blocked by the provider content filter; retrying with Opus 4.8`);return j.code="ECONNRESET",j.syscall="anthropic-sse",j.providerErrorType="refusal",j}function hJ(N){if(!N.includes("error"))return null;let W,j=[];for(let r of N.split(/\r?\n/)){if(r.startsWith("event:")){W=r.slice(6).trim();continue}if(r.startsWith("data:")){let l=r.slice(5);j.push(l.startsWith(" ")?l.slice(1):l)}}let J=j.join(`
10
- `);if(!J||J==="[DONE]")return null;let Z;try{Z=JSON.parse(J)}catch{return null}let V=l0(Z);if(W!=="error"&&U0(V,"type")!=="error")return null;let _=l0(V?.error),B=U0(_,"type")??U0(_,"code")??void 0,y=U0(_,"message")??U0(V,"message")??B??"Anthropic stream error";if(!kJ(B,y))return null;return gJ(B,y)}function SW(N,W){if(!W)return null;N.pending+=W;while(!0){let j=BN(N.pending);if(!j)break;let J=N.pending.slice(0,j.index);N.pending=N.pending.slice(j.index+j.length);let Z=hJ(J);if(Z)return Z}return null}function mJ(N){return{sseEvents:N.events,ssePendingChars:N.pending.length,sseParseErrors:N.parseErrors,sseEventCounts:{...N.eventCounts},sseTypeCounts:{...N.typeCounts},sseDeltaTypeCounts:{...N.deltaTypeCounts},sseContentBlockTypeCounts:{...N.contentBlockTypeCounts},sseTextDeltaBytes:N.textDeltaBytes,sseThinkingDeltaBytes:N.thinkingDeltaBytes,sseInputJsonDeltaBytes:N.inputJsonDeltaBytes,sseSignatureDeltaBytes:N.signatureDeltaBytes,sseRedactedThinkingBytes:N.redactedThinkingBytes,sseLastEvent:N.last?{...N.last}:void 0}}function O4(N,W={}){if(!N.body)return N;let j=N.body.getReader(),J=new TextDecoder,Z=new TextEncoder,V="",_=0,B=0,y=0,r=0,l=0,d=!1,D0=!1,I=o(),T0=o(),P0=W.perf?vJ():void 0,E0=RJ(),b0=W.onContentFilter||W.onComplete?AJ():void 0,c0=(O0)=>{if(!b0)return null;let S0=fJ(b0,O0);if(S0?.type==="content-filter"&&W.onContentFilter)return W.onContentFilter()===!1?null:yJ(W.contentFilterModel);if(S0?.type==="complete")W.onComplete?.(S0.finishReason);return null},v0=()=>{if(D0)return;D0=!0,j.releaseLock()},K1=async(O0)=>{try{await j.cancel(O0)}catch{}finally{v0()}},W1=(O0={})=>({chunks:_,pulls:B,inputBytes:y,outputBytes:r,pendingChars:V.length,rewriteMs:x0(l),totalMs:x0(o()-T0),...P0?mJ(P0):{},...O0}),L0=(O0,S0={})=>{W.perf?.(O0,W1(S0))};W.perf?.("stream_tool_prefix_wrapper_created",{status:N.status,hasBody:!0});let q0=new ReadableStream({async pull(O0){if(B++,!d)d=!0,L0("stream_tool_prefix_first_pull");let S0=o();try{let{done:M0,value:y0}=await j.read(),h0=x0(o()-S0);if(M0){let m0=J.decode();if(P0)EW(P0,m0);let p0=SW(E0,m0)??c0(m0);if(p0)throw L0("stream_tool_prefix_retryable_error",{error:p0.message,providerErrorType:p0.providerErrorType}),await K1(p0),p0;let I0=o(),u0=MW(`${V}${m0}`,!0);if(l+=o()-I0,u0.ready){let v1=Z.encode(u0.ready);r+=v1.byteLength,O0.enqueue(v1)}L0("stream_tool_prefix_rewrite",{readMs:h0}),v0(),O0.close();return}_++,y+=y0.byteLength;let j1=J.decode(y0,{stream:!0});if(P0)EW(P0,j1);let J1=SW(E0,j1)??c0(j1);if(J1)throw L0("stream_tool_prefix_retryable_error",{error:J1.message,providerErrorType:J1.providerErrorType,readMs:h0,lastChunkBytes:y0.byteLength}),v0(),J1;let S1=V+j1,V0=o(),z1=MW(S1);if(l+=o()-V0,V=z1.pending,z1.ready){let m0=Z.encode(z1.ready);r+=m0.byteLength,O0.enqueue(m0)}let B0=o();if(_===1||_%25===0||B0-I>5000)I=B0,L0("stream_tool_prefix_progress",{readMs:h0,lastChunkBytes:y0.byteLength})}catch(M0){throw L0("stream_tool_prefix_error",{error:M0 instanceof Error?M0.message:String(M0)}),v0(),M0}},async cancel(O0){L0("stream_tool_prefix_cancel",{reason:O0 instanceof Error?O0.message:String(O0)});try{await j.cancel(O0)}finally{v0()}}});return new Response(q0,{status:N.status,statusText:N.statusText,headers:N.headers})}var bJ="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",$4="~effect/http/HttpServerResponse",Z4="~effect/http/Cookies",G4="~effect/http/HttpBody",pJ="~effect/ErrorReporter/ignore",iJ=60000,dJ=60000,lJ=5000,X4=200,Ij=240,cJ=Ij,uJ=600000;function nJ(N,W){return(N?.accounts??[]).some((j)=>j.id===W&&j.enabled!==!1&&N0(j))}function oJ(N){let W=(N?.accounts??[]).find((j)=>j.enabled!==!1&&N0(j));if(_1(N)==="fallback-first"&&W)return{activeId:W.id,route:"fallback-first"};return{activeId:"main",route:"main"}}function Y4(N,W){if(N?.activeId==="main"||N?.activeId&&nJ(W,N.activeId))return N;return oJ(W)}function Fj(N,W,j){let J=Date.now()-N.lastUpdated;if(!N.activeId||J<0||J>uJ)return Y4(j,W);return Y4(N,W)}async function rJ(N,W,j){let J;try{J=await W()}catch(Z){return k.warn("sidebar","account storage reload failed; routing preserved",{message:Z instanceof Error?Z.message:String(Z)}),{...N.activeId?{activeId:N.activeId,route:N.route}:j??{activeId:"main",route:"main"},freshStorage:null}}return{...Fj(N,J,j),freshStorage:J}}async function sJ(N){await GN()?.beforeStorageLoad?.();let W;try{W=await q(N)}catch{return{activeId:"main",route:"main",freshStorage:null}}finally{await GN()?.afterStorageLoad?.()}await GN()?.beforeSidebarRead?.();let j=await Mj();return{...Fj(j,W),freshStorage:W}}function aJ(N){let W=Math.floor(N.retryAfterSeconds/60),j=N.retryAfterSeconds%60,J=`Retry in ${W}m ${j}s.`;return N.modelName?`${N.modelName} weekly limit reached, no routable accounts. ${J}`:`Killswitch: no routable accounts. ${J}`}function tJ(N){if(!N.requestModelId)return{isScopedDriven:!1};if(!N1(N.mainQuota,N.storage))return{isScopedDriven:!1};let W=R4(N.mainQuota,N.requestModelId);if(!W)return{isScopedDriven:!1};if(!Number.isFinite(W.remainingPercent))return{isScopedDriven:!1};let j=k4(N.storage);if(W.remainingPercent<=j.scoped)return{isScopedDriven:!0,modelName:W.modelName,modelId:N.requestModelId};return{isScopedDriven:!1}}var eJ=1,D4=!1;function XN(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function f(){return performance.now()}function s(N){return Math.round(N*10)/10}function V4(N){return Math.floor(Math.random()*Math.max(0,N))}function d1(N){if(typeof N==="string")return N;if(N instanceof URL)return N.toString();return N.url}function l1(N,W){return W?.method??(N instanceof Request?N.method:void 0)}function _4(N){return N instanceof Error?N.message:String(N)}function N3(){if(D4||!1||!XN())return;D4=!0;let N=100,W=250,j=f()+N;setInterval(()=>{let J=f(),Z=J-j;if(j=J+N,Z<W)return;a("[perf] opencode event_loop_lag",{lagMs:s(Z),thresholdMs:W})},N).unref?.()}function W3(N){let W=f(),j={requestId:String(eJ++),start:W,last:W,mark(J,Z){let V=f();if(XN())a("[perf] opencode request stage",{requestId:j.requestId,stage:J,deltaMs:s(V-j.last),totalMs:s(V-j.start),...Z});j.last=V},done(J,Z){let V=f();if(XN())a("[perf] opencode request done",{requestId:j.requestId,stage:J,deltaMs:s(V-j.last),totalMs:s(V-j.start),...Z});j.last=V}};if(XN())a("[perf] opencode request start",{requestId:j.requestId,...N});return j}function j3(N,W){let j=/^msg_([0-9a-fA-F]{12})/.exec(N);if(!j)return;let J=BigInt(`0x${j[1]}`);if(J<=0n)return;let V=`msg_${(J-1n).toString(16).padStart(12,"0")}${"z".repeat(14)}`;if(W&&V<=W)return;return V}async function K4(N,W,j,J={}){let Z=N.client.session,V=await KW(N.client,W),_={path:{id:W},body:{noReply:J.noReply??!0,parts:[{type:"text",text:j,ignored:!0}]}};if(J.beforeActiveAssistant){let B=V?.latestAssistantMessageId?j3(V.latestAssistantMessageId,V.latestUserMessageId):void 0;if(!B)throw Error("OpenCode active assistant ordering is unavailable for an immediate notification.");_.body.messageID=B}if(V?.agent)_.body.agent=V.agent;if(V?.model)_.body.model=V.model;if(V?.variant)_.body.variant=V.variant;if(typeof Z?.promptAsync==="function"){await Z.promptAsync(_);return}if(typeof Z?.prompt==="function"){await Promise.resolve(Z.prompt(_));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function J3(){let N=Error(bJ);throw N[$4]=$4,N[pJ]=!0,N.status=204,N.statusText=void 0,N.headers={},N.cookies={[Z4]:Z4,cookies:{}},N.body={[G4]:G4,_tag:"Empty"},N}function O3(N){if(N.sessionID==null)return!1;let W=N.model;return W?.providerID==="anthropic"||W?.api?.npm==="@ai-sdk/anthropic"||W?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function $3(N){if(N.some((W)=>W.includes("<use_parallel_tool_calls>")))return!1;return N.push(z4),!0}var Z3={input:0,output:0,cache:{read:0,write:0}},G3="Fable content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Fable cache warm.",X3="Fable recovery window complete. Returning to Fable 5.";function Y3(N){if(R0(N))return"Opus 5 content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Opus 5 cache warm.";return G3}function D3(N){if(R0(N))return"Opus 5 recovery window complete. Returning to Opus 5.";return X3}function V3(N){let W=N["claude-opus-4-8"]??N["claude-opus-4-5"]??Object.values(N)[0];if(!W)return N;return{...N,...Object.fromEntries(Object.values(Dj).map((j)=>[j.id,{...W,id:j.id,name:j.name,api:W.api?{...W.api,id:j.id}:void 0,cost:{input:E1.input,output:E1.output,cache:{read:E1.cacheRead,write:E1.cacheWrite5m}},limit:{...W.limit??{},context:Gj,output:Xj},capabilities:{...W.capabilities??{},reasoning:!0,attachment:!0,toolcall:!0},release_date:Yj}]))}}var _3=["low","medium","high","xhigh","max"];function K3(){return Object.fromEntries(_3.map((N)=>[N,{thinking:{type:"adaptive",display:"summarized"},effort:N}]))}function z3(N){return Object.fromEntries(Object.entries(N).map(([W,j])=>{let J=j.api?.id??j.id??W;return[W,R0(J)?{...j,variants:K3()}:j]}))}function w3(N){return Object.fromEntries(Object.entries(N).map(([W,j])=>[W,{...j,cost:Z3}]))}var p3=async(N)=>{N3();let{client:W}=N,j=globalThis.fetch,J=Q4(),Z=600000,V=50,_=new Map;function B(){let O=Date.now();for(let[$,X]of _)if(O-X.createdAt>Z)_.delete($)}function y(O,$){if(B(),_.size>=V){let X="",K=1/0;for(let[G,P]of _)if(P.createdAt<K)K=P.createdAt,X=G;if(X)_.delete(X)}_.set(O,$)}function r(O){B();let $=_.get(O);if(!$)return;if(Date.now()-$.createdAt>Z){_.delete(O);return}return $}let l;try{l=await q(J)}catch(O){let $=O instanceof Error?O.message:String(O);throw Error(`Failed to load account store: ${$}`,{cause:O instanceof Error?O:void 0})}let d=new KN,D0=new Cj({path:process.env.OPENCODE_ANTHROPIC_AUTH_ROUTING_STATE_FILE||Pj(J)}),I=new e4({storage:l,onMainQuotaFetched:async(O,$,X,K)=>{try{let G=await q(J)??H0(),P=f4(G);if(P&&P.checkedAt>=K&&p4(P.quota,G,P.checkedAt)>Date.now()){I.seedMainFromStorage(G);return}G.quota=G.quota??{},G.quota.mainQuota=O,G.quota.mainQuotaCheckedAt=$,G.quota.mainQuotaToken=X,G.quota.mainLastQuotaApiError=void 0,await a0(G,J,{mainQuota:!0})}catch(G){k.warn("quota","failed to persist main quota",{error:G instanceof Error?G.message:String(G)})}},onApiError:async(O)=>{try{let $=await q(J)??H0();$.quota=$.quota??{},$.quota.mainLastQuotaApiError=O,await a0($,J,{mainQuota:!0})}catch($){k.warn("quota","failed to persist backoff state",{error:$ instanceof Error?$.message:String($)})}}}),T0=new Map;async function P0(O,$,X){if(X?.aborted)return;let K=`${O}:${n1($)}`,G=T0.get(K);if(!G){let P=Nj({accessToken:$,fetchImpl:j,signal:X}).catch((F)=>{k.debug("quota","failed to hydrate account profile",{account:O,error:F instanceof Error?F.message:String(F)});return}).finally(()=>{if(T0.get(K)===P)T0.delete(K)});G=P,T0.set(K,G)}if(!X)return G;return new Promise((P)=>{let F=!1,z=(h)=>{if(F)return;F=!0,X.removeEventListener("abort",L),P(h)},L=()=>z(void 0);if(X.addEventListener("abort",L,{once:!0}),X.aborted)L();G.then(z)})}async function E0(O){try{if(O.accountId==="main"){let $=await $0?.();if($?.type!=="oauth"||$.access!==O.accessToken)return!1}return await C4({accountId:O.accountId,profile:O.profile,expectedTokenFingerprint:n1(O.accessToken)},J)}catch($){k.debug("quota","failed to persist account profile",{account:O.accountId,error:$ instanceof Error?$.message:String($)});return}}async function b0(O,$,X){if(process.env.OPENCODE_ANTHROPIC_AUTH_DISABLE_PROFILE_HYDRATION==="1")return O;let K=Date.now();if($&&O.main?.profile&&!WN(O.main.profile,$))O.main.profile=void 0,E0({accountId:"main",accessToken:$,profile:void 0}).catch(()=>{});if($&&!gN(O.main?.profile,K)){let G=await P0("main",$,X);if(G)O.main={type:"opencode",provider:"anthropic",profile:G},E0({accountId:"main",accessToken:$,profile:G}).catch(()=>{})}for(let G of O.accounts){if(X?.aborted)break;if(!N0(G)||!G.access)continue;let P=G.access;if(G.profile&&!WN(G.profile,P))G.profile=void 0,E0({accountId:G.id,accessToken:P,profile:void 0}).catch(()=>{});if(gN(G.profile,K))continue;let F=await P0(G.id,P,X);if(F)G.profile=F,E0({accountId:G.id,accessToken:P,profile:F}).catch(()=>{})}return O}let c0=new Set;async function v0(O,$){let X=await q(J)??H0();if(O.accountId==="main"){let G;try{let P=await $0?.();if(P?.type==="oauth")G=P.access}catch{}if(G!==O.accessToken){k.trace("quota","skipped stale main response quota persistence");return}X.quota=X.quota??{},X.quota.mainQuota=$.quota,X.quota.mainQuotaCheckedAt=$.checkedAt,X.quota.mainQuotaToken=n1(O.accessToken),await a0(X,J,{mainQuota:!0});return}let K=X.accounts.find((G)=>G.id===O.accountId&&N0(G)&&G.access===O.accessToken);if(!K)return;K.quota=$.quota,await a0(X,J,{accounts:[O.accountId]})}function K1(O){k.warn("quota","failed to persist harvested response quota",{error:O instanceof Error?O.message:String(O)})}function W1(O){let $=O instanceof Error?O.name:typeof O,X=O instanceof Error?O.message:String(O),K=`${$}:${X}`;if(c0.has(K))return;c0.add(K),k.warn("quota","failed to normalize response quota headers",{error:X})}function L0(O,$){try{if(!a4(O)){k.trace("quota","skipped non-quota response headers",{account:$.accountId});return}let X=t4(O),K=$.accountId==="main"?I.pushMainFromHeaders($.accessToken,X):I.pushFallbackFromHeaders($.accountId,$.accessToken,X);v0($,K).catch(K1),u0().catch(()=>{}),k.debug("quota","harvested response quota",{account:$.accountId,fiveHourPercent:K.quota.five_hour?.usedPercent,sevenDayPercent:K.quota.seven_day?.usedPercent,source:"headers"})}catch(X){W1(X)}}let q0=new i4({quotaManager:I,onFallbackStorageChanged:()=>{u0().catch(()=>{})}});q0.startBackgroundRefresh();let O0=null,S0=new s4({directory:process.env.OPENCODE_ANTHROPIC_AUTH_CACHEKEEP_REGISTRY_DIR||r4("opencode")}),M0=[],y0=new o4({loadStorage:()=>q(J),onTrackedSessionsChanged:async(O)=>{await S0.publish(O),M0=await S0.list(O)},prepareHeaders:async(O,$)=>{let X,K=$.oauthAccountId;if(K&&K!=="main"){let G=await q(J),P=G?.accounts.find((z)=>z.id===K&&z.enabled!==!1&&N0(z));if(!P||!G)throw Error(`OAuth account ${K} is unavailable for cache prewarm`);let F=P;try{F=await q0.refreshAccount(P,G)}catch(z){k.warn("cachekeep","fallback token refresh failed",{accountId:K,error:z instanceof Error?z.message:String(z)})}if(X=F.access,!X)throw Error(`OAuth account ${K} has no access token for cache prewarm`)}else{if(!$0)return O;let G=await $0();if(G.type!=="oauth")return O;if(!G.access||G.expires&&G.expires<Date.now()){if(!O0)return O;G.access=await O0()}X=G.access}if(!X)return O;try{let G=JSON.parse($.bodyText),P=await qN(X,typeof G.model==="string"?G.model:void 0);if(O.delete("anthropic-beta"),M1(O,X,{body:G,identity:P}),O.set("anthropic-beta",H1(O.get("anthropic-beta"),[l4])),G.speed==="fast")p1(O)}catch{M1(O,X)}return O}}),h0=new Map;function j1(O){let $=O.plan.sessionId,X=R0(O.plan.requestedModel)?"Opus 5":"Fable",K=async()=>{let z=O.warmTarget;if(!z){k.debug("fable-fallback","cache warm skipped",{session:$,reason:"Opus response was not served by an OAuth route"});return}let L=j4(z.bodyText,O.plan.requestedModel);if(!L.ok){k.warn("fable-fallback","cache warm skipped",{session:$,reason:L.reason});return}try{let h=await y0.prewarmNow({sessionId:$,url:z.url,headers:z.headers,bodyText:L.bodyText,oauthAccountId:d.recoveryAccount(O.plan)??z.oauthAccountId});if(h.ok){k.debug("fable-fallback",`${X} cache warmed`,{session:$,remaining:d.remaining(O.plan),...h.usage&&{usage:h.usage}});return}k.warn("fable-fallback",`${X} cache warm skipped`,{session:$,status:h.status,reason:h.reason})}catch(h){k.warn("fable-fallback",`${X} cache warm failed`,{session:$,error:h instanceof Error?h.message:String(h)})}},{recoveryKey:G}=O.plan,F=(h0.get(G)??Promise.resolve()).then(K,K);return h0.set(G,F),F.finally(()=>{if(h0.get(G)===F)h0.delete(G)}),F}async function J1(){return M0=await S0.list(y0.trackedSessions()),M0}if(x1({enabled:B1(l),mode:I1(l)}),JN(r1(l)),$N(s1(l)),!process.env.OPENCODE_ANTHROPIC_AUTH_LOG_LEVEL)U4(e1(l)??"info");let S1=null;if(N.directory){let O=globalThis;if(O.__anthropicAuthRpcServer)await O.__anthropicAuthRpcServer.stop().catch(()=>{}),O.__anthropicAuthRpcServer=void 0;try{S1=await QW({dir:Hj(N.directory),drain:UW,apply:yj}),O.__anthropicAuthRpcServer=S1}catch($){k.warn("rpc","failed to start",{error:$ instanceof Error?$.message:String($)})}}let V0={activeId:"main",route:"main"},z1=Lj(),B0=new Map;function m0(O,$,X){if(!O||!$)return O;let K={...O,accounts:O.accounts.map((F)=>{let z=$.accounts.find((L)=>L.id===F.id);if(!N0(F)||!z||!N0(z)||!F.access||z.access!==F.access)return F;return{...F,profile:z.profile}})},G=O.main?.profile,P=O.main??$.main;if(X&&P&&(!G||WN(G,X)))K.main={...P,profile:$.main?.profile};return K}function p0(O,$){I.updateStorage(O),I.seedMainFromStorage(O,$.mainAccessToken),I.seedFallbacksFromAccounts((O?.accounts??[]).filter(N0));let X=I.getMain($.mainAccessToken),K=I.getLastApiError(),G=O?.refresh?.mainLastRefreshError;return{main:{quota:X?.quota??null,tierLabel:jN(O?.main?.profile),quotaBackedOff:I.isBackedOff(),quotaBackoffUntil:K?.nextRetryAt,refreshBackedOff:G?t0(G,$.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:G?.nextRetryAt},fallbacks:(O?.accounts??[]).filter((P)=>P.enabled!==!1&&N0(P)).map((P)=>({id:P.id,label:P.label,tierLabel:jN(P.profile),quota:P.access?I.getFallback(P.id,P.access)?.quota??null:null,needsReauth:P.lastRefreshError!=null&&t0(P.lastRefreshError,P.refresh,Date.now())&&X1(P.lastRefreshError),enabled:P.enabled!==!1})),activeId:$.activeId,route:$.route,relay:(()=>{let P=uN(O);return P?{enabled:!0,transport:P.transport??"http"}:null})(),fastMode:ON(),cacheKeep:{enabled:kN(O),window:RN(O)?"always":O?.cacheKeep?.startHour!=null&&O?.cacheKeep?.endHour!=null?`${O.cacheKeep.startHour}-${O.cacheKeep.endHour}`:void 0,trackedSessions:M0.length},fableRecoveries:B0.size>0?[...B0.values()]:void 0,lastUpdated:Date.now()}}function I0(O,$){let X=$.routingAuthoritative!==!1;if(X)V0={activeId:$.activeId,route:$.route};let K=p0(O,$);return Bj(K,z1,{routingAuthoritative:X,resolvePreservedRouting:X?void 0:async(G)=>{let P=await rJ(G,()=>q(J),{activeId:K.activeId,route:K.route}),F=$.useHydratedProfiles?m0(P.freshStorage,O,$.mainAccessToken):P.freshStorage;return{activeId:P.activeId,route:P.route,state:p0(F,{...$,activeId:P.activeId,route:P.route})}},onRoutingResolved:X?void 0:(G)=>{V0=G}}).catch((G)=>k.warn("sidebar","state write failed",{error:G instanceof Error?G.message:String(G)}))}async function u0(){let O=await q(J),$,X;if($0)try{let K=await $0();$=K.access,X=K.refresh}catch{}I0(O,{activeId:V0.activeId,route:V0.route,mainAccessToken:$,mainRefreshToken:X,routingAuthoritative:!1})}function v1(O,$){if(!$)return;if(O?.quota?.enabled!==!0)return;if(I.getMain($))return;if(YN)return;YN=!0,I.refreshMain($).then(()=>u0()).catch(()=>{}).finally(()=>{YN=!1})}let $0=null,YN=!1,O1=null,q1=0;function xj(O){let $=O?.refresh?.refreshBeforeExpiryMinutes??cJ;return Math.max(Ij,$)*60000}function Tj(O){return O?.refresh?.enabled!==!1}async function rN(O){if(!O)return;let $=await q(J),X=$?.refresh?.mainLastRefreshError;if(!$?.refresh||!X?.tokenHash)return;let K=t1(O);if(X.tokenHash===K)return;if(X.nextRetryAt&&X.nextRetryAt>Date.now()){a("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:X.nextRetryAt,retryCount:X.retryCount,remainingMs:X.nextRetryAt-Date.now()});return}$.refresh.mainLastRefreshError=void 0,await a0($,J,{mainRefresh:!0}),a("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:X.checkedAt,previousNextRetryAt:X.nextRetryAt,previousRetryCount:X.retryCount})}async function Ej(){let O=[],$;if($0)try{let z=await $0();if(z.type==="oauth"&&z.access){$=z.access;let L=await I.refreshMain(z.access);O.push({name:"OpenCode anthropic",role:"main",quota:L})}else if(z.type==="oauth")O.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(z){let L=z instanceof Error?z.message:String(z);O.push({name:"OpenCode anthropic",role:"main",error:L.includes("429")?"Usage API rate limited — try again in a moment":L})}let{storage:X,errors:K}=await q0.refreshQuotaForAllAccounts({force:!0}),G=await b0(X??H0(),$,AbortSignal.timeout(3000)),P=O.find((z)=>z.role==="main");if(P)P.tierLabel=jN(G.main?.profile);let F=new Map(K.map((z)=>[z.accountId,z.message]));if(O.push(...Vj(G,F)),!$0)O.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return _j({accounts:O,refreshedAt:Date.now()})}async function sN(O){if($0)try{let $=await $0();I0(O,{activeId:V0.activeId,route:V0.route,mainAccessToken:$.access,mainRefreshToken:$.refresh,routingAuthoritative:!1})}catch{}}function DN(O,$,X,K){if(B0.delete(O.sessionId),B0.set(O.sessionId,{...O,changedAt:Date.now()}),B0.size>128){let G=B0.keys().next().value;if(G)B0.delete(G)}if(I0($,{activeId:V0.activeId,route:V0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh,routingAuthoritative:!1}),!K||wN(O.sessionId))return;K4(N,O.sessionId,K,{noReply:!0,beforeActiveAssistant:!0}).catch((G)=>{k.warn("fable-fallback","Desktop notification failed",{session:O.sessionId,error:G instanceof Error?G.message:String(G)})})}function Sj(O,$,X){if(!O||!B0.delete(O))return;I0($,{activeId:V0.activeId,route:V0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh,routingAuthoritative:!1})}async function vj(O){let $=d4(O);if($.type==="enable"||$.type==="disable"){let P=$.type==="enable",F=await L4(P),z=I1(F);return x1({enabled:P,mode:z}),k.info("commands","cache enabled changed",{enabled:P}),NN({argumentsText:O,enabled:P,mode:z})}if($.type==="mode"){let P=await M4($.mode),F=B1(P);return x1({enabled:F,mode:$.mode}),k.info("commands","cache mode changed",{mode:$.mode}),NN({argumentsText:O,enabled:F,mode:$.mode})}let X=await q(J),K=B1(X),G=I1(X);return x1({enabled:K,mode:G}),NN({argumentsText:O,enabled:K,mode:G})}async function qj(O){let $=c4(O),X=await q(J);if($.type==="window")X=await F4($.startHour,$.endHour),k.info("commands","cachekeep schedule changed",{schedule:`${$.startHour}-${$.endHour}`});else if($.type==="always")X=await x4(),k.info("commands","cachekeep schedule changed",{schedule:"always"});else if($.type==="disable")X=await T4(!1),k.info("commands","cachekeep enabled changed",{enabled:!1});else if($.type==="subagents")X=await S4($.enabled),k.info("commands","cachekeep subagents changed",{subagents:$.enabled});let K=fN(X),G=await J1(),P=G.length?Math.min(...G.map((F)=>F.nextPrewarmAt)):void 0;return n4({argumentsText:O,enabled:u4(X),always:RN(X),window:K,hybridActive:kN(X),trackedSessions:G.length,trackedSessionDetails:G,nextPrewarmAt:P})}async function Aj(O){let $=Jj(O);if($.type==="enable"||$.type==="disable"){let G=$.type==="enable";return await B4(G),JN(G),k.info("commands","dump changed",{enabled:G}),mN({argumentsText:O,enabled:G})}let X=await q(J),K=r1(X);return JN(K),mN({argumentsText:O,enabled:K})}async function fj(O){let $=Oj(O);if($.type==="enable"||$.type==="disable"){let G=$.type==="enable";return await I4(G),$N(G),k.info("commands","fast mode changed",{enabled:G}),pN({argumentsText:O,enabled:G})}let X=await q(J),K=s1(X);return $N(K),pN({argumentsText:O,enabled:K})}async function Rj(O,$){let X=wj(O);if(X.type==="mode")return await zj(X.mode,J),k.info("commands","routing mode changed",{mode:X.mode}),oN({argumentsText:O,mode:X.mode});if(X.type==="reset"&&$)await D0.clear($),k.info("commands","sticky routing assignment reset");let K=await q(J);return oN({argumentsText:O,mode:_1(K)})}async function kj(O){let $=Zj(O);if($.type==="level")return await A4($.level),k.info("commands","log level changed",{level:$.level}),lN({argumentsText:O,level:$.level});let X=await q(J),K=e1(X)??"info";return lN({argumentsText:O,level:K})}async function gj(O,$){let X=Wj(O);if(X.type==="add-apikey"){if(!X.apiKey)return{text:"API key is required",accounts:k0(await q(J)??H0())};let z=X.label?.trim()||void 0,L=Date.now(),h=X.baseURL?.trim()||"https://api.kie.ai/claude";if(!o1(h))return{text:"Invalid base URL. Must be an http(s) URL without embedded credentials.",accounts:k0(await q(J)??H0())};let W0=X.authHeader??"authorization-bearer",Z0={id:z||IN(),label:z||void 0,type:"api",apiKey:X.apiKey,baseURL:h,authHeader:W0,enabled:!0,addedAt:L,lastUsed:L};await SN(Z0,J),k.info("commands","account added",{id:Z0.id,label:Z0.label,type:"apikey"});let Q0=await q(J);await sN(Q0);let n0=k0(Q0??{version:1,accounts:[]});return{text:`API key account "${Z0.label??Z0.id}" added.`,accounts:n0}}if(X.type==="add-oauth-start"){let z=await c1("max"),L={state:z.state,verifier:z.verifier,redirectUri:z.redirectUri,createdAt:Date.now()};return y($??"default",L),{text:`Open this URL in your browser:
11
- ${z.url}`,knobs:{oauthUrl:z.url},accounts:k0(await q(J)??H0())}}if(X.type==="add-oauth-finish"){let z=$??"default",L=r(z);if(!L)return{text:"OAuth session expired. Please start again.",accounts:k0(await q(J)??H0())};try{let h=await u1(X.code,L.verifier,L.redirectUri,L.state);if(h.type==="failed")return{text:"OAuth authentication failed. Please check the code and try again.",accounts:k0(await q(J)??H0())};let W0=Date.now(),Z0={id:IN(),type:"oauth",label:X.label||void 0,access:h.access,refresh:h.refresh,expires:h.expires,enabled:!0,addedAt:W0,lastUsed:W0,lastRefreshedAt:W0};await SN(Z0,J),k.info("commands","account added",{id:Z0.id,label:Z0.label,type:"oauth"});let Q0=await q(J);return await sN(Q0),{text:"OAuth account added.",accounts:k0(Q0??H0())}}catch{return{text:"OAuth exchange failed due to a network error. Please try again.",accounts:k0(await q(J)??H0())}}finally{_.delete(z)}}let K=await q(J);if(X.type==="status"&&K){let z;if($0)try{let L=await $0();if(L.type==="oauth")z=L.access}catch{}K=await b0(K,z,AbortSignal.timeout(3000))}let G=jj({argumentsText:O,storage:K??{version:1,accounts:[]}});if(G.updated){if(G.updated.action==="enable"||G.updated.action==="disable"){let L=G.updated.action==="enable";await b4(G.updated.id,L,J);let h=G.updated.id,W0=K?.accounts.find((Z0)=>Z0.id===h);k.info("commands",`account ${G.updated.action}d`,{id:h,label:W0?.label,enabled:L})}else if(G.updated.action==="remove"){await h4(G.updated.id,J);let L=G.updated.id,h=K?.accounts.find((W0)=>W0.id===L);k.info("commands","account removed",{id:L,label:h?.label})}else if(G.updated.action==="reorder"){await m4(G.updated.newOrder??G.updated.previousOrder??[],J);let L=G.updated.id,h=K?.accounts.find((W0)=>W0.id===L);k.info("commands","account reordered",{id:L,label:h?.label})}let z=await q(J);if($0)try{let L=await $0();I0(z,{activeId:V0.activeId,route:V0.route,mainAccessToken:L.access,mainRefreshToken:L.refresh,routingAuthoritative:!1})}catch{}}let P=await q(J),F=k0(P??{version:1,accounts:[]});return{text:G.text,accounts:F}}async function aN(O,$,X){if(O==="claude-quota")return{command:O,text:await Ej(),knobs:{}};if(O==="claude-logging"){let z=await kj($),L=await q(J);return{command:O,text:z,knobs:{level:e1(L)??"info"}}}if(O==="claude-account"){let z=await gj($,X),L={accounts:z.accounts};if("knobs"in z&&z.knobs)Object.assign(L,z.knobs);return{command:O,text:z.text,knobs:L}}if(O==="claude-routing"){let z=await Rj($,X),L=await q(J);return{command:O,text:z,knobs:{mode:_1(L)}}}if(O==="claude-fast"){let z=await fj($),L=await q(J);return{command:O,text:z,knobs:{enabled:s1(L)}}}if(O==="claude-dump"){let z=await Aj($),L=await q(J);return{command:O,text:z,knobs:{enabled:r1(L)}}}if(O==="claude-cache"){let z=await vj($),L=await q(J);return{command:O,text:z,knobs:{enabled:B1(L),mode:I1(L)}}}if(O==="claude-cachekeep"){let z=await qj($),L=await q(J);return{command:O,text:z,knobs:{window:fN(L)}}}let K=await q(),G=EN(K),P=(K?.accounts??[]).filter((z)=>z.enabled!==!1).map((z)=>z.id),F=$j({argumentsText:$,config:G,accountIds:P});if(F.updatedConfig){if(await y4(F.updatedConfig),G.enabled!==F.updatedConfig.enabled)k.info("commands","killswitch changed",{enabled:F.updatedConfig.enabled===!0});if(JSON.stringify(G.main)!==JSON.stringify(F.updatedConfig.main)||JSON.stringify(G.accounts)!==JSON.stringify(F.updatedConfig.accounts))k.info("commands","killswitch thresholds changed",{thresholds:F.updatedConfig.main??F.updatedConfig.accounts})}return{command:O,text:F.text,knobs:{config:EN(await q()),accountIds:P}}}async function yj(O){let $=await aN(O.command,O.arguments,O.sessionId);return{text:$.text,knobs:$.knobs}}function hj(O,$=10){let X=Math.max(0,Math.min(Math.round(O/100*$),$));return"█".repeat(X)+"░".repeat($-X)}function A1(O,$){return`${O} ${hj($)} ${String(Math.round($)).padStart(3)}%`}function tN(O){if(!O)return"";let $=new Date(O).getTime();if(Number.isNaN($))return"";let X=$-Date.now();if(X<=0)return"resets now";let K=Math.floor(X/60000);if(K<1)return"resets <1m";if(K<60)return`resets ${K}m`;let G=Math.floor(K/60),P=K%60;return P>0?`resets ${G}h${P}m`:`resets ${G}h`}function mj(O,$,X){let K=[],G=0;if(O){let{five_hour:z,seven_day:L}=O;if(z||L){let W0=X==="main"?"active":"idle",Z0=tN(z?.resetsAt),Q0=[`main · ${W0}${Z0?` (${Z0})`:""}`];if(z)Q0.push(A1("5h",z.usedPercent)),G=Math.max(G,z.usedPercent);if(L)Q0.push(A1("7d",L.usedPercent)),G=Math.max(G,L.usedPercent);K.push(Q0.join(`
12
- `))}}if($?.length)for(let z of $){let L=z.quota;if(!L)continue;let{five_hour:h,seven_day:W0}=L;if(!h&&!W0)continue;let Z0=z.label||"alt",n0=X===z.id?"active":"idle",o0=tN(h?.resetsAt),r0=[`${Z0} · ${n0}${o0?` (${o0})`:""}`];if(h)r0.push(A1("5h",h.usedPercent)),G=Math.max(G,h.usedPercent);if(W0)r0.push(A1("7d",W0.usedPercent)),G=Math.max(G,W0.usedPercent);K.push(r0.join(`
13
- `))}if(!K.length)return;let P=K.join(`
17
+ `);if(W===-1)return J===-1?null:{index:J,length:4};if(J===-1||W<J)return{index:W,length:2};return{index:J,length:4}}function uj(j,W){if(!W)return;j.pending+=W;while(!0){let J=g4(j.pending);if(!J)break;let N=j.pending.slice(0,J.index);j.pending=j.pending.slice(J.index+J.length);let Z=LW(N);if(!Z)continue;if(j.events++,s1(j.eventCounts,Z.event??"unknown"),s1(j.typeCounts,Z.type),s1(j.deltaTypeCounts,Z.deltaType),s1(j.contentBlockTypeCounts,Z.contentBlockType),j.textDeltaBytes+=Z.textDeltaBytes??0,j.thinkingDeltaBytes+=Z.thinkingDeltaBytes??0,j.inputJsonDeltaBytes+=Z.inputJsonDeltaBytes??0,j.signatureDeltaBytes+=Z.signatureDeltaBytes??0,j.redactedThinkingBytes+=Z.redactedThinkingBytes??0,j.last=Z,Z.dataBytes>0&&!Z.type&&!Z.event)j.parseErrors++}}function G7(){return{pending:"",completed:!1}}function X7(j,W){if(!W||j.completed)return null;j.pending+=W;while(!0){let J=g4(j.pending);if(!J)return null;let N=j.pending.slice(0,J.index);j.pending=j.pending.slice(J.index+J.length);let Z=LW(N);if(Z?.type!=="message_delta"||!Z.stopReason)continue;return j.completed=!0,Z.stopReason==="refusal"?{type:"content-filter"}:{type:"complete",finishReason:Z.stopReason}}}function V7(){return{pending:""}}function z7(j,W){let J=j?.toLowerCase(),N=W.toLowerCase();return J==="api_error"||J==="overloaded_error"||J==="server_error"||J==="internal_server_error"||N.includes("internal server error")||N.includes("server overloaded")}function K7(j,W){let J=j?`${j}: ${W}`:W,N=Error(`Anthropic stream error: ${J}`);if(N.code="ECONNRESET",N.syscall="anthropic-sse",j)N.providerErrorType=j;return N}function _7(j){let W=A0(j)?"Opus 5":"Fable",J=Error(`${W} response was blocked by the provider content filter; retrying with Opus 4.8`);return J.code="ECONNRESET",J.syscall="anthropic-sse",J.providerErrorType="refusal",J}function U7(j){if(!j.includes("error"))return null;let W,J=[];for(let r of j.split(/\r?\n/)){if(r.startsWith("event:")){W=r.slice(6).trim();continue}if(r.startsWith("data:")){let E=r.slice(5);J.push(E.startsWith(" ")?E.slice(1):E)}}let N=J.join(`
18
+ `);if(!N||N==="[DONE]")return null;let Z;try{Z=JSON.parse(N)}catch{return null}let G=u0(Z);if(W!=="error"&&L0(G,"type")!=="error")return null;let V=u0(G?.error),B=L0(V,"type")??L0(V,"code")??void 0,f=L0(V,"message")??L0(G,"message")??B??"Anthropic stream error";if(!z7(B,f))return null;return K7(B,f)}function nj(j,W){if(!W)return null;j.pending+=W;while(!0){let J=g4(j.pending);if(!J)break;let N=j.pending.slice(0,J.index);j.pending=j.pending.slice(J.index+J.length);let Z=U7(N);if(Z)return Z}return null}function P7(j){return{sseEvents:j.events,ssePendingChars:j.pending.length,sseParseErrors:j.parseErrors,sseEventCounts:{...j.eventCounts},sseTypeCounts:{...j.typeCounts},sseDeltaTypeCounts:{...j.deltaTypeCounts},sseContentBlockTypeCounts:{...j.contentBlockTypeCounts},sseTextDeltaBytes:j.textDeltaBytes,sseThinkingDeltaBytes:j.thinkingDeltaBytes,sseInputJsonDeltaBytes:j.inputJsonDeltaBytes,sseSignatureDeltaBytes:j.signatureDeltaBytes,sseRedactedThinkingBytes:j.redactedThinkingBytes,sseLastEvent:j.last?{...j.last}:void 0}}function BW(j,W={}){if(!j.body)return j;let J=j.body.getReader(),N=new TextDecoder,Z=new TextEncoder,G="",V=0,B=0,f=0,r=0,E=0,v=!1,n=!1,l=a(),Y0=a(),t=W.perf?Y7():void 0,w0=V7(),F=W.onContentFilter||W.onComplete?G7():void 0,x0=W.serverSideFallbackModel?gj({requestedModel:W.serverSideFallbackModel,onOutcome:W.onServerSideFallbackOutcome}):void 0,n0=(G0)=>{if(!F)return null;let v0=X7(F,G0);if(v0?.type==="content-filter"&&W.onContentFilter)return W.onContentFilter()===!1?null:_7(W.contentFilterModel);if(v0?.type==="complete")W.onComplete?.(v0.finishReason);return null},F0=()=>{if(n)return;n=!0,J.releaseLock()},i0=async(G0)=>{try{await J.cancel(G0)}catch{}finally{F0()}},Y1=(G0={})=>({chunks:V,pulls:B,inputBytes:f,outputBytes:r,pendingChars:G.length,rewriteMs:q0(E),totalMs:q0(a()-Y0),...t?P7(t):{},...G0}),E0=(G0,v0={})=>{W.perf?.(G0,Y1(v0))};W.perf?.("stream_tool_prefix_wrapper_created",{status:j.status,hasBody:!0});let L1=new ReadableStream({async pull(G0){if(B++,!v)v=!0,E0("stream_tool_prefix_first_pull");while(!0){let v0=a();try{let{done:H0,value:c0}=await J.read(),o0=q0(a()-v0);if(H0){let k0=N.decode();if(t)uj(t,k0);let P0=nj(w0,k0)??n0(k0);if(P0)throw E0("stream_tool_prefix_retryable_error",{error:P0.message,providerErrorType:P0.providerErrorType}),await i0(P0),P0;let B4=a(),m1=x0?x0.push(k0)+x0.flush():k0,M0=bj(`${G}${m1}`,!0);if(E+=a()-B4,M0.ready){let t0=Z.encode(M0.ready);r+=t0.byteLength,G0.enqueue(t0)}E0("stream_tool_prefix_rewrite",{readMs:o0}),F0(),G0.close();return}V++,f+=c0.byteLength;let R0=N.decode(c0,{stream:!0});if(t)uj(t,R0);let p0=nj(w0,R0)??n0(R0);if(p0)throw E0("stream_tool_prefix_retryable_error",{error:p0.message,providerErrorType:p0.providerErrorType,readMs:o0,lastChunkBytes:c0.byteLength}),F0(),p0;let r0=x0?x0.push(R0):R0,C4=G+r0,L4=a(),s0=bj(C4);if(E+=a()-L4,G=s0.pending,s0.ready){let k0=Z.encode(s0.ready);r+=k0.byteLength,G0.enqueue(k0)}let U0=a();if(V===1||V%25===0||U0-l>5000)l=U0,E0("stream_tool_prefix_progress",{readMs:o0,lastChunkBytes:c0.byteLength});if(s0.ready)return}catch(H0){throw E0("stream_tool_prefix_error",{error:H0 instanceof Error?H0.message:String(H0)}),F0(),H0}}},async cancel(G0){E0("stream_tool_prefix_cancel",{reason:G0 instanceof Error?G0.message:String(G0)});try{await J.cancel(G0)}finally{F0()}}});return new Response(L1,{status:j.status,statusText:j.statusText,headers:j.headers})}var Q7="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",IW="~effect/http/HttpServerResponse",TW="~effect/http/Cookies",MW="~effect/http/HttpBody",w7="~effect/ErrorReporter/ignore",H7=60000,C7=60000,L7=5000,xW=200,iJ=240,B7=iJ,I7=600000;function T7(j,W){return(j?.accounts??[]).some((J)=>J.id===W&&J.enabled!==!1&&$0(J))}function M7(j){let W=(j?.accounts??[]).find((J)=>J.enabled!==!1&&$0(J));if(C1(j)==="fallback-first"&&W)return{activeId:W.id,route:"fallback-first"};return{activeId:"main",route:"main"}}function FW(j,W){if(j?.activeId==="main"||j?.activeId&&T7(W,j.activeId))return j;return M7(W)}function cJ(j,W,J){let N=Date.now()-j.lastUpdated;if(!j.activeId||N<0||N>I7)return FW(J,W);return FW(j,W)}async function x7(j,W,J){let N;try{N=await W()}catch(Z){return h.warn("sidebar","account storage reload failed; routing preserved",{message:Z instanceof Error?Z.message:String(Z)}),{...j.activeId?{activeId:j.activeId,route:j.route}:J??{activeId:"main",route:"main"},freshStorage:null}}return{...cJ(j,N,J),freshStorage:N}}async function F7(j){await w4()?.beforeStorageLoad?.();let W;try{W=await k(j)}catch{return{activeId:"main",route:"main",freshStorage:null}}finally{await w4()?.afterStorageLoad?.()}await w4()?.beforeSidebarRead?.();let J=await bJ();return{...cJ(J,W),freshStorage:W}}function E7(j){let W=Math.floor(j.retryAfterSeconds/60),J=j.retryAfterSeconds%60,N=`Retry in ${W}m ${J}s.`;return j.modelName?`${j.modelName} weekly limit reached, no routable accounts. ${N}`:`Killswitch: no routable accounts. ${N}`}function S7(j){if(!j.requestModelId)return{isScopedDriven:!1};if(!Z1(j.mainQuota,j.storage))return{isScopedDriven:!1};let W=aW(j.mainQuota,j.requestModelId);if(!W)return{isScopedDriven:!1};if(!Number.isFinite(W.remainingPercent))return{isScopedDriven:!1};let J=eW(j.storage);if(W.remainingPercent<=J.scoped)return{isScopedDriven:!0,modelName:W.modelName,modelId:j.requestModelId};return{isScopedDriven:!1}}var q7=1,EW=!1;function H4(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function y(){return performance.now()}function j0(j){return Math.round(j*10)/10}function SW(j){return Math.floor(Math.random()*Math.max(0,j))}function j4(j){if(typeof j==="string")return j;if(j instanceof URL)return j.toString();return j.url}function W4(j,W){return W?.method??(j instanceof Request?j.method:void 0)}function qW(j){return j instanceof Error?j.message:String(j)}function A7(){if(EW||!1||!H4())return;EW=!0;let j=100,W=250,J=y()+j;setInterval(()=>{let N=y(),Z=N-J;if(J=N+j,Z<W)return;N0("[perf] opencode event_loop_lag",{lagMs:j0(Z),thresholdMs:W})},j).unref?.()}function f7(j){let W=y(),J={requestId:String(q7++),start:W,last:W,mark(N,Z){let G=y();if(H4())N0("[perf] opencode request stage",{requestId:J.requestId,stage:N,deltaMs:j0(G-J.last),totalMs:j0(G-J.start),...Z});J.last=G},done(N,Z){let G=y();if(H4())N0("[perf] opencode request done",{requestId:J.requestId,stage:N,deltaMs:j0(G-J.last),totalMs:j0(G-J.start),...Z});J.last=G}};if(H4())N0("[perf] opencode request start",{requestId:J.requestId,...j});return J}function v7(j,W){let J=/^msg_([0-9a-fA-F]{12})/.exec(j);if(!J)return;let N=BigInt(`0x${J[1]}`);if(N<=0n)return;let G=`msg_${(N-1n).toString(16).padStart(12,"0")}${"z".repeat(14)}`;if(W&&G<=W)return;return G}async function AW(j,W,J,N={}){let Z=j.client.session,G=await Mj(j.client,W),V={path:{id:W},body:{noReply:N.noReply??!0,parts:[{type:"text",text:J,ignored:!0}]}};if(N.beforeActiveAssistant){let B=G?.latestAssistantMessageId?v7(G.latestAssistantMessageId,G.latestUserMessageId):void 0;if(!B)throw Error("OpenCode assistant ordering is unavailable for the fallback notification.");V.body.messageID=B}if(G?.agent)V.body.agent=G.agent;if(G?.model)V.body.model=G.model;if(G?.variant)V.body.variant=G.variant;if(typeof Z?.promptAsync==="function"){await Z.promptAsync(V);return}if(typeof Z?.prompt==="function"){await Promise.resolve(Z.prompt(V));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function R7(){let j=Error(Q7);throw j[IW]=IW,j[w7]=!0,j.status=204,j.statusText=void 0,j.headers={},j.cookies={[TW]:TW,cookies:{}},j.body={[MW]:MW,_tag:"Empty"},j}function k7(j){if(j.sessionID==null)return!1;let W=j.model;return W?.providerID==="anthropic"||W?.api?.npm==="@ai-sdk/anthropic"||W?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function g7(j){if(j.some((W)=>W.includes("<use_parallel_tool_calls>")))return!1;return j.push(fW),!0}var h7={input:0,output:0,cache:{read:0,write:0}},y7="Fable content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Fable cache warm.",m7="Fable recovery window complete. Returning to Fable 5.";function b7(j){if(A0(j))return"Opus 5 content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Opus 5 cache warm.";return y7}function p7(j){if(A0(j))return"Opus 5 recovery window complete. Returning to Opus 5.";return m7}function Dj(j){if(A0(j))return"Opus 5";if(j==="claude-fable-5"||j.startsWith("claude-fable-5-"))return"Fable 5";if(j==="claude-opus-4-8"||j.startsWith("claude-opus-4-8-"))return"Opus 4.8";return j}function i7(j,W){return`Anthropic safety fallback active: ${Dj(j)} → ${Dj(W)}. Follow-up requests may remain on the fallback model for about one hour.`}function c7(j){return`Anthropic safety fallback ended. Returning to ${Dj(j)}.`}function l7(j){let W=j["claude-opus-4-8"]??j["claude-opus-4-5"]??Object.values(j)[0];if(!W)return j;return{...j,...Object.fromEntries(Object.values(EJ).map((J)=>[J.id,{...W,id:J.id,name:J.name,api:W.api?{...W.api,id:J.id}:void 0,cost:{input:y1.input,output:y1.output,cache:{read:y1.cacheRead,write:y1.cacheWrite5m}},limit:{...W.limit??{},context:MJ,output:xJ},capabilities:{...W.capabilities??{},reasoning:!0,attachment:!0,toolcall:!0},release_date:FJ}]))}}var d7=["low","medium","high","xhigh","max"];function u7(){return Object.fromEntries(d7.map((j)=>[j,{thinking:{type:"adaptive",display:"summarized"},effort:j}]))}function n7(j){return Object.fromEntries(Object.entries(j).map(([W,J])=>{let N=J.api?.id??J.id??W;return[W,A0(N)?{...J,variants:u7()}:J]}))}function o7(j){return Object.fromEntries(Object.entries(j).map(([W,J])=>[W,{...J,cost:h7}]))}var TN=async(j)=>{A7();let{client:W}=j,J=globalThis.fetch,N=gW(),Z=600000,G=50,V=new Map;function B(){let O=Date.now();for(let[$,D]of V)if(O-D.createdAt>Z)V.delete($)}function f(O,$){if(B(),V.size>=G){let D="",X=1/0;for(let[Y,K]of V)if(K.createdAt<X)X=K.createdAt,D=Y;if(D)V.delete(D)}V.set(O,$)}function r(O){B();let $=V.get(O);if(!$)return;if(Date.now()-$.createdAt>Z){V.delete(O);return}return $}let E;try{E=await k(N)}catch(O){let $=O instanceof Error?O.message:String(O);throw Error(`Failed to load account store: ${$}`,{cause:O instanceof Error?O:void 0})}let v=Rj(process.env.OPENCODE_ANTHROPIC_AUTH_FALLBACK_MODE),n=new x4,l=new Map,Y0=new Map,t=new Map,w0=new hJ({path:process.env.OPENCODE_ANTHROPIC_AUTH_ROUTING_STATE_FILE||kJ(N)}),F=new QJ({storage:E,onMainQuotaFetched:async(O,$,D,X)=>{try{let Y=await k(N)??T0(),K=tW(Y);if(K&&K.checkedAt>=X&&$J(K.quota,Y,K.checkedAt)>Date.now()){F.seedMainFromStorage(Y);return}Y.quota=Y.quota??{},Y.quota.mainQuota=O,Y.quota.mainQuotaCheckedAt=$,Y.quota.mainQuotaToken=D,Y.quota.mainLastQuotaApiError=void 0,await N1(Y,N,{mainQuota:!0})}catch(Y){h.warn("quota","failed to persist main quota",{error:Y instanceof Error?Y.message:String(Y)})}},onApiError:async(O)=>{try{let $=await k(N)??T0();$.quota=$.quota??{},$.quota.mainLastQuotaApiError=O,await N1($,N,{mainQuota:!0})}catch($){h.warn("quota","failed to persist backoff state",{error:$ instanceof Error?$.message:String($)})}}}),x0=new Map;async function n0(O,$,D){if(D?.aborted)return;let X=`${O}:${O4($)}`,Y=x0.get(X);if(!Y){let K=wJ({accessToken:$,fetchImpl:J,signal:D}).catch((M)=>{h.debug("quota","failed to hydrate account profile",{account:O,error:M instanceof Error?M.message:String(M)});return}).finally(()=>{if(x0.get(X)===K)x0.delete(X)});Y=K,x0.set(X,Y)}if(!D)return Y;return new Promise((K)=>{let M=!1,_=(b)=>{if(M)return;M=!0,D.removeEventListener("abort",I),K(b)},I=()=>_(void 0);if(D.addEventListener("abort",I,{once:!0}),D.aborted)I();Y.then(_)})}async function F0(O){try{if(O.accountId==="main"){let $=await X0?.();if($?.type!=="oauth"||$.access!==O.accessToken)return!1}return await hW({accountId:O.accountId,profile:O.profile,expectedTokenFingerprint:O4(O.accessToken)},N)}catch($){h.debug("quota","failed to persist account profile",{account:O.accountId,error:$ instanceof Error?$.message:String($)});return}}async function i0(O,$,D){if(process.env.OPENCODE_ANTHROPIC_AUTH_DISABLE_PROFILE_HYDRATION==="1")return O;let X=Date.now();if($&&O.main?.profile&&!z4(O.main.profile,$))O.main.profile=void 0,F0({accountId:"main",accessToken:$,profile:void 0}).catch(()=>{});if($&&!r4(O.main?.profile,X)){let Y=await n0("main",$,D);if(Y)O.main={type:"opencode",provider:"anthropic",profile:Y},F0({accountId:"main",accessToken:$,profile:Y}).catch(()=>{})}for(let Y of O.accounts){if(D?.aborted)break;if(!$0(Y)||!Y.access)continue;let K=Y.access;if(Y.profile&&!z4(Y.profile,K))Y.profile=void 0,F0({accountId:Y.id,accessToken:K,profile:void 0}).catch(()=>{});if(r4(Y.profile,X))continue;let M=await n0(Y.id,K,D);if(M)Y.profile=M,F0({accountId:Y.id,accessToken:K,profile:M}).catch(()=>{})}return O}let Y1=new Set;async function E0(O,$){let D=await k(N)??T0();if(O.accountId==="main"){let Y;try{let K=await X0?.();if(K?.type==="oauth")Y=K.access}catch{}if(Y!==O.accessToken){h.trace("quota","skipped stale main response quota persistence");return}D.quota=D.quota??{},D.quota.mainQuota=$.quota,D.quota.mainQuotaCheckedAt=$.checkedAt,D.quota.mainQuotaToken=O4(O.accessToken),await N1(D,N,{mainQuota:!0});return}let X=D.accounts.find((Y)=>Y.id===O.accountId&&$0(Y)&&Y.access===O.accessToken);if(!X)return;X.quota=$.quota,await N1(D,N,{accounts:[O.accountId]})}function L1(O){h.warn("quota","failed to persist harvested response quota",{error:O instanceof Error?O.message:String(O)})}function G0(O){let $=O instanceof Error?O.name:typeof O,D=O instanceof Error?O.message:String(O),X=`${$}:${D}`;if(Y1.has(X))return;Y1.add(X),h.warn("quota","failed to normalize response quota headers",{error:D})}function v0(O,$){try{if(!UJ(O)){h.trace("quota","skipped non-quota response headers",{account:$.accountId});return}let D=PJ(O),X=$.accountId==="main"?F.pushMainFromHeaders($.accessToken,D):F.pushFallbackFromHeaders($.accountId,$.accessToken,D);E0($,X).catch(L1),t0().catch(()=>{}),h.debug("quota","harvested response quota",{account:$.accountId,fiveHourPercent:X.quota.five_hour?.usedPercent,sevenDayPercent:X.quota.seven_day?.usedPercent,source:"headers"})}catch(D){G0(D)}}let H0=new ZJ({quotaManager:F,onFallbackStorageChanged:()=>{t0().catch(()=>{})}});H0.startBackgroundRefresh();let c0=null,o0=new _J({directory:process.env.OPENCODE_ANTHROPIC_AUTH_CACHEKEEP_REGISTRY_DIR||KJ("opencode")}),R0=[],p0=new zJ({loadStorage:()=>k(N),onTrackedSessionsChanged:async(O)=>{await o0.publish(O),R0=await o0.list(O)},prepareHeaders:async(O,$)=>{let D,X=$.oauthAccountId;if(X&&X!=="main"){let Y=await k(N),K=Y?.accounts.find((_)=>_.id===X&&_.enabled!==!1&&$0(_));if(!K||!Y)throw Error(`OAuth account ${X} is unavailable for cache prewarm`);let M=K;try{M=await H0.refreshAccount(K,Y)}catch(_){h.warn("cachekeep","fallback token refresh failed",{accountId:X,error:_ instanceof Error?_.message:String(_)})}if(D=M.access,!D)throw Error(`OAuth account ${X} has no access token for cache prewarm`)}else{if(!X0)return O;let Y=await X0();if(Y.type!=="oauth")return O;if(!Y.access||Y.expires&&Y.expires<Date.now()){if(!c0)return O;Y.access=await c0()}D=Y.access}if(!D)return O;try{let Y=JSON.parse($.bodyText),K=await l4(D,typeof Y.model==="string"?Y.model:void 0);if(O.delete("anthropic-beta"),f1(O,D,{body:Y,identity:K}),O.set("anthropic-beta",q1(O.get("anthropic-beta"),[DJ])),Y.speed==="fast")a1(O)}catch{f1(O,D)}return O}}),r0=new Map;function C4(O){let $=O.plan.sessionId,D=A0(O.plan.requestedModel)?"Opus 5":"Fable",X=async()=>{let _=O.warmTarget;if(!_){h.debug("fable-fallback","cache warm skipped",{session:$,reason:"Opus response was not served by an OAuth route"});return}let I=CW(_.bodyText,O.plan.requestedModel);if(!I.ok){h.warn("fable-fallback","cache warm skipped",{session:$,reason:I.reason});return}try{let b=await p0.prewarmNow({sessionId:$,url:_.url,headers:_.headers,bodyText:I.bodyText,oauthAccountId:n.recoveryAccount(O.plan)??_.oauthAccountId});if(b.ok){h.debug("fable-fallback",`${D} cache warmed`,{session:$,remaining:n.remaining(O.plan),...b.usage&&{usage:b.usage}});return}h.warn("fable-fallback",`${D} cache warm skipped`,{session:$,status:b.status,reason:b.reason})}catch(b){h.warn("fable-fallback",`${D} cache warm failed`,{session:$,error:b instanceof Error?b.message:String(b)})}},{recoveryKey:Y}=O.plan,M=(r0.get(Y)??Promise.resolve()).then(X,X);return r0.set(Y,M),M.finally(()=>{if(r0.get(Y)===M)r0.delete(Y)}),M}async function L4(){return R0=await o0.list(p0.trackedSessions()),R0}if(g1({enabled:v1(E),mode:R1(E)}),_4(Z4(E)),P4(Y4(E)),!process.env.OPENCODE_ANTHROPIC_AUTH_LOG_LEVEL)RW(X4(E)??"info");let s0=null;if(j.directory){let O=globalThis;if(O.__anthropicAuthRpcServer)await O.__anthropicAuthRpcServer.stop().catch(()=>{}),O.__anthropicAuthRpcServer=void 0;try{s0=await qj({dir:yJ(j.directory),drain:Ej,apply:O3}),O.__anthropicAuthRpcServer=s0}catch($){h.warn("rpc","failed to start",{error:$ instanceof Error?$.message:String($)})}}let U0={activeId:"main",route:"main"},k0=mJ(),P0=new Map;function B4(O,$,D){if(!O||!$)return O;let X={...O,accounts:O.accounts.map((M)=>{let _=$.accounts.find((I)=>I.id===M.id);if(!$0(M)||!_||!$0(_)||!M.access||_.access!==M.access)return M;return{...M,profile:_.profile}})},Y=O.main?.profile,K=O.main??$.main;if(D&&K&&(!Y||z4(Y,D)))X.main={...K,profile:$.main?.profile};return X}function m1(O,$){F.updateStorage(O),F.seedMainFromStorage(O,$.mainAccessToken),F.seedFallbacksFromAccounts((O?.accounts??[]).filter($0));let D=F.getMain($.mainAccessToken),X=F.getLastApiError(),Y=O?.refresh?.mainLastRefreshError;return{main:{quota:D?.quota??null,tierLabel:K4(O?.main?.profile),quotaBackedOff:F.isBackedOff(),quotaBackoffUntil:X?.nextRetryAt,refreshBackedOff:Y?O1(Y,$.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:Y?.nextRetryAt},fallbacks:(O?.accounts??[]).filter((K)=>K.enabled!==!1&&$0(K)).map((K)=>({id:K.id,label:K.label,tierLabel:K4(K.profile),quota:K.access?F.getFallback(K.id,K.access)?.quota??null:null,needsReauth:K.lastRefreshError!=null&&O1(K.lastRefreshError,K.refresh,Date.now())&&P1(K.lastRefreshError),enabled:K.enabled!==!1})),activeId:$.activeId,route:$.route,relay:(()=>{let K=$j(O);return K?{enabled:!0,transport:K.transport??"http"}:null})(),fastMode:U4(),cacheKeep:{enabled:o4(O),window:n4(O)?"always":O?.cacheKeep?.startHour!=null&&O?.cacheKeep?.endHour!=null?`${O.cacheKeep.startHour}-${O.cacheKeep.endHour}`:void 0,trackedSessions:R0.length},fableRecoveries:P0.size>0?[...P0.values()]:void 0,lastUpdated:Date.now()}}function M0(O,$){let D=$.routingAuthoritative!==!1;if(D)U0={activeId:$.activeId,route:$.route};let X=m1(O,$);return pJ(X,k0,{routingAuthoritative:D,resolvePreservedRouting:D?void 0:async(Y)=>{let K=await x7(Y,()=>k(N),{activeId:X.activeId,route:X.route}),M=$.useHydratedProfiles?B4(K.freshStorage,O,$.mainAccessToken):K.freshStorage;return{activeId:K.activeId,route:K.route,state:m1(M,{...$,activeId:K.activeId,route:K.route})}},onRoutingResolved:D?void 0:(Y)=>{U0=Y}}).catch((Y)=>h.warn("sidebar","state write failed",{error:Y instanceof Error?Y.message:String(Y)}))}async function t0(){let O=await k(N),$,D;if(X0)try{let X=await X0();$=X.access,D=X.refresh}catch{}M0(O,{activeId:U0.activeId,route:U0.route,mainAccessToken:$,mainRefreshToken:D,routingAuthoritative:!1})}function lJ(O,$){if(!$)return;if(O?.quota?.enabled!==!0)return;if(F.getMain($))return;if(I4)return;I4=!0,F.refreshMain($).then(()=>t0()).catch(()=>{}).finally(()=>{I4=!1})}let X0=null,I4=!1,D1=null,b1=0;function dJ(O){let $=O?.refresh?.refreshBeforeExpiryMinutes??B7;return Math.max(iJ,$)*60000}function uJ(O){return O?.refresh?.enabled!==!1}async function Gj(O){if(!O)return;let $=await k(N),D=$?.refresh?.mainLastRefreshError;if(!$?.refresh||!D?.tokenHash)return;let X=G4(O);if(D.tokenHash===X)return;if(D.nextRetryAt&&D.nextRetryAt>Date.now()){N0("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:D.nextRetryAt,retryCount:D.retryCount,remainingMs:D.nextRetryAt-Date.now()});return}$.refresh.mainLastRefreshError=void 0,await N1($,N,{mainRefresh:!0}),N0("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:D.checkedAt,previousNextRetryAt:D.nextRetryAt,previousRetryCount:D.retryCount})}async function nJ(){let O=[],$;if(X0)try{let _=await X0();if(_.type==="oauth"&&_.access){$=_.access;let I=await F.refreshMain(_.access);O.push({name:"OpenCode anthropic",role:"main",quota:I})}else if(_.type==="oauth")O.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(_){let I=_ instanceof Error?_.message:String(_);O.push({name:"OpenCode anthropic",role:"main",error:I.includes("429")?"Usage API rate limited — try again in a moment":I})}let{storage:D,errors:X}=await H0.refreshQuotaForAllAccounts({force:!0}),Y=await i0(D??T0(),$,AbortSignal.timeout(3000)),K=O.find((_)=>_.role==="main");if(K)K.tierLabel=K4(Y.main?.profile);let M=new Map(X.map((_)=>[_.accountId,_.message]));if(O.push(...SJ(Y,M)),!X0)O.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return qJ({accounts:O,refreshedAt:Date.now()})}async function Xj(O){if(X0)try{let $=await X0();M0(O,{activeId:U0.activeId,route:U0.route,mainAccessToken:$.access,mainRefreshToken:$.refresh,routingAuthoritative:!1})}catch{}}function B1(O,$,D,X){if(P0.delete(O.sessionId),P0.set(O.sessionId,{...O,changedAt:Date.now()}),P0.size>128){let K=P0.keys().next().value;if(K)P0.delete(K)}if(M0($,{activeId:U0.activeId,route:U0.route,mainAccessToken:D.access,mainRefreshToken:D.refresh,routingAuthoritative:!1}),!X||E4(O.sessionId))return;let Y=Y0.get(O.sessionId)??[];if(Y.push(X),Y.length>4)Y.splice(0,Y.length-4);Y0.delete(O.sessionId),Y0.set(O.sessionId,Y);while(Y0.size>128){let K=Y0.keys().next().value;if(K)Y0.delete(K);else break}oJ(O.sessionId)}async function oJ(O){let $=j.client.session;if(typeof $?.status!=="function")return;try{let D=await Promise.resolve($.status()),X=D!==null&&typeof D==="object"?D:void 0,Y=X&&Object.hasOwn(X,"data")?X.data:X;if(Y===null||typeof Y!=="object"||Array.isArray(Y))return;let K=Y[O];if(K===void 0){await p1(O);return}if(K!==null&&typeof K==="object"&&K.type==="idle")await p1(O)}catch{}}function p1(O){let $=t.get(O);if($)return $;let D=(async()=>{while(!0){let Y=Y0.get(O)?.shift();if(!Y){Y0.delete(O);return}try{await AW(j,O,Y,{noReply:!0,beforeActiveAssistant:!0})}catch(K){h.warn("fable-fallback","Desktop notification failed",{session:O,error:K instanceof Error?K.message:String(K)})}}})();return t.set(O,D),D.finally(()=>{if(t.get(O)===D)t.delete(O)}),D}function rJ(O,$,D,X){if($.fallback&&$.targetModel){let Y=l.get(O.recoveryKey);l.delete(O.recoveryKey),l.set(O.recoveryKey,$.targetModel);while(l.size>128){let M=l.keys().next().value;if(M)l.delete(M);else break}let K=P0.get(O.sessionId);if(Y===$.targetModel&&K?.mode==="server"&&y0(K.requestedModelId)===y0(O.requestedModel)&&K.targetModelId===$.targetModel)return;h.info("fable-fallback","Anthropic server-side safety fallback active",{session:O.sessionId,requestedModel:O.requestedModel,targetModel:$.targetModel,handoff:$.handoff}),B1({sessionId:O.sessionId,mode:"server",remaining:0,requestedModelId:O.requestedModel,targetModelId:$.targetModel},D,X,i7(O.requestedModel,$.targetModel));return}if($.stopReason==="refusal"||!l.delete(O.recoveryKey))return;h.info("fable-fallback","Anthropic server-side safety fallback ended",{session:O.sessionId,requestedModel:O.requestedModel}),B1({sessionId:O.sessionId,mode:"fable",remaining:0,requestedModelId:O.requestedModel},D,X,c7(O.requestedModel))}function sJ(O,$,D){if(!O)return;for(let X of l.keys())if(X.startsWith(`${O}\x00`))l.delete(X);if(!P0.delete(O))return;M0($,{activeId:U0.activeId,route:U0.route,mainAccessToken:D.access,mainRefreshToken:D.refresh,routingAuthoritative:!1})}async function tJ(O){let $=YJ(O);if($.type==="enable"||$.type==="disable"){let K=$.type==="enable",M=await mW(K),_=R1(M);return g1({enabled:K,mode:_}),h.info("commands","cache enabled changed",{enabled:K}),V4({argumentsText:O,enabled:K,mode:_})}if($.type==="mode"){let K=await bW($.mode),M=v1(K);return g1({enabled:M,mode:$.mode}),h.info("commands","cache mode changed",{mode:$.mode}),V4({argumentsText:O,enabled:M,mode:$.mode})}let D=await k(N),X=v1(D),Y=R1(D);return g1({enabled:X,mode:Y}),V4({argumentsText:O,enabled:X,mode:Y})}async function aJ(O){let $=GJ(O),D=await k(N);if($.type==="window")D=await cW($.startHour,$.endHour),h.info("commands","cachekeep schedule changed",{schedule:`${$.startHour}-${$.endHour}`});else if($.type==="always")D=await lW(),h.info("commands","cachekeep schedule changed",{schedule:"always"});else if($.type==="disable")D=await dW(!1),h.info("commands","cachekeep enabled changed",{enabled:!1});else if($.type==="subagents")D=await nW($.enabled),h.info("commands","cachekeep subagents changed",{subagents:$.enabled});let X=u4(D),Y=await L4(),K=Y.length?Math.min(...Y.map((M)=>M.nextPrewarmAt)):void 0;return VJ({argumentsText:O,enabled:XJ(D),always:n4(D),window:X,hybridActive:o4(D),trackedSessions:Y.length,trackedSessionDetails:Y,nextPrewarmAt:K})}async function eJ(O){let $=LJ(O);if($.type==="enable"||$.type==="disable"){let Y=$.type==="enable";return await pW(Y),_4(Y),h.info("commands","dump changed",{enabled:Y}),a4({argumentsText:O,enabled:Y})}let D=await k(N),X=Z4(D);return _4(X),a4({argumentsText:O,enabled:X})}async function j3(O){let $=BJ(O);if($.type==="enable"||$.type==="disable"){let Y=$.type==="enable";return await iW(Y),P4(Y),h.info("commands","fast mode changed",{enabled:Y}),jj({argumentsText:O,enabled:Y})}let D=await k(N),X=Y4(D);return P4(X),jj({argumentsText:O,enabled:X})}async function W3(O,$){let D=vJ(O);if(D.type==="mode")return await fJ(D.mode,N),h.info("commands","routing mode changed",{mode:D.mode}),Yj({argumentsText:O,mode:D.mode});if(D.type==="reset"&&$)await w0.clear($),h.info("commands","sticky routing assignment reset");let X=await k(N);return Yj({argumentsText:O,mode:C1(X)})}async function J3(O){let $=TJ(O);if($.type==="level")return await sW($.level),h.info("commands","log level changed",{level:$.level}),Nj({argumentsText:O,level:$.level});let D=await k(N),X=X4(D)??"info";return Nj({argumentsText:O,level:X})}async function N3(O,$){let D=HJ(O);if(D.type==="add-apikey"){if(!D.apiKey)return{text:"API key is required",accounts:m0(await k(N)??T0())};let _=D.label?.trim()||void 0,I=Date.now(),b=D.baseURL?.trim()||"https://api.kie.ai/claude";if(!$4(b))return{text:"Invalid base URL. Must be an http(s) URL without embedded credentials.",accounts:m0(await k(N)??T0())};let Z0=D.authHeader??"authorization-bearer",V0={id:_||h4(),label:_||void 0,type:"api",apiKey:D.apiKey,baseURL:b,authHeader:Z0,enabled:!0,addedAt:I,lastUsed:I};await i4(V0,N),h.info("commands","account added",{id:V0.id,label:V0.label,type:"apikey"});let B0=await k(N);await Xj(B0);let a0=m0(B0??{version:1,accounts:[]});return{text:`API key account "${V0.label??V0.id}" added.`,accounts:a0}}if(D.type==="add-oauth-start"){let _=await J4("max"),I={state:_.state,verifier:_.verifier,redirectUri:_.redirectUri,createdAt:Date.now()};return f($??"default",I),{text:`Open this URL in your browser:
19
+ ${_.url}`,knobs:{oauthUrl:_.url},accounts:m0(await k(N)??T0())}}if(D.type==="add-oauth-finish"){let _=$??"default",I=r(_);if(!I)return{text:"OAuth session expired. Please start again.",accounts:m0(await k(N)??T0())};try{let b=await N4(D.code,I.verifier,I.redirectUri,I.state);if(b.type==="failed")return{text:"OAuth authentication failed. Please check the code and try again.",accounts:m0(await k(N)??T0())};let Z0=Date.now(),V0={id:h4(),type:"oauth",label:D.label||void 0,access:b.access,refresh:b.refresh,expires:b.expires,enabled:!0,addedAt:Z0,lastUsed:Z0,lastRefreshedAt:Z0};await i4(V0,N),h.info("commands","account added",{id:V0.id,label:V0.label,type:"oauth"});let B0=await k(N);return await Xj(B0),{text:"OAuth account added.",accounts:m0(B0??T0())}}catch{return{text:"OAuth exchange failed due to a network error. Please try again.",accounts:m0(await k(N)??T0())}}finally{V.delete(_)}}let X=await k(N);if(D.type==="status"&&X){let _;if(X0)try{let I=await X0();if(I.type==="oauth")_=I.access}catch{}X=await i0(X,_,AbortSignal.timeout(3000))}let Y=CJ({argumentsText:O,storage:X??{version:1,accounts:[]}});if(Y.updated){if(Y.updated.action==="enable"||Y.updated.action==="disable"){let I=Y.updated.action==="enable";await OJ(Y.updated.id,I,N);let b=Y.updated.id,Z0=X?.accounts.find((V0)=>V0.id===b);h.info("commands",`account ${Y.updated.action}d`,{id:b,label:Z0?.label,enabled:I})}else if(Y.updated.action==="remove"){await JJ(Y.updated.id,N);let I=Y.updated.id,b=X?.accounts.find((Z0)=>Z0.id===I);h.info("commands","account removed",{id:I,label:b?.label})}else if(Y.updated.action==="reorder"){await NJ(Y.updated.newOrder??Y.updated.previousOrder??[],N);let I=Y.updated.id,b=X?.accounts.find((Z0)=>Z0.id===I);h.info("commands","account reordered",{id:I,label:b?.label})}let _=await k(N);if(X0)try{let I=await X0();M0(_,{activeId:U0.activeId,route:U0.route,mainAccessToken:I.access,mainRefreshToken:I.refresh,routingAuthoritative:!1})}catch{}}let K=await k(N),M=m0(K??{version:1,accounts:[]});return{text:Y.text,accounts:M}}async function Vj(O,$,D){if(O==="claude-quota")return{command:O,text:await nJ(),knobs:{}};if(O==="claude-logging"){let _=await J3($),I=await k(N);return{command:O,text:_,knobs:{level:X4(I)??"info"}}}if(O==="claude-account"){let _=await N3($,D),I={accounts:_.accounts};if("knobs"in _&&_.knobs)Object.assign(I,_.knobs);return{command:O,text:_.text,knobs:I}}if(O==="claude-routing"){let _=await W3($,D),I=await k(N);return{command:O,text:_,knobs:{mode:C1(I)}}}if(O==="claude-fast"){let _=await j3($),I=await k(N);return{command:O,text:_,knobs:{enabled:Y4(I)}}}if(O==="claude-dump"){let _=await eJ($),I=await k(N);return{command:O,text:_,knobs:{enabled:Z4(I)}}}if(O==="claude-cache"){let _=await tJ($),I=await k(N);return{command:O,text:_,knobs:{enabled:v1(I),mode:R1(I)}}}if(O==="claude-cachekeep"){let _=await aJ($),I=await k(N);return{command:O,text:_,knobs:{window:u4(I)}}}let X=await k(),Y=p4(X),K=(X?.accounts??[]).filter((_)=>_.enabled!==!1).map((_)=>_.id),M=IJ({argumentsText:$,config:Y,accountIds:K});if(M.updatedConfig){if(await WJ(M.updatedConfig),Y.enabled!==M.updatedConfig.enabled)h.info("commands","killswitch changed",{enabled:M.updatedConfig.enabled===!0});if(JSON.stringify(Y.main)!==JSON.stringify(M.updatedConfig.main)||JSON.stringify(Y.accounts)!==JSON.stringify(M.updatedConfig.accounts))h.info("commands","killswitch thresholds changed",{thresholds:M.updatedConfig.main??M.updatedConfig.accounts})}return{command:O,text:M.text,knobs:{config:p4(await k()),accountIds:K}}}async function O3(O){let $=await Vj(O.command,O.arguments,O.sessionId);return{text:$.text,knobs:$.knobs}}function $3(O,$=10){let D=Math.max(0,Math.min(Math.round(O/100*$),$));return"█".repeat(D)+"░".repeat($-D)}function i1(O,$){return`${O} ${$3($)} ${String(Math.round($)).padStart(3)}%`}function zj(O){if(!O)return"";let $=new Date(O).getTime();if(Number.isNaN($))return"";let D=$-Date.now();if(D<=0)return"resets now";let X=Math.floor(D/60000);if(X<1)return"resets <1m";if(X<60)return`resets ${X}m`;let Y=Math.floor(X/60),K=X%60;return K>0?`resets ${Y}h${K}m`:`resets ${Y}h`}function Z3(O,$,D){let X=[],Y=0;if(O){let{five_hour:_,seven_day:I}=O;if(_||I){let Z0=D==="main"?"active":"idle",V0=zj(_?.resetsAt),B0=[`main · ${Z0}${V0?` (${V0})`:""}`];if(_)B0.push(i1("5h",_.usedPercent)),Y=Math.max(Y,_.usedPercent);if(I)B0.push(i1("7d",I.usedPercent)),Y=Math.max(Y,I.usedPercent);X.push(B0.join(`
20
+ `))}}if($?.length)for(let _ of $){let I=_.quota;if(!I)continue;let{five_hour:b,seven_day:Z0}=I;if(!b&&!Z0)continue;let V0=_.label||"alt",a0=D===_.id?"active":"idle",e0=zj(b?.resetsAt),j1=[`${V0} · ${a0}${e0?` (${e0})`:""}`];if(b)j1.push(i1("5h",b.usedPercent)),Y=Math.max(Y,b.usedPercent);if(Z0)j1.push(i1("7d",Z0.usedPercent)),Y=Math.max(Y,Z0.usedPercent);X.push(j1.join(`
21
+ `))}if(!X.length)return;let K=X.join(`
14
22
 
15
- `),F=G>=90?"error":G>=70?"warning":"info";W.tui?.showToast?.({body:{title:"Claude Quota",message:P,variant:F,duration:F==="error"?8000:5000}})?.catch?.(()=>{})}return{event:async({event:O})=>{let $=O,X=$.properties?.sessionID??$.properties?.info?.id;if(!X)return;if($.type==="session.deleted")B0.delete(X)},config:async(O)=>{O.command={...O.command??{},[vN]:{template:vN,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[yN]:{template:yN,description:"Manage fallback accounts — list, enable/disable, reorder, remove, or add (API key or OAuth)."},[AN]:{template:AN,description:"Keep hybrid Claude cache warm always or during a local time window."},[cN]:{template:cN,description:"Show current Claude OAuth quota usage for all accounts."},[hN]:{template:hN,description:"Show or toggle Anthropic request dump capture for debugging."},[bN]:{template:bN,description:"Show or toggle Anthropic fast mode for supported Opus models."},[dN]:{template:dN,description:"Show or set the plugin log level (error, warn, info, debug, trace)."},[nN]:{template:nN,description:"Show or change Claude account routing: main-first, fallback-first, or sticky-balanced."},[iN]:{template:iN,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async(O,$)=>{if(!O3(O))return;$3($.system)},provider:{id:"anthropic",async models(O,$){let X=z3(V3(O.models));if($.auth?.type!=="oauth"||!P4(l??{}))return X;return w3(X)}},"command.execute.before":async(O)=>{if(!["claude-account","claude-cache","claude-cachekeep","claude-quota","claude-dump","claude-fast","claude-routing","claude-killswitch","claude-logging"].includes(O.command))return;let X=O.command,K=await aN(X,O.arguments,O.sessionID);if(X==="claude-quota"){let G=await q(),P=$0?await $0().catch(()=>{return}):void 0;I0(G,{activeId:V0.activeId,route:V0.route,mainAccessToken:P?.access,mainRefreshToken:P?.refresh,routingAuthoritative:!1})}if(wN(O.sessionID))wW(K,O.sessionID);else await K4(N,O.sessionID,K.text);J3()},auth:{provider:"anthropic",async loader(O,$){$0=O;let X=await O();if(X.type==="oauth"){let P=function(){if(O1)clearInterval(O1),O1=null;let D=async()=>{try{let U=await q(J);if(!Tj(U))return;let A=await O();if(A.type!=="oauth")return;if(await rN(A.refresh),!A.expires)return;let S=A.expires-Date.now(),w=xj(U);if(S>w)return;if(a("[refresh] opencode main oauth background due",{expiresInMs:S,refreshBeforeMs:w}),A.refresh&&t0(U?.refresh?.mainLastRefreshError,A.refresh,Date.now())){a("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:U?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:U?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:S});return}if(A.refresh&&U?.refresh?.mainRefreshLeaseUntil&&U.refresh.mainRefreshLeaseUntil>Date.now()&&U.refresh.mainRefreshLeaseTokenHash===t1(A.refresh))return;await G();let v=await O();a("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:v.expires?v.expires-Date.now():void 0})}catch(U){k.warn("refresh","opencode main oauth refresh failed",{message:U instanceof Error?U.message:String(U)})}};if(O1=setInterval(()=>{D()},iJ+V4(dJ)),"unref"in O1)O1.unref()},z=function(D,U){if(D instanceof Request&&D.body)return!1;return U==null||typeof U==="string"},L=function(D){if(typeof D!=="string")return;try{let U=JSON.parse(D);return typeof U.model==="string"?U.model:void 0}catch{return}},h=function(D){return D.has("x-parent-session-id")},W0=function(D){return D.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(D)},Z0=function(D){return D?.quota?.enabled===!0},n0=function(D,U){if(D.delete("authorization"),D.delete("x-api-key"),U.authHeader==="x-api-key")D.set("x-api-key",U.apiKey??"");else D.set("Authorization",`Bearer ${U.apiKey??""}`);D.set("Content-Type","application/json")},f1=function(D){return I.getFallback(D.id,D.access)?.quota??D.quota},VN=function(D){return["five_hour","seven_day"].some((U)=>(D?.[U]?.remainingPercent??1)<=0)},eN=function(D,U){return D.status===429||U},R1=function(D){if(!D)return!1;let U=I.getMain(D);return Boolean(U&&U.refreshAfter>Date.now()&&VN(U.quota))},K=null;async function G(){if(!K)K=(async()=>{let A=null,S=null,w=null;async function v(C){let x=await q(J)??H0();x.refresh=x.refresh??{},C(x),await a0(x,J,{mainRefresh:!0})}async function b(C){let x=Date.now()+lJ;while(Date.now()<x){await new Promise((Q)=>setTimeout(Q,X4+V4(X4)));let M=await O();if(M.type!=="oauth"||!M.access)continue;if((M.access!==C.access||M.refresh!==C.refresh||(M.expires??0)>(C.expires??0)+60000)&&(!M.expires||M.expires>Date.now()))return a("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:M.expires?M.expires-Date.now():void 0}),M.access}return null}for(let C=0;C<=2;C++){let x=null;try{if(C>0){let m=500*2**(C-1);await new Promise((j0)=>setTimeout(j0,m))}if(x=await O(),!x.refresh)throw Error("Token refresh failed: missing refresh token");let M=await q(J),Y=t1(x.refresh),Q=M?.refresh?.mainLastRefreshError;if(a("[refresh] opencode main oauth refresh check",{attempt:C,expiresInMs:x.expires?x.expires-Date.now():void 0,hasBackoff:Boolean(Q),backoffActive:Q?t0(Q,x.refresh,Date.now()):!1,retryCount:Q?.retryCount,nextRetryAt:Q?.nextRetryAt}),Q&&t0(Q,x.refresh,Date.now()))throw a("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:Q.nextRetryAt,retryCount:Q.retryCount}),Error(FN(Q,Date.now()));if(M?.refresh?.mainRefreshLeaseUntil&&M.refresh.mainRefreshLeaseUntil>Date.now()&&M.refresh.mainRefreshLeaseTokenHash===Y){a("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:M.refresh.mainRefreshLeaseUntil});let m=await b(x);if(m)return m;throw Error("Claude OAuth refresh is already in progress")}let H=await H4({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!H){a("[refresh] opencode main oauth refresh skipped file lock");let m=await b(x);if(m)return m;throw Error("Claude OAuth refresh is already in progress")}w=H.release,A=IN(),S=Y,await v((m)=>{m.refresh=m.refresh??{},m.refresh.mainRefreshLeaseId=A??void 0,m.refresh.mainRefreshLeaseUntil=Date.now()+120000,m.refresh.mainRefreshLeaseTokenHash=Y});let p=await q(J);if(a("[refresh] opencode main oauth refresh lease acquired",{attempt:C,leaseUntil:Date.now()+120000}),p?.refresh?.mainRefreshLeaseId!==A||p.refresh.mainRefreshLeaseTokenHash!==Y)throw Error("Claude OAuth refresh is already in progress");a("[refresh] opencode main oauth refresh request start",{attempt:C});let T=await w4({refreshToken:x.refresh,maxRetries:0});return await W.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:T.refresh,access:T.access,expires:T.expires}}),await v((m)=>{if(!m?.refresh)return;if(m.refresh.mainLastRefreshError=void 0,m.refresh.mainRefreshLeaseId===A)m.refresh.mainRefreshLeaseId=void 0,m.refresh.mainRefreshLeaseUntil=void 0,m.refresh.mainRefreshLeaseTokenHash=void 0}),a("[refresh] opencode main oauth refresh succeeded",{attempt:C,expiresInMs:T.expires-Date.now()}),T.access}catch(M){let Y=M instanceof Error&&(M.message.includes("fetch failed")||("code"in M)&&(M.code==="ECONNRESET"||M.code==="ECONNREFUSED"||M.code==="ETIMEDOUT"||M.code==="UND_ERR_CONNECT_TIMEOUT"));if(C<2&&(Y||(()=>{let H=M.status;return typeof H==="number"&&H>=500})()))continue;a("[refresh] opencode main oauth refresh attempt failed",{attempt:C,error:M instanceof Error?M.message:String(M),transient:Y});let Q=x?.refresh;if(Q&&M.isRefreshError)await v((H)=>{H.refresh=H.refresh??{},H.refresh.mainLastRefreshError=v4({error:M,now:Date.now(),refreshToken:Q,previous:H.refresh.mainLastRefreshError})});throw M}finally{if(A)await v((M)=>{if(!M?.refresh)return;if(M.refresh.mainRefreshLeaseId===A&&M.refresh.mainRefreshLeaseTokenHash===S)M.refresh.mainRefreshLeaseId=void 0,M.refresh.mainRefreshLeaseUntil=void 0,M.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await w?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{K=null});return K}O0=G,P(),I.seedFallbacksFromAccounts((l?.accounts??[]).filter(N0));let F=await sJ(J);if(await I0(F.freshStorage,{activeId:F.activeId,route:F.route,mainAccessToken:X.access,mainRefreshToken:X.refresh,routingAuthoritative:!1}),process.env.OPENCODE_ANTHROPIC_AUTH_DISABLE_PROFILE_HYDRATION!=="1")b0(l??H0(),X.access).then((D)=>{I0(D,{activeId:"main",route:"main",mainAccessToken:X.access,mainRefreshToken:X.refresh,routingAuthoritative:!1,useHydratedProfiles:!0})}).catch(()=>{});async function Q0(D,U){if(!D.body||D.status!==200)return U?.mark("inspect_stream_skip",{status:D.status}),{response:D,rateLimited:!1};if(D.headers.get("x-cortexkit-relay-optimistic")==="true")return U?.mark("inspect_stream_skip",{status:D.status,reason:"optimistic_relay"}),{response:D,rateLimited:!1};let A=f(),S=D.body.getReader(),w=[],v=new TextDecoder,b="",C=0;while(!b.includes(`
23
+ `),M=Y>=90?"error":Y>=70?"warning":"info";W.tui?.showToast?.({body:{title:"Claude Quota",message:K,variant:M,duration:M==="error"?8000:5000}})?.catch?.(()=>{})}return{event:async({event:O})=>{let $=O,D=$.properties?.info,X=$.properties?.sessionID??D?.sessionID??D?.id;if(!X)return;if($.type==="session.status"&&$.properties?.status?.type==="idle")await p1(X);if($.type==="message.updated"&&D?.role==="assistant"&&typeof D.time?.completed==="number")await p1(X);if($.type==="session.deleted")P0.delete(X),Y0.delete(X)},config:async(O)=>{O.command={...O.command??{},[c4]:{template:c4,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[s4]:{template:s4,description:"Manage fallback accounts — list, enable/disable, reorder, remove, or add (API key or OAuth)."},[d4]:{template:d4,description:"Keep hybrid Claude cache warm always or during a local time window."},[Oj]:{template:Oj,description:"Show current Claude OAuth quota usage for all accounts."},[t4]:{template:t4,description:"Show or toggle Anthropic request dump capture for debugging."},[e4]:{template:e4,description:"Show or toggle Anthropic fast mode for supported Opus models."},[Jj]:{template:Jj,description:"Show or set the plugin log level (error, warn, info, debug, trace)."},[Zj]:{template:Zj,description:"Show or change Claude account routing: main-first, fallback-first, or sticky-balanced."},[Wj]:{template:Wj,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async(O,$)=>{if(!k7(O))return;g7($.system)},provider:{id:"anthropic",async models(O,$){let D=n7(l7(O.models));if($.auth?.type!=="oauth"||!kW(E??{}))return D;return o7(D)}},"command.execute.before":async(O)=>{if(!["claude-account","claude-cache","claude-cachekeep","claude-quota","claude-dump","claude-fast","claude-routing","claude-killswitch","claude-logging"].includes(O.command))return;let D=O.command,X=await Vj(D,O.arguments,O.sessionID);if(D==="claude-quota"){let Y=await k(),K=X0?await X0().catch(()=>{return}):void 0;M0(Y,{activeId:U0.activeId,route:U0.route,mainAccessToken:K?.access,mainRefreshToken:K?.refresh,routingAuthoritative:!1})}if(E4(O.sessionID))Fj(X,O.sessionID);else await AW(j,O.sessionID,X.text);R7()},auth:{provider:"anthropic",async loader(O,$){X0=O;let D=await O();if(D.type==="oauth"){let K=function(){if(D1)clearInterval(D1),D1=null;let z=async()=>{try{let Q=await k(N);if(!uJ(Q))return;let g=await O();if(g.type!=="oauth")return;if(await Gj(g.refresh),!g.expires)return;let q=g.expires-Date.now(),T=dJ(Q);if(q>T)return;if(N0("[refresh] opencode main oauth background due",{expiresInMs:q,refreshBeforeMs:T}),g.refresh&&O1(Q?.refresh?.mainLastRefreshError,g.refresh,Date.now())){N0("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:Q?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:Q?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:q});return}if(g.refresh&&Q?.refresh?.mainRefreshLeaseUntil&&Q.refresh.mainRefreshLeaseUntil>Date.now()&&Q.refresh.mainRefreshLeaseTokenHash===G4(g.refresh))return;await Y();let m=await O();N0("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:m.expires?m.expires-Date.now():void 0})}catch(Q){h.warn("refresh","opencode main oauth refresh failed",{message:Q instanceof Error?Q.message:String(Q)})}};if(D1=setInterval(()=>{z()},H7+SW(C7)),"unref"in D1)D1.unref()},_=function(z,Q){if(z instanceof Request&&z.body)return!1;return Q==null||typeof Q==="string"},I=function(z){if(typeof z!=="string")return;try{let Q=JSON.parse(z);return typeof Q.model==="string"?Q.model:void 0}catch{return}},b=function(z){return z.has("x-parent-session-id")},Z0=function(z){return z.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(z)},V0=function(z){return z?.quota?.enabled===!0},a0=function(z,Q){if(z.delete("authorization"),z.delete("x-api-key"),Q.authHeader==="x-api-key")z.set("x-api-key",Q.apiKey??"");else z.set("Authorization",`Bearer ${Q.apiKey??""}`);z.set("Content-Type","application/json")},c1=function(z){return F.getFallback(z.id,z.access)?.quota??z.quota},T4=function(z){return["five_hour","seven_day"].some((Q)=>(z?.[Q]?.remainingPercent??1)<=0)},Kj=function(z,Q){return z.status===429||Q},l1=function(z){if(!z)return!1;let Q=F.getMain(z);return Boolean(Q&&Q.refreshAfter>Date.now()&&T4(Q.quota))},X=null;async function Y(){if(!X)X=(async()=>{let g=null,q=null,T=null;async function m(S){let R=await k(N)??T0();R.refresh=R.refresh??{},S(R),await N1(R,N,{mainRefresh:!0})}async function L(S){let R=Date.now()+L7;while(Date.now()<R){await new Promise((w)=>setTimeout(w,xW+SW(xW)));let U=await O();if(U.type!=="oauth"||!U.access)continue;if((U.access!==S.access||U.refresh!==S.refresh||(U.expires??0)>(S.expires??0)+60000)&&(!U.expires||U.expires>Date.now()))return N0("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:U.expires?U.expires-Date.now():void 0}),U.access}return null}for(let S=0;S<=2;S++){let R=null;try{if(S>0){let u=500*2**(S-1);await new Promise((z0)=>setTimeout(z0,u))}if(R=await O(),!R.refresh)throw Error("Token refresh failed: missing refresh token");let U=await k(N),H=G4(R.refresh),w=U?.refresh?.mainLastRefreshError;if(N0("[refresh] opencode main oauth refresh check",{attempt:S,expiresInMs:R.expires?R.expires-Date.now():void 0,hasBackoff:Boolean(w),backoffActive:w?O1(w,R.refresh,Date.now()):!1,retryCount:w?.retryCount,nextRetryAt:w?.nextRetryAt}),w&&O1(w,R.refresh,Date.now()))throw N0("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:w.nextRetryAt,retryCount:w.retryCount}),Error(y4(w,Date.now()));if(U?.refresh?.mainRefreshLeaseUntil&&U.refresh.mainRefreshLeaseUntil>Date.now()&&U.refresh.mainRefreshLeaseTokenHash===H){N0("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:U.refresh.mainRefreshLeaseUntil});let u=await L(R);if(u)return u;throw Error("Claude OAuth refresh is already in progress")}let P=await yW({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!P){N0("[refresh] opencode main oauth refresh skipped file lock");let u=await L(R);if(u)return u;throw Error("Claude OAuth refresh is already in progress")}T=P.release,g=h4(),q=H,await m((u)=>{u.refresh=u.refresh??{},u.refresh.mainRefreshLeaseId=g??void 0,u.refresh.mainRefreshLeaseUntil=Date.now()+120000,u.refresh.mainRefreshLeaseTokenHash=H});let d=await k(N);if(N0("[refresh] opencode main oauth refresh lease acquired",{attempt:S,leaseUntil:Date.now()+120000}),d?.refresh?.mainRefreshLeaseId!==g||d.refresh.mainRefreshLeaseTokenHash!==H)throw Error("Claude OAuth refresh is already in progress");N0("[refresh] opencode main oauth refresh request start",{attempt:S});let C=await vW({refreshToken:R.refresh,maxRetries:0});return await W.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:C.refresh,access:C.access,expires:C.expires}}),await m((u)=>{if(!u?.refresh)return;if(u.refresh.mainLastRefreshError=void 0,u.refresh.mainRefreshLeaseId===g)u.refresh.mainRefreshLeaseId=void 0,u.refresh.mainRefreshLeaseUntil=void 0,u.refresh.mainRefreshLeaseTokenHash=void 0}),N0("[refresh] opencode main oauth refresh succeeded",{attempt:S,expiresInMs:C.expires-Date.now()}),C.access}catch(U){let H=U instanceof Error&&(U.message.includes("fetch failed")||("code"in U)&&(U.code==="ECONNRESET"||U.code==="ECONNREFUSED"||U.code==="ETIMEDOUT"||U.code==="UND_ERR_CONNECT_TIMEOUT"));if(S<2&&(H||(()=>{let P=U.status;return typeof P==="number"&&P>=500})()))continue;N0("[refresh] opencode main oauth refresh attempt failed",{attempt:S,error:U instanceof Error?U.message:String(U),transient:H});let w=R?.refresh;if(w&&U.isRefreshError)await m((P)=>{P.refresh=P.refresh??{},P.refresh.mainLastRefreshError=oW({error:U,now:Date.now(),refreshToken:w,previous:P.refresh.mainLastRefreshError})});throw U}finally{if(g)await m((U)=>{if(!U?.refresh)return;if(U.refresh.mainRefreshLeaseId===g&&U.refresh.mainRefreshLeaseTokenHash===q)U.refresh.mainRefreshLeaseId=void 0,U.refresh.mainRefreshLeaseUntil=void 0,U.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await T?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{X=null});return X}c0=Y,K(),F.seedFallbacksFromAccounts((E?.accounts??[]).filter($0));let M=await F7(N);if(await M0(M.freshStorage,{activeId:M.activeId,route:M.route,mainAccessToken:D.access,mainRefreshToken:D.refresh,routingAuthoritative:!1}),process.env.OPENCODE_ANTHROPIC_AUTH_DISABLE_PROFILE_HYDRATION!=="1")i0(E??T0(),D.access).then((z)=>{M0(z,{activeId:"main",route:"main",mainAccessToken:D.access,mainRefreshToken:D.refresh,routingAuthoritative:!1,useHydratedProfiles:!0})}).catch(()=>{});async function B0(z,Q){if(!z.body||z.status!==200)return Q?.mark("inspect_stream_skip",{status:z.status}),{response:z,rateLimited:!1};if(z.headers.get("x-cortexkit-relay-optimistic")==="true")return Q?.mark("inspect_stream_skip",{status:z.status,reason:"optimistic_relay"}),{response:z,rateLimited:!1};let g=y(),q=z.body.getReader(),T=[],m=new TextDecoder,L="",S=0;while(!L.includes(`
16
24
 
17
- `)&&b.length<65536){let{done:M,value:Y}=await S.read();if(M)break;if(w.push(Y),C+=Y.byteLength,b+=v.decode(Y,{stream:!0}),W0(b))break}if(W0(b)){await S.cancel().catch(()=>{});try{S.releaseLock()}catch{}let M=new ReadableStream({start(Y){for(let Q of w)Y.enqueue(Q);Y.close()}});return U?.mark("inspect_stream_first_event",{ms:s(f()-A),bytes:C,rateLimited:!0}),{response:new Response(M,{status:D.status,statusText:D.statusText,headers:D.headers}),rateLimited:!0}}let x=new ReadableStream({start(M){for(let Y of w)M.enqueue(Y)},async pull(M){let{done:Y,value:Q}=await S.read();if(Y){M.close();return}M.enqueue(Q)},cancel(M){return S.cancel(M)}});return U?.mark("inspect_stream_first_event",{ms:s(f()-A),bytes:C,rateLimited:!1}),{response:new Response(x,{status:D.status,statusText:D.statusText,headers:D.headers}),rateLimited:!1}}async function o0(D,U,A,S,w="api_fallback",v,b){if(b?.plan.downgraded)b.warmTarget=void 0,b.opusCacheAnchor=void 0;let C=f(),x=b1(D,U),M=x.get("x-session-affinity")||x.get("x-opencode-session"),Y=h(x);x.delete("x-parent-session-id"),x.delete("x-session-affinity"),x.delete("x-opencode-session");let Q=U?.body,H=typeof Q==="string"?Q.length:void 0;if(Q&&typeof Q==="string"){let j0=f(),J0=(()=>{if(!ON())return!1;try{return L1(JSON.parse(Q).model)}catch{return!1}})();if(Q=await MN(Q,{cache1hEnabled:!Y&&Y1(),cache1hMode:D1(),fastModeEnabled:J0,perf:(t,G0)=>S?.mark(`rewrite_body_${t}`,{route:w,...G0})}),n0(x,A),x.set("anthropic-beta",H1(x.get("anthropic-beta"),[])),J0)p1(x);S?.mark("rewrite_body",{route:w,ms:s(f()-j0),originalBytes:H,rewrittenBytes:Q.length,cacheEnabled:!Y&&Y1(),cacheMode:D1(),fastModeEnabled:J0,subagent:Y})}else n0(x,A);let p=HN(D,{baseURL:A.baseURL}),T=f(),m;try{m=await fetch(p.input,{...U,body:Q,headers:x,...CN()&&{tls:{rejectUnauthorized:!1}}})}catch(j0){if(typeof Q==="string")await T1({affinity:M,route:w,error:_4(j0),bodyText:Q,url:p.url?.toString()??d1(p.input),method:l1(D,U),headers:x});throw j0}if(typeof Q==="string")await T1({affinity:M,route:w,status:m.status,bodyText:Q,url:p.url?.toString()??d1(p.input),method:l1(D,U),headers:x});return S?.mark("send_headers_received",{route:w,ms:s(f()-T),status:m.status,relayConfigured:!1,totalSendWithAccessMs:s(f()-C),baseURL:A.baseURL}),m}async function r0(D,U,A,S,w="unknown",v,b="main",C){let x=f(),M=v,Y=async()=>{return M??=await q(J),M},Q=b1(D,U),H=Q.get("x-session-affinity")||Q.get("x-opencode-session"),p=h(Q);Q.delete("x-parent-session-id"),Q.delete("x-session-affinity"),Q.delete("x-opencode-session");let T=U?.body,m;if(T&&typeof T==="string"){let i=f();try{let g=JSON.parse(T);if(typeof g.model==="string")m=g.model}catch{}S?.mark("model_parse_for_identity",{route:w,ms:s(f()-i),bodyBytes:T.length})}let j0=f(),J0=await qN(A,m);S?.mark("resolve_claude_code_identity",{route:w,ms:s(f()-j0),hasAccountUuid:Boolean(J0.accountUuid)});let t=typeof T==="string"?T.length:void 0;if(T&&typeof T==="string"){let i=f(),g=(()=>{if(!ON())return!1;try{return L1(JSON.parse(T).model)}catch{return!1}})(),K0=!p&&Y1(),C0=D1(),F0=C?.plan.downgraded&&C.plan.standbyCacheAnchor?.oauthAccountId===b?C.plan.standbyCacheAnchor:void 0;if(T=await MN(T,{cache1hEnabled:K0,cache1hMode:C0,fastModeEnabled:g,identity:J0,hybridStandbyAnchor:F0,perf:(z0,A0)=>{if(S?.mark(`rewrite_body_${z0}`,{route:w,...A0}),z0==="cache_strategy"&&A0?.standbyBridgeApplied===!0&&C&&!C.standbyBridgeLogged)C.standbyBridgeLogged=!0,k.info("fable-fallback","restored standby Opus cache bridge",{session:C.plan.sessionId,distanceBlocks:A0?.standbyDistanceBlocks})}}),C?.plan.downgraded&&K0&&C0==="hybrid"){let z0=tW(T);C.opusCacheAnchor=z0?{...z0,oauthAccountId:b}:void 0}let u=f();try{M1(Q,A,{body:JSON.parse(T),identity:J0}),S?.mark("set_oauth_headers_body_parse",{route:w,ms:s(f()-u),bodyBytes:T.length,parsed:!0})}catch{M1(Q,A,{identity:J0}),S?.mark("set_oauth_headers_body_parse",{route:w,ms:s(f()-u),bodyBytes:T.length,parsed:!1})}if(g)p1(Q);S?.mark("rewrite_body",{route:w,ms:s(f()-i),originalBytes:t,rewrittenBytes:T.length,cacheEnabled:!p&&Y1(),cacheMode:D1(),fastModeEnabled:g,subagent:p})}let G0=HN(D);if(C&&typeof T==="string")C.warmTarget={url:G0.url?.toString()??G0.input.toString(),headers:new Headers(Q),bodyText:T,oauthAccountId:b};if(typeof T==="string"&&Y1()&&D1()==="hybrid"){let i=await Y();if(!p||E4(i)){let g=f(),K0=y0.track({sessionId:H,url:G0.url?.toString()??G0.input.toString(),headers:Q,bodyText:T,storage:i,cacheMode:"hybrid",oauthAccountId:b});S?.mark("cachekeep_track",{session:H,ms:s(f()-g),tracked:K0.tracked,reason:K0.tracked?void 0:K0.reason,bodyBytes:T.length})}}let P1=!1,k1=async()=>{P1=!0;try{let i=await fetch(G0.input,{...U,body:T,headers:Q,...CN()&&{tls:{rejectUnauthorized:!1}}});if(typeof T==="string")await T1({affinity:H,route:w,status:i.status,bodyText:T,url:G0.url?.toString()??d1(G0.input),method:l1(D,U),headers:Q});return i}catch(i){if(typeof T==="string")await T1({affinity:H,route:w,error:_4(i),bodyText:T,url:G0.url?.toString()??d1(G0.input),method:l1(D,U),headers:Q});throw i}},E=uN(await Y()),R={accountId:b,accessToken:A},c=f(),_0=await Kj({config:E,input:G0.input,init:U,headers:Q,body:T,fallback:k1,affinity:H,optimisticResponse:E?.transport==="websocket",onResponseHeaders:(i)=>L0(i,R)});if(S?.mark("send_headers_received",{route:w,ms:s(f()-c),status:_0.status,relayConfigured:E!=null,totalSendWithAccessMs:s(f()-x)}),P1)L0(_0.headers,R);return _0}async function bj(D){if(!D)return!1;try{return await I.refreshMain(D),R1(D)}catch{return!1}}async function w1(D,U={}){let A=await q0.getUsableFallbackAccounts(D,{modelId:U.modelId}),S=new Map(A.map((v)=>[v.id,v])),w=[];for(let v of D?.accounts??[]){if(N0(v)){let b=S.get(v.id);if(b)w.push(b);continue}if(U.includeApiRoutes===!0&&G1(v)&&v.enabled!==!1&&v.apiKey&&o1(v.baseURL))w.push(v)}if(!e0(D))return w;return w.filter((v)=>N0(v)?N1(f1(v),D,v.id,U.modelId):!0)}async function NW(D){let U=I.getMain(D.mainAccessToken),A=U?.quota;if(!V1(U?.quota,D.storage,Date.now(),D.requestedModelId))try{A=await I.refreshMain(D.mainAccessToken)}catch{}let S=await q0.getUsableFallbackAccounts(D.storage,{modelId:D.requestedModelId}),w=await q(J)??D.storage,v=new Map(S.map((Y)=>[Y.id,Y])),b=[];if(!X1(w?.refresh?.mainLastRefreshError))b.push({id:g0,access:D.mainAccessToken,quota:A,order:0});for(let[Y,Q]of(w?.accounts??[]).entries()){if(Q.enabled===!1||!N0(Q))continue;let H=v.get(Q.id)??Q;if(!H.access||X1(H.lastRefreshError))continue;let p=f1(H);if(!V1(p,w,Date.now(),D.requestedModelId))try{p=await I.refreshFallback(H.id,H.access)}catch{}b.push({id:H.id,access:H.access,quota:p,order:Y+1,account:H})}let C=new Set(b.flatMap((Y)=>{let Q=Y.id===g0?w?.refresh?.mainLastRefreshError:Y.account?.lastRefreshError;if(X1(Q))return[];if(V1(Y.quota,w,Date.now(),D.requestedModelId)&&ZN({quota:Y.quota,modelId:D.requestedModelId}).action==="migrate")return[];if(e0(w)&&!N1(Y.quota,w,Y.id===g0?void 0:Y.id,D.requestedModelId))return[];return[Y.id]})),x=new Set(S.map((Y)=>Y.id)),M=b.flatMap((Y)=>{if(!Y.quota)return[];let Q=Y.id===g0?void 0:Y.id;return F1(Y.quota,w)&&TN(Y.quota,D.requestedModelId)&&(!e0(w)||N1(Y.quota,w,Q,D.requestedModelId))&&(Y.id===g0||x.has(Y.id))?[{accountId:Y.id,quota:Y.quota,order:Y.order}]:[]});return{storage:w,allRoutes:b,candidates:M,retainAccountIds:C}}async function WW(D,U,A,S=!1){let w=new Headers(D.headers);if(w.set("retry-after",String(Qj(U,A))),S)return await D.body?.cancel().catch(()=>{}),w.set("content-type","application/json"),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:"Sticky OAuth account five-hour quota resets shortly; retaining session affinity."}}),{status:429,headers:w});return new Response(D.body,{status:D.status,statusText:D.statusText,headers:w})}async function U1(D,U,A,S,w,v,b){if(!A.length)return w??null;let C=b?.returnLastOnExhausted??!0;await w?.body?.cancel().catch(()=>{});let x=w??null;for(let[M,Y]of A.entries()){let Q;if(G1(Y)){if(!Y.apiKey)continue;Q=await o0(D,U,Y,v,`api_fallback_${M}`,S,b?.fableRequest)}else{let p=Y.access;if(!p)continue;Q=await r0(D,U,p,v,`fallback_${M}`,S,Y.id,b?.fableRequest)}x=Q;let H=a1(Q.status,S);if(!H){let p=await Q0(Q,v);Q=p.response,x=Q,H=p.rateLimited}if(!H){if(await q0.markUsed(Y),await b?.onSuccess?.(Y),N0(Y)&&Y.access&&I.shouldRefreshOnRequestCount(q1))I.refreshFallback(Y.id,Y.access).then(()=>b?.onSuccess?.(Y)).catch(()=>{});return Q}if(M<A.length-1||!C)await Q.body?.cancel().catch(()=>{})}return C?x:null}async function pj(D,U,A,S,w,v,b,C,x,M){if(!z(D,U?.body))return A;let Y=f(),Q=v??await q(J);if(w?.mark("fallback_load_storage",{ms:s(f()-Y),cached:!!v}),!(Q?.accounts??[]).some((t)=>t.enabled!==!1&&(N0(t)||G1(t)&&Boolean(t.apiKey)&&o1(t.baseURL))))return A;let p=A,T=a1(p.status,Q),m=eN(p,!1);if(!T){let t=await Q0(p,w);p=t.response,T=t.rateLimited,m=eN(p,t.rateLimited)}if(!T)return p;let j0=!1;if(S)j0=S.some(G1);else if(m)j0=await bj(b);let J0=S;if(!J0){let t=f();J0=await w1(Q,{includeApiRoutes:j0,modelId:x}),w?.mark("fallback_get_accounts",{ms:s(f()-t),accounts:J0.length})}if(e0(Q)){let t=J0.length;if(J0=J0.filter((G0)=>N0(G0)?N1(f1(G0),Q,G0.id,x):!0),J0.length<t)a("[killswitch] filtered fallbacks",{before:t,after:J0.length})}return await U1(D,U,J0,Q,p,w,{onSuccess:C,fableRequest:M})??p}return{apiKey:"",async fetch(D,U){let A=b1(D,U),S=A.get("x-session-affinity")||A.get("x-opencode-session"),w=d.plan(S,U?.body);if(w&&!w.downgraded){let E=h0.get(w.recoveryKey);if(E)await E,w=d.plan(S,U?.body)}let v=w?{plan:w}:void 0;if(w?.downgraded)U={...U,body:w.bodyText};let b=U?.body,C=W3({bodyBytes:typeof b==="string"?b.length:void 0}),x=(E)=>O4(E,{perf:(R,c)=>C.mark(R,c),contentFilterModel:w?.requestedModel,...!w?.downgraded&&w?{onContentFilter:()=>{if(!v?.warmTarget)return k.debug("fable-fallback","content filter recovery unavailable for non-OAuth route",{session:w.sessionId}),!1;let R=d.activate(w,v.warmTarget.oauthAccountId);k.info("fable-fallback","content filter detected; switching session to Opus 4.8",{session:w.sessionId,requestedModel:w.requestedModel,remaining:R}),DN({sessionId:w.sessionId,mode:"opus",remaining:R,requestedModelId:w.requestedModel},H,Y,Y3(w.requestedModel))}}:{},...w?.downgraded&&v?{onComplete:(R)=>{let c=d.complete(w,v.opusCacheAnchor);if(!c.counted)return;k.info("fable-fallback","Opus 4.8 turn completed",{session:w.sessionId,requestedModel:w.requestedModel,finishReason:R,remaining:c.remaining}),DN({sessionId:w.sessionId,mode:"opus",remaining:c.remaining,requestedModelId:w.requestedModel},H,Y);let _0=j1(v);if(c.remaining===0){let i=()=>{if(d.remaining(w)!==0)return;DN({sessionId:w.sessionId,mode:"fable",remaining:0,requestedModelId:w.requestedModel},H,Y,D3(w.requestedModel))};_0.then(i,i)}}}:{}}),M=f(),Y=await O();if(C.mark("get_auth",{ms:s(f()-M),authType:Y.type,hasAccess:Boolean(Y.access)}),Y.type!=="oauth"){let E=await fetch(D,U);return C.done("non_oauth_passthrough",{status:E.status}),E}await rN(Y.refresh);let Q=f(),H=await q();if(C.mark("load_storage",{ms:s(f()-Q)}),I.updateStorage(H),I.seedMainFromStorage(H,Y.access),I.seedFallbacksFromAccounts((H?.accounts??[]).filter(N0)),!w)Sj(S,H,Y);let p=z(D,U?.body),T=L(U?.body);if(p)q1++;if(p&&Y.access&&(!Y.expires||Y.expires>Date.now()))v1(H,Y.access);let m=(E,R)=>I0(H,{activeId:E,route:R,mainAccessToken:Y.access,mainRefreshToken:Y.refresh}),j0;if(p&&S&&_1(H)==="sticky-balanced"&&Y.access){let E=w?.effectiveModel??T,R=Uj(E),c=y0.trackedOAuthRoute(S),_0=w?.cacheAccountId??(c?c.oauthAccountId??g0:void 0),i=!1;try{let g=await NW({storage:H,mainAccessToken:Y.access,requestedModelId:E}),K0=(z0)=>D0.resolve({sessionId:S,family:R,modelId:E,candidates:g.candidates,retainAccountIds:g.retainAccountIds,storage:g.storage,inputBytes:typeof U?.body==="string"?Buffer.byteLength(U.body):1,preferredAccountId:_0,excludeAccountIds:z0}),C0=g.allRoutes.length===0||g.allRoutes.some((z0)=>!z0.quota||!V1(z0.quota,g.storage,Date.now(),E)),F0=await K0();if(!F0&&C0)throw Error("Sticky-balanced routing is waiting for current OAuth quota snapshots");let u=g.allRoutes.find((z0)=>z0.id===F0?.accountId);if(F0&&u){if(i=!0,w?.downgraded&&d.bindRecoveryAccount(w,u.id))k.info("fable-fallback","rebound recovery to migrated sticky account",{accountId:u.id});let z0=(e)=>r0(D,U,e.access,C,`sticky:${e.id}`,g.storage,e.id,v),A0=async(e,Y0,w0=!0)=>{if(w0&&e.account)await q0.markUsed(e.account);return m(e.id,"sticky-balanced"),C.done("return_sticky_balanced",{status:Y0.status,accountId:e.id,created:F0?.created,migrated:F0?.migrated}),x(Y0)},jW=async(e)=>{let Y0=e,w0=a1(e.status,g.storage),f0=!1;if(!w0){let i0=await Q0(e,C);Y0=i0.response,f0=i0.rateLimited,w0=i0.rateLimited}return{response:Y0,routeFailure:w0,streamingRateLimit:f0}},JW=V1(u.quota,g.storage,Date.now(),E)?ZN({quota:u.quota,modelId:E}):void 0;if(JW?.action==="hold")return A0(u,await WW(new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:"Sticky OAuth account five-hour quota resets shortly; retaining session affinity."}}),{status:429,headers:{"content-type":"application/json"}}),S,JW.retryAfterSeconds),!1);let X0=await jW(await z0(u)),_N=!1;if(!X0.routeFailure)return A0(u,X0.response);if(X0.response.status===401){let e=u.id;try{if(e===g0)Y.access=await G(),u={...u,access:Y.access};else if(u.account&&g.storage){let Y0=await q0.refreshAccount(u.account,g.storage,{force:!0});if(Y0.access)u={...u,access:Y0.access,account:Y0}}if(await X0.response.body?.cancel().catch(()=>{}),X0=await jW(await z0(u)),!X0.routeFailure)return A0(u,X0.response);_N=X0.response.status===401}catch(Y0){let w0=await q(J),f0=e===g0?w0?.refresh?.mainLastRefreshError:w0?.accounts.find((i0)=>i0.id===e&&N0(i0))?.lastRefreshError;if(!X1(f0))throw Y0;_N=!0}}let OW=X0.response.status===403||_N;if(X0.response.status===429||X0.streamingRateLimit){let e;try{e=u.id===g0?await I.refreshMain(u.access):await I.refreshFallback(u.id,u.access)}catch{e=void 0}let Y0=ZN({quota:e,modelId:E});if(C.mark("sticky_quota_failure",{accountId:u.id,action:Y0.action,reason:Y0.reason}),Y0.action==="hold")return A0(u,await WW(X0.response,S,Y0.retryAfterSeconds,X0.streamingRateLimit));OW=Y0.action==="migrate"}if(OW){let e=u.id;if(g=await NW({storage:g.storage,mainAccessToken:Y.access,requestedModelId:E}),g.candidates.filter((w0)=>w0.accountId!==e).length>0){await X0.response.body?.cancel().catch(()=>{}),F0=await K0(new Set([e]));let w0=g.allRoutes.find((f0)=>f0.id===F0?.accountId);if(F0&&w0){if(u=w0,w?.downgraded)d.bindRecoveryAccount(w,u.id);return A0(u,await z0(u))}}else if((X0.response.status===429||X0.streamingRateLimit)&&R1(Y.access)){let w0=(await w1(g.storage,{includeApiRoutes:!0,modelId:E})).filter(G1);if(w0.length>0){let f0=await U1(D,U,w0,g.storage,X0.response,C,{onSuccess:(i0)=>m(i0.id,"sticky-balanced"),fableRequest:v});if(f0)return C.done("return_sticky_api_fallback",{status:f0.status}),x(f0)}}}return A0(u,X0.response)}}catch(g){if(C.mark("sticky_balanced_error",{error:g instanceof Error?g.message:String(g)}),i)throw g;let K0=g instanceof Error?g:Error(String(g));throw Object.assign(K0,{code:"ECONNRESET",syscall:"sticky-routing"}),K0}}if(p&&_1(H)==="fallback-first")try{let E=f();j0=await w1(H,{includeApiRoutes:R1(Y.access),modelId:T}),C.mark("fallback_first_get_accounts",{ms:s(f()-E),accounts:j0.length});let R=await U1(D,U,j0,H,void 0,C,{returnLastOnExhausted:!1,onSuccess:(c)=>m(c.id,"fallback-first"),fableRequest:v});if(R)return C.done("return_fallback_first",{status:R.status}),x(R);j0=void 0}catch(E){C.mark("fallback_first_error",{error:E instanceof Error?E.message:String(E)})}if(!Y.access||!Y.expires||Y.expires<Date.now()){let R=(await q())?.refresh?.mainLastRefreshError;if(Y.refresh&&R&&t0(R,Y.refresh,Date.now()))throw a("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:R.nextRetryAt,retryCount:R.retryCount,expiresInMs:Y.expires?Y.expires-Date.now():void 0}),Error(FN(R,Date.now()));a("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(Y.access),expiresInMs:Y.expires?Y.expires-Date.now():void 0,expiredAgoMs:Y.expires&&Y.expires<Date.now()?Date.now()-Y.expires:void 0});let c=f();Y.access=await G(),C.mark("refresh_main_access",{ms:s(f()-c)})}if(!Y.access)throw C.done("missing_access_error"),Error("OAuth access token is missing after refresh");function J0(){if(H?.quota?.showToasts!==!0)return;let E=I.getMain();if(!E)return;let R=(H?.accounts??[]).filter((i)=>i.enabled!==!1&&N0(i)).map((i)=>({...i,quota:I.getFallback(i.id,i.access)?.quota??i.quota})),c=F1(E.quota,H),_0;if(c)_0="main";else _0=R.find((i)=>F1(i.quota,H))?.id??"main";mj(E.quota,R,_0)}if(p&&Z0(H))try{let E=f(),R=I.getMain(Y.access),c=R?.quota;if(!c)c=await I.refreshMain(Y.access),R=I.getMain(Y.access),J0();else if(I.needsRefresh(q1,T))if(VN(c)||xN(c,T))c=await I.refreshMain(Y.access),R=I.getMain(Y.access);else I.refreshMain(Y.access).then(()=>{u0().catch(()=>{}),J0()}).catch(()=>{});I0(H,{activeId:"main",route:"main",mainAccessToken:Y.access,mainRefreshToken:Y.refresh});let _0=F1(c,H)&&TN(c,T);if(C.mark("main_quota_for_routing",{ms:s(f()-E),passes:_0,model:T,modelScopedExhausted:xN(c,T)}),!_0){let i=f();j0=await w1(H,{includeApiRoutes:Boolean(R&&R.refreshAfter>Date.now()&&VN(R.quota)),modelId:T}),C.mark("preselect_fallback_accounts",{ms:s(f()-i),accounts:j0.length});let g=await U1(D,U,j0,H,void 0,C,{onSuccess:(K0)=>m(K0.id,"fallback"),fableRequest:v});if(g)return C.done("return_preselected_fallback",{status:g.status}),x(g)}}catch(E){C.mark("main_quota_for_routing_error",{error:E instanceof Error?E.message:String(E)})}let t=I.getMain(Y.access)?.quota;if(H?.quota?.failClosedOnUnknownQuota&&!t&&I.isBackedOff()){let E=I.getLastApiError(),R=E?q4(E,Date.now()):"Quota API unavailable";return a("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:E?.nextRetryAt,retryCount:E?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:R}}),{status:429,headers:{"content-type":"application/json","retry-after":String(E?.nextRetryAt?Math.max(1,Math.ceil((E.nextRetryAt-Date.now())/1000)):60)}})}if(e0(H)){if(I.needsRefresh(q1,T))try{let R=(H?.accounts??[]).filter((c)=>c.enabled!==!1&&N0(c)&&Boolean(c.access));await Promise.all([I.refreshMain(Y.access),I.refreshAllFallbacks(R)])}catch(R){a("[quota] killswitch refresh failed",{error:R instanceof Error?R.message:String(R),backedOff:I.isBackedOff()})}t=I.getMain(Y.access)?.quota}if(e0(H)&&!N1(t,H,void 0,T)){let R=z(D,U?.body)?await w1(H,{includeApiRoutes:R1(Y.access),modelId:T}):[];if(R.length>0){a("[route] skipping main (killswitch), trying fallbacks");let C0=await U1(D,U,R,H,void 0,C,{onSuccess:(F0)=>m(F0.id,"fallback")});if(C0)return C.done("return_killswitch_fallback",{status:C0.status}),x(C0)}let c=Date.now(),_0=(H?.accounts??[]).filter((C0)=>C0.enabled!==!1&&N0(C0)).map((C0)=>({...C0,quota:f1(C0)})),i=tJ({mainQuota:t,requestModelId:T,storage:H}),g=g4(t,_0,c,i.isScopedDriven?i.modelId:void 0),K0=aJ({retryAfterSeconds:g,...i.isScopedDriven&&{modelName:i.modelName}});return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:K0}}),{status:429,headers:{"content-type":"application/json","retry-after":String(g)}})}let G0=await r0(D,U,Y.access,C,"main",H,"main",v),P1=!1,k1=await pj(D,U,G0,j0,C,H,Y.access,(E)=>{P1=!0,m(E.id,"fallback")},T,v);if(!P1)m("main","main");return C.done("return_response",{status:k1.status}),x(k1)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let O=await c1("max");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async($)=>{return u1($,O.verifier,O.redirectUri,O.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let O=await c1("console");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async($)=>{let X=await u1($,O.verifier,O.redirectUri,O.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((G)=>G.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{tJ as resolveScopedDrivenBlock,aJ as formatKillswitchBlockMessage,p3 as AnthropicAuthPlugin};
25
+ `)&&L.length<65536){let{done:U,value:H}=await q.read();if(U)break;if(T.push(H),S+=H.byteLength,L+=m.decode(H,{stream:!0}),Z0(L))break}if(Z0(L)){await q.cancel().catch(()=>{});try{q.releaseLock()}catch{}let U=new ReadableStream({start(H){for(let w of T)H.enqueue(w);H.close()}});return Q?.mark("inspect_stream_first_event",{ms:j0(y()-g),bytes:S,rateLimited:!0}),{response:new Response(U,{status:z.status,statusText:z.statusText,headers:z.headers}),rateLimited:!0}}let R=new ReadableStream({start(U){for(let H of T)U.enqueue(H)},async pull(U){let{done:H,value:w}=await q.read();if(H){U.close();return}U.enqueue(w)},cancel(U){return q.cancel(U)}});return Q?.mark("inspect_stream_first_event",{ms:j0(y()-g),bytes:S,rateLimited:!1}),{response:new Response(R,{status:z.status,statusText:z.statusText,headers:z.headers}),rateLimited:!1}}async function e0(z,Q,g,q,T="api_fallback",m,L){if(L?.plan.downgraded)L.warmTarget=void 0,L.opusCacheAnchor=void 0;let S=y(),R=t1(z,Q),U=R.get("x-session-affinity")||R.get("x-opencode-session"),H=b(R);R.delete("x-parent-session-id"),R.delete("x-session-affinity"),R.delete("x-opencode-session");let w=Q?.body,P=typeof w==="string"?w.length:void 0;if(w&&typeof w==="string"){let z0=y(),o=(()=>{if(!U4())return!1;try{return A1(JSON.parse(w).model)}catch{return!1}})();if(w=await k4(w,{cache1hEnabled:!H&&Q1(),cache1hMode:w1(),fastModeEnabled:o,perf:(e,W0)=>q?.mark(`rewrite_body_${e}`,{route:T,...W0})}),a0(R,g),R.set("anthropic-beta",q1(R.get("anthropic-beta"),[])),o)a1(R);q?.mark("rewrite_body",{route:T,ms:j0(y()-z0),originalBytes:P,rewrittenBytes:w.length,cacheEnabled:!H&&Q1(),cacheMode:w1(),fastModeEnabled:o,subagent:H})}else a0(R,g);let d=v4(z,{baseURL:g.baseURL}),C=y(),u;try{u=await fetch(d.input,{...Q,body:w,headers:R,...f4()&&{tls:{rejectUnauthorized:!1}}})}catch(z0){if(typeof w==="string")await h1({affinity:U,route:T,error:qW(z0),bodyText:w,url:d.url?.toString()??j4(d.input),method:W4(z,Q),headers:R});throw z0}if(typeof w==="string")await h1({affinity:U,route:T,status:u.status,bodyText:w,url:d.url?.toString()??j4(d.input),method:W4(z,Q),headers:R});return q?.mark("send_headers_received",{route:T,ms:j0(y()-C),status:u.status,relayConfigured:!1,totalSendWithAccessMs:j0(y()-S),baseURL:g.baseURL}),u}async function j1(z,Q,g,q,T="unknown",m,L="main",S){let R=y(),U=m,H=async()=>{return U??=await k(N),U},w=t1(z,Q),P=w.get("x-session-affinity")||w.get("x-opencode-session"),d=b(w);w.delete("x-parent-session-id"),w.delete("x-session-affinity"),w.delete("x-opencode-session");let C=Q?.body,u;if(C&&typeof C==="string"){let x=y();try{let p=JSON.parse(C);if(typeof p.model==="string")u=p.model}catch{}q?.mark("model_parse_for_identity",{route:T,ms:j0(y()-x),bodyBytes:C.length})}let z0=y(),o=await l4(g,u);q?.mark("resolve_claude_code_identity",{route:T,ms:j0(y()-z0),hasAccountUuid:Boolean(o.accountUuid)});let e=typeof C==="string"?C.length:void 0;if(C&&typeof C==="string"){let x=y(),p=(()=>{if(!U4())return!1;try{return A1(JSON.parse(C).model)}catch{return!1}})(),D0=!d&&Q1(),J0=w1(),i=S?.plan.downgraded&&S.plan.standbyCacheAnchor?.oauthAccountId===L?S.plan.standbyCacheAnchor:void 0;if(C=await k4(C,{cache1hEnabled:D0,cache1hMode:J0,fastModeEnabled:p,identity:o,hybridStandbyAnchor:i,serverSideFallbackEnabled:v==="server",perf:(Q0,I0)=>{if(q?.mark(`rewrite_body_${Q0}`,{route:T,...I0}),Q0==="cache_strategy"&&I0?.standbyBridgeApplied===!0&&S&&!S.standbyBridgeLogged)S.standbyBridgeLogged=!0,h.info("fable-fallback","restored standby Opus cache bridge",{session:S.plan.sessionId,distanceBlocks:I0?.standbyDistanceBlocks})}}),S?.plan.downgraded&&D0&&J0==="hybrid"){let Q0=PW(C);S.opusCacheAnchor=Q0?{...Q0,oauthAccountId:L}:void 0}let S0=y();try{f1(w,g,{body:JSON.parse(C),identity:o}),q?.mark("set_oauth_headers_body_parse",{route:T,ms:j0(y()-S0),bodyBytes:C.length,parsed:!0})}catch{f1(w,g,{identity:o}),q?.mark("set_oauth_headers_body_parse",{route:T,ms:j0(y()-S0),bodyBytes:C.length,parsed:!1})}if(p)a1(w);q?.mark("rewrite_body",{route:T,ms:j0(y()-x),originalBytes:e,rewrittenBytes:C.length,cacheEnabled:!d&&Q1(),cacheMode:w1(),fastModeEnabled:p,subagent:d})}let W0=v4(z);if(S&&typeof C==="string")S.warmTarget={url:W0.url?.toString()??W0.input.toString(),headers:new Headers(w),bodyText:C,oauthAccountId:L};if(typeof C==="string"&&Q1()&&w1()==="hybrid"){let x=await H();if(!d||uW(x)){let p=y(),D0=p0.track({sessionId:P,url:W0.url?.toString()??W0.input.toString(),headers:w,bodyText:C,storage:x,cacheMode:"hybrid",oauthAccountId:L});q?.mark("cachekeep_track",{session:P,ms:j0(y()-p),tracked:D0.tracked,reason:D0.tracked?void 0:D0.reason,bodyBytes:C.length})}}let M1=!1,W1=async()=>{M1=!0;try{let x=await fetch(W0.input,{...Q,body:C,headers:w,...f4()&&{tls:{rejectUnauthorized:!1}}});if(typeof C==="string")await h1({affinity:P,route:T,status:x.status,bodyText:C,url:W0.url?.toString()??j4(W0.input),method:W4(z,Q),headers:w});return x}catch(x){if(typeof C==="string")await h1({affinity:P,route:T,error:qW(x),bodyText:C,url:W0.url?.toString()??j4(W0.input),method:W4(z,Q),headers:w});throw x}},x1=$j(await H()),F1={accountId:L,accessToken:g},d1=y(),A=await AJ({config:x1,input:W0.input,init:Q,headers:w,body:C,fallback:W1,affinity:P,optimisticResponse:x1?.transport==="websocket",onResponseHeaders:(x)=>v0(x,F1)});if(q?.mark("send_headers_received",{route:T,ms:j0(y()-d1),status:A.status,relayConfigured:x1!=null,totalSendWithAccessMs:j0(y()-R)}),M1)v0(A.headers,F1);return A}async function Y3(z){if(!z)return!1;try{return await F.refreshMain(z),l1(z)}catch{return!1}}async function I1(z,Q={}){let g=await H0.getUsableFallbackAccounts(z,{modelId:Q.modelId}),q=new Map(g.map((m)=>[m.id,m])),T=[];for(let m of z?.accounts??[]){if($0(m)){let L=q.get(m.id);if(L)T.push(L);continue}if(Q.includeApiRoutes===!0&&U1(m)&&m.enabled!==!1&&m.apiKey&&$4(m.baseURL))T.push(m)}if(!$1(z))return T;return T.filter((m)=>$0(m)?Z1(c1(m),z,m.id,Q.modelId):!0)}async function _j(z){let Q=F.getMain(z.mainAccessToken),g=Q?.quota;if(!H1(Q?.quota,z.storage,Date.now(),z.requestedModelId))try{g=await F.refreshMain(z.mainAccessToken)}catch{}let q=await H0.getUsableFallbackAccounts(z.storage,{modelId:z.requestedModelId}),T=await k(N)??z.storage,m=new Map(q.map((H)=>[H.id,H])),L=[];if(!P1(T?.refresh?.mainLastRefreshError))L.push({id:b0,access:z.mainAccessToken,quota:g,order:0});for(let[H,w]of(T?.accounts??[]).entries()){if(w.enabled===!1||!$0(w))continue;let P=m.get(w.id)??w;if(!P.access||P1(P.lastRefreshError))continue;let d=c1(P);if(!H1(d,T,Date.now(),z.requestedModelId))try{d=await F.refreshFallback(P.id,P.access)}catch{}L.push({id:P.id,access:P.access,quota:d,order:H+1,account:P})}let S=new Set(L.flatMap((H)=>{let w=H.id===b0?T?.refresh?.mainLastRefreshError:H.account?.lastRefreshError;if(P1(w))return[];if(H1(H.quota,T,Date.now(),z.requestedModelId)&&Q4({quota:H.quota,modelId:z.requestedModelId}).action==="migrate")return[];if($1(T)&&!Z1(H.quota,T,H.id===b0?void 0:H.id,z.requestedModelId))return[];return[H.id]})),R=new Set(q.map((H)=>H.id)),U=L.flatMap((H)=>{if(!H.quota)return[];let w=H.id===b0?void 0:H.id;return k1(H.quota,T)&&b4(H.quota,z.requestedModelId)&&(!$1(T)||Z1(H.quota,T,w,z.requestedModelId))&&(H.id===b0||R.has(H.id))?[{accountId:H.id,quota:H.quota,order:H.order}]:[]});return{storage:T,allRoutes:L,candidates:U,retainAccountIds:S}}async function Uj(z,Q,g,q=!1){let T=new Headers(z.headers);if(T.set("retry-after",String(gJ(Q,g))),q)return await z.body?.cancel().catch(()=>{}),T.set("content-type","application/json"),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:"Sticky OAuth account five-hour quota resets shortly; retaining session affinity."}}),{status:429,headers:T});return new Response(z.body,{status:z.status,statusText:z.statusText,headers:T})}async function T1(z,Q,g,q,T,m,L){if(!g.length)return T??null;let S=L?.returnLastOnExhausted??!0;await T?.body?.cancel().catch(()=>{});let R=T??null;for(let[U,H]of g.entries()){let w;if(U1(H)){if(!H.apiKey)continue;w=await e0(z,Q,H,m,`api_fallback_${U}`,q,L?.fableRequest)}else{let d=H.access;if(!d)continue;w=await j1(z,Q,d,m,`fallback_${U}`,q,H.id,L?.fableRequest)}R=w;let P=D4(w.status,q);if(!P){let d=await B0(w,m);w=d.response,R=w,P=d.rateLimited}if(!P){if(await H0.markUsed(H),await L?.onSuccess?.(H),$0(H)&&H.access&&F.shouldRefreshOnRequestCount(b1))F.refreshFallback(H.id,H.access).then(()=>L?.onSuccess?.(H)).catch(()=>{});return w}if(U<g.length-1||!S)await w.body?.cancel().catch(()=>{})}return S?R:null}async function D3(z,Q,g,q,T,m,L,S,R,U){if(!_(z,Q?.body))return g;let H=y(),w=m??await k(N);if(T?.mark("fallback_load_storage",{ms:j0(y()-H),cached:!!m}),!(w?.accounts??[]).some((e)=>e.enabled!==!1&&($0(e)||U1(e)&&Boolean(e.apiKey)&&$4(e.baseURL))))return g;let d=g,C=D4(d.status,w),u=Kj(d,!1);if(!C){let e=await B0(d,T);d=e.response,C=e.rateLimited,u=Kj(d,e.rateLimited)}if(!C)return d;let z0=!1;if(q)z0=q.some(U1);else if(u)z0=await Y3(L);let o=q;if(!o){let e=y();o=await I1(w,{includeApiRoutes:z0,modelId:R}),T?.mark("fallback_get_accounts",{ms:j0(y()-e),accounts:o.length})}if($1(w)){let e=o.length;if(o=o.filter((W0)=>$0(W0)?Z1(c1(W0),w,W0.id,R):!0),o.length<e)N0("[killswitch] filtered fallbacks",{before:e,after:o.length})}return await T1(z,Q,o,w,d,T,{onSuccess:S,fableRequest:U})??d}return{apiKey:"",async fetch(z,Q){let g=t1(z,Q),q=g.get("x-session-affinity")||g.get("x-opencode-session"),T=I(Q?.body),m=v==="server"&&X1(T)?T:void 0,L=n.plan(q,Q?.body);if(v==="legacy"&&L&&!L.downgraded){let A=r0.get(L.recoveryKey);if(A)await A,L=n.plan(q,Q?.body)}let S=L?{plan:L}:void 0;if(v==="legacy"&&L?.downgraded)Q={...Q,body:L.bodyText};let R=Q?.body,U=f7({bodyBytes:typeof R==="string"?R.length:void 0}),H=(A)=>BW(A,{perf:(x,p)=>U.mark(x,p),contentFilterModel:L?.requestedModel,...v==="legacy"&&!L?.downgraded&&L?{onContentFilter:()=>{if(!S?.warmTarget)return h.debug("fable-fallback","content filter recovery unavailable for non-OAuth route",{session:L.sessionId}),!1;let x=n.activate(L,S.warmTarget.oauthAccountId);h.info("fable-fallback","content filter detected; switching session to Opus 4.8",{session:L.sessionId,requestedModel:L.requestedModel,remaining:x}),B1({sessionId:L.sessionId,mode:"opus",remaining:x,requestedModelId:L.requestedModel},C,P,b7(L.requestedModel))}}:{},...v==="legacy"&&L?.downgraded&&S?{onComplete:(x)=>{let p=n.complete(L,S.opusCacheAnchor);if(!p.counted)return;h.info("fable-fallback","Opus 4.8 turn completed",{session:L.sessionId,requestedModel:L.requestedModel,finishReason:x,remaining:p.remaining}),B1({sessionId:L.sessionId,mode:"opus",remaining:p.remaining,requestedModelId:L.requestedModel},C,P);let D0=C4(S);if(p.remaining===0){let J0=()=>{if(n.remaining(L)!==0)return;B1({sessionId:L.sessionId,mode:"fable",remaining:0,requestedModelId:L.requestedModel},C,P,p7(L.requestedModel))};D0.then(J0,J0)}}}:{},...m?{serverSideFallbackModel:m,...L?{onServerSideFallbackOutcome:(x)=>rJ(L,x,C,P)}:{}}:{}}),w=y(),P=await O();if(U.mark("get_auth",{ms:j0(y()-w),authType:P.type,hasAccess:Boolean(P.access)}),P.type!=="oauth"){let A=await fetch(z,Q);return U.done("non_oauth_passthrough",{status:A.status}),A}await Gj(P.refresh);let d=y(),C=await k();U.mark("load_storage",{ms:j0(y()-d)}),F.updateStorage(C),F.seedMainFromStorage(C,P.access),F.seedFallbacksFromAccounts((C?.accounts??[]).filter($0));let u=q?P0.get(q):void 0;if(!L||v==="server"&&u?.requestedModelId&&y0(u.requestedModelId)!==y0(L.requestedModel))sJ(q,C,P);let z0=_(z,Q?.body),o=I(Q?.body);if(z0)b1++;if(z0&&P.access&&(!P.expires||P.expires>Date.now()))lJ(C,P.access);let e=(A,x)=>M0(C,{activeId:A,route:x,mainAccessToken:P.access,mainRefreshToken:P.refresh}),W0;if(z0&&q&&C1(C)==="sticky-balanced"&&P.access){let A=L?.effectiveModel??o,x=RJ(A),p=p0.trackedOAuthRoute(q),D0=L?.cacheAccountId??(p?p.oauthAccountId??b0:void 0),J0=!1;try{let i=await _j({storage:C,mainAccessToken:P.access,requestedModelId:A}),S0=(g0)=>w0.resolve({sessionId:q,family:x,modelId:A,candidates:i.candidates,retainAccountIds:i.retainAccountIds,storage:i.storage,inputBytes:typeof Q?.body==="string"?Buffer.byteLength(Q.body):1,preferredAccountId:D0,excludeAccountIds:g0}),Q0=i.allRoutes.length===0||i.allRoutes.some((g0)=>!g0.quota||!H1(g0.quota,i.storage,Date.now(),A)),I0=await S0();if(!I0&&Q0)throw Error("Sticky-balanced routing is waiting for current OAuth quota snapshots");let s=i.allRoutes.find((g0)=>g0.id===I0?.accountId);if(I0&&s){if(J0=!0,L?.downgraded&&n.bindRecoveryAccount(L,s.id))h.info("fable-fallback","rebound recovery to migrated sticky account",{accountId:s.id});let g0=(O0)=>j1(z,Q,O0.access,U,`sticky:${O0.id}`,i.storage,O0.id,S),G1=async(O0,_0,C0=!0)=>{if(C0&&O0.account)await H0.markUsed(O0.account);return e(O0.id,"sticky-balanced"),U.done("return_sticky_balanced",{status:_0.status,accountId:O0.id,created:I0?.created,migrated:I0?.migrated}),H(_0)},Pj=async(O0)=>{let _0=O0,C0=D4(O0.status,i.storage),h0=!1;if(!C0){let l0=await B0(O0,U);_0=l0.response,h0=l0.rateLimited,C0=l0.rateLimited}return{response:_0,routeFailure:C0,streamingRateLimit:h0}},Qj=H1(s.quota,i.storage,Date.now(),A)?Q4({quota:s.quota,modelId:A}):void 0;if(Qj?.action==="hold")return G1(s,await Uj(new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:"Sticky OAuth account five-hour quota resets shortly; retaining session affinity."}}),{status:429,headers:{"content-type":"application/json"}}),q,Qj.retryAfterSeconds),!1);let K0=await Pj(await g0(s)),M4=!1;if(!K0.routeFailure)return G1(s,K0.response);if(K0.response.status===401){let O0=s.id;try{if(O0===b0)P.access=await Y(),s={...s,access:P.access};else if(s.account&&i.storage){let _0=await H0.refreshAccount(s.account,i.storage,{force:!0});if(_0.access)s={...s,access:_0.access,account:_0}}if(await K0.response.body?.cancel().catch(()=>{}),K0=await Pj(await g0(s)),!K0.routeFailure)return G1(s,K0.response);M4=K0.response.status===401}catch(_0){let C0=await k(N),h0=O0===b0?C0?.refresh?.mainLastRefreshError:C0?.accounts.find((l0)=>l0.id===O0&&$0(l0))?.lastRefreshError;if(!P1(h0))throw _0;M4=!0}}let wj=K0.response.status===403||M4;if(K0.response.status===429||K0.streamingRateLimit){let O0;try{O0=s.id===b0?await F.refreshMain(s.access):await F.refreshFallback(s.id,s.access)}catch{O0=void 0}let _0=Q4({quota:O0,modelId:A});if(U.mark("sticky_quota_failure",{accountId:s.id,action:_0.action,reason:_0.reason}),_0.action==="hold")return G1(s,await Uj(K0.response,q,_0.retryAfterSeconds,K0.streamingRateLimit));wj=_0.action==="migrate"}if(wj){let O0=s.id;if(i=await _j({storage:i.storage,mainAccessToken:P.access,requestedModelId:A}),i.candidates.filter((C0)=>C0.accountId!==O0).length>0){await K0.response.body?.cancel().catch(()=>{}),I0=await S0(new Set([O0]));let C0=i.allRoutes.find((h0)=>h0.id===I0?.accountId);if(I0&&C0){if(s=C0,L?.downgraded)n.bindRecoveryAccount(L,s.id);return G1(s,await g0(s))}}else if((K0.response.status===429||K0.streamingRateLimit)&&l1(P.access)){let C0=(await I1(i.storage,{includeApiRoutes:!0,modelId:A})).filter(U1);if(C0.length>0){let h0=await T1(z,Q,C0,i.storage,K0.response,U,{onSuccess:(l0)=>e(l0.id,"sticky-balanced"),fableRequest:S});if(h0)return U.done("return_sticky_api_fallback",{status:h0.status}),H(h0)}}}return G1(s,K0.response)}}catch(i){if(U.mark("sticky_balanced_error",{error:i instanceof Error?i.message:String(i)}),J0)throw i;let S0=i instanceof Error?i:Error(String(i));throw Object.assign(S0,{code:"ECONNRESET",syscall:"sticky-routing"}),S0}}if(z0&&C1(C)==="fallback-first")try{let A=y();W0=await I1(C,{includeApiRoutes:l1(P.access),modelId:o}),U.mark("fallback_first_get_accounts",{ms:j0(y()-A),accounts:W0.length});let x=await T1(z,Q,W0,C,void 0,U,{returnLastOnExhausted:!1,onSuccess:(p)=>e(p.id,"fallback-first"),fableRequest:S});if(x)return U.done("return_fallback_first",{status:x.status}),H(x);W0=void 0}catch(A){U.mark("fallback_first_error",{error:A instanceof Error?A.message:String(A)})}if(!P.access||!P.expires||P.expires<Date.now()){let x=(await k())?.refresh?.mainLastRefreshError;if(P.refresh&&x&&O1(x,P.refresh,Date.now()))throw N0("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:x.nextRetryAt,retryCount:x.retryCount,expiresInMs:P.expires?P.expires-Date.now():void 0}),Error(y4(x,Date.now()));N0("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(P.access),expiresInMs:P.expires?P.expires-Date.now():void 0,expiredAgoMs:P.expires&&P.expires<Date.now()?Date.now()-P.expires:void 0});let p=y();P.access=await Y(),U.mark("refresh_main_access",{ms:j0(y()-p)})}if(!P.access)throw U.done("missing_access_error"),Error("OAuth access token is missing after refresh");function M1(){if(C?.quota?.showToasts!==!0)return;let A=F.getMain();if(!A)return;let x=(C?.accounts??[]).filter((J0)=>J0.enabled!==!1&&$0(J0)).map((J0)=>({...J0,quota:F.getFallback(J0.id,J0.access)?.quota??J0.quota})),p=k1(A.quota,C),D0;if(p)D0="main";else D0=x.find((J0)=>k1(J0.quota,C))?.id??"main";Z3(A.quota,x,D0)}if(z0&&V0(C))try{let A=y(),x=F.getMain(P.access),p=x?.quota;if(!p)p=await F.refreshMain(P.access),x=F.getMain(P.access),M1();else if(F.needsRefresh(b1,o))if(T4(p)||m4(p,o))p=await F.refreshMain(P.access),x=F.getMain(P.access);else F.refreshMain(P.access).then(()=>{t0().catch(()=>{}),M1()}).catch(()=>{});M0(C,{activeId:"main",route:"main",mainAccessToken:P.access,mainRefreshToken:P.refresh});let D0=k1(p,C)&&b4(p,o);if(U.mark("main_quota_for_routing",{ms:j0(y()-A),passes:D0,model:o,modelScopedExhausted:m4(p,o)}),!D0){let J0=y();W0=await I1(C,{includeApiRoutes:Boolean(x&&x.refreshAfter>Date.now()&&T4(x.quota)),modelId:o}),U.mark("preselect_fallback_accounts",{ms:j0(y()-J0),accounts:W0.length});let i=await T1(z,Q,W0,C,void 0,U,{onSuccess:(S0)=>e(S0.id,"fallback"),fableRequest:S});if(i)return U.done("return_preselected_fallback",{status:i.status}),H(i)}}catch(A){U.mark("main_quota_for_routing_error",{error:A instanceof Error?A.message:String(A)})}let W1=F.getMain(P.access)?.quota;if(C?.quota?.failClosedOnUnknownQuota&&!W1&&F.isBackedOff()){let A=F.getLastApiError(),x=A?rW(A,Date.now()):"Quota API unavailable";return N0("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:A?.nextRetryAt,retryCount:A?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:x}}),{status:429,headers:{"content-type":"application/json","retry-after":String(A?.nextRetryAt?Math.max(1,Math.ceil((A.nextRetryAt-Date.now())/1000)):60)}})}if($1(C)){if(F.needsRefresh(b1,o))try{let x=(C?.accounts??[]).filter((p)=>p.enabled!==!1&&$0(p)&&Boolean(p.access));await Promise.all([F.refreshMain(P.access),F.refreshAllFallbacks(x)])}catch(x){N0("[quota] killswitch refresh failed",{error:x instanceof Error?x.message:String(x),backedOff:F.isBackedOff()})}W1=F.getMain(P.access)?.quota}if($1(C)&&!Z1(W1,C,void 0,o)){let x=_(z,Q?.body)?await I1(C,{includeApiRoutes:l1(P.access),modelId:o}):[];if(x.length>0){N0("[route] skipping main (killswitch), trying fallbacks");let Q0=await T1(z,Q,x,C,void 0,U,{onSuccess:(I0)=>e(I0.id,"fallback")});if(Q0)return U.done("return_killswitch_fallback",{status:Q0.status}),H(Q0)}let p=Date.now(),D0=(C?.accounts??[]).filter((Q0)=>Q0.enabled!==!1&&$0(Q0)).map((Q0)=>({...Q0,quota:c1(Q0)})),J0=S7({mainQuota:W1,requestModelId:o,storage:C}),i=jJ(W1,D0,p,J0.isScopedDriven?J0.modelId:void 0),S0=E7({retryAfterSeconds:i,...J0.isScopedDriven&&{modelName:J0.modelName}});return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:S0}}),{status:429,headers:{"content-type":"application/json","retry-after":String(i)}})}let x1=await j1(z,Q,P.access,U,"main",C,"main",S),F1=!1,d1=await D3(z,Q,x1,W0,U,C,P.access,(A)=>{F1=!0,e(A.id,"fallback")},o,S);if(!F1)e("main","main");return U.done("return_response",{status:d1.status}),H(d1)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let O=await J4("max");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async($)=>{return N4($,O.verifier,O.redirectUri,O.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let O=await J4("console");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async($)=>{let D=await N4($,O.verifier,O.redirectUri,O.state);if(D.type==="failed")return D;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 ${D.access}`}}).then((Y)=>Y.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{S7 as resolveScopedDrivenBlock,E7 as formatKillswitchBlockMessage,TN as AnthropicAuthPlugin};
@@ -0,0 +1,25 @@
1
+ export declare const SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
2
+ export declare const SERVER_FALLBACK_MARKER_TEXT = "\u2060";
3
+ export declare const SERVER_FALLBACK_SIGNATURE_PREFIX = "cortexkit-server-fallback-v1:";
4
+ export type ContentFilterFallbackMode = 'server' | 'legacy';
5
+ export type ServerSideFallbackOutcome = {
6
+ requestedModel: string;
7
+ servedModel?: string;
8
+ targetModel?: string;
9
+ fallback: boolean;
10
+ handoff: boolean;
11
+ stopReason: string;
12
+ };
13
+ export declare function resolveContentFilterFallbackMode(value: string | undefined): ContentFilterFallbackMode;
14
+ export declare function applyServerSideFallbackToBody(body: Record<string, unknown>, requested: boolean): {
15
+ enabled: boolean;
16
+ restoredMarkers: number;
17
+ droppedMarkers: number;
18
+ };
19
+ export declare function createServerSideFallbackStreamRewriter(options: {
20
+ requestedModel: string;
21
+ onOutcome?: (outcome: ServerSideFallbackOutcome) => void;
22
+ }): {
23
+ push(text: string): string;
24
+ flush(): string;
25
+ };
@@ -41,7 +41,7 @@ export interface SidebarAccountState {
41
41
  }
42
42
  export interface FableRecoverySidebarState {
43
43
  sessionId: string;
44
- mode: 'opus' | 'fable';
44
+ mode: 'opus' | 'fable' | 'server';
45
45
  remaining: number;
46
46
  changedAt: number;
47
47
  /**
@@ -50,6 +50,8 @@ export interface FableRecoverySidebarState {
50
50
  * state files; older recoveries default to Fable 5 in the summary.
51
51
  */
52
52
  requestedModelId?: string;
53
+ /** Anthropic-selected target while server-side safety fallback is active. */
54
+ targetModelId?: string;
53
55
  }
54
56
  export interface SidebarState {
55
57
  main: {
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r}from"./index-xjvcfyt6.js";import"./index-h0pmqm96.js";import"./index-1ets4bf8.js";import"./index-9aeag0wm.js";export{i as setSidebarState,k as resolveActiveAccount,c as normalizeSidebarState,a as getSidebarStateFile,h as getSidebarState,f as getInitialSidebarRoutingTestHooks,n as getFableRecoverySummary,o as getCollapsedQuotaSummary,l as formatScopedQuotaLabel,m as formatFallbackModelLabel,j as drainSidebarWrites,r as computeQuotaPacing,d as __setSidebarStateWriteTestHooks,e as __setInitialSidebarRoutingTestHooks,g as __acquireSidebarStateLockForTest,q as SEVEN_DAY_MS,p as FIVE_HOUR_MS,b as DEFAULT_SIDEBAR_STATE};
1
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r}from"./index-szybnfvk.js";import"./index-h0pmqm96.js";import"./index-1ets4bf8.js";import"./index-9aeag0wm.js";export{i as setSidebarState,k as resolveActiveAccount,c as normalizeSidebarState,a as getSidebarStateFile,h as getSidebarState,f as getInitialSidebarRoutingTestHooks,n as getFableRecoverySummary,o as getCollapsedQuotaSummary,l as formatScopedQuotaLabel,m as formatFallbackModelLabel,j as drainSidebarWrites,r as computeQuotaPacing,d as __setSidebarStateWriteTestHooks,e as __setInitialSidebarRoutingTestHooks,g as __acquireSidebarStateLockForTest,q as SEVEN_DAY_MS,p as FIVE_HOUR_MS,b as DEFAULT_SIDEBAR_STATE};
@@ -1,4 +1,5 @@
1
1
  import { type Cache1hMode, type ClaudeCodeIdentity } from '@cortexkit/anthropic-auth-core';
2
+ import { type ServerSideFallbackOutcome } from './server-fallback';
2
3
  export type FetchInput = string | URL | Request;
3
4
  /**
4
5
  * Merge headers from a Request object and/or a RequestInit headers value
@@ -84,6 +85,7 @@ export declare function rewriteRequestBody(body: string, options?: {
84
85
  identity?: ClaudeCodeIdentity;
85
86
  perf?: RewritePerfCallback;
86
87
  hybridStandbyAnchor?: HybridMessageCacheAnchor;
88
+ serverSideFallbackEnabled?: boolean;
87
89
  }): Promise<string>;
88
90
  /**
89
91
  * Create a streaming response that strips the tool prefix from tool names.
@@ -93,5 +95,7 @@ export declare function createStrippedStream(response: Response, options?: {
93
95
  onContentFilter?: () => boolean | undefined;
94
96
  onComplete?: (finishReason: string) => void;
95
97
  contentFilterModel?: unknown;
98
+ serverSideFallbackModel?: string;
99
+ onServerSideFallbackOutcome?: (outcome: ServerSideFallbackOutcome) => void;
96
100
  }): Response;
97
101
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-anthropic-auth",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -61,7 +61,7 @@
61
61
  "@opencode-ai/plugin": "*"
62
62
  },
63
63
  "dependencies": {
64
- "@cortexkit/anthropic-auth-core": "1.18.0",
64
+ "@cortexkit/anthropic-auth-core": "1.19.0",
65
65
  "@opentui/core": "0.4.3",
66
66
  "@opentui/solid": "0.4.3",
67
67
  "jsonc-parser": "^3.3.1",
@@ -39,7 +39,7 @@ export interface SidebarAccountState {
39
39
 
40
40
  export interface FableRecoverySidebarState {
41
41
  sessionId: string
42
- mode: 'opus' | 'fable'
42
+ mode: 'opus' | 'fable' | 'server'
43
43
  remaining: number
44
44
  changedAt: number
45
45
  /**
@@ -48,6 +48,8 @@ export interface FableRecoverySidebarState {
48
48
  * state files; older recoveries default to Fable 5 in the summary.
49
49
  */
50
50
  requestedModelId?: string
51
+ /** Anthropic-selected target while server-side safety fallback is active. */
52
+ targetModelId?: string
51
53
  }
52
54
 
53
55
  export interface SidebarState {
@@ -280,7 +282,9 @@ export function normalizeSidebarState(raw: unknown): SidebarState {
280
282
  .flatMap((recovery): FableRecoverySidebarState[] => {
281
283
  if (
282
284
  typeof recovery.sessionId !== 'string' ||
283
- (recovery.mode !== 'opus' && recovery.mode !== 'fable') ||
285
+ (recovery.mode !== 'opus' &&
286
+ recovery.mode !== 'fable' &&
287
+ recovery.mode !== 'server') ||
284
288
  typeof recovery.remaining !== 'number' ||
285
289
  !Number.isFinite(recovery.remaining) ||
286
290
  typeof recovery.changedAt !== 'number' ||
@@ -297,6 +301,10 @@ export function normalizeSidebarState(raw: unknown): SidebarState {
297
301
  typeof recovery.requestedModelId === 'string'
298
302
  ? recovery.requestedModelId
299
303
  : undefined,
304
+ targetModelId:
305
+ typeof recovery.targetModelId === 'string'
306
+ ? recovery.targetModelId
307
+ : undefined,
300
308
  },
301
309
  ]
302
310
  })
@@ -697,6 +705,8 @@ export function formatFallbackModelLabel(modelId: string | undefined): string {
697
705
  return 'Fable 5'
698
706
  if (modelId === 'claude-opus-5' || modelId?.startsWith('claude-opus-5-'))
699
707
  return 'Opus 5'
708
+ if (modelId === 'claude-opus-4-8' || modelId?.startsWith('claude-opus-4-8-'))
709
+ return 'Opus 4.8'
700
710
  return modelId ?? 'Fable 5'
701
711
  }
702
712
 
@@ -711,6 +721,9 @@ export function getFableRecoverySummary(
711
721
  if (recovery.mode === 'fable') {
712
722
  return `${formatFallbackModelLabel(recovery.requestedModelId)} · restored`
713
723
  }
724
+ if (recovery.mode === 'server') {
725
+ return `${formatFallbackModelLabel(recovery.requestedModelId)}→${formatFallbackModelLabel(recovery.targetModelId)} · safety`
726
+ }
714
727
  return `Opus 4.8 · ${recovery.remaining} left`
715
728
  }
716
729
 
@@ -39,7 +39,7 @@ export interface SidebarAccountState {
39
39
 
40
40
  export interface FableRecoverySidebarState {
41
41
  sessionId: string
42
- mode: 'opus' | 'fable'
42
+ mode: 'opus' | 'fable' | 'server'
43
43
  remaining: number
44
44
  changedAt: number
45
45
  /**
@@ -48,6 +48,8 @@ export interface FableRecoverySidebarState {
48
48
  * state files; older recoveries default to Fable 5 in the summary.
49
49
  */
50
50
  requestedModelId?: string
51
+ /** Anthropic-selected target while server-side safety fallback is active. */
52
+ targetModelId?: string
51
53
  }
52
54
 
53
55
  export interface SidebarState {
@@ -280,7 +282,9 @@ export function normalizeSidebarState(raw: unknown): SidebarState {
280
282
  .flatMap((recovery): FableRecoverySidebarState[] => {
281
283
  if (
282
284
  typeof recovery.sessionId !== 'string' ||
283
- (recovery.mode !== 'opus' && recovery.mode !== 'fable') ||
285
+ (recovery.mode !== 'opus' &&
286
+ recovery.mode !== 'fable' &&
287
+ recovery.mode !== 'server') ||
284
288
  typeof recovery.remaining !== 'number' ||
285
289
  !Number.isFinite(recovery.remaining) ||
286
290
  typeof recovery.changedAt !== 'number' ||
@@ -297,6 +301,10 @@ export function normalizeSidebarState(raw: unknown): SidebarState {
297
301
  typeof recovery.requestedModelId === 'string'
298
302
  ? recovery.requestedModelId
299
303
  : undefined,
304
+ targetModelId:
305
+ typeof recovery.targetModelId === 'string'
306
+ ? recovery.targetModelId
307
+ : undefined,
300
308
  },
301
309
  ]
302
310
  })
@@ -697,6 +705,8 @@ export function formatFallbackModelLabel(modelId: string | undefined): string {
697
705
  return 'Fable 5'
698
706
  if (modelId === 'claude-opus-5' || modelId?.startsWith('claude-opus-5-'))
699
707
  return 'Opus 5'
708
+ if (modelId === 'claude-opus-4-8' || modelId?.startsWith('claude-opus-4-8-'))
709
+ return 'Opus 4.8'
700
710
  return modelId ?? 'Fable 5'
701
711
  }
702
712
 
@@ -711,6 +721,9 @@ export function getFableRecoverySummary(
711
721
  if (recovery.mode === 'fable') {
712
722
  return `${formatFallbackModelLabel(recovery.requestedModelId)} · restored`
713
723
  }
724
+ if (recovery.mode === 'server') {
725
+ return `${formatFallbackModelLabel(recovery.requestedModelId)}→${formatFallbackModelLabel(recovery.targetModelId)} · safety`
726
+ }
714
727
  return `Opus 4.8 · ${recovery.remaining} left`
715
728
  }
716
729
 
@@ -682,7 +682,7 @@ function QuotaSidebar(props) {
682
682
  const needsReauth = () => enabledFallbacks().some(f => f.needsReauth);
683
683
  const degraded = () => quotaBackedOff() || refreshBackedOff() || needsReauth();
684
684
  const fableRecoverySummary = () => getFableRecoverySummary(state(), props.sessionId);
685
- const fableRecoveryTone = () => state().fableRecoveries?.find(recovery => recovery.sessionId === props.sessionId)?.mode === 'opus' ? 'warn' : 'ok';
685
+ const fableRecoveryTone = () => state().fableRecoveries?.find(recovery => recovery.sessionId === props.sessionId)?.mode === 'fable' ? 'ok' : 'warn';
686
686
  const cacheKeep = () => state().cacheKeep;
687
687
  const showCache = () => prefs().sections.cache && cacheKeep() != null && cacheKeep()?.window != null;
688
688
  const relayValue = () => {
package/src/tui.tsx CHANGED
@@ -644,9 +644,9 @@ function QuotaSidebar(props: {
644
644
  const fableRecoveryTone = (): Tone =>
645
645
  state().fableRecoveries?.find(
646
646
  (recovery) => recovery.sessionId === props.sessionId,
647
- )?.mode === 'opus'
648
- ? 'warn'
649
- : 'ok'
647
+ )?.mode === 'fable'
648
+ ? 'ok'
649
+ : 'warn'
650
650
  const cacheKeep = () => state().cacheKeep
651
651
  const showCache = () =>
652
652
  prefs().sections.cache && cacheKeep() != null && cacheKeep()?.window != null
@@ -1,2 +0,0 @@
1
- import{lc as Q}from"./index-1ets4bf8.js";import{randomUUID as W}from"node:crypto";import{mkdir as E,readFile as D,rename as b,rm as O,rmdir as T,stat as U,unlink as p,writeFile as R}from"node:fs/promises";import{tmpdir as k}from"node:os";import{dirname as S,join as f}from"node:path";var F="OPENCODE_ANTHROPIC_AUTH_SIDEBAR_STATE_FILE",m=f(k(),"opencode-anthropic-auth"),y=f(m,"sidebar-state.json");function _(){return process.env[F]||y}var C={main:{quota:null},fallbacks:[],activeId:void 0,route:"main",relay:null,fastMode:!1,lastUpdated:0};function N(J){return J!==null&&typeof J==="object"&&!Array.isArray(J)}function q(J){if(!N(J))return;let $=Number(J.usedPercent),V=Number(J.remainingPercent);if(!Number.isFinite($)||!Number.isFinite(V))return;return{usedPercent:$,remainingPercent:V,resetsAt:typeof J.resetsAt==="string"?J.resetsAt:void 0}}function L(J){if(!N(J))return null;let $={},V=q(J.five_hour),x=q(J.seven_day);if(V)$.five_hour=V;if(x)$.seven_day=x;if(Array.isArray(J.scoped)){let G=J.scoped.map((X)=>{if(!N(X))return;let Z=q(X);if(!Z)return;if(typeof X.id!=="string"||!X.id.trim())return;if(typeof X.title!=="string"||!X.title.trim())return;if(typeof X.modelName!=="string"||!X.modelName.trim())return;let j=typeof X.modelId==="string"&&X.modelId.trim()?X.modelId.trim():void 0;return{...Z,id:X.id.trim(),title:X.title.trim(),...j&&{modelId:j},modelName:X.modelName.trim()}}).filter((X)=>X!=null);$.scoped=G}if(N(J.extraUsage)){let G=M(J.extraUsage.used),X=M(J.extraUsage.limit);if(G&&X&&typeof J.extraUsage.exhausted==="boolean")$.extraUsage={used:G,limit:X,...typeof J.extraUsage.utilizationPercent==="number"&&Number.isFinite(J.extraUsage.utilizationPercent)&&{utilizationPercent:J.extraUsage.utilizationPercent},...typeof J.extraUsage.severity==="string"&&{severity:J.extraUsage.severity},exhausted:J.extraUsage.exhausted}}if(typeof J.bindingWindow==="string"&&J.bindingWindow.trim())$.bindingWindow=J.bindingWindow.trim();if(typeof J.fallbackAdvised==="boolean")$.fallbackAdvised=J.fallbackAdvised;return Object.keys($).length?$:null}function M(J){if(!N(J))return;if(!Number.isInteger(J.amountMinor)||typeof J.currency!=="string"||!/^[A-Za-z]{3}$/.test(J.currency.trim())||!Number.isInteger(J.exponent)||J.exponent<0||J.exponent>20)return;return{amountMinor:J.amountMinor,currency:J.currency.trim(),exponent:J.exponent}}function w(J){if(!N(J))return{...C};let $={quota:null};if(N(J.main)){let Z=J.main;if($.quota=L(Z.quota),typeof Z.tierLabel==="string"&&Z.tierLabel.trim())$.tierLabel=Z.tierLabel.trim();if(typeof Z.quotaBackedOff==="boolean")$.quotaBackedOff=Z.quotaBackedOff;if(typeof Z.quotaBackoffUntil==="number")$.quotaBackoffUntil=Z.quotaBackoffUntil;if(typeof Z.refreshBackedOff==="boolean")$.refreshBackedOff=Z.refreshBackedOff;if(typeof Z.refreshBackoffUntil==="number")$.refreshBackoffUntil=Z.refreshBackoffUntil}let V=Array.isArray(J.fallbacks)?J.fallbacks.filter(N).filter((Z)=>typeof Z.id==="string").map((Z)=>({id:Z.id,label:typeof Z.label==="string"?Z.label:void 0,quota:L(Z.quota),enabled:typeof Z.enabled==="boolean"?Z.enabled:!1,needsReauth:typeof Z.needsReauth==="boolean"?Z.needsReauth:!1,tierLabel:typeof Z.tierLabel==="string"&&Z.tierLabel.trim()?Z.tierLabel.trim():void 0})):[],x=null;if(N(J.relay)){let Z=J.relay;if(typeof Z.enabled==="boolean"&&typeof Z.transport==="string")x={enabled:Z.enabled,transport:Z.transport}}let G;if(N(J.cacheKeep)){let Z=J.cacheKeep;if(typeof Z.enabled==="boolean")G={enabled:Z.enabled,window:typeof Z.window==="string"?Z.window:void 0,trackedSessions:typeof Z.trackedSessions==="number"?Z.trackedSessions:void 0}}let X=Array.isArray(J.fableRecoveries)?J.fableRecoveries.filter(N).flatMap((Z)=>{if(typeof Z.sessionId!=="string"||Z.mode!=="opus"&&Z.mode!=="fable"||typeof Z.remaining!=="number"||!Number.isFinite(Z.remaining)||typeof Z.changedAt!=="number"||!Number.isFinite(Z.changedAt))return[];return[{sessionId:Z.sessionId,mode:Z.mode,remaining:Math.max(0,Math.floor(Z.remaining)),changedAt:Z.changedAt,requestedModelId:typeof Z.requestedModelId==="string"?Z.requestedModelId:void 0}]}):[];return{main:$,fallbacks:V,activeId:typeof J.activeId==="string"?J.activeId:void 0,route:typeof J.route==="string"?J.route:C.route,relay:x,fastMode:typeof J.fastMode==="boolean"?J.fastMode:C.fastMode,cacheKeep:G,fableRecoveries:X.length>0?X:void 0,lastUpdated:typeof J.lastUpdated==="number"?J.lastUpdated:0}}var h=Promise.resolve(),v=1000,u=2000,c=5,d=15,z=null;function VJ(J){z=J}var A=null;function XJ(J){A=J}function xJ(){return A}function n(J){return new Promise(($)=>setTimeout($,J))}async function I(J){let $=`${J}.lock`,V=z?.lockBudgetMs??v,x=z?.lockRetryMinMs??c,G=z?.lockRetryMaxMs??d,X=Date.now()+V;while(!0){try{await E($);let Y=W(),K=f($,Y);return await R(K,"",{encoding:"utf8",mode:384,flag:"wx"}),await z?.onLockAcquired?.($),{ownsLock:async()=>{try{return await U(K),!0}catch{return!1}},release:async()=>{try{await p(K)}catch{return}await z?.beforeReleaseDirectoryRemoval?.($),await T($).catch(()=>{})}}}catch(Y){if(Y.code!=="EEXIST")return Q.trace("sidebar","state lock unavailable; write skipped",{stateFile:J,error:Y instanceof Error?Y.message:String(Y)}),null}try{let Y=await U($);if(Date.now()-Y.mtimeMs>u){await z?.afterStaleLockStat?.($);let K=`${$}.evict-${process.pid}-${W()}`;try{await b($,K)}catch(B){if(B.code==="ENOENT")continue;throw B}await z?.onStaleLockClaimed?.($),await O(K,{recursive:!0,force:!0}).catch(()=>{});continue}}catch(Y){if(Y.code==="ENOENT")continue;return Q.trace("sidebar","state lock inspection failed; write skipped",{stateFile:J,error:Y instanceof Error?Y.message:String(Y)}),null}let Z=X-Date.now();if(Z<=0)return Q.warn("sidebar","lock budget exhausted, write skipped",{stateFile:J,budgetMs:V}),null;let j=x+Math.floor(Math.random()*(G-x+1));await n(Math.min(j,Z))}}async function YJ(J){return(await I(J))?.release??null}async function l(J,$,V){let x=`${J}.${process.pid}.${W()}.tmp`;await R(x,JSON.stringify($),{encoding:"utf8",mode:384});try{if(!await V())return Q.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await O(x,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await z?.beforeRename?.(J,x),!await V())return Q.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await O(x,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await b(x,J),await z?.afterRename?.(J),!await V())return"lock-lost-after-rename";return"written"}catch(G){throw await O(x,{force:!0}).catch(()=>{}),G}}async function P(J=_()){try{let $=await D(J,"utf8");return w(JSON.parse($))}catch{return C}}async function GJ(J,$=_(),V={}){return h=h.then(async()=>{await E(S($),{recursive:!0});for(let x=0;x<2;x++){let G=x===1,X=await I($);if(!X){if(G)Q.warn("sidebar","post-rename repair lock unavailable; write skipped",{stateFile:$});return}let Z=J,j;try{if(V.routingAuthoritative===!1){let Y=await P($),K=await V.resolvePreservedRouting?.(Y);if(K){let B=K.state??J;Z={...B,activeId:K.activeId,route:K.route,lastUpdated:Math.max(B.lastUpdated,Y.lastUpdated)}}await z?.afterMergeRead?.($)}else if(G){let Y=await P($);Z={...Y,activeId:J.activeId,route:J.route,relay:J.relay,fastMode:J.fastMode,cacheKeep:J.cacheKeep,lastUpdated:Math.max(Y.lastUpdated,J.lastUpdated)}}j=await l($,Z,X.ownsLock)}finally{await X.release()}if(j==="lock-lost-after-rename"){if(G){Q.warn("sidebar","post-rename repair lost lock; write skipped",{stateFile:$});return}Q.warn("sidebar","state lock lost after rename; repairing write",{stateFile:$});continue}if(j==="lock-lost-before-rename")return;V.onRoutingResolved?.({activeId:Z.activeId,route:Z.route});return}}).catch(()=>{}),h}async function jJ(){return h}function KJ(J){let $=J.activeId;if($&&$!=="main"){let V=J.fallbacks?.find((x)=>x.enabled&&x.id===$);if(V)return{id:V.id,name:V.label??V.id,quota:V.quota}}return{id:"main",name:"main",quota:J.main?.quota??null}}function i(J){let $=J.replace(/\s+only$/i,"").trim();return/^fable$/i.test($)?"Fa":$}function s(J){if(J==="claude-fable-5"||J?.startsWith("claude-fable-5-"))return"Fable 5";if(J==="claude-opus-5"||J?.startsWith("claude-opus-5-"))return"Opus 5";return J??"Fable 5"}function zJ(J,$){let V=J.fableRecoveries?.find((x)=>x.sessionId===$);if(!V)return;if(V.mode==="fable")return`${s(V.requestedModelId)} · restored`;return`Opus 4.8 · ${V.remaining} left`}function NJ(J){let $=J?.five_hour?.usedPercent??null,V=J?.seven_day?.usedPercent??null,x=J?.scoped??[],G=x.map((j)=>j.usedPercent);if($==null&&V==null&&x.length===0)return{fiveHourUsedPercent:$,sevenDayUsedPercent:V,scopedUsedPercents:G,text:null};let X=x.map((j)=>`${i(j.title)}: ${Math.round(j.usedPercent)}%`),Z=$==null&&V==null?[]:[`5h: ${$==null?"—":`${Math.round($)}%`}`,`7d: ${V==null?"—":`${Math.round(V)}%`}`];return{fiveHourUsedPercent:$,sevenDayUsedPercent:V,scopedUsedPercents:G,text:[...Z,...X].join(" ")}}var QJ=18000000,BJ=604800000,o=300000,a=0.01,r=1;function OJ(J,$,V){if(!J.resetsAt)return null;let x=new Date(J.resetsAt).getTime();if(!Number.isFinite(x))return null;let G=x-$,X=V-G;if(X<o)return null;if(X<$*a)return null;if(X>=$)return null;let Z=J.usedPercent,j=Math.min(Math.max(X/$*100,0),100),Y=Z-j,K=Math.abs(Y)<r?"on-pace":Y>0?"deficit":"reserve",B=null;if(Z>0){let g=X*100/Z,H=G+g;if(H<x)B=new Date(H).toISOString()}return{pacePercent:j,deltaPercent:Y,state:K,runsOutAt:B}}
2
- export{_ as a,C as b,w as c,VJ as d,XJ as e,xJ as f,YJ as g,P as h,GJ as i,jJ as j,KJ as k,i as l,s as m,zJ as n,NJ as o,QJ as p,BJ as q,OJ as r};