@cortexkit/opencode-anthropic-auth
Advanced tools
Sorry, the diff of this file is too big to display
+1
-1
| #!/usr/bin/env node | ||
| import{l as y,m as w,o as l,p as u,q as m,ra as b,ta as k}from"./index-5by638vz.js";import{stdin as A,stdout as $}from"node:process";import{createInterface as R}from"node:readline/promises";function v(){return{version:1,main:{type:"opencode",provider:"anthropic"},fallbackOn:[401,403,429],refresh:{enabled:!0,intervalMinutes:10,refreshBeforeExpiryMinutes:240},quota:{enabled:!0,checkIntervalMinutes:5,minimumRemaining:{five_hour:10,seven_day:20},failClosedOnUnknownQuota:!0},accounts:[]}}function h(){console.log(`Usage: | ||
| import{l as y,m as w,o as l,p as u,q as m,ra as b,ta as k}from"./index-ws2d5kxr.js";import{stdin as A,stdout as $}from"node:process";import{createInterface as R}from"node:readline/promises";function v(){return{version:1,main:{type:"opencode",provider:"anthropic"},fallbackOn:[401,403,429],refresh:{enabled:!0,intervalMinutes:10,refreshBeforeExpiryMinutes:240},quota:{enabled:!0,checkIntervalMinutes:5,minimumRemaining:{five_hour:10,seven_day:20},failClosedOnUnknownQuota:!0},accounts:[]}}function h(){console.log(`Usage: | ||
| opencode-anthropic-auth login [label] | ||
@@ -4,0 +4,0 @@ opencode-anthropic-auth list |
+3
-3
@@ -1,5 +0,5 @@ | ||
| import{$ as S1,A as _1,B as F1,C as H0,D as Z0,E as B1,F as p,G as q0,H as M1,I as S0,J as v1,K as A0,L as U1,M as $0,N as G0,O as D0,P as c,Q as x1,R as V0,S as e0,T as j1,U as E0,V as J1,W as K1,X as Z1,Y as P0,Z as H1,_ as q1,a as c0,aa as A1,b as o0,ba as E1,c as e,ca as C1,d as j0,da as R1,e as t0,ea as X0,f as d,fa as W0,g as a0,ga as T1,h as r0,ha as C0,i as s0,ia as Y0,j as F0,ja as f1,k as z1,ka as w0,l as B0,la as y1,m as M0,ma as R0,n as U,na as z0,oa as k1,p as A,pa as g1,q as v0,qa as b1,r as I1,s as J0,sa as m1,t as K0,u as O1,v as Q1,w as U0,x as L1,y as x0,z as N1}from"./index-5by638vz.js";import{randomUUID as Wj}from"node:crypto";function m(j){return typeof j==="object"&&j!==null}function s1(j){if(Array.isArray(j))return j;if(m(j)&&Array.isArray(j.data))return j.data;return[]}function e1(j){if(!m(j)||!m(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function m0(j){if(!m(j)||!m(j.info))return null;let J=j.info,K=m(J.model)?J.model:void 0,$=typeof J.agent==="string"?J.agent:void 0,D=typeof K?.providerID==="string"?K.providerID:typeof J.providerID==="string"?J.providerID:void 0,V=typeof K?.modelID==="string"?K.modelID:typeof J.modelID==="string"?J.modelID:void 0,B=typeof K?.variant==="string"?K.variant:typeof J.variant==="string"?J.variant:void 0;if(!$&&(!D||!V)&&!B)return null;let E={};if($)E.agent=$;if(D&&V)E.model={providerID:D,modelID:V};if(B)E.variant=B;return E}function h0(j,J){return{agent:j.agent??J.agent,model:j.model??J.model,variant:j.variant??J.variant}}function u0(j){return Boolean(j.agent&&j.model&&j.variant)}async function d0(j,J){if(!j||!J)return null;let K=j;if(typeof K.session?.messages!=="function")return null;let $=[];try{$=s1(await Promise.resolve(K.session.messages({path:{id:J},query:{limit:100}})))}catch{return null}if($.length===0)return null;let D={};for(let V=$.length-1;V>=0;V--){if(e1($[V])!=="assistant")continue;let B=m0($[V]);if(!B)continue;if(D=h0(D,B),u0(D))return D}for(let V=$.length-1;V>=0;V--){let B=m0($[V]);if(!B)continue;if(D=h0(D,B),u0(D))return D}if(!D.agent&&!D.model&&!D.variant)return null;return D}function l0(j){return`${c0}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function jj(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}function $1(j,J){let K=new Headers;if(j instanceof Request)j.headers.forEach((D,V)=>{K.set(V,D)});let $=J?.headers;if($){if($ instanceof Headers)$.forEach((D,V)=>{K.set(V,D)});else if(Array.isArray($))for(let D of $){let[V,B]=D;if(typeof B<"u")K.set(V,String(B))}else for(let[D,V]of Object.entries($))if(typeof V<"u")K.set(D,String(V))}return K}function N0(j){return j.set("anthropic-beta",e(j.get("anthropic-beta"),[o0])),j}function l(j,J,K={}){return K1(j,J,K)}function Jj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((J)=>({...J,name:J.name?l0(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((K)=>{if(K.type==="tool_use"&&K.name)return{...K,name:l0(K.name)};return K});return J});return JSON.stringify(Z1(j))}function Q0(j){return j.replace(/"name"\s*:\s*"mcp_([^"]+)"/g,(J,K)=>`"name": "${jj(K)}"`)}function i0(j,J=!1){if(J)return{ready:Q0(j),pending:""};let K=j.length,$='"name"',D=Math.max(0,j.length-$.length+1);for(let B=D;B<j.length;B++)if($.startsWith(j.slice(B))){K=Math.min(K,B);break}let V=j.lastIndexOf($);if(V!==-1){let B=j.slice(V);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(B))K=Math.min(K,V)}if(K<j.length)return{ready:Q0(j.slice(0,K)),pending:j.slice(K)};return{ready:Q0(j),pending:""}}function G1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function Kj(){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 D1(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 K=J.href,$=Kj();if($)J.protocol=$.protocol,J.host=$.host;if(J.pathname==="/v1/messages"&&!J.searchParams.has("beta"))J.searchParams.set("beta","true");if(J.href===K)return{input:j,url:J};return{input:j instanceof Request?new Request(J.toString(),j):J,url:J}}function a(j){let $=j.split(/\n\n+/).filter((D)=>{if(D.includes(t0))return!1;for(let V of r0)if(D.includes(V))return!1;return!0}).join(` | ||
| import{$ as A1,A as v1,B as F1,C as S0,D as $0,E as U1,F as p,G as E0,H as H1,I as C0,J as x1,K as A0,L as q1,M as G0,N as D0,O as V0,P as c,Q as S1,R as P0,S as K1,T as Z1,U as R0,V as $1,W as G1,X as D1,Y as X0,Z as E1,_ as C1,a as a0,aa as R1,b as r0,ba as T1,c as e,ca as f1,d as j0,da as y1,e as s0,ea as W0,f as n,fa as Y0,g as e0,ga as k1,h as j1,ha as T0,i as J1,ia as w0,j as v0,ja as g1,k as O1,ka as z0,l as F0,la as m1,m as U0,ma as f0,n as q,na as I0,oa as b1,p as C,pa as h1,q as H0,qa as d1,r as L1,s as K0,sa as u1,t as Z0,u as N1,ua as Q0,v as _1,va as y0,w as x0,wa as i1,x as B1,xa as n1,y as q0,ya as k0,z as M1}from"./index-ws2d5kxr.js";import{randomUUID as Oj}from"node:crypto";function b(j){return typeof j==="object"&&j!==null}function $j(j){if(Array.isArray(j))return j;if(b(j)&&Array.isArray(j.data))return j.data;return[]}function Gj(j){if(!b(j)||!b(j.info))return;return typeof j.info.role==="string"?j.info.role:void 0}function u0(j){if(!b(j)||!b(j.info))return null;let J=j.info,K=b(J.model)?J.model:void 0,G=typeof J.agent==="string"?J.agent:void 0,D=typeof K?.providerID==="string"?K.providerID:typeof J.providerID==="string"?J.providerID:void 0,V=typeof K?.modelID==="string"?K.modelID:typeof J.modelID==="string"?J.modelID:void 0,v=typeof K?.variant==="string"?K.variant:typeof J.variant==="string"?J.variant:void 0;if(!G&&(!D||!V)&&!v)return null;let R={};if(G)R.agent=G;if(D&&V)R.model={providerID:D,modelID:V};if(v)R.variant=v;return R}function i0(j,J){return{agent:j.agent??J.agent,model:j.model??J.model,variant:j.variant??J.variant}}function n0(j){return Boolean(j.agent&&j.model&&j.variant)}async function l0(j,J){if(!j||!J)return null;let K=j;if(typeof K.session?.messages!=="function")return null;let G=[];try{G=$j(await Promise.resolve(K.session.messages({path:{id:J},query:{limit:100}})))}catch{return null}if(G.length===0)return null;let D={};for(let V=G.length-1;V>=0;V--){if(Gj(G[V])!=="assistant")continue;let v=u0(G[V]);if(!v)continue;if(D=i0(D,v),n0(D))return D}for(let V=G.length-1;V>=0;V--){let v=u0(G[V]);if(!v)continue;if(D=i0(D,v),n0(D))return D}if(!D.agent&&!D.model&&!D.variant)return null;return D}function p0(j){return`${a0}${j.charAt(0).toUpperCase()}${j.slice(1)}`}function Dj(j){if(j==="StructuredOutput")return j;return`${j.charAt(0).toLowerCase()}${j.slice(1)}`}function V1(j,J){let K=new Headers;if(j instanceof Request)j.headers.forEach((D,V)=>{K.set(V,D)});let G=J?.headers;if(G){if(G instanceof Headers)G.forEach((D,V)=>{K.set(V,D)});else if(Array.isArray(G))for(let D of G){let[V,v]=D;if(typeof v<"u")K.set(V,String(v))}else for(let[D,V]of Object.entries(G))if(typeof V<"u")K.set(D,String(V))}return K}function M0(j){return j.set("anthropic-beta",e(j.get("anthropic-beta"),[r0])),j}function l(j,J,K={}){return G1(j,J,K)}function Vj(j){if(j.tools&&Array.isArray(j.tools))j.tools=j.tools.map((J)=>({...J,name:J.name?p0(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((K)=>{if(K.type==="tool_use"&&K.name)return{...K,name:p0(K.name)};return K});return J});return JSON.stringify(D1(j))}function _0(j){return j.replace(/"name"\s*:\s*"mcp_([^"]+)"/g,(J,K)=>`"name": "${Dj(K)}"`)}function c0(j,J=!1){if(J)return{ready:_0(j),pending:""};let K=j.length,G='"name"',D=Math.max(0,j.length-G.length+1);for(let v=D;v<j.length;v++)if(G.startsWith(j.slice(v))){K=Math.min(K,v);break}let V=j.lastIndexOf(G);if(V!==-1){let v=j.slice(V);if(/^"name"\s*(?::\s*(?:"[^"]*)?)?$/.test(v))K=Math.min(K,V)}if(K<j.length)return{ready:_0(j.slice(0,K)),pending:j.slice(K)};return{ready:_0(j),pending:""}}function P1(){if(!process.env.ANTHROPIC_BASE_URL?.trim())return!1;let j=process.env.ANTHROPIC_INSECURE?.trim();return j==="1"||j==="true"}function Pj(){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 X1(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 K=J.href,G=Pj();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===K)return{input:j,url:J};return{input:j instanceof Request?new Request(J.toString(),j):J,url:J}}function a(j){let G=j.split(/\n\n+/).filter((D)=>{if(D.includes(s0))return!1;for(let V of j1)if(D.includes(V))return!1;return!0}).join(` | ||
| `);for(let D of s0)$=$.replace(D.match,D.replacement);return $.trim()}function C(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function Zj(j){let J={type:"text",text:d};if(j==null)return[J];if(typeof j==="string"){let $=a(j);if($===d)return[J];return[J,{type:"text",text:$}]}if(C(j)){let $=typeof j.type==="string"?j.type:"text",D=typeof j.text==="string"?j.text:"";return[J,{...j,type:$,text:a(D)}]}if(!Array.isArray(j))return[J];let K=j.map(($)=>{if(typeof $==="string")return{type:"text",text:a($)};if(C($)&&$.type==="text"&&typeof $.text==="string")return{...$,type:"text",text:a($.text)};return{type:"text",text:String($)}});if(K[0]?.text===d)return K;return[J,...K]}var V1={type:"ephemeral",ttl:"1h"};function $j(j){if(C(j.cache_control))return j.cache_control;if(C(j.cacheControl))return j.cacheControl;return null}function s(j,J){if(!C(j))return!1;return delete j.cacheControl,j.cache_control=J?{...V1}:{type:"ephemeral"},!0}function n0(j){if(!C(j))return;delete j.cache_control,delete j.cacheControl}function Gj(j){if(Array.isArray(j))return j;if(typeof j==="string")return[{type:"text",text:j}];return null}function r(j,J){if(!C(j))return;let K=$j(j);if(!K||K.type!=="ephemeral")return;if(J)K.ttl="1h";else delete K.ttl}function p0(j,J){if(Array.isArray(j.system))for(let K of j.system)r(K,J);else r(j.system,J);if(!Array.isArray(j.messages))return;for(let K of j.messages)if(r(K,J),C(K)&&Array.isArray(K.content))for(let $ of K.content)r($,J)}function Dj(j,J){if(Array.isArray(j.system))for(let K of j.system)J(K);else J(j.system);if(!Array.isArray(j.messages))return;for(let K of j.messages)if(J(K),C(K)&&Array.isArray(K.content))for(let $ of K.content)J($)}function P1(j){n0(j),Dj(j,n0)}function Vj(j){P1(j),j.cache_control={...V1}}function L0(j){if(!C(j))return!1;let J=Gj(j.content);if(!J?.length)return s(j,!0);j.content=J;let K=[...J].reverse().find(($)=>C($)&&$.type!=="thinking");return s(K??j,!0)}function Pj(j){if(P1(j),Array.isArray(j.system)){let K=j.system.findIndex((V)=>C(V)&&V.text===d),$=j.system.slice(K>=0?K+1:0).filter(C),D=$[$.length-1];s(D,!0)}else s(j.system,!0);if(!Array.isArray(j.messages))return;L0(j.messages[0]),L0(j.messages[1]);let J=j.messages.length-2;if(J>1)L0(j.messages[J])}function Xj(j,J){if(!J.enabled){p0(j,!1),delete j.cache_control,delete j.cacheControl;return}if(J.mode==="automatic"){Vj(j);return}if(J.mode==="hybrid"){Pj(j);return}p0(j,!0),delete j.cacheControl}async function X1(j,J={}){try{let K=JSON.parse(j),$=Array.isArray(K.messages)&&K.messages.some((D)=>D.role==="user")?j1(K.messages,void 0,a0):null;if(K.system=Zj(K.system),$&&Array.isArray(K.system))K.system.unshift({type:"text",text:$});if(Xj(K,{enabled:J.cache1hEnabled??!1,mode:J.cache1hMode??"explicit"}),J.fastModeEnabled&&j0(K.model))K.speed="fast";else if(K.speed==="fast")delete K.speed;if(J.identity)J1(K,J.identity);return await e0(Jj(K))}catch{return j}}function _0(j){if(!j.body)return j;let J=j.body.getReader(),K=new TextDecoder,$=new TextEncoder,D="",V=new ReadableStream({async pull(B){let{done:E,value:y}=await J.read();if(E){let u=i0(`${D}${K.decode()}`,!0);if(u.ready)B.enqueue($.encode(u.ready));B.close();return}let O0=D+K.decode(y,{stream:!0}),h=i0(O0);if(D=h.pending,h.ready)B.enqueue($.encode(h.ready))}});return new Response(V,{status:j.status,statusText:j.statusText,headers:j.headers})}var Yj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",wj=60000,zj=60000,Ij=5000,W1=200,h1=240,Oj=h1,Qj=1,Y1=!1;function I0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function M(){return performance.now()}function S(j){return Math.round(j*10)/10}function w1(j){return Math.floor(Math.random()*Math.max(0,j))}function Lj(){if(Y1||!1||!I0())return;Y1=!0;let j=100,J=250,K=M()+j;setInterval(()=>{let $=M(),D=$-K;if(K=$+j,D<J)return;U("[perf] opencode event_loop_lag",{lagMs:S(D),thresholdMs:J})},j).unref?.()}function Nj(j){let J=M(),K={requestId:String(Qj++),start:J,last:J,mark($,D){let V=M();if(I0())U("[perf] opencode request stage",{requestId:K.requestId,stage:$,deltaMs:S(V-K.last),totalMs:S(V-K.start),...D});K.last=V},done($,D){let V=M();if(I0())U("[perf] opencode request done",{requestId:K.requestId,stage:$,deltaMs:S(V-K.last),totalMs:S(V-K.start),...D});K.last=V}};if(I0())U("[perf] opencode request start",{requestId:K.requestId,...j});return K}async function i(j,J,K){let $=j.client.session,D=await d0(j.client,J),V={path:{id:J},body:{noReply:!0,parts:[{type:"text",text:K,ignored:!0}]}};if(D?.agent)V.body.agent=D.agent;if(D?.model)V.body.model=D.model;if(D?.variant)V.body.variant=D.variant;if(typeof $?.promptAsync==="function"){await $.promptAsync(V);return}if(typeof $?.prompt==="function"){await Promise.resolve($.prompt(V));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function n(){throw Error(Yj)}var qj=async(j)=>{Lj();let{client:J}=j,K=new U1;K.startBackgroundRefresh();let $=null,D=new R1({loadStorage:()=>A(),prepareHeaders:async(Z,Q)=>{if(!E)return Z;let W=await E();if(W.type!=="oauth")return Z;if(!W.access||W.expires&&W.expires<Date.now()){if(!$)return Z;W.access=await $()}if(!W.access)return Z;try{let N=JSON.parse(Q.bodyText),x=await E0(W.access,typeof N.model==="string"?N.model:void 0);if(Z.delete("anthropic-beta"),l(Z,W.access,{body:N,identity:x}),Z.set("anthropic-beta",e(Z.get("anthropic-beta"),[H1])),N.speed==="fast")N0(Z)}catch{l(Z,W.access)}return Z},log:U}),V=await A(),B=b1(V);c({enabled:J0(V),mode:K0(V)}),W0(U0(V)),w0(x0(V));let E=null,y=null;function O0(Z){let Q=Z?.refresh?.refreshBeforeExpiryMinutes??Oj;return Math.max(h1,Q)*60000}function h(Z){return Z?.refresh?.enabled!==!1}async function u(Z){if(!Z)return;let Q=await A(),W=Q?.refresh?.mainLastRefreshError;if(!Q?.refresh||!W?.tokenHash)return;let N=Z0(Z);if(W.tokenHash===N)return;if(W.nextRetryAt&&W.nextRetryAt>Date.now()){U("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:W.nextRetryAt,retryCount:W.retryCount,remainingMs:W.nextRetryAt-Date.now()});return}Q.refresh.mainLastRefreshError=void 0,await v0(Q),U("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:W.checkedAt,previousNextRetryAt:W.nextRetryAt,previousRetryCount:W.retryCount})}async function u1(){let Z=[];if(E)try{let N=await E();if(N.type==="oauth"&&N.access)Z.push({name:"OpenCode anthropic",role:"main",quota:await A0({accessToken:N.access})});else if(N.type==="oauth")Z.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(N){Z.push({name:"OpenCode anthropic",role:"main",error:N instanceof Error?N.message:String(N)})}let{storage:Q,errors:W}=await K.refreshQuotaForAllAccounts();if(Z.push(...k1(Q,new Map(W.map((N)=>[N.accountId,N.message])))),!E)Z.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return g1({accounts:Z,refreshedAt:Date.now()})}async function d1(Z){let Q=x1(Z);if(Q.type==="enable"||Q.type==="disable"){let f=Q.type==="enable",k=await O1(f),g=K0(k);return c({enabled:f,mode:g}),V0({argumentsText:Z,enabled:f,mode:g})}if(Q.type==="mode"){let f=await Q1(Q.mode),k=J0(f);return c({enabled:k,mode:Q.mode}),V0({argumentsText:Z,enabled:k,mode:Q.mode})}let W=await A(),N=J0(W),x=K0(W);return c({enabled:N,mode:x}),V0({argumentsText:Z,enabled:N,mode:x})}async function l1(Z){let Q=q1(Z),W=await A();if(Q.type==="window")W=await _1(Q.startHour,Q.endHour);else if(Q.type==="disable")W=await F1(!1);let N=S1(W),x=D.stats(N);return C1({argumentsText:Z,enabled:A1(W),window:N,hybridActive:E1(W),trackedSessions:x.trackedSessions,nextPrewarmAt:x.nextPrewarmAt})}async function i1(Z){let Q=T1(Z);if(Q.type==="enable"||Q.type==="disable"){let x=Q.type==="enable";return await L1(x),W0(x),C0({argumentsText:Z,enabled:x})}let W=await A(),N=U0(W);return W0(N),C0({argumentsText:Z,enabled:N})}async function n1(Z){let Q=y1(Z);if(Q.type==="enable"||Q.type==="disable"){let x=Q.type==="enable";return await N1(x),w0(x),R0({argumentsText:Z,enabled:x})}let W=await A(),N=x0(W);return w0(N),R0({argumentsText:Z,enabled:N})}return{config:async(Z)=>{Z.command={...Z.command??{},[$0]:{template:$0,description:"Show or toggle 1-hour Anthropic ephemeral prompt cache TTL."},[P0]:{template:P0,description:"Keep hybrid Claude cache warm for recently used sessions during a local time window."},[z0]:{template:z0,description:"Show current Claude OAuth quota usage for all accounts."},[X0]:{template:X0,description:"Show or toggle Anthropic request dump capture for debugging."},[Y0]:{template:Y0,description:"Show or toggle Anthropic fast mode for supported Opus models."}}},"command.execute.before":async(Z)=>{if(Z.command===$0)await i(j,Z.sessionID,await d1(Z.arguments)),n();if(Z.command===P0)await i(j,Z.sessionID,await l1(Z.arguments)),n();if(Z.command===z0)await i(j,Z.sessionID,await u1()),n();if(Z.command===X0)await i(j,Z.sessionID,await i1(Z.arguments)),n();if(Z.command===Y0)await i(j,Z.sessionID,await n1(Z.arguments)),n()},auth:{provider:"anthropic",async loader(Z,Q){if(E=Z,(await Z()).type==="oauth"){let p1=function(){if(y)clearInterval(y),y=null;let P=async()=>{try{let X=await A();if(!h(X))return;let z=await Z();if(z.type!=="oauth")return;if(await u(z.refresh),!z.expires)return;let I=z.expires-Date.now(),v=O0(X);if(I>v)return;if(U("[refresh] opencode main oauth background due",{expiresInMs:I,refreshBeforeMs:v}),z.refresh&&p(X?.refresh?.mainLastRefreshError,z.refresh,Date.now())){U("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:X?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:X?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:I});return}if(z.refresh&&X?.refresh?.mainRefreshLeaseUntil&&X.refresh.mainRefreshLeaseUntil>Date.now()&&X.refresh.mainRefreshLeaseTokenHash===Z0(z.refresh))return;await g();let O=await Z();U("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:O.expires?O.expires-Date.now():void 0})}catch(X){U("[refresh] opencode main oauth refresh failed",{message:X instanceof Error?X.message:String(X)})}};if(y=setInterval(()=>{P()},wj+w1(zj)),"unref"in y)y.unref()},T0=function(P,X){if(P instanceof Request&&P.body)return!1;return X==null||typeof X==="string"},c1=function(P){return P.has("x-parent-session-id")},f0=function(P){return P.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(P)},o1=function(P){return P?.quota?.enabled===!0},t1=function(P,X){let z=Date.now();if(f||z<k)return;f=g0(P,X).catch((I)=>{throw k=z+M1(X),I}).finally(()=>{f=null}),f.catch(()=>{})};for(let P of Object.values(Q.models))P.cost={input:0,output:0,cache:{read:0,write:0}};let N=null,x=null,f=null,k=0;async function g(){if(!N)N=(async()=>{let z=null,I=null,v=null;async function O(L){let Y=await A()??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};Y.refresh=Y.refresh??{},L(Y),await v0(Y)}async function F(L){let Y=Date.now()+Ij;while(Date.now()<Y){await new Promise((w)=>setTimeout(w,W1+w1(W1)));let G=await Z();if(G.type!=="oauth"||!G.access)continue;if((G.access!==L.access||G.refresh!==L.refresh||(G.expires??0)>(L.expires??0)+60000)&&(!G.expires||G.expires>Date.now()))return U("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:G.expires?G.expires-Date.now():void 0}),G.access}return null}for(let L=0;L<=2;L++){let Y=null;try{if(L>0){let H=500*2**(L-1);await new Promise((o)=>setTimeout(o,H))}if(Y=await Z(),!Y.refresh)throw Error("Token refresh failed: missing refresh token");let G=await A(),_=Z0(Y.refresh),w=G?.refresh?.mainLastRefreshError;if(U("[refresh] opencode main oauth refresh check",{attempt:L,expiresInMs:Y.expires?Y.expires-Date.now():void 0,hasBackoff:Boolean(w),backoffActive:w?p(w,Y.refresh,Date.now()):!1,retryCount:w?.retryCount,nextRetryAt:w?.nextRetryAt}),w&&p(w,Y.refresh,Date.now()))throw U("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:w.nextRetryAt,retryCount:w.retryCount}),Error(q0(w,Date.now()));if(G?.refresh?.mainRefreshLeaseUntil&&G.refresh.mainRefreshLeaseUntil>Date.now()&&G.refresh.mainRefreshLeaseTokenHash===_){U("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:G.refresh.mainRefreshLeaseUntil});let H=await F(Y);if(H)return H;throw Error("Claude OAuth refresh is already in progress")}let q=await I1({name:"opencode-main-oauth-refresh",ttlMs:120000});if(!q){U("[refresh] opencode main oauth refresh skipped file lock");let H=await F(Y);if(H)return H;throw Error("Claude OAuth refresh is already in progress")}v=q.release,z=Wj(),I=_,await O((H)=>{H.refresh=H.refresh??{},H.refresh.mainRefreshLeaseId=z??void 0,H.refresh.mainRefreshLeaseUntil=Date.now()+120000,H.refresh.mainRefreshLeaseTokenHash=_});let R=await A();if(U("[refresh] opencode main oauth refresh lease acquired",{attempt:L,leaseUntil:Date.now()+120000}),R?.refresh?.mainRefreshLeaseId!==z||R.refresh.mainRefreshLeaseTokenHash!==_)throw Error("Claude OAuth refresh is already in progress");U("[refresh] opencode main oauth refresh request start",{attempt:L});let T=await z1({refreshToken:Y.refresh,maxRetries:0});return await J.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:T.refresh,access:T.access,expires:T.expires}}),await O((H)=>{if(!H?.refresh)return;if(H.refresh.mainLastRefreshError=void 0,H.refresh.mainRefreshLeaseId===z)H.refresh.mainRefreshLeaseId=void 0,H.refresh.mainRefreshLeaseUntil=void 0,H.refresh.mainRefreshLeaseTokenHash=void 0}),U("[refresh] opencode main oauth refresh succeeded",{attempt:L,expiresInMs:T.expires-Date.now()}),T.access}catch(G){let _=G instanceof Error&&(G.message.includes("fetch failed")||("code"in G)&&(G.code==="ECONNRESET"||G.code==="ECONNREFUSED"||G.code==="ETIMEDOUT"||G.code==="UND_ERR_CONNECT_TIMEOUT"));if(L<2&&(_||G instanceof F0&&G.status>=500))continue;U("[refresh] opencode main oauth refresh attempt failed",{attempt:L,error:G instanceof Error?G.message:String(G),transient:_});let w=Y?.refresh;if(w&&G instanceof F0)await O((q)=>{q.refresh=q.refresh??{},q.refresh.mainLastRefreshError=B1({error:G,now:Date.now(),refreshToken:w,previous:q.refresh.mainLastRefreshError})});throw G}finally{if(z)await O((G)=>{if(!G?.refresh)return;if(G.refresh.mainRefreshLeaseId===z&&G.refresh.mainRefreshLeaseTokenHash===I)G.refresh.mainRefreshLeaseId=void 0,G.refresh.mainRefreshLeaseUntil=void 0,G.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await v?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{N=null});return N}$=g,p1();async function y0(P,X){if(!P.body||P.status!==200)return X?.mark("inspect_stream_skip",{status:P.status}),{response:P,rateLimited:!1};if(P.headers.get("x-cortexkit-relay-optimistic")==="true")return X?.mark("inspect_stream_skip",{status:P.status,reason:"optimistic_relay"}),{response:P,rateLimited:!1};let z=M(),I=P.body.getReader(),v=[],O=new TextDecoder,F="",L=0;while(!F.includes(` | ||
| `);for(let D of J1)G=G.replace(D.match,D.replacement);return G.trim()}function T(j){return j!=null&&typeof j==="object"&&!Array.isArray(j)}function Xj(j){let J={type:"text",text:n};if(j==null)return[J];if(typeof j==="string"){let G=a(j);if(G===n)return[J];return[J,{type:"text",text:G}]}if(T(j)){let G=typeof j.type==="string"?j.type:"text",D=typeof j.text==="string"?j.text:"";return[J,{...j,type:G,text:a(D)}]}if(!Array.isArray(j))return[J];let K=j.map((G)=>{if(typeof G==="string")return{type:"text",text:a(G)};if(T(G)&&G.type==="text"&&typeof G.text==="string")return{...G,type:"text",text:a(G.text)};return{type:"text",text:String(G)}});if(K[0]?.text===n)return K;return[J,...K]}var W1={type:"ephemeral",ttl:"1h"};function Wj(j){if(T(j.cache_control))return j.cache_control;if(T(j.cacheControl))return j.cacheControl;return null}function s(j,J){if(!T(j))return!1;return delete j.cacheControl,j.cache_control=J?{...W1}:{type:"ephemeral"},!0}function o0(j){if(!T(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 r(j,J){if(!T(j))return;let K=Wj(j);if(!K||K.type!=="ephemeral")return;if(J)K.ttl="1h";else delete K.ttl}function t0(j,J){if(Array.isArray(j.system))for(let K of j.system)r(K,J);else r(j.system,J);if(!Array.isArray(j.messages))return;for(let K of j.messages)if(r(K,J),T(K)&&Array.isArray(K.content))for(let G of K.content)r(G,J)}function wj(j,J){if(Array.isArray(j.system))for(let K of j.system)J(K);else J(j.system);if(!Array.isArray(j.messages))return;for(let K of j.messages)if(J(K),T(K)&&Array.isArray(K.content))for(let G of K.content)J(G)}function Y1(j){o0(j),wj(j,o0)}function zj(j){Y1(j),j.cache_control={...W1}}function B0(j){if(!T(j))return!1;let J=Yj(j.content);if(!J?.length)return s(j,!0);j.content=J;let K=[...J].reverse().find((G)=>T(G)&&G.type!=="thinking");return s(K??j,!0)}function Ij(j){if(Y1(j),Array.isArray(j.system)){let K=j.system.findIndex((V)=>T(V)&&V.text===n),G=j.system.slice(K>=0?K+1:0).filter(T),D=G[G.length-1];s(D,!0)}else s(j.system,!0);if(!Array.isArray(j.messages))return;B0(j.messages[0]),B0(j.messages[1]);let J=j.messages.length-2;if(J>1)B0(j.messages[J])}function Qj(j,J){if(!J.enabled){t0(j,!1),delete j.cache_control,delete j.cacheControl;return}if(J.mode==="automatic"){zj(j);return}if(J.mode==="hybrid"){Ij(j);return}t0(j,!0),delete j.cacheControl}async function w1(j,J={}){try{let K=JSON.parse(j),G=Array.isArray(K.messages)&&K.messages.some((D)=>D.role==="user")?Z1(K.messages,void 0,e0):null;if(K.system=Xj(K.system),G&&Array.isArray(K.system))K.system.unshift({type:"text",text:G});if(Qj(K,{enabled:J.cache1hEnabled??!1,mode:J.cache1hMode??"explicit"}),J.fastModeEnabled&&j0(K.model))K.speed="fast";else if(K.speed==="fast")delete K.speed;if(J.identity)$1(K,J.identity);return await K1(Vj(K))}catch{return j}}function J0(j){if(!j.body)return j;let J=j.body.getReader(),K=new TextDecoder,G=new TextEncoder,D="",V=new ReadableStream({async pull(v){let{done:R,value:y}=await J.read();if(R){let i=c0(`${D}${K.decode()}`,!0);if(i.ready)v.enqueue(G.encode(i.ready));v.close();return}let L0=D+K.decode(y,{stream:!0}),u=c0(L0);if(D=u.pending,u.ready)v.enqueue(G.encode(u.ready))}});return new Response(V,{status:j.status,statusText:j.statusText,headers:j.headers})}var Lj="__OPENCODE_ANTHROPIC_AUTH_COMMAND_HANDLED__",Nj=60000,_j=60000,Bj=5000,z1=200,l1=240,Mj=l1,vj=1,I1=!1;function O0(){return process.env.OPENCODE_ANTHROPIC_AUTH_PERF==="1"}function B(){return performance.now()}function E(j){return Math.round(j*10)/10}function Q1(j){return Math.floor(Math.random()*Math.max(0,j))}function Fj(){if(I1||!1||!O0())return;I1=!0;let j=100,J=250,K=B()+j;setInterval(()=>{let G=B(),D=G-K;if(K=G+j,D<J)return;q("[perf] opencode event_loop_lag",{lagMs:E(D),thresholdMs:J})},j).unref?.()}function Uj(j){let J=B(),K={requestId:String(vj++),start:J,last:J,mark(G,D){let V=B();if(O0())q("[perf] opencode request stage",{requestId:K.requestId,stage:G,deltaMs:E(V-K.last),totalMs:E(V-K.start),...D});K.last=V},done(G,D){let V=B();if(O0())q("[perf] opencode request done",{requestId:K.requestId,stage:G,deltaMs:E(V-K.last),totalMs:E(V-K.start),...D});K.last=V}};if(O0())q("[perf] opencode request start",{requestId:K.requestId,...j});return K}async function h(j,J,K){let G=j.client.session,D=await l0(j.client,J),V={path:{id:J},body:{noReply:!0,parts:[{type:"text",text:K,ignored:!0}]}};if(D?.agent)V.body.agent=D.agent;if(D?.model)V.body.model=D.model;if(D?.variant)V.body.variant=D.variant;if(typeof G?.promptAsync==="function"){await G.promptAsync(V);return}if(typeof G?.prompt==="function"){await Promise.resolve(G.prompt(V));return}throw Error("OpenCode session prompt API is unavailable for ignored replies.")}function d(){throw Error(Lj)}var Tj=async(j)=>{Fj();let{client:J}=j,K=new q1;K.startBackgroundRefresh();let G=null,D=new y1({loadStorage:()=>C(),prepareHeaders:async(Z,w)=>{if(!R)return Z;let Y=await R();if(Y.type!=="oauth")return Z;if(!Y.access||Y.expires&&Y.expires<Date.now()){if(!G)return Z;Y.access=await G()}if(!Y.access)return Z;try{let L=JSON.parse(w.bodyText),S=await R0(Y.access,typeof L.model==="string"?L.model:void 0);if(Z.delete("anthropic-beta"),l(Z,Y.access,{body:L,identity:S}),Z.set("anthropic-beta",e(Z.get("anthropic-beta"),[E1])),L.speed==="fast")M0(Z)}catch{l(Z,Y.access)}return Z},log:q}),V=await C(),v=d1(V);c({enabled:K0(V),mode:Z0(V)}),Y0(x0(V)),z0(q0(V));let R=null,y=null;function L0(Z){let w=Z?.refresh?.refreshBeforeExpiryMinutes??Mj;return Math.max(l1,w)*60000}function u(Z){return Z?.refresh?.enabled!==!1}async function i(Z){if(!Z)return;let w=await C(),Y=w?.refresh?.mainLastRefreshError;if(!w?.refresh||!Y?.tokenHash)return;let L=$0(Z);if(Y.tokenHash===L)return;if(Y.nextRetryAt&&Y.nextRetryAt>Date.now()){q("[refresh] opencode main oauth keeping backoff despite token rotation",{nextRetryAt:Y.nextRetryAt,retryCount:Y.retryCount,remainingMs:Y.nextRetryAt-Date.now()});return}w.refresh.mainLastRefreshError=void 0,await H0(w),q("[refresh] opencode main oauth cleared stale backoff after token rotation",{previousCheckedAt:Y.checkedAt,previousNextRetryAt:Y.nextRetryAt,previousRetryCount:Y.retryCount})}async function p1(){let Z=[];if(R)try{let L=await R();if(L.type==="oauth"&&L.access)Z.push({name:"OpenCode anthropic",role:"main",quota:await A0({accessToken:L.access})});else if(L.type==="oauth")Z.push({name:"OpenCode anthropic",role:"main",error:"missing access token; send a request first or reconnect auth"})}catch(L){Z.push({name:"OpenCode anthropic",role:"main",error:L instanceof Error?L.message:String(L)})}let{storage:w,errors:Y}=await K.refreshQuotaForAllAccounts();if(Z.push(...b1(w,new Map(Y.map((L)=>[L.accountId,L.message])))),!R)Z.unshift({name:"OpenCode anthropic",role:"main",error:"auth loader has not run yet; send a request first"});return h1({accounts:Z,refreshedAt:Date.now()})}async function c1(Z){let w=S1(Z);if(w.type==="enable"||w.type==="disable"){let f=w.type==="enable",k=await N1(f),g=Z0(k);return c({enabled:f,mode:g}),P0({argumentsText:Z,enabled:f,mode:g})}if(w.type==="mode"){let f=await _1(w.mode),k=K0(f);return c({enabled:k,mode:w.mode}),P0({argumentsText:Z,enabled:k,mode:w.mode})}let Y=await C(),L=K0(Y),S=Z0(Y);return c({enabled:L,mode:S}),P0({argumentsText:Z,enabled:L,mode:S})}async function o1(Z){let w=C1(Z),Y=await C();if(w.type==="window")Y=await v1(w.startHour,w.endHour);else if(w.type==="disable")Y=await F1(!1);let L=A1(Y),S=D.stats(L);return f1({argumentsText:Z,enabled:R1(Y),window:L,hybridActive:T1(Y),trackedSessions:S.trackedSessions,nextPrewarmAt:S.nextPrewarmAt})}async function t1(Z){let w=k1(Z);if(w.type==="enable"||w.type==="disable"){let S=w.type==="enable";return await B1(S),Y0(S),T0({argumentsText:Z,enabled:S})}let Y=await C(),L=x0(Y);return Y0(L),T0({argumentsText:Z,enabled:L})}async function a1(Z){let w=m1(Z);if(w.type==="enable"||w.type==="disable"){let S=w.type==="enable";return await M1(S),z0(S),f0({argumentsText:Z,enabled:S})}let Y=await C(),L=q0(Y);return z0(L),f0({argumentsText:Z,enabled:L})}async function r1(Z){let w=n1(Z);if(w.type==="mode")return await i1(w.mode),k0({argumentsText:Z,mode:w.mode});let Y=await C();return k0({argumentsText:Z,mode:y0(Y)})}return{config:async(Z)=>{Z.command={...Z.command??{},[G0]:{template:G0,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."},[I0]:{template:I0,description:"Show current Claude OAuth quota usage for all accounts."},[W0]:{template:W0,description:"Show or toggle Anthropic request dump capture for debugging."},[w0]:{template:w0,description:"Show or toggle Anthropic fast mode for supported Opus models."},[Q0]:{template:Q0,description:"Show or change Claude account routing between main-first and fallback-first."}}},"command.execute.before":async(Z)=>{if(Z.command===G0)await h(j,Z.sessionID,await c1(Z.arguments)),d();if(Z.command===X0)await h(j,Z.sessionID,await o1(Z.arguments)),d();if(Z.command===I0)await h(j,Z.sessionID,await p1()),d();if(Z.command===W0)await h(j,Z.sessionID,await t1(Z.arguments)),d();if(Z.command===w0)await h(j,Z.sessionID,await a1(Z.arguments)),d();if(Z.command===Q0)await h(j,Z.sessionID,await r1(Z.arguments)),d()},auth:{provider:"anthropic",async loader(Z,w){if(R=Z,(await Z()).type==="oauth"){let s1=function(){if(y)clearInterval(y),y=null;let P=async()=>{try{let X=await C();if(!u(X))return;let I=await Z();if(I.type!=="oauth")return;if(await i(I.refresh),!I.expires)return;let W=I.expires-Date.now(),x=L0(X);if(W>x)return;if(q("[refresh] opencode main oauth background due",{expiresInMs:W,refreshBeforeMs:x}),I.refresh&&p(X?.refresh?.mainLastRefreshError,I.refresh,Date.now())){q("[refresh] opencode main oauth background skipped backoff",{nextRetryAt:X?.refresh?.mainLastRefreshError?.nextRetryAt,retryCount:X?.refresh?.mainLastRefreshError?.retryCount,expiresInMs:W});return}if(I.refresh&&X?.refresh?.mainRefreshLeaseUntil&&X.refresh.mainRefreshLeaseUntil>Date.now()&&X.refresh.mainRefreshLeaseTokenHash===$0(I.refresh))return;await g();let Q=await Z();q("[refresh] opencode main oauth refreshed in background",{newExpiresInMs:Q.expires?Q.expires-Date.now():void 0})}catch(X){q("[refresh] opencode main oauth refresh failed",{message:X instanceof Error?X.message:String(X)})}};if(y=setInterval(()=>{P()},Nj+Q1(_j)),"unref"in y)y.unref()},g0=function(P,X){if(P instanceof Request&&P.body)return!1;return X==null||typeof X==="string"},e1=function(P){return P.has("x-parent-session-id")},m0=function(P){return P.includes("rate_limit_error")||/exceed your account'?s rate limit/i.test(P)},jj=function(P){return P?.quota?.enabled===!0},Jj=function(P,X){let I=Date.now();if(f||I<k)return;f=d0(P,X).catch((W)=>{throw k=I+H1(X),W}).finally(()=>{f=null}),f.catch(()=>{})};for(let P of Object.values(w.models))P.cost={input:0,output:0,cache:{read:0,write:0}};let L=null,S=null,f=null,k=0;async function g(){if(!L)L=(async()=>{let I=null,W=null,x=null;async function Q(z){let O=await C()??{version:1,main:{type:"opencode",provider:"anthropic"},accounts:[]};O.refresh=O.refresh??{},z(O),await H0(O)}async function F(z){let O=Date.now()+Bj;while(Date.now()<O){await new Promise((_)=>setTimeout(_,z1+Q1(z1)));let $=await Z();if($.type!=="oauth"||!$.access)continue;if(($.access!==z.access||$.refresh!==z.refresh||($.expires??0)>(z.expires??0)+60000)&&(!$.expires||$.expires>Date.now()))return q("[refresh] opencode main oauth joined concurrent refresh",{expiresInMs:$.expires?$.expires-Date.now():void 0}),$.access}return null}for(let z=0;z<=2;z++){let O=null;try{if(z>0){let U=500*2**(z-1);await new Promise((o)=>setTimeout(o,U))}if(O=await Z(),!O.refresh)throw Error("Token refresh failed: missing refresh token");let $=await C(),M=$0(O.refresh),_=$?.refresh?.mainLastRefreshError;if(q("[refresh] opencode main oauth refresh check",{attempt:z,expiresInMs:O.expires?O.expires-Date.now():void 0,hasBackoff:Boolean(_),backoffActive:_?p(_,O.refresh,Date.now()):!1,retryCount:_?.retryCount,nextRetryAt:_?.nextRetryAt}),_&&p(_,O.refresh,Date.now()))throw q("[refresh] opencode main oauth refresh skipped backoff",{nextRetryAt:_.nextRetryAt,retryCount:_.retryCount}),Error(E0(_,Date.now()));if($?.refresh?.mainRefreshLeaseUntil&&$.refresh.mainRefreshLeaseUntil>Date.now()&&$.refresh.mainRefreshLeaseTokenHash===M){q("[refresh] opencode main oauth refresh skipped lease",{leaseUntil:$.refresh.mainRefreshLeaseUntil});let U=await F(O);if(U)return U;throw Error("Claude OAuth refresh is already in progress")}let N=await L1({name:"opencode-main-oauth-refresh",ttlMs:120000});if(!N){q("[refresh] opencode main oauth refresh skipped file lock");let U=await F(O);if(U)return U;throw Error("Claude OAuth refresh is already in progress")}x=N.release,I=Oj(),W=M,await Q((U)=>{U.refresh=U.refresh??{},U.refresh.mainRefreshLeaseId=I??void 0,U.refresh.mainRefreshLeaseUntil=Date.now()+120000,U.refresh.mainRefreshLeaseTokenHash=M});let H=await C();if(q("[refresh] opencode main oauth refresh lease acquired",{attempt:z,leaseUntil:Date.now()+120000}),H?.refresh?.mainRefreshLeaseId!==I||H.refresh.mainRefreshLeaseTokenHash!==M)throw Error("Claude OAuth refresh is already in progress");q("[refresh] opencode main oauth refresh request start",{attempt:z});let A=await O1({refreshToken:O.refresh,maxRetries:0});return await J.auth.set({path:{id:"anthropic"},body:{type:"oauth",refresh:A.refresh,access:A.access,expires:A.expires}}),await Q((U)=>{if(!U?.refresh)return;if(U.refresh.mainLastRefreshError=void 0,U.refresh.mainRefreshLeaseId===I)U.refresh.mainRefreshLeaseId=void 0,U.refresh.mainRefreshLeaseUntil=void 0,U.refresh.mainRefreshLeaseTokenHash=void 0}),q("[refresh] opencode main oauth refresh succeeded",{attempt:z,expiresInMs:A.expires-Date.now()}),A.access}catch($){let M=$ instanceof Error&&($.message.includes("fetch failed")||("code"in $)&&($.code==="ECONNRESET"||$.code==="ECONNREFUSED"||$.code==="ETIMEDOUT"||$.code==="UND_ERR_CONNECT_TIMEOUT"));if(z<2&&(M||$ instanceof v0&&$.status>=500))continue;q("[refresh] opencode main oauth refresh attempt failed",{attempt:z,error:$ instanceof Error?$.message:String($),transient:M});let _=O?.refresh;if(_&&$ instanceof v0)await Q((N)=>{N.refresh=N.refresh??{},N.refresh.mainLastRefreshError=U1({error:$,now:Date.now(),refreshToken:_,previous:N.refresh.mainLastRefreshError})});throw $}finally{if(I)await Q(($)=>{if(!$?.refresh)return;if($.refresh.mainRefreshLeaseId===I&&$.refresh.mainRefreshLeaseTokenHash===W)$.refresh.mainRefreshLeaseId=void 0,$.refresh.mainRefreshLeaseUntil=void 0,$.refresh.mainRefreshLeaseTokenHash=void 0}).catch(()=>{});await x?.().catch(()=>{})}}throw Error("Token refresh exhausted all retries")})().finally(()=>{L=null});return L}G=g,s1();async function b0(P,X){if(!P.body||P.status!==200)return X?.mark("inspect_stream_skip",{status:P.status}),{response:P,rateLimited:!1};if(P.headers.get("x-cortexkit-relay-optimistic")==="true")return X?.mark("inspect_stream_skip",{status:P.status,reason:"optimistic_relay"}),{response:P,rateLimited:!1};let I=B(),W=P.body.getReader(),x=[],Q=new TextDecoder,F="",z=0;while(!F.includes(` | ||
| `)&&F.length<65536){let{done:G,value:_}=await I.read();if(G)break;if(v.push(_),L+=_.byteLength,F+=O.decode(_,{stream:!0}),f0(F))break}if(f0(F))return await I.cancel().catch(()=>{}),X?.mark("inspect_stream_first_event",{ms:S(M()-z),bytes:L,rateLimited:!0}),{response:P,rateLimited:!0};let Y=new ReadableStream({start(G){for(let _ of v)G.enqueue(_)},async pull(G){let{done:_,value:w}=await I.read();if(_){G.close();return}G.enqueue(w)},cancel(G){return I.cancel(G)}});return X?.mark("inspect_stream_first_event",{ms:S(M()-z),bytes:L,rateLimited:!1}),{response:new Response(Y,{status:P.status,statusText:P.statusText,headers:P.headers}),rateLimited:!1}}async function k0(P,X,z,I,v="unknown"){let O=M(),F=$1(P,X),L=F.get("x-session-affinity")||F.get("x-opencode-session"),Y=c1(F);F.delete("x-parent-session-id"),F.delete("x-session-affinity"),F.delete("x-opencode-session");let G=X?.body,_;if(G&&typeof G==="string")try{let b=JSON.parse(G);if(typeof b.model==="string")_=b.model}catch{}let w=await E0(z,_),q=typeof G==="string"?G.length:void 0;if(G&&typeof G==="string"){let b=M(),t=(()=>{if(!f1())return!1;try{return j0(JSON.parse(G).model)}catch{return!1}})();G=await X1(G,{cache1hEnabled:!Y&&G0(),cache1hMode:D0(),fastModeEnabled:t,identity:w});try{l(F,z,{body:JSON.parse(G),identity:w})}catch{l(F,z,{identity:w})}if(t)N0(F);I?.mark("rewrite_body",{route:v,ms:S(M()-b),originalBytes:q,rewrittenBytes:G.length,cacheEnabled:!Y&&G0(),cacheMode:D0(),fastModeEnabled:t,subagent:Y})}let R=D1(P);if(v==="main"&&typeof G==="string"&&!Y&&G0()&&D0()==="hybrid"){let b=await A();if((await D.track({sessionId:L,url:R.url?.toString()??R.input.toString(),headers:F,bodyText:G,storage:b,cacheMode:"hybrid"})).tracked)I?.mark("cachekeep_track",{session:L})}let T=()=>fetch(R.input,{...X,body:G,headers:F,...G1()&&{tls:{rejectUnauthorized:!1}}}),H=M(),o=await m1({config:B,input:R.input,init:X,headers:F,body:G,fallback:T,affinity:L,optimisticResponse:B?.transport==="websocket"});return I?.mark("send_headers_received",{route:v,ms:S(M()-H),status:o.status,relayConfigured:B!=null,totalSendWithAccessMs:S(M()-O)}),o}async function g0(P,X){let z=Date.now(),I=await A0({accessToken:P});return x={accessToken:P,refreshAfter:v1(I,X,z),quota:I},I}async function a1(P,X){let z=Date.now();if(x?.accessToken!==P)return await g0(P,X);if(z>=x.refreshAfter)t1(P,X);return x.quota}async function b0(P,X,z,I,v,O){if(!z.length)return v??null;await v?.body?.cancel().catch(()=>{});let F=v??null;for(let[L,Y]of z.entries()){let G=Y.access;if(!G)continue;let _=await k0(P,X,G,O,`fallback_${L}`);F=_;let w=H0(_.status,I);if(!w){let q=await y0(_,O);_=q.response,F=_,w=q.rateLimited}if(!w)return await K.markUsed(Y),_;if(L<z.length-1)await _.body?.cancel().catch(()=>{})}return F}async function r1(P,X,z,I,v,O){if(!T0(P,X?.body))return z;let F=M(),L=O??await A();v?.mark("fallback_load_storage",{ms:S(M()-F),cached:!!O});let Y=z,G=H0(Y.status,L);if(!G){let w=await y0(Y,v);Y=w.response,G=w.rateLimited}if(!G)return Y;let _=I;if(!_){let w=M();_=await K.getUsableFallbackAccounts(),v?.mark("fallback_get_accounts",{ms:S(M()-w),accounts:_.length})}return await b0(P,X,_,L,Y,v)??Y}return{apiKey:"",async fetch(P,X){let z=X?.body,I=Nj({bodyBytes:typeof z==="string"?z.length:void 0,relayConfigured:B!=null}),v=M(),O=await Z();if(I.mark("get_auth",{ms:S(M()-v),authType:O.type,hasAccess:Boolean(O.access)}),O.type!=="oauth"){let w=await fetch(P,X);return I.done("non_oauth_passthrough",{status:w.status}),w}if(await u(O.refresh),!O.access||!O.expires||O.expires<Date.now()){let q=(await A())?.refresh?.mainLastRefreshError;if(O.refresh&&q&&p(q,O.refresh,Date.now()))throw U("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:q.nextRetryAt,retryCount:q.retryCount,expiresInMs:O.expires?O.expires-Date.now():void 0}),Error(q0(q,Date.now()));U("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(O.access),expiresInMs:O.expires?O.expires-Date.now():void 0,expiredAgoMs:O.expires&&O.expires<Date.now()?Date.now()-O.expires:void 0});let R=M();O.access=await g(),I.mark("refresh_main_access",{ms:S(M()-R)})}if(!O.access)throw I.done("missing_access_error"),Error("OAuth access token is missing after refresh");let F=M(),L=await A();I.mark("load_storage",{ms:S(M()-F)});let Y;if(T0(P,X?.body)&&o1(L))try{let w=M(),q=await a1(O.access,L);if(I.mark("main_quota_for_routing",{ms:S(M()-w),passes:S0(q,L)}),!S0(q,L)){let R=M();Y=await K.getUsableFallbackAccounts(),I.mark("preselect_fallback_accounts",{ms:S(M()-R),accounts:Y.length});let T=await b0(P,X,Y,L,void 0,I);if(T)return I.done("return_preselected_fallback",{status:T.status}),_0(T)}}catch(w){I.mark("main_quota_for_routing_error",{error:w instanceof Error?w.message:String(w)})}let G=await k0(P,X,O.access,I,"main"),_=await r1(P,X,G,Y,I,L);return I.done("return_response",{status:_.status}),_0(_)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let Z=await B0("max");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(Q)=>{return M0(Q,Z.verifier,Z.redirectUri,Z.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let Z=await B0("console");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(Q)=>{let W=await M0(Q,Z.verifier,Z.redirectUri,Z.state);if(W.type==="failed")return W;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 ${W.access}`}}).then((x)=>x.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{qj as AnthropicAuthPlugin}; | ||
| `)&&F.length<65536){let{done:$,value:M}=await W.read();if($)break;if(x.push(M),z+=M.byteLength,F+=Q.decode(M,{stream:!0}),m0(F))break}if(m0(F))return await W.cancel().catch(()=>{}),X?.mark("inspect_stream_first_event",{ms:E(B()-I),bytes:z,rateLimited:!0}),{response:P,rateLimited:!0};let O=new ReadableStream({start($){for(let M of x)$.enqueue(M)},async pull($){let{done:M,value:_}=await W.read();if(M){$.close();return}$.enqueue(_)},cancel($){return W.cancel($)}});return X?.mark("inspect_stream_first_event",{ms:E(B()-I),bytes:z,rateLimited:!1}),{response:new Response(O,{status:P.status,statusText:P.statusText,headers:P.headers}),rateLimited:!1}}async function h0(P,X,I,W,x="unknown"){let Q=B(),F=V1(P,X),z=F.get("x-session-affinity")||F.get("x-opencode-session"),O=e1(F);F.delete("x-parent-session-id"),F.delete("x-session-affinity"),F.delete("x-opencode-session");let $=X?.body,M;if($&&typeof $==="string")try{let m=JSON.parse($);if(typeof m.model==="string")M=m.model}catch{}let _=await R0(I,M),N=typeof $==="string"?$.length:void 0;if($&&typeof $==="string"){let m=B(),t=(()=>{if(!g1())return!1;try{return j0(JSON.parse($).model)}catch{return!1}})();$=await w1($,{cache1hEnabled:!O&&D0(),cache1hMode:V0(),fastModeEnabled:t,identity:_});try{l(F,I,{body:JSON.parse($),identity:_})}catch{l(F,I,{identity:_})}if(t)M0(F);W?.mark("rewrite_body",{route:x,ms:E(B()-m),originalBytes:N,rewrittenBytes:$.length,cacheEnabled:!O&&D0(),cacheMode:V0(),fastModeEnabled:t,subagent:O})}let H=X1(P);if(x==="main"&&typeof $==="string"&&!O&&D0()&&V0()==="hybrid"){let m=await C();if((await D.track({sessionId:z,url:H.url?.toString()??H.input.toString(),headers:F,bodyText:$,storage:m,cacheMode:"hybrid"})).tracked)W?.mark("cachekeep_track",{session:z})}let A=()=>fetch(H.input,{...X,body:$,headers:F,...P1()&&{tls:{rejectUnauthorized:!1}}}),U=B(),o=await u1({config:v,input:H.input,init:X,headers:F,body:$,fallback:A,affinity:z,optimisticResponse:v?.transport==="websocket"});return W?.mark("send_headers_received",{route:x,ms:E(B()-U),status:o.status,relayConfigured:v!=null,totalSendWithAccessMs:E(B()-Q)}),o}async function d0(P,X){let I=Date.now(),W=await A0({accessToken:P});return S={accessToken:P,refreshAfter:x1(W,X,I),quota:W},W}async function Kj(P,X){let I=Date.now();if(S?.accessToken!==P)return await d0(P,X);if(I>=S.refreshAfter)Jj(P,X);return S.quota}async function N0(P,X,I,W,x,Q,F){if(!I.length)return x??null;let z=F?.returnLastOnExhausted??!0;await x?.body?.cancel().catch(()=>{});let O=x??null;for(let[$,M]of I.entries()){let _=M.access;if(!_)continue;let N=await h0(P,X,_,Q,`fallback_${$}`);O=N;let H=S0(N.status,W);if(!H){let A=await b0(N,Q);N=A.response,O=N,H=A.rateLimited}if(!H)return await K.markUsed(M),N;if($<I.length-1||!z)await N.body?.cancel().catch(()=>{})}return z?O:null}async function Zj(P,X,I,W,x,Q){if(!g0(P,X?.body))return I;let F=B(),z=Q??await C();x?.mark("fallback_load_storage",{ms:E(B()-F),cached:!!Q});let O=I,$=S0(O.status,z);if(!$){let _=await b0(O,x);O=_.response,$=_.rateLimited}if(!$)return O;let M=W;if(!M){let _=B();M=await K.getUsableFallbackAccounts(),x?.mark("fallback_get_accounts",{ms:E(B()-_),accounts:M.length})}return await N0(P,X,M,z,O,x)??O}return{apiKey:"",async fetch(P,X){let I=X?.body,W=Uj({bodyBytes:typeof I==="string"?I.length:void 0,relayConfigured:v!=null}),x=B(),Q=await Z();if(W.mark("get_auth",{ms:E(B()-x),authType:Q.type,hasAccess:Boolean(Q.access)}),Q.type!=="oauth"){let N=await fetch(P,X);return W.done("non_oauth_passthrough",{status:N.status}),N}await i(Q.refresh);let F=B(),z=await C();W.mark("load_storage",{ms:E(B()-F)});let O=g0(P,X?.body),$;if(O&&y0(z)==="fallback-first")try{let N=B();$=await K.getUsableFallbackAccounts(z),W.mark("fallback_first_get_accounts",{ms:E(B()-N),accounts:$.length});let H=await N0(P,X,$,z,void 0,W,{returnLastOnExhausted:!1});if(H)return W.done("return_fallback_first",{status:H.status}),J0(H);$=[]}catch(N){W.mark("fallback_first_error",{error:N instanceof Error?N.message:String(N)})}if(!Q.access||!Q.expires||Q.expires<Date.now()){let H=(await C())?.refresh?.mainLastRefreshError;if(Q.refresh&&H&&p(H,Q.refresh,Date.now()))throw q("[refresh] opencode main oauth request skipped backoff",{nextRetryAt:H.nextRetryAt,retryCount:H.retryCount,expiresInMs:Q.expires?Q.expires-Date.now():void 0}),Error(E0(H,Date.now()));q("[refresh] opencode main oauth refresh required for request",{hasAccess:Boolean(Q.access),expiresInMs:Q.expires?Q.expires-Date.now():void 0,expiredAgoMs:Q.expires&&Q.expires<Date.now()?Date.now()-Q.expires:void 0});let A=B();Q.access=await g(),W.mark("refresh_main_access",{ms:E(B()-A)})}if(!Q.access)throw W.done("missing_access_error"),Error("OAuth access token is missing after refresh");if(O&&jj(z))try{let N=B(),H=await Kj(Q.access,z);if(W.mark("main_quota_for_routing",{ms:E(B()-N),passes:C0(H,z)}),!C0(H,z)){let A=B();$=await K.getUsableFallbackAccounts(),W.mark("preselect_fallback_accounts",{ms:E(B()-A),accounts:$.length});let U=await N0(P,X,$,z,void 0,W);if(U)return W.done("return_preselected_fallback",{status:U.status}),J0(U)}}catch(N){W.mark("main_quota_for_routing_error",{error:N instanceof Error?N.message:String(N)})}let M=await h0(P,X,Q.access,W,"main"),_=await Zj(P,X,M,$,W,z);return W.done("return_response",{status:_.status}),J0(_)}}}return{}},methods:[{label:"Claude Pro/Max",type:"oauth",authorize:async()=>{let Z=await F0("max");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(w)=>{return U0(w,Z.verifier,Z.redirectUri,Z.state)}}}},{label:"Create an API Key",type:"oauth",authorize:async()=>{let Z=await F0("console");return{url:Z.url,instructions:"Paste the authorization code here:",method:"code",callback:async(w)=>{let Y=await U0(w,Z.verifier,Z.redirectUri,Z.state);if(Y.type==="failed")return Y;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 ${Y.access}`}}).then((S)=>S.json())).raw_key}}}}},{provider:"anthropic",label:"Manually enter API Key",type:"api"}]}}};export{Tj as AnthropicAuthPlugin}; |
+2
-2
| { | ||
| "name": "@cortexkit/opencode-anthropic-auth", | ||
| "version": "1.2.5", | ||
| "version": "1.3.0", | ||
| "type": "module", | ||
@@ -44,4 +44,4 @@ "repository": { | ||
| "dependencies": { | ||
| "@cortexkit/anthropic-auth-core": "1.2.5" | ||
| "@cortexkit/anthropic-auth-core": "1.3.0" | ||
| } | ||
| } |
+9
-3
@@ -22,3 +22,3 @@ # CortexKit Anthropic Auth for OpenCode and Pi | ||
| | Sidecar config | `~/.config/opencode/anthropic-auth.json` | `~/.pi/agent/anthropic-auth.json` | | ||
| | Commands | `/claude-cache`, `/claude-cachekeep`, `/claude-fast`, `/claude-quota`, `/claude-dump` | `/claude-cache`, `/claude-cachekeep`, `/claude-fast`, `/claude-quota`, `/claude-dump` | | ||
| | Commands | `/claude-cache`, `/claude-cachekeep`, `/claude-routing`, `/claude-fast`, `/claude-quota`, `/claude-dump` | `/claude-cache`, `/claude-cachekeep`, `/claude-routing`, `/claude-fast`, `/claude-quota`, `/claude-dump` | | ||
| | Fallback accounts, quota routing, relay, dumps, fast mode | Supported | Supported through the same shared core and Pi sidecar | | ||
@@ -29,2 +29,3 @@ | ||
| - **Fallback Claude accounts**: keep each agent's normal Anthropic login as the primary account, then route to ordered fallback OAuth accounts on auth/quota/rate-limit failures. | ||
| - **Routing mode toggle**: use `/claude-routing fallback-first` to prefer sidecar fallback accounts before the main account. | ||
| - **Quota-aware routing**: skip main or fallback accounts when their 5-hour or 7-day Claude quota falls below your configured minimum. | ||
@@ -160,2 +161,5 @@ - **Persistent Claude cache controls**: manage Anthropic 1-hour prompt caching from `/claude-cache` with explicit, automatic, or hybrid modes. | ||
| "fallbackOn": [401, 403, 429], | ||
| "routing": { | ||
| "mode": "main-first" | ||
| }, | ||
| "refresh": { | ||
@@ -201,8 +205,10 @@ "enabled": true, | ||
| The `claudeCache` block controls the `/claude-cache` command's persisted mode, `cacheKeep` controls `/claude-cachekeep`, and `claudeFast` controls `/claude-fast`. The `main` field identifies OpenCode's primary auth entry; Pi keeps primary OAuth credentials in Pi's own credential store, but uses the same sidecar shape for CortexKit settings and fallback accounts. | ||
| The `routing` block controls `/claude-routing`, `claudeCache` controls `/claude-cache`, `cacheKeep` controls `/claude-cachekeep`, and `claudeFast` controls `/claude-fast`. The `main` field identifies OpenCode's primary auth entry; Pi keeps primary OAuth credentials in Pi's own credential store, but uses the same sidecar shape for CortexKit settings and fallback accounts. | ||
| ## Fallback accounts | ||
| Fallback accounts are separate Claude OAuth accounts managed by this plugin. The main account is tried first unless quota policy says it is currently unusable. Fallbacks are then tried in sidecar order when the primary request returns a configured fallback status. | ||
| Fallback accounts are separate Claude OAuth accounts managed by this plugin. By default, the main account is tried first unless quota policy says it is currently unusable. Fallbacks are then tried in sidecar order when the primary request returns a configured fallback status. | ||
| Use `/claude-routing fallback-first` to prefer usable fallback accounts before the main account. Use `/claude-routing main-first` to restore the default. The command persists `routing.mode` and takes effect on the next request without restarting. | ||
| Default fallback statuses: | ||
@@ -209,0 +215,0 @@ |
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
134881
2.13%752
1.76%566
1.07%+ Added
- Removed