@cortexkit/opencode-anthropic-auth 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import{$ as v1,A as p1,B as l1,Ba as f0,C as u1,Ca as j1,D as c0,Da as Pj,E as M0,Ea as zj,F as i1,Fa as J1,G as $0,H as n0,I as c1,J as P0,K as z0,L as v0,M as n1,N as o1,O as s1,P as r1,Q as F0,R as q0,S as E0,T as Q0,U as t1,V as C0,W as B1,X as H1,Y as o0,Z as U1,_ as M1,a as I1,aa as x0,b as O1,ba as a1,c as _0,ca as e1,d as B0,da as jj,e as L1,ea as Jj,f as K0,fa as s0,g as k1,ga as Zj,h as N1,ha as $j,i as w1,ia as S0,j as _1,ja as R0,k as d0,ka as Gj,l as f1,la as r0,m as p0,ma as T0,n as l0,na as t0,o as F,oa as y0,p as m1,pa as Vj,q as R,qa as a0,r as Y0,ra as A0,s as b1,sa as Dj,t as H0,ta as Kj,u as U0,ua as k0,v as h1,va as Xj,w as g1,wa as Wj,x as u0,xa as e0,y as d1,z as i0,za as Yj}from"./index-zx0zb5c8.js";import{Ja as Qj}from"./index-q0d64q8d.js";import{randomUUID as pj}from"node:crypto";function Z0(j){return typeof j==="object"&&j!==null}function Fj(j){if(Array.isArray(j))return j;if(Z0(j)&&Array.isArray(j.data))return j.data;return[]}function qj(j){if(!Z0(j)||!Z0(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function G1(j){if(!Z0(j)||!Z0(j.info))return null;let J=j.info,Z=Z0(J.model)?J.model:void 0,G=typeof J.agent==="string"?J.agent:void 0,V=typeof Z?.providerID==="string"?Z.providerID:typeof J.providerID==="string"?J.providerID:void 0,Y=typeof Z?.modelID==="string"?Z.modelID:typeof J.modelID==="string"?J.modelID:void 0,v=typeof Z?.variant==="string"?Z.variant:typeof J.variant==="string"?J.variant:void 0;if(!G&&(!V||!Y)&&!v)return null;let u={};if(G)u.agent=G;if(V&&Y)u.model={providerID:V,modelID:Y};if(v)u.variant=v;return u}function V1(j,J){return{agent:j.agent??J.agent,model:j.model??J.model,variant:j.variant??J.variant}}function D1(j){return Boolean(j.agent&&j.model&&j.variant)}async function K1(j,J){if(!j||!J)return null;let Z=j;if(typeof Z.session?.messages!=="function")return null;let G=[];try{G=Fj(await Promise.resolve(Z.session.messages({path:{id:J},query:{limit:100}})))}catch{return null}if(G.length===0)return null;let V={};for(let Y=G.length-1;Y>=0;Y--){if(qj(G[Y])!=="assistant")continue;let v=G1(G[Y]);if(!v)continue;if(V=V1(V,v),D1(V))return V}for(let Y=G.length-1;Y>=0;Y--){let v=G1(G[Y]);if(!v)continue;if(V=V1(V,v),D1(V))return V}if(!V.agent&&!V.model&&!V.variant)return null;return V}function X1(j){return`${I1}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function F1(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}var Ej=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function W1(j){let J=F1(j);if(J.startsWith("aft_"))return J;if(Ej.has(J))return`aft_${J}`;return null}function q1(j,J){let Z=new Headers;if(j instanceof Request)j.headers.forEach((V,Y)=>{Z.set(Y,V)});let G=J?.headers;if(G){if(G instanceof Headers)G.forEach((V,Y)=>{Z.set(Y,V)});else if(Array.isArray(G))for(let V of G){let[Y,v]=V;if(typeof v<"u")Z.set(Y,String(v))}else for(let[V,Y]of Object.entries(G))if(typeof Y<"u")Z.set(V,String(Y))}return Z}function g0(j){return j.set("anthropic-beta",_0(j.get("anthropic-beta"),[O1])),j}function X0(j,J,Z={}){return M1(j,J,Z)}function Cj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((J)=>({...J,name:J.name?X1(J.name):J.name}));if(j.messages&&Array.isArray(j.messages))j.messages=j.messages.map((J)=>{if(J.content&&Array.isArray(J.content))J.content=J.content.map((Z)=>{if(Z.type==="tool_use"&&Z.name)return{...Z,name:X1(Z.name)};return Z});return J});return JSON.stringify(v1(j))}function b0(j){return j.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(J,Z,G)=>{if(Z)return`"name": "${W1(G)??F1(G)}"`;let V=W1(G);return V?`"name": "${V}"`:J})}function Y1(j,J=!1){if(J)return{ready:b0(j),pending:""};let Z=j.length,G='"name"',V=Math.max(0,j.length-G.length+1);for(let v=V;v<j.length;v++)if(G.startsWith(j.slice(v))){Z=Math.min(Z,v);break}let Y=j.lastIndexOf(G);if(Y!==-1){let v=j.slice(Y);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(v))Z=Math.min(Z,Y)}if(Z<j.length)return{ready:b0(j.slice(0,Z)),pending:j.slice(Z)};return{ready:b0(j),pending:""}}function E1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function xj(){let j=process.env.ANTHROPIC_BASE_URL?.trim();if(!j)return null;try{let J=new URL(j);if(J.protocol!=="http:"&&J.protocol!=="https:"||J.username||J.password)return null;return J}catch{return null}}function C1(j){let J=null;try{if(typeof j==="string"||j instanceof URL)J=new URL(j.toString());else if(j instanceof Request)J=new URL(j.url)}catch{J=null}if(!J)return{input:j,url:null};let Z=J.href,G=xj();if(G)J.protocol=G.protocol,J.host=G.host;if(J.pathname==="/v1/messages"&&!J.searchParams.has("beta"))J.searchParams.set("beta","true");if(J.href===Z)return{input:j,url:J};return{input:j instanceof Request?new Request(J.toString(),j):J,url:J}}function L0(j){let G=j.split(/\n\n+/).filter((V)=>{if(V.includes(L1))return!1;for(let Y of w1)if(V.includes(Y))return!1;return!0}).join(`
1
+ import{$ as C1,A as i1,B as c1,Ba as b0,C as n1,Ca as Z1,D as r0,Da as zj,E as v0,Ea as Qj,F as o1,Fa as $1,G as Z0,H as s0,I as r1,J as P0,K as O0,L as q0,M as s1,N as t1,O as a1,P as e1,Q as C0,R as E0,S as x0,T as I0,U as jj,V as S0,W as U1,X as F1,Y as t0,Z as v1,_ as q1,a as _1,aa as R0,b as L1,ba as Gj,c as B0,ca as Jj,d as M0,da as Zj,e as w1,ea as $j,f as X0,fa as a0,g as b1,ga as Dj,h as H1,ha as Vj,i as B1,ia as T0,j as M1,ja as y0,k as u0,ka as Xj,l as h1,la as e0,m as i0,ma as A0,n as c0,na as j1,o as v,oa as f0,p as g1,pa as Kj,q as R,qa as G1,r as W0,ra as k0,s as p1,sa as Yj,t as U0,ta as Wj,u as F0,ua as m0,v as d1,va as Pj,w as l1,wa as Oj,x as n0,xa as J1,y as u1,z as o0,za as Ij}from"./index-ykvgffhr.js";import{Ja as Nj}from"./index-q0d64q8d.js";import{randomUUID as oj}from"node:crypto";function J0(j){return typeof j==="object"&&j!==null}function Ej(j){if(Array.isArray(j))return j;if(J0(j)&&Array.isArray(j.data))return j.data;return[]}function xj(j){if(!J0(j)||!J0(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function X1(j){if(!J0(j)||!J0(j.info))return null;let G=j.info,J=J0(G.model)?G.model:void 0,D=typeof G.agent==="string"?G.agent:void 0,$=typeof J?.providerID==="string"?J.providerID:typeof G.providerID==="string"?G.providerID:void 0,P=typeof J?.modelID==="string"?J.modelID:typeof G.modelID==="string"?G.modelID:void 0,F=typeof J?.variant==="string"?J.variant:typeof G.variant==="string"?G.variant:void 0;if(!D&&(!$||!P)&&!F)return null;let l={};if(D)l.agent=D;if($&&P)l.model={providerID:$,modelID:P};if(F)l.variant=F;return l}function K1(j,G){return{agent:j.agent??G.agent,model:j.model??G.model,variant:j.variant??G.variant}}function Y1(j){return Boolean(j.agent&&j.model&&j.variant)}async function W1(j,G){if(!j||!G)return null;let J=j;if(typeof J.session?.messages!=="function")return null;let D=[];try{D=Ej(await Promise.resolve(J.session.messages({path:{id:G},query:{limit:100}})))}catch{return null}if(D.length===0)return null;let $={};for(let P=D.length-1;P>=0;P--){if(xj(D[P])!=="assistant")continue;let F=X1(D[P]);if(!F)continue;if($=K1($,F),Y1($))return $}for(let P=D.length-1;P>=0;P--){let F=X1(D[P]);if(!F)continue;if($=K1($,F),Y1($))return $}if(!$.agent&&!$.model&&!$.variant)return null;return $}function P1(j){return`${_1}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function E1(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}var Sj=new Set(["callgraph","conflicts","delete","import","inspect","move","navigate","outline","refactor","safety","search","transform","zoom"]);function O1(j){let G=E1(j);if(G.startsWith("aft_"))return G;if(Sj.has(G))return`aft_${G}`;return null}function x1(j,G){let J=new Headers;if(j instanceof Request)j.headers.forEach(($,P)=>{J.set(P,$)});let D=G?.headers;if(D){if(D instanceof Headers)D.forEach(($,P)=>{J.set(P,$)});else if(Array.isArray(D))for(let $ of D){let[P,F]=$;if(typeof F<"u")J.set(P,String(F))}else for(let[$,P]of Object.entries(D))if(typeof P<"u")J.set($,String(P))}return J}function d0(j){return j.set("anthropic-beta",B0(j.get("anthropic-beta"),[L1])),j}function K0(j,G,J={}){return q1(j,G,J)}function Rj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((G)=>({...G,name:G.name?P1(G.name):G.name}));if(j.messages&&Array.isArray(j.messages))j.messages=j.messages.map((G)=>{if(G.content&&Array.isArray(G.content))G.content=G.content.map((J)=>{if(J.type==="tool_use"&&J.name)return{...J,name:P1(J.name)};return J});return G});return JSON.stringify(C1(j))}function p0(j){return j.replace(/"name"\s*:\s*"(mcp_)?([^"]+)"/g,(G,J,D)=>{if(J)return`"name": "${O1(D)??E1(D)}"`;let $=O1(D);return $?`"name": "${$}"`:G})}function I1(j,G=!1){if(G)return{ready:p0(j),pending:""};let J=j.length,D='"name"',$=Math.max(0,j.length-D.length+1);for(let F=$;F<j.length;F++)if(D.startsWith(j.slice(F))){J=Math.min(J,F);break}let P=j.lastIndexOf(D);if(P!==-1){let F=j.slice(P);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(F))J=Math.min(J,P)}if(J<j.length)return{ready:p0(j.slice(0,J)),pending:j.slice(J)};return{ready:p0(j),pending:""}}function S1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function Tj(){let j=process.env.ANTHROPIC_BASE_URL?.trim();if(!j)return null;try{let G=new URL(j);if(G.protocol!=="http:"&&G.protocol!=="https:"||G.username||G.password)return null;return G}catch{return null}}function R1(j){let G=null;try{if(typeof j==="string"||j instanceof URL)G=new URL(j.toString());else if(j instanceof Request)G=new URL(j.url)}catch{G=null}if(!G)return{input:j,url:null};let J=G.href,D=Tj();if(D)G.protocol=D.protocol,G.host=D.host;if(G.pathname==="/v1/messages"&&!G.searchParams.has("beta"))G.searchParams.set("beta","true");if(G.href===J)return{input:j,url:G};return{input:j instanceof Request?new Request(G.toString(),j):G,url:G}}function _0(j){let D=j.split(/\n\n+/).filter(($)=>{if($.includes(w1))return!1;for(let P of B1)if($.includes(P))return!1;return!0}).join(`
2
2
 
3
- `);for(let V of _1)G=G.replace(V.match,V.replacement);return G.trim()}function f(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function Sj(j){let J={type:"text",text:K0};if(j==null)return[J];if(typeof j==="string"){let G=L0(j);if(G===K0)return[J];return[J,{type:"text",text:G}]}if(f(j)){let G=typeof j.type==="string"?j.type:"text",V=typeof j.text==="string"?j.text:"";return[J,{...j,type:G,text:L0(V)}]}if(!Array.isArray(j))return[J];let Z=j.map((G)=>{if(typeof G==="string")return{type:"text",text:L0(G)};if(f(G)&&G.type==="text"&&typeof G.text==="string")return{...G,type:"text",text:L0(G.text)};return{type:"text",text:String(G)}});if(Z[0]?.text===K0)return Z;return[J,...Z]}var x1={type:"ephemeral",ttl:"1h"},Rj=20;function Tj(j){if(f(j.cache_control))return j.cache_control;if(f(j.cacheControl))return j.cacheControl;return null}function h0(j,J){if(!f(j))return!1;return delete j.cacheControl,j.cache_control=J?{...x1}:{type:"ephemeral"},!0}function P1(j){if(!f(j))return;delete j.cache_control,delete j.cacheControl}function yj(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function N0(j,J){if(!f(j))return;let Z=Tj(j);if(Z?.type!=="ephemeral")return;if(J)Z.ttl="1h";else delete Z.ttl}function z1(j,J){if(Array.isArray(j.system))for(let Z of j.system)N0(Z,J);else N0(j.system,J);if(!Array.isArray(j.messages))return;for(let Z of j.messages)if(N0(Z,J),f(Z)&&Array.isArray(Z.content))for(let G of Z.content)N0(G,J)}function Aj(j,J){if(Array.isArray(j.system))for(let Z of j.system)J(Z);else J(j.system);if(!Array.isArray(j.messages))return;for(let Z of j.messages)if(J(Z),f(Z)&&Array.isArray(Z.content))for(let G of Z.content)J(G)}function S1(j){P1(j),Aj(j,P1)}function kj(j){S1(j),j.cache_control={...x1}}function w0(j){if(!f(j))return!1;let J=yj(j.content);if(!J?.length)return!1;let Z=[...J].reverse().find((G)=>f(G)&&G.type!=="thinking"&&G.type!=="redacted_thinking");if(!Z)return!1;return j.content=J,h0(Z,!0)}function fj(j){if(!f(j))return 0;let J=j.content;if(Array.isArray(J))return J.length;if(J==null)return 0;return 1}function mj(j){let J=[],Z=0;return j.forEach((G,V)=>{let Y=fj(G);if(f(G)&&G.role==="user"&&Y>0)J.push({index:V,blockPosition:Z+Y-1});Z+=Y}),J}function bj(j){let J=mj(j),Z=[...J].reverse().find((v)=>v.index>1);if(!Z)return{latest:void 0,bridge:void 0};let G=[...J].reverse().find((v)=>v.index<Z.index),V=G?Z.blockPosition-G.blockPosition+1:0,Y=G&&G.index>1&&V>Rj?G:void 0;return{latest:Z,bridge:Y}}function Q1(j){if(Array.isArray(j.system)){let J=j.system.findIndex((V)=>f(V)&&V.text===K0),Z=j.system.slice(J>=0?J+1:0).filter(f),G=Z[Z.length-1];h0(G,!0)}else h0(j.system,!0)}function hj(j){if(S1(j),!Array.isArray(j.messages)){Q1(j);return}let{latest:J,bridge:Z}=bj(j.messages);if(!Z)Q1(j);if(w0(j.messages[0]),w0(j.messages[1]),Z)w0(j.messages[Z.index]);if(J)w0(j.messages[J.index])}function gj(j,J){if(!J.enabled){z1(j,!1),delete j.cache_control,delete j.cacheControl;return}if(J.mode==="automatic"){kj(j);return}if(J.mode==="hybrid"){hj(j);return}z1(j,!0),delete j.cacheControl}function dj(j){if(!Array.isArray(j.messages))return;while(j.messages.length){let J=j.messages[j.messages.length-1];if(!f(J)||J.role!=="assistant")break;j.messages.pop()}}async function R1(j,J={}){try{let Z=JSON.parse(j);dj(Z);let G=Array.isArray(Z.messages)&&Z.messages.some((V)=>V.role==="user")?H1(Z.messages,void 0,N1):null;if(Z.system=Sj(Z.system),G&&Array.isArray(Z.system))Z.system.unshift({type:"text",text:G});if(gj(Z,{enabled:J.cache1hEnabled??!1,mode:J.cache1hMode??"explicit"}),J.fastModeEnabled&&B0(Z.model))Z.speed="fast";else if(Z.speed==="fast")delete Z.speed;if(J.identity)U1(Z,J.identity);return await B1(Cj(Z))}catch{return j}}function W0(j){if(!j.body)return j;let J=j.body.getReader(),Z=new TextDecoder,G=new TextEncoder,V="",Y=new ReadableStream({async pull(v){let{done:u,value:G0}=await J.read();if(u){let d=Y1(`${V}${Z.decode()}`,!0);if(d.ready)v.enqueue(G.encode(d.ready));v.close();return}let o=V+Z.decode(G0,{stream:!0}),e=Y1(o);if(V=e.pending,e.ready)v.enqueue(G.encode(e.ready))}});return new Response(Y,{status:j.status,statusText:j.statusText,headers:j.headers})}var lj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",uj=60000,ij=60000,cj=5000,T1=200,Ij=240,nj=Ij,oj=1,y1=!1;function m0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function q(){return performance.now()}function y(j){return Math.round(j*10)/10}function A1(j){return Math.floor(Math.random()*Math.max(0,j))}function sj(){if(y1||!1||!m0())return;y1=!0;let j=100,J=250,Z=q()+j;setInterval(()=>{let G=q(),V=G-Z;if(Z=G+j,V<J)return;F("[perf] opencode event_loop_lag",{lagMs:y(V),thresholdMs:J})},j).unref?.()}function rj(j){let J=q(),Z={requestId:String(oj++),start:J,last:J,mark(G,V){let Y=q();if(m0())F("[perf] opencode request stage",{requestId:Z.requestId,stage:G,deltaMs:y(Y-Z.last),totalMs:y(Y-Z.start),...V});Z.last=Y},done(G,V){let Y=q();if(m0())F("[perf] opencode request done",{requestId:Z.requestId,stage:G,deltaMs:y(Y-Z.last),totalMs:y(Y-Z.start),...V});Z.last=Y}};if(m0())F("[perf] opencode request start",{requestId:Z.requestId,...j});return Z}async function t(j,J,Z){let G=j.client.session,V=await K1(j.client,J),Y={path:{id:J},body:{noReply:!0,parts:[{type:"text",text:Z,ignored:!0}]}};if(V?.agent)Y.body.agent=V.agent;if(V?.model)Y.body.model=V.model;if(V?.variant)Y.body.variant=V.variant;if(typeof G?.promptAsync==="function"){await G.promptAsync(Y);return}if(typeof G?.prompt==="function"){await Promise.resolve(G.prompt(Y));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function a(){throw Error(lj)}function tj(j){if(j.sessionID==null)return!1;let J=j.model;return J?.providerID==="anthropic"||J?.api?.npm==="@ai-sdk/anthropic"||J?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function aj(j){if(j.some((J)=>J.includes("<use_parallel_tool_calls>")))return!1;return j.push(k1),!0}var XJ=async(j)=>{sj();let{client:J}=j,Z=m1(),G=await R(Z),V=new Kj({storage:G,onMainQuotaFetched:async($,D,X)=>{try{let W=await R(Z)??{version:1,accounts:[]};W.quota=W.quota??{},W.quota.mainQuota=$,W.quota.mainQuotaCheckedAt=D,W.quota.mainQuotaToken=X,W.quota.mainLastQuotaApiError=void 0,await Y0(W,Z)}catch(W){F("[quota] failed to persist main quota",{error:W instanceof Error?W.message:String(W)})}},onApiError:async($)=>{try{let D=await R(Z)??{version:1,accounts:[]};D.quota=D.quota??{},D.quota.mainLastQuotaApiError=$,await Y0(D,Z)}catch(D){F("[quota] failed to persist backoff state",{error:D instanceof Error?D.message:String(D)})}}}),Y=new r1({quotaManager:V,onFallbackStorageChanged:()=>{e()}});Y.startBackgroundRefresh();let v=null,u=new $j({loadStorage:()=>R(Z),prepareHeaders:async($,D)=>{if(!d)return $;let X=await d();if(X.type!=="oauth")return $;if(!X.access||X.expires&&X.expires<Date.now()){if(!v)return $;X.access=await v()}if(!X.access)return $;try{let W=JSON.parse(D.bodyText),P=await o0(X.access,typeof W.model==="string"?W.model:void 0);if($.delete("anthropic-beta"),X0($,X.access,{body:W,identity:P}),$.set("anthropic-beta",_0($.get("anthropic-beta"),[a1])),W.speed==="fast")g0($)}catch{X0($,X.access)}return $},log:F});Q0({enabled:H0(G),mode:U0(G)}),R0(u0(G)),y0(i0(G));let G0={activeId:"main",route:"main"};function o($,D){G0={activeId:D.activeId,route:D.route};let X=V.getMain(D.mainAccessToken),W=V.getLastApiError(),P=$?.refresh?.mainLastRefreshError,x={main:{quota:X?.quota??null,quotaBackedOff:V.isBackedOff(),quotaBackoffUntil:W?.nextRetryAt,refreshBackedOff:P?$0(P,D.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:P?.nextRetryAt},fallbacks:($?.accounts??[]).filter((E)=>E.enabled!==!1).map((E)=>({id:E.id,label:E.label,quota:E.access?V.getFallback(E.id,E.access)?.quota??null:null,enabled:E.enabled!==!1})),activeId:D.activeId,route:D.route,relay:(()=>{let E=e0($);return E?{enabled:!0,transport:E.transport??"http"}:null})(),fastMode:t0(),cacheKeep:{enabled:s0($),window:$?.cacheKeep?.startHour!=null&&$?.cacheKeep?.endHour!=null?`${$.cacheKeep.startHour}-${$.cacheKeep.endHour}`:void 0,trackedSessions:u.trackedCount()},lastUpdated:Date.now()};Qj(x).catch((E)=>F("[sidebar] state write failed",{error:E instanceof Error?E.message:String(E)}))}async function e(){let $=await R(Z),D,X;if(d)try{let W=await d();D=W.access,X=W.refresh}catch{}o($,{activeId:G0.activeId,route:G0.route,mainAccessToken:D,mainRefreshToken:X})}let d=null,j0=null,I0=0;function Oj($){let D=$?.refresh?.refreshBeforeExpiryMinutes??nj;return Math.max(Ij,D)*60000}function Lj($){return $?.refresh?.enabled!==!1}async function Z1($){if(!$)return;let D=await R(Z),X=D?.refresh?.mainLastRefreshError;if(!D?.refresh||!X?.tokenHash)return;let W=M0($);if(X.tokenHash===W)return;if(X.nextRetryAt&&X.nextRetryAt>Date.now()){F("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:X.nextRetryAt,retryCount:X.retryCount,remainingMs:X.nextRetryAt-Date.now()});return}D.refresh.mainLastRefreshError=void 0,await Y0(D,Z),F("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:X.checkedAt,previousNextRetryAt:X.nextRetryAt,previousRetryCount:X.retryCount})}async function Nj(){let $=[];if(d)try{let P=await d();if(P.type==="oauth"&&P.access){let x=await V.refreshMain(P.access);$.push({name:"OpenCode anthropic",role:"main",quota:x})}else if(P.type==="oauth")$.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(P){let x=P instanceof Error?P.message:String(P);$.push({name:"OpenCode anthropic",role:"main",error:x.includes("429")?"Usage API rate limited — try again in a moment":x})}let{storage:D,errors:X}=await Y.refreshQuotaForAllAccounts({force:!0}),W=new Map(X.map((P)=>[P.accountId,P.message]));if($.push(...Xj(D,W)),!d)$.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return Wj({accounts:$,refreshedAt:Date.now()})}async function wj($){let D=t1($);if(D.type==="enable"||D.type==="disable"){let x=D.type==="enable",E=await h1(x),h=U0(E);return Q0({enabled:x,mode:h}),C0({argumentsText:$,enabled:x,mode:h})}if(D.type==="mode"){let x=await g1(D.mode),E=H0(x);return Q0({enabled:E,mode:D.mode}),C0({argumentsText:$,enabled:E,mode:D.mode})}let X=await R(Z),W=H0(X),P=U0(X);return Q0({enabled:W,mode:P}),C0({argumentsText:$,enabled:W,mode:P})}async function _j($){let D=e1($),X=await R(Z);if(D.type==="window")X=await l1(D.startHour,D.endHour);else if(D.type==="disable")X=await u1(!1);let W=jj(X),P=u.stats(W);return Zj({argumentsText:$,enabled:Jj(X),window:W,hybridActive:s0(X),trackedSessions:P.trackedSessions,nextPrewarmAt:P.nextPrewarmAt})}async function Bj($){let D=Gj($);if(D.type==="enable"||D.type==="disable"){let P=D.type==="enable";return await d1(P),R0(P),r0({argumentsText:$,enabled:P})}let X=await R(Z),W=u0(X);return R0(W),r0({argumentsText:$,enabled:W})}async function Hj($){let D=Vj($);if(D.type==="enable"||D.type==="disable"){let P=D.type==="enable";return await p1(P),y0(P),a0({argumentsText:$,enabled:P})}let X=await R(Z),W=i0(X);return y0(W),a0({argumentsText:$,enabled:W})}async function Uj($){let D=zj($);if(D.type==="mode")return await Pj(D.mode),J1({argumentsText:$,mode:D.mode});let X=await R();return J1({argumentsText:$,mode:j1(X)})}function Mj($,D=10){let X=Math.max(0,Math.min(Math.round($/100*D),D));return"█".repeat(X)+"░".repeat(D-X)}function O0($,D){return`${$} ${Mj(D)} ${String(Math.round(D)).padStart(3)}%`}function $1($){if(!$)return"";let D=new Date($).getTime();if(Number.isNaN(D))return"";let X=D-Date.now();if(X<=0)return"resets now";let W=Math.floor(X/60000);if(W<1)return"resets <1m";if(W<60)return`resets ${W}m`;let P=Math.floor(W/60),x=W%60;return x>0?`resets ${P}h${x}m`:`resets ${P}h`}function vj($,D,X){let W=[],P=0;if($){let{five_hour:h,seven_day:p}=$;if(h||p){let i=X==="main"?"active":"idle",s=$1(h?.resetsAt),n=[`main · ${i}${s?` (${s})`:""}`];if(h)n.push(O0("5h",h.usedPercent)),P=Math.max(P,h.usedPercent);if(p)n.push(O0("7d",p.usedPercent)),P=Math.max(P,p.usedPercent);W.push(n.join(`
4
- `))}}if(D?.length)for(let h of D){let p=h.quota;if(!p)continue;let{five_hour:c,seven_day:i}=p;if(!c&&!i)continue;let s=h.label||"alt",V0=X===h.id?"active":"idle",r=$1(c?.resetsAt),D0=[`${s} · ${V0}${r?` (${r})`:""}`];if(c)D0.push(O0("5h",c.usedPercent)),P=Math.max(P,c.usedPercent);if(i)D0.push(O0("7d",i.usedPercent)),P=Math.max(P,i.usedPercent);W.push(D0.join(`
5
- `))}if(!W.length)return;let x=W.join(`
3
+ `);for(let $ of M1)D=D.replace($.match,$.replacement);return D.trim()}function y(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function yj(j){let G={type:"text",text:X0};if(j==null)return[G];if(typeof j==="string"){let D=_0(j);if(D===X0)return[G];return[G,{type:"text",text:D}]}if(y(j)){let D=typeof j.type==="string"?j.type:"text",$=typeof j.text==="string"?j.text:"";return[G,{...j,type:D,text:_0($)}]}if(!Array.isArray(j))return[G];let J=j.map((D)=>{if(typeof D==="string")return{type:"text",text:_0(D)};if(y(D)&&D.type==="text"&&typeof D.text==="string")return{...D,type:"text",text:_0(D.text)};return{type:"text",text:String(D)}});if(J[0]?.text===X0)return J;return[G,...J]}var T1={type:"ephemeral",ttl:"1h"},Aj=20;function fj(j){if(y(j.cache_control))return j.cache_control;if(y(j.cacheControl))return j.cacheControl;return null}function H0(j,G){if(!y(j))return!1;return delete j.cacheControl,j.cache_control=G?{...T1}:{type:"ephemeral"},!0}function z1(j){if(!y(j))return;delete j.cache_control,delete j.cacheControl}function kj(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function L0(j,G){if(!y(j))return;let J=fj(j);if(J?.type!=="ephemeral")return;if(G)J.ttl="1h";else delete J.ttl}function Q1(j,G){if(Array.isArray(j.system))for(let J of j.system)L0(J,G);else L0(j.system,G);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(L0(J,G),y(J)&&Array.isArray(J.content))for(let D of J.content)L0(D,G)}function mj(j,G){if(Array.isArray(j.system))for(let J of j.system)G(J);else G(j.system);if(!Array.isArray(j.messages))return;for(let J of j.messages)if(G(J),y(J)&&Array.isArray(J.content))for(let D of J.content)G(D)}function y1(j){z1(j),mj(j,z1)}function bj(j){y1(j),j.cache_control={...T1}}function hj(j){return y(j)&&j.type!=="thinking"&&j.type!=="redacted_thinking"}function l0(j){let G=kj(j.content);if(!G?.length)return;let J=G.filter(hj);if(!J.length)return;return{content:G,cacheableBlocks:J}}function gj(j){if(!y(j))return!1;let G=l0(j);if(!G)return!1;return j.content=G.content,H0(G.cacheableBlocks[0],!0)}function w0(j){if(!y(j))return!1;let G=l0(j);if(!G)return!1;let J=G.cacheableBlocks[G.cacheableBlocks.length-1];return j.content=G.content,H0(J,!0)}function pj(j){if(!y(j))return!1;return(l0(j)?.cacheableBlocks.length??0)>1}function dj(j){if(!y(j))return 0;let G=j.content;if(Array.isArray(G))return G.length;if(G==null)return 0;return 1}function lj(j){let G=[],J=0;return j.forEach((D,$)=>{let P=dj(D);if(y(D)&&D.role==="user"&&P>0)G.push({index:$,blockPosition:J+P-1});J+=P}),G}function uj(j){let G=lj(j),J=[...G].reverse().find((F)=>F.index>1);if(!J)return{latest:void 0,bridge:void 0};let D=[...G].reverse().find((F)=>F.index<J.index),$=D?J.blockPosition-D.blockPosition+1:0,P=D&&D.index>1&&$>Aj?D:void 0;return{latest:J,bridge:P}}function N1(j){if(Array.isArray(j.system)){let G=j.system.findIndex(($)=>y($)&&$.text===X0),J=j.system.slice(G>=0?G+1:0).filter(y),D=J[J.length-1];H0(D,!0)}else H0(j.system,!0)}function ij(j){if(y1(j),!Array.isArray(j.messages)){N1(j);return}let{latest:G,bridge:J}=uj(j.messages);if(!J)N1(j);let D=pj(j.messages[0]);if(D)gj(j.messages[0]);if(w0(j.messages[0]),!D)w0(j.messages[1]);if(J)w0(j.messages[J.index]);if(G)w0(j.messages[G.index])}function cj(j,G){if(!G.enabled){Q1(j,!1),delete j.cache_control,delete j.cacheControl;return}if(G.mode==="automatic"){bj(j);return}if(G.mode==="hybrid"){ij(j);return}Q1(j,!0),delete j.cacheControl}function nj(j){if(!Array.isArray(j.messages))return;while(j.messages.length){let G=j.messages[j.messages.length-1];if(!y(G)||G.role!=="assistant")break;j.messages.pop()}}async function A1(j,G={}){try{let J=JSON.parse(j);nj(J);let D=Array.isArray(J.messages)&&J.messages.some(($)=>$.role==="user")?F1(J.messages,void 0,H1):null;if(J.system=yj(J.system),D&&Array.isArray(J.system))J.system.unshift({type:"text",text:D});if(cj(J,{enabled:G.cache1hEnabled??!1,mode:G.cache1hMode??"explicit"}),G.fastModeEnabled&&M0(J.model))J.speed="fast";else if(J.speed==="fast")delete J.speed;if(G.identity)v1(J,G.identity);return await U1(Rj(J))}catch{return j}}function Y0(j){if(!j.body)return j;let G=j.body.getReader(),J=new TextDecoder,D=new TextEncoder,$="",P=new ReadableStream({async pull(F){let{done:l,value:$0}=await G.read();if(l){let z0=I1(`${$}${J.decode()}`,!0);if(z0.ready)F.enqueue(D.encode(z0.ready));F.close();return}let o=$+J.decode($0,{stream:!0}),r=I1(o);if($=r.pending,r.ready)F.enqueue(D.encode(r.ready))}});return new Response(P,{status:j.status,statusText:j.statusText,headers:j.headers})}var rj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",sj=60000,tj=60000,aj=5000,f1=200,_j=240,ej=_j,jG=1,k1=!1;function h0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function q(){return performance.now()}function A(j){return Math.round(j*10)/10}function m1(j){return Math.floor(Math.random()*Math.max(0,j))}function GG(){if(k1||!1||!h0())return;k1=!0;let j=100,G=250,J=q()+j;setInterval(()=>{let D=q(),$=D-J;if(J=D+j,$<G)return;v("[perf] opencode event_loop_lag",{lagMs:A($),thresholdMs:G})},j).unref?.()}function JG(j){let G=q(),J={requestId:String(jG++),start:G,last:G,mark(D,$){let P=q();if(h0())v("[perf] opencode request stage",{requestId:J.requestId,stage:D,deltaMs:A(P-J.last),totalMs:A(P-J.start),...$});J.last=P},done(D,$){let P=q();if(h0())v("[perf] opencode request done",{requestId:J.requestId,stage:D,deltaMs:A(P-J.last),totalMs:A(P-J.start),...$});J.last=P}};if(h0())v("[perf] opencode request start",{requestId:J.requestId,...j});return J}async function a(j,G,J){let D=j.client.session,$=await W1(j.client,G),P={path:{id:G},body:{noReply:!0,parts:[{type:"text",text:J,ignored:!0}]}};if($?.agent)P.body.agent=$.agent;if($?.model)P.body.model=$.model;if($?.variant)P.body.variant=$.variant;if(typeof D?.promptAsync==="function"){await D.promptAsync(P);return}if(typeof D?.prompt==="function"){await Promise.resolve(D.prompt(P));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function e(){throw Error(rj)}function ZG(j){if(j.sessionID==null)return!1;let G=j.model;return G?.providerID==="anthropic"||G?.api?.npm==="@ai-sdk/anthropic"||G?.api?.npm==="@ai-sdk/google-vertex/anthropic"}function $G(j){if(j.some((G)=>G.includes("<use_parallel_tool_calls>")))return!1;return j.push(b1),!0}var zG=async(j)=>{GG();let{client:G}=j,J=g1(),D=await R(J),$=new Wj({storage:D,onMainQuotaFetched:async(Z,V,K)=>{try{let Y=await R(J)??{version:1,accounts:[]};Y.quota=Y.quota??{},Y.quota.mainQuota=Z,Y.quota.mainQuotaCheckedAt=V,Y.quota.mainQuotaToken=K,Y.quota.mainLastQuotaApiError=void 0,await W0(Y,J)}catch(Y){v("[quota] failed to persist main quota",{error:Y instanceof Error?Y.message:String(Y)})}},onApiError:async(Z)=>{try{let V=await R(J)??{version:1,accounts:[]};V.quota=V.quota??{},V.quota.mainLastQuotaApiError=Z,await W0(V,J)}catch(V){v("[quota] failed to persist backoff state",{error:V instanceof Error?V.message:String(V)})}}}),P=new e1({quotaManager:$,onFallbackStorageChanged:()=>{r()}});P.startBackgroundRefresh();let F=null,l=new Vj({loadStorage:()=>R(J),prepareHeaders:async(Z,V)=>{if(!u)return Z;let K=await u();if(K.type!=="oauth")return Z;if(!K.access||K.expires&&K.expires<Date.now()){if(!F)return Z;K.access=await F()}if(!K.access)return Z;try{let Y=JSON.parse(V.bodyText),O=await t0(K.access,typeof Y.model==="string"?Y.model:void 0);if(Z.delete("anthropic-beta"),K0(Z,K.access,{body:Y,identity:O}),Z.set("anthropic-beta",B0(Z.get("anthropic-beta"),[Gj])),Y.speed==="fast")d0(Z)}catch{K0(Z,K.access)}return Z},log:v});I0({enabled:U0(D),mode:F0(D)}),y0(n0(D)),f0(o0(D));let $0={activeId:"main",route:"main"};function o(Z,V){$0={activeId:V.activeId,route:V.route};let K=$.getMain(V.mainAccessToken),Y=$.getLastApiError(),O=Z?.refresh?.mainLastRefreshError,x={main:{quota:K?.quota??null,quotaBackedOff:$.isBackedOff(),quotaBackoffUntil:Y?.nextRetryAt,refreshBackedOff:O?Z0(O,V.mainRefreshToken,Date.now()):!1,refreshBackoffUntil:O?.nextRetryAt},fallbacks:(Z?.accounts??[]).filter((C)=>C.enabled!==!1).map((C)=>({id:C.id,label:C.label,quota:C.access?$.getFallback(C.id,C.access)?.quota??null:null,enabled:C.enabled!==!1})),activeId:V.activeId,route:V.route,relay:(()=>{let C=J1(Z);return C?{enabled:!0,transport:C.transport??"http"}:null})(),fastMode:j1(),cacheKeep:{enabled:a0(Z),window:Z?.cacheKeep?.startHour!=null&&Z?.cacheKeep?.endHour!=null?`${Z.cacheKeep.startHour}-${Z.cacheKeep.endHour}`:void 0,trackedSessions:l.trackedCount()},lastUpdated:Date.now()};Nj(x).catch((C)=>v("[sidebar] state write failed",{error:C instanceof Error?C.message:String(C)}))}async function r(){let Z=await R(J),V,K;if(u)try{let Y=await u();V=Y.access,K=Y.refresh}catch{}o(Z,{activeId:$0.activeId,route:$0.route,mainAccessToken:V,mainRefreshToken:K})}function z0(Z,V){if(!V)return;if(Z?.quota?.enabled!==!0)return;if($.getMain(V))return;if(g0)return;g0=!0,$.refreshMain(V).then(()=>r()).catch(()=>{}).finally(()=>{g0=!1})}let u=null,g0=!1,j0=null,Q0=0;function Lj(Z){let V=Z?.refresh?.refreshBeforeExpiryMinutes??ej;return Math.max(_j,V)*60000}function wj(Z){return Z?.refresh?.enabled!==!1}async function D1(Z){if(!Z)return;let V=await R(J),K=V?.refresh?.mainLastRefreshError;if(!V?.refresh||!K?.tokenHash)return;let Y=v0(Z);if(K.tokenHash===Y)return;if(K.nextRetryAt&&K.nextRetryAt>Date.now()){v("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:K.nextRetryAt,retryCount:K.retryCount,remainingMs:K.nextRetryAt-Date.now()});return}V.refresh.mainLastRefreshError=void 0,await W0(V,J),v("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:K.checkedAt,previousNextRetryAt:K.nextRetryAt,previousRetryCount:K.retryCount})}async function Hj(){let Z=[];if(u)try{let O=await u();if(O.type==="oauth"&&O.access){let x=await $.refreshMain(O.access);Z.push({name:"OpenCode anthropic",role:"main",quota:x})}else if(O.type==="oauth")Z.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(O){let x=O instanceof Error?O.message:String(O);Z.push({name:"OpenCode anthropic",role:"main",error:x.includes("429")?"Usage API rate limited — try again in a moment":x})}let{storage:V,errors:K}=await P.refreshQuotaForAllAccounts({force:!0}),Y=new Map(K.map((O)=>[O.accountId,O.message]));if(Z.push(...Pj(V,Y)),!u)Z.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return Oj({accounts:Z,refreshedAt:Date.now()})}async function Bj(Z){let V=jj(Z);if(V.type==="enable"||V.type==="disable"){let x=V.type==="enable",C=await d1(x),h=F0(C);return I0({enabled:x,mode:h}),S0({argumentsText:Z,enabled:x,mode:h})}if(V.type==="mode"){let x=await l1(V.mode),C=U0(x);return I0({enabled:C,mode:V.mode}),S0({argumentsText:Z,enabled:C,mode:V.mode})}let K=await R(J),Y=U0(K),O=F0(K);return I0({enabled:Y,mode:O}),S0({argumentsText:Z,enabled:Y,mode:O})}async function Mj(Z){let V=Jj(Z),K=await R(J);if(V.type==="window")K=await c1(V.startHour,V.endHour);else if(V.type==="disable")K=await n1(!1);let Y=Zj(K),O=l.stats(Y);return Dj({argumentsText:Z,enabled:$j(K),window:Y,hybridActive:a0(K),trackedSessions:O.trackedSessions,nextPrewarmAt:O.nextPrewarmAt})}async function Uj(Z){let V=Xj(Z);if(V.type==="enable"||V.type==="disable"){let O=V.type==="enable";return await u1(O),y0(O),e0({argumentsText:Z,enabled:O})}let K=await R(J),Y=n0(K);return y0(Y),e0({argumentsText:Z,enabled:Y})}async function Fj(Z){let V=Kj(Z);if(V.type==="enable"||V.type==="disable"){let O=V.type==="enable";return await i1(O),f0(O),G1({argumentsText:Z,enabled:O})}let K=await R(J),Y=o0(K);return f0(Y),G1({argumentsText:Z,enabled:Y})}async function vj(Z){let V=Qj(Z);if(V.type==="mode")return await zj(V.mode),$1({argumentsText:Z,mode:V.mode});let K=await R();return $1({argumentsText:Z,mode:Z1(K)})}function qj(Z,V=10){let K=Math.max(0,Math.min(Math.round(Z/100*V),V));return"█".repeat(K)+"░".repeat(V-K)}function N0(Z,V){return`${Z} ${qj(V)} ${String(Math.round(V)).padStart(3)}%`}function V1(Z){if(!Z)return"";let V=new Date(Z).getTime();if(Number.isNaN(V))return"";let K=V-Date.now();if(K<=0)return"resets now";let Y=Math.floor(K/60000);if(Y<1)return"resets <1m";if(Y<60)return`resets ${Y}m`;let O=Math.floor(Y/60),x=Y%60;return x>0?`resets ${O}h${x}m`:`resets ${O}h`}function Cj(Z,V,K){let Y=[],O=0;if(Z){let{five_hour:h,seven_day:p}=Z;if(h||p){let i=K==="main"?"active":"idle",s=V1(h?.resetsAt),n=[`main · ${i}${s?` (${s})`:""}`];if(h)n.push(N0("5h",h.usedPercent)),O=Math.max(O,h.usedPercent);if(p)n.push(N0("7d",p.usedPercent)),O=Math.max(O,p.usedPercent);Y.push(n.join(`
4
+ `))}}if(V?.length)for(let h of V){let p=h.quota;if(!p)continue;let{five_hour:c,seven_day:i}=p;if(!c&&!i)continue;let s=h.label||"alt",D0=K===h.id?"active":"idle",t=V1(c?.resetsAt),V0=[`${s} · ${D0}${t?` (${t})`:""}`];if(c)V0.push(N0("5h",c.usedPercent)),O=Math.max(O,c.usedPercent);if(i)V0.push(N0("7d",i.usedPercent)),O=Math.max(O,i.usedPercent);Y.push(V0.join(`
5
+ `))}if(!Y.length)return;let x=Y.join(`
6
6
 
7
- `),E=P>=90?"error":P>=70?"warning":"info";J.tui?.showToast?.({body:{title:"Claude Quota",message:x,variant:E,duration:E==="error"?8000:5000}})?.catch?.(()=>{})}return{config:async($)=>{$.command={...$.command??{},[F0]:{template:F0,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[x0]:{template:x0,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[k0]:{template:k0,description:"Show current Claude OAuth quota usage for all accounts."},[S0]:{template:S0,description:"Show or toggle Anthropic request dump capture for debugging."},[T0]:{template:T0,description:"Show or toggle Anthropic fast mode for supported Opus models."},[f0]:{template:f0,description:"Show or change Claude account routing between main-first and fallback-first."},[A0]:{template:A0,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async($,D)=>{if(!tj($))return;aj(D.system)},"command.execute.before":async($)=>{if($.command===F0)await t(j,$.sessionID,await wj($.arguments)),a();if($.command===x0)await t(j,$.sessionID,await _j($.arguments)),a();if($.command===k0){await t(j,$.sessionID,await Nj());let D=await R(),X=d?await d().catch(()=>{return}):void 0;o(D,{activeId:"main",route:"main",mainAccessToken:X?.access,mainRefreshToken:X?.refresh}),a()}if($.command===S0)await t(j,$.sessionID,await Bj($.arguments)),a();if($.command===T0)await t(j,$.sessionID,await Hj($.arguments)),a();if($.command===f0)await t(j,$.sessionID,await Uj($.arguments)),a();if($.command===A0){let D=await R(),X=o1(D),W=(D?.accounts??[]).filter((x)=>x.enabled!==!1).map((x)=>x.id),P=Dj({argumentsText:$.arguments,config:X,accountIds:W});if(P.updatedConfig)await s1(P.updatedConfig);await t(j,$.sessionID,P.text),a()}},auth:{provider:"anthropic",async loader($,D){d=$;let X=await $();if(X.type==="oauth"){let x=function(){if(j0)clearInterval(j0),j0=null;let Q=async()=>{try{let L=await R(Z);if(!Lj(L))return;let U=await $();if(U.type!=="oauth")return;if(await Z1(U.refresh),!U.expires)return;let N=U.expires-Date.now(),S=Oj(L);if(N>S)return;if(F("[refresh] opencode main oauth background due",{expiresInMs:N,refreshBeforeMs:S}),U.refresh&&$0(L?.refresh?.mainLastRefreshError,U.refresh,Date.now())){F("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:L?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:L?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:N});return}if(U.refresh&&L?.refresh?.mainRefreshLeaseUntil&&L.refresh.mainRefreshLeaseUntil>Date.now()&&L.refresh.mainRefreshLeaseTokenHash===M0(U.refresh))return;await P();let I=await $();F("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:I.expires?I.expires-Date.now():void 0})}catch(L){F("[refresh] opencode main oauth refresh failed",{message:L instanceof Error?L.message:String(L)})}};if(j0=setInterval(()=>{Q()},uj+A1(ij)),"unref"in j0)j0.unref()},E=function(Q,L){if(Q instanceof Request&&Q.body)return!1;return L==null||typeof L==="string"},h=function(Q){return Q.has("x-parent-session-id")},p=function(Q){return Q.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(Q)},c=function(Q){return Q?.quota?.enabled===!0},n=function(Q){return V.getFallback(Q.id,Q.access)?.quota??Q.quota};for(let Q of Object.values(D.models))Q.cost={input:0,output:0,cache:{read:0,write:0}};let W=null;async function P(){if(!W)W=(async()=>{let U=null,N=null,S=null;async function I(z){let H=await R(Z)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};H.refresh=H.refresh??{},z(H),await Y0(H,Z)}async function T(z){let H=Date.now()+cj;while(Date.now()<H){await new Promise((w)=>setTimeout(w,T1+A1(T1)));let K=await $();if(K.type!=="oauth"||!K.access)continue;if((K.access!==z.access||K.refresh!==z.refresh||(K.expires??0)>(z.expires??0)+60000)&&(!K.expires||K.expires>Date.now()))return F("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:K.expires?K.expires-Date.now():void 0}),K.access}return null}for(let z=0;z<=2;z++){let H=null;try{if(z>0){let C=500*2**(z-1);await new Promise((B)=>setTimeout(B,C))}if(H=await $(),!H.refresh)throw Error("Token refresh failed: missing refresh token");let K=await R(Z),_=M0(H.refresh),w=K?.refresh?.mainLastRefreshError;if(F("[refresh] opencode main oauth refresh check",{attempt:z,expiresInMs:H.expires?H.expires-Date.now():void 0,hasBackoff:Boolean(w),backoffActive:w?$0(w,H.refresh,Date.now()):!1,retryCount:w?.retryCount,nextRetryAt:w?.nextRetryAt}),w&&$0(w,H.refresh,Date.now()))throw F("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:w.nextRetryAt,retryCount:w.retryCount}),Error(n0(w,Date.now()));if(K?.refresh?.mainRefreshLeaseUntil&&K.refresh.mainRefreshLeaseUntil>Date.now()&&K.refresh.mainRefreshLeaseTokenHash===_){F("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:K.refresh.mainRefreshLeaseUntil});let C=await T(H);if(C)return C;throw Error("Claude OAuth refresh is already in progress")}let O=await b1({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!O){F("[refresh] opencode main oauth refresh skipped file lock");let C=await T(H);if(C)return C;throw Error("Claude OAuth refresh is already in progress")}S=O.release,U=pj(),N=_,await I((C)=>{C.refresh=C.refresh??{},C.refresh.mainRefreshLeaseId=U??void 0,C.refresh.mainRefreshLeaseUntil=Date.now()+120000,C.refresh.mainRefreshLeaseTokenHash=_});let g=await R(Z);if(F("[refresh] opencode main oauth refresh lease acquired",{attempt:z,leaseUntil:Date.now()+120000}),g?.refresh?.mainRefreshLeaseId!==U||g.refresh.mainRefreshLeaseTokenHash!==_)throw Error("Claude OAuth refresh is already in progress");F("[refresh] opencode main oauth refresh request start",{attempt:z});let m=await f1({refreshToken:H.refresh,maxRetries:0});return await J.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:m.refresh,access:m.access,expires:m.expires}}),await I((C)=>{if(!C?.refresh)return;if(C.refresh.mainLastRefreshError=void 0,C.refresh.mainRefreshLeaseId===U)C.refresh.mainRefreshLeaseId=void 0,C.refresh.mainRefreshLeaseUntil=void 0,C.refresh.mainRefreshLeaseTokenHash=void 0}),F("[refresh] opencode main oauth refresh succeeded",{attempt:z,expiresInMs:m.expires-Date.now()}),m.access}catch(K){let _=K instanceof Error&&(K.message.includes("fetch failed")||("code"in K)&&(K.code==="ECONNRESET"||K.code==="ECONNREFUSED"||K.code==="ETIMEDOUT"||K.code==="UND_ERR_CONNECT_TIMEOUT"));if(z<2&&(_||K instanceof d0&&K.status>=500))continue;F("[refresh] opencode main oauth refresh attempt failed",{attempt:z,error:K instanceof Error?K.message:String(K),transient:_});let w=H?.refresh;if(w&&K instanceof d0)await I((O)=>{O.refresh=O.refresh??{},O.refresh.mainLastRefreshError=i1({error:K,now:Date.now(),refreshToken:w,previous:O.refresh.mainLastRefreshError})});throw K}finally{if(U)await I((K)=>{if(!K?.refresh)return;if(K.refresh.mainRefreshLeaseId===U&&K.refresh.mainRefreshLeaseTokenHash===N)K.refresh.mainRefreshLeaseId=void 0,K.refresh.mainRefreshLeaseUntil=void 0,K.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await S?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{W=null});return W}v=P,x(),V.seedFallbacksFromAccounts(G?.accounts??[]),o(G,{activeId:"main",route:"main",mainAccessToken:X.access,mainRefreshToken:X.refresh});async function i(Q,L){if(!Q.body||Q.status!==200)return L?.mark("inspect_stream_skip",{status:Q.status}),{response:Q,rateLimited:!1};if(Q.headers.get("x-cortexkit-relay-optimistic")==="true")return L?.mark("inspect_stream_skip",{status:Q.status,reason:"optimistic_relay"}),{response:Q,rateLimited:!1};let U=q(),N=Q.body.getReader(),S=[],I=new TextDecoder,T="",z=0;while(!T.includes(`
7
+ `),C=O>=90?"error":O>=70?"warning":"info";G.tui?.showToast?.({body:{title:"Claude Quota",message:x,variant:C,duration:C==="error"?8000:5000}})?.catch?.(()=>{})}return{config:async(Z)=>{Z.command={...Z.command??{},[C0]:{template:C0,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[R0]:{template:R0,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[m0]:{template:m0,description:"Show current Claude OAuth quota usage for all accounts."},[T0]:{template:T0,description:"Show or toggle Anthropic request dump capture for debugging."},[A0]:{template:A0,description:"Show or toggle Anthropic fast mode for supported Opus models."},[b0]:{template:b0,description:"Show or change Claude account routing between main-first and fallback-first."},[k0]:{template:k0,description:"Manage killswitch — hard-block requests when quota drops below per-account thresholds."}}},"experimental.chat.system.transform":async(Z,V)=>{if(!ZG(Z))return;$G(V.system)},"command.execute.before":async(Z)=>{if(Z.command===C0)await a(j,Z.sessionID,await Bj(Z.arguments)),e();if(Z.command===R0)await a(j,Z.sessionID,await Mj(Z.arguments)),e();if(Z.command===m0){await a(j,Z.sessionID,await Hj());let V=await R(),K=u?await u().catch(()=>{return}):void 0;o(V,{activeId:"main",route:"main",mainAccessToken:K?.access,mainRefreshToken:K?.refresh}),e()}if(Z.command===T0)await a(j,Z.sessionID,await Uj(Z.arguments)),e();if(Z.command===A0)await a(j,Z.sessionID,await Fj(Z.arguments)),e();if(Z.command===b0)await a(j,Z.sessionID,await vj(Z.arguments)),e();if(Z.command===k0){let V=await R(),K=t1(V),Y=(V?.accounts??[]).filter((x)=>x.enabled!==!1).map((x)=>x.id),O=Yj({argumentsText:Z.arguments,config:K,accountIds:Y});if(O.updatedConfig)await a1(O.updatedConfig);await a(j,Z.sessionID,O.text),e()}},auth:{provider:"anthropic",async loader(Z,V){u=Z;let K=await Z();if(K.type==="oauth"){let x=function(){if(j0)clearInterval(j0),j0=null;let I=async()=>{try{let N=await R(J);if(!wj(N))return;let M=await Z();if(M.type!=="oauth")return;if(await D1(M.refresh),!M.expires)return;let _=M.expires-Date.now(),S=Lj(N);if(_>S)return;if(v("[refresh] opencode main oauth background due",{expiresInMs:_,refreshBeforeMs:S}),M.refresh&&Z0(N?.refresh?.mainLastRefreshError,M.refresh,Date.now())){v("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:N?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:N?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:_});return}if(M.refresh&&N?.refresh?.mainRefreshLeaseUntil&&N.refresh.mainRefreshLeaseUntil>Date.now()&&N.refresh.mainRefreshLeaseTokenHash===v0(M.refresh))return;await O();let z=await Z();v("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:z.expires?z.expires-Date.now():void 0})}catch(N){v("[refresh] opencode main oauth refresh failed",{message:N instanceof Error?N.message:String(N)})}};if(j0=setInterval(()=>{I()},sj+m1(tj)),"unref"in j0)j0.unref()},C=function(I,N){if(I instanceof Request&&I.body)return!1;return N==null||typeof N==="string"},h=function(I){return I.has("x-parent-session-id")},p=function(I){return I.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(I)},c=function(I){return I?.quota?.enabled===!0},n=function(I){return $.getFallback(I.id,I.access)?.quota??I.quota};for(let I of Object.values(V.models))I.cost={input:0,output:0,cache:{read:0,write:0}};let Y=null;async function O(){if(!Y)Y=(async()=>{let M=null,_=null,S=null;async function z(W){let B=await R(J)??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};B.refresh=B.refresh??{},W(B),await W0(B,J)}async function T(W){let B=Date.now()+aj;while(Date.now()<B){await new Promise((L)=>setTimeout(L,f1+m1(f1)));let X=await Z();if(X.type!=="oauth"||!X.access)continue;if((X.access!==W.access||X.refresh!==W.refresh||(X.expires??0)>(W.expires??0)+60000)&&(!X.expires||X.expires>Date.now()))return v("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:X.expires?X.expires-Date.now():void 0}),X.access}return null}for(let W=0;W<=2;W++){let B=null;try{if(W>0){let E=500*2**(W-1);await new Promise((H)=>setTimeout(H,E))}if(B=await Z(),!B.refresh)throw Error("Token refresh failed: missing refresh token");let X=await R(J),w=v0(B.refresh),L=X?.refresh?.mainLastRefreshError;if(v("[refresh] opencode main oauth refresh check",{attempt:W,expiresInMs:B.expires?B.expires-Date.now():void 0,hasBackoff:Boolean(L),backoffActive:L?Z0(L,B.refresh,Date.now()):!1,retryCount:L?.retryCount,nextRetryAt:L?.nextRetryAt}),L&&Z0(L,B.refresh,Date.now()))throw v("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:L.nextRetryAt,retryCount:L.retryCount}),Error(s0(L,Date.now()));if(X?.refresh?.mainRefreshLeaseUntil&&X.refresh.mainRefreshLeaseUntil>Date.now()&&X.refresh.mainRefreshLeaseTokenHash===w){v("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:X.refresh.mainRefreshLeaseUntil});let E=await T(B);if(E)return E;throw Error("Claude OAuth refresh is already in progress")}let Q=await p1({name:"opencode-main-oauth-refresh",ttlMs:120000,renew:!0});if(!Q){v("[refresh] opencode main oauth refresh skipped file lock");let E=await T(B);if(E)return E;throw Error("Claude OAuth refresh is already in progress")}S=Q.release,M=oj(),_=w,await z((E)=>{E.refresh=E.refresh??{},E.refresh.mainRefreshLeaseId=M??void 0,E.refresh.mainRefreshLeaseUntil=Date.now()+120000,E.refresh.mainRefreshLeaseTokenHash=w});let g=await R(J);if(v("[refresh] opencode main oauth refresh lease acquired",{attempt:W,leaseUntil:Date.now()+120000}),g?.refresh?.mainRefreshLeaseId!==M||g.refresh.mainRefreshLeaseTokenHash!==w)throw Error("Claude OAuth refresh is already in progress");v("[refresh] opencode main oauth refresh request start",{attempt:W});let m=await h1({refreshToken:B.refresh,maxRetries:0});return await G.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:m.refresh,access:m.access,expires:m.expires}}),await z((E)=>{if(!E?.refresh)return;if(E.refresh.mainLastRefreshError=void 0,E.refresh.mainRefreshLeaseId===M)E.refresh.mainRefreshLeaseId=void 0,E.refresh.mainRefreshLeaseUntil=void 0,E.refresh.mainRefreshLeaseTokenHash=void 0}),v("[refresh] opencode main oauth refresh succeeded",{attempt:W,expiresInMs:m.expires-Date.now()}),m.access}catch(X){let w=X instanceof Error&&(X.message.includes("fetch failed")||("code"in X)&&(X.code==="ECONNRESET"||X.code==="ECONNREFUSED"||X.code==="ETIMEDOUT"||X.code==="UND_ERR_CONNECT_TIMEOUT"));if(W<2&&(w||X instanceof u0&&X.status>=500))continue;v("[refresh] opencode main oauth refresh attempt failed",{attempt:W,error:X instanceof Error?X.message:String(X),transient:w});let L=B?.refresh;if(L&&X instanceof u0)await z((Q)=>{Q.refresh=Q.refresh??{},Q.refresh.mainLastRefreshError=o1({error:X,now:Date.now(),refreshToken:L,previous:Q.refresh.mainLastRefreshError})});throw X}finally{if(M)await z((X)=>{if(!X?.refresh)return;if(X.refresh.mainRefreshLeaseId===M&&X.refresh.mainRefreshLeaseTokenHash===_)X.refresh.mainRefreshLeaseId=void 0,X.refresh.mainRefreshLeaseUntil=void 0,X.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await S?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{Y=null});return Y}F=O,x(),$.seedFallbacksFromAccounts(D?.accounts??[]),o(D,{activeId:"main",route:"main",mainAccessToken:K.access,mainRefreshToken:K.refresh});async function i(I,N){if(!I.body||I.status!==200)return N?.mark("inspect_stream_skip",{status:I.status}),{response:I,rateLimited:!1};if(I.headers.get("x-cortexkit-relay-optimistic")==="true")return N?.mark("inspect_stream_skip",{status:I.status,reason:"optimistic_relay"}),{response:I,rateLimited:!1};let M=q(),_=I.body.getReader(),S=[],z=new TextDecoder,T="",W=0;while(!T.includes(`
8
8
 
9
- `)&&T.length<65536){let{done:K,value:_}=await N.read();if(K)break;if(S.push(_),z+=_.byteLength,T+=I.decode(_,{stream:!0}),p(T))break}if(p(T))return await N.cancel().catch(()=>{}),L?.mark("inspect_stream_first_event",{ms:y(q()-U),bytes:z,rateLimited:!0}),{response:Q,rateLimited:!0};let H=new ReadableStream({start(K){for(let _ of S)K.enqueue(_)},async pull(K){let{done:_,value:w}=await N.read();if(_){K.close();return}K.enqueue(w)},cancel(K){return N.cancel(K)}});return L?.mark("inspect_stream_first_event",{ms:y(q()-U),bytes:z,rateLimited:!1}),{response:new Response(H,{status:Q.status,statusText:Q.statusText,headers:Q.headers}),rateLimited:!1}}async function s(Q,L,U,N,S="unknown",I){let T=q(),z=I,H=async()=>{return z??=await R(Z),z},K=q1(Q,L),_=K.get("x-session-affinity")||K.get("x-opencode-session"),w=h(K);K.delete("x-parent-session-id"),K.delete("x-session-affinity"),K.delete("x-opencode-session");let O=L?.body,g;if(O&&typeof O==="string")try{let b=JSON.parse(O);if(typeof b.model==="string")g=b.model}catch{}let m=await o0(U,g),C=typeof O==="string"?O.length:void 0;if(O&&typeof O==="string"){let b=q(),J0=(()=>{if(!t0())return!1;try{return B0(JSON.parse(O).model)}catch{return!1}})();O=await R1(O,{cache1hEnabled:!w&&q0(),cache1hMode:E0(),fastModeEnabled:J0,identity:m});try{X0(K,U,{body:JSON.parse(O),identity:m})}catch{X0(K,U,{identity:m})}if(J0)g0(K);N?.mark("rewrite_body",{route:S,ms:y(q()-b),originalBytes:C,rewrittenBytes:O.length,cacheEnabled:!w&&q0(),cacheMode:E0(),fastModeEnabled:J0,subagent:w})}let B=C1(Q);if(S==="main"&&typeof O==="string"&&!w&&q0()&&E0()==="hybrid"){let b=await H();if(u.track({sessionId:_,url:B.url?.toString()??B.input.toString(),headers:K,bodyText:O,storage:b,cacheMode:"hybrid"}).tracked)N?.mark("cachekeep_track",{session:_})}let M=()=>fetch(B.input,{...L,body:O,headers:K,...E1()&&{tls:{rejectUnauthorized:!1}}}),k=e0(await H()),l=q(),A=await Yj({config:k,input:B.input,init:L,headers:K,body:O,fallback:M,affinity:_,optimisticResponse:k?.transport==="websocket"});return N?.mark("send_headers_received",{route:S,ms:y(q()-l),status:A.status,relayConfigured:k!=null,totalSendWithAccessMs:y(q()-T)}),A}async function V0(Q){let L=await Y.getUsableFallbackAccounts(Q);if(!z0(Q))return L;return L.filter((U)=>v0(n(U),Q,U.id))}async function r(Q,L,U,N,S,I,T){if(!U.length)return S??null;let z=T?.returnLastOnExhausted??!0;await S?.body?.cancel().catch(()=>{});let H=S??null;for(let[K,_]of U.entries()){let w=_.access;if(!w)continue;let O=await s(Q,L,w,I,`fallback_${K}`,N);H=O;let g=c0(O.status,N);if(!g){let m=await i(O,I);O=m.response,H=O,g=m.rateLimited}if(!g){if(await Y.markUsed(_),T?.onSuccess?.(_),w&&V.shouldRefreshOnRequestCount(I0))V.refreshFallback(_.id,w).then(()=>T?.onSuccess?.(_)).catch(()=>{});return O}if(K<U.length-1||!z)await O.body?.cancel().catch(()=>{})}return z?H:null}async function D0(Q,L,U,N,S,I,T){if(!E(Q,L?.body))return U;let z=q(),H=I??await R(Z);S?.mark("fallback_load_storage",{ms:y(q()-z),cached:!!I});let K=U,_=c0(K.status,H);if(!_){let O=await i(K,S);K=O.response,_=O.rateLimited}if(!_)return K;let w=N;if(!w){let O=q();w=await Y.getUsableFallbackAccounts(),S?.mark("fallback_get_accounts",{ms:y(q()-O),accounts:w.length})}if(z0(H)){let O=w.length;if(w=w.filter((g)=>v0(n(g),H,g.id)),w.length<O)F("[killswitch] filtered fallbacks",{before:O,after:w.length})}return await r(Q,L,w,H,K,S,{onSuccess:T})??K}return{apiKey:"",async fetch(Q,L){let U=L?.body,N=rj({bodyBytes:typeof U==="string"?U.length:void 0}),S=q(),I=await $();if(N.mark("get_auth",{ms:y(q()-S),authType:I.type,hasAccess:Boolean(I.access)}),I.type!=="oauth"){let B=await fetch(Q,L);return N.done("non_oauth_passthrough",{status:B.status}),B}await Z1(I.refresh);let T=q(),z=await R();N.mark("load_storage",{ms:y(q()-T)}),V.updateStorage(z),V.seedFallbacksFromAccounts(z?.accounts??[]);let H=E(Q,L?.body);if(H)I0++;let K=(B,M)=>o(z,{activeId:B,route:M,mainAccessToken:I.access,mainRefreshToken:I.refresh}),_;if(H&&j1(z)==="fallback-first")try{let B=q();_=await V0(z),N.mark("fallback_first_get_accounts",{ms:y(q()-B),accounts:_.length});let M=await r(Q,L,_,z,void 0,N,{returnLastOnExhausted:!1,onSuccess:(k)=>K(k.id,"fallback-first")});if(M)return N.done("return_fallback_first",{status:M.status}),W0(M);_=[]}catch(B){N.mark("fallback_first_error",{error:B instanceof Error?B.message:String(B)})}if(!I.access||!I.expires||I.expires<Date.now()){let M=(await R())?.refresh?.mainLastRefreshError;if(I.refresh&&M&&$0(M,I.refresh,Date.now()))throw F("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:M.nextRetryAt,retryCount:M.retryCount,expiresInMs:I.expires?I.expires-Date.now():void 0}),Error(n0(M,Date.now()));F("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(I.access),expiresInMs:I.expires?I.expires-Date.now():void 0,expiredAgoMs:I.expires&&I.expires<Date.now()?Date.now()-I.expires:void 0});let k=q();I.access=await P(),N.mark("refresh_main_access",{ms:y(q()-k)})}if(!I.access)throw N.done("missing_access_error"),Error("OAuth access token is missing after refresh");function w(){if(z?.quota?.showToasts!==!0)return;let B=V.getMain();if(!B)return;let M=(z?.accounts??[]).filter((A)=>A.enabled!==!1).map((A)=>({...A,quota:V.getFallback(A.id,A.access)?.quota??A.quota})),k=P0(B.quota,z),l;if(k)l="main";else l=M.find((A)=>P0(A.quota,z))?.id??"main";vj(B.quota,M,l)}if(H&&c(z))try{let B=q(),M=V.getMain(I.access)?.quota;if(!M)M=await V.refreshMain(I.access),w();else if(V.needsRefresh(I0))V.refreshMain(I.access).then(()=>{e(),w()}).catch(()=>{});if(o(z,{activeId:"main",route:"main",mainAccessToken:I.access,mainRefreshToken:I.refresh}),N.mark("main_quota_for_routing",{ms:y(q()-B),passes:P0(M,z)}),!P0(M,z)){let k=q();_=await V0(z),N.mark("preselect_fallback_accounts",{ms:y(q()-k),accounts:_.length});let l=await r(Q,L,_,z,void 0,N,{onSuccess:(A)=>K(A.id,"fallback")});if(l)return N.done("return_preselected_fallback",{status:l.status}),W0(l)}}catch(B){N.mark("main_quota_for_routing_error",{error:B instanceof Error?B.message:String(B)})}let O=V.getMain(I.access)?.quota;if(z?.quota?.failClosedOnUnknownQuota&&!O&&V.isBackedOff()){let B=V.getLastApiError(),M=B?c1(B,Date.now()):"Quota API unavailable";return F("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:B?.nextRetryAt,retryCount:B?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:M}}),{status:429,headers:{"content-type":"application/json","retry-after":String(B?.nextRetryAt?Math.max(1,Math.ceil((B.nextRetryAt-Date.now())/1000)):60)}})}if(z0(z)){if(V.needsRefresh(I0))try{let M=(z?.accounts??[]).filter((k)=>k.enabled!==!1&&k.access);await Promise.all([V.refreshMain(I.access),V.refreshAllFallbacks(M)])}catch(M){F("[quota] killswitch refresh failed",{error:M instanceof Error?M.message:String(M),backedOff:V.isBackedOff()})}O=V.getMain(I.access)?.quota}if(z0(z)&&!v0(O,z)){let M=E(Q,L?.body)?await V0(z):[];if(M.length>0){F("[route] skipping main (killswitch), trying fallbacks");let b=await r(Q,L,M,z,void 0,N,{onSuccess:(J0)=>K(J0.id,"fallback")});if(b)return N.done("return_killswitch_fallback",{status:b.status}),W0(b)}let k=Date.now(),l=(z?.accounts??[]).filter((b)=>b.enabled!==!1).map((b)=>({...b,quota:n(b)})),A=n1(O,l,k);return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:`Killswitch: no routable accounts. Retry in ${Math.floor(A/60)}m ${A%60}s.`}}),{status:429,headers:{"content-type":"application/json","retry-after":String(A)}})}let g=await s(Q,L,I.access,N,"main",z),m=!1,C=await D0(Q,L,g,_,N,z,(B)=>{m=!0,K(B.id,"fallback")});if(!m)K("main","main");return N.done("return_response",{status:C.status}),W0(C)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let $=await p0("max");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(D)=>{return l0(D,$.verifier,$.redirectUri,$.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let $=await p0("console");return{url:$.url,instructions:"Paste the authorization code here:",method:"code",callback:async(D)=>{let X=await l0(D,$.verifier,$.redirectUri,$.state);if(X.type==="failed")return X;return{type:"success",key:(await fetch("https://api.anthropic.com/api/oauth/claude_cli/create_api_key",{method:"POST",headers:{"Content-Type":"application/json",authorization:`Bearer ${X.access}`}}).then((P)=>P.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{XJ as AnthropicAuthPlugin};
9
+ `)&&T.length<65536){let{done:X,value:w}=await _.read();if(X)break;if(S.push(w),W+=w.byteLength,T+=z.decode(w,{stream:!0}),p(T))break}if(p(T))return await _.cancel().catch(()=>{}),N?.mark("inspect_stream_first_event",{ms:A(q()-M),bytes:W,rateLimited:!0}),{response:I,rateLimited:!0};let B=new ReadableStream({start(X){for(let w of S)X.enqueue(w)},async pull(X){let{done:w,value:L}=await _.read();if(w){X.close();return}X.enqueue(L)},cancel(X){return _.cancel(X)}});return N?.mark("inspect_stream_first_event",{ms:A(q()-M),bytes:W,rateLimited:!1}),{response:new Response(B,{status:I.status,statusText:I.statusText,headers:I.headers}),rateLimited:!1}}async function s(I,N,M,_,S="unknown",z){let T=q(),W=z,B=async()=>{return W??=await R(J),W},X=x1(I,N),w=X.get("x-session-affinity")||X.get("x-opencode-session"),L=h(X);X.delete("x-parent-session-id"),X.delete("x-session-affinity"),X.delete("x-opencode-session");let Q=N?.body,g;if(Q&&typeof Q==="string")try{let b=JSON.parse(Q);if(typeof b.model==="string")g=b.model}catch{}let m=await t0(M,g),E=typeof Q==="string"?Q.length:void 0;if(Q&&typeof Q==="string"){let b=q(),G0=(()=>{if(!j1())return!1;try{return M0(JSON.parse(Q).model)}catch{return!1}})();Q=await A1(Q,{cache1hEnabled:!L&&E0(),cache1hMode:x0(),fastModeEnabled:G0,identity:m});try{K0(X,M,{body:JSON.parse(Q),identity:m})}catch{K0(X,M,{identity:m})}if(G0)d0(X);_?.mark("rewrite_body",{route:S,ms:A(q()-b),originalBytes:E,rewrittenBytes:Q.length,cacheEnabled:!L&&E0(),cacheMode:x0(),fastModeEnabled:G0,subagent:L})}let H=R1(I);if(S==="main"&&typeof Q==="string"&&!L&&E0()&&x0()==="hybrid"){let b=await B();if(l.track({sessionId:w,url:H.url?.toString()??H.input.toString(),headers:X,bodyText:Q,storage:b,cacheMode:"hybrid"}).tracked)_?.mark("cachekeep_track",{session:w})}let U=()=>fetch(H.input,{...N,body:Q,headers:X,...S1()&&{tls:{rejectUnauthorized:!1}}}),k=J1(await B()),d=q(),f=await Ij({config:k,input:H.input,init:N,headers:X,body:Q,fallback:U,affinity:w,optimisticResponse:k?.transport==="websocket"});return _?.mark("send_headers_received",{route:S,ms:A(q()-d),status:f.status,relayConfigured:k!=null,totalSendWithAccessMs:A(q()-T)}),f}async function D0(I){let N=await P.getUsableFallbackAccounts(I);if(!O0(I))return N;return N.filter((M)=>q0(n(M),I,M.id))}async function t(I,N,M,_,S,z,T){if(!M.length)return S??null;let W=T?.returnLastOnExhausted??!0;await S?.body?.cancel().catch(()=>{});let B=S??null;for(let[X,w]of M.entries()){let L=w.access;if(!L)continue;let Q=await s(I,N,L,z,`fallback_${X}`,_);B=Q;let g=r0(Q.status,_);if(!g){let m=await i(Q,z);Q=m.response,B=Q,g=m.rateLimited}if(!g){if(await P.markUsed(w),T?.onSuccess?.(w),L&&$.shouldRefreshOnRequestCount(Q0))$.refreshFallback(w.id,L).then(()=>T?.onSuccess?.(w)).catch(()=>{});return Q}if(X<M.length-1||!W)await Q.body?.cancel().catch(()=>{})}return W?B:null}async function V0(I,N,M,_,S,z,T){if(!C(I,N?.body))return M;let W=q(),B=z??await R(J);S?.mark("fallback_load_storage",{ms:A(q()-W),cached:!!z});let X=M,w=r0(X.status,B);if(!w){let Q=await i(X,S);X=Q.response,w=Q.rateLimited}if(!w)return X;let L=_;if(!L){let Q=q();L=await P.getUsableFallbackAccounts(),S?.mark("fallback_get_accounts",{ms:A(q()-Q),accounts:L.length})}if(O0(B)){let Q=L.length;if(L=L.filter((g)=>q0(n(g),B,g.id)),L.length<Q)v("[killswitch] filtered fallbacks",{before:Q,after:L.length})}return await t(I,N,L,B,X,S,{onSuccess:T})??X}return{apiKey:"",async fetch(I,N){let M=N?.body,_=JG({bodyBytes:typeof M==="string"?M.length:void 0}),S=q(),z=await Z();if(_.mark("get_auth",{ms:A(q()-S),authType:z.type,hasAccess:Boolean(z.access)}),z.type!=="oauth"){let H=await fetch(I,N);return _.done("non_oauth_passthrough",{status:H.status}),H}await D1(z.refresh);let T=q(),W=await R();_.mark("load_storage",{ms:A(q()-T)}),$.updateStorage(W),$.seedFallbacksFromAccounts(W?.accounts??[]);let B=C(I,N?.body);if(B)Q0++;if(B&&z.access&&(!z.expires||z.expires>Date.now()))z0(W,z.access);let X=(H,U)=>o(W,{activeId:H,route:U,mainAccessToken:z.access,mainRefreshToken:z.refresh}),w;if(B&&Z1(W)==="fallback-first")try{let H=q();w=await D0(W),_.mark("fallback_first_get_accounts",{ms:A(q()-H),accounts:w.length});let U=await t(I,N,w,W,void 0,_,{returnLastOnExhausted:!1,onSuccess:(k)=>X(k.id,"fallback-first")});if(U)return _.done("return_fallback_first",{status:U.status}),Y0(U);w=[]}catch(H){_.mark("fallback_first_error",{error:H instanceof Error?H.message:String(H)})}if(!z.access||!z.expires||z.expires<Date.now()){let U=(await R())?.refresh?.mainLastRefreshError;if(z.refresh&&U&&Z0(U,z.refresh,Date.now()))throw v("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:U.nextRetryAt,retryCount:U.retryCount,expiresInMs:z.expires?z.expires-Date.now():void 0}),Error(s0(U,Date.now()));v("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(z.access),expiresInMs:z.expires?z.expires-Date.now():void 0,expiredAgoMs:z.expires&&z.expires<Date.now()?Date.now()-z.expires:void 0});let k=q();z.access=await O(),_.mark("refresh_main_access",{ms:A(q()-k)})}if(!z.access)throw _.done("missing_access_error"),Error("OAuth access token is missing after refresh");function L(){if(W?.quota?.showToasts!==!0)return;let H=$.getMain();if(!H)return;let U=(W?.accounts??[]).filter((f)=>f.enabled!==!1).map((f)=>({...f,quota:$.getFallback(f.id,f.access)?.quota??f.quota})),k=P0(H.quota,W),d;if(k)d="main";else d=U.find((f)=>P0(f.quota,W))?.id??"main";Cj(H.quota,U,d)}if(B&&c(W))try{let H=q(),U=$.getMain(z.access)?.quota;if(!U)U=await $.refreshMain(z.access),L();else if($.needsRefresh(Q0))$.refreshMain(z.access).then(()=>{r(),L()}).catch(()=>{});if(o(W,{activeId:"main",route:"main",mainAccessToken:z.access,mainRefreshToken:z.refresh}),_.mark("main_quota_for_routing",{ms:A(q()-H),passes:P0(U,W)}),!P0(U,W)){let k=q();w=await D0(W),_.mark("preselect_fallback_accounts",{ms:A(q()-k),accounts:w.length});let d=await t(I,N,w,W,void 0,_,{onSuccess:(f)=>X(f.id,"fallback")});if(d)return _.done("return_preselected_fallback",{status:d.status}),Y0(d)}}catch(H){_.mark("main_quota_for_routing_error",{error:H instanceof Error?H.message:String(H)})}let Q=$.getMain(z.access)?.quota;if(W?.quota?.failClosedOnUnknownQuota&&!Q&&$.isBackedOff()){let H=$.getLastApiError(),U=H?r1(H,Date.now()):"Quota API unavailable";return v("[quota] blocked: quota API backed off (failClosed)",{nextRetryAt:H?.nextRetryAt,retryCount:H?.retryCount}),new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:U}}),{status:429,headers:{"content-type":"application/json","retry-after":String(H?.nextRetryAt?Math.max(1,Math.ceil((H.nextRetryAt-Date.now())/1000)):60)}})}if(O0(W)){if($.needsRefresh(Q0))try{let U=(W?.accounts??[]).filter((k)=>k.enabled!==!1&&k.access);await Promise.all([$.refreshMain(z.access),$.refreshAllFallbacks(U)])}catch(U){v("[quota] killswitch refresh failed",{error:U instanceof Error?U.message:String(U),backedOff:$.isBackedOff()})}Q=$.getMain(z.access)?.quota}if(O0(W)&&!q0(Q,W)){let U=C(I,N?.body)?await D0(W):[];if(U.length>0){v("[route] skipping main (killswitch), trying fallbacks");let b=await t(I,N,U,W,void 0,_,{onSuccess:(G0)=>X(G0.id,"fallback")});if(b)return _.done("return_killswitch_fallback",{status:b.status}),Y0(b)}let k=Date.now(),d=(W?.accounts??[]).filter((b)=>b.enabled!==!1).map((b)=>({...b,quota:n(b)})),f=s1(Q,d,k);return new Response(JSON.stringify({type:"error",error:{type:"rate_limit_error",message:`Killswitch: no routable accounts. Retry in ${Math.floor(f/60)}m ${f%60}s.`}}),{status:429,headers:{"content-type":"application/json","retry-after":String(f)}})}let g=await s(I,N,z.access,_,"main",W),m=!1,E=await V0(I,N,g,w,_,W,(H)=>{m=!0,X(H.id,"fallback")});if(!m)X("main","main");return _.done("return_response",{status:E.status}),Y0(E)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let Z=await i0("max");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(V)=>{return c0(V,Z.verifier,Z.redirectUri,Z.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let Z=await i0("console");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(V)=>{let K=await c0(V,Z.verifier,Z.redirectUri,Z.state);if(K.type==="failed")return K;return{type:"success",key:(await fetch("https://api.anthropic.com/api/oauth/claude_cli/create_api_key",{method:"POST",headers:{"Content-Type":"application/json",authorization:`Bearer ${K.access}`}}).then((O)=>O.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{zG as AnthropicAuthPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-anthropic-auth",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,7 +51,7 @@
51
51
  "@opencode-ai/plugin": "*"
52
52
  },
53
53
  "dependencies": {
54
- "@cortexkit/anthropic-auth-core": "1.6.0",
54
+ "@cortexkit/anthropic-auth-core": "1.7.0",
55
55
  "@opentui/core": ">=0.3.1",
56
56
  "@opentui/solid": ">=0.3.1",
57
57
  "solid-js": "^1.9.10"