@cortexkit/opencode-anthropic-auth 2.2.8 → 2.3.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/v2/server.js CHANGED
@@ -1,13 +1,13 @@
1
- import{a as k2,b as u$,c as c$,d as B$,e as H$,f as D2,g as R2,h as U$,i as K$,j as M$,k as o$,l as z$,m as _$,n as F$,o as C$,p as N$,q as e$}from"../index-0jd4jg49.js";import"../index-sg0knfec.js";import"../index-c8ehrd0p.js";import{v as a$}from"../index-nm4pjrt8.js";import{w as b2,x as w2,z as s$}from"../index-m4dazzyf.js";import"../index-naff9h33.js";import"../index-j6x60aqq.js";import"../index-bcp23wwb.js";import"../index-71temqvq.js";import{acquireNativeAccountRuntime as bJ,authorize as wJ,createNativeUi as yJ,disconnectNativeVaultForHost as IJ,exchange as fJ,logger as r$,readNativeEnrollmentMode as gJ,resolveNativePoolPaths as vJ}from"@cortexkit/anthropic-auth-core";class E2 extends Error{kind;providerID;sessionID;requestKind;constructor($){super($.message??`${$.providerID} ${$.requestKind} request refused (${$.kind})`);this.name="OpenCode2AuthError",this.kind=$.kind,this.providerID=$.providerID,this.sessionID=$.sessionID,this.requestKind=$.requestKind}}function M2($){return`common-auth-placeholder.${$}`}function X$($){let X=M2($.integrationID);return{type:"oauth",methodID:$.methodID,access:X,refresh:X,expires:$.now+31536000000,metadata:{["commonAuthPlaceholder"]:!0}}}function m2($,X){if($?.type!=="oauth")return!1;let M=X===void 0?void 0:M2(X),V=(L)=>M===void 0?L.startsWith("common-auth-placeholder."):L===M;return V($.access)&&V($.refresh)}var Z$="No browser sign-in: this connects the plugin to the accounts in its vault.";async function l2($,X){let M=X.now??Date.now,{integrationID:V}=X,L=(T)=>X$({integrationID:V,methodID:T,now:M()}),N=async(T,K)=>{return await X.onLogin(T,{integrationID:V,methodID:K}),L(K)},P=(T)=>async(K)=>{let Y=T.method.id,H=await T.authorize(K),W={url:H.url,instructions:H.instructions,...H.expiresAt===void 0?{}:{expiresAt:H.expiresAt}};if(H.mode==="auto")return{...W,mode:"auto",callback:H.callback.then((E)=>N(E,Y))};let U=H.callback;return{...W,mode:"code",callback:async(E)=>N(await U(E),Y)}};return $.integration.transform((T)=>{let K=X.label===void 0?{}:{label:()=>X.label};for(let W of X.methods)T.method.update({integrationID:V,method:W.method,authorize:P(W),refresh:async(U)=>{if(!m2(U,V))throw Error("This login method refreshes only its pool placeholder; sign in again with the plugin's login method.");return L(U.methodID)},...K});let Y=X.vault;if(Y===void 0)return;let H=Y.method.id;T.method.update({integrationID:V,method:Y.method,authorize:async()=>({url:"",instructions:Y.instructions??Z$,mode:"auto",callback:Promise.resolve().then(()=>Y.activate({integrationID:V,methodID:H})).then(()=>L(H))}),refresh:async(W)=>{if(!m2(W,V)||W.methodID!==H)throw Error("This login method refreshes only its vault placeholder; choose the plugin's vault login method again.");return L(H)},...K})})}function $1($){let X=[],M;for(let V of $.split(/\r?\n/))if(V.startsWith("data:"))X.push(V.slice(5).replace(/^ /,""));else if(V.startsWith("event:"))M=V.slice(6).trim();if(X.length===0)return;return M===void 0?{data:X.join(`
2
- `)}:{event:M,data:X.join(`
3
- `)}}function d2($,X){let M=new TextDecoder,V="",L=(P)=>{let T=$1(P);if(!T)return;try{$(T)}catch(K){X(K)}},N=()=>{for(;;){let P=/\r?\n\r?\n/.exec(V);if(!P)return;let T=V.slice(0,P.index);V=V.slice(P.index+P[0].length),L(T)}};return new TransformStream({transform(P,T){T.enqueue(P),V+=M.decode(P,{stream:!0}),N()},flush(){if(V+=M.decode(),N(),V.trim()!=="")L(V);V=""}})}var Y$=512,N2="x-common-auth-attempt",z2=($,X)=>JSON.stringify([$,X]),Q2=($)=>({providerID:$.model.providerID,modelID:$.model.id,sessionID:$.sessionID,agent:$.agent,kind:$.kind});function J1($){let X=$.headers;return typeof X==="object"&&X!==null}function X1($,X){let M=$.getReader();return new ReadableStream({async pull(V){let L;try{L=await M.read()}catch(N){X({reason:"failed",message:N instanceof Error?N.message:String(N)}),V.error(N);return}if(L.done)X(),V.close();else V.enqueue(L.value)},async cancel(V){X({reason:"cancelled",...V===void 0?{}:{message:String(V)}}),await M.cancel(V)}})}function p2($,X){for(let[M,V]of Object.entries(X)){let L=M.toLowerCase();for(let N of Object.keys($))if(N.toLowerCase()===L)delete $[N];if(V!==null)$[M]=V}}function Z1($,X){for(let[M,V]of Object.entries(X))if(V===null)$.delete(M);else $.set(M,V)}async function u2($,X,M={}){let{providerID:V}=X,L=M.gateOnPlaceholder,N=(J)=>L===void 0||L.credential(J)===M2(V),P=M.logger,T=Math.max(1,M.maxRecords??Y$),K=[...M.hostCredentials??[M2(V)],...L?[M2(V)]:[]].filter((J)=>J!==""),Y=new Map,H=new WeakMap,W=new Map,U=new Set,E=new Map,q=!1,A=!1,m=new Map,w=0,c=!1,r=new Map,o=(J,Q)=>{try{P?.warn(J,Q)}catch{}},s=(J)=>J instanceof Error?J.message:String(J),Z=new Map,j=(J,Q)=>{let _=(Z.get(J)??Promise.resolve()).then(Q),F=_.then(()=>{},()=>{});return Z.set(J,F),F.then(()=>{if(Z.get(J)===F)Z.delete(J)}),_},G=(J,Q)=>{let _=Z.get(J);return _?_.then(()=>G(J,Q)):Q()},x=async(J)=>{try{await X.dropChoice?.({...J.input,accountId:J.accountId})}catch(Q){o("opencode2 auth dropChoice threw; the request is unaffected",{sessionID:J.input.sessionID,error:s(Q)})}},O=(J)=>{let Q=W.get(J);if(W.delete(J),Q?.next){let _=Q.next;j(Q.sessionID,()=>x(_))}},D=async(J,Q)=>{let _=m.get(J);if(!_||_.size===0)return;await Promise.all([..._].map(async(F)=>{try{await F(Q)}catch(f){o("opencode2 auth listener threw; the request is unaffected",{event:J,error:s(f)})}}))},y=async(J,Q)=>{try{await X.onAttemptEnd?.(J,Q)}catch(_){o("opencode2 auth onAttemptEnd threw; the request is unaffected",{attemptId:J.attemptId,error:s(_)})}},l=(J,Q)=>{if(J.ended||!J.attempt)return;let _={...J.status===void 0?{}:{status:J.status},outputStarted:J.outputStarted,...J.limit?{limit:J.limit.signal}:{},...Q?{error:Q}:{}};if(Q)J.endError=Q;J.ended=y(J.attempt,_)},p=(J,Q)=>l(J,{reason:"abandoned",message:Q}),I=(J)=>[...Y.values()].filter((Q)=>Q.key===J),u=(J)=>I(J).at(-1),d=(J)=>{if(Y.delete(J.id),W.get(J.key)?.attemptId===J.id||!I(J.key).length)O(J.key)},B=(J)=>{Y.set(J.id,J);while(Y.size>T){let Q=Y.values().next().value;if(Q===void 0)break;p(Q,"dropped to keep the record bound"),d(Q)}},z=(J)=>J.accountId===void 0?void 0:{...J.scope,accountId:J.accountId},C=(J,Q)=>new E2({kind:"no-account",providerID:V,sessionID:J.sessionID,requestKind:J.kind,...Q===void 0?{}:{message:Q}}),S=(J)=>{r.get(J)?.clear(),r.delete(J)},R=async(J,Q)=>{let _=()=>C(J,`${V} ${J.kind} request has no account: its auth selection was revoked by session forgetting or installation disposal`);if(c)throw _();let F=r.get(J.sessionID);if(!F)F=new Set,r.set(J.sessionID,F);let f={};F.add(f);let v=()=>{if(!F.has(f))throw _()};try{return await Q(v)}finally{if(F.delete(f),F.size===0&&r.get(J.sessionID)===F)r.delete(J.sessionID)}},b=(J,Q)=>{for(let[_,F]of Q)if(K.some((f)=>F.includes(f)))throw new E2({kind:"host-credential-on-wire",providerID:V,sessionID:J.sessionID,requestKind:J.kind,message:`${V} ${J.kind} request still carries the host's placeholder credential in ${_}; the adapter's account headers must replace it`})},g=(J)=>{for(let Q of I(J))if(Q.ended||!Q.attempt)d(Q);else if(Q.transport==="ws"||Q.judged)p(Q,"a newer attempt of its session and kind began"),d(Q)},n=async(J,Q,_,F)=>{let f=z2(J.sessionID,J.kind),{input:v,accountId:k}=await G(J.sessionID,async()=>{_();let e=W.get(f);W.delete(f);let C2=e?.accountId??u(f)?.accountId;g(f);let J2=e?.next,T2=J2!==void 0&&J2.input.modelID===J.modelID&&J2.input.agent===J.agent,H2={...J,phase:"request",...C2===void 0?{}:{previousAccountId:C2},...e?.rerouteFrom?{rerouteFrom:e.rerouteFrom}:{}};if(J2&&!T2)await j(J.sessionID,()=>x(J2)),_();let A2=T2?J2.accountId:await X.chooseAccount(H2);return{input:H2,accountId:A2}});_();let h={},a;if(k!==void 0){let e=await X.accountHeaders({...J,accountId:k});if(_(),J1(e))h=e.headers,a=e.attempt;else h=e}let W2=`attempt-${++w}`,G2={id:W2,key:f,scope:J,accountId:k,headers:h,attempt:k===void 0?void 0:{...J,accountId:k,attemptId:W2,transport:F,data:a},...F===void 0?{}:{transport:F},outputStarted:!1};if(B(G2),G2.attempt)D("select",{...J,accountId:G2.attempt.accountId,hook:Q,...v.previousAccountId===void 0?{}:{previousAccountId:v.previousAccountId},...v.rerouteFrom===void 0?{}:{rerouteFrom:v.rerouteFrom},handle:G2.attempt});return G2},i=async(J,Q,_,F,f)=>{let v=z2(J.sessionID,J.kind),k=F===void 0?void 0:Y.get(F);if(k?.key!==v)k=void 0;if(!k){if(k=u(v),I(v).filter((a)=>a.transport===void 0&&!a.ended).length>1&&!A)A=!0,o("opencode2 auth tied a send without its attempt mark to the newest of several waiting attempts",{sessionID:J.sessionID,kind:J.kind})}if(!k||k.transport!==void 0||k.ended)k=await n(J,Q,f,_);else if(k.transport=_,k.attempt)k.attempt.transport=_;if(_==="ws"){for(let h of I(v))if(h!==k&&h.transport==="ws")p(h,"a newer attempt of its session and kind went out over WebSocket")}return k},Z2=async(J,Q)=>{try{return await Q()}catch(_){throw l(J,{reason:"failed",message:s(_)}),_}},V2=(J,Q)=>{let _=I(z2(J,Q)).filter((F)=>F.transport==="ws").at(-1);return _?.attempt!==void 0&&!_.ended?_:void 0},X2=(J,Q,_)=>{let F=z(J);if(!F||!J.attempt||J.limit)return;J.limit={signal:Q,delivered:D("limit",{...F,via:_,limit:Q,outputStarted:J.outputStarted,handle:J.attempt})}},F2=(J,Q,_,F)=>{let f=z(J);if(!f||!J.attempt)return;D("quota",{...f,transport:Q,...F===void 0?{}:{status:F},quota:_,handle:J.attempt})},$2=(J,Q,_,F)=>{let f=J.attempt;if(!f)return;let v=X.inspectEvent?.(F===void 0?{transport:Q,data:_,attempt:f}:{transport:Q,data:_,event:F,attempt:f});if(!v)return;if(v.quota!==void 0)F2(J,Q,v.quota);if(v.outputStarted)J.outputStarted=!0;if(v.limit)X2(J,v.limit,Q);if(v.error!==void 0)l(J,{reason:"failed",message:v.error});else if(v.done)l(J)},t=(J,Q)=>{let _=J.attempt;if(!_||Q.accountId===J.accountId)return;if(_.reboundFrom??=_.accountId,_.accountId=Q.accountId,"data"in Q)_.data=Q.data;J.accountId=Q.accountId},U2=(J)=>!J.attempt||J.endError!==void 0||J.status!==void 0&&J.status>=400,K2=(J)=>{let Q=[...Y.values()].filter((h)=>h.scope.sessionID===J),_=Q.filter((h)=>h.limit&&!h.rerouted).at(-1);if(_)return _;let F=Q.filter((h)=>h.scope.kind==="primary"),f=F.length>0?F:Q;if(f.length<=1)return f[0];let v=f.filter((h)=>!h.judged&&U2(h)).at(-1);if(v)return v;let k=f.filter((h)=>h.attempt&&!h.ended);if(k.length>1)return"ambiguous";return k[0]??f.at(-1)},Y2={providerID:V},j2=[];j2.push(await $.session.hook("model.request",(J)=>{if(L)return;return R(Q2(J),async(Q)=>{let _=await n(Q2(J),"model.request",Q);if(Q(),_.accountId===void 0)throw C(_.scope);p2(J.headers,{..._.headers,[N2]:_.id})})},Y2)),j2.push(await $.session.hook("http.request",(J)=>{if(L){let Q=N(J.request.headers);if(E.set(J.sessionID,Q),!Q)return}return R(Q2(J),async(Q)=>{let _=J.request.headers.get(N2)??void 0,F=L?await n(Q2(J),"http.request",Q,"http"):await i(Q2(J),"http.request","http",_,Q);Q();let f=z(F),v=F.attempt;if(!f||!v)throw C(F.scope);await Z2(F,async()=>{let k=J.request;if(X.rewriteRequest){if(_!==void 0){let W2=new Headers(k.headers);W2.delete(N2),k=new Request(k,{headers:W2})}k=await X.rewriteRequest({...f,request:k,attempt:v})??k,Q()}let h=new Headers(k.headers);h.delete(N2),Z1(h,F.headers),b(F.scope,h.entries());let a=new Request(k,{headers:h});H.set(a,F),J.request=a})})},Y2)),j2.push(await $.session.hook("http.response",async(J)=>{let Q=H.get(J.request);if(!Q){if(L)return;if(!q)q=!0,o("opencode2 auth dropped an http.response whose request it did not produce",{sessionID:J.sessionID,kind:J.kind});return}let _=J.response;if(X.answeredBy&&Q.attempt){let h=Q.attempt,a=await Z2(Q,async()=>X.answeredBy?.({request:J.request,response:_,attempt:h}));if(a)t(Q,a)}let F=z(Q),f=Q.attempt;if(!F||!f)return;Q.status=_.status;let v=X.quotaFromHeaders?.(_.headers,_.status,f);if(v!==void 0)F2(Q,"http",v,_.status);if(!_.ok&&X.limitFromResponse){let h=await X.limitFromResponse({status:_.status,headers:_.headers,body:()=>_.clone().text(),attempt:f});if(h)X2(Q,h,"http")}if(!_.ok||!_.body)l(Q);let k=_;if(_.body&&(X.inspectEvent||X.onAttemptEnd)){let h=_.body;if(X.inspectEvent)h=h.pipeThrough(d2((a)=>$2(Q,"http",a.data,a.event),(a)=>o("opencode2 auth event inspection threw",{error:s(a)})));k=new Response(X1(h,(a)=>l(Q,a)),{status:_.status,statusText:_.statusText,headers:_.headers})}if(X.rewriteResponse)k=await X.rewriteResponse({...F,request:J.request,response:k,attempt:f})??k;if(k!==_)J.response=k},Y2)),j2.push(await $.session.hook("experimental.ws.handshake",(J)=>{if(L){let Q=N(new Headers(J.headers)),_=z2(J.sessionID,J.kind);if(E.set(J.sessionID,Q),U.delete(_),!Q)return}return R(Q2(J),async(Q)=>{let _;for(let k of Object.keys(J.headers)){if(k.toLowerCase()!==N2)continue;_??=J.headers[k],delete J.headers[k]}let F=L?await n(Q2(J),"experimental.ws.handshake",Q,"ws"):await i(Q2(J),"experimental.ws.handshake","ws",_,Q);Q();let f=z(F),v=F.attempt;if(!f||!v)throw C(F.scope);await Z2(F,async()=>{p2(J.headers,F.headers);let k=X.rewriteHandshakeURL?.({...f,url:J.url,attempt:v});if(k!==void 0)J.url=k;if(b(F.scope,Object.entries(J.headers)),L)U.add(F.key)})})},Y2));let B2=X.rewriteWebSocketFrame?.bind(X);if(B2)j2.push(await $.session.hook("experimental.ws.send",async(J)=>{let Q=Q2(J);if(L&&!U.has(z2(Q.sessionID,Q.kind)))return;let _=V2(Q.sessionID,Q.kind),F=await B2({...Q,attempt:_?.attempt,frame:J.frame});if(F!==void 0)J.frame=F},Y2));j2.push(await $.session.hook("experimental.ws.receive",(J)=>{if(L&&!U.has(z2(J.sessionID,J.kind)))return;let Q=V2(J.sessionID,J.kind);if(!Q)return;try{$2(Q,"ws",J.frame)}catch(_){o("opencode2 auth frame inspection threw",{error:s(_)})}},Y2)),j2.push(await $.session.hook("retry",async(J)=>{if(L&&E.get(J.sessionID)!==!0)return;let Q=K2(J.sessionID);if(!Q)return;let _=J.decision;if(Q==="ambiguous"){await D("retry",{sessionID:J.sessionID,attempt:J.attempt,reason:"host-decides",hostDecision:_,decision:_});return}let F=Q;await R(F.scope,async(f)=>{let v=f;F.judged=!0;let k=F.attempt;if(k&&!F.outputStarted){if(!F.limit){let W2=X.limitFromError?.(J.error,k);if(W2)X2(F,W2,"error")}if(F.ended)await F.ended;if(F.limit)await F.limit.delivered}v();let{decision:h,reason:a}=await j(F.scope.sessionID,async()=>{v();let W2=W.get(F.key);if(W.delete(F.key),W2?.next)await x(W2.next);v();let G2=_,e,C2,J2;if(F.accountId===void 0||!k)G2={retry:!1},e="no-account";else if(F.outputStarted)G2={retry:!1},e="output-started";else if(F.limit){let T2={accountId:F.accountId,limit:F.limit.signal},H2,A2={...F.scope,phase:"retry",previousAccountId:F.accountId,rerouteFrom:T2};try{H2=await X.chooseAccount(A2)}catch(h2){o("opencode2 auth chooseAccount threw while the retry hook looked for another account; the host decides the retry",{sessionID:F.scope.sessionID,error:s(h2)})}if(H2!==void 0)J2={accountId:H2,input:A2};try{v()}catch(h2){if(J2)await x(J2);throw h2}if(H2!==void 0&&H2!==F.accountId)F.rerouted=!0,C2=T2,G2={retry:!0,delay:0},e="reroute";else e="host-decides-last-account"}else e="host-decides";if(J.decision=G2,G2.retry&&F.accountId!==void 0&&Y.has(F.id))W.set(F.key,{attemptId:F.id,sessionID:F.scope.sessionID,accountId:F.accountId,...C2===void 0?{}:{rerouteFrom:C2},...J2===void 0?{}:{next:J2}});else if(J2)await x(J2);return{decision:G2,reason:e}});v(),await D("retry",{sessionID:J.sessionID,...F.accountId===void 0?{}:{accountId:F.accountId},kind:F.scope.kind,attempt:J.attempt,reason:a,hostDecision:_,decision:h,...k===void 0?{}:{handle:k}})})},Y2));let $$=(J)=>{S(J),E.delete(J);for(let Q of U)if(JSON.parse(Q)[0]===J)U.delete(Q);for(let Q of[...Y.values()]){if(Q.scope.sessionID!==J)continue;p(Q,"its session was forgotten"),Y.delete(Q.id)}for(let[Q,_]of W)if(_.sessionID===J)O(Q)},v2=new AbortController,J$=$.event;if(J$)(async()=>{try{for await(let J of J$.subscribe({signal:v2.signal}))if(J.type==="session.deleted")$$(J.data.sessionID)}catch(J){if(!v2.signal.aborted)o("opencode2 auth stopped listening for session deletion",{error:s(J)})}})();return{on(J,Q){let _=m.get(J);if(!_)_=new Set,m.set(J,_);let F=Q;return _.add(F),()=>{_.delete(F)}},accountFor(J,Q){return u(z2(J,Q))?.accountId},forgetSession:$$,get size(){return Y.size},async dispose(){if(c)return;c=!0;for(let J of r.keys())S(J);v2.abort();for(let J of Y.values())p(J,"the installation was disposed");Y.clear();for(let J of W.keys())O(J);U.clear(),E.clear(),m.clear(),await Promise.all(Z.values()),await Promise.all(j2.map(async(J)=>{try{await J.dispose()}catch(Q){o("opencode2 auth hook did not dispose cleanly",{error:s(Q)})}}))}}}import{CacheKeepManager as k1,CacheKeepSessionRegistry as D1,getDefaultCacheKeepRegistryDirectory as b1,isCacheKeepActiveNow as E$,isCacheKeepHybridActive as o2,isCacheKeepSubagentsEnabled as n2,logger as w1}from"@cortexkit/anthropic-auth-core";import{createHash as Y1}from"node:crypto";import{AnthropicOAuthOriginError as G1,applyCustomHeaders as V1,assertNotCustodyTombstone as j1,classifyGzipRejection as W1,createProviderErrorRedactor as G$,createProviderErrorResponseScope as V$,decideRequestGzip as Q1,encodeGzipRequestBody as B1,getAccountStoragePath as H1,getRequestGzipLatch as U1,getRequestGzipLatchPath as K1,mergeAnthropicBetas as M1,remapModelId as j$,remapRequestBodyModel as z1,stripEmptyTrailingAssistantMessages as _1,TrailingAssistantHistoryError as F1}from"@cortexkit/anthropic-auth-core";var S2="anthropic",L$="x-common-auth-attempt",C1=["x-session-affinity","x-opencode-session","x-parent-session-id",B$,k2,R2,L$],q2=new Set(["authorization","x-api-key"]),N1="Claude pool login is selected but no native account is usable. Complete offline migration or repair the pool and its quota policy before retrying.",L1=512,P1=5000,T1=500,W$=new Set(["invalid_request_error","authentication_error","billing_error","permission_error","not_found_error","request_too_large","rate_limit_error","timeout_error","api_error","overloaded_error"]);class P$ extends Error{sessionID;requestKind;kind="no-account";providerID=S2;constructor($,X){super(N1);this.sessionID=$;this.requestKind=X;this.name="NativeAnthropicNoAccountError"}}class c2 extends Error{sessionID;requestKind;kind="session-forgotten";providerID=S2;constructor($,X){super("request refused: its session was closed while it was being prepared");this.sessionID=$;this.requestKind=X;this.name="NativeAnthropicRevokedError"}}class L2 extends Error{kind="unsupported-transport";providerID=S2;constructor(){super("request refused: WebSocket relay is not supported on OpenCode 2; select HTTP relay or direct transport");this.name="NativeAnthropicTransportRefusal"}}class T$ extends Error{kind="local-invalid-request";status=400;check;constructor($){super($.message,{cause:$});this.name="NativeAnthropicLocalRefusal",this.check=$.check}}var _2=($)=>typeof $==="object"&&$!==null&&!Array.isArray($);function O2($){try{return JSON.parse($)}catch{return}}function i2($){let X={};for(let[M,V]of Object.entries($??{}))X[M.toLowerCase()]=V;return X}function Q$($){let X={};for(let M of C1){let V=$.get(M);if(V!==null&&M!==L$)X[M]=V;$.delete(M)}return X}function E1($){try{return new URL($).pathname.endsWith("/messages")}catch{return!1}}function O1($){return $ instanceof F1||$ instanceof H$||$ instanceof G1?new T$($):void 0}function S1($,X){let M=[];if($.oauth)M.push($.oauth.accessToken);for(let[V,L]of Object.entries($.apiHeaders??{})){if(L===null||!q2.has(V))continue;M.push(L.replace(/^Bearer\s+/i,""))}for(let V of q2){let L=X.get(V);if(L!==null)M.push(L.replace(/^Bearer\s+/i,""))}if($.dispatch?.kind==="http-relay")M.push($.dispatch.token);return[...new Set(M.filter(Boolean))]}var R1=new Set(["oauth-2025-04-20","claude-code-20250219",M$]);function x1($){let X=$.split(",").map((M)=>M.trim()).filter((M)=>M&&!R1.has(M));return M1(null,X)}function A1($){let X=O2($);if(!_2(X))return $;let M=_1(X.messages),V=Object.hasOwn(X,"fallbacks"),{droppedMarkers:L}=z$(X,!1),N=V&&!Object.hasOwn(X,"fallbacks"),P=z1(X);return M>0||L>0||N||P?JSON.stringify(X):$}async function q1($,X){if(!($ instanceof Promise))return"settled";let M;try{return await Promise.race([$.then(()=>"settled"),new Promise((V)=>{M=setTimeout(()=>V("timed-out"),X)})])}finally{if(M!==void 0)clearTimeout(M)}}function P2($){let{source:X,log:M}=$,V=Math.max(1,$.maxPendingSends??L1),L=$.attemptEndTimeoutMs??P1,N=$.requestGzipLatch??U1(K1(H1())),P=new WeakSet,T=new Map,K=new WeakMap,Y=new WeakMap,H=new WeakMap,W=new Map,U=new WeakMap,E=G$([]);E.dispose();let q=(B)=>(B&&W.get(B)?.redactor)??E,A=(B)=>{let z=W.get(B);if(!z)return;W.delete(B),z.redactor.dispose(),z.scope.dispose()},m=(B,z,C,S)=>{let R=S1(z,S),b=V$(R,C);w.set(B,C),W.set(B,{sessionID:z.sessionID,redactor:G$(R),scope:b}),b.settled.then(()=>A(B));while(W.size>V){let g=W.keys().next().value;if(g===void 0)break;A(g)}},w=new WeakMap,c=(B,z)=>{let C=B?w.get(B):void 0;if(!C||!z.ok)return E.redactResponse(z);let S=V$([],C),R=S.redactResponse(z);return S.dispose(),R},r=(B,z)=>{let C=B?W.get(B)?.scope:void 0;if(!C)return c(B,z);try{return C.redactResponse(z)}catch{return c(B,z)}},o=!1,s=new WeakMap,Z=(B,z)=>{if(B&&!z.ok)s.set(z.headers,B);return z},j=(B,z)=>{if(z.dispatch!=="http-relay")return!0;let C=/^req_[A-Za-z0-9_-]+$/.test(B.get("request-id")??"");return Y.set(z,C),C},G=(B)=>new P$(B.sessionID,B.kind),x=new Map,O=async(B,z)=>{if(o)throw new c2(B.sessionID,B.kind);let C={revoked:!1},S=x.get(B.sessionID);if(!S)S=new Set,x.set(B.sessionID,S);S.add(C);let R=()=>{if(o||C.revoked)throw new c2(B.sessionID,B.kind)};try{let b=await z(R);return R(),b}finally{let b=x.get(B.sessionID);if(b?.delete(C)&&b.size===0)x.delete(B.sessionID)}},D=(B,z)=>{T.set(B,z);while(T.size>V){let C=T.keys().next().value;if(C===void 0)break;T.delete(C),M?.warn("dropped the oldest pending Anthropic send to stay bounded",{bound:V})}},y=(B,z)=>({providerID:B.providerID,modelID:B.modelID,sessionID:B.sessionID,agent:B.agent,kind:B.kind,accountId:B.accountId,attemptId:B.attemptId,transport:B.transport,route:z.route,provenance:z.provenance,dispatch:z.dispatch}),l=(B)=>O(B,async(z)=>{let{accountId:C,...S}=B,R=await X.authorizeAccount(S,C);return z(),p(S,R)}),p=(B,z)=>{if(!z)throw G(B);if(z.dispatch?.kind==="websocket-relay")throw new L2;let C=z.dispatch?.kind==="http-relay"?"http-relay":"direct",S=z.dispatch?.kind==="http-relay"?{authorization:null,"x-api-key":null,"x-relay-token":z.dispatch.token}:void 0;if(z.route==="oauth"){if(!z.accessToken)throw G(B);j1(z.accessToken,S2);let g=Object.freeze({route:"oauth",provenance:z.provenance,dispatch:C});D(g,{sessionID:B.sessionID,oauth:{accessToken:z.accessToken,...z.identity?{identity:z.identity}:{}},dispatch:z.dispatch,oauthHeaders:z.headers});let n=i2(z.headers);for(let i of q2)delete n[i];return delete n["anthropic-beta"],{headers:S??{...n,"x-api-key":null,authorization:`Bearer ${z.accessToken}`},attempt:g}}let R={authorization:null,"x-api-key":null,...i2(z.headers)};if(!R.authorization&&!R["x-api-key"])throw G(B);let b=Object.freeze({route:"api",provenance:z.provenance,dispatch:C});return D(b,{sessionID:B.sessionID,...z.baseURL?{baseURL:z.baseURL}:{},dispatch:z.dispatch,apiHeaders:R}),{headers:S??R,attempt:b}},I=(B)=>O(B,(z)=>u(B,z)),u=async(B,z)=>{let{request:C,attempt:S}=B,R=S.data,b=R?T.get(R):void 0;if(R)T.delete(R);if(!R||!b||R.route==="oauth"&&!b.oauth)throw G(B);let g=new Headers(C.headers);V1(g);let n=Q$(g),i=C.body===null?void 0:await C.text();z();let Z2=i!==void 0&&E1(C.url),V2=F$(C.url,b.baseURL!==void 0?{baseURL:b.baseURL}:{}).url?.toString()??C.url;try{if(R.route==="oauth"&&b.oauth){U$(V2);let{accessToken:$2,identity:t}=b.oauth;for(let[K2,Y2]of Object.entries(i2(b.oauthHeaders))){if(q2.has(K2))continue;if(Y2===null)g.delete(K2);else g.set(K2,Y2)}let U2=null;if(i!==void 0&&Z2){let K2={...y(S,R),modelID:(()=>{let B2=O2(i);return j$(_2(B2)&&typeof B2.model==="string"?B2.model:B.modelID)})(),route:"oauth",correlation:n},Y2=await X.requestOptions?.(K2)??{};z(),i=await C$(i,{...Y2,...t?{identity:t}:{},sessionId:B.sessionID,onToolNameMap:(B2)=>H.set(R,B2)});let j2=O2(i);U2=_2(j2)?j2:null}_$(g,$2,{body:U2,...t?{identity:t}:{},requestClass:K$(S.agent)?"auxiliary":"main"})}else{if(i!==void 0&&Z2)i=A1(i);g.delete("authorization"),g.delete("x-api-key");for(let[t,U2]of Object.entries(b.apiHeaders??{}))if(U2===null)g.delete(t);else g.set(t,U2);if(i!==void 0&&Z2&&!g.has("content-type"))g.set("content-type","application/json");let $2=g.get("anthropic-beta");if($2!==null){let t=x1($2);if(t)g.set("anthropic-beta",t);else g.delete("anthropic-beta")}}}catch($2){let t=O1($2);if(!t)throw $2;throw K.set(R,t.check),M?.warn("refused an Anthropic request locally; nothing was sent",{check:t.check}),t}let X2=i!==void 0?O2(i):void 0;if(await X.admitRequest?.({...y(S,R),modelID:j$(_2(X2)&&typeof X2.model==="string"?X2.model:B.modelID)}),Q$(g),i!==void 0)g.delete("content-length");if(z(),m(R,b,_2(X2)&&X2.stream===!0?"event-stream":"http",g),R.route==="oauth"&&Z2&&i!==void 0)await X.onRequestPrepared?.({...y(S,R),url:V2,bodyText:i}),z();if(b.dispatch?.kind==="http-relay"){let $2=i??"";g.delete("x-relay-token");let t={protocol:1,type:"request",affinity:B.sessionID,upstream:{url:V2,method:C.method,headers:Object.fromEntries(g)},mode:"full_sync",revision:1,body:$2,next_hash:`sha256:${Y1("sha256").update($2).digest("hex")}`};return new Request(b.dispatch.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":b.dispatch.token},redirect:"error",signal:C.signal,body:JSON.stringify(t)})}let F2=i;if(R.route==="oauth"&&Z2&&i!==void 0){let $2=await Q1({url:V2,body:i,latch:N});if(z(),$2.gzip)F2=await B1(i),g.set("content-encoding","gzip"),P.add(R),z()}return new Request(V2,{method:C.method,headers:g,redirect:R.route==="oauth"?"error":C.redirect,signal:C.signal,...F2!==void 0?{body:F2}:{}})};return{adapter:{providerID:S2,chooseAccount:(B)=>O(B,async()=>{let z=await X.chooseAccount(B);if(!z)throw G(B);return z}),dropChoice:(B)=>X.dropChoice?.(B),accountHeaders:l,rewriteRequest:I,rewriteHandshakeURL(){throw new L2},rewriteResponse({response:B,attempt:z}){let C=z.data;if(C&&!j(B.headers,C)){if(B.status===401)return A(C),B.body?.cancel().catch(()=>{}),Response.json({type:"error",error:{type:"api_error",message:"Relay authentication failed before Anthropic received the request"}},{status:502});return r(C,B)}if(C&&P.has(C))P.delete(C),W1(B).then((n)=>{if(!n)return;N.latchProcess(),M?.warn("gzipped request body rejected; later requests go uncompressed",{kind:n,status:B.status})},()=>{});let S=r(C,B);if(C?.route!=="oauth"||!S.body)return Z(C,S);let R={...y(z,C),status:B.status},b=X.responseOptions?.(R)??{},g=(B.headers.get("content-type")??"").includes("application/json");return Z(C,N$(S,{...b,toolNameMap:H.get(C),onToolNameRefusal:()=>{K.set(C,"response_tool_names"),A(C)},laneStartOAuthServed:!0,...g?{responseMode:"json"}:{}}))},quotaFromHeaders(B,z,C){let S=C.data;if(!S||!j(B,S))return;return X.quotaFromHeaders?.(B,{...y(C,S),status:z})},async limitFromResponse({status:B,headers:z,body:C,attempt:S}){let R=S.data;if(!R||K.get(R)==="response_tool_names")return;if(!j(z,R))return X.limitFromRelayFailure?.({...y(S,R),status:B});if(U.set(R,`provider responded with HTTP ${B}`),!X.limitFromResponse)return;let b=s.get(z)===R,g=q(R);return X.limitFromResponse({...y(S,R),status:B,headers:z,body:async()=>b?await C():g.redactText(await C())})},inspectEvent({data:B,event:z,attempt:C}){if(C.data&&K.get(C.data)==="response_tool_names")return;let S=O2(B);if(!_2(S))return;let R=typeof S.type==="string"?S.type:z;if(R==="content_block_start"||R==="content_block_delta")return{outputStarted:!0};if(R==="message_stop")return{done:!0};if(R!=="error")return;let b=C.data,g=q(b),n=_2(S.error)?S.error:{},i=typeof n.type!=="string"?void 0:W$.has(n.type)?n.type:g.redactText(n.type),Z2=typeof n.message==="string"?g.redactText(n.message):void 0;if(b?.dispatch==="http-relay"&&Y.get(b)===!1)return;let V2=b?X.limitFromStreamError?.({...y(C,b),errorType:i,message:Z2}):void 0,X2={error:[i??"error",Z2].filter(Boolean).join(": ").slice(0,T1),...V2?{limit:V2}:{}};if(b&&X2.error)U.set(b,X2.error);return X2},limitFromError(B,z){let C=z.data;if(!C||K.has(C))return;let S={type:W$.has(B.type)?B.type:"provider_error",message:U.get(C)??"provider request failed",...B.status!==void 0?{status:B.status}:{}};if(A(C),C.dispatch==="http-relay"&&Y.get(C)===!1)return;return X.limitFromHostError?.(S,y(z,C))},async onAttemptEnd(B,z){let C=B.data;if(!C)return;T.delete(C);let S=z.error?.reason;if(S==="cancelled"||S==="abandoned"||S===void 0&&(z.status===void 0||z.status<400))A(C);let R=K.get(C),{status:b,...g}=z,n=X.onAttemptEnd?.(y(B,C),{...g,...b!==void 0&&(C.dispatch!=="http-relay"||Y.get(C)===!0)?{status:b}:{},...R!==void 0?{localRefusal:{check:R}}:{}});if(await q1(n,L)==="timed-out")M?.warn("the account source did not finish recording a send",{timeoutMs:L})}},dispose(){o=!0;for(let[B,z]of x){for(let C of z)C.revoked=!0;X.forgetSession?.(B)}x.clear(),T.clear();for(let B of[...W.keys()])A(B)},forgetSession(B){for(let z of x.get(B)??[])z.revoked=!0;x.delete(B);for(let[z,C]of T)if(C.sessionID===B)T.delete(z);for(let[z,C]of[...W])if(C.sessionID===B)A(z);X.forgetSession?.(B)},get pendingSendCount(){return T.size},get heldCredentialCount(){let B=0;for(let z of T.values())if(z.oauth)B++;return B},get heldRedactorCount(){return W.size},get operationsInProgress(){let B=0;for(let z of x.values())B+=z.size;return B}}}function x2($){return JSON.stringify([$.source,$.accountIdentity,$.credentialId,$.binding?.storageId,$.binding?.rowId,$.binding?.credentialEpoch])}function O$($){let{runtime:X,source:M}=$,V=new AbortController,L=!1,N=new D1({directory:$.registryDirectory||process.env.OPENCODE_ANTHROPIC_AUTH_CACHEKEEP_REGISTRY_DIR||b1("opencode"),now:$.now}),P=new Map,T=async(W,U,E)=>{let q=E?AbortSignal.any([V.signal,E]):V.signal;q.throwIfAborted();let A=JSON.parse(await U.text()),m={providerID:"anthropic",modelID:A.model,sessionID:`oc2-cachekeep:${W.id}`,agent:"cachekeep",kind:"generate"},w=P2({source:{...M,onRequestPrepared:void 0,responseOptions:void 0,async requestOptions(Z){return{...await M.requestOptions?.(Z),laneStart:!1,billingLineage:void 0,cacheDiagnosticsPreviousMessageId:void 0}},async authorizeAccount(Z,j){let G=await X.read();q.throwIfAborted();let x=G.accounts.find((D)=>D.id===j);if(x?.type!=="oauth"||x2(x)!==W.oauthAccountIdentity||W.isSubagent&&!n2(G.policyStorage)||!o2(G.policyStorage)||!E$(G.policyStorage,new Date($.now?.()??Date.now())))return;let O=await M.authorizeAccount(Z,j);if(O?.provenance.kind==="local"&&x2({...x,binding:O.provenance.subject.binding,accountIdentity:O.provenance.subject.binding.identity})!==W.oauthAccountIdentity)return;if(O?.provenance.kind==="vault"&&O.provenance.credentialId!==x.credentialId)return;return O},async admitRequest(Z){await M.admitRequest?.(Z);let j=await X.read(),G=j.accounts.find((x)=>x.id===Z.accountId);if(q.throwIfAborted(),!G||x2(G)!==W.oauthAccountIdentity||W.isSubagent&&!n2(j.policyStorage)||!o2(j.policyStorage)||!E$(j.policyStorage,new Date($.now?.()??Date.now())))throw Error("CacheKeep policy changed before dispatch")}}}),c,r,o=!1,s=()=>w.forgetSession(m.sessionID);q.addEventListener("abort",s,{once:!0});try{let Z=(await X.read()).accounts.find((y)=>x2(y)===W.oauthAccountIdentity)?.id;if(!Z)throw Error("CacheKeep account is unavailable");let j=await w.adapter.accountHeaders({...m,accountId:Z});if(!("headers"in j)||typeof j.headers!=="object"||j.headers===null||typeof j.attempt!=="object"||j.attempt===null||j.attempt.route!=="oauth")throw Error("CacheKeep authorization refused");c={...m,accountId:Z,attemptId:crypto.randomUUID(),transport:"http",data:j.attempt};let G=await w.adapter.rewriteRequest?.({...m,accountId:Z,attempt:c,request:new Request(W.url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(A),signal:q})});if(!G)throw Error("CacheKeep rewrite refused");q.throwIfAborted();let x=await($.fetch??fetch)(G),O=await w.adapter.rewriteResponse?.({...m,accountId:Z,attempt:c,request:G,response:x});if(!O)throw Error("CacheKeep response rewrite refused");if(r=O.status,w.adapter.quotaFromHeaders?.(O.headers,O.status,c),!O.ok)await w.adapter.limitFromResponse?.({status:r,headers:O.headers,body:()=>O.clone().text(),attempt:c});let D=await O.arrayBuffer();return o=!0,new Response(D,{status:r,headers:O.headers})}catch{throw Error("Native CacheKeep was not completed")}finally{q.removeEventListener("abort",s);try{if(c)await w.adapter.onAttemptEnd?.(c,{status:r,outputStarted:!1,...o?{}:{error:{reason:"cancelled"}}})}finally{w.dispose(),M.forgetSession?.(m.sessionID)}}},K=$.setIntervalImpl??globalThis.setInterval,Y=new k1({loadStorage:async()=>L?null:(await X.read()).policyStorage,now:$.now,setIntervalImpl:(W,U)=>K(()=>Y.tick().catch(()=>{w1.warn("cachekeep","tick failed")}),U),clearIntervalImpl:$.clearIntervalImpl,onTrackedSessionsChanged:(W)=>N.publish(L?[]:W),prepareHeaders(W,U,E){if(L)return;return P.set(E.id,{target:U,attempt:E}),new Headers({"x-native-cachekeep-attempt":String(E.id)})},fetchImpl:async(W,U)=>{let E=new Request(W,U),q=Number(E.headers.get("x-native-cachekeep-attempt")),A=P.get(q);if(P.delete(q),!A)throw Error("CacheKeep attempt is unavailable");return T(A.target,E,A.attempt.signal)},onComplete:({attempt:W})=>{P.delete(W.id)}}),H;return{async track(W){if(L||W.route!=="oauth"||W.agent==="cachekeep"||W.agent==="prime"||W.kind!=="primary")return;let U=await X.read();if(L||!o2(U.policyStorage))return;let E=!1;try{E=await $.isSubagent?.(W.sessionID)??!1}catch{return}if(L||E&&!n2(U.policyStorage))return;let q=U.accounts.find((A)=>A.id===W.accountId);if(!q?.accountIdentity)return;if(W.provenance.kind==="local"&&JSON.stringify(q.binding)!==JSON.stringify(W.provenance.subject.binding))return;if(W.provenance.kind==="vault"&&q.credentialId!==W.provenance.credentialId)return;Y.track({sessionId:W.sessionID,url:W.url,headers:new Headers,bodyText:W.bodyText,storage:U.policyStorage,cacheMode:"hybrid",oauthAccountId:W.accountId,oauthAccountIdentity:x2(q),isSubagent:E}),await N.publish(Y.trackedSessions())},registry:N,dispose(){if(H)return H;return L=!0,Y.stop(),V.abort(),H=(async()=>{try{await Y.tick()}finally{P.clear(),await N.dispose()}})(),H}}}async function S$($,X,M){let V=P2(X),L=[],N=async(U,E,q)=>{let A=await $.session.hook(U,E,q);return L.push(A),A},P=new AbortController,T;try{T=await u2({session:{hook:N},event:$.event},V.adapter,{logger:X.log,gateOnPlaceholder:M})}catch(U){throw V.dispose(),await Promise.allSettled(L.map((E)=>E.dispose())),U}let K=(U)=>{V.forgetSession(U),T.forgetSession(U)},Y=$.event,H=Y?(async()=>{try{for await(let U of Y.subscribe({signal:P.signal}))if(U.type==="session.deleted")K(U.data.sessionID)}catch(U){if(!P.signal.aborted)X.log?.warn("stopped listening for session deletion",{error:U instanceof Error?U.name:"unknown"})}})():Promise.resolve(),W;return{installation:T,forgetSession:K,dispose(){if(W)return W;return V.dispose(),P.abort(),W=(async()=>{await T.dispose(),await H})(),W}}}import{effectiveRelayTransport as R$,getQuotaCheckIntervalMs as y1,logger as I1,nativeAccountCanServe as f1,oauthProfileIsFresh as g1,quotaSnapshotCheckedAt as v1}from"@cortexkit/anthropic-auth-core";function x$($,X){let M=new AbortController,V,L=!1,N=async()=>{let K=await $.read();if(M.signal.throwIfAborted(),K.policyStorage.relay?.enabled===!0&&R$(K.policyStorage.relay.transport,K.policyStorage.relay.url)==="websocket")return;let Y=K,H=y1(Y.policyStorage);for(let W of Y.accounts){if(M.signal.aborted)return;if(!f1(W)||W.type!=="oauth")continue;if(Y.policyStorage.quota?.enabled!==!1&&Date.now()-v1(W.quota)>=H)await $.fetchQuota(W.id,X,M.signal,void 0,"background").catch(()=>{});if(!g1(W.profile)&&!M.signal.aborted)await $.fetchProfile(W.id,X,M.signal).catch(()=>{})}},P=()=>{if(L||V)return V;return V=N().catch(()=>{if(!M.signal.aborted)I1.debug("opencode2","native background readings did not complete")}).finally(()=>{V=void 0}),V},T=$.vault.watch({intervalMs:60000,onRefresh:P,shouldRefresh:async()=>{let K=await $.read();return K.policyStorage.relay?.enabled!==!0||R$(K.policyStorage.relay.transport,K.policyStorage.relay.url)==="http"}});return T.ready.catch(()=>{}),{async dispose(){L=!0,T.close(),M.abort(),await V}}}import{authorize as s1,buildCacheKeepStatusSummary as a1,buildClaudeQuotaSummary as t1,buildPrimeAccountStatuses as e1,buildPrimeStatusSummary as $J,CLAUSTRUM_OPENCODE_ENROLLMENT_NAME as JJ,exchange as XJ,formatNativeAccountState as ZJ,formatOAuthAccountTier as YJ,getCacheKeepWindow as GJ,getHostClaustrumEnrollmentPaths as VJ,isCacheKeepAlways as jJ,isCacheKeepHybridActive as WJ,isCacheKeepPersistentlyEnabled as QJ,nativeAccountCanServe as BJ,resetClaustrumEnrollmentState as HJ}from"@cortexkit/anthropic-auth-core";import{buildPrimeAccountStatuses as h1,effectiveRelayStatus as m1,formatNativeAccountState as l1,formatOAuthAccountTier as A$,getCacheKeepWindow as d1,getRoutingMode as p1,isCacheKeepAlways as u1,isCacheKeepHybridActive as i1,isPermanentRefreshError as c1,isPrimePersistentlyEnabled as o1,nativeAccountCanServe as D$,refreshBackoffActive as q$}from"@cortexkit/anthropic-auth-core";var k$=($)=>D$($)&&$.state!=="unsupported-access"?void 0:l1($)||void 0,n1=($)=>{if($.source!=="vault")return"off";if($.state==="needs_reauth")return"on-vault-reauth";return D$($)?"on-vault-served":"on-cold"},r1=($,X)=>typeof $==="number"&&$>X;function b$($,X){let{now:M}=X,V=$.policyStorage,L=$.accounts.filter((H)=>H.type==="oauth"),N=L.find((H)=>H.id==="main"),P=N?k$(N):void 0,T=N?.lastQuotaRefreshError?.nextRetryAt,K=N?.lastRefreshError,Y=d1(V);return{main:{quota:N?.quota??null,enabled:N?.enabled,tierLabel:A$(N?.profile),quotaBackedOff:r1(T,M),quotaBackoffUntil:T,refreshBackedOff:q$(K,N?.accountIdentity,M,void 0),refreshBackoffUntil:K?.nextRetryAt,stateLine:P,quotaDated:Boolean(P)},fallbacks:L.filter((H)=>H.id!=="main"&&(H.enabled||H.source==="vault")).map((H)=>{let W=k$(H),U=n1(H);return{id:H.id,label:H.label,quota:H.quota??null,enabled:H.enabled,tierLabel:A$(H.profile),needsReauth:c1(H.lastRefreshError)&&q$(H.lastRefreshError,H.accountIdentity,M,void 0),...U==="on-vault-reauth"?{vaultReauth:!0}:{},...U==="on-vault-served"?{vaultServed:!0}:{},...U!=="off"?{custodyState:U}:{},stateLine:W,quotaDated:Boolean(W)}}),activeId:X.activeId,route:p1(V),relay:m1(V.relay),fastMode:V.claudeFast?.enabled===!0,cacheKeep:{enabled:i1(V),window:u1(V)?"always":Y?`${Y.startHour}-${Y.endHour}`:void 0,trackedSessions:X.trackedSessions},prime:o1(V)?{enabled:!0,accounts:h1(V,{now:M})}:void 0,lastUpdated:M}}var r2=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)?$:{},w$=`For first-time model access, connect Anthropic with "${w2}".
4
- Run: opencode auth login anthropic --method ${b2}`,y$=($)=>$.mode==="local"&&!$.accounts.some((X)=>X.id==="main"),UJ=($)=>{let X=$.id==="main"?"main":"fallback",M=`${$.enabled?"enabled":"disabled"}, ${$.type}, ${$.source}${$.state?`, ${ZJ($)}`:""}`;if($.label)return`${$.label} [${X}]: ${M}
5
- Route: ${$.id}`;return`${X==="main"?"Main account":`Fallback ${$.id}`}: ${M}`};function I$($){let{runtime:X,source:M}=$,V=new Map,L=!1,N=async(Y,H)=>{await X.updateSettings((W)=>({...W,[Y]:{...r2(W[Y]),...H}}))},P=()=>({ok:!0,text:"Native Claude settings updated."}),T=async(Y,H)=>{if(L)throw Error("Native menu is closed");switch(H.signal?.throwIfAborted(),Y.action){case"enable":case"disable":return await X.setEnabled(Y.values.id,Y.action==="enable"),P();case"remove":return await X.remove(Y.values.id),P();case"move-up":case"move-down":{let U=(await X.read()).accounts.map((w)=>w.id),E=U.indexOf(Y.values.id),q=E+(Y.action==="move-up"?-1:1);if(E<0||q<0||q>=U.length)return{ok:!1,text:"Account cannot move in that direction."};let A=U[E],m=U[q];if(A===void 0||m===void 0)return{ok:!1,text:"Account order changed."};return U[E]=m,U[q]=A,await X.reorder(U),P()}case"add-apikey":return await X.addApi(Y.values),{ok:!0,text:"API route stored in the native account pool."};case"add-oauth-start":{let W=new AbortController;V.get(Y.sessionId)?.active.abort();let U={active:W,auth:void 0};V.set(Y.sessionId,U);let E=await s1("max");if(L||W.signal.aborted||H.signal?.aborted)return{ok:!1,text:"Sign-in cancelled."};return U.auth=E,{ok:!0,text:`Open ${E.url} and paste the returned code using Finish OAuth sign-in.`}}case"add-oauth-finish":{let W=V.get(Y.sessionId);if(!W?.auth)return{ok:!1,text:"Start OAuth sign-in in this session first."};let U=await XJ(Y.values.code,W.auth.verifier,W.auth.redirectUri,W.auth.state);if(W.active.signal.throwIfAborted(),H.signal?.throwIfAborted(),L||U.type!=="success")return{ok:!1,text:"OAuth sign-in did not complete."};if(await X.loginOAuth({routeId:crypto.randomUUID(),credential:{access:U.access,refresh:U.refresh,expires:U.expires},label:Y.values.label}),W.active.signal.throwIfAborted(),H.signal?.throwIfAborted(),L)return{ok:!1,text:"Sign-in cancelled."};V.delete(Y.sessionId);let E="OAuth account stored in the native account pool.";return{ok:!0,text:y$(await X.read())?`${E}
1
+ import{a as f2,b as e$,c as X1,d as F$,e as L$,f as g2,g as k2,h as C$,i as P$,j as T$,k as Z1,l as E$,m as O$,n as S$,o as R$,p as x$,q as W1}from"../index-2jsr8wvj.js";import"../index-sg0knfec.js";import"../index-c8ehrd0p.js";import{v as V1}from"../index-dpnhamzw.js";import{w as v2,x as m2,z as G1}from"../index-m4dazzyf.js";import"../index-naff9h33.js";import{J as u$}from"../index-46e2gk3c.js";import"../index-bcp23wwb.js";import"../index-71temqvq.js";import{acquireNativeAccountRuntime as iX,authorize as oX,createNativeUi as nX,disconnectNativeVaultForHost as rX,exchange as sX,logger as Y1,readNativeEnrollmentMode as aX,resolveNativePoolPaths as tX}from"@cortexkit/anthropic-auth-core";class T2 extends Error{kind;providerID;sessionID;requestKind;constructor(X){super(X.message??`${X.providerID} ${X.requestKind} request refused (${X.kind})`);this.name="OpenCode2AuthError",this.kind=X.kind,this.providerID=X.providerID,this.sessionID=X.sessionID,this.requestKind=X.requestKind}}function M2(X){return`common-auth-placeholder.${X}`}function Q$(X){let Z=M2(X.integrationID);return{type:"oauth",methodID:X.methodID,access:Z,refresh:Z,expires:X.now+31536000000,metadata:{["commonAuthPlaceholder"]:!0}}}function i2(X,Z){if(X?.type!=="oauth")return!1;let z=Z===void 0?void 0:M2(Z),W=(N)=>z===void 0?N.startsWith("common-auth-placeholder."):N===z;return W(X.access)&&W(X.refresh)}var B$="No browser sign-in: this connects the plugin to the accounts in its vault.";async function o2(X,Z){let z=Z.now??Date.now,{integrationID:W}=Z,N=(P)=>Q$({integrationID:W,methodID:P,now:z()}),L=async(P,M)=>{return await Z.onLogin(P,{integrationID:W,methodID:M}),N(M)},C=(P)=>async(M)=>{let Y=P.method.id,U=await P.authorize(M),B={url:U.url,instructions:U.instructions,...U.expiresAt===void 0?{}:{expiresAt:U.expiresAt}};if(U.mode==="auto")return{...B,mode:"auto",callback:U.callback.then((E)=>L(E,Y))};let K=U.callback;return{...B,mode:"code",callback:async(E)=>L(await K(E),Y)}};return X.integration.transform((P)=>{let M=Z.label===void 0?{}:{label:()=>Z.label};for(let B of Z.methods)P.method.update({integrationID:W,method:B.method,authorize:C(B),refresh:async(K)=>{if(!i2(K,W))throw Error("This login method refreshes only its pool placeholder; sign in again with the plugin's login method.");return N(K.methodID)},...M});let Y=Z.vault;if(Y===void 0)return;let U=Y.method.id;P.method.update({integrationID:W,method:Y.method,authorize:async()=>({url:"",instructions:Y.instructions??B$,mode:"auto",callback:Promise.resolve().then(()=>Y.activate({integrationID:W,methodID:U})).then(()=>N(U))}),refresh:async(B)=>{if(!i2(B,W)||B.methodID!==U)throw Error("This login method refreshes only its vault placeholder; choose the plugin's vault login method again.");return N(U)},...M})})}function U1(X){let Z=[],z;for(let W of X.split(/\r?\n/))if(W.startsWith("data:"))Z.push(W.slice(5).replace(/^ /,""));else if(W.startsWith("event:"))z=W.slice(6).trim();if(Z.length===0)return;return z===void 0?{data:Z.join(`
2
+ `)}:{event:z,data:Z.join(`
3
+ `)}}function n2(X,Z){let z=new TextDecoder,W="",N=(C)=>{let P=U1(C);if(!P)return;try{X(P)}catch(M){Z(M)}},L=()=>{for(;;){let C=/\r?\n\r?\n/.exec(W);if(!C)return;let P=W.slice(0,C.index);W=W.slice(C.index+C[0].length),N(P)}};return new TransformStream({transform(C,P){P.enqueue(C),W+=z.decode(C,{stream:!0}),L()},flush(){if(W+=z.decode(),L(),W.trim()!=="")N(W);W=""}})}var U$=512,H$=1200000,E2="x-common-auth-attempt",C2=(X,Z)=>JSON.stringify([X,Z]),V2=(X)=>({providerID:X.model.providerID,modelID:X.model.id,sessionID:X.sessionID,agent:X.agent,kind:X.kind});function H1(X){let Z=X.headers;return typeof Z==="object"&&Z!==null}function K1(X,Z){let z=X.getReader();return new ReadableStream({async pull(W){let N;try{N=await z.read()}catch(L){Z({reason:"failed",message:L instanceof Error?L.message:String(L)}),W.error(L);return}if(N.done)Z(),W.close();else W.enqueue(N.value)},async cancel(W){Z({reason:"cancelled",...W===void 0?{}:{message:String(W)}}),await z.cancel(W)}})}function y2(X,Z){for(let[z,W]of Object.entries(Z)){let N=z.toLowerCase();for(let L of Object.keys(X))if(L.toLowerCase()===N)delete X[L];if(W!==null)X[z]=W}}function M1(X,Z){for(let[z,W]of Object.entries(Z))if(W===null)X.delete(z);else X.set(z,W)}async function r2(X,Z,z={}){let{providerID:W}=Z,N=z.gateOnPlaceholder,L=($)=>N===void 0||N.credential($)===M2(W),C=z.logger,P=Math.max(1,z.maxRecords??U$),M=[...z.hostCredentials??[M2(W)],...N?[M2(W)]:[]].filter(($)=>$!==""),Y=new Map,U=new WeakMap,B=new Map,K=0,E=new Set,k=new Map,A=new Map,h=($)=>{let j=A.get($);return j?.ownedSeen===!0&&j.foreignSeen},y=($,j)=>{k.set($,j);let _=A.get($)??{ownedSeen:!1,foreignSeen:!1};if(j)_.ownedSeen=!0;else _.foreignSeen=!0;A.set($,_)},c=($,j)=>{let _=N?.refuseMisplaced,S=_?[...j].filter(([,m])=>m.includes(M2(W))):[],T=L(j)&&(!_||S.length>0);if(_){if(S.length>0&&(S.length!==1||!T))throw y($.sessionID,!1),new T2({kind:"placement-refused",providerID:W,sessionID:$.sessionID,requestKind:$.kind,message:_(S[0]?.[0]??"")})}return y($.sessionID,T),T},s=!1,t=!1,a=new Map,J=0,Q=!1,V=new Map,R=($,j)=>{try{C?.warn($,j)}catch{}},O=($)=>$ instanceof Error?$.message:String($),b=new Map,I=($,j)=>{let _=(b.get($)??Promise.resolve()).then(j),S=_.then(()=>{},()=>{});return b.set($,S),S.then(()=>{if(b.get($)===S)b.delete($)}),_},d=($,j)=>{let _=b.get($);return _?_.then(()=>d($,j)):j()},l=async($)=>{try{await Z.dropChoice?.({...$.input,accountId:$.accountId})}catch(j){R("opencode2 auth dropChoice threw; the request is unaffected",{sessionID:$.input.sessionID,error:O(j)})}},r=($)=>{let j=B.get($);if(B.delete($),j?.next){let _=j.next;I(j.sessionID,()=>l(_))}},v=async($,j)=>{let _=a.get($);if(!_||_.size===0)return;await Promise.all([..._].map(async(S)=>{try{await S(j)}catch(T){R("opencode2 auth listener threw; the request is unaffected",{event:$,error:O(T)})}}))},i=async($,j)=>{try{await Z.onAttemptEnd?.($,j)}catch(_){R("opencode2 auth onAttemptEnd threw; the request is unaffected",{attemptId:$.attemptId,error:O(_)})}},G=($,j)=>{if($.ended||!$.attempt)return;let _={...$.status===void 0?{}:{status:$.status},outputStarted:$.outputStarted,...$.limit?{limit:$.limit.signal}:{},...j?{error:j}:{}};if(j)$.endError=j;$.ended=i($.attempt,_)},H=($,j)=>G($,{reason:"abandoned",message:j}),F=($)=>[...Y.values()].filter((j)=>j.key===$),x=($)=>F($).at(-1),q=($)=>{if(Y.delete($.id),B.get($.key)?.attemptId===$.id||!F($.key).length)r($.key)},w=($)=>{Y.set($.id,$);while(Y.size>P){let j=Y.values().next().value;if(j===void 0)break;H(j,"dropped to keep the record bound"),q(j)}},f=($)=>$.accountId===void 0?void 0:{...$.scope,accountId:$.accountId},p=($,j)=>new T2({kind:"no-account",providerID:W,sessionID:$.sessionID,requestKind:$.kind,...j===void 0?{}:{message:j}}),u=($)=>{V.get($)?.clear(),V.delete($)},Z2=async($,j)=>{let _=()=>p($,`${W} ${$.kind} request has no account: its auth selection was revoked by session forgetting or installation disposal`);if(Q)throw _();let S=V.get($.sessionID);if(!S)S=new Set,V.set($.sessionID,S);let T={};S.add(T);let m=()=>{if(!S.has(T))throw _()};try{return await j(m)}finally{if(S.delete(T),S.size===0&&V.get($.sessionID)===S)V.delete($.sessionID)}},J2=($,j)=>{for(let[_,S]of j)if(M.some((T)=>S.includes(T)))throw new T2({kind:"host-credential-on-wire",providerID:W,sessionID:$.sessionID,requestKind:$.kind,message:`${W} ${$.kind} request still carries the host's placeholder credential in ${_}; the adapter's account headers must replace it`})},Y2=($)=>{for(let j of F($))if(j.ended||!j.attempt)q(j);else if(j.transport==="ws"||j.judged)H(j,"a newer attempt of its session and kind began"),q(j)},B2=async($,j,_,S)=>{let T=C2($.sessionID,$.kind),{input:m,accountId:D}=await d($.sessionID,async()=>{_();let e=B.get(T);B.delete(T);let j2=e?.accountId??x(T)?.accountId;Y2(T);let W2=e?.next,X2=W2!==void 0&&W2.input.modelID===$.modelID&&W2.input.agent===$.agent,x2={...$,phase:"request",...j2===void 0?{}:{previousAccountId:j2},...e?.rerouteFrom?{rerouteFrom:e.rerouteFrom}:{}};if(W2&&!X2)await I($.sessionID,()=>l(W2)),_();let K2=X2?W2.accountId:await Z.chooseAccount(x2);return{input:x2,accountId:typeof K2==="string"?K2:void 0}});_();let g={},n;if(D!==void 0){let e=await Z.accountHeaders({...$,accountId:D});if(_(),H1(e))g=e.headers,n=e.attempt;else g=e}let F2=`attempt-${++J}`,G2={id:F2,key:T,scope:$,accountId:D,headers:g,attempt:D===void 0?void 0:{...$,accountId:D,attemptId:F2,transport:S,data:n},...S===void 0?{}:{transport:S},outputStarted:!1};if(w(G2),G2.attempt)v("select",{...$,accountId:G2.attempt.accountId,hook:j,...m.previousAccountId===void 0?{}:{previousAccountId:m.previousAccountId},...m.rerouteFrom===void 0?{}:{rerouteFrom:m.rerouteFrom},handle:G2.attempt});return G2},$2=async($,j,_,S,T)=>{let m=C2($.sessionID,$.kind),D=S===void 0?void 0:Y.get(S);if(D?.key!==m)D=void 0;if(!D){if(D=x(m),F(m).filter((n)=>n.transport===void 0&&!n.ended).length>1&&!t)t=!0,R("opencode2 auth tied a send without its attempt mark to the newest of several waiting attempts",{sessionID:$.sessionID,kind:$.kind})}if(!D||D.transport!==void 0||D.ended)D=await B2($,j,T,_);else if(D.transport=_,D.attempt)D.attempt.transport=_;if(_==="ws"){for(let g of F(m))if(g!==D&&g.transport==="ws")H(g,"a newer attempt of its session and kind went out over WebSocket")}return D},o=async($,j)=>{try{return await j()}catch(_){throw G($,{reason:"failed",message:O(_)}),_}},U2=($,j)=>{let _=F(C2($,j)).filter((S)=>S.transport==="ws").at(-1);return _?.attempt!==void 0&&!_.ended?_:void 0},Q2=($,j,_)=>{let S=f($);if(!S||!$.attempt||$.limit)return;$.limit={signal:j,delivered:v("limit",{...S,via:_,limit:j,outputStarted:$.outputStarted,handle:$.attempt})}},z2=($,j,_,S)=>{let T=f($);if(!T||!$.attempt)return;v("quota",{...T,transport:j,...S===void 0?{}:{status:S},quota:_,handle:$.attempt})},R2=($,j,_,S)=>{let T=$.attempt;if(!T)return;let m=Z.inspectEvent?.(S===void 0?{transport:j,data:_,attempt:T}:{transport:j,data:_,event:S,attempt:T});if(!m)return;if(m.quota!==void 0)z2($,j,m.quota);if(m.outputStarted)$.outputStarted=!0;if(m.limit)Q2($,m.limit,j);if(m.error!==void 0)G($,{reason:"failed",message:m.error});else if(m.done)G($)},_2=($,j)=>{let _=$.attempt;if(!_||j.accountId===$.accountId)return;if(_.reboundFrom??=_.accountId,_.accountId=j.accountId,"data"in j)_.data=j.data;$.accountId=j.accountId},Q1=($)=>!$.attempt||$.endError!==void 0||$.status!==void 0&&$.status>=400,B1=($)=>{let j=[...Y.values()].filter((g)=>g.scope.sessionID===$),_=j.filter((g)=>g.limit&&!g.rerouted).at(-1);if(_)return _;let S=j.filter((g)=>g.scope.kind==="primary"),T=S.length>0?S:j;if(T.length<=1)return T[0];let m=T.filter((g)=>!g.judged&&Q1(g)).at(-1);if(m)return m;let D=T.filter((g)=>g.attempt&&!g.ended);if(D.length>1)return"ambiguous";return D[0]??T.at(-1)},N2={providerID:W},H2=[];H2.push(await X.session.hook("model.request",($)=>{if(N)return;return Z2(V2($),async(j)=>{let _=await B2(V2($),"model.request",j);if(j(),_.accountId===void 0)throw p(_.scope);y2($.headers,{..._.headers,[E2]:_.id})})},N2)),H2.push(await X.session.hook("http.request",($)=>{if(N){if(!c(V2($),$.request.headers))return}return Z2(V2($),async(j)=>{let _=$.request.headers.get(E2)??void 0,S=N?await B2(V2($),"http.request",j,"http"):await $2(V2($),"http.request","http",_,j);j();let T=f(S),m=S.attempt;if(!T||!m)throw p(S.scope);await o(S,async()=>{let D=$.request;if(Z.rewriteRequest){if(_!==void 0){let F2=new Headers(D.headers);F2.delete(E2),D=new Request(D,{headers:F2})}D=await Z.rewriteRequest({...T,request:D,attempt:m})??D,j()}let g=new Headers(D.headers);g.delete(E2),M1(g,S.headers),J2(S.scope,g.entries());let n=new Request(D,{headers:g});U.set(n,S),$.request=n})})},N2)),H2.push(await X.session.hook("http.response",async($)=>{let j=U.get($.request);if(!j){if(N)return;if(!s)s=!0,R("opencode2 auth dropped an http.response whose request it did not produce",{sessionID:$.sessionID,kind:$.kind});return}let _=$.response;if(Z.answeredBy&&j.attempt){let g=j.attempt,n=await o(j,async()=>Z.answeredBy?.({request:$.request,response:_,attempt:g}));if(n)_2(j,n)}let S=f(j),T=j.attempt;if(!S||!T)return;j.status=_.status;let m=Z.quotaFromHeaders?.(_.headers,_.status,T);if(m!==void 0)z2(j,"http",m,_.status);if(!_.ok&&Z.limitFromResponse){let g=await Z.limitFromResponse({status:_.status,headers:_.headers,body:()=>_.clone().text(),attempt:T});if(g)Q2(j,g,"http")}if(!_.ok||!_.body)G(j);let D=_;if(_.body&&(Z.inspectEvent||Z.onAttemptEnd)){let g=_.body;if(Z.inspectEvent)g=g.pipeThrough(n2((n)=>R2(j,"http",n.data,n.event),(n)=>R("opencode2 auth event inspection threw",{error:O(n)})));D=new Response(K1(g,(n)=>G(j,n)),{status:_.status,statusText:_.statusText,headers:_.headers})}if(Z.rewriteResponse)D=await Z.rewriteResponse({...S,request:$.request,response:D,attempt:T})??D;if(D!==_)$.response=D},N2)),H2.push(await X.session.hook("experimental.ws.handshake",($)=>{if(N){let j=C2($.sessionID,$.kind);if(E.delete(j),!c(V2($),new Headers($.headers)))return}return Z2(V2($),async(j)=>{let _;for(let D of Object.keys($.headers)){if(D.toLowerCase()!==E2)continue;_??=$.headers[D],delete $.headers[D]}let S=N?await B2(V2($),"experimental.ws.handshake",j,"ws"):await $2(V2($),"experimental.ws.handshake","ws",_,j);j();let T=f(S),m=S.attempt;if(!T||!m)throw p(S.scope);await o(S,async()=>{if(!N?.refuseMisplaced)y2($.headers,S.headers);let D=Z.rewriteHandshakeURL?.({...T,url:$.url,attempt:m});if(D!==void 0)$.url=D;if(N?.refuseMisplaced)y2($.headers,S.headers);if(J2(S.scope,Object.entries($.headers)),N)E.add(S.key)})})},N2));let V$=Z.rewriteWebSocketFrame?.bind(Z);if(V$)H2.push(await X.session.hook("experimental.ws.send",async($)=>{let j=V2($);if(N&&!E.has(C2(j.sessionID,j.kind)))return;let _=U2(j.sessionID,j.kind),S=await V$({...j,attempt:_?.attempt,frame:$.frame});if(S!==void 0)$.frame=S},N2));H2.push(await X.session.hook("experimental.ws.receive",($)=>{if(N&&!E.has(C2($.sessionID,$.kind)))return;let j=U2($.sessionID,$.kind);if(!j)return;try{R2(j,"ws",$.frame)}catch(_){R("opencode2 auth frame inspection threw",{error:O(_)})}},N2)),H2.push(await X.session.hook("retry",async($)=>{if(N&&k.get($.sessionID)!==!0)return;let j=$.decision,_=()=>v("retry",{sessionID:$.sessionID,attempt:$.attempt,reason:"host-decides",hostDecision:j,decision:j});if(h($.sessionID)){await _();return}let S=B1($.sessionID);if(!S)return;if(S==="ambiguous"){await v("retry",{sessionID:$.sessionID,attempt:$.attempt,reason:"host-decides",hostDecision:j,decision:j});return}let T=S;await Z2(T.scope,async(m)=>{let D=m;if(h($.sessionID)){await _();return}T.judged=!0;let g=T.attempt;if(g&&!T.outputStarted){if(!T.limit){let G2=Z.limitFromError?.($.error,g);if(G2)Q2(T,G2,"error")}if(T.ended)await T.ended;if(T.limit)await T.limit.delivered}D();let{decision:n,reason:F2}=await I(T.scope.sessionID,async()=>{if(D(),h($.sessionID))return{decision:j,reason:"host-decides"};let G2=B.get(T.key);if(B.delete(T.key),G2?.next)await l(G2.next);if(D(),h($.sessionID))return{decision:j,reason:"host-decides"};let e=j,j2,W2,X2;if(T.accountId===void 0||!g)e={retry:!1},j2="no-account";else if(T.outputStarted)e={retry:!1},j2="output-started";else if(T.limit){let x2={accountId:T.accountId,limit:T.limit.signal},K2,p2={...T.scope,phase:"retry",previousAccountId:T.accountId,rerouteFrom:x2};try{K2=await Z.chooseAccount(p2)}catch(c2){R("opencode2 auth chooseAccount threw while the retry hook looked for another account; the host decides the retry",{sessionID:T.scope.sessionID,error:O(c2)})}let L2=typeof K2==="object"?K2.hold:void 0,w2=typeof K2==="string"?K2:L2?T.accountId:void 0;if(w2!==void 0)X2={accountId:w2,input:p2};try{D()}catch(c2){if(X2)await l(X2);throw c2}if(h($.sessionID)){if(X2)await l(X2);return{decision:j,reason:"host-decides"}}if(L2&&Number.isFinite(L2.delayMs)&&L2.delayMs>=0)e={retry:!0,delay:Math.min(L2.delayMs,H$)},j2="hold";else if(!L2&&w2!==void 0&&w2!==T.accountId)T.rerouted=!0,W2=x2,e={retry:!0,delay:0},j2="reroute";else{if(L2&&X2)await l(X2),X2=void 0;j2="host-decides-last-account"}}else j2="host-decides";if($.decision=e,e.retry&&T.accountId!==void 0&&Y.has(T.id))B.set(T.key,{attemptId:T.id,sessionID:T.scope.sessionID,order:++K,accountId:T.accountId,...W2===void 0?{}:{rerouteFrom:W2},...X2===void 0?{}:{next:X2}});else if(X2)await l(X2);return{decision:e,reason:j2}});D(),await v("retry",{sessionID:$.sessionID,...T.accountId===void 0?{}:{accountId:T.accountId},kind:T.scope.kind,attempt:$.attempt,reason:F2,hostDecision:j,decision:n,...g===void 0?{}:{handle:g}})})},N2));let j$=($)=>{if(u($),k.delete($),!A.get($)?.foreignSeen)A.delete($);for(let j of E)if(JSON.parse(j)[0]===$)E.delete(j);for(let j of[...Y.values()]){if(j.scope.sessionID!==$)continue;H(j,"its session was forgotten"),Y.delete(j.id)}for(let[j,_]of B)if(_.sessionID===$)r(j)},u2=new AbortController,W$=X.event;if(W$)(async()=>{try{for await(let $ of W$.subscribe({signal:u2.signal}))if($.type==="session.deleted")j$($.data.sessionID);else if($.type==="session.status"&&$.data.status.type==="idle"){let j=$.data.sessionID,_=++K;I(j,async()=>{for(let[S,T]of B)if(T.sessionID===j&&T.order<_){if(B.delete(S),T.next)await l(T.next)}})}}catch($){if(!u2.signal.aborted)R("opencode2 auth stopped listening for session deletion",{error:O($)})}})();return{on($,j){let _=a.get($);if(!_)_=new Set,a.set($,_);let S=j;return _.add(S),()=>{_.delete(S)}},accountFor($,j){return x(C2($,j))?.accountId},forgetSession:j$,get size(){return Y.size},async dispose(){if(Q)return;Q=!0;for(let $ of V.keys())u($);u2.abort();for(let $ of Y.values())H($,"the installation was disposed");Y.clear();for(let $ of B.keys())r($);E.clear(),k.clear(),A.clear(),a.clear(),await Promise.all(b.values()),await Promise.all(H2.map(async($)=>{try{await $.dispose()}catch(j){R("opencode2 auth hook did not dispose cleanly",{error:O(j)})}}))}}}import{CacheKeepManager as l1,CacheKeepSessionRegistry as d1,getDefaultCacheKeepRegistryDirectory as u1,isCacheKeepActiveNow as b$,isCacheKeepHybridActive as t2,isCacheKeepSubagentsEnabled as e2,logger as p1}from"@cortexkit/anthropic-auth-core";import{createHash as z1}from"node:crypto";import{AnthropicOAuthOriginError as _1,applyCustomHeaders as N1,assertNotCustodyTombstone as F1,classifyGzipRejection as L1,createProviderErrorRedactor as K$,createProviderErrorResponseScope as M$,decideRequestGzip as C1,encodeGzipRequestBody as P1,getAccountStoragePath as T1,getRequestGzipLatch as E1,getRequestGzipLatchPath as O1,mergeAnthropicBetas as S1,remapModelId as z$,remapRequestBodyModel as R1,stripEmptyTrailingAssistantMessages as x1,TrailingAssistantHistoryError as A1}from"@cortexkit/anthropic-auth-core";var q2="anthropic",A$="x-common-auth-attempt",q1=["x-session-affinity","x-opencode-session","x-parent-session-id",F$,f2,k2,A$],I2=new Set(["authorization","x-api-key"]),k1="Claude pool login is selected but no native account is usable. Complete offline migration or repair the pool and its quota policy before retrying.",b1=512,D1=5000,w1=500,_$=new Set(["invalid_request_error","authentication_error","billing_error","permission_error","not_found_error","request_too_large","rate_limit_error","timeout_error","api_error","overloaded_error"]);class q$ extends Error{sessionID;requestKind;kind="no-account";providerID=q2;constructor(X,Z){super(k1);this.sessionID=X;this.requestKind=Z;this.name="NativeAnthropicNoAccountError"}}class a2 extends Error{sessionID;requestKind;kind="session-forgotten";providerID=q2;constructor(X,Z){super("request refused: its session was closed while it was being prepared");this.sessionID=X;this.requestKind=Z;this.name="NativeAnthropicRevokedError"}}class O2 extends Error{kind="unsupported-transport";providerID=q2;constructor(){super("request refused: WebSocket relay is not supported on OpenCode 2; select HTTP relay or direct transport");this.name="NativeAnthropicTransportRefusal"}}class k$ extends Error{kind="local-invalid-request";status=400;check;constructor(X){super(X.message,{cause:X});this.name="NativeAnthropicLocalRefusal",this.check=X.check}}var P2=(X)=>typeof X==="object"&&X!==null&&!Array.isArray(X);function A2(X){try{return JSON.parse(X)}catch{return}}function s2(X){let Z={};for(let[z,W]of Object.entries(X??{}))Z[z.toLowerCase()]=W;return Z}function N$(X){let Z={};for(let z of q1){let W=X.get(z);if(W!==null&&z!==A$)Z[z]=W;X.delete(z)}return Z}function y1(X){try{return new URL(X).pathname.endsWith("/messages")}catch{return!1}}function I1(X){return X instanceof A1||X instanceof L$||X instanceof _1?new k$(X):void 0}function f1(X,Z){let z=[];if(X.oauth)z.push(X.oauth.accessToken);for(let[W,N]of Object.entries(X.apiHeaders??{})){if(N===null||!I2.has(W))continue;z.push(N.replace(/^Bearer\s+/i,""))}for(let W of I2){let N=Z.get(W);if(N!==null)z.push(N.replace(/^Bearer\s+/i,""))}if(X.dispatch?.kind==="http-relay")z.push(X.dispatch.token);return[...new Set(z.filter(Boolean))]}var g1=new Set(["oauth-2025-04-20","claude-code-20250219",T$]);function v1(X){let Z=X.split(",").map((z)=>z.trim()).filter((z)=>z&&!g1.has(z));return S1(null,Z)}function m1(X){let Z=A2(X);if(!P2(Z))return X;let z=x1(Z.messages),W=Object.hasOwn(Z,"fallbacks"),{droppedMarkers:N}=E$(Z,!1),L=W&&!Object.hasOwn(Z,"fallbacks"),C=R1(Z);return z>0||N>0||L||C?JSON.stringify(Z):X}async function h1(X,Z){if(!(X instanceof Promise))return"settled";let z;try{return await Promise.race([X.then(()=>"settled"),new Promise((W)=>{z=setTimeout(()=>W("timed-out"),Z)})])}finally{if(z!==void 0)clearTimeout(z)}}function S2(X){let{source:Z,log:z}=X,W=Math.max(1,X.maxPendingSends??b1),N=X.attemptEndTimeoutMs??D1,L=X.requestGzipLatch??E1(O1(T1())),C=new WeakSet,P=new Map,M=new WeakMap,Y=new WeakMap,U=new WeakMap,B=new Map,K=new WeakMap,E=K$([]);E.dispose();let k=(G)=>(G&&B.get(G)?.redactor)??E,A=(G)=>{let H=B.get(G);if(!H)return;B.delete(G),H.redactor.dispose(),H.scope.dispose()},h=(G,H,F,x)=>{let q=f1(H,x),w=M$(q,F);y.set(G,F),B.set(G,{sessionID:H.sessionID,redactor:K$(q),scope:w}),w.settled.then(()=>A(G));while(B.size>W){let f=B.keys().next().value;if(f===void 0)break;A(f)}},y=new WeakMap,c=(G,H)=>{let F=G?y.get(G):void 0;if(!F||!H.ok)return E.redactResponse(H);let x=M$([],F),q=x.redactResponse(H);return x.dispose(),q},s=(G,H)=>{let F=G?B.get(G)?.scope:void 0;if(!F)return c(G,H);try{return F.redactResponse(H)}catch{return c(G,H)}},t=!1,a=new WeakMap,J=(G,H)=>{if(G&&!H.ok)a.set(H.headers,G);return H},Q=(G,H)=>{if(H.dispatch!=="http-relay")return!0;let F=/^req_[A-Za-z0-9_-]+$/.test(G.get("request-id")??"");return Y.set(H,F),F},V=(G)=>new q$(G.sessionID,G.kind),R=new Map,O=async(G,H)=>{if(t)throw new a2(G.sessionID,G.kind);let F={revoked:!1},x=R.get(G.sessionID);if(!x)x=new Set,R.set(G.sessionID,x);x.add(F);let q=()=>{if(t||F.revoked)throw new a2(G.sessionID,G.kind)};try{let w=await H(q);return q(),w}finally{let w=R.get(G.sessionID);if(w?.delete(F)&&w.size===0)R.delete(G.sessionID)}},b=(G,H)=>{P.set(G,H);while(P.size>W){let F=P.keys().next().value;if(F===void 0)break;P.delete(F),z?.warn("dropped the oldest pending Anthropic send to stay bounded",{bound:W})}},I=(G,H)=>({providerID:G.providerID,modelID:G.modelID,sessionID:G.sessionID,agent:G.agent,kind:G.kind,accountId:G.accountId,attemptId:G.attemptId,transport:G.transport,route:H.route,provenance:H.provenance,dispatch:H.dispatch}),d=(G)=>O(G,async(H)=>{let{accountId:F,...x}=G,q=await Z.authorizeAccount(x,F);return H(),l(x,q)}),l=(G,H)=>{if(!H)throw V(G);if(H.dispatch?.kind==="websocket-relay")throw new O2;let F=H.dispatch?.kind==="http-relay"?"http-relay":"direct",x=H.dispatch?.kind==="http-relay"?{authorization:null,"x-api-key":null,"x-relay-token":H.dispatch.token}:void 0;if(H.route==="oauth"){if(!H.accessToken)throw V(G);F1(H.accessToken,q2);let f=Object.freeze({route:"oauth",provenance:H.provenance,dispatch:F});b(f,{sessionID:G.sessionID,oauth:{accessToken:H.accessToken,...H.identity?{identity:H.identity}:{}},dispatch:H.dispatch,oauthHeaders:H.headers});let p=s2(H.headers);for(let u of I2)delete p[u];return delete p["anthropic-beta"],{headers:x??{...p,"x-api-key":null,authorization:`Bearer ${H.accessToken}`},attempt:f}}let q={authorization:null,"x-api-key":null,...s2(H.headers)};if(!q.authorization&&!q["x-api-key"])throw V(G);let w=Object.freeze({route:"api",provenance:H.provenance,dispatch:F});return b(w,{sessionID:G.sessionID,...H.baseURL?{baseURL:H.baseURL}:{},dispatch:H.dispatch,apiHeaders:q}),{headers:x??q,attempt:w}},r=(G)=>O(G,(H)=>v(G,H)),v=async(G,H)=>{let{request:F,attempt:x}=G,q=x.data,w=q?P.get(q):void 0;if(q)P.delete(q);if(!q||!w||q.route==="oauth"&&!w.oauth)throw V(G);let f=new Headers(F.headers);N1(f);let p=N$(f),u=F.body===null?void 0:await F.text();H();let Z2=u!==void 0&&y1(F.url),J2=S$(F.url,w.baseURL!==void 0?{baseURL:w.baseURL}:{}).url?.toString()??F.url;try{if(q.route==="oauth"&&w.oauth){C$(J2);let{accessToken:$2,identity:o}=w.oauth;for(let[Q2,z2]of Object.entries(s2(w.oauthHeaders))){if(I2.has(Q2))continue;if(z2===null)f.delete(Q2);else f.set(Q2,z2)}let U2=null;if(u!==void 0&&Z2){let Q2={...I(x,q),modelID:(()=>{let _2=A2(u);return z$(P2(_2)&&typeof _2.model==="string"?_2.model:G.modelID)})(),route:"oauth",correlation:p},z2=await Z.requestOptions?.(Q2)??{};H(),u=await R$(u,{...z2,...o?{identity:o}:{},sessionId:G.sessionID,onToolNameMap:(_2)=>U.set(q,_2)});let R2=A2(u);U2=P2(R2)?R2:null}O$(f,$2,{body:U2,...o?{identity:o}:{},requestClass:P$(x.agent)?"auxiliary":"main"})}else{if(u!==void 0&&Z2)u=m1(u);f.delete("authorization"),f.delete("x-api-key");for(let[o,U2]of Object.entries(w.apiHeaders??{}))if(U2===null)f.delete(o);else f.set(o,U2);if(u!==void 0&&Z2&&!f.has("content-type"))f.set("content-type","application/json");let $2=f.get("anthropic-beta");if($2!==null){let o=v1($2);if(o)f.set("anthropic-beta",o);else f.delete("anthropic-beta")}}}catch($2){let o=I1($2);if(!o)throw $2;throw M.set(q,o.check),z?.warn("refused an Anthropic request locally; nothing was sent",{check:o.check}),o}let Y2=u!==void 0?A2(u):void 0;if(await Z.admitRequest?.({...I(x,q),modelID:z$(P2(Y2)&&typeof Y2.model==="string"?Y2.model:G.modelID)}),N$(f),u!==void 0)f.delete("content-length");if(H(),h(q,w,P2(Y2)&&Y2.stream===!0?"event-stream":"http",f),q.route==="oauth"&&Z2&&u!==void 0)await Z.onRequestPrepared?.({...I(x,q),url:J2,bodyText:u}),H();if(w.dispatch?.kind==="http-relay"){let $2=u??"";f.delete("x-relay-token");let o={protocol:1,type:"request",affinity:G.sessionID,upstream:{url:J2,method:F.method,headers:Object.fromEntries(f)},mode:"full_sync",revision:1,body:$2,next_hash:`sha256:${z1("sha256").update($2).digest("hex")}`};return new Request(w.dispatch.url,{method:"POST",headers:{"content-type":"application/json","x-relay-token":w.dispatch.token},redirect:"error",signal:F.signal,body:JSON.stringify(o)})}let B2=u;if(q.route==="oauth"&&Z2&&u!==void 0){let $2=await C1({url:J2,body:u,latch:L});if(H(),$2.gzip)B2=await P1(u),f.set("content-encoding","gzip"),C.add(q),H()}return new Request(J2,{method:F.method,headers:f,redirect:q.route==="oauth"?"error":F.redirect,signal:F.signal,...B2!==void 0?{body:B2}:{}})};return{adapter:{providerID:q2,chooseAccount:(G)=>O(G,async()=>{let H=await Z.chooseAccount(G);if(typeof H==="object"&&G.phase==="retry")return H;if(typeof H!=="string"||!H)throw V(G);return H}),dropChoice:(G)=>Z.dropChoice?.(G),accountHeaders:d,rewriteRequest:r,rewriteHandshakeURL(){throw new O2},rewriteResponse({response:G,attempt:H}){let F=H.data;if(F&&!Q(G.headers,F)){if(G.status===401)return A(F),G.body?.cancel().catch(()=>{}),Response.json({type:"error",error:{type:"api_error",message:"Relay authentication failed before Anthropic received the request"}},{status:502});return s(F,G)}if(F&&C.has(F))C.delete(F),L1(G).then((p)=>{if(!p)return;L.latchProcess(),z?.warn("gzipped request body rejected; later requests go uncompressed",{kind:p,status:G.status})},()=>{});let x=s(F,G);if(F?.route!=="oauth"||!x.body)return J(F,x);let q={...I(H,F),status:G.status},w=Z.responseOptions?.(q)??{},f=(G.headers.get("content-type")??"").includes("application/json");return J(F,x$(x,{...w,toolNameMap:U.get(F),onToolNameRefusal:()=>{M.set(F,"response_tool_names"),A(F)},laneStartOAuthServed:!0,...f?{responseMode:"json"}:{}}))},quotaFromHeaders(G,H,F){let x=F.data;if(!x||!Q(G,x))return;return Z.quotaFromHeaders?.(G,{...I(F,x),status:H})},async limitFromResponse({status:G,headers:H,body:F,attempt:x}){let q=x.data;if(!q||M.get(q)==="response_tool_names")return;if(!Q(H,q))return Z.limitFromRelayFailure?.({...I(x,q),status:G});if(K.set(q,`provider responded with HTTP ${G}`),!Z.limitFromResponse)return;let w=a.get(H)===q,f=k(q);return Z.limitFromResponse({...I(x,q),status:G,headers:H,body:async()=>w?await F():f.redactText(await F())})},inspectEvent({data:G,event:H,attempt:F}){if(F.data&&M.get(F.data)==="response_tool_names")return;let x=A2(G);if(!P2(x))return;let q=typeof x.type==="string"?x.type:H;if(q==="content_block_start"||q==="content_block_delta")return{outputStarted:!0};if(q==="message_stop")return{done:!0};if(q!=="error")return;let w=F.data,f=k(w),p=P2(x.error)?x.error:{},u=typeof p.type!=="string"?void 0:_$.has(p.type)?p.type:f.redactText(p.type),Z2=typeof p.message==="string"?f.redactText(p.message):void 0;if(w?.dispatch==="http-relay"&&Y.get(w)===!1)return;let J2=w?Z.limitFromStreamError?.({...I(F,w),errorType:u,message:Z2}):void 0,Y2={error:[u??"error",Z2].filter(Boolean).join(": ").slice(0,w1),...J2?{limit:J2}:{}};if(w&&Y2.error)K.set(w,Y2.error);return Y2},limitFromError(G,H){let F=H.data;if(!F||M.has(F))return;let x={type:_$.has(G.type)?G.type:"provider_error",message:K.get(F)??"provider request failed",...G.status!==void 0?{status:G.status}:{}};if(A(F),F.dispatch==="http-relay"&&Y.get(F)===!1)return;return Z.limitFromHostError?.(x,I(H,F))},async onAttemptEnd(G,H){let F=G.data;if(!F)return;P.delete(F);let x=H.error?.reason;if(x==="cancelled"||x==="abandoned"||x===void 0&&(H.status===void 0||H.status<400))A(F);let q=M.get(F),{status:w,...f}=H,p=Z.onAttemptEnd?.(I(G,F),{...f,...w!==void 0&&(F.dispatch!=="http-relay"||Y.get(F)===!0)?{status:w}:{},...q!==void 0?{localRefusal:{check:q}}:{}});if(await h1(p,N)==="timed-out")z?.warn("the account source did not finish recording a send",{timeoutMs:N})}},dispose(){t=!0;for(let[G,H]of R){for(let F of H)F.revoked=!0;Z.forgetSession?.(G)}R.clear(),P.clear();for(let G of[...B.keys()])A(G)},forgetSession(G){for(let H of R.get(G)??[])H.revoked=!0;R.delete(G);for(let[H,F]of P)if(F.sessionID===G)P.delete(H);for(let[H,F]of[...B])if(F.sessionID===G)A(H);Z.forgetSession?.(G)},get pendingSendCount(){return P.size},get heldCredentialCount(){let G=0;for(let H of P.values())if(H.oauth)G++;return G},get heldRedactorCount(){return B.size},get operationsInProgress(){let G=0;for(let H of R.values())G+=H.size;return G}}}function b2(X){return JSON.stringify([X.source,X.accountIdentity,X.credentialId,X.binding?.storageId,X.binding?.rowId,X.binding?.credentialEpoch])}function D$(X){let{runtime:Z,source:z}=X,W=new AbortController,N=!1,L=new d1({directory:X.registryDirectory||process.env.OPENCODE_ANTHROPIC_AUTH_CACHEKEEP_REGISTRY_DIR||u1("opencode"),now:X.now}),C=new Map,P=async(B,K,E)=>{let k=E?AbortSignal.any([W.signal,E]):W.signal;k.throwIfAborted();let A=JSON.parse(await K.text()),h={providerID:"anthropic",modelID:A.model,sessionID:`oc2-cachekeep:${B.id}`,agent:"cachekeep",kind:"generate"},y=S2({source:{...z,onRequestPrepared:void 0,responseOptions:void 0,async requestOptions(J){return{...await z.requestOptions?.(J),laneStart:!1,billingLineage:void 0,cacheDiagnosticsPreviousMessageId:void 0}},async authorizeAccount(J,Q){let V=await Z.read();k.throwIfAborted();let R=V.accounts.find((b)=>b.id===Q);if(R?.type!=="oauth"||b2(R)!==B.oauthAccountIdentity||B.isSubagent&&!e2(V.policyStorage)||!t2(V.policyStorage)||!b$(V.policyStorage,new Date(X.now?.()??Date.now())))return;let O=await z.authorizeAccount(J,Q);if(O?.provenance.kind==="local"&&b2({...R,binding:O.provenance.subject.binding,accountIdentity:O.provenance.subject.binding.identity})!==B.oauthAccountIdentity)return;if(O?.provenance.kind==="vault"&&O.provenance.credentialId!==R.credentialId)return;return O},async admitRequest(J){await z.admitRequest?.(J);let Q=await Z.read(),V=Q.accounts.find((R)=>R.id===J.accountId);if(k.throwIfAborted(),!V||b2(V)!==B.oauthAccountIdentity||B.isSubagent&&!e2(Q.policyStorage)||!t2(Q.policyStorage)||!b$(Q.policyStorage,new Date(X.now?.()??Date.now())))throw Error("CacheKeep policy changed before dispatch")}}}),c,s,t=!1,a=()=>y.forgetSession(h.sessionID);k.addEventListener("abort",a,{once:!0});try{let J=(await Z.read()).accounts.find((I)=>b2(I)===B.oauthAccountIdentity)?.id;if(!J)throw Error("CacheKeep account is unavailable");let Q=await y.adapter.accountHeaders({...h,accountId:J});if(!("headers"in Q)||typeof Q.headers!=="object"||Q.headers===null||typeof Q.attempt!=="object"||Q.attempt===null||Q.attempt.route!=="oauth")throw Error("CacheKeep authorization refused");c={...h,accountId:J,attemptId:crypto.randomUUID(),transport:"http",data:Q.attempt};let V=await y.adapter.rewriteRequest?.({...h,accountId:J,attempt:c,request:new Request(B.url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(A),signal:k})});if(!V)throw Error("CacheKeep rewrite refused");k.throwIfAborted();let R=await(X.fetch??fetch)(V),O=await y.adapter.rewriteResponse?.({...h,accountId:J,attempt:c,request:V,response:R});if(!O)throw Error("CacheKeep response rewrite refused");if(s=O.status,y.adapter.quotaFromHeaders?.(O.headers,O.status,c),!O.ok)await y.adapter.limitFromResponse?.({status:s,headers:O.headers,body:()=>O.clone().text(),attempt:c});let b=await O.arrayBuffer();return t=!0,new Response(b,{status:s,headers:O.headers})}catch{throw Error("Native CacheKeep was not completed")}finally{k.removeEventListener("abort",a);try{if(c)await y.adapter.onAttemptEnd?.(c,{status:s,outputStarted:!1,...t?{}:{error:{reason:"cancelled"}}})}finally{y.dispose(),z.forgetSession?.(h.sessionID)}}},M=X.setIntervalImpl??globalThis.setInterval,Y=new l1({loadStorage:async()=>N?null:(await Z.read()).policyStorage,now:X.now,setIntervalImpl:(B,K)=>M(()=>Y.tick().catch(()=>{p1.warn("cachekeep","tick failed")}),K),clearIntervalImpl:X.clearIntervalImpl,onTrackedSessionsChanged:(B)=>L.publish(N?[]:B),prepareHeaders(B,K,E){if(N)return;return C.set(E.id,{target:K,attempt:E}),new Headers({"x-native-cachekeep-attempt":String(E.id)})},fetchImpl:async(B,K)=>{let E=new Request(B,K),k=Number(E.headers.get("x-native-cachekeep-attempt")),A=C.get(k);if(C.delete(k),!A)throw Error("CacheKeep attempt is unavailable");return P(A.target,E,A.attempt.signal)},onComplete:({attempt:B})=>{C.delete(B.id)}}),U;return{async track(B){if(N||B.route!=="oauth"||B.agent==="cachekeep"||B.agent==="prime"||B.kind!=="primary")return;let K=await Z.read();if(N||!t2(K.policyStorage))return;let E=!1;try{E=await X.isSubagent?.(B.sessionID)??!1}catch{return}if(N||E&&!e2(K.policyStorage))return;let k=K.accounts.find((A)=>A.id===B.accountId);if(!k?.accountIdentity)return;if(B.provenance.kind==="local"&&JSON.stringify(k.binding)!==JSON.stringify(B.provenance.subject.binding))return;if(B.provenance.kind==="vault"&&k.credentialId!==B.provenance.credentialId)return;Y.track({sessionId:B.sessionID,url:B.url,headers:new Headers,bodyText:B.bodyText,storage:K.policyStorage,cacheMode:"hybrid",oauthAccountId:B.accountId,oauthAccountIdentity:b2(k),isSubagent:E}),await L.publish(Y.trackedSessions())},registry:L,dispose(){if(U)return U;return N=!0,Y.stop(),W.abort(),U=(async()=>{try{await Y.tick()}finally{C.clear(),await L.dispose()}})(),U}}}async function w$(X,Z,z){let W=S2(Z),N=[],L=async(K,E,k)=>{let A=await X.session.hook(K,E,k);return N.push(A),A},C=new AbortController,P;try{P=await r2({session:{hook:L},event:X.event},W.adapter,{logger:Z.log,gateOnPlaceholder:z})}catch(K){throw W.dispose(),await Promise.allSettled(N.map((E)=>E.dispose())),K}let M=(K)=>{W.forgetSession(K),P.forgetSession(K)},Y=X.event,U=Y?(async()=>{try{for await(let K of Y.subscribe({signal:C.signal}))if(K.type==="session.deleted")M(K.data.sessionID)}catch(K){if(!C.signal.aborted)Z.log?.warn("stopped listening for session deletion",{error:K instanceof Error?K.name:"unknown"})}})():Promise.resolve(),B;return{installation:P,forgetSession:M,dispose(){if(B)return B;return W.dispose(),C.abort(),B=(async()=>{await P.dispose(),await U})(),B}}}import{effectiveRelayTransport as y$,getQuotaCheckIntervalMs as c1,logger as i1,nativeAccountCanServe as o1,oauthProfileIsFresh as n1,quotaSnapshotCheckedAt as r1}from"@cortexkit/anthropic-auth-core";function I$(X,Z){let z=new AbortController,W,N=!1,L=async()=>{let M=await X.read();if(z.signal.throwIfAborted(),M.policyStorage.relay?.enabled===!0&&y$(M.policyStorage.relay.transport,M.policyStorage.relay.url)==="websocket")return;let Y=M,U=c1(Y.policyStorage);for(let B of Y.accounts){if(z.signal.aborted)return;if(!o1(B)||B.type!=="oauth")continue;if(Y.policyStorage.quota?.enabled!==!1&&Date.now()-r1(B.quota)>=U)await X.fetchQuota(B.id,Z,z.signal,void 0,"background").catch(()=>{});if(!n1(B.profile)&&!z.signal.aborted)await X.fetchProfile(B.id,Z,z.signal).catch(()=>{})}},C=()=>{if(N||W)return W;return W=L().catch(()=>{if(!z.signal.aborted)i1.debug("opencode2","native background readings did not complete")}).finally(()=>{W=void 0}),W},P=X.vault.watch({intervalMs:60000,onRefresh:C,shouldRefresh:async()=>{let M=await X.read();return M.policyStorage.relay?.enabled!==!0||y$(M.policyStorage.relay.transport,M.policyStorage.relay.url)==="http"}});return P.ready.catch(()=>{}),{async dispose(){N=!0,P.close(),z.abort(),await W}}}import{authorize as jX,buildCacheKeepStatusSummary as WX,buildClaudeQuotaSummary as QX,buildPrimeAccountStatuses as BX,buildPrimeStatusSummary as UX,CLAUSTRUM_OPENCODE_ENROLLMENT_NAME as HX,exchange as KX,formatNativeAccountState as MX,formatOAuthAccountTier as zX,getCacheKeepWindow as _X,getHostClaustrumEnrollmentPaths as NX,isCacheKeepAlways as FX,isCacheKeepHybridActive as LX,isCacheKeepPersistentlyEnabled as CX,nativeAccountCanServe as PX,resetClaustrumEnrollmentState as TX}from"@cortexkit/anthropic-auth-core";import{buildPrimeAccountStatuses as s1,effectiveRelayStatus as a1,formatNativeAccountState as t1,formatOAuthAccountTier as f$,getCacheKeepWindow as e1,getRoutingMode as $X,isCacheKeepAlways as XX,isCacheKeepHybridActive as ZX,isPermanentRefreshError as JX,isPrimePersistentlyEnabled as YX,nativeAccountCanServe as m$,refreshBackoffActive as g$}from"@cortexkit/anthropic-auth-core";var v$=(X)=>m$(X)&&X.state!=="unsupported-access"?void 0:t1(X)||void 0,GX=(X)=>{if(X.source!=="vault")return"off";if(X.state==="needs_reauth")return"on-vault-reauth";return m$(X)?"on-vault-served":"on-cold"},VX=(X,Z)=>typeof X==="number"&&X>Z;function h$(X,Z){let{now:z}=Z,W=X.policyStorage,N=X.accounts.filter((U)=>U.type==="oauth"),L=N.find((U)=>U.id==="main"),C=L?v$(L):void 0,P=L?.lastQuotaRefreshError?.nextRetryAt,M=L?.lastRefreshError,Y=e1(W);return{main:{quota:L?.quota??null,enabled:L?.enabled,tierLabel:f$(L?.profile),quotaBackedOff:VX(P,z),quotaBackoffUntil:P,refreshBackedOff:g$(M,L?.accountIdentity,z,void 0),refreshBackoffUntil:M?.nextRetryAt,stateLine:C,quotaDated:Boolean(C)},fallbacks:N.filter((U)=>U.id!=="main"&&(U.enabled||U.source==="vault")).map((U)=>{let B=v$(U),K=GX(U);return{id:U.id,label:U.label,quota:U.quota??null,enabled:U.enabled,tierLabel:f$(U.profile),needsReauth:JX(U.lastRefreshError)&&g$(U.lastRefreshError,U.accountIdentity,z,void 0),...K==="on-vault-reauth"?{vaultReauth:!0}:{},...K==="on-vault-served"?{vaultServed:!0}:{},...K!=="off"?{custodyState:K}:{},stateLine:B,quotaDated:Boolean(B)}}),...Z.activeId!==void 0&&{activeId:Z.activeId},route:$X(W),relay:a1(W.relay),fastMode:W.claudeFast?.enabled===!0,cacheKeep:{enabled:ZX(W),...XX(W)?{window:"always"}:Y&&{window:`${Y.startHour}-${Y.endHour}`},trackedSessions:Z.trackedSessions},prime:YX(W)?{enabled:!0,accounts:s1(W,{now:z})}:void 0,lastUpdated:z}}var $$=(X)=>X!==null&&typeof X==="object"&&!Array.isArray(X)?X:{},l$=`For first-time model access, connect Anthropic with "${m2}".
4
+ Run: opencode auth login anthropic --method ${v2}`,d$=(X)=>X.mode==="local"&&!X.accounts.some((Z)=>Z.id==="main"),EX=(X)=>{let Z=X.id==="main"?"main":"fallback",z=`${X.enabled?"enabled":"disabled"}, ${X.type}, ${X.source}${X.state?`, ${MX(X)}`:""}`;if(X.label)return`${X.label} [${Z}]: ${z}
5
+ Route: ${X.id}`;return`${Z==="main"?"Main account":`Fallback ${X.id}`}: ${z}`};function p$(X){let{runtime:Z,source:z}=X,W=new Map,N=!1,L=async(Y,U)=>{await Z.updateSettings((B)=>({...B,[Y]:{...$$(B[Y]),...U}}))},C=()=>({ok:!0,text:"Native Claude settings updated."}),P=async(Y,U)=>{if(N)throw Error("Native menu is closed");switch(U.signal?.throwIfAborted(),Y.action){case"enable":case"disable":return await Z.setEnabled(Y.values.id,Y.action==="enable"),C();case"remove":return await Z.remove(Y.values.id),C();case"move-up":case"move-down":{let K=(await Z.read()).accounts.map((y)=>y.id),E=K.indexOf(Y.values.id),k=E+(Y.action==="move-up"?-1:1);if(E<0||k<0||k>=K.length)return{ok:!1,text:"Account cannot move in that direction."};let A=K[E],h=K[k];if(A===void 0||h===void 0)return{ok:!1,text:"Account order changed."};return K[E]=h,K[k]=A,await Z.reorder(K),C()}case"add-apikey":return await Z.addApi(Y.values),{ok:!0,text:"API route stored in the native account pool."};case"add-oauth-start":{let B=new AbortController;W.get(Y.sessionId)?.active.abort();let K={active:B,auth:void 0};W.set(Y.sessionId,K);let E=await jX("max");if(N||B.signal.aborted||U.signal?.aborted)return{ok:!1,text:"Sign-in cancelled."};return K.auth=E,{ok:!0,text:`Open ${E.url} and paste the returned code using Finish OAuth sign-in.`}}case"add-oauth-finish":{let B=W.get(Y.sessionId);if(!B?.auth)return{ok:!1,text:"Start OAuth sign-in in this session first."};let K=await KX(Y.values.code,B.auth.verifier,B.auth.redirectUri,B.auth.state);if(B.active.signal.throwIfAborted(),U.signal?.throwIfAborted(),N||K.type!=="success")return{ok:!1,text:"OAuth sign-in did not complete."};if(await Z.loginOAuth({routeId:crypto.randomUUID(),credential:{access:K.access,refresh:K.refresh,expires:K.expires},label:Y.values.label}),B.active.signal.throwIfAborted(),U.signal?.throwIfAborted(),N)return{ok:!1,text:"Sign-in cancelled."};W.delete(Y.sessionId);let E="OAuth account stored in the native account pool.";return{ok:!0,text:d$(await Z.read())?`${E}
6
6
 
7
- ${w$}
7
+ ${l$}
8
8
 
9
- Adding an account here does not change OpenCode's Anthropic connection.`:E}}case"reset-backoff":{let W=await X.read();for(let U of W.accounts){if(H.signal?.throwIfAborted(),U.type!=="oauth")continue;let E=U.source==="vault"?await X.authorizeVault(U.id,H.signal):await X.captureLocalSubject(U.id);await X.resetBackoff(U.id,E)}return P()}case"enrollment-reset":{let W=await HJ(VJ("opencode"),JJ);return{ok:W==="reset",text:W==="reset"?"Terminal enrollment state reset. Run offline setup to reconnect.":W==="refused-pending"?"An enrollment request may still be in progress. Quit OpenCode and run setup again; it picks up the same request.":"Only terminal enrollment state may be reset; active enrollment was left unchanged."}}case"quota-refresh":{let U=(await X.read()).accounts.filter((A)=>A.type==="oauth"&&BJ(A)),E=await Promise.allSettled(U.map((A)=>X.fetchQuota(A.id,void 0,H.signal)));return{ok:E.every((A)=>A.status==="fulfilled"),text:`${E.filter((A)=>A.status==="fulfilled").length}/${U.length} native quota readings refreshed.`}}case"routing-reset":return await M.resetRouting(Y.sessionId),P();case"routing-mode":return await N("routing",{mode:Y.values.mode}),P();case"killswitch-on":case"killswitch-off":return await N("killswitch",{enabled:Y.action==="killswitch-on"}),P();case"killswitch-set":return await X.updateSettings((W)=>{let U=r2(W.killswitch),E={...r2(U.accounts)},q=U.main;for(let A of Y.values.entries){let m={five_hour:A.fh,seven_day:A.sd,...A.scoped!==void 0?{scoped:A.scoped}:{}};if(A.account==="main"||A.account==="all")q=m;if(A.account==="all")for(let w of Object.keys(E))E[w]=m;else if(A.account!=="main")E[A.account]=m}return{...W,killswitch:{...U,main:q,accounts:E}}}),P();case"cache-on":case"cache-off":return await N("claudeCache",{enabled:Y.action==="cache-on"}),P();case"cache-mode":return await N("claudeCache",{mode:Y.values.mode}),P();case"cachekeep-always":return await N("cacheKeep",{enabled:!0,always:!0}),P();case"cachekeep-off":return await N("cacheKeep",{enabled:!1}),P();case"cachekeep-window":return await N("cacheKeep",{enabled:!0,always:!1,startHour:Y.values.startHour,endHour:Y.values.endHour}),P();case"cachekeep-subagents":return await N("cacheKeep",{subagents:Y.values.enabled==="on"}),P();case"dump-on":case"dump-off":return await N("dump",{enabled:Y.action==="dump-on"}),P();case"logging-level":return await N("logging",{level:Y.values.level}),P();case"fast-on":case"fast-off":return await N("claudeFast",{enabled:Y.action==="fast-on"}),P();case"prime-on":case"prime-off":return await N("prime",{enabled:Y.action==="prime-on"}),P();case"start-fire":return await K(Y.sessionId),{ok:!0,text:"Claude lane start queued in this session."}}},K=(Y)=>$.start(Y,D2);return{dispatch:T,async readStatus(Y){let H=await X.read();if(Y==="account"){let U=H.accounts.map(UJ).join(`
10
- `)||"No native Claude accounts.";return y$(H)?`${U}
9
+ Adding an account here does not change OpenCode's Anthropic connection.`:E}}case"reset-backoff":{let B=await Z.read();for(let K of B.accounts){if(U.signal?.throwIfAborted(),K.type!=="oauth")continue;let E=K.source==="vault"?await Z.authorizeVault(K.id,U.signal):await Z.captureLocalSubject(K.id);await Z.resetBackoff(K.id,E)}return C()}case"enrollment-reset":{let B=await TX(NX("opencode"),HX);return{ok:B==="reset",text:B==="reset"?"Terminal enrollment state reset. Run offline setup to reconnect.":B==="refused-pending"?"An enrollment request may still be in progress. Quit OpenCode and run setup again; it picks up the same request.":"Only terminal enrollment state may be reset; active enrollment was left unchanged."}}case"quota-refresh":{let K=(await Z.read()).accounts.filter((A)=>A.type==="oauth"&&PX(A)),E=await Promise.allSettled(K.map((A)=>Z.fetchQuota(A.id,void 0,U.signal)));return{ok:E.every((A)=>A.status==="fulfilled"),text:`${E.filter((A)=>A.status==="fulfilled").length}/${K.length} native quota readings refreshed.`}}case"routing-reset":return await z.resetRouting(Y.sessionId),C();case"routing-mode":return await L("routing",{mode:Y.values.mode}),C();case"killswitch-on":case"killswitch-off":return await L("killswitch",{enabled:Y.action==="killswitch-on"}),C();case"killswitch-set":return await Z.updateSettings((B)=>{let K=$$(B.killswitch),E={...$$(K.accounts)},k=K.main;for(let A of Y.values.entries){let h={five_hour:A.fh,seven_day:A.sd,...A.scoped!==void 0?{scoped:A.scoped}:{}};if(A.account==="main"||A.account==="all")k=h;if(A.account==="all")for(let y of Object.keys(E))E[y]=h;else if(A.account!=="main")E[A.account]=h}return{...B,killswitch:{...K,main:k,accounts:E}}}),C();case"cache-on":case"cache-off":return await L("claudeCache",{enabled:Y.action==="cache-on"}),C();case"cache-mode":return await L("claudeCache",{mode:Y.values.mode}),C();case"cachekeep-always":return await L("cacheKeep",{enabled:!0,always:!0}),C();case"cachekeep-off":return await L("cacheKeep",{enabled:!1}),C();case"cachekeep-window":return await L("cacheKeep",{enabled:!0,always:!1,startHour:Y.values.startHour,endHour:Y.values.endHour}),C();case"cachekeep-subagents":return await L("cacheKeep",{subagents:Y.values.enabled==="on"}),C();case"dump-on":case"dump-off":return await L("dump",{enabled:Y.action==="dump-on"}),C();case"logging-level":return await L("logging",{level:Y.values.level}),C();case"fast-on":case"fast-off":return await L("claudeFast",{enabled:Y.action==="fast-on"}),C();case"prime-on":case"prime-off":return await L("prime",{enabled:Y.action==="prime-on"}),C();case"start-fire":return await M(Y.sessionId),{ok:!0,text:"Claude lane start queued in this session."}}},M=(Y)=>X.start(Y,g2);return{dispatch:P,async readStatus(Y){let U=await Z.read();if(Y==="account"){let K=U.accounts.map(EX).join(`
10
+ `)||"No native Claude accounts.";return d$(U)?`${K}
11
11
 
12
- ${w$}
13
- Quota refresh checks the pool; it does not check OpenCode's Anthropic connection.`:U}if(Y==="quota")return t1({accounts:H.accounts.filter((U)=>U.type==="oauth").map((U)=>({name:U.label??U.id,role:U.id==="main"?"main":"fallback",enabled:U.enabled,quota:U.quota,tierLabel:YJ(U.profile),lastRefreshedAt:U.lastRefreshedAt,error:U.lastQuotaRefreshError?.message}))}).replace(/Usage:[^\n]*/,"Use /claude to refresh native quota readings.");if(Y==="prime")return $J({enabled:H.policyStorage.prime?.enabled===!0,accounts:e1(H.policyStorage)}).replace(/Usage:[^\n]*/,"Use /claude to change Prime settings.");if(Y==="cachekeep"){let U=await $.cacheKeepRegistry?.list()??[];return a1({enabled:QJ(H.policyStorage),always:jJ(H.policyStorage),hybridActive:WJ(H.policyStorage),trackedSessionDetails:U,window:GJ(H.policyStorage),trackedSessions:U.length,nextPrewarmAt:U.length?Math.min(...U.map((E)=>E.nextPrewarmAt)):void 0})}let W={routing:"routing",killswitch:"killswitch",cache:"claudeCache",cachekeep:"cacheKeep",dump:"dump",logging:"logging",fast:"claudeFast",prime:"prime"};return JSON.stringify(H.settings[W[Y]]??{})},async readSidebar(Y){let[H,W]=await Promise.all([X.read(),$.cacheKeepRegistry?.list()??[]]);return b$(H,{activeId:M.servedAccount(Y),trackedSessions:W.length,now:Date.now()})},forgetSession(Y){V.get(Y)?.active.abort(),V.delete(Y)},close(){L=!0;for(let Y of V.values())Y.active.abort();V.clear()}}}import{resolveClaudeModelCapabilities as KJ}from"@cortexkit/anthropic-auth-core";function f$(){let $=new Map;return{install:(M)=>M.model.transform((V)=>{$.clear();for(let L of V.list("anthropic")){$.set(String(L.id),String(L.modelID));let N=KJ(L.modelID)?.efforts.variants;if(!N)continue;V.update("anthropic",String(L.id),(P)=>{let T=P.variants.filter((K)=>!N.some((Y)=>Y===String(K.id)));P.variants=[...T,...N.map((K)=>({id:K,settings:{effort:K,thinking:{type:"adaptive",display:"summarized"}}}))]})}}),modelId:(M)=>$.get(M)??M}}function g$($){return $.get("authorization")?.match(/^Bearer ([^\s]+)$/i)?.[1]??$.get("x-api-key")??void 0}import{buildPrimeRequestBody as v$,effectiveRelayTransport as h$,nativeAccountCanServe as MJ,PrimeManager as zJ}from"@cortexkit/anthropic-auth-core";var m$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)?$:{};function l$($){let{runtime:X,source:M}=$,V=new AbortController,L=new Set,N=(K)=>({providerID:"anthropic",modelID:v$().model,sessionID:`oc2-prime:${K}`,agent:"prime",kind:"generate"}),P=async(K)=>{let Y=N(K),H=P2({source:M}),W=performance.now();try{for(let U=0;U<3;U++){if(V.signal.throwIfAborted(),(await X.read()).policyStorage.prime?.enabled!==!0)throw Error("Native Prime is disabled");let q=await H.adapter.accountHeaders({...Y,accountId:K});if(!("headers"in q)||typeof q.headers!=="object"||q.headers===null||typeof q.attempt!=="object"||q.attempt===null)throw Error("Native Prime authorization refused");let A={...Y,accountId:K,attemptId:crypto.randomUUID(),transport:"http",data:q.attempt},m,w=!1,c=!1,r=(o)=>{c=!0,o.body?.cancel().catch(()=>{})};try{let o=await H.adapter.rewriteRequest?.({...Y,accountId:K,attempt:A,request:new Request("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(v$()),signal:V.signal})});if(!o)throw Error("Native Prime rewrite refused");let s=new Headers(o.headers);for(let[l,p]of Object.entries(q.headers))if(p===null)s.delete(l);else s.set(l,p);let Z=new Request(o,{headers:s}),j=await($.fetch??fetch)(Z),G=await H.adapter.rewriteResponse?.({...Y,accountId:K,request:Z,response:j,attempt:A})??j;m=G.status,H.adapter.quotaFromHeaders?.(G.headers,G.status,A);let x=G.ok?void 0:await H.adapter.limitFromResponse?.({status:G.status,headers:G.headers,body:()=>G.clone().text(),attempt:A});if(x&&/^(vault-newer|local-newer|relay-direct):/.test(x.reason)&&U<2){r(G);let l={...Y,phase:"retry",rerouteFrom:{accountId:K,limit:x}};if(await M.chooseAccount(l)!==K)throw Error("Native Prime retry changed account");continue}if(!G.ok)return r(G),{ok:!1,status:m,ms:performance.now()-W,error:"Native Prime upstream refused the request"};let O=m$(await G.json()),D=m$(O.usage),y={inputTokens:typeof D.input_tokens==="number"?D.input_tokens:void 0,outputTokens:typeof D.output_tokens==="number"?D.output_tokens:void 0};if(A.data?.dispatch==="http-relay"&&!/^req_[A-Za-z0-9_-]+$/.test(G.headers.get("request-id")??""))throw Error("Native Prime relay response has no upstream provenance");if(w=await M.recordPrime(q.attempt.provenance,y),!w)throw Error("Native Prime counter attribution was superseded");return{ok:!0,status:m,ms:performance.now()-W,usage:y}}finally{await H.adapter.onAttemptEnd?.(A,{status:m,outputStarted:!1,...w?{}:{error:{reason:c?"cancelled":"failed"}}})}}return{ok:!1,error:"Native Prime retry budget exhausted"}}catch{return{ok:!1,error:"Native Prime was not completed",ms:performance.now()-W}}finally{H.dispose()}},T=new zJ({storagePath:$.paths.legacyConfig,loadStorage:async()=>(await X.read()).policyStorage,async getAccountFingerprint(K){let Y=await X.read(),H=Y.accounts.find((U)=>U.id===K);if(!MJ(H)||H?.type!=="oauth")return;if(Y.policyStorage.relay?.enabled===!0&&h$(Y.policyStorage.relay.transport,Y.policyStorage.relay.url)==="websocket")return;if(H.source==="vault"){let U=await X.authorizeVault(K,V.signal);return X.getOrCreateAuthLineage(K,U)}let W=await X.authorizeLocal(K,{signal:V.signal});return W.status==="usable"?X.getOrCreateAuthLineage(K,W.subject):void 0},async refreshQuota(K){let Y=await X.read();if(Y.policyStorage.relay?.enabled===!0&&h$(Y.policyStorage.relay.transport,Y.policyStorage.relay.url)==="websocket")throw Error("WebSocket relay is unsupported on OpenCode 2");return{quota:await X.fetchQuota(K,$.fetch,V.signal),fresh:!0}},sendPrime(K){let Y=P(K);return L.add(Y),Y.finally(()=>L.delete(Y)),Y},async recordSuccess(K){let Y=(await X.read()).accounts.find((H)=>H.id===K);if(!Y?.prime)throw Error("Native Prime counters are unavailable");return Y.prime}});return T.start(),{manager:T,async dispose(){T.stop(),V.abort(),await Promise.allSettled(L)}}}import{createNativeUsagePublisher as _J,effectiveRelayTransport as FJ,getClaudeCodeIdentityForVerifiedAccount as y2,getQuotaCheckIntervalMs as CJ,getRoutingMode as d$,isQuotaBearingHeaderFrame as NJ,logger as LJ,mergeHeaderQuotaForPersistence as PJ,NativeVaultNoAccountError as TJ,nativeAccountCanServe as s2,nativeAccountPolicy as I2,nativeLocalQuotaLineage as EJ,nativePollQuotaGenerallyExhausted as OJ,normalizeQuotaHeaders as SJ,quotaSnapshotCheckedAt as p$,quotaSnapshotHasStandardWindows as RJ,readNativeAccountsForRequest as xJ,remapModelId as a2,StickySessionRouter as AJ,shouldFallbackStatus as qJ,stickyQuotaSnapshotIsFresh as f2,stickyRouteFamilyForModel as kJ}from"@cortexkit/anthropic-auth-core";var t2=($)=>["five_hour","seven_day"].some((X)=>($?.[X]?.remainingPercent??1)<=0);function i$($){let{runtime:X}=$,M=_J("native-auth"),V=new Map,L=(Z)=>{let j=Z.routingPath;if(!j)throw Error("Native routing storage is unavailable");let G=V.get(j);if(!G)G=new AJ({path:j,vaultSeed:Z.routingSeed,onLockEvent:X.onLockEvent,localRecoveryPath:Z.mode==="local"?Z.routingRecoveryPath:void 0}),V.set(j,G);return G.setVaultSeed(Z.routingSeed),G},N=new WeakMap,P=new Map,T=new Map,K=new Map,Y=new Map,H=new WeakSet,W=!1,U=()=>{while(P.size>512){let Z=P.keys().next();if(!Z.done)P.delete(Z.value)}},E=(Z,j)=>JSON.stringify([Z.sessionID,Z.kind,Z.modelID,j]),q=(Z)=>{if(W)throw Error("Native Anthropic source is closed");let j=K.get(Z.sessionID);if(!j){j=new AbortController,K.set(Z.sessionID,j);while(K.size>512){let G=K.keys().next();if(!G.done)s.forgetSession?.(G.value)}}return j},A=(Z,j,G)=>s2(Z)&&(Z.type==="api"||I2(Z,j,a2(G)).status==="allowed"),m=async(Z,j,G,x)=>{let O=await X.read();x.signal.throwIfAborted(),w(O);let D=O.accounts.find((y)=>y.id===Z);if(!D||D.type!==G||!A(D,O,j))return!1;if(G==="api"){let y=O.accounts.find((l)=>l.id==="main"&&l.type==="oauth");return!!y&&f2(y.quota,O.policyStorage)&&t2(y.quota)}return!0},w=(Z)=>{let j=Z.policyStorage.relay;if(j?.enabled===!0&&FJ(j.transport,j.url)==="websocket")throw new L2},c=async(Z,j)=>{if(w(Z),j||Z.policyStorage.relay?.enabled!==!0)return{dispatch:{kind:"direct"},relayFallback:!1};let G=await X.getRelayConfig();if(!G)throw Error("request refused: native HTTP relay configuration is unavailable");if(G.transport!=="http")throw new L2;return{dispatch:{kind:"http-relay",url:G.url,token:G.token},relayFallback:G.fallbackToDirect}};async function r(Z,j,G){if(Z.kind==="local"){let x=await X.publishLocal(Z.subject,G);if(!x&&G.quota)LJ.warn("quota","Quota publication discarded");return x}if(Z.kind==="vault"&&j.receipt)await X.vault.publish(j.receipt,G);else if(Z.kind==="api"&&G.lastUsed!==void 0)await X.publishApi(Z.subject,{lastUsed:G.lastUsed});return!0}function o(Z,j,G){if(Z.kind!=="local")return;let x=Z.subject.binding,O=p$(G),D={lineage:EJ(x),accountUuid:x.identity,entry:{quota:G,checkedAt:O,refreshAfter:O},generalExhausted:OJ(G),routeBeforeSave:!0};return X.quotaObservations.hold(j.account.id,D)?D:void 0}let s={async chooseAccount(Z){let j=q(Z);$.onOwnedRequest?.();let G=await X.read();j.signal.throwIfAborted(),w(G);let x=a2(await $.resolveModelId?.(Z)??Z.modelID);if(j.signal.throwIfAborted(),G.mode==="claustrum")G=await xJ(X,j.signal),j.signal.throwIfAborted();if(G.policyStorage.quota?.enabled!==!1){let I=!1;for(let u of G.accounts){if(!s2(u)||u.type!=="oauth")continue;if(RJ(u.quota)?f2(u.quota,G.policyStorage,Date.now(),x):Date.now()-p$(u.quota)<CJ(G.policyStorage))continue;try{await X.fetchQuota(u.id,$.fetch,j.signal,void 0,"admission"),I=!0}catch{j.signal.throwIfAborted()}}if(I)G=await X.read();j.signal.throwIfAborted()}let O=Z.rerouteFrom?P.get(Z.rerouteFrom.limit.reason):void 0;if(Z.rerouteFrom&&/^(vault-newer|local-newer|relay-direct):/.test(Z.rerouteFrom.limit.reason)&&!O)return;if(O&&Z.rerouteFrom){let I=G.accounts.find((B)=>B.id===O.accountId);if(!I||!A(I,G,x))return;P.delete(Z.rerouteFrom.limit.reason);let u=E(Z,O.accountId),d=T.get(u)??[];return d.push(O),T.set(u,d),O.accountId}let D=[];for(let I of G.accounts){if(I.type!=="oauth"||!A(I,G,x))continue;if(I.source==="local"){let u=await X.authorizeLocal(I.id,{signal:j.signal,policy:(d,B)=>I2(d,B,x)});if(j.signal.throwIfAborted(),u.status!=="usable")continue}D.push(I)}let y=D.filter((I)=>I.id!==Z.rerouteFrom?.accountId);if(d$(G.policyStorage)==="sticky-balanced"){let I=y.map((d,B)=>({accountId:d.id,order:B,quota:d.quota??{kind:"unknown"}})),u=await L(G).resolve({sessionId:Z.sessionID,family:kJ(x),modelId:x,affinityModelId:Z.modelID,candidates:I,retainAccountIds:new Set(y.map((d)=>d.id)),...G.mode==="claustrum"?{accountIdentities:new Map(G.accounts.flatMap((d)=>d.accountIdentity?[[d.id,d.accountIdentity]]:[]))}:{},storage:G.policyStorage,inputBytes:1,preferredAccountId:Z.previousAccountId,preserveOnNoCandidate:!0});if(j.signal.throwIfAborted(),u)return u.accountId}else{let u=d$(G.policyStorage)==="fallback-first"?[...y.filter((d)=>d.id!=="main"),...y.filter((d)=>d.id==="main")]:[...y.filter((d)=>d.id==="main"),...y.filter((d)=>d.id!=="main")];if(u[0])return u[0].id}if(G.mode==="claustrum")throw new TJ;let l=G.accounts.find((I)=>I.id==="main"&&I.type==="oauth");if(!l)return;let p=l.quota;if(Z.rerouteFrom?.limit.status===429||!f2(p,G.policyStorage))try{p=await X.fetchQuota("main",$.fetch,j.signal)}catch{return}if(j.signal.throwIfAborted(),!t2(p))return;return G.accounts.find((I)=>I.type==="api"&&s2(I)&&I.id!==Z.rerouteFrom?.accountId)?.id},dropChoice(Z){let j=E(Z,Z.accountId),G=T.get(j);if(G?.shift(),G?.length===0)T.delete(j)},async authorizeAccount(Z,j){let G=q(Z),x=await X.read();G.signal.throwIfAborted(),w(x);let O=a2(await $.resolveModelId?.(Z)??Z.modelID);G.signal.throwIfAborted();let D=x.accounts.find((S)=>S.id===j);if(!D||!A(D,x,O))return;let y=E(Z,j),l=T.get(y),p=l?.shift();if(l?.length===0)T.delete(y);let{dispatch:I,relayFallback:u}=await c(x,p?.direct===!0);if(G.signal.throwIfAborted(),p?.auth){if(!await m(j,O,p.auth.route,G))return;let S=N.get(p.auth.provenance);if(S?.receipt?.expiresAtMs!==void 0&&S.receipt.expiresAtMs!==null&&S.receipt.expiresAtMs<Date.now()+300000)return;if(S)N.set(p.auth.provenance,{...S,scope:{...Z,modelID:O},account:D,active:G,relayFallback:u});return Y.set(Z.sessionID,j),{...p.auth,dispatch:I}}let d={scope:{...Z,modelID:O},active:G,account:D,retry:p?.retry??!1,relayFallback:u,quota:D.quota};if(D.type==="api"){let S=x.accounts.find((n)=>n.id==="main"&&n.type==="oauth");if(!S||!f2(S.quota,x.policyStorage)||!t2(S.quota))return;let R=await X.authorizeApi(j,G.signal);if(G.signal.throwIfAborted(),!await m(j,O,"api",G))return;let b={kind:"api",subject:R.subject};return N.set(b,d),Y.set(Z.sessionID,j),{route:"api",headers:R.authHeader==="authorization-bearer"?{authorization:`Bearer ${R.apiKey}`}:{"x-api-key":R.apiKey},baseURL:R.baseURL,provenance:b,dispatch:I}}if(D.source==="vault"){let S=await X.authorizeVault(j,G.signal);if(G.signal.throwIfAborted(),!await m(j,O,"oauth",G))return;let R={kind:"vault",credentialId:S.credentialId,recordVersion:S.recordVersion};N.set(R,{...d,receipt:S});let b=S.assertedAccountIdentity;if(!b)return;return Y.set(Z.sessionID,j),{route:"oauth",accessToken:S.accessToken,provenance:R,dispatch:I,identity:y2(b,b)}}let B=await X.authorizeLocal(j,{signal:G.signal,policy:(S,R)=>I2(S,R,O)});if(G.signal.throwIfAborted(),B.status!=="usable")return;if(!await m(j,O,"oauth",G))return;let z={kind:"local",subject:B.subject};N.set(z,{...d,access:B.access}),Y.set(Z.sessionID,j);let C=B.subject.binding.identity;return{route:"oauth",accessToken:B.access,provenance:z,dispatch:I,identity:y2(C,C)}},async requestOptions(Z){let j=q(Z),G=await X.read();j.signal.throwIfAborted();let x=G.accounts.find((D)=>D.id===Z.accountId);if(!x||!A(x,G,Z.modelID))throw Error("request refused: native account is ineligible for this model");let O=N.get(Z.provenance);if(O)N.set(Z.provenance,{...O,scope:{...O.scope,modelID:Z.modelID}});return $.requestOptions(Z,G)},async admitRequest(Z){let j=N.get(Z.provenance);if(!j||!await m(Z.accountId,Z.modelID,Z.route,j.active))throw Error("request refused: native account policy changed before dispatch");N.set(Z.provenance,{...j,scope:{...j.scope,modelID:Z.modelID}})},onRequestPrepared:(Z)=>$.onRequestPrepared?.(Z),responseOptions(Z){return $.responseOptions?.({...Z,modelID:N.get(Z.provenance)?.scope.modelID??Z.modelID})},quotaFromHeaders(Z,j){let G=N.get(j.provenance),x=u$(Z);if(x)$.onRequestId?.(j,x);if(!G||j.route!=="oauth"||!NJ(Z))return;let O=j.provenance.kind==="local"?j.provenance.subject.binding.identity:G.receipt?.assertedAccountIdentity,D={...SJ(Z),...O?{accountIdentity:O}:{}},y=PJ(G.quota,D);G.quota=y;let l=o(j.provenance,G,y),p=G.account.id,I=()=>{if(l)X.quotaObservations.forget(p,l)};return M.observe(r(j.provenance,G,{quota:y}).then((u)=>{if(!u)I()},(u)=>{throw I(),u})),D},async limitFromResponse(Z){let j=N.get(Z.provenance);if(!j)return;if(Z.status===401&&j.receipt){if(!H.has(j.receipt))H.add(j.receipt),await X.vault.reportFailure(j.receipt,401,Z.dispatch==="http-relay"?"relay_status_field":"direct");if(j.retry||j.active.signal.aborted)return;let x=j.active,O=await X.vault.prepareRetry(j.receipt,x.signal);if(x.signal.throwIfAborted(),!O.retry)return;let D=O.receipt,y=D.assertedAccountIdentity;if(!y)return;let l={kind:"vault",credentialId:D.credentialId,recordVersion:D.recordVersion};N.set(l,{...j,receipt:D,retry:!0});let p=`vault-newer:${Z.attemptId}`;return P.set(p,{sessionID:Z.sessionID,accountId:Z.accountId,retry:!0,auth:{route:"oauth",accessToken:D.accessToken,provenance:l,identity:y2(y,y)}}),U(),{reason:p,status:401}}if(Z.status===401&&Z.provenance.kind==="local"&&j.access&&!j.retry){if(j.active.signal.aborted)return;let x=j.active,O=await X.authorizeLocal(Z.accountId,{rejectedAccessToken:j.access,signal:x.signal,policy:(p,I)=>I2(p,I,j.scope.modelID)});if(x.signal.throwIfAborted(),O.status!=="usable"||O.access===j.access)return;let D={kind:"local",subject:O.subject};N.set(D,{...j,access:O.access,retry:!0});let y=O.subject.binding.identity,l=`local-newer:${Z.attemptId}`;return P.set(l,{sessionID:Z.sessionID,accountId:Z.accountId,retry:!0,auth:{route:"oauth",accessToken:O.access,provenance:D,identity:y2(y,y)}}),U(),{reason:l,status:401}}let G=await X.read();if(qJ(Z.status,G.policyStorage))return{reason:`provider-${Z.status}`,status:Z.status};return},limitFromRelayFailure(Z){let j=N.get(Z.provenance);if(!j?.relayFallback||j.active.signal.aborted||!(Z.status===401||Z.status>=500))return;let G=`relay-direct:${Z.attemptId}`;return P.set(G,{sessionID:Z.sessionID,accountId:Z.accountId,direct:!0,retry:!1}),U(),{reason:G}},limitFromStreamError(Z){return Z.errorType==="rate_limit_error"?{reason:"provider-rate-limit",status:429}:void 0},limitFromHostError(Z,j){let G=N.get(j.provenance);if(j.dispatch==="http-relay"&&G?.relayFallback&&!G.active.signal.aborted&&Z.status===void 0){let x=`relay-direct:${j.attemptId}`;return P.set(x,{sessionID:j.sessionID,accountId:j.accountId,direct:!0,retry:!1}),U(),{reason:x}}return},async onAttemptEnd(Z,j){let G=N.get(Z.provenance);if(!G)return;try{if(j.status===401&&G.receipt&&!H.has(G.receipt))H.add(G.receipt),await X.vault.reportFailure(G.receipt,401,Z.dispatch==="http-relay"?"relay_status_field":"direct");if(!j.localRefusal&&j.status!==void 0)M.publish(()=>r(Z.provenance,G,{lastUsed:Date.now()}))}finally{N.delete(Z.provenance)}},forgetSession(Z){K.get(Z)?.abort(),K.delete(Z),Y.delete(Z);for(let[j,G]of P)if(G.sessionID===Z)P.delete(j);for(let[j,G]of T)if(G[0]?.sessionID===Z)T.delete(j);$.onForgetSession?.(Z)},servedAccount:(Z)=>Y.get(Z),resetRouting:async(Z)=>L(await X.read()).clear(Z),async recordPrime(Z,j){let G=N.get(Z);if(!G||G.active.signal.aborted)return!1;if(Z.kind==="local")return X.incrementPrimeUsage(G.account.id,Z.subject,j);if(Z.kind==="vault"&&G.receipt)return X.incrementPrimeUsage(G.account.id,G.receipt,j);return!1},drainRoutingPublications:()=>Promise.all([X.drainRoutingPublications(),...[...V.values()].map((Z)=>Z.drain())]).then(()=>{}),close(){W=!0;for(let Z of K.values())Z.abort();return K.clear(),T.clear(),P.clear(),Promise.all([M.drain(),s.drainRoutingPublications()]).then(()=>{})}};return s}import{remapModelId as DJ}from"@cortexkit/anthropic-auth-core";function n$(){let $=new c$,X=new Map,M=new Map,V=new Map,L=new Set,N=new Set,P=new Map,T=(K)=>{while(K.size>512){let Y=K.keys().next();if(!Y.done)K.delete(Y.value)}};return{async install(K){let Y=[];try{Y.push(await K.session.hook("context",(H)=>{let W=H.messages.map((E)=>{return{info:{id:E.id,sessionID:H.sessionID,role:E.role,agent:H.agent,model:{providerID:H.model.providerID,modelID:H.model.id}},parts:E.content.map((q)=>({type:q.type,...q.type==="text"?{text:q.text}:{}}))}});$.observeMessages(W);let U=H.messages.findLast((E)=>E.role==="user"&&E.id);if(U?.id)X.set(H.sessionID,U.id);if(U?.content.some((E)=>E.type==="text"&&E.text===D2))L.add(H.sessionID);else L.delete(H.sessionID);T(X)},{providerID:"anthropic"})),Y.push(await K.session.hook("model.request",(H)=>{if(H.kind!=="primary")return;let W=X.get(H.sessionID);if(!W)return;if($.markHeaders({sessionId:H.sessionID,messageId:W,agent:H.agent,headers:H.headers}),L.has(H.sessionID))H.headers[R2]="1"},{providerID:"anthropic"}))}catch(H){throw await Promise.allSettled(Y.map((W)=>W.dispose())),H}return{dispose:async()=>{await Promise.all(Y.map((H)=>H.dispose()))}}},requestOptions(K,Y){let H=$.resolveHeader(K.correlation[k2]);if(H)M.set(K.attemptId,H),T(M);P.set(K.attemptId,K.sessionID),T(P);let W=K.correlation[R2]==="1";if(W)N.add(K.attemptId);return{cache1hEnabled:K.agent!=="compaction"&&K.agent!=="title"&&(Y.policyStorage.claudeCache?.enabled??!0),cache1hMode:Y.policyStorage.claudeCache?.mode??"explicit",fastModeEnabled:Y.policyStorage.claudeFast?.enabled===!0,thinkingPrefixMismatchBehavior:Y.policyStorage.thinkingBinding?.prefixMismatchBehavior,midConversationEffortEnabled:!1,turnEndNoteEnabled:!0,turnEndNote:Y.policyStorage.turnEndNote,serverSideFallbackEnabled:o$(process.env.OPENCODE_ANTHROPIC_AUTH_CONTENT_FILTER_FALLBACK)==="server",laneStart:W,billingLineage:H?{promptId:H.promptId,previousRequestId:H.previousRequestId}:void 0,cacheDiagnosticsPreviousMessageId:V.get(K.sessionID)}},responseOptions(K){return{serverSideFallbackModel:DJ(K.modelID),laneStart:N.has(K.attemptId),onMessageStart(Y){if(K.kind==="primary"&&typeof Y.id==="string")V.set(K.sessionID,Y.id),T(V)},onStreamEnd(){M.delete(K.attemptId),N.delete(K.attemptId),P.delete(K.attemptId)}}},onRequestId(K,Y){$.commit(M.get(K.attemptId),Y)},forgetSession(K){$.clearSession(K),X.delete(K),V.delete(K),L.delete(K);for(let[Y,H]of P)if(H===K)M.delete(Y),N.delete(Y),P.delete(Y)}}}var g2="cortexkit-anthropic-auth",hJ='This OpenCode is enrolled in the Claude vault and uses only vault accounts. Choose "Claude vault accounts" instead; no local account was changed.',mJ="This OpenCode is not enrolled in the Claude vault. Enroll it first, or sign in with Claude Pro / Max.",lJ="The Claude vault enrollment could not be read; repair it and retry. Nothing was changed.";function dJ($){let X=$.authorize??wJ,M=$.exchange??fJ,V=()=>{if(!$.isActive())throw Error("Claude authentication setup is closed")},L=async()=>{let T;try{T=await $.readMode()}catch{throw Error(lJ)}return V(),T},N=async()=>{if(await L()!=="local")throw Error(hJ)};return{integrationID:"anthropic",methods:[{method:{id:b2,type:"oauth",label:w2},async authorize(){V(),await N();let T=await X("max");return V(),{mode:"code",url:T.url,instructions:"Paste the authorization code returned by Claude.",callback:async(K)=>{V();let Y=await M(K,T.verifier,T.redirectUri,T.state);if(!$.isActive()||Y.type!=="success")throw Error("Claude sign-in did not complete");return{access:Y.access,refresh:Y.refresh,expires:Y.expires}}}}}],vault:{method:{id:s$,type:"oauth",label:"Claude vault accounts"},async activate(){if(V(),await L()!=="claustrum")throw Error(mJ)}},async onLogin(T){V(),await N(),await $.runtime.loginOAuth({routeId:"main",credential:T,replace:!0}),V()},label:"Claude native account pool"}}function pJ($){return{readMode:()=>gJ("opencode",$),disconnectVault:()=>IJ({host:"opencode",env:$})}}function e2($={}){return{id:g2,setup:(X)=>t$(X,$)}}async function t$($,X={}){let M=X.paths??await vJ(),V=bJ({paths:M,host:"opencode",local:X.local,vault:X.vault}),L=pJ(X.vault?.env??process.env),N=!0,P=n$(),T=f$(),K,Y,H,W=i$({runtime:V,paths:M,fetch:X.fetch,requestOptions:P.requestOptions,responseOptions:P.responseOptions,onRequestId:P.onRequestId,onForgetSession:P.forgetSession,onRequestPrepared:async(w)=>{try{await H?.track(w)}catch{r$.warn("cachekeep","live request tracking failed")}},resolveModelId:async(w)=>T.modelId(w.modelID),onOwnedRequest:()=>{K??=x$(V,X.fetch),Y??=l$({runtime:V,paths:M,source:W,fetch:X.fetch})}});H=O$({...X.cacheKeep,runtime:V,source:W,fetch:X.fetch,isSubagent:async(w)=>Boolean((await $.session.get({sessionID:w})).parentID)});let U=I$({runtime:V,source:W,cacheKeepRegistry:H.registry,start:async(w,c)=>{await $.session.synthetic({sessionID:w,text:c,description:"Claude lane start",resume:!0})}}),E=[],q=await S$($,{source:W,log:{warn:(w,c)=>r$.warn("opencode2",w,c)}},{credential:g$}).catch(async(w)=>{throw U.close(),await H?.dispose(),await W.close(),await V.drainQuotaPublications(),V.close(),w}),A,m=()=>{if(A)return A;return N=!1,U.close(),W.close(),A=(async()=>{await Promise.allSettled([q.dispose(),K?.dispose(),Y?.dispose(),H?.dispose(),...E.map((w)=>w.dispose())]),await W.close(),await V.drainQuotaPublications(),V.close()})(),A};try{E.push(await P.install($)),E.push(await T.install($)),E.push(await l2($,dJ({isActive:()=>N,readMode:L.readMode,runtime:V})));let w={host:"opencode",dispatch:U.dispatch,readStatus:(r)=>U.readStatus(r),readAccounts:()=>V.read(),readMode:L.readMode,disconnectVault:L.disconnectVault,interactive:!0},c=yJ(w);return E.push(await a$($,c,U)),m}catch(w){throw await m(),w}}var jZ={id:g2,setup:e2().setup,server:e$};export{t$ as setupAnthropicAuth,jZ as default,e2 as createAnthropicAuthPlugin,g2 as ANTHROPIC_AUTH_PLUGIN_ID};
12
+ ${l$}
13
+ Quota refresh checks the pool; it does not check OpenCode's Anthropic connection.`:K}if(Y==="quota")return QX({accounts:U.accounts.filter((K)=>K.type==="oauth").map((K)=>({name:K.label??K.id,role:K.id==="main"?"main":"fallback",enabled:K.enabled,quota:K.quota,tierLabel:zX(K.profile),lastRefreshedAt:K.lastRefreshedAt,error:K.lastQuotaRefreshError?.message}))}).replace(/Usage:[^\n]*/,"Use /claude to refresh native quota readings.");if(Y==="prime")return UX({enabled:U.policyStorage.prime?.enabled===!0,accounts:BX(U.policyStorage)}).replace(/Usage:[^\n]*/,"Use /claude to change Prime settings.");if(Y==="cachekeep"){let K=await X.cacheKeepRegistry?.list()??[];return WX({enabled:CX(U.policyStorage),always:FX(U.policyStorage),hybridActive:LX(U.policyStorage),trackedSessionDetails:K,window:_X(U.policyStorage),trackedSessions:K.length,nextPrewarmAt:K.length?Math.min(...K.map((E)=>E.nextPrewarmAt)):void 0})}let B={routing:"routing",killswitch:"killswitch",cache:"claudeCache",cachekeep:"cacheKeep",dump:"dump",logging:"logging",fast:"claudeFast",prime:"prime"};return JSON.stringify(U.settings[B[Y]]??{})},async readSidebar(Y){let[U,B]=await Promise.all([Z.read(),X.cacheKeepRegistry?.list()??[]]);return u$(h$(U,{activeId:z.servedAccount(Y),trackedSessions:B.length,now:Date.now()}))},forgetSession(Y){W.get(Y)?.active.abort(),W.delete(Y)},close(){N=!0;for(let Y of W.values())Y.active.abort();W.clear()}}}import{resolveClaudeModelCapabilities as OX}from"@cortexkit/anthropic-auth-core";function c$(){let X=new Map;return{install:(z)=>z.model.transform((W)=>{X.clear();for(let N of W.list("anthropic")){X.set(String(N.id),String(N.modelID));let L=OX(N.modelID)?.efforts.variants;if(!L)continue;W.update("anthropic",String(N.id),(C)=>{let P=C.variants.filter((M)=>!L.some((Y)=>Y===String(M.id)));C.variants=[...P,...L.map((M)=>({id:M,settings:{effort:M,thinking:{type:"adaptive",display:"summarized"}}}))]})}}),modelId:(z)=>X.get(z)??z}}function i$(X){return X.get("authorization")?.match(/^Bearer ([^\s]+)$/i)?.[1]??X.get("x-api-key")??void 0}import{buildPrimeRequestBody as o$,effectiveRelayTransport as n$,nativeAccountCanServe as SX,PrimeManager as RX,tokenFingerprint as r$}from"@cortexkit/anthropic-auth-core";var s$=(X)=>X!==null&&typeof X==="object"&&!Array.isArray(X)?X:{};function a$(X){let{runtime:Z,source:z}=X,W=new AbortController,N=new Set,L=(M)=>({providerID:"anthropic",modelID:o$().model,sessionID:`oc2-prime:${M}`,agent:"prime",kind:"generate"}),C=async(M)=>{let Y=L(M),U=S2({source:z}),B=performance.now();try{for(let K=0;K<3;K++){if(W.signal.throwIfAborted(),(await Z.read()).policyStorage.prime?.enabled!==!0)throw Error("Native Prime is disabled");let k=await U.adapter.accountHeaders({...Y,accountId:M});if(!("headers"in k)||typeof k.headers!=="object"||k.headers===null||typeof k.attempt!=="object"||k.attempt===null)throw Error("Native Prime authorization refused");let A={...Y,accountId:M,attemptId:crypto.randomUUID(),transport:"http",data:k.attempt},h,y=!1,c=!1,s=(t)=>{c=!0,t.body?.cancel().catch(()=>{})};try{let t=await U.adapter.rewriteRequest?.({...Y,accountId:M,attempt:A,request:new Request("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(o$()),signal:W.signal})});if(!t)throw Error("Native Prime rewrite refused");let a=new Headers(t.headers);for(let[d,l]of Object.entries(k.headers))if(l===null)a.delete(d);else a.set(d,l);let J=new Request(t,{headers:a}),Q=await(X.fetch??fetch)(J),V=await U.adapter.rewriteResponse?.({...Y,accountId:M,request:J,response:Q,attempt:A})??Q;h=V.status,U.adapter.quotaFromHeaders?.(V.headers,V.status,A);let R=V.ok?void 0:await U.adapter.limitFromResponse?.({status:V.status,headers:V.headers,body:()=>V.clone().text(),attempt:A});if(R&&/^(vault-newer|local-newer|relay-direct):/.test(R.reason)&&K<2){s(V);let d={...Y,phase:"retry",rerouteFrom:{accountId:M,limit:R}};if(await z.chooseAccount(d)!==M)throw Error("Native Prime retry changed account");continue}if(!V.ok)return s(V),{ok:!1,status:h,ms:performance.now()-B,error:"Native Prime upstream refused the request"};let O=s$(await V.json()),b=s$(O.usage),I={inputTokens:typeof b.input_tokens==="number"?b.input_tokens:void 0,outputTokens:typeof b.output_tokens==="number"?b.output_tokens:void 0};if(A.data?.dispatch==="http-relay"&&!/^req_[A-Za-z0-9_-]+$/.test(V.headers.get("request-id")??""))throw Error("Native Prime relay response has no upstream provenance");if(y=await z.recordPrime(k.attempt.provenance,I),!y)throw Error("Native Prime counter attribution was superseded");return{ok:!0,status:h,ms:performance.now()-B,usage:I}}finally{await U.adapter.onAttemptEnd?.(A,{status:h,outputStarted:!1,...y?{}:{error:{reason:c?"cancelled":"failed"}}})}}return{ok:!1,error:"Native Prime retry budget exhausted"}}catch{return{ok:!1,error:"Native Prime was not completed",ms:performance.now()-B}}finally{U.dispose()}},P=new RX({storagePath:X.paths.legacyConfig,loadStorage:async()=>(await Z.read()).policyStorage,async getAccountFingerprint(M){let Y=await Z.read(),U=Y.accounts.find((E)=>E.id===M);if(!SX(U)||U?.type!=="oauth")return;if(Y.policyStorage.relay?.enabled===!0&&n$(Y.policyStorage.relay.transport,Y.policyStorage.relay.url)==="websocket")return;if(U.source==="vault"){let E=await Z.authorizeVault(M,W.signal),k=await Z.getOrCreateAuthLineage(M,E);return k?r$(k):void 0}let B=await Z.authorizeLocal(M,{signal:W.signal});if(B.status!=="usable")return;let K=await Z.getOrCreateAuthLineage(M,B.subject);return K?r$(K):void 0},async refreshQuota(M){let Y=await Z.read();if(Y.policyStorage.relay?.enabled===!0&&n$(Y.policyStorage.relay.transport,Y.policyStorage.relay.url)==="websocket")throw Error("WebSocket relay is unsupported on OpenCode 2");return{quota:await Z.fetchQuota(M,X.fetch,W.signal),fresh:!0}},sendPrime(M){let Y=C(M);return N.add(Y),Y.finally(()=>N.delete(Y)),Y},async recordSuccess(M){let Y=(await Z.read()).accounts.find((U)=>U.id===M);if(!Y?.prime)throw Error("Native Prime counters are unavailable");return Y.prime}});return P.start(),{manager:P,async dispose(){P.stop(),W.abort(),await Promise.allSettled(N)}}}import{createNativeUsagePublisher as xX,decideStickyQuotaFailure as AX,effectiveRelayTransport as qX,getClaudeCodeIdentityForVerifiedAccount as h2,getQuotaCheckIntervalMs as kX,getRoutingMode as Y$,isQuotaBearingHeaderFrame as bX,logger as DX,mergeHeaderQuotaForPersistence as wX,NativeVaultNoAccountError as yX,nativeAccountCanServe as X$,nativeAccountPolicy as l2,nativeLocalQuotaLineage as IX,nativePollQuotaGenerallyExhausted as fX,normalizeQuotaHeaders as gX,quotaSnapshotCheckedAt as t$,quotaSnapshotHasStandardWindows as vX,readNativeAccountsForRequest as mX,remapModelId as Z$,StickySessionRouter as hX,shouldFallbackStatus as lX,stickyQuotaSnapshotIsFresh as D2,stickyRetryAfterWithJitter as dX,stickyRouteFamilyForModel as uX}from"@cortexkit/anthropic-auth-core";var J$=(X)=>["five_hour","seven_day"].some((Z)=>(X?.[Z]?.remainingPercent??1)<=0);function pX(X,Z,z,W){let N=X.rerouteFrom;if(X.phase!=="retry"||N?.limit.status!==429||Y$(Z.policyStorage)!=="sticky-balanced")return;let L=z.find((P)=>P.id===N.accountId);if(!L||!D2(L.quota,Z.policyStorage,Date.now(),W))return;let C=AX({quota:L.quota,modelId:W});if(C.action!=="hold")return;return{hold:{delayMs:dX(X.sessionID,C.retryAfterSeconds)*1000}}}function $1(X){let{runtime:Z}=X,z=xX("native-auth"),W=new Map,N=(J)=>{let Q=J.routingPath;if(!Q)throw Error("Native routing storage is unavailable");let V=W.get(Q);if(!V)V=new hX({path:Q,vaultSeed:J.routingSeed,onLockEvent:Z.onLockEvent,localRecoveryPath:J.mode==="local"?J.routingRecoveryPath:void 0}),W.set(Q,V);return V.setVaultSeed(J.routingSeed),V},L=new WeakMap,C=new Map,P=new Map,M=new Map,Y=new Map,U=new WeakSet,B=!1,K=()=>{while(C.size>512){let J=C.keys().next();if(!J.done)C.delete(J.value)}},E=(J,Q)=>JSON.stringify([J.sessionID,J.kind,J.modelID,Q]),k=(J)=>{if(B)throw Error("Native Anthropic source is closed");let Q=M.get(J.sessionID);if(!Q){Q=new AbortController,M.set(J.sessionID,Q);while(M.size>512){let V=M.keys().next();if(!V.done)a.forgetSession?.(V.value)}}return Q},A=(J,Q,V)=>X$(J)&&(J.type==="api"||l2(J,Q,Z$(V)).status==="allowed"),h=async(J,Q,V,R)=>{let O=await Z.read();R.signal.throwIfAborted(),y(O);let b=O.accounts.find((I)=>I.id===J);if(!b||b.type!==V||!A(b,O,Q))return!1;if(V==="api"){let I=O.accounts.find((d)=>d.id==="main"&&d.type==="oauth");return!!I&&D2(I.quota,O.policyStorage)&&J$(I.quota)}return!0},y=(J)=>{let Q=J.policyStorage.relay;if(Q?.enabled===!0&&qX(Q.transport,Q.url)==="websocket")throw new O2},c=async(J,Q)=>{if(y(J),Q||J.policyStorage.relay?.enabled!==!0)return{dispatch:{kind:"direct"},relayFallback:!1};let V=await Z.getRelayConfig();if(!V)throw Error("request refused: native HTTP relay configuration is unavailable");if(V.transport!=="http")throw new O2;return{dispatch:{kind:"http-relay",url:V.url,token:V.token},relayFallback:V.fallbackToDirect}};async function s(J,Q,V){if(J.kind==="local"){let R=await Z.publishLocal(J.subject,V);if(!R&&V.quota)DX.warn("quota","Quota publication discarded");return R}if(J.kind==="vault"&&Q.receipt)await Z.vault.publish(Q.receipt,V);else if(J.kind==="api"&&V.lastUsed!==void 0)await Z.publishApi(J.subject,{lastUsed:V.lastUsed});return!0}function t(J,Q,V){if(J.kind!=="local")return;let R=J.subject.binding,O=t$(V),b={lineage:IX(R),accountUuid:R.identity,entry:{quota:V,checkedAt:O,refreshAfter:O},generalExhausted:fX(V),routeBeforeSave:!0};return Z.quotaObservations.hold(Q.account.id,b)?b:void 0}let a={async chooseAccount(J){let Q=k(J);X.onOwnedRequest?.();let V=await Z.read();Q.signal.throwIfAborted(),y(V);let R=Z$(await X.resolveModelId?.(J)??J.modelID);if(Q.signal.throwIfAborted(),V.mode==="claustrum")V=await mX(Z,Q.signal),Q.signal.throwIfAborted();if(V.policyStorage.quota?.enabled!==!1){let v=!1;for(let i of V.accounts){if(!X$(i)||i.type!=="oauth")continue;if(vX(i.quota)?D2(i.quota,V.policyStorage,Date.now(),R):Date.now()-t$(i.quota)<kX(V.policyStorage))continue;try{await Z.fetchQuota(i.id,X.fetch,Q.signal,void 0,"admission"),v=!0}catch{Q.signal.throwIfAborted()}}if(v)V=await Z.read();Q.signal.throwIfAborted()}let O=J.rerouteFrom?C.get(J.rerouteFrom.limit.reason):void 0;if(J.rerouteFrom&&/^(vault-newer|local-newer|relay-direct):/.test(J.rerouteFrom.limit.reason)&&!O)return;if(O&&J.rerouteFrom){let v=V.accounts.find((H)=>H.id===O.accountId);if(!v||!A(v,V,R))return;C.delete(J.rerouteFrom.limit.reason);let i=E(J,O.accountId),G=P.get(i)??[];return G.push(O),P.set(i,G),O.accountId}let b=[];for(let v of V.accounts){if(v.type!=="oauth"||!A(v,V,R))continue;if(v.source==="local"){let i=await Z.authorizeLocal(v.id,{signal:Q.signal,policy:(G,H)=>l2(G,H,R)});if(Q.signal.throwIfAborted(),i.status!=="usable")continue}b.push(v)}let I=pX(J,V,b,R);if(I)return I;let d=b.filter((v)=>v.id!==J.rerouteFrom?.accountId);if(Y$(V.policyStorage)==="sticky-balanced"){let v=d.map((G,H)=>({accountId:G.id,order:H,quota:G.quota??{kind:"unknown"}})),i=await N(V).resolve({sessionId:J.sessionID,family:uX(R),modelId:R,affinityModelId:J.modelID,candidates:v,retainAccountIds:new Set(d.map((G)=>G.id)),...V.mode==="claustrum"?{accountIdentities:new Map(V.accounts.flatMap((G)=>G.accountIdentity?[[G.id,G.accountIdentity]]:[]))}:{},storage:V.policyStorage,inputBytes:1,preferredAccountId:J.previousAccountId,preserveOnNoCandidate:!0});if(Q.signal.throwIfAborted(),i)return i.accountId}else{let i=Y$(V.policyStorage)==="fallback-first"?[...d.filter((G)=>G.id!=="main"),...d.filter((G)=>G.id==="main")]:[...d.filter((G)=>G.id==="main"),...d.filter((G)=>G.id!=="main")];if(i[0])return i[0].id}if(V.mode==="claustrum")throw new yX;let l=V.accounts.find((v)=>v.id==="main"&&v.type==="oauth");if(!l)return;let r=l.quota;if(J.rerouteFrom?.limit.status===429||!D2(r,V.policyStorage))try{r=await Z.fetchQuota("main",X.fetch,Q.signal)}catch{return}if(Q.signal.throwIfAborted(),!J$(r))return;return V.accounts.find((v)=>v.type==="api"&&X$(v)&&v.id!==J.rerouteFrom?.accountId)?.id},dropChoice(J){let Q=E(J,J.accountId),V=P.get(Q);if(V?.shift(),V?.length===0)P.delete(Q)},async authorizeAccount(J,Q){let V=k(J),R=await Z.read();V.signal.throwIfAborted(),y(R);let O=Z$(await X.resolveModelId?.(J)??J.modelID);V.signal.throwIfAborted();let b=R.accounts.find((x)=>x.id===Q);if(!b||!A(b,R,O))return;let I=E(J,Q),d=P.get(I),l=d?.shift();if(d?.length===0)P.delete(I);let{dispatch:r,relayFallback:v}=await c(R,l?.direct===!0);if(V.signal.throwIfAborted(),l?.auth){if(!await h(Q,O,l.auth.route,V))return;let x=L.get(l.auth.provenance);if(x?.receipt?.expiresAtMs!==void 0&&x.receipt.expiresAtMs!==null&&x.receipt.expiresAtMs<Date.now()+300000)return;if(x)L.set(l.auth.provenance,{...x,scope:{...J,modelID:O},account:b,active:V,relayFallback:v});return Y.set(J.sessionID,Q),{...l.auth,dispatch:r}}let i={scope:{...J,modelID:O},active:V,account:b,retry:l?.retry??!1,relayFallback:v,quota:b.quota};if(b.type==="api"){let x=R.accounts.find((p)=>p.id==="main"&&p.type==="oauth");if(!x||!D2(x.quota,R.policyStorage)||!J$(x.quota))return;let q=await Z.authorizeApi(Q,V.signal);if(V.signal.throwIfAborted(),!await h(Q,O,"api",V))return;let w={kind:"api",subject:q.subject};return L.set(w,i),Y.set(J.sessionID,Q),{route:"api",headers:q.authHeader==="authorization-bearer"?{authorization:`Bearer ${q.apiKey}`}:{"x-api-key":q.apiKey},baseURL:q.baseURL,provenance:w,dispatch:r}}if(b.source==="vault"){let x=await Z.authorizeVault(Q,V.signal);if(V.signal.throwIfAborted(),!await h(Q,O,"oauth",V))return;let q={kind:"vault",credentialId:x.credentialId,recordVersion:x.recordVersion};L.set(q,{...i,receipt:x});let w=x.assertedAccountIdentity;if(!w)return;return Y.set(J.sessionID,Q),{route:"oauth",accessToken:x.accessToken,provenance:q,dispatch:r,identity:h2(w,w)}}let G=await Z.authorizeLocal(Q,{signal:V.signal,policy:(x,q)=>l2(x,q,O)});if(V.signal.throwIfAborted(),G.status!=="usable")return;if(!await h(Q,O,"oauth",V))return;let H={kind:"local",subject:G.subject};L.set(H,{...i,access:G.access}),Y.set(J.sessionID,Q);let F=G.subject.binding.identity;return{route:"oauth",accessToken:G.access,provenance:H,dispatch:r,identity:h2(F,F)}},async requestOptions(J){let Q=k(J),V=await Z.read();Q.signal.throwIfAborted();let R=V.accounts.find((b)=>b.id===J.accountId);if(!R||!A(R,V,J.modelID))throw Error("request refused: native account is ineligible for this model");let O=L.get(J.provenance);if(O)L.set(J.provenance,{...O,scope:{...O.scope,modelID:J.modelID}});return X.requestOptions(J,V)},async admitRequest(J){let Q=L.get(J.provenance);if(!Q||!await h(J.accountId,J.modelID,J.route,Q.active))throw Error("request refused: native account policy changed before dispatch");L.set(J.provenance,{...Q,scope:{...Q.scope,modelID:J.modelID}})},onRequestPrepared:(J)=>X.onRequestPrepared?.(J),responseOptions(J){return X.responseOptions?.({...J,modelID:L.get(J.provenance)?.scope.modelID??J.modelID})},quotaFromHeaders(J,Q){let V=L.get(Q.provenance),R=e$(J);if(R)X.onRequestId?.(Q,R);if(!V||Q.route!=="oauth"||!bX(J))return;let O=Q.provenance.kind==="local"?Q.provenance.subject.binding.identity:V.receipt?.assertedAccountIdentity,b={...gX(J),...O?{accountIdentity:O}:{}},I=wX(V.quota,b);V.quota=I;let d=t(Q.provenance,V,I),l=V.account.id,r=()=>{if(d)Z.quotaObservations.forget(l,d)};return z.observe(s(Q.provenance,V,{quota:I}).then((v)=>{if(!v)r()},(v)=>{throw r(),v})),b},async limitFromResponse(J){let Q=L.get(J.provenance);if(!Q)return;if(J.status===401&&Q.receipt){if(!U.has(Q.receipt))U.add(Q.receipt),await Z.vault.reportFailure(Q.receipt,401,J.dispatch==="http-relay"?"relay_status_field":"direct");if(Q.retry||Q.active.signal.aborted)return;let R=Q.active,O=await Z.vault.prepareRetry(Q.receipt,R.signal);if(R.signal.throwIfAborted(),!O.retry)return;let b=O.receipt,I=b.assertedAccountIdentity;if(!I)return;let d={kind:"vault",credentialId:b.credentialId,recordVersion:b.recordVersion};L.set(d,{...Q,receipt:b,retry:!0});let l=`vault-newer:${J.attemptId}`;return C.set(l,{sessionID:J.sessionID,accountId:J.accountId,retry:!0,auth:{route:"oauth",accessToken:b.accessToken,provenance:d,identity:h2(I,I)}}),K(),{reason:l,status:401}}if(J.status===401&&J.provenance.kind==="local"&&Q.access&&!Q.retry){if(Q.active.signal.aborted)return;let R=Q.active,O=await Z.authorizeLocal(J.accountId,{rejectedAccessToken:Q.access,signal:R.signal,policy:(l,r)=>l2(l,r,Q.scope.modelID)});if(R.signal.throwIfAborted(),O.status!=="usable"||O.access===Q.access)return;let b={kind:"local",subject:O.subject};L.set(b,{...Q,access:O.access,retry:!0});let I=O.subject.binding.identity,d=`local-newer:${J.attemptId}`;return C.set(d,{sessionID:J.sessionID,accountId:J.accountId,retry:!0,auth:{route:"oauth",accessToken:O.access,provenance:b,identity:h2(I,I)}}),K(),{reason:d,status:401}}let V=await Z.read();if(lX(J.status,V.policyStorage))return{reason:`provider-${J.status}`,status:J.status};return},limitFromRelayFailure(J){let Q=L.get(J.provenance);if(!Q?.relayFallback||Q.active.signal.aborted||!(J.status===401||J.status>=500))return;let V=`relay-direct:${J.attemptId}`;return C.set(V,{sessionID:J.sessionID,accountId:J.accountId,direct:!0,retry:!1}),K(),{reason:V}},limitFromStreamError(J){return J.errorType==="rate_limit_error"?{reason:"provider-rate-limit",status:429}:void 0},limitFromHostError(J,Q){let V=L.get(Q.provenance);if(Q.dispatch==="http-relay"&&V?.relayFallback&&!V.active.signal.aborted&&J.status===void 0){let R=`relay-direct:${Q.attemptId}`;return C.set(R,{sessionID:Q.sessionID,accountId:Q.accountId,direct:!0,retry:!1}),K(),{reason:R}}return},async onAttemptEnd(J,Q){let V=L.get(J.provenance);if(!V)return;try{if(Q.status===401&&V.receipt&&!U.has(V.receipt))U.add(V.receipt),await Z.vault.reportFailure(V.receipt,401,J.dispatch==="http-relay"?"relay_status_field":"direct");if(!Q.localRefusal&&Q.status!==void 0)z.publish(()=>s(J.provenance,V,{lastUsed:Date.now()}))}finally{L.delete(J.provenance)}},forgetSession(J){M.get(J)?.abort(),M.delete(J),Y.delete(J);for(let[Q,V]of C)if(V.sessionID===J)C.delete(Q);for(let[Q,V]of P)if(V[0]?.sessionID===J)P.delete(Q);X.onForgetSession?.(J)},servedAccount:(J)=>Y.get(J),resetRouting:async(J)=>N(await Z.read()).clear(J),async recordPrime(J,Q){let V=L.get(J);if(!V||V.active.signal.aborted)return!1;if(J.kind==="local")return Z.incrementPrimeUsage(V.account.id,J.subject,Q);if(J.kind==="vault"&&V.receipt)return Z.incrementPrimeUsage(V.account.id,V.receipt,Q);return!1},drainRoutingPublications:()=>Promise.all([Z.drainRoutingPublications(),...[...W.values()].map((J)=>J.drain())]).then(()=>{}),close(){B=!0;for(let J of M.values())J.abort();return M.clear(),P.clear(),C.clear(),Promise.all([z.drain(),a.drainRoutingPublications()]).then(()=>{})}};return a}import{remapModelId as cX}from"@cortexkit/anthropic-auth-core";function J1(){let X=new X1,Z=new Map,z=new Map,W=new Map,N=new Set,L=new Set,C=new Map,P=(M)=>{while(M.size>512){let Y=M.keys().next();if(!Y.done)M.delete(Y.value)}};return{async install(M){let Y=[];try{Y.push(await M.session.hook("context",(U)=>{let B=U.messages.map((E)=>{return{info:{id:E.id,sessionID:U.sessionID,role:E.role,agent:U.agent,model:{providerID:U.model.providerID,modelID:U.model.id}},parts:E.content.map((k)=>({type:k.type,...k.type==="text"?{text:k.text}:{}}))}});X.observeMessages(B);let K=U.messages.findLast((E)=>E.role==="user"&&E.id);if(K?.id)Z.set(U.sessionID,K.id);if(K?.content.some((E)=>E.type==="text"&&E.text===g2))N.add(U.sessionID);else N.delete(U.sessionID);P(Z)},{providerID:"anthropic"})),Y.push(await M.session.hook("model.request",(U)=>{if(U.kind!=="primary")return;let B=Z.get(U.sessionID);if(!B)return;if(X.markHeaders({sessionId:U.sessionID,messageId:B,agent:U.agent,headers:U.headers}),N.has(U.sessionID))U.headers[k2]="1"},{providerID:"anthropic"}))}catch(U){throw await Promise.allSettled(Y.map((B)=>B.dispose())),U}return{dispose:async()=>{await Promise.all(Y.map((U)=>U.dispose()))}}},requestOptions(M,Y){let U=X.resolveHeader(M.correlation[f2]);if(U)z.set(M.attemptId,U),P(z);C.set(M.attemptId,M.sessionID),P(C);let B=M.correlation[k2]==="1";if(B)L.add(M.attemptId);return{cache1hEnabled:M.agent!=="compaction"&&M.agent!=="title"&&(Y.policyStorage.claudeCache?.enabled??!0),cache1hMode:Y.policyStorage.claudeCache?.mode??"explicit",fastModeEnabled:Y.policyStorage.claudeFast?.enabled===!0,thinkingPrefixMismatchBehavior:Y.policyStorage.thinkingBinding?.prefixMismatchBehavior,midConversationEffortEnabled:!1,turnEndNoteEnabled:!0,turnEndNote:Y.policyStorage.turnEndNote,serverSideFallbackEnabled:Z1(process.env.OPENCODE_ANTHROPIC_AUTH_CONTENT_FILTER_FALLBACK)==="server",laneStart:B,billingLineage:U?{promptId:U.promptId,previousRequestId:U.previousRequestId}:void 0,cacheDiagnosticsPreviousMessageId:W.get(M.sessionID)}},responseOptions(M){return{serverSideFallbackModel:cX(M.modelID),laneStart:L.has(M.attemptId),onMessageStart(Y){if(M.kind==="primary"&&typeof Y.id==="string")W.set(M.sessionID,Y.id),P(W)},onStreamEnd(){z.delete(M.attemptId),L.delete(M.attemptId),C.delete(M.attemptId)}}},onRequestId(M,Y){X.commit(z.get(M.attemptId),Y)},forgetSession(M){X.clearSession(M),Z.delete(M),W.delete(M),N.delete(M);for(let[Y,U]of C)if(U===M)z.delete(Y),L.delete(Y),C.delete(Y)}}}var d2="cortexkit-anthropic-auth",eX='This OpenCode is enrolled in the Claude vault and uses only vault accounts. Choose "Claude vault accounts" instead; no local account was changed.',$Z="This OpenCode is not enrolled in the Claude vault. Enroll it first, or sign in with Claude Pro / Max.",XZ="The Claude vault enrollment could not be read; repair it and retry. Nothing was changed.";function ZZ(X){let Z=X.authorize??oX,z=X.exchange??sX,W=()=>{if(!X.isActive())throw Error("Claude authentication setup is closed")},N=async()=>{let P;try{P=await X.readMode()}catch{throw Error(XZ)}return W(),P},L=async()=>{if(await N()!=="local")throw Error(eX)};return{integrationID:"anthropic",methods:[{method:{id:v2,type:"oauth",label:m2},async authorize(){W(),await L();let P=await Z("max");return W(),{mode:"code",url:P.url,instructions:"Paste the authorization code returned by Claude.",callback:async(M)=>{W();let Y=await z(M,P.verifier,P.redirectUri,P.state);if(!X.isActive()||Y.type!=="success")throw Error("Claude sign-in did not complete");return{access:Y.access,refresh:Y.refresh,expires:Y.expires}}}}}],vault:{method:{id:G1,type:"oauth",label:"Claude vault accounts"},async activate(){if(W(),await N()!=="claustrum")throw Error($Z)}},async onLogin(P){W(),await L(),await X.runtime.loginOAuth({routeId:"main",credential:P,replace:!0}),W()},label:"Claude native account pool"}}function JZ(X){return{readMode:()=>aX("opencode",X),disconnectVault:()=>rX({host:"opencode",env:X})}}function G$(X={}){return{id:d2,setup:(Z)=>j1(Z,X)}}async function j1(X,Z={}){let z=Z.paths??await tX(),W=iX({paths:z,host:"opencode",local:Z.local,vault:Z.vault}),N=JZ(Z.vault?.env??process.env),L=!0,C=J1(),P=c$(),M,Y,U,B=$1({runtime:W,paths:z,fetch:Z.fetch,requestOptions:C.requestOptions,responseOptions:C.responseOptions,onRequestId:C.onRequestId,onForgetSession:C.forgetSession,onRequestPrepared:async(y)=>{try{await U?.track(y)}catch{Y1.warn("cachekeep","live request tracking failed")}},resolveModelId:async(y)=>P.modelId(y.modelID),onOwnedRequest:()=>{M??=I$(W,Z.fetch),Y??=a$({runtime:W,paths:z,source:B,fetch:Z.fetch})}});U=D$({...Z.cacheKeep,runtime:W,source:B,fetch:Z.fetch,isSubagent:async(y)=>Boolean((await X.session.get({sessionID:y})).parentID)});let K=p$({runtime:W,source:B,cacheKeepRegistry:U.registry,start:async(y,c)=>{await X.session.synthetic({sessionID:y,text:c,description:"Claude lane start",resume:!0})}}),E=[],k=await w$(X,{source:B,log:{warn:(y,c)=>Y1.warn("opencode2",y,c)}},{credential:i$}).catch(async(y)=>{throw K.close(),await U?.dispose(),await B.close(),await W.drainQuotaPublications(),await W.close(),y}),A,h=()=>{if(A)return A;return L=!1,K.close(),B.close(),A=(async()=>{await Promise.allSettled([k.dispose(),M?.dispose(),Y?.dispose(),U?.dispose(),...E.map((y)=>y.dispose())]),await B.close(),await W.drainQuotaPublications(),await W.close()})(),A};try{E.push(await C.install(X)),E.push(await P.install(X)),E.push(await o2(X,ZZ({isActive:()=>L,readMode:N.readMode,runtime:W})));let y={host:"opencode",dispatch:K.dispatch,readStatus:(s)=>K.readStatus(s),readAccounts:()=>W.read(),readMode:N.readMode,disconnectVault:N.disconnectVault,interactive:!0},c=nX(y);return E.push(await V1(X,c,K)),h}catch(y){throw await h(),y}}var T0={id:d2,setup:G$().setup,server:W1};export{j1 as setupAnthropicAuth,T0 as default,G$ as createAnthropicAuthPlugin,d2 as ANTHROPIC_AUTH_PLUGIN_ID};
package/dist/v2/tui.d.ts CHANGED
@@ -11,6 +11,17 @@ export type MountSidebar = (ctx: Tui.Context, read: (sessionID: string, signal:
11
11
  * precompiled renderer, as it does for the sidebar.
12
12
  */
13
13
  export type ShowSignInLink = (ctx: Tui.Context, url: string, signal: AbortSignal) => Promise<void>;
14
+ /**
15
+ * Shows one menu section's status in a wide dialog that stays open until the
16
+ * person closes it, and settles then or when `signal` aborts. `readQuota` is
17
+ * given for the Quota section, whose view draws the sidebar's account blocks.
18
+ * `entry.mjs` passes the precompiled renderer, as it does for the sidebar.
19
+ */
20
+ export type ShowMenuStatus = (ctx: Tui.Context, view: {
21
+ readonly title: string;
22
+ readonly lines: readonly string[];
23
+ readonly readQuota?: (signal: AbortSignal) => Promise<SidebarState>;
24
+ }, signal: AbortSignal) => Promise<void>;
14
25
  /**
15
26
  * Shows the `claude` account menu in OpenCode 2 dialogs. The menu's sections,
16
27
  * items and actions come from the plugin server over NATIVE_MENU_RPC, built by
@@ -20,6 +31,7 @@ export type ShowSignInLink = (ctx: Tui.Context, url: string, signal: AbortSignal
20
31
  export declare function setupAnthropicTui(ctx: Tui.Context, options?: {
21
32
  readonly mountSidebar?: MountSidebar;
22
33
  readonly showSignInLink?: ShowSignInLink;
34
+ readonly showStatus?: ShowMenuStatus;
23
35
  }): Promise<() => void>;
24
36
  declare const _default: {
25
37
  id: string;
package/dist/v2/tui.js CHANGED
@@ -1,6 +1,5 @@
1
- import{u as L}from"../index-nm4pjrt8.js";import"../index-j6x60aqq.js";import"../index-71temqvq.js";var T="Open this link in your browser and sign in. Then choose Finish OAuth sign-in in the Accounts menu and paste the code Claude shows you.";async function _(D,O={}){let G=D.client.rpc(L),Y=!0,P=!1,Z=new AbortController,$=()=>{let z=D.ui.router.current();return z.type==="session"?z.sessionID:void 0};function R(z){return new Promise((X)=>{let j="",J=!1,q=D.keymap.mode.push("cortexkit-protected-entry"),W=(H,Q=!0)=>{if(J)return;J=!0,D.renderer.keyInput.off("keypress",K),D.renderer.keyInput.off("paste",M),Z.signal.removeEventListener("abort",B),q();let V=H?j:void 0;if(j="",Q)D.ui.dialog.clear();X(V)},B=()=>W(!1),K=(H)=>{if(H.preventDefault(),H.stopPropagation(),H.name==="escape"||H.ctrl&&H.name==="c")return W(!1);if(H.name==="return"||H.name==="enter")return W(!0);if(H.name==="backspace"){j=Array.from(j).slice(0,-1).join("");return}if(!H.ctrl&&!H.meta&&!H.option&&Array.from(H.sequence).every((Q)=>Q.charCodeAt(0)>=32&&Q.charCodeAt(0)!==127))j=(j+H.sequence).slice(0,4096)},M=(H)=>{H.preventDefault(),H.stopPropagation(),j=(j+Array.from(new TextDecoder().decode(H.bytes)).filter((Q)=>Q.charCodeAt(0)>=32&&Q.charCodeAt(0)!==127).join("")).slice(0,4096)};if(D.renderer.keyInput.prependListener("keypress",K),D.renderer.keyInput.prependListener("paste",M),Z.signal.addEventListener("abort",B,{once:!0}),D.ui.dialog.alert({title:z,message:"Type or paste the value. Input is hidden. Enter accepts; Escape cancels."}).then(()=>W(!1,!1),()=>W(!1,!1)),Z.signal.aborted)B()})}async function U(z){let X={};for(let j of z.knobs){if(!Y)return;if(j.kind==="choice"){let J=await D.ui.dialog.select({title:j.label,options:j.choices.map((q)=>({title:q.label,value:q.value})),current:j.value});if(J===void 0)return;X[j.id]=J}else if(j.kind==="toggle"){let J=await D.ui.dialog.select({title:j.label,options:[{title:"On",value:!0},{title:"Off",value:!1}],current:j.value});if(J===void 0)return;X[j.id]=J}else{let J=j.kind==="text"&&j.masked?await R(j.label):await D.ui.dialog.prompt({title:j.label,value:j.value===void 0?void 0:String(j.value),placeholder:j.kind==="text"?j.placeholder:void 0});if(J===void 0)return;X[j.id]=J===""&&!j.required?null:j.kind==="number"?Number(J):J}}return X}async function C(z){if(O.showSignInLink)try{await O.showSignInLink(D,z,Z.signal);return}catch{}await D.ui.dialog.alert({title:"Claude sign-in",message:`${T}
1
+ import{u as q}from"../index-dpnhamzw.js";import"../index-46e2gk3c.js";import"../index-71temqvq.js";var N="Open this link in your browser and sign in. Then choose Finish OAuth sign-in in the Accounts menu and paste the code Claude shows you.";async function g(D,M={}){let B=D.client.rpc(q),Z=!0,V=!1,Y=new AbortController,$=()=>{let j=D.ui.router.current();return j.type==="session"?j.sessionID:void 0};function C(j){return new Promise((Q)=>{let z="",J=!1,G=D.keymap.mode.push("cortexkit-protected-entry"),X=(H,W=!0)=>{if(J)return;J=!0,D.renderer.keyInput.off("keypress",O),D.renderer.keyInput.off("paste",P),Y.signal.removeEventListener("abort",K),G();let F=H?z:void 0;if(z="",W)D.ui.dialog.clear();Q(F)},K=()=>X(!1),O=(H)=>{if(H.preventDefault(),H.stopPropagation(),H.name==="escape"||H.ctrl&&H.name==="c")return X(!1);if(H.name==="return"||H.name==="enter")return X(!0);if(H.name==="backspace"){z=Array.from(z).slice(0,-1).join("");return}if(!H.ctrl&&!H.meta&&!H.option&&Array.from(H.sequence).every((W)=>W.charCodeAt(0)>=32&&W.charCodeAt(0)!==127))z=(z+H.sequence).slice(0,4096)},P=(H)=>{H.preventDefault(),H.stopPropagation(),z=(z+Array.from(new TextDecoder().decode(H.bytes)).filter((W)=>W.charCodeAt(0)>=32&&W.charCodeAt(0)!==127).join("")).slice(0,4096)};if(D.renderer.keyInput.prependListener("keypress",O),D.renderer.keyInput.prependListener("paste",P),Y.signal.addEventListener("abort",K,{once:!0}),D.ui.dialog.alert({title:j,message:"Type or paste the value. Input is hidden. Enter accepts; Escape cancels."}).then(()=>X(!1,!1),()=>X(!1,!1)),Y.signal.aborted)K()})}async function E(j){let Q={};for(let z of j.knobs){if(!Z)return;if(z.kind==="choice"){let J=await D.ui.dialog.select({title:z.label,options:z.choices.map((G)=>({title:G.label,value:G.value})),current:z.value});if(J===void 0)return;Q[z.id]=J}else if(z.kind==="toggle"){let J=await D.ui.dialog.select({title:z.label,options:[{title:"On",value:!0},{title:"Off",value:!1}],current:z.value});if(J===void 0)return;Q[z.id]=J}else{let J=z.kind==="text"&&z.masked?await C(z.label):await D.ui.dialog.prompt({title:z.label,value:z.value===void 0?void 0:String(z.value),placeholder:z.kind==="text"?z.placeholder:void 0});if(J===void 0)return;Q[z.id]=J===""&&!z.required?null:z.kind==="number"?Number(J):J}}return Q}async function A(j){if(M.showSignInLink)try{await M.showSignInLink(D,j,Y.signal);return}catch{}await D.ui.dialog.alert({title:"Claude sign-in",message:`${N}
2
2
 
3
- ${z}
4
- `})}async function w(z,X){if(!Y||P||$()!==z)return;P=!0;let j=X;try{while(Y&&$()===z){let J=await D.ui.dialog.select({title:j.menu.title,options:j.menu.sections.map((Q)=>({title:Q.title,description:Q.lines.join(`
5
- `),value:Q}))});if(!J||!Y||$()!==z)return;let q=[...J.actions.map((Q)=>({action:Q,itemId:void 0})),...J.items.flatMap((Q)=>Q.actions.map((V)=>({action:V,itemId:Q.id})))],W=await D.ui.dialog.select({title:J.title,options:[...J.lines.length?[{title:"View status",value:"status"}]:[],...q.map((Q)=>({title:Q.action.label,description:Q.action.description,value:Q}))]});if(!W)continue;if(W==="status"){await D.ui.dialog.alert({title:`${J.title} status`,message:J.lines.join(`
6
- `)});continue}let B=await U(W.action);if(!B||!Y||$()!==z)return;let K=W.action.confirm?await D.ui.dialog.confirm({title:W.action.label,message:W.action.confirm.message}):void 0;if(W.action.confirm&&K!==!0)continue;if(!Y||$()!==z)return;let M={command:"claude",sectionId:J.id,itemId:W.itemId,actionId:W.action.id,sessionId:z,values:B,confirmed:K},H=await G.apply(M,{signal:Z.signal,location:D.location});if(!Y||$()!==z)return;if(H.authorizationUrl!==void 0)await C(H.authorizationUrl);else await D.ui.dialog.alert({title:H.ok?"Claude":"Claude action refused",message:H.text});j={command:H.command,menu:H.menu}}}finally{P=!1}}let E=G.events.on("opened",(z)=>w(z.data.sessionId,z.data.payload),{signal:Z.signal}),A=G.events.on("notification",(z)=>{if(Y&&$()===z.data.sessionId)D.ui.toast.show({title:"Claude",sessionID:z.data.sessionId,message:z.data.message,variant:z.data.kind})},{signal:Z.signal});D.keymap.layer(()=>({commands:[{id:"cortexkit.claude",title:"Claude",group:"Claude",palette:!0,slash:{name:"claude"},async run(){let z=$();if(!z){await D.ui.dialog.alert({title:"Claude",message:"Open a session before using the Claude menu."});return}let X=await G.open({sessionId:z},{signal:Z.signal,location:D.location});await w(z,X)}}]}));let F;try{F=await O.mountSidebar?.(D,(z,X)=>G.sidebar({sessionId:z},{signal:X,location:D.location}))}catch{}return()=>{Y=!1,Z.abort(),E(),A(),F?.()}}var N={id:"cortexkit-anthropic-auth",setup:_};export{_ as setupAnthropicTui,N as default};
3
+ ${j}
4
+ `})}async function T(j,Q){let z=`${Q.title} status`;if(M.showStatus)try{await M.showStatus(D,{title:z,lines:Q.lines,...Q.slot==="quota"&&{readQuota:(J)=>B.sidebar({sessionId:j},{signal:J,location:D.location})}},Y.signal);return}catch{}await D.ui.dialog.alert({title:z,message:Q.lines.join(`
5
+ `)})}function L(j){let Q=D.ui.dialog.select(j);return D.ui.dialog.set({size:"xlarge"}),Q}async function R(j,Q){if(!Z||V||$()!==j)return;V=!0;let z=Q;try{while(Z&&$()===j){let J=await L({title:z.menu.title,options:z.menu.sections.map((W)=>({title:W.title,value:W}))});if(!J||!Z||$()!==j)return;let G=[...J.actions.map((W)=>({action:W,itemId:void 0})),...J.items.flatMap((W)=>W.actions.map((F)=>({action:F,itemId:W.id})))],X=await L({title:J.title,options:[...J.lines.length?[{title:"View status",value:"status"}]:[],...G.map((W)=>({title:W.action.label,description:W.action.description,value:W}))]});if(!X)continue;if(X==="status"){await T(j,J);continue}let K=await E(X.action);if(!K||!Z||$()!==j)return;let O=X.action.confirm?await D.ui.dialog.confirm({title:X.action.label,message:X.action.confirm.message}):void 0;if(X.action.confirm&&O!==!0)continue;if(!Z||$()!==j)return;let P={command:"claude",sectionId:J.id,itemId:X.itemId,actionId:X.action.id,sessionId:j,values:K,confirmed:O},H=await B.apply(P,{signal:Y.signal,location:D.location});if(!Z||$()!==j)return;if(H.authorizationUrl!==void 0)await A(H.authorizationUrl);else await D.ui.dialog.alert({title:H.ok?"Claude":"Claude action refused",message:H.text});z={command:H.command,menu:H.menu}}}finally{V=!1}}let w=B.events.on("opened",(j)=>R(j.data.sessionId,j.data.payload),{signal:Y.signal}),_=B.events.on("notification",(j)=>{if(Z&&$()===j.data.sessionId)D.ui.toast.show({title:"Claude",sessionID:j.data.sessionId,message:j.data.message,variant:j.data.kind})},{signal:Y.signal});D.keymap.layer(()=>({commands:[{id:"cortexkit.claude",title:"Claude",group:"Claude",palette:!0,slash:{name:"claude"},async run(){let j=$();if(!j){await D.ui.dialog.alert({title:"Claude",message:"Open a session before using the Claude menu."});return}let Q=await B.open({sessionId:j},{signal:Y.signal,location:D.location});await R(j,Q)}}]}));let U;try{U=await M.mountSidebar?.(D,(j,Q)=>B.sidebar({sessionId:j},{signal:Q,location:D.location}))}catch{}return()=>{Z=!1,Y.abort(),w(),_(),U?.()}}var m={id:"cortexkit-anthropic-auth",setup:g};export{g as setupAnthropicTui,m as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-anthropic-auth",
3
- "version": "2.2.8",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -77,7 +77,7 @@
77
77
  },
78
78
  "dependencies": {
79
79
  "@clack/prompts": "^1.6.0",
80
- "@cortexkit/anthropic-auth-core": "2.2.8",
80
+ "@cortexkit/anthropic-auth-core": "2.3.0",
81
81
  "@cortexkit/claustrum-client": "0.12.0",
82
82
  "@cortexkit/private-files": "0.2.1",
83
83
  "@cortexkit/subc-client": "^0.22.0",