@juspay/neurolink 12.25.1 → 12.25.2
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/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
## [12.25.
|
|
1
|
+
## [12.25.2](https://github.com/juspay/neurolink/compare/v12.25.1...v12.25.2) (2026-09-26)
|
|
2
2
|
|
|
3
3
|
### Bug Fixes
|
|
4
4
|
|
|
5
|
-
- **(
|
|
5
|
+
- **(proxy):** count a failed token refresh as trying the bound account ([5aff5d5](https://github.com/juspay/neurolink/commit/5aff5d59c86ffadce3cfa6b6d0d113d6f6d9f407)), closes [#0](https://github.com/juspay/neurolink/issues/0) [#2](https://github.com/juspay/neurolink/issues/2) [#1](https://github.com/juspay/neurolink/issues/1)
|
|
6
6
|
|
|
7
7
|
## [11.2.3](https://github.com/juspay/neurolink/compare/v11.2.2...v11.2.3) (2026-08-19)
|
|
8
8
|
|
|
@@ -2337,7 +2337,7 @@ data: ${JSON.stringify(ne)}
|
|
|
2337
2337
|
`)];F(V,B?.usage?{text:"",toolCalls:[],finishReason:"end_turn",usage:B.usage}:void 0,"stream_error",H,B),yield*Z}}finally{t.abortSignal?.removeEventListener("abort",$),M||$(),await A.cancel(),await A.frames.return({text:"",toolCalls:[],finishReason:"end_turn"}).catch(()=>{})}}return q()}let v;try{v=await Rtn(f)}catch(A){throw t.metadata.codexFallbackModel=n,t.metadata.codexFallbackDeferredFailure=!0,A instanceof uF&&p.always(`[proxy] Codex fallback returned ${A.status}: ${cr(A.responseBody,500)}`),A instanceof hw&&(g(A.usage?{text:"",toolCalls:[],finishReason:"end_turn",usage:A.usage}:void 0,!1),t.metadata.codexFallbackFailureUsage=A.usage),A}Object.keys(y).length>0&&(t.responseHeaders??={},Object.assign(t.responseHeaders,ice(y)));const w=y["x-neurolink-account"]??"",E=y["x-neurolink-account-type"]??"codex-oauth",_={content:v.text,model:r.model,finishReason:v.finishReason,...v.usage?{usage:v.usage}:{},toolCalls:v.toolCalls};g(v),s?.end(200,Date.now()-i);const C=Brr(_,r.model);J2(t.metadata,C),c(200,w,E,void 0,void 0,{inputTokens:v.usage?.inputTokensObserved?v.usage.input:void 0,outputTokens:v.usage?.outputTokensObserved?v.usage.output:void 0,cacheCreationTokens:v.usage?.cacheCreationTokens,cacheReadTokens:v.usage?.cacheReadTokens,reasoningTokens:v.usage?.reasoning});const k=JSON.stringify(C);return a({phase:"client_response",headers:{"content-type":"application/json"},body:k,bodySize:Buffer.byteLength(k,"utf8"),contentType:"application/json",responseStatus:200,durationMs:Date.now()-i}),C}async function wsr(e){if(_w())return null;const t=await con();if(t.length===0)return null;const r=e.body.stream===!0,n=JSON.stringify(e.body);for(const o of t){p.always(`[proxy] local pool spent \u2014 trying peer=${o.name}`);const s=await Don({peer:o,body:n,stream:r});if(s.ok)return p.always(`[proxy] served by peer=${o.name}`),e.logFinalRequest(s.response.status,`peer:${o.name}`,"peer"),r?new Response(s.response.body,{status:s.response.status,headers:{"content-type":s.response.headers.get("content-type")??"text/event-stream","cache-control":"no-cache",connection:"keep-alive"}}):await s.response.json().catch(()=>null)??null}return null}function ean(e){return!(e instanceof uF)||e.status!==400?null:{status:e.status,body:e.responseBody,contentType:"application/json"}}async function Esr(e){const{ctx:t,body:r,parsedFallbackRequest:n,fallbackPlan:o,modelRouter:s,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l}=e,u=o??Ow({provider:"anthropic",model:r.model},s?.getFallbackChain()??[],r.model,n);t.metadata.fallbackPlan=u.attempts.slice(1).map(({provider:f,model:g,reasoningEffort:y})=>({provider:f,model:g,...y?{reasoningEffort:y}:{}})),c({phase:"routing_decision",contentType:"application/json",body:{stage:"anthropic_fallback",attempts:u.attempts.slice(1)}}),i?.setFallbackInfo({triggered:!0,attemptCount:u.attempts.slice(1).length,reason:"all_anthropic_accounts_exhausted"});let d,m,h;for(const f of u.attempts.slice(1)){if(!f.provider||!f.model)continue;const g=Date.now();try{p.always(`[proxy] fallback \u2192 ${f.provider}/${f.model}${f.reasoningEffort?` reasoning=${f.reasoningEffort}`:""}`);let y;if(f.provider==="codex")y=await Qin({ctx:t,body:r,model:f.model,reasoningEffort:f.reasoningEffort,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l});else if(f.provider==="vertex"&&orn(f.model)){const v=f.model,w=`vertex/${v}`;BF(t),t.metadata.vertexFallbackModel=v,y=await irn({body:r,model:v,...t.abortSignal?{signal:t.abortSignal}:{},onTerminal:({usage:E,status:_,errorMessage:C})=>{i?.setModelSubstitution(r.model,v,"vertex"),i?.setServedAccount(w,"vertex"),i?.setUsage(E),i?.end(_,Date.now()-a),l(_,w,"vertex",_===200?void 0:"vertex_fallback_stream",C,{inputTokens:E.inputTokens,outputTokens:E.outputTokens,cacheCreationTokens:E.cacheCreationTokens,cacheReadTokens:E.cacheReadTokens})}})}else{const v=await tT.checkFallbackProviderAvailability(f.provider,f.model);if(!v.available){const E=v.reason??"provider unavailable";p.always(`[proxy] fallback ${f.provider}/${f.model} health-check failed (${E}), skipping`),Iw({provider:f.provider,model:f.model,status:"failure",errorMessage:`[unavailable] ${E}`,durationMs:0}),d=`[${f.provider}/${f.model}] unavailable: ${E}`;continue}const w=Fsr(n,{provider:f.provider,model:f.model});y=await Tsr({ctx:t,body:r,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l,options:w,providerLabel:f.provider})}return f.provider==="codex"&&r.stream?{response:y}:(Iw({provider:f.provider,model:f.model,status:"success",durationMs:Date.now()-g}),i?.setFallbackInfo({triggered:!0,provider:f.provider,model:f.model,attemptCount:u.attempts.slice(1).length,reason:"fallback_success"}),f.provider!=="codex"&&ax(t,{quota:null,source:"none",servedBy:f.provider}),{response:y})}catch(y){if(y instanceof _r||Xc(y))throw y;const v=Zg(y),w=t.abortSignal?.aborted?499:v?.status??502;m={status:w,message:v?.message?cr(`Configured fallback ${f.provider}/${f.model} failed: ${v.message}`,500):`Configured fallback ${f.provider}/${f.model} failed (HTTP ${w})`,...v?{errorCode:v.code,retryable:v.retryable}:{},errorType:w===499?"client_cancelled":w===504?"upstream_timeout":w===429?"rate_limit_error":w===401?"authentication_error":w===403?"permission_error":w===400?"invalid_request_error":"api_error"},h=ean(y)??void 0;const E=$w(y instanceof Error?y.message:String(y));let _="unknown";if(E.includes("Rate limit")||E.includes("rate_limit")||E.includes("max_parallel_requests")?_="rate_limit":E.includes("context length")||E.includes("ContextWindowExceeded")?_="context_overflow":E.includes("no content or tool calls")||E.includes("NoOutputGenerated")?_="empty_response":E.includes("thinking_level")||E.includes("Field required")?_="schema_mismatch":E.includes("Resource exhausted")&&(_="provider_quota"),p.always(`[proxy] fallback ${f.provider}/${f.model} failed [${_}]: ${$w(Yl(y))}`),Iw({provider:f.provider,model:f.model,status:"failure",errorMessage:`[${_}] ${E}`,durationMs:Date.now()-g}),d=`[${f.provider}/${f.model}] ${$w(Yl(y))}`,t.abortSignal?.aborted||m.retryable===!1)break}}return{response:null,lastErrorMessage:d,terminalFailure:m,...h?{invalidRequestFailure:h}:{}}}function Ssr(e){const{failure:t,buildLoggedClaudeError:r,tracer:n,requestStartTime:o}=e;n?.setError(t.errorType,t.message);const s=r(t.status,t.message,t.errorType,{errorCode:t.errorCode,retryable:t.retryable});return n?.end(t.status,Date.now()-o),Object.assign(s.error,{code:t.errorCode,retryable:t.retryable}),new Response(JSON.stringify(s),{status:t.status,headers:{"content-type":"application/json"}})}async function tan(e){const{ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i}=e,a=Date.now();try{const c=oF(r),l=Ow({provider:"anthropic",model:r.model},[],r.model,c,!0);if(gsr(s,"auto_fallback",l),!l.attempts.find(h=>h.label==="auto-provider"))return{response:null};p.always("[proxy] fallback \u2192 auto-provider");const d=Fsr(c),m=await Tsr({ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i,options:d,providerLabel:"auto-provider"});return Iw({provider:"auto-provider",model:r.model,status:"success",durationMs:Date.now()-a}),n?.setFallbackInfo({triggered:!0,provider:"auto-provider",model:r.model,attemptCount:1,reason:"fallback_success"}),ax(t,{quota:null,source:"none",servedBy:"auto-provider"}),{response:m}}catch(c){if(c instanceof _r||Xc(c)||t.abortSignal?.aborted)throw c;const l=$w(Yl(c));p.always(`[proxy] fallback auto-provider failed: ${l}`),Iw({provider:"auto-provider",model:r.model,status:"failure",errorMessage:l,durationMs:Date.now()-a}),n?.setFallbackInfo({triggered:!0,provider:"auto-provider",model:r.model,attemptCount:1,reason:"fallback_failure"});const u=Zg(c),d=u?.status??502;return{response:null,lastErrorMessage:l,terminalFailure:{status:d,message:cr(`Automatic fallback failed: ${u?.message??l}`,500),errorCode:u?.code,retryable:u?.retryable,errorType:d===504?"upstream_timeout":d===429?"rate_limit_error":d===401?"authentication_error":d===403?"permission_error":d===400?"invalid_request_error":"api_error"}}}}function ran(e,t=5){const r=[...new Set(e)];return r.length<=t?r.join(", "):`${r.slice(0,t).join(", ")} and ${r.length-t} more`}function bsr(e){const t=new Set(e.accounts).size,r=e.errorCode?` (${e.errorCode})`:"";return`All ${t} Anthropic account${t===1?"":"s"} are blocked by an organization entitlement policy${r}. Accounts: ${ran(e.accounts)}. Upstream: "${e.message}". Ask an organization admin to re-enable Claude Code OAuth access, then run: neurolink auth enable anthropic:<account>.`}function nan(e){const t=new Set(e.map(r=>r.coolingReason));if(t.size===1)switch([...t][0]){case"session":return"5-hour subscription window";case"weekly":return"7-day subscription window";case"unified":return"subscription limit";case"transient":return"upstream burst limit";default:break}return"upstream rate limits"}function oan(e){for(const t of e){const r=mc.get(t.key)?.quota;if(r?.overageDisabledReason&&r.overageStatus?.trim().toLowerCase()!=="allowed")return r.overageDisabledReason}}function _sr(e){return e?` Paid extra usage is unavailable for this organization (${e}), so there is no additional capacity before the window resets.`:""}function san(e){const t=new Set(e.accounts).size;return`All ${t} Anthropic account${t===1?"":"s"} have exhausted the model-scoped limit for ${e.model} (window "${e.scopeModel}"). Other models remain available on this pool \u2014 switch model, or add an account with remaining ${e.scopeModel} capacity. Earliest reset at ${new Date(e.earliestResetMs).toISOString()}.`+_sr(e.overageDisabledReason)}function ace(e){const{tracer:t,requestStartTime:r,authFailureMessage:n,authCooldownMessage:o,invalidRequestFailure:s,entitlementFailure:i,scopedExhaustion:a,sawNetworkError:c,sawTransientFailure:l,sawRateLimit:u,lastError:d,lastTransportErrorCode:m,lastTransportScope:h,fallbackFailureMessage:f,orderedAccounts:g,buildLoggedClaudeError:y,logProxyBody:v,logFinalRequest:w}=e;if(i!==null&&g.length>0&&new Set(i.accounts).size>=g.length&&i&&!u){const P=bsr(i);return t?.setError("permission_error",P),t?.end(403,Date.now()-r),y(403,P,"permission_error")}if(n&&!u)return t?.setError("authentication_error",n),t?.end(401,Date.now()-r),y(401,n);if(o&&!u)return t?.setError("token_refresh_unavailable",o),t?.end(503,Date.now()-r),y(503,o,"token_refresh_unavailable");if(s&&!u){const P=Vu(s.body),F=P.message!==void 0,$=Cr(P.message??s.body),N=F?s.body:JSON.stringify(Li(s.status,$,"invalid_request_error")),q=F?s.contentType??"application/json":"application/json";return t?.setError("invalid_request_error",$),t?.end(s.status,Date.now()-r),w(s.status,"","final","invalid_request_error",$),v({phase:"client_response",headers:{"content-type":q},body:N,bodySize:Buffer.byteLength(N,"utf8"),contentType:q,responseStatus:s.status,durationMs:Date.now()-r}),new Response(N,{status:s.status,headers:{"content-type":q}})}if((c||l)&&!u){const P=f?` Fallback also failed: ${f}`:"",F=h==="shared_provider_transport"?"shared Anthropic network":h==="connection_transport"?"Anthropic connection":null,$=`${F?`${F} failure prevented safe cross-account rotation`:"All Anthropic accounts failed due to transient upstream/network errors"}. Last error${m?` (${m})`:""}: ${d instanceof Error?d.message:String(d??"unknown")}.${P}`;return t?.setError("transient_error",$.slice(0,500)),t?.end(502,Date.now()-r),y(502,$,f?"fallback_exhausted":"transient_error",{...m?{errorCode:m}:{},...h?{transportScope:h}:{}})}const _=(P,F)=>{const $=Li(429,P,"overloaded_error");t?.setError("rate_limit_error",P),t?.end(429,Date.now()-r),w(429,"","final","rate_limit_error",P);const N=JSON.stringify($),q={"content-type":"application/json","retry-after":String(F)};return v({phase:"client_response",headers:q,body:N,bodySize:Buffer.byteLength(N,"utf8"),contentType:"application/json",responseStatus:429,durationMs:Date.now()-r}),new Response(N,{status:429,headers:q})};if(a){const P=san(a);return p.always(`[proxy] model-scoped limit exhausted for ${a.model} on all accounts`),_(P,Math.max(1,Math.ceil((a.earliestResetMs-Date.now())/1e3)))}if(!u){const P=f?` Fallback also failed: ${f}`:"",F=`All Anthropic accounts failed. Last error: ${d instanceof Error?d.message:String(d??"unknown")}.${P}`;return t?.setError("all_accounts_failed",F.slice(0,500)),t?.end(502,Date.now()-r),y(502,F,f?"fallback_exhausted":"all_accounts_failed")}const C=Date.now(),k=g.map(P=>Fa(P.key)).filter(P=>P.coolingUntil&&P.coolingUntil>C&&P.coolingReason!=="auth"),A=Math.min(...k.map(P=>P.coolingUntil??Number.POSITIVE_INFINITY)),R=g.length>0&&k.length===g.length,I=R?Math.max(1,Math.ceil((A-C)/1e3)):1,M=nan(k),D=_sr(oan(g)),U=R?`All ${g.length} Anthropic accounts are cooling after the ${M} was exhausted. Earliest retry at ${new Date(A).toISOString()}.${D}`:`All ${g.length} accounts rate-limited after per-account retries.${D}`;return p.always(`[proxy] all accounts rate-limited, retry in ${I}s`),_(U,I)}async function Csr(e){const{ctx:t,body:r,account:n,accountState:o,response:s,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,onStreamTerminal:f,poolAccounts:g,logFinalRequest:y}=e;o.consecutiveRefreshFailures=0,p.always(`[proxy] \u2190 ${s.status} account=${n.label}`);const v=dw(s.headers,{model:r.model});if(v){qin(n.key,o.quota,v),o.quota=Jg(o.quota,v);const E=Jae(o,v,Date.now());E?.kind==="cooled"?Gu(n.key,E.coolingUntil,E.coolingReason).catch(()=>{}):E?.kind==="cleared"&&Kg(n.key,E.coolingUntil).catch(()=>{}),Vp(n.key,v).catch(()=>{})}const w={};return s.headers.forEach((E,_)=>{w[_]=E}),i?.logUpstreamResponseHeaders(w),ax(t,{upstreamHeaders:s.headers,quota:v??o.quota??null,source:v?"live":o.quota?"snapshot":"none",account:n,accountState:o,servedBy:"anthropic",attempt:l,...g?{poolAccounts:g}:{}}),r.stream?ian({ctx:t,body:r,account:n,accountState:o,response:s,responseHeaders:w,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y,onStreamTerminal:f}):can({ctx:t,account:n,response:s,responseHeaders:w,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y})}async function ian(e){const{ctx:t,body:r,account:n,accountState:o,response:s,responseHeaders:i,tracer:a,requestStartTime:c,fetchStartMs:l,attemptNumber:u,finalBodyStr:d,upstreamSpan:m,logAttempt:h,logProxyBody:f,onStreamTerminal:g,logFinalRequest:y}=e;if(!s.body){Rr(n.label,n.type,502),h(502,"stream_error","No response body from upstream"),m?.end(),a?.setError("stream_error","No response body from upstream"),a?.end(502,Date.now()-c),y(502,n.label,n.type,"stream_error","No response body from upstream");const R=Li(502,"No response body from upstream"),I=JSON.stringify(R);return f({phase:"client_response",headers:{"content-type":"application/json"},body:I,bodySize:Buffer.byteLength(I,"utf8"),contentType:"application/json",account:n.label,accountType:n.type,attempt:u,responseStatus:502,durationMs:Date.now()-c}),{response:R,served:!1}}const v=s.body.getReader(),w=await bsn(v);if(w.kind==="transport_error"){const R=Yl(w.error),I=Buffer.concat(w.chunks.map(M=>Buffer.from(M))).toString("utf8");return p.always(`[proxy] stream failed before first chunk account=${n.label}: ${R}; returning terminal error to avoid replaying an ambiguous request`),Rr(n.label,n.type,502),h(502,"stream_error",R,{retryable:!1}),m?.end(),f({phase:"upstream_response",headers:i,body:I,bodySize:Buffer.byteLength(I,"utf8"),contentType:i["content-type"]??"text/event-stream",account:n.label,accountType:n.type,attempt:u,responseStatus:s.status,durationMs:Date.now()-l,metadata:{logicalStatus:502,transportError:R}}),{response:Asr({account:n,tracer:a,requestStartTime:c,attemptNumber:u,logProxyBody:f,logFinalRequest:y,errorType:"stream_error",message:R}),served:!1}}if(w.kind==="empty")return await v.cancel().catch(()=>{}),p.always(`[proxy] \u2190 empty stream from account=${n.label}, trying next`),Rr(n.label,n.type,502),h(502,"empty_stream","Empty upstream stream",{retryable:!0}),a?.recordRetry(n.label,"empty_stream"),m?.end(),f({phase:"upstream_response",headers:i,body:"",bodySize:0,contentType:i["content-type"]??"text/event-stream",account:n.label,accountType:n.type,attempt:u,responseStatus:s.status,durationMs:Date.now()-l,metadata:{logicalStatus:502,upstreamErrorType:"empty_stream"}}),{retryNextAccount:!0,failure:{message:"Empty upstream stream",rateLimit:!1}};if(w.kind==="sse_error"){await v.cancel().catch(()=>{});const R=Buffer.concat(w.chunks.map(P=>Buffer.from(P))).toString("utf8"),I=w.errorType==="rate_limit_error",M=I?429:502,D=dw(i,{model:r.model}),U=Date.now();if(I){const P=Wae(D,xF(i["retry-after"]??null),U,Q2(i),Qc,typeof r.model=="string"?r.model:void 0);o.quota=D?Jg(o.quota,D):o.quota;const F=P.reason==="transient"?"transient":"quota";P.scope==="account"&&(!o.coolingUntil||P.coolingUntil>o.coolingUntil)&&(o.coolingUntil=P.coolingUntil,o.coolingReason=P.reason,await Gu(n.key,P.coolingUntil,P.reason).catch(()=>{})),Rr(n.label,n.type,429,F),h(429,"rate_limit_error",w.message,{retryable:!0,rateLimitKind:F,cooldownReason:P.reason})}else Rr(n.label,n.type,M),h(M,w.errorType,w.message,{retryable:!0});return p.always(`[proxy] immediate SSE ${w.errorType} account=${n.label}: ${w.message}; rotating before client commit`),a?.recordRetry(n.label,I?"stream_rate_limit_before_commit":"stream_error_before_commit"),m?.end(),f({phase:"upstream_response",headers:i,body:R,bodySize:Buffer.byteLength(R,"utf8"),contentType:i["content-type"]??"text/event-stream",account:n.label,accountType:n.type,attempt:u,responseStatus:s.status,durationMs:Date.now()-l,metadata:{logicalStatus:M,upstreamErrorType:w.errorType}}),{retryNextAccount:!0,failure:{message:w.message,rateLimit:I,...w.errorType==="overloaded_error"?{retryDelayMs:Psr(u)}:{}}}}h(s.status,void 0,void 0,{attemptDurationMs:Date.now()-l});const E=Nor();let _=!1;const C=new ReadableStream({start(R){for(const I of w.chunks)R.enqueue(I)},async pull(R){if(!_)try{const{done:I,value:M}=await v.read();if(_)return;if(I){_=!0,E.complete(),R.close();return}R.enqueue(M)}catch(I){const M=Yl(I);if(p.always(`[proxy] mid-stream error account=${n.label}: ${M}`),E.fail(M),!_){_=!0;const D=`event: error
|
|
2338
2338
|
data: ${JSON.stringify({type:"error",error:{type:"api_error",message:`Upstream stream interrupted: ${M}`}})}
|
|
2339
2339
|
|
|
2340
|
-
`;R.enqueue(new TextEncoder().encode(D)),R.close()}}},cancel(){return _=!0,E.cancel(),v.cancel()}}),{response:k,telemetryDone:A}=aan({ctx:t,account:n,response:s,responseHeaders:i,remainingStream:C,streamOutcome:E.outcome,tracer:a,requestStartTime:c,attemptNumber:u,finalBodyStr:d,upstreamSpan:m,logAttempt:h,logProxyBody:f,logFinalRequest:y});return A.then(()=>g?.(),()=>g?.()),{response:k,holdsAccountAdmission:!0,served:!0}}function Qp(e){if(e.kind==="upstream_error")return{status:502,errorType:"stream_error",message:e.message};if(e.kind==="client_cancelled")return{status:499,errorType:"client_cancelled",message:"Client cancelled the streaming response"}}function zF(e,t,r){e.kind==="upstream_error"&&(Rr(t.label,t.type,502),r(502,"stream_error",e.message,{retryable:!1}))}function aan(e){const{ctx:t,account:r,response:n,responseHeaders:o,remainingStream:s,streamOutcome:i,tracer:a,requestStartTime:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:f}=e,{stream:g,capture:y}=Tae();let v=s,w;if(a)try{const{stream:C,telemetry:k}=aF({captureRawText:!0});v=v.pipeThrough(C);const A=a,R=d,I=n,M=u.length,D=r.label,U=r.key;w=Promise.all([k,y,i]).then(([P,F,$])=>{const N=AF($,P.streamErrorMessage,P.messageStopReceived);Y2(t.metadata,P),zF(N,r,m),A.setUsage({inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),sce(U,P.model,{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),oce(D,P.model,{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),A.logStreamEvents(P.events),A.setResponseInfo(fsr(P));const q=parseFloat(I.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),z=parseFloat(I.headers.get("anthropic-ratelimit-unified-7d-utilization")??""),H={inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens};isNaN(q)||(H.rateLimitAfter5h=q),isNaN(z)||(H.rateLimitAfter7d=z),(!isNaN(q)||!isNaN(z))&&A.setUsage(H),A.logUpstreamResponseBody(P.rawText??""),A.recordMetrics(),A.recordBodySizes(M,P.totalBytesReceived),R?.end();const B=Qp(N),V={inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens};B?(A.setError(B.errorType,B.message),A.end(B.status,Date.now()-c),f(B.status,D,r.type,B.errorType,B.message,V)):(A.end(200,Date.now()-c),f(200,D,r.type,void 0,void 0,V)),h({phase:"upstream_response",headers:o,body:P.rawText??"",sourceTruncated:P.rawTextTruncated,bodySize:P.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:D,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),h({phase:"client_response",headers:o,body:F.text,sourceTruncated:F.truncated,bodySize:F.totalBytes,contentType:o["content-type"]??"text/event-stream",account:D,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(P=>{A.setError("stream_telemetry_error",P instanceof Error?P.message:String(P)),R?.end(),A.end(500,Date.now()-c),f(500,D,r.type,"stream_telemetry_error",P instanceof Error?P.message:String(P))})}catch{w=i.then(C=>{zF(C,r,m);const k=Qp(C);d?.end(),k?(a.setError(k.errorType,k.message),a.end(k.status,Date.now()-c),f(k.status,r.label,r.type,k.errorType,k.message)):(a.end(n.status,Date.now()-c),f(n.status,r.label,r.type))}).catch(()=>{})}else{d?.end();try{const{stream:C,telemetry:k}=aF({captureRawText:!0});v=v.pipeThrough(C);const A=r.label,R=r.key;w=Promise.all([k,y,i]).then(([I,M,D])=>{const U=AF(D,I.streamErrorMessage,I.messageStopReceived);Y2(t.metadata,I),zF(U,r,m);const P=Qp(U),F={inputTokens:I.usage.inputTokens,outputTokens:I.usage.outputTokens,cacheCreationTokens:I.usage.cacheCreationInputTokens,cacheReadTokens:I.usage.cacheReadInputTokens};sce(R,I.model,F),oce(A,I.model,F),P?f(P.status,A,r.type,P.errorType,P.message,F):f(200,A,r.type,void 0,void 0,F),h({phase:"upstream_response",headers:o,body:I.rawText??"",sourceTruncated:I.rawTextTruncated,bodySize:I.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),h({phase:"client_response",headers:o,body:M.text,sourceTruncated:M.truncated,bodySize:M.totalBytes,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(I=>{const M=I instanceof Error?I.message:String(I);f(500,r.label,r.type,"stream_telemetry_error",M)})}catch{y.then(C=>{h({phase:"client_response",headers:o,body:C.text,sourceTruncated:C.truncated,bodySize:C.totalBytes,contentType:o["content-type"]??"text/event-stream",account:r.label,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(()=>{}),w=i.then(C=>{zF(C,r,m);const k=Qp(C);k?f(k.status,r.label,r.type,k.errorType,k.message):f(n.status,r.label,r.type)}).catch(()=>{})}}const E=v.pipeThrough(g);yw(t.metadata,{onTerminal:()=>w});const _={...t.responseHeaders??{},"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"};return{response:new Response(E,{status:n.status,headers:_}),telemetryDone:w}}async function can(e){const{ctx:t,account:r,response:n,responseHeaders:o,tracer:s,requestStartTime:i,fetchStartMs:a,attemptNumber:c,finalBodyStr:l,upstreamSpan:u,logAttempt:d,logProxyBody:m,logFinalRequest:h}=e,f=await n.text();d(n.status,void 0,void 0,{attemptDurationMs:Date.now()-a}),s?.logUpstreamResponseBody(f),m({phase:"upstream_response",headers:o,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:c,responseStatus:n.status,durationMs:Date.now()-a}),m({phase:"client_response",headers:o,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:c,responseStatus:n.status,durationMs:Date.now()-i});const g=JSON.parse(f);if(J2(t.metadata,g),ysr(r,g),s&&g&&typeof g=="object"){const y=g.usage;if(y){s.setUsage({inputTokens:y.input_tokens??0,outputTokens:y.output_tokens??0,cacheCreationTokens:y.cache_creation_input_tokens??0,cacheReadTokens:y.cache_read_input_tokens??0});const w=parseFloat(n.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),E=parseFloat(n.headers.get("anthropic-ratelimit-unified-7d-utilization")??"");if(!isNaN(w)||!isNaN(E)){const _={inputTokens:y.input_tokens??0,outputTokens:y.output_tokens??0,cacheCreationTokens:y.cache_creation_input_tokens??0,cacheReadTokens:y.cache_read_input_tokens??0};isNaN(w)||(_.rateLimitAfter5h=w),isNaN(E)||(_.rateLimitAfter7d=E),s.setUsage(_)}}s.setResponseInfo(nce(g)),s.recordMetrics();const v=JSON.stringify(g);s.recordBodySizes(l.length,v.length),u?.end(),s.end(n.status,Date.now()-i),h(n.status,r.label,r.type,void 0,void 0,{inputTokens:y?.input_tokens,outputTokens:y?.output_tokens,cacheCreationTokens:y?.cache_creation_input_tokens,cacheReadTokens:y?.cache_read_input_tokens})}else{u?.end();const y=g&&typeof g=="object"?g.usage:void 0;h(n.status,r.label,r.type,void 0,void 0,{inputTokens:y?.input_tokens,outputTokens:y?.output_tokens,cacheCreationTokens:y?.cache_creation_input_tokens,cacheReadTokens:y?.cache_read_input_tokens})}return{response:g,served:!0}}async function lan(e){const{ctx:t,account:r,accountState:n,requestedModel:o,retryResp:s,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:f}=e,g=dw(s.headers,{model:o});if(g){n.quota=Jg(n.quota,g);const E=Jae(n,g,Date.now());E?.kind==="cooled"?Gu(r.key,E.coolingUntil,E.coolingReason).catch(()=>{}):E?.kind==="cleared"&&Kg(r.key,E.coolingUntil).catch(()=>{}),Vp(r.key,g).catch(_=>{p.debug("[proxy] Failed to persist account quota after auth retry",{account:r.label,error:_ instanceof Error?_.message:String(_)})})}const y=Object.fromEntries([...s.headers.entries()]),v=await s.text();m(s.status,void 0,void 0,{attemptDurationMs:Date.now()-c}),i?.logUpstreamResponseHeaders(y),i?.logUpstreamResponseBody(v),h({phase:"upstream_response",headers:y,body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:y["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:s.status,durationMs:Date.now()-c}),h({phase:"client_response",headers:y,body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:y["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:s.status,durationMs:Date.now()-a});const w=JSON.parse(v);if(J2(t.metadata,w),ysr(r,w),i&&w&&typeof w=="object"){const E=w.usage;E&&i.setUsage({inputTokens:E.input_tokens??0,outputTokens:E.output_tokens??0,cacheCreationTokens:E.cache_creation_input_tokens??0,cacheReadTokens:E.cache_read_input_tokens??0}),i.setResponseInfo(nce(w)),i.recordMetrics();const _=JSON.stringify(w);i.recordBodySizes(u.length,_.length),d?.end(),i.end(s.status,Date.now()-a),f(s.status,r.label,r.type,void 0,void 0,{inputTokens:E?.input_tokens,outputTokens:E?.output_tokens,cacheCreationTokens:E?.cache_creation_input_tokens,cacheReadTokens:E?.cache_read_input_tokens})}else d?.end(),f(s.status,r.label,r.type);return w}async function uan(e){const{ctx:t,body:r,account:n,accountState:o,headers:s,buildUpstreamBody:i,url:a,enabledAccounts:c,orderedAccounts:l,tracer:u,requestStartTime:d,allocateAttemptNumber:m,upstreamSpan:h,logAttempt:f,logProxyBody:g,onStreamTerminal:y,logFinalRequest:v,lastError:w,authFailureMessage:E,entitlementFailure:_,sawRateLimit:C,sawTransientFailure:k,sawNetworkError:A,bindServedSession:R}=e;Rr(n.label,n.type,401),f(401,"authentication_error","received 401 from Anthropic",{retryable:!0});let I=w,M=E,D=_,U=C,P=k,F=A,$=h,N=!1,q="received 401 from Anthropic";for(let z=0;z<nx;z++){p.always(`[proxy] \u2190 401 account=${n.label} refreshing (attempt ${z+1}/${nx})`);const H=await rF(n,n.persistTarget);if(!H.success){if(q=`refresh failed for account=${n.label} attempt ${z+1}/${nx}: ${H.error?.slice(0,200)??"unknown"}`,I=q,Xg(H))await gm(n,o,"refresh_invalid"),M=HF(n.label),p.always(`[proxy] account=${n.label} refresh token rejected; disabled until re-authentication`);else{const he=await GF(n,o);P=!0,p.always(`[proxy] account=${n.label} refresh temporarily unavailable (${H.status??"network"}); cooling until ${new Date(he).toISOString()} and rotating`)}break}n.persistTarget&&await nF(n.persistTarget,n),await jF(n,o),s.authorization=`Bearer ${n.token}`;const B=m(),V=Date.now(),ne=(he,te,ge,Me)=>f(he,te,ge,{...Me,attempt:B,attemptDurationMs:Me?.attemptDurationMs??Date.now()-V}),Z=i(n.token),ke=Date.now();try{const he=await zae(a,{method:"POST",headers:s,body:Z.bodyStr,signal:AbortSignal.any([...t.abortSignal?[t.abortSignal]:[],AbortSignal.timeout(ox)])},t,n.key,{logProxyBody:g,tracer:u,attemptNumber:B,accountLabel:n.label,accountType:n.type,preparedContext:Z.preparedContext});if(he.ok){N=!0,o.consecutiveRefreshFailures=0,p.always(`[proxy] \u2190 200 account=${n.label} (after ${z+1} refresh(es))`);const fe=r.stream?await Csr({ctx:t,body:r,account:n,accountState:o,response:he,tracer:u,requestStartTime:d,fetchStartMs:ke,attemptNumber:B,finalBodyStr:Z.bodyStr,upstreamSpan:$,logAttempt:ne,logProxyBody:g,logFinalRequest:v,onStreamTerminal:y}):{response:await lan({ctx:t,account:n,accountState:o,requestedModel:r.model,retryResp:he,tracer:u,requestStartTime:d,fetchStartMs:ke,attemptNumber:B,finalBodyStr:Z.bodyStr,upstreamSpan:$,logAttempt:ne,logProxyBody:g,logFinalRequest:v}),served:!0};if("retryNextAccount"in fe){const Oe=fe.failure;return{continueLoop:!0,...Oe?.retryDelayMs?{retryDelayMs:Oe.retryDelayMs}:{},lastError:Oe?.message??I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U||!!Oe?.rateLimit,sawTransientFailure:P||!!(Oe&&!Oe.rateLimit),sawNetworkError:F,upstreamSpan:void 0}}return R&&fe.served&&R(n.key),{response:fe.response,holdsAccountAdmission:fe.holdsAccountAdmission,continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0}}const te=he.status,ge=await he.text(),Me={};he.headers.forEach((fe,Oe)=>{Me[Oe]=fe});const Ue={...Me};delete Ue.authorization,delete Ue["x-api-key"];const xe=ge.length>4e3?ge.slice(0,4e3)+"...[truncated]":ge;if(u?.logUpstreamResponseHeaders(Ue),u?.logUpstreamResponseBody(xe),g({phase:"upstream_response",headers:Ue,body:xe,bodySize:Buffer.byteLength(ge,"utf8"),contentType:Me["content-type"]??"application/json",account:n.label,accountType:n.type,attempt:B,responseStatus:te,durationMs:Date.now()-ke}),q=`retry ${z+1}/${nx} failed with status ${te}`,I=ge,p.debug(`[proxy] retry ${z+1} failed: ${te} ${ge.substring(0,120)}`),te===429&&xsr(Me,ge))return p.always(`[proxy] \u2190 429 account=${n.label} anti-abuse/construction rejection after OAuth refresh \u2014 returning non-retryable request error`),ne(429,"construction_rejection",ge),u?.setError("construction_rejection",ge.slice(0,500)),$?.end(),{response:ksr({terminalError:Isr(),account:n,tracer:u,requestStartTime:d,attemptNumber:B,logProxyBody:g,logFinalRequest:v}),continueLoop:!1,lastError:ge,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0};if(te===429){U=!0;const fe=Date.now(),Oe=dw(Me,{model:r.model});Oe&&(o.quota=Jg(o.quota,Oe));const De=Wae(Oe,xF(Me["retry-after"]??null),fe,Q2(Me),Qc,typeof r.model=="string"?r.model:void 0),Ye=De.reason==="transient"?"transient":"quota";Rr(n.label,n.type,te,Ye),ne(429,"rate_limit_error",ge,{retryable:!0,rateLimitKind:Ye,cooldownReason:De.reason}),De.scope==="account"&&(!o.coolingUntil||De.coolingUntil>o.coolingUntil)&&(o.coolingUntil=De.coolingUntil,o.coolingReason=De.reason),Oe&&Vp(n.key,Oe).catch(()=>{}),De.scope==="account"&&await Gu(n.key,o.coolingUntil??De.coolingUntil,o.coolingReason??De.reason).catch(()=>{}),ny(n.key,c.length,l[0]?.key);break}if(te===401||te===402||te===403){if(mce(te,ge)){const fe=Vu(ge);Rr(n.label,n.type,te),ne(te,"permission_error",Cr(ge)),D={status:te,accounts:[...D?.accounts??[],n.label],message:D?.message??fe.message??Cr(ge),...fe.errorCode?{errorCode:fe.errorCode}:{}},n.type==="oauth"&&Lsr(te,ge)&&await gm(n,o,"entitlement_blocked"),q=`entitlement blocked for account=${n.label}`,I=q,p.always(`[proxy] \u2190 ${te} account=${n.label} entitlement blocked after refresh; advancing to next account`);break}Rr(n.label,n.type,te),ne(te,"authentication_error",Cr(ge),{retryable:!0}),z<nx-1&&await Hu(1e3);continue}if($sr(te,ge)){Rr(n.label,n.type,te),ne(te,"api_error",Cr(ge),{retryable:!0}),P=!0;break}ne(te,"api_error",Cr(ge));try{return v(te,n.label,n.type,"api_error",Cr(ge)),{response:JSON.parse(ge),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}catch{return v(te,n.label,n.type,"api_error",Cr(ge)),{response:Li(te,ge),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}}catch(he){if(he instanceof _r||Xc(he))throw $?.end(),he;if(t.abortSignal?.aborted)throw ne(499,"client_cancelled","Client cancelled upstream request",{retryable:!1}),$?.end(),he;F=!0,Rr(n.label,n.type,502);const te=he instanceof Error?he.message:String(he);q=`network error on retry ${z+1}: ${te}`,I=q;const ge=dce(he);if(ne(502,"network_error",te,{retryable:ge,errorCode:dx(he)??"unknown"}),p.debug(`[proxy] ${q}`),!ge)return $?.end(),{response:Asr({account:n,tracer:u,requestStartTime:d,attemptNumber:B,logProxyBody:g,logFinalRequest:v,errorType:"network_error",message:te}),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0};break}}return N||(I=q,p.always(`[proxy] \u26A0 account=${n.label} auth retries exhausted, rotating to next account`),u?.setError("authentication_error",q),u?.recordRetry(n.label,"auth_exhausted"),$?.end(),$=void 0,ny(n.key,c.length,l[0]?.key)),{continueLoop:!0,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}function cce(e){const{responseStatus:t,account:r,errBody:n,errRespHeaders:o,requestStartTime:s,attemptNumber:i,logProxyBody:a,logFinalRequest:c,errorType:l}=e;try{const u=JSON.parse(n);return c(t,r.label,r.type,l,Cr(n)),a({phase:"client_response",headers:{"content-type":o["content-type"]??"application/json"},body:n,bodySize:Buffer.byteLength(n,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:i,responseStatus:t,durationMs:Date.now()-s}),u}catch{c(t,r.label,r.type,l,Cr(n));const u=Li(t,n),d=JSON.stringify(u);return a({phase:"client_response",headers:{"content-type":"application/json"},body:d,bodySize:Buffer.byteLength(d,"utf8"),contentType:"application/json",account:r.label,accountType:r.type,attempt:i,responseStatus:t,durationMs:Date.now()-s}),u}}function ksr(e){const{terminalError:t,account:r,tracer:n,requestStartTime:o,attemptNumber:s,logProxyBody:i,logFinalRequest:a}=e;return n?.end(t.status,Date.now()-o),cce({responseStatus:t.status,account:r,errBody:t.body,errRespHeaders:t.headers,requestStartTime:o,attemptNumber:s,logProxyBody:i,logFinalRequest:a,errorType:t.errorType})}function Asr(e){const{account:t,tracer:r,requestStartTime:n,attemptNumber:o,logProxyBody:s,logFinalRequest:i,errorType:a,message:c}=e;r?.setError(a,c),r?.end(502,Date.now()-n),i(502,t.label,t.type,a,c);const l=Li(502,c),u=JSON.stringify(l);return s({phase:"client_response",headers:{"content-type":"application/json"},body:u,bodySize:Buffer.byteLength(u,"utf8"),contentType:"application/json",account:t.label,accountType:t.type,attempt:o,responseStatus:502,durationMs:Date.now()-n}),l}async function dan(e){const{response:t,account:r,accountState:n,enabledAccounts:o,orderedAccounts:s,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,logAttempt:u,logProxyBody:d,logFinalRequest:m,lastError:h,authFailureMessage:f,sawTransientFailure:g,invalidRequestFailure:y,entitlementFailure:v,allowConfiguredModelFallback:w=!1}=e;let E=h,_=f,C=g,k=y,A=v;const R=await t.text(),I={};if(t.headers.forEach((M,D)=>{I[D]=M}),i?.logUpstreamResponseHeaders(I),i?.logUpstreamResponseBody(R),d({phase:"upstream_response",headers:I,body:R,bodySize:Buffer.byteLength(R,"utf8"),contentType:I["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:t.status,durationMs:Date.now()-c}),_an(t.status,R))return kan(t.status,R)?(p.always(`[proxy] \u2190 ${t.status} account=${r.label} beta unavailable for subscription; advancing to next account`),u(t.status,"invalid_request_error",Cr(R)),i?.setError("invalid_request_error",Cr(R)),i?.recordRetry(r.label,"beta_unavailable"),ny(r.key,o.length,s[0]?.key),E=Cr(R),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 ${t.status} upstream invalid_request_error`),u(t.status,"invalid_request_error",Cr(R)),i?.setError("invalid_request_error",Cr(R)),k={status:t.status,body:R,contentType:I["content-type"]},E=Cr(R),{continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0});if(r.type==="oauth"&&mce(t.status,R)){const M=Vu(R);return Rr(r.label,r.type,t.status),A={status:t.status,accounts:[...A?.accounts??[],r.label],message:A?.message??M.message??Cr(R),...M.errorCode?{errorCode:M.errorCode}:{}},p.always(`[proxy] \u2190 ${t.status} account=${r.label} entitlement blocked${M.errorCode?` (${M.errorCode})`:""}; advancing to next account`),u(t.status,"permission_error",Cr(R)),i?.setError("permission_error",Cr(R)),i?.recordRetry(r.label,"entitlement_blocked"),r.type==="oauth"&&Lsr(t.status,R)&&await gm(r,n,"entitlement_blocked"),ny(r.key,o.length,s[0]?.key),E=Cr(R),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}if((t.status===401||t.status===402||t.status===403)&&r.type==="oauth"&&!r.refreshToken)return Rr(r.label,r.type,t.status),await gm(r,n,"missing_refresh_token"),_=HF(r.label),p.always(`[proxy] \u2190 ${t.status} account=${r.label} (auth failure, no refresh token)`),E=R,u(t.status,"authentication_error",Cr(R)),i?.setError("authentication_error",Cr(R)),i?.recordRetry(r.label,"auth_no_refresh"),ny(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0};if((t.status===401||t.status===402||t.status===403)&&r.type==="api_key")return Rr(r.label,r.type,t.status),_="Authentication failed for Anthropic API key credentials. Update ANTHROPIC_API_KEY or re-login with OAuth.",p.always(`[proxy] \u2190 ${t.status} account=${r.label} (auth failure, api_key)`),E=R,u(t.status,"authentication_error",Cr(R)),i?.setError("authentication_error",Cr(R)),i?.recordRetry(r.label,"auth_api_key"),ny(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0};if(t.status===404)return w&&Can(t.status,R)?(p.always(`[proxy] \u2190 404 account=${r.label} model unavailable; trying configured fallback`),u(404,"not_found_error",Cr(R)),i?.setError("not_found_error",Cr(R)),i?.recordRetry(r.label,"model_not_found"),E=Cr(R),{continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 404 account=${r.label}`),u(404,"not_found_error",Cr(R)),i?.setError("not_found_error",Cr(R)),i?.end(404,Date.now()-a),{response:cce({responseStatus:404,account:r,errBody:R,errRespHeaders:I,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"not_found_error"}),continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0});if($sr(t.status,R)){const M=xan(t.status,R);return Rr(r.label,r.type,t.status,t.status===429?"transient":void 0),C=!0,p.always(`[proxy] \u2190 ${t.status} account=${r.label} (${M?"overloaded":"transient"})`),E=R,u(t.status,"api_error",Cr(R),t.status===429?{retryable:!0,rateLimitKind:"transient",cooldownReason:"transient"}:void 0),i?.setError(M?"overloaded_error":"transient_error",Cr(R)),i?.recordRetry(r.label,M?"overloaded":"transient"),{continueLoop:!0,retrySameAccount:!M,...M?{retryDelayMs:Psr(l)}:{},lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}return p.always(`[proxy] \u2190 ${t.status} account=${r.label}`),p.debug(`[claude-proxy] error body: ${R.substring(0,200)}`),u(t.status,"api_error",Cr(R)),i?.setError("api_error",Cr(R)),i?.end(t.status,Date.now()-a),{response:cce({responseStatus:t.status,account:r,errBody:R,errRespHeaders:I,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"api_error"}),continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}function man(e){const{ctx:t,body:r,clientRequestBody:n}=e;let o;try{o=VA.startRequest({recordRequestMetrics:UA(t.requestId)?.accountingScope!=="internal",recordUsageMetrics:!0,requestId:t.requestId,method:t.method,path:t.path,model:r.model,stream:r.stream??!1,toolCount:Array.isArray(r.tools)?r.tools.length:0,toolNames:Array.isArray(r.tools)?r.tools.map(h=>h&&typeof h=="object"&&"name"in h?String(h.name??""):"").filter(h=>h.length>0):void 0,sessionId:t.headers["x-neurolink-session-id"]??t.headers["x-claude-code-session-id"]??void 0,userAgent:t.headers["user-agent"]??void 0},t.headers);const m=o.startReceive();o.logRequestHeaders(t.headers),o.logRequestBody(n),m.end()}catch{o=void 0}const s=Date.now(),i=m=>{const h=o?.getTraceContext();xw({timestamp:new Date().toISOString(),requestId:t.requestId,model:r.model,stream:r.stream??!1,...m,...h?{traceId:h.traceId,spanId:h.spanId}:{}})};let a;const c=m=>{if(a){p.debug(`[claude-proxy] ignored duplicate routing decision for request ${t.requestId}`);return}a=m};let l=!1;const u=(m,h,f,g,y,v)=>{if(l||gw(t.requestId)){p.debug(`[claude-proxy] ignored duplicate finalization for request ${t.requestId}`);return}l=!0,t.abortSignal?.aborted&&(m=499,g="client_cancelled",y="Client cancelled request");const w=t.metadata.sdkFallbackFailure;w&&(h="unknown",f="translation",o?.setServedAccount(h,f),w.model&&o?.setModelSubstitution(r.model,w.model,w.provider),w.inputTokens!==void 0&&w.outputTokens!==void 0&&o?.setUsage({inputTokens:w.inputTokens,outputTokens:w.outputTokens,cacheReadTokens:w.cacheReadTokens??0,cacheCreationTokens:w.cacheCreationTokens??0,inputIncludesCachedTokens:w.inputIncludesCachedTokens,reasoningTokens:w.reasoningTokens}));const E=t.metadata.codexFallbackFailureUsage;E&&(v={inputTokens:E.inputTokensObserved?E.input:void 0,outputTokens:E.outputTokensObserved?E.output:void 0,cacheReadTokens:E.cacheReadTokens,cacheCreationTokens:E.cacheCreationTokens,reasoningTokens:E.reasoning,...v}),!h&&typeof t.metadata.codexFallbackAccount=="string"&&t.metadata.codexFallbackAccount&&(h=t.metadata.codexFallbackAccount,typeof t.metadata.codexFallbackAccountType=="string"&&(f=t.metadata.codexFallbackAccountType)),!w&&t.metadata.codexFallbackDeferredFailure===!0&&typeof t.metadata.codexFallbackModel=="string"&&(o?.setModelSubstitution(r.model,t.metadata.codexFallbackModel,"openai"),o?.setServedAccount(h||"unknown",f),E?.inputTokensObserved&&E.outputTokensObserved&&o?.setUsage({inputTokens:E.input,outputTokens:E.output,cacheReadTokens:E.cacheReadTokens??0,cacheCreationTokens:E.cacheCreationTokens??0,reasoningTokens:E.reasoning},{recordMetrics:!1}));const _=h||(m>=400?Nae:void 0),C=h?f||void 0:m>=400?Lae:void 0,k=w?{accountKey:w.accountKey,provider:w.provider}:Hor(_,C),A=UA(t.requestId)?.accountingScope!=="internal";A&&m>=400?qg(m,_,C,{requestId:t.requestId,...k.accountKey?{accountKey:k.accountKey}:{},errorType:g,terminalOutcome:g==="client_cancelled"?"client_cancelled":g?.includes("stream")?"stream_error":"handler_error",message:y,errorCode:v?.errorCode}):A&&dA(_,C);const R=o?.getTraceContext(),I=Xin(t.metadata,C);Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:I??r.model,...I?{requestedModel:r.model,...C==="vertex"?{}:{inputIncludesCachedTokens:!1}}:{},...t.metadata.contextPreflight?{contextPreflight:t.metadata.contextPreflight}:{},...t.metadata.tokenBudget?{tokenBudget:t.metadata.tokenBudget}:{},stream:!!r.stream,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:_??"",...k.accountKey?{accountKey:k.accountKey}:{},accountType:C??"",...k.provider?{provider:k.provider}:{},...w,...jA(t.headers),responseStatus:m,responseTimeMs:Date.now()-s,...YQr(t.metadata,s),...g?{errorType:g}:{},...y?{errorMessage:y}:{},...v?.errorCode?{errorCode:v.errorCode}:{},...v?.retryable!==void 0?{retryable:v.retryable}:{},...v?.transportScope?{transportScope:v.transportScope}:{},...v?.inputTokens!==void 0?{inputTokens:v.inputTokens}:{},...v?.outputTokens!==void 0?{outputTokens:v.outputTokens}:{},...v?.cacheCreationTokens!==void 0?{cacheCreationTokens:v.cacheCreationTokens}:{},...v?.cacheReadTokens!==void 0?{cacheReadTokens:v.cacheReadTokens}:{},...v?.reasoningTokens!==void 0?{reasoningTokens:v.reasoningTokens}:{},...R?{traceId:R.traceId,spanId:R.spanId}:{},...a?{routingDecision:a}:{},...Array.isArray(t.metadata.fallbackPlan)?{fallbackPlan:t.metadata.fallbackPlan}:{}})},d=(m,h,f,g)=>{const y=Li(m,h,f),v=JSON.stringify(y);return u(m,g?.account??"",g?.accountType??"final",f,h,g),i({phase:"client_response",headers:{"content-type":"application/json"},body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:"application/json",responseStatus:m,durationMs:Date.now()-s,...g}),y};return i({phase:"client_request",headers:t.headers,body:n,bodySize:Buffer.byteLength(n,"utf8"),contentType:t.headers["content-type"]??"application/json"}),{tracer:o,requestStartTime:s,logProxyBody:i,logFinalRequest:u,buildLoggedClaudeError:d,setRoutingDecision:c}}function pan(e){const{ctx:t,body:r,toolCount:n,requestStart:o,tracer:s,account:i,attemptNumber:a}=e,c=Date.now(),l=Hor(i.label,i.type);return(u,d,m,h)=>{const f=Date.now(),g=s?.getTraceContext();lae({timestamp:new Date().toISOString(),requestId:t.requestId,attempt:h?.attempt??a,method:t.method,path:t.path,model:r.model,...t.metadata.contextPreflight?{contextPreflight:t.metadata.contextPreflight}:{},...t.metadata.tokenBudget?{tokenBudget:t.metadata.tokenBudget}:{},stream:!!r.stream,toolCount:n,account:i.label,accountKey:i.key,accountType:i.type,...l.provider?{provider:l.provider}:{},responseStatus:u,responseTimeMs:f-o,attemptDurationMs:h?.attemptDurationMs??f-c,...d?{errorType:d}:{},...m?{errorMessage:m}:{},...h?.errorCode?{errorCode:h.errorCode}:{},...h?.transportScope?{transportScope:h.transportScope}:{},...h?.inputTokens!==void 0?{inputTokens:h.inputTokens}:{},...h?.outputTokens!==void 0?{outputTokens:h.outputTokens}:{},...h?.cacheCreationTokens!==void 0?{cacheCreationTokens:h.cacheCreationTokens}:{},...h?.cacheReadTokens!==void 0?{cacheReadTokens:h.cacheReadTokens}:{},...h?.retryable!==void 0?{retryable:h.retryable}:{},...h?.connectPhase!==void 0?{connectPhase:h.connectPhase}:{},...h?.rateLimitKind?{rateLimitKind:h.rateLimitKind}:{},...h?.cooldownReason?{cooldownReason:h.cooldownReason}:{},...g?{traceId:g.traceId,spanId:g.spanId}:{}})}}async function han(e){const{ctx:t,account:r,accountState:n,bodyStr:o,clientHeaders:s,isClaudeClientRequest:i,url:a,tracer:c,attemptNumber:l,currentLastError:u,currentAuthFailureMessage:d,logAttempt:m,logProxyBody:h}=e;let f=u,g=d;if(wie(r)){const I=await rF(r,r.persistTarget);if(I.success)r.persistTarget&&await nF(r.persistTarget,r),await jF(r,n);else return f=`token refresh failed for account=${r.label}: ${I.error?.slice(0,200)??"unknown"}`,Xg(I)?(await gm(r,n,"refresh_invalid"),g=HF(r.label)):await GF(r,n),m(Xg(I)?401:503,Xg(I)?"authentication_error":"token_refresh_unavailable",String(f)),{continueLoop:!0,lastError:f,authFailureMessage:g}}const y=r.type==="oauth",v={};for(const[I,M]of Object.entries(s))typeof M=="string"&&(v[I]=M);const w=y?await Rin(r.label,r.key,v,o):null,E={};for(const[I,M]of Object.entries(s)){const D=I.toLowerCase();typeof M=="string"&&!IF.has(D)&&(E[D]=M)}if(E["content-type"]="application/json",y?(E.authorization=`Bearer ${r.token}`,delete E["x-api-key"],Cin(E,w)):(E["x-api-key"]=r.token,delete E.authorization),E["user-agent"]||(E["user-agent"]=Hf),E["anthropic-version"]||(E["anthropic-version"]="2023-06-01"),E["anthropic-dangerous-direct-browser-access"]||(E["anthropic-dangerous-direct-browser-access"]="true"),E["x-app"]||(E["x-app"]="cli"),E.accept||(E.accept="application/json"),y){const I=i?E["anthropic-beta"]??"":s["anthropic-beta"]??"",M=new Set(I.split(",").map(D=>D.trim()).filter(Boolean));for(const D of i?fC:_in)M.add(D);E["anthropic-beta"]=[...M].join(",")}else{const I=(E["anthropic-beta"]??"").split(",").map(M=>M.trim()).filter(M=>M&&!fC.includes(M)).join(",");I?E["anthropic-beta"]=I:delete E["anthropic-beta"]}const _=I=>{const M=y?Min(o,I,w,i,E["x-claude-code-session-id"]):{bodyStr:o};return{...M,...Zor(t,M.bodyStr)}},C=_(r.token);y&&C.sessionId&&!E["x-claude-code-session-id"]&&(E["x-claude-code-session-id"]=C.sessionId);const k=C.bodyStr;p.always(`[proxy] \u2192 account=${r.label} (${r.type})`);const A=Date.now();let R;return c&&(R=c.startUpstreamAttempt({attempt:l,account:r.label,polyfillHeaders:y,polyfillBody:y,upstreamUrl:a}),Object.assign(E,c.getTraceHeaders())),{continueLoop:!1,lastError:f,authFailureMessage:g,headers:E,buildUpstreamBody:_,finalBodyStr:k,preparedContext:C.preparedContext,fetchStartMs:A,upstreamSpan:R}}function xsr(e,t){const r=!!e["retry-after"],n=Object.keys(e).some(o=>o.toLowerCase().startsWith("anthropic-ratelimit-"));return r||n?!1:t.includes("rate_limit_error")&&/"message"\s*:\s*"Error"/.test(t)}function Isr(){return{status:400,body:JSON.stringify(Li(400,"Anthropic rejected the OAuth request shape. This is not an account rate limit.","invalid_request_error")),headers:{"content-type":"application/json"},errorType:"construction_rejection"}}async function fan(e){const{ctx:t,url:r,headers:n,finalBodyStr:o,preparedContext:s,requestedModel:i,account:a,accountState:c,enabledAccounts:l,orderedAccounts:u,tracer:d,logAttempt:m,logProxyBody:h,fetchStartMs:f,attemptNumber:g,currentLastError:y,currentSawRateLimit:v,currentSawNetworkError:w,upstreamSpan:E}=e;let _=y,C=v,k=w;const A=E;let R;try{R=await zae(r,{method:"POST",headers:n,body:o,signal:AbortSignal.any([...t.abortSignal?[t.abortSignal]:[],AbortSignal.timeout(ox)])},t,a.key,{logProxyBody:h,tracer:d,attemptNumber:g,accountLabel:a.label,accountType:a.type,preparedContext:s})}catch(I){if(I instanceof _r||Xc(I))throw A?.end(),I;if(t.abortSignal?.aborted)throw m(499,"client_cancelled","Client cancelled upstream request",{retryable:!1}),A?.end(),t.abortSignal.reason;const M=dce(I),D=Osr(I),U=San(I);k=!0,Rr(a.label,a.type,502);const P=dx(I)??"unknown",F=I instanceof Error?I.message:String(I);if(_=F,p.always(`[proxy] fetch error account=${a.label} code=${P} (${M?"retryable":"terminal"}): ${F}`),m(502,"network_error",F,{retryable:M,connectPhase:D,errorCode:P,transportScope:U}),d?.setError("network_error",F),M&&d?.recordRetry(a.label,"network_error"),A?.end(),!M)throw I;return{continueLoop:!0,retrySameAccount:!0,transportScope:U,errorCode:P,connectPhase:D,lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0}}if(R.status===429){const I=xF(R.headers.get("retry-after")),M={};R.headers.forEach((z,H)=>{M[H]=z}),_=await R.text();const D={...M};delete D.authorization,delete D["x-api-key"];const U=String(_).length>4e3?String(_).slice(0,4e3)+"...[truncated]":String(_);if(d?.logUpstreamResponseHeaders(D),d?.logUpstreamResponseBody(U),h({phase:"upstream_response",headers:D,body:U,bodySize:Buffer.byteLength(String(_),"utf8"),contentType:M["content-type"]??"application/json",account:a.label,accountType:a.type,attempt:g,responseStatus:429,durationMs:Date.now()-f}),xsr(M,String(_)))return p.always(`[proxy] \u2190 429 account=${a.label} anti-abuse/construction rejection (no ratelimit headers, body="Error") \u2014 NOT a real rate limit; returning non-retryable request error`),m(429,"construction_rejection",String(_)),d?.setError("construction_rejection",String(_).slice(0,500)),A?.end(),{continueLoop:!1,terminalError:Isr(),lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0};C=!0;const P=Date.now(),F=dw(M,{model:i}),$=Q2(M),N=Wae(F,I,P,$,Qc,i),q=N.reason==="transient"?"transient":"quota";return Rr(a.label,a.type,429,q),p.always(`[proxy] \u2190 429 account=${a.label} reason=${N.reason} scope=${N.scope} retry-after=${I}ms 5h-status=${M["anthropic-ratelimit-unified-5h-status"]??"unknown"} 7d-status=${M["anthropic-ratelimit-unified-7d-status"]??"unknown"} unified-status=${$??"unknown"} \u2192 ${N.rotateImmediately?`rotate now, cool ${Kae(N.coolingUntil,P)}m`:"retry same account (transient)"}`),m(429,"rate_limit_error",String(_),{retryable:!0,rateLimitKind:q,cooldownReason:N.reason}),d?.setError("rate_limit_error",String(_).slice(0,500)),d?.recordRetry(a.label,"rate_limit"),A?.end(),{continueLoop:!0,retrySameAccount:!N.rotateImmediately,retryAfterMs:I,cooldownPlan:N,...F?{quota:F}:{},lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0}}return{continueLoop:!1,response:R,lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:A}}function gan(e){return e.invalidRequestFailure===null}function yan(e){const{ctx:t,tracer:r,requestStartTime:n,failure:o,buildLoggedClaudeError:s}=e;return o.responseHeaders&&(t.responseHeaders={...t.responseHeaders??{},...o.responseHeaders}),r?.setError(o.errorType,o.message),r?.end(o.status,Date.now()-n),s(o.status,o.message,o.errorType)}async function van(e){const{ctx:t,body:r,modelRouter:n,configGeneration:o,tracer:s,requestStartTime:i,accountStrategy:a,primaryAccountKey:c,accountAllowlist:l,quotaRoutingEnabled:u=Xae(),sessionSoftLimit:d=Zae(),sessionResetToleranceMs:m=lx(),ranking:h="expiry-first",preferPrimary:f=!1,sessionAffinityEnabled:g=!1,sessionAffinityIdleTtlMs:y=36e5,spillInflight:v=0,buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_,setRoutingDecision:C}=e,k=oF(r),A=Ow({provider:"anthropic",model:r.model},n?.getFallbackChain()??[],r.model,k),R=A.attempts.slice(1).some(xe=>!!(xe.provider&&xe.model)),I=await Yin({ctx:t,body:r,accountStrategy:a,primaryAccountKey:c,accountAllowlist:l,quotaRoutingEnabled:u,sessionSoftLimit:d,sessionResetToleranceMs:m,ranking:h,preferPrimary:f,sessionAffinityEnabled:g,sessionAffinityIdleTtlMs:y,spillInflight:v,setRoutingDecision:C});if("failure"in I){const xe=await wsr({body:r,logFinalRequest:_});if(xe)return xe;const fe=await Esr({ctx:t,body:r,parsedFallbackRequest:k,fallbackPlan:A,modelRouter:n,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(fe.response)return fe.response;if(fe.invalidRequestFailure)return ace({tracer:s,requestStartTime:i,authFailureMessage:null,authCooldownMessage:null,invalidRequestFailure:fe.invalidRequestFailure,entitlementFailure:null,scopedExhaustion:null,sawNetworkError:!1,sawTransientFailure:!1,sawRateLimit:!1,lastError:void 0,orderedAccounts:[],buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_});if(fe.terminalFailure){const Oe=fe.terminalFailure;return Ssr({failure:Oe,buildLoggedClaudeError:w,tracer:s,requestStartTime:i})}return yan({ctx:t,tracer:s,requestStartTime:i,failure:I.failure,buildLoggedClaudeError:w})}const{accounts:M,enabledAccounts:D,orderedAccounts:U,bodyStr:P,requestStart:F,toolCount:$,url:N,clientHeaders:q,isClaudeClientRequest:z,sessionId:H}=I,B=new Set,V=g&&H&&a==="fill-first"&&D.length>1?xe=>Ein({sessionId:H,servingAccountKey:xe,attemptedAccountKeys:B,enabledAccounts:D,idleTtlMs:y,sessionSoftLimit:d,sessionResetToleranceMs:m,requestedModel:typeof r.model=="string"?r.model:void 0}):void 0,ne=cin(),Z={lastError:void 0,sawRateLimit:!1,sawNetworkError:!1,sawTransientFailure:!1,invalidRequestFailure:null,authFailureMessage:null,authCooldownMessage:null,entitlementFailure:null,scopedExhaustion:null,attemptNumber:0},ke=s?.startAccountSelection();let te=U.filter(xe=>!isr(xe.key));if(te.length===0&&(te=await ein(U)),te.length===0&&U.length>0){const xe=U.map(Oe=>Fa(Oe.key)),fe=xe.some(Oe=>Oe.coolingReason!=="auth");if(Z.sawRateLimit=fe,Z.sawTransientFailure=!fe,Z.lastError=fe?"All Anthropic accounts have active rate-limit cooldowns":"All Anthropic accounts have active authentication cooldowns",!fe){const Oe=Math.min(...xe.map(De=>De.coolingUntil??Number.POSITIVE_INFINITY));Z.authCooldownMessage=`All ${U.length} Anthropic accounts are temporarily unavailable while OAuth refresh is cooling. Earliest retry at ${new Date(Oe).toISOString()}.`}}const ge=min(te,typeof r.model=="string"?r.model:void 0,Date.now(),ne);ge.eligible.length>0?te=ge.eligible:ge.exhaustion&&(Z.scopedExhaustion=ge.exhaustion,Z.lastError=`Model-scoped limit exhausted for ${ge.exhaustion.model}`,te=[]);const Me=n?.getMaxInflightPerAccount?.();let Ue;try{Me!==void 0&&te.length>0&&te.every(xe=>!Hsn(xe.key,Me))&&(Ue=await Wsn(te.map(xe=>xe.key),Me,t.abortSignal,Vae,o));e:for(const[xe,fe]of te.entries()){const Oe=xe<te.length-1,De=Fa(fe.key);let Ye=0,wt=0;for(;;){const Fe=await Lw.acquire(t.abortSignal);if(Fe.allowed===!1){Z.sawNetworkError=!0,Z.lastTransportErrorCode=Fe.errorCode??void 0,Z.lastTransportScope=Fe.transportScope,Z.lastError=`Anthropic transport recovery probe failed (${Fe.errorCode??"unknown"})`;const ie=Fe.connectPhase?Wor:RF;if(Ye<ie){Ye+=1;const oe=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after failed transport recovery probe (${Ye}/${ie}) in ${oe}ms`),await Hu(oe);continue}break e}Z.attemptNumber+=1,s&&Z.attemptNumber===1&&ke&&(s.setAccountSelection({strategy:a,accountsTotal:M.length,accountsHealthy:D.length,selectedAccount:fe.label,accountType:fe.type}),ke.end());const Ae=pan({ctx:t,body:r,toolCount:$,requestStart:F,tracer:s,account:fe,attemptNumber:Z.attemptNumber}),Te=await han({ctx:t,account:fe,accountState:De,bodyStr:P,clientHeaders:q,isClaudeClientRequest:z,url:N,tracer:s,attemptNumber:Z.attemptNumber,currentLastError:Z.lastError,currentAuthFailureMessage:Z.authFailureMessage,logAttempt:Ae,logProxyBody:E});if(Z.lastError=Te.lastError,Z.authFailureMessage=Te.authFailureMessage,Te.continueLoop||!Te.headers||!Te.buildUpstreamBody||!Te.finalBodyStr||!Te.preparedContext||Te.fetchStartMs===void 0){Fe.probe&&Lw.reportProbeAbandoned(Fe);continue e}let Y;if(Ue?.accountKey===fe.key?(Y=Ue.lease,Ue=void 0):(Y=Gsn(fe.key,Me,o),Y&&Ue&&(Ue.lease.release(),Ue=void 0)),!Y){Fe.probe&&Lw.reportProbeAbandoned(Fe);continue e}B.add(fe.key);let W=!1;try{let ie;try{ie=await fan({ctx:t,url:N,headers:Te.headers,finalBodyStr:Te.finalBodyStr,preparedContext:Te.preparedContext,requestedModel:r.model,account:fe,accountState:De,enabledAccounts:D,orderedAccounts:U,tracer:s,logAttempt:Ae,logProxyBody:E,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,currentLastError:Z.lastError,currentSawRateLimit:Z.sawRateLimit,currentSawNetworkError:Z.sawNetworkError,upstreamSpan:Te.upstreamSpan})}catch(J){throw Fe.probe&&Lw.reportProbeAbandoned(Fe),J}if(ie.transportScope?Lw.reportTransportFailure(ie.errorCode,ie.transportScope,Fe,ie.connectPhase===!0):Lw.reportSuccess(Fe),Z.lastError=ie.lastError,Z.sawRateLimit=ie.sawRateLimit,Z.sawNetworkError=ie.sawNetworkError,ie.transportScope&&(Z.lastTransportScope=ie.transportScope,Z.lastTransportErrorCode=ie.errorCode),ie.terminalError)return ksr({terminalError:ie.terminalError,account:fe,tracer:s,requestStartTime:i,attemptNumber:Z.attemptNumber,logProxyBody:E,logFinalRequest:_});if(ie.continueLoop||!ie.response){if(ie.cooldownPlan){const se=ie.cooldownPlan;ie.quota&&(De.quota=Jg(De.quota,ie.quota),Vp(fe.key,ie.quota).catch(()=>{}));let ve=!1;se.scope==="account"&&(!De.coolingUntil||se.coolingUntil>De.coolingUntil)&&(De.coolingUntil=se.coolingUntil,De.coolingReason=se.reason,ve=!0),ve&&se.scope==="account"&&await Gu(fe.key,De.coolingUntil??se.coolingUntil,De.coolingReason??se.reason).catch(()=>{});const Ie=ie.retrySameAccount?Zsn(fe.key,se.coolingUntil):void 0;if(ie.retrySameAccount&&ie.retryAfterMs!==void 0&&wt<Uae&&Ie!==void 0){wt+=1;const x=Math.min(ie.retryAfterMs||1e3,Jor),K=Math.min(Jor,Dsr(x*Ie));p.always(`[proxy] retrying same account=${fe.label} after transient 429 (shared slot ${Ie}/${Uae}) in ${K}ms`),await Hu(K);continue}ny(fe.key,D.length,U[0]?.key),p.always(`[proxy] account=${fe.label} rate-limited (${se.reason}); cooling ~${Kae(se.coolingUntil,Date.now())}m until ${new Date(se.coolingUntil).toISOString()}, rotating`),se.rotateImmediately&&hin(fe,te[xe+1],se.coolingUntil,d);continue e}const J=ie.connectPhase?Wor:RF;if(ie.retrySameAccount&&Ye<J){Ye+=1;const se=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after transient network error (${Ye}/${J}) in ${se}ms`),await Hu(se);continue}if(ie.retrySameAccount&&!ie.transportScope&&p.always(`[proxy] exhausted transient same-account retries for account=${fe.label}; rotating`),ie.transportScope){p.always(`[proxy] Anthropic ${ie.transportScope} failure code=${ie.errorCode??"unknown"}; suppressing cross-account rotation after ${Ye+1} attempts`);break e}continue e}let oe=ie.upstreamSpan;const Q=ie.response;if(Q.status===401&&fe.type==="oauth"&&fe.refreshToken){const J=await uan({ctx:t,body:r,account:fe,accountState:De,headers:Te.headers,buildUpstreamBody:Te.buildUpstreamBody,url:N,enabledAccounts:D,orderedAccounts:U,tracer:s,requestStartTime:i,allocateAttemptNumber:()=>(Z.attemptNumber+=1,Z.attemptNumber),upstreamSpan:oe,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,onStreamTerminal:Y.release,lastError:Z.lastError,authFailureMessage:Z.authFailureMessage,entitlementFailure:Z.entitlementFailure,sawRateLimit:Z.sawRateLimit,sawTransientFailure:Z.sawTransientFailure,sawNetworkError:Z.sawNetworkError,bindServedSession:V});if(Z.lastError=J.lastError,Z.authFailureMessage=J.authFailureMessage,Z.entitlementFailure=J.entitlementFailure,Z.sawRateLimit=J.sawRateLimit,Z.sawTransientFailure=J.sawTransientFailure,Z.sawNetworkError=J.sawNetworkError,oe=J.upstreamSpan,J.response!==void 0)return W=J.holdsAccountAdmission===!0,J.response;if(J.continueLoop){Oe&&J.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${J.retryDelayMs}ms after auth refresh`),await Hu(J.retryDelayMs));continue e}}if(!Q.ok){const J=await dan({response:Q,account:fe,accountState:De,enabledAccounts:D,orderedAccounts:U,tracer:s,requestStartTime:i,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,lastError:Z.lastError,authFailureMessage:Z.authFailureMessage,sawTransientFailure:Z.sawTransientFailure,invalidRequestFailure:Z.invalidRequestFailure,entitlementFailure:Z.entitlementFailure,allowConfiguredModelFallback:R});if(Z.lastError=J.lastError,Z.authFailureMessage=J.authFailureMessage,Z.sawTransientFailure=J.sawTransientFailure,Z.invalidRequestFailure=J.invalidRequestFailure,Z.entitlementFailure=J.entitlementFailure,J.response!==void 0)return J.response;if(J.continueLoop){if(J.retrySameAccount&&Ye<RF){Ye+=1;const se=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after transient upstream ${Q.status} (${Ye}/${RF}) in ${se}ms`),await Hu(se);continue}J.retrySameAccount&&p.always(`[proxy] exhausted transient same-account retries for account=${fe.label}; rotating`),Oe&&J.retryDelayMs&&(p.always(`[proxy] pacing cross-account overload rotation for ${J.retryDelayMs}ms`),await Hu(J.retryDelayMs));continue e}break e}if(De.coolingUntil&&Date.now()>=De.coolingUntil){const J=De.coolingUntil;De.coolingUntil=void 0,De.coolingReason=void 0,Kg(fe.key,J).catch(()=>{})}const ce=await Csr({ctx:t,body:r,account:fe,accountState:De,response:Q,tracer:s,requestStartTime:i,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,finalBodyStr:Te.finalBodyStr,upstreamSpan:oe,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,onStreamTerminal:Y.release,poolAccounts:D});if("retryNextAccount"in ce){ce.failure&&(Z.lastError=ce.failure.message,Z.sawRateLimit||=ce.failure.rateLimit,Z.sawTransientFailure||=!ce.failure.rateLimit,Oe&&ce.failure.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${ce.failure.retryDelayMs}ms`),await Hu(ce.failure.retryDelayMs)));continue e}return W=ce.holdsAccountAdmission===!0,V&&ce.served&&V(fe.key),ce.response}finally{W||Y.release()}}}}finally{Ue?.lease.release(),Z.attemptNumber===0&&ke?.end()}if(gan(Z)){let xe;const fe=await wsr({body:r,logFinalRequest:_});if(fe)return fe;const Oe=await Esr({ctx:t,body:r,parsedFallbackRequest:k,fallbackPlan:A,modelRouter:n,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(Oe.response)return Oe.response;if(Oe.invalidRequestFailure)return ace({tracer:s,requestStartTime:i,authFailureMessage:null,authCooldownMessage:null,invalidRequestFailure:Oe.invalidRequestFailure,entitlementFailure:null,scopedExhaustion:null,sawNetworkError:!1,sawTransientFailure:!1,sawRateLimit:!1,lastError:void 0,orderedAccounts:[],buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_});xe=Oe.lastErrorMessage;let De=Oe.terminalFailure;if(Z.invalidRequestFailure===null&&!Z.sawRateLimit&&!t.abortSignal?.aborted&&De?.retryable!==!1&&n?.isAutoFallbackEnabled?.()){const Ye=await tan({ctx:t,body:r,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(Ye.response)return Ye.response;xe=Ye.lastErrorMessage??xe,De=Ye.terminalFailure??De}if(De)return Ssr({failure:De,buildLoggedClaudeError:w,tracer:s,requestStartTime:i});Z.fallbackFailureMessage=xe}{const xe=U[0],fe=xe?mc.get(xe.key):void 0;ax(t,{quota:fe?.quota??null,source:fe?.quota?"snapshot":"none",...xe?{account:xe}:{},...fe?{accountState:fe}:{},attempt:Z.attemptNumber,poolAccounts:D})}return ace({tracer:s,requestStartTime:i,authFailureMessage:Z.authFailureMessage,authCooldownMessage:Z.authCooldownMessage,invalidRequestFailure:Z.invalidRequestFailure,entitlementFailure:Z.entitlementFailure,scopedExhaustion:Z.scopedExhaustion,sawNetworkError:Z.sawNetworkError,sawTransientFailure:Z.sawTransientFailure,sawRateLimit:Z.sawRateLimit,lastError:Z.lastError,lastTransportErrorCode:Z.lastTransportErrorCode,lastTransportScope:Z.lastTransportScope,fallbackFailureMessage:Z.fallbackFailureMessage,orderedAccounts:U,buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_})}function Rsr(e){return e!==void 0&&"runtimeConfigProvider"in e&&typeof e.runtimeConfigProvider=="function"}function Msr(e){const{ctx:t,body:r,status:n,message:o,errorType:s}=e;return gw(t.requestId)||(qg(n,Nae,Lae,{requestId:t.requestId,errorType:s,terminalOutcome:"handler_error",message:o}),Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:typeof r?.model=="string"?r.model:"",stream:r?.stream??!1,toolCount:Array.isArray(r?.tools)?r.tools.length:0,account:Nae,accountType:Lae,responseStatus:n,responseTimeMs:0,errorType:s,errorMessage:o})),Li(n,o)}function lce(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?Math.round(e*1e3):null}function Tan(e){if(!e||typeof e!="object")return null;const t={...e};return t.sessionResetAtMs=lce(t.sessionResetAt),t.weeklyResetAtMs=lce(t.weeklyResetAt),Array.isArray(t.windows)&&(t.windows=t.windows.map(r=>{const n={...r};return n.resetsAtMs=lce(n.resetsAt),n.severity=n.severity??(n.status==="rejected"?"critical":"normal"),n.isActive=n.isActive??!1,n})),t}function qF(e){return e==="allowed"?"ok":e==="rejected"||e==="throttled"?"degraded":"unknown"}function wan(e,t="",r="fill-first",n=!1,o,s){const i=Rsr(s)?s.accountAllowlist:s,a=Rsr(s)?s.runtimeConfigProvider:void 0;return{prefix:`${t}/v1`,routes:[{method:"POST",path:`${t}/v1/messages`,handler:async c=>{const l=a?.()??{generation:0,strategy:r,modelRouter:e,passthrough:n,primaryAccountKey:o,accountAllowlist:i,quotaRoutingEnabled:Xae(),sessionSoftLimit:Zae(),sessionResetToleranceMs:lx(),useOverage:"auto",accountRanking:"expiry-first",preferPrimary:!1,sessionAffinity:!1,sessionAffinityIdleTtlMs:36e5,spillInflight:0};Qae(l.useOverage);const u=l.modelRouter,d=c.body;if(typeof d?.model!="string"||!Array.isArray(d?.messages))return Msr({ctx:c,body:d,status:400,message:"Missing required fields: model, messages",errorType:"invalid_request_error"});const m=d.model.toLowerCase();if(!u&&!m.startsWith("claude-"))return Msr({ctx:c,body:d,status:404,message:`Model '${d.model}' is not an Anthropic model. The proxy only supports Claude models. Use a model router to route non-Claude models to other providers.`,errorType:"not_found_error"});const h=u?.resolve(d.model)??{provider:"anthropic",model:d.model},f=JSON.stringify(d),{tracer:g,requestStartTime:y,logProxyBody:v,logFinalRequest:w,buildLoggedClaudeError:E,setRoutingDecision:_}=man({ctx:c,body:d,clientRequestBody:f});try{return h.provider===null?(g?.setError("not_found_error",`Model '${d.model}' is not a Claude model.`),g?.end(404,Date.now()-y),E(404,`Model '${d.model}' is not a Claude model. Use a model router to route it to another provider.`)):h.provider==="anthropic"?(g?.setMode("passthrough"),l.passthrough?await Oin({ctx:c,body:d,clientRequestBody:f,tracer:g,requestStartTime:y,logProxyBody:v,logFinalRequest:w}):await van({ctx:c,body:d,modelRouter:u,configGeneration:l.generation,tracer:g,requestStartTime:y,accountStrategy:l.strategy,primaryAccountKey:l.primaryAccountKey,accountAllowlist:l.accountAllowlist,quotaRoutingEnabled:l.quotaRoutingEnabled,sessionSoftLimit:l.sessionSoftLimit,sessionResetToleranceMs:l.sessionResetToleranceMs,ranking:l.accountRanking,preferPrimary:l.preferPrimary,sessionAffinityEnabled:l.sessionAffinity,sessionAffinityIdleTtlMs:l.sessionAffinityIdleTtlMs,spillInflight:l.spillInflight,buildLoggedClaudeError:E,logProxyBody:v,logFinalRequest:w,setRoutingDecision:_})):await Din({ctx:c,body:d,route:{provider:h.provider,model:h.model},modelRouter:u,tracer:g,requestStartTime:y,logProxyBody:v})}catch(C){if(c.abortSignal?.aborted)return new Response(JSON.stringify(E(499,"Client cancelled request","client_cancelled")),{status:499,headers:{"content-type":"application/json"}});const k=C instanceof _r?C:Xc(C);if(k){C instanceof _r&&C.evidence&&(c.metadata.contextPreflight=C.evidence);const R=E(k.status,k.message,k.code,{errorCode:k.code,retryable:!1});return new Response(JSON.stringify({...R,error:{...R.error,code:k.code,retryable:!1}}),{status:k.status,headers:{"content-type":"application/json"}})}const A=C instanceof Error?C.message:String(C);if(p.error(`[claude-proxy] Generation error for ${d.model}: ${A}`),g?.setError("generation_error",A.slice(0,500)),g?.end(502,Date.now()-y),h.provider==="anthropic")throw C;return E(502,`Generation failed: ${C instanceof Error?C.message:"unknown error"}`)}},description:"Claude-compatible messages endpoint routed through NeuroLink",tags:["claude-proxy","messages"],streaming:{enabled:!0,contentType:"text/event-stream"}},{method:"POST",path:`${t}/peer/heartbeat`,handler:async c=>{const l=c.headers["x-neurolink-share-token"],u=c.headers["x-neurolink-grant-id"];if(!l||!u)return{ok:!1,stop:!0,reason:"no grant identified"};const d=await ese(u);if(!d||!d.leaseSecret||!Hin(d.leaseSecret,l))return{ok:!1,stop:!0,reason:"grant not recognized"};if(d.level!=="complete")return{ok:!1,stop:!0,reason:"grant is not a complete share"};if(d.state!=="active")return{ok:!1,stop:!0,reason:d.state};const m=c.body,h=Number(m?.coinsSpent??0);Number.isFinite(h)&&h>0&&await jin(d,h);const f=await Gin(d,Number.isFinite(h)?h:0);return f.paused?(p.always(`[proxy] auto-paused share ${d.peerLabel}: ${f.detail}`),{ok:!1,stop:!0,reason:"usage drift"}):{ok:!0,lease:yor(d)}},description:"Complete-share heartbeat: report spend, renew the lease",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/handshake`,handler:async c=>{const l=await sy(c.headers);return oy(l)?l.body:{ok:!0,protocol:Vin,capabilities:Win,grant:{peerLabel:l.grant.peerLabel,level:l.grant.level,state:l.grant.state,ledger:l.grant.entitlement.ledger}}},description:"Peer handshake: protocol version, capabilities, grant state",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/provision`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;if(l.grant.state!=="active")return Rw(l.grant.state==="paused"?"paused":"revoked",{status:403,grant:l.grant}).body;if(l.grant.level!=="complete")return{type:"error",error:{type:"invalid_request_error",message:"This is a live share. Ask the lender to run `neurolink proxy share level --to complete` first."}};const u=c.body,d=await msn({grantId:l.grant.id,codeChallenge:String(u?.codeChallenge??""),state:String(u?.state??"")});return d.ok!==!0?{type:"error",error:{type:"invalid_request_error",message:d.reason}}:(p.always(`[proxy] ${l.grant.peerLabel} asked to be provisioned \u2014 run \`neurolink proxy share provision --peer ${l.grant.peerLabel}\``),{ok:!0,status:"pending",expiresAt:d.request.expiresAt})},description:"Lodge a PKCE challenge for a resident credential (complete shares)",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/provision`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=await psn(l.grant.id);if(u.status!=="ready")return{ok:!0,status:u.status};const d=await qKr();return{ok:!0,status:"ready",claim:von({grant:l.grant,lenderName:"lender",...d?{lenderUrl:d}:{},code:u.code,state:u.state})}},description:"Collect the authorization code the lender produced",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/receipts`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=Number(c.query?.since??0);return{ok:!0,receipts:await hYt(l.grant.id,Number.isFinite(u)?u:0)}},description:"Collect signed receipts for this grant's settled charges",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/net`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=l.grant.receiptSecret;if(!u)return{type:"error",error:{type:"invalid_request_error",message:"This grant predates receipts and cannot be netted. Ask the lender to re-issue it."}};const d=c.body,m=Number(d?.consumedByYou??NaN),h=Number(d?.alreadyNetted??NaN);return!Number.isFinite(m)||!Number.isFinite(h)?{type:"error",error:{type:"invalid_request_error",message:"A netting claim needs both cumulative totals."}}:S2({consumedByYou:m,alreadyNetted:h,grantId:l.grant.id},String(d?.signature??""),u)?{ok:!0,...await fYt({grantId:l.grant.id,consumedFromPeer:m,peerAlreadyNetted:h})}:Rw("unknown_token",{status:401}).body},description:"Settle one round of reciprocal netting against this grant",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/note`,handler:async c=>{const l=c.body,u=vsn(String(l?.note??""));if(!u)return{type:"error",error:{type:"invalid_request_error",message:"That is not a NeuroLink coin note."}};const d=await JKr();if(!l?.redeem)return{ok:!0,...await Tsn(u,d)};const m=await sy(c.headers);if(oy(m))return m.body;if(m.grant.entitlement.ledger!=="coins")return{type:"error",error:{type:"invalid_request_error",message:"This grant is unlimited \u2014 there is no balance to redeem into."}};const h=await wsn({note:u,grantId:m.grant.id,secret:d});return h.ok!==!0?{ok:!1,status:h.status,error:{type:"invalid_request_error",message:`That note is ${h.status}.`}}:{ok:!0,status:"redeemed",coins:h.coins,balance:h.balance??null}},description:"Check or redeem a transferable coin note",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/limits`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=a?.();return{ok:!0,...await Kin(l.grant,u?.accountAllowlist??i)}},description:"Peer limits: remaining coins, slice left, whether the grant can be served",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/v1/models`,handler:async c=>{const l=a?a().modelRouter:e;return dt({name:"neurolink.http.claudeProxy.listModels",tracer:Be.http,attributes:{"http.route":`${t}/v1/models`}},async()=>Vnn(l))},description:"List available models (Anthropic schema)",tags:["claude-proxy","models"]},{method:"POST",path:`${t}/v1/messages/count_tokens`,handler:async c=>dt({name:"neurolink.http.claudeProxy.countTokens",tracer:Be.http,attributes:{"http.route":`${t}/v1/messages/count_tokens`}},async l=>{const u=c.body;if(typeof u?.model!="string"||!Array.isArray(u?.messages))return Li(400,"Missing required fields: model, messages");const d=u.messages.map(h=>typeof h.content=="string"?h.content:JSON.stringify(h.content)).join(" "),m=Math.ceil(d.length/4);return l.setAttribute("ai.model",u.model),l.setAttribute("gen_ai.usage.input_tokens",m),{input_tokens:m}}),description:"Count tokens for a messages request",tags:["claude-proxy","tokens"]},{method:"GET",path:`${t}/limits`,handler:async c=>{if(_w())return Rw("no_capacity",{status:403,message:"This proxy does not expose pool limits to peers. Use GET /peer/limits for what your grant may still do."}).body;const l=a?.(),u=l?.accountAllowlist??i;Qae(l?.useOverage);const d=c.query?.snapshot==="true"||c.query?.snapshot==="1",m=c.query?.account;return dt({name:"neurolink.http.claudeProxy.limits",tracer:Be.http,attributes:{"http.route":`${t}/limits`}},async()=>!d&&!m?(OF||(OF=Yae({accountAllowlist:u}).finally(()=>{OF=null})),OF):Yae({accountAllowlist:u,accountFilter:m,snapshotOnly:d}))},description:"Fetch fresh per-account limits from Anthropic (usage API). ?account=<label> for one account, ?snapshot=true for stored state",tags:["claude-proxy","limits"]},{method:"GET",path:`${t}/accounts`,handler:async c=>{const l=a?.(),u=l?.accountAllowlist??i,d=l?.primaryAccountKey??o,m=P=>!!d&&!!P&&Uoe(P,d),h=c.query?.refresh==="true";h&&Qae(l?.useOverage);let f={fetchedAt:Date.now(),snapshot:!h,results:[]},g=null;try{f=await Yae({accountAllowlist:u,snapshotOnly:!h})}catch(P){g=P instanceof Error?P.message:String(P)}const{getUsageSnapshot:y}=await Promise.resolve().then(()=>(hA(),GJt)),v=y().stats.accounts,w=Date.now();let E={};try{E=await NA()}catch{}const _=P=>{if(!P)return!1;const F=E[P]?.coolingUntil;return typeof F=="number"&&F>w};let C=new Map,k=null,A="";try{const{readAccountUsage:P,currentUsageDate:F}=await Promise.resolve().then(()=>(wJr(),RYt));A=F(),C=await P(A)}catch(P){k=P instanceof Error?P.message:String(P)}const R=new Map;for(const[P,F]of Object.entries(v)){const N=krr(F.label,F.type,F.key??P).key??P,q=R.get(N);(!q||F.key&&!q.key)&&R.set(N,{...F,identityKey:N})}let I;try{I=await ain()}catch{I=null}const M=[],D=new Set;for(const P of f.results){const F=P.account;D.add(P.key);const $=R.get(P.key),N=Tan(P.quota),q=_(P.key??null);M.push({label:F,key:P.key??null,provider:P.provider,kind:"account",type:P.type??$?.type??"oauth",status:q?"cooling":qF(N?.weeklyStatus)==="degraded"||qF(N?.sessionStatus)==="degraded"?"exhausted":"active",cooling:q,allowed:null,expired:null,isPrimary:m(P.key??F),requests:$?$.successCount+$.errorCount:null,errors:$?.errorCount??null,rateLimits:$?.rateLimitCount??null,quotaRateLimits:$?.quotaRateLimitCount??null,quota:N?{...N,sessionHealth:qF(N.sessionStatus),weeklyHealth:qF(N.weeklyStatus)}:null,usage:C.get(P.key)??null})}for(const P of R.values()){const F=krr(P.label,P.type,P.identityKey);if(F.key!==null&&D.has(F.key))continue;const $=F.provider!=="other";$&&F.key!==null&&I!==null&&!I.has(F.key)||M.push({label:P.label,key:$?F.key:null,...$?{provider:F.provider}:{},kind:$?"account":P.type==="translation"?"translation":"internal",type:F.provider==="codex"?"oauth":P.type,status:$?"unrouted":null,cooling:!1,allowed:null,expired:null,isPrimary:$?m(F.key):!1,requests:P.successCount+P.errorCount,errors:P.errorCount,rateLimits:P.rateLimitCount,quotaRateLimits:P.quotaRateLimitCount,quota:null,usage:F.key!==null?C.get(F.key)??null:null})}return{generatedAt:Date.now(),usageDate:A,quotaFromSnapshot:!h,usageError:k,quotaError:g,costBasis:"api-equivalent",accounts:M}},description:"One row per account: status, quota, and today's tokens and API-equivalent cost. ?refresh=true forces a live quota fetch",tags:["claude-proxy","accounts"]}]}}function Fa(e){const t=mc.get(e);if(t)return t;const r={consecutiveRefreshFailures:0,permanentlyDisabled:!1};return mc.set(e,r),r}function Ean(e){const t=Fa(e.key),r=t.lastToken!==e.token||t.lastRefreshToken!==e.refreshToken,n=t.permanentlyDisabled;n&&p.always(`[proxy] account=${e.label} is enabled in the token store; clearing stale runtime auth-disable state`),t.permanentlyDisabled=!1,(r||n)&&(t.consecutiveRefreshFailures=0),t.lastToken=e.token,t.lastRefreshToken=e.refreshToken}async function gm(e,t,r){try{const{tokenStore:n}=await Promise.resolve().then(()=>(zg(),qoe)),o=e.persistTarget&&typeof e.persistTarget!="string"&&"providerKey"in e.persistTarget?e.persistTarget.providerKey:void 0;if(o){if(!await n.markDisabledIfCurrent(o,{accessToken:e.token,refreshToken:e.refreshToken,expiresAt:e.expiresAt??0},r))return t.permanentlyDisabled=!1,p.always(`[proxy] account=${e.label} credentials changed while authentication was in flight; ignored stale disable`),!1}else await n.markDisabled(e.key,r)}catch(n){p.debug(`[proxy] failed to persist disabled state for ${e.label}: ${n instanceof Error?n.message:String(n)}`)}return t.permanentlyDisabled=!0,p.always(r==="entitlement_blocked"?`[proxy] account=${e.label} disabled: the organization blocks Claude Code OAuth. Ask an admin to re-enable it, then run: neurolink auth enable ${e.key}`:`[proxy] account=${e.label} disabled until re-authentication. Run: neurolink auth login anthropic --method oauth`),!0}async function GF(e,t){t.consecutiveRefreshFailures+=1;const r=Math.min(t.consecutiveRefreshFailures-1,4),n=Math.min(zsn,Bsn*2**r),o=Date.now()+n;(!t.coolingUntil||o>t.coolingUntil)&&(t.coolingUntil=o,t.coolingReason="auth");const s=t.coolingUntil??o,i=t.coolingReason??"auth";return t.coolingUntil=s,t.coolingReason=i,await Gu(e.key,s,i).catch(()=>{}),s}async function jF(e,t){if(t.consecutiveRefreshFailures=0,t.coolingReason!=="auth"||!t.coolingUntil)return;const r=t.coolingUntil;t.coolingUntil=void 0,t.coolingReason=void 0,await Kg(e.key,r).catch(()=>{})}function HF(e){return`Account(s) require re-authentication: ${Array.isArray(e)?e.join(", "):e}. Run: neurolink auth login anthropic --method oauth`}function Cr(e,t=180){const r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t)}...`}function uce(e){const t=Math.min(Math.max(e-1,0),Fae.length-1);return Fae[t]??0}function Psr(e){const t=Math.min(Math.max(e-1,0),Kor.length-1);return Dsr(Kor[t]??250)}async function Hu(e){await new Promise(t=>setTimeout(t,e))}function Dsr(e){return e+Math.floor(Math.random()*e*.25)}function dx(e){if(!e||typeof e!="object")return;const t=e.code;if(typeof t=="string")return t;const r=e.cause;if(!r||typeof r!="object")return;const n=r.code;return typeof n=="string"?n:void 0}function Yl(e){const t=e instanceof Error?e.message:String(e);if(!e||typeof e!="object")return t;const r=e.cause,n=r instanceof Error?r.message:r&&typeof r=="object"?String(r.message??""):"",s=[dx(e),n&&n!==t&&n].filter(Boolean).join(": ");return s?`${t} (${s})`:t}function Osr(e){const t=new Set;let r=e;for(;r&&typeof r=="object"&&!t.has(r);){t.add(r);const n=r;if(n.syscall==="connect")return!0;if(Array.isArray(n.errors)&&n.errors.length>0)return n.errors.every(o=>o!==null&&typeof o=="object"&&o.syscall==="connect");r=n.cause}return!1}function dce(e){if(Osr(e))return!0;const t=dx(e);return t!==void 0&&["ECONNREFUSED","EADDRNOTAVAIL","ENOTFOUND","EAI_AGAIN","EHOSTUNREACH","UND_ERR_CONNECT_TIMEOUT","UND_ERR_CONNECT"].includes(t)}function San(e){const t=dx(e);return t==="ENOTFOUND"||t==="EAI_AGAIN"?"shared_provider_transport":"connection_transport"}var ban=new Set([408,500,502,503,504,520,521,522,523,524,525,526,529]);function Vu(e){try{const t=JSON.parse(e);if(t&&t.type==="error"&&t.error&&typeof t.error=="object"){const r=t.error.details?.error_code;return{errorType:typeof t.error.type=="string"?t.error.type:void 0,message:typeof t.error.message=="string"?t.error.message:void 0,...typeof r=="string"?{errorCode:r}:{}}}}catch{}return{}}function _an(e,t){return e===422?!0:Vu(t).errorType==="invalid_request_error"||t.includes("invalid_request_error")}function Can(e,t){if(e!==404)return!1;const r=Vu(t);return r.errorType==="not_found_error"&&(r.message??"").toLowerCase().includes("model")}function kan(e,t){if(e!==400)return!1;const r=Vu(t);if(r.errorType!=="invalid_request_error")return!1;const n=(r.message??"").toLowerCase();return n.includes("beta")&&n.includes("subscription")&&n.includes("available")}var Nsr=new Set(["oauth_not_allowed_for_organization","oauth_not_allowed","organization_disabled"]);function mce(e,t){if(e!==401&&e!==402&&e!==403)return!1;const r=Vu(t);return r.errorType==="permission_error"?!0:r.errorCode!==void 0&&Nsr.has(r.errorCode)}function Lsr(e,t){if(!mce(e,t))return!1;const r=Vu(t);return r.errorCode!==void 0&&Nsr.has(r.errorCode)}function Aan(e){return{...e,messages:e.messages.map(t=>typeof t.content!="string"?t:{...t,content:[{type:"text",text:t.content}]})}}var Fsr=oor;function $sr(e,t){if(ban.has(e))return!0;if(e!==400)return!1;const r=Vu(t);if(r.errorType==="overloaded_error")return!0;if(r.errorType!=="api_error")return!1;const n=(r.message??t).toLowerCase();return n.includes("<!doctype html")||n.includes("error code 520")||n.includes("web server is returning an unknown error")||n.includes("cloudflare")||n.includes("internal server error")}function xan(e,t){return e===529||Vu(t).errorType==="overloaded_error"}var Ian=500;function $w(e){return cr(e,Ian)}jt(),G();var Ran=55669,Man="generateContent",Usr="streamGenerateContent";function Pan(e){const r=e.split("?")[0].replace(/\/+$/,"").split("/").pop()??"",n=r.lastIndexOf(":");return n===-1?{modelId:r,action:void 0}:{modelId:r.slice(0,n),action:r.slice(n+1)}}function Dan(e){return{model:e.model,maxTokens:e.maxTokens??4096,temperature:e.temperature,topP:e.topP,systemPrompt:e.systemPrompt,stream:e.stream,prompt:e.prompt,images:e.images,conversationMessages:e.conversationMessages,tools:e.tools,stopSequences:e.stopSequences}}function Oan(e,t="",r=Ran,n){return{prefix:`${t}/v1beta`,routes:[{method:"POST",path:`${t}/v1beta/models/:model`,description:"Gemini-compatible generateContent / streamGenerateContent (translation mode)",handler:async o=>{const s=n?n().modelRouter:e,i=Date.now(),{modelId:a,action:c}=Pan(o.path);if(!a||c!==Man&&c!==Usr)return $ie(404,`Unsupported Gemini endpoint: ${o.path}`,"NOT_FOUND");const l=o.body;if(!l||!Array.isArray(l.contents)||l.contents.length===0)return $ie(400,"Request must include a non-empty 'contents' array");const u=c===Usr,d=s?s.resolve(a):{provider:null,model:a},m=d.provider??void 0,h=d.model??a;p.debug(`[proxy:gemini] ${a} \u2192 ${m??"auto"}/${h}`);const f=Trn(h,l,u),g=Dan(f),v=Ow({provider:m??"auto",model:h},s?.getFallbackChain()??[],a,g,s?.isAutoFallbackEnabled?.()??!1).attempts;let w;try{w=VA.startRequest({requestId:o.requestId,method:o.method,path:o.path,model:a,stream:u,toolCount:Object.keys(f.tools).length,clientApp:"gemini-compat",userAgent:o.headers["user-agent"]??"",provider:m??"google-ai"},o.headers),w.setMode("full")}catch{}try{return u?await _F({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:v,tracer:w,requestStartTime:i}):await CF({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:v,tracer:w,requestStartTime:i})}catch(E){const _=E instanceof Error?E.message:String(E),C=cr(_);return p.always(`[proxy:gemini] request failed: ${C}`),w?.setError("generation_error",C),w?.end(500,Date.now()-i),$ie(500,"Internal proxy error","INTERNAL")}}}]}}Dr(),pr();function pce(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId??""}},()=>r(n))}function Bsr(e="/api"){return{prefix:`${e}/health`,routes:[{method:"GET",path:`${e}/health`,handler:pce("neurolink.http.health.check",`${e}/health`,async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:process.uptime()*1e3,version:process.env.npm_package_version||"unknown"})),description:"Basic health check",tags:["health"]},{method:"GET",path:`${e}/health/live`,handler:pce("neurolink.http.health.live",`${e}/health/live`,async()=>({status:"alive",timestamp:new Date().toISOString()})),description:"Kubernetes liveness probe",tags:["health"]},{method:"GET",path:`${e}/health/ready`,handler:t=>dt({name:"neurolink.http.health.ready",tracer:Be.http,attributes:{"http.route":`${e}/health/ready`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools(),o=n.length>0,s=!!t.externalServerManager;let i=!0;if(t.externalServerManager){const c=t.externalServerManager.getServerStatuses();for(const l of c)if(l.status!=="connected"){i=!1;break}}const a=o||!s||i;return r.setAttribute("health.ready",a),r.setAttribute("health.tools_count",n.length),r.setAttribute("health.external_servers_ready",i),{ready:a,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:o,externalServers:i}}}),description:"Kubernetes readiness probe",tags:["health"]},{method:"GET",path:`${e}/health/startup`,handler:t=>dt({name:"neurolink.http.health.startup",tracer:Be.http,attributes:{"http.route":`${e}/health/startup`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools();return r.setAttribute("health.tools_count",n.length),{started:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,toolsLoaded:n.length,externalServerManager:!!t.externalServerManager}}}),description:"Kubernetes startup probe",tags:["health"]},{method:"GET",path:`${e}/health/detailed`,handler:t=>dt({name:"neurolink.http.health.detailed",tracer:Be.http,attributes:{"http.route":`${e}/health/detailed`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools(),o={};for(const l of n){const u=typeof l.source=="string"?l.source:l.serverId||"built-in";o[u]=(o[u]||0)+1}const s=[];if(t.externalServerManager){const l=t.externalServerManager.getServerStatuses();for(const u of l)s.push({name:u.serverId,status:u.status,toolCount:u.toolCount})}const i=t.neurolink.conversationMemory,a={available:!!i,type:i?.constructor.name||"none"},c={status:"ok",timestamp:new Date().toISOString(),uptime:process.uptime()*1e3,version:process.env.npm_package_version||"unknown",node:{version:process.version,platform:process.platform,arch:process.arch},memory:{...a,process:{heapUsed:Math.round(process.memoryUsage().heapUsed/1024/1024),heapTotal:Math.round(process.memoryUsage().heapTotal/1024/1024),rss:Math.round(process.memoryUsage().rss/1024/1024),external:Math.round(process.memoryUsage().external/1024/1024)}},tools:{total:n.length,bySource:o},externalServers:{count:s.length,servers:s}};if(t.metadata?.accountPool){const l=t.metadata.accountPool,u=l.getAllAccounts(),d={};for(const m of u)d[m.status]=(d[m.status]||0)+1;c.proxy={totalAccounts:u.length,statusDistribution:d,healthyCount:l.getHealthyCount(),strategy:l.getStrategy()},r.setAttribute("health.proxy.accounts",u.length),r.setAttribute("health.proxy.healthy",l.getHealthyCount())}return r.setAttribute("health.tools_count",n.length),r.setAttribute("health.external_servers_count",s.length),r.setAttribute("health.memory.heap_mb",Math.round(process.memoryUsage().heapUsed/1024/1024)),c}),description:"Detailed health information",tags:["health"]},{method:"GET",path:`${e}/version`,handler:pce("neurolink.http.version",`${e}/version`,async()=>({name:"@juspay/neurolink",version:process.env.npm_package_version||"unknown",node:process.version,timestamp:new Date().toISOString()})),description:"Get version information",tags:["health","version"]}]}}hA(),Lr(),jt(),G();var Nan=300*1e3,Lan=55669;function zsr(e){return e?{status:502,errorType:"loopback_stream_error",errorMessage:e}:{status:499,errorType:"client_cancelled",errorMessage:"Client cancelled the OpenAI-compatible stream"}}function VF(e,t){return new Response(JSON.stringify(Tnr(e,t)),{status:e,headers:{"content-type":"application/json"}})}function Fan(e){return{model:e.model,maxTokens:e.maxTokens??4096,temperature:e.temperature,topP:e.topP,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:void 0,stream:e.stream,prompt:e.prompt,images:e.images,conversationMessages:e.conversationMessages,tools:e.tools,toolChoice:e.toolChoice,toolChoiceName:e.toolChoiceName,stopSequences:e.stopSequences}}function $an(e,t){try{const r=VA.startRequest({requestId:e.requestId,method:e.method,path:e.path,model:t.model,stream:t.stream===!0,toolCount:t.tools?.length??0,provider:"openai-bridge",recordRequestMetrics:!0,recordUsageMetrics:!1,...jA(e.headers)},e.headers);return r.setMode("full"),r}catch{return}}function Uan(e,t,r){const n={"content-type":"application/json",accept:t?"text/event-stream":"application/json","x-neurolink-internal-request":r},o=Kie(e.requestId);o&&(n.traceparent=`00-${o.traceId}-${o.spanId}-${o.traceFlags.toString(16).padStart(2,"0")}`);for(const[s,i]of Object.entries(e.headers)){if(typeof i!="string")continue;const a=s.toLowerCase();(a.startsWith("anthropic-")||a==="x-api-key"||["user-agent","x-neurolink-session-id","x-claude-code-session-id","session_id","session-id","tracestate","baggage"].includes(a)||a==="traceparent"&&!n.traceparent)&&(n[a]=i)}return n}function Ban(e){const t=e?.servingModelStatus??"unavailable",r=e?.accountIdentityStatus??(e?.accountKey&&e.accountType!=="translation"&&e.account!=="unknown"?"observed":"unavailable");return{servingModelStatus:t,accountIdentityStatus:r}}async function zan(e,t,r,n,o,s){try{const i=await nd(e.json(),t),a=krn(i,r);return s.json(a,200),await n(200),a}catch(i){const a=t.aborted&&t.reason?.name!=="TimeoutError"?499:t.reason?.name==="TimeoutError"?504:502;return await n(a,{errorType:a===499?"client_cancelled":a===504?"loopback_timeout":"loopback_response_error",errorMessage:i instanceof Error?i.message:String(i)}),o(a,"Anthropic loopback failed")}}async function qan(e){const{ctx:t,body:r,targetModel:n,requestStartTime:o,loopbackPort:s,internalDispatch:i}=e,a=r.stream===!0,c=r.tools?.length??0,l=tor(t,r.model,a,o);l.request();const u=(E,_)=>(l.json(Tnr(E,_),E),VF(E,_)),d=drn(t.requestId),m=$an(t,r),h=new AbortController,f=AbortSignal.any([h.signal,AbortSignal.timeout(Nan),...t.abortSignal?[t.abortSignal]:[]]);let g=!1;const y=(E,_={})=>{if(g)return Promise.resolve();g=!0,d.dispose();const C=urn(t.requestId),{servingModelStatus:k,accountIdentityStatus:A}=Ban(C);return k==="observed"&&C?.model&&C.model!==r.model&&m?.setModelSubstitution(r.model,C.model,C.provider),_.errorType&&m?.setError(_.errorType,_.errorMessage??_.errorType),m?.end(E,Date.now()-o),gw(t.requestId)||(E>=400?qg(E,C?.account,C?.accountType,{requestId:t.requestId,errorType:_.errorType,message:_.errorMessage,terminalOutcome:E===499?"client_cancelled":_.errorType?.includes("stream")?"stream_error":"handler_error"}):dA(C?.account,C?.accountType)),Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:C?.model??r.model,servingModelStatus:k,stream:a,toolCount:c,account:C?.account??"",accountKey:C?.accountKey,accountType:C?.accountType??"openai-bridge",accountIdentityStatus:A,requestedModel:r.model,provider:C?.provider,errorCode:C?.errorCode,transportScope:C?.transportScope,retryable:C?.retryable,accountingScope:"client",usageOwnerRequestId:d.requestId,...jA(t.headers),responseStatus:E,responseTimeMs:Date.now()-o,..._}).finally(()=>inr(t.requestId))},v=`http://127.0.0.1:${s}/v1/messages`;let w;try{f.throwIfAborted();const E=Crn(r);E.model=n;const C={method:"POST",headers:Uan(t,a,d.token),body:JSON.stringify({...E,stream:a}),signal:f};w=await nd(Promise.resolve(i?i(new Request(v,C)):fetch(v,C)),f)}catch(E){d.dispose();const _=t.abortSignal?.aborted?499:f.aborted?504:502;return h.abort(E),await y(_,{errorType:t.abortSignal?.aborted?"client_cancelled":_===504?"loopback_timeout":"loopback_exception",errorMessage:E instanceof Error?E.message:String(E)}),u(_,"Anthropic loopback failed")}if(!w.ok){const E=await nd(w.text(),f).catch(()=>""),_=cr(E);return p.always(`[proxy:openai] anthropic loopback error ${w.status}: ${_}`),await y(w.status,{errorType:"loopback_upstream_error",errorMessage:_}),u(w.status,_||`Anthropic loopback failed with status ${w.status}`)}if(a){if(!w.body)return await y(502,{errorType:"loopback_empty_stream",errorMessage:"Anthropic loopback returned empty stream body"}),u(502,"Anthropic loopback returned empty stream body");const E=l.accumulator("client_response","text/event-stream");let _;const k=w.body.pipeThrough(Arn(r.model,{onError:M=>{_=cr(M)}})).getReader(),A=async(M,D,U)=>{f.removeEventListener("abort",R),E.finish(M),await y(M,{errorType:D,errorMessage:U})},R=()=>{const M=_?zsr(_):{status:f.reason?.name==="TimeoutError"?504:499,errorType:f.reason?.name==="TimeoutError"?"loopback_timeout":"client_cancelled",errorMessage:"Anthropic loopback cancelled"};A(M.status,M.errorType,M.errorMessage),_t(k.cancel(f.reason),1e3,"Loopback cancellation timed out").catch(()=>{})};f.addEventListener("abort",R,{once:!0}),f.aborted&&R();const I=new ReadableStream({async pull(M){try{const{value:D,done:U}=await k.read();if(U){_?await A(502,"loopback_stream_error",_):await A(200),M.close();return}E.append(D),M.enqueue(D)}catch(D){const U=cr(D instanceof Error?D.message:String(D));await A(502,"loopback_stream_error",U),M.error(D)}},async cancel(M){const D=zsr(_),U=A(D.status,D.errorType,D.errorMessage);h.abort(M),await Promise.all([U,_t(k.cancel(M),1e3,"Loopback cancellation timed out").catch(()=>{})])}});return new Response(I,{status:200,headers:{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"}})}return zan(w,f,r.model,y,u,l)}function Gan(e,t="",r=Lan,n,o){return{prefix:`${t}/v1`,routes:[{method:"POST",path:`${t}/v1/chat/completions`,description:"OpenAI-compatible chat completions (translation mode)",handler:async s=>{const i=n?n().modelRouter:e,a=Date.now(),c=s.body;if(!c||!c.model||!c.messages?.length)return VF(400,"Request must include 'model' and 'messages' fields");const l=i?i.resolve(c.model):{provider:null,model:c.model},u=l.provider??void 0,d=l.model??c.model;if(p.debug(`[proxy:openai] ${c.model} \u2192 ${u??"auto"}/${d}`),l.provider==="anthropic")try{return await qan({ctx:s,body:c,targetModel:d,requestStartTime:a,loopbackPort:r,internalDispatch:o})}catch(v){const w=v instanceof Error?v.message:String(v),E=cr(w);p.always(`[proxy:openai] anthropic loopback failed: ${E}`);const _=s.abortSignal?.aborted?499:v instanceof Error&&"status"in v&&v.status===503?503:v instanceof Error&&v.name==="TimeoutError"?504:502;return gw(s.requestId)||qg(_,void 0,void 0,{requestId:s.requestId,errorType:_===499?"client_cancelled":"loopback_exception",message:E}),await Aw({timestamp:new Date().toISOString(),requestId:s.requestId,method:s.method,path:s.path,model:c.model,stream:c.stream===!0,toolCount:c.tools?.length??0,account:"",accountType:"openai-bridge",responseStatus:_,responseTimeMs:Date.now()-a,errorType:_===499?"client_cancelled":"loopback_exception",errorMessage:E}).finally(()=>inr(s.requestId)),VF(_,"Anthropic loopback failed")}const m=brn(c),h=Fan(m),g=Ow({provider:u??"auto",model:d},i?.getFallbackChain()??[],c.model,h,i?.isAutoFallbackEnabled?.()??!1).attempts;let y;try{y=VA.startRequest({requestId:s.requestId,method:s.method,path:s.path,model:c.model,stream:c.stream===!0,toolCount:Object.keys(m.tools).length,clientApp:"openai-compat",userAgent:s.headers["user-agent"]??"",provider:u??"openai-compatible"},s.headers),y.setMode("full")}catch{}try{return c.stream?_F({ctx:s,format:"openai",requestModel:c.model,parsed:m,attempts:g,tracer:y,requestStartTime:a}):await CF({ctx:s,format:"openai",requestModel:c.model,parsed:m,attempts:g,tracer:y,requestStartTime:a})}catch(v){const w=v instanceof Error?v.message:String(v),E=cr(w);return p.always(`[proxy:openai] request failed: ${E}`),y?.setError("generation_error",E),y?.end(500,Date.now()-a),VF(500,"Internal proxy error")}}},{method:"GET",path:`${t}/v1/models`,description:"List available models in OpenAI format",handler:async()=>{const s=n?n().modelRouter:e;return Hnn(s)}}]}}Yt(),en(),Dr(),pr(),tm();function iy(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId}},async o=>{const s=await r(n);if(s&&typeof s=="object"){const i=s.error;if(i!=null){const a=typeof i=="string"?i:typeof i?.message=="string"?i.message:"MCP handler error";o.setStatus({code:$e.ERROR,message:a})}}return s})}var jan=O.object({name:O.string().min(1,"Server name is required"),toolName:O.string().min(1,"Tool name is required")});async function Han(e){const t=e.externalServerManager;if(!t)return{servers:[],total:0,message:"External server manager not available",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}};const r=t.listServers(),n=t.getServerStatuses(),o=new Map(n.map(i=>[i.serverId,i])),s=r.map(i=>{const a=o.get(i.name);return{serverId:i.name,name:i.name,status:a?.status||"disconnected",toolCount:a?.toolCount||0,lastHealthCheck:a?.checkedAt?.toISOString(),error:a?.issues?.[0]}});return{servers:s,total:s.length,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Van(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);if(!n.listServers().find(u=>u.name===r))return Ut("SERVER_NOT_FOUND",`MCP server '${r}' not found`,void 0,e.requestId);const a=n.getServerStatuses().find(u=>u.serverId===r),l=(await e.toolRegistry.listTools()).filter(u=>u.source===r);return{serverId:r,name:r,status:a?.status||"disconnected",toolCount:a?.toolCount||0,tools:l.map(u=>({name:u.name,description:u.description})),lastHealthCheck:a?.checkedAt?.toISOString(),error:a?.issues?.[0],metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Wan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);try{if(!n.listServers().find(c=>c.name===r))return Ut("SERVER_NOT_FOUND",`Server '${r}' not found`,void 0,e.requestId);const a=n.getServerStatuses().find(c=>c.serverId===r);return{success:!0,server:{serverId:r,name:r,status:a?.status||"disconnected",toolCount:a?.toolCount||0},message:"Server status retrieved (full reconnect requires server restart)",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(o){return Ut("RECONNECT_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function Kan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);try{const o=await n.removeServer(r);return o.success?{success:!0,message:`Server '${r}' removed`,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("REMOVE_FAILED",o.error||"Failed to remove server",void 0,e.requestId)}catch(o){return Ut("REMOVE_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function Jan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,o=(await e.toolRegistry.listTools()).filter(s=>s.source===r);if(o.length===0){const s=e.externalServerManager;if(s&&!s.listServers().find(c=>c.name===r))return Ut("SERVER_NOT_FOUND",`MCP server '${r}' not found`,void 0,e.requestId)}return{serverId:r,tools:o.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema})),total:o.length,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Yan(e){const t=zl(jan,e.params,e.requestId);if(!t.success)return t.error;const{name:r,toolName:n}=t.data,o=Fu(m2,e.body||{},e.requestId);if(!o.success)return o.error;const s=o.data,i=Date.now();try{return(await e.toolRegistry.listTools()).find(u=>u.name===n&&u.source===r)?{success:!0,data:await e.toolRegistry.executeTool(n,s),duration:Date.now()-i,metadata:{server:r,toolName:n,timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("TOOL_NOT_FOUND",`Tool '${n}' not found on server '${r}'`,void 0,e.requestId)}catch(a){return Ut("EXECUTION_FAILED",a instanceof Error?a.message:String(a),{duration:Date.now()-i},e.requestId)}}async function Xan(e){const t=e.externalServerManager;if(!t)return{healthy:!1,message:"External server manager not available",servers:[]};const n=t.getServerStatuses().map(i=>({name:i.serverId,healthy:i.isHealthy,error:i.issues?.[0]})),o=n.every(i=>i.healthy),s=n.some(i=>i.healthy);return{healthy:n.length===0||o,status:n.length===0?"no_servers":o?"all_healthy":s?"degraded":"unhealthy",servers:n,timestamp:new Date().toISOString()}}function qsr(e="/api"){return{prefix:`${e}/mcp`,routes:[{method:"GET",path:`${e}/mcp/servers`,handler:iy("neurolink.http.mcp.listServers",`${e}/mcp/servers`,Han),description:"List all MCP servers",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name`,handler:iy("neurolink.http.mcp.getServer",`${e}/mcp/servers/:name`,Van),description:"Get MCP server status",tags:["mcp"]},{method:"POST",path:`${e}/mcp/servers/:name/reconnect`,handler:iy("neurolink.http.mcp.reconnectServer",`${e}/mcp/servers/:name/reconnect`,Wan),description:"Reconnect to an MCP server",tags:["mcp"]},{method:"DELETE",path:`${e}/mcp/servers/:name`,handler:iy("neurolink.http.mcp.removeServer",`${e}/mcp/servers/:name`,Kan),description:"Remove an MCP server",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name/tools`,handler:iy("neurolink.http.mcp.listServerTools",`${e}/mcp/servers/:name/tools`,Jan),description:"List tools from a specific MCP server",tags:["mcp","tools"]},{method:"POST",path:`${e}/mcp/servers/:name/tools/:toolName/execute`,handler:iy("neurolink.http.mcp.executeTool",`${e}/mcp/servers/:name/tools/:toolName/execute`,Yan),description:"Execute a tool from a specific MCP server",tags:["mcp","tools"]},{method:"GET",path:`${e}/mcp/health`,handler:iy("neurolink.http.mcp.health",`${e}/mcp/health`,Xan),description:"Health check for all MCP servers",tags:["mcp","health"]}]}}Dr(),pr(),tm();function ay(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId}},()=>r(n))}async function Zan(e){const t=zl(Moe,e.params,e.requestId);if(!t.success)return t.error;const{id:r}=t.data,n=e.query.limit?parseInt(e.query.limit,10):50,o=e.query.offset?parseInt(e.query.offset,10):0,s=isNaN(n)||n<1?50:Math.min(n,100),i=isNaN(o)||o<0?0:o,a=e.neurolink.conversationMemory;if(!a)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{let c=[];if("getUserSessionHistory"in a){const d=e.query.userId||"default",m=await a.getUserSessionHistory(d,r);if(m===null)return Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId);c=m}else if("getSession"in a){const d=a.getSession(r);if(!d)return Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId);c=d.messages}else if("buildContextMessages"in a&&(c=await a.buildContextMessages(r),c.length===0))return Ut("SESSION_NOT_FOUND",`Session '${r}' not found or has no messages`,void 0,e.requestId);const l=c.length,u=c.slice(i,i+s);return{sessionId:r,messages:u,total:l,limit:s,offset:i,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(c){return Ut("MEMORY_ERROR",c instanceof Error?c.message:"Failed to get session messages",void 0,e.requestId)}}async function Qan(e){const t=zl(Moe,e.params,e.requestId);if(!t.success)return t.error;const{id:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{if("getUserSessionObject"in n){const o=e.query.userId||"default",s=await n.getUserSessionObject(o,r);return s===null?Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId):{session:s,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}else if("getSession"in n){const o=n.getSession(r);return o?{session:o,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId)}return Ut("MEMORY_ERROR","Session retrieval not supported for this memory type",void 0,e.requestId)}catch(o){return Ut("MEMORY_ERROR",o instanceof Error?o.message:"Failed to get session",void 0,e.requestId)}}async function ecn(e){const t=e.query.userId,r=e.query.limit?parseInt(e.query.limit,10):50,n=e.query.offset?parseInt(e.query.offset,10):0,o=isNaN(r)||r<1?50:Math.min(r,100),s=isNaN(n)||n<0?0:n,i=e.neurolink.conversationMemory;if(!i)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{let a=[];if("getUserAllSessionsHistory"in i&&t)a=await i.getUserAllSessionsHistory(t);else if("getUserSessions"in i&&t){const u=await i.getUserSessions(t);if("getUserSessionMetadata"in i){const d=u.map(h=>i.getUserSessionMetadata(t,h));a=(await Promise.all(d)).filter(h=>h!==null)}else a=u.map(d=>({id:d}))}else if("getStats"in i){const u=await i.getStats?.();return{sessions:[],total:u?.totalSessions||0,limit:o,offset:s,message:"Session listing not fully supported for in-memory storage. Use /stats endpoint for session counts.",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}const c=a.length;return{sessions:a.slice(s,s+o),total:c,limit:o,offset:s,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(a){return Ut("MEMORY_ERROR",a instanceof Error?a.message:"Failed to list sessions",void 0,e.requestId)}}async function tcn(e){const t=e.neurolink.conversationMemory;if(!t)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{const r=await t.getStats?.();return{available:!0,type:t.constructor.name,stats:r||{message:"Statistics not available for this memory type"},timestamp:new Date().toISOString()}}catch(r){return Ut("MEMORY_ERROR",r instanceof Error?r.message:"Failed to get statistics",void 0,e.requestId)}}async function rcn(e){const t=zl(Roe,e.params,e.requestId);if(!t.success)return t.error;const{sessionId:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{return await n.clearSession?.(r)===!1?Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId):{success:!0,sessionId:r,message:"Session cleared successfully",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(o){return Ut("MEMORY_ERROR",o instanceof Error?o.message:"Failed to clear session",void 0,e.requestId)}}async function ncn(e){const t=e.neurolink.conversationMemory;if(!t)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{return await t.clearAllSessions?.(),{success:!0,message:"All sessions cleared successfully",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(r){return Ut("MEMORY_ERROR",r instanceof Error?r.message:"Failed to clear sessions",void 0,e.requestId)}}async function ocn(e){const t=e.neurolink.conversationMemory;return{available:!!t,type:t?.constructor.name||"none",timestamp:new Date().toISOString()}}function Gsr(e="/api"){return{prefix:`${e}/memory`,routes:[{method:"GET",path:`${e}/memory/sessions/:id/messages`,handler:ay("neurolink.http.memory.getSessionMessages",`${e}/memory/sessions/:id/messages`,Zan),description:"Get messages for a session",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions/:id`,handler:ay("neurolink.http.memory.getSession",`${e}/memory/sessions/:id`,Qan),description:"Get session by ID",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions`,handler:ay("neurolink.http.memory.listSessions",`${e}/memory/sessions`,ecn),description:"List all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/stats`,handler:ay("neurolink.http.memory.stats",`${e}/memory/stats`,tcn),description:"Get memory statistics",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions/:sessionId`,handler:ay("neurolink.http.memory.clearSession",`${e}/memory/sessions/:sessionId`,rcn),description:"Clear a conversation session",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions`,handler:ay("neurolink.http.memory.clearAllSessions",`${e}/memory/sessions`,ncn),description:"Clear all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/health`,handler:ay("neurolink.http.memory.health",`${e}/memory/health`,ocn),description:"Check memory system health",tags:["memory","health"]}]}}G(),Dr(),pr();function scn(e="/api",t){return t||p.debug("[OpenAPI] createOpenApiRoutes called without getRoutes callback. Custom routes will not be documented in the OpenAPI spec."),{prefix:`${e}/openapi`,routes:[{method:"GET",path:`${e}/openapi.json`,handler:async()=>dt({name:"neurolink.http.openapi.json",tracer:Be.http,attributes:{"http.route":`${e}/openapi.json`,"openapi.format":"json"}},async r=>{const n=t?.()??[];return t?n.length===0&&p.debug("[OpenAPI] getRoutes returned empty array. No custom routes will be documented."):p.warn("[OpenAPI] No getRoutes callback provided. OpenAPI spec will use default endpoint definitions. Use registerAllRoutes(server, basePath, { enableSwagger: true }) to automatically include your routes."),r.setAttribute("openapi.route_count",n.length),new OA({basePath:e,routes:n}).generate()}),description:"Get OpenAPI specification as JSON",tags:["openapi","documentation"]},{method:"GET",path:`${e}/openapi.yaml`,handler:async()=>dt({name:"neurolink.http.openapi.yaml",tracer:Be.http,attributes:{"http.route":`${e}/openapi.yaml`,"openapi.format":"yaml"}},async r=>{const n=t?.()??[];return t?n.length===0&&p.debug("[OpenAPI] getRoutes returned empty array. No custom routes will be documented."):p.warn("[OpenAPI] No getRoutes callback provided. OpenAPI spec will use default endpoint definitions. Use registerAllRoutes(server, basePath, { enableSwagger: true }) to automatically include your routes."),r.setAttribute("openapi.route_count",n.length),{_raw:!0,contentType:"text/yaml",body:new OA({basePath:e,routes:n}).toYAML()}}),description:"Get OpenAPI specification as YAML",tags:["openapi","documentation"]},{method:"GET",path:`${e}/docs`,handler:async()=>dt({name:"neurolink.http.openapi.docs",tracer:Be.http,attributes:{"http.route":`${e}/docs`}},async()=>({_raw:!0,contentType:"text/html",body:`<!DOCTYPE html>
|
|
2340
|
+
`;R.enqueue(new TextEncoder().encode(D)),R.close()}}},cancel(){return _=!0,E.cancel(),v.cancel()}}),{response:k,telemetryDone:A}=aan({ctx:t,account:n,response:s,responseHeaders:i,remainingStream:C,streamOutcome:E.outcome,tracer:a,requestStartTime:c,attemptNumber:u,finalBodyStr:d,upstreamSpan:m,logAttempt:h,logProxyBody:f,logFinalRequest:y});return A.then(()=>g?.(),()=>g?.()),{response:k,holdsAccountAdmission:!0,served:!0}}function Qp(e){if(e.kind==="upstream_error")return{status:502,errorType:"stream_error",message:e.message};if(e.kind==="client_cancelled")return{status:499,errorType:"client_cancelled",message:"Client cancelled the streaming response"}}function zF(e,t,r){e.kind==="upstream_error"&&(Rr(t.label,t.type,502),r(502,"stream_error",e.message,{retryable:!1}))}function aan(e){const{ctx:t,account:r,response:n,responseHeaders:o,remainingStream:s,streamOutcome:i,tracer:a,requestStartTime:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:f}=e,{stream:g,capture:y}=Tae();let v=s,w;if(a)try{const{stream:C,telemetry:k}=aF({captureRawText:!0});v=v.pipeThrough(C);const A=a,R=d,I=n,M=u.length,D=r.label,U=r.key;w=Promise.all([k,y,i]).then(([P,F,$])=>{const N=AF($,P.streamErrorMessage,P.messageStopReceived);Y2(t.metadata,P),zF(N,r,m),A.setUsage({inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),sce(U,P.model,{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),oce(D,P.model,{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens}),A.logStreamEvents(P.events),A.setResponseInfo(fsr(P));const q=parseFloat(I.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),z=parseFloat(I.headers.get("anthropic-ratelimit-unified-7d-utilization")??""),H={inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens};isNaN(q)||(H.rateLimitAfter5h=q),isNaN(z)||(H.rateLimitAfter7d=z),(!isNaN(q)||!isNaN(z))&&A.setUsage(H),A.logUpstreamResponseBody(P.rawText??""),A.recordMetrics(),A.recordBodySizes(M,P.totalBytesReceived),R?.end();const B=Qp(N),V={inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheCreationTokens:P.usage.cacheCreationInputTokens,cacheReadTokens:P.usage.cacheReadInputTokens};B?(A.setError(B.errorType,B.message),A.end(B.status,Date.now()-c),f(B.status,D,r.type,B.errorType,B.message,V)):(A.end(200,Date.now()-c),f(200,D,r.type,void 0,void 0,V)),h({phase:"upstream_response",headers:o,body:P.rawText??"",sourceTruncated:P.rawTextTruncated,bodySize:P.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:D,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),h({phase:"client_response",headers:o,body:F.text,sourceTruncated:F.truncated,bodySize:F.totalBytes,contentType:o["content-type"]??"text/event-stream",account:D,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(P=>{A.setError("stream_telemetry_error",P instanceof Error?P.message:String(P)),R?.end(),A.end(500,Date.now()-c),f(500,D,r.type,"stream_telemetry_error",P instanceof Error?P.message:String(P))})}catch{w=i.then(C=>{zF(C,r,m);const k=Qp(C);d?.end(),k?(a.setError(k.errorType,k.message),a.end(k.status,Date.now()-c),f(k.status,r.label,r.type,k.errorType,k.message)):(a.end(n.status,Date.now()-c),f(n.status,r.label,r.type))}).catch(()=>{})}else{d?.end();try{const{stream:C,telemetry:k}=aF({captureRawText:!0});v=v.pipeThrough(C);const A=r.label,R=r.key;w=Promise.all([k,y,i]).then(([I,M,D])=>{const U=AF(D,I.streamErrorMessage,I.messageStopReceived);Y2(t.metadata,I),zF(U,r,m);const P=Qp(U),F={inputTokens:I.usage.inputTokens,outputTokens:I.usage.outputTokens,cacheCreationTokens:I.usage.cacheCreationInputTokens,cacheReadTokens:I.usage.cacheReadInputTokens};sce(R,I.model,F),oce(A,I.model,F),P?f(P.status,A,r.type,P.errorType,P.message,F):f(200,A,r.type,void 0,void 0,F),h({phase:"upstream_response",headers:o,body:I.rawText??"",sourceTruncated:I.rawTextTruncated,bodySize:I.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),h({phase:"client_response",headers:o,body:M.text,sourceTruncated:M.truncated,bodySize:M.totalBytes,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(I=>{const M=I instanceof Error?I.message:String(I);f(500,r.label,r.type,"stream_telemetry_error",M)})}catch{y.then(C=>{h({phase:"client_response",headers:o,body:C.text,sourceTruncated:C.truncated,bodySize:C.totalBytes,contentType:o["content-type"]??"text/event-stream",account:r.label,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(()=>{}),w=i.then(C=>{zF(C,r,m);const k=Qp(C);k?f(k.status,r.label,r.type,k.errorType,k.message):f(n.status,r.label,r.type)}).catch(()=>{})}}const E=v.pipeThrough(g);yw(t.metadata,{onTerminal:()=>w});const _={...t.responseHeaders??{},"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"};return{response:new Response(E,{status:n.status,headers:_}),telemetryDone:w}}async function can(e){const{ctx:t,account:r,response:n,responseHeaders:o,tracer:s,requestStartTime:i,fetchStartMs:a,attemptNumber:c,finalBodyStr:l,upstreamSpan:u,logAttempt:d,logProxyBody:m,logFinalRequest:h}=e,f=await n.text();d(n.status,void 0,void 0,{attemptDurationMs:Date.now()-a}),s?.logUpstreamResponseBody(f),m({phase:"upstream_response",headers:o,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:c,responseStatus:n.status,durationMs:Date.now()-a}),m({phase:"client_response",headers:o,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:c,responseStatus:n.status,durationMs:Date.now()-i});const g=JSON.parse(f);if(J2(t.metadata,g),ysr(r,g),s&&g&&typeof g=="object"){const y=g.usage;if(y){s.setUsage({inputTokens:y.input_tokens??0,outputTokens:y.output_tokens??0,cacheCreationTokens:y.cache_creation_input_tokens??0,cacheReadTokens:y.cache_read_input_tokens??0});const w=parseFloat(n.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),E=parseFloat(n.headers.get("anthropic-ratelimit-unified-7d-utilization")??"");if(!isNaN(w)||!isNaN(E)){const _={inputTokens:y.input_tokens??0,outputTokens:y.output_tokens??0,cacheCreationTokens:y.cache_creation_input_tokens??0,cacheReadTokens:y.cache_read_input_tokens??0};isNaN(w)||(_.rateLimitAfter5h=w),isNaN(E)||(_.rateLimitAfter7d=E),s.setUsage(_)}}s.setResponseInfo(nce(g)),s.recordMetrics();const v=JSON.stringify(g);s.recordBodySizes(l.length,v.length),u?.end(),s.end(n.status,Date.now()-i),h(n.status,r.label,r.type,void 0,void 0,{inputTokens:y?.input_tokens,outputTokens:y?.output_tokens,cacheCreationTokens:y?.cache_creation_input_tokens,cacheReadTokens:y?.cache_read_input_tokens})}else{u?.end();const y=g&&typeof g=="object"?g.usage:void 0;h(n.status,r.label,r.type,void 0,void 0,{inputTokens:y?.input_tokens,outputTokens:y?.output_tokens,cacheCreationTokens:y?.cache_creation_input_tokens,cacheReadTokens:y?.cache_read_input_tokens})}return{response:g,served:!0}}async function lan(e){const{ctx:t,account:r,accountState:n,requestedModel:o,retryResp:s,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:f}=e,g=dw(s.headers,{model:o});if(g){n.quota=Jg(n.quota,g);const E=Jae(n,g,Date.now());E?.kind==="cooled"?Gu(r.key,E.coolingUntil,E.coolingReason).catch(()=>{}):E?.kind==="cleared"&&Kg(r.key,E.coolingUntil).catch(()=>{}),Vp(r.key,g).catch(_=>{p.debug("[proxy] Failed to persist account quota after auth retry",{account:r.label,error:_ instanceof Error?_.message:String(_)})})}const y=Object.fromEntries([...s.headers.entries()]),v=await s.text();m(s.status,void 0,void 0,{attemptDurationMs:Date.now()-c}),i?.logUpstreamResponseHeaders(y),i?.logUpstreamResponseBody(v),h({phase:"upstream_response",headers:y,body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:y["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:s.status,durationMs:Date.now()-c}),h({phase:"client_response",headers:y,body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:y["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:s.status,durationMs:Date.now()-a});const w=JSON.parse(v);if(J2(t.metadata,w),ysr(r,w),i&&w&&typeof w=="object"){const E=w.usage;E&&i.setUsage({inputTokens:E.input_tokens??0,outputTokens:E.output_tokens??0,cacheCreationTokens:E.cache_creation_input_tokens??0,cacheReadTokens:E.cache_read_input_tokens??0}),i.setResponseInfo(nce(w)),i.recordMetrics();const _=JSON.stringify(w);i.recordBodySizes(u.length,_.length),d?.end(),i.end(s.status,Date.now()-a),f(s.status,r.label,r.type,void 0,void 0,{inputTokens:E?.input_tokens,outputTokens:E?.output_tokens,cacheCreationTokens:E?.cache_creation_input_tokens,cacheReadTokens:E?.cache_read_input_tokens})}else d?.end(),f(s.status,r.label,r.type);return w}async function uan(e){const{ctx:t,body:r,account:n,accountState:o,headers:s,buildUpstreamBody:i,url:a,enabledAccounts:c,orderedAccounts:l,tracer:u,requestStartTime:d,allocateAttemptNumber:m,upstreamSpan:h,logAttempt:f,logProxyBody:g,onStreamTerminal:y,logFinalRequest:v,lastError:w,authFailureMessage:E,entitlementFailure:_,sawRateLimit:C,sawTransientFailure:k,sawNetworkError:A,bindServedSession:R}=e;Rr(n.label,n.type,401),f(401,"authentication_error","received 401 from Anthropic",{retryable:!0});let I=w,M=E,D=_,U=C,P=k,F=A,$=h,N=!1,q="received 401 from Anthropic";for(let z=0;z<nx;z++){p.always(`[proxy] \u2190 401 account=${n.label} refreshing (attempt ${z+1}/${nx})`);const H=await rF(n,n.persistTarget);if(!H.success){if(q=`refresh failed for account=${n.label} attempt ${z+1}/${nx}: ${H.error?.slice(0,200)??"unknown"}`,I=q,Xg(H))await gm(n,o,"refresh_invalid"),M=HF(n.label),p.always(`[proxy] account=${n.label} refresh token rejected; disabled until re-authentication`);else{const he=await GF(n,o);P=!0,p.always(`[proxy] account=${n.label} refresh temporarily unavailable (${H.status??"network"}); cooling until ${new Date(he).toISOString()} and rotating`)}break}n.persistTarget&&await nF(n.persistTarget,n),await jF(n,o),s.authorization=`Bearer ${n.token}`;const B=m(),V=Date.now(),ne=(he,te,ge,Me)=>f(he,te,ge,{...Me,attempt:B,attemptDurationMs:Me?.attemptDurationMs??Date.now()-V}),Z=i(n.token),ke=Date.now();try{const he=await zae(a,{method:"POST",headers:s,body:Z.bodyStr,signal:AbortSignal.any([...t.abortSignal?[t.abortSignal]:[],AbortSignal.timeout(ox)])},t,n.key,{logProxyBody:g,tracer:u,attemptNumber:B,accountLabel:n.label,accountType:n.type,preparedContext:Z.preparedContext});if(he.ok){N=!0,o.consecutiveRefreshFailures=0,p.always(`[proxy] \u2190 200 account=${n.label} (after ${z+1} refresh(es))`);const fe=r.stream?await Csr({ctx:t,body:r,account:n,accountState:o,response:he,tracer:u,requestStartTime:d,fetchStartMs:ke,attemptNumber:B,finalBodyStr:Z.bodyStr,upstreamSpan:$,logAttempt:ne,logProxyBody:g,logFinalRequest:v,onStreamTerminal:y}):{response:await lan({ctx:t,account:n,accountState:o,requestedModel:r.model,retryResp:he,tracer:u,requestStartTime:d,fetchStartMs:ke,attemptNumber:B,finalBodyStr:Z.bodyStr,upstreamSpan:$,logAttempt:ne,logProxyBody:g,logFinalRequest:v}),served:!0};if("retryNextAccount"in fe){const Oe=fe.failure;return{continueLoop:!0,...Oe?.retryDelayMs?{retryDelayMs:Oe.retryDelayMs}:{},lastError:Oe?.message??I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U||!!Oe?.rateLimit,sawTransientFailure:P||!!(Oe&&!Oe.rateLimit),sawNetworkError:F,upstreamSpan:void 0}}return R&&fe.served&&R(n.key),{response:fe.response,holdsAccountAdmission:fe.holdsAccountAdmission,continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0}}const te=he.status,ge=await he.text(),Me={};he.headers.forEach((fe,Oe)=>{Me[Oe]=fe});const Ue={...Me};delete Ue.authorization,delete Ue["x-api-key"];const xe=ge.length>4e3?ge.slice(0,4e3)+"...[truncated]":ge;if(u?.logUpstreamResponseHeaders(Ue),u?.logUpstreamResponseBody(xe),g({phase:"upstream_response",headers:Ue,body:xe,bodySize:Buffer.byteLength(ge,"utf8"),contentType:Me["content-type"]??"application/json",account:n.label,accountType:n.type,attempt:B,responseStatus:te,durationMs:Date.now()-ke}),q=`retry ${z+1}/${nx} failed with status ${te}`,I=ge,p.debug(`[proxy] retry ${z+1} failed: ${te} ${ge.substring(0,120)}`),te===429&&xsr(Me,ge))return p.always(`[proxy] \u2190 429 account=${n.label} anti-abuse/construction rejection after OAuth refresh \u2014 returning non-retryable request error`),ne(429,"construction_rejection",ge),u?.setError("construction_rejection",ge.slice(0,500)),$?.end(),{response:ksr({terminalError:Isr(),account:n,tracer:u,requestStartTime:d,attemptNumber:B,logProxyBody:g,logFinalRequest:v}),continueLoop:!1,lastError:ge,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0};if(te===429){U=!0;const fe=Date.now(),Oe=dw(Me,{model:r.model});Oe&&(o.quota=Jg(o.quota,Oe));const De=Wae(Oe,xF(Me["retry-after"]??null),fe,Q2(Me),Qc,typeof r.model=="string"?r.model:void 0),Ye=De.reason==="transient"?"transient":"quota";Rr(n.label,n.type,te,Ye),ne(429,"rate_limit_error",ge,{retryable:!0,rateLimitKind:Ye,cooldownReason:De.reason}),De.scope==="account"&&(!o.coolingUntil||De.coolingUntil>o.coolingUntil)&&(o.coolingUntil=De.coolingUntil,o.coolingReason=De.reason),Oe&&Vp(n.key,Oe).catch(()=>{}),De.scope==="account"&&await Gu(n.key,o.coolingUntil??De.coolingUntil,o.coolingReason??De.reason).catch(()=>{}),ny(n.key,c.length,l[0]?.key);break}if(te===401||te===402||te===403){if(mce(te,ge)){const fe=Vu(ge);Rr(n.label,n.type,te),ne(te,"permission_error",Cr(ge)),D={status:te,accounts:[...D?.accounts??[],n.label],message:D?.message??fe.message??Cr(ge),...fe.errorCode?{errorCode:fe.errorCode}:{}},n.type==="oauth"&&Lsr(te,ge)&&await gm(n,o,"entitlement_blocked"),q=`entitlement blocked for account=${n.label}`,I=q,p.always(`[proxy] \u2190 ${te} account=${n.label} entitlement blocked after refresh; advancing to next account`);break}Rr(n.label,n.type,te),ne(te,"authentication_error",Cr(ge),{retryable:!0}),z<nx-1&&await Hu(1e3);continue}if($sr(te,ge)){Rr(n.label,n.type,te),ne(te,"api_error",Cr(ge),{retryable:!0}),P=!0;break}ne(te,"api_error",Cr(ge));try{return v(te,n.label,n.type,"api_error",Cr(ge)),{response:JSON.parse(ge),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}catch{return v(te,n.label,n.type,"api_error",Cr(ge)),{response:Li(te,ge),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}}catch(he){if(he instanceof _r||Xc(he))throw $?.end(),he;if(t.abortSignal?.aborted)throw ne(499,"client_cancelled","Client cancelled upstream request",{retryable:!1}),$?.end(),he;F=!0,Rr(n.label,n.type,502);const te=he instanceof Error?he.message:String(he);q=`network error on retry ${z+1}: ${te}`,I=q;const ge=dce(he);if(ne(502,"network_error",te,{retryable:ge,errorCode:dx(he)??"unknown"}),p.debug(`[proxy] ${q}`),!ge)return $?.end(),{response:Asr({account:n,tracer:u,requestStartTime:d,attemptNumber:B,logProxyBody:g,logFinalRequest:v,errorType:"network_error",message:te}),continueLoop:!1,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:void 0};break}}return N||(I=q,p.always(`[proxy] \u26A0 account=${n.label} auth retries exhausted, rotating to next account`),u?.setError("authentication_error",q),u?.recordRetry(n.label,"auth_exhausted"),$?.end(),$=void 0,ny(n.key,c.length,l[0]?.key)),{continueLoop:!0,lastError:I,authFailureMessage:M,entitlementFailure:D,sawRateLimit:U,sawTransientFailure:P,sawNetworkError:F,upstreamSpan:$}}function cce(e){const{responseStatus:t,account:r,errBody:n,errRespHeaders:o,requestStartTime:s,attemptNumber:i,logProxyBody:a,logFinalRequest:c,errorType:l}=e;try{const u=JSON.parse(n);return c(t,r.label,r.type,l,Cr(n)),a({phase:"client_response",headers:{"content-type":o["content-type"]??"application/json"},body:n,bodySize:Buffer.byteLength(n,"utf8"),contentType:o["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:i,responseStatus:t,durationMs:Date.now()-s}),u}catch{c(t,r.label,r.type,l,Cr(n));const u=Li(t,n),d=JSON.stringify(u);return a({phase:"client_response",headers:{"content-type":"application/json"},body:d,bodySize:Buffer.byteLength(d,"utf8"),contentType:"application/json",account:r.label,accountType:r.type,attempt:i,responseStatus:t,durationMs:Date.now()-s}),u}}function ksr(e){const{terminalError:t,account:r,tracer:n,requestStartTime:o,attemptNumber:s,logProxyBody:i,logFinalRequest:a}=e;return n?.end(t.status,Date.now()-o),cce({responseStatus:t.status,account:r,errBody:t.body,errRespHeaders:t.headers,requestStartTime:o,attemptNumber:s,logProxyBody:i,logFinalRequest:a,errorType:t.errorType})}function Asr(e){const{account:t,tracer:r,requestStartTime:n,attemptNumber:o,logProxyBody:s,logFinalRequest:i,errorType:a,message:c}=e;r?.setError(a,c),r?.end(502,Date.now()-n),i(502,t.label,t.type,a,c);const l=Li(502,c),u=JSON.stringify(l);return s({phase:"client_response",headers:{"content-type":"application/json"},body:u,bodySize:Buffer.byteLength(u,"utf8"),contentType:"application/json",account:t.label,accountType:t.type,attempt:o,responseStatus:502,durationMs:Date.now()-n}),l}async function dan(e){const{response:t,account:r,accountState:n,enabledAccounts:o,orderedAccounts:s,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,logAttempt:u,logProxyBody:d,logFinalRequest:m,lastError:h,authFailureMessage:f,sawTransientFailure:g,invalidRequestFailure:y,entitlementFailure:v,allowConfiguredModelFallback:w=!1}=e;let E=h,_=f,C=g,k=y,A=v;const R=await t.text(),I={};if(t.headers.forEach((M,D)=>{I[D]=M}),i?.logUpstreamResponseHeaders(I),i?.logUpstreamResponseBody(R),d({phase:"upstream_response",headers:I,body:R,bodySize:Buffer.byteLength(R,"utf8"),contentType:I["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:t.status,durationMs:Date.now()-c}),_an(t.status,R))return kan(t.status,R)?(p.always(`[proxy] \u2190 ${t.status} account=${r.label} beta unavailable for subscription; advancing to next account`),u(t.status,"invalid_request_error",Cr(R)),i?.setError("invalid_request_error",Cr(R)),i?.recordRetry(r.label,"beta_unavailable"),ny(r.key,o.length,s[0]?.key),E=Cr(R),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 ${t.status} upstream invalid_request_error`),u(t.status,"invalid_request_error",Cr(R)),i?.setError("invalid_request_error",Cr(R)),k={status:t.status,body:R,contentType:I["content-type"]},E=Cr(R),{continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0});if(r.type==="oauth"&&mce(t.status,R)){const M=Vu(R);return Rr(r.label,r.type,t.status),A={status:t.status,accounts:[...A?.accounts??[],r.label],message:A?.message??M.message??Cr(R),...M.errorCode?{errorCode:M.errorCode}:{}},p.always(`[proxy] \u2190 ${t.status} account=${r.label} entitlement blocked${M.errorCode?` (${M.errorCode})`:""}; advancing to next account`),u(t.status,"permission_error",Cr(R)),i?.setError("permission_error",Cr(R)),i?.recordRetry(r.label,"entitlement_blocked"),r.type==="oauth"&&Lsr(t.status,R)&&await gm(r,n,"entitlement_blocked"),ny(r.key,o.length,s[0]?.key),E=Cr(R),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}if((t.status===401||t.status===402||t.status===403)&&r.type==="oauth"&&!r.refreshToken)return Rr(r.label,r.type,t.status),await gm(r,n,"missing_refresh_token"),_=HF(r.label),p.always(`[proxy] \u2190 ${t.status} account=${r.label} (auth failure, no refresh token)`),E=R,u(t.status,"authentication_error",Cr(R)),i?.setError("authentication_error",Cr(R)),i?.recordRetry(r.label,"auth_no_refresh"),ny(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0};if((t.status===401||t.status===402||t.status===403)&&r.type==="api_key")return Rr(r.label,r.type,t.status),_="Authentication failed for Anthropic API key credentials. Update ANTHROPIC_API_KEY or re-login with OAuth.",p.always(`[proxy] \u2190 ${t.status} account=${r.label} (auth failure, api_key)`),E=R,u(t.status,"authentication_error",Cr(R)),i?.setError("authentication_error",Cr(R)),i?.recordRetry(r.label,"auth_api_key"),ny(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0};if(t.status===404)return w&&Can(t.status,R)?(p.always(`[proxy] \u2190 404 account=${r.label} model unavailable; trying configured fallback`),u(404,"not_found_error",Cr(R)),i?.setError("not_found_error",Cr(R)),i?.recordRetry(r.label,"model_not_found"),E=Cr(R),{continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 404 account=${r.label}`),u(404,"not_found_error",Cr(R)),i?.setError("not_found_error",Cr(R)),i?.end(404,Date.now()-a),{response:cce({responseStatus:404,account:r,errBody:R,errRespHeaders:I,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"not_found_error"}),continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0});if($sr(t.status,R)){const M=xan(t.status,R);return Rr(r.label,r.type,t.status,t.status===429?"transient":void 0),C=!0,p.always(`[proxy] \u2190 ${t.status} account=${r.label} (${M?"overloaded":"transient"})`),E=R,u(t.status,"api_error",Cr(R),t.status===429?{retryable:!0,rateLimitKind:"transient",cooldownReason:"transient"}:void 0),i?.setError(M?"overloaded_error":"transient_error",Cr(R)),i?.recordRetry(r.label,M?"overloaded":"transient"),{continueLoop:!0,retrySameAccount:!M,...M?{retryDelayMs:Psr(l)}:{},lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}return p.always(`[proxy] \u2190 ${t.status} account=${r.label}`),p.debug(`[claude-proxy] error body: ${R.substring(0,200)}`),u(t.status,"api_error",Cr(R)),i?.setError("api_error",Cr(R)),i?.end(t.status,Date.now()-a),{response:cce({responseStatus:t.status,account:r,errBody:R,errRespHeaders:I,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"api_error"}),continueLoop:!1,lastError:E,authFailureMessage:_,sawTransientFailure:C,invalidRequestFailure:k,entitlementFailure:A,upstreamSpan:void 0}}function man(e){const{ctx:t,body:r,clientRequestBody:n}=e;let o;try{o=VA.startRequest({recordRequestMetrics:UA(t.requestId)?.accountingScope!=="internal",recordUsageMetrics:!0,requestId:t.requestId,method:t.method,path:t.path,model:r.model,stream:r.stream??!1,toolCount:Array.isArray(r.tools)?r.tools.length:0,toolNames:Array.isArray(r.tools)?r.tools.map(h=>h&&typeof h=="object"&&"name"in h?String(h.name??""):"").filter(h=>h.length>0):void 0,sessionId:t.headers["x-neurolink-session-id"]??t.headers["x-claude-code-session-id"]??void 0,userAgent:t.headers["user-agent"]??void 0},t.headers);const m=o.startReceive();o.logRequestHeaders(t.headers),o.logRequestBody(n),m.end()}catch{o=void 0}const s=Date.now(),i=m=>{const h=o?.getTraceContext();xw({timestamp:new Date().toISOString(),requestId:t.requestId,model:r.model,stream:r.stream??!1,...m,...h?{traceId:h.traceId,spanId:h.spanId}:{}})};let a;const c=m=>{if(a){p.debug(`[claude-proxy] ignored duplicate routing decision for request ${t.requestId}`);return}a=m};let l=!1;const u=(m,h,f,g,y,v)=>{if(l||gw(t.requestId)){p.debug(`[claude-proxy] ignored duplicate finalization for request ${t.requestId}`);return}l=!0,t.abortSignal?.aborted&&(m=499,g="client_cancelled",y="Client cancelled request");const w=t.metadata.sdkFallbackFailure;w&&(h="unknown",f="translation",o?.setServedAccount(h,f),w.model&&o?.setModelSubstitution(r.model,w.model,w.provider),w.inputTokens!==void 0&&w.outputTokens!==void 0&&o?.setUsage({inputTokens:w.inputTokens,outputTokens:w.outputTokens,cacheReadTokens:w.cacheReadTokens??0,cacheCreationTokens:w.cacheCreationTokens??0,inputIncludesCachedTokens:w.inputIncludesCachedTokens,reasoningTokens:w.reasoningTokens}));const E=t.metadata.codexFallbackFailureUsage;E&&(v={inputTokens:E.inputTokensObserved?E.input:void 0,outputTokens:E.outputTokensObserved?E.output:void 0,cacheReadTokens:E.cacheReadTokens,cacheCreationTokens:E.cacheCreationTokens,reasoningTokens:E.reasoning,...v}),!h&&typeof t.metadata.codexFallbackAccount=="string"&&t.metadata.codexFallbackAccount&&(h=t.metadata.codexFallbackAccount,typeof t.metadata.codexFallbackAccountType=="string"&&(f=t.metadata.codexFallbackAccountType)),!w&&t.metadata.codexFallbackDeferredFailure===!0&&typeof t.metadata.codexFallbackModel=="string"&&(o?.setModelSubstitution(r.model,t.metadata.codexFallbackModel,"openai"),o?.setServedAccount(h||"unknown",f),E?.inputTokensObserved&&E.outputTokensObserved&&o?.setUsage({inputTokens:E.input,outputTokens:E.output,cacheReadTokens:E.cacheReadTokens??0,cacheCreationTokens:E.cacheCreationTokens??0,reasoningTokens:E.reasoning},{recordMetrics:!1}));const _=h||(m>=400?Nae:void 0),C=h?f||void 0:m>=400?Lae:void 0,k=w?{accountKey:w.accountKey,provider:w.provider}:Hor(_,C),A=UA(t.requestId)?.accountingScope!=="internal";A&&m>=400?qg(m,_,C,{requestId:t.requestId,...k.accountKey?{accountKey:k.accountKey}:{},errorType:g,terminalOutcome:g==="client_cancelled"?"client_cancelled":g?.includes("stream")?"stream_error":"handler_error",message:y,errorCode:v?.errorCode}):A&&dA(_,C);const R=o?.getTraceContext(),I=Xin(t.metadata,C);Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:I??r.model,...I?{requestedModel:r.model,...C==="vertex"?{}:{inputIncludesCachedTokens:!1}}:{},...t.metadata.contextPreflight?{contextPreflight:t.metadata.contextPreflight}:{},...t.metadata.tokenBudget?{tokenBudget:t.metadata.tokenBudget}:{},stream:!!r.stream,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:_??"",...k.accountKey?{accountKey:k.accountKey}:{},accountType:C??"",...k.provider?{provider:k.provider}:{},...w,...jA(t.headers),responseStatus:m,responseTimeMs:Date.now()-s,...YQr(t.metadata,s),...g?{errorType:g}:{},...y?{errorMessage:y}:{},...v?.errorCode?{errorCode:v.errorCode}:{},...v?.retryable!==void 0?{retryable:v.retryable}:{},...v?.transportScope?{transportScope:v.transportScope}:{},...v?.inputTokens!==void 0?{inputTokens:v.inputTokens}:{},...v?.outputTokens!==void 0?{outputTokens:v.outputTokens}:{},...v?.cacheCreationTokens!==void 0?{cacheCreationTokens:v.cacheCreationTokens}:{},...v?.cacheReadTokens!==void 0?{cacheReadTokens:v.cacheReadTokens}:{},...v?.reasoningTokens!==void 0?{reasoningTokens:v.reasoningTokens}:{},...R?{traceId:R.traceId,spanId:R.spanId}:{},...a?{routingDecision:a}:{},...Array.isArray(t.metadata.fallbackPlan)?{fallbackPlan:t.metadata.fallbackPlan}:{}})},d=(m,h,f,g)=>{const y=Li(m,h,f),v=JSON.stringify(y);return u(m,g?.account??"",g?.accountType??"final",f,h,g),i({phase:"client_response",headers:{"content-type":"application/json"},body:v,bodySize:Buffer.byteLength(v,"utf8"),contentType:"application/json",responseStatus:m,durationMs:Date.now()-s,...g}),y};return i({phase:"client_request",headers:t.headers,body:n,bodySize:Buffer.byteLength(n,"utf8"),contentType:t.headers["content-type"]??"application/json"}),{tracer:o,requestStartTime:s,logProxyBody:i,logFinalRequest:u,buildLoggedClaudeError:d,setRoutingDecision:c}}function pan(e){const{ctx:t,body:r,toolCount:n,requestStart:o,tracer:s,account:i,attemptNumber:a}=e,c=Date.now(),l=Hor(i.label,i.type);return(u,d,m,h)=>{const f=Date.now(),g=s?.getTraceContext();lae({timestamp:new Date().toISOString(),requestId:t.requestId,attempt:h?.attempt??a,method:t.method,path:t.path,model:r.model,...t.metadata.contextPreflight?{contextPreflight:t.metadata.contextPreflight}:{},...t.metadata.tokenBudget?{tokenBudget:t.metadata.tokenBudget}:{},stream:!!r.stream,toolCount:n,account:i.label,accountKey:i.key,accountType:i.type,...l.provider?{provider:l.provider}:{},responseStatus:u,responseTimeMs:f-o,attemptDurationMs:h?.attemptDurationMs??f-c,...d?{errorType:d}:{},...m?{errorMessage:m}:{},...h?.errorCode?{errorCode:h.errorCode}:{},...h?.transportScope?{transportScope:h.transportScope}:{},...h?.inputTokens!==void 0?{inputTokens:h.inputTokens}:{},...h?.outputTokens!==void 0?{outputTokens:h.outputTokens}:{},...h?.cacheCreationTokens!==void 0?{cacheCreationTokens:h.cacheCreationTokens}:{},...h?.cacheReadTokens!==void 0?{cacheReadTokens:h.cacheReadTokens}:{},...h?.retryable!==void 0?{retryable:h.retryable}:{},...h?.connectPhase!==void 0?{connectPhase:h.connectPhase}:{},...h?.rateLimitKind?{rateLimitKind:h.rateLimitKind}:{},...h?.cooldownReason?{cooldownReason:h.cooldownReason}:{},...g?{traceId:g.traceId,spanId:g.spanId}:{}})}}async function han(e){const{ctx:t,account:r,accountState:n,bodyStr:o,clientHeaders:s,isClaudeClientRequest:i,url:a,tracer:c,attemptNumber:l,currentLastError:u,currentAuthFailureMessage:d,logAttempt:m,logProxyBody:h}=e;let f=u,g=d;if(wie(r)){const I=await rF(r,r.persistTarget);if(I.success)r.persistTarget&&await nF(r.persistTarget,r),await jF(r,n);else return f=`token refresh failed for account=${r.label}: ${I.error?.slice(0,200)??"unknown"}`,Xg(I)?(await gm(r,n,"refresh_invalid"),g=HF(r.label)):await GF(r,n),m(Xg(I)?401:503,Xg(I)?"authentication_error":"token_refresh_unavailable",String(f)),{continueLoop:!0,lastError:f,authFailureMessage:g}}const y=r.type==="oauth",v={};for(const[I,M]of Object.entries(s))typeof M=="string"&&(v[I]=M);const w=y?await Rin(r.label,r.key,v,o):null,E={};for(const[I,M]of Object.entries(s)){const D=I.toLowerCase();typeof M=="string"&&!IF.has(D)&&(E[D]=M)}if(E["content-type"]="application/json",y?(E.authorization=`Bearer ${r.token}`,delete E["x-api-key"],Cin(E,w)):(E["x-api-key"]=r.token,delete E.authorization),E["user-agent"]||(E["user-agent"]=Hf),E["anthropic-version"]||(E["anthropic-version"]="2023-06-01"),E["anthropic-dangerous-direct-browser-access"]||(E["anthropic-dangerous-direct-browser-access"]="true"),E["x-app"]||(E["x-app"]="cli"),E.accept||(E.accept="application/json"),y){const I=i?E["anthropic-beta"]??"":s["anthropic-beta"]??"",M=new Set(I.split(",").map(D=>D.trim()).filter(Boolean));for(const D of i?fC:_in)M.add(D);E["anthropic-beta"]=[...M].join(",")}else{const I=(E["anthropic-beta"]??"").split(",").map(M=>M.trim()).filter(M=>M&&!fC.includes(M)).join(",");I?E["anthropic-beta"]=I:delete E["anthropic-beta"]}const _=I=>{const M=y?Min(o,I,w,i,E["x-claude-code-session-id"]):{bodyStr:o};return{...M,...Zor(t,M.bodyStr)}},C=_(r.token);y&&C.sessionId&&!E["x-claude-code-session-id"]&&(E["x-claude-code-session-id"]=C.sessionId);const k=C.bodyStr;p.always(`[proxy] \u2192 account=${r.label} (${r.type})`);const A=Date.now();let R;return c&&(R=c.startUpstreamAttempt({attempt:l,account:r.label,polyfillHeaders:y,polyfillBody:y,upstreamUrl:a}),Object.assign(E,c.getTraceHeaders())),{continueLoop:!1,lastError:f,authFailureMessage:g,headers:E,buildUpstreamBody:_,finalBodyStr:k,preparedContext:C.preparedContext,fetchStartMs:A,upstreamSpan:R}}function xsr(e,t){const r=!!e["retry-after"],n=Object.keys(e).some(o=>o.toLowerCase().startsWith("anthropic-ratelimit-"));return r||n?!1:t.includes("rate_limit_error")&&/"message"\s*:\s*"Error"/.test(t)}function Isr(){return{status:400,body:JSON.stringify(Li(400,"Anthropic rejected the OAuth request shape. This is not an account rate limit.","invalid_request_error")),headers:{"content-type":"application/json"},errorType:"construction_rejection"}}async function fan(e){const{ctx:t,url:r,headers:n,finalBodyStr:o,preparedContext:s,requestedModel:i,account:a,accountState:c,enabledAccounts:l,orderedAccounts:u,tracer:d,logAttempt:m,logProxyBody:h,fetchStartMs:f,attemptNumber:g,currentLastError:y,currentSawRateLimit:v,currentSawNetworkError:w,upstreamSpan:E}=e;let _=y,C=v,k=w;const A=E;let R;try{R=await zae(r,{method:"POST",headers:n,body:o,signal:AbortSignal.any([...t.abortSignal?[t.abortSignal]:[],AbortSignal.timeout(ox)])},t,a.key,{logProxyBody:h,tracer:d,attemptNumber:g,accountLabel:a.label,accountType:a.type,preparedContext:s})}catch(I){if(I instanceof _r||Xc(I))throw A?.end(),I;if(t.abortSignal?.aborted)throw m(499,"client_cancelled","Client cancelled upstream request",{retryable:!1}),A?.end(),t.abortSignal.reason;const M=dce(I),D=Osr(I),U=San(I);k=!0,Rr(a.label,a.type,502);const P=dx(I)??"unknown",F=I instanceof Error?I.message:String(I);if(_=F,p.always(`[proxy] fetch error account=${a.label} code=${P} (${M?"retryable":"terminal"}): ${F}`),m(502,"network_error",F,{retryable:M,connectPhase:D,errorCode:P,transportScope:U}),d?.setError("network_error",F),M&&d?.recordRetry(a.label,"network_error"),A?.end(),!M)throw I;return{continueLoop:!0,retrySameAccount:!0,transportScope:U,errorCode:P,connectPhase:D,lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0}}if(R.status===429){const I=xF(R.headers.get("retry-after")),M={};R.headers.forEach((z,H)=>{M[H]=z}),_=await R.text();const D={...M};delete D.authorization,delete D["x-api-key"];const U=String(_).length>4e3?String(_).slice(0,4e3)+"...[truncated]":String(_);if(d?.logUpstreamResponseHeaders(D),d?.logUpstreamResponseBody(U),h({phase:"upstream_response",headers:D,body:U,bodySize:Buffer.byteLength(String(_),"utf8"),contentType:M["content-type"]??"application/json",account:a.label,accountType:a.type,attempt:g,responseStatus:429,durationMs:Date.now()-f}),xsr(M,String(_)))return p.always(`[proxy] \u2190 429 account=${a.label} anti-abuse/construction rejection (no ratelimit headers, body="Error") \u2014 NOT a real rate limit; returning non-retryable request error`),m(429,"construction_rejection",String(_)),d?.setError("construction_rejection",String(_).slice(0,500)),A?.end(),{continueLoop:!1,terminalError:Isr(),lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0};C=!0;const P=Date.now(),F=dw(M,{model:i}),$=Q2(M),N=Wae(F,I,P,$,Qc,i),q=N.reason==="transient"?"transient":"quota";return Rr(a.label,a.type,429,q),p.always(`[proxy] \u2190 429 account=${a.label} reason=${N.reason} scope=${N.scope} retry-after=${I}ms 5h-status=${M["anthropic-ratelimit-unified-5h-status"]??"unknown"} 7d-status=${M["anthropic-ratelimit-unified-7d-status"]??"unknown"} unified-status=${$??"unknown"} \u2192 ${N.rotateImmediately?`rotate now, cool ${Kae(N.coolingUntil,P)}m`:"retry same account (transient)"}`),m(429,"rate_limit_error",String(_),{retryable:!0,rateLimitKind:q,cooldownReason:N.reason}),d?.setError("rate_limit_error",String(_).slice(0,500)),d?.recordRetry(a.label,"rate_limit"),A?.end(),{continueLoop:!0,retrySameAccount:!N.rotateImmediately,retryAfterMs:I,cooldownPlan:N,...F?{quota:F}:{},lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:void 0}}return{continueLoop:!1,response:R,lastError:_,sawRateLimit:C,sawNetworkError:k,upstreamSpan:A}}function gan(e){return e.invalidRequestFailure===null}function yan(e){const{ctx:t,tracer:r,requestStartTime:n,failure:o,buildLoggedClaudeError:s}=e;return o.responseHeaders&&(t.responseHeaders={...t.responseHeaders??{},...o.responseHeaders}),r?.setError(o.errorType,o.message),r?.end(o.status,Date.now()-n),s(o.status,o.message,o.errorType)}async function van(e){const{ctx:t,body:r,modelRouter:n,configGeneration:o,tracer:s,requestStartTime:i,accountStrategy:a,primaryAccountKey:c,accountAllowlist:l,quotaRoutingEnabled:u=Xae(),sessionSoftLimit:d=Zae(),sessionResetToleranceMs:m=lx(),ranking:h="expiry-first",preferPrimary:f=!1,sessionAffinityEnabled:g=!1,sessionAffinityIdleTtlMs:y=36e5,spillInflight:v=0,buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_,setRoutingDecision:C}=e,k=oF(r),A=Ow({provider:"anthropic",model:r.model},n?.getFallbackChain()??[],r.model,k),R=A.attempts.slice(1).some(xe=>!!(xe.provider&&xe.model)),I=await Yin({ctx:t,body:r,accountStrategy:a,primaryAccountKey:c,accountAllowlist:l,quotaRoutingEnabled:u,sessionSoftLimit:d,sessionResetToleranceMs:m,ranking:h,preferPrimary:f,sessionAffinityEnabled:g,sessionAffinityIdleTtlMs:y,spillInflight:v,setRoutingDecision:C});if("failure"in I){const xe=await wsr({body:r,logFinalRequest:_});if(xe)return xe;const fe=await Esr({ctx:t,body:r,parsedFallbackRequest:k,fallbackPlan:A,modelRouter:n,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(fe.response)return fe.response;if(fe.invalidRequestFailure)return ace({tracer:s,requestStartTime:i,authFailureMessage:null,authCooldownMessage:null,invalidRequestFailure:fe.invalidRequestFailure,entitlementFailure:null,scopedExhaustion:null,sawNetworkError:!1,sawTransientFailure:!1,sawRateLimit:!1,lastError:void 0,orderedAccounts:[],buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_});if(fe.terminalFailure){const Oe=fe.terminalFailure;return Ssr({failure:Oe,buildLoggedClaudeError:w,tracer:s,requestStartTime:i})}return yan({ctx:t,tracer:s,requestStartTime:i,failure:I.failure,buildLoggedClaudeError:w})}const{accounts:M,enabledAccounts:D,orderedAccounts:U,bodyStr:P,requestStart:F,toolCount:$,url:N,clientHeaders:q,isClaudeClientRequest:z,sessionId:H}=I,B=new Set,V=g&&H&&a==="fill-first"&&D.length>1?xe=>Ein({sessionId:H,servingAccountKey:xe,attemptedAccountKeys:B,enabledAccounts:D,idleTtlMs:y,sessionSoftLimit:d,sessionResetToleranceMs:m,requestedModel:typeof r.model=="string"?r.model:void 0}):void 0,ne=cin(),Z={lastError:void 0,sawRateLimit:!1,sawNetworkError:!1,sawTransientFailure:!1,invalidRequestFailure:null,authFailureMessage:null,authCooldownMessage:null,entitlementFailure:null,scopedExhaustion:null,attemptNumber:0},ke=s?.startAccountSelection();let te=U.filter(xe=>!isr(xe.key));if(te.length===0&&(te=await ein(U)),te.length===0&&U.length>0){const xe=U.map(Oe=>Fa(Oe.key)),fe=xe.some(Oe=>Oe.coolingReason!=="auth");if(Z.sawRateLimit=fe,Z.sawTransientFailure=!fe,Z.lastError=fe?"All Anthropic accounts have active rate-limit cooldowns":"All Anthropic accounts have active authentication cooldowns",!fe){const Oe=Math.min(...xe.map(De=>De.coolingUntil??Number.POSITIVE_INFINITY));Z.authCooldownMessage=`All ${U.length} Anthropic accounts are temporarily unavailable while OAuth refresh is cooling. Earliest retry at ${new Date(Oe).toISOString()}.`}}const ge=min(te,typeof r.model=="string"?r.model:void 0,Date.now(),ne);ge.eligible.length>0?te=ge.eligible:ge.exhaustion&&(Z.scopedExhaustion=ge.exhaustion,Z.lastError=`Model-scoped limit exhausted for ${ge.exhaustion.model}`,te=[]);const Me=n?.getMaxInflightPerAccount?.();let Ue;try{Me!==void 0&&te.length>0&&te.every(xe=>!Hsn(xe.key,Me))&&(Ue=await Wsn(te.map(xe=>xe.key),Me,t.abortSignal,Vae,o));e:for(const[xe,fe]of te.entries()){const Oe=xe<te.length-1,De=Fa(fe.key);let Ye=0,wt=0;for(;;){const Fe=await Lw.acquire(t.abortSignal);if(Fe.allowed===!1){Z.sawNetworkError=!0,Z.lastTransportErrorCode=Fe.errorCode??void 0,Z.lastTransportScope=Fe.transportScope,Z.lastError=`Anthropic transport recovery probe failed (${Fe.errorCode??"unknown"})`;const ie=Fe.connectPhase?Wor:RF;if(Ye<ie){Ye+=1;const oe=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after failed transport recovery probe (${Ye}/${ie}) in ${oe}ms`),await Hu(oe);continue}break e}Z.attemptNumber+=1,s&&Z.attemptNumber===1&&ke&&(s.setAccountSelection({strategy:a,accountsTotal:M.length,accountsHealthy:D.length,selectedAccount:fe.label,accountType:fe.type}),ke.end());const Ae=pan({ctx:t,body:r,toolCount:$,requestStart:F,tracer:s,account:fe,attemptNumber:Z.attemptNumber}),Te=await han({ctx:t,account:fe,accountState:De,bodyStr:P,clientHeaders:q,isClaudeClientRequest:z,url:N,tracer:s,attemptNumber:Z.attemptNumber,currentLastError:Z.lastError,currentAuthFailureMessage:Z.authFailureMessage,logAttempt:Ae,logProxyBody:E});if(Z.lastError=Te.lastError,Z.authFailureMessage=Te.authFailureMessage,Te.continueLoop||!Te.headers||!Te.buildUpstreamBody||!Te.finalBodyStr||!Te.preparedContext||Te.fetchStartMs===void 0){B.add(fe.key),Fe.probe&&Lw.reportProbeAbandoned(Fe);continue e}let Y;if(Ue?.accountKey===fe.key?(Y=Ue.lease,Ue=void 0):(Y=Gsn(fe.key,Me,o),Y&&Ue&&(Ue.lease.release(),Ue=void 0)),!Y){Fe.probe&&Lw.reportProbeAbandoned(Fe);continue e}B.add(fe.key);let W=!1;try{let ie;try{ie=await fan({ctx:t,url:N,headers:Te.headers,finalBodyStr:Te.finalBodyStr,preparedContext:Te.preparedContext,requestedModel:r.model,account:fe,accountState:De,enabledAccounts:D,orderedAccounts:U,tracer:s,logAttempt:Ae,logProxyBody:E,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,currentLastError:Z.lastError,currentSawRateLimit:Z.sawRateLimit,currentSawNetworkError:Z.sawNetworkError,upstreamSpan:Te.upstreamSpan})}catch(J){throw Fe.probe&&Lw.reportProbeAbandoned(Fe),J}if(ie.transportScope?Lw.reportTransportFailure(ie.errorCode,ie.transportScope,Fe,ie.connectPhase===!0):Lw.reportSuccess(Fe),Z.lastError=ie.lastError,Z.sawRateLimit=ie.sawRateLimit,Z.sawNetworkError=ie.sawNetworkError,ie.transportScope&&(Z.lastTransportScope=ie.transportScope,Z.lastTransportErrorCode=ie.errorCode),ie.terminalError)return ksr({terminalError:ie.terminalError,account:fe,tracer:s,requestStartTime:i,attemptNumber:Z.attemptNumber,logProxyBody:E,logFinalRequest:_});if(ie.continueLoop||!ie.response){if(ie.cooldownPlan){const se=ie.cooldownPlan;ie.quota&&(De.quota=Jg(De.quota,ie.quota),Vp(fe.key,ie.quota).catch(()=>{}));let ve=!1;se.scope==="account"&&(!De.coolingUntil||se.coolingUntil>De.coolingUntil)&&(De.coolingUntil=se.coolingUntil,De.coolingReason=se.reason,ve=!0),ve&&se.scope==="account"&&await Gu(fe.key,De.coolingUntil??se.coolingUntil,De.coolingReason??se.reason).catch(()=>{});const Ie=ie.retrySameAccount?Zsn(fe.key,se.coolingUntil):void 0;if(ie.retrySameAccount&&ie.retryAfterMs!==void 0&&wt<Uae&&Ie!==void 0){wt+=1;const x=Math.min(ie.retryAfterMs||1e3,Jor),K=Math.min(Jor,Dsr(x*Ie));p.always(`[proxy] retrying same account=${fe.label} after transient 429 (shared slot ${Ie}/${Uae}) in ${K}ms`),await Hu(K);continue}ny(fe.key,D.length,U[0]?.key),p.always(`[proxy] account=${fe.label} rate-limited (${se.reason}); cooling ~${Kae(se.coolingUntil,Date.now())}m until ${new Date(se.coolingUntil).toISOString()}, rotating`),se.rotateImmediately&&hin(fe,te[xe+1],se.coolingUntil,d);continue e}const J=ie.connectPhase?Wor:RF;if(ie.retrySameAccount&&Ye<J){Ye+=1;const se=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after transient network error (${Ye}/${J}) in ${se}ms`),await Hu(se);continue}if(ie.retrySameAccount&&!ie.transportScope&&p.always(`[proxy] exhausted transient same-account retries for account=${fe.label}; rotating`),ie.transportScope){p.always(`[proxy] Anthropic ${ie.transportScope} failure code=${ie.errorCode??"unknown"}; suppressing cross-account rotation after ${Ye+1} attempts`);break e}continue e}let oe=ie.upstreamSpan;const Q=ie.response;if(Q.status===401&&fe.type==="oauth"&&fe.refreshToken){const J=await uan({ctx:t,body:r,account:fe,accountState:De,headers:Te.headers,buildUpstreamBody:Te.buildUpstreamBody,url:N,enabledAccounts:D,orderedAccounts:U,tracer:s,requestStartTime:i,allocateAttemptNumber:()=>(Z.attemptNumber+=1,Z.attemptNumber),upstreamSpan:oe,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,onStreamTerminal:Y.release,lastError:Z.lastError,authFailureMessage:Z.authFailureMessage,entitlementFailure:Z.entitlementFailure,sawRateLimit:Z.sawRateLimit,sawTransientFailure:Z.sawTransientFailure,sawNetworkError:Z.sawNetworkError,bindServedSession:V});if(Z.lastError=J.lastError,Z.authFailureMessage=J.authFailureMessage,Z.entitlementFailure=J.entitlementFailure,Z.sawRateLimit=J.sawRateLimit,Z.sawTransientFailure=J.sawTransientFailure,Z.sawNetworkError=J.sawNetworkError,oe=J.upstreamSpan,J.response!==void 0)return W=J.holdsAccountAdmission===!0,J.response;if(J.continueLoop){Oe&&J.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${J.retryDelayMs}ms after auth refresh`),await Hu(J.retryDelayMs));continue e}}if(!Q.ok){const J=await dan({response:Q,account:fe,accountState:De,enabledAccounts:D,orderedAccounts:U,tracer:s,requestStartTime:i,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,lastError:Z.lastError,authFailureMessage:Z.authFailureMessage,sawTransientFailure:Z.sawTransientFailure,invalidRequestFailure:Z.invalidRequestFailure,entitlementFailure:Z.entitlementFailure,allowConfiguredModelFallback:R});if(Z.lastError=J.lastError,Z.authFailureMessage=J.authFailureMessage,Z.sawTransientFailure=J.sawTransientFailure,Z.invalidRequestFailure=J.invalidRequestFailure,Z.entitlementFailure=J.entitlementFailure,J.response!==void 0)return J.response;if(J.continueLoop){if(J.retrySameAccount&&Ye<RF){Ye+=1;const se=uce(Ye);p.always(`[proxy] retrying same account=${fe.label} after transient upstream ${Q.status} (${Ye}/${RF}) in ${se}ms`),await Hu(se);continue}J.retrySameAccount&&p.always(`[proxy] exhausted transient same-account retries for account=${fe.label}; rotating`),Oe&&J.retryDelayMs&&(p.always(`[proxy] pacing cross-account overload rotation for ${J.retryDelayMs}ms`),await Hu(J.retryDelayMs));continue e}break e}if(De.coolingUntil&&Date.now()>=De.coolingUntil){const J=De.coolingUntil;De.coolingUntil=void 0,De.coolingReason=void 0,Kg(fe.key,J).catch(()=>{})}const ce=await Csr({ctx:t,body:r,account:fe,accountState:De,response:Q,tracer:s,requestStartTime:i,fetchStartMs:Te.fetchStartMs,attemptNumber:Z.attemptNumber,finalBodyStr:Te.finalBodyStr,upstreamSpan:oe,logAttempt:Ae,logProxyBody:E,logFinalRequest:_,onStreamTerminal:Y.release,poolAccounts:D});if("retryNextAccount"in ce){ce.failure&&(Z.lastError=ce.failure.message,Z.sawRateLimit||=ce.failure.rateLimit,Z.sawTransientFailure||=!ce.failure.rateLimit,Oe&&ce.failure.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${ce.failure.retryDelayMs}ms`),await Hu(ce.failure.retryDelayMs)));continue e}return W=ce.holdsAccountAdmission===!0,V&&ce.served&&V(fe.key),ce.response}finally{W||Y.release()}}}}finally{Ue?.lease.release(),Z.attemptNumber===0&&ke?.end()}if(gan(Z)){let xe;const fe=await wsr({body:r,logFinalRequest:_});if(fe)return fe;const Oe=await Esr({ctx:t,body:r,parsedFallbackRequest:k,fallbackPlan:A,modelRouter:n,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(Oe.response)return Oe.response;if(Oe.invalidRequestFailure)return ace({tracer:s,requestStartTime:i,authFailureMessage:null,authCooldownMessage:null,invalidRequestFailure:Oe.invalidRequestFailure,entitlementFailure:null,scopedExhaustion:null,sawNetworkError:!1,sawTransientFailure:!1,sawRateLimit:!1,lastError:void 0,orderedAccounts:[],buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_});xe=Oe.lastErrorMessage;let De=Oe.terminalFailure;if(Z.invalidRequestFailure===null&&!Z.sawRateLimit&&!t.abortSignal?.aborted&&De?.retryable!==!1&&n?.isAutoFallbackEnabled?.()){const Ye=await tan({ctx:t,body:r,tracer:s,requestStartTime:i,logProxyBody:E,logFinalRequest:_});if(Ye.response)return Ye.response;xe=Ye.lastErrorMessage??xe,De=Ye.terminalFailure??De}if(De)return Ssr({failure:De,buildLoggedClaudeError:w,tracer:s,requestStartTime:i});Z.fallbackFailureMessage=xe}{const xe=U[0],fe=xe?mc.get(xe.key):void 0;ax(t,{quota:fe?.quota??null,source:fe?.quota?"snapshot":"none",...xe?{account:xe}:{},...fe?{accountState:fe}:{},attempt:Z.attemptNumber,poolAccounts:D})}return ace({tracer:s,requestStartTime:i,authFailureMessage:Z.authFailureMessage,authCooldownMessage:Z.authCooldownMessage,invalidRequestFailure:Z.invalidRequestFailure,entitlementFailure:Z.entitlementFailure,scopedExhaustion:Z.scopedExhaustion,sawNetworkError:Z.sawNetworkError,sawTransientFailure:Z.sawTransientFailure,sawRateLimit:Z.sawRateLimit,lastError:Z.lastError,lastTransportErrorCode:Z.lastTransportErrorCode,lastTransportScope:Z.lastTransportScope,fallbackFailureMessage:Z.fallbackFailureMessage,orderedAccounts:U,buildLoggedClaudeError:w,logProxyBody:E,logFinalRequest:_})}function Rsr(e){return e!==void 0&&"runtimeConfigProvider"in e&&typeof e.runtimeConfigProvider=="function"}function Msr(e){const{ctx:t,body:r,status:n,message:o,errorType:s}=e;return gw(t.requestId)||(qg(n,Nae,Lae,{requestId:t.requestId,errorType:s,terminalOutcome:"handler_error",message:o}),Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:typeof r?.model=="string"?r.model:"",stream:r?.stream??!1,toolCount:Array.isArray(r?.tools)?r.tools.length:0,account:Nae,accountType:Lae,responseStatus:n,responseTimeMs:0,errorType:s,errorMessage:o})),Li(n,o)}function lce(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?Math.round(e*1e3):null}function Tan(e){if(!e||typeof e!="object")return null;const t={...e};return t.sessionResetAtMs=lce(t.sessionResetAt),t.weeklyResetAtMs=lce(t.weeklyResetAt),Array.isArray(t.windows)&&(t.windows=t.windows.map(r=>{const n={...r};return n.resetsAtMs=lce(n.resetsAt),n.severity=n.severity??(n.status==="rejected"?"critical":"normal"),n.isActive=n.isActive??!1,n})),t}function qF(e){return e==="allowed"?"ok":e==="rejected"||e==="throttled"?"degraded":"unknown"}function wan(e,t="",r="fill-first",n=!1,o,s){const i=Rsr(s)?s.accountAllowlist:s,a=Rsr(s)?s.runtimeConfigProvider:void 0;return{prefix:`${t}/v1`,routes:[{method:"POST",path:`${t}/v1/messages`,handler:async c=>{const l=a?.()??{generation:0,strategy:r,modelRouter:e,passthrough:n,primaryAccountKey:o,accountAllowlist:i,quotaRoutingEnabled:Xae(),sessionSoftLimit:Zae(),sessionResetToleranceMs:lx(),useOverage:"auto",accountRanking:"expiry-first",preferPrimary:!1,sessionAffinity:!1,sessionAffinityIdleTtlMs:36e5,spillInflight:0};Qae(l.useOverage);const u=l.modelRouter,d=c.body;if(typeof d?.model!="string"||!Array.isArray(d?.messages))return Msr({ctx:c,body:d,status:400,message:"Missing required fields: model, messages",errorType:"invalid_request_error"});const m=d.model.toLowerCase();if(!u&&!m.startsWith("claude-"))return Msr({ctx:c,body:d,status:404,message:`Model '${d.model}' is not an Anthropic model. The proxy only supports Claude models. Use a model router to route non-Claude models to other providers.`,errorType:"not_found_error"});const h=u?.resolve(d.model)??{provider:"anthropic",model:d.model},f=JSON.stringify(d),{tracer:g,requestStartTime:y,logProxyBody:v,logFinalRequest:w,buildLoggedClaudeError:E,setRoutingDecision:_}=man({ctx:c,body:d,clientRequestBody:f});try{return h.provider===null?(g?.setError("not_found_error",`Model '${d.model}' is not a Claude model.`),g?.end(404,Date.now()-y),E(404,`Model '${d.model}' is not a Claude model. Use a model router to route it to another provider.`)):h.provider==="anthropic"?(g?.setMode("passthrough"),l.passthrough?await Oin({ctx:c,body:d,clientRequestBody:f,tracer:g,requestStartTime:y,logProxyBody:v,logFinalRequest:w}):await van({ctx:c,body:d,modelRouter:u,configGeneration:l.generation,tracer:g,requestStartTime:y,accountStrategy:l.strategy,primaryAccountKey:l.primaryAccountKey,accountAllowlist:l.accountAllowlist,quotaRoutingEnabled:l.quotaRoutingEnabled,sessionSoftLimit:l.sessionSoftLimit,sessionResetToleranceMs:l.sessionResetToleranceMs,ranking:l.accountRanking,preferPrimary:l.preferPrimary,sessionAffinityEnabled:l.sessionAffinity,sessionAffinityIdleTtlMs:l.sessionAffinityIdleTtlMs,spillInflight:l.spillInflight,buildLoggedClaudeError:E,logProxyBody:v,logFinalRequest:w,setRoutingDecision:_})):await Din({ctx:c,body:d,route:{provider:h.provider,model:h.model},modelRouter:u,tracer:g,requestStartTime:y,logProxyBody:v})}catch(C){if(c.abortSignal?.aborted)return new Response(JSON.stringify(E(499,"Client cancelled request","client_cancelled")),{status:499,headers:{"content-type":"application/json"}});const k=C instanceof _r?C:Xc(C);if(k){C instanceof _r&&C.evidence&&(c.metadata.contextPreflight=C.evidence);const R=E(k.status,k.message,k.code,{errorCode:k.code,retryable:!1});return new Response(JSON.stringify({...R,error:{...R.error,code:k.code,retryable:!1}}),{status:k.status,headers:{"content-type":"application/json"}})}const A=C instanceof Error?C.message:String(C);if(p.error(`[claude-proxy] Generation error for ${d.model}: ${A}`),g?.setError("generation_error",A.slice(0,500)),g?.end(502,Date.now()-y),h.provider==="anthropic")throw C;return E(502,`Generation failed: ${C instanceof Error?C.message:"unknown error"}`)}},description:"Claude-compatible messages endpoint routed through NeuroLink",tags:["claude-proxy","messages"],streaming:{enabled:!0,contentType:"text/event-stream"}},{method:"POST",path:`${t}/peer/heartbeat`,handler:async c=>{const l=c.headers["x-neurolink-share-token"],u=c.headers["x-neurolink-grant-id"];if(!l||!u)return{ok:!1,stop:!0,reason:"no grant identified"};const d=await ese(u);if(!d||!d.leaseSecret||!Hin(d.leaseSecret,l))return{ok:!1,stop:!0,reason:"grant not recognized"};if(d.level!=="complete")return{ok:!1,stop:!0,reason:"grant is not a complete share"};if(d.state!=="active")return{ok:!1,stop:!0,reason:d.state};const m=c.body,h=Number(m?.coinsSpent??0);Number.isFinite(h)&&h>0&&await jin(d,h);const f=await Gin(d,Number.isFinite(h)?h:0);return f.paused?(p.always(`[proxy] auto-paused share ${d.peerLabel}: ${f.detail}`),{ok:!1,stop:!0,reason:"usage drift"}):{ok:!0,lease:yor(d)}},description:"Complete-share heartbeat: report spend, renew the lease",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/handshake`,handler:async c=>{const l=await sy(c.headers);return oy(l)?l.body:{ok:!0,protocol:Vin,capabilities:Win,grant:{peerLabel:l.grant.peerLabel,level:l.grant.level,state:l.grant.state,ledger:l.grant.entitlement.ledger}}},description:"Peer handshake: protocol version, capabilities, grant state",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/provision`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;if(l.grant.state!=="active")return Rw(l.grant.state==="paused"?"paused":"revoked",{status:403,grant:l.grant}).body;if(l.grant.level!=="complete")return{type:"error",error:{type:"invalid_request_error",message:"This is a live share. Ask the lender to run `neurolink proxy share level --to complete` first."}};const u=c.body,d=await msn({grantId:l.grant.id,codeChallenge:String(u?.codeChallenge??""),state:String(u?.state??"")});return d.ok!==!0?{type:"error",error:{type:"invalid_request_error",message:d.reason}}:(p.always(`[proxy] ${l.grant.peerLabel} asked to be provisioned \u2014 run \`neurolink proxy share provision --peer ${l.grant.peerLabel}\``),{ok:!0,status:"pending",expiresAt:d.request.expiresAt})},description:"Lodge a PKCE challenge for a resident credential (complete shares)",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/provision`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=await psn(l.grant.id);if(u.status!=="ready")return{ok:!0,status:u.status};const d=await qKr();return{ok:!0,status:"ready",claim:von({grant:l.grant,lenderName:"lender",...d?{lenderUrl:d}:{},code:u.code,state:u.state})}},description:"Collect the authorization code the lender produced",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/receipts`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=Number(c.query?.since??0);return{ok:!0,receipts:await hYt(l.grant.id,Number.isFinite(u)?u:0)}},description:"Collect signed receipts for this grant's settled charges",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/net`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=l.grant.receiptSecret;if(!u)return{type:"error",error:{type:"invalid_request_error",message:"This grant predates receipts and cannot be netted. Ask the lender to re-issue it."}};const d=c.body,m=Number(d?.consumedByYou??NaN),h=Number(d?.alreadyNetted??NaN);return!Number.isFinite(m)||!Number.isFinite(h)?{type:"error",error:{type:"invalid_request_error",message:"A netting claim needs both cumulative totals."}}:S2({consumedByYou:m,alreadyNetted:h,grantId:l.grant.id},String(d?.signature??""),u)?{ok:!0,...await fYt({grantId:l.grant.id,consumedFromPeer:m,peerAlreadyNetted:h})}:Rw("unknown_token",{status:401}).body},description:"Settle one round of reciprocal netting against this grant",tags:["claude-proxy","sharing"]},{method:"POST",path:`${t}/peer/note`,handler:async c=>{const l=c.body,u=vsn(String(l?.note??""));if(!u)return{type:"error",error:{type:"invalid_request_error",message:"That is not a NeuroLink coin note."}};const d=await JKr();if(!l?.redeem)return{ok:!0,...await Tsn(u,d)};const m=await sy(c.headers);if(oy(m))return m.body;if(m.grant.entitlement.ledger!=="coins")return{type:"error",error:{type:"invalid_request_error",message:"This grant is unlimited \u2014 there is no balance to redeem into."}};const h=await wsn({note:u,grantId:m.grant.id,secret:d});return h.ok!==!0?{ok:!1,status:h.status,error:{type:"invalid_request_error",message:`That note is ${h.status}.`}}:{ok:!0,status:"redeemed",coins:h.coins,balance:h.balance??null}},description:"Check or redeem a transferable coin note",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/peer/limits`,handler:async c=>{const l=await sy(c.headers);if(oy(l))return l.body;const u=a?.();return{ok:!0,...await Kin(l.grant,u?.accountAllowlist??i)}},description:"Peer limits: remaining coins, slice left, whether the grant can be served",tags:["claude-proxy","sharing"]},{method:"GET",path:`${t}/v1/models`,handler:async c=>{const l=a?a().modelRouter:e;return dt({name:"neurolink.http.claudeProxy.listModels",tracer:Be.http,attributes:{"http.route":`${t}/v1/models`}},async()=>Vnn(l))},description:"List available models (Anthropic schema)",tags:["claude-proxy","models"]},{method:"POST",path:`${t}/v1/messages/count_tokens`,handler:async c=>dt({name:"neurolink.http.claudeProxy.countTokens",tracer:Be.http,attributes:{"http.route":`${t}/v1/messages/count_tokens`}},async l=>{const u=c.body;if(typeof u?.model!="string"||!Array.isArray(u?.messages))return Li(400,"Missing required fields: model, messages");const d=u.messages.map(h=>typeof h.content=="string"?h.content:JSON.stringify(h.content)).join(" "),m=Math.ceil(d.length/4);return l.setAttribute("ai.model",u.model),l.setAttribute("gen_ai.usage.input_tokens",m),{input_tokens:m}}),description:"Count tokens for a messages request",tags:["claude-proxy","tokens"]},{method:"GET",path:`${t}/limits`,handler:async c=>{if(_w())return Rw("no_capacity",{status:403,message:"This proxy does not expose pool limits to peers. Use GET /peer/limits for what your grant may still do."}).body;const l=a?.(),u=l?.accountAllowlist??i;Qae(l?.useOverage);const d=c.query?.snapshot==="true"||c.query?.snapshot==="1",m=c.query?.account;return dt({name:"neurolink.http.claudeProxy.limits",tracer:Be.http,attributes:{"http.route":`${t}/limits`}},async()=>!d&&!m?(OF||(OF=Yae({accountAllowlist:u}).finally(()=>{OF=null})),OF):Yae({accountAllowlist:u,accountFilter:m,snapshotOnly:d}))},description:"Fetch fresh per-account limits from Anthropic (usage API). ?account=<label> for one account, ?snapshot=true for stored state",tags:["claude-proxy","limits"]},{method:"GET",path:`${t}/accounts`,handler:async c=>{const l=a?.(),u=l?.accountAllowlist??i,d=l?.primaryAccountKey??o,m=P=>!!d&&!!P&&Uoe(P,d),h=c.query?.refresh==="true";h&&Qae(l?.useOverage);let f={fetchedAt:Date.now(),snapshot:!h,results:[]},g=null;try{f=await Yae({accountAllowlist:u,snapshotOnly:!h})}catch(P){g=P instanceof Error?P.message:String(P)}const{getUsageSnapshot:y}=await Promise.resolve().then(()=>(hA(),GJt)),v=y().stats.accounts,w=Date.now();let E={};try{E=await NA()}catch{}const _=P=>{if(!P)return!1;const F=E[P]?.coolingUntil;return typeof F=="number"&&F>w};let C=new Map,k=null,A="";try{const{readAccountUsage:P,currentUsageDate:F}=await Promise.resolve().then(()=>(wJr(),RYt));A=F(),C=await P(A)}catch(P){k=P instanceof Error?P.message:String(P)}const R=new Map;for(const[P,F]of Object.entries(v)){const N=krr(F.label,F.type,F.key??P).key??P,q=R.get(N);(!q||F.key&&!q.key)&&R.set(N,{...F,identityKey:N})}let I;try{I=await ain()}catch{I=null}const M=[],D=new Set;for(const P of f.results){const F=P.account;D.add(P.key);const $=R.get(P.key),N=Tan(P.quota),q=_(P.key??null);M.push({label:F,key:P.key??null,provider:P.provider,kind:"account",type:P.type??$?.type??"oauth",status:q?"cooling":qF(N?.weeklyStatus)==="degraded"||qF(N?.sessionStatus)==="degraded"?"exhausted":"active",cooling:q,allowed:null,expired:null,isPrimary:m(P.key??F),requests:$?$.successCount+$.errorCount:null,errors:$?.errorCount??null,rateLimits:$?.rateLimitCount??null,quotaRateLimits:$?.quotaRateLimitCount??null,quota:N?{...N,sessionHealth:qF(N.sessionStatus),weeklyHealth:qF(N.weeklyStatus)}:null,usage:C.get(P.key)??null})}for(const P of R.values()){const F=krr(P.label,P.type,P.identityKey);if(F.key!==null&&D.has(F.key))continue;const $=F.provider!=="other";$&&F.key!==null&&I!==null&&!I.has(F.key)||M.push({label:P.label,key:$?F.key:null,...$?{provider:F.provider}:{},kind:$?"account":P.type==="translation"?"translation":"internal",type:F.provider==="codex"?"oauth":P.type,status:$?"unrouted":null,cooling:!1,allowed:null,expired:null,isPrimary:$?m(F.key):!1,requests:P.successCount+P.errorCount,errors:P.errorCount,rateLimits:P.rateLimitCount,quotaRateLimits:P.quotaRateLimitCount,quota:null,usage:F.key!==null?C.get(F.key)??null:null})}return{generatedAt:Date.now(),usageDate:A,quotaFromSnapshot:!h,usageError:k,quotaError:g,costBasis:"api-equivalent",accounts:M}},description:"One row per account: status, quota, and today's tokens and API-equivalent cost. ?refresh=true forces a live quota fetch",tags:["claude-proxy","accounts"]}]}}function Fa(e){const t=mc.get(e);if(t)return t;const r={consecutiveRefreshFailures:0,permanentlyDisabled:!1};return mc.set(e,r),r}function Ean(e){const t=Fa(e.key),r=t.lastToken!==e.token||t.lastRefreshToken!==e.refreshToken,n=t.permanentlyDisabled;n&&p.always(`[proxy] account=${e.label} is enabled in the token store; clearing stale runtime auth-disable state`),t.permanentlyDisabled=!1,(r||n)&&(t.consecutiveRefreshFailures=0),t.lastToken=e.token,t.lastRefreshToken=e.refreshToken}async function gm(e,t,r){try{const{tokenStore:n}=await Promise.resolve().then(()=>(zg(),qoe)),o=e.persistTarget&&typeof e.persistTarget!="string"&&"providerKey"in e.persistTarget?e.persistTarget.providerKey:void 0;if(o){if(!await n.markDisabledIfCurrent(o,{accessToken:e.token,refreshToken:e.refreshToken,expiresAt:e.expiresAt??0},r))return t.permanentlyDisabled=!1,p.always(`[proxy] account=${e.label} credentials changed while authentication was in flight; ignored stale disable`),!1}else await n.markDisabled(e.key,r)}catch(n){p.debug(`[proxy] failed to persist disabled state for ${e.label}: ${n instanceof Error?n.message:String(n)}`)}return t.permanentlyDisabled=!0,p.always(r==="entitlement_blocked"?`[proxy] account=${e.label} disabled: the organization blocks Claude Code OAuth. Ask an admin to re-enable it, then run: neurolink auth enable ${e.key}`:`[proxy] account=${e.label} disabled until re-authentication. Run: neurolink auth login anthropic --method oauth`),!0}async function GF(e,t){t.consecutiveRefreshFailures+=1;const r=Math.min(t.consecutiveRefreshFailures-1,4),n=Math.min(zsn,Bsn*2**r),o=Date.now()+n;(!t.coolingUntil||o>t.coolingUntil)&&(t.coolingUntil=o,t.coolingReason="auth");const s=t.coolingUntil??o,i=t.coolingReason??"auth";return t.coolingUntil=s,t.coolingReason=i,await Gu(e.key,s,i).catch(()=>{}),s}async function jF(e,t){if(t.consecutiveRefreshFailures=0,t.coolingReason!=="auth"||!t.coolingUntil)return;const r=t.coolingUntil;t.coolingUntil=void 0,t.coolingReason=void 0,await Kg(e.key,r).catch(()=>{})}function HF(e){return`Account(s) require re-authentication: ${Array.isArray(e)?e.join(", "):e}. Run: neurolink auth login anthropic --method oauth`}function Cr(e,t=180){const r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t)}...`}function uce(e){const t=Math.min(Math.max(e-1,0),Fae.length-1);return Fae[t]??0}function Psr(e){const t=Math.min(Math.max(e-1,0),Kor.length-1);return Dsr(Kor[t]??250)}async function Hu(e){await new Promise(t=>setTimeout(t,e))}function Dsr(e){return e+Math.floor(Math.random()*e*.25)}function dx(e){if(!e||typeof e!="object")return;const t=e.code;if(typeof t=="string")return t;const r=e.cause;if(!r||typeof r!="object")return;const n=r.code;return typeof n=="string"?n:void 0}function Yl(e){const t=e instanceof Error?e.message:String(e);if(!e||typeof e!="object")return t;const r=e.cause,n=r instanceof Error?r.message:r&&typeof r=="object"?String(r.message??""):"",s=[dx(e),n&&n!==t&&n].filter(Boolean).join(": ");return s?`${t} (${s})`:t}function Osr(e){const t=new Set;let r=e;for(;r&&typeof r=="object"&&!t.has(r);){t.add(r);const n=r;if(n.syscall==="connect")return!0;if(Array.isArray(n.errors)&&n.errors.length>0)return n.errors.every(o=>o!==null&&typeof o=="object"&&o.syscall==="connect");r=n.cause}return!1}function dce(e){if(Osr(e))return!0;const t=dx(e);return t!==void 0&&["ECONNREFUSED","EADDRNOTAVAIL","ENOTFOUND","EAI_AGAIN","EHOSTUNREACH","UND_ERR_CONNECT_TIMEOUT","UND_ERR_CONNECT"].includes(t)}function San(e){const t=dx(e);return t==="ENOTFOUND"||t==="EAI_AGAIN"?"shared_provider_transport":"connection_transport"}var ban=new Set([408,500,502,503,504,520,521,522,523,524,525,526,529]);function Vu(e){try{const t=JSON.parse(e);if(t&&t.type==="error"&&t.error&&typeof t.error=="object"){const r=t.error.details?.error_code;return{errorType:typeof t.error.type=="string"?t.error.type:void 0,message:typeof t.error.message=="string"?t.error.message:void 0,...typeof r=="string"?{errorCode:r}:{}}}}catch{}return{}}function _an(e,t){return e===422?!0:Vu(t).errorType==="invalid_request_error"||t.includes("invalid_request_error")}function Can(e,t){if(e!==404)return!1;const r=Vu(t);return r.errorType==="not_found_error"&&(r.message??"").toLowerCase().includes("model")}function kan(e,t){if(e!==400)return!1;const r=Vu(t);if(r.errorType!=="invalid_request_error")return!1;const n=(r.message??"").toLowerCase();return n.includes("beta")&&n.includes("subscription")&&n.includes("available")}var Nsr=new Set(["oauth_not_allowed_for_organization","oauth_not_allowed","organization_disabled"]);function mce(e,t){if(e!==401&&e!==402&&e!==403)return!1;const r=Vu(t);return r.errorType==="permission_error"?!0:r.errorCode!==void 0&&Nsr.has(r.errorCode)}function Lsr(e,t){if(!mce(e,t))return!1;const r=Vu(t);return r.errorCode!==void 0&&Nsr.has(r.errorCode)}function Aan(e){return{...e,messages:e.messages.map(t=>typeof t.content!="string"?t:{...t,content:[{type:"text",text:t.content}]})}}var Fsr=oor;function $sr(e,t){if(ban.has(e))return!0;if(e!==400)return!1;const r=Vu(t);if(r.errorType==="overloaded_error")return!0;if(r.errorType!=="api_error")return!1;const n=(r.message??t).toLowerCase();return n.includes("<!doctype html")||n.includes("error code 520")||n.includes("web server is returning an unknown error")||n.includes("cloudflare")||n.includes("internal server error")}function xan(e,t){return e===529||Vu(t).errorType==="overloaded_error"}var Ian=500;function $w(e){return cr(e,Ian)}jt(),G();var Ran=55669,Man="generateContent",Usr="streamGenerateContent";function Pan(e){const r=e.split("?")[0].replace(/\/+$/,"").split("/").pop()??"",n=r.lastIndexOf(":");return n===-1?{modelId:r,action:void 0}:{modelId:r.slice(0,n),action:r.slice(n+1)}}function Dan(e){return{model:e.model,maxTokens:e.maxTokens??4096,temperature:e.temperature,topP:e.topP,systemPrompt:e.systemPrompt,stream:e.stream,prompt:e.prompt,images:e.images,conversationMessages:e.conversationMessages,tools:e.tools,stopSequences:e.stopSequences}}function Oan(e,t="",r=Ran,n){return{prefix:`${t}/v1beta`,routes:[{method:"POST",path:`${t}/v1beta/models/:model`,description:"Gemini-compatible generateContent / streamGenerateContent (translation mode)",handler:async o=>{const s=n?n().modelRouter:e,i=Date.now(),{modelId:a,action:c}=Pan(o.path);if(!a||c!==Man&&c!==Usr)return $ie(404,`Unsupported Gemini endpoint: ${o.path}`,"NOT_FOUND");const l=o.body;if(!l||!Array.isArray(l.contents)||l.contents.length===0)return $ie(400,"Request must include a non-empty 'contents' array");const u=c===Usr,d=s?s.resolve(a):{provider:null,model:a},m=d.provider??void 0,h=d.model??a;p.debug(`[proxy:gemini] ${a} \u2192 ${m??"auto"}/${h}`);const f=Trn(h,l,u),g=Dan(f),v=Ow({provider:m??"auto",model:h},s?.getFallbackChain()??[],a,g,s?.isAutoFallbackEnabled?.()??!1).attempts;let w;try{w=VA.startRequest({requestId:o.requestId,method:o.method,path:o.path,model:a,stream:u,toolCount:Object.keys(f.tools).length,clientApp:"gemini-compat",userAgent:o.headers["user-agent"]??"",provider:m??"google-ai"},o.headers),w.setMode("full")}catch{}try{return u?await _F({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:v,tracer:w,requestStartTime:i}):await CF({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:v,tracer:w,requestStartTime:i})}catch(E){const _=E instanceof Error?E.message:String(E),C=cr(_);return p.always(`[proxy:gemini] request failed: ${C}`),w?.setError("generation_error",C),w?.end(500,Date.now()-i),$ie(500,"Internal proxy error","INTERNAL")}}}]}}Dr(),pr();function pce(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId??""}},()=>r(n))}function Bsr(e="/api"){return{prefix:`${e}/health`,routes:[{method:"GET",path:`${e}/health`,handler:pce("neurolink.http.health.check",`${e}/health`,async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:process.uptime()*1e3,version:process.env.npm_package_version||"unknown"})),description:"Basic health check",tags:["health"]},{method:"GET",path:`${e}/health/live`,handler:pce("neurolink.http.health.live",`${e}/health/live`,async()=>({status:"alive",timestamp:new Date().toISOString()})),description:"Kubernetes liveness probe",tags:["health"]},{method:"GET",path:`${e}/health/ready`,handler:t=>dt({name:"neurolink.http.health.ready",tracer:Be.http,attributes:{"http.route":`${e}/health/ready`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools(),o=n.length>0,s=!!t.externalServerManager;let i=!0;if(t.externalServerManager){const c=t.externalServerManager.getServerStatuses();for(const l of c)if(l.status!=="connected"){i=!1;break}}const a=o||!s||i;return r.setAttribute("health.ready",a),r.setAttribute("health.tools_count",n.length),r.setAttribute("health.external_servers_ready",i),{ready:a,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:o,externalServers:i}}}),description:"Kubernetes readiness probe",tags:["health"]},{method:"GET",path:`${e}/health/startup`,handler:t=>dt({name:"neurolink.http.health.startup",tracer:Be.http,attributes:{"http.route":`${e}/health/startup`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools();return r.setAttribute("health.tools_count",n.length),{started:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,toolsLoaded:n.length,externalServerManager:!!t.externalServerManager}}}),description:"Kubernetes startup probe",tags:["health"]},{method:"GET",path:`${e}/health/detailed`,handler:t=>dt({name:"neurolink.http.health.detailed",tracer:Be.http,attributes:{"http.route":`${e}/health/detailed`,"http.request.id":t.requestId??""}},async r=>{const n=await t.toolRegistry.listTools(),o={};for(const l of n){const u=typeof l.source=="string"?l.source:l.serverId||"built-in";o[u]=(o[u]||0)+1}const s=[];if(t.externalServerManager){const l=t.externalServerManager.getServerStatuses();for(const u of l)s.push({name:u.serverId,status:u.status,toolCount:u.toolCount})}const i=t.neurolink.conversationMemory,a={available:!!i,type:i?.constructor.name||"none"},c={status:"ok",timestamp:new Date().toISOString(),uptime:process.uptime()*1e3,version:process.env.npm_package_version||"unknown",node:{version:process.version,platform:process.platform,arch:process.arch},memory:{...a,process:{heapUsed:Math.round(process.memoryUsage().heapUsed/1024/1024),heapTotal:Math.round(process.memoryUsage().heapTotal/1024/1024),rss:Math.round(process.memoryUsage().rss/1024/1024),external:Math.round(process.memoryUsage().external/1024/1024)}},tools:{total:n.length,bySource:o},externalServers:{count:s.length,servers:s}};if(t.metadata?.accountPool){const l=t.metadata.accountPool,u=l.getAllAccounts(),d={};for(const m of u)d[m.status]=(d[m.status]||0)+1;c.proxy={totalAccounts:u.length,statusDistribution:d,healthyCount:l.getHealthyCount(),strategy:l.getStrategy()},r.setAttribute("health.proxy.accounts",u.length),r.setAttribute("health.proxy.healthy",l.getHealthyCount())}return r.setAttribute("health.tools_count",n.length),r.setAttribute("health.external_servers_count",s.length),r.setAttribute("health.memory.heap_mb",Math.round(process.memoryUsage().heapUsed/1024/1024)),c}),description:"Detailed health information",tags:["health"]},{method:"GET",path:`${e}/version`,handler:pce("neurolink.http.version",`${e}/version`,async()=>({name:"@juspay/neurolink",version:process.env.npm_package_version||"unknown",node:process.version,timestamp:new Date().toISOString()})),description:"Get version information",tags:["health","version"]}]}}hA(),Lr(),jt(),G();var Nan=300*1e3,Lan=55669;function zsr(e){return e?{status:502,errorType:"loopback_stream_error",errorMessage:e}:{status:499,errorType:"client_cancelled",errorMessage:"Client cancelled the OpenAI-compatible stream"}}function VF(e,t){return new Response(JSON.stringify(Tnr(e,t)),{status:e,headers:{"content-type":"application/json"}})}function Fan(e){return{model:e.model,maxTokens:e.maxTokens??4096,temperature:e.temperature,topP:e.topP,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:void 0,stream:e.stream,prompt:e.prompt,images:e.images,conversationMessages:e.conversationMessages,tools:e.tools,toolChoice:e.toolChoice,toolChoiceName:e.toolChoiceName,stopSequences:e.stopSequences}}function $an(e,t){try{const r=VA.startRequest({requestId:e.requestId,method:e.method,path:e.path,model:t.model,stream:t.stream===!0,toolCount:t.tools?.length??0,provider:"openai-bridge",recordRequestMetrics:!0,recordUsageMetrics:!1,...jA(e.headers)},e.headers);return r.setMode("full"),r}catch{return}}function Uan(e,t,r){const n={"content-type":"application/json",accept:t?"text/event-stream":"application/json","x-neurolink-internal-request":r},o=Kie(e.requestId);o&&(n.traceparent=`00-${o.traceId}-${o.spanId}-${o.traceFlags.toString(16).padStart(2,"0")}`);for(const[s,i]of Object.entries(e.headers)){if(typeof i!="string")continue;const a=s.toLowerCase();(a.startsWith("anthropic-")||a==="x-api-key"||["user-agent","x-neurolink-session-id","x-claude-code-session-id","session_id","session-id","tracestate","baggage"].includes(a)||a==="traceparent"&&!n.traceparent)&&(n[a]=i)}return n}function Ban(e){const t=e?.servingModelStatus??"unavailable",r=e?.accountIdentityStatus??(e?.accountKey&&e.accountType!=="translation"&&e.account!=="unknown"?"observed":"unavailable");return{servingModelStatus:t,accountIdentityStatus:r}}async function zan(e,t,r,n,o,s){try{const i=await nd(e.json(),t),a=krn(i,r);return s.json(a,200),await n(200),a}catch(i){const a=t.aborted&&t.reason?.name!=="TimeoutError"?499:t.reason?.name==="TimeoutError"?504:502;return await n(a,{errorType:a===499?"client_cancelled":a===504?"loopback_timeout":"loopback_response_error",errorMessage:i instanceof Error?i.message:String(i)}),o(a,"Anthropic loopback failed")}}async function qan(e){const{ctx:t,body:r,targetModel:n,requestStartTime:o,loopbackPort:s,internalDispatch:i}=e,a=r.stream===!0,c=r.tools?.length??0,l=tor(t,r.model,a,o);l.request();const u=(E,_)=>(l.json(Tnr(E,_),E),VF(E,_)),d=drn(t.requestId),m=$an(t,r),h=new AbortController,f=AbortSignal.any([h.signal,AbortSignal.timeout(Nan),...t.abortSignal?[t.abortSignal]:[]]);let g=!1;const y=(E,_={})=>{if(g)return Promise.resolve();g=!0,d.dispose();const C=urn(t.requestId),{servingModelStatus:k,accountIdentityStatus:A}=Ban(C);return k==="observed"&&C?.model&&C.model!==r.model&&m?.setModelSubstitution(r.model,C.model,C.provider),_.errorType&&m?.setError(_.errorType,_.errorMessage??_.errorType),m?.end(E,Date.now()-o),gw(t.requestId)||(E>=400?qg(E,C?.account,C?.accountType,{requestId:t.requestId,errorType:_.errorType,message:_.errorMessage,terminalOutcome:E===499?"client_cancelled":_.errorType?.includes("stream")?"stream_error":"handler_error"}):dA(C?.account,C?.accountType)),Aw({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:C?.model??r.model,servingModelStatus:k,stream:a,toolCount:c,account:C?.account??"",accountKey:C?.accountKey,accountType:C?.accountType??"openai-bridge",accountIdentityStatus:A,requestedModel:r.model,provider:C?.provider,errorCode:C?.errorCode,transportScope:C?.transportScope,retryable:C?.retryable,accountingScope:"client",usageOwnerRequestId:d.requestId,...jA(t.headers),responseStatus:E,responseTimeMs:Date.now()-o,..._}).finally(()=>inr(t.requestId))},v=`http://127.0.0.1:${s}/v1/messages`;let w;try{f.throwIfAborted();const E=Crn(r);E.model=n;const C={method:"POST",headers:Uan(t,a,d.token),body:JSON.stringify({...E,stream:a}),signal:f};w=await nd(Promise.resolve(i?i(new Request(v,C)):fetch(v,C)),f)}catch(E){d.dispose();const _=t.abortSignal?.aborted?499:f.aborted?504:502;return h.abort(E),await y(_,{errorType:t.abortSignal?.aborted?"client_cancelled":_===504?"loopback_timeout":"loopback_exception",errorMessage:E instanceof Error?E.message:String(E)}),u(_,"Anthropic loopback failed")}if(!w.ok){const E=await nd(w.text(),f).catch(()=>""),_=cr(E);return p.always(`[proxy:openai] anthropic loopback error ${w.status}: ${_}`),await y(w.status,{errorType:"loopback_upstream_error",errorMessage:_}),u(w.status,_||`Anthropic loopback failed with status ${w.status}`)}if(a){if(!w.body)return await y(502,{errorType:"loopback_empty_stream",errorMessage:"Anthropic loopback returned empty stream body"}),u(502,"Anthropic loopback returned empty stream body");const E=l.accumulator("client_response","text/event-stream");let _;const k=w.body.pipeThrough(Arn(r.model,{onError:M=>{_=cr(M)}})).getReader(),A=async(M,D,U)=>{f.removeEventListener("abort",R),E.finish(M),await y(M,{errorType:D,errorMessage:U})},R=()=>{const M=_?zsr(_):{status:f.reason?.name==="TimeoutError"?504:499,errorType:f.reason?.name==="TimeoutError"?"loopback_timeout":"client_cancelled",errorMessage:"Anthropic loopback cancelled"};A(M.status,M.errorType,M.errorMessage),_t(k.cancel(f.reason),1e3,"Loopback cancellation timed out").catch(()=>{})};f.addEventListener("abort",R,{once:!0}),f.aborted&&R();const I=new ReadableStream({async pull(M){try{const{value:D,done:U}=await k.read();if(U){_?await A(502,"loopback_stream_error",_):await A(200),M.close();return}E.append(D),M.enqueue(D)}catch(D){const U=cr(D instanceof Error?D.message:String(D));await A(502,"loopback_stream_error",U),M.error(D)}},async cancel(M){const D=zsr(_),U=A(D.status,D.errorType,D.errorMessage);h.abort(M),await Promise.all([U,_t(k.cancel(M),1e3,"Loopback cancellation timed out").catch(()=>{})])}});return new Response(I,{status:200,headers:{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"}})}return zan(w,f,r.model,y,u,l)}function Gan(e,t="",r=Lan,n,o){return{prefix:`${t}/v1`,routes:[{method:"POST",path:`${t}/v1/chat/completions`,description:"OpenAI-compatible chat completions (translation mode)",handler:async s=>{const i=n?n().modelRouter:e,a=Date.now(),c=s.body;if(!c||!c.model||!c.messages?.length)return VF(400,"Request must include 'model' and 'messages' fields");const l=i?i.resolve(c.model):{provider:null,model:c.model},u=l.provider??void 0,d=l.model??c.model;if(p.debug(`[proxy:openai] ${c.model} \u2192 ${u??"auto"}/${d}`),l.provider==="anthropic")try{return await qan({ctx:s,body:c,targetModel:d,requestStartTime:a,loopbackPort:r,internalDispatch:o})}catch(v){const w=v instanceof Error?v.message:String(v),E=cr(w);p.always(`[proxy:openai] anthropic loopback failed: ${E}`);const _=s.abortSignal?.aborted?499:v instanceof Error&&"status"in v&&v.status===503?503:v instanceof Error&&v.name==="TimeoutError"?504:502;return gw(s.requestId)||qg(_,void 0,void 0,{requestId:s.requestId,errorType:_===499?"client_cancelled":"loopback_exception",message:E}),await Aw({timestamp:new Date().toISOString(),requestId:s.requestId,method:s.method,path:s.path,model:c.model,stream:c.stream===!0,toolCount:c.tools?.length??0,account:"",accountType:"openai-bridge",responseStatus:_,responseTimeMs:Date.now()-a,errorType:_===499?"client_cancelled":"loopback_exception",errorMessage:E}).finally(()=>inr(s.requestId)),VF(_,"Anthropic loopback failed")}const m=brn(c),h=Fan(m),g=Ow({provider:u??"auto",model:d},i?.getFallbackChain()??[],c.model,h,i?.isAutoFallbackEnabled?.()??!1).attempts;let y;try{y=VA.startRequest({requestId:s.requestId,method:s.method,path:s.path,model:c.model,stream:c.stream===!0,toolCount:Object.keys(m.tools).length,clientApp:"openai-compat",userAgent:s.headers["user-agent"]??"",provider:u??"openai-compatible"},s.headers),y.setMode("full")}catch{}try{return c.stream?_F({ctx:s,format:"openai",requestModel:c.model,parsed:m,attempts:g,tracer:y,requestStartTime:a}):await CF({ctx:s,format:"openai",requestModel:c.model,parsed:m,attempts:g,tracer:y,requestStartTime:a})}catch(v){const w=v instanceof Error?v.message:String(v),E=cr(w);return p.always(`[proxy:openai] request failed: ${E}`),y?.setError("generation_error",E),y?.end(500,Date.now()-a),VF(500,"Internal proxy error")}}},{method:"GET",path:`${t}/v1/models`,description:"List available models in OpenAI format",handler:async()=>{const s=n?n().modelRouter:e;return Hnn(s)}}]}}Yt(),en(),Dr(),pr(),tm();function iy(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId}},async o=>{const s=await r(n);if(s&&typeof s=="object"){const i=s.error;if(i!=null){const a=typeof i=="string"?i:typeof i?.message=="string"?i.message:"MCP handler error";o.setStatus({code:$e.ERROR,message:a})}}return s})}var jan=O.object({name:O.string().min(1,"Server name is required"),toolName:O.string().min(1,"Tool name is required")});async function Han(e){const t=e.externalServerManager;if(!t)return{servers:[],total:0,message:"External server manager not available",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}};const r=t.listServers(),n=t.getServerStatuses(),o=new Map(n.map(i=>[i.serverId,i])),s=r.map(i=>{const a=o.get(i.name);return{serverId:i.name,name:i.name,status:a?.status||"disconnected",toolCount:a?.toolCount||0,lastHealthCheck:a?.checkedAt?.toISOString(),error:a?.issues?.[0]}});return{servers:s,total:s.length,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Van(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);if(!n.listServers().find(u=>u.name===r))return Ut("SERVER_NOT_FOUND",`MCP server '${r}' not found`,void 0,e.requestId);const a=n.getServerStatuses().find(u=>u.serverId===r),l=(await e.toolRegistry.listTools()).filter(u=>u.source===r);return{serverId:r,name:r,status:a?.status||"disconnected",toolCount:a?.toolCount||0,tools:l.map(u=>({name:u.name,description:u.description})),lastHealthCheck:a?.checkedAt?.toISOString(),error:a?.issues?.[0],metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Wan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);try{if(!n.listServers().find(c=>c.name===r))return Ut("SERVER_NOT_FOUND",`Server '${r}' not found`,void 0,e.requestId);const a=n.getServerStatuses().find(c=>c.serverId===r);return{success:!0,server:{serverId:r,name:r,status:a?.status||"disconnected",toolCount:a?.toolCount||0},message:"Server status retrieved (full reconnect requires server restart)",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(o){return Ut("RECONNECT_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function Kan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return Ut("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);try{const o=await n.removeServer(r);return o.success?{success:!0,message:`Server '${r}' removed`,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("REMOVE_FAILED",o.error||"Failed to remove server",void 0,e.requestId)}catch(o){return Ut("REMOVE_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function Jan(e){const t=zl(jT,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,o=(await e.toolRegistry.listTools()).filter(s=>s.source===r);if(o.length===0){const s=e.externalServerManager;if(s&&!s.listServers().find(c=>c.name===r))return Ut("SERVER_NOT_FOUND",`MCP server '${r}' not found`,void 0,e.requestId)}return{serverId:r,tools:o.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema})),total:o.length,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}async function Yan(e){const t=zl(jan,e.params,e.requestId);if(!t.success)return t.error;const{name:r,toolName:n}=t.data,o=Fu(m2,e.body||{},e.requestId);if(!o.success)return o.error;const s=o.data,i=Date.now();try{return(await e.toolRegistry.listTools()).find(u=>u.name===n&&u.source===r)?{success:!0,data:await e.toolRegistry.executeTool(n,s),duration:Date.now()-i,metadata:{server:r,toolName:n,timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("TOOL_NOT_FOUND",`Tool '${n}' not found on server '${r}'`,void 0,e.requestId)}catch(a){return Ut("EXECUTION_FAILED",a instanceof Error?a.message:String(a),{duration:Date.now()-i},e.requestId)}}async function Xan(e){const t=e.externalServerManager;if(!t)return{healthy:!1,message:"External server manager not available",servers:[]};const n=t.getServerStatuses().map(i=>({name:i.serverId,healthy:i.isHealthy,error:i.issues?.[0]})),o=n.every(i=>i.healthy),s=n.some(i=>i.healthy);return{healthy:n.length===0||o,status:n.length===0?"no_servers":o?"all_healthy":s?"degraded":"unhealthy",servers:n,timestamp:new Date().toISOString()}}function qsr(e="/api"){return{prefix:`${e}/mcp`,routes:[{method:"GET",path:`${e}/mcp/servers`,handler:iy("neurolink.http.mcp.listServers",`${e}/mcp/servers`,Han),description:"List all MCP servers",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name`,handler:iy("neurolink.http.mcp.getServer",`${e}/mcp/servers/:name`,Van),description:"Get MCP server status",tags:["mcp"]},{method:"POST",path:`${e}/mcp/servers/:name/reconnect`,handler:iy("neurolink.http.mcp.reconnectServer",`${e}/mcp/servers/:name/reconnect`,Wan),description:"Reconnect to an MCP server",tags:["mcp"]},{method:"DELETE",path:`${e}/mcp/servers/:name`,handler:iy("neurolink.http.mcp.removeServer",`${e}/mcp/servers/:name`,Kan),description:"Remove an MCP server",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name/tools`,handler:iy("neurolink.http.mcp.listServerTools",`${e}/mcp/servers/:name/tools`,Jan),description:"List tools from a specific MCP server",tags:["mcp","tools"]},{method:"POST",path:`${e}/mcp/servers/:name/tools/:toolName/execute`,handler:iy("neurolink.http.mcp.executeTool",`${e}/mcp/servers/:name/tools/:toolName/execute`,Yan),description:"Execute a tool from a specific MCP server",tags:["mcp","tools"]},{method:"GET",path:`${e}/mcp/health`,handler:iy("neurolink.http.mcp.health",`${e}/mcp/health`,Xan),description:"Health check for all MCP servers",tags:["mcp","health"]}]}}Dr(),pr(),tm();function ay(e,t,r){return n=>dt({name:e,tracer:Be.http,attributes:{"http.route":t,"http.request.id":n.requestId}},()=>r(n))}async function Zan(e){const t=zl(Moe,e.params,e.requestId);if(!t.success)return t.error;const{id:r}=t.data,n=e.query.limit?parseInt(e.query.limit,10):50,o=e.query.offset?parseInt(e.query.offset,10):0,s=isNaN(n)||n<1?50:Math.min(n,100),i=isNaN(o)||o<0?0:o,a=e.neurolink.conversationMemory;if(!a)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{let c=[];if("getUserSessionHistory"in a){const d=e.query.userId||"default",m=await a.getUserSessionHistory(d,r);if(m===null)return Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId);c=m}else if("getSession"in a){const d=a.getSession(r);if(!d)return Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId);c=d.messages}else if("buildContextMessages"in a&&(c=await a.buildContextMessages(r),c.length===0))return Ut("SESSION_NOT_FOUND",`Session '${r}' not found or has no messages`,void 0,e.requestId);const l=c.length,u=c.slice(i,i+s);return{sessionId:r,messages:u,total:l,limit:s,offset:i,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(c){return Ut("MEMORY_ERROR",c instanceof Error?c.message:"Failed to get session messages",void 0,e.requestId)}}async function Qan(e){const t=zl(Moe,e.params,e.requestId);if(!t.success)return t.error;const{id:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{if("getUserSessionObject"in n){const o=e.query.userId||"default",s=await n.getUserSessionObject(o,r);return s===null?Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId):{session:s,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}else if("getSession"in n){const o=n.getSession(r);return o?{session:o,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}:Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId)}return Ut("MEMORY_ERROR","Session retrieval not supported for this memory type",void 0,e.requestId)}catch(o){return Ut("MEMORY_ERROR",o instanceof Error?o.message:"Failed to get session",void 0,e.requestId)}}async function ecn(e){const t=e.query.userId,r=e.query.limit?parseInt(e.query.limit,10):50,n=e.query.offset?parseInt(e.query.offset,10):0,o=isNaN(r)||r<1?50:Math.min(r,100),s=isNaN(n)||n<0?0:n,i=e.neurolink.conversationMemory;if(!i)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{let a=[];if("getUserAllSessionsHistory"in i&&t)a=await i.getUserAllSessionsHistory(t);else if("getUserSessions"in i&&t){const u=await i.getUserSessions(t);if("getUserSessionMetadata"in i){const d=u.map(h=>i.getUserSessionMetadata(t,h));a=(await Promise.all(d)).filter(h=>h!==null)}else a=u.map(d=>({id:d}))}else if("getStats"in i){const u=await i.getStats?.();return{sessions:[],total:u?.totalSessions||0,limit:o,offset:s,message:"Session listing not fully supported for in-memory storage. Use /stats endpoint for session counts.",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}const c=a.length;return{sessions:a.slice(s,s+o),total:c,limit:o,offset:s,metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(a){return Ut("MEMORY_ERROR",a instanceof Error?a.message:"Failed to list sessions",void 0,e.requestId)}}async function tcn(e){const t=e.neurolink.conversationMemory;if(!t)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{const r=await t.getStats?.();return{available:!0,type:t.constructor.name,stats:r||{message:"Statistics not available for this memory type"},timestamp:new Date().toISOString()}}catch(r){return Ut("MEMORY_ERROR",r instanceof Error?r.message:"Failed to get statistics",void 0,e.requestId)}}async function rcn(e){const t=zl(Roe,e.params,e.requestId);if(!t.success)return t.error;const{sessionId:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{return await n.clearSession?.(r)===!1?Ut("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId):{success:!0,sessionId:r,message:"Session cleared successfully",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(o){return Ut("MEMORY_ERROR",o instanceof Error?o.message:"Failed to clear session",void 0,e.requestId)}}async function ncn(e){const t=e.neurolink.conversationMemory;if(!t)return Ut("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{return await t.clearAllSessions?.(),{success:!0,message:"All sessions cleared successfully",metadata:{timestamp:new Date().toISOString(),requestId:e.requestId}}}catch(r){return Ut("MEMORY_ERROR",r instanceof Error?r.message:"Failed to clear sessions",void 0,e.requestId)}}async function ocn(e){const t=e.neurolink.conversationMemory;return{available:!!t,type:t?.constructor.name||"none",timestamp:new Date().toISOString()}}function Gsr(e="/api"){return{prefix:`${e}/memory`,routes:[{method:"GET",path:`${e}/memory/sessions/:id/messages`,handler:ay("neurolink.http.memory.getSessionMessages",`${e}/memory/sessions/:id/messages`,Zan),description:"Get messages for a session",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions/:id`,handler:ay("neurolink.http.memory.getSession",`${e}/memory/sessions/:id`,Qan),description:"Get session by ID",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions`,handler:ay("neurolink.http.memory.listSessions",`${e}/memory/sessions`,ecn),description:"List all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/stats`,handler:ay("neurolink.http.memory.stats",`${e}/memory/stats`,tcn),description:"Get memory statistics",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions/:sessionId`,handler:ay("neurolink.http.memory.clearSession",`${e}/memory/sessions/:sessionId`,rcn),description:"Clear a conversation session",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions`,handler:ay("neurolink.http.memory.clearAllSessions",`${e}/memory/sessions`,ncn),description:"Clear all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/health`,handler:ay("neurolink.http.memory.health",`${e}/memory/health`,ocn),description:"Check memory system health",tags:["memory","health"]}]}}G(),Dr(),pr();function scn(e="/api",t){return t||p.debug("[OpenAPI] createOpenApiRoutes called without getRoutes callback. Custom routes will not be documented in the OpenAPI spec."),{prefix:`${e}/openapi`,routes:[{method:"GET",path:`${e}/openapi.json`,handler:async()=>dt({name:"neurolink.http.openapi.json",tracer:Be.http,attributes:{"http.route":`${e}/openapi.json`,"openapi.format":"json"}},async r=>{const n=t?.()??[];return t?n.length===0&&p.debug("[OpenAPI] getRoutes returned empty array. No custom routes will be documented."):p.warn("[OpenAPI] No getRoutes callback provided. OpenAPI spec will use default endpoint definitions. Use registerAllRoutes(server, basePath, { enableSwagger: true }) to automatically include your routes."),r.setAttribute("openapi.route_count",n.length),new OA({basePath:e,routes:n}).generate()}),description:"Get OpenAPI specification as JSON",tags:["openapi","documentation"]},{method:"GET",path:`${e}/openapi.yaml`,handler:async()=>dt({name:"neurolink.http.openapi.yaml",tracer:Be.http,attributes:{"http.route":`${e}/openapi.yaml`,"openapi.format":"yaml"}},async r=>{const n=t?.()??[];return t?n.length===0&&p.debug("[OpenAPI] getRoutes returned empty array. No custom routes will be documented."):p.warn("[OpenAPI] No getRoutes callback provided. OpenAPI spec will use default endpoint definitions. Use registerAllRoutes(server, basePath, { enableSwagger: true }) to automatically include your routes."),r.setAttribute("openapi.route_count",n.length),{_raw:!0,contentType:"text/yaml",body:new OA({basePath:e,routes:n}).toYAML()}}),description:"Get OpenAPI specification as YAML",tags:["openapi","documentation"]},{method:"GET",path:`${e}/docs`,handler:async()=>dt({name:"neurolink.http.openapi.docs",tracer:Be.http,attributes:{"http.route":`${e}/docs`}},async()=>({_raw:!0,contentType:"text/html",body:`<!DOCTYPE html>
|
|
2341
2341
|
<html>
|
|
2342
2342
|
<head>
|
|
2343
2343
|
<title>NeuroLink API Documentation</title>
|
|
@@ -289,8 +289,10 @@ function drainAccountAdmissionWaiters(accountKey, state) {
|
|
|
289
289
|
* removed the waiter's cap — and uncapped arrivals count toward `active`, so
|
|
290
290
|
* that waiter would otherwise never drain. An uncapped request from an older
|
|
291
291
|
* snapshot (one that predates a reload adding the cap) or from the same one
|
|
292
|
-
* leaves waiters queued: their cap is still current. With no generation
|
|
293
|
-
*
|
|
292
|
+
* leaves waiters queued: their cap is still current. With no generation,
|
|
293
|
+
* which only direct callers such as test hooks pass (the route passes 0 from
|
|
294
|
+
* its fallback snapshot when no runtime config store is attached), there is
|
|
295
|
+
* nothing to compare against and nothing is admitted.
|
|
294
296
|
*/
|
|
295
297
|
function admitWaitersOfRemovedCap(accountKey, state, generation) {
|
|
296
298
|
if (generation === undefined) {
|
|
@@ -7068,8 +7070,8 @@ async function handleAnthropicRoutedClaudeRequest(args) {
|
|
|
7068
7070
|
});
|
|
7069
7071
|
}
|
|
7070
7072
|
const { accounts, enabledAccounts, orderedAccounts, bodyStr, requestStart, toolCount, url, clientHeaders, isClaudeClientRequest, sessionId, } = loadedAccounts;
|
|
7071
|
-
// Accounts this request sent an upstream attempt to
|
|
7072
|
-
// its admission cap is not among them.
|
|
7073
|
+
// Accounts this request sent an upstream attempt to or whose token refresh
|
|
7074
|
+
// failed; one skipped only for its admission cap is not among them.
|
|
7073
7075
|
const attemptedAccountKeys = new Set();
|
|
7074
7076
|
// Only fill-first over more than one account reads a binding (see
|
|
7075
7077
|
// selectClaudeProxyAccountOrder), so nothing else records one.
|
|
@@ -7233,6 +7235,9 @@ async function handleAnthropicRoutedClaudeRequest(args) {
|
|
|
7233
7235
|
!preparedAttempt.finalBodyStr ||
|
|
7234
7236
|
!preparedAttempt.preparedContext ||
|
|
7235
7237
|
preparedAttempt.fetchStartMs === undefined) {
|
|
7238
|
+
// A failed token refresh is this account failing the request, so a
|
|
7239
|
+
// session bound to it must not stay there when another one serves.
|
|
7240
|
+
attemptedAccountKeys.add(account.key);
|
|
7236
7241
|
if (transportPermit.probe) {
|
|
7237
7242
|
providerTransportCoordinator.reportProbeAbandoned(transportPermit);
|
|
7238
7243
|
}
|
package/dist/types/proxy.d.ts
CHANGED
|
@@ -1143,8 +1143,10 @@ export type QueuedAccountAdmission = {
|
|
|
1143
1143
|
/** One queued request waiting for per-account admission capacity. */
|
|
1144
1144
|
export type AccountAdmissionWaiter = {
|
|
1145
1145
|
capacity: number;
|
|
1146
|
-
/** Runtime-config generation of the snapshot the request queued under
|
|
1147
|
-
*
|
|
1146
|
+
/** Runtime-config generation of the snapshot the request queued under.
|
|
1147
|
+
* The route always passes one (0 from its fallback snapshot when no
|
|
1148
|
+
* runtime config store is attached); only direct callers such as test
|
|
1149
|
+
* hooks leave it absent. */
|
|
1148
1150
|
generation?: number;
|
|
1149
1151
|
resolve: (lease: AccountAdmissionLease) => void;
|
|
1150
1152
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "12.25.
|
|
3
|
+
"version": "12.25.2",
|
|
4
4
|
"packageManager": "pnpm@10.15.1",
|
|
5
5
|
"description": "The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002/call) for routing, tool selection and context budgeting. MCP-native (4 transports), voice TTS/STT/realtime, RAG, agents, memory, compaction, 9 observability exporters. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · TypeSafe Jev and more.",
|
|
6
6
|
"author": {
|