@juspay/neurolink 12.12.3 → 12.12.4
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 +2 -2
- package/dist/browser/neurolink.min.js +2 -2
- package/dist/proxy/codexFallback.d.ts +2 -2
- package/dist/proxy/codexFallback.js +4 -1
- package/dist/proxy/proxyConfig.js +45 -2
- package/dist/proxy/routingPolicy.js +3 -0
- package/dist/server/routes/claudeProxyRoutes.js +4 -3
- package/dist/types/codex.d.ts +5 -0
- package/dist/types/proxy.d.ts +1 -0
- package/dist/types/subscription.d.ts +3 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
## [12.12.
|
|
1
|
+
## [12.12.4](https://github.com/juspay/neurolink/compare/v12.12.3...v12.12.4) (2026-09-05)
|
|
2
2
|
|
|
3
3
|
### Bug Fixes
|
|
4
4
|
|
|
5
|
-
- **(
|
|
5
|
+
- **(proxy):** preserve Codex fallback reasoning effort ([2b0dfd4](https://github.com/juspay/neurolink/commit/2b0dfd4e16c263168951b3b744c6aacf0cf4187a))
|
|
6
6
|
|
|
7
7
|
## [11.2.3](https://github.com/juspay/neurolink/compare/v11.2.2...v11.2.3) (2026-08-19)
|
|
8
8
|
|
|
@@ -2285,7 +2285,7 @@ data: ${r}
|
|
|
2285
2285
|
`);if(h===-1){i.length>c&&(i="");return}const f=i.slice(0,h);i=i.slice(h+1);const g=NJt(f);g&&(a=g)}catch{}},flush(){try{const d=NJt(i);d&&(a=d)}catch{}n(a)},cancel(){n(a)}};return{stream:new TransformStream(l),usage:t}}var Yne=class extends Error{status;responseBody;constructor(e,t){super(`Codex fallback request returned HTTP ${e}`),this.name="CodexFallbackResponseError",this.status=e,this.responseBody=t}};function Tp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function FL(e){return typeof e=="string"&&e.length>0?e:void 0}function _Vr(e){if(typeof e.system=="string")return e.system||void 0;if(Array.isArray(e.system))return e.system.map(r=>typeof r.text=="string"?r.text:"").filter(Boolean).join(`
|
|
2286
2286
|
|
|
2287
2287
|
`)||void 0}function bVr(e){if(e.source.type==="url"&&e.source.url)return e.source.url;if(e.source.type==="base64"&&e.source.data)return`data:${e.source.media_type??"image/png"};base64,${e.source.data}`}function FJt(e){return typeof e=="string"?e:e.map(t=>{switch(t.type){case"text":return t.text;case"thinking":return t.thinking;case"image":return"[image attachment]";case"tool_use":return`[tool call ${t.name}] ${JSON.stringify(t.input??{})}`;case"tool_result":return FJt(t.content)}}).join(`
|
|
2288
|
-
`)}function CVr(e,t){const r=t==="assistant"?"output_text":"input_text";switch(e.type){case"text":return{type:r,text:e.text};case"thinking":return{type:r,text:e.thinking};case"image":{const n=bVr(e);return t==="user"&&n?{type:"input_image",image_url:n}:{type:r,text:"[image attachment]"}}}}function kVr(e,t){if(typeof t=="string")return[{role:e,content:[{type:e==="assistant"?"output_text":"input_text",text:t}]}];const r=[];let n=[];const o=()=>{n.length!==0&&(r.push({role:e,content:n}),n=[])};for(const s of t){if(s.type==="tool_use"){o(),r.push({type:"function_call",call_id:s.id,name:s.name,arguments:JSON.stringify(s.input??{})});continue}if(s.type==="tool_result"){o(),r.push({type:"function_call_output",call_id:s.tool_use_id,output:FJt(s.content)});continue}n.push(CVr(s,e))}return o(),r}function AVr(e,t){const
|
|
2288
|
+
`)}function CVr(e,t){const r=t==="assistant"?"output_text":"input_text";switch(e.type){case"text":return{type:r,text:e.text};case"thinking":return{type:r,text:e.thinking};case"image":{const n=bVr(e);return t==="user"&&n?{type:"input_image",image_url:n}:{type:r,text:"[image attachment]"}}}}function kVr(e,t){if(typeof t=="string")return[{role:e,content:[{type:e==="assistant"?"output_text":"input_text",text:t}]}];const r=[];let n=[];const o=()=>{n.length!==0&&(r.push({role:e,content:n}),n=[])};for(const s of t){if(s.type==="tool_use"){o(),r.push({type:"function_call",call_id:s.id,name:s.name,arguments:JSON.stringify(s.input??{})});continue}if(s.type==="tool_result"){o(),r.push({type:"function_call_output",call_id:s.tool_use_id,output:FJt(s.content)});continue}n.push(CVr(s,e))}return o(),r}function AVr(e,t,r){const n=e.messages.flatMap(i=>kVr(i.role,i.content)),o={model:t,input:n,stream:!0,store:!1,...r!==void 0?{reasoning:{effort:r}}:{}},s=_Vr(e);if(s&&(o.instructions=s),e.tools&&e.tools.length>0&&(o.tools=e.tools.map(i=>({type:"function",name:i.name,...i.description?{description:i.description}:{},parameters:i.input_schema}))),e.tool_choice)switch(e.tool_choice.type){case"any":o.tool_choice="required";break;case"tool":o.tool_choice={type:"function",name:e.tool_choice.name};break;default:o.tool_choice=e.tool_choice.type;break}return o}function xVr(e){if(Tp(e))return e;if(typeof e!="string")throw new Error("Codex fallback function call is missing JSON arguments");try{const t=JSON.parse(e||"{}");if(!Tp(t))throw new Error("not an object");return t}catch{throw new Error("Codex fallback function call returned invalid JSON arguments")}}function $Jt(e){return!Tp(e)||e.type!=="message"||!Array.isArray(e.content)?"":e.content.filter(Tp).filter(t=>t.type==="output_text").map(t=>typeof t.text=="string"?t.text:"").join("")}function IVr(e,t){if(e.type!=="function_call")return;const r=FL(e.call_id),n=FL(e.name);if(!r||!n)throw new Error("Codex fallback function call is missing an id or name");t.set(r,{toolCallId:r,toolName:n,args:xVr(e.arguments)})}function RVr(e){const t=e.replace(/\r\n?/g,`
|
|
2289
2289
|
`).split(`
|
|
2290
2290
|
|
|
2291
2291
|
`),r=[];for(const n of t){if(!n.trim())continue;let o;const s=[];for(const a of n.split(`
|
|
@@ -2317,7 +2317,7 @@ data: ${r}
|
|
|
2317
2317
|
`))}catch{}},u);try{for(let R=0;R<s.length&&!h;R++){const x=s[R];k=x.label??"translation",p.always(`[proxy:${r}] attempt ${R+1}/${s.length}: ${x.label}`),ag(k,"translation");let P="";try{const N=roe(o,x.provider?{provider:x.provider,model:x.model}:{}),F=await Mt(t.neurolink.stream(N),zL,`Translation attempt ${x.label} timed out after ${zL}ms`);for(b=F.stream[Symbol.asyncIterator]();!h;){const{value:$,done:H}=await b.next();if(H||h)break;const V=toe($);if(V){P+=V;for(const W of l.pushDelta(V))I.enqueue(d.encode(W))}}if(h)return;const M=F.toolCalls??[];if(!GL(P,M)){_=`Translated provider ${x.label} returned no content or tool calls`,p.debug(`${c} translation attempt ${x.label} returned no content or tool calls`),_r(k,"translation",502);continue}if(!h&&M.length)for(const $ of M){const H=$.toolName??$.name??"unknown",V=$.toolCallId||_Wr(r);for(const W of l.pushToolUse(V,H,tYt($)))I.enqueue(d.encode(W))}if(!h){const $=F.finishReason??noe(r),H=Dw(F.usage);for(const V of l.finish($,H))I.enqueue(d.encode(V))}y=F.model,w=x.provider,i&&y&&y!==n&&(i.setModelSubstitution(n,y,w),T=!0);const U=Dw(F.usage);i?.setUsage({inputTokens:U.input,outputTokens:U.output,cacheCreationTokens:0,cacheReadTokens:0}),i?.recordMetrics(),f=!0;return}catch(N){if(h)return;if(_=N instanceof Error?N.message:String(N),P.trim().length>0){g=!0,_r(k,"translation",502),p.always(`${c} mid-stream error: ${_}`);for(const F of l.emitError(`Upstream stream interrupted: ${_}`))I.enqueue(d.encode(F));return}p.debug(`${c} translation attempt ${x.label} failed: ${_}`),_r(k,"translation",500)}}if(!h){p.always(`${c} all translation attempts failed: ${_}`);for(const R of l.emitError(_))I.enqueue(d.encode(R))}}finally{m&&clearInterval(m),h||I.close(),!T&&i&&y&&y!==n&&(i.setModelSubstitution(n,y,w),T=!0);const R=h?499:f?200:g?502:500,x=h?"client_cancelled":g?"stream_error":f?void 0:"generation_error",P=h?"Client cancelled the streaming response":f?void 0:_;x&&P?(i?.setError(x,P.slice(0,500)),aw(R,k,"translation",{requestId:t.requestId,errorType:x,terminalOutcome:x,message:P})):ck(k,"translation"),i?.end(R,Date.now()-a);const N=i?.getTraceContext();Sp({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:n,stream:!0,toolCount:Object.keys(o.tools).length,account:"translation",accountType:"translation",...Pw(t.headers),responseStatus:R,responseTimeMs:Date.now()-a,...x?{errorType:x}:{},...P?{errorMessage:P.slice(0,500)}:{},...N?.traceId?{traceId:N.traceId}:{},...N?.spanId?{spanId:N.spanId}:{}})}},cancel(){h=!0,m&&(clearInterval(m),m=void 0),b?.return&&b.return(void 0).catch(I=>{p.debug(`${c} upstream cancel error: ${I instanceof Error?I.message:String(I)}`)})}});return new Response(A,{headers:{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"}})}async function soe(e){const{ctx:t,format:r,requestModel:n,parsed:o,attempts:s,tracer:i,requestStartTime:a,terminalFailureStatus:c=500}=e,l=rYt(r);let u="No translation providers succeeded",d="translation";for(let h=0;h<s.length;h++){const f=s[h];d=f.label??"translation",p.always(`[proxy:${r}] attempt ${h+1}/${s.length}: ${f.label}`),ag(d,"translation");try{const g=roe(o,f.provider?{provider:f.provider,model:f.model}:{}),y=await Mt(t.neurolink.stream(g),zL,`Translation attempt ${f.label} timed out after ${zL}ms`);let w="";for await(const k of y.stream){const A=toe(k);A&&(w+=A)}if(!GL(w,y.toolCalls)){u=`Translated provider ${f.label} returned no content or tool calls`,p.debug(`${l} translation attempt ${f.label} returned no content or tool calls`),_r(d,"translation",502);continue}const T={content:w,model:y.model,finishReason:y.finishReason??noe(r),reasoning:void 0,usage:y.usage?Dw(y.usage):void 0,toolCalls:y.toolCalls};i&&y.model&&y.model!==n&&i.setModelSubstitution(n,y.model,f.provider);const _=Dw(y.usage);i?.setUsage({inputTokens:_.input,outputTokens:_.output,cacheCreationTokens:0,cacheReadTokens:0}),i?.recordMetrics(),i?.end(200,Date.now()-a),ck(d,"translation");const b=i?.getTraceContext();return Sp({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:n,stream:!1,toolCount:Object.keys(o.tools).length,account:"translation",accountType:"translation",...Pw(t.headers),responseStatus:200,responseTimeMs:Date.now()-a,inputTokens:_.input,outputTokens:_.output,...b?.traceId?{traceId:b.traceId}:{},...b?.spanId?{spanId:b.spanId}:{}}),r==="claude"?Kne(T,n):r==="gemini"?FVr(T.content,T.finishReason??noe(r),_,T.model??n,T.toolCalls):WJt(T,n)}catch(g){u=g instanceof Error?g.message:String(g),p.debug(`${l} translation attempt ${f.label} failed: ${u}`),_r(d,"translation",500)}}aw(c,d,"translation",{requestId:t.requestId,errorType:"generation_error",terminalOutcome:"handler_error",message:u}),i?.setError("generation_error",u.slice(0,500)),i?.end(c,Date.now()-a);const m=i?.getTraceContext();throw Sp({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:n,stream:!1,toolCount:Object.keys(o.tools).length,account:"translation",accountType:"translation",...Pw(t.headers),responseStatus:c,responseTimeMs:Date.now()-a,errorType:"generation_error",errorMessage:u.slice(0,500),...m?.traceId?{traceId:m.traceId}:{},...m?.spanId?{spanId:m.spanId}:{}}),new be({code:Be.PROVIDER_NOT_AVAILABLE,message:u,category:"execution",severity:"high",retriable:!1,context:{attemptLabel:d,format:r}})}function bWr(e){const t=[];if(e){const r=e.getModelMappings?.()??[];for(const o of r)t.push({id:o.from,object:"model",created:0,owned_by:"neurolink"});const n=e.getPassthroughModels?.()??[];for(const o of n)t.push({id:o,object:"model",created:0,owned_by:"neurolink"})}if(t.length===0)for(const r of JJt)t.push({id:r,object:"model",created:0,owned_by:"neurolink"});return{object:"list",data:t}}function CWr(e){const t=[];if(e){const s=e.getModelMappings?.()??[];for(const a of s)a.from&&t.push(a.from);const i=e.getPassthroughModels?.()??[];for(const a of i)t.push(a)}t.length===0&&t.push(...JJt);const r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>({type:"model",id:s,display_name:kWr(s),created_at:new Date(0).toISOString()}));return{data:o,first_id:o[0]?.id??null,last_id:o[o.length-1]?.id??null,has_more:!1}}function kWr(e){const r=e.replace(/-\d{8}$/,"").split("-"),n=[],o=[];for(const i of r)/^\d+$/.test(i)&&o.length>0&&o[0].toLowerCase()==="claude"?n.push(i):o.push(i.charAt(0).toUpperCase()+i.slice(1));const s=n.length>0?` ${n.join(".")}`:"";return o.length>0?`${o[0]}${s}${o.slice(1).length?" "+o.slice(1).join(" "):""}`:e}sr(),Rr(),Wt(),Nm(),lMe(),pc(),wS(),B();var AWr="[ProxyTracer]",ioe=null;function Lk(){if(ioe)return ioe;const e=Ap.getMeter("neurolink.proxy","1.0.0"),t={requestsTotal:e.createCounter("proxy_requests_total",{description:"Total number of proxy requests",unit:"{request}"}),requestDuration:e.createHistogram("proxy_request_duration_ms",{description:"Proxy request duration in milliseconds",unit:"ms"}),tokensInput:e.createCounter("proxy_tokens_input",{description:"Total input tokens consumed via proxy",unit:"{token}"}),tokensOutput:e.createCounter("proxy_tokens_output",{description:"Total output tokens produced via proxy",unit:"{token}"}),tokensCacheRead:e.createCounter("proxy_tokens_cache_read",{description:"Total cache-read tokens via proxy",unit:"{token}"}),tokensCacheCreation:e.createCounter("proxy_tokens_cache_creation",{description:"Total cache-creation tokens via proxy",unit:"{token}"}),tokensReasoning:e.createCounter("proxy_tokens_reasoning",{description:"Total reasoning tokens via proxy",unit:"{token}"}),costTotal:e.createCounter("proxy_cost_usd_total",{description:"Total estimated cost in USD",unit:"USD"}),errorsTotal:e.createCounter("proxy_errors_total",{description:"Total proxy errors",unit:"{error}"}),retriesTotal:e.createCounter("proxy_retries_total",{description:"Total upstream retry attempts",unit:"{retry}"}),modelSubstitutionTotal:e.createCounter("proxy_model_substitution_total",{description:"Total proxy requests where the response model differs from the requested model",unit:"{substitution}"}),requestBodySize:e.createHistogram("proxy_request_body_bytes",{description:"Request body size in bytes sent upstream",unit:"By"}),responseBodySize:e.createHistogram("proxy_response_body_bytes",{description:"Response body size in bytes received from upstream",unit:"By"}),fallbackAttemptsTotal:e.createCounter("proxy_fallback_attempts_total",{description:"Total fallback provider attempts",unit:"{attempt}"}),fallbackSuccessTotal:e.createCounter("proxy_fallback_success_total",{description:"Total successful fallback provider responses",unit:"{success}"}),fallbackFailureTotal:e.createCounter("proxy_fallback_failure_total",{description:"Total failed fallback provider responses",unit:"{failure}"})};return ioe=t,t}var xWr=new Set(["authorization","proxy-authorization","x-api-key","cookie","set-cookie"]),IWr=/token|secret|key|password|credential/i;function aoe(e){const t={};for(const[r,n]of Object.entries(e)){const o=r.toLowerCase();xWr.has(o)||IWr.test(o)?t[r]="[REDACTED]":t[r]=n}return t}var RWr=/api[_-]?key|token|secret|password|credential|authorization/i,qL=process.env.NEUROLINK_PROXY_TRACE_BODY_LOGGING==="true",coe=Number.parseInt(process.env.NEUROLINK_PROXY_TRACE_BODY_LOG_BYTES??"8192",10),nYt=200;function oYt(e,t=8192){const r=e.length>t?e.slice(0,t)+"\u2026[truncated]":e;try{let o=function(i){if(i===null||typeof i!="object")return i;if(Array.isArray(i))return i.map(o);const a={};for(const[c,l]of Object.entries(i))a[c]=RWr.test(c)?"[REDACTED]":o(l);return a};var n=o;const s=JSON.parse(r);return JSON.stringify(o(s))}catch{return r}}function loe(e){return{"proxy.body":oYt(e,coe),"proxy.body.size":e.length,"proxy.body.logged":!0,"proxy.body.truncated":e.length>coe}}function MWr(e){return e?e.startsWith("claude-cli/")?"cli":e.startsWith("ai/")?"sdk":"unknown":"unknown"}var uoe=class vQt{rootSpan;proxyTracer=BM("neurolink.proxy");bridge=new ky;requestId;model;billingProvider;startTime;isStream;accountEmail;usage;mode="full";constructor(t,r,n,o,s){this.rootSpan=t,this.requestId=r,this.model=n,this.billingProvider=s,this.startTime=Date.now(),this.isStream=o}static startRequest(t,r){const n=BM("neurolink.proxy");let o=Tr.active();if(r){const m=new ky().extractContext(r);m&&(o=ut.setSpanContext(Tr.active(),m))}const s=t.clientApp??MWr(t.userAgent),i=n.startSpan("proxy.request",{attributes:{"proxy.request_id":t.requestId,"http.method":t.method,"http.target":t.path,"gen_ai.request.model":t.model,"proxy.stream":t.stream,"proxy.tool_count":t.toolCount,"proxy.client_app":s}},o);t.sessionId&&i.setAttribute("session.id",t.sessionId),t.userAgent&&i.setAttribute("http.user_agent",t.userAgent),t.toolNames&&t.toolNames.length>0&&i.setAttribute("gen_ai.request.tool_names",JSON.stringify(t.toolNames));const a=r?.["x-neurolink-session-id"],c=r?.["x-neurolink-user-id"],l=r?.["x-neurolink-conversation-id"];a&&i.setAttribute("neurolink.session_id",a),c&&i.setAttribute("neurolink.user_id",c),l&&i.setAttribute("neurolink.conversation_id",l);const u=new vQt(i,t.requestId,t.model,t.stream,t.provider??"anthropic");return r0({sessionId:a??t.sessionId,userId:c,conversationId:l,requestId:t.requestId,traceName:`proxy:${t.model}`,operationName:"proxy.request",metadata:{clientApp:s,stream:t.stream,toolCount:t.toolCount}}).catch(d=>{p.debug(`${AWr} Failed to set Langfuse context`,{error:d instanceof Error?d.message:String(d)})}),u}startReceive(){return this.proxyTracer.startSpan("proxy.receive",{attributes:{"proxy.request_id":this.requestId}},ut.setSpan(Tr.active(),this.rootSpan))}startAccountSelection(){return this.proxyTracer.startSpan("proxy.account_selection",{attributes:{"proxy.request_id":this.requestId}},ut.setSpan(Tr.active(),this.rootSpan))}startUpstreamAttempt(t){return this.proxyTracer.startSpan("proxy.upstream",{attributes:{"proxy.request_id":this.requestId,"proxy.upstream.attempt":t.attempt,"proxy.upstream.account":t.account,"proxy.upstream.polyfill_headers":t.polyfillHeaders,"proxy.upstream.polyfill_body":t.polyfillBody,"http.url":t.upstreamUrl}},ut.setSpan(Tr.active(),this.rootSpan))}startStream(){return this.proxyTracer.startSpan("proxy.stream",{attributes:{"proxy.request_id":this.requestId,"gen_ai.request.model":this.model}},ut.setSpan(Tr.active(),this.rootSpan))}setAccountSelection(t){this.accountEmail=t.selectedAccount,this.rootSpan.setAttributes({"proxy.account.strategy":t.strategy,"proxy.account.total":t.accountsTotal,"proxy.account.healthy":t.accountsHealthy,"proxy.account.selected":t.selectedAccount,"proxy.account.type":t.accountType}),t.rateLimitBefore5h!==void 0&&this.rootSpan.setAttribute("proxy.ratelimit.before.5h",t.rateLimitBefore5h),t.rateLimitBefore7d!==void 0&&this.rootSpan.setAttribute("proxy.ratelimit.before.7d",t.rateLimitBefore7d),r0({userId:t.selectedAccount}).catch(()=>{})}setUsage(t){this.usage=t;const r=t.inputTokens+t.outputTokens+t.cacheCreationTokens+t.cacheReadTokens+(t.reasoningTokens??0);this.rootSpan.setAttributes({"ai.tokens.input":t.inputTokens,"ai.tokens.output":t.outputTokens,"ai.tokens.total":r,"ai.tokens.cache_creation":t.cacheCreationTokens,"ai.tokens.cache_read":t.cacheReadTokens}),t.reasoningTokens!==void 0&&this.rootSpan.setAttribute("ai.tokens.reasoning",t.reasoningTokens),this.rootSpan.setAttributes({"gen_ai.usage.input_tokens":t.inputTokens,"gen_ai.usage.output_tokens":t.outputTokens,"gen_ai.usage.total_tokens":r});const n=oa(this.billingProvider,this.model,{input:t.inputTokens,output:t.outputTokens,total:r,cacheCreationTokens:t.cacheCreationTokens,cacheReadTokens:t.cacheReadTokens});n>0&&this.rootSpan.setAttributes({"ai.cost.total":n,"ai.cost.currency":"USD"}),t.rateLimitAfter5h!==void 0&&this.rootSpan.setAttribute("proxy.ratelimit.after.5h",t.rateLimitAfter5h),t.rateLimitAfter7d!==void 0&&this.rootSpan.setAttribute("proxy.ratelimit.after.7d",t.rateLimitAfter7d)}setResponseInfo(t){t.responseModel&&this.rootSpan.setAttribute("gen_ai.response.model",t.responseModel),t.finishReason&&this.rootSpan.setAttribute("gen_ai.response.finish_reason",t.finishReason),t.stopSequence&&this.rootSpan.setAttribute("gen_ai.response.stop_sequence",t.stopSequence),t.toolCalls&&t.toolCalls.length>0&&(this.rootSpan.setAttributes({"gen_ai.response.tool_calls":JSON.stringify(t.toolCalls),"gen_ai.response.tool_call_count":t.toolCalls.length}),this.rootSpan.addEvent("proxy.response.tool_calls",{"gen_ai.response.tool_calls":JSON.stringify(t.toolCalls)}))}setError(t,r){this.rootSpan.setAttributes({"error.type":t,"error.message":r,error:!0})}setMode(t){this.mode=t,this.rootSpan.setAttribute("proxy.mode",t)}setModelSubstitution(t,r,n){this.model=r,n&&(this.billingProvider=n),this.rootSpan.setAttributes({"proxy.model_substituted":!0,"proxy.original_model":t,"proxy.actual_model":r,"gen_ai.response.model":r,...n?{"proxy.actual_provider":n}:{}}),Lk().modelSubstitutionTotal.add(1,{requested_model:t,actual_model:r})}setFallbackInfo(t){this.rootSpan&&this.rootSpan.setAttributes({"proxy.fallback.triggered":t.triggered,...t.provider?{"proxy.fallback.provider":t.provider}:{},...t.model?{"proxy.fallback.model":t.model}:{},"proxy.fallback.attempt_count":t.attemptCount,"proxy.fallback.reason":t.reason})}logRequestBody(t){if(!qL){this.rootSpan.addEvent("proxy.client.request_body",{"proxy.body.size":t.length,"proxy.body.logged":!1});return}this.rootSpan.addEvent("proxy.client.request_body",{...loe(t)})}logRequestHeaders(t){this.rootSpan.addEvent("proxy.client.request_headers",{"proxy.headers":JSON.stringify(aoe(t))})}logUpstreamRequestBody(t){if(!qL){this.rootSpan.addEvent("proxy.upstream.request_body",{"proxy.body.size":t.length,"proxy.body.logged":!1});return}this.rootSpan.addEvent("proxy.upstream.request_body",{...loe(t)})}logUpstreamRequestHeaders(t){this.rootSpan.addEvent("proxy.upstream.request_headers",{"proxy.headers":JSON.stringify(aoe(t))})}logUpstreamResponseHeaders(t){this.rootSpan.addEvent("proxy.upstream.response_headers",{"proxy.headers":JSON.stringify(aoe(t))})}logUpstreamResponseBody(t){if(!qL){this.rootSpan.addEvent("proxy.upstream.response_body",{"proxy.body.size":t.length,"proxy.body.logged":!1});return}this.rootSpan.addEvent("proxy.upstream.response_body",{...loe(t)})}logStreamEvents(t){if(!qL){this.rootSpan.addEvent("proxy.stream.events",{"proxy.stream.event_count":t.length,"proxy.body.logged":!1});return}const r=t.length>nYt,n=t.slice(0,nYt).map(o=>({...o,data:o.data?oYt(o.data,coe):""}));r&&n.push({type:"truncated",timestamp:Date.now(),data:"\u2026[truncated]"}),this.rootSpan.addEvent("proxy.stream.events",{"proxy.stream.event_count":t.length,"proxy.stream.events":JSON.stringify(n),"proxy.body.logged":!0,"proxy.body.truncated":r})}recordRetry(t,r){Lk().retriesTotal.add(1,{model:this.model,account:t,reason:r})}recordBodySizes(t,r){const n=Lk(),o={model:this.model,account:this.accountEmail??"unknown"};t!==void 0&&t>0&&n.requestBodySize.record(t,o),r!==void 0&&r>0&&n.responseBodySize.record(r,o)}getTraceContext(){const t=this.rootSpan.spanContext();return{traceId:t.traceId,spanId:t.spanId}}getUsage(){return this.usage}end(t,r){this.rootSpan.setAttributes({"http.status_code":t,"proxy.duration_ms":r,"proxy.mode":this.mode,...this.accountEmail?{"proxy.account":this.accountEmail}:void 0}),t>=400?this.rootSpan.setStatus({code:De.ERROR,message:`HTTP ${t}`}):this.rootSpan.setStatus({code:De.OK}),this.rootSpan.end();const n=Lk(),o={model:this.model,account:this.accountEmail??"unknown",status:String(t),stream:String(this.isStream),mode:this.mode};if(n.requestsTotal.add(1,o),n.requestDuration.record(r,o),this.usage){const s={model:this.model,account:this.accountEmail??"unknown"};n.tokensInput.add(this.usage.inputTokens,s),n.tokensOutput.add(this.usage.outputTokens,s),n.tokensCacheRead.add(this.usage.cacheReadTokens,s),n.tokensCacheCreation.add(this.usage.cacheCreationTokens,s),this.usage.reasoningTokens&&n.tokensReasoning.add(this.usage.reasoningTokens,s);const i=this.usage.inputTokens+this.usage.outputTokens+this.usage.cacheCreationTokens+this.usage.cacheReadTokens+(this.usage.reasoningTokens??0),a=oa(this.billingProvider,this.model,{input:this.usage.inputTokens,output:this.usage.outputTokens,total:i,cacheCreationTokens:this.usage.cacheCreationTokens,cacheReadTokens:this.usage.cacheReadTokens});a>0&&n.costTotal.add(a,s)}if(t>=400){const s=t===429?"rate_limit":t===401?"auth":t>=500?"server":"client";n.errorsTotal.add(1,{model:this.model,account:this.accountEmail??"unknown",error_type:s,status:String(t)})}}recordMetrics(){if(!this.usage)return;const t=this.usage.inputTokens+this.usage.outputTokens+this.usage.cacheCreationTokens+this.usage.cacheReadTokens+(this.usage.reasoningTokens??0),r=Date.now()-this.startTime,n=oa(this.billingProvider,this.model,{input:this.usage.inputTokens,output:this.usage.outputTokens,total:t,cacheCreationTokens:this.usage.cacheCreationTokens,cacheReadTokens:this.usage.cacheReadTokens});ph.getInstance().recordAIRequest(this.billingProvider,this.model,t,r,n>0?n:void 0)}getTraceHeaders(){return this.bridge.injectContext({},ut.setSpan(Tr.active(),this.rootSpan))}};function Fk(e){try{const t=Lk(),r={provider:e.provider,model:e.model};t.fallbackAttemptsTotal.add(1,r),e.status==="success"?t.fallbackSuccessTotal.add(1,r):t.fallbackFailureTotal.add(1,{...r,error:e.errorMessage?.slice(0,100)??"unknown"})}catch{}}var HL=1024*1024,doe=`
|
|
2318
2318
|
...[TRUNCATED]`;function sYt(){const e=new TextDecoder,t=[];let r=0,n=0,o=!1,s=!1,i;const a=new Promise(g=>{i=g});function c(){if(s)return;s=!0;const g=e.decode();if(g)if(n<HL){const y=HL-n;t.push(g.slice(0,y)),n+=Math.min(g.length,y)}else o||(t.push(doe),o=!0);i({totalBytes:r,text:t.join(""),truncated:o})}const l=new TransformStream({transform(g,y){if(y.enqueue(g),r+=g.byteLength,n<HL){const w=e.decode(g,{stream:!0}),T=HL-n,_=w.slice(0,T);t.push(_),n+=Math.min(w.length,T),w.length>T&&!o&&(t.push(doe),o=!0)}else o||(t.push(doe),o=!0)},flush(){c()}}),u=l.writable.getWriter();let d;const m=new WritableStream({start(g){d=g},write(g){return u.write(g)},close(){return u.close()},abort(g){return c(),u.abort(g)}});u.closed.catch(g=>{c();try{d.error(g)}catch{}});const h=l.readable.getReader();return{stream:{readable:new ReadableStream({async pull(g){try{const{done:y,value:w}=await h.read();y?g.close():g.enqueue(w)}catch(y){g.error(y)}},async cancel(g){c();try{d.error(g)}catch{}await Promise.allSettled([h.cancel(g),u.abort(g)])}}),writable:m},capture:a}}Xyt();var jL=100*1024,PWr=5e3,moe=2048,iYt=1024*1024,qd="...[TRUNCATED]";function VL(e){const t=[];let r=0;for(;r<e.length;){const n=/\r\n\r\n|\n\n|\r\r/.exec(e.slice(r));if(!n||n.index===void 0)break;const o=r+n.index,s=e.slice(r,o);r=o+n[0].length;let i="",a="";const c=s.split(/\r\n|\n|\r/);for(const l of c)l.startsWith("event: ")?i=l.slice(7).trim():l.startsWith("data: ")?a=l.slice(6):l.startsWith("data:")&&(a=l.slice(5));(i||a)&&t.push({event:i,data:a})}return{events:t,remainder:e.slice(r)}}function DWr(e){return{messageId:"",model:"",inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,contentBlocks:[],blockByteCounts:new Map,stopReason:null,stopSequence:null,eventCount:0,startTime:Date.now(),totalBytesReceived:0,events:[],rawTextChunks:e?[]:void 0,rawTextBytes:0,rawTextTruncated:!1,eventLogTruncated:!1}}function Ow(e){return Buffer.byteLength(e,"utf8")}function poe(e,t){if(Ow(e)<=t)return e;const r=Ow(qd);if(t<=0||t<r)return"";let n="",o=0;for(const s of e){const i=Ow(s);if(o+i+r>t)break;n+=s,o+=i}return`${n}${qd}`}function hoe(e,t){return poe(e,t)}function foe(e,t,r,n){const o=Ow(t);if(r>=n)return{value:e&&e.endsWith(qd)?e:`${e??""}${qd}`,nextBytes:r+o};const s=n-r,i=r+o;return o<=s?{value:`${e??""}${t}`,nextBytes:i}:{value:`${e??""}${poe(t,s)}`,nextBytes:i}}function aYt(e,t){if(!e.rawTextChunks||e.rawTextTruncated)return;const r=iYt-e.rawTextBytes;if(r<=0){e.rawTextChunks.push(qd),e.rawTextTruncated=!0;return}const n=Ow(t);if(n<=r){e.rawTextChunks.push(t),e.rawTextBytes+=n;return}e.rawTextChunks.push(poe(t,r)),e.rawTextBytes=iYt,e.rawTextTruncated=!0}function OWr(e){return Ow(e.text??e.thinking??e.toolInput??"")}function NWr(e){const t=e.inputTokens+e.outputTokens;return{messageId:e.messageId,model:e.model,usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheCreationInputTokens:e.cacheCreationInputTokens,cacheReadInputTokens:e.cacheReadInputTokens,totalTokens:t},contentBlocks:e.contentBlocks,stopReason:e.stopReason,stopSequence:e.stopSequence,eventCount:e.eventCount,streamDurationMs:Date.now()-e.startTime,totalBytesReceived:e.totalBytesReceived,events:e.events,...e.streamErrorMessage?{streamErrorMessage:e.streamErrorMessage}:{},...e.rawTextChunks?{rawText:e.rawTextChunks.join("")}:{}}}function LWr(e,t){const r=t.message;if(!r)return;e.messageId=r.id??"",e.model=r.model??"";const n=r.usage;n&&(e.inputTokens+=n.input_tokens??0,e.outputTokens+=n.output_tokens??0,e.cacheCreationInputTokens+=n.cache_creation_input_tokens??0,e.cacheReadInputTokens+=n.cache_read_input_tokens??0)}function FWr(e,t){const r=t.index??0,n=t.content_block;if(!n)return;const o=n.type,s={index:r,type:o};o==="text"?s.text=n.text??"":o==="thinking"?s.thinking=n.thinking??"":o==="tool_use"&&(s.toolName=n.name??"",s.toolId=n.id??"",s.toolInput=""),e.contentBlocks.push(s),e.blockByteCounts.set(r,OWr(s))}function $Wr(e,t){const r=t.index??0,n=t.delta;if(!n)return;const o=e.contentBlocks.find(a=>a.index===r);if(!o)return;const s=e.blockByteCounts.get(r)??0,i=s>=jL;if(n.type==="text_delta"&&n.text!==null){const a=n.text,c=foe(o.text,a,s,jL);e.blockByteCounts.set(r,c.nextBytes),(!i||!o.text?.endsWith(qd))&&(o.text=c.value)}else if(n.type==="thinking_delta"&&n.thinking!==null){const a=n.thinking,c=foe(o.thinking,a,s,jL);e.blockByteCounts.set(r,c.nextBytes),(!i||!o.thinking?.endsWith(qd))&&(o.thinking=c.value)}else if(n.type==="input_json_delta"&&n.partial_json!==null){const a=n.partial_json,c=foe(o.toolInput,a,s,jL);e.blockByteCounts.set(r,c.nextBytes),(!i||!o.toolInput?.endsWith(qd))&&(o.toolInput=c.value)}}function UWr(e,t){const r=t.delta;r&&(e.stopReason=r.stop_reason??e.stopReason,e.stopSequence=r.stop_sequence??e.stopSequence);const n=t.usage;n&&(e.outputTokens+=n.output_tokens??0)}function cYt(e,t){e.eventCount++;const r=Date.now();if(e.events.length<PWr-1?t.event==="content_block_delta"?e.events.push({type:t.event,timestamp:r,data:""}):e.events.push({type:t.event,timestamp:r,data:hoe(t.data,moe)}):e.eventLogTruncated||(e.events.push({type:"truncated",timestamp:r,data:qd}),e.eventLogTruncated=!0),!t.data)return;let n;try{n=JSON.parse(t.data)}catch{return}if(t.event==="error"){const o=n&&typeof n=="object"?n:{},i=(o.error&&typeof o.error=="object"?o.error:void 0)?.message??o.message;e.streamErrorMessage=typeof i=="string"&&i.trim()?hoe(i.trim(),moe):hoe(t.data,moe)}switch(t.event){case"message_start":LWr(e,n);break;case"content_block_start":FWr(e,n);break;case"content_block_delta":$Wr(e,n);break;case"message_delta":UWr(e,n);break;default:break}}function WL(e={}){const t=e.captureRawText??!1,r=DWr(t);let n="",o=!1;const s=new TextDecoder;let i;const a=new Promise(y=>{i=y});function c(){o||(o=!0,i(NWr(r)))}const l=new TransformStream({transform(y,w){w.enqueue(y),r.totalBytesReceived+=y.byteLength;const T=s.decode(y,{stream:!0});aYt(r,T),n+=T;const{events:_,remainder:b}=VL(n);n=b;for(const k of _)cYt(r,k)},flush(){const y=s.decode();if(y&&(aYt(r,y),n+=y),n.trim()){const{events:w}=VL(n+`
|
|
2319
2319
|
|
|
2320
|
-
`);for(const T of w)cYt(r,T)}c()}}),u=l.writable.getWriter();let d;const m=new WritableStream({start(y){d=y},write(y){return u.write(y)},close(){return u.close()},abort(y){return c(),u.abort(y)}});u.closed.catch(y=>{c();try{d.error(y)}catch{}});const h=l.readable.getReader();return{stream:{readable:new ReadableStream({async pull(y){try{const{done:w,value:T}=await h.read();w?y.close():y.enqueue(T)}catch(w){y.error(w)}},async cancel(y){c();try{d.error(y)}catch{}await Promise.allSettled([h.cancel(y),u.abort(y)])}}),writable:m},telemetry:a}}Pr(),Os(),jt(),Pc(),B(),Ja();var BWr="proxy-peers.json",zWr=1e3,GWr={exhausted:9e5,withheld:6e5,paused:3e5,revoked:864e5,expired:864e5,unreachable:6e4,upstream_error:12e4},qWr=null,Hd={},$k=0,Uk=-1,Bk=!1,lYt=new wa;function goe(){return qWr??ft(ia(),".neurolink",BWr)}function HWr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.name=="string"&&typeof t.url=="string"&&typeof t.token=="string"&&typeof t.priority=="number"&&typeof t.enabled=="boolean"}function jWr(e){return e?.code==="ENOENT"}async function yoe(e={}){const t=Date.now();if(!e.force&&Bk&&t-$k<zWr)return;const r=goe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!jWr(o))throw o;Hd={},Uk=-1,$k=t,Bk=!0;return}if(!e.force&&Bk&&n===Uk){$k=t;return}try{const o=JSON.parse(await Mr(r,"utf8"));Hd=Object.fromEntries(Object.entries(o?.peers??{}).filter(s=>HWr(s[1])))}catch(o){if(e.force)throw o;p.always(`[proxy] peer list unreadable, treating as empty: ${o instanceof Error?o.message:String(o)}`),Hd={}}Uk=n,$k=t,Bk=!0}async function uYt(){const e={schemaVersion:1,peers:Hd};await Ta(goe(),e);try{Uk=(await Es(goe())).mtimeMs}catch{Uk=-1}$k=Date.now(),Bk=!0}function dYt(e){return e.trim().toLowerCase()}async function VWr(){return await yoe(),Object.values(Hd).sort((e,t)=>e.priority-t.priority||e.createdAt-t.createdAt)}async function WWr(e=Date.now()){return(await VWr()).filter(r=>r.enabled&&!(r.cooldownUntil&&r.cooldownUntil>e))}function KWr(e){return GWr[e]}var JWr=6048e5;async function voe(e,t,r){await lYt.runExclusive(async()=>{await yoe({force:!0});const n=dYt(e),o=Hd[n];if(!o)return;const s=(r??0)*1e3,i=Date.now()+Math.min(JWr,Math.max(KWr(t),Number.isFinite(s)?s:0));Hd[n]={...o,cooldownUntil:i,cooldownReason:t,updatedAt:Date.now()},await uYt()})}async function YWr(e,t){await lYt.runExclusive(async()=>{await yoe({force:!0});const r=dYt(e),n=Hd[r];n&&(Hd[r]={...n,cooldownUntil:0,lastUsedAt:Date.now(),updatedAt:Date.now(),...t?{lastObservation:t}:{}},await uYt())})}Pr(),Os(),jt(),Pc(),nL();var ZWr=6048e5,XWr=9e5,QWr=864e5;function eKr(e){return!e.usable}function mYt(e){return{schemaVersion:e.schemaVersion,grantId:e.grantId,peerLabel:e.peerLabel,issuedAt:e.issuedAt,notAfter:e.notAfter,heartbeatEveryMs:e.heartbeatEveryMs,offlineGraceMs:e.offlineGraceMs,gates:e.gates,entitlementSnapshot:e.entitlementSnapshot}}function pYt(e,t){return gre(e,t)}function hYt(e,t=Date.now()){const r=e.leasePolicy,n=e.leaseSecret;if(!n)throw new Error(`Grant ${e.id} has no lease secret \u2014 provision it before issuing a lease.`);const o=r?.ttlMs??ZWr,s=Math.min(t+o,e.gates.notAfter??Number.POSITIVE_INFINITY),i={schemaVersion:1,grantId:e.id,peerLabel:e.peerLabel,issuedAt:t,notAfter:s,heartbeatEveryMs:r?.heartbeatEveryMs??XWr,offlineGraceMs:r?.offlineGraceMs??QWr,gates:e.gates,entitlementSnapshot:e.entitlement.ledger==="coins"?e.entitlement.coins??0:"unlimited"};return{...i,signature:pYt(mYt(i),n)}}function tKr(e,t){const{signature:r,...n}=e;return djt(pYt(mYt(n),t),r)}function rKr(e){const t=e.now??Date.now();if(!tKr(e.lease,e.secret))return{usable:!1,reason:"unsigned",detail:"lease signature does not match the lender's secret"};if(e.lease.notAfter<=t)return{usable:!1,reason:"expired",detail:"the lease's hard expiry has passed"};const r=e.lastHeartbeatAt??e.lease.issuedAt;return r+e.lease.offlineGraceMs<=t?{usable:!1,reason:"grace_elapsed",detail:"the lender has been unreachable for longer than this lease allows"}:{usable:!0,nextHeartbeatDueAt:r+e.lease.heartbeatEveryMs}}function nKr(e){const t=e.now??Date.now();if(!e.grant.leaseSecret)throw new Error(`Grant ${e.grant.id} has no lease secret \u2014 attach lease material first.`);return{code:e.code,state:e.state,accountLabel:`${e.grant.peerLabel}-via-${e.lenderName}`,leaseSecret:e.grant.leaseSecret,lease:hYt(e.grant,t),lenderUrl:(e.lenderUrl??"").replace(/\/+$/,"")}}Ja();var oKr="proxy-resident-grants.json",sKr=1e3,iKr=null,yg={},zk=0,Gk=-1,qk=!1,aKr=new wa;function woe(){return iKr??ft(ia(),".neurolink",oKr)}function cKr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.accountLabel=="string"&&typeof t.grantId=="string"&&typeof t.leaseSecret=="string"&&!!t.lease}function lKr(e){return e?.code==="ENOENT"}async function fYt(e={}){const t=Date.now();if(!e.force&&qk&&t-zk<sKr)return;const r=woe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!lKr(o))throw o;yg={},Gk=-1,zk=t,qk=!0;return}if(!e.force&&qk&&n===Gk){zk=t;return}try{const o=JSON.parse(await Mr(r,"utf8"));yg=Object.fromEntries(Object.entries(o?.grants??{}).filter(s=>cKr(s[1])))}catch(o){if(e.force)throw o;yg={}}Gk=n,zk=t,qk=!0}async function uKr(){const e={schemaVersion:1,grants:yg};await Ta(woe(),e);try{Gk=(await Es(woe())).mtimeMs}catch{Gk=-1}zk=Date.now(),qk=!0}function gYt(e){return e.toLowerCase()}async function Toe(e){await fYt();const t=e.toLowerCase(),r=t.includes(":")?t.slice(t.indexOf(":")+1):t;return yg[gYt(r)]}async function dKr(e,t=Date.now()){const r=await Toe(e);if(r)return rKr({lease:r.lease,secret:r.leaseSecret,...r.lastHeartbeatAt!==void 0?{lastHeartbeatAt:r.lastHeartbeatAt}:{},now:t})}async function mKr(e,t){await aKr.runExclusive(async()=>{await fYt({force:!0});const r=gYt(e),n=yg[r];n&&(yg[r]={...n,unreportedCoins:(n.unreportedCoins??0)+t,unreportedRequests:(n.unreportedRequests??0)+1},await uKr())})}B();var pKr=15e3,hKr=12e4;function fKr(e){switch(e){case"exhausted":return"exhausted";case"paused":return"paused";case"revoked":return"revoked";case"expired":return"expired";case"reserve_floor":case"spillover_inactive":case"slice_exhausted":case"no_capacity":return"withheld";case"missing_token":case"unknown_token":case"malformed_token":return"revoked";default:return"upstream_error"}}function yYt(e,t){const r=e.headers.get(t);if(r===null||r.trim()==="")return;const n=Number(r);return Number.isFinite(n)?n:void 0}function gKr(e){const t=yYt(e,"x-neurolink-grant-remaining-coins");return{observedAt:Date.now(),...e.headers.get("x-neurolink-grant-status")?{grantStatus:e.headers.get("x-neurolink-grant-status")??""}:{},...e.headers.get("x-neurolink-grant-reason")?{grantReason:e.headers.get("x-neurolink-grant-reason")??""}:{},...t!==void 0?{remainingCoins:t}:{}}}function yKr(e,t,r){const n=e.body;if(!n)return e;let o;const s=()=>{o!==void 0&&(clearTimeout(o),o=void 0)},i=()=>{s(),o=setTimeout(()=>{p.always(`[proxy] peer=${t.name} went quiet mid-response; abandoning it`),voe(t.name,"unreachable").catch(c=>{p.debug(`[proxy] could not cool peer=${t.name} after a stall: ${c instanceof Error?c.message:String(c)}`)}),r.abort()},hKr),o.unref?.()},a=n.pipeThrough(new TransformStream({start:i,transform(c,l){i(),l.enqueue(c)},flush:s}));return r.signal.addEventListener("abort",s,{once:!0}),new Response(a,{status:e.status,statusText:e.statusText,headers:e.headers})}async function vKr(e){const{peer:t,body:r,stream:n}=e,o=new AbortController,s=setTimeout(()=>o.abort(),pKr);e.signal&&(e.signal.aborted?o.abort():e.signal.addEventListener("abort",()=>o.abort(),{once:!0}));try{const i=await fetch(`${t.url}/v1/messages`,{method:"POST",headers:{"content-type":"application/json","x-neurolink-share-token":t.token,accept:n?"text/event-stream":"application/json"},body:r,signal:o.signal});if(i.ok)return await YWr(t.name,gKr(i)).catch(u=>{p.debug(`[proxy] could not record success for peer=${t.name}: ${u instanceof Error?u.message:String(u)}`)}),{ok:!0,response:yKr(i,t,o),peer:t};const a=i.headers.get("x-neurolink-grant-reason"),c=fKr(a),l=yYt(i,"retry-after");return await voe(t.name,c,l),await i.text().catch(()=>""),p.always(`[proxy] peer=${t.name} declined (${c}); cooling before retry`),{ok:!1,peer:t,status:i.status,reason:c,message:`peer ${t.name} declined: ${c}`,...l!==void 0?{retryAfterSeconds:l}:{}}}catch(i){const a=i instanceof Error?i.message:String(i);return e.signal?.aborted?(p.debug(`[proxy] peer=${t.name} attempt cancelled by the caller: ${a}`),{ok:!1,peer:t,reason:"unreachable",message:`peer ${t.name} attempt cancelled`}):(await voe(t.name,"unreachable").catch(c=>{p.debug(`[proxy] could not cool peer=${t.name}: ${c instanceof Error?c.message:String(c)}`)}),p.always(`[proxy] peer=${t.name} unreachable: ${a}`),{ok:!1,peer:t,reason:"unreachable",message:`peer ${t.name} unreachable`})}finally{clearTimeout(s)}}pk();var wKr=36e5,TKr={missing_token:"No share token was presented.",unknown_token:"Share token is not recognized.",malformed_token:"Share token is malformed.",paused:"The lender has paused this share.",revoked:"This share has been revoked.",expired:"This share has expired.",out_of_window:"This share is outside its allowed hours.",model_not_allowed:"This share does not cover the requested model.",exhausted:"This share has no credit remaining.",rate_limited:"This share's request rate limit was exceeded.",concurrency_limited:"This share's concurrent request limit was reached.",reserve_floor:"The lender's reserved headroom is in force.",spillover_inactive:"This share serves only the lender's spare capacity, and none is spare yet.",slice_exhausted:"This share has used its allotted portion of the window.",no_capacity:"No lender account can currently serve this share."};function EKr(e){return TKr[e]}function SKr(e){switch(e){case"missing_token":case"unknown_token":case"malformed_token":return 401;case"paused":case"revoked":case"expired":case"out_of_window":case"model_not_allowed":return 403;default:return 429}}function _Kr(e,t){const r=new Date(t).getHours(),{fromHour:n,toHour:o}=e;return n===o?!0:n<o?r>=n&&r<o:r>=n||r<o}function bKr(e,t){if(!e||e.length===0)return!0;if(!t)return!1;const r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function vYt(e,t){const r=n=>n===void 0?t:t===void 0?n:Math.min(n,t);return{session:r(e?.session5hPct),weekly:r(e?.weekly7dPct)}}function wYt(e,t,r){const n=e.spillover;if(!n)return!1;const o=n.beforeResetHours*wKr,s=n.whenUtilizationBelowPct/100,i=t.weeklyResetAt!==null&&t.weeklyResetAt-r<=o&&t.weeklyResetAt>r&&t.weeklyUsed!==null&&t.weeklyUsed<s,a=t.sessionResetAt!==null&&t.sessionResetAt-r<=o&&t.sessionResetAt>r&&t.sessionUsed!==null&&t.sessionUsed<s;return i||a}function Eoe(e,t){if(!e.accounts||e.accounts.length===0)return{inScope:[...t],outOfScope:[]};const r=new Set(e.accounts.map(s=>s.trim().toLowerCase())),n=[],o=[];for(const s of t){const i=s.accountKey.toLowerCase(),a=i.includes(":")?i.slice(i.indexOf(":")+1):i;r.has(i)||r.has(a)?n.push(s):o.push(s)}return{inScope:n,outOfScope:o}}function Soe(e,t,r,n){const o=e.gates,{inScope:s,outOfScope:i}=Eoe(o,t),a=s.some(m=>wYt(o,m,r)),c=vYt(o.maxSlice,a?o.spillover?.maxSlicePct:void 0);if(c.session!==void 0&&n.sessionFraction*100>=c.session||c.weekly!==void 0&&n.weeklyFraction*100>=c.weekly)return{allowed:[],excluded:[...s.map(m=>({accountKey:m.accountKey,reason:"slice_exhausted"})),...i.map(m=>({accountKey:m.accountKey,reason:"no_capacity"}))]};const u=[],d=i.map(m=>({accountKey:m.accountKey,reason:"no_capacity"}));for(const m of s){const h=wYt(o,m,r);if(o.spillover&&!h){d.push({accountKey:m.accountKey,reason:"spillover_inactive"});continue}const f=o.reserveFloor;if(f){const T=f.session5hPct!==void 0&&m.sessionUsed!==null&&m.sessionUsed*100>100-f.session5hPct,_=f.weekly7dPct!==void 0&&m.weeklyUsed!==null&&m.weeklyUsed*100>100-f.weekly7dPct;if(T||_){d.push({accountKey:m.accountKey,reason:"reserve_floor"});continue}}const g=vYt(o.maxSlicePerAccount,h?o.spillover?.maxSlicePct:void 0),y=g.session!==void 0&&m.borrowedSessionFraction*100>=g.session,w=g.weekly!==void 0&&m.borrowedWeeklyFraction*100>=g.weekly;if(y||w){d.push({accountKey:m.accountKey,reason:"slice_exhausted"});continue}u.push(m.accountKey)}return{allowed:u,excluded:d}}function _oe(e){return e.some(t=>t.reason==="reserve_floor")?"reserve_floor":e.some(t=>t.reason==="spillover_inactive")?"spillover_inactive":e.some(t=>t.reason==="slice_exhausted")?"slice_exhausted":"no_capacity"}var CKr="x-neurolink-share-token",kKr="x-neurolink-grant-status",AKr="x-neurolink-grant-reason",xKr="x-neurolink-grant-remaining-coins",IKr="x-neurolink-grant-peer";function RKr(e){const t=e[CKr];if(t?.trim())return t.trim();const r=e.authorization??e.Authorization;if(!r)return;const n=r.trim(),o=n.toLowerCase().startsWith("bearer ")?n.slice(7).trim():n;return T8r(o)?o:void 0}function MKr(e){return e===401?"authentication_error":e===403?"permission_error":"rate_limit_error"}function PKr(e,t){switch(e){case"paused":return"paused";case"revoked":return"revoked";case"expired":return"expired";case"exhausted":return"exhausted";case"out_of_window":return"out-of-window";case"missing_token":case"unknown_token":case"malformed_token":return"unauthorized";default:return t?.state??"active"}}function Nw(e,t){const{status:r,grant:n,retryAfterSeconds:o}=t,s={[kKr]:PKr(e,n),[AKr]:e};return n&&(s[IKr]=n.peerLabel,n.entitlement.ledger==="coins"&&(s[xKr]=String(Math.max(0,Math.floor(n.entitlement.coins??0))))),o!==void 0&&(s["retry-after"]=String(Math.max(1,Math.round(o)))),{status:r,headers:s,body:{type:"error",error:{type:MKr(r),message:t.message??EKr(e)}}}}pk(),Pr(),Os(),jt(),Pc(),Ja();var DKr="proxy-share-audit.json",OKr=2,NKr=3,LKr=1e3,FKr=null,Lw={},Hk=0,jk=-1,Vk=!1,$Kr=new wa;function boe(){return FKr??ft(ia(),".neurolink",DKr)}function UKr(e){return e?.code==="ENOENT"}async function BKr(e={}){const t=Date.now();if(!e.force&&Vk&&t-Hk<LKr)return;const r=boe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!UKr(o))throw o;Lw={},jk=-1,Hk=t,Vk=!0;return}if(!e.force&&Vk&&n===jk){Hk=t;return}try{Lw=JSON.parse(await Mr(r,"utf8"))?.records??{}}catch(o){if(e.force)throw o;Lw={}}jk=n,Hk=t,Vk=!0}async function zKr(){const e={schemaVersion:1,records:Lw};await Ta(boe(),e);try{jk=(await Es(boe())).mtimeMs}catch{jk=-1}Hk=Date.now(),Vk=!0}function TYt(e,t){return e===null||t===null?0:Math.max(0,(t-e)*100)}function GKr(e,t,r=OKr){if(!e)return{drifted:!1,reason:"no_baseline"};if(t.lenderRequests>0)return{drifted:!1,reason:"attributable"};const n=TYt(e.sessionUsed,t.sessionUsed),o=TYt(e.weeklyUsed,t.weeklyUsed),s=Math.max(n,o);return s<=r?{drifted:!1,reason:"quiet"}:t.reportedCoins>0?{drifted:!1,reason:"attributable"}:{drifted:!0,unexplainedSessionPct:n,unexplainedWeeklyPct:o,detail:`the account moved ${s.toFixed(1)}% of a window since the last check-in while this node served none of it and the borrower reported no spend`}}async function qKr(e){const t=e.streakLimit??NKr;return $Kr.runExclusive(async()=>{await BKr({force:!0});const r=Lw[e.grantId],n=e.lenderRequestsTotal===void 0?e.observation:{...e.observation,lenderRequests:Math.max(0,e.lenderRequestsTotal-(r?.lenderRequestsTotal??0))},o=GKr(r?.lastObservation,n,e.tolerancePct),s=o.drifted?(r?.driftStreak??0)+1:0,i={grantId:e.grantId,accountLabel:e.accountLabel,lastObservation:n,...e.lenderRequestsTotal!==void 0?{lenderRequestsTotal:e.lenderRequestsTotal}:r?.lenderRequestsTotal!==void 0?{lenderRequestsTotal:r.lenderRequestsTotal}:{},driftStreak:s,...o.drifted?{lastDriftAt:n.at,lastDriftDetail:o.detail}:{...r?.lastDriftAt!==void 0?{lastDriftAt:r.lastDriftAt}:{},...r?.lastDriftDetail!==void 0?{lastDriftDetail:r.lastDriftDetail}:{}},...r?.autoPausedAt!==void 0?{autoPausedAt:r.autoPausedAt}:{}},a=s>=t&&i.autoPausedAt===void 0;return a&&(i.autoPausedAt=n.at),Lw[e.grantId]=i,await zKr(),{verdict:o,shouldPause:a}})}no(),Pr(),Os(),jt(),Pc(),Ja();var HKr="proxy-share-provisioning.json",jKr=9e5,VKr=/^[A-Za-z0-9_-]{43}$/,WKr=/^[A-Za-z0-9_-]{16,128}$/,KKr=null,Fw={},EYt=!1,SYt=new wa;function _Yt(){return KKr??ft(ia(),".neurolink",HKr)}function JKr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.grantId=="string"&&typeof t.codeChallenge=="string"&&typeof t.state=="string"&&typeof t.expiresAt=="number"&&typeof t.status=="string"}async function bYt(e={}){if(!(EYt&&!e.force)){try{const t=JSON.parse(await Mr(_Yt(),"utf8"));Fw=Object.fromEntries(Object.entries(t?.requests??{}).filter(r=>JKr(r[1])))}catch{Fw={}}EYt=!0}}async function CYt(){const e={schemaVersion:1,requests:Fw};await Ta(_Yt(),e)}function YKr(e,t=Date.now()){return e.status!=="consumed"&&e.expiresAt>t}async function ZKr(e){if(!VKr.test(e.codeChallenge))return{ok:!1,reason:"code_challenge must be a base64url S256 digest"};if(!WKr.test(e.state))return{ok:!1,reason:"state must be 16-128 base64url characters"};const t=e.now??Date.now();return SYt.runExclusive(async()=>{await bYt({force:!0});const r={schemaVersion:1,grantId:e.grantId,codeChallenge:e.codeChallenge,challengeMethod:"S256",state:e.state,requestedAt:t,expiresAt:t+jKr,status:"pending"};return Fw[e.grantId]=r,await CYt(),{ok:!0,request:r}})}async function XKr(e,t=Date.now()){return SYt.runExclusive(async()=>{await bYt({force:!0});const r=Fw[e];if(!r||!YKr(r,t))return{status:"none"};if(r.status!=="authorized"||!r.code)return{status:"pending"};const{code:n,...o}=r;return Fw[e]={...o,status:"consumed",claimedAt:t},await CYt(),{status:"ready",code:r.code,state:r.state}})}Cjt(),no(),Pr(),Os(),jt(),Pc(),pk(),nL();var QKr="proxy-share-notes.json",kYt="nln",eJr=null,$w={},AYt=!1,tJr=new wa;function xYt(){return eJr??ft(ia(),".neurolink",QKr)}async function IYt(e={}){if(!(AYt&&!e.force)){try{$w=JSON.parse(await Mr(xYt(),"utf8"))?.notes??{}}catch{$w={}}AYt=!0}}async function rJr(){const{writeJsonSnapshotAtomically:e}=await Promise.resolve().then(()=>(Ja(),sre)),t={schemaVersion:1,notes:$w};await e(xYt(),t)}function nJr(e){const t=e.trim();if(t.startsWith(`${kYt}_`))try{const r=JSON.parse(Buffer.from(t.slice(kYt.length+1),"base64url").toString("utf8"));return typeof r?.noteId!="string"||typeof r.coins!="number"||typeof r.signature!="string"||typeof r.notAfter!="number"?void 0:r}catch{return}}async function oJr(e,t,r=Date.now()){const{signature:n,...o}=e;if(!t||!rL(o,n,t))return{status:"forged",coins:0};await IYt({force:!0});const s=$w[e.noteId];return s?s.redeemedAt!==void 0?{status:"spent",coins:s.coins}:s.notAfter<=r?{status:"expired",coins:s.coins}:{status:"valid",coins:s.coins}:{status:"unknown",coins:0}}async function sJr(e){const t=e.now??Date.now(),{signature:r,...n}=e.note;if(!e.secret||!rL(n,r,e.secret))return{ok:!1,status:"forged"};const o=await tJr.runExclusive(async()=>{await IYt({force:!0});const i=$w[e.note.noteId];return i?i.redeemedAt!==void 0?{status:"spent",coins:i.coins}:i.notAfter<=t?{status:"expired",coins:i.coins}:($w[i.noteId]={...i,redeemedAt:t,redeemedByGrant:e.grantId},await rJr(),{status:"valid",coins:i.coins}):{status:"unknown",coins:0}});if(o.status!=="valid")return{ok:!1,status:o.status};const s=await fjt(e.grantId,o.coins);return{ok:!0,coins:o.coins,balance:s}}nL(),Fjt();var iJr=64*1024,aJr=32;function RYt(e){try{const t=JSON.parse(e);return{errorType:t.error?.type??t.type??"stream_error",message:t.error?.message??t.message??"Upstream SSE error"}}catch{return{errorType:"stream_error",message:e.trim()||"Upstream SSE error"}}}function MYt(e){if(e.event==="error")return!0;try{const t=JSON.parse(e.data);return t.type==="error"||t.error!==void 0}catch{return!1}}async function cJr(e){const t=new TextDecoder,r=[];let n="",o=0;for(;o<iJr&&r.length<aJr;){let s;try{s=await e.read()}catch(a){return{kind:"transport_error",chunks:r,error:a}}if(s.done){n+=t.decode();const{events:a}=VL(n),c=a.find(MYt);return c?{kind:"sse_error",chunks:r,...RYt(c.data)}:r.length>0?{kind:"ready",chunks:r}:{kind:"empty",chunks:r}}if(!s.value||s.value.length===0)continue;r.push(s.value),o+=s.value.byteLength,n+=t.decode(s.value,{stream:!0});const i=VL(n);n=i.remainder;for(const a of i.events){if(MYt(a))return{kind:"sse_error",chunks:r,...RYt(a.data)};if(a.event!=="ping"&&(a.event||a.data))return{kind:"ready",chunks:r}}}return r.length>0?{kind:"ready",chunks:r}:{kind:"empty",chunks:r}}function PYt(){let e=!1,t;const r=new Promise(o=>{t=o}),n=o=>{e||(e=!0,t(o))};return{outcome:r,complete:()=>n({kind:"completed"}),fail:o=>n({kind:"upstream_error",message:o}),cancel:()=>n({kind:"client_cancelled"})}}function KL(e,t){return e.kind==="completed"&&t?{kind:"upstream_error",message:t}:e}function lJr(e){const t=e.toLowerCase();return t.includes("opus")?"opus":t.includes("sonnet")?"sonnet":t.includes("haiku")?"haiku":"other"}function Uw(e,t,r,n,o=!1){const s=[{provider:e.provider,model:e.model,label:`${e.provider}/${e.model??"unknown"}`}];for(const i of t)i.provider===e.provider&&i.model===e.model||s.push({provider:i.provider,model:i.model,label:`${i.provider}/${i.model}`});return o&&(t.length===0||s.length===1)&&s.push({label:"auto-provider"}),{requestedModel:r,modelTier:lJr(r),attempts:s,skipped:[]}}function JL(e){if(!e)return 0;const t=parseInt(e,10);if(!Number.isNaN(t))return Math.max(1,t)*1e3;const r=new Date(e);return Number.isNaN(r.getTime())?0:Math.max(1e3,r.getTime()-Date.now())}var uJr=1,dJr=20;function Coe(e){return typeof e=="number"&&Number.isInteger(e)&&e>=uJr&&e<=dJr?e:void 0}Ja(),tL(),ar(),B(),Qr(),Hf(),ig();var DYt=new WeakMap;function mJr(e,t){const r=DYt.get(e);if(r){r.push(t);return}DYt.set(e,[t])}tL(),ar(),B();var OYt=900*1e3,NYt=6e4,pJr=900*1e3,LYt=6e4,jd="codex-oauth",hJr="neurolink.codexFallback";function FYt(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 fJr(e){const t=FYt(e);return t==="ENOTFOUND"||t==="EAI_AGAIN"?"shared_provider_transport":"connection_transport"}function YL(e,t){return $n(e).slice(0,200)||t}var koe=new Map;async function gJr(e,t,r,n){const o=koe.get(e);if(o)return o;const s=(async()=>{const i=await r.peekTokens(e).catch(()=>null),a=i?.refreshToken??t,c=await n(a),l={accessToken:c.accessToken,refreshToken:c.refreshToken??a,expiresAt:c.expiresAt??i?.expiresAt??Date.now()+36e5};return i&&await r.saveTokens(e,{...l,tokenType:"Bearer",...i.scope?{scope:i.scope}:{}}),l})().finally(()=>{koe.delete(e)});return koe.set(e,s),s}async function Aoe(e,t){return gJr(e,t,Is,rVr)}var yJr=new Set(["host","connection","content-length","transfer-encoding","cookie","proxy-authorization","authorization","x-api-key","chatgpt-account-id","accept-encoding"]);function ZL(e,t){return new Response(JSON.stringify({error:{type:"proxy_error",message:t}}),{status:e,headers:{"content-type":"application/json"}})}async function $Yt(){const e=await Is.listByPrefix(wp),[t,r]=await Promise.all([Mk(),Fne()]),n=Date.now(),o=[];for(const s of e){if(await Is.isDisabled(s))continue;const i=await Is.loadTokens(s);if(!i||i.tokenType!=="Bearer")continue;let a=i.accessToken,c=i.expiresAt;if(oVr(c)&&i.refreshToken)try{const d=await Aoe(s,i.refreshToken);a=d.accessToken,c=d.expiresAt??c}catch(d){p.debug(`Codex proactive refresh failed for ${s.slice(wp.length)}: ${d instanceof Error?d.message:String(d)}`)}const l=t[s],u=l&&l.coolingUntil>n;o.push({key:s,label:s.slice(wp.length)||s,token:a,refreshToken:i.refreshToken,expiresAt:c,accountId:Dk(a),quota:r[s],coolingUntil:u?l.coolingUntil:void 0,coolingReason:l?.reason,expiredCooldownUntil:l&&!u?l.coolingUntil:void 0})}return o}function UYt(e,t){return[...e].sort((r,n)=>{const o=r.coolingUntil!==void 0&&r.coolingUntil>t,s=n.coolingUntil!==void 0&&n.coolingUntil>t;if(o!==s)return o?1:-1;const i=r.quota?r.quota.sessionUsed:-1,a=n.quota?n.quota.sessionUsed:-1;return i-a})}function BYt(e,t){const r={};for(const[o,s]of Object.entries(e)){const i=o.toLowerCase();yJr.has(i)||(r[i]=s)}r.authorization=`Bearer ${t.token}`;const n=Dk(t.token,t.accountId);return n&&(r["chatgpt-account-id"]=n),r["content-type"]="application/json",r["user-agent"]||(r["user-agent"]=Gne),r.originator||(r.originator=X9r),r.accept||(r.accept="text/event-stream"),r}function vJr(e,t,r){const n=r+NYt;if(e){if(e.weeklyStatus==="rejected"&&e.weeklyResetAt>0)return{coolingUntil:Math.max(e.weeklyResetAt*1e3,n),reason:"weekly"};if(e.sessionStatus==="rejected"&&e.sessionResetAt>0)return{coolingUntil:Math.max(e.sessionResetAt*1e3,n),reason:"session"}}const o=Math.min(pJr,Math.max(t,NYt));return{coolingUntil:r+o,reason:"transient"}}function wJr(e,t,r,n){e.responseHeaders||(e.responseHeaders={}),e.responseHeaders["x-neurolink-account"]=t.label,e.responseHeaders["x-neurolink-account-type"]="codex-oauth",e.responseHeaders["x-neurolink-served-by"]="codex",e.responseHeaders["x-neurolink-attempt"]=String(r),e.responseHeaders["x-neurolink-quota-source"]=n?"live":"none",n&&(e.responseHeaders["x-neurolink-quota-session-left-pct"]=String(Math.round((1-n.sessionUsed)*100)),e.responseHeaders["x-neurolink-weekly-left-pct"]=String(Math.round((1-n.weeklyUsed)*100)))}async function zYt(e){const t=Date.now(),r=e.body??{},n=JSON.stringify(r),o=typeof r.model=="string"?r.model:"-",s=e.metadata?.[hJr]===!0,i=(T,_,b={})=>Sp({timestamp:new Date().toISOString(),requestId:e.requestId,method:e.method,path:e.path,model:o,stream:!0,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:T?.label??"",...T?{accountKey:T.key}:{},accountType:T?jd:"",provider:"openai",...Pw(e.headers),responseStatus:_,responseTimeMs:Date.now()-t,...b});let a=!1;const c=async(T,_,b={})=>{s||a||(a=!0,_>=400?aw(_,T?.label,T?jd:void 0,{requestId:e.requestId,...T?{accountKey:T.key}:{},errorType:b.errorType,terminalOutcome:b.terminalOutcome??"handler_error",message:b.errorMessage,errorCode:b.errorCode}):ck(T?.label,T?jd:void 0),await i(T,_,b))},l=(T,_,b,k,A={})=>{QJt({timestamp:new Date().toISOString(),requestId:e.requestId,attempt:_,method:e.method,path:e.path,model:o,stream:!0,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:T.label,accountKey:T.key,accountType:jd,provider:"openai",responseStatus:k,responseTimeMs:Date.now()-t,attemptDurationMs:Date.now()-b,...A}).catch(()=>{})},u=await $Yt();if(u.length===0)return await c(void 0,401,{errorType:"no_accounts",errorMessage:"No Codex accounts"}),ZL(401,"No Codex accounts configured. Run `neurolink auth login codex`.");const d=Date.now(),m=UYt(u,d),h=m.filter(T=>!(T.coolingUntil!==void 0&&T.coolingUntil>d));if(h.length===0){const T=m.reduce((b,k)=>k.coolingUntil===void 0?b:b===void 0?k.coolingUntil:Math.min(b,k.coolingUntil),void 0),_=T?Math.max(1,Math.ceil((T-d)/1e3)):60;return await c(void 0,429,{errorType:"all_accounts_cooling",errorMessage:"All Codex accounts are rate-limited"}),new Response(JSON.stringify({error:{type:"rate_limit_error",message:"All Codex accounts are currently rate-limited"}}),{status:429,headers:{"content-type":"application/json","retry-after":String(_)}})}let f=0,g="All Codex accounts failed",y=502,w;for(const T of h){let _=!1;for(;;){f+=1;const b=Date.now();w=T,ag(T.label,jd);let k;try{k=await fetch(J9r,{method:"POST",headers:BYt(e.headers,T),body:n,signal:AbortSignal.timeout(OYt)})}catch(x){p.debug(`Codex upstream fetch failed (${T.label}): ${$n(x instanceof Error?x.message:String(x))}`);const P=YL(x instanceof Error?x.message:String(x),"Codex upstream request failed"),N=FYt(x),F=fJr(x);_r(T.label,jd,502),l(T,f,b,502,{errorType:"network_error",errorMessage:P,...N?{errorCode:N}:{},transportScope:F,retryable:!0}),g="Codex upstream request failed",y=502;break}if(k.ok){const x=AJt(k.headers);x&&vp(T.key,x).catch(()=>{}),T.expiredCooldownUntil!==void 0&&pg(T.key,T.expiredCooldownUntil).catch(()=>{}),wJr(e,T,f,x),l(T,f,b,k.status);const P={"content-type":k.headers.get("content-type")??"text/event-stream","cache-control":"no-cache",connection:"keep-alive",...e.responseHeaders??{}};if(!k.body)return await c(T,k.status,{terminalOutcome:"bodyless"}),new Response(k.body,{status:k.status,headers:P});const{stream:N,usage:F}=SVr(),O=new Response(k.body.pipeThrough(N),{status:k.status,headers:P});return mJr(e.metadata,{onTerminal:({outcome:M})=>{F.then(U=>{const $=U?{inputTokens:U.inputTokens,outputTokens:U.outputTokens,cacheReadTokens:U.cacheReadTokens,cacheCreationTokens:U.cacheCreationTokens}:{};return M==="completed"||M==="bodyless"?c(T,k.status,{terminalOutcome:M,...$}):c(T,M==="client_cancelled"?499:502,{errorType:M==="client_cancelled"?"client_cancelled":"stream_error",errorMessage:M==="client_cancelled"?"Client cancelled Codex stream":"Codex upstream stream failed",terminalOutcome:M,...$})}).catch(()=>{})}}),O}const A=await k.text().catch(()=>"");if((k.status===401||k.status===403)&&!_&&T.refreshToken){const x=YL(A,"Codex authentication rejected upstream");_r(T.label,jd,k.status),l(T,f,b,k.status,{errorType:"authentication_error",errorMessage:x,retryable:!0}),_=!0;const P={accessToken:T.token,refreshToken:T.refreshToken,expiresAt:T.expiresAt??0};try{const N=await Aoe(T.key,T.refreshToken);T.token=N.accessToken,T.refreshToken=N.refreshToken??T.refreshToken,T.expiresAt=N.expiresAt??T.expiresAt,T.accountId=Dk(N.accessToken);continue}catch(N){if(nVr(N)){await Is.markDisabledIfCurrent(T.key,P,"refresh_invalid")&&p.always(`[proxy] codex account=${T.label} disabled until re-authentication. Run: neurolink auth login codex --label ${T.label}`),y=401,g="Codex token refresh failed; re-login required";break}await Eu(T.key,Date.now()+LYt,"auth").catch(()=>{}),p.debug(`[proxy] codex account=${T.label} refresh failed transiently; cooling and rotating`),y=503,g="Codex token refresh temporarily unavailable";break}}if(k.status===429){const x=AJt(k.headers);x&&vp(T.key,x).catch(()=>{});const P=JL(k.headers.get("retry-after")),N=vJr(x,P,Date.now());await Eu(T.key,N.coolingUntil,N.reason).catch(()=>{});const F=N.reason==="transient"?"transient":"quota",O=YL(A,"Codex account rate-limited");_r(T.label,jd,k.status,F),l(T,f,b,k.status,{errorType:"rate_limit_error",errorMessage:O,retryable:!0,rateLimitKind:F,cooldownReason:N.reason}),y=429,g="Codex account rate-limited";break}(k.status===401||k.status===403)&&await Eu(T.key,Date.now()+LYt,"auth").catch(()=>{});const I=YL(A,"Codex error"),R=k.status===401||k.status===403?"authentication_error":"api_error";_r(T.label,jd,k.status),l(T,f,b,k.status,{errorType:R,errorMessage:I,retryable:k.status>=500}),y=k.status>=500?502:k.status,g=I;break}}return await c(w,y,{errorType:"all_accounts_failed",errorMessage:g}),ZL(y,g)}async function TJr(e){const t=await $Yt();if(t.length===0)return ZL(401,"No Codex accounts configured. Run `neurolink auth login codex`.");const r=Date.now(),n=UYt(t,r),o=d=>d.coolingUntil!==void 0&&d.coolingUntil>r,s=[...n.filter(d=>!o(d)),...n.filter(o)],a=new URLSearchParams(e.query??{}).toString(),c=a?`${EJt}?${a}`:EJt;let l=502,u="Codex model discovery upstream failed";for(const d of s){let m=!1;for(;;){let h;try{h=await fetch(c,{method:"GET",headers:BYt(e.headers??{},d),signal:AbortSignal.timeout(OYt)})}catch(y){l=502,u=`Codex model discovery upstream failed: ${y instanceof Error?y.message:String(y)}`;break}if(h.status===401||h.status===403){if(!m&&d.refreshToken){m=!0;try{const y=await Aoe(d.key,d.refreshToken);d.token=y.accessToken,d.refreshToken=y.refreshToken??d.refreshToken,d.expiresAt=y.expiresAt??d.expiresAt,d.accountId=Dk(y.accessToken);continue}catch{l=401,u="Codex token refresh failed; re-login required";break}}l=h.status,u="Codex model discovery rejected upstream";break}const f=await h.text(),g=h.headers.get("content-type")??"application/json";return new Response(f,{status:h.status,headers:{"content-type":g}})}}return ZL(l,u)}function EJr(e=""){return{prefix:`${e}/backend-api/codex`,routes:[{method:"POST",path:`${e}/backend-api/codex/responses`,description:"Codex ChatGPT-backend Responses API (account pool)",handler:t=>zYt(t)},{method:"GET",path:`${e}/backend-api/codex/models`,description:"Codex model discovery, relayed upstream (account pool)",handler:t=>TJr(t)}]}}var XL=new Set(["cookie","proxy-authorization","host","connection","content-length","transfer-encoding"]),xoe="proxy/internal",Ioe="internal";function GYt(e,t){return e?t==="codex-oauth"?{accountKey:e.startsWith("codex:")?e:`codex:${e}`,provider:"openai"}:t==="oauth"||t==="api_key"||t==="passthrough"?{accountKey:t==="passthrough"?e:mp(e),provider:"anthropic"}:{}:{}}var _p=0,qYt=0,Wk=5,QL=2,Roe=[250,1e3],HYt=4,jYt=[250,500,1e3,2e3],Moe=1,SJr=120*1e3,Poe=2,VYt=3e4,WYt=11520*60*1e3,KYt=5e3,_Jr=900*1e3,Doe=900*1e3,bJr=3e4,CJr=300*1e3,Kk=900*1e3,JYt;function Ooe(e,t){return JYt??=new LS({headersTimeout:Kk,bodyTimeout:Kk}),fetch(e,{...t,dispatcher:JYt})}var ec=new Map,Jk=new uVr,Bw=new mVr,Noe=900*1e3,YYt=new Map,ZYt=new Map,eF=new Map,kJr={release:()=>{}};function XYt(e){let t=eF.get(e);return t||(t={active:0,waiters:[]},eF.set(e,t)),t}function Loe(e,t){for(;t.waiters.length>0&&t.active<t.waiters[0].capacity;){const r=t.waiters.shift();if(!r)return;t.active+=1,r.resolve(QYt(e,t))}}function QYt(e,t){let r=!1;return{release:()=>{r||(r=!0,t.active=Math.max(0,t.active-1),Loe(e,t),eZt(e,t))}}}function eZt(e,t){t.active===0&&t.waiters.length===0&&eF.delete(e)}function AJr(e,t){const r=Coe(t);if(r===void 0)return kJr;const n=XYt(e);if(!(n.waiters.length>0||n.active>=r))return n.active+=1,QYt(e,n)}function xJr(e,t){const r=Coe(t);if(r===void 0)return!0;const n=eF.get(e);return!n||n.waiters.length===0&&n.active<r}function IJr(e,t){const r=Coe(t);if(r===void 0)throw new Error("Account admission queue requires an explicit capacity");const n=XYt(e);let o=!0,s,i;const a=new Promise(l=>{i=l}),c={capacity:r,resolve:l=>{o=!1,s=l,i(l)}};return n.waiters.push(c),Loe(e,n),{accountKey:e,promise:a,cancel:()=>{if(s){const u=s;s=void 0,u.release();return}if(!o)return;o=!1;const l=n.waiters.indexOf(c);l>=0&&(n.waiters.splice(l,1),Loe(e,n)),eZt(e,n)}}}async function RJr(e,t,r,n=rZt){const o=[...new Set(e)].map(i=>IJr(i,t));let s;try{return await Mt(bbe(Promise.race(o.map(i=>i.promise.then(a=>s?(a.release(),new Promise(()=>{})):(s=i.accountKey,{accountKey:i.accountKey,lease:a})))),r),n,`Account admission timed out after ${n}ms`)}catch(i){if(r?.aborted)throw i;return}finally{for(const i of o)i.accountKey!==s&&i.cancel()}}var tZt=!1,Foe=6e4,rZt=9e4,MJr=12e4,PJr=250,DJr=15e3;function vg(e,t,r){t<=1||e===r&&(_p=(_p+1)%t)}function nZt(e,t){if(!t)return 0;const r=e.findIndex(n=>HHt(n.key,t));return r>=0?r:0}function OJr(e,t){if(e.length<=1)return;const r=nZt(e,t);if(_p===r)return;const n=e[r],o=ec.get(n.key);if((!o||!o.coolingUntil||Date.now()>=o.coolingUntil)&&(_p=r,o?.coolingUntil)){const s=o.coolingUntil;o.coolingUntil=void 0,o.coolingReason=void 0,pg(n.key,s).catch(()=>{}),p.always(`[proxy] home primary account=${n.label} cooling expired, resetting primaryAccountIndex to ${r}`)}}function oZt(e){const t=ec.get(e);return!!t?.coolingUntil&&Date.now()<t.coolingUntil}function NJr(e,t,r=Date.now()){let n=YYt.get(e);if(!n||r>=n.coolingUntil?(n={coolingUntil:t,retriesClaimed:0},YYt.set(e,n)):t>n.coolingUntil&&(n.coolingUntil=t),!(n.retriesClaimed>=Poe))return n.retriesClaimed+=1,n.retriesClaimed}function LJr(e,t,r=Date.now()){if(t<=r)return 0;if(t-r>rZt)return;let n=ZYt.get(e);!n||r>=n.coolingUntil?(n={coolingUntil:t,nextAdmissionAt:t},ZYt.set(e,n)):t>n.coolingUntil&&(n.coolingUntil=t,n.nextAdmissionAt=Math.max(n.nextAdmissionAt,t));const o=Math.max(r,n.coolingUntil,n.nextAdmissionAt);if(!(o-n.coolingUntil>DJr))return n.nextAdmissionAt=o+PJr,o-r}async function FJr(e){const t=Date.now()+MJr;for(;Date.now()<t;){const r=e.filter(i=>!oZt(i.key));if(r.length>0)return r;const n=Date.now(),o=e.map(i=>({account:i,state:ba(i.key)})).filter(({state:i})=>i.coolingReason==="transient"&&i.coolingUntil!==void 0&&i.coolingUntil>n).sort((i,a)=>(i.state.coolingUntil??Number.POSITIVE_INFINITY)-(a.state.coolingUntil??Number.POSITIVE_INFINITY))[0];if(!o?.state.coolingUntil)return[];const s=LJr(o.account.key,o.state.coolingUntil,n);if(s===void 0||n+s>t)return[];p.always(`[proxy] all usable accounts are transiently cooling; queueing request for account=${o.account.label} in ${s}ms`),await _u(s)}return[]}function Rs(e,t){if(!e||e<=0)return;const r=e>4102444800?e:e*1e3;return r>t?r:void 0}function Yk(e,t){try{const r=t.poolAccounts?wVr(t.poolAccounts.map(o=>{const s=ec.get(o.key);return{...s?.coolingUntil!==void 0?{coolingUntil:s.coolingUntil}:{},...s?.quota?{quota:s.quota}:{}}})):void 0,n=vVr({...t.upstreamHeaders?{upstreamHeaders:t.upstreamHeaders}:{},context:{quota:t.quota??null,source:t.source,...t.account?{accountLabel:t.account.label}:{},...t.accountType??t.account?.type?{accountType:t.accountType??t.account?.type}:{},...t.servedBy?{servedBy:t.servedBy}:{},...t.attempt!==void 0?{attempt:t.attempt}:{},...t.accountState?.coolingUntil!==void 0?{coolingUntil:t.accountState.coolingUntil}:{},...t.accountState?.coolingReason?{coolingReason:t.accountState.coolingReason}:{},...r?{pool:r}:{}}});e.responseHeaders={...e.responseHeaders??{},...gZt(n)}}catch(r){p.debug(`[proxy] failed to publish limit headers: ${r instanceof Error?r.message:String(r)}`)}}function tF(e,t,r){const n=Math.min(WYt,(r&&aJt[r])??WYt);return Math.min(Math.max(e,t+KYt),t+n)}function rF(e){return e?.trim().toLowerCase()==="allowed"}function sZt(e,t){return!e||Rs(e.resetsAt,t)===void 0?!1:e.status?.trim().toLowerCase()==="rejected"||(e.used??0)>=1}function $Jr(e,t,r,n=Nc){if(!e||!t||!rF(e.sessionStatus)||!rF(e.weeklyStatus)||zw(e,n))return null;const o=Voe(e,t,r);return sZt(o,r)?o:null}function UJr(e,t,r=Nc){return!rF(e.sessionStatus)||!rF(e.weeklyStatus)||zw(e,r)?!1:(e.windows??[]).some(n=>n.kind==="weekly_scoped"&&typeof n.scopeModel=="string"&&t-joe(e,n)<=Noe&&sZt(n,t))}function $oe(e,t,r,n=e?.unifiedStatus,o=Nc,s){if(e&&e.weeklyStatus==="rejected"){const l=Rs(e.weeklyResetAt,r)??(t>0?r+t:r+Foe);return{reason:"weekly",scope:"account",coolingUntil:tF(l,r,"weekly"),rotateImmediately:!0}}const i=zw(e,o);if(e&&e.sessionStatus==="rejected"&&!i){const l=Rs(e.sessionResetAt,r)??(t>0?r+t:r+Foe);return{reason:"session",scope:"account",coolingUntil:tF(l,r,"session"),rotateImmediately:!0}}const a=$Jr(e,s,r,o);if(a)return{reason:"unified",scope:"model",coolingUntil:Rs(a.resetsAt,r)??(t>0?r+t:r+Doe),rotateImmediately:!0};if(n?.trim().toLowerCase()==="rejected"&&!i){const l=t>0?r+t:r+Doe;return{reason:"unified",scope:"account",coolingUntil:tF(l,r,"unified"),rotateImmediately:!0}}const c=t>0?t:Foe;return{reason:"transient",scope:"account",coolingUntil:r+Math.max(KYt,Math.min(c,_Jr)),rotateImmediately:!1}}function Uoe(e,t){return Math.max(0,Math.round((e-t)/6e4))}function Boe(e,t,r,n=Nc){const o=zw(t,n),s=UJr(t,r,n);let i,a;if(t.weeklyStatus==="rejected"&&(i=Rs(t.weeklyResetAt,r),a="weekly"),i===void 0&&o&&e.coolingUntil&&(e.coolingReason==="session"||e.coolingReason==="unified")){const l=e.coolingUntil;return e.coolingUntil=void 0,e.coolingReason=void 0,p.always("[proxy] clearing subscription cooldown because Anthropic explicitly permits overage"),{kind:"cleared",coolingUntil:l}}if(i===void 0&&t.sessionStatus==="rejected"&&!o?(i=Rs(t.sessionResetAt,r),a="session"):i===void 0&&t.unifiedStatus==="rejected"&&!o&&!s&&(i=r+Doe,a="unified"),i===void 0){if(!!e.coolingUntil&&(e.coolingReason==="weekly"&&t.weeklyStatus==="allowed"||e.coolingReason==="session"&&t.sessionStatus==="allowed"||e.coolingReason==="unified"&&(t.unifiedStatus==="allowed"||s))&&e.coolingUntil){const u=e.coolingUntil,d=e.coolingReason;return e.coolingUntil=void 0,e.coolingReason=void 0,p.always(`[proxy] clearing ${d} cooldown from fresh provider quota`),{kind:"cleared",coolingUntil:u}}return null}const c=tF(i,r,a);return!e.coolingUntil||c>e.coolingUntil?(e.coolingUntil=c,e.coolingReason=a,p.always(`[proxy] proactively cooling account (${a}) ~${Uoe(c,r)}m from success-response quota (status rejected)`),{kind:"cooled",coolingUntil:c,coolingReason:a??"unified"}):null}async function BJr(e){try{const[t,r]=await Promise.all([Fne(),Mk()]),n=Date.now();for(const o of e){const s=ba(o.key);s.quota||(s.quota=t[o.key]??t[o.label]);const i=r[o.key];i?.coolingUntil>n&&(!s.coolingUntil||i.coolingUntil>s.coolingUntil)&&(s.coolingUntil=i.coolingUntil,s.coolingReason=i.reason)}}catch{}}var zJr=15e3,iZt=new Map,nF=null,GJr=4;async function aZt(e,t,r,n){if(t.ok===!1)return null;const o=ba(e.key),s=wJt(t.usage,{now:r,prior:o.quota??n??null});if(!s)return null;if(s.lastUpdated<(o.quota?.lastUpdated??0))return o.quota??null;o.quota=hg(o.quota,s);const i=Boe(o,s,Date.now());return i?.kind==="cooled"?await Eu(e.key,i.coolingUntil,i.coolingReason).catch(()=>{}):i?.kind==="cleared"&&await pg(e.key,i.coolingUntil).catch(()=>{}),await vp(e.key,s).catch(()=>{}),s}async function cZt(e){const t=await q9r(e);return t.ok===!1||wJt(t.usage,{now:Date.now(),prior:ec.get(e.key)?.quota??null})?t:{ok:!1,reason:"parse",error:"usage payload had no recognizable limit windows"}}async function oF(e,t){const r=await Jk.run(e,t,cZt);r.kind!=="completed"||r.result.ok===!1||await aZt(e,r.result,r.startedAt)}var Zk=null;async function qJr(e){if(Zk)return{anthropic:Zk.anthropic,codex:Zk.codex};const[t,r]=await Promise.all([yJt(e),iVr()]);return{anthropic:t,codex:r}}async function HJr(){if(Zk)return Zk.knownKeys;const[e,t]=await Promise.all([Is.listByPrefix("anthropic:"),Is.listByPrefix("codex:")]);return new Set([...e.map(mp),...t])}async function zoe(e={}){const t=Date.now(),r=await qJr(e.accountAllowlist),n=[...r.anthropic.map(u=>({account:u,provider:"anthropic"})),...r.codex.map(u=>({account:u,provider:"codex"}))],o=e.accountFilter?n.filter(({account:u})=>u.label===e.accountFilter||u.key===e.accountFilter):n,s=await Fne().catch(()=>({})),i=(u,d,m,h,f)=>{const g=ec.get(u.key),y=d==="anthropic"?s[u.key]??s[u.label]??null:s[u.key]??null,w={account:u.label,key:u.key,provider:d,type:u.type,status:m,quota:h??g?.quota??y};return f!==void 0&&(w.error=f),g?.coolingUntil&&g.coolingUntil>Date.now()&&(w.coolingUntil=g.coolingUntil,g.coolingReason&&(w.coolingReason=g.coolingReason)),w};if(e.snapshotOnly)return{fetchedAt:t,snapshot:!0,results:o.map(({account:u,provider:d})=>i(u,d,"snapshot",null)),refreshMetrics:Jk.getMetrics()};const a=new Array(o.length);let c=0;const l=async()=>{for(;;){const u=c++;if(u>=o.length)return;const{account:d,provider:m}=o[u];if(d.type!=="oauth"){a[u]=i(d,m,"skipped_api_key",null);continue}const h=iZt.get(d.key)??0;if(Date.now()-h<zJr){a[u]=i(d,m,"throttled",null);continue}if(iZt.set(d.key,Date.now()),m==="codex"){try{const f=await aVr(d);if(f.ok===!1){a[u]=i(d,m,"error",null,`codex usage fetch failed: ${f.reason}`);continue}await vp(d.key,f.quota),a[u]=i(d,m,"refreshed",f.quota)}catch(f){a[u]=i(d,m,"error",null,f instanceof Error?f.message:String(f))}continue}try{const f=await Jk.run(d,`manual:${d.key}`,cZt,{force:!0});if(f.kind!=="completed"){a[u]=i(d,m,"throttled",null);continue}const g=f.result;if(g.ok===!1){a[u]=i(d,m,"error",null,g.error);continue}const y=await aZt(d,g,f.startedAt,s[d.key]??s[d.label]??null);if(!y){a[u]=i(d,m,"error",null,"usage payload had no recognizable limit windows");continue}a[u]=i(d,m,"refreshed",y)}catch(f){a[u]=i(d,m,"error",null,f instanceof Error?f.message:String(f))}}};return await Promise.all(Array.from({length:Math.min(GJr,o.length||1)},()=>l())),{fetchedAt:t,snapshot:!1,results:a,refreshMetrics:Jk.getMetrics()}}function Goe(){const e=(process.env.NEUROLINK_PROXY_QUOTA_ROUTING??"").toLowerCase();return e!=="off"&&e!=="false"&&e!=="0"}function qoe(){const e=Number(process.env.NEUROLINK_PROXY_SESSION_SOFT_LIMIT??"");return Number.isFinite(e)&&e>0&&e<=1?e:.97}function Xk(){const e=Number(process.env.NEUROLINK_PROXY_SESSION_RESET_TOLERANCE_MS??"");return Number.isInteger(e)&&e>0?e:900*1e3}var Nc="auto";function Hoe(e){e!==void 0&&(Nc=e)}function jJr(){return Nc}function zw(e,t=Nc){return t==="never"?!1:lJt(e)}var VJr=4;function sF(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function WJr(e){const t=sF(e);return t.startsWith("claude")?t.slice(6):t}function KJr(e,t,r){if(e.scopeModelId&&sF(RL(e.scopeModelId))===r)return Number.MAX_SAFE_INTEGER;if(!e.scopeModel)return null;const n=WJr(e.scopeModel);return n.length<VJr||!t.includes(n)?null:n.length}function joe(e,t){return t.updatedAt??e.windowsUpdatedAt??e.lastUpdated}function Voe(e,t,r=Date.now()){if(!e?.windows?.length||!t)return null;const n=sF(t);if(!n)return null;const o=sF(RL(t));let s=null,i=-1,a=-1;for(const c of e.windows){if(r-joe(e,c)>Noe)continue;const l=KJr(c,n,o);if(l===null)continue;const u=joe(e,c);(l>i||l===i&&u>a)&&(s=c,i=l,a=u)}return s}function JJr(e,t,r=Date.now(),n=Nc){if(!t||e.length===0)return{eligible:e,exhaustion:null};const o=[],s=[];let i;for(const c of e){const l=ec.get(c.key)?.quota,u=Voe(l,t,r),d=u?Rs(u.resetsAt,r):void 0;if(!(u!==null&&d!==void 0&&((u.status??"").trim().toLowerCase()==="rejected"||(u.used??0)>=1)&&!zw(l,n))||!u){o.push(c);continue}s.push({label:c.label,window:u}),i??=l?.overageDisabledReason}if(o.length>0||s.length===0)return{eligible:o,exhaustion:null};const a=Math.min(...s.map(c=>Rs(c.window.resetsAt,r)??Number.POSITIVE_INFINITY));return{eligible:o,exhaustion:{model:t,scopeModel:s[0]?.window.scopeModel??RL(t),earliestResetMs:a,accounts:s.map(c=>c.label),...i?{overageDisabledReason:i}:{}}}}function iF(e,t,r,n,o,s=Nc){const i=ec.get(e),a=i?.quota,c=a&&Number.isFinite(a.lastUpdated)?a.lastUpdated:null,l=c===null?null:Math.max(0,t-c),u=Jk.getState(e),d=l!==null&&l>Noe,m=ne=>ne.trim().toLowerCase(),h=lJt(a),f=[a?.unifiedStatus,a?.sessionStatus,a?.weeklyStatus].filter(ne=>!!ne?.trim()),g=d&&!!a&&!h&&f.some(ne=>m(ne)!=="allowed"),y=a?d?g?"refresh_due":"stale_known":"fresh":"unknown",w=g?void 0:a,T=!!i?.coolingUntil&&t<i.coolingUntil,_=Rs(w?.weeklyResetAt,t),b=Rs(w?.sessionResetAt,t),k=b!==void 0,A=_!==void 0,I=w?k?w.sessionUsed??0:0:null,R=w?A?w.weeklyUsed??null:0:null,x=w?k?w.sessionStatus??"unknown":"allowed":null,P=w?A?w.weeklyStatus??"unknown":"allowed":null,N=zw(w,s),F=!N&&(x==="rejected"||x==="throttled"||P==="rejected"||P==="throttled"||w?.unifiedStatus?.trim().toLowerCase()==="rejected"||k&&(I??0)>=1||A&&(R??0)>=1),O=!F&&!N&&k&&(I??0)>=r,M=F||O,U=Voe(w,o,t),$=U?Rs(U.resetsAt,t):void 0,H=$!==void 0,V=U?H?U.used:0:null,W=U?H?U.status??"unknown":"allowed":null,Q=!d&&H&&(V??0)>=r;return{usable:!T&&!F&&(W!=="rejected"||N),saturated:M,scopedModel:U?.scopeModel??null,scopedStatus:W,scopedUsed:V,scopedReset:$??Number.POSITIVE_INFINITY,scopedUsedForSort:V??-1,scopedSaturated:Q,hasQuota:!!a,quotaEvidenceRank:y==="fresh"||y==="stale_known"?0:y==="refresh_due"?1:2,quotaStale:d,quotaFreshness:y,refreshNeeded:y==="unknown"||y==="refresh_due",refreshReason:y==="unknown"?"startup_unknown":y==="refresh_due"?"ambiguous_snapshot":null,refreshInFlight:u.inFlight,lastRefreshAttemptAt:u.lastAttemptAt??null,lastRefreshSuccessAt:u.lastSuccessAt??null,nextRefreshEligibleAt:u.nextEligibleAt??null,saturationKind:F?"hard":O?"soft":"none",softLimitOverrideReason:N&&k&&(I??0)>=r?"overage":null,quotaLastUpdated:c,quotaAgeMs:l,coolingActive:T,coolingReason:i?.coolingReason??null,coolingUntil:i?.coolingUntil??0,unifiedStatus:w?.unifiedStatus??null,fallbackStatus:w?.fallbackStatus??null,upgradePaths:w?.upgradePaths??null,overageEligible:N,overageStatus:w?.overageStatus??null,sessionStatus:x,sessionUsed:I,sessionResetBucket:k?Math.floor(b/n):Number.POSITIVE_INFINITY,sessionReset:b??Number.POSITIVE_INFINITY,weeklyStatus:P,weeklyReset:_??Number.POSITIVE_INFINITY,weeklyUsed:R,weeklyUsedForSort:R??-1}}function lZt(e,t,r,n){const o=r.get(e.key),s=r.get(t.key);if(!o||!s)return[0,"insertion_order"];if(o.usable!==s.usable)return[o.usable?-1:1,"availability"];if(!o.usable&&!s.usable){const i=o.coolingUntil||Number.POSITIVE_INFINITY,a=s.coolingUntil||Number.POSITIVE_INFINITY;return[i===a?0:i-a,i===a?"insertion_order":"cooldown_recovery"]}if(o.quotaEvidenceRank!==s.quotaEvidenceRank)return[o.quotaEvidenceRank-s.quotaEvidenceRank,"quota_evidence"];if(o.saturated!==s.saturated)return[o.saturated?1:-1,"session_headroom"];if(o.scopedSaturated!==s.scopedSaturated)return[o.scopedSaturated?1:-1,"scoped_headroom"];if(o.saturated&&s.saturated){if(o.sessionResetBucket!==s.sessionResetBucket)return[o.sessionResetBucket-s.sessionResetBucket,"session_reset"];if(o.weeklyReset!==s.weeklyReset)return[o.weeklyReset-s.weeklyReset,"weekly_reset"]}else{if(o.weeklyReset!==s.weeklyReset)return[o.weeklyReset-s.weeklyReset,"weekly_reset"];if(o.sessionResetBucket!==s.sessionResetBucket)return[o.sessionResetBucket-s.sessionResetBucket,"session_reset"]}return o.scopedUsed!==null&&s.scopedUsed!==null&&o.scopedUsedForSort!==s.scopedUsedForSort?[s.scopedUsedForSort-o.scopedUsedForSort,"scoped_utilization"]:o.weeklyUsedForSort!==s.weeklyUsedForSort?[s.weeklyUsedForSort-o.weeklyUsedForSort,"weekly_utilization"]:n&&e.key===n!=(t.key===n)?[e.key===n?-1:1,"configured_primary"]:[0,"insertion_order"]}function YJr(e,t,r,n,o,s){const i=new Map(e.map(a=>[a.key,iF(a.key,t,n,o,s)]));return{orderedAccounts:[...e].sort((a,c)=>lZt(a,c,i,r)[0]),metricsByKey:i}}function ZJr(e,t,r,n){for(const u of e){if(u.type!=="oauth")continue;const d=n?.get(u.key)??iF(u.key,Date.now(),r,Xk());d.quotaFreshness==="unknown"?oF(u,`startup-unknown:${u.key}`).catch(m=>{p.debug(`[proxy] background quota discovery failed account=${u.label}: ${bu(m)}`)}):d.quotaFreshness==="refresh_due"&&oF(u,`ambiguous:${d.quotaLastUpdated??0}`).catch(m=>{p.debug(`[proxy] ambiguous quota refresh failed account=${u.label}: ${bu(m)}`)})}const o=t[0],s=t[1];if(!o||!s||s.type!=="oauth")return;const i=ec.get(o.key)?.quota;if(!i)return;const a=Math.max(0,r-.05);if(!((i.sessionUsed??0)>=a||(i.weeklyUsed??0)>=.9))return;const l=["handoff",o.key,i.sessionResetAt??0,i.weeklyResetAt??0,s.key].join(":");oF(s,l).catch(u=>{p.debug(`[proxy] quota handoff prewarm failed account=${s.label}: ${bu(u)}`)})}function XJr(e,t,r,n){!t||t.type!=="oauth"||iF(t.key,Date.now(),n,Xk()).quotaFreshness==="fresh"||oF(t,`hard-handoff:${e.key}:${r}:${t.key}`).catch(s=>{p.debug(`[proxy] hard-handoff quota refresh failed account=${t.label}: ${bu(s)}`)})}function QJr(e){const{accounts:t,orderedAccounts:r,metricsByKey:n,evaluatedAt:o,strategy:s,primaryKey:i,quotaRoutingEnabled:a,quotaOrdered:c,sessionSoftLimit:l,sessionResetToleranceMs:u,rotationOffset:d}=e,m=new Map(t.map((T,_)=>[T.key,_])),h=!!i&&t.some(T=>T.key===i),f=[];for(const T of r){const _=n.get(T.key);if(!_){p.warn(`[proxy] routing evidence omitted because metrics are missing for account=${T.label}`);return}f.push({account:T.label,accountType:T.type,sourceIndex:m.get(T.key)??f.length,rank:f.length,configuredPrimary:!!i&&T.key===i,usable:_.usable,saturated:_.saturated,quotaObserved:_.hasQuota,quotaStale:_.quotaStale,quotaFreshness:_.quotaFreshness,refreshNeeded:_.refreshNeeded,refreshReason:_.refreshReason,refreshInFlight:_.refreshInFlight,lastRefreshAttemptAt:_.lastRefreshAttemptAt,lastRefreshSuccessAt:_.lastRefreshSuccessAt,nextRefreshEligibleAt:_.nextRefreshEligibleAt,saturationKind:_.saturationKind,softLimitOverrideReason:_.softLimitOverrideReason,quotaLastUpdated:_.quotaLastUpdated,quotaAgeMs:_.quotaAgeMs,coolingActive:_.coolingActive,coolingReason:_.coolingReason,coolingUntil:_.coolingUntil>0&&Number.isFinite(_.coolingUntil)?_.coolingUntil:null,unifiedStatus:_.unifiedStatus,fallbackStatus:_.fallbackStatus,upgradePaths:_.upgradePaths,overageEligible:_.overageEligible,overageStatus:_.overageStatus,sessionStatus:_.sessionStatus,sessionUsed:_.sessionUsed,sessionResetAt:Number.isFinite(_.sessionReset)?_.sessionReset:null,sessionResetBucket:Number.isFinite(_.sessionResetBucket)?_.sessionResetBucket:null,weeklyStatus:_.weeklyStatus,weeklyUsed:_.weeklyUsed,weeklyResetAt:Number.isFinite(_.weeklyReset)?_.weeklyReset:null,scopedModel:_.scopedModel,scopedStatus:_.scopedStatus,scopedUsed:_.scopedUsed,scopedResetAt:Number.isFinite(_.scopedReset)?_.scopedReset:null})}const g=r[0];let y,w;return r.length===1?(y="single_account",w="single_account"):c?(y="quota",w=lZt(r[0],r[1],n,i)[1]):s==="round-robin"?(y="round_robin",w="round_robin"):(y="primary",w=h&&g?.key===i?"configured_primary":"insertion_order"),{schemaVersion:1,evaluatedAt:new Date(o).toISOString(),strategy:s,mode:y,selectionReason:w,quotaRoutingEnabled:a,quotaInputsUsed:c,sessionSoftLimit:l,sessionResetToleranceMs:u,configuredPrimaryAccount:i??null,configuredPrimaryMatched:h,rotationOffset:d,initialAccount:g?.label??"",candidates:f}}function eYr(e){const{enabledAccounts:t,accountStrategy:r,primaryAccountKey:n,quotaRoutingEnabled:o,sessionSoftLimit:s,sessionResetToleranceMs:i,requestedModel:a,setRoutingDecision:c}=e;let l=[...t];const u=Date.now();let d,m=0;const h=r==="fill-first"&&l.length>1&&o;if(!h&&r==="fill-first"&&OJr(t,n),h){const g=YJr(t,u,n,s,i,a);l=g.orderedAccounts,d=g.metricsByKey,p.shouldLog("debug")&&p.debug(`[proxy] quota-ordered fill sequence: ${l.map(y=>y.label).join(" \u2192 ")}`)}else{if(r==="round-robin"&&l.length!==qYt&&(_p=nZt(l,n),qYt=l.length),l.length>1&&(m=_p%l.length,r==="round-robin"&&(_p=(_p+1)%l.length),m>0)){const g=l.splice(0,m);l.push(...g)}d=new Map(t.map(g=>[g.key,iF(g.key,u,s,i,a)]))}const f=QJr({accounts:t,orderedAccounts:l,metricsByKey:d,evaluatedAt:u,strategy:r,primaryKey:n,quotaRoutingEnabled:o,quotaOrdered:h,sessionSoftLimit:s,sessionResetToleranceMs:i,rotationOffset:m});return f&&c(f),{orderedAccounts:l,metricsByKey:d}}var aF=new Map,tYr=300*1e3,rYr=new Set(["accept","accept-encoding","accept-language","anthropic-beta","anthropic-dangerous-direct-browser-access","anthropic-version","sec-fetch-mode","user-agent","x-app","x-stainless-arch","x-stainless-lang","x-stainless-os","x-stainless-package-version","x-stainless-retry-count","x-stainless-runtime","x-stainless-runtime-version","x-stainless-timeout","x-subscription-tier"]),nYr=["oauth-2025-04-20","claude-code-20250219","fine-grained-tool-streaming-2025-05-14"];function cF(e){return e.replace(/[^a-zA-Z0-9._@-]/g,"_")}function uZt(e){return ft(ia(),".neurolink","header-snapshots",`anthropic_${cF(e)}.json`)}function oYr(e,t){if(t?.headers)for(const[r,n]of Object.entries(t.headers)){const o=r.toLowerCase();typeof n=="string"&&!e[o]&&!XL.has(o)&&o!=="authorization"&&o!=="x-api-key"&&o!=="x-claude-code-session-id"&&(e[o]=n)}}async function sYr(e){try{const t=cF(e),r=aF.get(t);if(r&&Date.now()-r.loadedAt<tYr)return r.snapshot;const n=uZt(e);try{await w1(n)}catch{return null}const o=JSON.parse(await Mr(n,"utf8"));if(!o||typeof o!="object")return null;const s={accountKey:"accountKey"in o&&typeof o.accountKey=="string"?o.accountKey:`anthropic:${e}`,capturedAt:"capturedAt"in o&&typeof o.capturedAt=="string"?o.capturedAt:new Date(0).toISOString(),source:"claude-code",headers:"headers"in o&&o.headers?o.headers:{},...o.body?{body:o.body}:{}};return Object.keys(s.headers).length===0&&Object.keys(s.body??{}).length===0?null:(aF.set(t,{snapshot:s,loadedAt:Date.now()}),s)}catch{return null}}function iYr(e,t){const r={...t??{}};for(const[n,o]of Object.entries(e)){const s=n.toLowerCase();typeof o=="string"&&rYr.has(s)&&!XL.has(s)&&s!=="authorization"&&s!=="x-api-key"&&s!=="x-claude-code-session-id"&&(r[s]=o)}return r}function dZt(e){if(!e||typeof e!="object")return;const t=e,r=Dyt(t.metadata?.user_id),n=Array.isArray(t.system)?t.system:typeof t.system=="string"?[{type:"text",text:t.system}]:[],o=n.find(i=>typeof i?.text=="string"&&i.text.includes("x-anthropic-billing-header"))?.text,s=n.find(i=>typeof i?.text=="string"&&i.text.includes("Claude Agent SDK"))?.text;if(!(!r&&!o&&!s))return{...r?{metadataUserId:r.metadataUserId}:{},...r?{sessionId:r.sessionId}:{},...o?{billingHeader:o}:{},...s?{agentBlock:s}:{}}}function mZt(e,t){return typeof e["x-claude-code-session-id"]=="string"||e["user-agent"]?.startsWith("claude-cli/")||!!t?.metadataUserId||!!t?.billingHeader||!!t?.agentBlock}function aYr(e,t){return e?JSON.stringify(e.headers??{})===JSON.stringify(t.headers??{})&&JSON.stringify(e.body??{})===JSON.stringify(t.body??{}):!1}async function cYr(e,t){const r=uZt(e);await Ta(r,t,384),aF.set(cF(e),{snapshot:t,loadedAt:Date.now()})}async function lYr(e,t,r,n){const o=await sYr(e);let s;try{s=JSON.parse(n)}catch{return o}const i=dZt(s);if(!mZt(r,i))return o;const a={accountKey:t,capturedAt:new Date().toISOString(),source:"claude-code",headers:iYr(r,o?.headers),body:{...o?.body??{},...i??{},...typeof r["x-claude-code-session-id"]=="string"?{sessionId:r["x-claude-code-session-id"]}:{}}};if(aYr(o,a))return o;try{await cYr(e,a)}catch(c){p.warn("[proxy] failed to persist Claude snapshot",{accountLabel:e,error:c instanceof Error?c.message:String(c)}),aF.set(cF(e),{snapshot:a,loadedAt:Date.now()})}return a}function Woe(e){const t={};if(!e||typeof e!="object")return t;const r=e;if(typeof r.model=="string"&&(t.responseModel=r.model),typeof r.stop_reason=="string"&&(t.finishReason=r.stop_reason),typeof r.stop_sequence=="string"&&(t.stopSequence=r.stop_sequence),Array.isArray(r.content)){const n=r.content.filter(o=>!!o&&typeof o=="object"&&o.type==="tool_use").map(o=>String(o.name??"")).filter(o=>o.length>0);n.length>0&&(t.toolCalls=n)}return t}function pZt(e){const t={};e.model&&(t.responseModel=e.model),e.stopReason&&(t.finishReason=e.stopReason),e.stopSequence&&(t.stopSequence=e.stopSequence);const r=(e.contentBlocks??[]).filter(n=>n.type==="tool_use").map(n=>String(n.toolName??"")).filter(n=>n.length>0);return r.length>0&&(t.toolCalls=r),t}function uYr(e,t,r,n,o){try{const s=JSON.parse(e),i={type:"text",text:r?.body?.agentBlock||"You are a Claude agent, built on Anthropic's Claude Agent SDK."};if(s.system){if(typeof s.system=="string"&&(s.system=[{type:"text",text:s.system}]),Array.isArray(s.system)){const l=s.system.findIndex(h=>typeof h.text=="string"&&h.text.includes("x-anthropic-billing-header")),u=s.system.findIndex(h=>typeof h.text=="string"&&h.text.includes("Claude Agent SDK")),d={type:"text",text:A4(s.system[l]?.text??r?.body?.billingHeader)};if(n&&u>=0)l<0&&s.system.unshift(d);else{const h=[l,u].filter(f=>f>=0).sort((f,g)=>g-f);for(const f of h)s.system.splice(f,1);s.system.length>0&&Zyt(s,s.system),s.system=[d,i]}}}else{const l={type:"text",text:A4(r?.body?.billingHeader)};s.system=[l,i]}const a=t.substring(0,Math.min(20,t.length)),c=Oyt(a,{existingUserId:s.metadata?.user_id??r?.body?.metadataUserId,preferredSessionId:o??r?.body?.sessionId});return s.metadata={...s.metadata,user_id:c.metadataUserId},{bodyStr:JSON.stringify(s),sessionId:c.sessionId}}catch{return{bodyStr:e}}}async function dYr(e,t){if(!e.oauth?.accessToken)return;let r=e.oauth.accessToken,n=e.oauth.refreshToken,o=e.oauth.expiresAt;const s=e.email?.trim()||"legacy-default",i=o?o<Date.now():!1,a=()=>({key:ok,label:s,token:r,refreshToken:n,expiresAt:o,type:"oauth",persistTarget:{credPath:t}});if(!i)return a();const c=ba(ok);if(c.permanentlyDisabled)return;const l=(await Mk())[ok];if(l?.coolingUntil>Date.now()&&(!c.coolingUntil||l.coolingUntil>c.coolingUntil)&&(c.coolingUntil=l.coolingUntil,c.coolingReason=l.reason),c.coolingReason==="auth"&&c.coolingUntil&&c.coolingUntil>Date.now())return a();if(!n){p.always("[proxy] skipping legacy account (expired, no refresh token)"),await Vd(a(),c,"missing_refresh_token");return}const u={token:r,refreshToken:n,expiresAt:o,label:s},d=await fJt(u);if(!d.success){if(gg(d)){await Vd(a(),c,"refresh_invalid");return}const m=await dF(a(),c);return p.always(`[proxy] legacy refresh temporarily unavailable (${d.status??"network"}); cooling until ${new Date(m).toISOString()}`),a()}return r=u.token,n=u.refreshToken,o=u.expiresAt,await NL(t,u),await mF(a(),c),p.always("[proxy] refreshed legacy account at startup"),a()}async function mYr(e){const{ctx:t,body:r,route:n,modelRouter:o,tracer:s,requestStartTime:i,logProxyBody:a}=e;s?.setMode("full");const c=Wne(r),l=Uw({provider:n.provider,model:n.model},o?.getFallbackChain()??[],r.model,c,o?.isAutoFallbackEnabled?.()??!1);hZt(a,"translated_request",l);const u=l.attempts;if(r.stream)return ooe({ctx:t,format:"claude",requestModel:r.model,parsed:c,attempts:u,tracer:s,requestStartTime:i});try{return await soe({ctx:t,format:"claude",requestModel:r.model,parsed:c,attempts:u,tracer:s,requestStartTime:i,terminalFailureStatus:502})}catch(d){const m=d instanceof Error?d.message:"unknown error";p.error(`[claude-proxy] Translated generation failed for ${r.model}: ${m}`);const h=_a(502,`Generation failed: ${m}`),f=JSON.stringify(h);return a({phase:"client_response",headers:{"content-type":"application/json"},body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:"application/json",account:"translation",accountType:"translation",responseStatus:502,durationMs:Date.now()-i}),h}}function hZt(e,t,r){e({phase:"routing_decision",contentType:"application/json",body:{stage:t,attempts:r.attempts}})}async function pYr(e){const{ctx:t,body:r,clientRequestBody:n,tracer:o,requestStartTime:s,logProxyBody:i,logFinalRequest:a}=e;o?.setMode("passthrough-cli");const c=n,l=Array.isArray(r.tools)?r.tools.length:0,u={};for(const[f,g]of Object.entries(t.headers))!XL.has(f.toLowerCase())&&g&&(u[f]=g);u["content-type"]||(u["content-type"]="application/json");const d=o?.startUpstreamAttempt({account:"passthrough",attempt:1,polyfillHeaders:!1,polyfillBody:!1,upstreamUrl:"https://api.anthropic.com/v1/messages?beta=true"});o?.logUpstreamRequestHeaders(u),o?.logUpstreamRequestBody(c),i({phase:"upstream_request",headers:u,body:c,bodySize:Buffer.byteLength(c,"utf8"),contentType:u["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,metadata:{upstreamMethod:"POST",upstreamUrl:"https://api.anthropic.com/v1/messages?beta=true"}}),ag("passthrough","passthrough");let m;try{m=await Ooe("https://api.anthropic.com/v1/messages?beta=true",{method:"POST",headers:u,body:c,signal:AbortSignal.timeout(Kk)})}catch(f){const g=f instanceof Error?f.message:String(f);_r("passthrough","passthrough",502),o?.setError("network_error",g),d?.end(),o?.end(502,Date.now()-s),a(502,"passthrough","passthrough","network_error",g);const y=_a(502,`Passthrough fetch failed: ${g}`),w=JSON.stringify(y);return i({phase:"client_response",headers:{"content-type":"application/json"},body:w,bodySize:Buffer.byteLength(w,"utf8"),contentType:"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:502,durationMs:Date.now()-s}),y}const h={};m.headers.forEach((f,g)=>{h[g]=f}),o?.logUpstreamResponseHeaders(h);{const f=kw(m.headers,{model:r.model});Yk(t,{upstreamHeaders:m.headers,quota:f,source:f?"live":"none",accountType:"passthrough",servedBy:"anthropic",attempt:1})}if(!m.ok){const f=await m.text();_r("passthrough","passthrough",m.status,m.status===429?"quota":void 0),o?.logUpstreamResponseBody(f),i({phase:"upstream_response",headers:h,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:h["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:m.status,durationMs:Date.now()-s}),i({phase:"client_response",headers:h,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:h["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:m.status,durationMs:Date.now()-s}),d?.end(),o?.setError("api_error",f.slice(0,500)),o?.end(m.status,Date.now()-s),a(m.status,"passthrough","passthrough",m.status===429?"rate_limit_error":"api_error",f);try{return JSON.parse(f)}catch{return _a(m.status,f)}}return r.stream&&m.body?fYr({ctx:t,body:r,bodyStr:c,response:m,tracer:o,requestStartTime:s,toolCount:l,upstreamSpan:d,upstreamResponseHeaders:h,logProxyBody:i,logFinalRequest:a}):gYr({ctx:t,body:r,bodyStr:c,response:m,tracer:o,requestStartTime:s,toolCount:l,upstreamSpan:d,upstreamResponseHeaders:h,logProxyBody:i,logFinalRequest:a})}function hYr(e){const t=e.getReader(),r=PYt();let n=!1;return{stream:new ReadableStream({async pull(s){if(!n)try{const{done:i,value:a}=await t.read();if(n)return;if(i){n=!0,r.complete(),s.close();return}s.enqueue(a)}catch(i){n=!0;const a=i instanceof Error?i.message:String(i);r.fail(a),s.error(i)}},cancel(s){return n=!0,r.cancel(),t.cancel(s)}}),outcome:r.outcome}}async function fYr(e){const{ctx:t,bodyStr:r,response:n,tracer:o,requestStartTime:s,upstreamSpan:i,upstreamResponseHeaders:a,logProxyBody:c,logFinalRequest:l}=e,u={...a},{stream:d,capture:m}=sYt(),h=n.body;if(!h)throw _r("passthrough","passthrough",502),new Error("Expected passthrough stream response body");const f=hYr(h);let g=f.stream,y=!1;const w=(_,b,k,A)=>y?!1:(y=!0,b==="stream_error"&&_r("passthrough","passthrough",_),l(_,"passthrough","passthrough",b,k,A),!0);if(o)try{const{stream:_,telemetry:b}=WL({captureRawText:!0});g=g.pipeThrough(_);const k=o,A=i,I=n,R=r.length;Promise.all([b,m,f.outcome]).then(([x,P,N])=>{const F=KL(N,x.streamErrorMessage),O=bp(F);k.setUsage({inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens}),k.logStreamEvents(x.events),k.setResponseInfo(pZt(x));const M=parseFloat(I.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),U=parseFloat(I.headers.get("anthropic-ratelimit-unified-7d-utilization")??""),$={inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens};isNaN(M)||($.rateLimitAfter5h=M),isNaN(U)||($.rateLimitAfter7d=U),(!isNaN(M)||!isNaN(U))&&k.setUsage($),k.logUpstreamResponseBody(x.rawText??""),k.recordMetrics(),k.recordBodySizes(R,x.totalBytesReceived),A?.end(),O&&k.setError(O.errorType,O.message),k.end(O?.status??n.status,Date.now()-s),w(O?.status??n.status,O?.errorType,O?.message,{inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens}),c({phase:"upstream_response",headers:u,body:x.rawText??"",bodySize:x.totalBytesReceived,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:200,durationMs:Date.now()-s}),c({phase:"client_response",headers:u,body:P.text,bodySize:P.totalBytes,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:200,durationMs:Date.now()-s})}).catch(x=>{if(y)return;const P=x instanceof Error?x.message:String(x);k.setError("stream_telemetry_error",P),A?.end(),k.end(500,Date.now()-s),w(500,"stream_telemetry_error",P)})}catch{f.outcome.then(_=>{const b=bp(_);i?.end(),b&&o.setError(b.errorType,b.message),o.end(b?.status??n.status,Date.now()-s),w(b?.status??n.status,b?.errorType,b?.message)})}else try{const{stream:_,telemetry:b}=WL({captureRawText:!0});g=g.pipeThrough(_),Promise.all([b,m,f.outcome]).then(([k,A,I])=>{const R=KL(I,k.streamErrorMessage),x=bp(R);w(x?.status??n.status,x?.errorType,x?.message,{inputTokens:k.usage.inputTokens,outputTokens:k.usage.outputTokens,cacheCreationTokens:k.usage.cacheCreationInputTokens,cacheReadTokens:k.usage.cacheReadInputTokens}),c({phase:"upstream_response",headers:u,body:k.rawText??"",bodySize:k.totalBytesReceived,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:n.status,durationMs:Date.now()-s}),c({phase:"client_response",headers:u,body:A.text,bodySize:A.totalBytes,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:n.status,durationMs:Date.now()-s})}).catch(k=>{y||w(500,"stream_telemetry_error",k instanceof Error?k.message:String(k))})}catch{f.outcome.then(_=>{const b=bp(_);w(b?.status??n.status,b?.errorType,b?.message)})}const T=g.pipeThrough(d);return new Response(T,{status:n.status,headers:{...u,...t.responseHeaders??{}}})}async function gYr(e){const{bodyStr:t,response:r,tracer:n,requestStartTime:o,upstreamSpan:s,upstreamResponseHeaders:i,logProxyBody:a,logFinalRequest:c}=e,l=await r.text();n?.logUpstreamResponseBody(l),a({phase:"upstream_response",headers:i,body:l,bodySize:Buffer.byteLength(l,"utf8"),contentType:i["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:r.status,durationMs:Date.now()-o}),a({phase:"client_response",headers:i,body:l,bodySize:Buffer.byteLength(l,"utf8"),contentType:i["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:r.status,durationMs:Date.now()-o});const u=JSON.parse(l);if(n&&u&&typeof u=="object"){const d=u.usage;if(d){n.setUsage({inputTokens:d.input_tokens??0,outputTokens:d.output_tokens??0,cacheCreationTokens:d.cache_creation_input_tokens??0,cacheReadTokens:d.cache_read_input_tokens??0});const h=parseFloat(r.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),f=parseFloat(r.headers.get("anthropic-ratelimit-unified-7d-utilization")??"");if(!isNaN(h)||!isNaN(f)){const g={inputTokens:d.input_tokens??0,outputTokens:d.output_tokens??0,cacheCreationTokens:d.cache_creation_input_tokens??0,cacheReadTokens:d.cache_read_input_tokens??0};isNaN(h)||(g.rateLimitAfter5h=h),isNaN(f)||(g.rateLimitAfter7d=f),n.setUsage(g)}}n.setResponseInfo(Woe(u)),n.recordMetrics();const m=JSON.stringify(u);n.recordBodySizes(t.length,m.length),s?.end(),n.end(r.status,Date.now()-o),c(r.status,"passthrough","passthrough",void 0,void 0,{inputTokens:d?.input_tokens,outputTokens:d?.output_tokens,cacheCreationTokens:d?.cache_creation_input_tokens,cacheReadTokens:d?.cache_read_input_tokens})}else s?.end(),n?.end(r.status,Date.now()-o),c(r.status,"passthrough","passthrough");return u}async function yYr(e){const t=Iw();if(!t)return{accounts:e.accounts};if(e.accounts.length===0)return{accounts:e.accounts};const r=Date.now(),n=await Promise.all(e.accounts.map(async d=>{const m=ba(d.key).quota,h=Rs(m?.sessionResetAt,r)??null,f=Rs(m?.weeklyResetAt,r)??null,g=await kre(t.grantId,d.key,h,f);return{accountKey:d.key,sessionUsed:m?.sessionUsed??null,weeklyUsed:m?.weeklyUsed??null,sessionResetAt:h,weeklyResetAt:f,borrowedSessionFraction:g.sessionFraction,borrowedWeeklyFraction:g.weeklyFraction}})),o=await Tre(t.grantId);if(!o)return{accounts:e.accounts};const s=await Are(t.grantId,Eoe(o.gates,n).inScope),i=Soe(o,n,r,s),a=new Set(i.allowed),c=e.accounts.filter(d=>a.has(d.key));if(c.length>0)return{accounts:c};const l=_oe(i.excluded),u=Nw(l,{status:SKr(l),grant:o,retryAfterSeconds:yZt(n,r)});return p.always(`[proxy] share ${t.peerLabel} withheld: ${l} (${i.excluded.length} accounts)`),{accounts:[],refusal:{status:u.status,message:u.body.error.message,errorType:u.body.error.type,responseHeaders:u.headers}}}async function vYr(e){const t=[],r=[];for(const n of e){const o=await dKr(n.key);if(!o){t.push(n);continue}if(!eKr(o)){t.push(n);continue}p.always(`[proxy] withholding leased account=${n.label}: ${o.reason}`),r.push({label:n.label,reason:o.reason})}return{accounts:t,withheld:r}}async function wYr(e,t){const r=[],n=[],o=Date.now();for(const s of e){const i=await Toe(s.key);if(!i){r.push(s);continue}const a=i.lease.gates;if(!bKr(a.models,t)){p.always(`[proxy] leased account=${s.label} does not cover model ${$n(t??"unknown")}`),n.push({label:s.label,reason:"model_not_allowed"});continue}if(a.schedule&&!_Kr(a.schedule,o)){p.always(`[proxy] leased account=${s.label} is outside its allowed hours`),n.push({label:s.label,reason:"out_of_window"});continue}const c=ba(s.key).quota,l=Rs(c?.sessionResetAt,o)??null,u=Rs(c?.weeklyResetAt,o)??null,d=await kre(i.grantId,s.key,l,u),m={accountKey:s.key,sessionUsed:c?.sessionUsed??null,weeklyUsed:c?.weeklyUsed??null,sessionResetAt:l,weeklyResetAt:u,borrowedSessionFraction:d.sessionFraction,borrowedWeeklyFraction:d.weeklyFraction},h=await Are(i.grantId,[m]),{accounts:f,...g}=a,y=Soe(TYr(i,g),[m],o,h);if(y.allowed.length===0){const w=_oe(y.excluded);p.always(`[proxy] withholding leased account=${s.label}: ${w}`),n.push({label:s.label,reason:w});continue}r.push(s)}return{accounts:r,withheld:n}}function TYr(e,t){const r=e.lease.entitlementSnapshot;return{schemaVersion:1,id:e.grantId,peerLabel:e.lease.peerLabel,tokenHash:"",tokenSalt:"",level:"complete",state:"active",entitlement:r==="unlimited"?{ledger:"unlimited"}:{ledger:"coins",coins:r},gates:t,createdAt:e.lease.issuedAt,updatedAt:e.lease.issuedAt}}function EYr(e,t,r){const n=Date.now(),o=i=>{L8r({grantId:i,accountKey:e,sessionBefore:t?.sessionUsed??null,sessionAfter:r.sessionUsed,sessionResetAt:Rs(r.sessionResetAt,n)??null,weeklyBefore:t?.weeklyUsed??null,weeklyAfter:r.weeklyUsed,weeklyResetAt:Rs(r.weeklyResetAt,n)??null})},s=Iw();if(s){o(s.grantId);return}Toe(e).then(i=>{i&&o(i.grantId)}).catch(()=>{})}function Koe(e,t,r){const n=Cre({inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,...r.cacheCreationTokens!==void 0?{cacheCreationTokens:r.cacheCreationTokens}:{},...r.cacheReadTokens!==void 0?{cacheReadTokens:r.cacheReadTokens}:{}},t);mKr(e,n).catch(()=>{})}function fZt(e,t){if(!t||typeof t!="object")return;const r=t.usage;if(!r)return;const n=xYr(t),o={inputTokens:r.input_tokens??0,outputTokens:r.output_tokens??0,cacheCreationTokens:r.cache_creation_input_tokens??0,cacheReadTokens:r.cache_read_input_tokens??0};Joe(e.key,n,o),Koe(e.label,n,o)}function Joe(e,t,r){const n=Iw();n&&F8r({grantId:n.grantId,accountKey:e,model:t??n.model,usage:{inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,...r.cacheCreationTokens!==void 0?{cacheCreationTokens:r.cacheCreationTokens}:{},...r.cacheReadTokens!==void 0?{cacheReadTokens:r.cacheReadTokens}:{}},...n.holdId?{holdId:n.holdId}:{}})}function gZt(e){if(!Iw())return e;const t={};for(const[r,n]of Object.entries(e)){const o=r.toLowerCase();o==="x-neurolink-account"||o==="x-neurolink-account-type"||o.startsWith("x-neurolink-pool-")||(t[r]=n)}return t}async function SYr(e,t){const r=e.provisionedAccount;if(!r)return{paused:!1,detail:"no provisioned account recorded"};const n=ec.get(`anthropic:${r}`),o=rjt(r,"oauth"),{verdict:s,shouldPause:i}=await qKr({grantId:e.id,accountLabel:r,lenderRequestsTotal:o?.successCount??0,observation:{at:Date.now(),sessionUsed:n?.quota?.sessionUsed??null,weeklyUsed:n?.quota?.weeklyUsed??null,reportedCoins:t,lenderRequests:0}});return i?(await E8r(e.id,"paused"),{paused:!0,detail:s.drifted?s.detail:"repeated unexplained usage"}):{paused:!1,detail:s.drifted?s.detail:"consistent"}}async function _Yr(e,t){await hjt(e.id,t)}function bYr(e,t){if(e.length!==t.length||e.length===0)return!1;let r=0;for(let n=0;n<e.length;n+=1)r|=e.charCodeAt(n)^t.charCodeAt(n);return r===0}var CYr=1,kYr=["live","complete","handshake","limits"];async function AYr(e,t){const r=Date.now(),n=await yJt(t),o=await Promise.all(n.map(async l=>{const u=ba(l.key).quota,d=Rs(u?.sessionResetAt,r)??null,m=Rs(u?.weeklyResetAt,r)??null,h=await kre(e.id,l.key,d,m);return{accountKey:l.key,sessionUsed:u?.sessionUsed??null,weeklyUsed:u?.weeklyUsed??null,sessionResetAt:d,weeklyResetAt:m,borrowedSessionFraction:h.sessionFraction,borrowedWeeklyFraction:h.weeklyFraction}})),s=Eoe(e.gates,o).inScope,i=await Are(e.id,s),a=Soe(e,o,r,i),c=(l,u)=>l===void 0?null:Math.max(0,l-u*100);return{grantState:e.state,level:e.level,ledger:e.entitlement.ledger,...e.entitlement.ledger==="coins"?{remainingCoins:Math.max(0,Math.floor(D8r(e)))}:{},servable:a.allowed.length>0,...a.allowed.length===0&&a.excluded.length>0?{withheldReason:_oe(a.excluded)}:{},sliceLeftPct:{session:c(e.gates.maxSlice?.session5hPct,i.sessionFraction),weekly:c(e.gates.maxSlice?.weekly7dPct,i.weeklyFraction)},...a.allowed.length===0?(()=>{const l=yZt(o,r);return l===void 0?{}:{retryAfterSeconds:l}})():{}}}function wg(e){return!e.ok}async function Tg(e){const t=RKr(e);if(!t)return{ok:!1,body:Nw("missing_token",{status:401}).body};const r=await _8r(t);return r?{ok:!0,grant:r}:{ok:!1,body:Nw("unknown_token",{status:401}).body}}function xYr(e){if(!e||typeof e!="object")return;const t=e.model;return typeof t=="string"?t:void 0}function yZt(e,t){const r=e.flatMap(n=>[n.sessionResetAt,n.weeklyResetAt]).filter(n=>n!==null&&n>t);if(r.length!==0)return Math.max(1,Math.round((Math.min(...r)-t)/1e3))}async function IYr(e){const{ctx:t,body:r,accountStrategy:n,primaryAccountKey:o,accountAllowlist:s,quotaRoutingEnabled:i=Goe(),sessionSoftLimit:a=qoe(),sessionResetToleranceMs:c=Xk(),setRoutingDecision:l}=e,u=await Promise.resolve().then(()=>(Xr(),Bl)),d=await Promise.resolve().then(()=>(_i(),uj)),m=[],h=`${d.homedir()}/.neurolink/anthropic-credentials.json`,{tokenStore:f}=await Promise.resolve().then(()=>(ig(),cre)),g=await Mk();tZt||(await f.pruneExpired(),tZt=!0);const y=await f.listByPrefix("anthropic:"),w=[];let T=0,_=0;for(const Q of y){if(!ire(Q,s)){p.debug(`[proxy] skipping account=${Q} (not in account allowlist)`);continue}if(await f.isDisabled(Q)){const Me=ba(Q),Oe=await f.getDisabledReason(Q);if(Oe==="refresh_failed")await f.markEnabled(Q),p.always(`[proxy] account=${Q.split(":")[1]??Q} re-enabled for legacy refresh failure recheck`),Me.permanentlyDisabled=!1,Me.consecutiveRefreshFailures=0;else{p.debug(`[proxy] skipping disabled account=${Q.split(":")[1]??Q}`),Me.permanentlyDisabled=!0,Oe==="entitlement_blocked"&&w.push(Q.split(":")[1]??Q),T+=1;continue}}const ne=await f.loadTokens(Q);if(!ne){_+=1;continue}let ce=ne.accessToken,Se=ne.refreshToken,ge=ne.expiresAt;const q=Q.split(":")[1]??Q,me=ne.tokenType==="Bearer"?"oauth":"api_key",ke=ba(Q),Ue=g[Q];Ue?.coolingUntil>Date.now()&&(!ke.coolingUntil||Ue.coolingUntil>ke.coolingUntil)&&(ke.coolingUntil=Ue.coolingUntil,ke.coolingReason=Ue.reason);const _e=()=>{m.push({key:Q,label:q,token:ce,refreshToken:Se,expiresAt:ge,type:me,persistTarget:{providerKey:Q}})};if(ge?ge<Date.now():!1){if(ke.permanentlyDisabled)continue;if(ke.coolingReason==="auth"&&ke.coolingUntil&&ke.coolingUntil>Date.now()){_e();continue}if(!Se){p.always(`[proxy] skipping account=${q} (expired, no refresh token)`),await Vd({key:Q,label:q,token:ce,type:"oauth"},ke,"missing_refresh_token");continue}const Me={token:ce,refreshToken:Se,expiresAt:ge,label:q},Oe=await OL(Me,{providerKey:Q});if(!Oe.success){const Ze={key:Q,label:q,token:ce,type:"oauth"};if(gg(Oe))p.always(`[proxy] skipping account=${q} (refresh token rejected: ${Oe.error?.slice(0,200)??"unknown"})`),await Vd(Ze,ke,"refresh_invalid");else{const et=await dF(Ze,ke);p.always(`[proxy] account=${q} refresh temporarily unavailable (${Oe.status??"network"}); cooling until ${new Date(et).toISOString()} and rotating`),_e()}continue}ce=Me.token,Se=Me.refreshToken,ge=Me.expiresAt,await f.saveTokens(Q,{accessToken:ce,refreshToken:Se,expiresAt:ge??Date.now()+36e5,tokenType:"Bearer"}),p.always(`[proxy] refreshed expired account=${Q.split(":")[1]??Q} at startup`),await mF({key:Q},ke)}_e()}if(m.length===0&&jHt(y.length,ok,s))try{const Q=JSON.parse(u.readFileSync(h,"utf8")),ne=await dYr(Q,h);ne&&m.push(ne)}catch{}if(process.env.ANTHROPIC_API_KEY&&m.length===0&&jHt(y.length,are,s)&&m.push({key:are,label:"env",token:process.env.ANTHROPIC_API_KEY,type:"api_key"}),m.length===0)return w.length>0&&w.length===T&&_===0?{failure:{status:403,message:EZt({status:403,accounts:w,message:"OAuth authentication is not allowed for this organization.",errorCode:"oauth_not_allowed_for_organization"}),errorType:"permission_error"}}:{failure:{status:401,message:s?"No allowed Anthropic credentials are currently available":y.length>0?"Configured Anthropic accounts are disabled or unavailable":"No Anthropic credentials found",errorType:"authentication_error"}};for(const Q of m)QYr(Q);await BJr(m);const b=m.filter(Q=>!ba(Q.key).permanentlyDisabled),k=await vYr(b),A=await wYr(k.accounts,typeof r.model=="string"?r.model:void 0),I={accounts:A.accounts,withheld:[...k.withheld,...A.withheld]},R=I.accounts;if(R.length===0&&I.withheld.length>0){const Q=I.withheld.map(Se=>`${Se.label} (${Se.reason})`).join(", ");return{failure:{status:403,message:I.withheld.every(Se=>Se.reason==="model_not_allowed")?`Borrowed account(s) do not cover the requested model: ${Q}. Ask the lender to widen the share, or use a model it allows.`:`Borrowed account(s) are no longer covered by a lease: ${Q}. Run 'neurolink proxy peer sync' to check in with the lender, or ask them to resume the share.`,errorType:"permission_error"}}}const x=await yYr({accounts:R});if(x.refusal)return{failure:x.refusal};const P=x.accounts;if(P.length===0)return{failure:{status:401,message:pF(m.map(ne=>ne.label)),errorType:"authentication_error"}};const{orderedAccounts:N,metricsByKey:F}=eYr({enabledAccounts:P,accountStrategy:n,primaryAccountKey:o,quotaRoutingEnabled:i,sessionSoftLimit:a,sessionResetToleranceMs:c,requestedModel:typeof r.model=="string"?r.model:void 0,setRoutingDecision:l});n==="fill-first"&&i&&P.length>1&&ZJr(P,N,a,F);const O=sZr(r),M=JSON.stringify(O),U=Date.now(),$=Array.isArray(r.tools)?r.tools.length:0,H="https://api.anthropic.com/v1/messages?beta=true",V=t.headers??{},W=dZt(r);return{accounts:m,enabledAccounts:P,orderedAccounts:N,bodyStr:M,requestStart:U,toolCount:$,url:H,clientHeaders:V,isClaudeClientRequest:mZt(V,W)}}async function RYr(e){const{ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i,options:a,providerLabel:c,idleTimeoutMs:l=SJr}=e,u=new AbortController;let d;try{d=await Mt(t.neurolink.stream({...a,abortSignal:u.signal}),l,`Fallback ${c} initialization timed out after ${l}ms`)}catch(w){throw u.abort(w),w}const m=async w=>{const T=d.stream[Symbol.asyncIterator]();let _="";try{for(;;){const{value:b,done:k}=await Mt(T.next(),l,`Fallback ${c} stream timed out after ${l}ms of inactivity`);if(k)return _;const A=toe(b);A&&(_+=A,w?.(A))}}catch(b){throw u.abort(b),T.return?.().catch(()=>{}),b}};if(r.stream){const w=new Jne(r.model,0),T=[];for(const x of w.start())T.push(x);const _=await m(x=>{for(const P of w.pushDelta(x))T.push(P)}),b=d.toolCalls??[];if(!GL(_,b))throw new Error(`Translated provider ${c} returned no content or tool calls`);if(b.length)for(const x of b){const P=x.toolName??x.name??"unknown";for(const N of w.pushToolUse(LL(),P,tYt(x)))T.push(N)}const k=d.finishReason??"end_turn",A=Dw(d.usage);for(const x of w.finish(A.output,k))T.push(x);n?.end(200,Date.now()-o),i(200,"",c,void 0,void 0,{inputTokens:A.input,outputTokens:A.output});const I=T.join("");s({phase:"client_response",headers:{"content-type":"text/event-stream"},body:I,bodySize:Buffer.byteLength(I,"utf8"),contentType:"text/event-stream",responseStatus:200,durationMs:Date.now()-o});async function*R(){for(const x of T)yield x}return R()}const h=await m();if(!GL(h,d.toolCalls))throw new Error(`Translated provider ${c} returned no content or tool calls`);const f={content:h,model:d.model,finishReason:d.finishReason??"end_turn",reasoning:void 0,usage:d.usage?Dw(d.usage):void 0,toolCalls:d.toolCalls};n?.end(200,Date.now()-o);const g=Kne(f,r.model);i(200,"",c,void 0,void 0,{inputTokens:f.usage?.input,outputTokens:f.usage?.output});const y=JSON.stringify(g);return s({phase:"client_response",headers:{"content-type":"application/json"},body:y,bodySize:Buffer.byteLength(y,"utf8"),contentType:"application/json",responseStatus:200,durationMs:Date.now()-o}),g}async function vZt(e){let t;for(let r=0;r<=Moe;r+=1)try{return await RYr(e)}catch(n){if(t=n,!Qoe(n)||r===Moe)throw n;const o=Roe[r]??250;p.always(`[proxy] retrying fallback=${e.providerLabel} after transient network error (${r+1}/${Moe}) in ${o}ms: ${eA(bu(n))}`),await _u(o)}throw t}async function MYr(e){const{ctx:t,body:r,model:n,tracer:o,requestStartTime:s,logProxyBody:i,logFinalRequest:a}=e,c={...t,requestId:`${t.requestId}:codex-fallback`,method:"POST",path:"/backend-api/codex/responses",headers:{"content-type":"application/json",accept:"text/event-stream"},query:{},params:{},body:AVr(r,n),metadata:{...t.metadata,"neurolink.codexFallback":!0},responseHeaders:{}},l=await zYt(c),u={...c.responseHeaders??{}};let d;try{d=await OVr(l)}catch(w){throw w instanceof Yne&&p.always(`[proxy] Codex fallback returned ${w.status}: ${$n(w.responseBody,500)}`),w}Object.keys(u).length>0&&(t.responseHeaders??={},Object.assign(t.responseHeaders,gZt(u)));const m=u["x-neurolink-account"]??"",h=u["x-neurolink-account-type"]??"codex-oauth",f={content:d.text,model:r.model,finishReason:d.finishReason,...d.usage?{usage:d.usage}:{},toolCalls:d.toolCalls};if(r.stream){const w=new Jne(r.model,d.usage?.input??0),T=[];for(const k of w.start())T.push(k);if(d.text)for(const k of w.pushDelta(d.text))T.push(k);for(const k of d.toolCalls)for(const A of w.pushToolUse(LL(),k.toolName,k.args))T.push(A);for(const k of w.finish(d.usage?.output,d.finishReason))T.push(k);o?.end(200,Date.now()-s),a(200,m,h,void 0,void 0,{inputTokens:d.usage?.input,outputTokens:d.usage?.output,cacheCreationTokens:d.usage?.cacheCreationTokens,cacheReadTokens:d.usage?.cacheReadTokens});const _=T.join("");i({phase:"client_response",headers:{"content-type":"text/event-stream"},body:_,bodySize:Buffer.byteLength(_,"utf8"),contentType:"text/event-stream",responseStatus:200,durationMs:Date.now()-s});async function*b(){for(const k of T)yield k}return b()}o?.end(200,Date.now()-s);const g=Kne(f,r.model);a(200,m,h,void 0,void 0,{inputTokens:d.usage?.input,outputTokens:d.usage?.output,cacheCreationTokens:d.usage?.cacheCreationTokens,cacheReadTokens:d.usage?.cacheReadTokens});const y=JSON.stringify(g);return i({phase:"client_response",headers:{"content-type":"application/json"},body:y,bodySize:Buffer.byteLength(y,"utf8"),contentType:"application/json",responseStatus:200,durationMs:Date.now()-s}),g}async function wZt(e){if(Iw())return null;const t=await WWr();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 vKr({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 PYr(e){return!(e instanceof Yne)||e.status!==400?null:{status:e.status,body:e.responseBody,contentType:"application/json"}}async function TZt(e){const{ctx:t,body:r,parsedFallbackRequest:n,fallbackPlan:o,modelRouter:s,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l}=e,u=o??Uw({provider:"anthropic",model:r.model},s?.getFallbackChain()??[],r.model,n);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;for(const h of u.attempts.slice(1)){if(!h.provider||!h.model)continue;const f=Date.now();try{p.always(`[proxy] fallback \u2192 ${h.provider}/${h.model}`);let g;if(h.provider==="codex")g=await MYr({ctx:t,body:r,model:h.model,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l});else{const y=await vv.checkFallbackProviderAvailability(h.provider,h.model);if(!y.available){const T=y.reason??"provider unavailable";p.always(`[proxy] fallback ${h.provider}/${h.model} health-check failed (${T}), skipping`),Fk({provider:h.provider,model:h.model,status:"failure",errorMessage:`[unavailable] ${T}`,durationMs:0}),d=`[${h.provider}/${h.model}] unavailable: ${T}`;continue}const w=LZt(n,{provider:h.provider,model:h.model});g=await vZt({ctx:t,body:r,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l,options:w,providerLabel:h.provider})}return Fk({provider:h.provider,model:h.model,status:"success",durationMs:Date.now()-f}),i?.setFallbackInfo({triggered:!0,provider:h.provider,model:h.model,attemptCount:u.attempts.slice(1).length,reason:"fallback_success"}),h.provider!=="codex"&&Yk(t,{quota:null,source:"none",servedBy:h.provider}),{response:g}}catch(g){m??=PYr(g)??void 0;const y=eA(g instanceof Error?g.message:String(g));let w="unknown";y.includes("Rate limit")||y.includes("rate_limit")||y.includes("max_parallel_requests")?w="rate_limit":y.includes("context length")||y.includes("ContextWindowExceeded")?w="context_overflow":y.includes("no content or tool calls")||y.includes("NoOutputGenerated")?w="empty_response":y.includes("thinking_level")||y.includes("Field required")?w="schema_mismatch":y.includes("Resource exhausted")&&(w="provider_quota"),p.always(`[proxy] fallback ${h.provider}/${h.model} failed [${w}]: ${eA(bu(g))}`),Fk({provider:h.provider,model:h.model,status:"failure",errorMessage:`[${w}] ${y}`,durationMs:Date.now()-f}),d=`[${h.provider}/${h.model}] ${eA(bu(g))}`}}return{response:null,lastErrorMessage:d,...m?{invalidRequestFailure:m}:{}}}async function DYr(e){const{ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i}=e,a=Date.now();try{const c=Wne(r),l=Uw({provider:"anthropic",model:r.model},[],r.model,c,!0);if(hZt(s,"auto_fallback",l),!l.attempts.find(h=>h.label==="auto-provider"))return{response:null};p.always("[proxy] fallback \u2192 auto-provider");const d=LZt(c),m=await vZt({ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i,options:d,providerLabel:"auto-provider"});return Fk({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"}),Yk(t,{quota:null,source:"none",servedBy:"auto-provider"}),{response:m}}catch(c){const l=eA(bu(c));return p.always(`[proxy] fallback auto-provider failed: ${l}`),Fk({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"}),{response:null,lastErrorMessage:l}}}function OYr(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 EZt(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: ${OYr(e.accounts)}. Upstream: "${e.message}". Ask an organization admin to re-enable Claude Code OAuth access, then run: neurolink auth enable anthropic:<account>.`}function NYr(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 LYr(e){for(const t of e){const r=ec.get(t.key)?.quota;if(r?.overageDisabledReason&&r.overageStatus?.trim().toLowerCase()!=="allowed")return r.overageDisabledReason}}function SZt(e){return e?` Paid extra usage is unavailable for this organization (${e}), so there is no additional capacity before the window resets.`:""}function FYr(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()}.`+SZt(e.overageDisabledReason)}function _Zt(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:w,logFinalRequest:T}=e;if(i!==null&&g.length>0&&new Set(i.accounts).size>=g.length&&i&&!u){const O=EZt(i);return t?.setError("permission_error",O),t?.end(403,Date.now()-r),y(403,O,"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 O=Cu(s.body),M=O.message!==void 0,U=wr(O.message??s.body),$=M?s.body:JSON.stringify(_a(s.status,U,"invalid_request_error")),H=M?s.contentType??"application/json":"application/json";return t?.setError("invalid_request_error",U),t?.end(s.status,Date.now()-r),T(s.status,"","final","invalid_request_error",U),w({phase:"client_response",headers:{"content-type":H},body:$,bodySize:Buffer.byteLength($,"utf8"),contentType:H,responseStatus:s.status,durationMs:Date.now()-r}),new Response($,{status:s.status,headers:{"content-type":H}})}if((c||l)&&!u){const O=f?` Fallback also failed: ${f}`:"",M=h==="shared_provider_transport"?"shared Anthropic network":h==="connection_transport"?"Anthropic connection":null,U=`${M?`${M} 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")}.${O}`;return t?.setError("transient_error",U.slice(0,500)),t?.end(502,Date.now()-r),y(502,U,f?"fallback_exhausted":"transient_error",{...m?{errorCode:m}:{},...h?{transportScope:h}:{}})}const b=(O,M)=>{const U=_a(429,O,"overloaded_error");t?.setError("rate_limit_error",O),t?.end(429,Date.now()-r),T(429,"","final","rate_limit_error",O);const $=JSON.stringify(U),H={"content-type":"application/json","retry-after":String(M)};return w({phase:"client_response",headers:H,body:$,bodySize:Buffer.byteLength($,"utf8"),contentType:"application/json",responseStatus:429,durationMs:Date.now()-r}),new Response($,{status:429,headers:H})};if(a){const O=FYr(a);return p.always(`[proxy] model-scoped limit exhausted for ${a.model} on all accounts`),b(O,Math.max(1,Math.ceil((a.earliestResetMs-Date.now())/1e3)))}if(!u){const O=f?` Fallback also failed: ${f}`:"",M=`All Anthropic accounts failed. Last error: ${d instanceof Error?d.message:String(d??"unknown")}.${O}`;return t?.setError("all_accounts_failed",M.slice(0,500)),t?.end(502,Date.now()-r),y(502,M,f?"fallback_exhausted":"all_accounts_failed")}const k=Date.now(),A=g.map(O=>ba(O.key)).filter(O=>O.coolingUntil&&O.coolingUntil>k&&O.coolingReason!=="auth"),I=Math.min(...A.map(O=>O.coolingUntil??Number.POSITIVE_INFINITY)),R=g.length>0&&A.length===g.length,x=R?Math.max(1,Math.ceil((I-k)/1e3)):1,P=NYr(A),N=SZt(LYr(g)),F=R?`All ${g.length} Anthropic accounts are cooling after the ${P} was exhausted. Earliest retry at ${new Date(I).toISOString()}.${N}`:`All ${g.length} accounts rate-limited after per-account retries.${N}`;return p.always(`[proxy] all accounts rate-limited, retry in ${x}s`),b(F,x)}async function bZt(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 w=kw(s.headers,{model:r.model});if(w){EYr(n.key,o.quota,w),o.quota=hg(o.quota,w);const _=Boe(o,w,Date.now());_?.kind==="cooled"?Eu(n.key,_.coolingUntil,_.coolingReason).catch(()=>{}):_?.kind==="cleared"&&pg(n.key,_.coolingUntil).catch(()=>{}),vp(n.key,w).catch(()=>{})}const T={};return s.headers.forEach((_,b)=>{T[b]=_}),i?.logUpstreamResponseHeaders(T),Yk(t,{upstreamHeaders:s.headers,quota:w??o.quota??null,source:w?"live":o.quota?"snapshot":"none",account:n,accountState:o,servedBy:"anthropic",attempt:l,...g?{poolAccounts:g}:{}}),r.stream?$Yr({ctx:t,body:r,account:n,accountState:o,response:s,responseHeaders:T,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y,onStreamTerminal:f}):BYr({account:n,response:s,responseHeaders:T,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y})}async function $Yr(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){_r(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=_a(502,"No response body from upstream"),x=JSON.stringify(R);return f({phase:"client_response",headers:{"content-type":"application/json"},body:x,bodySize:Buffer.byteLength(x,"utf8"),contentType:"application/json",account:n.label,accountType:n.type,attempt:u,responseStatus:502,durationMs:Date.now()-c}),{response:R}}const w=s.body.getReader(),T=await cJr(w);if(T.kind==="transport_error"){const R=bu(T.error),x=Buffer.concat(T.chunks.map(P=>Buffer.from(P))).toString("utf8");return p.always(`[proxy] stream failed before first chunk account=${n.label}: ${R}; returning terminal error to avoid replaying an ambiguous request`),_r(n.label,n.type,502),h(502,"stream_error",R,{retryable:!1}),m?.end(),f({phase:"upstream_response",headers:i,body:x,bodySize:Buffer.byteLength(x,"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:kZt({account:n,tracer:a,requestStartTime:c,attemptNumber:u,logProxyBody:f,logFinalRequest:y,errorType:"stream_error",message:R})}}if(T.kind==="empty")return await w.cancel().catch(()=>{}),p.always(`[proxy] \u2190 empty stream from account=${n.label}, trying next`),_r(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(T.kind==="sse_error"){await w.cancel().catch(()=>{});const R=Buffer.concat(T.chunks.map(O=>Buffer.from(O))).toString("utf8"),x=T.errorType==="rate_limit_error",P=x?429:502,N=kw(i,{model:r.model}),F=Date.now();if(x){const O=$oe(N,JL(i["retry-after"]??null),F,ML(i),Nc,typeof r.model=="string"?r.model:void 0);o.quota=N?hg(o.quota,N):o.quota;const M=O.reason==="transient"?"transient":"quota";O.scope==="account"&&(!o.coolingUntil||O.coolingUntil>o.coolingUntil)&&(o.coolingUntil=O.coolingUntil,o.coolingReason=O.reason,await Eu(n.key,O.coolingUntil,O.reason).catch(()=>{})),_r(n.label,n.type,429,M),h(429,"rate_limit_error",T.message,{retryable:!0,rateLimitKind:M,cooldownReason:O.reason})}else _r(n.label,n.type,P),h(P,T.errorType,T.message,{retryable:!0});return p.always(`[proxy] immediate SSE ${T.errorType} account=${n.label}: ${T.message}; rotating before client commit`),a?.recordRetry(n.label,x?"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:P,upstreamErrorType:T.errorType}}),{retryNextAccount:!0,failure:{message:T.message,rateLimit:x,...T.errorType==="overloaded_error"?{retryDelayMs:MZt(u)}:{}}}}h(s.status,void 0,void 0,{attemptDurationMs:Date.now()-l});const _=PYt();let b=!1;const k=new ReadableStream({start(R){for(const x of T.chunks)R.enqueue(x)},async pull(R){if(!b)try{const{done:x,value:P}=await w.read();if(b)return;if(x){b=!0,_.complete(),R.close();return}R.enqueue(P)}catch(x){const P=bu(x);if(p.always(`[proxy] mid-stream error account=${n.label}: ${P}`),_.fail(P),!b){b=!0;const N=`event: error
|
|
2320
|
+
`);for(const T of w)cYt(r,T)}c()}}),u=l.writable.getWriter();let d;const m=new WritableStream({start(y){d=y},write(y){return u.write(y)},close(){return u.close()},abort(y){return c(),u.abort(y)}});u.closed.catch(y=>{c();try{d.error(y)}catch{}});const h=l.readable.getReader();return{stream:{readable:new ReadableStream({async pull(y){try{const{done:w,value:T}=await h.read();w?y.close():y.enqueue(T)}catch(w){y.error(w)}},async cancel(y){c();try{d.error(y)}catch{}await Promise.allSettled([h.cancel(y),u.abort(y)])}}),writable:m},telemetry:a}}Pr(),Os(),jt(),Pc(),B(),Ja();var BWr="proxy-peers.json",zWr=1e3,GWr={exhausted:9e5,withheld:6e5,paused:3e5,revoked:864e5,expired:864e5,unreachable:6e4,upstream_error:12e4},qWr=null,Hd={},$k=0,Uk=-1,Bk=!1,lYt=new wa;function goe(){return qWr??ft(ia(),".neurolink",BWr)}function HWr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.name=="string"&&typeof t.url=="string"&&typeof t.token=="string"&&typeof t.priority=="number"&&typeof t.enabled=="boolean"}function jWr(e){return e?.code==="ENOENT"}async function yoe(e={}){const t=Date.now();if(!e.force&&Bk&&t-$k<zWr)return;const r=goe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!jWr(o))throw o;Hd={},Uk=-1,$k=t,Bk=!0;return}if(!e.force&&Bk&&n===Uk){$k=t;return}try{const o=JSON.parse(await Mr(r,"utf8"));Hd=Object.fromEntries(Object.entries(o?.peers??{}).filter(s=>HWr(s[1])))}catch(o){if(e.force)throw o;p.always(`[proxy] peer list unreadable, treating as empty: ${o instanceof Error?o.message:String(o)}`),Hd={}}Uk=n,$k=t,Bk=!0}async function uYt(){const e={schemaVersion:1,peers:Hd};await Ta(goe(),e);try{Uk=(await Es(goe())).mtimeMs}catch{Uk=-1}$k=Date.now(),Bk=!0}function dYt(e){return e.trim().toLowerCase()}async function VWr(){return await yoe(),Object.values(Hd).sort((e,t)=>e.priority-t.priority||e.createdAt-t.createdAt)}async function WWr(e=Date.now()){return(await VWr()).filter(r=>r.enabled&&!(r.cooldownUntil&&r.cooldownUntil>e))}function KWr(e){return GWr[e]}var JWr=6048e5;async function voe(e,t,r){await lYt.runExclusive(async()=>{await yoe({force:!0});const n=dYt(e),o=Hd[n];if(!o)return;const s=(r??0)*1e3,i=Date.now()+Math.min(JWr,Math.max(KWr(t),Number.isFinite(s)?s:0));Hd[n]={...o,cooldownUntil:i,cooldownReason:t,updatedAt:Date.now()},await uYt()})}async function YWr(e,t){await lYt.runExclusive(async()=>{await yoe({force:!0});const r=dYt(e),n=Hd[r];n&&(Hd[r]={...n,cooldownUntil:0,lastUsedAt:Date.now(),updatedAt:Date.now(),...t?{lastObservation:t}:{}},await uYt())})}Pr(),Os(),jt(),Pc(),nL();var ZWr=6048e5,XWr=9e5,QWr=864e5;function eKr(e){return!e.usable}function mYt(e){return{schemaVersion:e.schemaVersion,grantId:e.grantId,peerLabel:e.peerLabel,issuedAt:e.issuedAt,notAfter:e.notAfter,heartbeatEveryMs:e.heartbeatEveryMs,offlineGraceMs:e.offlineGraceMs,gates:e.gates,entitlementSnapshot:e.entitlementSnapshot}}function pYt(e,t){return gre(e,t)}function hYt(e,t=Date.now()){const r=e.leasePolicy,n=e.leaseSecret;if(!n)throw new Error(`Grant ${e.id} has no lease secret \u2014 provision it before issuing a lease.`);const o=r?.ttlMs??ZWr,s=Math.min(t+o,e.gates.notAfter??Number.POSITIVE_INFINITY),i={schemaVersion:1,grantId:e.id,peerLabel:e.peerLabel,issuedAt:t,notAfter:s,heartbeatEveryMs:r?.heartbeatEveryMs??XWr,offlineGraceMs:r?.offlineGraceMs??QWr,gates:e.gates,entitlementSnapshot:e.entitlement.ledger==="coins"?e.entitlement.coins??0:"unlimited"};return{...i,signature:pYt(mYt(i),n)}}function tKr(e,t){const{signature:r,...n}=e;return djt(pYt(mYt(n),t),r)}function rKr(e){const t=e.now??Date.now();if(!tKr(e.lease,e.secret))return{usable:!1,reason:"unsigned",detail:"lease signature does not match the lender's secret"};if(e.lease.notAfter<=t)return{usable:!1,reason:"expired",detail:"the lease's hard expiry has passed"};const r=e.lastHeartbeatAt??e.lease.issuedAt;return r+e.lease.offlineGraceMs<=t?{usable:!1,reason:"grace_elapsed",detail:"the lender has been unreachable for longer than this lease allows"}:{usable:!0,nextHeartbeatDueAt:r+e.lease.heartbeatEveryMs}}function nKr(e){const t=e.now??Date.now();if(!e.grant.leaseSecret)throw new Error(`Grant ${e.grant.id} has no lease secret \u2014 attach lease material first.`);return{code:e.code,state:e.state,accountLabel:`${e.grant.peerLabel}-via-${e.lenderName}`,leaseSecret:e.grant.leaseSecret,lease:hYt(e.grant,t),lenderUrl:(e.lenderUrl??"").replace(/\/+$/,"")}}Ja();var oKr="proxy-resident-grants.json",sKr=1e3,iKr=null,yg={},zk=0,Gk=-1,qk=!1,aKr=new wa;function woe(){return iKr??ft(ia(),".neurolink",oKr)}function cKr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.accountLabel=="string"&&typeof t.grantId=="string"&&typeof t.leaseSecret=="string"&&!!t.lease}function lKr(e){return e?.code==="ENOENT"}async function fYt(e={}){const t=Date.now();if(!e.force&&qk&&t-zk<sKr)return;const r=woe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!lKr(o))throw o;yg={},Gk=-1,zk=t,qk=!0;return}if(!e.force&&qk&&n===Gk){zk=t;return}try{const o=JSON.parse(await Mr(r,"utf8"));yg=Object.fromEntries(Object.entries(o?.grants??{}).filter(s=>cKr(s[1])))}catch(o){if(e.force)throw o;yg={}}Gk=n,zk=t,qk=!0}async function uKr(){const e={schemaVersion:1,grants:yg};await Ta(woe(),e);try{Gk=(await Es(woe())).mtimeMs}catch{Gk=-1}zk=Date.now(),qk=!0}function gYt(e){return e.toLowerCase()}async function Toe(e){await fYt();const t=e.toLowerCase(),r=t.includes(":")?t.slice(t.indexOf(":")+1):t;return yg[gYt(r)]}async function dKr(e,t=Date.now()){const r=await Toe(e);if(r)return rKr({lease:r.lease,secret:r.leaseSecret,...r.lastHeartbeatAt!==void 0?{lastHeartbeatAt:r.lastHeartbeatAt}:{},now:t})}async function mKr(e,t){await aKr.runExclusive(async()=>{await fYt({force:!0});const r=gYt(e),n=yg[r];n&&(yg[r]={...n,unreportedCoins:(n.unreportedCoins??0)+t,unreportedRequests:(n.unreportedRequests??0)+1},await uKr())})}B();var pKr=15e3,hKr=12e4;function fKr(e){switch(e){case"exhausted":return"exhausted";case"paused":return"paused";case"revoked":return"revoked";case"expired":return"expired";case"reserve_floor":case"spillover_inactive":case"slice_exhausted":case"no_capacity":return"withheld";case"missing_token":case"unknown_token":case"malformed_token":return"revoked";default:return"upstream_error"}}function yYt(e,t){const r=e.headers.get(t);if(r===null||r.trim()==="")return;const n=Number(r);return Number.isFinite(n)?n:void 0}function gKr(e){const t=yYt(e,"x-neurolink-grant-remaining-coins");return{observedAt:Date.now(),...e.headers.get("x-neurolink-grant-status")?{grantStatus:e.headers.get("x-neurolink-grant-status")??""}:{},...e.headers.get("x-neurolink-grant-reason")?{grantReason:e.headers.get("x-neurolink-grant-reason")??""}:{},...t!==void 0?{remainingCoins:t}:{}}}function yKr(e,t,r){const n=e.body;if(!n)return e;let o;const s=()=>{o!==void 0&&(clearTimeout(o),o=void 0)},i=()=>{s(),o=setTimeout(()=>{p.always(`[proxy] peer=${t.name} went quiet mid-response; abandoning it`),voe(t.name,"unreachable").catch(c=>{p.debug(`[proxy] could not cool peer=${t.name} after a stall: ${c instanceof Error?c.message:String(c)}`)}),r.abort()},hKr),o.unref?.()},a=n.pipeThrough(new TransformStream({start:i,transform(c,l){i(),l.enqueue(c)},flush:s}));return r.signal.addEventListener("abort",s,{once:!0}),new Response(a,{status:e.status,statusText:e.statusText,headers:e.headers})}async function vKr(e){const{peer:t,body:r,stream:n}=e,o=new AbortController,s=setTimeout(()=>o.abort(),pKr);e.signal&&(e.signal.aborted?o.abort():e.signal.addEventListener("abort",()=>o.abort(),{once:!0}));try{const i=await fetch(`${t.url}/v1/messages`,{method:"POST",headers:{"content-type":"application/json","x-neurolink-share-token":t.token,accept:n?"text/event-stream":"application/json"},body:r,signal:o.signal});if(i.ok)return await YWr(t.name,gKr(i)).catch(u=>{p.debug(`[proxy] could not record success for peer=${t.name}: ${u instanceof Error?u.message:String(u)}`)}),{ok:!0,response:yKr(i,t,o),peer:t};const a=i.headers.get("x-neurolink-grant-reason"),c=fKr(a),l=yYt(i,"retry-after");return await voe(t.name,c,l),await i.text().catch(()=>""),p.always(`[proxy] peer=${t.name} declined (${c}); cooling before retry`),{ok:!1,peer:t,status:i.status,reason:c,message:`peer ${t.name} declined: ${c}`,...l!==void 0?{retryAfterSeconds:l}:{}}}catch(i){const a=i instanceof Error?i.message:String(i);return e.signal?.aborted?(p.debug(`[proxy] peer=${t.name} attempt cancelled by the caller: ${a}`),{ok:!1,peer:t,reason:"unreachable",message:`peer ${t.name} attempt cancelled`}):(await voe(t.name,"unreachable").catch(c=>{p.debug(`[proxy] could not cool peer=${t.name}: ${c instanceof Error?c.message:String(c)}`)}),p.always(`[proxy] peer=${t.name} unreachable: ${a}`),{ok:!1,peer:t,reason:"unreachable",message:`peer ${t.name} unreachable`})}finally{clearTimeout(s)}}pk();var wKr=36e5,TKr={missing_token:"No share token was presented.",unknown_token:"Share token is not recognized.",malformed_token:"Share token is malformed.",paused:"The lender has paused this share.",revoked:"This share has been revoked.",expired:"This share has expired.",out_of_window:"This share is outside its allowed hours.",model_not_allowed:"This share does not cover the requested model.",exhausted:"This share has no credit remaining.",rate_limited:"This share's request rate limit was exceeded.",concurrency_limited:"This share's concurrent request limit was reached.",reserve_floor:"The lender's reserved headroom is in force.",spillover_inactive:"This share serves only the lender's spare capacity, and none is spare yet.",slice_exhausted:"This share has used its allotted portion of the window.",no_capacity:"No lender account can currently serve this share."};function EKr(e){return TKr[e]}function SKr(e){switch(e){case"missing_token":case"unknown_token":case"malformed_token":return 401;case"paused":case"revoked":case"expired":case"out_of_window":case"model_not_allowed":return 403;default:return 429}}function _Kr(e,t){const r=new Date(t).getHours(),{fromHour:n,toHour:o}=e;return n===o?!0:n<o?r>=n&&r<o:r>=n||r<o}function bKr(e,t){if(!e||e.length===0)return!0;if(!t)return!1;const r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function vYt(e,t){const r=n=>n===void 0?t:t===void 0?n:Math.min(n,t);return{session:r(e?.session5hPct),weekly:r(e?.weekly7dPct)}}function wYt(e,t,r){const n=e.spillover;if(!n)return!1;const o=n.beforeResetHours*wKr,s=n.whenUtilizationBelowPct/100,i=t.weeklyResetAt!==null&&t.weeklyResetAt-r<=o&&t.weeklyResetAt>r&&t.weeklyUsed!==null&&t.weeklyUsed<s,a=t.sessionResetAt!==null&&t.sessionResetAt-r<=o&&t.sessionResetAt>r&&t.sessionUsed!==null&&t.sessionUsed<s;return i||a}function Eoe(e,t){if(!e.accounts||e.accounts.length===0)return{inScope:[...t],outOfScope:[]};const r=new Set(e.accounts.map(s=>s.trim().toLowerCase())),n=[],o=[];for(const s of t){const i=s.accountKey.toLowerCase(),a=i.includes(":")?i.slice(i.indexOf(":")+1):i;r.has(i)||r.has(a)?n.push(s):o.push(s)}return{inScope:n,outOfScope:o}}function Soe(e,t,r,n){const o=e.gates,{inScope:s,outOfScope:i}=Eoe(o,t),a=s.some(m=>wYt(o,m,r)),c=vYt(o.maxSlice,a?o.spillover?.maxSlicePct:void 0);if(c.session!==void 0&&n.sessionFraction*100>=c.session||c.weekly!==void 0&&n.weeklyFraction*100>=c.weekly)return{allowed:[],excluded:[...s.map(m=>({accountKey:m.accountKey,reason:"slice_exhausted"})),...i.map(m=>({accountKey:m.accountKey,reason:"no_capacity"}))]};const u=[],d=i.map(m=>({accountKey:m.accountKey,reason:"no_capacity"}));for(const m of s){const h=wYt(o,m,r);if(o.spillover&&!h){d.push({accountKey:m.accountKey,reason:"spillover_inactive"});continue}const f=o.reserveFloor;if(f){const T=f.session5hPct!==void 0&&m.sessionUsed!==null&&m.sessionUsed*100>100-f.session5hPct,_=f.weekly7dPct!==void 0&&m.weeklyUsed!==null&&m.weeklyUsed*100>100-f.weekly7dPct;if(T||_){d.push({accountKey:m.accountKey,reason:"reserve_floor"});continue}}const g=vYt(o.maxSlicePerAccount,h?o.spillover?.maxSlicePct:void 0),y=g.session!==void 0&&m.borrowedSessionFraction*100>=g.session,w=g.weekly!==void 0&&m.borrowedWeeklyFraction*100>=g.weekly;if(y||w){d.push({accountKey:m.accountKey,reason:"slice_exhausted"});continue}u.push(m.accountKey)}return{allowed:u,excluded:d}}function _oe(e){return e.some(t=>t.reason==="reserve_floor")?"reserve_floor":e.some(t=>t.reason==="spillover_inactive")?"spillover_inactive":e.some(t=>t.reason==="slice_exhausted")?"slice_exhausted":"no_capacity"}var CKr="x-neurolink-share-token",kKr="x-neurolink-grant-status",AKr="x-neurolink-grant-reason",xKr="x-neurolink-grant-remaining-coins",IKr="x-neurolink-grant-peer";function RKr(e){const t=e[CKr];if(t?.trim())return t.trim();const r=e.authorization??e.Authorization;if(!r)return;const n=r.trim(),o=n.toLowerCase().startsWith("bearer ")?n.slice(7).trim():n;return T8r(o)?o:void 0}function MKr(e){return e===401?"authentication_error":e===403?"permission_error":"rate_limit_error"}function PKr(e,t){switch(e){case"paused":return"paused";case"revoked":return"revoked";case"expired":return"expired";case"exhausted":return"exhausted";case"out_of_window":return"out-of-window";case"missing_token":case"unknown_token":case"malformed_token":return"unauthorized";default:return t?.state??"active"}}function Nw(e,t){const{status:r,grant:n,retryAfterSeconds:o}=t,s={[kKr]:PKr(e,n),[AKr]:e};return n&&(s[IKr]=n.peerLabel,n.entitlement.ledger==="coins"&&(s[xKr]=String(Math.max(0,Math.floor(n.entitlement.coins??0))))),o!==void 0&&(s["retry-after"]=String(Math.max(1,Math.round(o)))),{status:r,headers:s,body:{type:"error",error:{type:MKr(r),message:t.message??EKr(e)}}}}pk(),Pr(),Os(),jt(),Pc(),Ja();var DKr="proxy-share-audit.json",OKr=2,NKr=3,LKr=1e3,FKr=null,Lw={},Hk=0,jk=-1,Vk=!1,$Kr=new wa;function boe(){return FKr??ft(ia(),".neurolink",DKr)}function UKr(e){return e?.code==="ENOENT"}async function BKr(e={}){const t=Date.now();if(!e.force&&Vk&&t-Hk<LKr)return;const r=boe();let n;try{n=(await Es(r)).mtimeMs}catch(o){if(!UKr(o))throw o;Lw={},jk=-1,Hk=t,Vk=!0;return}if(!e.force&&Vk&&n===jk){Hk=t;return}try{Lw=JSON.parse(await Mr(r,"utf8"))?.records??{}}catch(o){if(e.force)throw o;Lw={}}jk=n,Hk=t,Vk=!0}async function zKr(){const e={schemaVersion:1,records:Lw};await Ta(boe(),e);try{jk=(await Es(boe())).mtimeMs}catch{jk=-1}Hk=Date.now(),Vk=!0}function TYt(e,t){return e===null||t===null?0:Math.max(0,(t-e)*100)}function GKr(e,t,r=OKr){if(!e)return{drifted:!1,reason:"no_baseline"};if(t.lenderRequests>0)return{drifted:!1,reason:"attributable"};const n=TYt(e.sessionUsed,t.sessionUsed),o=TYt(e.weeklyUsed,t.weeklyUsed),s=Math.max(n,o);return s<=r?{drifted:!1,reason:"quiet"}:t.reportedCoins>0?{drifted:!1,reason:"attributable"}:{drifted:!0,unexplainedSessionPct:n,unexplainedWeeklyPct:o,detail:`the account moved ${s.toFixed(1)}% of a window since the last check-in while this node served none of it and the borrower reported no spend`}}async function qKr(e){const t=e.streakLimit??NKr;return $Kr.runExclusive(async()=>{await BKr({force:!0});const r=Lw[e.grantId],n=e.lenderRequestsTotal===void 0?e.observation:{...e.observation,lenderRequests:Math.max(0,e.lenderRequestsTotal-(r?.lenderRequestsTotal??0))},o=GKr(r?.lastObservation,n,e.tolerancePct),s=o.drifted?(r?.driftStreak??0)+1:0,i={grantId:e.grantId,accountLabel:e.accountLabel,lastObservation:n,...e.lenderRequestsTotal!==void 0?{lenderRequestsTotal:e.lenderRequestsTotal}:r?.lenderRequestsTotal!==void 0?{lenderRequestsTotal:r.lenderRequestsTotal}:{},driftStreak:s,...o.drifted?{lastDriftAt:n.at,lastDriftDetail:o.detail}:{...r?.lastDriftAt!==void 0?{lastDriftAt:r.lastDriftAt}:{},...r?.lastDriftDetail!==void 0?{lastDriftDetail:r.lastDriftDetail}:{}},...r?.autoPausedAt!==void 0?{autoPausedAt:r.autoPausedAt}:{}},a=s>=t&&i.autoPausedAt===void 0;return a&&(i.autoPausedAt=n.at),Lw[e.grantId]=i,await zKr(),{verdict:o,shouldPause:a}})}no(),Pr(),Os(),jt(),Pc(),Ja();var HKr="proxy-share-provisioning.json",jKr=9e5,VKr=/^[A-Za-z0-9_-]{43}$/,WKr=/^[A-Za-z0-9_-]{16,128}$/,KKr=null,Fw={},EYt=!1,SYt=new wa;function _Yt(){return KKr??ft(ia(),".neurolink",HKr)}function JKr(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.grantId=="string"&&typeof t.codeChallenge=="string"&&typeof t.state=="string"&&typeof t.expiresAt=="number"&&typeof t.status=="string"}async function bYt(e={}){if(!(EYt&&!e.force)){try{const t=JSON.parse(await Mr(_Yt(),"utf8"));Fw=Object.fromEntries(Object.entries(t?.requests??{}).filter(r=>JKr(r[1])))}catch{Fw={}}EYt=!0}}async function CYt(){const e={schemaVersion:1,requests:Fw};await Ta(_Yt(),e)}function YKr(e,t=Date.now()){return e.status!=="consumed"&&e.expiresAt>t}async function ZKr(e){if(!VKr.test(e.codeChallenge))return{ok:!1,reason:"code_challenge must be a base64url S256 digest"};if(!WKr.test(e.state))return{ok:!1,reason:"state must be 16-128 base64url characters"};const t=e.now??Date.now();return SYt.runExclusive(async()=>{await bYt({force:!0});const r={schemaVersion:1,grantId:e.grantId,codeChallenge:e.codeChallenge,challengeMethod:"S256",state:e.state,requestedAt:t,expiresAt:t+jKr,status:"pending"};return Fw[e.grantId]=r,await CYt(),{ok:!0,request:r}})}async function XKr(e,t=Date.now()){return SYt.runExclusive(async()=>{await bYt({force:!0});const r=Fw[e];if(!r||!YKr(r,t))return{status:"none"};if(r.status!=="authorized"||!r.code)return{status:"pending"};const{code:n,...o}=r;return Fw[e]={...o,status:"consumed",claimedAt:t},await CYt(),{status:"ready",code:r.code,state:r.state}})}Cjt(),no(),Pr(),Os(),jt(),Pc(),pk(),nL();var QKr="proxy-share-notes.json",kYt="nln",eJr=null,$w={},AYt=!1,tJr=new wa;function xYt(){return eJr??ft(ia(),".neurolink",QKr)}async function IYt(e={}){if(!(AYt&&!e.force)){try{$w=JSON.parse(await Mr(xYt(),"utf8"))?.notes??{}}catch{$w={}}AYt=!0}}async function rJr(){const{writeJsonSnapshotAtomically:e}=await Promise.resolve().then(()=>(Ja(),sre)),t={schemaVersion:1,notes:$w};await e(xYt(),t)}function nJr(e){const t=e.trim();if(t.startsWith(`${kYt}_`))try{const r=JSON.parse(Buffer.from(t.slice(kYt.length+1),"base64url").toString("utf8"));return typeof r?.noteId!="string"||typeof r.coins!="number"||typeof r.signature!="string"||typeof r.notAfter!="number"?void 0:r}catch{return}}async function oJr(e,t,r=Date.now()){const{signature:n,...o}=e;if(!t||!rL(o,n,t))return{status:"forged",coins:0};await IYt({force:!0});const s=$w[e.noteId];return s?s.redeemedAt!==void 0?{status:"spent",coins:s.coins}:s.notAfter<=r?{status:"expired",coins:s.coins}:{status:"valid",coins:s.coins}:{status:"unknown",coins:0}}async function sJr(e){const t=e.now??Date.now(),{signature:r,...n}=e.note;if(!e.secret||!rL(n,r,e.secret))return{ok:!1,status:"forged"};const o=await tJr.runExclusive(async()=>{await IYt({force:!0});const i=$w[e.note.noteId];return i?i.redeemedAt!==void 0?{status:"spent",coins:i.coins}:i.notAfter<=t?{status:"expired",coins:i.coins}:($w[i.noteId]={...i,redeemedAt:t,redeemedByGrant:e.grantId},await rJr(),{status:"valid",coins:i.coins}):{status:"unknown",coins:0}});if(o.status!=="valid")return{ok:!1,status:o.status};const s=await fjt(e.grantId,o.coins);return{ok:!0,coins:o.coins,balance:s}}nL(),Fjt();var iJr=64*1024,aJr=32;function RYt(e){try{const t=JSON.parse(e);return{errorType:t.error?.type??t.type??"stream_error",message:t.error?.message??t.message??"Upstream SSE error"}}catch{return{errorType:"stream_error",message:e.trim()||"Upstream SSE error"}}}function MYt(e){if(e.event==="error")return!0;try{const t=JSON.parse(e.data);return t.type==="error"||t.error!==void 0}catch{return!1}}async function cJr(e){const t=new TextDecoder,r=[];let n="",o=0;for(;o<iJr&&r.length<aJr;){let s;try{s=await e.read()}catch(a){return{kind:"transport_error",chunks:r,error:a}}if(s.done){n+=t.decode();const{events:a}=VL(n),c=a.find(MYt);return c?{kind:"sse_error",chunks:r,...RYt(c.data)}:r.length>0?{kind:"ready",chunks:r}:{kind:"empty",chunks:r}}if(!s.value||s.value.length===0)continue;r.push(s.value),o+=s.value.byteLength,n+=t.decode(s.value,{stream:!0});const i=VL(n);n=i.remainder;for(const a of i.events){if(MYt(a))return{kind:"sse_error",chunks:r,...RYt(a.data)};if(a.event!=="ping"&&(a.event||a.data))return{kind:"ready",chunks:r}}}return r.length>0?{kind:"ready",chunks:r}:{kind:"empty",chunks:r}}function PYt(){let e=!1,t;const r=new Promise(o=>{t=o}),n=o=>{e||(e=!0,t(o))};return{outcome:r,complete:()=>n({kind:"completed"}),fail:o=>n({kind:"upstream_error",message:o}),cancel:()=>n({kind:"client_cancelled"})}}function KL(e,t){return e.kind==="completed"&&t?{kind:"upstream_error",message:t}:e}function lJr(e){const t=e.toLowerCase();return t.includes("opus")?"opus":t.includes("sonnet")?"sonnet":t.includes("haiku")?"haiku":"other"}function Uw(e,t,r,n,o=!1){const s=[{provider:e.provider,model:e.model,label:`${e.provider}/${e.model??"unknown"}`}];for(const i of t)i.provider===e.provider&&i.model===e.model||s.push({provider:i.provider,model:i.model,...i.reasoningEffort!==void 0?{reasoningEffort:i.reasoningEffort}:{},label:`${i.provider}/${i.model}`});return o&&(t.length===0||s.length===1)&&s.push({label:"auto-provider"}),{requestedModel:r,modelTier:lJr(r),attempts:s,skipped:[]}}function JL(e){if(!e)return 0;const t=parseInt(e,10);if(!Number.isNaN(t))return Math.max(1,t)*1e3;const r=new Date(e);return Number.isNaN(r.getTime())?0:Math.max(1e3,r.getTime()-Date.now())}var uJr=1,dJr=20;function Coe(e){return typeof e=="number"&&Number.isInteger(e)&&e>=uJr&&e<=dJr?e:void 0}Ja(),tL(),ar(),B(),Qr(),Hf(),ig();var DYt=new WeakMap;function mJr(e,t){const r=DYt.get(e);if(r){r.push(t);return}DYt.set(e,[t])}tL(),ar(),B();var OYt=900*1e3,NYt=6e4,pJr=900*1e3,LYt=6e4,jd="codex-oauth",hJr="neurolink.codexFallback";function FYt(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 fJr(e){const t=FYt(e);return t==="ENOTFOUND"||t==="EAI_AGAIN"?"shared_provider_transport":"connection_transport"}function YL(e,t){return $n(e).slice(0,200)||t}var koe=new Map;async function gJr(e,t,r,n){const o=koe.get(e);if(o)return o;const s=(async()=>{const i=await r.peekTokens(e).catch(()=>null),a=i?.refreshToken??t,c=await n(a),l={accessToken:c.accessToken,refreshToken:c.refreshToken??a,expiresAt:c.expiresAt??i?.expiresAt??Date.now()+36e5};return i&&await r.saveTokens(e,{...l,tokenType:"Bearer",...i.scope?{scope:i.scope}:{}}),l})().finally(()=>{koe.delete(e)});return koe.set(e,s),s}async function Aoe(e,t){return gJr(e,t,Is,rVr)}var yJr=new Set(["host","connection","content-length","transfer-encoding","cookie","proxy-authorization","authorization","x-api-key","chatgpt-account-id","accept-encoding"]);function ZL(e,t){return new Response(JSON.stringify({error:{type:"proxy_error",message:t}}),{status:e,headers:{"content-type":"application/json"}})}async function $Yt(){const e=await Is.listByPrefix(wp),[t,r]=await Promise.all([Mk(),Fne()]),n=Date.now(),o=[];for(const s of e){if(await Is.isDisabled(s))continue;const i=await Is.loadTokens(s);if(!i||i.tokenType!=="Bearer")continue;let a=i.accessToken,c=i.expiresAt;if(oVr(c)&&i.refreshToken)try{const d=await Aoe(s,i.refreshToken);a=d.accessToken,c=d.expiresAt??c}catch(d){p.debug(`Codex proactive refresh failed for ${s.slice(wp.length)}: ${d instanceof Error?d.message:String(d)}`)}const l=t[s],u=l&&l.coolingUntil>n;o.push({key:s,label:s.slice(wp.length)||s,token:a,refreshToken:i.refreshToken,expiresAt:c,accountId:Dk(a),quota:r[s],coolingUntil:u?l.coolingUntil:void 0,coolingReason:l?.reason,expiredCooldownUntil:l&&!u?l.coolingUntil:void 0})}return o}function UYt(e,t){return[...e].sort((r,n)=>{const o=r.coolingUntil!==void 0&&r.coolingUntil>t,s=n.coolingUntil!==void 0&&n.coolingUntil>t;if(o!==s)return o?1:-1;const i=r.quota?r.quota.sessionUsed:-1,a=n.quota?n.quota.sessionUsed:-1;return i-a})}function BYt(e,t){const r={};for(const[o,s]of Object.entries(e)){const i=o.toLowerCase();yJr.has(i)||(r[i]=s)}r.authorization=`Bearer ${t.token}`;const n=Dk(t.token,t.accountId);return n&&(r["chatgpt-account-id"]=n),r["content-type"]="application/json",r["user-agent"]||(r["user-agent"]=Gne),r.originator||(r.originator=X9r),r.accept||(r.accept="text/event-stream"),r}function vJr(e,t,r){const n=r+NYt;if(e){if(e.weeklyStatus==="rejected"&&e.weeklyResetAt>0)return{coolingUntil:Math.max(e.weeklyResetAt*1e3,n),reason:"weekly"};if(e.sessionStatus==="rejected"&&e.sessionResetAt>0)return{coolingUntil:Math.max(e.sessionResetAt*1e3,n),reason:"session"}}const o=Math.min(pJr,Math.max(t,NYt));return{coolingUntil:r+o,reason:"transient"}}function wJr(e,t,r,n){e.responseHeaders||(e.responseHeaders={}),e.responseHeaders["x-neurolink-account"]=t.label,e.responseHeaders["x-neurolink-account-type"]="codex-oauth",e.responseHeaders["x-neurolink-served-by"]="codex",e.responseHeaders["x-neurolink-attempt"]=String(r),e.responseHeaders["x-neurolink-quota-source"]=n?"live":"none",n&&(e.responseHeaders["x-neurolink-quota-session-left-pct"]=String(Math.round((1-n.sessionUsed)*100)),e.responseHeaders["x-neurolink-weekly-left-pct"]=String(Math.round((1-n.weeklyUsed)*100)))}async function zYt(e){const t=Date.now(),r=e.body??{},n=JSON.stringify(r),o=typeof r.model=="string"?r.model:"-",s=e.metadata?.[hJr]===!0,i=(T,_,b={})=>Sp({timestamp:new Date().toISOString(),requestId:e.requestId,method:e.method,path:e.path,model:o,stream:!0,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:T?.label??"",...T?{accountKey:T.key}:{},accountType:T?jd:"",provider:"openai",...Pw(e.headers),responseStatus:_,responseTimeMs:Date.now()-t,...b});let a=!1;const c=async(T,_,b={})=>{s||a||(a=!0,_>=400?aw(_,T?.label,T?jd:void 0,{requestId:e.requestId,...T?{accountKey:T.key}:{},errorType:b.errorType,terminalOutcome:b.terminalOutcome??"handler_error",message:b.errorMessage,errorCode:b.errorCode}):ck(T?.label,T?jd:void 0),await i(T,_,b))},l=(T,_,b,k,A={})=>{QJt({timestamp:new Date().toISOString(),requestId:e.requestId,attempt:_,method:e.method,path:e.path,model:o,stream:!0,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:T.label,accountKey:T.key,accountType:jd,provider:"openai",responseStatus:k,responseTimeMs:Date.now()-t,attemptDurationMs:Date.now()-b,...A}).catch(()=>{})},u=await $Yt();if(u.length===0)return await c(void 0,401,{errorType:"no_accounts",errorMessage:"No Codex accounts"}),ZL(401,"No Codex accounts configured. Run `neurolink auth login codex`.");const d=Date.now(),m=UYt(u,d),h=m.filter(T=>!(T.coolingUntil!==void 0&&T.coolingUntil>d));if(h.length===0){const T=m.reduce((b,k)=>k.coolingUntil===void 0?b:b===void 0?k.coolingUntil:Math.min(b,k.coolingUntil),void 0),_=T?Math.max(1,Math.ceil((T-d)/1e3)):60;return await c(void 0,429,{errorType:"all_accounts_cooling",errorMessage:"All Codex accounts are rate-limited"}),new Response(JSON.stringify({error:{type:"rate_limit_error",message:"All Codex accounts are currently rate-limited"}}),{status:429,headers:{"content-type":"application/json","retry-after":String(_)}})}let f=0,g="All Codex accounts failed",y=502,w;for(const T of h){let _=!1;for(;;){f+=1;const b=Date.now();w=T,ag(T.label,jd);let k;try{k=await fetch(J9r,{method:"POST",headers:BYt(e.headers,T),body:n,signal:AbortSignal.timeout(OYt)})}catch(x){p.debug(`Codex upstream fetch failed (${T.label}): ${$n(x instanceof Error?x.message:String(x))}`);const P=YL(x instanceof Error?x.message:String(x),"Codex upstream request failed"),N=FYt(x),F=fJr(x);_r(T.label,jd,502),l(T,f,b,502,{errorType:"network_error",errorMessage:P,...N?{errorCode:N}:{},transportScope:F,retryable:!0}),g="Codex upstream request failed",y=502;break}if(k.ok){const x=AJt(k.headers);x&&vp(T.key,x).catch(()=>{}),T.expiredCooldownUntil!==void 0&&pg(T.key,T.expiredCooldownUntil).catch(()=>{}),wJr(e,T,f,x),l(T,f,b,k.status);const P={"content-type":k.headers.get("content-type")??"text/event-stream","cache-control":"no-cache",connection:"keep-alive",...e.responseHeaders??{}};if(!k.body)return await c(T,k.status,{terminalOutcome:"bodyless"}),new Response(k.body,{status:k.status,headers:P});const{stream:N,usage:F}=SVr(),O=new Response(k.body.pipeThrough(N),{status:k.status,headers:P});return mJr(e.metadata,{onTerminal:({outcome:M})=>{F.then(U=>{const $=U?{inputTokens:U.inputTokens,outputTokens:U.outputTokens,cacheReadTokens:U.cacheReadTokens,cacheCreationTokens:U.cacheCreationTokens}:{};return M==="completed"||M==="bodyless"?c(T,k.status,{terminalOutcome:M,...$}):c(T,M==="client_cancelled"?499:502,{errorType:M==="client_cancelled"?"client_cancelled":"stream_error",errorMessage:M==="client_cancelled"?"Client cancelled Codex stream":"Codex upstream stream failed",terminalOutcome:M,...$})}).catch(()=>{})}}),O}const A=await k.text().catch(()=>"");if((k.status===401||k.status===403)&&!_&&T.refreshToken){const x=YL(A,"Codex authentication rejected upstream");_r(T.label,jd,k.status),l(T,f,b,k.status,{errorType:"authentication_error",errorMessage:x,retryable:!0}),_=!0;const P={accessToken:T.token,refreshToken:T.refreshToken,expiresAt:T.expiresAt??0};try{const N=await Aoe(T.key,T.refreshToken);T.token=N.accessToken,T.refreshToken=N.refreshToken??T.refreshToken,T.expiresAt=N.expiresAt??T.expiresAt,T.accountId=Dk(N.accessToken);continue}catch(N){if(nVr(N)){await Is.markDisabledIfCurrent(T.key,P,"refresh_invalid")&&p.always(`[proxy] codex account=${T.label} disabled until re-authentication. Run: neurolink auth login codex --label ${T.label}`),y=401,g="Codex token refresh failed; re-login required";break}await Eu(T.key,Date.now()+LYt,"auth").catch(()=>{}),p.debug(`[proxy] codex account=${T.label} refresh failed transiently; cooling and rotating`),y=503,g="Codex token refresh temporarily unavailable";break}}if(k.status===429){const x=AJt(k.headers);x&&vp(T.key,x).catch(()=>{});const P=JL(k.headers.get("retry-after")),N=vJr(x,P,Date.now());await Eu(T.key,N.coolingUntil,N.reason).catch(()=>{});const F=N.reason==="transient"?"transient":"quota",O=YL(A,"Codex account rate-limited");_r(T.label,jd,k.status,F),l(T,f,b,k.status,{errorType:"rate_limit_error",errorMessage:O,retryable:!0,rateLimitKind:F,cooldownReason:N.reason}),y=429,g="Codex account rate-limited";break}(k.status===401||k.status===403)&&await Eu(T.key,Date.now()+LYt,"auth").catch(()=>{});const I=YL(A,"Codex error"),R=k.status===401||k.status===403?"authentication_error":"api_error";_r(T.label,jd,k.status),l(T,f,b,k.status,{errorType:R,errorMessage:I,retryable:k.status>=500}),y=k.status>=500?502:k.status,g=I;break}}return await c(w,y,{errorType:"all_accounts_failed",errorMessage:g}),ZL(y,g)}async function TJr(e){const t=await $Yt();if(t.length===0)return ZL(401,"No Codex accounts configured. Run `neurolink auth login codex`.");const r=Date.now(),n=UYt(t,r),o=d=>d.coolingUntil!==void 0&&d.coolingUntil>r,s=[...n.filter(d=>!o(d)),...n.filter(o)],a=new URLSearchParams(e.query??{}).toString(),c=a?`${EJt}?${a}`:EJt;let l=502,u="Codex model discovery upstream failed";for(const d of s){let m=!1;for(;;){let h;try{h=await fetch(c,{method:"GET",headers:BYt(e.headers??{},d),signal:AbortSignal.timeout(OYt)})}catch(y){l=502,u=`Codex model discovery upstream failed: ${y instanceof Error?y.message:String(y)}`;break}if(h.status===401||h.status===403){if(!m&&d.refreshToken){m=!0;try{const y=await Aoe(d.key,d.refreshToken);d.token=y.accessToken,d.refreshToken=y.refreshToken??d.refreshToken,d.expiresAt=y.expiresAt??d.expiresAt,d.accountId=Dk(y.accessToken);continue}catch{l=401,u="Codex token refresh failed; re-login required";break}}l=h.status,u="Codex model discovery rejected upstream";break}const f=await h.text(),g=h.headers.get("content-type")??"application/json";return new Response(f,{status:h.status,headers:{"content-type":g}})}}return ZL(l,u)}function EJr(e=""){return{prefix:`${e}/backend-api/codex`,routes:[{method:"POST",path:`${e}/backend-api/codex/responses`,description:"Codex ChatGPT-backend Responses API (account pool)",handler:t=>zYt(t)},{method:"GET",path:`${e}/backend-api/codex/models`,description:"Codex model discovery, relayed upstream (account pool)",handler:t=>TJr(t)}]}}var XL=new Set(["cookie","proxy-authorization","host","connection","content-length","transfer-encoding"]),xoe="proxy/internal",Ioe="internal";function GYt(e,t){return e?t==="codex-oauth"?{accountKey:e.startsWith("codex:")?e:`codex:${e}`,provider:"openai"}:t==="oauth"||t==="api_key"||t==="passthrough"?{accountKey:t==="passthrough"?e:mp(e),provider:"anthropic"}:{}:{}}var _p=0,qYt=0,Wk=5,QL=2,Roe=[250,1e3],HYt=4,jYt=[250,500,1e3,2e3],Moe=1,SJr=120*1e3,Poe=2,VYt=3e4,WYt=11520*60*1e3,KYt=5e3,_Jr=900*1e3,Doe=900*1e3,bJr=3e4,CJr=300*1e3,Kk=900*1e3,JYt;function Ooe(e,t){return JYt??=new LS({headersTimeout:Kk,bodyTimeout:Kk}),fetch(e,{...t,dispatcher:JYt})}var ec=new Map,Jk=new uVr,Bw=new mVr,Noe=900*1e3,YYt=new Map,ZYt=new Map,eF=new Map,kJr={release:()=>{}};function XYt(e){let t=eF.get(e);return t||(t={active:0,waiters:[]},eF.set(e,t)),t}function Loe(e,t){for(;t.waiters.length>0&&t.active<t.waiters[0].capacity;){const r=t.waiters.shift();if(!r)return;t.active+=1,r.resolve(QYt(e,t))}}function QYt(e,t){let r=!1;return{release:()=>{r||(r=!0,t.active=Math.max(0,t.active-1),Loe(e,t),eZt(e,t))}}}function eZt(e,t){t.active===0&&t.waiters.length===0&&eF.delete(e)}function AJr(e,t){const r=Coe(t);if(r===void 0)return kJr;const n=XYt(e);if(!(n.waiters.length>0||n.active>=r))return n.active+=1,QYt(e,n)}function xJr(e,t){const r=Coe(t);if(r===void 0)return!0;const n=eF.get(e);return!n||n.waiters.length===0&&n.active<r}function IJr(e,t){const r=Coe(t);if(r===void 0)throw new Error("Account admission queue requires an explicit capacity");const n=XYt(e);let o=!0,s,i;const a=new Promise(l=>{i=l}),c={capacity:r,resolve:l=>{o=!1,s=l,i(l)}};return n.waiters.push(c),Loe(e,n),{accountKey:e,promise:a,cancel:()=>{if(s){const u=s;s=void 0,u.release();return}if(!o)return;o=!1;const l=n.waiters.indexOf(c);l>=0&&(n.waiters.splice(l,1),Loe(e,n)),eZt(e,n)}}}async function RJr(e,t,r,n=rZt){const o=[...new Set(e)].map(i=>IJr(i,t));let s;try{return await Mt(bbe(Promise.race(o.map(i=>i.promise.then(a=>s?(a.release(),new Promise(()=>{})):(s=i.accountKey,{accountKey:i.accountKey,lease:a})))),r),n,`Account admission timed out after ${n}ms`)}catch(i){if(r?.aborted)throw i;return}finally{for(const i of o)i.accountKey!==s&&i.cancel()}}var tZt=!1,Foe=6e4,rZt=9e4,MJr=12e4,PJr=250,DJr=15e3;function vg(e,t,r){t<=1||e===r&&(_p=(_p+1)%t)}function nZt(e,t){if(!t)return 0;const r=e.findIndex(n=>HHt(n.key,t));return r>=0?r:0}function OJr(e,t){if(e.length<=1)return;const r=nZt(e,t);if(_p===r)return;const n=e[r],o=ec.get(n.key);if((!o||!o.coolingUntil||Date.now()>=o.coolingUntil)&&(_p=r,o?.coolingUntil)){const s=o.coolingUntil;o.coolingUntil=void 0,o.coolingReason=void 0,pg(n.key,s).catch(()=>{}),p.always(`[proxy] home primary account=${n.label} cooling expired, resetting primaryAccountIndex to ${r}`)}}function oZt(e){const t=ec.get(e);return!!t?.coolingUntil&&Date.now()<t.coolingUntil}function NJr(e,t,r=Date.now()){let n=YYt.get(e);if(!n||r>=n.coolingUntil?(n={coolingUntil:t,retriesClaimed:0},YYt.set(e,n)):t>n.coolingUntil&&(n.coolingUntil=t),!(n.retriesClaimed>=Poe))return n.retriesClaimed+=1,n.retriesClaimed}function LJr(e,t,r=Date.now()){if(t<=r)return 0;if(t-r>rZt)return;let n=ZYt.get(e);!n||r>=n.coolingUntil?(n={coolingUntil:t,nextAdmissionAt:t},ZYt.set(e,n)):t>n.coolingUntil&&(n.coolingUntil=t,n.nextAdmissionAt=Math.max(n.nextAdmissionAt,t));const o=Math.max(r,n.coolingUntil,n.nextAdmissionAt);if(!(o-n.coolingUntil>DJr))return n.nextAdmissionAt=o+PJr,o-r}async function FJr(e){const t=Date.now()+MJr;for(;Date.now()<t;){const r=e.filter(i=>!oZt(i.key));if(r.length>0)return r;const n=Date.now(),o=e.map(i=>({account:i,state:ba(i.key)})).filter(({state:i})=>i.coolingReason==="transient"&&i.coolingUntil!==void 0&&i.coolingUntil>n).sort((i,a)=>(i.state.coolingUntil??Number.POSITIVE_INFINITY)-(a.state.coolingUntil??Number.POSITIVE_INFINITY))[0];if(!o?.state.coolingUntil)return[];const s=LJr(o.account.key,o.state.coolingUntil,n);if(s===void 0||n+s>t)return[];p.always(`[proxy] all usable accounts are transiently cooling; queueing request for account=${o.account.label} in ${s}ms`),await _u(s)}return[]}function Rs(e,t){if(!e||e<=0)return;const r=e>4102444800?e:e*1e3;return r>t?r:void 0}function Yk(e,t){try{const r=t.poolAccounts?wVr(t.poolAccounts.map(o=>{const s=ec.get(o.key);return{...s?.coolingUntil!==void 0?{coolingUntil:s.coolingUntil}:{},...s?.quota?{quota:s.quota}:{}}})):void 0,n=vVr({...t.upstreamHeaders?{upstreamHeaders:t.upstreamHeaders}:{},context:{quota:t.quota??null,source:t.source,...t.account?{accountLabel:t.account.label}:{},...t.accountType??t.account?.type?{accountType:t.accountType??t.account?.type}:{},...t.servedBy?{servedBy:t.servedBy}:{},...t.attempt!==void 0?{attempt:t.attempt}:{},...t.accountState?.coolingUntil!==void 0?{coolingUntil:t.accountState.coolingUntil}:{},...t.accountState?.coolingReason?{coolingReason:t.accountState.coolingReason}:{},...r?{pool:r}:{}}});e.responseHeaders={...e.responseHeaders??{},...gZt(n)}}catch(r){p.debug(`[proxy] failed to publish limit headers: ${r instanceof Error?r.message:String(r)}`)}}function tF(e,t,r){const n=Math.min(WYt,(r&&aJt[r])??WYt);return Math.min(Math.max(e,t+KYt),t+n)}function rF(e){return e?.trim().toLowerCase()==="allowed"}function sZt(e,t){return!e||Rs(e.resetsAt,t)===void 0?!1:e.status?.trim().toLowerCase()==="rejected"||(e.used??0)>=1}function $Jr(e,t,r,n=Nc){if(!e||!t||!rF(e.sessionStatus)||!rF(e.weeklyStatus)||zw(e,n))return null;const o=Voe(e,t,r);return sZt(o,r)?o:null}function UJr(e,t,r=Nc){return!rF(e.sessionStatus)||!rF(e.weeklyStatus)||zw(e,r)?!1:(e.windows??[]).some(n=>n.kind==="weekly_scoped"&&typeof n.scopeModel=="string"&&t-joe(e,n)<=Noe&&sZt(n,t))}function $oe(e,t,r,n=e?.unifiedStatus,o=Nc,s){if(e&&e.weeklyStatus==="rejected"){const l=Rs(e.weeklyResetAt,r)??(t>0?r+t:r+Foe);return{reason:"weekly",scope:"account",coolingUntil:tF(l,r,"weekly"),rotateImmediately:!0}}const i=zw(e,o);if(e&&e.sessionStatus==="rejected"&&!i){const l=Rs(e.sessionResetAt,r)??(t>0?r+t:r+Foe);return{reason:"session",scope:"account",coolingUntil:tF(l,r,"session"),rotateImmediately:!0}}const a=$Jr(e,s,r,o);if(a)return{reason:"unified",scope:"model",coolingUntil:Rs(a.resetsAt,r)??(t>0?r+t:r+Doe),rotateImmediately:!0};if(n?.trim().toLowerCase()==="rejected"&&!i){const l=t>0?r+t:r+Doe;return{reason:"unified",scope:"account",coolingUntil:tF(l,r,"unified"),rotateImmediately:!0}}const c=t>0?t:Foe;return{reason:"transient",scope:"account",coolingUntil:r+Math.max(KYt,Math.min(c,_Jr)),rotateImmediately:!1}}function Uoe(e,t){return Math.max(0,Math.round((e-t)/6e4))}function Boe(e,t,r,n=Nc){const o=zw(t,n),s=UJr(t,r,n);let i,a;if(t.weeklyStatus==="rejected"&&(i=Rs(t.weeklyResetAt,r),a="weekly"),i===void 0&&o&&e.coolingUntil&&(e.coolingReason==="session"||e.coolingReason==="unified")){const l=e.coolingUntil;return e.coolingUntil=void 0,e.coolingReason=void 0,p.always("[proxy] clearing subscription cooldown because Anthropic explicitly permits overage"),{kind:"cleared",coolingUntil:l}}if(i===void 0&&t.sessionStatus==="rejected"&&!o?(i=Rs(t.sessionResetAt,r),a="session"):i===void 0&&t.unifiedStatus==="rejected"&&!o&&!s&&(i=r+Doe,a="unified"),i===void 0){if(!!e.coolingUntil&&(e.coolingReason==="weekly"&&t.weeklyStatus==="allowed"||e.coolingReason==="session"&&t.sessionStatus==="allowed"||e.coolingReason==="unified"&&(t.unifiedStatus==="allowed"||s))&&e.coolingUntil){const u=e.coolingUntil,d=e.coolingReason;return e.coolingUntil=void 0,e.coolingReason=void 0,p.always(`[proxy] clearing ${d} cooldown from fresh provider quota`),{kind:"cleared",coolingUntil:u}}return null}const c=tF(i,r,a);return!e.coolingUntil||c>e.coolingUntil?(e.coolingUntil=c,e.coolingReason=a,p.always(`[proxy] proactively cooling account (${a}) ~${Uoe(c,r)}m from success-response quota (status rejected)`),{kind:"cooled",coolingUntil:c,coolingReason:a??"unified"}):null}async function BJr(e){try{const[t,r]=await Promise.all([Fne(),Mk()]),n=Date.now();for(const o of e){const s=ba(o.key);s.quota||(s.quota=t[o.key]??t[o.label]);const i=r[o.key];i?.coolingUntil>n&&(!s.coolingUntil||i.coolingUntil>s.coolingUntil)&&(s.coolingUntil=i.coolingUntil,s.coolingReason=i.reason)}}catch{}}var zJr=15e3,iZt=new Map,nF=null,GJr=4;async function aZt(e,t,r,n){if(t.ok===!1)return null;const o=ba(e.key),s=wJt(t.usage,{now:r,prior:o.quota??n??null});if(!s)return null;if(s.lastUpdated<(o.quota?.lastUpdated??0))return o.quota??null;o.quota=hg(o.quota,s);const i=Boe(o,s,Date.now());return i?.kind==="cooled"?await Eu(e.key,i.coolingUntil,i.coolingReason).catch(()=>{}):i?.kind==="cleared"&&await pg(e.key,i.coolingUntil).catch(()=>{}),await vp(e.key,s).catch(()=>{}),s}async function cZt(e){const t=await q9r(e);return t.ok===!1||wJt(t.usage,{now:Date.now(),prior:ec.get(e.key)?.quota??null})?t:{ok:!1,reason:"parse",error:"usage payload had no recognizable limit windows"}}async function oF(e,t){const r=await Jk.run(e,t,cZt);r.kind!=="completed"||r.result.ok===!1||await aZt(e,r.result,r.startedAt)}var Zk=null;async function qJr(e){if(Zk)return{anthropic:Zk.anthropic,codex:Zk.codex};const[t,r]=await Promise.all([yJt(e),iVr()]);return{anthropic:t,codex:r}}async function HJr(){if(Zk)return Zk.knownKeys;const[e,t]=await Promise.all([Is.listByPrefix("anthropic:"),Is.listByPrefix("codex:")]);return new Set([...e.map(mp),...t])}async function zoe(e={}){const t=Date.now(),r=await qJr(e.accountAllowlist),n=[...r.anthropic.map(u=>({account:u,provider:"anthropic"})),...r.codex.map(u=>({account:u,provider:"codex"}))],o=e.accountFilter?n.filter(({account:u})=>u.label===e.accountFilter||u.key===e.accountFilter):n,s=await Fne().catch(()=>({})),i=(u,d,m,h,f)=>{const g=ec.get(u.key),y=d==="anthropic"?s[u.key]??s[u.label]??null:s[u.key]??null,w={account:u.label,key:u.key,provider:d,type:u.type,status:m,quota:h??g?.quota??y};return f!==void 0&&(w.error=f),g?.coolingUntil&&g.coolingUntil>Date.now()&&(w.coolingUntil=g.coolingUntil,g.coolingReason&&(w.coolingReason=g.coolingReason)),w};if(e.snapshotOnly)return{fetchedAt:t,snapshot:!0,results:o.map(({account:u,provider:d})=>i(u,d,"snapshot",null)),refreshMetrics:Jk.getMetrics()};const a=new Array(o.length);let c=0;const l=async()=>{for(;;){const u=c++;if(u>=o.length)return;const{account:d,provider:m}=o[u];if(d.type!=="oauth"){a[u]=i(d,m,"skipped_api_key",null);continue}const h=iZt.get(d.key)??0;if(Date.now()-h<zJr){a[u]=i(d,m,"throttled",null);continue}if(iZt.set(d.key,Date.now()),m==="codex"){try{const f=await aVr(d);if(f.ok===!1){a[u]=i(d,m,"error",null,`codex usage fetch failed: ${f.reason}`);continue}await vp(d.key,f.quota),a[u]=i(d,m,"refreshed",f.quota)}catch(f){a[u]=i(d,m,"error",null,f instanceof Error?f.message:String(f))}continue}try{const f=await Jk.run(d,`manual:${d.key}`,cZt,{force:!0});if(f.kind!=="completed"){a[u]=i(d,m,"throttled",null);continue}const g=f.result;if(g.ok===!1){a[u]=i(d,m,"error",null,g.error);continue}const y=await aZt(d,g,f.startedAt,s[d.key]??s[d.label]??null);if(!y){a[u]=i(d,m,"error",null,"usage payload had no recognizable limit windows");continue}a[u]=i(d,m,"refreshed",y)}catch(f){a[u]=i(d,m,"error",null,f instanceof Error?f.message:String(f))}}};return await Promise.all(Array.from({length:Math.min(GJr,o.length||1)},()=>l())),{fetchedAt:t,snapshot:!1,results:a,refreshMetrics:Jk.getMetrics()}}function Goe(){const e=(process.env.NEUROLINK_PROXY_QUOTA_ROUTING??"").toLowerCase();return e!=="off"&&e!=="false"&&e!=="0"}function qoe(){const e=Number(process.env.NEUROLINK_PROXY_SESSION_SOFT_LIMIT??"");return Number.isFinite(e)&&e>0&&e<=1?e:.97}function Xk(){const e=Number(process.env.NEUROLINK_PROXY_SESSION_RESET_TOLERANCE_MS??"");return Number.isInteger(e)&&e>0?e:900*1e3}var Nc="auto";function Hoe(e){e!==void 0&&(Nc=e)}function jJr(){return Nc}function zw(e,t=Nc){return t==="never"?!1:lJt(e)}var VJr=4;function sF(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function WJr(e){const t=sF(e);return t.startsWith("claude")?t.slice(6):t}function KJr(e,t,r){if(e.scopeModelId&&sF(RL(e.scopeModelId))===r)return Number.MAX_SAFE_INTEGER;if(!e.scopeModel)return null;const n=WJr(e.scopeModel);return n.length<VJr||!t.includes(n)?null:n.length}function joe(e,t){return t.updatedAt??e.windowsUpdatedAt??e.lastUpdated}function Voe(e,t,r=Date.now()){if(!e?.windows?.length||!t)return null;const n=sF(t);if(!n)return null;const o=sF(RL(t));let s=null,i=-1,a=-1;for(const c of e.windows){if(r-joe(e,c)>Noe)continue;const l=KJr(c,n,o);if(l===null)continue;const u=joe(e,c);(l>i||l===i&&u>a)&&(s=c,i=l,a=u)}return s}function JJr(e,t,r=Date.now(),n=Nc){if(!t||e.length===0)return{eligible:e,exhaustion:null};const o=[],s=[];let i;for(const c of e){const l=ec.get(c.key)?.quota,u=Voe(l,t,r),d=u?Rs(u.resetsAt,r):void 0;if(!(u!==null&&d!==void 0&&((u.status??"").trim().toLowerCase()==="rejected"||(u.used??0)>=1)&&!zw(l,n))||!u){o.push(c);continue}s.push({label:c.label,window:u}),i??=l?.overageDisabledReason}if(o.length>0||s.length===0)return{eligible:o,exhaustion:null};const a=Math.min(...s.map(c=>Rs(c.window.resetsAt,r)??Number.POSITIVE_INFINITY));return{eligible:o,exhaustion:{model:t,scopeModel:s[0]?.window.scopeModel??RL(t),earliestResetMs:a,accounts:s.map(c=>c.label),...i?{overageDisabledReason:i}:{}}}}function iF(e,t,r,n,o,s=Nc){const i=ec.get(e),a=i?.quota,c=a&&Number.isFinite(a.lastUpdated)?a.lastUpdated:null,l=c===null?null:Math.max(0,t-c),u=Jk.getState(e),d=l!==null&&l>Noe,m=ne=>ne.trim().toLowerCase(),h=lJt(a),f=[a?.unifiedStatus,a?.sessionStatus,a?.weeklyStatus].filter(ne=>!!ne?.trim()),g=d&&!!a&&!h&&f.some(ne=>m(ne)!=="allowed"),y=a?d?g?"refresh_due":"stale_known":"fresh":"unknown",w=g?void 0:a,T=!!i?.coolingUntil&&t<i.coolingUntil,_=Rs(w?.weeklyResetAt,t),b=Rs(w?.sessionResetAt,t),k=b!==void 0,A=_!==void 0,I=w?k?w.sessionUsed??0:0:null,R=w?A?w.weeklyUsed??null:0:null,x=w?k?w.sessionStatus??"unknown":"allowed":null,P=w?A?w.weeklyStatus??"unknown":"allowed":null,N=zw(w,s),F=!N&&(x==="rejected"||x==="throttled"||P==="rejected"||P==="throttled"||w?.unifiedStatus?.trim().toLowerCase()==="rejected"||k&&(I??0)>=1||A&&(R??0)>=1),O=!F&&!N&&k&&(I??0)>=r,M=F||O,U=Voe(w,o,t),$=U?Rs(U.resetsAt,t):void 0,H=$!==void 0,V=U?H?U.used:0:null,W=U?H?U.status??"unknown":"allowed":null,Q=!d&&H&&(V??0)>=r;return{usable:!T&&!F&&(W!=="rejected"||N),saturated:M,scopedModel:U?.scopeModel??null,scopedStatus:W,scopedUsed:V,scopedReset:$??Number.POSITIVE_INFINITY,scopedUsedForSort:V??-1,scopedSaturated:Q,hasQuota:!!a,quotaEvidenceRank:y==="fresh"||y==="stale_known"?0:y==="refresh_due"?1:2,quotaStale:d,quotaFreshness:y,refreshNeeded:y==="unknown"||y==="refresh_due",refreshReason:y==="unknown"?"startup_unknown":y==="refresh_due"?"ambiguous_snapshot":null,refreshInFlight:u.inFlight,lastRefreshAttemptAt:u.lastAttemptAt??null,lastRefreshSuccessAt:u.lastSuccessAt??null,nextRefreshEligibleAt:u.nextEligibleAt??null,saturationKind:F?"hard":O?"soft":"none",softLimitOverrideReason:N&&k&&(I??0)>=r?"overage":null,quotaLastUpdated:c,quotaAgeMs:l,coolingActive:T,coolingReason:i?.coolingReason??null,coolingUntil:i?.coolingUntil??0,unifiedStatus:w?.unifiedStatus??null,fallbackStatus:w?.fallbackStatus??null,upgradePaths:w?.upgradePaths??null,overageEligible:N,overageStatus:w?.overageStatus??null,sessionStatus:x,sessionUsed:I,sessionResetBucket:k?Math.floor(b/n):Number.POSITIVE_INFINITY,sessionReset:b??Number.POSITIVE_INFINITY,weeklyStatus:P,weeklyReset:_??Number.POSITIVE_INFINITY,weeklyUsed:R,weeklyUsedForSort:R??-1}}function lZt(e,t,r,n){const o=r.get(e.key),s=r.get(t.key);if(!o||!s)return[0,"insertion_order"];if(o.usable!==s.usable)return[o.usable?-1:1,"availability"];if(!o.usable&&!s.usable){const i=o.coolingUntil||Number.POSITIVE_INFINITY,a=s.coolingUntil||Number.POSITIVE_INFINITY;return[i===a?0:i-a,i===a?"insertion_order":"cooldown_recovery"]}if(o.quotaEvidenceRank!==s.quotaEvidenceRank)return[o.quotaEvidenceRank-s.quotaEvidenceRank,"quota_evidence"];if(o.saturated!==s.saturated)return[o.saturated?1:-1,"session_headroom"];if(o.scopedSaturated!==s.scopedSaturated)return[o.scopedSaturated?1:-1,"scoped_headroom"];if(o.saturated&&s.saturated){if(o.sessionResetBucket!==s.sessionResetBucket)return[o.sessionResetBucket-s.sessionResetBucket,"session_reset"];if(o.weeklyReset!==s.weeklyReset)return[o.weeklyReset-s.weeklyReset,"weekly_reset"]}else{if(o.weeklyReset!==s.weeklyReset)return[o.weeklyReset-s.weeklyReset,"weekly_reset"];if(o.sessionResetBucket!==s.sessionResetBucket)return[o.sessionResetBucket-s.sessionResetBucket,"session_reset"]}return o.scopedUsed!==null&&s.scopedUsed!==null&&o.scopedUsedForSort!==s.scopedUsedForSort?[s.scopedUsedForSort-o.scopedUsedForSort,"scoped_utilization"]:o.weeklyUsedForSort!==s.weeklyUsedForSort?[s.weeklyUsedForSort-o.weeklyUsedForSort,"weekly_utilization"]:n&&e.key===n!=(t.key===n)?[e.key===n?-1:1,"configured_primary"]:[0,"insertion_order"]}function YJr(e,t,r,n,o,s){const i=new Map(e.map(a=>[a.key,iF(a.key,t,n,o,s)]));return{orderedAccounts:[...e].sort((a,c)=>lZt(a,c,i,r)[0]),metricsByKey:i}}function ZJr(e,t,r,n){for(const u of e){if(u.type!=="oauth")continue;const d=n?.get(u.key)??iF(u.key,Date.now(),r,Xk());d.quotaFreshness==="unknown"?oF(u,`startup-unknown:${u.key}`).catch(m=>{p.debug(`[proxy] background quota discovery failed account=${u.label}: ${bu(m)}`)}):d.quotaFreshness==="refresh_due"&&oF(u,`ambiguous:${d.quotaLastUpdated??0}`).catch(m=>{p.debug(`[proxy] ambiguous quota refresh failed account=${u.label}: ${bu(m)}`)})}const o=t[0],s=t[1];if(!o||!s||s.type!=="oauth")return;const i=ec.get(o.key)?.quota;if(!i)return;const a=Math.max(0,r-.05);if(!((i.sessionUsed??0)>=a||(i.weeklyUsed??0)>=.9))return;const l=["handoff",o.key,i.sessionResetAt??0,i.weeklyResetAt??0,s.key].join(":");oF(s,l).catch(u=>{p.debug(`[proxy] quota handoff prewarm failed account=${s.label}: ${bu(u)}`)})}function XJr(e,t,r,n){!t||t.type!=="oauth"||iF(t.key,Date.now(),n,Xk()).quotaFreshness==="fresh"||oF(t,`hard-handoff:${e.key}:${r}:${t.key}`).catch(s=>{p.debug(`[proxy] hard-handoff quota refresh failed account=${t.label}: ${bu(s)}`)})}function QJr(e){const{accounts:t,orderedAccounts:r,metricsByKey:n,evaluatedAt:o,strategy:s,primaryKey:i,quotaRoutingEnabled:a,quotaOrdered:c,sessionSoftLimit:l,sessionResetToleranceMs:u,rotationOffset:d}=e,m=new Map(t.map((T,_)=>[T.key,_])),h=!!i&&t.some(T=>T.key===i),f=[];for(const T of r){const _=n.get(T.key);if(!_){p.warn(`[proxy] routing evidence omitted because metrics are missing for account=${T.label}`);return}f.push({account:T.label,accountType:T.type,sourceIndex:m.get(T.key)??f.length,rank:f.length,configuredPrimary:!!i&&T.key===i,usable:_.usable,saturated:_.saturated,quotaObserved:_.hasQuota,quotaStale:_.quotaStale,quotaFreshness:_.quotaFreshness,refreshNeeded:_.refreshNeeded,refreshReason:_.refreshReason,refreshInFlight:_.refreshInFlight,lastRefreshAttemptAt:_.lastRefreshAttemptAt,lastRefreshSuccessAt:_.lastRefreshSuccessAt,nextRefreshEligibleAt:_.nextRefreshEligibleAt,saturationKind:_.saturationKind,softLimitOverrideReason:_.softLimitOverrideReason,quotaLastUpdated:_.quotaLastUpdated,quotaAgeMs:_.quotaAgeMs,coolingActive:_.coolingActive,coolingReason:_.coolingReason,coolingUntil:_.coolingUntil>0&&Number.isFinite(_.coolingUntil)?_.coolingUntil:null,unifiedStatus:_.unifiedStatus,fallbackStatus:_.fallbackStatus,upgradePaths:_.upgradePaths,overageEligible:_.overageEligible,overageStatus:_.overageStatus,sessionStatus:_.sessionStatus,sessionUsed:_.sessionUsed,sessionResetAt:Number.isFinite(_.sessionReset)?_.sessionReset:null,sessionResetBucket:Number.isFinite(_.sessionResetBucket)?_.sessionResetBucket:null,weeklyStatus:_.weeklyStatus,weeklyUsed:_.weeklyUsed,weeklyResetAt:Number.isFinite(_.weeklyReset)?_.weeklyReset:null,scopedModel:_.scopedModel,scopedStatus:_.scopedStatus,scopedUsed:_.scopedUsed,scopedResetAt:Number.isFinite(_.scopedReset)?_.scopedReset:null})}const g=r[0];let y,w;return r.length===1?(y="single_account",w="single_account"):c?(y="quota",w=lZt(r[0],r[1],n,i)[1]):s==="round-robin"?(y="round_robin",w="round_robin"):(y="primary",w=h&&g?.key===i?"configured_primary":"insertion_order"),{schemaVersion:1,evaluatedAt:new Date(o).toISOString(),strategy:s,mode:y,selectionReason:w,quotaRoutingEnabled:a,quotaInputsUsed:c,sessionSoftLimit:l,sessionResetToleranceMs:u,configuredPrimaryAccount:i??null,configuredPrimaryMatched:h,rotationOffset:d,initialAccount:g?.label??"",candidates:f}}function eYr(e){const{enabledAccounts:t,accountStrategy:r,primaryAccountKey:n,quotaRoutingEnabled:o,sessionSoftLimit:s,sessionResetToleranceMs:i,requestedModel:a,setRoutingDecision:c}=e;let l=[...t];const u=Date.now();let d,m=0;const h=r==="fill-first"&&l.length>1&&o;if(!h&&r==="fill-first"&&OJr(t,n),h){const g=YJr(t,u,n,s,i,a);l=g.orderedAccounts,d=g.metricsByKey,p.shouldLog("debug")&&p.debug(`[proxy] quota-ordered fill sequence: ${l.map(y=>y.label).join(" \u2192 ")}`)}else{if(r==="round-robin"&&l.length!==qYt&&(_p=nZt(l,n),qYt=l.length),l.length>1&&(m=_p%l.length,r==="round-robin"&&(_p=(_p+1)%l.length),m>0)){const g=l.splice(0,m);l.push(...g)}d=new Map(t.map(g=>[g.key,iF(g.key,u,s,i,a)]))}const f=QJr({accounts:t,orderedAccounts:l,metricsByKey:d,evaluatedAt:u,strategy:r,primaryKey:n,quotaRoutingEnabled:o,quotaOrdered:h,sessionSoftLimit:s,sessionResetToleranceMs:i,rotationOffset:m});return f&&c(f),{orderedAccounts:l,metricsByKey:d}}var aF=new Map,tYr=300*1e3,rYr=new Set(["accept","accept-encoding","accept-language","anthropic-beta","anthropic-dangerous-direct-browser-access","anthropic-version","sec-fetch-mode","user-agent","x-app","x-stainless-arch","x-stainless-lang","x-stainless-os","x-stainless-package-version","x-stainless-retry-count","x-stainless-runtime","x-stainless-runtime-version","x-stainless-timeout","x-subscription-tier"]),nYr=["oauth-2025-04-20","claude-code-20250219","fine-grained-tool-streaming-2025-05-14"];function cF(e){return e.replace(/[^a-zA-Z0-9._@-]/g,"_")}function uZt(e){return ft(ia(),".neurolink","header-snapshots",`anthropic_${cF(e)}.json`)}function oYr(e,t){if(t?.headers)for(const[r,n]of Object.entries(t.headers)){const o=r.toLowerCase();typeof n=="string"&&!e[o]&&!XL.has(o)&&o!=="authorization"&&o!=="x-api-key"&&o!=="x-claude-code-session-id"&&(e[o]=n)}}async function sYr(e){try{const t=cF(e),r=aF.get(t);if(r&&Date.now()-r.loadedAt<tYr)return r.snapshot;const n=uZt(e);try{await w1(n)}catch{return null}const o=JSON.parse(await Mr(n,"utf8"));if(!o||typeof o!="object")return null;const s={accountKey:"accountKey"in o&&typeof o.accountKey=="string"?o.accountKey:`anthropic:${e}`,capturedAt:"capturedAt"in o&&typeof o.capturedAt=="string"?o.capturedAt:new Date(0).toISOString(),source:"claude-code",headers:"headers"in o&&o.headers?o.headers:{},...o.body?{body:o.body}:{}};return Object.keys(s.headers).length===0&&Object.keys(s.body??{}).length===0?null:(aF.set(t,{snapshot:s,loadedAt:Date.now()}),s)}catch{return null}}function iYr(e,t){const r={...t??{}};for(const[n,o]of Object.entries(e)){const s=n.toLowerCase();typeof o=="string"&&rYr.has(s)&&!XL.has(s)&&s!=="authorization"&&s!=="x-api-key"&&s!=="x-claude-code-session-id"&&(r[s]=o)}return r}function dZt(e){if(!e||typeof e!="object")return;const t=e,r=Dyt(t.metadata?.user_id),n=Array.isArray(t.system)?t.system:typeof t.system=="string"?[{type:"text",text:t.system}]:[],o=n.find(i=>typeof i?.text=="string"&&i.text.includes("x-anthropic-billing-header"))?.text,s=n.find(i=>typeof i?.text=="string"&&i.text.includes("Claude Agent SDK"))?.text;if(!(!r&&!o&&!s))return{...r?{metadataUserId:r.metadataUserId}:{},...r?{sessionId:r.sessionId}:{},...o?{billingHeader:o}:{},...s?{agentBlock:s}:{}}}function mZt(e,t){return typeof e["x-claude-code-session-id"]=="string"||e["user-agent"]?.startsWith("claude-cli/")||!!t?.metadataUserId||!!t?.billingHeader||!!t?.agentBlock}function aYr(e,t){return e?JSON.stringify(e.headers??{})===JSON.stringify(t.headers??{})&&JSON.stringify(e.body??{})===JSON.stringify(t.body??{}):!1}async function cYr(e,t){const r=uZt(e);await Ta(r,t,384),aF.set(cF(e),{snapshot:t,loadedAt:Date.now()})}async function lYr(e,t,r,n){const o=await sYr(e);let s;try{s=JSON.parse(n)}catch{return o}const i=dZt(s);if(!mZt(r,i))return o;const a={accountKey:t,capturedAt:new Date().toISOString(),source:"claude-code",headers:iYr(r,o?.headers),body:{...o?.body??{},...i??{},...typeof r["x-claude-code-session-id"]=="string"?{sessionId:r["x-claude-code-session-id"]}:{}}};if(aYr(o,a))return o;try{await cYr(e,a)}catch(c){p.warn("[proxy] failed to persist Claude snapshot",{accountLabel:e,error:c instanceof Error?c.message:String(c)}),aF.set(cF(e),{snapshot:a,loadedAt:Date.now()})}return a}function Woe(e){const t={};if(!e||typeof e!="object")return t;const r=e;if(typeof r.model=="string"&&(t.responseModel=r.model),typeof r.stop_reason=="string"&&(t.finishReason=r.stop_reason),typeof r.stop_sequence=="string"&&(t.stopSequence=r.stop_sequence),Array.isArray(r.content)){const n=r.content.filter(o=>!!o&&typeof o=="object"&&o.type==="tool_use").map(o=>String(o.name??"")).filter(o=>o.length>0);n.length>0&&(t.toolCalls=n)}return t}function pZt(e){const t={};e.model&&(t.responseModel=e.model),e.stopReason&&(t.finishReason=e.stopReason),e.stopSequence&&(t.stopSequence=e.stopSequence);const r=(e.contentBlocks??[]).filter(n=>n.type==="tool_use").map(n=>String(n.toolName??"")).filter(n=>n.length>0);return r.length>0&&(t.toolCalls=r),t}function uYr(e,t,r,n,o){try{const s=JSON.parse(e),i={type:"text",text:r?.body?.agentBlock||"You are a Claude agent, built on Anthropic's Claude Agent SDK."};if(s.system){if(typeof s.system=="string"&&(s.system=[{type:"text",text:s.system}]),Array.isArray(s.system)){const l=s.system.findIndex(h=>typeof h.text=="string"&&h.text.includes("x-anthropic-billing-header")),u=s.system.findIndex(h=>typeof h.text=="string"&&h.text.includes("Claude Agent SDK")),d={type:"text",text:A4(s.system[l]?.text??r?.body?.billingHeader)};if(n&&u>=0)l<0&&s.system.unshift(d);else{const h=[l,u].filter(f=>f>=0).sort((f,g)=>g-f);for(const f of h)s.system.splice(f,1);s.system.length>0&&Zyt(s,s.system),s.system=[d,i]}}}else{const l={type:"text",text:A4(r?.body?.billingHeader)};s.system=[l,i]}const a=t.substring(0,Math.min(20,t.length)),c=Oyt(a,{existingUserId:s.metadata?.user_id??r?.body?.metadataUserId,preferredSessionId:o??r?.body?.sessionId});return s.metadata={...s.metadata,user_id:c.metadataUserId},{bodyStr:JSON.stringify(s),sessionId:c.sessionId}}catch{return{bodyStr:e}}}async function dYr(e,t){if(!e.oauth?.accessToken)return;let r=e.oauth.accessToken,n=e.oauth.refreshToken,o=e.oauth.expiresAt;const s=e.email?.trim()||"legacy-default",i=o?o<Date.now():!1,a=()=>({key:ok,label:s,token:r,refreshToken:n,expiresAt:o,type:"oauth",persistTarget:{credPath:t}});if(!i)return a();const c=ba(ok);if(c.permanentlyDisabled)return;const l=(await Mk())[ok];if(l?.coolingUntil>Date.now()&&(!c.coolingUntil||l.coolingUntil>c.coolingUntil)&&(c.coolingUntil=l.coolingUntil,c.coolingReason=l.reason),c.coolingReason==="auth"&&c.coolingUntil&&c.coolingUntil>Date.now())return a();if(!n){p.always("[proxy] skipping legacy account (expired, no refresh token)"),await Vd(a(),c,"missing_refresh_token");return}const u={token:r,refreshToken:n,expiresAt:o,label:s},d=await fJt(u);if(!d.success){if(gg(d)){await Vd(a(),c,"refresh_invalid");return}const m=await dF(a(),c);return p.always(`[proxy] legacy refresh temporarily unavailable (${d.status??"network"}); cooling until ${new Date(m).toISOString()}`),a()}return r=u.token,n=u.refreshToken,o=u.expiresAt,await NL(t,u),await mF(a(),c),p.always("[proxy] refreshed legacy account at startup"),a()}async function mYr(e){const{ctx:t,body:r,route:n,modelRouter:o,tracer:s,requestStartTime:i,logProxyBody:a}=e;s?.setMode("full");const c=Wne(r),l=Uw({provider:n.provider,model:n.model},o?.getFallbackChain()??[],r.model,c,o?.isAutoFallbackEnabled?.()??!1);hZt(a,"translated_request",l);const u=l.attempts;if(r.stream)return ooe({ctx:t,format:"claude",requestModel:r.model,parsed:c,attempts:u,tracer:s,requestStartTime:i});try{return await soe({ctx:t,format:"claude",requestModel:r.model,parsed:c,attempts:u,tracer:s,requestStartTime:i,terminalFailureStatus:502})}catch(d){const m=d instanceof Error?d.message:"unknown error";p.error(`[claude-proxy] Translated generation failed for ${r.model}: ${m}`);const h=_a(502,`Generation failed: ${m}`),f=JSON.stringify(h);return a({phase:"client_response",headers:{"content-type":"application/json"},body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:"application/json",account:"translation",accountType:"translation",responseStatus:502,durationMs:Date.now()-i}),h}}function hZt(e,t,r){e({phase:"routing_decision",contentType:"application/json",body:{stage:t,attempts:r.attempts}})}async function pYr(e){const{ctx:t,body:r,clientRequestBody:n,tracer:o,requestStartTime:s,logProxyBody:i,logFinalRequest:a}=e;o?.setMode("passthrough-cli");const c=n,l=Array.isArray(r.tools)?r.tools.length:0,u={};for(const[f,g]of Object.entries(t.headers))!XL.has(f.toLowerCase())&&g&&(u[f]=g);u["content-type"]||(u["content-type"]="application/json");const d=o?.startUpstreamAttempt({account:"passthrough",attempt:1,polyfillHeaders:!1,polyfillBody:!1,upstreamUrl:"https://api.anthropic.com/v1/messages?beta=true"});o?.logUpstreamRequestHeaders(u),o?.logUpstreamRequestBody(c),i({phase:"upstream_request",headers:u,body:c,bodySize:Buffer.byteLength(c,"utf8"),contentType:u["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,metadata:{upstreamMethod:"POST",upstreamUrl:"https://api.anthropic.com/v1/messages?beta=true"}}),ag("passthrough","passthrough");let m;try{m=await Ooe("https://api.anthropic.com/v1/messages?beta=true",{method:"POST",headers:u,body:c,signal:AbortSignal.timeout(Kk)})}catch(f){const g=f instanceof Error?f.message:String(f);_r("passthrough","passthrough",502),o?.setError("network_error",g),d?.end(),o?.end(502,Date.now()-s),a(502,"passthrough","passthrough","network_error",g);const y=_a(502,`Passthrough fetch failed: ${g}`),w=JSON.stringify(y);return i({phase:"client_response",headers:{"content-type":"application/json"},body:w,bodySize:Buffer.byteLength(w,"utf8"),contentType:"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:502,durationMs:Date.now()-s}),y}const h={};m.headers.forEach((f,g)=>{h[g]=f}),o?.logUpstreamResponseHeaders(h);{const f=kw(m.headers,{model:r.model});Yk(t,{upstreamHeaders:m.headers,quota:f,source:f?"live":"none",accountType:"passthrough",servedBy:"anthropic",attempt:1})}if(!m.ok){const f=await m.text();_r("passthrough","passthrough",m.status,m.status===429?"quota":void 0),o?.logUpstreamResponseBody(f),i({phase:"upstream_response",headers:h,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:h["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:m.status,durationMs:Date.now()-s}),i({phase:"client_response",headers:h,body:f,bodySize:Buffer.byteLength(f,"utf8"),contentType:h["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:m.status,durationMs:Date.now()-s}),d?.end(),o?.setError("api_error",f.slice(0,500)),o?.end(m.status,Date.now()-s),a(m.status,"passthrough","passthrough",m.status===429?"rate_limit_error":"api_error",f);try{return JSON.parse(f)}catch{return _a(m.status,f)}}return r.stream&&m.body?fYr({ctx:t,body:r,bodyStr:c,response:m,tracer:o,requestStartTime:s,toolCount:l,upstreamSpan:d,upstreamResponseHeaders:h,logProxyBody:i,logFinalRequest:a}):gYr({ctx:t,body:r,bodyStr:c,response:m,tracer:o,requestStartTime:s,toolCount:l,upstreamSpan:d,upstreamResponseHeaders:h,logProxyBody:i,logFinalRequest:a})}function hYr(e){const t=e.getReader(),r=PYt();let n=!1;return{stream:new ReadableStream({async pull(s){if(!n)try{const{done:i,value:a}=await t.read();if(n)return;if(i){n=!0,r.complete(),s.close();return}s.enqueue(a)}catch(i){n=!0;const a=i instanceof Error?i.message:String(i);r.fail(a),s.error(i)}},cancel(s){return n=!0,r.cancel(),t.cancel(s)}}),outcome:r.outcome}}async function fYr(e){const{ctx:t,bodyStr:r,response:n,tracer:o,requestStartTime:s,upstreamSpan:i,upstreamResponseHeaders:a,logProxyBody:c,logFinalRequest:l}=e,u={...a},{stream:d,capture:m}=sYt(),h=n.body;if(!h)throw _r("passthrough","passthrough",502),new Error("Expected passthrough stream response body");const f=hYr(h);let g=f.stream,y=!1;const w=(_,b,k,A)=>y?!1:(y=!0,b==="stream_error"&&_r("passthrough","passthrough",_),l(_,"passthrough","passthrough",b,k,A),!0);if(o)try{const{stream:_,telemetry:b}=WL({captureRawText:!0});g=g.pipeThrough(_);const k=o,A=i,I=n,R=r.length;Promise.all([b,m,f.outcome]).then(([x,P,N])=>{const F=KL(N,x.streamErrorMessage),O=bp(F);k.setUsage({inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens}),k.logStreamEvents(x.events),k.setResponseInfo(pZt(x));const M=parseFloat(I.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),U=parseFloat(I.headers.get("anthropic-ratelimit-unified-7d-utilization")??""),$={inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens};isNaN(M)||($.rateLimitAfter5h=M),isNaN(U)||($.rateLimitAfter7d=U),(!isNaN(M)||!isNaN(U))&&k.setUsage($),k.logUpstreamResponseBody(x.rawText??""),k.recordMetrics(),k.recordBodySizes(R,x.totalBytesReceived),A?.end(),O&&k.setError(O.errorType,O.message),k.end(O?.status??n.status,Date.now()-s),w(O?.status??n.status,O?.errorType,O?.message,{inputTokens:x.usage.inputTokens,outputTokens:x.usage.outputTokens,cacheCreationTokens:x.usage.cacheCreationInputTokens,cacheReadTokens:x.usage.cacheReadInputTokens}),c({phase:"upstream_response",headers:u,body:x.rawText??"",bodySize:x.totalBytesReceived,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:200,durationMs:Date.now()-s}),c({phase:"client_response",headers:u,body:P.text,bodySize:P.totalBytes,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:200,durationMs:Date.now()-s})}).catch(x=>{if(y)return;const P=x instanceof Error?x.message:String(x);k.setError("stream_telemetry_error",P),A?.end(),k.end(500,Date.now()-s),w(500,"stream_telemetry_error",P)})}catch{f.outcome.then(_=>{const b=bp(_);i?.end(),b&&o.setError(b.errorType,b.message),o.end(b?.status??n.status,Date.now()-s),w(b?.status??n.status,b?.errorType,b?.message)})}else try{const{stream:_,telemetry:b}=WL({captureRawText:!0});g=g.pipeThrough(_),Promise.all([b,m,f.outcome]).then(([k,A,I])=>{const R=KL(I,k.streamErrorMessage),x=bp(R);w(x?.status??n.status,x?.errorType,x?.message,{inputTokens:k.usage.inputTokens,outputTokens:k.usage.outputTokens,cacheCreationTokens:k.usage.cacheCreationInputTokens,cacheReadTokens:k.usage.cacheReadInputTokens}),c({phase:"upstream_response",headers:u,body:k.rawText??"",bodySize:k.totalBytesReceived,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:n.status,durationMs:Date.now()-s}),c({phase:"client_response",headers:u,body:A.text,bodySize:A.totalBytes,contentType:u["content-type"]??"text/event-stream",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:n.status,durationMs:Date.now()-s})}).catch(k=>{y||w(500,"stream_telemetry_error",k instanceof Error?k.message:String(k))})}catch{f.outcome.then(_=>{const b=bp(_);w(b?.status??n.status,b?.errorType,b?.message)})}const T=g.pipeThrough(d);return new Response(T,{status:n.status,headers:{...u,...t.responseHeaders??{}}})}async function gYr(e){const{bodyStr:t,response:r,tracer:n,requestStartTime:o,upstreamSpan:s,upstreamResponseHeaders:i,logProxyBody:a,logFinalRequest:c}=e,l=await r.text();n?.logUpstreamResponseBody(l),a({phase:"upstream_response",headers:i,body:l,bodySize:Buffer.byteLength(l,"utf8"),contentType:i["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:r.status,durationMs:Date.now()-o}),a({phase:"client_response",headers:i,body:l,bodySize:Buffer.byteLength(l,"utf8"),contentType:i["content-type"]??"application/json",account:"passthrough",accountType:"passthrough",attempt:1,responseStatus:r.status,durationMs:Date.now()-o});const u=JSON.parse(l);if(n&&u&&typeof u=="object"){const d=u.usage;if(d){n.setUsage({inputTokens:d.input_tokens??0,outputTokens:d.output_tokens??0,cacheCreationTokens:d.cache_creation_input_tokens??0,cacheReadTokens:d.cache_read_input_tokens??0});const h=parseFloat(r.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),f=parseFloat(r.headers.get("anthropic-ratelimit-unified-7d-utilization")??"");if(!isNaN(h)||!isNaN(f)){const g={inputTokens:d.input_tokens??0,outputTokens:d.output_tokens??0,cacheCreationTokens:d.cache_creation_input_tokens??0,cacheReadTokens:d.cache_read_input_tokens??0};isNaN(h)||(g.rateLimitAfter5h=h),isNaN(f)||(g.rateLimitAfter7d=f),n.setUsage(g)}}n.setResponseInfo(Woe(u)),n.recordMetrics();const m=JSON.stringify(u);n.recordBodySizes(t.length,m.length),s?.end(),n.end(r.status,Date.now()-o),c(r.status,"passthrough","passthrough",void 0,void 0,{inputTokens:d?.input_tokens,outputTokens:d?.output_tokens,cacheCreationTokens:d?.cache_creation_input_tokens,cacheReadTokens:d?.cache_read_input_tokens})}else s?.end(),n?.end(r.status,Date.now()-o),c(r.status,"passthrough","passthrough");return u}async function yYr(e){const t=Iw();if(!t)return{accounts:e.accounts};if(e.accounts.length===0)return{accounts:e.accounts};const r=Date.now(),n=await Promise.all(e.accounts.map(async d=>{const m=ba(d.key).quota,h=Rs(m?.sessionResetAt,r)??null,f=Rs(m?.weeklyResetAt,r)??null,g=await kre(t.grantId,d.key,h,f);return{accountKey:d.key,sessionUsed:m?.sessionUsed??null,weeklyUsed:m?.weeklyUsed??null,sessionResetAt:h,weeklyResetAt:f,borrowedSessionFraction:g.sessionFraction,borrowedWeeklyFraction:g.weeklyFraction}})),o=await Tre(t.grantId);if(!o)return{accounts:e.accounts};const s=await Are(t.grantId,Eoe(o.gates,n).inScope),i=Soe(o,n,r,s),a=new Set(i.allowed),c=e.accounts.filter(d=>a.has(d.key));if(c.length>0)return{accounts:c};const l=_oe(i.excluded),u=Nw(l,{status:SKr(l),grant:o,retryAfterSeconds:yZt(n,r)});return p.always(`[proxy] share ${t.peerLabel} withheld: ${l} (${i.excluded.length} accounts)`),{accounts:[],refusal:{status:u.status,message:u.body.error.message,errorType:u.body.error.type,responseHeaders:u.headers}}}async function vYr(e){const t=[],r=[];for(const n of e){const o=await dKr(n.key);if(!o){t.push(n);continue}if(!eKr(o)){t.push(n);continue}p.always(`[proxy] withholding leased account=${n.label}: ${o.reason}`),r.push({label:n.label,reason:o.reason})}return{accounts:t,withheld:r}}async function wYr(e,t){const r=[],n=[],o=Date.now();for(const s of e){const i=await Toe(s.key);if(!i){r.push(s);continue}const a=i.lease.gates;if(!bKr(a.models,t)){p.always(`[proxy] leased account=${s.label} does not cover model ${$n(t??"unknown")}`),n.push({label:s.label,reason:"model_not_allowed"});continue}if(a.schedule&&!_Kr(a.schedule,o)){p.always(`[proxy] leased account=${s.label} is outside its allowed hours`),n.push({label:s.label,reason:"out_of_window"});continue}const c=ba(s.key).quota,l=Rs(c?.sessionResetAt,o)??null,u=Rs(c?.weeklyResetAt,o)??null,d=await kre(i.grantId,s.key,l,u),m={accountKey:s.key,sessionUsed:c?.sessionUsed??null,weeklyUsed:c?.weeklyUsed??null,sessionResetAt:l,weeklyResetAt:u,borrowedSessionFraction:d.sessionFraction,borrowedWeeklyFraction:d.weeklyFraction},h=await Are(i.grantId,[m]),{accounts:f,...g}=a,y=Soe(TYr(i,g),[m],o,h);if(y.allowed.length===0){const w=_oe(y.excluded);p.always(`[proxy] withholding leased account=${s.label}: ${w}`),n.push({label:s.label,reason:w});continue}r.push(s)}return{accounts:r,withheld:n}}function TYr(e,t){const r=e.lease.entitlementSnapshot;return{schemaVersion:1,id:e.grantId,peerLabel:e.lease.peerLabel,tokenHash:"",tokenSalt:"",level:"complete",state:"active",entitlement:r==="unlimited"?{ledger:"unlimited"}:{ledger:"coins",coins:r},gates:t,createdAt:e.lease.issuedAt,updatedAt:e.lease.issuedAt}}function EYr(e,t,r){const n=Date.now(),o=i=>{L8r({grantId:i,accountKey:e,sessionBefore:t?.sessionUsed??null,sessionAfter:r.sessionUsed,sessionResetAt:Rs(r.sessionResetAt,n)??null,weeklyBefore:t?.weeklyUsed??null,weeklyAfter:r.weeklyUsed,weeklyResetAt:Rs(r.weeklyResetAt,n)??null})},s=Iw();if(s){o(s.grantId);return}Toe(e).then(i=>{i&&o(i.grantId)}).catch(()=>{})}function Koe(e,t,r){const n=Cre({inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,...r.cacheCreationTokens!==void 0?{cacheCreationTokens:r.cacheCreationTokens}:{},...r.cacheReadTokens!==void 0?{cacheReadTokens:r.cacheReadTokens}:{}},t);mKr(e,n).catch(()=>{})}function fZt(e,t){if(!t||typeof t!="object")return;const r=t.usage;if(!r)return;const n=xYr(t),o={inputTokens:r.input_tokens??0,outputTokens:r.output_tokens??0,cacheCreationTokens:r.cache_creation_input_tokens??0,cacheReadTokens:r.cache_read_input_tokens??0};Joe(e.key,n,o),Koe(e.label,n,o)}function Joe(e,t,r){const n=Iw();n&&F8r({grantId:n.grantId,accountKey:e,model:t??n.model,usage:{inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,...r.cacheCreationTokens!==void 0?{cacheCreationTokens:r.cacheCreationTokens}:{},...r.cacheReadTokens!==void 0?{cacheReadTokens:r.cacheReadTokens}:{}},...n.holdId?{holdId:n.holdId}:{}})}function gZt(e){if(!Iw())return e;const t={};for(const[r,n]of Object.entries(e)){const o=r.toLowerCase();o==="x-neurolink-account"||o==="x-neurolink-account-type"||o.startsWith("x-neurolink-pool-")||(t[r]=n)}return t}async function SYr(e,t){const r=e.provisionedAccount;if(!r)return{paused:!1,detail:"no provisioned account recorded"};const n=ec.get(`anthropic:${r}`),o=rjt(r,"oauth"),{verdict:s,shouldPause:i}=await qKr({grantId:e.id,accountLabel:r,lenderRequestsTotal:o?.successCount??0,observation:{at:Date.now(),sessionUsed:n?.quota?.sessionUsed??null,weeklyUsed:n?.quota?.weeklyUsed??null,reportedCoins:t,lenderRequests:0}});return i?(await E8r(e.id,"paused"),{paused:!0,detail:s.drifted?s.detail:"repeated unexplained usage"}):{paused:!1,detail:s.drifted?s.detail:"consistent"}}async function _Yr(e,t){await hjt(e.id,t)}function bYr(e,t){if(e.length!==t.length||e.length===0)return!1;let r=0;for(let n=0;n<e.length;n+=1)r|=e.charCodeAt(n)^t.charCodeAt(n);return r===0}var CYr=1,kYr=["live","complete","handshake","limits"];async function AYr(e,t){const r=Date.now(),n=await yJt(t),o=await Promise.all(n.map(async l=>{const u=ba(l.key).quota,d=Rs(u?.sessionResetAt,r)??null,m=Rs(u?.weeklyResetAt,r)??null,h=await kre(e.id,l.key,d,m);return{accountKey:l.key,sessionUsed:u?.sessionUsed??null,weeklyUsed:u?.weeklyUsed??null,sessionResetAt:d,weeklyResetAt:m,borrowedSessionFraction:h.sessionFraction,borrowedWeeklyFraction:h.weeklyFraction}})),s=Eoe(e.gates,o).inScope,i=await Are(e.id,s),a=Soe(e,o,r,i),c=(l,u)=>l===void 0?null:Math.max(0,l-u*100);return{grantState:e.state,level:e.level,ledger:e.entitlement.ledger,...e.entitlement.ledger==="coins"?{remainingCoins:Math.max(0,Math.floor(D8r(e)))}:{},servable:a.allowed.length>0,...a.allowed.length===0&&a.excluded.length>0?{withheldReason:_oe(a.excluded)}:{},sliceLeftPct:{session:c(e.gates.maxSlice?.session5hPct,i.sessionFraction),weekly:c(e.gates.maxSlice?.weekly7dPct,i.weeklyFraction)},...a.allowed.length===0?(()=>{const l=yZt(o,r);return l===void 0?{}:{retryAfterSeconds:l}})():{}}}function wg(e){return!e.ok}async function Tg(e){const t=RKr(e);if(!t)return{ok:!1,body:Nw("missing_token",{status:401}).body};const r=await _8r(t);return r?{ok:!0,grant:r}:{ok:!1,body:Nw("unknown_token",{status:401}).body}}function xYr(e){if(!e||typeof e!="object")return;const t=e.model;return typeof t=="string"?t:void 0}function yZt(e,t){const r=e.flatMap(n=>[n.sessionResetAt,n.weeklyResetAt]).filter(n=>n!==null&&n>t);if(r.length!==0)return Math.max(1,Math.round((Math.min(...r)-t)/1e3))}async function IYr(e){const{ctx:t,body:r,accountStrategy:n,primaryAccountKey:o,accountAllowlist:s,quotaRoutingEnabled:i=Goe(),sessionSoftLimit:a=qoe(),sessionResetToleranceMs:c=Xk(),setRoutingDecision:l}=e,u=await Promise.resolve().then(()=>(Xr(),Bl)),d=await Promise.resolve().then(()=>(_i(),uj)),m=[],h=`${d.homedir()}/.neurolink/anthropic-credentials.json`,{tokenStore:f}=await Promise.resolve().then(()=>(ig(),cre)),g=await Mk();tZt||(await f.pruneExpired(),tZt=!0);const y=await f.listByPrefix("anthropic:"),w=[];let T=0,_=0;for(const Q of y){if(!ire(Q,s)){p.debug(`[proxy] skipping account=${Q} (not in account allowlist)`);continue}if(await f.isDisabled(Q)){const Me=ba(Q),Oe=await f.getDisabledReason(Q);if(Oe==="refresh_failed")await f.markEnabled(Q),p.always(`[proxy] account=${Q.split(":")[1]??Q} re-enabled for legacy refresh failure recheck`),Me.permanentlyDisabled=!1,Me.consecutiveRefreshFailures=0;else{p.debug(`[proxy] skipping disabled account=${Q.split(":")[1]??Q}`),Me.permanentlyDisabled=!0,Oe==="entitlement_blocked"&&w.push(Q.split(":")[1]??Q),T+=1;continue}}const ne=await f.loadTokens(Q);if(!ne){_+=1;continue}let ce=ne.accessToken,Se=ne.refreshToken,ge=ne.expiresAt;const q=Q.split(":")[1]??Q,me=ne.tokenType==="Bearer"?"oauth":"api_key",ke=ba(Q),Ue=g[Q];Ue?.coolingUntil>Date.now()&&(!ke.coolingUntil||Ue.coolingUntil>ke.coolingUntil)&&(ke.coolingUntil=Ue.coolingUntil,ke.coolingReason=Ue.reason);const _e=()=>{m.push({key:Q,label:q,token:ce,refreshToken:Se,expiresAt:ge,type:me,persistTarget:{providerKey:Q}})};if(ge?ge<Date.now():!1){if(ke.permanentlyDisabled)continue;if(ke.coolingReason==="auth"&&ke.coolingUntil&&ke.coolingUntil>Date.now()){_e();continue}if(!Se){p.always(`[proxy] skipping account=${q} (expired, no refresh token)`),await Vd({key:Q,label:q,token:ce,type:"oauth"},ke,"missing_refresh_token");continue}const Me={token:ce,refreshToken:Se,expiresAt:ge,label:q},Oe=await OL(Me,{providerKey:Q});if(!Oe.success){const Ze={key:Q,label:q,token:ce,type:"oauth"};if(gg(Oe))p.always(`[proxy] skipping account=${q} (refresh token rejected: ${Oe.error?.slice(0,200)??"unknown"})`),await Vd(Ze,ke,"refresh_invalid");else{const et=await dF(Ze,ke);p.always(`[proxy] account=${q} refresh temporarily unavailable (${Oe.status??"network"}); cooling until ${new Date(et).toISOString()} and rotating`),_e()}continue}ce=Me.token,Se=Me.refreshToken,ge=Me.expiresAt,await f.saveTokens(Q,{accessToken:ce,refreshToken:Se,expiresAt:ge??Date.now()+36e5,tokenType:"Bearer"}),p.always(`[proxy] refreshed expired account=${Q.split(":")[1]??Q} at startup`),await mF({key:Q},ke)}_e()}if(m.length===0&&jHt(y.length,ok,s))try{const Q=JSON.parse(u.readFileSync(h,"utf8")),ne=await dYr(Q,h);ne&&m.push(ne)}catch{}if(process.env.ANTHROPIC_API_KEY&&m.length===0&&jHt(y.length,are,s)&&m.push({key:are,label:"env",token:process.env.ANTHROPIC_API_KEY,type:"api_key"}),m.length===0)return w.length>0&&w.length===T&&_===0?{failure:{status:403,message:EZt({status:403,accounts:w,message:"OAuth authentication is not allowed for this organization.",errorCode:"oauth_not_allowed_for_organization"}),errorType:"permission_error"}}:{failure:{status:401,message:s?"No allowed Anthropic credentials are currently available":y.length>0?"Configured Anthropic accounts are disabled or unavailable":"No Anthropic credentials found",errorType:"authentication_error"}};for(const Q of m)QYr(Q);await BJr(m);const b=m.filter(Q=>!ba(Q.key).permanentlyDisabled),k=await vYr(b),A=await wYr(k.accounts,typeof r.model=="string"?r.model:void 0),I={accounts:A.accounts,withheld:[...k.withheld,...A.withheld]},R=I.accounts;if(R.length===0&&I.withheld.length>0){const Q=I.withheld.map(Se=>`${Se.label} (${Se.reason})`).join(", ");return{failure:{status:403,message:I.withheld.every(Se=>Se.reason==="model_not_allowed")?`Borrowed account(s) do not cover the requested model: ${Q}. Ask the lender to widen the share, or use a model it allows.`:`Borrowed account(s) are no longer covered by a lease: ${Q}. Run 'neurolink proxy peer sync' to check in with the lender, or ask them to resume the share.`,errorType:"permission_error"}}}const x=await yYr({accounts:R});if(x.refusal)return{failure:x.refusal};const P=x.accounts;if(P.length===0)return{failure:{status:401,message:pF(m.map(ne=>ne.label)),errorType:"authentication_error"}};const{orderedAccounts:N,metricsByKey:F}=eYr({enabledAccounts:P,accountStrategy:n,primaryAccountKey:o,quotaRoutingEnabled:i,sessionSoftLimit:a,sessionResetToleranceMs:c,requestedModel:typeof r.model=="string"?r.model:void 0,setRoutingDecision:l});n==="fill-first"&&i&&P.length>1&&ZJr(P,N,a,F);const O=sZr(r),M=JSON.stringify(O),U=Date.now(),$=Array.isArray(r.tools)?r.tools.length:0,H="https://api.anthropic.com/v1/messages?beta=true",V=t.headers??{},W=dZt(r);return{accounts:m,enabledAccounts:P,orderedAccounts:N,bodyStr:M,requestStart:U,toolCount:$,url:H,clientHeaders:V,isClaudeClientRequest:mZt(V,W)}}async function RYr(e){const{ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i,options:a,providerLabel:c,idleTimeoutMs:l=SJr}=e,u=new AbortController;let d;try{d=await Mt(t.neurolink.stream({...a,abortSignal:u.signal}),l,`Fallback ${c} initialization timed out after ${l}ms`)}catch(w){throw u.abort(w),w}const m=async w=>{const T=d.stream[Symbol.asyncIterator]();let _="";try{for(;;){const{value:b,done:k}=await Mt(T.next(),l,`Fallback ${c} stream timed out after ${l}ms of inactivity`);if(k)return _;const A=toe(b);A&&(_+=A,w?.(A))}}catch(b){throw u.abort(b),T.return?.().catch(()=>{}),b}};if(r.stream){const w=new Jne(r.model,0),T=[];for(const x of w.start())T.push(x);const _=await m(x=>{for(const P of w.pushDelta(x))T.push(P)}),b=d.toolCalls??[];if(!GL(_,b))throw new Error(`Translated provider ${c} returned no content or tool calls`);if(b.length)for(const x of b){const P=x.toolName??x.name??"unknown";for(const N of w.pushToolUse(LL(),P,tYt(x)))T.push(N)}const k=d.finishReason??"end_turn",A=Dw(d.usage);for(const x of w.finish(A.output,k))T.push(x);n?.end(200,Date.now()-o),i(200,"",c,void 0,void 0,{inputTokens:A.input,outputTokens:A.output});const I=T.join("");s({phase:"client_response",headers:{"content-type":"text/event-stream"},body:I,bodySize:Buffer.byteLength(I,"utf8"),contentType:"text/event-stream",responseStatus:200,durationMs:Date.now()-o});async function*R(){for(const x of T)yield x}return R()}const h=await m();if(!GL(h,d.toolCalls))throw new Error(`Translated provider ${c} returned no content or tool calls`);const f={content:h,model:d.model,finishReason:d.finishReason??"end_turn",reasoning:void 0,usage:d.usage?Dw(d.usage):void 0,toolCalls:d.toolCalls};n?.end(200,Date.now()-o);const g=Kne(f,r.model);i(200,"",c,void 0,void 0,{inputTokens:f.usage?.input,outputTokens:f.usage?.output});const y=JSON.stringify(g);return s({phase:"client_response",headers:{"content-type":"application/json"},body:y,bodySize:Buffer.byteLength(y,"utf8"),contentType:"application/json",responseStatus:200,durationMs:Date.now()-o}),g}async function vZt(e){let t;for(let r=0;r<=Moe;r+=1)try{return await RYr(e)}catch(n){if(t=n,!Qoe(n)||r===Moe)throw n;const o=Roe[r]??250;p.always(`[proxy] retrying fallback=${e.providerLabel} after transient network error (${r+1}/${Moe}) in ${o}ms: ${eA(bu(n))}`),await _u(o)}throw t}async function MYr(e){const{ctx:t,body:r,model:n,reasoningEffort:o,tracer:s,requestStartTime:i,logProxyBody:a,logFinalRequest:c}=e,l={...t,requestId:`${t.requestId}:codex-fallback`,method:"POST",path:"/backend-api/codex/responses",headers:{"content-type":"application/json",accept:"text/event-stream"},query:{},params:{},body:AVr(r,n,o),metadata:{...t.metadata,"neurolink.codexFallback":!0},responseHeaders:{}},u=await zYt(l),d={...l.responseHeaders??{}};let m;try{m=await OVr(u)}catch(T){throw T instanceof Yne&&p.always(`[proxy] Codex fallback returned ${T.status}: ${$n(T.responseBody,500)}`),T}Object.keys(d).length>0&&(t.responseHeaders??={},Object.assign(t.responseHeaders,gZt(d)));const h=d["x-neurolink-account"]??"",f=d["x-neurolink-account-type"]??"codex-oauth",g={content:m.text,model:r.model,finishReason:m.finishReason,...m.usage?{usage:m.usage}:{},toolCalls:m.toolCalls};if(r.stream){const T=new Jne(r.model,m.usage?.input??0),_=[];for(const A of T.start())_.push(A);if(m.text)for(const A of T.pushDelta(m.text))_.push(A);for(const A of m.toolCalls)for(const I of T.pushToolUse(LL(),A.toolName,A.args))_.push(I);for(const A of T.finish(m.usage?.output,m.finishReason))_.push(A);s?.end(200,Date.now()-i),c(200,h,f,void 0,void 0,{inputTokens:m.usage?.input,outputTokens:m.usage?.output,cacheCreationTokens:m.usage?.cacheCreationTokens,cacheReadTokens:m.usage?.cacheReadTokens});const b=_.join("");a({phase:"client_response",headers:{"content-type":"text/event-stream"},body:b,bodySize:Buffer.byteLength(b,"utf8"),contentType:"text/event-stream",responseStatus:200,durationMs:Date.now()-i});async function*k(){for(const A of _)yield A}return k()}s?.end(200,Date.now()-i);const y=Kne(g,r.model);c(200,h,f,void 0,void 0,{inputTokens:m.usage?.input,outputTokens:m.usage?.output,cacheCreationTokens:m.usage?.cacheCreationTokens,cacheReadTokens:m.usage?.cacheReadTokens});const w=JSON.stringify(y);return a({phase:"client_response",headers:{"content-type":"application/json"},body:w,bodySize:Buffer.byteLength(w,"utf8"),contentType:"application/json",responseStatus:200,durationMs:Date.now()-i}),y}async function wZt(e){if(Iw())return null;const t=await WWr();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 vKr({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 PYr(e){return!(e instanceof Yne)||e.status!==400?null:{status:e.status,body:e.responseBody,contentType:"application/json"}}async function TZt(e){const{ctx:t,body:r,parsedFallbackRequest:n,fallbackPlan:o,modelRouter:s,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l}=e,u=o??Uw({provider:"anthropic",model:r.model},s?.getFallbackChain()??[],r.model,n);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;for(const h of u.attempts.slice(1)){if(!h.provider||!h.model)continue;const f=Date.now();try{p.always(`[proxy] fallback \u2192 ${h.provider}/${h.model}${h.reasoningEffort?` reasoning=${h.reasoningEffort}`:""}`);let g;if(h.provider==="codex")g=await MYr({ctx:t,body:r,model:h.model,reasoningEffort:h.reasoningEffort,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l});else{const y=await vv.checkFallbackProviderAvailability(h.provider,h.model);if(!y.available){const T=y.reason??"provider unavailable";p.always(`[proxy] fallback ${h.provider}/${h.model} health-check failed (${T}), skipping`),Fk({provider:h.provider,model:h.model,status:"failure",errorMessage:`[unavailable] ${T}`,durationMs:0}),d=`[${h.provider}/${h.model}] unavailable: ${T}`;continue}const w=LZt(n,{provider:h.provider,model:h.model});g=await vZt({ctx:t,body:r,tracer:i,requestStartTime:a,logProxyBody:c,logFinalRequest:l,options:w,providerLabel:h.provider})}return Fk({provider:h.provider,model:h.model,status:"success",durationMs:Date.now()-f}),i?.setFallbackInfo({triggered:!0,provider:h.provider,model:h.model,attemptCount:u.attempts.slice(1).length,reason:"fallback_success"}),h.provider!=="codex"&&Yk(t,{quota:null,source:"none",servedBy:h.provider}),{response:g}}catch(g){m??=PYr(g)??void 0;const y=eA(g instanceof Error?g.message:String(g));let w="unknown";y.includes("Rate limit")||y.includes("rate_limit")||y.includes("max_parallel_requests")?w="rate_limit":y.includes("context length")||y.includes("ContextWindowExceeded")?w="context_overflow":y.includes("no content or tool calls")||y.includes("NoOutputGenerated")?w="empty_response":y.includes("thinking_level")||y.includes("Field required")?w="schema_mismatch":y.includes("Resource exhausted")&&(w="provider_quota"),p.always(`[proxy] fallback ${h.provider}/${h.model} failed [${w}]: ${eA(bu(g))}`),Fk({provider:h.provider,model:h.model,status:"failure",errorMessage:`[${w}] ${y}`,durationMs:Date.now()-f}),d=`[${h.provider}/${h.model}] ${eA(bu(g))}`}}return{response:null,lastErrorMessage:d,...m?{invalidRequestFailure:m}:{}}}async function DYr(e){const{ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i}=e,a=Date.now();try{const c=Wne(r),l=Uw({provider:"anthropic",model:r.model},[],r.model,c,!0);if(hZt(s,"auto_fallback",l),!l.attempts.find(h=>h.label==="auto-provider"))return{response:null};p.always("[proxy] fallback \u2192 auto-provider");const d=LZt(c),m=await vZt({ctx:t,body:r,tracer:n,requestStartTime:o,logProxyBody:s,logFinalRequest:i,options:d,providerLabel:"auto-provider"});return Fk({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"}),Yk(t,{quota:null,source:"none",servedBy:"auto-provider"}),{response:m}}catch(c){const l=eA(bu(c));return p.always(`[proxy] fallback auto-provider failed: ${l}`),Fk({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"}),{response:null,lastErrorMessage:l}}}function OYr(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 EZt(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: ${OYr(e.accounts)}. Upstream: "${e.message}". Ask an organization admin to re-enable Claude Code OAuth access, then run: neurolink auth enable anthropic:<account>.`}function NYr(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 LYr(e){for(const t of e){const r=ec.get(t.key)?.quota;if(r?.overageDisabledReason&&r.overageStatus?.trim().toLowerCase()!=="allowed")return r.overageDisabledReason}}function SZt(e){return e?` Paid extra usage is unavailable for this organization (${e}), so there is no additional capacity before the window resets.`:""}function FYr(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()}.`+SZt(e.overageDisabledReason)}function _Zt(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:w,logFinalRequest:T}=e;if(i!==null&&g.length>0&&new Set(i.accounts).size>=g.length&&i&&!u){const O=EZt(i);return t?.setError("permission_error",O),t?.end(403,Date.now()-r),y(403,O,"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 O=Cu(s.body),M=O.message!==void 0,U=wr(O.message??s.body),$=M?s.body:JSON.stringify(_a(s.status,U,"invalid_request_error")),H=M?s.contentType??"application/json":"application/json";return t?.setError("invalid_request_error",U),t?.end(s.status,Date.now()-r),T(s.status,"","final","invalid_request_error",U),w({phase:"client_response",headers:{"content-type":H},body:$,bodySize:Buffer.byteLength($,"utf8"),contentType:H,responseStatus:s.status,durationMs:Date.now()-r}),new Response($,{status:s.status,headers:{"content-type":H}})}if((c||l)&&!u){const O=f?` Fallback also failed: ${f}`:"",M=h==="shared_provider_transport"?"shared Anthropic network":h==="connection_transport"?"Anthropic connection":null,U=`${M?`${M} 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")}.${O}`;return t?.setError("transient_error",U.slice(0,500)),t?.end(502,Date.now()-r),y(502,U,f?"fallback_exhausted":"transient_error",{...m?{errorCode:m}:{},...h?{transportScope:h}:{}})}const b=(O,M)=>{const U=_a(429,O,"overloaded_error");t?.setError("rate_limit_error",O),t?.end(429,Date.now()-r),T(429,"","final","rate_limit_error",O);const $=JSON.stringify(U),H={"content-type":"application/json","retry-after":String(M)};return w({phase:"client_response",headers:H,body:$,bodySize:Buffer.byteLength($,"utf8"),contentType:"application/json",responseStatus:429,durationMs:Date.now()-r}),new Response($,{status:429,headers:H})};if(a){const O=FYr(a);return p.always(`[proxy] model-scoped limit exhausted for ${a.model} on all accounts`),b(O,Math.max(1,Math.ceil((a.earliestResetMs-Date.now())/1e3)))}if(!u){const O=f?` Fallback also failed: ${f}`:"",M=`All Anthropic accounts failed. Last error: ${d instanceof Error?d.message:String(d??"unknown")}.${O}`;return t?.setError("all_accounts_failed",M.slice(0,500)),t?.end(502,Date.now()-r),y(502,M,f?"fallback_exhausted":"all_accounts_failed")}const k=Date.now(),A=g.map(O=>ba(O.key)).filter(O=>O.coolingUntil&&O.coolingUntil>k&&O.coolingReason!=="auth"),I=Math.min(...A.map(O=>O.coolingUntil??Number.POSITIVE_INFINITY)),R=g.length>0&&A.length===g.length,x=R?Math.max(1,Math.ceil((I-k)/1e3)):1,P=NYr(A),N=SZt(LYr(g)),F=R?`All ${g.length} Anthropic accounts are cooling after the ${P} was exhausted. Earliest retry at ${new Date(I).toISOString()}.${N}`:`All ${g.length} accounts rate-limited after per-account retries.${N}`;return p.always(`[proxy] all accounts rate-limited, retry in ${x}s`),b(F,x)}async function bZt(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 w=kw(s.headers,{model:r.model});if(w){EYr(n.key,o.quota,w),o.quota=hg(o.quota,w);const _=Boe(o,w,Date.now());_?.kind==="cooled"?Eu(n.key,_.coolingUntil,_.coolingReason).catch(()=>{}):_?.kind==="cleared"&&pg(n.key,_.coolingUntil).catch(()=>{}),vp(n.key,w).catch(()=>{})}const T={};return s.headers.forEach((_,b)=>{T[b]=_}),i?.logUpstreamResponseHeaders(T),Yk(t,{upstreamHeaders:s.headers,quota:w??o.quota??null,source:w?"live":o.quota?"snapshot":"none",account:n,accountState:o,servedBy:"anthropic",attempt:l,...g?{poolAccounts:g}:{}}),r.stream?$Yr({ctx:t,body:r,account:n,accountState:o,response:s,responseHeaders:T,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y,onStreamTerminal:f}):BYr({account:n,response:s,responseHeaders:T,tracer:i,requestStartTime:a,fetchStartMs:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logAttempt:m,logProxyBody:h,logFinalRequest:y})}async function $Yr(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){_r(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=_a(502,"No response body from upstream"),x=JSON.stringify(R);return f({phase:"client_response",headers:{"content-type":"application/json"},body:x,bodySize:Buffer.byteLength(x,"utf8"),contentType:"application/json",account:n.label,accountType:n.type,attempt:u,responseStatus:502,durationMs:Date.now()-c}),{response:R}}const w=s.body.getReader(),T=await cJr(w);if(T.kind==="transport_error"){const R=bu(T.error),x=Buffer.concat(T.chunks.map(P=>Buffer.from(P))).toString("utf8");return p.always(`[proxy] stream failed before first chunk account=${n.label}: ${R}; returning terminal error to avoid replaying an ambiguous request`),_r(n.label,n.type,502),h(502,"stream_error",R,{retryable:!1}),m?.end(),f({phase:"upstream_response",headers:i,body:x,bodySize:Buffer.byteLength(x,"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:kZt({account:n,tracer:a,requestStartTime:c,attemptNumber:u,logProxyBody:f,logFinalRequest:y,errorType:"stream_error",message:R})}}if(T.kind==="empty")return await w.cancel().catch(()=>{}),p.always(`[proxy] \u2190 empty stream from account=${n.label}, trying next`),_r(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(T.kind==="sse_error"){await w.cancel().catch(()=>{});const R=Buffer.concat(T.chunks.map(O=>Buffer.from(O))).toString("utf8"),x=T.errorType==="rate_limit_error",P=x?429:502,N=kw(i,{model:r.model}),F=Date.now();if(x){const O=$oe(N,JL(i["retry-after"]??null),F,ML(i),Nc,typeof r.model=="string"?r.model:void 0);o.quota=N?hg(o.quota,N):o.quota;const M=O.reason==="transient"?"transient":"quota";O.scope==="account"&&(!o.coolingUntil||O.coolingUntil>o.coolingUntil)&&(o.coolingUntil=O.coolingUntil,o.coolingReason=O.reason,await Eu(n.key,O.coolingUntil,O.reason).catch(()=>{})),_r(n.label,n.type,429,M),h(429,"rate_limit_error",T.message,{retryable:!0,rateLimitKind:M,cooldownReason:O.reason})}else _r(n.label,n.type,P),h(P,T.errorType,T.message,{retryable:!0});return p.always(`[proxy] immediate SSE ${T.errorType} account=${n.label}: ${T.message}; rotating before client commit`),a?.recordRetry(n.label,x?"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:P,upstreamErrorType:T.errorType}}),{retryNextAccount:!0,failure:{message:T.message,rateLimit:x,...T.errorType==="overloaded_error"?{retryDelayMs:MZt(u)}:{}}}}h(s.status,void 0,void 0,{attemptDurationMs:Date.now()-l});const _=PYt();let b=!1;const k=new ReadableStream({start(R){for(const x of T.chunks)R.enqueue(x)},async pull(R){if(!b)try{const{done:x,value:P}=await w.read();if(b)return;if(x){b=!0,_.complete(),R.close();return}R.enqueue(P)}catch(x){const P=bu(x);if(p.always(`[proxy] mid-stream error account=${n.label}: ${P}`),_.fail(P),!b){b=!0;const N=`event: error
|
|
2321
2321
|
data: ${JSON.stringify({type:"error",error:{type:"api_error",message:`Upstream stream interrupted: ${P}`}})}
|
|
2322
2322
|
|
|
2323
2323
|
`;R.enqueue(new TextEncoder().encode(N)),R.close()}}},cancel(){return b=!0,_.cancel(),w.cancel()}}),{response:A,telemetryDone:I}=UYr({ctx:t,account:n,response:s,responseHeaders:i,remainingStream:k,streamOutcome:_.outcome,tracer:a,requestStartTime:c,attemptNumber:u,finalBodyStr:d,upstreamSpan:m,logProxyBody:f,logFinalRequest:y});return I.then(()=>g?.(),()=>g?.()),{response:A,holdsAccountAdmission:!0}}function bp(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 lF(e,t){e.kind==="upstream_error"&&_r(t.label,t.type,502)}function UYr(e){const{ctx:t,account:r,response:n,responseHeaders:o,remainingStream:s,streamOutcome:i,tracer:a,requestStartTime:c,attemptNumber:l,finalBodyStr:u,upstreamSpan:d,logProxyBody:m,logFinalRequest:h}=e,{stream:f,capture:g}=sYt();let y=s,w;if(a)try{const{stream:b,telemetry:k}=WL({captureRawText:!0});y=y.pipeThrough(b);const A=a,I=d,R=n,x=u.length,P=r.label,N=r.key;w=Promise.all([k,g,i]).then(([F,O,M])=>{const U=KL(M,F.streamErrorMessage);lF(U,r),A.setUsage({inputTokens:F.usage.inputTokens,outputTokens:F.usage.outputTokens,cacheCreationTokens:F.usage.cacheCreationInputTokens,cacheReadTokens:F.usage.cacheReadInputTokens}),Joe(N,F.model,{inputTokens:F.usage.inputTokens,outputTokens:F.usage.outputTokens,cacheCreationTokens:F.usage.cacheCreationInputTokens,cacheReadTokens:F.usage.cacheReadInputTokens}),Koe(P,F.model,{inputTokens:F.usage.inputTokens,outputTokens:F.usage.outputTokens,cacheCreationTokens:F.usage.cacheCreationInputTokens,cacheReadTokens:F.usage.cacheReadInputTokens}),A.logStreamEvents(F.events),A.setResponseInfo(pZt(F));const $=parseFloat(R.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),H=parseFloat(R.headers.get("anthropic-ratelimit-unified-7d-utilization")??""),V={inputTokens:F.usage.inputTokens,outputTokens:F.usage.outputTokens,cacheCreationTokens:F.usage.cacheCreationInputTokens,cacheReadTokens:F.usage.cacheReadInputTokens};isNaN($)||(V.rateLimitAfter5h=$),isNaN(H)||(V.rateLimitAfter7d=H),(!isNaN($)||!isNaN(H))&&A.setUsage(V),A.logUpstreamResponseBody(F.rawText??""),A.recordMetrics(),A.recordBodySizes(x,F.totalBytesReceived),I?.end();const W=bp(U),Q={inputTokens:F.usage.inputTokens,outputTokens:F.usage.outputTokens,cacheCreationTokens:F.usage.cacheCreationInputTokens,cacheReadTokens:F.usage.cacheReadInputTokens};W?(A.setError(W.errorType,W.message),A.end(W.status,Date.now()-c),h(W.status,P,r.type,W.errorType,W.message,Q)):(A.end(200,Date.now()-c),h(200,P,r.type,void 0,void 0,Q)),m({phase:"upstream_response",headers:o,body:F.rawText??"",bodySize:F.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:P,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),m({phase:"client_response",headers:o,body:O.text,bodySize:O.totalBytes,contentType:o["content-type"]??"text/event-stream",account:P,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(F=>{A.setError("stream_telemetry_error",F instanceof Error?F.message:String(F)),I?.end(),A.end(500,Date.now()-c),h(500,P,r.type,"stream_telemetry_error",F instanceof Error?F.message:String(F))})}catch{w=i.then(b=>{lF(b,r);const k=bp(b);d?.end(),k?(a.setError(k.errorType,k.message),a.end(k.status,Date.now()-c),h(k.status,r.label,r.type,k.errorType,k.message)):(a.end(n.status,Date.now()-c),h(n.status,r.label,r.type))}).catch(()=>{})}else{d?.end();try{const{stream:b,telemetry:k}=WL({captureRawText:!0});y=y.pipeThrough(b);const A=r.label,I=r.key;w=Promise.all([k,g,i]).then(([R,x,P])=>{const N=KL(P,R.streamErrorMessage);lF(N,r);const F=bp(N),O={inputTokens:R.usage.inputTokens,outputTokens:R.usage.outputTokens,cacheCreationTokens:R.usage.cacheCreationInputTokens,cacheReadTokens:R.usage.cacheReadInputTokens};Joe(I,R.model,O),Koe(A,R.model,O),F?h(F.status,A,r.type,F.errorType,F.message,O):h(200,A,r.type,void 0,void 0,O),m({phase:"upstream_response",headers:o,body:R.rawText??"",bodySize:R.totalBytesReceived,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c}),m({phase:"client_response",headers:o,body:x.text,bodySize:x.totalBytes,contentType:o["content-type"]??"text/event-stream",account:A,accountType:r.type,attempt:l,responseStatus:200,durationMs:Date.now()-c})}).catch(R=>{const x=R instanceof Error?R.message:String(R);h(500,r.label,r.type,"stream_telemetry_error",x)})}catch{g.then(b=>{m({phase:"client_response",headers:o,body:b.text,bodySize:b.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(b=>{lF(b,r);const k=bp(b);k?h(k.status,r.label,r.type,k.errorType,k.message):h(n.status,r.label,r.type)}).catch(()=>{})}}const T=y.pipeThrough(f),_={...t.responseHeaders??{},"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"};return{response:new Response(T,{status:n.status,headers:_}),telemetryDone:w}}async function BYr(e){const{account:t,response:r,responseHeaders:n,tracer:o,requestStartTime:s,fetchStartMs:i,attemptNumber:a,finalBodyStr:c,upstreamSpan:l,logAttempt:u,logProxyBody:d,logFinalRequest:m}=e,h=await r.text();u(r.status,void 0,void 0,{attemptDurationMs:Date.now()-i}),o?.logUpstreamResponseBody(h),d({phase:"upstream_response",headers:n,body:h,bodySize:Buffer.byteLength(h,"utf8"),contentType:n["content-type"]??"application/json",account:t.label,accountType:t.type,attempt:a,responseStatus:r.status,durationMs:Date.now()-i}),d({phase:"client_response",headers:n,body:h,bodySize:Buffer.byteLength(h,"utf8"),contentType:n["content-type"]??"application/json",account:t.label,accountType:t.type,attempt:a,responseStatus:r.status,durationMs:Date.now()-s});const f=JSON.parse(h);if(fZt(t,f),o&&f&&typeof f=="object"){const g=f.usage;if(g){o.setUsage({inputTokens:g.input_tokens??0,outputTokens:g.output_tokens??0,cacheCreationTokens:g.cache_creation_input_tokens??0,cacheReadTokens:g.cache_read_input_tokens??0});const w=parseFloat(r.headers.get("anthropic-ratelimit-unified-5h-utilization")??""),T=parseFloat(r.headers.get("anthropic-ratelimit-unified-7d-utilization")??"");if(!isNaN(w)||!isNaN(T)){const _={inputTokens:g.input_tokens??0,outputTokens:g.output_tokens??0,cacheCreationTokens:g.cache_creation_input_tokens??0,cacheReadTokens:g.cache_read_input_tokens??0};isNaN(w)||(_.rateLimitAfter5h=w),isNaN(T)||(_.rateLimitAfter7d=T),o.setUsage(_)}}o.setResponseInfo(Woe(f)),o.recordMetrics();const y=JSON.stringify(f);o.recordBodySizes(c.length,y.length),l?.end(),o.end(r.status,Date.now()-s),m(r.status,t.label,t.type,void 0,void 0,{inputTokens:g?.input_tokens,outputTokens:g?.output_tokens,cacheCreationTokens:g?.cache_creation_input_tokens,cacheReadTokens:g?.cache_read_input_tokens})}else{l?.end();const g=f&&typeof f=="object"?f.usage:void 0;m(r.status,t.label,t.type,void 0,void 0,{inputTokens:g?.input_tokens,outputTokens:g?.output_tokens,cacheCreationTokens:g?.cache_creation_input_tokens,cacheReadTokens:g?.cache_read_input_tokens})}return{response:f}}async function zYr(e){const{account:t,accountState:r,requestedModel:n,retryResp:o,tracer:s,requestStartTime:i,fetchStartMs:a,attemptNumber:c,finalBodyStr:l,upstreamSpan:u,logAttempt:d,logProxyBody:m,logFinalRequest:h}=e,f=kw(o.headers,{model:n});if(f){r.quota=hg(r.quota,f);const T=Boe(r,f,Date.now());T?.kind==="cooled"?Eu(t.key,T.coolingUntil,T.coolingReason).catch(()=>{}):T?.kind==="cleared"&&pg(t.key,T.coolingUntil).catch(()=>{}),vp(t.key,f).catch(_=>{p.debug("[proxy] Failed to persist account quota after auth retry",{account:t.label,error:_ instanceof Error?_.message:String(_)})})}const g=Object.fromEntries([...o.headers.entries()]),y=await o.text();d(o.status,void 0,void 0,{attemptDurationMs:Date.now()-a}),s?.logUpstreamResponseHeaders(g),s?.logUpstreamResponseBody(y),m({phase:"upstream_response",headers:g,body:y,bodySize:Buffer.byteLength(y,"utf8"),contentType:g["content-type"]??"application/json",account:t.label,accountType:t.type,attempt:c,responseStatus:o.status,durationMs:Date.now()-a}),m({phase:"client_response",headers:g,body:y,bodySize:Buffer.byteLength(y,"utf8"),contentType:g["content-type"]??"application/json",account:t.label,accountType:t.type,attempt:c,responseStatus:o.status,durationMs:Date.now()-i});const w=JSON.parse(y);if(fZt(t,w),s&&w&&typeof w=="object"){const T=w.usage;T&&s.setUsage({inputTokens:T.input_tokens??0,outputTokens:T.output_tokens??0,cacheCreationTokens:T.cache_creation_input_tokens??0,cacheReadTokens:T.cache_read_input_tokens??0}),s.setResponseInfo(Woe(w)),s.recordMetrics();const _=JSON.stringify(w);s.recordBodySizes(l.length,_.length),u?.end(),s.end(o.status,Date.now()-i),h(o.status,t.label,t.type,void 0,void 0,{inputTokens:T?.input_tokens,outputTokens:T?.output_tokens,cacheCreationTokens:T?.cache_creation_input_tokens,cacheReadTokens:T?.cache_read_input_tokens})}else u?.end(),h(o.status,t.label,t.type);return w}async function GYr(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:w,lastError:T,authFailureMessage:_,entitlementFailure:b,sawRateLimit:k,sawTransientFailure:A,sawNetworkError:I}=e;_r(n.label,n.type,401),f(401,"authentication_error","received 401 from Anthropic",{retryable:!0});let R=T,x=_,P=b,N=k,F=A,O=I,M=h,U=!1,$="received 401 from Anthropic";for(let H=0;H<Wk;H++){p.always(`[proxy] \u2190 401 account=${n.label} refreshing (attempt ${H+1}/${Wk})`);const V=await OL(n,n.persistTarget);if(!V.success){if($=`refresh failed for account=${n.label} attempt ${H+1}/${Wk}: ${V.error?.slice(0,200)??"unknown"}`,R=$,gg(V))await Vd(n,o,"refresh_invalid"),x=pF(n.label),p.always(`[proxy] account=${n.label} refresh token rejected; disabled until re-authentication`);else{const ge=await dF(n,o);F=!0,p.always(`[proxy] account=${n.label} refresh temporarily unavailable (${V.status??"network"}); cooling until ${new Date(ge).toISOString()} and rotating`)}break}n.persistTarget&&await NL(n.persistTarget,n),await mF(n,o),s.authorization=`Bearer ${n.token}`;const W=m(),Q=Date.now();ag(n.label,n.type);const ne=(ge,q,me,ke)=>f(ge,q,me,{...ke,attempt:W,attemptDurationMs:ke?.attemptDurationMs??Date.now()-Q}),ce=i(n.token).bodyStr,Se=Date.now();g({phase:"upstream_request",headers:s,body:ce,bodySize:Buffer.byteLength(ce,"utf8"),contentType:s["content-type"]??"application/json",account:n.label,accountType:n.type,attempt:W,metadata:{upstreamMethod:"POST",upstreamUrl:a}});try{const ge=await Ooe(a,{method:"POST",headers:s,body:ce,signal:AbortSignal.timeout(Kk)});if(ge.ok){U=!0,o.consecutiveRefreshFailures=0,p.always(`[proxy] \u2190 200 account=${n.label} (after ${H+1} refresh(es))`);const Re=r.stream?await bZt({ctx:t,body:r,account:n,accountState:o,response:ge,tracer:u,requestStartTime:d,fetchStartMs:Se,attemptNumber:W,finalBodyStr:ce,upstreamSpan:M,logAttempt:ne,logProxyBody:g,logFinalRequest:w,onStreamTerminal:y}):{response:await zYr({account:n,accountState:o,requestedModel:r.model,retryResp:ge,tracer:u,requestStartTime:d,fetchStartMs:Se,attemptNumber:W,finalBodyStr:ce,upstreamSpan:M,logAttempt:ne,logProxyBody:g,logFinalRequest:w})};if("retryNextAccount"in Re){const Me=Re.failure;return{continueLoop:!0,...Me?.retryDelayMs?{retryDelayMs:Me.retryDelayMs}:{},lastError:Me?.message??R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N||!!Me?.rateLimit,sawTransientFailure:F||!!(Me&&!Me.rateLimit),sawNetworkError:O,upstreamSpan:void 0}}return{response:Re.response,holdsAccountAdmission:Re.holdsAccountAdmission,continueLoop:!1,lastError:R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:void 0}}const q=ge.status,me=await ge.text(),ke={};ge.headers.forEach((Re,Me)=>{ke[Me]=Re});const Ue={...ke};delete Ue.authorization,delete Ue["x-api-key"];const _e=me.length>4e3?me.slice(0,4e3)+"...[truncated]":me;if(u?.logUpstreamResponseHeaders(Ue),u?.logUpstreamResponseBody(_e),g({phase:"upstream_response",headers:Ue,body:_e,bodySize:Buffer.byteLength(me,"utf8"),contentType:ke["content-type"]??"application/json",account:n.label,accountType:n.type,attempt:W,responseStatus:q,durationMs:Date.now()-Se}),$=`retry ${H+1}/${Wk} failed with status ${q}`,R=me,p.debug(`[proxy] retry ${H+1} failed: ${q} ${me.substring(0,120)}`),q===429&&AZt(ke,me))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",me),u?.setError("construction_rejection",me.slice(0,500)),M?.end(),{response:CZt({terminalError:xZt(),account:n,tracer:u,requestStartTime:d,attemptNumber:W,logProxyBody:g,logFinalRequest:w}),continueLoop:!1,lastError:me,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:void 0};if(q===429){N=!0;const Re=Date.now(),Me=kw(ke,{model:r.model});Me&&(o.quota=hg(o.quota,Me));const Oe=$oe(Me,JL(ke["retry-after"]??null),Re,ML(ke),Nc,typeof r.model=="string"?r.model:void 0),Ze=Oe.reason==="transient"?"transient":"quota";_r(n.label,n.type,q,Ze),ne(429,"rate_limit_error",me,{retryable:!0,rateLimitKind:Ze,cooldownReason:Oe.reason}),Oe.scope==="account"&&(!o.coolingUntil||Oe.coolingUntil>o.coolingUntil)&&(o.coolingUntil=Oe.coolingUntil,o.coolingReason=Oe.reason),Me&&vp(n.key,Me).catch(()=>{}),Oe.scope==="account"&&await Eu(n.key,o.coolingUntil??Oe.coolingUntil,o.coolingReason??Oe.reason).catch(()=>{}),vg(n.key,c.length,l[0]?.key);break}if(q===401||q===402||q===403){if(ese(q,me)){const Re=Cu(me);_r(n.label,n.type,q),ne(q,"permission_error",wr(me)),P={status:q,accounts:[...P?.accounts??[],n.label],message:P?.message??Re.message??wr(me),...Re.errorCode?{errorCode:Re.errorCode}:{}},n.type==="oauth"&&NZt(q,me)&&await Vd(n,o,"entitlement_blocked"),$=`entitlement blocked for account=${n.label}`,R=$,p.always(`[proxy] \u2190 ${q} account=${n.label} entitlement blocked after refresh; advancing to next account`);break}_r(n.label,n.type,q),ne(q,"authentication_error",wr(me),{retryable:!0}),H<Wk-1&&await _u(1e3);continue}if(FZt(q,me)){_r(n.label,n.type,q),ne(q,"api_error",wr(me),{retryable:!0}),F=!0;break}ne(q,"api_error",wr(me));try{return w(q,n.label,n.type,"api_error",wr(me)),{response:JSON.parse(me),continueLoop:!1,lastError:R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:M}}catch{return w(q,n.label,n.type,"api_error",wr(me)),{response:_a(q,me),continueLoop:!1,lastError:R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:M}}}catch(ge){O=!0,_r(n.label,n.type,502);const q=ge instanceof Error?ge.message:String(ge);$=`network error on retry ${H+1}: ${q}`,R=$;const me=Qoe(ge);if(ne(502,"network_error",q,{retryable:me,errorCode:Qk(ge)??"unknown"}),p.debug(`[proxy] ${$}`),!me)return M?.end(),{response:kZt({account:n,tracer:u,requestStartTime:d,attemptNumber:W,logProxyBody:g,logFinalRequest:w,errorType:"network_error",message:q}),continueLoop:!1,lastError:R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:void 0};break}}return U||(R=$,p.always(`[proxy] \u26A0 account=${n.label} auth retries exhausted, rotating to next account`),u?.setError("authentication_error",$),u?.recordRetry(n.label,"auth_exhausted"),M?.end(),M=void 0,vg(n.key,c.length,l[0]?.key)),{continueLoop:!0,lastError:R,authFailureMessage:x,entitlementFailure:P,sawRateLimit:N,sawTransientFailure:F,sawNetworkError:O,upstreamSpan:M}}function Yoe(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,wr(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,wr(n));const u=_a(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 CZt(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),Yoe({responseStatus:t.status,account:r,errBody:t.body,errRespHeaders:t.headers,requestStartTime:o,attemptNumber:s,logProxyBody:i,logFinalRequest:a,errorType:t.errorType})}function kZt(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=_a(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 qYr(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:w,allowConfiguredModelFallback:T=!1}=e;let _=h,b=f,k=g,A=y,I=w;const R=await t.text(),x={};if(t.headers.forEach((P,N)=>{x[N]=P}),i?.logUpstreamResponseHeaders(x),i?.logUpstreamResponseBody(R),d({phase:"upstream_response",headers:x,body:R,bodySize:Buffer.byteLength(R,"utf8"),contentType:x["content-type"]??"application/json",account:r.label,accountType:r.type,attempt:l,responseStatus:t.status,durationMs:Date.now()-c}),rZr(t.status,R))return oZr(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",wr(R)),i?.setError("invalid_request_error",wr(R)),i?.recordRetry(r.label,"beta_unavailable"),vg(r.key,o.length,s[0]?.key),_=wr(R),{continueLoop:!0,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 ${t.status} upstream invalid_request_error`),u(t.status,"invalid_request_error",wr(R)),i?.setError("invalid_request_error",wr(R)),A={status:t.status,body:R,contentType:x["content-type"]},_=wr(R),{continueLoop:!1,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0});if(r.type==="oauth"&&ese(t.status,R)){const P=Cu(R);return _r(r.label,r.type,t.status),I={status:t.status,accounts:[...I?.accounts??[],r.label],message:I?.message??P.message??wr(R),...P.errorCode?{errorCode:P.errorCode}:{}},p.always(`[proxy] \u2190 ${t.status} account=${r.label} entitlement blocked${P.errorCode?` (${P.errorCode})`:""}; advancing to next account`),u(t.status,"permission_error",wr(R)),i?.setError("permission_error",wr(R)),i?.recordRetry(r.label,"entitlement_blocked"),r.type==="oauth"&&NZt(t.status,R)&&await Vd(r,n,"entitlement_blocked"),vg(r.key,o.length,s[0]?.key),_=wr(R),{continueLoop:!0,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0}}if((t.status===401||t.status===402||t.status===403)&&r.type==="oauth"&&!r.refreshToken)return _r(r.label,r.type,t.status),await Vd(r,n,"missing_refresh_token"),b=pF(r.label),p.always(`[proxy] \u2190 ${t.status} account=${r.label} (auth failure, no refresh token)`),_=R,u(t.status,"authentication_error",wr(R)),i?.setError("authentication_error",wr(R)),i?.recordRetry(r.label,"auth_no_refresh"),vg(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0};if((t.status===401||t.status===402||t.status===403)&&r.type==="api_key")return _r(r.label,r.type,t.status),b="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)`),_=R,u(t.status,"authentication_error",wr(R)),i?.setError("authentication_error",wr(R)),i?.recordRetry(r.label,"auth_api_key"),vg(r.key,o.length,s[0]?.key),{continueLoop:!0,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0};if(t.status===404)return T&&nZr(t.status,R)?(p.always(`[proxy] \u2190 404 account=${r.label} model unavailable; trying configured fallback`),u(404,"not_found_error",wr(R)),i?.setError("not_found_error",wr(R)),i?.recordRetry(r.label,"model_not_found"),_=wr(R),{continueLoop:!1,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0}):(p.always(`[proxy] \u2190 404 account=${r.label}`),u(404,"not_found_error",wr(R)),i?.setError("not_found_error",wr(R)),i?.end(404,Date.now()-a),{response:Yoe({responseStatus:404,account:r,errBody:R,errRespHeaders:x,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"not_found_error"}),continueLoop:!1,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0});if(FZt(t.status,R)){const P=iZr(t.status,R);return _r(r.label,r.type,t.status,t.status===429?"transient":void 0),k=!0,p.always(`[proxy] \u2190 ${t.status} account=${r.label} (${P?"overloaded":"transient"})`),_=R,u(t.status,"api_error",wr(R),t.status===429?{retryable:!0,rateLimitKind:"transient",cooldownReason:"transient"}:void 0),i?.setError(P?"overloaded_error":"transient_error",wr(R)),i?.recordRetry(r.label,P?"overloaded":"transient"),{continueLoop:!0,retrySameAccount:!P,...P?{retryDelayMs:MZt(l)}:{},lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,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",wr(R)),i?.setError("api_error",wr(R)),i?.end(t.status,Date.now()-a),{response:Yoe({responseStatus:t.status,account:r,errBody:R,errRespHeaders:x,requestStartTime:a,attemptNumber:l,logProxyBody:d,logFinalRequest:m,errorType:"api_error"}),continueLoop:!1,lastError:_,authFailureMessage:b,sawTransientFailure:k,invalidRequestFailure:A,entitlementFailure:I,upstreamSpan:void 0}}function HYr(e){const{ctx:t,body:r,clientRequestBody:n}=e;let o;try{o=uoe.startRequest({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();hWr({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,w)=>{if(l){p.debug(`[claude-proxy] ignored duplicate finalization for request ${t.requestId}`);return}l=!0;const T=h||(m>=400?xoe:void 0),_=h?f||void 0:m>=400?Ioe:void 0,b=GYt(T,_);m>=400?aw(m,T,_,{requestId:t.requestId,...b.accountKey?{accountKey:b.accountKey}:{},errorType:g,terminalOutcome:g==="client_cancelled"?"client_cancelled":g?.includes("stream")?"stream_error":"handler_error",message:y,errorCode:w?.errorCode}):ck(T,_);const k=o?.getTraceContext();Sp({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:r.model,stream:!!r.stream,toolCount:Array.isArray(r.tools)?r.tools.length:0,account:T??"",...b.accountKey?{accountKey:b.accountKey}:{},accountType:_??"",...b.provider?{provider:b.provider}:{},...Pw(t.headers),responseStatus:m,responseTimeMs:Date.now()-s,...g?{errorType:g}:{},...y?{errorMessage:y}:{},...w?.errorCode?{errorCode:w.errorCode}:{},...w?.transportScope?{transportScope:w.transportScope}:{},...w?.inputTokens!==void 0?{inputTokens:w.inputTokens}:{},...w?.outputTokens!==void 0?{outputTokens:w.outputTokens}:{},...w?.cacheCreationTokens!==void 0?{cacheCreationTokens:w.cacheCreationTokens}:{},...w?.cacheReadTokens!==void 0?{cacheReadTokens:w.cacheReadTokens}:{},...k?{traceId:k.traceId,spanId:k.spanId}:{},...a?{routingDecision:a}:{}})},d=(m,h,f,g)=>{const y=_a(m,h,f),w=JSON.stringify(y);return u(m,g?.account??"",g?.accountType??"final",f,h,g),i({phase:"client_response",headers:{"content-type":"application/json"},body:w,bodySize:Buffer.byteLength(w,"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 jYr(e){const{ctx:t,body:r,toolCount:n,requestStart:o,tracer:s,account:i,attemptNumber:a}=e,c=Date.now(),l=GYt(i.label,i.type);return(u,d,m,h)=>{const f=Date.now(),g=s?.getTraceContext();QJt({timestamp:new Date().toISOString(),requestId:t.requestId,attempt:h?.attempt??a,method:t.method,path:t.path,model:r.model,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 VYr(e){const{account:t,accountState:r,bodyStr:n,clientHeaders:o,isClaudeClientRequest:s,url:i,tracer:a,attemptNumber:c,currentLastError:l,currentAuthFailureMessage:u,logAttempt:d,logProxyBody:m}=e;let h=l,f=u;if(Une(t)){const R=await OL(t,t.persistTarget);if(R.success)t.persistTarget&&await NL(t.persistTarget,t),await mF(t,r);else return h=`token refresh failed for account=${t.label}: ${R.error?.slice(0,200)??"unknown"}`,gg(R)?(await Vd(t,r,"refresh_invalid"),f=pF(t.label)):await dF(t,r),d(gg(R)?401:503,gg(R)?"authentication_error":"token_refresh_unavailable",String(h)),{continueLoop:!0,lastError:h,authFailureMessage:f}}const g=t.type==="oauth",y={};for(const[R,x]of Object.entries(o))typeof x=="string"&&(y[R]=x);const w=g?await lYr(t.label,t.key,y,n):null,T={};for(const[R,x]of Object.entries(o)){const P=R.toLowerCase();typeof x=="string"&&!XL.has(P)&&(T[P]=x)}if(T["content-type"]="application/json",g?(T.authorization=`Bearer ${t.token}`,delete T["x-api-key"],oYr(T,w)):(T["x-api-key"]=t.token,delete T.authorization),T["user-agent"]||(T["user-agent"]=mf),T["anthropic-version"]||(T["anthropic-version"]="2023-06-01"),T["anthropic-dangerous-direct-browser-access"]||(T["anthropic-dangerous-direct-browser-access"]="true"),T["x-app"]||(T["x-app"]="cli"),T.accept||(T.accept="application/json"),g){const R=s?T["anthropic-beta"]??"":o["anthropic-beta"]??"",x=new Set(R.split(",").map(P=>P.trim()).filter(Boolean));for(const P of s?wb:nYr)x.add(P);T["anthropic-beta"]=[...x].join(",")}else{const R=(T["anthropic-beta"]??"").split(",").map(x=>x.trim()).filter(x=>x&&!wb.includes(x)).join(",");R?T["anthropic-beta"]=R:delete T["anthropic-beta"]}const _=R=>g?uYr(n,R,w,s,T["x-claude-code-session-id"]):{bodyStr:n},b=_(t.token);g&&b.sessionId&&!T["x-claude-code-session-id"]&&(T["x-claude-code-session-id"]=b.sessionId);const k=b.bodyStr;p.always(`[proxy] \u2192 account=${t.label} (${t.type})`),ag(t.label,t.type);const A=Date.now();let I;return a&&(I=a.startUpstreamAttempt({attempt:c,account:t.label,polyfillHeaders:g,polyfillBody:g,upstreamUrl:i}),a.logUpstreamRequestHeaders(T),a.logUpstreamRequestBody(k),Object.assign(T,a.getTraceHeaders())),m({phase:"upstream_request",headers:T,body:k,bodySize:Buffer.byteLength(k,"utf8"),contentType:T["content-type"]??"application/json",account:t.label,accountType:t.type,attempt:c,metadata:{upstreamMethod:"POST",upstreamUrl:i}}),{continueLoop:!1,lastError:h,authFailureMessage:f,headers:T,buildUpstreamBody:_,finalBodyStr:k,fetchStartMs:A,upstreamSpan:I}}function AZt(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 xZt(){return{status:400,body:JSON.stringify(_a(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 WYr(e){const{url:t,headers:r,finalBodyStr:n,requestedModel:o,account:s,accountState:i,enabledAccounts:a,orderedAccounts:c,tracer:l,logAttempt:u,logProxyBody:d,fetchStartMs:m,attemptNumber:h,currentLastError:f,currentSawRateLimit:g,currentSawNetworkError:y,upstreamSpan:w}=e;let T=f,_=g,b=y;const k=w;let A;try{A=await Ooe(t,{method:"POST",headers:r,body:n,signal:AbortSignal.timeout(Kk)})}catch(I){const R=Qoe(I),x=DZt(I),P=eZr(I);b=!0,_r(s.label,s.type,502);const N=Qk(I)??"unknown",F=I instanceof Error?I.message:String(I);if(T=F,p.always(`[proxy] fetch error account=${s.label} code=${N} (${R?"retryable":"terminal"}): ${F}`),u(502,"network_error",F,{retryable:R,connectPhase:x,errorCode:N,transportScope:P}),l?.setError("network_error",F),R&&l?.recordRetry(s.label,"network_error"),k?.end(),!R)throw I;return{continueLoop:!0,retrySameAccount:!0,transportScope:P,errorCode:N,connectPhase:x,lastError:T,sawRateLimit:_,sawNetworkError:b,upstreamSpan:void 0}}if(A.status===429){const I=JL(A.headers.get("retry-after")),R={};A.headers.forEach(($,H)=>{R[H]=$}),T=await A.text();const x={...R};delete x.authorization,delete x["x-api-key"];const P=String(T).length>4e3?String(T).slice(0,4e3)+"...[truncated]":String(T);if(l?.logUpstreamResponseHeaders(x),l?.logUpstreamResponseBody(P),d({phase:"upstream_response",headers:x,body:P,bodySize:Buffer.byteLength(String(T),"utf8"),contentType:R["content-type"]??"application/json",account:s.label,accountType:s.type,attempt:h,responseStatus:429,durationMs:Date.now()-m}),AZt(R,String(T)))return p.always(`[proxy] \u2190 429 account=${s.label} anti-abuse/construction rejection (no ratelimit headers, body="Error") \u2014 NOT a real rate limit; returning non-retryable request error`),u(429,"construction_rejection",String(T)),l?.setError("construction_rejection",String(T).slice(0,500)),k?.end(),{continueLoop:!1,terminalError:xZt(),lastError:T,sawRateLimit:_,sawNetworkError:b,upstreamSpan:void 0};_=!0;const N=Date.now(),F=kw(R,{model:o}),O=ML(R),M=$oe(F,I,N,O,Nc,o),U=M.reason==="transient"?"transient":"quota";return _r(s.label,s.type,429,U),p.always(`[proxy] \u2190 429 account=${s.label} reason=${M.reason} scope=${M.scope} retry-after=${I}ms 5h-status=${R["anthropic-ratelimit-unified-5h-status"]??"unknown"} 7d-status=${R["anthropic-ratelimit-unified-7d-status"]??"unknown"} unified-status=${O??"unknown"} \u2192 ${M.rotateImmediately?`rotate now, cool ${Uoe(M.coolingUntil,N)}m`:"retry same account (transient)"}`),u(429,"rate_limit_error",String(T),{retryable:!0,rateLimitKind:U,cooldownReason:M.reason}),l?.setError("rate_limit_error",String(T).slice(0,500)),l?.recordRetry(s.label,"rate_limit"),k?.end(),{continueLoop:!0,retrySameAccount:!M.rotateImmediately,retryAfterMs:I,cooldownPlan:M,...F?{quota:F}:{},lastError:T,sawRateLimit:_,sawNetworkError:b,upstreamSpan:void 0}}return{continueLoop:!1,response:A,lastError:T,sawRateLimit:_,sawNetworkError:b,upstreamSpan:k}}function KYr(e){return e.invalidRequestFailure===null}function JYr(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 YYr(e){const{ctx:t,body:r,modelRouter:n,tracer:o,requestStartTime:s,accountStrategy:i,primaryAccountKey:a,accountAllowlist:c,quotaRoutingEnabled:l=Goe(),sessionSoftLimit:u=qoe(),sessionResetToleranceMs:d=Xk(),buildLoggedClaudeError:m,logProxyBody:h,logFinalRequest:f,setRoutingDecision:g}=e,y=Wne(r),w=Uw({provider:"anthropic",model:r.model},n?.getFallbackChain()??[],r.model,y),T=w.attempts.slice(1).some(ne=>!!(ne.provider&&ne.model)),_=await IYr({ctx:t,body:r,accountStrategy:i,primaryAccountKey:a,accountAllowlist:c,quotaRoutingEnabled:l,sessionSoftLimit:u,sessionResetToleranceMs:d,setRoutingDecision:g});if("failure"in _){const ne=await wZt({body:r,logFinalRequest:f});if(ne)return ne;const ce=await TZt({ctx:t,body:r,parsedFallbackRequest:y,fallbackPlan:w,modelRouter:n,tracer:o,requestStartTime:s,logProxyBody:h,logFinalRequest:f});return ce.response?ce.response:ce.invalidRequestFailure?_Zt({tracer:o,requestStartTime:s,authFailureMessage:null,authCooldownMessage:null,invalidRequestFailure:ce.invalidRequestFailure,entitlementFailure:null,scopedExhaustion:null,sawNetworkError:!1,sawTransientFailure:!1,sawRateLimit:!1,lastError:void 0,orderedAccounts:[],buildLoggedClaudeError:m,logProxyBody:h,logFinalRequest:f}):JYr({ctx:t,tracer:o,requestStartTime:s,failure:_.failure,buildLoggedClaudeError:m})}const{accounts:b,enabledAccounts:k,orderedAccounts:A,bodyStr:I,requestStart:R,toolCount:x,url:P,clientHeaders:N,isClaudeClientRequest:F}=_,O=jJr(),M={lastError:void 0,sawRateLimit:!1,sawNetworkError:!1,sawTransientFailure:!1,invalidRequestFailure:null,authFailureMessage:null,authCooldownMessage:null,entitlementFailure:null,scopedExhaustion:null,attemptNumber:0},U=o?.startAccountSelection();let H=A.filter(ne=>!oZt(ne.key));if(H.length===0&&(H=await FJr(A)),H.length===0&&A.length>0){const ne=A.map(Se=>ba(Se.key)),ce=ne.some(Se=>Se.coolingReason!=="auth");if(M.sawRateLimit=ce,M.sawTransientFailure=!ce,M.lastError=ce?"All Anthropic accounts have active rate-limit cooldowns":"All Anthropic accounts have active authentication cooldowns",!ce){const Se=Math.min(...ne.map(ge=>ge.coolingUntil??Number.POSITIVE_INFINITY));M.authCooldownMessage=`All ${A.length} Anthropic accounts are temporarily unavailable while OAuth refresh is cooling. Earliest retry at ${new Date(Se).toISOString()}.`}}const V=JJr(H,typeof r.model=="string"?r.model:void 0,Date.now(),O);V.eligible.length>0?H=V.eligible:V.exhaustion&&(M.scopedExhaustion=V.exhaustion,M.lastError=`Model-scoped limit exhausted for ${V.exhaustion.model}`,H=[]);const W=n?.getMaxInflightPerAccount?.();let Q;W!==void 0&&H.length>0&&H.every(ne=>!xJr(ne.key,W))&&(Q=await RJr(H.map(ne=>ne.key),W,t.abortSignal));e:for(const[ne,ce]of H.entries()){const Se=ne<H.length-1,ge=ba(ce.key);let q=0,me=0;for(;;){const ke=await Bw.acquire(t.abortSignal);if(ke.allowed===!1){M.sawNetworkError=!0,M.lastTransportErrorCode=ke.errorCode??void 0,M.lastTransportScope=ke.transportScope,M.lastError=`Anthropic transport recovery probe failed (${ke.errorCode??"unknown"})`;const Oe=ke.connectPhase?HYt:QL;if(q<Oe){q+=1;const Ze=Xoe(q);p.always(`[proxy] retrying same account=${ce.label} after failed transport recovery probe (${q}/${Oe}) in ${Ze}ms`),await _u(Ze);continue}break e}M.attemptNumber+=1,o&&M.attemptNumber===1&&U&&(o.setAccountSelection({strategy:i,accountsTotal:b.length,accountsHealthy:k.length,selectedAccount:ce.label,accountType:ce.type}),U.end());const Ue=jYr({ctx:t,body:r,toolCount:x,requestStart:R,tracer:o,account:ce,attemptNumber:M.attemptNumber}),_e=await VYr({account:ce,accountState:ge,bodyStr:I,clientHeaders:N,isClaudeClientRequest:F,url:P,tracer:o,attemptNumber:M.attemptNumber,currentLastError:M.lastError,currentAuthFailureMessage:M.authFailureMessage,logAttempt:Ue,logProxyBody:h});if(M.lastError=_e.lastError,M.authFailureMessage=_e.authFailureMessage,_e.continueLoop||!_e.headers||!_e.buildUpstreamBody||!_e.finalBodyStr||_e.fetchStartMs===void 0){ke.probe&&Bw.reportProbeAbandoned(ke);continue e}let Re;if(Q?.accountKey===ce.key?(Re=Q.lease,Q=void 0):(Re=AJr(ce.key,W),Re&&Q&&(Q.lease.release(),Q=void 0)),!Re){ke.probe&&Bw.reportProbeAbandoned(ke);continue e}let Me=!1;try{let Oe;try{Oe=await WYr({url:P,headers:_e.headers,finalBodyStr:_e.finalBodyStr,requestedModel:r.model,account:ce,accountState:ge,enabledAccounts:k,orderedAccounts:A,tracer:o,logAttempt:Ue,logProxyBody:h,fetchStartMs:_e.fetchStartMs,attemptNumber:M.attemptNumber,currentLastError:M.lastError,currentSawRateLimit:M.sawRateLimit,currentSawNetworkError:M.sawNetworkError,upstreamSpan:_e.upstreamSpan})}catch(xe){throw ke.probe&&Bw.reportProbeAbandoned(ke),xe}if(Oe.transportScope?Bw.reportTransportFailure(Oe.errorCode,Oe.transportScope,ke,Oe.connectPhase===!0):Bw.reportSuccess(ke),M.lastError=Oe.lastError,M.sawRateLimit=Oe.sawRateLimit,M.sawNetworkError=Oe.sawNetworkError,Oe.transportScope&&(M.lastTransportScope=Oe.transportScope,M.lastTransportErrorCode=Oe.errorCode),Oe.terminalError)return CZt({terminalError:Oe.terminalError,account:ce,tracer:o,requestStartTime:s,attemptNumber:M.attemptNumber,logProxyBody:h,logFinalRequest:f});if(Oe.continueLoop||!Oe.response){if(Oe.cooldownPlan){const he=Oe.cooldownPlan;Oe.quota&&(ge.quota=hg(ge.quota,Oe.quota),vp(ce.key,Oe.quota).catch(()=>{}));let qe=!1;he.scope==="account"&&(!ge.coolingUntil||he.coolingUntil>ge.coolingUntil)&&(ge.coolingUntil=he.coolingUntil,ge.coolingReason=he.reason,qe=!0),qe&&he.scope==="account"&&await Eu(ce.key,ge.coolingUntil??he.coolingUntil,ge.coolingReason??he.reason).catch(()=>{});const Z=Oe.retrySameAccount?NJr(ce.key,he.coolingUntil):void 0;if(Oe.retrySameAccount&&Oe.retryAfterMs!==void 0&&me<Poe&&Z!==void 0){me+=1;const J=Math.min(Oe.retryAfterMs||1e3,VYt),re=Math.min(VYt,PZt(J*Z));p.always(`[proxy] retrying same account=${ce.label} after transient 429 (shared slot ${Z}/${Poe}) in ${re}ms`),await _u(re);continue}vg(ce.key,k.length,A[0]?.key),p.always(`[proxy] account=${ce.label} rate-limited (${he.reason}); cooling ~${Uoe(he.coolingUntil,Date.now())}m until ${new Date(he.coolingUntil).toISOString()}, rotating`),he.rotateImmediately&&XJr(ce,H[ne+1],he.coolingUntil,u);continue e}const xe=Oe.connectPhase?HYt:QL;if(Oe.retrySameAccount&&q<xe){q+=1;const he=Xoe(q);p.always(`[proxy] retrying same account=${ce.label} after transient network error (${q}/${xe}) in ${he}ms`),await _u(he);continue}if(Oe.retrySameAccount&&!Oe.transportScope&&p.always(`[proxy] exhausted transient same-account retries for account=${ce.label}; rotating`),Oe.transportScope){p.always(`[proxy] Anthropic ${Oe.transportScope} failure code=${Oe.errorCode??"unknown"}; suppressing cross-account rotation after ${q+1} attempts`);break e}continue e}let Ze=Oe.upstreamSpan;const et=Oe.response;if(et.status===401&&ce.type==="oauth"&&ce.refreshToken){const xe=await GYr({ctx:t,body:r,account:ce,accountState:ge,headers:_e.headers,buildUpstreamBody:_e.buildUpstreamBody,url:P,enabledAccounts:k,orderedAccounts:A,tracer:o,requestStartTime:s,allocateAttemptNumber:()=>(M.attemptNumber+=1,M.attemptNumber),upstreamSpan:Ze,logAttempt:Ue,logProxyBody:h,logFinalRequest:f,onStreamTerminal:Re.release,lastError:M.lastError,authFailureMessage:M.authFailureMessage,entitlementFailure:M.entitlementFailure,sawRateLimit:M.sawRateLimit,sawTransientFailure:M.sawTransientFailure,sawNetworkError:M.sawNetworkError});if(M.lastError=xe.lastError,M.authFailureMessage=xe.authFailureMessage,M.entitlementFailure=xe.entitlementFailure,M.sawRateLimit=xe.sawRateLimit,M.sawTransientFailure=xe.sawTransientFailure,M.sawNetworkError=xe.sawNetworkError,Ze=xe.upstreamSpan,xe.response!==void 0)return Me=xe.holdsAccountAdmission===!0,xe.response;if(xe.continueLoop){Se&&xe.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${xe.retryDelayMs}ms after auth refresh`),await _u(xe.retryDelayMs));continue e}}if(!et.ok){const xe=await qYr({response:et,account:ce,accountState:ge,enabledAccounts:k,orderedAccounts:A,tracer:o,requestStartTime:s,fetchStartMs:_e.fetchStartMs,attemptNumber:M.attemptNumber,logAttempt:Ue,logProxyBody:h,logFinalRequest:f,lastError:M.lastError,authFailureMessage:M.authFailureMessage,sawTransientFailure:M.sawTransientFailure,invalidRequestFailure:M.invalidRequestFailure,entitlementFailure:M.entitlementFailure,allowConfiguredModelFallback:T});if(M.lastError=xe.lastError,M.authFailureMessage=xe.authFailureMessage,M.sawTransientFailure=xe.sawTransientFailure,M.invalidRequestFailure=xe.invalidRequestFailure,M.entitlementFailure=xe.entitlementFailure,xe.response!==void 0)return xe.response;if(xe.continueLoop){if(xe.retrySameAccount&&q<QL){q+=1;const he=Xoe(q);p.always(`[proxy] retrying same account=${ce.label} after transient upstream ${et.status} (${q}/${QL}) in ${he}ms`),await _u(he);continue}xe.retrySameAccount&&p.always(`[proxy] exhausted transient same-account retries for account=${ce.label}; rotating`),Se&&xe.retryDelayMs&&(p.always(`[proxy] pacing cross-account overload rotation for ${xe.retryDelayMs}ms`),await _u(xe.retryDelayMs));continue e}break e}if(ge.coolingUntil&&Date.now()>=ge.coolingUntil){const xe=ge.coolingUntil;ge.coolingUntil=void 0,ge.coolingReason=void 0,pg(ce.key,xe).catch(()=>{})}const Lt=await bZt({ctx:t,body:r,account:ce,accountState:ge,response:et,tracer:o,requestStartTime:s,fetchStartMs:_e.fetchStartMs,attemptNumber:M.attemptNumber,finalBodyStr:_e.finalBodyStr,upstreamSpan:Ze,logAttempt:Ue,logProxyBody:h,logFinalRequest:f,onStreamTerminal:Re.release,poolAccounts:k});if("retryNextAccount"in Lt){Lt.failure&&(M.lastError=Lt.failure.message,M.sawRateLimit||=Lt.failure.rateLimit,M.sawTransientFailure||=!Lt.failure.rateLimit,Se&&Lt.failure.retryDelayMs&&(p.always(`[proxy] pacing cross-account SSE overload rotation for ${Lt.failure.retryDelayMs}ms`),await _u(Lt.failure.retryDelayMs)));continue e}return Me=Lt.holdsAccountAdmission===!0,Lt.response}finally{Me||Re.release()}}}if(Q?.lease.release(),M.attemptNumber===0&&U?.end(),KYr(M)){let ne;const ce=await wZt({body:r,logFinalRequest:f});if(ce)return ce;const Se=await TZt({ctx:t,body:r,parsedFallbackRequest:y,fallbackPlan:w,modelRouter:n,tracer:o,requestStartTime:s,logProxyBody:h,logFinalRequest:f});if(Se.response)return Se.response;if(Se.invalidRequestFailure&&!M.sawRateLimit&&(M.invalidRequestFailure=Se.invalidRequestFailure),ne=Se.lastErrorMessage,M.invalidRequestFailure===null&&!M.sawRateLimit&&n?.isAutoFallbackEnabled?.()){const ge=await DYr({ctx:t,body:r,tracer:o,requestStartTime:s,logProxyBody:h,logFinalRequest:f});if(ge.response)return ge.response;ne=ge.lastErrorMessage??ne}M.fallbackFailureMessage=ne}{const ne=A[0],ce=ne?ec.get(ne.key):void 0;Yk(t,{quota:ce?.quota??null,source:ce?.quota?"snapshot":"none",...ne?{account:ne}:{},...ce?{accountState:ce}:{},attempt:M.attemptNumber,poolAccounts:k})}return _Zt({tracer:o,requestStartTime:s,authFailureMessage:M.authFailureMessage,authCooldownMessage:M.authCooldownMessage,invalidRequestFailure:M.invalidRequestFailure,entitlementFailure:M.entitlementFailure,scopedExhaustion:M.scopedExhaustion,sawNetworkError:M.sawNetworkError,sawTransientFailure:M.sawTransientFailure,sawRateLimit:M.sawRateLimit,lastError:M.lastError,lastTransportErrorCode:M.lastTransportErrorCode,lastTransportScope:M.lastTransportScope,fallbackFailureMessage:M.fallbackFailureMessage,orderedAccounts:A,buildLoggedClaudeError:m,logProxyBody:h,logFinalRequest:f})}function IZt(e){return e!==void 0&&"runtimeConfigProvider"in e&&typeof e.runtimeConfigProvider=="function"}function RZt(e){const{ctx:t,body:r,status:n,message:o,errorType:s}=e;return aw(n,xoe,Ioe,{requestId:t.requestId,errorType:s,terminalOutcome:"handler_error",message:o}),Sp({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:xoe,accountType:Ioe,responseStatus:n,responseTimeMs:0,errorType:s,errorMessage:o}),_a(n,o)}function Zoe(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?Math.round(e*1e3):null}function ZYr(e){if(!e||typeof e!="object")return null;const t={...e};return t.sessionResetAtMs=Zoe(t.sessionResetAt),t.weeklyResetAtMs=Zoe(t.weeklyResetAt),Array.isArray(t.windows)&&(t.windows=t.windows.map(r=>{const n={...r};return n.resetsAtMs=Zoe(n.resetsAt),n.severity=n.severity??(n.status==="rejected"?"critical":"normal"),n.isActive=n.isActive??!1,n})),t}function uF(e){return e==="allowed"?"ok":e==="rejected"||e==="throttled"?"degraded":"unknown"}function XYr(e,t="",r="fill-first",n=!1,o,s){const i=IZt(s)?s.accountAllowlist:s,a=IZt(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:Goe(),sessionSoftLimit:qoe(),sessionResetToleranceMs:Xk(),useOverage:"auto"};Hoe(l.useOverage);const u=l.modelRouter,d=c.body;if(typeof d?.model!="string"||!Array.isArray(d?.messages))return RZt({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 RZt({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:w,logFinalRequest:T,buildLoggedClaudeError:_,setRoutingDecision:b}=HYr({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),_(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?pYr({ctx:c,body:d,clientRequestBody:f,tracer:g,requestStartTime:y,logProxyBody:w,logFinalRequest:T}):YYr({ctx:c,body:d,modelRouter:u,tracer:g,requestStartTime:y,accountStrategy:l.strategy,primaryAccountKey:l.primaryAccountKey,accountAllowlist:l.accountAllowlist,quotaRoutingEnabled:l.quotaRoutingEnabled,sessionSoftLimit:l.sessionSoftLimit,sessionResetToleranceMs:l.sessionResetToleranceMs,buildLoggedClaudeError:_,logProxyBody:w,logFinalRequest:T,setRoutingDecision:b})):mYr({ctx:c,body:d,route:{provider:h.provider,model:h.model},modelRouter:u,tracer:g,requestStartTime:y,logProxyBody:w})}catch(k){const A=k instanceof Error?k.message:String(k);return p.error(`[claude-proxy] Generation error for ${d.model}: ${A}`),g?.setError("generation_error",A.slice(0,500)),g?.end(502,Date.now()-y),_(502,`Generation failed: ${k instanceof Error?k.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 Tre(u);if(!d||!d.leaseSecret||!bYr(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 _Yr(d,h);const f=await SYr(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:hYt(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 Tg(c.headers);return wg(l)?l.body:{ok:!0,protocol:CYr,capabilities:kYr,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 Tg(c.headers);if(wg(l))return l.body;if(l.grant.state!=="active")return Nw(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 ZKr({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 Tg(c.headers);if(wg(l))return l.body;const u=await XKr(l.grant.id);if(u.status!=="ready")return{ok:!0,status:u.status};const d=await f8r();return{ok:!0,status:"ready",claim:nKr({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 Tg(c.headers);if(wg(l))return l.body;const u=Number(c.query?.since??0);return{ok:!0,receipts:await Sjt(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 Tg(c.headers);if(wg(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."}}:rL({consumedByYou:m,alreadyNetted:h,grantId:l.grant.id},String(d?.signature??""),u)?{ok:!0,...await _jt({grantId:l.grant.id,consumedFromPeer:m,peerAlreadyNetted:h})}:Nw("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=nJr(String(l?.note??""));if(!u)return{type:"error",error:{type:"invalid_request_error",message:"That is not a NeuroLink coin note."}};const d=await S8r();if(!l?.redeem)return{ok:!0,...await oJr(u,d)};const m=await Tg(c.headers);if(wg(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 sJr({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 Tg(c.headers);if(wg(l))return l.body;const u=a?.();return{ok:!0,...await AYr(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 ct({name:"neurolink.http.claudeProxy.listModels",tracer:Ne.http,attributes:{"http.route":`${t}/v1/models`}},async()=>CWr(l))},description:"List available models (Anthropic schema)",tags:["claude-proxy","models"]},{method:"POST",path:`${t}/v1/messages/count_tokens`,handler:async c=>ct({name:"neurolink.http.claudeProxy.countTokens",tracer:Ne.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 _a(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(Iw())return Nw("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;Hoe(l?.useOverage);const d=c.query?.snapshot==="true"||c.query?.snapshot==="1",m=c.query?.account;return ct({name:"neurolink.http.claudeProxy.limits",tracer:Ne.http,attributes:{"http.route":`${t}/limits`}},async()=>!d&&!m?(nF||(nF=zoe({accountAllowlist:u}).finally(()=>{nF=null})),nF):zoe({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=O=>!!d&&!!O&&HHt(O,d),h=c.query?.refresh==="true";h&&Hoe(l?.useOverage);let f={fetchedAt:Date.now(),snapshot:!h,results:[]},g=null;try{f=await zoe({accountAllowlist:u,snapshotOnly:!h})}catch(O){g=O instanceof Error?O.message:String(O)}const{getUsageSnapshot:y}=await Promise.resolve().then(()=>(tL(),ZHt)),w=y().stats.accounts,T=Date.now();let _={};try{_=await Mk()}catch{}const b=O=>{if(!O)return!1;const M=_[O]?.coolingUntil;return typeof M=="number"&&M>T};let k=new Map,A=null,I="";try{const{readAccountUsage:O,currentUsageDate:M}=await Promise.resolve().then(()=>(W8r(),$jt));I=M(),k=await O(I)}catch(O){A=O instanceof Error?O.message:String(O)}const R=new Map;for(const[O,M]of Object.entries(w)){const $=bJt(M.label,M.type,M.key??O).key??O,H=R.get($);(!H||M.key&&!H.key)&&R.set($,{...M,identityKey:$})}let x;try{x=await HJr()}catch{x=null}const P=[],N=new Set;for(const O of f.results){const M=O.account;N.add(O.key);const U=R.get(O.key),$=ZYr(O.quota),H=b(O.key??null);P.push({label:M,key:O.key??null,provider:O.provider,kind:"account",type:O.type??U?.type??"oauth",status:H?"cooling":uF($?.weeklyStatus)==="degraded"||uF($?.sessionStatus)==="degraded"?"exhausted":"active",cooling:H,allowed:null,expired:null,isPrimary:m(O.key??M),requests:U?U.successCount+U.errorCount:null,errors:U?.errorCount??null,rateLimits:U?.rateLimitCount??null,quotaRateLimits:U?.quotaRateLimitCount??null,quota:$?{...$,sessionHealth:uF($.sessionStatus),weeklyHealth:uF($.weeklyStatus)}:null,usage:k.get(O.key)??null})}for(const O of R.values()){const M=bJt(O.label,O.type,O.identityKey);if(M.key!==null&&N.has(M.key))continue;const U=M.provider!=="other";U&&M.key!==null&&x!==null&&!x.has(M.key)||P.push({label:O.label,key:U?M.key:null,...U?{provider:M.provider}:{},kind:U?"account":O.type==="translation"?"translation":"internal",type:M.provider==="codex"?"oauth":O.type,status:U?"unrouted":null,cooling:!1,allowed:null,expired:null,isPrimary:U?m(M.key):!1,requests:O.successCount+O.errorCount,errors:O.errorCount,rateLimits:O.rateLimitCount,quotaRateLimits:O.quotaRateLimitCount,quota:null,usage:M.key!==null?k.get(M.key)??null:null})}return{generatedAt:Date.now(),usageDate:I,quotaFromSnapshot:!h,usageError:A,quotaError:g,costBasis:"api-equivalent",accounts:P}},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 ba(e){const t=ec.get(e);if(t)return t;const r={consecutiveRefreshFailures:0,permanentlyDisabled:!1};return ec.set(e,r),r}function QYr(e){const t=ba(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 Vd(e,t,r){try{const{tokenStore:n}=await Promise.resolve().then(()=>(ig(),cre)),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 dF(e,t){t.consecutiveRefreshFailures+=1;const r=Math.min(t.consecutiveRefreshFailures-1,4),n=Math.min(CJr,bJr*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 Eu(e.key,s,i).catch(()=>{}),s}async function mF(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 pg(e.key,r).catch(()=>{})}function pF(e){return`Account(s) require re-authentication: ${Array.isArray(e)?e.join(", "):e}. Run: neurolink auth login anthropic --method oauth`}function wr(e,t=180){const r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t)}...`}function Xoe(e){const t=Math.min(Math.max(e-1,0),Roe.length-1);return Roe[t]??0}function MZt(e){const t=Math.min(Math.max(e-1,0),jYt.length-1);return PZt(jYt[t]??250)}async function _u(e){await new Promise(t=>setTimeout(t,e))}function PZt(e){return e+Math.floor(Math.random()*e*.25)}function Qk(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 bu(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=[Qk(e),n&&n!==t&&n].filter(Boolean).join(": ");return s?`${t} (${s})`:t}function DZt(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 Qoe(e){if(DZt(e))return!0;const t=Qk(e);return t!==void 0&&["ECONNREFUSED","EADDRNOTAVAIL","ENOTFOUND","EAI_AGAIN","EHOSTUNREACH","UND_ERR_CONNECT_TIMEOUT","UND_ERR_CONNECT"].includes(t)}function eZr(e){const t=Qk(e);return t==="ENOTFOUND"||t==="EAI_AGAIN"?"shared_provider_transport":"connection_transport"}var tZr=new Set([408,500,502,503,504,520,521,522,523,524,525,526,529]);function Cu(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 rZr(e,t){return e===422?!0:Cu(t).errorType==="invalid_request_error"||t.includes("invalid_request_error")}function nZr(e,t){if(e!==404)return!1;const r=Cu(t);return r.errorType==="not_found_error"&&(r.message??"").toLowerCase().includes("model")}function oZr(e,t){if(e!==400)return!1;const r=Cu(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 OZt=new Set(["oauth_not_allowed_for_organization","oauth_not_allowed","organization_disabled"]);function ese(e,t){if(e!==401&&e!==402&&e!==403)return!1;const r=Cu(t);return r.errorType==="permission_error"?!0:r.errorCode!==void 0&&OZt.has(r.errorCode)}function NZt(e,t){if(!ese(e,t))return!1;const r=Cu(t);return r.errorCode!==void 0&&OZt.has(r.errorCode)}function sZr(e){return{...e,messages:e.messages.map(t=>typeof t.content!="string"?t:{...t,content:[{type:"text",text:t.content}]})}}var LZt=roe;function FZt(e,t){if(tZr.has(e))return!0;if(e!==400)return!1;const r=Cu(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 iZr(e,t){return e===529||Cu(t).errorType==="overloaded_error"}var aZr=500;function eA(e){return $n(e,aZr)}ar(),B();var cZr=55669,lZr="generateContent",$Zt="streamGenerateContent";function uZr(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 dZr(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 mZr(e,t="",r=cZr,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}=uZr(o.path);if(!a||c!==lZr&&c!==$Zt)return Zne(404,`Unsupported Gemini endpoint: ${o.path}`,"NOT_FOUND");const l=o.body;if(!l||!Array.isArray(l.contents)||l.contents.length===0)return Zne(400,"Request must include a non-empty 'contents' array");const u=c===$Zt,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=LVr(h,l,u),g=dZr(f),w=Uw({provider:m??"auto",model:h},s?.getFallbackChain()??[],a,g,s?.isAutoFallbackEnabled?.()??!1).attempts;let T;try{T=uoe.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),T.setMode("full")}catch{}try{return u?await ooe({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:w,tracer:T,requestStartTime:i}):await soe({ctx:o,format:"gemini",requestModel:a,parsed:f,attempts:w,tracer:T,requestStartTime:i})}catch(_){const b=_ instanceof Error?_.message:String(_),k=$n(b);return p.always(`[proxy:gemini] request failed: ${k}`),T?.setError("generation_error",k),T?.end(500,Date.now()-i),Zne(500,"Internal proxy error","INTERNAL")}}}]}}Rr(),sr();function tse(e,t,r){return n=>ct({name:e,tracer:Ne.http,attributes:{"http.route":t,"http.request.id":n.requestId??""}},()=>r(n))}function UZt(e="/api"){return{prefix:`${e}/health`,routes:[{method:"GET",path:`${e}/health`,handler:tse("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:tse("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=>ct({name:"neurolink.http.health.ready",tracer:Ne.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=>ct({name:"neurolink.http.health.startup",tracer:Ne.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=>ct({name:"neurolink.http.health.detailed",tracer:Ne.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:tse("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"]}]}}Qr(),ar(),B();var BZt=300*1e3,pZr=55669;function hZr(e){return e?{status:502,errorType:"loopback_stream_error",errorMessage:e}:{status:499,errorType:"client_cancelled",errorMessage:"Client cancelled the OpenAI-compatible stream"}}function tA(e,t){return new Response(JSON.stringify(GVr(e,t)),{status:e,headers:{"content-type":"application/json"}})}function fZr(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}}async function gZr(e){const{ctx:t,body:r,targetModel:n,requestStartTime:o,loopbackPort:s}=e,i=r.stream===!0,a=r.tools?.length??0,c=(f,g={})=>Sp({timestamp:new Date().toISOString(),requestId:t.requestId,method:t.method,path:t.path,model:r.model,stream:i,toolCount:a,account:"",accountType:"openai-bridge",...Pw(t.headers),responseStatus:f,responseTimeMs:Date.now()-o,...g}),l=qVr(r);l.model=n;const u=`http://127.0.0.1:${s}/v1/messages`,d={"content-type":"application/json",accept:i?"text/event-stream":"application/json"};for(const[f,g]of Object.entries(t.headers)){if(typeof g!="string")continue;const y=f.toLowerCase();(y.startsWith("anthropic-")||y==="x-api-key")&&(d[y]=g)}const m=await Mt(fetch(u,{method:"POST",headers:d,body:JSON.stringify({...l,stream:i})}),BZt,`Anthropic loopback timed out after ${BZt}ms`);if(!m.ok){const f=await m.text().catch(()=>""),g=$n(f);return p.always(`[proxy:openai] anthropic loopback error ${m.status}: ${g}`),await c(m.status,{errorType:"loopback_upstream_error",errorMessage:g}),tA(m.status,g||`Anthropic loopback failed with status ${m.status}`)}if(i){if(!m.body)return await c(502,{errorType:"loopback_empty_stream",errorMessage:"Anthropic loopback returned empty stream body"}),tA(502,"Anthropic loopback returned empty stream body");let f;const y=m.body.pipeThrough(jVr(r.model,{onError:b=>{f=$n(b)}})).getReader();let w=!1;const T=async(b,k,A)=>{w||(w=!0,await c(b,{errorType:k,errorMessage:A}))},_=new ReadableStream({async pull(b){try{const{value:k,done:A}=await y.read();if(A){f?await T(502,"loopback_stream_error",f):await T(200),b.close();return}b.enqueue(k)}catch(k){const A=$n(k instanceof Error?k.message:String(k));await T(502,"loopback_stream_error",A),b.error(k)}},async cancel(b){try{await y.cancel(b)}finally{const k=hZr(f);await T(k.status,k.errorType,k.errorMessage)}}});return new Response(_,{status:200,headers:{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"}})}const h=await m.json();return await c(200,{inputTokens:h.usage?.input_tokens,outputTokens:h.usage?.output_tokens,cacheCreationTokens:h.usage?.cache_creation_input_tokens,cacheReadTokens:h.usage?.cache_read_input_tokens}),HVr(h,r.model)}function yZr(e,t="",r=pZr,n){return{prefix:`${t}/v1`,routes:[{method:"POST",path:`${t}/v1/chat/completions`,description:"OpenAI-compatible chat completions (translation mode)",handler:async o=>{const s=n?n().modelRouter:e,i=Date.now(),a=o.body;if(!a||!a.model||!a.messages?.length)return tA(400,"Request must include 'model' and 'messages' fields");const c=s?s.resolve(a.model):{provider:null,model:a.model},l=c.provider??void 0,u=c.model??a.model;if(p.debug(`[proxy:openai] ${a.model} \u2192 ${l??"auto"}/${u}`),c.provider==="anthropic")try{return await gZr({ctx:o,body:a,targetModel:u,requestStartTime:i,loopbackPort:r})}catch(y){const w=y instanceof Error?y.message:String(y),T=$n(w);return p.always(`[proxy:openai] anthropic loopback failed: ${T}`),await Sp({timestamp:new Date().toISOString(),requestId:o.requestId,method:o.method,path:o.path,model:a.model,stream:a.stream===!0,toolCount:a.tools?.length??0,account:"",accountType:"openai-bridge",responseStatus:502,responseTimeMs:Date.now()-i,errorType:"loopback_exception",errorMessage:T}),tA(502,"Anthropic loopback failed")}const d=BVr(a),m=fZr(d),f=Uw({provider:l??"auto",model:u},s?.getFallbackChain()??[],a.model,m,s?.isAutoFallbackEnabled?.()??!1).attempts;let g;try{g=uoe.startRequest({requestId:o.requestId,method:o.method,path:o.path,model:a.model,stream:a.stream===!0,toolCount:Object.keys(d.tools).length,clientApp:"openai-compat",userAgent:o.headers["user-agent"]??"",provider:l??"openai-compatible"},o.headers),g.setMode("full")}catch{}try{return a.stream?ooe({ctx:o,format:"openai",requestModel:a.model,parsed:d,attempts:f,tracer:g,requestStartTime:i}):await soe({ctx:o,format:"openai",requestModel:a.model,parsed:d,attempts:f,tracer:g,requestStartTime:i})}catch(y){const w=y instanceof Error?y.message:String(y),T=$n(w);return p.always(`[proxy:openai] request failed: ${T}`),g?.setError("generation_error",T),g?.end(500,Date.now()-i),tA(500,"Internal proxy error")}}},{method:"GET",path:`${t}/v1/models`,description:"List available models in OpenAI format",handler:async()=>{const o=n?n().modelRouter:e;return bWr(o)}}]}}Wt(),Vr(),Rr(),sr(),Pd();function Eg(e,t,r){return n=>ct({name:e,tracer:Ne.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:De.ERROR,message:a})}}return s})}var vZr=D.object({name:D.string().min(1,"Server name is required"),toolName:D.string().min(1,"Tool name is required")});async function wZr(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 TZr(e){const t=Tl(ow,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return $t("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);if(!n.listServers().find(u=>u.name===r))return $t("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 EZr(e){const t=Tl(ow,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return $t("MCP_UNAVAILABLE","External server manager not available",void 0,e.requestId);try{if(!n.listServers().find(c=>c.name===r))return $t("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 $t("RECONNECT_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function SZr(e){const t=Tl(ow,e.params,e.requestId);if(!t.success)return t.error;const{name:r}=t.data,n=e.externalServerManager;if(!n)return $t("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}}:$t("REMOVE_FAILED",o.error||"Failed to remove server",void 0,e.requestId)}catch(o){return $t("REMOVE_FAILED",o instanceof Error?o.message:String(o),void 0,e.requestId)}}async function _Zr(e){const t=Tl(ow,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 $t("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 bZr(e){const t=Tl(vZr,e.params,e.requestId);if(!t.success)return t.error;const{name:r,toolName:n}=t.data,o=fu(VN,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}}:$t("TOOL_NOT_FOUND",`Tool '${n}' not found on server '${r}'`,void 0,e.requestId)}catch(a){return $t("EXECUTION_FAILED",a instanceof Error?a.message:String(a),{duration:Date.now()-i},e.requestId)}}async function CZr(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 zZt(e="/api"){return{prefix:`${e}/mcp`,routes:[{method:"GET",path:`${e}/mcp/servers`,handler:Eg("neurolink.http.mcp.listServers",`${e}/mcp/servers`,wZr),description:"List all MCP servers",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name`,handler:Eg("neurolink.http.mcp.getServer",`${e}/mcp/servers/:name`,TZr),description:"Get MCP server status",tags:["mcp"]},{method:"POST",path:`${e}/mcp/servers/:name/reconnect`,handler:Eg("neurolink.http.mcp.reconnectServer",`${e}/mcp/servers/:name/reconnect`,EZr),description:"Reconnect to an MCP server",tags:["mcp"]},{method:"DELETE",path:`${e}/mcp/servers/:name`,handler:Eg("neurolink.http.mcp.removeServer",`${e}/mcp/servers/:name`,SZr),description:"Remove an MCP server",tags:["mcp"]},{method:"GET",path:`${e}/mcp/servers/:name/tools`,handler:Eg("neurolink.http.mcp.listServerTools",`${e}/mcp/servers/:name/tools`,_Zr),description:"List tools from a specific MCP server",tags:["mcp","tools"]},{method:"POST",path:`${e}/mcp/servers/:name/tools/:toolName/execute`,handler:Eg("neurolink.http.mcp.executeTool",`${e}/mcp/servers/:name/tools/:toolName/execute`,bZr),description:"Execute a tool from a specific MCP server",tags:["mcp","tools"]},{method:"GET",path:`${e}/mcp/health`,handler:Eg("neurolink.http.mcp.health",`${e}/mcp/health`,CZr),description:"Health check for all MCP servers",tags:["mcp","health"]}]}}Rr(),sr(),Pd();function Sg(e,t,r){return n=>ct({name:e,tracer:Ne.http,attributes:{"http.route":t,"http.request.id":n.requestId}},()=>r(n))}async function kZr(e){const t=Tl(Xte,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 $t("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 $t("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 $t("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 $t("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 $t("MEMORY_ERROR",c instanceof Error?c.message:"Failed to get session messages",void 0,e.requestId)}}async function AZr(e){const t=Tl(Xte,e.params,e.requestId);if(!t.success)return t.error;const{id:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return $t("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?$t("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}}:$t("SESSION_NOT_FOUND",`Session '${r}' not found`,void 0,e.requestId)}return $t("MEMORY_ERROR","Session retrieval not supported for this memory type",void 0,e.requestId)}catch(o){return $t("MEMORY_ERROR",o instanceof Error?o.message:"Failed to get session",void 0,e.requestId)}}async function xZr(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 $t("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 $t("MEMORY_ERROR",a instanceof Error?a.message:"Failed to list sessions",void 0,e.requestId)}}async function IZr(e){const t=e.neurolink.conversationMemory;if(!t)return $t("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 $t("MEMORY_ERROR",r instanceof Error?r.message:"Failed to get statistics",void 0,e.requestId)}}async function RZr(e){const t=Tl(Zte,e.params,e.requestId);if(!t.success)return t.error;const{sessionId:r}=t.data,n=e.neurolink.conversationMemory;if(!n)return $t("MEMORY_UNAVAILABLE","Conversation memory not available",void 0,e.requestId);try{return await n.clearSession?.(r)===!1?$t("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 $t("MEMORY_ERROR",o instanceof Error?o.message:"Failed to clear session",void 0,e.requestId)}}async function MZr(e){const t=e.neurolink.conversationMemory;if(!t)return $t("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 $t("MEMORY_ERROR",r instanceof Error?r.message:"Failed to clear sessions",void 0,e.requestId)}}async function PZr(e){const t=e.neurolink.conversationMemory;return{available:!!t,type:t?.constructor.name||"none",timestamp:new Date().toISOString()}}function GZt(e="/api"){return{prefix:`${e}/memory`,routes:[{method:"GET",path:`${e}/memory/sessions/:id/messages`,handler:Sg("neurolink.http.memory.getSessionMessages",`${e}/memory/sessions/:id/messages`,kZr),description:"Get messages for a session",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions/:id`,handler:Sg("neurolink.http.memory.getSession",`${e}/memory/sessions/:id`,AZr),description:"Get session by ID",tags:["memory"]},{method:"GET",path:`${e}/memory/sessions`,handler:Sg("neurolink.http.memory.listSessions",`${e}/memory/sessions`,xZr),description:"List all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/stats`,handler:Sg("neurolink.http.memory.stats",`${e}/memory/stats`,IZr),description:"Get memory statistics",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions/:sessionId`,handler:Sg("neurolink.http.memory.clearSession",`${e}/memory/sessions/:sessionId`,RZr),description:"Clear a conversation session",tags:["memory"]},{method:"DELETE",path:`${e}/memory/sessions`,handler:Sg("neurolink.http.memory.clearAllSessions",`${e}/memory/sessions`,MZr),description:"Clear all conversation sessions",tags:["memory"]},{method:"GET",path:`${e}/memory/health`,handler:Sg("neurolink.http.memory.health",`${e}/memory/health`,PZr),description:"Check memory system health",tags:["memory","health"]}]}}B(),Rr(),sr();function DZr(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()=>ct({name:"neurolink.http.openapi.json",tracer:Ne.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 Rk({basePath:e,routes:n}).generate()}),description:"Get OpenAPI specification as JSON",tags:["openapi","documentation"]},{method:"GET",path:`${e}/openapi.yaml`,handler:async()=>ct({name:"neurolink.http.openapi.yaml",tracer:Ne.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 Rk({basePath:e,routes:n}).toYAML()}}),description:"Get OpenAPI specification as YAML",tags:["openapi","documentation"]},{method:"GET",path:`${e}/docs`,handler:async()=>ct({name:"neurolink.http.openapi.docs",tracer:Ne.http,attributes:{"http.route":`${e}/docs`}},async()=>({_raw:!0,contentType:"text/html",body:`<!DOCTYPE html>
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* in the native Codex proxy handler so fallback traffic follows the same pool
|
|
7
7
|
* rules as a native Codex request.
|
|
8
8
|
*/
|
|
9
|
-
import type { ClaudeRequest, CodexFallbackResult, CodexResponsesRequest } from "../types/index.js";
|
|
9
|
+
import type { ClaudeRequest, CodexFallbackResult, CodexReasoningEffort, CodexResponsesRequest } from "../types/index.js";
|
|
10
10
|
export declare class CodexFallbackResponseError extends Error {
|
|
11
11
|
readonly status: number;
|
|
12
12
|
readonly responseBody: string;
|
|
13
13
|
constructor(status: number, responseBody: string);
|
|
14
14
|
}
|
|
15
15
|
/** Convert a Claude Messages request into the ChatGPT Codex Responses shape. */
|
|
16
|
-
export declare function convertClaudeRequestToCodex(body: ClaudeRequest, model: string): CodexResponsesRequest;
|
|
16
|
+
export declare function convertClaudeRequestToCodex(body: ClaudeRequest, model: string, reasoningEffort?: CodexReasoningEffort): CodexResponsesRequest;
|
|
17
17
|
/**
|
|
18
18
|
* Parse a complete Codex Responses SSE stream before emitting Claude output.
|
|
19
19
|
*
|
|
@@ -131,7 +131,7 @@ function convertClaudeMessage(role, content) {
|
|
|
131
131
|
return input;
|
|
132
132
|
}
|
|
133
133
|
/** Convert a Claude Messages request into the ChatGPT Codex Responses shape. */
|
|
134
|
-
export function convertClaudeRequestToCodex(body, model) {
|
|
134
|
+
export function convertClaudeRequestToCodex(body, model, reasoningEffort) {
|
|
135
135
|
const input = body.messages.flatMap((message) => convertClaudeMessage(message.role, message.content));
|
|
136
136
|
const request = {
|
|
137
137
|
model,
|
|
@@ -139,6 +139,9 @@ export function convertClaudeRequestToCodex(body, model) {
|
|
|
139
139
|
stream: true,
|
|
140
140
|
// ChatGPT's backend rejects requests unless this is explicitly false.
|
|
141
141
|
store: false,
|
|
142
|
+
...(reasoningEffort !== undefined
|
|
143
|
+
? { reasoning: { effort: reasoningEffort } }
|
|
144
|
+
: {}),
|
|
142
145
|
};
|
|
143
146
|
const instructions = buildSystemInstructions(body);
|
|
144
147
|
if (instructions) {
|
|
@@ -189,6 +189,18 @@ function applyAccountDefaults(account) {
|
|
|
189
189
|
metadata: account.metadata,
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
|
+
const CODEX_REASONING_EFFORTS = [
|
|
193
|
+
"none",
|
|
194
|
+
"minimal",
|
|
195
|
+
"low",
|
|
196
|
+
"medium",
|
|
197
|
+
"high",
|
|
198
|
+
"xhigh",
|
|
199
|
+
"max",
|
|
200
|
+
];
|
|
201
|
+
function isCodexReasoningEffort(value) {
|
|
202
|
+
return CODEX_REASONING_EFFORTS.some((effort) => effort === value);
|
|
203
|
+
}
|
|
192
204
|
/**
|
|
193
205
|
* Validate the shape of a parsed proxy config.
|
|
194
206
|
* Returns an array of human-readable error strings (empty = valid).
|
|
@@ -215,6 +227,28 @@ export function validateProxyConfig(config) {
|
|
|
215
227
|
}
|
|
216
228
|
if (hasRouting) {
|
|
217
229
|
const routing = cfg.routing;
|
|
230
|
+
const rawFallback = routing["fallback-chain"] ?? routing.fallbackChain;
|
|
231
|
+
if (Array.isArray(rawFallback)) {
|
|
232
|
+
rawFallback.forEach((entry, index) => {
|
|
233
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const fallback = entry;
|
|
237
|
+
const effort = fallback["reasoning-effort"] !== undefined
|
|
238
|
+
? fallback["reasoning-effort"]
|
|
239
|
+
: fallback.reasoningEffort;
|
|
240
|
+
if (effort === undefined) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const field = `routing.fallback-chain[${index}].reasoning-effort`;
|
|
244
|
+
if (!isCodexReasoningEffort(effort)) {
|
|
245
|
+
errors.push(`${field} must be one of: ${CODEX_REASONING_EFFORTS.join(", ")}`);
|
|
246
|
+
}
|
|
247
|
+
if (String(fallback.provider ?? "").trim() !== "codex") {
|
|
248
|
+
errors.push(`${field} is only supported for provider codex`);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
218
252
|
const rawAccountAllowlist = routing["account-allowlist"] ?? routing.accountAllowlist;
|
|
219
253
|
if (rawAccountAllowlist !== undefined) {
|
|
220
254
|
if (!Array.isArray(rawAccountAllowlist)) {
|
|
@@ -350,7 +384,7 @@ function warnPlaintextApiKeys(accounts) {
|
|
|
350
384
|
* Extracts:
|
|
351
385
|
* - `strategy` ("round-robin" | "fill-first")
|
|
352
386
|
* - `model-mappings` / `modelMappings` — array of {from, to, provider}
|
|
353
|
-
* - `fallback-chain` / `fallbackChain` — array of {provider, model}
|
|
387
|
+
* - `fallback-chain` / `fallbackChain` — array of {provider, model, reasoningEffort?}
|
|
354
388
|
* - `auto-fallback` / `autoFallback` — opt in to an unspecified provider
|
|
355
389
|
* - `max-inflight-per-account` / `maxInflightPerAccount` — concurrency cap
|
|
356
390
|
* - `passthroughModels` / `passthrough-models` — array of model IDs
|
|
@@ -404,7 +438,16 @@ function parseRoutingConfig(raw) {
|
|
|
404
438
|
logger.warn(`[proxy-config] Skipping fallback entry with empty "provider" or "model": ${JSON.stringify(e)}`);
|
|
405
439
|
return null;
|
|
406
440
|
}
|
|
407
|
-
|
|
441
|
+
const effort = e["reasoning-effort"] !== undefined
|
|
442
|
+
? e["reasoning-effort"]
|
|
443
|
+
: e.reasoningEffort;
|
|
444
|
+
return {
|
|
445
|
+
provider,
|
|
446
|
+
model,
|
|
447
|
+
...(isCodexReasoningEffort(effort)
|
|
448
|
+
? { reasoningEffort: effort }
|
|
449
|
+
: {}),
|
|
450
|
+
};
|
|
408
451
|
})
|
|
409
452
|
.filter((e) => e !== null);
|
|
410
453
|
}
|
|
@@ -35,6 +35,9 @@ export function buildProxyTranslationPlan(primary, fallbackChain, requestedModel
|
|
|
35
35
|
attempts.push({
|
|
36
36
|
provider: fallback.provider,
|
|
37
37
|
model: fallback.model,
|
|
38
|
+
...(fallback.reasoningEffort !== undefined
|
|
39
|
+
? { reasoningEffort: fallback.reasoningEffort }
|
|
40
|
+
: {}),
|
|
38
41
|
label: `${fallback.provider}/${fallback.model}`,
|
|
39
42
|
});
|
|
40
43
|
}
|
|
@@ -3628,7 +3628,7 @@ async function executeClaudeFallbackWithRetry(args) {
|
|
|
3628
3628
|
* output guarantee when Codex returns an incomplete stream.
|
|
3629
3629
|
*/
|
|
3630
3630
|
async function executeClaudeCodexFallback(args) {
|
|
3631
|
-
const { ctx, body, model, tracer, requestStartTime, logProxyBody, logFinalRequest, } = args;
|
|
3631
|
+
const { ctx, body, model, reasoningEffort, tracer, requestStartTime, logProxyBody, logFinalRequest, } = args;
|
|
3632
3632
|
const codexCtx = {
|
|
3633
3633
|
...ctx,
|
|
3634
3634
|
requestId: `${ctx.requestId}:codex-fallback`,
|
|
@@ -3640,7 +3640,7 @@ async function executeClaudeCodexFallback(args) {
|
|
|
3640
3640
|
},
|
|
3641
3641
|
query: {},
|
|
3642
3642
|
params: {},
|
|
3643
|
-
body: convertClaudeRequestToCodex(body, model),
|
|
3643
|
+
body: convertClaudeRequestToCodex(body, model, reasoningEffort),
|
|
3644
3644
|
metadata: { ...ctx.metadata, "neurolink.codexFallback": true },
|
|
3645
3645
|
// Keep the child attribution isolated until its stream has passed
|
|
3646
3646
|
// validation. A failed Codex attempt must not look like a served request.
|
|
@@ -3827,7 +3827,7 @@ async function tryConfiguredClaudeFallbackChain(args) {
|
|
|
3827
3827
|
}
|
|
3828
3828
|
const fallbackStart = Date.now();
|
|
3829
3829
|
try {
|
|
3830
|
-
logger.always(`[proxy] fallback → ${fallback.provider}/${fallback.model}`);
|
|
3830
|
+
logger.always(`[proxy] fallback → ${fallback.provider}/${fallback.model}${fallback.reasoningEffort ? ` reasoning=${fallback.reasoningEffort}` : ""}`);
|
|
3831
3831
|
let response;
|
|
3832
3832
|
if (fallback.provider === "codex") {
|
|
3833
3833
|
// Codex is a local OAuth account pool, not a generic SDK provider.
|
|
@@ -3836,6 +3836,7 @@ async function tryConfiguredClaudeFallbackChain(args) {
|
|
|
3836
3836
|
ctx,
|
|
3837
3837
|
body,
|
|
3838
3838
|
model: fallback.model,
|
|
3839
|
+
reasoningEffort: fallback.reasoningEffort,
|
|
3839
3840
|
tracer,
|
|
3840
3841
|
requestStartTime,
|
|
3841
3842
|
logProxyBody,
|
package/dist/types/codex.d.ts
CHANGED
|
@@ -138,12 +138,17 @@ export type CodexResponsesInputItem = {
|
|
|
138
138
|
call_id: string;
|
|
139
139
|
output: string;
|
|
140
140
|
};
|
|
141
|
+
/** Codex reasoning settings; supported levels depend on the selected model. */
|
|
142
|
+
export type CodexReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
141
143
|
/** Request shape used to bridge Anthropic Messages traffic to Codex Responses. */
|
|
142
144
|
export type CodexResponsesRequest = {
|
|
143
145
|
model: string;
|
|
144
146
|
input: CodexResponsesInputItem[];
|
|
145
147
|
stream: true;
|
|
146
148
|
store: false;
|
|
149
|
+
reasoning?: {
|
|
150
|
+
effort: CodexReasoningEffort;
|
|
151
|
+
};
|
|
147
152
|
instructions?: string;
|
|
148
153
|
tools?: Array<{
|
|
149
154
|
type: "function";
|
package/dist/types/proxy.d.ts
CHANGED
|
@@ -1392,6 +1392,7 @@ export type ClaudeProxyModelTier = "opus" | "sonnet" | "haiku" | "other";
|
|
|
1392
1392
|
export type ProxyTranslationAttempt = {
|
|
1393
1393
|
provider?: string;
|
|
1394
1394
|
model?: string;
|
|
1395
|
+
reasoningEffort?: FallbackEntry["reasoningEffort"];
|
|
1395
1396
|
label: string;
|
|
1396
1397
|
};
|
|
1397
1398
|
/** Ordered plan of provider attempts for a proxy request. */
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* and usage tracking for Anthropic API access.
|
|
6
6
|
*/
|
|
7
7
|
import type { StoredOAuthTokens } from "./auth.js";
|
|
8
|
+
import type { CodexReasoningEffort } from "./codex.js";
|
|
8
9
|
export type { StoredOAuthTokens, TokenRefresher, TokenStorageData, StoredProviderTokens, } from "./auth.js";
|
|
9
10
|
/**
|
|
10
11
|
* Claude subscription tier levels
|
|
@@ -979,6 +980,8 @@ export type ModelMapping = {
|
|
|
979
980
|
export type FallbackEntry = {
|
|
980
981
|
provider: string;
|
|
981
982
|
model: string;
|
|
983
|
+
/** Explicit Codex fallback effort. Omit to use the upstream default. */
|
|
984
|
+
reasoningEffort?: CodexReasoningEffort;
|
|
982
985
|
};
|
|
983
986
|
/** Full proxy routing config */
|
|
984
987
|
export type ProxyRoutingConfig = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "12.12.
|
|
3
|
+
"version": "12.12.4",
|
|
4
4
|
"packageManager": "pnpm@10.15.1",
|
|
5
5
|
"description": "TypeScript AI SDK with 24+ LLM providers behind one consistent API. MCP-native (connect any MCP server), voice TTS/STT/realtime, RAG, agents, memory, context compaction. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · DeepSeek · NVIDIA NIM and more.",
|
|
6
6
|
"author": {
|