@wengine-ai/llms 2.2.0 → 2.2.1

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.
@@ -71,7 +71,7 @@ ${this.toMarkdown(o,n+1)}`:`${r}- ${o}`).join(`
71
71
  ${this.toMarkdown(s,n+1)}`:`${r}${o}: ${s}`).join(`
72
72
  `):`${r}${e}`}async output(e,n={}){try{let r=this.formatData(e,n);switch(this.config.level||"log"){case"info":console.info(r);break;case"warn":console.warn(r);break;case"error":console.error(r);break;case"debug":console.debug(r);break;case"log":default:console.log(r);break}return!0}catch(r){return console.error("[ConsoleOutputHandler] Output failed:",r),!1}}}});var Os,vf=Le(()=>{"use strict";Os=class{type="webhook";config;defaultTimeout=3e4;constructor(e){if(!e.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...e}}buildHeaders(){let e={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(e.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let n=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${n}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,n){let{format:r="json",timestamp:o=!0,prefix:s,metadata:a}=n||{},c={data:e};return o&&(c.timestamp=new Date().toISOString()),s&&(c.prefix=s),a&&Object.keys(a).length>0&&(c.metadata=a),c}async sendRequest(e,n,r,o,s){let a=new AbortController,c=setTimeout(()=>a.abort(),s);try{let l=await fetch(e,{method:n,headers:r,body:JSON.stringify(o),signal:a.signal});if(clearTimeout(c),!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);return l}catch(l){throw clearTimeout(c),l}}delay(e){return new Promise(n=>setTimeout(n,e))}async sendWithRetry(e,n,r,o,s,a){let c=null;for(let l=1;l<=a.maxAttempts;l++)try{return await this.sendRequest(e,n,r,o,s)}catch(d){if(c=d,l===a.maxAttempts)break;let f=a.backoffMs*Math.pow(2,l-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${l}/${a.maxAttempts}), retrying in ${f}ms...`,d.message),await this.delay(f)}throw c}async output(e,n={}){let r=n.timeout||this.defaultTimeout;try{let o=this.buildHeaders(),s=this.buildBody(e,n),a=await this.sendWithRetry(this.config.url,this.config.method,o,s,r,this.config.retry);return!0}catch(o){let s=o instanceof Error?o.message:String(o);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});var To,Tf,S_,Ps,Df=Le(()=>{"use strict";To=require("fs"),Tf=require("path"),S_=require("os"),Ps=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let n=(0,S_.tmpdir)();this.baseDir=(0,Tf.join)(n,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,To.existsSync)(this.baseDir)||(0,To.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let n=e.match(/_session_([a-f0-9-]+)/i);return n?n[1]:null}catch{return null}}getFilePath(e){let n=this.config.prefix||"session",r=this.config.extension?`.${this.config.extension}`:"",o;if(this.config.includeTimestamp){let s=Date.now();o=`${n}-${e}-${s}${r}`}else o=`${n}-${e}${r}`;return(0,Tf.join)(this.baseDir,o)}async output(e,n={}){try{let r=n.metadata?.sessionId;if(!r)return!1;let o={...e,timestamp:Date.now(),sessionId:r},s=this.getFilePath(r);return(0,To.writeFileSync)(s,JSON.stringify(o,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}});var Rf,Do,v_=Le(()=>{"use strict";Sf();vf();Df();Rf=class{handlers=new Map;defaultOptions={};registerHandler(e,n){this.handlers.set(e,n)}registerHandlers(e){for(let n of e)if(n.enabled!==!1)try{let r=this.createHandler(n),o=n.type+"_"+Date.now();this.registerHandler(o,r)}catch(r){console.error(`[OutputManager] Failed to register ${n.type} handler:`,r)}}createHandler(e){switch(e.type){case"console":return new xs(e.config);case"webhook":return new Os(e.config);case"temp-file":return new Ps(e.config);default:throw new Error(`Unknown output handler type: ${e.type}`)}}unregisterHandler(e){return this.handlers.delete(e)}getHandler(e){return this.handlers.get(e)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}getDefaultOptions(){return{...this.defaultOptions}}async output(e,n){let r={...this.defaultOptions,...n},o={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,c])=>{try{await c.output(e,r)?o.success.push(a):o.failed.push(a)}catch(l){console.error(`[OutputManager] Handler ${a} failed:`,l),o.failed.push(a)}});return await Promise.all(s),o}async outputTo(e,n,r){let o={...this.defaultOptions,...r},s={success:[],failed:[]},a=e.map(async c=>{let l=this.handlers.get(c);if(!l){console.warn(`[OutputManager] Handler ${c} not found`),s.failed.push(c);return}try{await l.output(n,o)?s.success.push(c):s.failed.push(c)}catch(d){console.error(`[OutputManager] Handler ${c} failed:`,d),s.failed.push(c)}});return await Promise.all(a),s}async outputToType(e,n,r){let o=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(o,n,r)}},Do=new Rf});var fR={};ci(fR,{ActiveProbeService:()=>Ds,ConfigService:()=>pr,ProviderHealthStore:()=>$o,ProviderService:()=>gr,SSEParserTransform:()=>xr,SSESerializerTransform:()=>Rs,TokenizerService:()=>Rr,TransformerService:()=>Dr,calculateTokenCount:()=>Ac,default:()=>dR,getActiveProbeService:()=>bf,getAllQuotaResults:()=>wp,getAllRateLimitInfo:()=>yp,getHealthStore:()=>Je,getQuotaAdapter:()=>Eu,getQuotaResult:()=>wi,getRateLimitInfo:()=>gp,getRuntimeDebugLog:()=>tp,initProviderHealthPersistence:()=>yi,initQuotaStorePersistence:()=>Ei,initRateLimitPersistence:()=>_i,pluginManager:()=>wf,resetActiveProbeService:()=>b_,rewriteStream:()=>Af,router:()=>Yr,searchProjectBySession:()=>Sc,sessionUsageCache:()=>bi,setRuntimeDebugLog:()=>ep,startActiveProbe:()=>ku,stopActiveProbe:()=>Au,storeQuotaResult:()=>Ci,tokenSpeedPlugin:()=>Of});module.exports=Bh(fR);var x_=Pe(require("fastify"),1),O_=Pe(require("@fastify/cors"),1);var jo=require("fs"),uc=require("path"),Jh=require("dotenv"),Vh=Pe(ac(),1),pr=class{config={};options;constructor(e={jsonPath:"./config.json"}){this.options={envPath:e.envPath||".env",jsonPath:e.jsonPath,useEnvFile:!1,useJsonFile:e.useJsonFile!==!1,useEnvironmentVariables:e.useEnvironmentVariables!==!1,...e},this.loadConfig()}loadConfig(){this.options.useJsonFile&&this.options.jsonPath&&this.loadJsonConfig(),this.options.initialConfig&&(this.config={...this.config,...this.options.initialConfig}),this.options.useEnvFile&&this.loadEnvConfig(),this.config.LOG_FILE&&(process.env.LOG_FILE=this.config.LOG_FILE),this.config.LOG&&(process.env.LOG=this.config.LOG)}loadJsonConfig(){if(!this.options.jsonPath)return;let e=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,uc.join)(process.cwd(),this.options.jsonPath);if((0,jo.existsSync)(e))try{let n=(0,jo.readFileSync)(e,"utf-8"),r=Vh.default.parse(n);this.config={...this.config,...r},console.log(`Loaded JSON config from: ${e}`)}catch(n){console.warn(`Failed to load JSON config from ${e}:`,n)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,uc.join)(process.cwd(),this.options.envPath);if((0,jo.existsSync)(e))try{let n=(0,Jh.config)({path:e});n.parsed&&(this.config={...this.config,...this.parseEnvConfig(n.parsed)})}catch(n){console.warn(`Failed to load .env config from ${e}:`,n)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let n={};return Object.assign(n,e),n}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,n){let r=this.config[e];return r!==void 0?r:n}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(e){return this.config[e]!==void 0}set(e,n){this.config[e]=n}reload(){this.config={},this.loadConfig()}getConfigSummary(){let e=[];return this.options.initialConfig&&e.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&e.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&e.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&e.push("Environment Variables"),`Config sources: ${e.join(", ")}`}};function ze(t,e=500,n="internal_error",r="api_error"){let o=new Error(t);return o.statusCode=e,o.code=n,o.type=r,o}async function Kh(t,e,n){e.log.error(t);let r=t.statusCode||500;if(t.rawBody)try{let s=JSON.parse(t.rawBody);return n.code(r).send(s)}catch{return n.code(r).send(t.rawBody)}let o={error:{message:t.message+(t.stack||"Internal Server Error"),type:t.type||"api_error",code:t.code||"internal_error"}};return n.code(r).send(o)}var Yh=require("undici");function Qh(t,e,n,r,o){let s=new Headers({"Content-Type":"application/json"});n.headers&&Object.entries(n.headers).forEach(([d,f])=>{f&&s.set(d,f)});let a,c=AbortSignal.timeout(n.TIMEOUT??60*1e3*60);if(n.signal){let d=new AbortController,f=()=>d.abort();n.signal.addEventListener("abort",f),c.addEventListener("abort",f),a=d.signal}else a=c;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:a};return n.httpsProxy&&(l.dispatcher=new Yh.ProxyAgent(new URL(n.httpsProxy).toString())),o?.debug({reqId:r.req.id,request:l,headers:Object.fromEntries(s.entries()),requestUrl:typeof t=="string"?t:t.toString(),useProxy:n.httpsProxy},"final request"),fetch(typeof t=="string"?t:t.toString(),l)}var vC=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Wr={maxBodyLength:4096,maxStreamChunks:100},cc=!1;function ep(t){cc=t}function tp(){return cc}function pi(t){return cc||t.get("DEBUG_LOG")===!0}function np(t){let e=t.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Wr:{maxBodyLength:e.maxBodyLength??Wr.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Wr.maxStreamChunks}}function rp(t){let e={};for(let[n,r]of Object.entries(t))vC.has(n.toLowerCase())?e[n]="***MASKED***":e[n]=r;return e}function mi(t,e){return t.length<=e?t:t.slice(0,e)+`...[truncated, total ${t.length} bytes]`}function op(t,e,n){let r=typeof n.body=="string"?n.body:JSON.stringify(n.body);t.info({debug_log:!0,reqId:e,phase:"provider_request",url:n.url,headers:rp(n.headers),body:mi(r,Wr.maxBodyLength)})}function sp(t,e,n){t.info({debug_log:!0,reqId:e,phase:"provider_response",status:n.status,headers:rp(n.headers),...n.body!==void 0?{body:mi(n.body,Wr.maxBodyLength)}:{}})}function Xh(t,e,n,r){let o=TC(r);t.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:n,...o?{usage_monitor:o}:{},data:mi(r,Wr.maxBodyLength)})}function TC(t){let e=[];for(let n of t.split(/\r?\n/)){if(!n.startsWith("data:"))continue;let r=n.slice(5).trim();if(!(!r||r==="[DONE]"))try{let o=JSON.parse(r),s=o?.usage||o?.response?.usage;s&&e.push({path:o?.usage?"usage":"response.usage",usage:s,choicesLength:Array.isArray(o?.choices)?o.choices.length:void 0,finishReason:o?.choices?.[0]?.finish_reason})}catch{e.push({parseError:!0,data:mi(r,512)})}}if(e.length)return e.length===1?e[0]:e}function Zh(t,e,n){t.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:n})}function ip(t,e,n,r){(async()=>{let o=t.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let a="";for(;;){let{done:c,value:l}=await o.read();if(c)break;a+=l;let d=a.split(`
73
73
 
74
- `);a=d.pop()||"";for(let f of d)f.trim()&&(s<r.maxStreamChunks?Xh(e,n,s,f):s===r.maxStreamChunks&&e.info({debug_log:!0,reqId:n,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${r.maxStreamChunks}]`}),s++)}a.trim()&&(s<r.maxStreamChunks&&Xh(e,n,s,a.trim()),s++),Zh(e,n,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${n}:`,a),Zh(e,n,s)}finally{o.releaseLock()}})()}var ap="2.2.0";Gn();var An=require("fs"),_c=require("path"),mp=require("@wengine-ai/claude-code-router-shared"),gc=(0,_c.join)(mp.HOME_DIR,"runtime"),yc=(0,_c.join)(gc,"rate-limit.json"),Gr=new Map,fp=!1,NC=null,BC=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],MC=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],LC=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function qo(t,e,n){let r=c=>{if(n instanceof Headers)return n.get(c);let l=Object.keys(n).find(d=>d.toLowerCase()===c);return l?n[l]:null},o=mc(r,BC),s=mc(r,MC),a=mc(r,LC);(o||s||a)&&Gr.set(t,{provider:t,remaining:hp(o),limit:hp(s),reset:jC(a),capturedAt:Date.now()})}function gp(t){return Gr.get(t)}function yp(){return Array.from(Gr.values())}function mc(t,e){for(let n of e){let r=t(n);if(r)return r}return null}function hp(t){if(!t)return null;let e=Number(t.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function jC(t){if(!t)return null;let e=t.trim();if(!e)return null;let n=Number(e);if(Number.isFinite(n))return n>1e12?Math.floor(n/1e3):n>1e9?Math.floor(n):Math.floor(Date.now()/1e3+n);let r=Date.parse(e);if(Number.isFinite(r))return Math.floor(r/1e3);let o=UC(e);return o===null?null:Math.floor((Date.now()+o)/1e3)}function UC(t){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,n=0,r=!1;for(let o of t.matchAll(e)){r=!0;let s=Number(o[1]),a=o[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":n+=s;break;case"s":n+=s*1e3;break;case"m":n+=s*60*1e3;break;case"h":n+=s*60*60*1e3;break;case"d":n+=s*24*60*60*1e3;break}}return r?n:null}function $C(){try{if(!(0,An.existsSync)(yc))return;let t=JSON.parse((0,An.readFileSync)(yc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>3600*1e3)continue;Gr.set(n.provider,n)}}catch{}}function pp(){try{if(Gr.size===0)return;(0,An.existsSync)(gc)||(0,An.mkdirSync)(gc,{recursive:!0}),(0,An.writeFileSync)(yc,JSON.stringify(Array.from(Gr.values()),null,2),"utf-8")}catch{}}function _i(){fp||(fp=!0,$C(),NC=setInterval(pp,6e4),process.on("exit",pp))}gi();var Jr=class{name="openai-responses";endPoint="/v1/responses";async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:"detailed"});let n=[],r=e.messages.filter(o=>o.role==="system");if(r.length>0){let o=r[0];Array.isArray(o.content)?o.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),n.push({role:"system",content:a})}):e.instructions=o.content}if(e.messages.forEach(o=>{if(o.role!=="system"){if(Array.isArray(o.content)){let s=o.content.map(a=>this.normalizeRequestContent(a,o.role)).filter(a=>a!==null);s.length>0?o.content=s:delete o.content}if(o.role==="tool"){let s={...o};s.type="function_call_output",s.call_id=o.tool_call_id,s.output=o.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,n.push(s);return}if(o.role==="assistant"&&Array.isArray(o.tool_calls)){o.tool_calls.forEach(s=>{n.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}n.push(o)}}),e.input=n,delete e.messages,Array.isArray(e.tools)){let o=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),o&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let n=e.headers.get("Content-Type")||"";if(n.includes("application/json")){let r=await e.json();if(r.object==="response"&&r.output){let o=this.convertResponseToChat(r);return new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(n.includes("text/event-stream")){if(!e.body)return e;let[r,o]=e.body.tee(),s=r.getReader(),a="";try{let{value:g,done:_}=await s.read();!_&&g&&(a=new TextDecoder().decode(g))}finally{s.releaseLock()}if(r.cancel().catch(()=>{}),a.includes("message_start")||a.includes("content_block_start")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}if(a.includes("response.created")||a.includes("response.output_text.delta")||a.includes("response.in_progress")||a.includes("response.output_item.added")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}let d=this.prependToStream(a,o),f=new TextDecoder,p=new TextEncoder,m="",b=!1,C=this,y=new ReadableStream({async start(g){let _=d.getReader(),k=-1,w="",S=T=>(T!==w&&(k++,w=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){b||g.enqueue(p.encode(`data: [DONE]
74
+ `);a=d.pop()||"";for(let f of d)f.trim()&&(s<r.maxStreamChunks?Xh(e,n,s,f):s===r.maxStreamChunks&&e.info({debug_log:!0,reqId:n,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${r.maxStreamChunks}]`}),s++)}a.trim()&&(s<r.maxStreamChunks&&Xh(e,n,s,a.trim()),s++),Zh(e,n,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${n}:`,a),Zh(e,n,s)}finally{o.releaseLock()}})()}var ap="2.2.1";Gn();var An=require("fs"),_c=require("path"),mp=require("@wengine-ai/claude-code-router-shared"),gc=(0,_c.join)(mp.HOME_DIR,"runtime"),yc=(0,_c.join)(gc,"rate-limit.json"),Gr=new Map,fp=!1,NC=null,BC=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],MC=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],LC=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function qo(t,e,n){let r=c=>{if(n instanceof Headers)return n.get(c);let l=Object.keys(n).find(d=>d.toLowerCase()===c);return l?n[l]:null},o=mc(r,BC),s=mc(r,MC),a=mc(r,LC);(o||s||a)&&Gr.set(t,{provider:t,remaining:hp(o),limit:hp(s),reset:jC(a),capturedAt:Date.now()})}function gp(t){return Gr.get(t)}function yp(){return Array.from(Gr.values())}function mc(t,e){for(let n of e){let r=t(n);if(r)return r}return null}function hp(t){if(!t)return null;let e=Number(t.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function jC(t){if(!t)return null;let e=t.trim();if(!e)return null;let n=Number(e);if(Number.isFinite(n))return n>1e12?Math.floor(n/1e3):n>1e9?Math.floor(n):Math.floor(Date.now()/1e3+n);let r=Date.parse(e);if(Number.isFinite(r))return Math.floor(r/1e3);let o=UC(e);return o===null?null:Math.floor((Date.now()+o)/1e3)}function UC(t){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,n=0,r=!1;for(let o of t.matchAll(e)){r=!0;let s=Number(o[1]),a=o[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":n+=s;break;case"s":n+=s*1e3;break;case"m":n+=s*60*1e3;break;case"h":n+=s*60*60*1e3;break;case"d":n+=s*24*60*60*1e3;break}}return r?n:null}function $C(){try{if(!(0,An.existsSync)(yc))return;let t=JSON.parse((0,An.readFileSync)(yc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>3600*1e3)continue;Gr.set(n.provider,n)}}catch{}}function pp(){try{if(Gr.size===0)return;(0,An.existsSync)(gc)||(0,An.mkdirSync)(gc,{recursive:!0}),(0,An.writeFileSync)(yc,JSON.stringify(Array.from(Gr.values()),null,2),"utf-8")}catch{}}function _i(){fp||(fp=!0,$C(),NC=setInterval(pp,6e4),process.on("exit",pp))}gi();var Jr=class{name="openai-responses";endPoint="/v1/responses";getCacheReadInputTokens(e){return e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0}getCacheCreationInputTokens(e){return e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_write_tokens??0}buildResponsesUsage(e){let n=e?.input_tokens??e?.prompt_tokens??0,r=e?.output_tokens??e?.completion_tokens??0,o=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:n,output_tokens:r,total_tokens:e?.total_tokens??n+r,input_tokens_details:{cached_tokens:o,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:o,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:"detailed"});let n=[],r=e.messages.filter(o=>o.role==="system");if(r.length>0){let o=r[0];Array.isArray(o.content)?o.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),n.push({role:"system",content:a})}):e.instructions=o.content}if(e.messages.forEach(o=>{if(o.role!=="system"){if(Array.isArray(o.content)){let s=o.content.map(a=>this.normalizeRequestContent(a,o.role)).filter(a=>a!==null);s.length>0?o.content=s:delete o.content}if(o.role==="tool"){let s={...o};s.type="function_call_output",s.call_id=o.tool_call_id,s.output=o.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,n.push(s);return}if(o.role==="assistant"&&Array.isArray(o.tool_calls)){o.tool_calls.forEach(s=>{n.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}n.push(o)}}),e.input=n,delete e.messages,Array.isArray(e.tools)){let o=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),o&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let n=e.headers.get("Content-Type")||"";if(n.includes("application/json")){let r=await e.json();if(r.object==="response"&&r.output){let o=this.convertResponseToChat(r);return new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(n.includes("text/event-stream")){if(!e.body)return e;let[r,o]=e.body.tee(),s=r.getReader(),a="";try{let{value:g,done:_}=await s.read();!_&&g&&(a=new TextDecoder().decode(g))}finally{s.releaseLock()}if(r.cancel().catch(()=>{}),a.includes("message_start")||a.includes("content_block_start")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}if(a.includes("response.created")||a.includes("response.output_text.delta")||a.includes("response.in_progress")||a.includes("response.output_item.added")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}let d=this.prependToStream(a,o),f=new TextDecoder,p=new TextEncoder,m="",b=!1,C=this,y=new ReadableStream({async start(g){let _=d.getReader(),k=-1,w="",S=T=>(T!==w&&(k++,w=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){b||g.enqueue(p.encode(`data: [DONE]
75
75
 
76
76
  `));break}let $=f.decode(x,{stream:!0});m+=$;let G=m.split(/\r?\n/);m=G.pop()||"";for(let F of G)if(F.trim())try{if(F.startsWith("event: "))continue;if(F.startsWith("data: ")){let X=F.slice(5).trim();if(X==="[DONE]"){b=!0,g.enqueue(p.encode(`data: [DONE]
77
77
 
@@ -100,16 +100,16 @@ ${this.toMarkdown(s,n+1)}`:`${r}${o}: ${s}`).join(`
100
100
  `))}catch(T){console.error("Stream error:",T),g.error(T)}finally{try{_.releaseLock()}catch(T){console.error("Error releasing reader lock:",T)}g.close()}}});return new Response(y,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"}})}return e}normalizeRequestContent(e,n){let r={...e};if(delete r.cache_control,e.type==="text")return{type:n==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){console.log(e);let o={type:n==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(o.image_url=e.image_url.url),o}return null}async transformResponseIn(e,n){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[o,s]=e.body.tee(),a=o.getReader(),c="";try{let{value:m,done:b}=await a.read();!b&&m&&(c=new TextDecoder().decode(m))}finally{a.releaseLock()}o.cancel().catch(()=>{});let l=c.includes("message_start")||c.includes("content_block_start"),d=c.includes("chat.completion.chunk");if(c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))return new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}});if(d&&!l){let m=this.convertOpenAIChatStreamToResponsesAPI(s,n);return new Response(m,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let p=this.convertAnthropicStreamToResponsesAPI(s,n);return new Response(p,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}try{let o=await e.json();return new Response(JSON.stringify(this.wrapChatInResponses(o)),{headers:{"Content-Type":"application/json"}})}catch{return e}}prependToStream(e,n){let o=new TextEncoder().encode(e),s=n.getReader(),a=!1;return new ReadableStream({async pull(c){a||(a=!0,c.enqueue(o));try{let{done:l,value:d}=await s.read();l?c.close():c.enqueue(d)}catch(l){c.error(l)}},cancel(){s.cancel().catch(()=>{})}})}convertOpenAIChatStreamToResponsesAPI(e,n){let r=new TextDecoder,o=new TextEncoder,s=n?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,c=0,l=!1,d=!1,f="",p=-1,m=[],b=(y,g)=>o.encode(`event: ${y}
101
101
  data: ${JSON.stringify(g)}
102
102
 
103
- `),C=(y,g=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:y,model:s,output:g,usage:{input_tokens:0,output_tokens:0,total_tokens:0,output_tokens_details:{reasoning_tokens:0}}});return new ReadableStream({async start(y){try{let g=e.getReader(),_="",k=!1,w=S=>{if(!k){k=!0;for(let T of m)if(T.type==="function_call"){let x=m.indexOf(T);y.enqueue(b("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of m)if(T.type==="message"){let x=m.indexOf(T);T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}y.enqueue(b("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:S?.model||s,output:m.slice(),usage:S?.usage?{input_tokens:S.usage.prompt_tokens||0,output_tokens:S.usage.completion_tokens||0,total_tokens:S.usage.total_tokens||0}:{input_tokens:0,output_tokens:0,total_tokens:0}}}))}};for(;;){let{done:S,value:T}=await g.read();if(S)break;_+=r.decode(T,{stream:!0});let x=_.split(`
103
+ `),C=(y,g=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:y,model:s,output:g,usage:this.buildResponsesUsage()});return new ReadableStream({async start(y){try{let g=e.getReader(),_="",k=!1,w=S=>{if(!k){k=!0;for(let T of m)if(T.type==="function_call"){let x=m.indexOf(T);y.enqueue(b("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of m)if(T.type==="message"){let x=m.indexOf(T);T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}y.enqueue(b("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:S?.model||s,output:m.slice(),usage:S?.usage?{...this.buildResponsesUsage(S.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:S,value:T}=await g.read();if(S)break;_+=r.decode(T,{stream:!0});let x=_.split(`
104
104
  `);_=x.pop()||"";for(let $ of x){let G=$.trim();if(!G||G.startsWith("event:")||!G.startsWith("data:"))continue;let F=G.slice(5).trim();if(F==="[DONE]"){w({}),y.enqueue(o.encode(`data: [DONE]
105
105
 
106
106
  `));continue}let X;try{X=JSON.parse(F)}catch{continue}l||(l=!0,y.enqueue(b("response.created",{type:"response.created",response:C("in_progress")})),y.enqueue(b("response.in_progress",{type:"response.in_progress",response:C("in_progress")})));let H=X.choices?.[0];if(!H)continue;let K=H.delta;if(K?.content){if(!d){d=!0;let Y=c++,te={id:`${a}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};m.push(te),y.enqueue(b("response.output_item.added",{type:"response.output_item.added",output_index:Y,item:te}))}y.enqueue(b("response.output_text.delta",{type:"response.output_text.delta",item_id:`${a}_msg`,output_index:c-1,content_index:0,delta:K.content}))}if(Array.isArray(K?.tool_calls))for(let Y of K.tool_calls){if(Y.id){f=Y.id,p=c++;let te={id:Y.id,type:"function_call",status:"in_progress",call_id:Y.id,name:Y.function?.name||"",arguments:""};m.push(te),y.enqueue(b("response.output_item.added",{type:"response.output_item.added",output_index:p,item:te}))}if(Y.function?.arguments){y.enqueue(b("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:f,output_index:p,delta:Y.function.arguments}));let te=m.find(le=>le.call_id===f);te&&(te.arguments+=Y.function.arguments)}}H.finish_reason&&w(X)}}k||w({}),y.close()}catch(g){y.error(g)}}})}convertAnthropicStreamToResponsesAPI(e,n){let r=new TextDecoder,o=new TextEncoder,s=n?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,c="",l="",d=-1,f="",p="",m="",b=-1,C="",y="",g=-1,_=0,k=!1,w=!1,S=!1,T=!1,x=null,$=[],G=(te,le)=>o.encode(`event: ${te}
107
107
  data: ${JSON.stringify(le)}
108
108
 
109
- `),F=(te,le=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:te,model:s,output:le,usage:{input_tokens:0,output_tokens:0,total_tokens:0,output_tokens_details:{reasoning_tokens:0}}}),X=()=>{k||(k=!0,Y.enqueue(G("response.created",{type:"response.created",response:F("in_progress")})),Y.enqueue(G("response.in_progress",{type:"response.in_progress",response:F("in_progress")})))},H=(te,le)=>{Y.enqueue(G("response.output_item.done",{type:"response.output_item.done",output_index:te,item:{...le,status:"completed"}}))},K=te=>{if(!T){if(T=!0,w){let le=$.find(ie=>ie.type==="message");le&&(le.content=[{type:"output_text",text:c}],le.status="completed")}for(let le of $)le.type==="function_call"&&(le.status="completed");return G("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:$,usage:te?{input_tokens:te.input_tokens||0,output_tokens:te.output_tokens||0,total_tokens:(te.input_tokens||0)+(te.output_tokens||0)}:{input_tokens:0,output_tokens:0,total_tokens:0}}})}},Y;return new ReadableStream({async start(te){Y=te;try{let le=e.getReader(),ie="";for(;;){let{done:J,value:Z}=await le.read();if(J)break;ie+=r.decode(Z,{stream:!0});let oe=ie.split(`
109
+ `),F=(te,le=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:te,model:s,output:le,usage:this.buildResponsesUsage()}),X=()=>{k||(k=!0,Y.enqueue(G("response.created",{type:"response.created",response:F("in_progress")})),Y.enqueue(G("response.in_progress",{type:"response.in_progress",response:F("in_progress")})))},H=(te,le)=>{Y.enqueue(G("response.output_item.done",{type:"response.output_item.done",output_index:te,item:{...le,status:"completed"}}))},K=te=>{if(!T){if(T=!0,w){let le=$.find(ie=>ie.type==="message");le&&(le.content=[{type:"output_text",text:c}],le.status="completed")}for(let le of $)le.type==="function_call"&&(le.status="completed");return G("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:$,usage:te?{...this.buildResponsesUsage(te)}:this.buildResponsesUsage()}})}},Y;return new ReadableStream({async start(te){Y=te;try{let le=e.getReader(),ie="";for(;;){let{done:J,value:Z}=await le.read();if(J)break;ie+=r.decode(Z,{stream:!0});let oe=ie.split(`
110
110
  `);ie=oe.pop()||"";for(let Ue of oe){let ke=Ue.trim();if(!ke||ke.startsWith("event:")||!ke.startsWith("data:"))continue;let V=ke.slice(5).trim();if(V==="[DONE]")continue;let ae;try{ae=JSON.parse(V)}catch{continue}if(ae.type==="message_start"&&(a=ae.message?.id||a,X()),ae.type==="content_block_start"){let ee=ae.content_block;if(x=ee?.type||null,ee?.type==="tool_use"){f=ee.id||"",p=ee.name||"",m="",b=_++;let ve={id:f,type:"function_call",status:"in_progress",call_id:f,name:p,arguments:""};$.push(ve),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:b,item:ve}))}if(ee?.type==="thinking"&&(C=ee.thinking||"",!S)){S=!0,g=_++,y=`rs_${a}`;let ve={id:y,type:"reasoning",status:"in_progress",summary:[]};$.push(ve),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:g,item:ve}))}if(ee?.type==="text"&&(c=ee?.text||"",!w)){w=!0,d=_++,l=`${a}_msg`;let ve={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};$.push(ve),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:d,item:ve}))}}if(ae.type==="content_block_delta"){let ee=ae.delta;if(ee?.type==="text_delta"){if(!w){w=!0,d=_++,l=`${a}_msg`;let ve={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};$.push(ve),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:d,item:ve}))}c+=ee.text||"",Y.enqueue(G("response.output_text.delta",{type:"response.output_text.delta",item_id:l,output_index:d,content_index:0,delta:ee.text||""}))}ee?.type==="thinking_delta"&&(C+=ee.thinking||"",Y.enqueue(G("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:y||`rs_${a}`,output_index:g>=0?g:0,summary_index:0,delta:ee.thinking||""}))),ee?.type==="input_json_delta"&&(m+=ee.partial_json||"",Y.enqueue(G("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:f||"call_0",output_index:b>=0?b:0,delta:ee.partial_json||""})))}if(ae.type==="content_block_stop"){if(x==="tool_use"&&f){Y.enqueue(G("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:f,output_index:b,arguments:m}));let ee=$.find(ve=>ve.call_id===f);ee&&(ee.arguments=m,ee.status="completed"),ee&&H(b,ee)}if(x==="text"&&w){Y.enqueue(G("response.output_text.done",{type:"response.output_text.done",item_id:l,output_index:d,content_index:0,text:c}));let ee=$.find(ve=>ve.type==="message");ee&&(ee.content=[{type:"output_text",text:c}],H(d,ee))}if(x==="thinking"&&S){let ee=$.find(ve=>ve.type==="reasoning");ee&&(ee.summary=[{type:"summary_text",text:C}],H(g,ee))}x=null}if(ae.type==="message_delta"){let ee=K(ae.usage);ee&&Y.enqueue(ee)}if(ae.type==="message_stop"){let ee=K();ee&&Y.enqueue(ee),Y.enqueue(o.encode(`data: [DONE]
111
111
 
112
- `))}}}X();let pe=K();pe&&Y.enqueue(pe),ie="",Y.close()}catch(le){Y.error(le)}}})}wrapChatInResponses(e){let n=e?.choices?.[0],r=[],o=[];if(n?.message?.content&&o.push({type:"output_text",text:n.message.content}),r.push({type:"message",role:"assistant",content:o}),Array.isArray(n?.message?.tool_calls))for(let s of n.message.tool_calls)r.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:r,usage:e.usage?{input_tokens:e.usage.prompt_tokens||0,output_tokens:e.usage.completion_tokens||0,total_tokens:e.usage.total_tokens||0}:void 0}}convertResponseToChat(e){let n=e.output?.find(d=>d.type==="message"),r=e.output?.find(d=>d.type==="function_call"),o;n?.content?.length&&n?.content[0].annotations&&(o=n.content[0].annotations.map(d=>({type:"url_citation",url_citation:{url:d.url||"",title:d.title||"",content:"",start_index:d.start_index||0,end_index:d.end_index||0}}))),this.logger.debug({data:o,type:"url_citation"});let s=null,a=null,c=null;if(n&&n.reasoning&&(c={content:n.reasoning}),n&&n.content){let d=[],f=[];if(n.content.forEach(p=>{if(p.type==="output_text")d.push(p.text||"");else if(p.type==="output_image"){let m=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});m&&f.push(m)}else if(p.type==="output_image_base64"){let m=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});m&&f.push(m)}}),f.length>0){let p=[];d.length>0&&p.push({type:"text",text:d.join("")}),p.push(...f),s=p}else s=d.join("")}return r&&(a=[{id:r.call_id||r.id,function:{name:r.name,arguments:r.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:c,annotations:o},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}};var Ap=require("tiktoken");var bc=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let n=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,n),n}put(e,n){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let r=this.cache.keys().next().value;r!==void 0&&this.cache.delete(r)}this.cache.set(e,n)}values(){return Array.from(this.cache.values())}},bi=new bc(100);var ki=require("fs/promises"),vi=require("fs/promises"),Ai=require("path"),Kr=require("@wengine-ai/claude-code-router-shared");Gn();var Sn=require("fs"),Ec=require("path"),Cp=require("@wengine-ai/claude-code-router-shared"),Cc=(0,Ec.join)(Cp.HOME_DIR,"runtime"),wc=(0,Ec.join)(Cc,"quota-store.json"),Vr=new Map,_p=!1,qC=null;function Ci(t,e){t&&Vr.set(t,{...e,provider:t,capturedAt:Date.now()})}function wi(t){let e=Vr.get(t);return e?{...e}:void 0}function wp(){return Array.from(Vr.values()).map(t=>({...t}))}function HC(){try{if(!(0,Sn.existsSync)(wc))return;let t=JSON.parse((0,Sn.readFileSync)(wc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>1440*60*1e3)continue;Vr.set(n.provider,n)}}catch{}}function bp(){try{if(Vr.size===0)return;(0,Sn.existsSync)(Cc)||(0,Sn.mkdirSync)(Cc,{recursive:!0}),(0,Sn.writeFileSync)(wc,JSON.stringify(Array.from(Vr.values()),null,2),"utf-8")}catch{}}function Ei(){_p||(_p=!0,HC(),qC=setInterval(bp,6e4),process.on("exit",bp))}gi();var vn=(0,Ap.get_encoding)("cl100k_base"),Ac=(t,e,n)=>{let r=0;return Array.isArray(t)&&t.forEach(o=>{typeof o.content=="string"?r+=vn.encode(o.content).length:Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="text"?r+=vn.encode(s.text).length:s.type==="tool_use"?r+=vn.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(r+=vn.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).length)})}),typeof e=="string"?r+=vn.encode(e).length:Array.isArray(e)&&e.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?r+=vn.encode(o.text).length:Array.isArray(o.text)&&o.text.forEach(s=>{r+=vn.encode(s||"").length}))}),n&&n.forEach(o=>{o.description&&(r+=vn.encode(o.name+o.description).length),o.input_schema&&(r+=vn.encode(JSON.stringify(o.input_schema)).length)}),r},Sp=async(t,e)=>{if(t.sessionId){let n=await Sc(t.sessionId);if(n){let r=(0,Ai.join)(Kr.HOME_DIR,n,"config.json"),o=(0,Ai.join)(Kr.HOME_DIR,n,`${t.sessionId}.json`);try{let s=JSON.parse(await(0,ki.readFile)(o,"utf8"));if(s&&s.Router)return s.Router}catch{}try{let s=JSON.parse(await(0,ki.readFile)(r,"utf8"));if(s&&s.Router)return s.Router}catch{}}}};function Si(t){let e=t||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function vp(t){let e=Si(t),n=e.includes("[1m]")||e.endsWith("[1m"),r=e.replace(/\[1m\]|\[1m$/g,""),o=r.match(/^ccr-(opus|sonnet|haiku)$/i);if(o)return{family:o[1].toLowerCase(),extended:n};let s=r.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||r.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:n}:{family:null,extended:n}}function zC(t,e){if(!e||!t)return null;let n=Si(t);if(e[t])return e[t];if(e[n])return e[n];let{family:r}=vp(t);if(r&&e[r])return e[r];for(let[o,s]of Object.entries(e)){let a=Si(o);if(a&&n.includes(a))return s}return null}function Tp(t){return t?(t.input_tokens||0)+(t.cache_read_input_tokens||0)+(t.cache_creation_input_tokens||0):0}function Ep(t){if(!t?.includes(","))return null;let[e,...n]=t.split(","),r=e.trim(),o=n.join(",").trim();return!r||!o?null:{providerName:r,routeModel:o}}function ot(t,e,n,r,o){let s=Ep(t);if(!s)return t;let{providerName:a,routeModel:c}=s,l=e.find(p=>p.name.toLowerCase()===a.toLowerCase());if(l&&l.enabled===!1)return null;if(o===!0&&r&&!n){let p=Uo(),m=p.getPromotion(a,c,r,e);if(m){let b=Ep(m);if(b){let C=e.find(g=>g.name.toLowerCase()===b.providerName.toLowerCase()),y=C?.models?.find(g=>String(g).toLowerCase()===b.routeModel.toLowerCase());if(C&&y)return`${C.name},${y}`}p.clear(a,c,r)}}if(!n&&!Je().isAvailable(a,c))return null;let d=wi(a);if(d){let p=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,m=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(p||m)return null}let f=l?.models?.find(p=>String(p).toLowerCase()===c.toLowerCase());return l&&f?`${l.name},${f}`:t}function $t(t,e,n,r,o){let s=Je(),a=[n?.[t],r?.[t]];for(let c of a)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let d=ot(l,e);if(d)return d}return null}function WC(t){return t.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(n=>n.type==="image"||n.type==="image_url"||Array.isArray(n?.content)&&n.content.some(r=>r.type==="image"||r.type==="image_url")))}function GC(t){let e=Si(t);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(r=>r.test(e))}function JC(t,e,n,r,o,s,a,c){let l=n.longContextThreshold||6e4,d=Math.max(e,Tp(o)),f=t.modelFamily;if((s||d>2e5)&&n.extendedContext){let C=ot(n.extendedContext,r,!1,"extendedContext",c);if(C)return t.log.info(`Family: using extended context model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:C,scenarioType:"extendedContext",isFallback:!1};let y=c?$t("extendedContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using extended context fallback model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:y,scenarioType:"extendedContext",isFallback:!0};t.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(d>l&&(n.longContext||n.fallback?.longContext?.length||a?.longContext?.length)){let C=n.longContext?ot(n.longContext,r,!1,"longContext",c):null;if(C)return t.log.info(`Family: using long context model, tokens: ${d}, estimated: ${e}`),{model:C,scenarioType:"longContext",isFallback:!1};let y=c?$t("longContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using long context fallback model, tokens: ${d}, estimated: ${e}`),{model:y,scenarioType:"longContext",isFallback:!0};t.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(t.body.tools)&&t.body.tools.some(C=>C.type?.startsWith("web_search"))&&n.webSearch){let C=ot(n.webSearch,r,!1,"webSearch",c);if(C)return{model:C,scenarioType:"webSearch",isFallback:!1};let y=c?$t("webSearch",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using webSearch fallback model"),{model:y,scenarioType:"webSearch",isFallback:!0};t.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(t.body.thinking&&n.think){let C=ot(n.think,r,!1,"think",c);if(C)return{model:C,scenarioType:"think",isFallback:!1};let y=c?$t("think",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using think fallback model"),{model:y,scenarioType:"think",isFallback:!0};t.log.warn("Family: think model unavailable (fail pool), skipping")}if(n.default){let C=ot(n.default,r,!1,"default",c);if(C)return{model:C,scenarioType:"default",isFallback:!1};let y=c?$t("default",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using default fallback model"),{model:y,scenarioType:"default",isFallback:!0};t.log.warn("Family: default model unavailable (fail pool), skipping")}return null}var VC=async(t,e,n,r)=>{let o=await Sp(t,n),s=n.get("providers")||[],a=o||n.get("Router"),c=a?.enableFallback===!0,l=c?n.get("fallback"):void 0;if(t.body.model.includes(",")){let k=ot(t.body.model,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Explicit model ${t.body.model} unavailable (fail pool), trying fallback`);let w=c?$t("default",s,void 0,l):null;if(w)return t.log.info(`Using fallback for explicit model: ${w}`),{model:w,scenarioType:"default"};t.log.warn(`No fallback available for explicit model ${t.body.model}, continuing through routing logic`)}let{family:d,extended:f}=vp(t.body.model),p=a?.families?.[d||""];if(p&&a?.enableFamilyRouting){t.log.info(`Using model family routing for: ${d}${f?" (1M)":""}`),t.modelFamily=d,t.familyFallback=p.fallback;let k=JC(t,e,p,s,r,f,l,c);if(k)return{model:k.model,scenarioType:k.scenarioType}}let m=zC(t.body.model,a?.models);if(m){let k=ot(m,s,!1,"modelMapping",c);if(k)return t.log.info(`Using mapped model for ${t.body.model}: ${m}`),{model:k,scenarioType:"modelMapping"};t.log.warn(`Mapped model ${m} unavailable (fail pool), skipping`)}let b=Math.max(e,Tp(r)),C=a?.extendedContextThreshold||2e5;if(b>C&&a?.extendedContext){t.log.info(`Using extended context (1M) model due to token count: ${b}, estimated: ${e}, threshold: ${C}`);let k=ot(a.extendedContext,s,!1,"extendedContext",c);if(k)return{model:k,scenarioType:"extendedContext"};t.log.warn(`Extended context model ${a.extendedContext} unavailable (fail pool), trying fallback`);let w=c?$t("extendedContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"extendedContext"}}let y=a?.longContextThreshold||6e4;if(b>y&&a?.longContext){t.log.info(`Using long context model due to token count: ${b}, estimated: ${e}, threshold: ${y}`);let k=ot(a.longContext,s,!1,"longContext",c);if(k)return{model:k,scenarioType:"longContext"};t.log.warn(`Long context model ${a.longContext} unavailable (fail pool), trying fallback`);let w=c?$t("longContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"longContext"}}if(t.body?.system?.length>1&&t.body?.system[1]?.text?.startsWith("<CCR-SUBAGENT-MODEL>")){let k=t.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);if(k)return t.body.system[1].text=t.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${k[1]}</CCR-SUBAGENT-MODEL>`,""),{model:k[1],scenarioType:"default"}}let _=n.get("Router");if(t.body.model?.includes("claude")&&t.body.model?.includes("haiku")&&_?.background){t.log.info(`Using background model for ${t.body.model}`);let k=ot(_.background,s,!1,"background",c);if(k)return{model:k,scenarioType:"background"};t.log.warn(`Background model ${_.background} unavailable (fail pool), falling through`)}if(Array.isArray(t.body.tools)&&t.body.tools.some(k=>k.type?.startsWith("web_search"))&&a?.webSearch){let k=ot(a.webSearch,s,!1,"webSearch",c);if(k)return{model:k,scenarioType:"webSearch"};t.log.warn(`WebSearch model ${a.webSearch} unavailable (fail pool), trying fallback`);let w=c?$t("webSearch",s,void 0,l):null;if(w)return{model:w,scenarioType:"webSearch"}}if(t.body.thinking&&a?.think){t.log.info(`Using think model for ${t.body.thinking}`);let k=ot(a.think,s,!1,"think",c);if(k)return{model:k,scenarioType:"think"};t.log.warn(`Think model ${a.think} unavailable (fail pool), trying fallback`);let w=c?$t("think",s,void 0,l):null;if(w)return{model:w,scenarioType:"think"}}if(a?.default){let k=ot(a.default,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Default model ${a.default} unavailable (fail pool), trying fallback`);let w=c?$t("default",s,void 0,l):null;if(w)return{model:w,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Yr=async(t,e,n)=>{let{configService:r,event:o}=n;if(t.originalModel=t.body.model,t.body.metadata?.user_id){let C=t.body.metadata.user_id.split("_session_");C.length>1&&(t.sessionId=C[1])}let a=await Sp(t,r)||r.get("Router"),c=a?.enableFallback===!0,l=r.get("providers")||[],d=bi.get(t.sessionId),{messages:f,system:p=[],tools:m}=t.body,b=r.get("REWRITE_SYSTEM_PROMPT");if(b&&p.length>1&&p[1]?.text?.includes("<env>")){let C=await(0,ki.readFile)(b,"utf-8");p[1].text=`${C}<env>${p[1].text.split("<env>").pop()}`}try{let[C,y]=t.body.model.split(","),g=n.tokenizerService?.getTokenizerConfigForModel(C,y),_;n.tokenizerService?_=(await n.tokenizerService.countTokens({messages:f,system:p,tools:m},g)).tokenCount:_=Ac(f,p,m),t.tokenCount=_;let k,w=r.get("CUSTOM_ROUTER_PATH");if(w)try{k=await require(w)(t,r.getAll(),{event:o})}catch(S){t.log.error(`failed to load custom router: ${S.message}`)}if(k)t.scenarioType="default";else{let S=await VC(t,_,r,d);k=S.model,t.scenarioType=S.scenarioType}if(a?.image&&k!==a.image&&WC(t)&&!GC(k)){let S=ot(a.image,l,!1,"image",c);S?(t.log.info(`Using image model fallback for ${k}`),k=S,t.scenarioType="image"):(t.log.warn(`Image model ${a.image} unavailable (fail pool), keeping ${k}`),t.scenarioType="image")}t.body.model=k}catch(C){t.log.error(`Error in router middleware: ${C.message}`),t.body.model=a?.default,t.scenarioType="default"}},Tn=new Map,kp=1e3;function kc(){if(Tn.size<=kp)return;let t=[...Tn.keys()].slice(0,Tn.size-kp);for(let e of t)Tn.delete(e)}var Sc=async t=>{if(Tn.has(t)){let e=Tn.get(t);return!e||e===""?null:e}try{let e=await(0,vi.opendir)(Kr.CLAUDE_PROJECTS_DIR),n=[];for await(let s of e)s.isDirectory()&&n.push(s.name);let r=n.map(async s=>{let a=(0,Ai.join)(Kr.CLAUDE_PROJECTS_DIR,s,`${t}.jsonl`);try{return(await(0,vi.stat)(a)).isFile()?s:null}catch{return null}}),o=await Promise.all(r);for(let s of o)if(s)return Tn.set(t,s),kc(),s;return Tn.set(t,""),kc(),null}catch(e){return console.error("Error searching for project by session:",e),Tn.set(t,""),kc(),null}};var KC=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;function Dp(t){let e=[],n=Array.isArray(t.input)?t.input:[t.input];for(let r of n)if(r.type==="function_call")e.push({role:"assistant",tool_calls:[{id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments||"{}"}}]});else if(r.type==="function_call_output")e.push({role:"tool",tool_call_id:r.call_id,content:typeof r.output=="string"?r.output:JSON.stringify(r.output)});else if(r.role){let o=r.content;Array.isArray(o)&&(o=o.map(s=>s.type==="input_text"?{type:"text",text:s.text}:s.type==="output_text"?{type:"text",text:s.text}:s.type==="input_image"?{type:"image_url",image_url:{url:s.image_url},media_type:s.mime_type}:s)),e.push({role:r.role,content:o})}t.messages=e,delete t.input,t.instructions&&typeof t.instructions=="string"&&(t.system=t.instructions,delete t.instructions),Array.isArray(t.tools)&&(t.tools=t.tools.filter(r=>r&&typeof r=="object").map(r=>r.type==="function"&&r.name&&!r.function?{type:"function",function:{name:r.name,description:r.description||"",parameters:r.parameters||{type:"object",properties:{}}}}:r.function?.name?r:r.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),t.reasoning&&typeof t.reasoning=="object"&&(t.reasoning={enabled:!0,effort:t.reasoning.effort})}async function YC(t,e,n,r){let o=t.body;r.endPoint==="/v1/responses"&&o?.input&&!o?.messages&&Dp(o),r.endPoint==="/v1/responses"&&!t.provider&&typeof o?.model=="string"&&KC.test(o.model)&&await Yr(t,e,{configService:n.configService,tokenizerService:n.tokenizerService});let s=t.provider;if(!s&&o?.model){let d=o.model.split(",");d.length>1&&(s=d[0],o.model=d.slice(1).join(","))}let a=s?n.providerService.getProvider(s):void 0;if(!a&&o?.model){let d=n.providerService.resolveModelRoute(o.model);d&&(a=d.provider,o.model=d.targetModel)}if(!a&&o?.model){let f=n.configService.get("Router")?.default;if(f&&f.includes(",")){let[p,...m]=f.split(","),b=n.providerService.getProvider(p);b&&(a=b,o.model=m.join(","))}}if(t.originalModel||(t.originalModel=o?.model),!a)throw ze(`Provider '${s}' not found`,404,"provider_not_found");t.provider=a.name||s;let c=ZC(t),l=r.endPoint==="/v1/messages"&&c;c&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),t.isCodexOnMessagesEndpoint=l,t.codexDetected=c;try{r.endPoint==="/v1/responses"&&o.input&&!o.messages&&Dp(o);let{requestBody:d,config:f,bypass:p}=await Rp(o,a,r,t.headers,{req:t});if(d?.messages&&!p&&!t.isTargetAnthropic){let y=d.messages,g=new Set,_=[],k=[];for(let w of y){if(w?.role!=="system"){k.push(w);continue}let S=JSON.stringify(w.content??"");g.has(S)||(g.add(S),_.push(w))}_.length>0&&k.length>0&&(d.messages=[...k,..._])}let m=await xp(d,f,a,n,p,r,{req:t});try{a?.baseUrl&&m?.headers&&qo(s,a.baseUrl,m.headers)}catch{}let b=await Op(d,m,a,r,p,{req:t,isCodexOnMessagesEndpoint:l});if(o.stream&&b?.body){let y=b.body.getReader(),g=await y.read();if(g.done)throw y.releaseLock(),ze(`Provider returned empty streaming response from ${s}`,400,"provider_response_error");let _=new TextDecoder().decode(g.value);if(_.includes("event: error")){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned error in SSE stream: ${S}`,400,"provider_response_error")}if(_.split(`
112
+ `))}}}X();let pe=K();pe&&Y.enqueue(pe),ie="",Y.close()}catch(le){Y.error(le)}}})}wrapChatInResponses(e){let n=e?.choices?.[0],r=[],o=[];if(n?.message?.content&&o.push({type:"output_text",text:n.message.content}),r.push({type:"message",role:"assistant",content:o}),Array.isArray(n?.message?.tool_calls))for(let s of n.message.tool_calls)r.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:r,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let n=e.output?.find(d=>d.type==="message"),r=e.output?.find(d=>d.type==="function_call"),o;n?.content?.length&&n?.content[0].annotations&&(o=n.content[0].annotations.map(d=>({type:"url_citation",url_citation:{url:d.url||"",title:d.title||"",content:"",start_index:d.start_index||0,end_index:d.end_index||0}}))),this.logger.debug({data:o,type:"url_citation"});let s=null,a=null,c=null;if(n&&n.reasoning&&(c={content:n.reasoning}),n&&n.content){let d=[],f=[];if(n.content.forEach(p=>{if(p.type==="output_text")d.push(p.text||"");else if(p.type==="output_image"){let m=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});m&&f.push(m)}else if(p.type==="output_image_base64"){let m=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});m&&f.push(m)}}),f.length>0){let p=[];d.length>0&&p.push({type:"text",text:d.join("")}),p.push(...f),s=p}else s=d.join("")}return r&&(a=[{id:r.call_id||r.id,function:{name:r.name,arguments:r.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:c,annotations:o},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0,prompt_tokens_details:{cached_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_tokens:this.getCacheCreationInputTokens(e.usage)},cache_read_input_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_input_tokens:this.getCacheCreationInputTokens(e.usage)}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}};var Ap=require("tiktoken");var bc=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let n=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,n),n}put(e,n){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let r=this.cache.keys().next().value;r!==void 0&&this.cache.delete(r)}this.cache.set(e,n)}values(){return Array.from(this.cache.values())}},bi=new bc(100);var ki=require("fs/promises"),vi=require("fs/promises"),Ai=require("path"),Kr=require("@wengine-ai/claude-code-router-shared");Gn();var Sn=require("fs"),Ec=require("path"),Cp=require("@wengine-ai/claude-code-router-shared"),Cc=(0,Ec.join)(Cp.HOME_DIR,"runtime"),wc=(0,Ec.join)(Cc,"quota-store.json"),Vr=new Map,_p=!1,qC=null;function Ci(t,e){t&&Vr.set(t,{...e,provider:t,capturedAt:Date.now()})}function wi(t){let e=Vr.get(t);return e?{...e}:void 0}function wp(){return Array.from(Vr.values()).map(t=>({...t}))}function HC(){try{if(!(0,Sn.existsSync)(wc))return;let t=JSON.parse((0,Sn.readFileSync)(wc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>1440*60*1e3)continue;Vr.set(n.provider,n)}}catch{}}function bp(){try{if(Vr.size===0)return;(0,Sn.existsSync)(Cc)||(0,Sn.mkdirSync)(Cc,{recursive:!0}),(0,Sn.writeFileSync)(wc,JSON.stringify(Array.from(Vr.values()),null,2),"utf-8")}catch{}}function Ei(){_p||(_p=!0,HC(),qC=setInterval(bp,6e4),process.on("exit",bp))}gi();var vn=(0,Ap.get_encoding)("cl100k_base"),Ac=(t,e,n)=>{let r=0;return Array.isArray(t)&&t.forEach(o=>{typeof o.content=="string"?r+=vn.encode(o.content).length:Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="text"?r+=vn.encode(s.text).length:s.type==="tool_use"?r+=vn.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(r+=vn.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).length)})}),typeof e=="string"?r+=vn.encode(e).length:Array.isArray(e)&&e.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?r+=vn.encode(o.text).length:Array.isArray(o.text)&&o.text.forEach(s=>{r+=vn.encode(s||"").length}))}),n&&n.forEach(o=>{o.description&&(r+=vn.encode(o.name+o.description).length),o.input_schema&&(r+=vn.encode(JSON.stringify(o.input_schema)).length)}),r},Sp=async(t,e)=>{if(t.sessionId){let n=await Sc(t.sessionId);if(n){let r=(0,Ai.join)(Kr.HOME_DIR,n,"config.json"),o=(0,Ai.join)(Kr.HOME_DIR,n,`${t.sessionId}.json`);try{let s=JSON.parse(await(0,ki.readFile)(o,"utf8"));if(s&&s.Router)return s.Router}catch{}try{let s=JSON.parse(await(0,ki.readFile)(r,"utf8"));if(s&&s.Router)return s.Router}catch{}}}};function Si(t){let e=t||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function vp(t){let e=Si(t),n=e.includes("[1m]")||e.endsWith("[1m"),r=e.replace(/\[1m\]|\[1m$/g,""),o=r.match(/^ccr-(opus|sonnet|haiku)$/i);if(o)return{family:o[1].toLowerCase(),extended:n};let s=r.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||r.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:n}:{family:null,extended:n}}function zC(t,e){if(!e||!t)return null;let n=Si(t);if(e[t])return e[t];if(e[n])return e[n];let{family:r}=vp(t);if(r&&e[r])return e[r];for(let[o,s]of Object.entries(e)){let a=Si(o);if(a&&n.includes(a))return s}return null}function Tp(t){return t?(t.input_tokens||0)+(t.cache_read_input_tokens||0)+(t.cache_creation_input_tokens||0):0}function Ep(t){if(!t?.includes(","))return null;let[e,...n]=t.split(","),r=e.trim(),o=n.join(",").trim();return!r||!o?null:{providerName:r,routeModel:o}}function ot(t,e,n,r,o){let s=Ep(t);if(!s)return t;let{providerName:a,routeModel:c}=s,l=e.find(p=>p.name.toLowerCase()===a.toLowerCase());if(l&&l.enabled===!1)return null;if(o===!0&&r&&!n){let p=Uo(),m=p.getPromotion(a,c,r,e);if(m){let b=Ep(m);if(b){let C=e.find(g=>g.name.toLowerCase()===b.providerName.toLowerCase()),y=C?.models?.find(g=>String(g).toLowerCase()===b.routeModel.toLowerCase());if(C&&y)return`${C.name},${y}`}p.clear(a,c,r)}}if(!n&&!Je().isAvailable(a,c))return null;let d=wi(a);if(d){let p=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,m=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(p||m)return null}let f=l?.models?.find(p=>String(p).toLowerCase()===c.toLowerCase());return l&&f?`${l.name},${f}`:t}function $t(t,e,n,r,o){let s=Je(),a=[n?.[t],r?.[t]];for(let c of a)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let d=ot(l,e);if(d)return d}return null}function WC(t){return t.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(n=>n.type==="image"||n.type==="image_url"||Array.isArray(n?.content)&&n.content.some(r=>r.type==="image"||r.type==="image_url")))}function GC(t){let e=Si(t);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(r=>r.test(e))}function JC(t,e,n,r,o,s,a,c){let l=n.longContextThreshold||6e4,d=Math.max(e,Tp(o)),f=t.modelFamily;if((s||d>2e5)&&n.extendedContext){let C=ot(n.extendedContext,r,!1,"extendedContext",c);if(C)return t.log.info(`Family: using extended context model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:C,scenarioType:"extendedContext",isFallback:!1};let y=c?$t("extendedContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using extended context fallback model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:y,scenarioType:"extendedContext",isFallback:!0};t.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(d>l&&(n.longContext||n.fallback?.longContext?.length||a?.longContext?.length)){let C=n.longContext?ot(n.longContext,r,!1,"longContext",c):null;if(C)return t.log.info(`Family: using long context model, tokens: ${d}, estimated: ${e}`),{model:C,scenarioType:"longContext",isFallback:!1};let y=c?$t("longContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using long context fallback model, tokens: ${d}, estimated: ${e}`),{model:y,scenarioType:"longContext",isFallback:!0};t.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(t.body.tools)&&t.body.tools.some(C=>C.type?.startsWith("web_search"))&&n.webSearch){let C=ot(n.webSearch,r,!1,"webSearch",c);if(C)return{model:C,scenarioType:"webSearch",isFallback:!1};let y=c?$t("webSearch",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using webSearch fallback model"),{model:y,scenarioType:"webSearch",isFallback:!0};t.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(t.body.thinking&&n.think){let C=ot(n.think,r,!1,"think",c);if(C)return{model:C,scenarioType:"think",isFallback:!1};let y=c?$t("think",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using think fallback model"),{model:y,scenarioType:"think",isFallback:!0};t.log.warn("Family: think model unavailable (fail pool), skipping")}if(n.default){let C=ot(n.default,r,!1,"default",c);if(C)return{model:C,scenarioType:"default",isFallback:!1};let y=c?$t("default",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using default fallback model"),{model:y,scenarioType:"default",isFallback:!0};t.log.warn("Family: default model unavailable (fail pool), skipping")}return null}var VC=async(t,e,n,r)=>{let o=await Sp(t,n),s=n.get("providers")||[],a=o||n.get("Router"),c=a?.enableFallback===!0,l=c?n.get("fallback"):void 0;if(t.body.model.includes(",")){let k=ot(t.body.model,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Explicit model ${t.body.model} unavailable (fail pool), trying fallback`);let w=c?$t("default",s,void 0,l):null;if(w)return t.log.info(`Using fallback for explicit model: ${w}`),{model:w,scenarioType:"default"};t.log.warn(`No fallback available for explicit model ${t.body.model}, continuing through routing logic`)}let{family:d,extended:f}=vp(t.body.model),p=a?.families?.[d||""];if(p&&a?.enableFamilyRouting){t.log.info(`Using model family routing for: ${d}${f?" (1M)":""}`),t.modelFamily=d,t.familyFallback=p.fallback;let k=JC(t,e,p,s,r,f,l,c);if(k)return{model:k.model,scenarioType:k.scenarioType}}let m=zC(t.body.model,a?.models);if(m){let k=ot(m,s,!1,"modelMapping",c);if(k)return t.log.info(`Using mapped model for ${t.body.model}: ${m}`),{model:k,scenarioType:"modelMapping"};t.log.warn(`Mapped model ${m} unavailable (fail pool), skipping`)}let b=Math.max(e,Tp(r)),C=a?.extendedContextThreshold||2e5;if(b>C&&a?.extendedContext){t.log.info(`Using extended context (1M) model due to token count: ${b}, estimated: ${e}, threshold: ${C}`);let k=ot(a.extendedContext,s,!1,"extendedContext",c);if(k)return{model:k,scenarioType:"extendedContext"};t.log.warn(`Extended context model ${a.extendedContext} unavailable (fail pool), trying fallback`);let w=c?$t("extendedContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"extendedContext"}}let y=a?.longContextThreshold||6e4;if(b>y&&a?.longContext){t.log.info(`Using long context model due to token count: ${b}, estimated: ${e}, threshold: ${y}`);let k=ot(a.longContext,s,!1,"longContext",c);if(k)return{model:k,scenarioType:"longContext"};t.log.warn(`Long context model ${a.longContext} unavailable (fail pool), trying fallback`);let w=c?$t("longContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"longContext"}}if(t.body?.system?.length>1&&t.body?.system[1]?.text?.startsWith("<CCR-SUBAGENT-MODEL>")){let k=t.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);if(k)return t.body.system[1].text=t.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${k[1]}</CCR-SUBAGENT-MODEL>`,""),{model:k[1],scenarioType:"default"}}let _=n.get("Router");if(t.body.model?.includes("claude")&&t.body.model?.includes("haiku")&&_?.background){t.log.info(`Using background model for ${t.body.model}`);let k=ot(_.background,s,!1,"background",c);if(k)return{model:k,scenarioType:"background"};t.log.warn(`Background model ${_.background} unavailable (fail pool), falling through`)}if(Array.isArray(t.body.tools)&&t.body.tools.some(k=>k.type?.startsWith("web_search"))&&a?.webSearch){let k=ot(a.webSearch,s,!1,"webSearch",c);if(k)return{model:k,scenarioType:"webSearch"};t.log.warn(`WebSearch model ${a.webSearch} unavailable (fail pool), trying fallback`);let w=c?$t("webSearch",s,void 0,l):null;if(w)return{model:w,scenarioType:"webSearch"}}if(t.body.thinking&&a?.think){t.log.info(`Using think model for ${t.body.thinking}`);let k=ot(a.think,s,!1,"think",c);if(k)return{model:k,scenarioType:"think"};t.log.warn(`Think model ${a.think} unavailable (fail pool), trying fallback`);let w=c?$t("think",s,void 0,l):null;if(w)return{model:w,scenarioType:"think"}}if(a?.default){let k=ot(a.default,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Default model ${a.default} unavailable (fail pool), trying fallback`);let w=c?$t("default",s,void 0,l):null;if(w)return{model:w,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Yr=async(t,e,n)=>{let{configService:r,event:o}=n;if(t.originalModel=t.body.model,t.body.metadata?.user_id){let C=t.body.metadata.user_id.split("_session_");C.length>1&&(t.sessionId=C[1])}let a=await Sp(t,r)||r.get("Router"),c=a?.enableFallback===!0,l=r.get("providers")||[],d=bi.get(t.sessionId),{messages:f,system:p=[],tools:m}=t.body,b=r.get("REWRITE_SYSTEM_PROMPT");if(b&&p.length>1&&p[1]?.text?.includes("<env>")){let C=await(0,ki.readFile)(b,"utf-8");p[1].text=`${C}<env>${p[1].text.split("<env>").pop()}`}try{let[C,y]=t.body.model.split(","),g=n.tokenizerService?.getTokenizerConfigForModel(C,y),_;n.tokenizerService?_=(await n.tokenizerService.countTokens({messages:f,system:p,tools:m},g)).tokenCount:_=Ac(f,p,m),t.tokenCount=_;let k,w=r.get("CUSTOM_ROUTER_PATH");if(w)try{k=await require(w)(t,r.getAll(),{event:o})}catch(S){t.log.error(`failed to load custom router: ${S.message}`)}if(k)t.scenarioType="default";else{let S=await VC(t,_,r,d);k=S.model,t.scenarioType=S.scenarioType}if(a?.image&&k!==a.image&&WC(t)&&!GC(k)){let S=ot(a.image,l,!1,"image",c);S?(t.log.info(`Using image model fallback for ${k}`),k=S,t.scenarioType="image"):(t.log.warn(`Image model ${a.image} unavailable (fail pool), keeping ${k}`),t.scenarioType="image")}t.body.model=k}catch(C){t.log.error(`Error in router middleware: ${C.message}`),t.body.model=a?.default,t.scenarioType="default"}},Tn=new Map,kp=1e3;function kc(){if(Tn.size<=kp)return;let t=[...Tn.keys()].slice(0,Tn.size-kp);for(let e of t)Tn.delete(e)}var Sc=async t=>{if(Tn.has(t)){let e=Tn.get(t);return!e||e===""?null:e}try{let e=await(0,vi.opendir)(Kr.CLAUDE_PROJECTS_DIR),n=[];for await(let s of e)s.isDirectory()&&n.push(s.name);let r=n.map(async s=>{let a=(0,Ai.join)(Kr.CLAUDE_PROJECTS_DIR,s,`${t}.jsonl`);try{return(await(0,vi.stat)(a)).isFile()?s:null}catch{return null}}),o=await Promise.all(r);for(let s of o)if(s)return Tn.set(t,s),kc(),s;return Tn.set(t,""),kc(),null}catch(e){return console.error("Error searching for project by session:",e),Tn.set(t,""),kc(),null}};var KC=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;function Dp(t){let e=[],n=Array.isArray(t.input)?t.input:[t.input];for(let r of n)if(r.type==="function_call")e.push({role:"assistant",tool_calls:[{id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments||"{}"}}]});else if(r.type==="function_call_output")e.push({role:"tool",tool_call_id:r.call_id,content:typeof r.output=="string"?r.output:JSON.stringify(r.output)});else if(r.role){let o=r.content;Array.isArray(o)&&(o=o.map(s=>s.type==="input_text"?{type:"text",text:s.text}:s.type==="output_text"?{type:"text",text:s.text}:s.type==="input_image"?{type:"image_url",image_url:{url:s.image_url},media_type:s.mime_type}:s)),e.push({role:r.role,content:o})}t.messages=e,delete t.input,t.instructions&&typeof t.instructions=="string"&&(t.system=t.instructions,delete t.instructions),Array.isArray(t.tools)&&(t.tools=t.tools.filter(r=>r&&typeof r=="object").map(r=>r.type==="function"&&r.name&&!r.function?{type:"function",function:{name:r.name,description:r.description||"",parameters:r.parameters||{type:"object",properties:{}}}}:r.function?.name?r:r.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),t.reasoning&&typeof t.reasoning=="object"&&(t.reasoning={enabled:!0,effort:t.reasoning.effort})}async function YC(t,e,n,r){let o=t.body;r.endPoint==="/v1/responses"&&o?.input&&!o?.messages&&Dp(o),r.endPoint==="/v1/responses"&&!t.provider&&typeof o?.model=="string"&&KC.test(o.model)&&await Yr(t,e,{configService:n.configService,tokenizerService:n.tokenizerService});let s=t.provider;if(!s&&o?.model){let d=o.model.split(",");d.length>1&&(s=d[0],o.model=d.slice(1).join(","))}let a=s?n.providerService.getProvider(s):void 0;if(!a&&o?.model){let d=n.providerService.resolveModelRoute(o.model);d&&(a=d.provider,o.model=d.targetModel)}if(!a&&o?.model){let f=n.configService.get("Router")?.default;if(f&&f.includes(",")){let[p,...m]=f.split(","),b=n.providerService.getProvider(p);b&&(a=b,o.model=m.join(","))}}if(t.originalModel||(t.originalModel=o?.model),!a)throw ze(`Provider '${s}' not found`,404,"provider_not_found");t.provider=a.name||s;let c=ZC(t),l=r.endPoint==="/v1/messages"&&c;c&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),t.isCodexOnMessagesEndpoint=l,t.codexDetected=c;try{r.endPoint==="/v1/responses"&&o.input&&!o.messages&&Dp(o);let{requestBody:d,config:f,bypass:p}=await Rp(o,a,r,t.headers,{req:t});if(d?.messages&&!p&&!t.isTargetAnthropic){let y=d.messages,g=new Set,_=[],k=[];for(let w of y){if(w?.role!=="system"){k.push(w);continue}let S=JSON.stringify(w.content??"");g.has(S)||(g.add(S),_.push(w))}_.length>0&&k.length>0&&(d.messages=[...k,..._])}let m=await xp(d,f,a,n,p,r,{req:t});try{a?.baseUrl&&m?.headers&&qo(s,a.baseUrl,m.headers)}catch{}let b=await Op(d,m,a,r,p,{req:t,isCodexOnMessagesEndpoint:l});if(o.stream&&b?.body){let y=b.body.getReader(),g=await y.read();if(g.done)throw y.releaseLock(),ze(`Provider returned empty streaming response from ${s}`,400,"provider_response_error");let _=new TextDecoder().decode(g.value);if(_.includes("event: error")){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned error in SSE stream: ${S}`,400,"provider_response_error")}if(_.split(`
113
113
  `).filter(S=>S.startsWith("data:")&&S.trim().length>5).length===0){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned streaming response with no SSE data lines: ${S}`,400,"provider_response_error")}let w=new ReadableStream({start:S=>{S.enqueue(g.value);let T=()=>{y.read().then(({done:x,value:$})=>{x?S.close():(S.enqueue($),T())}).catch(x=>S.error(x))};T()},cancel:()=>{y.cancel()}});b=new Response(w,{headers:b.headers,status:b.status,statusText:b.statusText})}let C=Pp(b,e,o,n);try{let y=o.model||t.originalModel;s&&y&&Je().recordSuccess(s,y)}catch{}return C}catch(d){let f=await QC(t,e,n,r,d);if(f)return f;throw d}}async function QC(t,e,n,r,o){let s=t.scenarioType||"default",a=t.familyFallback,c=t.modelFamily,l=n.configService.get("fallback"),d=Je(),f=t.provider||"",p=t.body.model||"",m=new Set,b=o?.statusCode===429||o?.isRateLimit===!0||o?.rawBody&&Ti(o.rawBody)||o?.message&&Ti(o.message);if(f&&p&&(b?(d.markRateLimited(f,p,120,o?.message),t.log.warn(`Primary model ${f},${p} rate-limited, will try fallbacks`)):d.recordFailure(f,p,o?.message),m.add(`${f},${p}`),n.recordUsage?.({provider:f,model:p,originalModel:t.originalModel||p,scenarioType:s,modelFamily:t.modelFamily,errorMessage:o?.message||String(o),sessionId:t.usageSessionId||t.id,stream:t.body.stream,inputTokens:t.tokenCount||0,req:t})),!n.configService.get("Router")?.enableFallback)return t.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let y=k=>{let[w,...S]=k.split(","),T=w?.trim(),x=S.join(",").trim();return!T||!x?null:{provider:T,model:x,key:`${T},${x}`}},g=[];if(c){let k=a?.[s];Array.isArray(k)&&k.length>0?g.push({name:`${c}/${s}`,models:k}):t.log.warn(`No ${c} fallback configured for ${s}; will try global ${s} fallback`)}if(Array.isArray(l?.[s])&&l[s].length>0&&g.push({name:`global/${s}`,models:l[s]}),g.length===0&&s!=="image"&&t.body?.messages?.some(S=>S.role==="user"&&Array.isArray(S.content)&&S.content.some(T=>T.type==="image"||T.type==="image_url"||Array.isArray(T?.content)&&T.content.some(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(l?.image)&&l.image.length>0&&(t.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),g.push({name:"global/image (auto-detected)",models:l.image})),g.length===0)return null;let _=g.reduce((k,w)=>k+w.models.length,0);t.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${g.length} fallback stage(s)`);for(let k of g){t.log.info(`Trying ${k.name} fallback stage with ${k.models.length} models`);for(let w of k.models){let S=y(w);if(!S){t.log.warn(`Fallback model '${w}' is invalid, skipping`);continue}if(m.has(S.key))continue;m.add(S.key);let T=S.provider,x=S.model;try{if(!d.isAvailable(T,x)){t.log.warn(`Fallback model ${w} unavailable (fail pool), skipping`);continue}t.log.info(`Trying fallback model: ${w}`);let $={...t.body};$.model=x;let G={...t,provider:T,body:$},F=n.providerService.getProvider(T);if(!F){t.log.warn(`Fallback provider '${T}' not found, skipping`);continue}if(F.enabled===!1){t.log.warn(`Fallback provider '${T}' is disabled, skipping`);continue}let{requestBody:X,config:H,bypass:K}=await Rp($,F,r,t.headers,{req:G}),Y=await xp(X,H,F,n,K,r,{req:G});try{F?.baseUrl&&Y?.headers&&qo(T,F.baseUrl,Y.headers)}catch{}let te=await Op(X,Y,F,r,K,{req:G,isCodexOnMessagesEndpoint:t.isCodexOnMessagesEndpoint||!1});return t.log.info(`Fallback model ${w} succeeded`),d.recordSuccess(T,x),f&&p&&(Uo().promote(f,p,s,T,x),t.log.info(`Promoted fallback model ${T},${x} for ${f},${p}:${s}`),b?t.log.info(`Rate-limited original model ${f},${p} already marked unavailable with cooldown`):(d.forceOpen(f,p,o?.message),t.log.info(`Marked original model ${f},${p} as unavailable`))),t.provider=T,t.body=$,Pp(te,e,$,n)}catch($){d.recordFailure(T,x,$.message),t.log.warn(`Fallback model ${S.key} failed: ${$.message}`),n.recordUsage?.({provider:T,model:x,originalModel:t.body.model,scenarioType:s,modelFamily:t.modelFamily,errorMessage:$.message,sessionId:t.usageSessionId||t.id,stream:t.body.stream,req:t});continue}}}return t.log.error(`All fallback models failed for ${s}`),null}async function Rp(t,e,n,r,o){let s=JSON.parse(JSON.stringify(t)),a=s?.system;if(typeof a=="string"&&a.includes("cch="))s.system=a.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(a))for(let d=0;d<a.length;d++){let f=a[d],p=typeof f=="string"?f:f?.text??"";if(p.includes("cch=")){let m=p.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof f=="string"?a[d]=m:typeof f?.text=="string"&&(f.text=m)}}let c={},l=!1;if(l=XC(e,n,t),l&&(r instanceof Headers?r.delete("content-length"):delete r["content-length"],c.headers=r),!l&&typeof n.transformRequestOut=="function"){let d=await n.transformRequestOut(s);d.body?(s=d.body,c=d.config||{}):s=d}if(!l&&e.transformer?.use?.length)for(let d of e.transformer.use){if(!d||typeof d.transformRequestIn!="function")continue;let f=await d.transformRequestIn(s,e,o);f.body?(s=f.body,c={...c,...f.config}):s=f}if(!l&&e.transformer?.[t.model]?.use?.length)for(let d of e.transformer[t.model].use)!d||typeof d.transformRequestIn!="function"||(s=await d.transformRequestIn(s,e,o));return{requestBody:s,config:c,bypass:l}}function XC(t,e,n){return e.endPoint==="/v1/chat/completions"&&Array.isArray(n?.system)?!1:t.transformer?.use?.length===1&&t.transformer.use[0].name===e.name&&(!t.transformer?.[n.model]?.use.length||t.transformer?.[n.model]?.use.length===1&&t.transformer?.[n.model]?.use[0].name===e.name)}function ZC(t){let e=t.headers||{},n=e["x-anthropic-billing-header"]||"";if(typeof n=="string"&&n.includes("cc_version="))return!1;let r=e["user-agent"]||"";if(typeof r=="string"&&/codex/i.test(r))return!0;let o=t.pathname||t.url||"";if(typeof o=="string"&&o.split("?",1)[0].endsWith("/v1/responses"))return!0;let s=t.originalModel||"";return typeof s=="string"&&s.toLowerCase()==="ccr-codex"}async function xp(t,e,n,r,o,s,a){let c=e.url||new URL(n.baseUrl);if(!e.TIMEOUT){let f=r.configService.get("API_TIMEOUT_MS");f&&(e.TIMEOUT=typeof f=="string"?parseInt(f,10):f)}if(o&&typeof s.auth=="function"){let f=await s.auth(t,n);if(f.body){t=f.body;let p=e.headers||{};f.config?.headers&&(p={...p,...f.config.headers},delete p.host,delete f.config.headers),e={...e,...f.config,headers:p}}else t=f}let l={Authorization:`Bearer ${n.apiKey}`,...e?.headers||{}};for(let f in l)(l[f]==="undefined"||["authorization","Authorization"].includes(f)&&l[f]?.includes("undefined"))&&delete l[f];pi(r.configService)&&op(r.log,a.req.id,{url:String(c),headers:l,body:t});let d=await Qh(c,t,{httpsProxy:r.configService.getHttpsProxy(),...e,headers:JSON.parse(JSON.stringify(l))},a,r.log);if(!d.ok){let f=await d.text();r.log.error(`[provider_response_error] Error from provider(${n.name},${t.model}: ${d.status}): ${f}`);let p=ze(`Error from provider(${n.name},${t.model}: ${d.status}): ${f}`,d.status,"provider_response_error");throw p.isRateLimit=d.status===429||Ti(f),p.rawBody=f,p}if(d.ok){let f=d.headers.get("content-type")||"",p=t.stream===!0;if(r.log.info(`[hidden-error-check] provider=${n.name} model=${t.model} stream=${t.stream} isStreamRequest=${p} contentType=${f} ok=${d.ok} status=${d.status} hasBody=${!!d.body}`),!p||f.includes("application/json")){let m=d.clone(),b="";try{if(b=await m.text(),!b||b.trim()==="")throw new SyntaxError("Empty JSON body");let C=JSON.parse(b);if(C&&typeof C=="object"&&C.error&&(typeof C.error=="string"||typeof C.error=="object"&&Object.keys(C.error).length>0)){r.log.error(`[provider_response_error] Hidden error from provider(${n.name},${t.model}: ${d.status}): ${b}`);let g=Ti(b),_=ze(`Error from provider(${n.name},${t.model}: ${d.status}): ${b}`,400,"provider_response_error");throw _.isRateLimit=g,_.rawBody=b,_}}catch(C){if(C instanceof SyntaxError){r.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${n.name},${t.model}: 200): "${b}"`);let y=ze(`API returned an empty or malformed response (HTTP 200) from ${n.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw y.rawBody=b,y}throw C}}}if(!t.stream&&pi(r.configService)){let p=await d.clone().text();sp(r.log,a.req.id,{status:d.status,headers:Object.fromEntries(d.headers.entries()),body:p})}return d}async function Op(t,e,n,r,o,s){let a=e;if(!o&&n.transformer?.use?.length)for(let c of Array.from(n.transformer.use).reverse())!c||typeof c.transformResponseOut!="function"||(a=await c.transformResponseOut(a,s));if(!o&&n.transformer?.[t.model]?.use?.length)for(let c of Array.from(n.transformer[t.model].use).reverse())!c||typeof c.transformResponseOut!="function"||(a=await c.transformResponseOut(a,s));if(!o&&r.transformResponseIn&&(s.provider||(s.provider=n),a=await r.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new Jr().transformResponseIn(a,{...s,provider:n})}catch(c){console.error("Failed to apply Responses API conversion for codex client:",c)}return a}function Pp(t,e,n,r){if(t.ok||e.code(t.status),n.stream===!0){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),r&&pi(r.configService)){let[s,a]=t.body.tee(),c=np(r.configService);return ip(s,r.log,e.request.id,c),e.send(a)}return e.send(t.body)}else return t.json()}var vc=async t=>{t.get("/",async()=>({message:"LLMs API",version:ap})),t.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),t.get("/providers/health",async()=>({states:Je().getAllStates().map(o=>({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount,successCount:o.successCount,lastFailureTime:o.lastFailureTime,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=t.transformerService.getTransformersWithEndpoint();for(let{transformer:n}of e)n.endPoint&&t.post(n.endPoint,async(r,o)=>YC(r,o,t,n));t.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(n,r)=>{let{name:o,baseUrl:s,apiKey:a,models:c}=n.body;if(!o?.trim())throw ze("Provider name is required",400,"invalid_request");if(!s||!ew(s))throw ze("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw ze("API key is required",400,"invalid_request");if(!c||!Array.isArray(c)||c.length===0)throw ze("At least one model is required",400,"invalid_request");if(t.providerService.getProvider(n.body.name))throw ze(`Provider with name '${n.body.name}' already exists`,400,"provider_exists");return t.providerService.registerProvider(n.body)}),t.get("/providers",async()=>t.providerService.getProviders()),t.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async n=>{let r=t.providerService.getProvider(n.params.id);if(!r)throw ze("Provider not found",404,"provider_not_found");return r}),t.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},enabled:{type:"boolean"}}}}},async(n,r)=>{let o=t.providerService.updateProvider(n.params.id,n.body);if(!o)throw ze("Provider not found",404,"provider_not_found");return o}),t.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async n=>{if(!t.providerService.deleteProvider(n.params.id))throw ze("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),t.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(n,r)=>{if(!t.providerService.toggleProvider(n.params.id,n.body.enabled))throw ze("Provider not found",404,"provider_not_found");return{message:`Provider ${n.body.enabled?"enabled":"disabled"} successfully`}})};function Ti(t){let e=t.toLowerCase();return e.includes("rate limit")||e.includes("rate_limit")||e.includes("rate_limit_error")||e.includes("too many requests")||e.includes("too many")||e.includes("quota exhausted")||e.includes("qps_limit")||e.includes("token_limit")||e.includes("\u9650\u6D41")||e.includes("\u9891\u7387\u9650\u5236")}function ew(t){try{return new URL(t),!0}catch{return!1}}var gr=class{constructor(e,n,r){this.configService=e;this.transformerService=n;this.logger=r;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(n=>{try{if(!n.name||!n.api_base_url||!n.api_key)return;let r={};n.transformer&&Object.keys(n.transformer).forEach(o=>{o==="use"?Array.isArray(n.transformer.use)&&(r.use=n.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return new a(s[1])}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?new a:a}}).filter(s=>typeof s<"u")):Array.isArray(n.transformer[o]?.use)&&(r[o]={use:n.transformer[o].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return new a(s[1])}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?new a:a}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:n.name,baseUrl:n.api_base_url,apiKey:n.api_key,models:n.models||[],quotaToken:n.quota_token,transformer:n.transformer?r:void 0,cacheMode:n.cache_mode||"exclusive",enabled:n.enabled!==!1,wakeupEnabled:n.wakeup_enabled===!0,wakeupTime:n.wakeup_time||"06:00",wakeupModel:n.wakeup_model||""}),this.logger.info(`${n.name} provider registered`)}catch(r){this.logger.error(`${n.name} provider registered error: ${r}`)}})}registerProvider(e){let n={...e,enabled:e.enabled!==!1,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(n.name,n),e.models.forEach(r=>{let o=`${n.name},${r}`,s={provider:n.name,model:r,fullModel:o};this.modelRoutes.set(o,s),this.modelRoutes.has(r)||this.modelRoutes.set(r,s)}),n}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,n){let r=this.providers.get(e);if(!r)return null;let o={...r,...n,updatedAt:new Date};return this.providers.set(e,o),n.models&&(r.models.forEach(s=>{let a=`${r.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),n.models.forEach(s=>{let a=`${r.name},${s}`,c={provider:r.name,model:s,fullModel:a};this.modelRoutes.set(a,c),this.modelRoutes.has(s)||this.modelRoutes.set(s,c)})),o}deleteProvider(e){let n=this.providers.get(e);return n?(n.models.forEach(r=>{let o=`${n.name},${r}`;this.modelRoutes.delete(o),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,n){let r=this.providers.get(e);if(!r)return!1;r.enabled=n;let o=this.configService.get("providers");if(o&&Array.isArray(o)){let s=o.find(a=>a.name===e);s&&(s.enabled=n)}return!0}resolveModelRoute(e){let n=this.modelRoutes.get(e);if(!n)return null;let r=this.providers.get(n.provider);return r?{provider:r,originalModel:e,targetModel:n.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(n=>{n.enabled!==!1&&n.models.forEach(r=>{e.push(r),e.push(`${n.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((n,r)=>{if(Array.isArray(r)){let[o,s={}]=r;n[o]=s}else n[r]={};return n},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(n=>{n.enabled!==!1&&n.models.forEach(r=>{e.push({id:r,object:"model",owned_by:n.name,provider:n.name}),e.push({id:`${n.name},${r}`,object:"model",owned_by:n.name,provider:n.name})})}),{object:"list",data:e}}};var Qe=[];for(let t=0;t<256;++t)Qe.push((t+256).toString(16).slice(1));function Fp(t,e=0){return(Qe[t[e+0]]+Qe[t[e+1]]+Qe[t[e+2]]+Qe[t[e+3]]+"-"+Qe[t[e+4]]+Qe[t[e+5]]+"-"+Qe[t[e+6]]+Qe[t[e+7]]+"-"+Qe[t[e+8]]+Qe[t[e+9]]+"-"+Qe[t[e+10]]+Qe[t[e+11]]+Qe[t[e+12]]+Qe[t[e+13]]+Qe[t[e+14]]+Qe[t[e+15]]).toLowerCase()}var Ip=require("crypto"),Ri=new Uint8Array(256),Di=Ri.length;function Tc(){return Di>Ri.length-16&&((0,Ip.randomFillSync)(Ri),Di=0),Ri.slice(Di,Di+=16)}var Np=require("crypto"),Dc={randomUUID:Np.randomUUID};function tw(t,e,n){if(Dc.randomUUID&&!e&&!t)return Dc.randomUUID();t=t||{};let r=t.random??t.rng?.()??Tc();if(r.length<16)throw new Error("Random bytes length must be >= 16");if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let o=0;o<16;++o)e[n+o]=r[o];return e}return Fp(r)}var qt=tw;var Bp=t=>t<=0?"none":t<=1024?"low":t<=8192?"medium":"high";var Mp=(t,e)=>(t.includes("base64")&&(t=t.split("base64").pop(),t.startsWith(",")&&(t=t.slice(1))),`data:${e};base64,${t}`);function nw(t){return t.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function Lp(t){let e=[],n=[],r=m=>{if(typeof m=="string"){n.push({type:"text",text:m});return}Array.isArray(m)&&m.forEach(b=>{if(typeof b=="string"){n.push({type:"text",text:b});return}b&&typeof b=="object"&&b.type==="text"&&b.text&&n.push({...b})})},o=()=>{let m=new Map;for(let b=0;b<n.length;b++){let C=n[b],y=C?.text??JSON.stringify(C),g=m.get(y);if(g===void 0){m.set(y,b);continue}!n[g]?.cache_control&&C?.cache_control&&(n[g]=C),n.splice(b,1),b--}};t.messages.forEach(m=>{m.role==="system"?r(m.content):e.push(m)}),o();let s=[];for(let m=0;m<e.length;m++){let b=e[m];if(b.role==="tool"){let C=b.content;try{typeof b.content=="string"&&(C=JSON.parse(b.content))}catch{}C!=null&&typeof C!="object"&&typeof C!="string"&&(C=String(C));let y={type:"tool_result",tool_use_id:b.tool_call_id,content:C};b.cache_control&&(y.cache_control=b.cache_control);let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(y):s.push({role:"user",content:[y]})}else if(b.role==="user"){let C=[];typeof b.content=="string"?C.push({type:"text",text:b.content}):Array.isArray(b.content)&&b.content.forEach(g=>{g&&typeof g=="object"&&g.type==="image_url"&&g.image_url?.url?C.push({type:"image",source:{type:"base64",media_type:g.media_type||"image/jpeg",data:g.image_url.url.split(",")[1]||g.image_url.url}}):C.push(g)});let y=s[s.length-1];y&&y.role==="user"&&Array.isArray(y.content)?y.content.push(...C):s.push({role:"user",content:C.length>0?C:[{type:"text",text:" "}]})}else if(b.role==="assistant"){let C=[];b.content&&(typeof b.content=="string"?C.push({type:"text",text:b.content}):Array.isArray(b.content)&&C.push(...b.content)),b.tool_calls&&b.tool_calls.length>0&&b.tool_calls.forEach(g=>{let _={};try{_=JSON.parse(g.function.arguments)}catch{_=g.function.arguments}C.push({type:"tool_use",id:g.id,name:g.function.name,input:_})}),b.thinking&&C.unshift({type:"thinking",thinking:b.thinking.content,signature:b.thinking.signature});let y=s[s.length-1];y&&y.role==="assistant"&&Array.isArray(y.content)?y.content.push(...C):s.push({role:"assistant",content:C.length>0?C:[{type:"text",text:" "}]})}}let a=()=>{let m=n.filter(b=>b?.cache_control).length;for(let b of s)Array.isArray(b.content)&&(m+=b.content.filter(C=>C?.cache_control).length);return m},c=m=>m&&typeof m=="object"?{...m}:{type:"ephemeral"},l=()=>{for(let m=s.length-1;m>=0;m--){let b=s[m]?.content;if(!Array.isArray(b))continue;let C=b.find(y=>y?.cache_control);if(C?.cache_control)return C.cache_control}for(let m=n.length-1;m>=0;m--)if(n[m]?.cache_control)return n[m].cache_control;return{type:"ephemeral"}},d=(m,b)=>{if(!Array.isArray(m?.content)||m.content.some(y=>y?.cache_control))return!1;let C=m.content.find(y=>y&&typeof y=="object"&&!y.cache_control);return C?(C.cache_control=c(b),!0):!1};(()=>{let m=4-a();if(m<=0||s.length===0)return;let b=s,C=l(),y=[];for(let g=b.length-1;g>=0;g--)b[g]?.role!=="user"||!Array.isArray(b[g].content)||y.push(g);for(let g of y){if(m<=0)break;d(b[g],C)&&m--}})();let p={messages:s,model:t.model,max_tokens:t.max_tokens||4096,temperature:t.temperature,stream:t.stream};if(n.length>0){let m=n.some(b=>b?.cache_control);p.system=m?n:n.map(b=>b.text||"").join(`
114
114
 
115
115
  `)}return t.tools&&t.tools.length>0&&(p.tools=nw(t.tools),t.tool_choice&&(t.tool_choice==="auto"?p.tool_choice={type:"auto"}:t.tool_choice==="any"||t.tool_choice==="required"?p.tool_choice={type:"any"}:typeof t.tool_choice=="string"?p.tool_choice={type:"tool",name:t.tool_choice}:typeof t.tool_choice=="object"&&t.tool_choice.type==="function"&&(p.tool_choice={type:"tool",name:t.tool_choice.function.name}))),p}var xi=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,n){let r={};return this.useBearer?(r.authorization=`Bearer ${n.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=n.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let n=[];if(e.system){if(typeof e.system=="string")n.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let s=e.system.filter(a=>a.type==="text"&&a.text).map(a=>({type:"text",text:a.text,cache_control:a.cache_control}));n.push({role:"system",content:s})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(s=>{if(s.role==="system"){n.push({role:"system",content:s.content});return}if(s.role==="user"||s.role==="assistant"){if(typeof s.content=="string"){n.push({role:s.role,content:s.content});return}if(Array.isArray(s.content)){if(s.role==="user"){let a=s.content.filter(l=>l.type==="tool_result"&&l.tool_use_id);a.length&&a.forEach(l=>{let d={role:"tool",content:typeof l.content=="string"?l.content:JSON.stringify(l.content),tool_call_id:l.tool_use_id,cache_control:l.cache_control};n.push(d)});let c=s.content.filter(l=>l.type==="text"&&l.text||l.type==="image"&&l.source);c.length&&n.push({role:"user",content:c.map(l=>l?.type==="image"?{type:"image_url",image_url:{url:l.source?.type==="base64"?Mp(l.source.data,l.source.media_type):l.source.url},media_type:l.source.media_type}:l)})}else if(s.role==="assistant"){let a={role:"assistant",content:""},c=s.content.filter(f=>f.type==="text"&&f.text);c.length&&(a.content=c.map(f=>f.text).join(`