@cortexkit/opencode-anthropic-auth 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/cli.js +6 -6
- package/dist/fable-fallback.d.ts +2 -0
- package/dist/{index-bxs26mw4.js → index-0z4mmpxy.js} +1 -1
- package/dist/{index-qejbx8c9.js → index-5xsc5gwa.js} +1 -1
- package/dist/{index-qsaph2g4.js → index-dbczmr1v.js} +1 -1
- package/dist/{index-6gdd6e4s.js → index-epg96jpt.js} +1 -1
- package/dist/index-sgwz35qx.js +422 -0
- package/dist/{index-jkbar3k3.js → index-z9dywmf2.js} +1 -1
- package/dist/index.js +11 -20
- package/dist/{logger-vxnb5hjr.js → logger-ta3qm0a2.js} +1 -1
- package/dist/prompt-context.d.ts +5 -2
- package/dist/rpc/port-file.js +1 -1
- package/dist/rpc/rpc-client.js +1 -1
- package/dist/rpc/rpc-dir.js +1 -1
- package/dist/sidebar-state.js +1 -1
- package/dist/tui-preferences.js +1 -1
- package/package.json +13 -10
- package/src/tui/command-dialogs.tsx +13 -2
- package/src/tui/entry.mjs +37 -0
- package/src/tui-compiled/rpc/port-file.ts +70 -0
- package/src/tui-compiled/rpc/protocol.ts +34 -0
- package/src/tui-compiled/rpc/rpc-client.ts +62 -0
- package/src/tui-compiled/rpc/rpc-dir.ts +19 -0
- package/src/tui-compiled/sidebar-state.ts +410 -0
- package/src/tui-compiled/tui/command-dialogs.tsx +623 -0
- package/src/tui-compiled/tui-preferences.ts +370 -0
- package/src/tui-compiled/tui.tsx +1102 -0
- package/src/tui.tsx +16 -13
- package/dist/index-z03wayzs.js +0 -417
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{mkdir as l,readdir as u,readFile as c,rename as p,unlink as m,writeFile as d}from"node:fs/promises";import{join as a}from"node:path";function f(t){try{return process.kill(t,0),!0}catch(r){return r.code==="EPERM"}}async function b(t,r){await l(t,{recursive:!0});let s={...r,startedAt:Date.now()},e=a(t,`port-${r.pid}.json`),i=`${e}.${process.pid}.tmp`;return await d(i,JSON.stringify(s),{encoding:"utf8",mode:384}),await p(i,e),e}async function h(t,r){let s;try{s=await u(t)}catch{return null}let e=[];for(let n of s){if(!n.startsWith("port-")||!n.endsWith(".json"))continue;try{let o=JSON.parse(await c(a(t,n),"utf8"));if(Number.isFinite(o.port))if(f(o.pid))e.push(o);else m(a(t,n)).catch(()=>{})}catch{}}if(e.length===0)return null;let i=r&&r>=1?e.filter((n)=>n.pid===r):[];return(i.length>0?i:e).sort((n,o)=>o.startedAt-n.startedAt)[0]??null}
|
|
2
|
-
export{b as
|
|
2
|
+
export{b as $b,h as ac};
|
package/dist/index.js
CHANGED
|
@@ -1,26 +1,17 @@
|
|
|
1
|
-
import{$ as JW,$a as Qj,A as k4,Aa as Yj,B as x1,Ba as Zj,C as y4,Ca as XW,D as E1,Da as Gj,E as g4,Ea as H0,F as h4,Fa as Xj,G as m4,Ga as VW,H as b4,Ha as A1,I as p4,Ia as Vj,J as WW,Ja as KW,K as S1,Ka as J1,L as i4,La as _W,M as l4,Ma as f1,N as y0,Na as k1,O as jW,Oa as Kj,P as d4,Pa as zW,Q as v1,Qa as PW,R as u4,Ra as _j,S as c4,Sa as wW,T as n4,Ta as zj,U as OW,Ua as UW,V as o4,Va as c0,W as R1,Wa as $4,X as j1,Xa as $1,Y as r4,Ya as Pj,Z as D1,Za as wj,_ as t4,_a as Uj,a as nW,aa as s4,ab as D4,b as oW,ba as a4,bb as N4,c as o0,ca as e4,cb as Y4,d as r0,da as Wj,db as Z4,e as rW,ea as $W,eb as Cj,f as i0,fa as jj,fb as QW,g as E4,gb as Lj,h as tW,ha as Oj,hb as Hj,i as sW,ia as DW,ib as CW,j as aW,ja as l0,k as S4,ka as d0,kb as Mj,l as I1,la as O1,m as F1,ma as Jj,mb as LW,n as K0,na as q1,nb as y1,o as s0,oa as eW,ob as Bj,p as T1,pa as W4,pb as Ij,q as R4,qa as NW,qb as HW,r as q4,ra as j4,s as Q0,sa as O4,t as A,ta as J4,ua as YW,v as a0,va as $j,w as A4,wa as Dj,x as e0,xa as ZW,y as W1,ya as Nj,z as f4,za as GW}from"./index-z03wayzs.js";import{Bb as m,Cb as r,sb as v4}from"./index-6gdd6e4s.js";import{Eb as Tj,Ib as xj}from"./index-bxs26mw4.js";import{Rb as fW}from"./index-jkbar3k3.js";import{Ub as Fj}from"./index-qejbx8c9.js";import"./index-qsaph2g4.js";import{randomUUID as g1}from"node:crypto";var FW="claude-opus-4-8",bj=10,pj=128,ij=86400000;function TW(W){return typeof W==="string"&&(W===c0||W.startsWith(`${c0}-`))}function lj(W){try{let O=JSON.parse(W);return typeof O.model==="string"?{body:O,model:O.model}:null}catch{return null}}class d1{now;sessions=new Map;nextCycle=1;constructor(W=Date.now){this.now=W}prune(){let W=this.now();for(let[O,j]of this.sessions)if(W-j.updatedAt>=ij)this.sessions.delete(O);while(this.sessions.size>pj){let O=this.sessions.keys().next().value;if(typeof O!=="string")break;this.sessions.delete(O)}}plan(W,O){if(!W||typeof O!=="string")return null;let j=lj(O);if(!j||!TW(j.model))return null;this.prune();let J=this.sessions.get(W);if(!J||J.remaining<=0)return{sessionId:W,requestedModel:j.model,effectiveModel:j.model,bodyText:O,downgraded:!1,standbyCacheAnchor:J?.standbyCacheAnchor};return J.updatedAt=this.now(),J.nextRequestSequence++,this.sessions.delete(W),this.sessions.set(W,J),j.body.model=FW,{sessionId:W,requestedModel:J.model,effectiveModel:FW,bodyText:JSON.stringify(j.body),downgraded:!0,cycle:J.cycle,cacheAccountId:J.cacheAccountId,standbyCacheAnchor:J.standbyCacheAnchor,requestSequence:J.nextRequestSequence}}activate(W,O){if(W.downgraded||!TW(W.requestedModel))return this.remaining(W.sessionId);let j={model:W.requestedModel,remaining:bj,cycle:this.nextCycle++,cacheAccountId:O,standbyCacheAnchor:W.standbyCacheAnchor,nextRequestSequence:0,standbyAnchorSequence:0,updatedAt:this.now()};return this.sessions.delete(W.sessionId),this.sessions.set(W.sessionId,j),this.prune(),j.remaining}complete(W,O){if(!W.downgraded||W.cycle==null||W.completed)return{counted:!1,remaining:this.remaining(W.sessionId)};W.completed=!0;let j=this.sessions.get(W.sessionId);if(!j||j.cycle!==W.cycle||j.remaining<=0)return{counted:!1,remaining:j?.remaining??0};if(j.remaining--,O&&W.requestSequence!=null&&W.requestSequence>=j.standbyAnchorSequence)j.standbyCacheAnchor=O,j.standbyAnchorSequence=W.requestSequence;return j.updatedAt=this.now(),this.sessions.delete(W.sessionId),this.sessions.set(W.sessionId,j),{counted:!0,remaining:j.remaining}}remaining(W){return this.prune(),this.sessions.get(W)?.remaining??0}}function p0(W){return typeof W==="object"&&W!==null}function dj(W){if(Array.isArray(W))return W;if(p0(W)&&Array.isArray(W.data))return W.data;return[]}function uj(W){if(!p0(W)||!p0(W.info))return;return typeof W.info.role==="string"?W.info.role:void 0}function xW(W){if(!p0(W)||!p0(W.info))return null;let O=W.info,j=p0(O.model)?O.model:void 0,J=typeof O.agent==="string"?O.agent:void 0,D=typeof j?.providerID==="string"?j.providerID:typeof O.providerID==="string"?O.providerID:void 0,G=typeof j?.modelID==="string"?j.modelID:typeof O.modelID==="string"?O.modelID:void 0,V=typeof j?.variant==="string"?j.variant:typeof O.variant==="string"?O.variant:void 0;if(!J&&(!D||!G)&&!V)return null;let F={};if(J)F.agent=J;if(D&&G)F.model={providerID:D,modelID:G};if(V)F.variant=V;return F}function EW(W,O){return{agent:W.agent??O.agent,model:W.model??O.model,variant:W.variant??O.variant}}function SW(W){return Boolean(W.agent&&W.model&&W.variant)}async function vW(W,O){if(!W||!O)return null;let j=W;if(typeof j.session?.messages!=="function")return null;let J=[];try{J=dj(await Promise.resolve(j.session.messages({path:{id:O},query:{limit:100}})))}catch{return null}if(J.length===0)return null;let D={};for(let G=J.length-1;G>=0;G--){if(uj(J[G])!=="assistant")continue;let V=xW(J[G]);if(!V)continue;if(D=EW(D,V),SW(D))return D}for(let G=J.length-1;G>=0;G--){let V=xW(J[G]);if(!V)continue;if(D=EW(D,V),SW(D))return D}if(!D.agent&&!D.model&&!D.variant)return null;return D}var v0=[],cj=1,u1=0,RW=new Map;function qW(W,O){if(v0.push({id:cj++,type:"open-dialog",payload:W,sessionId:O}),v0.length>100)v0=v0.slice(v0.length-100)}function AW(W=0,O){let j=Date.now();if(u1=j,O!==void 0)RW.set(O,j);let J=(D)=>O===void 0||D.sessionId===void 0||D.sessionId===O;if(W>0)v0=v0.filter((D)=>{if(D.id>W)return!0;if(O===void 0)return!1;return D.sessionId!==O});return v0.filter((D)=>D.id>W&&J(D))}function z1(W){let O=Date.now();if(W!==void 0){let j=RW.get(W)??0;return j>0&&O-j<3000}return u1>0&&O-u1<3000}import{randomBytes as nj,timingSafeEqual as oj}from"node:crypto";import{unlink as rj}from"node:fs/promises";import{createServer as tj}from"node:http";import{join as sj}from"node:path";function aj(W){return new Promise((O,j)=>{let J=[],D=0;W.on("data",(G)=>{if(D+=G.length,D>1e6){W.destroy(),j(Error("body too large"));return}J.push(G)}),W.on("end",()=>O(Buffer.concat(J).toString("utf8"))),W.on("error",j)})}function ej(W,O){if(!W?.startsWith("Bearer "))return!1;let j=Buffer.from(W.slice(7)),J=Buffer.from(O);return j.length===J.length&&oj(j,J)}async function kW(W){let O=nj(32).toString("hex"),j=tj((G,V)=>{J(G,V)});async function J(G,V){let F=(l,h)=>{V.writeHead(l,{"content-type":"application/json"}),V.end(JSON.stringify(h))};try{let l=G.url??"";if(G.method==="GET"&&l==="/health")return F(200,{ok:!0});if(G.method!=="POST"||!l.startsWith("/rpc/"))return F(404,{error:"not found"});if(!ej(G.headers.authorization,O))return F(401,{error:"unauthorized"});let h=l.slice(5),b=JSON.parse(await aj(G)||"{}");if(h==="pending-notifications"){let Q=W.drain(Number(b.lastReceivedId??0),typeof b.sessionId==="string"?b.sessionId:void 0);return F(200,{messages:Q})}if(h==="apply"){let Q=await W.apply(b);return F(200,Q)}return F(404,{error:"unknown method"})}catch(l){if(!V.headersSent&&!V.writableEnded&&!V.destroyed)F(500,{error:l instanceof Error?l.message:String(l)})}}let D=await new Promise((G,V)=>{j.on("error",V),j.listen(0,"127.0.0.1",()=>{let F=j.address();if(F&&typeof F==="object")G(F.port);else V(Error("no port"))})});j.unref();try{await fW(W.dir,{port:D,token:O,pid:process.pid})}catch(G){throw await new Promise((V)=>j.close(()=>V())),G}return{port:D,token:O,async stop(){await new Promise((G)=>j.close(()=>G())),await rj(sj(W.dir,`port-${process.pid}.json`)).catch(()=>{})}}}import{createHash as WO}from"node:crypto";function yW(W,O){let j=new Map,J=0,D=0,G=0,V=0,F=0,l=(Q)=>{let t=performance.now(),G0=W(Q);return F+=performance.now()-t,G++,G0};return{call:(Q)=>{if(!O.enabled())return l(Q);let t=j.get(Q);if(t!==void 0)return D++,j.delete(Q),j.set(Q,t),t;let G0=l(Q),P0=Q.length+G0.length;if(P0>O.maxBytes)return G0;j.set(Q,G0),J+=P0;while(J>O.maxBytes&&j.size>1){let J0=j.keys().next().value,x0=j.get(J0)??"";j.delete(J0),J-=J0.length+x0.length,V++}return G0},stats:()=>({hits:D,misses:G,evictions:V,entries:j.size,cacheBytes:J,computeMsTotal:F})}}function gW(W){return`${nW}${W.charAt(0).toUpperCase()}${W.slice(1)}`}function G4(W){if(W==="StructuredOutput")return W;return`${W.charAt(0).toLowerCase()}${W.slice(1)}`}var jO=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function hW(W){let O=G4(W);if(O.startsWith("aft_"))return O;if(jO.has(O))return`aft_${O}`;return null}function C1(W,O){let j=new Headers;if(W instanceof Request)W.headers.forEach((D,G)=>{j.set(G,D)});let J=O?.headers;if(J){if(J instanceof Headers)J.forEach((D,G)=>{j.set(G,D)});else if(Array.isArray(J))for(let D of J){let[G,V]=D;if(typeof V<"u")j.set(G,String(V))}else for(let[D,G]of Object.entries(J))if(typeof G<"u")j.set(D,String(G))}return j}function L1(W){return W.set("anthropic-beta",o0(W.get("anthropic-beta"),[oW])),W}function t0(W,O,j={}){return O4(W,O,j)}function OO(W){if(W.tools&&Array.isArray(W.tools))W.tools=W.tools.map((O)=>({...O,name:O.name?gW(O.name):O.name}));if(W.messages&&Array.isArray(W.messages))W.messages=W.messages.map((O)=>{if(O.content&&Array.isArray(O.content))O.content=O.content.map((j)=>{if(j.type==="tool_use"&&j.name)return{...j,name:gW(j.name)};return j});return O});return JSON.stringify(J4(W))}function c1(W){return W.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(O,j,J)=>{if(j)return`"name": "${hW(J)??G4(J)}"`;let D=hW(J);return D?`"name": "${D}"`:O})}function mW(W,O=!1){if(O)return{ready:c1(W),pending:""};let j=W.length,J='"name"',D=Math.max(0,W.length-J.length+1);for(let V=D;V<W.length;V++)if(J.startsWith(W.slice(V))){j=Math.min(j,V);break}let G=W.lastIndexOf(J);if(G!==-1){let V=W.slice(G);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(V))j=Math.min(j,G)}if(j<W.length)return{ready:c1(W.slice(0,j)),pending:W.slice(j)};return{ready:c1(W),pending:""}}function r1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let W=process.env.ANTHROPIC_INSECURE?.trim();return W==="1"||W==="true"}function X4(W){let O=W?.trim();if(!O)return null;try{let j=new URL(O);if(j.protocol!=="http:"&&j.protocol!=="https:"||j.username||j.password)return null;return j}catch{return null}}function JO(){return X4(process.env.ANTHROPIC_BASE_URL)}function t1(W,O={}){let j=null;try{if(typeof W==="string"||W instanceof URL)j=new URL(W.toString());else if(W instanceof Request)j=new URL(W.url)}catch{j=null}if(!j)return{input:W,url:null};let J=j.href,D=O.baseURL?X4(O.baseURL):JO();if(D){if(j.protocol=D.protocol,j.host=D.host,O.baseURL)j.pathname=`${D.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:W,url:j};return{input:W instanceof Request?new Request(j.toString(),W):j,url:j}}function $O(W){let J=W.split(/\n\n+/).filter((D)=>{if(D.includes(rW))return!1;for(let G of sW)if(D.includes(G))return!1;return!0}).join(`
|
|
1
|
+
import{$ as Uj,$a as hj,A as Jj,Aa as FW,Ab as aj,B as p1,Ba as Ej,C as Oj,Ca as vj,D as i1,Da as Sj,E as $j,Ea as fj,F as Yj,Fa as IW,G as Zj,Ga as qj,H as Dj,Ha as S0,I as Gj,Ia as Aj,J as Xj,Ja as TW,K as d1,Ka as n1,L as l1,La as Rj,M as Vj,Ma as xW,N as N1,Na as L1,O as d0,Oa as EW,P as zW,Pa as o1,Q as Kj,Qa as r1,R as c1,Ra as kj,S as _j,Sa as vW,T as zj,Ta as SW,U as wj,Ua as gj,V as wW,Va as fW,W as PW,Wa as yj,X as Q1,Xa as qW,Y as l0,Ya as V1,Z as Pj,Za as T4,_ as c0,_a as M1,a as w4,aa as UW,ab as mj,b as P4,ba as Cj,bb as bj,c as _1,ca as Qj,cb as pj,d as z1,da as Hj,db as x4,e as U4,ea as Lj,eb as E4,f as W1,fa as CW,fb as v4,g as s4,ga as Mj,gb as S4,h as C4,ha as Bj,hb as ij,i as Q4,ia as QW,ib as AW,j as H4,ja as J1,jb as dj,k as a4,ka as O1,kb as lj,l as h1,la as H1,lb as RW,m as m1,ma as Fj,n as U0,na as u1,nb as cj,o as j1,oa as L4,p as b1,pa as M4,pb as kW,q as e4,qa as HW,qb as B1,r as Wj,ra as B4,rb as uj,s as T0,sa as F4,sb as nj,t as R,ta as I4,tb as gW,ua as LW,ub as f0,v as P1,va as Ij,vb as $1,w as jj,wa as Tj,wb as oj,x as U1,xa as MW,xb as s1,y as C1,ya as BW,yb as rj,z as Nj,za as xj,zb as sj}from"./index-sgwz35qx.js";import{Cb as t4,Lb as i,Mb as t}from"./index-epg96jpt.js";import{Ob as ej,Sb as WN}from"./index-0z4mmpxy.js";import{$b as N4}from"./index-z9dywmf2.js";import{cc as tj}from"./index-5xsc5gwa.js";import"./index-dbczmr1v.js";import{randomUUID as _W}from"node:crypto";var cW="claude-opus-4-8",_N=10,zN=128,wN=86400000;function uW(W){return typeof W==="string"&&(W===V1||W.startsWith(`${V1}-`))}function PN(W){try{let N=JSON.parse(W);return typeof N.model==="string"?{body:N,model:N.model}:null}catch{return null}}class NW{now;sessions=new Map;nextCycle=1;constructor(W=Date.now){this.now=W}prune(){let W=this.now();for(let[N,j]of this.sessions)if(W-j.updatedAt>=wN)this.sessions.delete(N);while(this.sessions.size>zN){let N=this.sessions.keys().next().value;if(typeof N!=="string")break;this.sessions.delete(N)}}plan(W,N){if(!W||typeof N!=="string")return null;let j=PN(N);if(!j||!uW(j.model))return null;this.prune();let J=this.sessions.get(W);if(!J||J.remaining<=0)return{sessionId:W,requestedModel:j.model,effectiveModel:j.model,bodyText:N,downgraded:!1,standbyCacheAnchor:J?.standbyCacheAnchor};return J.updatedAt=this.now(),J.nextRequestSequence++,this.sessions.delete(W),this.sessions.set(W,J),j.body.model=cW,{sessionId:W,requestedModel:J.model,effectiveModel:cW,bodyText:JSON.stringify(j.body),downgraded:!0,cycle:J.cycle,cacheAccountId:J.cacheAccountId,standbyCacheAnchor:J.standbyCacheAnchor,requestSequence:J.nextRequestSequence}}recoveryAccount(W){if(W.cycle===void 0)return W.cacheAccountId;let N=this.sessions.get(W.sessionId);return N?.cycle===W.cycle?N.cacheAccountId:W.cacheAccountId}bindRecoveryAccount(W,N){if(!W.downgraded||W.cycle===void 0)return!1;let j=this.sessions.get(W.sessionId);if(!j||j.cycle!==W.cycle)return!1;if(j.cacheAccountId===N)return!1;return j.cacheAccountId=N,j.standbyCacheAnchor=void 0,j.standbyAnchorSequence=0,j.updatedAt=this.now(),W.cacheAccountId=N,W.standbyCacheAnchor=void 0,!0}activate(W,N){if(W.downgraded||!uW(W.requestedModel))return this.remaining(W.sessionId);let j={model:W.requestedModel,remaining:_N,cycle:this.nextCycle++,cacheAccountId:N,standbyCacheAnchor:W.standbyCacheAnchor,nextRequestSequence:0,standbyAnchorSequence:0,updatedAt:this.now()};return this.sessions.delete(W.sessionId),this.sessions.set(W.sessionId,j),this.prune(),j.remaining}complete(W,N){if(!W.downgraded||W.cycle==null||W.completed)return{counted:!1,remaining:this.remaining(W.sessionId)};W.completed=!0;let j=this.sessions.get(W.sessionId);if(!j||j.cycle!==W.cycle||j.remaining<=0)return{counted:!1,remaining:j?.remaining??0};if(j.remaining--,N&&(!j.cacheAccountId||N.oauthAccountId===j.cacheAccountId)&&W.requestSequence!=null&&W.requestSequence>=j.standbyAnchorSequence)j.standbyCacheAnchor=N,j.standbyAnchorSequence=W.requestSequence;return j.updatedAt=this.now(),this.sessions.delete(W.sessionId),this.sessions.set(W.sessionId,j),{counted:!0,remaining:j.remaining}}remaining(W){return this.prune(),this.sessions.get(W)?.remaining??0}}function e0(W){return typeof W==="object"&&W!==null}function UN(W){if(Array.isArray(W))return W;if(e0(W)&&Array.isArray(W.data))return W.data;return[]}function aW(W){if(!e0(W)||!e0(W.info))return;return W.info}function nW(W){let N=aW(W);return typeof N?.role==="string"?N.role:void 0}function CN(W){let N=aW(W);return typeof N?.id==="string"?N.id:void 0}function oW(W){if(!e0(W)||!e0(W.info))return null;let N=W.info,j=e0(N.model)?N.model:void 0,J=typeof N.agent==="string"?N.agent:void 0,$=typeof j?.providerID==="string"?j.providerID:typeof N.providerID==="string"?N.providerID:void 0,G=typeof j?.modelID==="string"?j.modelID:typeof N.modelID==="string"?N.modelID:void 0,K=typeof j?.variant==="string"?j.variant:typeof N.variant==="string"?N.variant:void 0;if(!J&&(!$||!G)&&!K)return null;let L={};if(J)L.agent=J;if($&&G)L.model={providerID:$,modelID:G};if(K)L.variant=K;return L}function rW(W,N){return{agent:W.agent??N.agent,model:W.model??N.model,variant:W.variant??N.variant,latestAssistantMessageId:W.latestAssistantMessageId??N.latestAssistantMessageId,latestUserMessageId:W.latestUserMessageId??N.latestUserMessageId}}function sW(W){return Boolean(W.agent&&W.model&&W.variant)}async function tW(W,N){if(!W||!N)return null;let j=W;if(typeof j.session?.messages!=="function")return null;let J=[];try{J=UN(await Promise.resolve(j.session.messages({path:{id:N},query:{limit:100}})))}catch{return null}if(J.length===0)return null;let $,G;for(let L of J){let g=CN(L);if(!g)continue;let b=nW(L);if(b==="assistant"&&(!$||g>$))$=g;if(b==="user"&&(!G||g>G))G=g}let K={latestAssistantMessageId:$,latestUserMessageId:G};for(let L=J.length-1;L>=0;L--){if(nW(J[L])!=="assistant")continue;let g=oW(J[L]);if(!g)continue;if(K=rW(K,g),sW(K))return K}for(let L=J.length-1;L>=0;L--){let g=oW(J[L]);if(!g)continue;if(K=rW(K,g),sW(K))return K}if(!K.agent&&!K.model&&!K.variant&&!K.latestAssistantMessageId&&!K.latestUserMessageId)return null;return K}var b0=[],QN=1,JW=0,eW=new Map;function W4(W,N){if(b0.push({id:QN++,type:"open-dialog",payload:W,sessionId:N}),b0.length>100)b0=b0.slice(b0.length-100)}function j4(W=0,N){let j=Date.now();if(JW=j,N!==void 0)eW.set(N,j);let J=($)=>N===void 0||$.sessionId===void 0||$.sessionId===N;if(W>0)b0=b0.filter(($)=>{if($.id>W)return!0;if(N===void 0)return!1;return $.sessionId!==N});return b0.filter(($)=>$.id>W&&J($))}function OW(W){let N=Date.now();if(W!==void 0){let j=eW.get(W)??0;return j>0&&N-j<3000}return JW>0&&N-JW<3000}import{randomBytes as HN,timingSafeEqual as LN}from"node:crypto";import{unlink as MN}from"node:fs/promises";import{createServer as BN}from"node:http";import{join as FN}from"node:path";function IN(W){return new Promise((N,j)=>{let J=[],$=0;W.on("data",(G)=>{if($+=G.length,$>1e6){W.destroy(),j(Error("body too large"));return}J.push(G)}),W.on("end",()=>N(Buffer.concat(J).toString("utf8"))),W.on("error",j)})}function TN(W,N){if(!W?.startsWith("Bearer "))return!1;let j=Buffer.from(W.slice(7)),J=Buffer.from(N);return j.length===J.length&&LN(j,J)}async function J4(W){let N=HN(32).toString("hex"),j=BN((G,K)=>{J(G,K)});async function J(G,K){let L=(g,b)=>{K.writeHead(g,{"content-type":"application/json"}),K.end(JSON.stringify(b))};try{let g=G.url??"";if(G.method==="GET"&&g==="/health")return L(200,{ok:!0});if(G.method!=="POST"||!g.startsWith("/rpc/"))return L(404,{error:"not found"});if(!TN(G.headers.authorization,N))return L(401,{error:"unauthorized"});let b=g.slice(5),l=JSON.parse(await IN(G)||"{}");if(b==="pending-notifications"){let r=W.drain(Number(l.lastReceivedId??0),typeof l.sessionId==="string"?l.sessionId:void 0);return L(200,{messages:r})}if(b==="apply"){let r=await W.apply(l);return L(200,r)}return L(404,{error:"unknown method"})}catch(g){if(!K.headersSent&&!K.writableEnded&&!K.destroyed)L(500,{error:g instanceof Error?g.message:String(g)})}}let $=await new Promise((G,K)=>{j.on("error",K),j.listen(0,"127.0.0.1",()=>{let L=j.address();if(L&&typeof L==="object")G(L.port);else K(Error("no port"))})});j.unref();try{await N4(W.dir,{port:$,token:N,pid:process.pid})}catch(G){throw await new Promise((K)=>j.close(()=>K())),G}return{port:$,token:N,async stop(){await new Promise((G)=>j.close(()=>G())),await MN(FN(W.dir,`port-${process.pid}.json`)).catch(()=>{})}}}import{createHash as xN}from"node:crypto";function O4(W,N){let j=new Map,J=0,$=0,G=0,K=0,L=0,g=(r)=>{let M=performance.now(),O0=W(r);return L+=performance.now()-M,G++,O0};return{call:(r)=>{if(!N.enabled())return g(r);let M=j.get(r);if(M!==void 0)return $++,j.delete(r),j.set(r,M),M;let O0=g(r),x0=r.length+O0.length;if(x0>N.maxBytes)return O0;j.set(r,O0),J+=x0;while(J>N.maxBytes&&j.size>1){let _0=j.keys().next().value,L0=j.get(_0)??"";j.delete(_0),J-=_0.length+L0.length,K++}return O0},stats:()=>({hits:$,misses:G,evictions:K,entries:j.size,cacheBytes:J,computeMsTotal:L})}}function $4(W){return`${w4}${W.charAt(0).toUpperCase()}${W.slice(1)}`}function f4(W){if(W==="StructuredOutput")return W;return`${W.charAt(0).toLowerCase()}${W.slice(1)}`}var EN=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function Y4(W){let N=f4(W);if(N.startsWith("aft_"))return N;if(EN.has(N))return`aft_${N}`;return null}function A1(W,N){let j=new Headers;if(W instanceof Request)W.headers.forEach(($,G)=>{j.set(G,$)});let J=N?.headers;if(J){if(J instanceof Headers)J.forEach(($,G)=>{j.set(G,$)});else if(Array.isArray(J))for(let $ of J){let[G,K]=$;if(typeof K<"u")j.set(G,String(K))}else for(let[$,G]of Object.entries(J))if(typeof G<"u")j.set($,String(G))}return j}function R1(W){return W.set("anthropic-beta",_1(W.get("anthropic-beta"),[P4])),W}function w1(W,N,j={}){return F4(W,N,j)}function vN(W){if(W.tools&&Array.isArray(W.tools))W.tools=W.tools.map((N)=>({...N,name:N.name?$4(N.name):N.name}));if(W.messages&&Array.isArray(W.messages))W.messages=W.messages.map((N)=>{if(N.content&&Array.isArray(N.content))N.content=N.content.map((j)=>{if(j.type==="tool_use"&&j.name)return{...j,name:$4(j.name)};return j});return N});return JSON.stringify(I4(W))}function $W(W){return W.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(N,j,J)=>{if(j)return`"name": "${Y4(J)??f4(J)}"`;let $=Y4(J);return $?`"name": "${$}"`:N})}function Z4(W,N=!1){if(N)return{ready:$W(W),pending:""};let j=W.length,J='"name"',$=Math.max(0,W.length-J.length+1);for(let K=$;K<W.length;K++)if(J.startsWith(W.slice(K))){j=Math.min(j,K);break}let G=W.lastIndexOf(J);if(G!==-1){let K=W.slice(G);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(K))j=Math.min(j,G)}if(j<W.length)return{ready:$W(W.slice(0,j)),pending:W.slice(j)};return{ready:$W(W),pending:""}}function DW(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let W=process.env.ANTHROPIC_INSECURE?.trim();return W==="1"||W==="true"}function q4(W){let N=W?.trim();if(!N)return null;try{let j=new URL(N);if(j.protocol!=="http:"&&j.protocol!=="https:"||j.username||j.password)return null;return j}catch{return null}}function SN(){return q4(process.env.ANTHROPIC_BASE_URL)}function GW(W,N={}){let j=null;try{if(typeof W==="string"||W instanceof URL)j=new URL(W.toString());else if(W instanceof Request)j=new URL(W.url)}catch{j=null}if(!j)return{input:W,url:null};let J=j.href,$=N.baseURL?q4(N.baseURL):SN();if($){if(j.protocol=$.protocol,j.host=$.host,N.baseURL)j.pathname=`${$.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:W,url:j};return{input:W instanceof Request?new Request(j.toString(),W):j,url:j}}function fN(W){let J=W.split(/\n\n+/).filter(($)=>{if($.includes(U4))return!1;for(let G of Q4)if($.includes(G))return!1;return!0}).join(`
|
|
2
2
|
|
|
3
|
-
`);for(let
|
|
4
|
-
`);
|
|
5
|
-
`)
|
|
3
|
+
`);for(let $ of H4)J=J.replace($.match,$.replacement);return J.trim()}var qN=8388608;function AN(){return process.env.OPENCODE_ANTHROPIC_AUTH_MEMO!=="0"}var RN=O4(fN,{maxBytes:qN,enabled:AN});function v1(W){return RN.call(W)}function u(W){return W!=null&&typeof W==="object"&&!Array.isArray(W)}function kN(W){let N={type:"text",text:W1};if(W==null)return[N];if(typeof W==="string"){let J=v1(W);if(J===W1)return[N];return[N,{type:"text",text:J}]}if(u(W)){let J=typeof W.type==="string"?W.type:"text",$=typeof W.text==="string"?W.text:"";return[N,{...W,type:J,text:v1($)}]}if(!Array.isArray(W))return[N];let j=W.map((J)=>{if(typeof J==="string")return{type:"text",text:v1(J)};if(u(J)&&J.type==="text"&&typeof J.text==="string")return{...J,type:"text",text:v1(J.text)};return{type:"text",text:String(J)}});if(j[0]?.text===W1)return j;return[N,...j]}var A4={type:"ephemeral",ttl:"1h"},D4=20;function R4(W){if(u(W.cache_control))return W.cache_control;if(u(W.cacheControl))return W.cacheControl;return null}function K1(W,N){if(!u(W))return!1;return delete W.cacheControl,W.cache_control=N?{...A4}:{type:"ephemeral"},!0}function G4(W){if(!u(W))return;delete W.cache_control,delete W.cacheControl}function XW(W){if(Array.isArray(W))return W;if(typeof W==="string")return[{type:"text",text:W}];return null}function ZW(W){if(Array.isArray(W))return W.map(ZW);if(!u(W))return W;let N={};for(let j of Object.keys(W).sort()){if(j==="cache_control"||j==="cacheControl")continue;N[j]=ZW(W[j])}return N}function k4(W){if(!u(W))return;let N=XW(W.content);if(!N?.length)return;let j=ZW({...W,content:N});return xN("sha256").update(JSON.stringify(j)).digest("hex")}function gN(W){if(!u(W))return!1;let N=XW(W.content);return Boolean(N?.some((j)=>u(j)&&R4(j)?.type==="ephemeral"))}function g4(W){try{let N=JSON.parse(W);if(!Array.isArray(N.messages))return;for(let j=N.messages.length-1;j>1;j--){let J=N.messages[j];if(!u(J)||J.role!=="user"||!gN(J))continue;let $=k4(J);if(!$)return;return{fingerprint:$,messageIndex:j,messageCount:N.messages.length}}return}catch{return}}function S1(W,N){if(!u(W))return;let j=R4(W);if(j?.type!=="ephemeral")return;if(N)j.ttl="1h";else delete j.ttl}function X4(W,N){if(Array.isArray(W.system))for(let j of W.system)S1(j,N);else S1(W.system,N);if(!Array.isArray(W.messages))return;for(let j of W.messages)if(S1(j,N),u(j)&&Array.isArray(j.content))for(let J of j.content)S1(J,N)}function yN(W,N){if(Array.isArray(W.system))for(let j of W.system)N(j);else N(W.system);if(!Array.isArray(W.messages))return;for(let j of W.messages)if(N(j),u(j)&&Array.isArray(j.content))for(let J of j.content)N(J)}function y4(W){G4(W),yN(W,G4)}function hN(W){y4(W),W.cache_control={...A4}}function mN(W){return u(W)&&W.type!=="thinking"&&W.type!=="redacted_thinking"}function k1(W){let N=XW(W.content);if(!N?.length)return;let j=N.filter(mN);if(!j.length)return;return{content:N,cacheableBlocks:j}}function bN(W){if(!u(W))return!1;let N=k1(W);if(!N)return!1;return W.content=N.content,K1(N.cacheableBlocks[0],!0)}function pN(W){if(!u(W))return!1;let N=k1(W);if(!N||N.cacheableBlocks.length<2)return!1;return W.content=N.content,K1(N.cacheableBlocks[1],!0)}function f1(W){if(!u(W))return!1;let N=k1(W);if(!N)return!1;let j=N.cacheableBlocks[N.cacheableBlocks.length-1];return W.content=N.content,K1(j,!0)}function iN(W){if(!u(W))return!1;return(k1(W)?.cacheableBlocks.length??0)>1}function dN(W){if(!u(W))return 0;let N=W.content;if(Array.isArray(N))return N.length;if(N==null)return 0;return 1}function lN(W){let N=[],j=0;return W.forEach((J,$)=>{let G=dN(J);if(u(J)&&J.role==="user"&&G>0)N.push({index:$,blockPosition:j+G-1});j+=G}),N}function cN(W,N,j,J){if(!J)return;let $=[],G=N.find((K)=>K.index===J.messageIndex&&K.index>1&&K.index<j.index);if(G)$.push(G);for(let K of[...N].reverse()){if(K.index<=1||K.index>=j.index||K.index===G?.index)continue;$.push(K)}for(let K of $)if(k4(W[K.index])===J.fingerprint)return K;return}function uN(W,N){let j=lN(W),J=[...j].reverse().find((l)=>l.index>1);if(!J)return{latest:void 0,bridge:void 0,standbyAnchorMatched:!1,standbyBridgeApplied:!1};let $=cN(W,j,J,N),G=$?J.blockPosition-$.blockPosition+1:void 0,K=$&&G!=null&&G>D4?$:void 0,L=[...j].reverse().find((l)=>l.index<J.index),g=L?J.blockPosition-L.blockPosition+1:0,b=L&&L.index>1&&g>D4?L:void 0;return{latest:J,bridge:K??b,standbyAnchorMatched:Boolean($),standbyDistanceBlocks:G,standbyBridgeApplied:Boolean(K)}}function YW(W){return u(W)&&typeof W.text==="string"?W.text:""}function nN(W){if(!Array.isArray(W.system))return;let N=W.system,j=0;if(YW(N[j]).startsWith("x-anthropic-billing-header:"))j++;if(YW(N[j])===W1)j++;let J=j+1;if(J>=N.length-1)return;let $=N[J];if(!u($))return;let G=N.slice(J).map(YW).join(`
|
|
4
|
+
`);N.splice(J,N.length-J,{...$,type:"text",text:G})}function V4(W){if(Array.isArray(W.system)){let N=W.system.findIndex(($)=>u($)&&$.text===W1),j=W.system.slice(N>=0?N+1:0).filter(u),J=j[j.length-1];K1(J,!0)}else K1(W.system,!0)}function oN(W,N){if(y4(W),nN(W),!Array.isArray(W.messages))return V4(W),{standbyAnchorMatched:!1,standbyBridgeApplied:!1};let{latest:j,bridge:J,standbyAnchorMatched:$,standbyDistanceBlocks:G,standbyBridgeApplied:K}=uN(W.messages,N);if(!J)V4(W);if(iN(W.messages[0]))bN(W.messages[0]),pN(W.messages[0]);else f1(W.messages[0]),f1(W.messages[1]);if(J)f1(W.messages[J.index]);if(j)f1(W.messages[j.index]);return{standbyAnchorMatched:$,standbyDistanceBlocks:G,standbyBridgeApplied:K,...K&&J?{standbyBridgeMessageIndex:J.index}:{}}}function rN(W){if(!Array.isArray(W.messages))return 0;let N=0;return W.messages=W.messages.filter((j)=>{if(!u(j)||!Array.isArray(j.content))return!0;if(j.role!=="assistant")return!0;let J=j.content.filter(($)=>{if(!u($)||$.type!=="thinking")return!0;if(!S4($.signature))return!0;return N+=1,!1});if(J.length===j.content.length)return!0;return j.content=J,J.length>0}),N}function h4(W){if(!x4(W.model))return null;let N=Object.hasOwn(W,"thinking");return W.thinking={...T4},{replacedExisting:N}}function sN(W){if(!v4(W.model))return null;let N=Object.hasOwn(W,"thinking"),j=W.thinking;if(u(j)&&j.type==="disabled")return W.thinking={type:"disabled"},{replacedExisting:N,display:"disabled"};return W.thinking={...E4},{replacedExisting:N,display:"summarized"}}function m4(W,N=V1){try{let j=JSON.parse(W);return j.model=N,delete j.speed,h4(j),{ok:!0,bodyText:JSON.stringify(j)}}catch{return{ok:!1,reason:"body is not valid JSON"}}}function aN(W,N){if(!N.enabled)return X4(W,!1),delete W.cache_control,delete W.cacheControl,{};if(N.mode==="automatic")return hN(W),{};if(N.mode==="hybrid")return oN(W,N.hybridStandbyAnchor);return X4(W,!0),delete W.cacheControl,{}}function tN(W){if(!Array.isArray(W.messages))return;while(W.messages.length){let N=W.messages[W.messages.length-1];if(!u(N)||N.role!=="assistant")break;W.messages.pop()}}function n(){return performance.now()}function H0(W){return Math.round(W*10)/10}function K4(W){let N=0,j=0,J=0,$=Array.isArray(W.messages)?W.messages:[];N=$.length;for(let G of $){if(!G||typeof G!=="object")continue;let K=G.content;if(!Array.isArray(K))continue;j+=K.length;for(let L of K)if(L&&typeof L==="object"&&L.type==="tool_use")J++}return{messageCount:N,contentBlockCount:j,toolDefinitionCount:Array.isArray(W.tools)?W.tools.length:0,toolUseCount:J,systemBlockCount:Array.isArray(W.system)?W.system.length:0}}async function VW(W,N={}){try{let j=n(),J=JSON.parse(W);N.perf?.("parse",{ms:H0(n()-j),inputBytes:W.length,...K4(J)});let $=n(),G=Array.isArray(J.messages)?J.messages.length:void 0;tN(J);let K=Array.isArray(J.messages)?J.messages.length:void 0;N.perf?.("strip_trailing_assistant",{ms:H0(n()-$),removedMessages:typeof G==="number"&&typeof K==="number"?G-K:void 0});let L=n(),g=rN(J),b=h4(J),l=sN(J);N.perf?.("model_normalize",{ms:H0(n()-L),model:typeof J.model==="string"?J.model:void 0,fableMythosThinkingDisplay:b?"summarized":void 0,replacedFableMythosThinking:b?.replacedExisting??!1,sonnet5ThinkingDisplay:l?.display,replacedSonnet5Thinking:l?.replacedExisting??!1,removedNonAnthropicThinking:g,hasOutputConfig:Object.hasOwn(J,"output_config")});let r=n(),M=Array.isArray(J.messages)&&J.messages.some((n0)=>n0.role==="user")?M4(J.messages,void 0,C4):null;N.perf?.("billing_header",{ms:H0(n()-r),hasBillingHeader:Boolean(M)});let O0=n();if(J.system=kN(J.system),N.perf?.("system_identity",{ms:H0(n()-O0),systemBlockCount:Array.isArray(J.system)?J.system.length:0}),M&&Array.isArray(J.system))J.system.unshift({type:"text",text:M});let x0=n(),_0=aN(J,{enabled:N.cache1hEnabled??!1,mode:N.cache1hMode??"explicit",hybridStandbyAnchor:N.hybridStandbyAnchor});if(N.perf?.("cache_strategy",{ms:H0(n()-x0),enabled:N.cache1hEnabled??!1,mode:N.cache1hMode??"explicit",..._0}),N.fastModeEnabled&&z1(J.model))J.speed="fast";else if(J.speed==="fast")delete J.speed;let L0=n();if(N.identity)B4(J,N.identity);N.perf?.("metadata",{ms:H0(n()-L0),hasAccountUuid:Boolean(N.identity?.accountUuid)});let q0=n(),M0=vN(J);N.perf?.("prefix_tools_stringify",{ms:H0(n()-q0),outputBytesBeforeSign:M0.length,...K4(J)});let A0=n(),u0=await L4(M0);return N.perf?.("cch_sign",{ms:H0(n()-A0),outputBytes:u0.length}),u0}catch{return W}}var eN=new TextEncoder;function WJ(){return{pending:"",events:0,parseErrors:0,eventCounts:{},typeCounts:{},deltaTypeCounts:{},contentBlockTypeCounts:{},textDeltaBytes:0,thinkingDeltaBytes:0,inputJsonDeltaBytes:0,signatureDeltaBytes:0,redactedThinkingBytes:0}}function q1(W,N){if(!N)return;W[N]=(W[N]??0)+1}function i0(W){return eN.encode(W).byteLength}function p0(W){return W&&typeof W==="object"&&!Array.isArray(W)?W:void 0}function P0(W,N){let j=W?.[N];return typeof j==="string"?j:void 0}function jJ(W,N){let j=W?.[N];return typeof j==="number"?j:void 0}function b4(W){if(!W.trim())return null;let N,j=[];for(let r of W.split(/\r?\n/)){if(r.startsWith("event:")){N=r.slice(6).trim();continue}if(r.startsWith("data:")){let M=r.slice(5);j.push(M.startsWith(" ")?M.slice(1):M)}}let J=j.join(`
|
|
5
|
+
`),$={event:N,rawBytes:i0(W),dataBytes:i0(J)};if(!J||J==="[DONE]")return $.type=J==="[DONE]"?"done":void 0,$.event??=$.type,$;let G;try{G=JSON.parse(J)}catch{return $}let K=p0(G),L=p0(K?.delta),g=p0(K?.content_block),b=p0(K?.message),l=p0(K?.usage)??p0(b?.usage);if($.type=P0(K,"type"),$.event??=$.type,$.index=jJ(K,"index"),$.contentBlockType=P0(g,"type"),$.deltaType=P0(L,"type"),$.stopReason=P0(L,"stop_reason")??P0(K,"stop_reason"),$.deltaType==="text_delta")$.textDeltaBytes=i0(P0(L,"text")??"");if($.deltaType==="thinking_delta")$.thinkingDeltaBytes=i0(P0(L,"thinking")??"");if($.deltaType==="input_json_delta")$.inputJsonDeltaBytes=i0(P0(L,"partial_json")??"");if($.deltaType==="signature_delta")$.signatureDeltaBytes=i0(P0(L,"signature")??"");if($.contentBlockType==="redacted_thinking")$.redactedThinkingBytes=i0(P0(g,"data")??"");if(l)$.stopReason??=P0(b,"stop_reason");return $}function KW(W){let N=W.indexOf(`
|
|
6
6
|
|
|
7
7
|
`),j=W.indexOf(`\r
|
|
8
8
|
\r
|
|
9
|
-
`);if(
|
|
10
|
-
`);if(!J||J==="[DONE]")return null;let D;try{D=JSON.parse(J)}catch{return null}let G=R0(D);if(O!=="error"&&Z0(G,"type")!=="error")return null;let V=R0(G?.error),F=Z0(V,"type")??Z0(V,"code")??void 0,l=Z0(V,"message")??Z0(G,"message")??F??"Anthropic stream error";if(!qO(F,l))return null;return AO(F,l)}function cW(W,O){if(!O)return null;W.pending+=O;while(!0){let j=e1(W.pending);if(!j)break;let J=W.pending.slice(0,j.index);W.pending=W.pending.slice(j.index+j.length);let D=kO(J);if(D)return D}return null}function yO(W){return{sseEvents:W.events,ssePendingChars:W.pending.length,sseParseErrors:W.parseErrors,sseEventCounts:{...W.eventCounts},sseTypeCounts:{...W.typeCounts},sseDeltaTypeCounts:{...W.deltaTypeCounts},sseContentBlockTypeCounts:{...W.contentBlockTypeCounts},sseTextDeltaBytes:W.textDeltaBytes,sseThinkingDeltaBytes:W.thinkingDeltaBytes,sseInputJsonDeltaBytes:W.inputJsonDeltaBytes,sseSignatureDeltaBytes:W.signatureDeltaBytes,sseRedactedThinkingBytes:W.redactedThinkingBytes,sseLastEvent:W.last?{...W.last}:void 0}}function C4(W,O={}){if(!W.body)return W;let j=W.body.getReader(),J=new TextDecoder,D=new TextEncoder,G="",V=0,F=0,l=0,h=0,b=0,Q=!1,t=!1,G0=i(),P0=i(),J0=O.perf?xO():void 0,x0=RO(),q0=O.onContentFilter||O.onComplete?SO():void 0,D0=(c)=>{if(!q0)return null;let w0=vO(q0,c);if(w0?.type==="content-filter"&&O.onContentFilter)return O.onContentFilter()===!1?null:fO();if(w0?.type==="complete")O.onComplete?.(w0.finishReason);return null},M0=()=>{if(t)return;t=!0,j.releaseLock()},V0=async(c)=>{try{await j.cancel(c)}catch{}finally{M0()}},B0=(c={})=>({chunks:V,pulls:F,inputBytes:l,outputBytes:h,pendingChars:G.length,rewriteMs:z0(b),totalMs:z0(i()-P0),...J0?yO(J0):{},...c}),N0=(c,w0={})=>{O.perf?.(c,B0(w0))};O.perf?.("stream_tool_prefix_wrapper_created",{status:W.status,hasBody:!0});let C0=new ReadableStream({async pull(c){if(F++,!Q)Q=!0,N0("stream_tool_prefix_first_pull");let w0=i();try{let{done:I0,value:j0}=await j.read(),A0=z0(i()-w0);if(I0){let L0=J.decode();if(J0)uW(J0,L0);let T0=cW(x0,L0)??D0(L0);if(T0)throw N0("stream_tool_prefix_retryable_error",{error:T0.message,providerErrorType:T0.providerErrorType}),await V0(T0),T0;let Y1=i(),Z1=mW(`${G}${L0}`,!0);if(b+=i()-Y1,Z1.ready){let G1=D.encode(Z1.ready);h+=G1.byteLength,c.enqueue(G1)}N0("stream_tool_prefix_rewrite",{readMs:A0}),M0(),c.close();return}V++,l+=j0.byteLength;let U0=J.decode(j0,{stream:!0});if(J0)uW(J0,U0);let F0=cW(x0,U0)??D0(U0);if(F0)throw N0("stream_tool_prefix_retryable_error",{error:F0.message,providerErrorType:F0.providerErrorType,readMs:A0,lastChunkBytes:j0.byteLength}),M0(),F0;let m1=G+U0,b1=i(),g0=mW(m1);if(b+=i()-b1,G=g0.pending,g0.ready){let L0=D.encode(g0.ready);h+=L0.byteLength,c.enqueue(L0)}let N1=i();if(V===1||V%25===0||N1-G0>5000)G0=N1,N0("stream_tool_prefix_progress",{readMs:A0,lastChunkBytes:j0.byteLength})}catch(I0){throw N0("stream_tool_prefix_error",{error:I0 instanceof Error?I0.message:String(I0)}),M0(),I0}},async cancel(c){N0("stream_tool_prefix_cancel",{reason:c instanceof Error?c.message:String(c)});try{await j.cancel(c)}finally{M0()}}});return new Response(C0,{status:W.status,statusText:W.statusText,headers:W.headers})}var gO="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",L4="~effect/http/HttpServerResponse",H4="~effect/http/Cookies",M4="~effect/http/HttpBody",hO="~effect/ErrorReporter/ignore",mO=60000,bO=60000,pO=5000,B4=200,Ej=240,iO=Ej;function lO(W){let O=Math.floor(W.retryAfterSeconds/60),j=W.retryAfterSeconds%60,J=`Retry in ${O}m ${j}s.`;return W.modelName?`${W.modelName} weekly limit reached, no routable accounts. ${J}`:`Killswitch: no routable accounts. ${J}`}function dO(W){if(!W.requestModelId)return{isScopedDriven:!1};if(!D1(W.mainQuota,W.storage))return{isScopedDriven:!1};let O=n4(W.mainQuota,W.requestModelId);if(!O)return{isScopedDriven:!1};if(!Number.isFinite(O.remainingPercent))return{isScopedDriven:!1};let j=r4(W.storage);if(O.remainingPercent<=j.scoped)return{isScopedDriven:!0,modelName:O.modelName,modelId:W.requestModelId};return{isScopedDriven:!1}}var uO=1,I4=!1;function h1(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function x(){return performance.now()}function n(W){return Math.round(W*10)/10}function F4(W){return Math.floor(Math.random()*Math.max(0,W))}function M1(W){if(typeof W==="string")return W;if(W instanceof URL)return W.toString();return W.url}function B1(W,O){return O?.method??(W instanceof Request?W.method:void 0)}function T4(W){return W instanceof Error?W.message:String(W)}function cO(){if(I4||!1||!h1())return;I4=!0;let W=100,O=250,j=x()+W;setInterval(()=>{let J=x(),D=J-j;if(j=J+W,D<O)return;r("[perf] opencode event_loop_lag",{lagMs:n(D),thresholdMs:O})},W).unref?.()}function nO(W){let O=x(),j={requestId:String(uO++),start:O,last:O,mark(J,D){let G=x();if(h1())r("[perf] opencode request stage",{requestId:j.requestId,stage:J,deltaMs:n(G-j.last),totalMs:n(G-j.start),...D});j.last=G},done(J,D){let G=x();if(h1())r("[perf] opencode request done",{requestId:j.requestId,stage:J,deltaMs:n(G-j.last),totalMs:n(G-j.start),...D});j.last=G}};if(h1())r("[perf] opencode request start",{requestId:j.requestId,...W});return j}async function x4(W,O,j,J=!0){let D=W.client.session,G=await vW(W.client,O),V={path:{id:O},body:{noReply:J,parts:[{type:"text",text:j,ignored:!0}]}};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 D?.promptAsync==="function"){await D.promptAsync(V);return}if(typeof D?.prompt==="function"){await Promise.resolve(D.prompt(V));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function oO(){let W=`msg_${g1().replaceAll("-","")}`,O=[`event: message_start
|
|
11
|
-
|
|
9
|
+
`);if(N===-1)return j===-1?null:{index:j,length:4};if(j===-1||N<j)return{index:N,length:2};return{index:j,length:4}}function _4(W,N){if(!N)return;W.pending+=N;while(!0){let j=KW(W.pending);if(!j)break;let J=W.pending.slice(0,j.index);W.pending=W.pending.slice(j.index+j.length);let $=b4(J);if(!$)continue;if(W.events++,q1(W.eventCounts,$.event??"unknown"),q1(W.typeCounts,$.type),q1(W.deltaTypeCounts,$.deltaType),q1(W.contentBlockTypeCounts,$.contentBlockType),W.textDeltaBytes+=$.textDeltaBytes??0,W.thinkingDeltaBytes+=$.thinkingDeltaBytes??0,W.inputJsonDeltaBytes+=$.inputJsonDeltaBytes??0,W.signatureDeltaBytes+=$.signatureDeltaBytes??0,W.redactedThinkingBytes+=$.redactedThinkingBytes??0,W.last=$,$.dataBytes>0&&!$.type&&!$.event)W.parseErrors++}}function NJ(){return{pending:"",completed:!1}}function JJ(W,N){if(!N||W.completed)return null;W.pending+=N;while(!0){let j=KW(W.pending);if(!j)return null;let J=W.pending.slice(0,j.index);W.pending=W.pending.slice(j.index+j.length);let $=b4(J);if($?.type!=="message_delta"||!$.stopReason)continue;return W.completed=!0,$.stopReason==="refusal"?{type:"content-filter"}:{type:"complete",finishReason:$.stopReason}}}function OJ(){return{pending:""}}function $J(W,N){let j=W?.toLowerCase(),J=N.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 YJ(W,N){let j=W?`${W}: ${N}`:N,J=Error(`Anthropic stream error: ${j}`);if(J.code="ECONNRESET",J.syscall="anthropic-sse",W)J.providerErrorType=W;return J}function ZJ(){let W=Error("Fable response was blocked by the provider content filter; retrying with Opus 4.8");return W.code="ECONNRESET",W.syscall="anthropic-sse",W.providerErrorType="refusal",W}function DJ(W){if(!W.includes("error"))return null;let N,j=[];for(let b of W.split(/\r?\n/)){if(b.startsWith("event:")){N=b.slice(6).trim();continue}if(b.startsWith("data:")){let l=b.slice(5);j.push(l.startsWith(" ")?l.slice(1):l)}}let J=j.join(`
|
|
10
|
+
`);if(!J||J==="[DONE]")return null;let $;try{$=JSON.parse(J)}catch{return null}let G=p0($);if(N!=="error"&&P0(G,"type")!=="error")return null;let K=p0(G?.error),L=P0(K,"type")??P0(K,"code")??void 0,g=P0(K,"message")??P0(G,"message")??L??"Anthropic stream error";if(!$J(L,g))return null;return YJ(L,g)}function z4(W,N){if(!N)return null;W.pending+=N;while(!0){let j=KW(W.pending);if(!j)break;let J=W.pending.slice(0,j.index);W.pending=W.pending.slice(j.index+j.length);let $=DJ(J);if($)return $}return null}function GJ(W){return{sseEvents:W.events,ssePendingChars:W.pending.length,sseParseErrors:W.parseErrors,sseEventCounts:{...W.eventCounts},sseTypeCounts:{...W.typeCounts},sseDeltaTypeCounts:{...W.deltaTypeCounts},sseContentBlockTypeCounts:{...W.contentBlockTypeCounts},sseTextDeltaBytes:W.textDeltaBytes,sseThinkingDeltaBytes:W.thinkingDeltaBytes,sseInputJsonDeltaBytes:W.inputJsonDeltaBytes,sseSignatureDeltaBytes:W.signatureDeltaBytes,sseRedactedThinkingBytes:W.redactedThinkingBytes,sseLastEvent:W.last?{...W.last}:void 0}}function p4(W,N={}){if(!W.body)return W;let j=W.body.getReader(),J=new TextDecoder,$=new TextEncoder,G="",K=0,L=0,g=0,b=0,l=0,r=!1,M=!1,O0=n(),x0=n(),_0=N.perf?WJ():void 0,L0=OJ(),q0=N.onContentFilter||N.onComplete?NJ():void 0,M0=(s)=>{if(!q0)return null;let K0=JJ(q0,s);if(K0?.type==="content-filter"&&N.onContentFilter)return N.onContentFilter()===!1?null:ZJ();if(K0?.type==="complete")N.onComplete?.(K0.finishReason);return null},A0=()=>{if(M)return;M=!0,j.releaseLock()},u0=async(s)=>{try{await j.cancel(s)}catch{}finally{A0()}},n0=(s={})=>({chunks:K,pulls:L,inputBytes:g,outputBytes:b,pendingChars:G.length,rewriteMs:H0(l),totalMs:H0(n()-x0),..._0?GJ(_0):{},...s}),Z0=(s,K0={})=>{N.perf?.(s,n0(K0))};N.perf?.("stream_tool_prefix_wrapper_created",{status:W.status,hasBody:!0});let t1=new ReadableStream({async pull(s){if(L++,!r)r=!0,Z0("stream_tool_prefix_first_pull");let K0=n();try{let{done:B0,value:o0}=await j.read(),D0=H0(n()-K0);if(B0){let R0=J.decode();if(_0)_4(_0,R0);let y0=z4(L0,R0)??M0(R0);if(y0)throw Z0("stream_tool_prefix_retryable_error",{error:y0.message,providerErrorType:y0.providerErrorType}),await u0(y0),y0;let D1=n(),F1=Z4(`${G}${R0}`,!0);if(l+=n()-D1,F1.ready){let I1=$.encode(F1.ready);b+=I1.byteLength,s.enqueue(I1)}Z0("stream_tool_prefix_rewrite",{readMs:D0}),A0(),s.close();return}K++,g+=o0.byteLength;let g0=J.decode(o0,{stream:!0});if(_0)_4(_0,g0);let F0=z4(L0,g0)??M0(g0);if(F0)throw Z0("stream_tool_prefix_retryable_error",{error:F0.message,providerErrorType:F0.providerErrorType,readMs:D0,lastChunkBytes:o0.byteLength}),A0(),F0;let r0=G+g0,e1=n(),Y1=Z4(r0);if(l+=n()-e1,G=Y1.pending,Y1.ready){let R0=$.encode(Y1.ready);b+=R0.byteLength,s.enqueue(R0)}let Z1=n();if(K===1||K%25===0||Z1-O0>5000)O0=Z1,Z0("stream_tool_prefix_progress",{readMs:D0,lastChunkBytes:o0.byteLength})}catch(B0){throw Z0("stream_tool_prefix_error",{error:B0 instanceof Error?B0.message:String(B0)}),A0(),B0}},async cancel(s){Z0("stream_tool_prefix_cancel",{reason:s instanceof Error?s.message:String(s)});try{await j.cancel(s)}finally{A0()}}});return new Response(t1,{status:W.status,statusText:W.statusText,headers:W.headers})}var XJ="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",i4="~effect/http/HttpServerResponse",d4="~effect/http/Cookies",l4="~effect/http/HttpBody",VJ="~effect/ErrorReporter/ignore",KJ=60000,_J=60000,zJ=5000,c4=200,jN=240,wJ=jN;function PJ(W){let N=Math.floor(W.retryAfterSeconds/60),j=W.retryAfterSeconds%60,J=`Retry in ${N}m ${j}s.`;return W.modelName?`${W.modelName} weekly limit reached, no routable accounts. ${J}`:`Killswitch: no routable accounts. ${J}`}function UJ(W){if(!W.requestModelId)return{isScopedDriven:!1};if(!c0(W.mainQuota,W.storage))return{isScopedDriven:!1};let N=wj(W.mainQuota,W.requestModelId);if(!N)return{isScopedDriven:!1};if(!Number.isFinite(N.remainingPercent))return{isScopedDriven:!1};let j=Pj(W.storage);if(N.remainingPercent<=j.scoped)return{isScopedDriven:!0,modelName:N.modelName,modelId:W.requestModelId};return{isScopedDriven:!1}}var CJ=1,u4=!1;function a1(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function q(){return performance.now()}function a(W){return Math.round(W*10)/10}function n4(W){return Math.floor(Math.random()*Math.max(0,W))}function g1(W){if(typeof W==="string")return W;if(W instanceof URL)return W.toString();return W.url}function y1(W,N){return N?.method??(W instanceof Request?W.method:void 0)}function o4(W){return W instanceof Error?W.message:String(W)}function QJ(){if(u4||!1||!a1())return;u4=!0;let W=100,N=250,j=q()+W;setInterval(()=>{let J=q(),$=J-j;if(j=J+W,$<N)return;t("[perf] opencode event_loop_lag",{lagMs:a($),thresholdMs:N})},W).unref?.()}function HJ(W){let N=q(),j={requestId:String(CJ++),start:N,last:N,mark(J,$){let G=q();if(a1())t("[perf] opencode request stage",{requestId:j.requestId,stage:J,deltaMs:a(G-j.last),totalMs:a(G-j.start),...$});j.last=G},done(J,$){let G=q();if(a1())t("[perf] opencode request done",{requestId:j.requestId,stage:J,deltaMs:a(G-j.last),totalMs:a(G-j.start),...$});j.last=G}};if(a1())t("[perf] opencode request start",{requestId:j.requestId,...W});return j}function LJ(W,N){let j=/^msg_([0-9a-fA-F]{12})/.exec(W);if(!j)return;let J=BigInt(`0x${j[1]}`);if(J<=0n)return;let G=`msg_${(J-1n).toString(16).padStart(12,"0")}${"z".repeat(14)}`;if(N&&G<=N)return;return G}async function r4(W,N,j,J={}){let $=W.client.session,G=await tW(W.client,N),K={path:{id:N},body:{noReply:J.noReply??!0,parts:[{type:"text",text:j,ignored:!0}]}};if(J.beforeActiveAssistant){let L=G?.latestAssistantMessageId?LJ(G.latestAssistantMessageId,G.latestUserMessageId):void 0;if(!L)throw Error("OpenCode active assistant ordering is unavailable for an immediate notification.");K.body.messageID=L}if(G?.agent)K.body.agent=G.agent;if(G?.model)K.body.model=G.model;if(G?.variant)K.body.variant=G.variant;if(typeof $?.promptAsync==="function"){await $.promptAsync(K);return}if(typeof $?.prompt==="function"){await Promise.resolve($.prompt(K));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function MJ(){let W=Error(XJ);throw W[i4]=i4,W[VJ]=!0,W.status=204,W.statusText=void 0,W.headers={},W.cookies={[d4]:d4,cookies:{}},W.body={[l4]:l4,_tag:"Empty"},W}function BJ(W){if(W.sessionID==null)return!1;let N=W.model;return N?.providerID==="anthropic"||N?.api?.npm==="@ai-sdk/anthropic"||N?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function FJ(W){if(W.some((N)=>N.includes("<use_parallel_tool_calls>")))return!1;return W.push(s4),!0}var IJ={input:0,output:0,cache:{read:0,write:0}},TJ="Fable content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Fable cache warm.",xJ="Fable recovery window complete. Returning to Fable 5.";function EJ(W){let N=W["claude-opus-4-8"]??W["claude-opus-4-5"]??Object.values(W)[0];if(!N)return W;return{...W,...Object.fromEntries(Object.values(pj).map((j)=>[j.id,{...N,id:j.id,name:j.name,api:N.api?{...N.api,id:j.id}:void 0,cost:{input:M1.input,output:M1.output,cache:{read:M1.cacheRead,write:M1.cacheWrite5m}},limit:{...N.limit??{},context:hj,output:mj},capabilities:{...N.capabilities??{},reasoning:!0,attachment:!0,toolcall:!0},release_date:bj}]))}}function vJ(W){return Object.fromEntries(Object.entries(W).map(([N,j])=>[N,{...j,cost:IJ}]))}var j3=async(W)=>{QJ();let{client:N}=W,j=Wj(),J=600000,$=50,G=new Map;function K(){let O=Date.now();for(let[Y,X]of G)if(O-X.createdAt>J)G.delete(Y)}function L(O,Y){if(K(),G.size>=$){let X="",Q=1/0;for(let[Z,T]of G)if(T.createdAt<Q)Q=T.createdAt,X=Z;if(X)G.delete(X)}G.set(O,Y)}function g(O){K();let Y=G.get(O);if(!Y)return;if(Date.now()-Y.createdAt>J){G.delete(O);return}return Y}let b;try{b=await R(j)}catch(O){let Y=O instanceof Error?O.message:String(O);throw Error(`Failed to load account store: ${Y}`,{cause:O instanceof Error?O:void 0})}let l=new NW,r=new aj({path:process.env.OPENCODE_ANTHROPIC_AUTH_ROUTING_STATE_FILE||rj(j)}),M=new ij({storage:b,onMainQuotaFetched:async(O,Y,X,Q)=>{try{let Z=await R(j)??T0(),T=zj(Z);if(T&&T.checkedAt>=Q&&Mj(T.quota,Z,T.checkedAt)>Date.now()){M.seedMainFromStorage(Z);return}Z.quota=Z.quota??{},Z.quota.mainQuota=O,Z.quota.mainQuotaCheckedAt=Y,Z.quota.mainQuotaToken=X,Z.quota.mainLastQuotaApiError=void 0,await P1(Z,j,{mainQuota:!0})}catch(Z){i.warn("quota","failed to persist main quota",{error:Z instanceof Error?Z.message:String(Z)})}},onApiError:async(O)=>{try{let Y=await R(j)??T0();Y.quota=Y.quota??{},Y.quota.mainLastQuotaApiError=O,await P1(Y,j,{mainQuota:!0})}catch(Y){i.warn("quota","failed to persist backoff state",{error:Y instanceof Error?Y.message:String(Y)})}}}),O0=new Bj({quotaManager:M,onFallbackStorageChanged:()=>{B0().catch(()=>{})}});O0.startBackgroundRefresh();let x0=null,_0=new fj({directory:process.env.OPENCODE_ANTHROPIC_AUTH_CACHEKEEP_REGISTRY_DIR||Sj("opencode")}),L0=[],q0=new vj({loadStorage:()=>R(j),onTrackedSessionsChanged:async(O)=>{await _0.publish(O),L0=await _0.list(O)},prepareHeaders:async(O,Y)=>{let X,Q=Y.oauthAccountId;if(Q&&Q!=="main"){let Z=await R(j),T=Z?.accounts.find((U)=>U.id===Q&&U.enabled!==!1&&U0(U));if(!T||!Z)throw Error(`OAuth account ${Q} is unavailable for cache prewarm`);let B=T;try{B=await O0.refreshAccount(T,Z)}catch(U){i.warn("cachekeep","fallback token refresh failed",{accountId:Q,error:U instanceof Error?U.message:String(U)})}if(X=B.access,!X)throw Error(`OAuth account ${Q} has no access token for cache prewarm`)}else{if(!D0)return O;let Z=await D0();if(Z.type!=="oauth")return O;if(!Z.access||Z.expires&&Z.expires<Date.now()){if(!x0)return O;Z.access=await x0()}X=Z.access}if(!X)return O;try{let Z=JSON.parse(Y.bodyText),T=await HW(X,typeof Z.model==="string"?Z.model:void 0);if(O.delete("anthropic-beta"),w1(O,X,{body:Z,identity:T}),O.set("anthropic-beta",_1(O.get("anthropic-beta"),[Ij])),Z.speed==="fast")R1(O)}catch{w1(O,X)}return O}}),M0=new Map;function A0(O){let Y=O.plan.sessionId,X=async()=>{let T=O.warmTarget;if(!T){i.debug("fable-fallback","cache warm skipped",{session:Y,reason:"Opus response was not served by an OAuth route"});return}let B=m4(T.bodyText,O.plan.requestedModel);if(!B.ok){i.warn("fable-fallback","cache warm skipped",{session:Y,reason:B.reason});return}try{let U=await q0.prewarmNow({sessionId:Y,url:T.url,headers:T.headers,bodyText:B.bodyText,oauthAccountId:l.recoveryAccount(O.plan)??T.oauthAccountId});if(U.ok){i.debug("fable-fallback","Fable cache warmed",{session:Y,remaining:l.remaining(Y),...U.usage&&{usage:U.usage}});return}i.warn("fable-fallback","Fable cache warm skipped",{session:Y,status:U.status,reason:U.reason})}catch(U){i.warn("fable-fallback","Fable cache warm failed",{session:Y,error:U instanceof Error?U.message:String(U)})}},Z=(M0.get(Y)??Promise.resolve()).then(X,X);return M0.set(Y,Z),Z.finally(()=>{if(M0.get(Y)===Z)M0.delete(Y)}),Z}async function u0(){return L0=await _0.list(q0.trackedSessions()),L0}if(H1({enabled:U1(b),mode:C1(b)}),n1(p1(b)),r1(i1(b)),!process.env.OPENCODE_ANTHROPIC_AUTH_LOG_LEVEL)t4(c1(b)??"info");let n0=null;if(W.directory){let O=globalThis;if(O.__anthropicAuthRpcServer)await O.__anthropicAuthRpcServer.stop().catch(()=>{}),O.__anthropicAuthRpcServer=void 0;try{n0=await J4({dir:tj(W.directory),drain:j4,apply:DN}),O.__anthropicAuthRpcServer=n0}catch(Y){i.warn("rpc","failed to start",{error:Y instanceof Error?Y.message:String(Y)})}}let Z0={activeId:"main",route:"main"},t1=ej(),s=new Map;function K0(O,Y){Z0={activeId:Y.activeId,route:Y.route},M.updateStorage(O),M.seedMainFromStorage(O,Y.mainAccessToken),M.seedFallbacksFromAccounts((O?.accounts??[]).filter(U0));let X=M.getMain(Y.mainAccessToken),Q=M.getLastApiError(),Z=O?.refresh?.mainLastRefreshError,T={main:{quota:X?.quota??null,quotaBackedOff:M.isBackedOff(),quotaBackoffUntil:Q?.nextRetryAt,refreshBackedOff:Z?d0(Z,Y.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:Z?.nextRetryAt},fallbacks:(O?.accounts??[]).filter((B)=>B.enabled!==!1&&U0(B)).map((B)=>({id:B.id,label:B.label,quota:B.access?M.getFallback(B.id,B.access)?.quota??null:null,needsReauth:B.lastRefreshError!=null&&d0(B.lastRefreshError,B.refresh,Date.now())&&N1(B.lastRefreshError),enabled:B.enabled!==!1})),activeId:Y.activeId,route:Y.route,relay:(()=>{let B=RW(O);return B?{enabled:!0,transport:B.transport??"http"}:null})(),fastMode:o1(),cacheKeep:{enabled:FW(O),window:BW(O)?"always":O?.cacheKeep?.startHour!=null&&O?.cacheKeep?.endHour!=null?`${O.cacheKeep.startHour}-${O.cacheKeep.endHour}`:void 0,trackedSessions:L0.length},fableRecoveries:s.size>0?[...s.values()]:void 0,lastUpdated:Date.now()};return WN(T,t1).catch((B)=>i.warn("sidebar","state write failed",{error:B instanceof Error?B.message:String(B)}))}async function B0(){let O=await R(j),Y,X;if(D0)try{let Q=await D0();Y=Q.access,X=Q.refresh}catch{}K0(O,{activeId:Z0.activeId,route:Z0.route,mainAccessToken:Y,mainRefreshToken:X})}function o0(O,Y){if(!Y)return;if(O?.quota?.enabled!==!0)return;if(M.getMain(Y))return;if(g0)return;g0=!0,M.refreshMain(Y).then(()=>B0()).catch(()=>{}).finally(()=>{g0=!1})}let D0=null,g0=!1,F0=null,r0=0;function e1(O){let Y=O?.refresh?.refreshBeforeExpiryMinutes??wJ;return Math.max(jN,Y)*60000}function Y1(O){return O?.refresh?.enabled!==!1}async function Z1(O){if(!O)return;let Y=await R(j),X=Y?.refresh?.mainLastRefreshError;if(!Y?.refresh||!X?.tokenHash)return;let Q=l1(O);if(X.tokenHash===Q)return;if(X.nextRetryAt&&X.nextRetryAt>Date.now()){t("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:X.nextRetryAt,retryCount:X.retryCount,remainingMs:X.nextRetryAt-Date.now()});return}Y.refresh.mainLastRefreshError=void 0,await P1(Y,j,{mainRefresh:!0}),t("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:X.checkedAt,previousNextRetryAt:X.nextRetryAt,previousRetryCount:X.retryCount})}async function R0(){let O=[];if(D0)try{let Z=await D0();if(Z.type==="oauth"&&Z.access){let T=await M.refreshMain(Z.access);O.push({name:"OpenCode anthropic",role:"main",quota:T})}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 T=Z instanceof Error?Z.message:String(Z);O.push({name:"OpenCode anthropic",role:"main",error:T.includes("429")?"Usage API rate limited — try again in a moment":T})}let{storage:Y,errors:X}=await O0.refreshQuotaForAllAccounts({force:!0}),Q=new Map(X.map((Z)=>[Z.accountId,Z.message]));if(O.push(...dj(Y,Q)),!D0)O.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return lj({accounts:O,refreshedAt:Date.now()})}async function y0(O){if(D0)try{let Y=await D0();K0(O,{activeId:Z0.activeId,route:Z0.route,mainAccessToken:Y.access,mainRefreshToken:Y.refresh})}catch{}}function D1(O,Y,X,Q){if(s.delete(O.sessionId),s.set(O.sessionId,{...O,changedAt:Date.now()}),s.size>128){let Z=s.keys().next().value;if(Z)s.delete(Z)}if(K0(Y,{activeId:Z0.activeId,route:Z0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh}),!Q||OW(O.sessionId))return;r4(W,O.sessionId,Q,{noReply:!0,beforeActiveAssistant:!0}).catch((Z)=>{i.warn("fable-fallback","Desktop notification failed",{session:O.sessionId,error:Z instanceof Error?Z.message:String(Z)})})}function F1(O,Y,X){if(!O||!s.delete(O))return;K0(Y,{activeId:Z0.activeId,route:Z0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh})}async function I1(O){let Y=Fj(O);if(Y.type==="enable"||Y.type==="disable"){let T=Y.type==="enable",B=await Nj(T),U=C1(B);return H1({enabled:T,mode:U}),i.info("commands","cache enabled changed",{enabled:T}),u1({argumentsText:O,enabled:T,mode:U})}if(Y.type==="mode"){let T=await Jj(Y.mode),B=U1(T);return H1({enabled:B,mode:Y.mode}),i.info("commands","cache mode changed",{mode:Y.mode}),u1({argumentsText:O,enabled:B,mode:Y.mode})}let X=await R(j),Q=U1(X),Z=C1(X);return H1({enabled:Q,mode:Z}),u1({argumentsText:O,enabled:Q,mode:Z})}async function NN(O){let Y=Tj(O),X=await R(j);if(Y.type==="window")X=await Yj(Y.startHour,Y.endHour),i.info("commands","cachekeep schedule changed",{schedule:`${Y.startHour}-${Y.endHour}`});else if(Y.type==="always")X=await Zj(),i.info("commands","cachekeep schedule changed",{schedule:"always"});else if(Y.type==="disable")X=await Dj(!1),i.info("commands","cachekeep enabled changed",{enabled:!1});else if(Y.type==="subagents")X=await Xj(Y.enabled),i.info("commands","cachekeep subagents changed",{subagents:Y.enabled});let Q=MW(X),Z=await u0(),T=Z.length?Math.min(...Z.map((B)=>B.nextPrewarmAt)):void 0;return Ej({argumentsText:O,enabled:xj(X),always:BW(X),window:Q,hybridActive:FW(X),trackedSessions:Z.length,trackedSessionDetails:Z,nextPrewarmAt:T})}async function JN(O){let Y=Rj(O);if(Y.type==="enable"||Y.type==="disable"){let Z=Y.type==="enable";return await Oj(Z),n1(Z),i.info("commands","dump changed",{enabled:Z}),xW({argumentsText:O,enabled:Z})}let X=await R(j),Q=p1(X);return n1(Q),xW({argumentsText:O,enabled:Q})}async function ON(O){let Y=kj(O);if(Y.type==="enable"||Y.type==="disable"){let Z=Y.type==="enable";return await $j(Z),r1(Z),i.info("commands","fast mode changed",{enabled:Z}),vW({argumentsText:O,enabled:Z})}let X=await R(j),Q=i1(X);return r1(Q),vW({argumentsText:O,enabled:Q})}async function $N(O,Y){let X=nj(O);if(X.type==="mode")return await uj(X.mode,j),i.info("commands","routing mode changed",{mode:X.mode}),gW({argumentsText:O,mode:X.mode});if(X.type==="reset"&&Y)await r.clear(Y),i.info("commands","sticky routing assignment reset");let Q=await R(j);return gW({argumentsText:O,mode:B1(Q)})}async function YN(O){let Y=yj(O);if(Y.type==="level")return await _j(Y.level),i.info("commands","log level changed",{level:Y.level}),qW({argumentsText:O,level:Y.level});let X=await R(j),Q=c1(X)??"info";return qW({argumentsText:O,level:Q})}async function ZN(O,Y){let X=qj(O);if(X.type==="add-apikey"){if(!X.apiKey)return{text:"API key is required",accounts:S0(await R(j)??T0())};let U=X.label?.trim()||void 0,x=Date.now(),o=X.baseURL?.trim()||"https://api.kie.ai/claude";if(!b1(o))return{text:"Invalid base URL. Must be an http(s) URL without embedded credentials.",accounts:S0(await R(j)??T0())};let $0=X.authHeader??"authorization-bearer",Y0={id:U||_W(),label:U||void 0,type:"api",apiKey:X.apiKey,baseURL:o,authHeader:$0,enabled:!0,addedAt:x,lastUsed:x};await CW(Y0,j),i.info("commands","account added",{id:Y0.id,label:Y0.label,type:"apikey"});let Q0=await R(j);await y0(Q0);let s0=S0(Q0??{version:1,accounts:[]});return{text:`API key account "${Y0.label??Y0.id}" added.`,accounts:s0}}if(X.type==="add-oauth-start"){let U=await h1("max"),x={state:U.state,verifier:U.verifier,redirectUri:U.redirectUri,createdAt:Date.now()};return L(Y??"default",x),{text:`Open this URL in your browser:
|
|
11
|
+
${U.url}`,knobs:{oauthUrl:U.url},accounts:S0(await R(j)??T0())}}if(X.type==="add-oauth-finish"){let U=Y??"default",x=g(U);if(!x)return{text:"OAuth session expired. Please start again.",accounts:S0(await R(j)??T0())};try{let o=await m1(X.code,x.verifier,x.redirectUri,x.state);if(o.type==="failed")return{text:"OAuth authentication failed. Please check the code and try again.",accounts:S0(await R(j)??T0())};let $0=Date.now(),Y0={id:_W(),type:"oauth",label:X.label||void 0,access:o.access,refresh:o.refresh,expires:o.expires,enabled:!0,addedAt:$0,lastUsed:$0,lastRefreshedAt:$0};await CW(Y0,j),i.info("commands","account added",{id:Y0.id,label:Y0.label,type:"oauth"});let Q0=await R(j);return await y0(Q0),{text:"OAuth account added.",accounts:S0(Q0??T0())}}catch{return{text:"OAuth exchange failed due to a network error. Please try again.",accounts:S0(await R(j)??T0())}}finally{G.delete(U)}}let Q=await R(j),Z=Aj({argumentsText:O,storage:Q??{version:1,accounts:[]}});if(Z.updated){if(Z.updated.action==="enable"||Z.updated.action==="disable"){let x=Z.updated.action==="enable";await Lj(Z.updated.id,x,j);let o=Z.updated.id,$0=Q?.accounts.find((Y0)=>Y0.id===o);i.info("commands",`account ${Z.updated.action}d`,{id:o,label:$0?.label,enabled:x})}else if(Z.updated.action==="remove"){await Qj(Z.updated.id,j);let x=Z.updated.id,o=Q?.accounts.find(($0)=>$0.id===x);i.info("commands","account removed",{id:x,label:o?.label})}else if(Z.updated.action==="reorder"){await Hj(Z.updated.newOrder??Z.updated.previousOrder??[],j);let x=Z.updated.id,o=Q?.accounts.find(($0)=>$0.id===x);i.info("commands","account reordered",{id:x,label:o?.label})}let U=await R(j);if(D0)try{let x=await D0();K0(U,{activeId:Z0.activeId,route:Z0.route,mainAccessToken:x.access,mainRefreshToken:x.refresh})}catch{}}let T=await R(j),B=S0(T??{version:1,accounts:[]});return{text:Z.text,accounts:B}}async function yW(O,Y,X){if(O==="claude-quota")return{command:O,text:await R0(),knobs:{}};if(O==="claude-logging"){let U=await YN(Y),x=await R(j);return{command:O,text:U,knobs:{level:c1(x)??"info"}}}if(O==="claude-account"){let U=await ZN(Y,X),x={accounts:U.accounts};if("knobs"in U&&U.knobs)Object.assign(x,U.knobs);return{command:O,text:U.text,knobs:x}}if(O==="claude-routing"){let U=await $N(Y,X),x=await R(j);return{command:O,text:U,knobs:{mode:B1(x)}}}if(O==="claude-fast"){let U=await ON(Y),x=await R(j);return{command:O,text:U,knobs:{enabled:i1(x)}}}if(O==="claude-dump"){let U=await JN(Y),x=await R(j);return{command:O,text:U,knobs:{enabled:p1(x)}}}if(O==="claude-cache"){let U=await I1(Y),x=await R(j);return{command:O,text:U,knobs:{enabled:U1(x),mode:C1(x)}}}if(O==="claude-cachekeep"){let U=await NN(Y),x=await R(j);return{command:O,text:U,knobs:{window:MW(x)}}}let Q=await R(),Z=UW(Q),T=(Q?.accounts??[]).filter((U)=>U.enabled!==!1).map((U)=>U.id),B=gj({argumentsText:Y,config:Z,accountIds:T});if(B.updatedConfig){if(await Cj(B.updatedConfig),Z.enabled!==B.updatedConfig.enabled)i.info("commands","killswitch changed",{enabled:B.updatedConfig.enabled===!0});if(JSON.stringify(Z.main)!==JSON.stringify(B.updatedConfig.main)||JSON.stringify(Z.accounts)!==JSON.stringify(B.updatedConfig.accounts))i.info("commands","killswitch thresholds changed",{thresholds:B.updatedConfig.main??B.updatedConfig.accounts})}return{command:O,text:B.text,knobs:{config:UW(await R()),accountIds:T}}}async function DN(O){let Y=await yW(O.command,O.arguments,O.sessionId);return{text:Y.text,knobs:Y.knobs}}function GN(O,Y=10){let X=Math.max(0,Math.min(Math.round(O/100*Y),Y));return"█".repeat(X)+"░".repeat(Y-X)}function T1(O,Y){return`${O} ${GN(Y)} ${String(Math.round(Y)).padStart(3)}%`}function hW(O){if(!O)return"";let Y=new Date(O).getTime();if(Number.isNaN(Y))return"";let X=Y-Date.now();if(X<=0)return"resets now";let Q=Math.floor(X/60000);if(Q<1)return"resets <1m";if(Q<60)return`resets ${Q}m`;let Z=Math.floor(Q/60),T=Q%60;return T>0?`resets ${Z}h${T}m`:`resets ${Z}h`}function XN(O,Y,X){let Q=[],Z=0;if(O){let{five_hour:U,seven_day:x}=O;if(U||x){let $0=X==="main"?"active":"idle",Y0=hW(U?.resetsAt),Q0=[`main · ${$0}${Y0?` (${Y0})`:""}`];if(U)Q0.push(T1("5h",U.usedPercent)),Z=Math.max(Z,U.usedPercent);if(x)Q0.push(T1("7d",x.usedPercent)),Z=Math.max(Z,x.usedPercent);Q.push(Q0.join(`
|
|
12
|
+
`))}}if(Y?.length)for(let U of Y){let x=U.quota;if(!x)continue;let{five_hour:o,seven_day:$0}=x;if(!o&&!$0)continue;let Y0=U.label||"alt",s0=X===U.id?"active":"idle",k0=hW(o?.resetsAt),h0=[`${Y0} · ${s0}${k0?` (${k0})`:""}`];if(o)h0.push(T1("5h",o.usedPercent)),Z=Math.max(Z,o.usedPercent);if($0)h0.push(T1("7d",$0.usedPercent)),Z=Math.max(Z,$0.usedPercent);Q.push(h0.join(`
|
|
13
|
+
`))}if(!Q.length)return;let T=Q.join(`
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}})}
|
|
15
|
+
`),B=Z>=90?"error":Z>=70?"warning":"info";N.tui?.showToast?.({body:{title:"Claude Quota",message:T,variant:B,duration:B==="error"?8000:5000}})?.catch?.(()=>{})}return{event:async({event:O})=>{let Y=O,X=Y.properties?.sessionID??Y.properties?.info?.id;if(!X)return;if(Y.type==="session.deleted")s.delete(X)},config:async(O)=>{O.command={...O.command??{},[QW]:{template:QW,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[IW]:{template:IW,description:"Manage fallback accounts — list, enable/disable, reorder, remove, or add (API key or OAuth)."},[LW]:{template:LW,description:"Keep hybrid Claude cache warm always or during a local time window."},[AW]:{template:AW,description:"Show current Claude OAuth quota usage for all accounts."},[TW]:{template:TW,description:"Show or toggle Anthropic request dump capture for debugging."},[EW]:{template:EW,description:"Show or toggle Anthropic fast mode for supported Opus models."},[fW]:{template:fW,description:"Show or set the plugin log level (error, warn, info, debug, trace)."},[kW]:{template:kW,description:"Show or change Claude account routing: main-first, fallback-first, or sticky-balanced."},[SW]:{template:SW,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async(O,Y)=>{if(!BJ(O))return;FJ(Y.system)},provider:{id:"anthropic",async models(O,Y){let X=EJ(O.models);if(Y.auth?.type!=="oauth"||!e4(b??{}))return X;return vJ(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,Q=await yW(X,O.arguments,O.sessionID);if(X==="claude-quota"){let Z=await R(),T=D0?await D0().catch(()=>{return}):void 0;K0(Z,{activeId:"main",route:"main",mainAccessToken:T?.access,mainRefreshToken:T?.refresh})}if(OW(O.sessionID))W4(Q,O.sessionID);else await r4(W,O.sessionID,Q.text);MJ()},auth:{provider:"anthropic",async loader(O,Y){D0=O;let X=await O();if(X.type==="oauth"){let T=function(){if(F0)clearInterval(F0),F0=null;let V=async()=>{try{let _=await R(j);if(!Y1(_))return;let f=await O();if(f.type!=="oauth")return;if(await Z1(f.refresh),!f.expires)return;let E=f.expires-Date.now(),z=e1(_);if(E>z)return;if(t("[refresh] opencode main oauth background due",{expiresInMs:E,refreshBeforeMs:z}),f.refresh&&d0(_?.refresh?.mainLastRefreshError,f.refresh,Date.now())){t("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:_?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:_?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:E});return}if(f.refresh&&_?.refresh?.mainRefreshLeaseUntil&&_.refresh.mainRefreshLeaseUntil>Date.now()&&_.refresh.mainRefreshLeaseTokenHash===l1(f.refresh))return;await Z();let v=await O();t("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:v.expires?v.expires-Date.now():void 0})}catch(_){i.warn("refresh","opencode main oauth refresh failed",{message:_ instanceof Error?_.message:String(_)})}};if(F0=setInterval(()=>{V()},KJ+n4(_J)),"unref"in F0)F0.unref()},B=function(V,_){if(V instanceof Request&&V.body)return!1;return _==null||typeof _==="string"},U=function(V){if(typeof V!=="string")return;try{let _=JSON.parse(V);return typeof _.model==="string"?_.model:void 0}catch{return}},x=function(V){return V.has("x-parent-session-id")},o=function(V){return V.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(V)},$0=function(V){return V?.quota?.enabled===!0},Q0=function(V,_){if(V.delete("authorization"),V.delete("x-api-key"),_.authHeader==="x-api-key")V.set("x-api-key",_.apiKey??"");else V.set("Authorization",`Bearer ${_.apiKey??""}`);V.set("Content-Type","application/json")},h0=function(V){return M.getFallback(V.id,V.access)?.quota??V.quota},WW=function(V){return["five_hour","seven_day"].some((_)=>(V?.[_]?.remainingPercent??1)<=0)},mW=function(V,_){return V.status===429||_},x1=function(V){if(!V)return!1;let _=M.getMain(V);return Boolean(_&&_.refreshAfter>Date.now()&&WW(_.quota))},Q=null;async function Z(){if(!Q)Q=(async()=>{let f=null,E=null,z=null;async function v(P){let F=await R(j)??T0();F.refresh=F.refresh??{},P(F),await P1(F,j,{mainRefresh:!0})}async function m(P){let F=Date.now()+zJ;while(Date.now()<F){await new Promise((w)=>setTimeout(w,c4+n4(c4)));let H=await O();if(H.type!=="oauth"||!H.access)continue;if((H.access!==P.access||H.refresh!==P.refresh||(H.expires??0)>(P.expires??0)+60000)&&(!H.expires||H.expires>Date.now()))return t("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:H.expires?H.expires-Date.now():void 0}),H.access}return null}for(let P=0;P<=2;P++){let F=null;try{if(P>0){let y=500*2**(P-1);await new Promise((j0)=>setTimeout(j0,y))}if(F=await O(),!F.refresh)throw Error("Token refresh failed: missing refresh token");let H=await R(j),D=l1(F.refresh),w=H?.refresh?.mainLastRefreshError;if(t("[refresh] opencode main oauth refresh check",{attempt:P,expiresInMs:F.expires?F.expires-Date.now():void 0,hasBackoff:Boolean(w),backoffActive:w?d0(w,F.refresh,Date.now()):!1,retryCount:w?.retryCount,nextRetryAt:w?.nextRetryAt}),w&&d0(w,F.refresh,Date.now()))throw t("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:w.nextRetryAt,retryCount:w.retryCount}),Error(zW(w,Date.now()));if(H?.refresh?.mainRefreshLeaseUntil&&H.refresh.mainRefreshLeaseUntil>Date.now()&&H.refresh.mainRefreshLeaseTokenHash===D){t("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:H.refresh.mainRefreshLeaseUntil});let y=await m(F);if(y)return y;throw Error("Claude OAuth refresh is already in progress")}let C=await jj({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!C){t("[refresh] opencode main oauth refresh skipped file lock");let y=await m(F);if(y)return y;throw Error("Claude OAuth refresh is already in progress")}z=C.release,f=_W(),E=D,await v((y)=>{y.refresh=y.refresh??{},y.refresh.mainRefreshLeaseId=f??void 0,y.refresh.mainRefreshLeaseUntil=Date.now()+120000,y.refresh.mainRefreshLeaseTokenHash=D});let h=await R(j);if(t("[refresh] opencode main oauth refresh lease acquired",{attempt:P,leaseUntil:Date.now()+120000}),h?.refresh?.mainRefreshLeaseId!==f||h.refresh.mainRefreshLeaseTokenHash!==D)throw Error("Claude OAuth refresh is already in progress");t("[refresh] opencode main oauth refresh request start",{attempt:P});let I=await a4({refreshToken:F.refresh,maxRetries:0});return await N.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:I.refresh,access:I.access,expires:I.expires}}),await v((y)=>{if(!y?.refresh)return;if(y.refresh.mainLastRefreshError=void 0,y.refresh.mainRefreshLeaseId===f)y.refresh.mainRefreshLeaseId=void 0,y.refresh.mainRefreshLeaseUntil=void 0,y.refresh.mainRefreshLeaseTokenHash=void 0}),t("[refresh] opencode main oauth refresh succeeded",{attempt:P,expiresInMs:I.expires-Date.now()}),I.access}catch(H){let D=H instanceof Error&&(H.message.includes("fetch failed")||("code"in H)&&(H.code==="ECONNRESET"||H.code==="ECONNREFUSED"||H.code==="ETIMEDOUT"||H.code==="UND_ERR_CONNECT_TIMEOUT"));if(P<2&&(D||(()=>{let C=H.status;return typeof C==="number"&&C>=500})()))continue;t("[refresh] opencode main oauth refresh attempt failed",{attempt:P,error:H instanceof Error?H.message:String(H),transient:D});let w=F?.refresh;if(w&&H.isRefreshError)await v((C)=>{C.refresh=C.refresh??{},C.refresh.mainLastRefreshError=Vj({error:H,now:Date.now(),refreshToken:w,previous:C.refresh.mainLastRefreshError})});throw H}finally{if(f)await v((H)=>{if(!H?.refresh)return;if(H.refresh.mainRefreshLeaseId===f&&H.refresh.mainRefreshLeaseTokenHash===E)H.refresh.mainRefreshLeaseId=void 0,H.refresh.mainRefreshLeaseUntil=void 0,H.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await z?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{Q=null});return Q}x0=Z,T(),M.seedFallbacksFromAccounts((b?.accounts??[]).filter(U0)),K0(b,{activeId:"main",route:"main",mainAccessToken:X.access,mainRefreshToken:X.refresh});async function Y0(V,_){if(!V.body||V.status!==200)return _?.mark("inspect_stream_skip",{status:V.status}),{response:V,rateLimited:!1};if(V.headers.get("x-cortexkit-relay-optimistic")==="true")return _?.mark("inspect_stream_skip",{status:V.status,reason:"optimistic_relay"}),{response:V,rateLimited:!1};let f=q(),E=V.body.getReader(),z=[],v=new TextDecoder,m="",P=0;while(!m.includes(`
|
|
15
16
|
|
|
16
|
-
`,`event: message_stop
|
|
17
|
-
data: {"type":"message_stop"}
|
|
18
|
-
|
|
19
|
-
`];return new Response(O.join(""),{status:200,headers:{"content-type":"text/event-stream"}})}function rO(){let W=Error(gO);throw W[L4]=L4,W[hO]=!0,W.status=204,W.statusText=void 0,W.headers={},W.cookies={[H4]:H4,cookies:{}},W.body={[M4]:M4,_tag:"Empty"},W}function tO(W){if(W.sessionID==null)return!1;let O=W.model;return O?.providerID==="anthropic"||O?.api?.npm==="@ai-sdk/anthropic"||O?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function sO(W){if(W.some((O)=>O.includes("<use_parallel_tool_calls>")))return!1;return W.push(E4),!0}var aO={input:0,output:0,cache:{read:0,write:0}},eO="Fable content filter detected. Switched to Opus 4.8 for a 10-response recovery window while keeping the Fable cache warm.",WJ="Fable recovery window complete. Returning to Fable 5.";function jJ(W){let O=W["claude-opus-4-8"]??W["claude-opus-4-5"]??Object.values(W)[0];if(!O)return W;return{...W,...Object.fromEntries(Object.values(Qj).map((j)=>[j.id,{...O,id:j.id,name:j.name,api:O.api?{...O.api,id:j.id}:void 0,cost:{input:$1.input,output:$1.output,cache:{read:$1.cacheRead,write:$1.cacheWrite5m}},limit:{...O.limit??{},context:Pj,output:wj},capabilities:{...O.capabilities??{},reasoning:!0,attachment:!0,toolcall:!0},release_date:Uj}]))}}function OJ(W){return Object.fromEntries(Object.entries(W).map(([O,j])=>[O,{...j,cost:aO}]))}var EJ=async(W)=>{cO();let{client:O}=W,j=q4(),J=600000,D=50,G=new Map;function V(){let $=Date.now();for(let[N,X]of G)if($-X.createdAt>J)G.delete(N)}function F($,N){if(V(),G.size>=D){let X="",z=1/0;for(let[Y,M]of G)if(M.createdAt<z)z=M.createdAt,X=Y;if(X)G.delete(X)}G.set($,N)}function l($){V();let N=G.get($);if(!N)return;if(Date.now()-N.createdAt>J){G.delete($);return}return N}let h;try{h=await A(j)}catch($){let N=$ instanceof Error?$.message:String($);throw Error(`Failed to load account store: ${N}`,{cause:$ instanceof Error?$:void 0})}let b=new d1,Q=new Cj({storage:h,onMainQuotaFetched:async($,N,X,z)=>{try{let Y=await A(j)??Q0(),M=c4(Y);if(M&&M.checkedAt>=z&&jj(M.quota,Y,M.checkedAt)>Date.now()){Q.seedMainFromStorage(Y);return}Y.quota=Y.quota??{},Y.quota.mainQuota=$,Y.quota.mainQuotaCheckedAt=N,Y.quota.mainQuotaToken=X,Y.quota.mainLastQuotaApiError=void 0,await a0(Y,j,{mainQuota:!0})}catch(Y){m.warn("quota","failed to persist main quota",{error:Y instanceof Error?Y.message:String(Y)})}},onApiError:async($)=>{try{let N=await A(j)??Q0();N.quota=N.quota??{},N.quota.mainLastQuotaApiError=$,await a0(N,j,{mainQuota:!0})}catch(N){m.warn("quota","failed to persist backoff state",{error:N instanceof Error?N.message:String(N)})}}}),t=new Oj({quotaManager:Q,onFallbackStorageChanged:()=>{w0().catch(()=>{})}});t.startBackgroundRefresh();let G0=null,P0=new Zj({loadStorage:()=>A(j),prepareHeaders:async($,N)=>{let X,z=N.oauthAccountId;if(z&&z!=="main"){let Y=await A(j),M=Y?.accounts.find((P)=>P.id===z&&P.enabled!==!1&&K0(P));if(!M||!Y)throw Error(`OAuth account ${z} is unavailable for cache prewarm`);let B=M;try{B=await t.refreshAccount(M,Y)}catch(P){m.warn("cachekeep","fallback token refresh failed",{accountId:z,error:P instanceof Error?P.message:String(P)})}if(X=B.access,!X)throw Error(`OAuth account ${z} has no access token for cache prewarm`)}else{if(!j0)return $;let Y=await j0();if(Y.type!=="oauth")return $;if(!Y.access||Y.expires&&Y.expires<Date.now()){if(!G0)return $;Y.access=await G0()}X=Y.access}if(!X)return $;try{let Y=JSON.parse(N.bodyText),M=await NW(X,typeof Y.model==="string"?Y.model:void 0);if($.delete("anthropic-beta"),t0($,X,{body:Y,identity:M}),$.set("anthropic-beta",o0($.get("anthropic-beta"),[$j])),Y.speed==="fast")L1($)}catch{t0($,X)}return $}}),J0=new Map;function x0($){let N=$.plan.sessionId,X=async()=>{let M=$.warmTarget;if(!M){m.debug("fable-fallback","cache warm skipped",{session:N,reason:"Opus response was not served by an OAuth route"});return}let B=U4(M.bodyText,$.plan.requestedModel);if(!B.ok){m.warn("fable-fallback","cache warm skipped",{session:N,reason:B.reason});return}try{let P=await P0.prewarmNow({sessionId:N,url:M.url,headers:M.headers,bodyText:B.bodyText,oauthAccountId:$.plan.cacheAccountId??M.oauthAccountId});if(P.ok){m.debug("fable-fallback","Fable cache warmed",{session:N,remaining:b.remaining(N),...P.usage&&{usage:P.usage}});return}m.warn("fable-fallback","Fable cache warm skipped",{session:N,status:P.status,reason:P.reason})}catch(P){m.warn("fable-fallback","Fable cache warm failed",{session:N,error:P instanceof Error?P.message:String(P)})}},Y=(J0.get(N)??Promise.resolve()).then(X,X);return J0.set(N,Y),Y.finally(()=>{if(J0.get(N)===Y)J0.delete(N)}),Y}if(O1({enabled:e0(h),mode:W1(h)}),A1(x1(h)),k1(E1(h)),!process.env.OPENCODE_ANTHROPIC_AUTH_LOG_LEVEL)v4(v1(h)??"info");let q0=null;if(W.directory){let $=globalThis;if($.__anthropicAuthRpcServer)await $.__anthropicAuthRpcServer.stop().catch(()=>{}),$.__anthropicAuthRpcServer=void 0;try{q0=await kW({dir:Fj(W.directory),drain:AW,apply:kj}),$.__anthropicAuthRpcServer=q0}catch(N){m.warn("rpc","failed to start",{error:N instanceof Error?N.message:String(N)})}}let D0={activeId:"main",route:"main"},M0=Tj(),V0=new Map,B0=new Map,N0=new Map,C0=new Set;function c($,N){D0={activeId:N.activeId,route:N.route},Q.updateStorage($),Q.seedMainFromStorage($,N.mainAccessToken),Q.seedFallbacksFromAccounts(($?.accounts??[]).filter(K0));let X=Q.getMain(N.mainAccessToken),z=Q.getLastApiError(),Y=$?.refresh?.mainLastRefreshError,M={main:{quota:X?.quota??null,quotaBackedOff:Q.isBackedOff(),quotaBackoffUntil:z?.nextRetryAt,refreshBackedOff:Y?y0(Y,N.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:Y?.nextRetryAt},fallbacks:($?.accounts??[]).filter((B)=>B.enabled!==!1&&K0(B)).map((B)=>({id:B.id,label:B.label,quota:B.access?Q.getFallback(B.id,B.access)?.quota??null:null,needsReauth:B.lastRefreshError!=null&&y0(B.lastRefreshError,B.refresh,Date.now())&&l4(B.lastRefreshError),enabled:B.enabled!==!1})),activeId:N.activeId,route:N.route,relay:(()=>{let B=CW($);return B?{enabled:!0,transport:B.transport??"http"}:null})(),fastMode:f1(),cacheKeep:{enabled:GW($),window:$?.cacheKeep?.startHour!=null&&$?.cacheKeep?.endHour!=null?`${$.cacheKeep.startHour}-${$.cacheKeep.endHour}`:void 0,trackedSessions:P0.trackedCount()},fableRecoveries:V0.size>0?[...V0.values()]:void 0,lastUpdated:Date.now()};return xj(M,M0).catch((B)=>m.warn("sidebar","state write failed",{error:B instanceof Error?B.message:String(B)}))}async function w0(){let $=await A(j),N,X;if(j0)try{let z=await j0();N=z.access,X=z.refresh}catch{}c($,{activeId:D0.activeId,route:D0.route,mainAccessToken:N,mainRefreshToken:X})}function I0($,N){if(!N)return;if($?.quota?.enabled!==!0)return;if(Q.getMain(N))return;if(A0)return;A0=!0,Q.refreshMain(N).then(()=>w0()).catch(()=>{}).finally(()=>{A0=!1})}let j0=null,A0=!1,U0=null,F0=0;function m1($){let N=$?.refresh?.refreshBeforeExpiryMinutes??iO;return Math.max(Ej,N)*60000}function b1($){return $?.refresh?.enabled!==!1}async function g0($){if(!$)return;let N=await A(j),X=N?.refresh?.mainLastRefreshError;if(!N?.refresh||!X?.tokenHash)return;let z=S1($);if(X.tokenHash===z)return;if(X.nextRetryAt&&X.nextRetryAt>Date.now()){r("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:X.nextRetryAt,retryCount:X.retryCount,remainingMs:X.nextRetryAt-Date.now()});return}N.refresh.mainLastRefreshError=void 0,await a0(N,j,{mainRefresh:!0}),r("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:X.checkedAt,previousNextRetryAt:X.nextRetryAt,previousRetryCount:X.retryCount})}async function N1(){let $=[];if(j0)try{let Y=await j0();if(Y.type==="oauth"&&Y.access){let M=await Q.refreshMain(Y.access);$.push({name:"OpenCode anthropic",role:"main",quota:M})}else if(Y.type==="oauth")$.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(Y){let M=Y instanceof Error?Y.message:String(Y);$.push({name:"OpenCode anthropic",role:"main",error:M.includes("429")?"Usage API rate limited — try again in a moment":M})}let{storage:N,errors:X}=await t.refreshQuotaForAllAccounts({force:!0}),z=new Map(X.map((Y)=>[Y.accountId,Y.message]));if($.push(...Lj(N,z)),!j0)$.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return Hj({accounts:$,refreshedAt:Date.now()})}async function L0($){if(j0)try{let N=await j0();c($,{activeId:D0.activeId,route:D0.route,mainAccessToken:N.access,mainRefreshToken:N.refresh})}catch{}}function T0($,N,X,z){if(V0.delete($.sessionId),V0.set($.sessionId,{...$,changedAt:Date.now()}),V0.size>128){let M=V0.keys().next().value;if(M)V0.delete(M)}if(c(N,{activeId:D0.activeId,route:D0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh}),!z||z1($.sessionId))return;let Y=B0.get($.sessionId)??[];if(Y.push(z),B0.set($.sessionId,Y.slice(-2)),C0.has($.sessionId))Y1($.sessionId)}async function Y1($){let N=B0.get($);if(!N?.length)return;if(B0.delete($),z1($))return;for(let X of N){N0.set($,(N0.get($)??0)+1);try{await x4(W,$,X,!1)}catch(z){let Y=N0.get($)??0;if(Y<=1)N0.delete($);else N0.set($,Y-1);m.warn("fable-fallback","Desktop notification failed",{session:$,error:z instanceof Error?z.message:String(z)})}}}function Z1($,N,X){if(!$||!V0.delete($))return;c(N,{activeId:D0.activeId,route:D0.route,mainAccessToken:X.access,mainRefreshToken:X.refresh})}async function G1($){let N=Jj($);if(N.type==="enable"||N.type==="disable"){let M=N.type==="enable",B=await f4(M),P=W1(B);return O1({enabled:M,mode:P}),m.info("commands","cache enabled changed",{enabled:M}),q1({argumentsText:$,enabled:M,mode:P})}if(N.type==="mode"){let M=await k4(N.mode),B=e0(M);return O1({enabled:B,mode:N.mode}),m.info("commands","cache mode changed",{mode:N.mode}),q1({argumentsText:$,enabled:B,mode:N.mode})}let X=await A(j),z=e0(X),Y=W1(X);return O1({enabled:z,mode:Y}),q1({argumentsText:$,enabled:z,mode:Y})}async function Sj($){let N=Dj($),X=await A(j);if(N.type==="window")X=await h4(N.startHour,N.endHour),m.info("commands","cachekeep enabled changed",{enabled:!0});else if(N.type==="disable")X=await m4(!1),m.info("commands","cachekeep enabled changed",{enabled:!1});else if(N.type==="subagents")X=await p4(N.enabled),m.info("commands","cachekeep subagents changed",{subagents:N.enabled});let z=ZW(X),Y=P0.stats(z);return Yj({argumentsText:$,enabled:Nj(X),window:z,hybridActive:GW(X),trackedSessions:Y.trackedSessions,nextPrewarmAt:Y.nextPrewarmAt})}async function vj($){let N=Vj($);if(N.type==="enable"||N.type==="disable"){let Y=N.type==="enable";return await y4(Y),A1(Y),m.info("commands","dump changed",{enabled:Y}),KW({argumentsText:$,enabled:Y})}let X=await A(j),z=x1(X);return A1(z),KW({argumentsText:$,enabled:z})}async function Rj($){let N=Kj($);if(N.type==="enable"||N.type==="disable"){let Y=N.type==="enable";return await g4(Y),k1(Y),m.info("commands","fast mode changed",{enabled:Y}),zW({argumentsText:$,enabled:Y})}let X=await A(j),z=E1(X);return k1(z),zW({argumentsText:$,enabled:z})}async function qj($){let N=Ij($);if(N.type==="mode")return await Bj(N.mode),m.info("commands","routing mode changed",{mode:N.mode}),HW({argumentsText:$,mode:N.mode});let X=await A();return HW({argumentsText:$,mode:y1(X)})}async function Aj($){let N=zj($);if(N.type==="level")return await u4(N.level),m.info("commands","log level changed",{level:N.level}),UW({argumentsText:$,level:N.level});let X=await A(j),z=v1(X)??"info";return UW({argumentsText:$,level:z})}async function fj($,N){let X=Gj($);if(X.type==="add-apikey"){if(!X.apiKey)return{text:"API key is required",accounts:H0(await A(j)??Q0())};let P=X.label?.trim()||void 0,I=Date.now(),d=X.baseURL?.trim()||"https://api.kie.ai/claude";if(!T1(d))return{text:"Invalid base URL. Must be an http(s) URL without embedded credentials.",accounts:H0(await A(j)??Q0())};let W0=X.authHeader??"authorization-bearer",O0={id:P||g1(),label:P||void 0,type:"api",apiKey:X.apiKey,baseURL:d,authHeader:W0,enabled:!0,addedAt:I,lastUsed:I};await $W(O0,j),m.info("commands","account added",{id:O0.id,label:O0.label,type:"apikey"});let _0=await A(j);await L0(_0);let h0=H0(_0??{version:1,accounts:[]});return{text:`API key account "${O0.label??O0.id}" added.`,accounts:h0}}if(X.type==="add-oauth-start"){let P=await I1("max"),I={state:P.state,verifier:P.verifier,redirectUri:P.redirectUri,createdAt:Date.now()};return F(N??"default",I),{text:`Open this URL in your browser:
|
|
20
|
-
${P.url}`,knobs:{oauthUrl:P.url},accounts:H0(await A(j)??Q0())}}if(X.type==="add-oauth-finish"){let P=N??"default",I=l(P);if(!I)return{text:"OAuth session expired. Please start again.",accounts:H0(await A(j)??Q0())};try{let d=await F1(X.code,I.verifier,I.redirectUri,I.state);if(d.type==="failed")return{text:"OAuth authentication failed. Please check the code and try again.",accounts:H0(await A(j)??Q0())};let W0=Date.now(),O0={id:g1(),type:"oauth",label:X.label||void 0,access:d.access,refresh:d.refresh,expires:d.expires,enabled:!0,addedAt:W0,lastUsed:W0,lastRefreshedAt:W0};await $W(O0,j),m.info("commands","account added",{id:O0.id,label:O0.label,type:"oauth"});let _0=await A(j);return await L0(_0),{text:"OAuth account added.",accounts:H0(_0??Q0())}}catch{return{text:"OAuth exchange failed due to a network error. Please try again.",accounts:H0(await A(j)??Q0())}}finally{G.delete(P)}}let z=await A(j),Y=Xj({argumentsText:$,storage:z??{version:1,accounts:[]}});if(Y.updated){if(Y.updated.action==="enable"||Y.updated.action==="disable"){let I=Y.updated.action==="enable";await Wj(Y.updated.id,I,j);let d=Y.updated.id,W0=z?.accounts.find((O0)=>O0.id===d);m.info("commands",`account ${Y.updated.action}d`,{id:d,label:W0?.label,enabled:I})}else if(Y.updated.action==="remove"){await a4(Y.updated.id,j);let I=Y.updated.id,d=z?.accounts.find((W0)=>W0.id===I);m.info("commands","account removed",{id:I,label:d?.label})}else if(Y.updated.action==="reorder"){await e4(Y.updated.newOrder??Y.updated.previousOrder??[],j);let I=Y.updated.id,d=z?.accounts.find((W0)=>W0.id===I);m.info("commands","account reordered",{id:I,label:d?.label})}let P=await A(j);if(j0)try{let I=await j0();c(P,{activeId:D0.activeId,route:D0.route,mainAccessToken:I.access,mainRefreshToken:I.refresh})}catch{}}let M=await A(j),B=H0(M??{version:1,accounts:[]});return{text:Y.text,accounts:B}}async function MW($,N,X){if($==="claude-quota")return{command:$,text:await N1(),knobs:{}};if($==="claude-logging"){let P=await Aj(N),I=await A(j);return{command:$,text:P,knobs:{level:v1(I)??"info"}}}if($==="claude-account"){let P=await fj(N,X),I={accounts:P.accounts};if("knobs"in P&&P.knobs)Object.assign(I,P.knobs);return{command:$,text:P.text,knobs:I}}if($==="claude-routing"){let P=await qj(N),I=await A(j);return{command:$,text:P,knobs:{mode:y1(I)}}}if($==="claude-fast"){let P=await Rj(N),I=await A(j);return{command:$,text:P,knobs:{enabled:E1(I)}}}if($==="claude-dump"){let P=await vj(N),I=await A(j);return{command:$,text:P,knobs:{enabled:x1(I)}}}if($==="claude-cache"){let P=await G1(N),I=await A(j);return{command:$,text:P,knobs:{enabled:e0(I),mode:W1(I)}}}if($==="claude-cachekeep"){let P=await Sj(N),I=await A(j);return{command:$,text:P,knobs:{window:ZW(I)}}}let z=await A(),Y=JW(z),M=(z?.accounts??[]).filter((P)=>P.enabled!==!1).map((P)=>P.id),B=_j({argumentsText:N,config:Y,accountIds:M});if(B.updatedConfig){if(await s4(B.updatedConfig),Y.enabled!==B.updatedConfig.enabled)m.info("commands","killswitch changed",{enabled:B.updatedConfig.enabled===!0});if(JSON.stringify(Y.main)!==JSON.stringify(B.updatedConfig.main)||JSON.stringify(Y.accounts)!==JSON.stringify(B.updatedConfig.accounts))m.info("commands","killswitch thresholds changed",{thresholds:B.updatedConfig.main??B.updatedConfig.accounts})}return{command:$,text:B.text,knobs:{config:JW(await A()),accountIds:M}}}async function kj($){let N=await MW($.command,$.arguments,$.sessionId);return{text:N.text,knobs:N.knobs}}function yj($,N=10){let X=Math.max(0,Math.min(Math.round($/100*N),N));return"█".repeat(X)+"░".repeat(N-X)}function X1($,N){return`${$} ${yj(N)} ${String(Math.round(N)).padStart(3)}%`}function BW($){if(!$)return"";let N=new Date($).getTime();if(Number.isNaN(N))return"";let X=N-Date.now();if(X<=0)return"resets now";let z=Math.floor(X/60000);if(z<1)return"resets <1m";if(z<60)return`resets ${z}m`;let Y=Math.floor(z/60),M=z%60;return M>0?`resets ${Y}h${M}m`:`resets ${Y}h`}function gj($,N,X){let z=[],Y=0;if($){let{five_hour:P,seven_day:I}=$;if(P||I){let W0=X==="main"?"active":"idle",O0=BW(P?.resetsAt),_0=[`main · ${W0}${O0?` (${O0})`:""}`];if(P)_0.push(X1("5h",P.usedPercent)),Y=Math.max(Y,P.usedPercent);if(I)_0.push(X1("7d",I.usedPercent)),Y=Math.max(Y,I.usedPercent);z.push(_0.join(`
|
|
21
|
-
`))}}if(N?.length)for(let P of N){let I=P.quota;if(!I)continue;let{five_hour:d,seven_day:W0}=I;if(!d&&!W0)continue;let O0=P.label||"alt",h0=X===P.id?"active":"idle",E0=BW(d?.resetsAt),f0=[`${O0} · ${h0}${E0?` (${E0})`:""}`];if(d)f0.push(X1("5h",d.usedPercent)),Y=Math.max(Y,d.usedPercent);if(W0)f0.push(X1("7d",W0.usedPercent)),Y=Math.max(Y,W0.usedPercent);z.push(f0.join(`
|
|
22
|
-
`))}if(!z.length)return;let M=z.join(`
|
|
23
|
-
|
|
24
|
-
`),B=Y>=90?"error":Y>=70?"warning":"info";O.tui?.showToast?.({body:{title:"Claude Quota",message:M,variant:B,duration:B==="error"?8000:5000}})?.catch?.(()=>{})}return{event:async({event:$})=>{let N=$,X=N.properties?.sessionID??N.properties?.info?.id;if(!X)return;if(N.type==="session.idle"||N.type==="session.status"&&N.properties?.status?.type==="idle"){if(C0.delete(X),C0.add(X),C0.size>256){let Y=C0.values().next().value;if(Y)C0.delete(Y)}await Y1(X);return}if(N.type==="session.status"||N.type==="session.deleted")C0.delete(X);if(N.type==="session.deleted")B0.delete(X),N0.delete(X),V0.delete(X)},config:async($)=>{$.command={...$.command??{},[DW]:{template:DW,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[XW]:{template:XW,description:"Manage fallback accounts — list, enable/disable, reorder, remove, or add (API key or OAuth)."},[YW]:{template:YW,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[QW]:{template:QW,description:"Show current Claude OAuth quota usage for all accounts."},[VW]:{template:VW,description:"Show or toggle Anthropic request dump capture for debugging."},[_W]:{template:_W,description:"Show or toggle Anthropic fast mode for supported Opus models."},[wW]:{template:wW,description:"Show or set the plugin log level (error, warn, info, debug, trace)."},[LW]:{template:LW,description:"Show or change Claude account routing between main-first and fallback-first."},[PW]:{template:PW,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async($,N)=>{if(!tO($))return;sO(N.system)},provider:{id:"anthropic",async models($,N){let X=jJ($.models);if(N.auth?.type!=="oauth"||!R4(h??{}))return X;return OJ(X)}},"command.execute.before":async($)=>{if(!["claude-account","claude-cache","claude-cachekeep","claude-quota","claude-dump","claude-fast","claude-routing","claude-killswitch","claude-logging"].includes($.command))return;let X=$.command,z=await MW(X,$.arguments,$.sessionID);if(X==="claude-quota"){let Y=await A(),M=j0?await j0().catch(()=>{return}):void 0;c(Y,{activeId:"main",route:"main",mainAccessToken:M?.access,mainRefreshToken:M?.refresh})}if(z1($.sessionID))qW(z,$.sessionID);else await x4(W,$.sessionID,z.text);rO()},auth:{provider:"anthropic",async loader($,N){j0=$;let X=await $();if(X.type==="oauth"){let M=function(){if(U0)clearInterval(U0),U0=null;let K=async()=>{try{let _=await A(j);if(!b1(_))return;let f=await $();if(f.type!=="oauth")return;if(await g0(f.refresh),!f.expires)return;let T=f.expires-Date.now(),S=m1(_);if(T>S)return;if(r("[refresh] opencode main oauth background due",{expiresInMs:T,refreshBeforeMs:S}),f.refresh&&y0(_?.refresh?.mainLastRefreshError,f.refresh,Date.now())){r("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:_?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:_?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:T});return}if(f.refresh&&_?.refresh?.mainRefreshLeaseUntil&&_.refresh.mainRefreshLeaseUntil>Date.now()&&_.refresh.mainRefreshLeaseTokenHash===S1(f.refresh))return;await Y();let L=await $();r("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:L.expires?L.expires-Date.now():void 0})}catch(_){m.warn("refresh","opencode main oauth refresh failed",{message:_ instanceof Error?_.message:String(_)})}};if(U0=setInterval(()=>{K()},mO+F4(bO)),"unref"in U0)U0.unref()},B=function(K,_){if(K instanceof Request&&K.body)return!1;return _==null||typeof _==="string"},P=function(K){if(typeof K!=="string")return;try{let _=JSON.parse(K);return typeof _.model==="string"?_.model:void 0}catch{return}},I=function(K){return K.has("x-parent-session-id")},d=function(K){return K.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(K)},W0=function(K){return K?.quota?.enabled===!0},_0=function(K,_){if(K.delete("authorization"),K.delete("x-api-key"),_.authHeader==="x-api-key")K.set("x-api-key",_.apiKey??"");else K.set("Authorization",`Bearer ${_.apiKey??""}`);K.set("Content-Type","application/json")},f0=function(K){return Q.getFallback(K.id,K.access)?.quota??K.quota},p1=function(K){return["five_hour","seven_day"].some((_)=>(K?.[_]?.remainingPercent??1)<=0)},IW=function(K,_){return K.status===429||_},i1=function(K){if(!K)return!1;let _=Q.getMain(K);return Boolean(_&&_.refreshAfter>Date.now()&&p1(_.quota))},z=null;async function Y(){if(!z)z=(async()=>{let f=null,T=null,S=null;async function L(R){let U=await A(j)??Q0();U.refresh=U.refresh??{},R(U),await a0(U,j,{mainRefresh:!0})}async function y(R){let U=Date.now()+pO;while(Date.now()<U){await new Promise((Z)=>setTimeout(Z,B4+F4(B4)));let w=await $();if(w.type!=="oauth"||!w.access)continue;if((w.access!==R.access||w.refresh!==R.refresh||(w.expires??0)>(R.expires??0)+60000)&&(!w.expires||w.expires>Date.now()))return r("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:w.expires?w.expires-Date.now():void 0}),w.access}return null}for(let R=0;R<=2;R++){let U=null;try{if(R>0){let q=500*2**(R-1);await new Promise(($0)=>setTimeout($0,q))}if(U=await $(),!U.refresh)throw Error("Token refresh failed: missing refresh token");let w=await A(j),v=S1(U.refresh),Z=w?.refresh?.mainLastRefreshError;if(r("[refresh] opencode main oauth refresh check",{attempt:R,expiresInMs:U.expires?U.expires-Date.now():void 0,hasBackoff:Boolean(Z),backoffActive:Z?y0(Z,U.refresh,Date.now()):!1,retryCount:Z?.retryCount,nextRetryAt:Z?.nextRetryAt}),Z&&y0(Z,U.refresh,Date.now()))throw r("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:Z.nextRetryAt,retryCount:Z.retryCount}),Error(jW(Z,Date.now()));if(w?.refresh?.mainRefreshLeaseUntil&&w.refresh.mainRefreshLeaseUntil>Date.now()&&w.refresh.mainRefreshLeaseTokenHash===v){r("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:w.refresh.mainRefreshLeaseUntil});let q=await y(U);if(q)return q;throw Error("Claude OAuth refresh is already in progress")}let o=await A4({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!o){r("[refresh] opencode main oauth refresh skipped file lock");let q=await y(U);if(q)return q;throw Error("Claude OAuth refresh is already in progress")}S=o.release,f=g1(),T=v,await L((q)=>{q.refresh=q.refresh??{},q.refresh.mainRefreshLeaseId=f??void 0,q.refresh.mainRefreshLeaseUntil=Date.now()+120000,q.refresh.mainRefreshLeaseTokenHash=v});let C=await A(j);if(r("[refresh] opencode main oauth refresh lease acquired",{attempt:R,leaseUntil:Date.now()+120000}),C?.refresh?.mainRefreshLeaseId!==f||C.refresh.mainRefreshLeaseTokenHash!==v)throw Error("Claude OAuth refresh is already in progress");r("[refresh] opencode main oauth refresh request start",{attempt:R});let E=await S4({refreshToken:U.refresh,maxRetries:0});return await O.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:E.refresh,access:E.access,expires:E.expires}}),await L((q)=>{if(!q?.refresh)return;if(q.refresh.mainLastRefreshError=void 0,q.refresh.mainRefreshLeaseId===f)q.refresh.mainRefreshLeaseId=void 0,q.refresh.mainRefreshLeaseUntil=void 0,q.refresh.mainRefreshLeaseTokenHash=void 0}),r("[refresh] opencode main oauth refresh succeeded",{attempt:R,expiresInMs:E.expires-Date.now()}),E.access}catch(w){let v=w instanceof Error&&(w.message.includes("fetch failed")||("code"in w)&&(w.code==="ECONNRESET"||w.code==="ECONNREFUSED"||w.code==="ETIMEDOUT"||w.code==="UND_ERR_CONNECT_TIMEOUT"));if(R<2&&(v||(()=>{let o=w.status;return typeof o==="number"&&o>=500})()))continue;r("[refresh] opencode main oauth refresh attempt failed",{attempt:R,error:w instanceof Error?w.message:String(w),transient:v});let Z=U?.refresh;if(Z&&w.isRefreshError)await L((o)=>{o.refresh=o.refresh??{},o.refresh.mainLastRefreshError=i4({error:w,now:Date.now(),refreshToken:Z,previous:o.refresh.mainLastRefreshError})});throw w}finally{if(f)await L((w)=>{if(!w?.refresh)return;if(w.refresh.mainRefreshLeaseId===f&&w.refresh.mainRefreshLeaseTokenHash===T)w.refresh.mainRefreshLeaseId=void 0,w.refresh.mainRefreshLeaseUntil=void 0,w.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await S?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{z=null});return z}G0=Y,M(),Q.seedFallbacksFromAccounts((h?.accounts??[]).filter(K0)),c(h,{activeId:"main",route:"main",mainAccessToken:X.access,mainRefreshToken:X.refresh});async function O0(K,_){if(!K.body||K.status!==200)return _?.mark("inspect_stream_skip",{status:K.status}),{response:K,rateLimited:!1};if(K.headers.get("x-cortexkit-relay-optimistic")==="true")return _?.mark("inspect_stream_skip",{status:K.status,reason:"optimistic_relay"}),{response:K,rateLimited:!1};let f=x(),T=K.body.getReader(),S=[],L=new TextDecoder,y="",R=0;while(!y.includes(`
|
|
25
|
-
|
|
26
|
-
`)&&y.length<65536){let{done:w,value:v}=await T.read();if(w)break;if(S.push(v),R+=v.byteLength,y+=L.decode(v,{stream:!0}),d(y))break}if(d(y)){await T.cancel().catch(()=>{});try{T.releaseLock()}catch{}let w=new ReadableStream({start(v){for(let Z of S)v.enqueue(Z);v.close()}});return _?.mark("inspect_stream_first_event",{ms:n(x()-f),bytes:R,rateLimited:!0}),{response:new Response(w,{status:K.status,statusText:K.statusText,headers:K.headers}),rateLimited:!0}}let U=new ReadableStream({start(w){for(let v of S)w.enqueue(v)},async pull(w){let{done:v,value:Z}=await T.read();if(v){w.close();return}w.enqueue(Z)},cancel(w){return T.cancel(w)}});return _?.mark("inspect_stream_first_event",{ms:n(x()-f),bytes:R,rateLimited:!1}),{response:new Response(U,{status:K.status,statusText:K.statusText,headers:K.headers}),rateLimited:!1}}async function h0(K,_,f,T,S="api_fallback",L,y){if(y?.plan.downgraded)y.warmTarget=void 0,y.opusCacheAnchor=void 0;let R=x(),U=C1(K,_),w=U.get("x-session-affinity")||U.get("x-opencode-session"),v=I(U);U.delete("x-parent-session-id"),U.delete("x-session-affinity"),U.delete("x-opencode-session");let Z=_?.body,o=typeof Z==="string"?Z.length:void 0;if(Z&&typeof Z==="string"){let $0=x(),u=(()=>{if(!f1())return!1;try{return r0(JSON.parse(Z).model)}catch{return!1}})();if(Z=await a1(Z,{cache1hEnabled:!v&&l0(),cache1hMode:d0(),fastModeEnabled:u,perf:(e,s)=>T?.mark(`rewrite_body_${e}`,{route:S,...s})}),_0(U,f),U.set("anthropic-beta",o0(U.get("anthropic-beta"),[])),u)L1(U);T?.mark("rewrite_body",{route:S,ms:n(x()-$0),originalBytes:o,rewrittenBytes:Z.length,cacheEnabled:!v&&l0(),cacheMode:d0(),fastModeEnabled:u,subagent:v})}else _0(U,f);let C=t1(K,{baseURL:f.baseURL}),E=x(),q;try{q=await fetch(C.input,{..._,body:Z,headers:U,...r1()&&{tls:{rejectUnauthorized:!1}}})}catch($0){if(typeof Z==="string")await J1({affinity:w,route:S,error:T4($0),bodyText:Z,url:C.url?.toString()??M1(C.input),method:B1(K,_),headers:U});throw $0}if(typeof Z==="string")await J1({affinity:w,route:S,status:q.status,bodyText:Z,url:C.url?.toString()??M1(C.input),method:B1(K,_),headers:U});return T?.mark("send_headers_received",{route:S,ms:n(x()-E),status:q.status,relayConfigured:!1,totalSendWithAccessMs:n(x()-R),baseURL:f.baseURL}),q}async function E0(K,_,f,T,S="unknown",L,y="main",R){let U=x(),w=L,v=async()=>{return w??=await A(j),w},Z=C1(K,_),o=Z.get("x-session-affinity")||Z.get("x-opencode-session"),C=I(Z);Z.delete("x-parent-session-id"),Z.delete("x-session-affinity"),Z.delete("x-opencode-session");let E=_?.body,q;if(E&&typeof E==="string"){let H=x();try{let g=JSON.parse(E);if(typeof g.model==="string")q=g.model}catch{}T?.mark("model_parse_for_identity",{route:S,ms:n(x()-H),bodyBytes:E.length})}let $0=x(),u=await NW(f,q);T?.mark("resolve_claude_code_identity",{route:S,ms:n(x()-$0),hasAccountUuid:Boolean(u.accountUuid)});let e=typeof E==="string"?E.length:void 0;if(E&&typeof E==="string"){let H=x(),g=(()=>{if(!f1())return!1;try{return r0(JSON.parse(E).model)}catch{return!1}})(),Y0=!C&&l0(),a=d0(),S0=R?.plan.downgraded&&R.plan.standbyCacheAnchor?.oauthAccountId===y?R.plan.standbyCacheAnchor:void 0;if(E=await a1(E,{cache1hEnabled:Y0,cache1hMode:a,fastModeEnabled:g,identity:u,hybridStandbyAnchor:S0,perf:(X0,u0)=>{if(T?.mark(`rewrite_body_${X0}`,{route:S,...u0}),X0==="cache_strategy"&&u0?.standbyBridgeApplied===!0&&R&&!R.standbyBridgeLogged)R.standbyBridgeLogged=!0,m.info("fable-fallback","restored standby Opus cache bridge",{session:R.plan.sessionId,distanceBlocks:u0?.standbyDistanceBlocks})}}),R?.plan.downgraded&&Y0&&a==="hybrid"){let X0=z4(E);R.opusCacheAnchor=X0?{...X0,oauthAccountId:y}:void 0}let b0=x();try{t0(Z,f,{body:JSON.parse(E),identity:u}),T?.mark("set_oauth_headers_body_parse",{route:S,ms:n(x()-b0),bodyBytes:E.length,parsed:!0})}catch{t0(Z,f,{identity:u}),T?.mark("set_oauth_headers_body_parse",{route:S,ms:n(x()-b0),bodyBytes:E.length,parsed:!1})}if(g)L1(Z);T?.mark("rewrite_body",{route:S,ms:n(x()-H),originalBytes:e,rewrittenBytes:E.length,cacheEnabled:!C&&l0(),cacheMode:d0(),fastModeEnabled:g,subagent:C})}let s=t1(K);if(R&&typeof E==="string")R.warmTarget={url:s.url?.toString()??s.input.toString(),headers:new Headers(Z),bodyText:E,oauthAccountId:y};if(typeof E==="string"&&l0()&&d0()==="hybrid"){let H=await v();if(!C||b4(H)){let g=x(),Y0=P0.track({sessionId:o,url:s.url?.toString()??s.input.toString(),headers:Z,bodyText:E,storage:H,cacheMode:"hybrid",oauthAccountId:y});T?.mark("cachekeep_track",{session:o,ms:n(x()-g),tracked:Y0.tracked,reason:Y0.tracked?void 0:Y0.reason,bodyBytes:E.length})}}let l1=async()=>{try{let H=await fetch(s.input,{..._,body:E,headers:Z,...r1()&&{tls:{rejectUnauthorized:!1}}});if(typeof E==="string")await J1({affinity:o,route:S,status:H.status,bodyText:E,url:s.url?.toString()??M1(s.input),method:B1(K,_),headers:Z});return H}catch(H){if(typeof E==="string")await J1({affinity:o,route:S,error:T4(H),bodyText:E,url:s.url?.toString()??M1(s.input),method:B1(K,_),headers:Z});throw H}},m0=CW(await v()),_1=x(),k=await Mj({config:m0,input:s.input,init:_,headers:Z,body:E,fallback:l1,affinity:o,optimisticResponse:m0?.transport==="websocket"});return T?.mark("send_headers_received",{route:S,ms:n(x()-_1),status:k.status,relayConfigured:m0!=null,totalSendWithAccessMs:n(x()-U)}),k}async function hj(K){if(!K)return!1;try{return await Q.refreshMain(K),i1(K)}catch{return!1}}async function V1(K,_={}){let f=await t.getUsableFallbackAccounts(K,{modelId:_.modelId}),T=new Map(f.map((L)=>[L.id,L])),S=[];for(let L of K?.accounts??[]){if(K0(L)){let y=T.get(L.id);if(y)S.push(y);continue}if(_.includeApiRoutes===!0&&s0(L)&&L.enabled!==!1&&L.apiKey&&T1(L.baseURL))S.push(L)}if(!j1(K))return S;return S.filter((L)=>K0(L)?D1(f0(L),K,L.id,_.modelId):!0)}async function K1(K,_,f,T,S,L,y){if(!f.length)return S??null;let R=y?.returnLastOnExhausted??!0;await S?.body?.cancel().catch(()=>{});let U=S??null;for(let[w,v]of f.entries()){let Z;if(s0(v)){if(!v.apiKey)continue;Z=await h0(K,_,v,L,`api_fallback_${w}`,T,y?.fableRequest)}else{let C=v.access;if(!C)continue;Z=await E0(K,_,C,L,`fallback_${w}`,T,v.id,y?.fableRequest)}U=Z;let o=WW(Z.status,T);if(!o){let C=await O0(Z,L);Z=C.response,U=Z,o=C.rateLimited}if(!o){if(await t.markUsed(v),await y?.onSuccess?.(v),K0(v)&&v.access&&Q.shouldRefreshOnRequestCount(F0))Q.refreshFallback(v.id,v.access).then(()=>y?.onSuccess?.(v)).catch(()=>{});return Z}if(w<f.length-1||!R)await Z.body?.cancel().catch(()=>{})}return R?U:null}async function mj(K,_,f,T,S,L,y,R,U,w){if(!B(K,_?.body))return f;let v=x(),Z=L??await A(j);if(S?.mark("fallback_load_storage",{ms:n(x()-v),cached:!!L}),!(Z?.accounts??[]).some((e)=>e.enabled!==!1&&(K0(e)||s0(e)&&Boolean(e.apiKey)&&T1(e.baseURL))))return f;let C=f,E=WW(C.status,Z),q=IW(C,!1);if(!E){let e=await O0(C,S);C=e.response,E=e.rateLimited,q=IW(C,e.rateLimited)}if(!E)return C;let $0=!1;if(T)$0=T.some(s0);else if(q)$0=await hj(y);let u=T;if(!u){let e=x();u=await V1(Z,{includeApiRoutes:$0,modelId:U}),S?.mark("fallback_get_accounts",{ms:n(x()-e),accounts:u.length})}if(j1(Z)){let e=u.length;if(u=u.filter((s)=>K0(s)?D1(f0(s),Z,s.id,U):!0),u.length<e)r("[killswitch] filtered fallbacks",{before:e,after:u.length})}return await K1(K,_,u,Z,C,S,{onSuccess:R,fableRequest:w})??C}return{apiKey:"",async fetch(K,_){let f=C1(K,_),T=f.get("x-session-affinity")||f.get("x-opencode-session");if(T)C0.delete(T);let S=T?N0.get(T)??0:0;if(T&&S>0){if(S===1)N0.delete(T);else N0.set(T,S-1);return oO()}let L=b.plan(T,_?.body);if(L&&!L.downgraded){let k=J0.get(L.sessionId);if(k)await k,L=b.plan(T,_?.body)}let y=L?{plan:L}:void 0;if(L?.downgraded)_={..._,body:L.bodyText};let R=_?.body,U=nO({bodyBytes:typeof R==="string"?R.length:void 0}),w=(k)=>C4(k,{perf:(H,g)=>U.mark(H,g),...!L?.downgraded&&L?{onContentFilter:()=>{if(!y?.warmTarget)return m.debug("fable-fallback","content filter recovery unavailable for non-OAuth route",{session:L.sessionId}),!1;let H=b.activate(L,y.warmTarget.oauthAccountId);m.info("fable-fallback","content filter detected; switching session to Opus 4.8",{session:L.sessionId,remaining:H}),T0({sessionId:L.sessionId,mode:"opus",remaining:H},C,Z,eO)}}:{},...L?.downgraded&&y?{onComplete:(H)=>{let g=b.complete(L,y.opusCacheAnchor);if(!g.counted)return;m.info("fable-fallback","Opus 4.8 turn completed",{session:L.sessionId,finishReason:H,remaining:g.remaining}),T0({sessionId:L.sessionId,mode:"opus",remaining:g.remaining},C,Z);let Y0=x0(y);if(g.remaining===0){let a=()=>{if(b.remaining(L.sessionId)!==0)return;T0({sessionId:L.sessionId,mode:"fable",remaining:0},C,Z,WJ)};Y0.then(a,a)}}}:{}}),v=x(),Z=await $();if(U.mark("get_auth",{ms:n(x()-v),authType:Z.type,hasAccess:Boolean(Z.access)}),Z.type!=="oauth"){let k=await fetch(K,_);return U.done("non_oauth_passthrough",{status:k.status}),k}await g0(Z.refresh);let o=x(),C=await A();if(U.mark("load_storage",{ms:n(x()-o)}),Q.updateStorage(C),Q.seedMainFromStorage(C,Z.access),Q.seedFallbacksFromAccounts((C?.accounts??[]).filter(K0)),!L)Z1(T,C,Z);let E=B(K,_?.body),q=P(_?.body);if(E)F0++;if(E&&Z.access&&(!Z.expires||Z.expires>Date.now()))I0(C,Z.access);let $0=(k,H)=>c(C,{activeId:k,route:H,mainAccessToken:Z.access,mainRefreshToken:Z.refresh}),u;if(E&&y1(C)==="fallback-first")try{let k=x();u=await V1(C,{includeApiRoutes:i1(Z.access),modelId:q}),U.mark("fallback_first_get_accounts",{ms:n(x()-k),accounts:u.length});let H=await K1(K,_,u,C,void 0,U,{returnLastOnExhausted:!1,onSuccess:(g)=>$0(g.id,"fallback-first"),fableRequest:y});if(H)return U.done("return_fallback_first",{status:H.status}),w(H);u=void 0}catch(k){U.mark("fallback_first_error",{error:k instanceof Error?k.message:String(k)})}if(!Z.access||!Z.expires||Z.expires<Date.now()){let H=(await A())?.refresh?.mainLastRefreshError;if(Z.refresh&&H&&y0(H,Z.refresh,Date.now()))throw r("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:H.nextRetryAt,retryCount:H.retryCount,expiresInMs:Z.expires?Z.expires-Date.now():void 0}),Error(jW(H,Date.now()));r("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(Z.access),expiresInMs:Z.expires?Z.expires-Date.now():void 0,expiredAgoMs:Z.expires&&Z.expires<Date.now()?Date.now()-Z.expires:void 0});let g=x();Z.access=await Y(),U.mark("refresh_main_access",{ms:n(x()-g)})}if(!Z.access)throw U.done("missing_access_error"),Error("OAuth access token is missing after refresh");function e(){if(C?.quota?.showToasts!==!0)return;let k=Q.getMain();if(!k)return;let H=(C?.accounts??[]).filter((a)=>a.enabled!==!1&&K0(a)).map((a)=>({...a,quota:Q.getFallback(a.id,a.access)?.quota??a.quota})),g=R1(k.quota,C),Y0;if(g)Y0="main";else Y0=H.find((a)=>R1(a.quota,C))?.id??"main";gj(k.quota,H,Y0)}if(E&&W0(C))try{let k=x(),H=Q.getMain(Z.access),g=H?.quota;if(!g)g=await Q.refreshMain(Z.access),H=Q.getMain(Z.access),e();else if(Q.needsRefresh(F0))if(p1(g)||OW(g,q))g=await Q.refreshMain(Z.access),H=Q.getMain(Z.access);else Q.refreshMain(Z.access).then(()=>{w0().catch(()=>{}),e()}).catch(()=>{});c(C,{activeId:"main",route:"main",mainAccessToken:Z.access,mainRefreshToken:Z.refresh});let Y0=R1(g,C)&&o4(g,q);if(U.mark("main_quota_for_routing",{ms:n(x()-k),passes:Y0,model:q,modelScopedExhausted:OW(g,q)}),!Y0){let a=x();u=await V1(C,{includeApiRoutes:Boolean(H&&H.refreshAfter>Date.now()&&p1(H.quota)),modelId:q}),U.mark("preselect_fallback_accounts",{ms:n(x()-a),accounts:u.length});let S0=await K1(K,_,u,C,void 0,U,{onSuccess:(b0)=>$0(b0.id,"fallback"),fableRequest:y});if(S0)return U.done("return_preselected_fallback",{status:S0.status}),w(S0)}}catch(k){U.mark("main_quota_for_routing_error",{error:k instanceof Error?k.message:String(k)})}let s=Q.getMain(Z.access)?.quota;if(C?.quota?.failClosedOnUnknownQuota&&!s&&Q.isBackedOff()){let k=Q.getLastApiError(),H=k?d4(k,Date.now()):"Quota API unavailable";return r("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:k?.nextRetryAt,retryCount:k?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:H}}),{status:429,headers:{"content-type":"application/json","retry-after":String(k?.nextRetryAt?Math.max(1,Math.ceil((k.nextRetryAt-Date.now())/1000)):60)}})}if(j1(C)){if(Q.needsRefresh(F0))try{let H=(C?.accounts??[]).filter((g)=>g.enabled!==!1&&K0(g)&&Boolean(g.access));await Promise.all([Q.refreshMain(Z.access),Q.refreshAllFallbacks(H)])}catch(H){r("[quota] killswitch refresh failed",{error:H instanceof Error?H.message:String(H),backedOff:Q.isBackedOff()})}s=Q.getMain(Z.access)?.quota}if(j1(C)&&!D1(s,C,void 0,q)){let H=B(K,_?.body)?await V1(C,{includeApiRoutes:i1(Z.access),modelId:q}):[];if(H.length>0){r("[route] skipping main (killswitch), trying fallbacks");let X0=await K1(K,_,H,C,void 0,U,{onSuccess:(u0)=>$0(u0.id,"fallback")});if(X0)return U.done("return_killswitch_fallback",{status:X0.status}),w(X0)}let g=Date.now(),Y0=(C?.accounts??[]).filter((X0)=>X0.enabled!==!1&&K0(X0)).map((X0)=>({...X0,quota:f0(X0)})),a=dO({mainQuota:s,requestModelId:q,storage:C}),S0=t4(s,Y0,g,a.isScopedDriven?a.modelId:void 0),b0=lO({retryAfterSeconds:S0,...a.isScopedDriven&&{modelName:a.modelName}});return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:b0}}),{status:429,headers:{"content-type":"application/json","retry-after":String(S0)}})}let l1=await E0(K,_,Z.access,U,"main",C,"main",y),m0=!1,_1=await mj(K,_,l1,u,U,C,Z.access,(k)=>{m0=!0,$0(k.id,"fallback")},q,y);if(!m0)$0("main","main");return U.done("return_response",{status:_1.status}),w(_1)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let $=await I1("max");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(N)=>{return F1(N,$.verifier,$.redirectUri,$.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let $=await I1("console");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(N)=>{let X=await F1(N,$.verifier,$.redirectUri,$.state);if(X.type==="failed")return X;return{type:"success",key:(await fetch("https://api.anthropic.com/api/oauth/claude_cli/create_api_key",{method:"POST",headers:{"Content-Type":"application/json",authorization:`Bearer ${X.access}`}}).then((Y)=>Y.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{dO as resolveScopedDrivenBlock,lO as formatKillswitchBlockMessage,EJ as AnthropicAuthPlugin};
|
|
17
|
+
`)&&m.length<65536){let{done:H,value:D}=await E.read();if(H)break;if(z.push(D),P+=D.byteLength,m+=v.decode(D,{stream:!0}),o(m))break}if(o(m)){await E.cancel().catch(()=>{});try{E.releaseLock()}catch{}let H=new ReadableStream({start(D){for(let w of z)D.enqueue(w);D.close()}});return _?.mark("inspect_stream_first_event",{ms:a(q()-f),bytes:P,rateLimited:!0}),{response:new Response(H,{status:V.status,statusText:V.statusText,headers:V.headers}),rateLimited:!0}}let F=new ReadableStream({start(H){for(let D of z)H.enqueue(D)},async pull(H){let{done:D,value:w}=await E.read();if(D){H.close();return}H.enqueue(w)},cancel(H){return E.cancel(H)}});return _?.mark("inspect_stream_first_event",{ms:a(q()-f),bytes:P,rateLimited:!1}),{response:new Response(F,{status:V.status,statusText:V.statusText,headers:V.headers}),rateLimited:!1}}async function s0(V,_,f,E,z="api_fallback",v,m){if(m?.plan.downgraded)m.warmTarget=void 0,m.opusCacheAnchor=void 0;let P=q(),F=A1(V,_),H=F.get("x-session-affinity")||F.get("x-opencode-session"),D=x(F);F.delete("x-parent-session-id"),F.delete("x-session-affinity"),F.delete("x-opencode-session");let w=_?.body,C=typeof w==="string"?w.length:void 0;if(w&&typeof w==="string"){let j0=q(),N0=(()=>{if(!o1())return!1;try{return z1(JSON.parse(w).model)}catch{return!1}})();if(w=await VW(w,{cache1hEnabled:!D&&J1(),cache1hMode:O1(),fastModeEnabled:N0,perf:(e,G0)=>E?.mark(`rewrite_body_${e}`,{route:z,...G0})}),Q0(F,f),F.set("anthropic-beta",_1(F.get("anthropic-beta"),[])),N0)R1(F);E?.mark("rewrite_body",{route:z,ms:a(q()-j0),originalBytes:C,rewrittenBytes:w.length,cacheEnabled:!D&&J1(),cacheMode:O1(),fastModeEnabled:N0,subagent:D})}else Q0(F,f);let h=GW(V,{baseURL:f.baseURL}),I=q(),y;try{y=await fetch(h.input,{..._,body:w,headers:F,...DW()&&{tls:{rejectUnauthorized:!1}}})}catch(j0){if(typeof w==="string")await L1({affinity:H,route:z,error:o4(j0),bodyText:w,url:h.url?.toString()??g1(h.input),method:y1(V,_),headers:F});throw j0}if(typeof w==="string")await L1({affinity:H,route:z,status:y.status,bodyText:w,url:h.url?.toString()??g1(h.input),method:y1(V,_),headers:F});return E?.mark("send_headers_received",{route:z,ms:a(q()-I),status:y.status,relayConfigured:!1,totalSendWithAccessMs:a(q()-P),baseURL:f.baseURL}),y}async function k0(V,_,f,E,z="unknown",v,m="main",P){let F=q(),H=v,D=async()=>{return H??=await R(j),H},w=A1(V,_),C=w.get("x-session-affinity")||w.get("x-opencode-session"),h=x(w);w.delete("x-parent-session-id"),w.delete("x-session-affinity"),w.delete("x-opencode-session");let I=_?.body,y;if(I&&typeof I==="string"){let k=q();try{let J0=JSON.parse(I);if(typeof J0.model==="string")y=J0.model}catch{}E?.mark("model_parse_for_identity",{route:z,ms:a(q()-k),bodyBytes:I.length})}let j0=q(),N0=await HW(f,y);E?.mark("resolve_claude_code_identity",{route:z,ms:a(q()-j0),hasAccountUuid:Boolean(N0.accountUuid)});let e=typeof I==="string"?I.length:void 0;if(I&&typeof I==="string"){let k=q(),J0=(()=>{if(!o1())return!1;try{return z1(JSON.parse(I).model)}catch{return!1}})(),c=!h&&J1(),p=O1(),I0=P?.plan.downgraded&&P.plan.standbyCacheAnchor?.oauthAccountId===m?P.plan.standbyCacheAnchor:void 0;if(I=await VW(I,{cache1hEnabled:c,cache1hMode:p,fastModeEnabled:J0,identity:N0,hybridStandbyAnchor:I0,perf:(z0,d)=>{if(E?.mark(`rewrite_body_${z0}`,{route:z,...d}),z0==="cache_strategy"&&d?.standbyBridgeApplied===!0&&P&&!P.standbyBridgeLogged)P.standbyBridgeLogged=!0,i.info("fable-fallback","restored standby Opus cache bridge",{session:P.plan.sessionId,distanceBlocks:d?.standbyDistanceBlocks})}}),P?.plan.downgraded&&c&&p==="hybrid"){let z0=g4(I);P.opusCacheAnchor=z0?{...z0,oauthAccountId:m}:void 0}let C0=q();try{w1(w,f,{body:JSON.parse(I),identity:N0}),E?.mark("set_oauth_headers_body_parse",{route:z,ms:a(q()-C0),bodyBytes:I.length,parsed:!0})}catch{w1(w,f,{identity:N0}),E?.mark("set_oauth_headers_body_parse",{route:z,ms:a(q()-C0),bodyBytes:I.length,parsed:!1})}if(J0)R1(w);E?.mark("rewrite_body",{route:z,ms:a(q()-k),originalBytes:e,rewrittenBytes:I.length,cacheEnabled:!h&&J1(),cacheMode:O1(),fastModeEnabled:J0,subagent:h})}let G0=GW(V);if(P&&typeof I==="string")P.warmTarget={url:G0.url?.toString()??G0.input.toString(),headers:new Headers(w),bodyText:I,oauthAccountId:m};if(typeof I==="string"&&J1()&&O1()==="hybrid"){let k=await D();if(!h||Gj(k)){let J0=q(),c=q0.track({sessionId:C,url:G0.url?.toString()??G0.input.toString(),headers:w,bodyText:I,storage:k,cacheMode:"hybrid",oauthAccountId:m});E?.mark("cachekeep_track",{session:C,ms:a(q()-J0),tracked:c.tracked,reason:c.tracked?void 0:c.reason,bodyBytes:I.length})}}let E1=async()=>{try{let k=await fetch(G0.input,{..._,body:I,headers:w,...DW()&&{tls:{rejectUnauthorized:!1}}});if(typeof I==="string")await L1({affinity:C,route:z,status:k.status,bodyText:I,url:G0.url?.toString()??g1(G0.input),method:y1(V,_),headers:w});return k}catch(k){if(typeof I==="string")await L1({affinity:C,route:z,error:o4(k),bodyText:I,url:G0.url?.toString()??g1(G0.input),method:y1(V,_),headers:w});throw k}},a0=RW(await D()),S=q(),A=await cj({config:a0,input:G0.input,init:_,headers:w,body:I,fallback:E1,affinity:C,optimisticResponse:a0?.transport==="websocket"});return E?.mark("send_headers_received",{route:z,ms:a(q()-S),status:A.status,relayConfigured:a0!=null,totalSendWithAccessMs:a(q()-F)}),A}async function VN(V){if(!V)return!1;try{return await M.refreshMain(V),x1(V)}catch{return!1}}async function G1(V,_={}){let f=await O0.getUsableFallbackAccounts(V,{modelId:_.modelId}),E=new Map(f.map((v)=>[v.id,v])),z=[];for(let v of V?.accounts??[]){if(U0(v)){let m=E.get(v.id);if(m)z.push(m);continue}if(_.includeApiRoutes===!0&&j1(v)&&v.enabled!==!1&&v.apiKey&&b1(v.baseURL))z.push(v)}if(!l0(V))return z;return z.filter((v)=>U0(v)?c0(h0(v),V,v.id,_.modelId):!0)}async function bW(V){let _=M.getMain(V.mainAccessToken),f=_?.quota;if(!$1(_?.quota,V.storage,Date.now(),V.requestedModelId))try{f=await M.refreshMain(V.mainAccessToken)}catch{}let E=await O0.getUsableFallbackAccounts(V.storage,{modelId:V.requestedModelId}),z=await R(j)??V.storage,v=new Map(E.map((D)=>[D.id,D])),m=[];if(!N1(z?.refresh?.mainLastRefreshError))m.push({id:f0,access:V.mainAccessToken,quota:f,order:0});for(let[D,w]of(z?.accounts??[]).entries()){if(w.enabled===!1||!U0(w))continue;let C=v.get(w.id)??w;if(!C.access||N1(C.lastRefreshError))continue;let h=h0(C);if(!$1(h,z,Date.now(),V.requestedModelId))try{h=await M.refreshFallback(C.id,C.access)}catch{}m.push({id:C.id,access:C.access,quota:h,order:D+1,account:C})}let P=new Set(m.flatMap((D)=>{let w=D.id===f0?z?.refresh?.mainLastRefreshError:D.account?.lastRefreshError;if(N1(w))return[];if($1(D.quota,z,Date.now(),V.requestedModelId)&&s1({quota:D.quota,modelId:V.requestedModelId}).action==="migrate")return[];if(l0(z)&&!c0(D.quota,z,D.id===f0?void 0:D.id,V.requestedModelId))return[];return[D.id]})),F=new Set(E.map((D)=>D.id)),H=m.flatMap((D)=>{if(!D.quota)return[];let w=D.id===f0?void 0:D.id;return Q1(D.quota,z)&&PW(D.quota,V.requestedModelId)&&(!l0(z)||c0(D.quota,z,w,V.requestedModelId))&&(D.id===f0||F.has(D.id))?[{accountId:D.id,quota:D.quota,order:D.order}]:[]});return{storage:z,allRoutes:m,candidates:H,retainAccountIds:P}}async function pW(V,_,f,E=!1){let z=new Headers(V.headers);if(z.set("retry-after",String(sj(_,f))),E)return await V.body?.cancel().catch(()=>{}),z.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:z});return new Response(V.body,{status:V.status,statusText:V.statusText,headers:z})}async function X1(V,_,f,E,z,v,m){if(!f.length)return z??null;let P=m?.returnLastOnExhausted??!0;await z?.body?.cancel().catch(()=>{});let F=z??null;for(let[H,D]of f.entries()){let w;if(j1(D)){if(!D.apiKey)continue;w=await s0(V,_,D,v,`api_fallback_${H}`,E,m?.fableRequest)}else{let h=D.access;if(!h)continue;w=await k0(V,_,h,v,`fallback_${H}`,E,D.id,m?.fableRequest)}F=w;let C=d1(w.status,E);if(!C){let h=await Y0(w,v);w=h.response,F=w,C=h.rateLimited}if(!C){if(await O0.markUsed(D),await m?.onSuccess?.(D),U0(D)&&D.access&&M.shouldRefreshOnRequestCount(r0))M.refreshFallback(D.id,D.access).then(()=>m?.onSuccess?.(D)).catch(()=>{});return w}if(H<f.length-1||!P)await w.body?.cancel().catch(()=>{})}return P?F:null}async function KN(V,_,f,E,z,v,m,P,F,H){if(!B(V,_?.body))return f;let D=q(),w=v??await R(j);if(z?.mark("fallback_load_storage",{ms:a(q()-D),cached:!!v}),!(w?.accounts??[]).some((e)=>e.enabled!==!1&&(U0(e)||j1(e)&&Boolean(e.apiKey)&&b1(e.baseURL))))return f;let h=f,I=d1(h.status,w),y=mW(h,!1);if(!I){let e=await Y0(h,z);h=e.response,I=e.rateLimited,y=mW(h,e.rateLimited)}if(!I)return h;let j0=!1;if(E)j0=E.some(j1);else if(y)j0=await VN(m);let N0=E;if(!N0){let e=q();N0=await G1(w,{includeApiRoutes:j0,modelId:F}),z?.mark("fallback_get_accounts",{ms:a(q()-e),accounts:N0.length})}if(l0(w)){let e=N0.length;if(N0=N0.filter((G0)=>U0(G0)?c0(h0(G0),w,G0.id,F):!0),N0.length<e)t("[killswitch] filtered fallbacks",{before:e,after:N0.length})}return await X1(V,_,N0,w,h,z,{onSuccess:P,fableRequest:H})??h}return{apiKey:"",async fetch(V,_){let f=A1(V,_),E=f.get("x-session-affinity")||f.get("x-opencode-session"),z=l.plan(E,_?.body);if(z&&!z.downgraded){let S=M0.get(z.sessionId);if(S)await S,z=l.plan(E,_?.body)}let v=z?{plan:z}:void 0;if(z?.downgraded)_={..._,body:z.bodyText};let m=_?.body,P=HJ({bodyBytes:typeof m==="string"?m.length:void 0}),F=(S)=>p4(S,{perf:(A,k)=>P.mark(A,k),...!z?.downgraded&&z?{onContentFilter:()=>{if(!v?.warmTarget)return i.debug("fable-fallback","content filter recovery unavailable for non-OAuth route",{session:z.sessionId}),!1;let A=l.activate(z,v.warmTarget.oauthAccountId);i.info("fable-fallback","content filter detected; switching session to Opus 4.8",{session:z.sessionId,remaining:A}),D1({sessionId:z.sessionId,mode:"opus",remaining:A},C,D,TJ)}}:{},...z?.downgraded&&v?{onComplete:(A)=>{let k=l.complete(z,v.opusCacheAnchor);if(!k.counted)return;i.info("fable-fallback","Opus 4.8 turn completed",{session:z.sessionId,finishReason:A,remaining:k.remaining}),D1({sessionId:z.sessionId,mode:"opus",remaining:k.remaining},C,D);let J0=A0(v);if(k.remaining===0){let c=()=>{if(l.remaining(z.sessionId)!==0)return;D1({sessionId:z.sessionId,mode:"fable",remaining:0},C,D,xJ)};J0.then(c,c)}}}:{}}),H=q(),D=await O();if(P.mark("get_auth",{ms:a(q()-H),authType:D.type,hasAccess:Boolean(D.access)}),D.type!=="oauth"){let S=await fetch(V,_);return P.done("non_oauth_passthrough",{status:S.status}),S}await Z1(D.refresh);let w=q(),C=await R();if(P.mark("load_storage",{ms:a(q()-w)}),M.updateStorage(C),M.seedMainFromStorage(C,D.access),M.seedFallbacksFromAccounts((C?.accounts??[]).filter(U0)),!z)F1(E,C,D);let h=B(V,_?.body),I=U(_?.body);if(h)r0++;if(h&&D.access&&(!D.expires||D.expires>Date.now()))o0(C,D.access);let y=(S,A)=>K0(C,{activeId:S,route:A,mainAccessToken:D.access,mainRefreshToken:D.refresh}),j0;if(h&&E&&B1(C)==="sticky-balanced"&&D.access){let S=z?.effectiveModel??I,A=oj(S),k=q0.trackedOAuthRoute(E),J0=z?.cacheAccountId??(k?k.oauthAccountId??f0:void 0),c=!1;try{let p=await bW({storage:C,mainAccessToken:D.access,requestedModelId:S}),I0=(E0)=>r.resolve({sessionId:E,family:A,modelId:S,candidates:p.candidates,retainAccountIds:p.retainAccountIds,storage:p.storage,inputBytes:typeof _?.body==="string"?Buffer.byteLength(_.body):1,preferredAccountId:J0,excludeAccountIds:E0}),C0=p.allRoutes.length===0||p.allRoutes.some((E0)=>!E0.quota||!$1(E0.quota,p.storage,Date.now(),S)),z0=await I0();if(!z0&&C0)throw Error("Sticky-balanced routing is waiting for current OAuth quota snapshots");let d=p.allRoutes.find((E0)=>E0.id===z0?.accountId);if(z0&&d){if(c=!0,z?.downgraded&&l.bindRecoveryAccount(z,d.id))i.info("fable-fallback","rebound recovery to migrated sticky account",{accountId:d.id});let E0=(W0)=>k0(V,_,W0.access,P,`sticky:${W0.id}`,p.storage,W0.id,v),t0=async(W0,V0,w0=!0)=>{if(w0&&W0.account)await O0.markUsed(W0.account);return y(W0.id,"sticky-balanced"),P.done("return_sticky_balanced",{status:V0.status,accountId:W0.id,created:z0?.created,migrated:z0?.migrated}),F(V0)},iW=async(W0)=>{let V0=W0,w0=d1(W0.status,p.storage),v0=!1;if(!w0){let m0=await Y0(W0,P);V0=m0.response,v0=m0.rateLimited,w0=m0.rateLimited}return{response:V0,routeFailure:w0,streamingRateLimit:v0}},dW=$1(d.quota,p.storage,Date.now(),S)?s1({quota:d.quota,modelId:S}):void 0;if(dW?.action==="hold")return t0(d,await pW(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"}}),E,dW.retryAfterSeconds),!1);let X0=await iW(await E0(d)),jW=!1;if(!X0.routeFailure)return t0(d,X0.response);if(X0.response.status===401){let W0=d.id;try{if(W0===f0)D.access=await Z(),d={...d,access:D.access};else if(d.account&&p.storage){let V0=await O0.refreshAccount(d.account,p.storage,{force:!0});if(V0.access)d={...d,access:V0.access,account:V0}}if(await X0.response.body?.cancel().catch(()=>{}),X0=await iW(await E0(d)),!X0.routeFailure)return t0(d,X0.response);jW=X0.response.status===401}catch(V0){let w0=await R(j),v0=W0===f0?w0?.refresh?.mainLastRefreshError:w0?.accounts.find((m0)=>m0.id===W0&&U0(m0))?.lastRefreshError;if(!N1(v0))throw V0;jW=!0}}let lW=X0.response.status===403||jW;if(X0.response.status===429||X0.streamingRateLimit){let W0;try{W0=d.id===f0?await M.refreshMain(d.access):await M.refreshFallback(d.id,d.access)}catch{W0=void 0}let V0=s1({quota:W0,modelId:S});if(P.mark("sticky_quota_failure",{accountId:d.id,action:V0.action,reason:V0.reason}),V0.action==="hold")return t0(d,await pW(X0.response,E,V0.retryAfterSeconds,X0.streamingRateLimit));lW=V0.action==="migrate"}if(lW){let W0=d.id;if(p=await bW({storage:p.storage,mainAccessToken:D.access,requestedModelId:S}),p.candidates.filter((w0)=>w0.accountId!==W0).length>0){await X0.response.body?.cancel().catch(()=>{}),z0=await I0(new Set([W0]));let w0=p.allRoutes.find((v0)=>v0.id===z0?.accountId);if(z0&&w0){if(d=w0,z?.downgraded)l.bindRecoveryAccount(z,d.id);return t0(d,await E0(d))}}else if((X0.response.status===429||X0.streamingRateLimit)&&x1(D.access)){let w0=(await G1(p.storage,{includeApiRoutes:!0,modelId:S})).filter(j1);if(w0.length>0){let v0=await X1(V,_,w0,p.storage,X0.response,P,{onSuccess:(m0)=>y(m0.id,"sticky-balanced"),fableRequest:v});if(v0)return P.done("return_sticky_api_fallback",{status:v0.status}),F(v0)}}}return t0(d,X0.response)}}catch(p){if(P.mark("sticky_balanced_error",{error:p instanceof Error?p.message:String(p)}),c)throw p;let I0=p instanceof Error?p:Error(String(p));throw Object.assign(I0,{code:"ECONNRESET",syscall:"sticky-routing"}),I0}}if(h&&B1(C)==="fallback-first")try{let S=q();j0=await G1(C,{includeApiRoutes:x1(D.access),modelId:I}),P.mark("fallback_first_get_accounts",{ms:a(q()-S),accounts:j0.length});let A=await X1(V,_,j0,C,void 0,P,{returnLastOnExhausted:!1,onSuccess:(k)=>y(k.id,"fallback-first"),fableRequest:v});if(A)return P.done("return_fallback_first",{status:A.status}),F(A);j0=void 0}catch(S){P.mark("fallback_first_error",{error:S instanceof Error?S.message:String(S)})}if(!D.access||!D.expires||D.expires<Date.now()){let A=(await R())?.refresh?.mainLastRefreshError;if(D.refresh&&A&&d0(A,D.refresh,Date.now()))throw t("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:A.nextRetryAt,retryCount:A.retryCount,expiresInMs:D.expires?D.expires-Date.now():void 0}),Error(zW(A,Date.now()));t("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(D.access),expiresInMs:D.expires?D.expires-Date.now():void 0,expiredAgoMs:D.expires&&D.expires<Date.now()?Date.now()-D.expires:void 0});let k=q();D.access=await Z(),P.mark("refresh_main_access",{ms:a(q()-k)})}if(!D.access)throw P.done("missing_access_error"),Error("OAuth access token is missing after refresh");function N0(){if(C?.quota?.showToasts!==!0)return;let S=M.getMain();if(!S)return;let A=(C?.accounts??[]).filter((c)=>c.enabled!==!1&&U0(c)).map((c)=>({...c,quota:M.getFallback(c.id,c.access)?.quota??c.quota})),k=Q1(S.quota,C),J0;if(k)J0="main";else J0=A.find((c)=>Q1(c.quota,C))?.id??"main";XN(S.quota,A,J0)}if(h&&$0(C))try{let S=q(),A=M.getMain(D.access),k=A?.quota;if(!k)k=await M.refreshMain(D.access),A=M.getMain(D.access),N0();else if(M.needsRefresh(r0,I))if(WW(k)||wW(k,I))k=await M.refreshMain(D.access),A=M.getMain(D.access);else M.refreshMain(D.access).then(()=>{B0().catch(()=>{}),N0()}).catch(()=>{});K0(C,{activeId:"main",route:"main",mainAccessToken:D.access,mainRefreshToken:D.refresh});let J0=Q1(k,C)&&PW(k,I);if(P.mark("main_quota_for_routing",{ms:a(q()-S),passes:J0,model:I,modelScopedExhausted:wW(k,I)}),!J0){let c=q();j0=await G1(C,{includeApiRoutes:Boolean(A&&A.refreshAfter>Date.now()&&WW(A.quota)),modelId:I}),P.mark("preselect_fallback_accounts",{ms:a(q()-c),accounts:j0.length});let p=await X1(V,_,j0,C,void 0,P,{onSuccess:(I0)=>y(I0.id,"fallback"),fableRequest:v});if(p)return P.done("return_preselected_fallback",{status:p.status}),F(p)}}catch(S){P.mark("main_quota_for_routing_error",{error:S instanceof Error?S.message:String(S)})}let e=M.getMain(D.access)?.quota;if(C?.quota?.failClosedOnUnknownQuota&&!e&&M.isBackedOff()){let S=M.getLastApiError(),A=S?Kj(S,Date.now()):"Quota API unavailable";return t("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:S?.nextRetryAt,retryCount:S?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:A}}),{status:429,headers:{"content-type":"application/json","retry-after":String(S?.nextRetryAt?Math.max(1,Math.ceil((S.nextRetryAt-Date.now())/1000)):60)}})}if(l0(C)){if(M.needsRefresh(r0,I))try{let A=(C?.accounts??[]).filter((k)=>k.enabled!==!1&&U0(k)&&Boolean(k.access));await Promise.all([M.refreshMain(D.access),M.refreshAllFallbacks(A)])}catch(A){t("[quota] killswitch refresh failed",{error:A instanceof Error?A.message:String(A),backedOff:M.isBackedOff()})}e=M.getMain(D.access)?.quota}if(l0(C)&&!c0(e,C,void 0,I)){let A=B(V,_?.body)?await G1(C,{includeApiRoutes:x1(D.access),modelId:I}):[];if(A.length>0){t("[route] skipping main (killswitch), trying fallbacks");let C0=await X1(V,_,A,C,void 0,P,{onSuccess:(z0)=>y(z0.id,"fallback")});if(C0)return P.done("return_killswitch_fallback",{status:C0.status}),F(C0)}let k=Date.now(),J0=(C?.accounts??[]).filter((C0)=>C0.enabled!==!1&&U0(C0)).map((C0)=>({...C0,quota:h0(C0)})),c=UJ({mainQuota:e,requestModelId:I,storage:C}),p=Uj(e,J0,k,c.isScopedDriven?c.modelId:void 0),I0=PJ({retryAfterSeconds:p,...c.isScopedDriven&&{modelName:c.modelName}});return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:I0}}),{status:429,headers:{"content-type":"application/json","retry-after":String(p)}})}let G0=await k0(V,_,D.access,P,"main",C,"main",v),E1=!1,a0=await KN(V,_,G0,j0,P,C,D.access,(S)=>{E1=!0,y(S.id,"fallback")},I,v);if(!E1)y("main","main");return P.done("return_response",{status:a0.status}),F(a0)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let O=await h1("max");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async(Y)=>{return m1(Y,O.verifier,O.redirectUri,O.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let O=await h1("console");return{url:O.url,instructions:"Paste the authorization code here:",method:"code",callback:async(Y)=>{let X=await m1(Y,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((Z)=>Z.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{UJ as resolveScopedDrivenBlock,PJ as formatKillswitchBlockMessage,j3 as AnthropicAuthPlugin};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Bb as a,Cb as b,Db as c,Eb as d,Fb as e,Gb as f,Hb as g,Ib as h,Jb as i,Kb as j,Lb as k,Mb as l,Nb as m}from"./index-epg96jpt.js";import"./index-dbczmr1v.js";export{d as shouldEmit,b as setLogLevel,m as relayLog,h as redactPayload,a as parseLogLevel,k as logger,l as log,g as isSecretKey,c as getLogLevel,e as getLogFilePath,i as formatLogLine,j as __setLogTestSink,f as SECRET_KEY_EXACT};
|
package/dist/prompt-context.d.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* OpenCode records even ignored/noReply prompt messages as user messages. If a
|
|
5
5
|
* plugin sends one without the previous model/variant, OpenCode's next prompt
|
|
6
6
|
* can inherit the synthetic message's default model/variant and change usage or
|
|
7
|
-
* cache attribution. Resolve the most recent assistant context and
|
|
8
|
-
*
|
|
7
|
+
* cache attribution. Resolve the most recent assistant context and message IDs
|
|
8
|
+
* so hidden replies preserve model state and active-run notifications can be
|
|
9
|
+
* ordered before the assistant without becoming pending user work.
|
|
9
10
|
*/
|
|
10
11
|
export interface ResolvedPromptContext {
|
|
11
12
|
agent?: string;
|
|
@@ -14,5 +15,7 @@ export interface ResolvedPromptContext {
|
|
|
14
15
|
modelID: string;
|
|
15
16
|
};
|
|
16
17
|
variant?: string;
|
|
18
|
+
latestAssistantMessageId?: string;
|
|
19
|
+
latestUserMessageId?: string;
|
|
17
20
|
}
|
|
18
21
|
export declare function resolvePromptContext(client: unknown, sessionId: string): Promise<ResolvedPromptContext | null>;
|
package/dist/rpc/port-file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$b as a,ac as b}from"../index-z9dywmf2.js";import"../index-dbczmr1v.js";export{a as writePortFile,b as discoverPortFile};
|
package/dist/rpc/rpc-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ac as l}from"../index-z9dywmf2.js";import"../index-dbczmr1v.js";async function a(n,e,t,o){let r=await l(n,o);if(!r)return null;let i=new AbortController,p=setTimeout(()=>i.abort(),2000);try{let s=await fetch(`http://127.0.0.1:${r.port}/rpc/${e}`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${r.token}`},body:JSON.stringify(t),signal:i.signal});if(!s.ok)return null;return await s.json()}catch{return null}finally{clearTimeout(p)}}function u(n,e){return{async pending(t,o){return(await a(n,"pending-notifications",{lastReceivedId:t,sessionId:o},e))?.messages??[]},async apply(t){return await a(n,"apply",{...t},e)??{text:"apply failed",knobs:{}}}}}export{u as createRpcClient};
|
package/dist/rpc/rpc-dir.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bc as a,cc as b}from"../index-5xsc5gwa.js";import"../index-dbczmr1v.js";export{a as tmpdir,b as getRpcDir};
|
package/dist/sidebar-state.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ob as a,Pb as b,Qb as c,Rb as d,Sb as e,Tb as f,Ub as g,Vb as h,Wb as i,Xb as j,Yb as k,Zb as l,_b as m}from"./index-0z4mmpxy.js";import"./index-dbczmr1v.js";export{e as setSidebarState,g as resolveActiveAccount,c as normalizeSidebarState,a as getSidebarStateFile,d as getSidebarState,i as getFableRecoverySummary,j as getCollapsedQuotaSummary,h as formatScopedQuotaLabel,f as drainSidebarWrites,m as computeQuotaPacing,l as SEVEN_DAY_MS,k as FIVE_HOUR_MS,b as DEFAULT_SIDEBAR_STATE};
|
package/dist/tui-preferences.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{dc as c,ec as C,fc as h}from"./index-dbczmr1v.js";var m=C((v,k)=>{(function(Q){if(typeof k==="object"&&typeof k.exports==="object"){var J=Q(h,v);if(J!==void 0)k.exports=J}else if(typeof define==="function"&&define.amd)define(["require","exports","./impl/format","./impl/edit","./impl/scanner","./impl/parser"],Q)})(function(Q,J){Object.defineProperty(J,"__esModule",{value:!0}),J.applyEdits=J.modify=J.format=J.printParseErrorCode=J.ParseErrorCode=J.stripComments=J.visit=J.getNodeValue=J.getNodePath=J.findNodeAtOffset=J.findNodeAtLocation=J.parseTree=J.parse=J.getLocation=J.SyntaxKind=J.ScanError=J.createScanner=void 0;let X=Q("./impl/format"),Z=Q("./impl/edit"),$=Q("./impl/scanner"),G=Q("./impl/parser");J.createScanner=$.createScanner;var V;(function(z){z[z.None=0]="None",z[z.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=2]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",z[z.InvalidUnicode=4]="InvalidUnicode",z[z.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",z[z.InvalidCharacter=6]="InvalidCharacter"})(V||(J.ScanError=V={}));var Y;(function(z){z[z.OpenBraceToken=1]="OpenBraceToken",z[z.CloseBraceToken=2]="CloseBraceToken",z[z.OpenBracketToken=3]="OpenBracketToken",z[z.CloseBracketToken=4]="CloseBracketToken",z[z.CommaToken=5]="CommaToken",z[z.ColonToken=6]="ColonToken",z[z.NullKeyword=7]="NullKeyword",z[z.TrueKeyword=8]="TrueKeyword",z[z.FalseKeyword=9]="FalseKeyword",z[z.StringLiteral=10]="StringLiteral",z[z.NumericLiteral=11]="NumericLiteral",z[z.LineCommentTrivia=12]="LineCommentTrivia",z[z.BlockCommentTrivia=13]="BlockCommentTrivia",z[z.LineBreakTrivia=14]="LineBreakTrivia",z[z.Trivia=15]="Trivia",z[z.Unknown=16]="Unknown",z[z.EOF=17]="EOF"})(Y||(J.SyntaxKind=Y={})),J.getLocation=G.getLocation,J.parse=G.parse,J.parseTree=G.parseTree,J.findNodeAtLocation=G.findNodeAtLocation,J.findNodeAtOffset=G.findNodeAtOffset,J.getNodePath=G.getNodePath,J.getNodeValue=G.getNodeValue,J.visit=G.visit,J.stripComments=G.stripComments;var L;(function(z){z[z.InvalidSymbol=1]="InvalidSymbol",z[z.InvalidNumberFormat=2]="InvalidNumberFormat",z[z.PropertyNameExpected=3]="PropertyNameExpected",z[z.ValueExpected=4]="ValueExpected",z[z.ColonExpected=5]="ColonExpected",z[z.CommaExpected=6]="CommaExpected",z[z.CloseBraceExpected=7]="CloseBraceExpected",z[z.CloseBracketExpected=8]="CloseBracketExpected",z[z.EndOfFileExpected=9]="EndOfFileExpected",z[z.InvalidCommentToken=10]="InvalidCommentToken",z[z.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=12]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",z[z.InvalidUnicode=14]="InvalidUnicode",z[z.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",z[z.InvalidCharacter=16]="InvalidCharacter"})(L||(J.ParseErrorCode=L={}));function B(z){switch(z){case 1:return"InvalidSymbol";case 2:return"InvalidNumberFormat";case 3:return"PropertyNameExpected";case 4:return"ValueExpected";case 5:return"ColonExpected";case 6:return"CommaExpected";case 7:return"CloseBraceExpected";case 8:return"CloseBracketExpected";case 9:return"EndOfFileExpected";case 10:return"InvalidCommentToken";case 11:return"UnexpectedEndOfComment";case 12:return"UnexpectedEndOfString";case 13:return"UnexpectedEndOfNumber";case 14:return"InvalidUnicode";case 15:return"InvalidEscapeCharacter";case 16:return"InvalidCharacter"}return"<unknown ParseErrorCode>"}J.printParseErrorCode=B;function j(z,H,N){return X.format(z,H,N)}J.format=j;function A(z,H,N,R){return Z.setProperty(z,H,N,R)}J.modify=A;function O(z,H){let N=H.slice(0).sort((U,D)=>{let T=U.offset-D.offset;if(T===0)return U.length-D.length;return T}),R=z.length;for(let U=N.length-1;U>=0;U--){let D=N[U];if(D.offset+D.length<=R)z=Z.applyEdit(z,D);else throw Error("Overlapping edit");R=D.offset}return z}J.applyEdits=O})});var q=c(m(),1);import{watch as y}from"node:fs";import{mkdir as S,readFile as w,rename as E,writeFile as p}from"node:fs/promises";import{homedir as l}from"node:os";import{basename as x,dirname as P,join as _}from"node:path";import{clearTimeout as F,setTimeout as f}from"node:timers";var i="OPENCODE_TUI_PREFERENCES_FILE",s="tui-preferences.jsonc";function b(){let Q=process.env[i];if(Q)return Q;let J=process.env.OPENCODE_CONFIG_DIR||_(process.env.XDG_CONFIG_HOME||_(l(),".config"),"opencode");return _(J,s)}function I(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}async function Vz(){try{let Q=await w(b(),"utf8"),J=[],X=q.parse(Q,J,{allowTrailingComma:!0});if(J.length>0)return{};return I(X)?X:{}}catch{return{}}}var d="anthropic-auth",n=160,u={forceToTop:!1,order:n,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"CLAUDE",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,cache:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function W(Q,J){return typeof Q==="boolean"?Q:J}function M(Q,J,X,Z){if(typeof Q!=="number"||!Number.isFinite(Q))return J;return Math.min(Math.max(Math.round(Q),X),Z)}function a(Q,J,X){if(typeof Q!=="string"||Q.length===0)return J;return Q.slice(0,X)}function K(Q,J){if(typeof Q!=="string")return J;return[...Q][0]??J}function Yz(Q){let J=Q[d];if(!I(J))return structuredClone(u);let X=u,Z=I(J.header)?J.header:{},$=I(J.sections)?J.sections:{},G=I(J.appearance)?J.appearance:{},V=M(G.warnThreshold,X.appearance.warnThreshold,0,99),Y=Math.max(M(G.errorThreshold,X.appearance.errorThreshold,0,100),Math.min(V+1,100));return{forceToTop:W(J.forceToTop,X.forceToTop),order:M(J.order,X.order,-1e4,1e4),startCollapsed:W(J.startCollapsed,X.startCollapsed),rememberCollapsed:W(J.rememberCollapsed,X.rememberCollapsed),collapsed:typeof J.collapsed==="boolean"?J.collapsed:null,pollMs:M(J.pollMs,X.pollMs,500,30000),refreshDebounceMs:M(J.refreshDebounceMs,X.refreshDebounceMs,50,5000),header:{label:a(Z.label,X.header.label,20),showVersion:W(Z.showVersion,X.header.showVersion)},sections:{quota:W($.quota,X.sections.quota),fallbackAccounts:W($.fallbackAccounts,X.sections.fallbackAccounts),routing:W($.routing,X.sections.routing),cache:W($.cache,X.sections.cache),health:W($.health,X.sections.health),pacing:W($.pacing,X.sections.pacing)},appearance:{barWidth:M(G.barWidth,X.appearance.barWidth,4,40),barFilledChar:K(G.barFilledChar,X.appearance.barFilledChar),barEmptyChar:K(G.barEmptyChar,X.appearance.barEmptyChar),warnThreshold:V,errorThreshold:Y}}}var t=-1e5;function Hz(Q,J,X){let Z=Q[J];if(!I(Z))return X;if(Z.forceToTop===!0)return t+Object.keys(Q).indexOf(J);return M(Z.order,X,-1e4,1e4)}var o=`// Shared preferences for opencode TUI plugins.
|
|
2
2
|
// One top-level key per plugin (short name). See each plugin's README for
|
|
3
3
|
// its supported settings. This file is safe to hand-edit; plugins update
|
|
4
4
|
// individual keys in place and preserve comments.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cortexkit/opencode-anthropic-auth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"./tui": {
|
|
18
18
|
"types": "./dist/tui.d.ts",
|
|
19
|
-
"import": "./src/tui.
|
|
19
|
+
"import": "./src/tui/entry.mjs"
|
|
20
20
|
},
|
|
21
21
|
"./tui-prefs": {
|
|
22
22
|
"types": "./dist/tui-preferences.d.ts",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"files": [
|
|
37
37
|
"dist",
|
|
38
38
|
"src/tui.tsx",
|
|
39
|
-
"src/tui
|
|
39
|
+
"src/tui",
|
|
40
|
+
"src/tui-compiled",
|
|
40
41
|
"src/sidebar-state.ts",
|
|
41
42
|
"src/tui-preferences.ts",
|
|
42
43
|
"src/rpc",
|
|
@@ -44,24 +45,26 @@
|
|
|
44
45
|
"LICENSE"
|
|
45
46
|
],
|
|
46
47
|
"scripts": {
|
|
47
|
-
"build": "rm -rf dist && bun build src/index.ts src/cli.ts src/sidebar-state.ts src/tui-preferences.ts src/rpc/rpc-client.ts src/rpc/port-file.ts src/rpc/protocol.ts src/rpc/rpc-dir.ts --outdir dist --target node --format esm --splitting --external @opencode-ai/plugin --minify && tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
48
|
+
"build": "rm -rf dist && bun build src/index.ts src/cli.ts src/sidebar-state.ts src/tui-preferences.ts src/rpc/rpc-client.ts src/rpc/port-file.ts src/rpc/protocol.ts src/rpc/rpc-dir.ts --outdir dist --target node --format esm --splitting --external @opencode-ai/plugin --minify && tsc -p tsconfig.build.json --emitDeclarationOnly && bun run build:tui",
|
|
49
|
+
"build:tui": "bun scripts/build-tui.ts",
|
|
50
|
+
"smoke:tui": "bun scripts/smoke-tui-pack-install.ts",
|
|
48
51
|
"build:dev": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
49
52
|
"dev": "bun ../../scripts/dev.ts",
|
|
50
53
|
"dev:clean": "bun ../../scripts/dev-clean.ts",
|
|
51
54
|
"extract": "bun ../../scripts/extract-system-prompt.ts",
|
|
52
55
|
"test": "bun test src/tests",
|
|
53
|
-
"typecheck": "tsc",
|
|
54
|
-
"types": "tsc",
|
|
56
|
+
"typecheck": "tsc && tsc -p tsconfig.scripts.json",
|
|
57
|
+
"types": "tsc && tsc -p tsconfig.scripts.json",
|
|
55
58
|
"prepublishOnly": "bun run build"
|
|
56
59
|
},
|
|
57
60
|
"peerDependencies": {
|
|
58
61
|
"@opencode-ai/plugin": "*"
|
|
59
62
|
},
|
|
60
63
|
"dependencies": {
|
|
61
|
-
"@cortexkit/anthropic-auth-core": "1.
|
|
62
|
-
"@opentui/core": "
|
|
63
|
-
"@opentui/solid": "
|
|
64
|
+
"@cortexkit/anthropic-auth-core": "1.16.0",
|
|
65
|
+
"@opentui/core": "0.4.3",
|
|
66
|
+
"@opentui/solid": "0.4.3",
|
|
64
67
|
"jsonc-parser": "^3.3.1",
|
|
65
|
-
"solid-js": "
|
|
68
|
+
"solid-js": "1.9.12"
|
|
66
69
|
}
|
|
67
70
|
}
|