@wengine-ai/claude-code-router 2.0.59 → 2.0.60

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.
Files changed (2) hide show
  1. package/dist/cli.js +4 -4
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -579,7 +579,7 @@ https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys`};var Be
579
579
  ${this.toMarkdown(N,_+1)}`:`${k}- ${N}`).join(`
580
580
  `):typeof g=="object"&&g!==null?Object.entries(g).map(([N,q])=>typeof q=="object"&&q!==null?`${k}${N}:
581
581
  ${this.toMarkdown(q,_+1)}`:`${k}${N}: ${q}`).join(`
582
- `):`${k}${g}`}async output(g,_={}){try{let k=this.formatData(g,_);switch(this.config.level||"log"){case"info":console.info(k);break;case"warn":console.warn(k);break;case"error":console.error(k);break;case"debug":console.debug(k);break;case"log":default:console.log(k);break}return!0}catch(k){return console.error("[ConsoleOutputHandler] Output failed:",k),!1}}}}),$A,HA=u(()=>{"use strict";$A=class{type="webhook";config;defaultTimeout=3e4;constructor(g){if(!g.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...g}}buildHeaders(){let g={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(g.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let _=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");g.Authorization=`Basic ${_}`}break;case"custom":this.config.auth.custom&&(g[this.config.auth.custom.header]=this.config.auth.custom.value);break}return g}buildBody(g,_){let{format:k="json",timestamp:N=!0,prefix:q,metadata:H}=_||{},Y={data:g};return N&&(Y.timestamp=new Date().toISOString()),q&&(Y.prefix=q),H&&Object.keys(H).length>0&&(Y.metadata=H),Y}async sendRequest(g,_,k,N,q){let H=new AbortController,Y=setTimeout(()=>H.abort(),q);try{let J=await fetch(g,{method:_,headers:k,body:JSON.stringify(N),signal:H.signal});if(clearTimeout(Y),!J.ok)throw new Error(`HTTP ${J.status}: ${J.statusText}`);return J}catch(J){throw clearTimeout(Y),J}}delay(g){return new Promise(_=>setTimeout(_,g))}async sendWithRetry(g,_,k,N,q,H){let Y=null;for(let J=1;J<=H.maxAttempts;J++)try{return await this.sendRequest(g,_,k,N,q)}catch(oe){if(Y=oe,J===H.maxAttempts)break;let ee=H.backoffMs*Math.pow(2,J-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${J}/${H.maxAttempts}), retrying in ${ee}ms...`,oe.message),await this.delay(ee)}throw Y}async output(g,_={}){let k=_.timeout||this.defaultTimeout;try{let N=this.buildHeaders(),q=this.buildBody(g,_),H=await this.sendWithRetry(this.config.url,this.config.method,N,q,k,this.config.retry);return!0}catch(N){let q=N instanceof Error?N.message:String(N);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${q}`),!1;throw new Error(`Webhook output failed: ${q}`)}}}}),el,Ls,tl,cu,xh=u(()=>{"use strict";el=require("fs"),Ls=require("path"),tl=require("os"),cu=class{type="temp-file";config;baseDir;constructor(g={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...g};let _=(0,tl.tmpdir)();this.baseDir=(0,Ls.join)(_,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,el.existsSync)(this.baseDir)||(0,el.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(g){try{let _=g.match(/_session_([a-f0-9-]+)/i);return _?_[1]:null}catch{return null}}getFilePath(g){let _=this.config.prefix||"session",k=this.config.extension?`.${this.config.extension}`:"",N;if(this.config.includeTimestamp){let q=Date.now();N=`${_}-${g}-${q}${k}`}else N=`${_}-${g}${k}`;return(0,Ls.join)(this.baseDir,N)}async output(g,_={}){try{let k=_.metadata?.sessionId;if(!k)return!1;let N={...g,timestamp:Date.now(),sessionId:k},q=this.getFilePath(k);return(0,el.writeFileSync)(q,JSON.stringify(N,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),rl,Ps,hu=u(()=>{"use strict";jA(),HA(),xh(),rl=class{handlers=new Map;defaultOptions={};registerHandler(g,_){this.handlers.set(g,_)}registerHandlers(g){for(let _ of g)if(_.enabled!==!1)try{let k=this.createHandler(_),N=_.type+"_"+Date.now();this.registerHandler(N,k)}catch(k){console.error(`[OutputManager] Failed to register ${_.type} handler:`,k)}}createHandler(g){switch(g.type){case"console":return new UA(g.config);case"webhook":return new $A(g.config);case"temp-file":return new cu(g.config);default:throw new Error(`Unknown output handler type: ${g.type}`)}}unregisterHandler(g){return this.handlers.delete(g)}getHandler(g){return this.handlers.get(g)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(g){this.defaultOptions={...this.defaultOptions,...g}}getDefaultOptions(){return{...this.defaultOptions}}async output(g,_){let k={...this.defaultOptions,..._},N={success:[],failed:[]},q=Array.from(this.handlers.entries()).map(async([H,Y])=>{try{await Y.output(g,k)?N.success.push(H):N.failed.push(H)}catch(J){console.error(`[OutputManager] Handler ${H} failed:`,J),N.failed.push(H)}});return await Promise.all(q),N}async outputTo(g,_,k){let N={...this.defaultOptions,...k},q={success:[],failed:[]},H=g.map(async Y=>{let J=this.handlers.get(Y);if(!J){console.warn(`[OutputManager] Handler ${Y} not found`),q.failed.push(Y);return}try{await J.output(_,N)?q.success.push(Y):q.failed.push(Y)}catch(oe){console.error(`[OutputManager] Handler ${Y} failed:`,oe),q.failed.push(Y)}});return await Promise.all(H),q}async outputToType(g,_,k){let N=Array.from(this.handlers.entries()).filter(([q,H])=>H.type===g).map(([q])=>q);return this.outputTo(N,_,k)}},Ps=new rl}),Bs={};c(Bs,{ActiveProbeService:()=>JC,ConfigService:()=>Fh,ProviderHealthStore:()=>qA,ProviderService:()=>tc,SSEParserTransform:()=>ZC,SSESerializerTransform:()=>DQ,TokenizerService:()=>qg,TransformerService:()=>Ug,calculateTokenCount:()=>MC,default:()=>vQ,getActiveProbeService:()=>zC,getAllQuotaResults:()=>dQ,getAllRateLimitInfo:()=>Li,getHealthStore:()=>Zo,getQuotaAdapter:()=>GC,getQuotaResult:()=>hQ,getRateLimitInfo:()=>xg,pluginManager:()=>EQ,resetActiveProbeService:()=>gQ,rewriteStream:()=>CQ,router:()=>Jg,searchProjectBySession:()=>qC,sessionUsageCache:()=>LC,startActiveProbe:()=>WC,stopActiveProbe:()=>KC,storeQuotaResult:()=>YC,tokenSpeedPlugin:()=>wQ}),t.exports=d(Bs);var _h=A(VB(),1),Eg=A(YB(),1),Ko=require("fs"),Sh=require("path"),yg=JB(),ec=A(C(),1),Fh=class{config={};options;constructor(g={jsonPath:"./config.json"}){this.options={envPath:g.envPath||".env",jsonPath:g.jsonPath,useEnvFile:!1,useJsonFile:g.useJsonFile!==!1,useEnvironmentVariables:g.useEnvironmentVariables!==!1,...g},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 g=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,Sh.join)(process.cwd(),this.options.jsonPath);if((0,Ko.existsSync)(g))try{let _=(0,Ko.readFileSync)(g,"utf-8"),k=ec.default.parse(_);this.config={...this.config,...k},console.log(`Loaded JSON config from: ${g}`)}catch(_){console.warn(`Failed to load JSON config from ${g}:`,_)}else console.warn(`JSON config file not found: ${g}`)}loadEnvConfig(){let g=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,Sh.join)(process.cwd(),this.options.envPath);if((0,Ko.existsSync)(g))try{let _=(0,yg.config)({path:g});_.parsed&&(this.config={...this.config,...this.parseEnvConfig(_.parsed)})}catch(_){console.warn(`Failed to load .env config from ${g}:`,_)}}loadEnvironmentVariables(){let g=this.parseEnvConfig(process.env);this.config={...this.config,...g}}parseEnvConfig(g){let _={};return Object.assign(_,g),_}isAbsolutePath(g){return g.startsWith("/")||g.includes(":")}get(g,_){let k=this.config[g];return k!==void 0?k:_}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(g){return this.config[g]!==void 0}set(g,_){this.config[g]=_}reload(){this.config={},this.loadConfig()}getConfigSummary(){let g=[];return this.options.initialConfig&&g.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&g.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&g.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&g.push("Environment Variables"),`Config sources: ${g.join(", ")}`}};function Is(g,_=500,k="internal_error",N="api_error"){let q=new Error(g);return q.statusCode=_,q.code=k,q.type=N,q}async function Dg(g,_,k){_.log.error(g);let N=g.statusCode||500,q={error:{message:g.message+g.stack||"Internal Server Error",type:g.type||"api_error",code:g.code||"internal_error"}};return k.code(N).send(q)}var Cg=Tu();function bg(g,_,k,N,q){let H=new Headers({"Content-Type":"application/json"});k.headers&&Object.entries(k.headers).forEach(([ee,ae])=>{ae&&H.set(ee,ae)});let Y,J=AbortSignal.timeout(k.TIMEOUT??60*1e3*60);if(k.signal){let ee=new AbortController,ae=()=>ee.abort();k.signal.addEventListener("abort",ae),J.addEventListener("abort",ae),Y=ee.signal}else Y=J;let oe={method:"POST",headers:H,body:JSON.stringify(_),signal:Y};return k.httpsProxy&&(oe.dispatcher=new Cg.ProxyAgent(new URL(k.httpsProxy).toString())),q?.debug({reqId:N.req.id,request:oe,headers:Object.fromEntries(H.entries()),requestUrl:typeof g=="string"?g:g.toString(),useProxy:k.httpsProxy},"final request"),fetch(typeof g=="string"?g:g.toString(),oe)}var wg="2.0.56",Bg={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},qA=class{states=new Map;config;probeTimer;constructor(g){this.config={...Bg,...g}}getKey(g,_){return`${g},${_}`}recordSuccess(g,_){if(!this.config.enabled)return;let k=this.getKey(g,_),N=this.states.get(k);N&&(N.successCount++,N.status==="half-open"?N.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(k):N.status==="open"&&(N.status="half-open",N.successCount=1,N.failureCount=0))}isRateLimitError(g){if(!g)return!1;let _=g.toLowerCase();return _.includes("429")||_.includes("rate_limit")||_.includes("ratelimit")||_.includes("rate limit")||_.includes("overloaded")||_.includes("quota")}recordFailure(g,_,k){if(!this.config.enabled)return;let N=this.getKey(g,_),q=this.states.get(N);q||(q={provider:g,model:_,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(N,q)),q.failureCount++,q.lastFailureTime=Date.now(),q.lastError=k;let H=this.isRateLimitError(k)?this.config.rateLimitThreshold:this.config.failureThreshold;q.status==="half-open"?(q.status="open",q.successCount=0,q.lastProbeTime=0):q.status==="closed"&&q.failureCount>=H&&(q.status="open",q.lastProbeTime=0)}getState(g,_){return this.states.get(this.getKey(g,_))}isAvailable(g,_){if(!this.config.enabled)return!0;let k=this.getState(g,_);return k?k.status!=="open":!0}getPriority(g,_){if(!this.config.enabled)return 0;let k=this.getState(g,_);if(!k)return 0;switch(k.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let g=[];for(let[_,k]of this.states)k.status==="open"&&g.push(_);return g}getHalfOpenModels(){let g=[];for(let[_,k]of this.states)k.status==="half-open"&&g.push(_);return g}needsProbe(g){return Date.now()-g.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(g,_){let k=this.getKey(g,_),N=this.states.get(k);N&&N.status==="open"&&(N.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},kh=null;function Zo(g){return kh||(kh=new qA(g)),kh}var Th=new Map,Ig=["x-ratelimit-remaining","x-ratelimit-remaining-requests","x-ratelimit-remaining-tokens"],vg=["x-ratelimit-limit","x-ratelimit-limit-requests","x-ratelimit-limit-tokens"],GA=["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"];function Rh(g,_,k){let N=J=>{if(k instanceof Headers)return k.get(J);let oe=Object.keys(k).find(ee=>ee.toLowerCase()===J);return oe?k[oe]:null},q=Sa(N,Ig),H=Sa(N,vg),Y=Sa(N,GA);(q||H||Y)&&Th.set(g,{provider:g,remaining:Qh(q),limit:Qh(H),reset:Nh(Y),capturedAt:Date.now()})}function xg(g){return Th.get(g)}function Li(){return Array.from(Th.values())}function Sa(g,_){for(let k of _){let N=g(k);if(N)return N}return null}function Qh(g){if(!g)return null;let _=Number(g.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function Nh(g){if(!g)return null;let _=g.trim();if(!_)return null;let k=Number(_);if(Number.isFinite(k))return k>1e12?Math.floor(k/1e3):k>1e9?Math.floor(k):Math.floor(Date.now()/1e3+k);let N=Date.parse(_);if(Number.isFinite(N))return Math.floor(N/1e3);let q=Xo(_);return q===null?null:Math.floor((Date.now()+q)/1e3)}function Xo(g){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,k=0,N=!1;for(let q of g.matchAll(_)){N=!0;let H=Number(q[1]),Y=q[2].toLowerCase();if(Number.isFinite(H))switch(Y){case"ms":k+=H;break;case"s":k+=H*1e3;break;case"m":k+=H*60*1e3;break;case"h":k+=H*60*60*1e3;break;case"d":k+=H*24*60*60*1e3;break}}return N?k:null}async function ea(g,_,k,N){let q=g.body,H=g.provider,Y=k.providerService.getProvider(H);if(!Y)throw Is(`Provider '${H}' not found`,404,"provider_not_found");try{let{requestBody:J,config:oe,bypass:ee}=await du(q,Y,N,g.headers,{req:g}),ae=await ta(J,oe,Y,k,ee,N,{req:g});try{Y?.baseUrl&&ae?.headers&&Rh(H,Y.baseUrl,ae.headers)}catch{}let Ae=await Oh(J,ae,Y,N,ee,{req:g});return Lh(Ae,_,q)}catch(J){let oe=await Ms(g,_,k,N,J);if(oe)return oe;throw J}}async function Ms(g,_,k,N,q){let H=g.scenarioType||"default",Y=g.familyFallback,J=g.modelFamily,oe=k.configService.get("fallback"),ee=Zo(),ae=De=>{let[we,...xe]=De.split(","),Be=we?.trim(),ge=xe.join(",").trim();return!Be||!ge?null:{provider:Be,model:ge,key:`${Be},${ge}`}},Ae=[];if(J){let De=Y?.[H];Array.isArray(De)&&De.length>0?Ae.push({name:`${J}/${H}`,models:De}):g.log.warn(`No ${J} fallback configured for ${H}; will try global ${H} fallback`)}if(Array.isArray(oe?.[H])&&oe[H].length>0&&Ae.push({name:`global/${H}`,models:oe[H]}),Ae.length===0)return null;let me=g.provider||"",se=g.body.model||"",he=new Set;me&&se&&(ee.recordFailure(me,se,q?.message),he.add(`${me},${se}`));let ye=Ae.reduce((De,we)=>De+we.models.length,0);g.log.warn(`Request failed for ${H}, trying ${ye} fallback models across ${Ae.length} fallback stage(s)`);for(let De of Ae){let we=[...De.models].sort((xe,Be)=>{let ge=ae(xe),Te=ae(Be);return!ge||!Te?!ge&&!Te?0:ge?-1:1:ee.getPriority(ge.provider,ge.model)-ee.getPriority(Te.provider,Te.model)});g.log.info(`Trying ${De.name} fallback stage with ${we.length} models`);for(let xe of we){let Be=ae(xe);if(!Be){g.log.warn(`Fallback model '${xe}' is invalid, skipping`);continue}if(he.has(Be.key))continue;he.add(Be.key);let ge=Be.provider,Te=Be.model;try{if(!ee.isAvailable(ge,Te)){g.log.warn(`Fallback model ${xe} unavailable (fail pool), skipping`);continue}g.log.info(`Trying fallback model: ${xe}`);let Le={...g.body};Le.model=Te;let Xe={...g,provider:ge,body:Le},ht=k.providerService.getProvider(ge);if(!ht){g.log.warn(`Fallback provider '${ge}' not found, skipping`);continue}let{requestBody:ft,config:Lt,bypass:Dt}=await du(Le,ht,N,g.headers,{req:Xe}),Ar=await ta(ft,Lt,ht,k,Dt,N,{req:Xe});try{ht?.baseUrl&&Ar?.headers&&Rh(ge,ht.baseUrl,Ar.headers)}catch{}let mr=await Oh(ft,Ar,ht,N,Dt,{req:Xe});return g.log.info(`Fallback model ${xe} succeeded`),ee.recordSuccess(ge,Te),Lh(mr,_,Le)}catch(Le){ee.recordFailure(ge,Te,Le.message),g.log.warn(`Fallback model ${Be.key} failed: ${Le.message}`);continue}}}return g.log.error(`All fallback models failed for ${H}`),null}async function du(g,_,k,N,q){let H=JSON.parse(JSON.stringify(g)),Y={},J=!1;if(J=VA(_,k,g),J&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],Y.headers=N),!J&&typeof k.transformRequestOut=="function"){let oe=await k.transformRequestOut(H);oe.body?(H=oe.body,Y=oe.config||{}):H=oe}if(!J&&_.transformer?.use?.length)for(let oe of _.transformer.use){if(!oe||typeof oe.transformRequestIn!="function")continue;let ee=await oe.transformRequestIn(H,_,q);ee.body?(H=ee.body,Y={...Y,...ee.config}):H=ee}if(!J&&_.transformer?.[g.model]?.use?.length)for(let oe of _.transformer[g.model].use)!oe||typeof oe.transformRequestIn!="function"||(H=await oe.transformRequestIn(H,_,q));return{requestBody:H,config:Y,bypass:J}}function VA(g,_,k){return g.transformer?.use?.length===1&&g.transformer.use[0].name===_.name&&(!g.transformer?.[k.model]?.use.length||g.transformer?.[k.model]?.use.length===1&&g.transformer?.[k.model]?.use[0].name===_.name)}async function ta(g,_,k,N,q,H,Y){let J=_.url||new URL(k.baseUrl);if(!_.TIMEOUT){let ae=N.configService.get("API_TIMEOUT_MS");ae&&(_.TIMEOUT=typeof ae=="string"?parseInt(ae,10):ae)}if(q&&typeof H.auth=="function"){let ae=await H.auth(g,k);if(ae.body){g=ae.body;let Ae=_.headers||{};ae.config?.headers&&(Ae={...Ae,...ae.config.headers},delete Ae.host,delete ae.config.headers),_={..._,...ae.config,headers:Ae}}else g=ae}let oe={Authorization:`Bearer ${k.apiKey}`,..._?.headers||{}};for(let ae in oe)(oe[ae]==="undefined"||["authorization","Authorization"].includes(ae)&&oe[ae]?.includes("undefined"))&&delete oe[ae];let ee=await bg(J,g,{httpsProxy:N.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(oe))},Y,N.log);if(!ee.ok){let ae=await ee.text();throw N.log.error(`[provider_response_error] Error from provider(${k.name},${g.model}: ${ee.status}): ${ae}`),Is(`Error from provider(${k.name},${g.model}: ${ee.status}): ${ae}`,ee.status,"provider_response_error")}return ee}async function Oh(g,_,k,N,q,H){let Y=_;if(!q&&k.transformer?.use?.length)for(let J of Array.from(k.transformer.use).reverse())!J||typeof J.transformResponseOut!="function"||(Y=await J.transformResponseOut(Y,H));if(!q&&k.transformer?.[g.model]?.use?.length)for(let J of Array.from(k.transformer[g.model].use).reverse())!J||typeof J.transformResponseOut!="function"||(Y=await J.transformResponseOut(Y,H));return!q&&N.transformResponseIn&&(Y=await N.transformResponseIn(Y,H)),Y}function Lh(g,_,k){return g.ok||_.code(g.status),k.stream===!0?(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),_.send(g.body)):g.json()}var nl=async g=>{g.get("/",async()=>({message:"LLMs API",version:wg})),g.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),g.get("/providers/health",async()=>({states:Zo().getAllStates().map(k=>({provider:k.provider,model:k.model,status:k.status,failureCount:k.failureCount,successCount:k.successCount,lastFailureTime:k.lastFailureTime,lastError:k.lastError})),timestamp:new Date().toISOString()}));let _=g.transformerService.getTransformersWithEndpoint();for(let{transformer:k}of _)k.endPoint&&g.post(k.endPoint,async(N,q)=>ea(N,q,g,k));g.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(k,N)=>{let{name:q,baseUrl:H,apiKey:Y,models:J}=k.body;if(!q?.trim())throw Is("Provider name is required",400,"invalid_request");if(!H||!YA(H))throw Is("Valid base URL is required",400,"invalid_request");if(!Y?.trim())throw Is("API key is required",400,"invalid_request");if(!J||!Array.isArray(J)||J.length===0)throw Is("At least one model is required",400,"invalid_request");if(g.providerService.getProvider(k.body.name))throw Is(`Provider with name '${k.body.name}' already exists`,400,"provider_exists");return g.providerService.registerProvider(k.body)}),g.get("/providers",async()=>g.providerService.getProviders()),g.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async k=>{let N=g.providerService.getProvider(k.params.id);if(!N)throw Is("Provider not found",404,"provider_not_found");return N}),g.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(k,N)=>{let q=g.providerService.updateProvider(k.params.id,k.body);if(!q)throw Is("Provider not found",404,"provider_not_found");return q}),g.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async k=>{if(!g.providerService.deleteProvider(k.params.id))throw Is("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),g.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(k,N)=>{if(!g.providerService.toggleProvider(k.params.id,k.body.enabled))throw Is("Provider not found",404,"provider_not_found");return{message:`Provider ${k.body.enabled?"enabled":"disabled"} successfully`}})};function YA(g){try{return new URL(g),!0}catch{return!1}}var tc=class{constructor(g,_,k){this.configService=g,this.transformerService=_,this.logger=k,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let g=this.configService.get("providers");if(g&&Array.isArray(g)){this.initializeFromProvidersArray(g);return}}initializeFromProvidersArray(g){g.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let k={};_.transformer&&Object.keys(_.transformer).forEach(N=>{N==="use"?Array.isArray(_.transformer.use)&&(k.use=_.transformer.use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let H=this.transformerService.getTransformer(q[0]);if(H)return new H(q[1])}if(typeof q=="string"){let H=this.transformerService.getTransformer(q);return typeof H=="function"?new H:H}}).filter(q=>typeof q<"u")):Array.isArray(_.transformer[N]?.use)&&(k[N]={use:_.transformer[N].use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let H=this.transformerService.getTransformer(q[0]);if(H)return new H(q[1])}if(typeof q=="string"){let H=this.transformerService.getTransformer(q);return typeof H=="function"?new H:H}}).filter(q=>typeof q<"u")})}),this.registerProvider({name:_.name,baseUrl:_.api_base_url,apiKey:_.api_key,models:_.models||[],quotaToken:_.quota_token,transformer:_.transformer?k:void 0}),this.logger.info(`${_.name} provider registered`)}catch(k){this.logger.error(`${_.name} provider registered error: ${k}`)}})}registerProvider(g){let _={...g};return this.providers.set(_.name,_),g.models.forEach(k=>{let N=`${_.name},${k}`,q={provider:_.name,model:k,fullModel:N};this.modelRoutes.set(N,q),this.modelRoutes.has(k)||this.modelRoutes.set(k,q)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(g){return this.providers.get(g)}updateProvider(g,_){let k=this.providers.get(g);if(!k)return null;let N={...k,..._,updatedAt:new Date};return this.providers.set(g,N),_.models&&(k.models.forEach(q=>{let H=`${k.name},${q}`;this.modelRoutes.delete(H),this.modelRoutes.delete(q)}),_.models.forEach(q=>{let H=`${k.name},${q}`,Y={provider:k.name,model:q,fullModel:H};this.modelRoutes.set(H,Y),this.modelRoutes.has(q)||this.modelRoutes.set(q,Y)})),N}deleteProvider(g){let _=this.providers.get(g);return _?(_.models.forEach(k=>{let N=`${_.name},${k}`;this.modelRoutes.delete(N),this.modelRoutes.delete(k)}),this.providers.delete(g),!0):!1}toggleProvider(g,_){return!!this.providers.get(g)}resolveModelRoute(g){let _=this.modelRoutes.get(g);if(!_)return null;let k=this.providers.get(_.provider);return k?{provider:k,originalModel:g,targetModel:_.model}:null}getAvailableModelNames(){let g=[];return this.providers.forEach(_=>{_.models.forEach(k=>{g.push(k),g.push(`${_.name},${k}`)})}),g}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(g){return g?Array.isArray(g)?g.reduce((_,k)=>{if(Array.isArray(k)){let[N,q={}]=k;_[N]=q}else _[k]={};return _},{}):g:{}}async getAvailableModels(){let g=[];return this.providers.forEach(_=>{_.models.forEach(k=>{g.push({id:k,object:"model",owned_by:_.name,provider:_.name}),g.push({id:`${_.name},${k}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:g}}},Ii=[];for(let g=0;g<256;++g)Ii.push((g+256).toString(16).slice(1));function rc(g,_=0){return(Ii[g[_+0]]+Ii[g[_+1]]+Ii[g[_+2]]+Ii[g[_+3]]+"-"+Ii[g[_+4]]+Ii[g[_+5]]+"-"+Ii[g[_+6]]+Ii[g[_+7]]+"-"+Ii[g[_+8]]+Ii[g[_+9]]+"-"+Ii[g[_+10]]+Ii[g[_+11]]+Ii[g[_+12]]+Ii[g[_+13]]+Ii[g[_+14]]+Ii[g[_+15]]).toLowerCase()}var JA=require("crypto"),il=new Uint8Array(256),nc=il.length;function _g(){return nc>il.length-16&&((0,JA.randomFillSync)(il),nc=0),il.slice(nc,nc+=16)}var Sg=require("crypto"),zA={randomUUID:Sg.randomUUID};function Fg(g,_,k){if(zA.randomUUID&&!_&&!g)return zA.randomUUID();g=g||{};let N=g.random??g.rng?.()??_g();if(N.length<16)throw new Error("Random bytes length must be >= 16");if(N[6]=N[6]&15|64,N[8]=N[8]&63|128,_){if(k=k||0,k<0||k+16>_.length)throw new RangeError(`UUID byte range ${k}:${k+15} is out of buffer bounds`);for(let q=0;q<16;++q)_[k+q]=N[q];return _}return rc(N)}var ra=Fg,kg=g=>g<=0?"none":g<=1024?"low":g<=8192?"medium":"high",WA=(g,_)=>(g.includes("base64")&&(g=g.split("base64").pop(),g.startsWith(",")&&(g=g.slice(1))),`data:${_};base64,${g}`),KA=class{constructor(g){this.options=g,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(g,_){let k={};return this.useBearer?(k.authorization=`Bearer ${_.apiKey}`,k["x-api-key"]=void 0):(k["x-api-key"]=_.apiKey,k.authorization=void 0),{body:g,config:{headers:k}}}async transformRequestOut(g){let _=[];if(g.system){if(typeof g.system=="string")_.push({role:"system",content:g.system});else if(Array.isArray(g.system)&&g.system.length){let N=g.system.filter(q=>q.type==="text"&&q.text).map(q=>({type:"text",text:q.text,cache_control:q.cache_control}));_.push({role:"system",content:N})}}JSON.parse(JSON.stringify(g.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){_.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let q=N.content.filter(Y=>Y.type==="tool_result"&&Y.tool_use_id);q.length&&q.forEach(Y=>{let J={role:"tool",content:typeof Y.content=="string"?Y.content:JSON.stringify(Y.content),tool_call_id:Y.tool_use_id,cache_control:Y.cache_control};_.push(J)});let H=N.content.filter(Y=>Y.type==="text"&&Y.text||Y.type==="image"&&Y.source);H.length&&_.push({role:"user",content:H.map(Y=>Y?.type==="image"?{type:"image_url",image_url:{url:Y.source?.type==="base64"?WA(Y.source.data,Y.source.media_type):Y.source.url},media_type:Y.source.media_type}:Y)})}else if(N.role==="assistant"){let q={role:"assistant",content:""},H=N.content.filter(oe=>oe.type==="text"&&oe.text);H.length&&(q.content=H.map(oe=>oe.text).join(`
582
+ `):`${k}${g}`}async output(g,_={}){try{let k=this.formatData(g,_);switch(this.config.level||"log"){case"info":console.info(k);break;case"warn":console.warn(k);break;case"error":console.error(k);break;case"debug":console.debug(k);break;case"log":default:console.log(k);break}return!0}catch(k){return console.error("[ConsoleOutputHandler] Output failed:",k),!1}}}}),$A,HA=u(()=>{"use strict";$A=class{type="webhook";config;defaultTimeout=3e4;constructor(g){if(!g.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...g}}buildHeaders(){let g={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(g.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let _=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");g.Authorization=`Basic ${_}`}break;case"custom":this.config.auth.custom&&(g[this.config.auth.custom.header]=this.config.auth.custom.value);break}return g}buildBody(g,_){let{format:k="json",timestamp:N=!0,prefix:q,metadata:H}=_||{},Y={data:g};return N&&(Y.timestamp=new Date().toISOString()),q&&(Y.prefix=q),H&&Object.keys(H).length>0&&(Y.metadata=H),Y}async sendRequest(g,_,k,N,q){let H=new AbortController,Y=setTimeout(()=>H.abort(),q);try{let J=await fetch(g,{method:_,headers:k,body:JSON.stringify(N),signal:H.signal});if(clearTimeout(Y),!J.ok)throw new Error(`HTTP ${J.status}: ${J.statusText}`);return J}catch(J){throw clearTimeout(Y),J}}delay(g){return new Promise(_=>setTimeout(_,g))}async sendWithRetry(g,_,k,N,q,H){let Y=null;for(let J=1;J<=H.maxAttempts;J++)try{return await this.sendRequest(g,_,k,N,q)}catch(oe){if(Y=oe,J===H.maxAttempts)break;let ee=H.backoffMs*Math.pow(2,J-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${J}/${H.maxAttempts}), retrying in ${ee}ms...`,oe.message),await this.delay(ee)}throw Y}async output(g,_={}){let k=_.timeout||this.defaultTimeout;try{let N=this.buildHeaders(),q=this.buildBody(g,_),H=await this.sendWithRetry(this.config.url,this.config.method,N,q,k,this.config.retry);return!0}catch(N){let q=N instanceof Error?N.message:String(N);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${q}`),!1;throw new Error(`Webhook output failed: ${q}`)}}}}),el,Ls,tl,cu,xh=u(()=>{"use strict";el=require("fs"),Ls=require("path"),tl=require("os"),cu=class{type="temp-file";config;baseDir;constructor(g={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...g};let _=(0,tl.tmpdir)();this.baseDir=(0,Ls.join)(_,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,el.existsSync)(this.baseDir)||(0,el.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(g){try{let _=g.match(/_session_([a-f0-9-]+)/i);return _?_[1]:null}catch{return null}}getFilePath(g){let _=this.config.prefix||"session",k=this.config.extension?`.${this.config.extension}`:"",N;if(this.config.includeTimestamp){let q=Date.now();N=`${_}-${g}-${q}${k}`}else N=`${_}-${g}${k}`;return(0,Ls.join)(this.baseDir,N)}async output(g,_={}){try{let k=_.metadata?.sessionId;if(!k)return!1;let N={...g,timestamp:Date.now(),sessionId:k},q=this.getFilePath(k);return(0,el.writeFileSync)(q,JSON.stringify(N,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),rl,Ps,hu=u(()=>{"use strict";jA(),HA(),xh(),rl=class{handlers=new Map;defaultOptions={};registerHandler(g,_){this.handlers.set(g,_)}registerHandlers(g){for(let _ of g)if(_.enabled!==!1)try{let k=this.createHandler(_),N=_.type+"_"+Date.now();this.registerHandler(N,k)}catch(k){console.error(`[OutputManager] Failed to register ${_.type} handler:`,k)}}createHandler(g){switch(g.type){case"console":return new UA(g.config);case"webhook":return new $A(g.config);case"temp-file":return new cu(g.config);default:throw new Error(`Unknown output handler type: ${g.type}`)}}unregisterHandler(g){return this.handlers.delete(g)}getHandler(g){return this.handlers.get(g)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(g){this.defaultOptions={...this.defaultOptions,...g}}getDefaultOptions(){return{...this.defaultOptions}}async output(g,_){let k={...this.defaultOptions,..._},N={success:[],failed:[]},q=Array.from(this.handlers.entries()).map(async([H,Y])=>{try{await Y.output(g,k)?N.success.push(H):N.failed.push(H)}catch(J){console.error(`[OutputManager] Handler ${H} failed:`,J),N.failed.push(H)}});return await Promise.all(q),N}async outputTo(g,_,k){let N={...this.defaultOptions,...k},q={success:[],failed:[]},H=g.map(async Y=>{let J=this.handlers.get(Y);if(!J){console.warn(`[OutputManager] Handler ${Y} not found`),q.failed.push(Y);return}try{await J.output(_,N)?q.success.push(Y):q.failed.push(Y)}catch(oe){console.error(`[OutputManager] Handler ${Y} failed:`,oe),q.failed.push(Y)}});return await Promise.all(H),q}async outputToType(g,_,k){let N=Array.from(this.handlers.entries()).filter(([q,H])=>H.type===g).map(([q])=>q);return this.outputTo(N,_,k)}},Ps=new rl}),Bs={};c(Bs,{ActiveProbeService:()=>JC,ConfigService:()=>Fh,ProviderHealthStore:()=>qA,ProviderService:()=>tc,SSEParserTransform:()=>ZC,SSESerializerTransform:()=>DQ,TokenizerService:()=>qg,TransformerService:()=>Ug,calculateTokenCount:()=>MC,default:()=>vQ,getActiveProbeService:()=>zC,getAllQuotaResults:()=>dQ,getAllRateLimitInfo:()=>Li,getHealthStore:()=>Zo,getQuotaAdapter:()=>GC,getQuotaResult:()=>hQ,getRateLimitInfo:()=>xg,pluginManager:()=>EQ,resetActiveProbeService:()=>gQ,rewriteStream:()=>CQ,router:()=>Jg,searchProjectBySession:()=>qC,sessionUsageCache:()=>LC,startActiveProbe:()=>WC,stopActiveProbe:()=>KC,storeQuotaResult:()=>YC,tokenSpeedPlugin:()=>wQ}),t.exports=d(Bs);var _h=A(VB(),1),Eg=A(YB(),1),Ko=require("fs"),Sh=require("path"),yg=JB(),ec=A(C(),1),Fh=class{config={};options;constructor(g={jsonPath:"./config.json"}){this.options={envPath:g.envPath||".env",jsonPath:g.jsonPath,useEnvFile:!1,useJsonFile:g.useJsonFile!==!1,useEnvironmentVariables:g.useEnvironmentVariables!==!1,...g},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 g=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,Sh.join)(process.cwd(),this.options.jsonPath);if((0,Ko.existsSync)(g))try{let _=(0,Ko.readFileSync)(g,"utf-8"),k=ec.default.parse(_);this.config={...this.config,...k},console.log(`Loaded JSON config from: ${g}`)}catch(_){console.warn(`Failed to load JSON config from ${g}:`,_)}else console.warn(`JSON config file not found: ${g}`)}loadEnvConfig(){let g=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,Sh.join)(process.cwd(),this.options.envPath);if((0,Ko.existsSync)(g))try{let _=(0,yg.config)({path:g});_.parsed&&(this.config={...this.config,...this.parseEnvConfig(_.parsed)})}catch(_){console.warn(`Failed to load .env config from ${g}:`,_)}}loadEnvironmentVariables(){let g=this.parseEnvConfig(process.env);this.config={...this.config,...g}}parseEnvConfig(g){let _={};return Object.assign(_,g),_}isAbsolutePath(g){return g.startsWith("/")||g.includes(":")}get(g,_){let k=this.config[g];return k!==void 0?k:_}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(g){return this.config[g]!==void 0}set(g,_){this.config[g]=_}reload(){this.config={},this.loadConfig()}getConfigSummary(){let g=[];return this.options.initialConfig&&g.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&g.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&g.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&g.push("Environment Variables"),`Config sources: ${g.join(", ")}`}};function Is(g,_=500,k="internal_error",N="api_error"){let q=new Error(g);return q.statusCode=_,q.code=k,q.type=N,q}async function Dg(g,_,k){_.log.error(g);let N=g.statusCode||500,q={error:{message:g.message+g.stack||"Internal Server Error",type:g.type||"api_error",code:g.code||"internal_error"}};return k.code(N).send(q)}var Cg=Tu();function bg(g,_,k,N,q){let H=new Headers({"Content-Type":"application/json"});k.headers&&Object.entries(k.headers).forEach(([ee,ae])=>{ae&&H.set(ee,ae)});let Y,J=AbortSignal.timeout(k.TIMEOUT??60*1e3*60);if(k.signal){let ee=new AbortController,ae=()=>ee.abort();k.signal.addEventListener("abort",ae),J.addEventListener("abort",ae),Y=ee.signal}else Y=J;let oe={method:"POST",headers:H,body:JSON.stringify(_),signal:Y};return k.httpsProxy&&(oe.dispatcher=new Cg.ProxyAgent(new URL(k.httpsProxy).toString())),q?.debug({reqId:N.req.id,request:oe,headers:Object.fromEntries(H.entries()),requestUrl:typeof g=="string"?g:g.toString(),useProxy:k.httpsProxy},"final request"),fetch(typeof g=="string"?g:g.toString(),oe)}var wg="2.0.58",Bg={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},qA=class{states=new Map;config;probeTimer;constructor(g){this.config={...Bg,...g}}getKey(g,_){return`${g},${_}`}recordSuccess(g,_){if(!this.config.enabled)return;let k=this.getKey(g,_),N=this.states.get(k);N&&(N.successCount++,N.status==="half-open"?N.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(k):N.status==="open"&&(N.status="half-open",N.successCount=1,N.failureCount=0))}isRateLimitError(g){if(!g)return!1;let _=g.toLowerCase();return _.includes("429")||_.includes("rate_limit")||_.includes("ratelimit")||_.includes("rate limit")||_.includes("overloaded")||_.includes("quota")}recordFailure(g,_,k){if(!this.config.enabled)return;let N=this.getKey(g,_),q=this.states.get(N);q||(q={provider:g,model:_,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(N,q)),q.failureCount++,q.lastFailureTime=Date.now(),q.lastError=k;let H=this.isRateLimitError(k)?this.config.rateLimitThreshold:this.config.failureThreshold;q.status==="half-open"?(q.status="open",q.successCount=0,q.lastProbeTime=0):q.status==="closed"&&q.failureCount>=H&&(q.status="open",q.lastProbeTime=0)}getState(g,_){return this.states.get(this.getKey(g,_))}isAvailable(g,_){if(!this.config.enabled)return!0;let k=this.getState(g,_);return k?k.status!=="open":!0}getPriority(g,_){if(!this.config.enabled)return 0;let k=this.getState(g,_);if(!k)return 0;switch(k.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let g=[];for(let[_,k]of this.states)k.status==="open"&&g.push(_);return g}getHalfOpenModels(){let g=[];for(let[_,k]of this.states)k.status==="half-open"&&g.push(_);return g}needsProbe(g){return Date.now()-g.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(g,_){let k=this.getKey(g,_),N=this.states.get(k);N&&N.status==="open"&&(N.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},kh=null;function Zo(g){return kh||(kh=new qA(g)),kh}var Th=new Map,Ig=["x-ratelimit-remaining","x-ratelimit-remaining-requests","x-ratelimit-remaining-tokens"],vg=["x-ratelimit-limit","x-ratelimit-limit-requests","x-ratelimit-limit-tokens"],GA=["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"];function Rh(g,_,k){let N=J=>{if(k instanceof Headers)return k.get(J);let oe=Object.keys(k).find(ee=>ee.toLowerCase()===J);return oe?k[oe]:null},q=Sa(N,Ig),H=Sa(N,vg),Y=Sa(N,GA);(q||H||Y)&&Th.set(g,{provider:g,remaining:Qh(q),limit:Qh(H),reset:Nh(Y),capturedAt:Date.now()})}function xg(g){return Th.get(g)}function Li(){return Array.from(Th.values())}function Sa(g,_){for(let k of _){let N=g(k);if(N)return N}return null}function Qh(g){if(!g)return null;let _=Number(g.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function Nh(g){if(!g)return null;let _=g.trim();if(!_)return null;let k=Number(_);if(Number.isFinite(k))return k>1e12?Math.floor(k/1e3):k>1e9?Math.floor(k):Math.floor(Date.now()/1e3+k);let N=Date.parse(_);if(Number.isFinite(N))return Math.floor(N/1e3);let q=Xo(_);return q===null?null:Math.floor((Date.now()+q)/1e3)}function Xo(g){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,k=0,N=!1;for(let q of g.matchAll(_)){N=!0;let H=Number(q[1]),Y=q[2].toLowerCase();if(Number.isFinite(H))switch(Y){case"ms":k+=H;break;case"s":k+=H*1e3;break;case"m":k+=H*60*1e3;break;case"h":k+=H*60*60*1e3;break;case"d":k+=H*24*60*60*1e3;break}}return N?k:null}async function ea(g,_,k,N){let q=g.body,H=g.provider,Y=k.providerService.getProvider(H);if(!Y)throw Is(`Provider '${H}' not found`,404,"provider_not_found");try{let{requestBody:J,config:oe,bypass:ee}=await du(q,Y,N,g.headers,{req:g}),ae=await ta(J,oe,Y,k,ee,N,{req:g});try{Y?.baseUrl&&ae?.headers&&Rh(H,Y.baseUrl,ae.headers)}catch{}let Ae=await Oh(J,ae,Y,N,ee,{req:g});return Lh(Ae,_,q)}catch(J){let oe=await Ms(g,_,k,N,J);if(oe)return oe;throw J}}async function Ms(g,_,k,N,q){let H=g.scenarioType||"default",Y=g.familyFallback,J=g.modelFamily,oe=k.configService.get("fallback"),ee=Zo(),ae=De=>{let[we,...xe]=De.split(","),Be=we?.trim(),ge=xe.join(",").trim();return!Be||!ge?null:{provider:Be,model:ge,key:`${Be},${ge}`}},Ae=[];if(J){let De=Y?.[H];Array.isArray(De)&&De.length>0?Ae.push({name:`${J}/${H}`,models:De}):g.log.warn(`No ${J} fallback configured for ${H}; will try global ${H} fallback`)}if(Array.isArray(oe?.[H])&&oe[H].length>0&&Ae.push({name:`global/${H}`,models:oe[H]}),Ae.length===0)return null;let me=g.provider||"",se=g.body.model||"",he=new Set;me&&se&&(ee.recordFailure(me,se,q?.message),he.add(`${me},${se}`));let ye=Ae.reduce((De,we)=>De+we.models.length,0);g.log.warn(`Request failed for ${H}, trying ${ye} fallback models across ${Ae.length} fallback stage(s)`);for(let De of Ae){let we=[...De.models].sort((xe,Be)=>{let ge=ae(xe),Te=ae(Be);return!ge||!Te?!ge&&!Te?0:ge?-1:1:ee.getPriority(ge.provider,ge.model)-ee.getPriority(Te.provider,Te.model)});g.log.info(`Trying ${De.name} fallback stage with ${we.length} models`);for(let xe of we){let Be=ae(xe);if(!Be){g.log.warn(`Fallback model '${xe}' is invalid, skipping`);continue}if(he.has(Be.key))continue;he.add(Be.key);let ge=Be.provider,Te=Be.model;try{if(!ee.isAvailable(ge,Te)){g.log.warn(`Fallback model ${xe} unavailable (fail pool), skipping`);continue}g.log.info(`Trying fallback model: ${xe}`);let Le={...g.body};Le.model=Te;let Xe={...g,provider:ge,body:Le},ht=k.providerService.getProvider(ge);if(!ht){g.log.warn(`Fallback provider '${ge}' not found, skipping`);continue}let{requestBody:ft,config:Lt,bypass:Dt}=await du(Le,ht,N,g.headers,{req:Xe}),Ar=await ta(ft,Lt,ht,k,Dt,N,{req:Xe});try{ht?.baseUrl&&Ar?.headers&&Rh(ge,ht.baseUrl,Ar.headers)}catch{}let mr=await Oh(ft,Ar,ht,N,Dt,{req:Xe});return g.log.info(`Fallback model ${xe} succeeded`),ee.recordSuccess(ge,Te),Lh(mr,_,Le)}catch(Le){ee.recordFailure(ge,Te,Le.message),g.log.warn(`Fallback model ${Be.key} failed: ${Le.message}`);continue}}}return g.log.error(`All fallback models failed for ${H}`),null}async function du(g,_,k,N,q){let H=JSON.parse(JSON.stringify(g)),Y={},J=!1;if(J=VA(_,k,g),J&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],Y.headers=N),!J&&typeof k.transformRequestOut=="function"){let oe=await k.transformRequestOut(H);oe.body?(H=oe.body,Y=oe.config||{}):H=oe}if(!J&&_.transformer?.use?.length)for(let oe of _.transformer.use){if(!oe||typeof oe.transformRequestIn!="function")continue;let ee=await oe.transformRequestIn(H,_,q);ee.body?(H=ee.body,Y={...Y,...ee.config}):H=ee}if(!J&&_.transformer?.[g.model]?.use?.length)for(let oe of _.transformer[g.model].use)!oe||typeof oe.transformRequestIn!="function"||(H=await oe.transformRequestIn(H,_,q));return{requestBody:H,config:Y,bypass:J}}function VA(g,_,k){return g.transformer?.use?.length===1&&g.transformer.use[0].name===_.name&&(!g.transformer?.[k.model]?.use.length||g.transformer?.[k.model]?.use.length===1&&g.transformer?.[k.model]?.use[0].name===_.name)}async function ta(g,_,k,N,q,H,Y){let J=_.url||new URL(k.baseUrl);if(!_.TIMEOUT){let ae=N.configService.get("API_TIMEOUT_MS");ae&&(_.TIMEOUT=typeof ae=="string"?parseInt(ae,10):ae)}if(q&&typeof H.auth=="function"){let ae=await H.auth(g,k);if(ae.body){g=ae.body;let Ae=_.headers||{};ae.config?.headers&&(Ae={...Ae,...ae.config.headers},delete Ae.host,delete ae.config.headers),_={..._,...ae.config,headers:Ae}}else g=ae}let oe={Authorization:`Bearer ${k.apiKey}`,..._?.headers||{}};for(let ae in oe)(oe[ae]==="undefined"||["authorization","Authorization"].includes(ae)&&oe[ae]?.includes("undefined"))&&delete oe[ae];let ee=await bg(J,g,{httpsProxy:N.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(oe))},Y,N.log);if(!ee.ok){let ae=await ee.text();throw N.log.error(`[provider_response_error] Error from provider(${k.name},${g.model}: ${ee.status}): ${ae}`),Is(`Error from provider(${k.name},${g.model}: ${ee.status}): ${ae}`,ee.status,"provider_response_error")}return ee}async function Oh(g,_,k,N,q,H){let Y=_;if(!q&&k.transformer?.use?.length)for(let J of Array.from(k.transformer.use).reverse())!J||typeof J.transformResponseOut!="function"||(Y=await J.transformResponseOut(Y,H));if(!q&&k.transformer?.[g.model]?.use?.length)for(let J of Array.from(k.transformer[g.model].use).reverse())!J||typeof J.transformResponseOut!="function"||(Y=await J.transformResponseOut(Y,H));return!q&&N.transformResponseIn&&(Y=await N.transformResponseIn(Y,H)),Y}function Lh(g,_,k){return g.ok||_.code(g.status),k.stream===!0?(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),_.send(g.body)):g.json()}var nl=async g=>{g.get("/",async()=>({message:"LLMs API",version:wg})),g.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),g.get("/providers/health",async()=>({states:Zo().getAllStates().map(k=>({provider:k.provider,model:k.model,status:k.status,failureCount:k.failureCount,successCount:k.successCount,lastFailureTime:k.lastFailureTime,lastError:k.lastError})),timestamp:new Date().toISOString()}));let _=g.transformerService.getTransformersWithEndpoint();for(let{transformer:k}of _)k.endPoint&&g.post(k.endPoint,async(N,q)=>ea(N,q,g,k));g.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(k,N)=>{let{name:q,baseUrl:H,apiKey:Y,models:J}=k.body;if(!q?.trim())throw Is("Provider name is required",400,"invalid_request");if(!H||!YA(H))throw Is("Valid base URL is required",400,"invalid_request");if(!Y?.trim())throw Is("API key is required",400,"invalid_request");if(!J||!Array.isArray(J)||J.length===0)throw Is("At least one model is required",400,"invalid_request");if(g.providerService.getProvider(k.body.name))throw Is(`Provider with name '${k.body.name}' already exists`,400,"provider_exists");return g.providerService.registerProvider(k.body)}),g.get("/providers",async()=>g.providerService.getProviders()),g.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async k=>{let N=g.providerService.getProvider(k.params.id);if(!N)throw Is("Provider not found",404,"provider_not_found");return N}),g.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(k,N)=>{let q=g.providerService.updateProvider(k.params.id,k.body);if(!q)throw Is("Provider not found",404,"provider_not_found");return q}),g.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async k=>{if(!g.providerService.deleteProvider(k.params.id))throw Is("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),g.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(k,N)=>{if(!g.providerService.toggleProvider(k.params.id,k.body.enabled))throw Is("Provider not found",404,"provider_not_found");return{message:`Provider ${k.body.enabled?"enabled":"disabled"} successfully`}})};function YA(g){try{return new URL(g),!0}catch{return!1}}var tc=class{constructor(g,_,k){this.configService=g,this.transformerService=_,this.logger=k,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let g=this.configService.get("providers");if(g&&Array.isArray(g)){this.initializeFromProvidersArray(g);return}}initializeFromProvidersArray(g){g.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let k={};_.transformer&&Object.keys(_.transformer).forEach(N=>{N==="use"?Array.isArray(_.transformer.use)&&(k.use=_.transformer.use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let H=this.transformerService.getTransformer(q[0]);if(H)return new H(q[1])}if(typeof q=="string"){let H=this.transformerService.getTransformer(q);return typeof H=="function"?new H:H}}).filter(q=>typeof q<"u")):Array.isArray(_.transformer[N]?.use)&&(k[N]={use:_.transformer[N].use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let H=this.transformerService.getTransformer(q[0]);if(H)return new H(q[1])}if(typeof q=="string"){let H=this.transformerService.getTransformer(q);return typeof H=="function"?new H:H}}).filter(q=>typeof q<"u")})}),this.registerProvider({name:_.name,baseUrl:_.api_base_url,apiKey:_.api_key,models:_.models||[],quotaToken:_.quota_token,transformer:_.transformer?k:void 0}),this.logger.info(`${_.name} provider registered`)}catch(k){this.logger.error(`${_.name} provider registered error: ${k}`)}})}registerProvider(g){let _={...g};return this.providers.set(_.name,_),g.models.forEach(k=>{let N=`${_.name},${k}`,q={provider:_.name,model:k,fullModel:N};this.modelRoutes.set(N,q),this.modelRoutes.has(k)||this.modelRoutes.set(k,q)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(g){return this.providers.get(g)}updateProvider(g,_){let k=this.providers.get(g);if(!k)return null;let N={...k,..._,updatedAt:new Date};return this.providers.set(g,N),_.models&&(k.models.forEach(q=>{let H=`${k.name},${q}`;this.modelRoutes.delete(H),this.modelRoutes.delete(q)}),_.models.forEach(q=>{let H=`${k.name},${q}`,Y={provider:k.name,model:q,fullModel:H};this.modelRoutes.set(H,Y),this.modelRoutes.has(q)||this.modelRoutes.set(q,Y)})),N}deleteProvider(g){let _=this.providers.get(g);return _?(_.models.forEach(k=>{let N=`${_.name},${k}`;this.modelRoutes.delete(N),this.modelRoutes.delete(k)}),this.providers.delete(g),!0):!1}toggleProvider(g,_){return!!this.providers.get(g)}resolveModelRoute(g){let _=this.modelRoutes.get(g);if(!_)return null;let k=this.providers.get(_.provider);return k?{provider:k,originalModel:g,targetModel:_.model}:null}getAvailableModelNames(){let g=[];return this.providers.forEach(_=>{_.models.forEach(k=>{g.push(k),g.push(`${_.name},${k}`)})}),g}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(g){return g?Array.isArray(g)?g.reduce((_,k)=>{if(Array.isArray(k)){let[N,q={}]=k;_[N]=q}else _[k]={};return _},{}):g:{}}async getAvailableModels(){let g=[];return this.providers.forEach(_=>{_.models.forEach(k=>{g.push({id:k,object:"model",owned_by:_.name,provider:_.name}),g.push({id:`${_.name},${k}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:g}}},Ii=[];for(let g=0;g<256;++g)Ii.push((g+256).toString(16).slice(1));function rc(g,_=0){return(Ii[g[_+0]]+Ii[g[_+1]]+Ii[g[_+2]]+Ii[g[_+3]]+"-"+Ii[g[_+4]]+Ii[g[_+5]]+"-"+Ii[g[_+6]]+Ii[g[_+7]]+"-"+Ii[g[_+8]]+Ii[g[_+9]]+"-"+Ii[g[_+10]]+Ii[g[_+11]]+Ii[g[_+12]]+Ii[g[_+13]]+Ii[g[_+14]]+Ii[g[_+15]]).toLowerCase()}var JA=require("crypto"),il=new Uint8Array(256),nc=il.length;function _g(){return nc>il.length-16&&((0,JA.randomFillSync)(il),nc=0),il.slice(nc,nc+=16)}var Sg=require("crypto"),zA={randomUUID:Sg.randomUUID};function Fg(g,_,k){if(zA.randomUUID&&!_&&!g)return zA.randomUUID();g=g||{};let N=g.random??g.rng?.()??_g();if(N.length<16)throw new Error("Random bytes length must be >= 16");if(N[6]=N[6]&15|64,N[8]=N[8]&63|128,_){if(k=k||0,k<0||k+16>_.length)throw new RangeError(`UUID byte range ${k}:${k+15} is out of buffer bounds`);for(let q=0;q<16;++q)_[k+q]=N[q];return _}return rc(N)}var ra=Fg,kg=g=>g<=0?"none":g<=1024?"low":g<=8192?"medium":"high",WA=(g,_)=>(g.includes("base64")&&(g=g.split("base64").pop(),g.startsWith(",")&&(g=g.slice(1))),`data:${_};base64,${g}`),KA=class{constructor(g){this.options=g,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(g,_){let k={};return this.useBearer?(k.authorization=`Bearer ${_.apiKey}`,k["x-api-key"]=void 0):(k["x-api-key"]=_.apiKey,k.authorization=void 0),{body:g,config:{headers:k}}}async transformRequestOut(g){let _=[];if(g.system){if(typeof g.system=="string")_.push({role:"system",content:g.system});else if(Array.isArray(g.system)&&g.system.length){let N=g.system.filter(q=>q.type==="text"&&q.text).map(q=>({type:"text",text:q.text,cache_control:q.cache_control}));_.push({role:"system",content:N})}}JSON.parse(JSON.stringify(g.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){_.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let q=N.content.filter(Y=>Y.type==="tool_result"&&Y.tool_use_id);q.length&&q.forEach(Y=>{let J={role:"tool",content:typeof Y.content=="string"?Y.content:JSON.stringify(Y.content),tool_call_id:Y.tool_use_id,cache_control:Y.cache_control};_.push(J)});let H=N.content.filter(Y=>Y.type==="text"&&Y.text||Y.type==="image"&&Y.source);H.length&&_.push({role:"user",content:H.map(Y=>Y?.type==="image"?{type:"image_url",image_url:{url:Y.source?.type==="base64"?WA(Y.source.data,Y.source.media_type):Y.source.url},media_type:Y.source.media_type}:Y)})}else if(N.role==="assistant"){let q={role:"assistant",content:""},H=N.content.filter(oe=>oe.type==="text"&&oe.text);H.length&&(q.content=H.map(oe=>oe.text).join(`
583
583
  `));let Y=N.content.filter(oe=>oe.type==="tool_use"&&oe.id);Y.length&&(q.tool_calls=Y.map(oe=>({id:oe.id,type:"function",function:{name:oe.name,arguments:JSON.stringify(oe.input||{})}})));let J=N.content.find(oe=>oe.type==="thinking"&&oe.signature);J&&(q.thinking={content:J.thinking,signature:J.signature}),_.push(q)}return}}});let k={messages:_,model:g.model,max_tokens:g.max_tokens,temperature:g.temperature,stream:g.stream,tools:g.tools?.length?this.convertAnthropicToolsToUnified(g.tools):void 0,tool_choice:g.tool_choice};return g.thinking&&(k.reasoning={effort:kg(g.thinking.budget_tokens),enabled:g.thinking.type==="enabled"}),g.tool_choice&&(g.tool_choice.type==="tool"?k.tool_choice={type:"function",function:{name:g.tool_choice.name}}:k.tool_choice=g.tool_choice.type),k}async transformResponseIn(g,_){if(g.headers.get("Content-Type")?.includes("text/event-stream")){if(!g.body)throw new Error("Stream response body is null");let k=await this.convertOpenAIStreamToAnthropic(g.body,_);return new Response(k,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let k=await g.json(),N=this.convertOpenAIResponseToAnthropic(k,_);return new Response(JSON.stringify(N),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(g){return g.map(_=>({type:"function",function:{name:_.name,description:_.description||"",parameters:_.input_schema}}))}async convertOpenAIStreamToAnthropic(g,_){return new ReadableStream({start:async k=>{let N=new TextEncoder,q=`msg_${Date.now()}`,H=null,Y="unknown",J=!1,oe=!1,ee=!1,ae=new Map,Ae=new Map,me=0,se=0,he=0,ye=!1,De=!1,we=0,xe=-1,Be=()=>{let Xe=we;return we++,Xe},ge=Xe=>{if(!ye)try{k.enqueue(Xe);let ht=new TextDecoder().decode(Xe);this.logger.debug({reqId:_.req.id,data:ht,type:"send data"})}catch(ht){if(ht instanceof TypeError&&ht.message.includes("Controller is already closed"))ye=!0;else throw this.logger.debug({reqId:_.req.id,error:ht instanceof Error?ht.message:String(ht),type:"send data error"}),ht}},Te=()=>{if(!ye)try{if(xe>=0){let ht={type:"content_block_stop",index:xe};ge(N.encode(`event: content_block_stop
584
584
  data: ${JSON.stringify(ht)}
585
585
 
@@ -925,7 +925,7 @@ https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys`};var y=
925
925
  ${this.toMarkdown(n,t+1)}`:`${r}- ${n}`).join(`
926
926
  `):typeof e=="object"&&e!==null?Object.entries(e).map(([n,s])=>typeof s=="object"&&s!==null?`${r}${n}:
927
927
  ${this.toMarkdown(s,t+1)}`:`${r}${n}: ${s}`).join(`
928
- `):`${r}${e}`}async output(e,t={}){try{let r=this.formatData(e,t);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}}}}),Ax,fx=fi(()=>{"use strict";Ax=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 t=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${t}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,t){let{format:r="json",timestamp:n=!0,prefix:s,metadata:o}=t||{},i={data:e};return n&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),o&&Object.keys(o).length>0&&(i.metadata=o),i}async sendRequest(e,t,r,n,s){let o=new AbortController,i=setTimeout(()=>o.abort(),s);try{let a=await fetch(e,{method:t,headers:r,body:JSON.stringify(n),signal:o.signal});if(clearTimeout(i),!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);return a}catch(a){throw clearTimeout(i),a}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,r,n,s,o){let i=null;for(let a=1;a<=o.maxAttempts;a++)try{return await this.sendRequest(e,t,r,n,s)}catch(u){if(i=u,a===o.maxAttempts)break;let l=o.backoffMs*Math.pow(2,a-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${a}/${o.maxAttempts}), retrying in ${l}ms...`,u.message),await this.delay(l)}throw i}async output(e,t={}){let r=t.timeout||this.defaultTimeout;try{let n=this.buildHeaders(),s=this.buildBody(e,t),o=await this.sendWithRetry(this.config.url,this.config.method,n,s,r,this.config.retry);return!0}catch(n){let s=n instanceof Error?n.message:String(n);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}}),px,gx=fi(()=>{"use strict";px=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,nM.tmpdir)();this.baseDir=(0,H1.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,$m.existsSync)(this.baseDir)||(0,$m.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let t=e.match(/_session_([a-f0-9-]+)/i);return t?t[1]:null}catch{return null}}getFilePath(e){let t=this.config.prefix||"session",r=this.config.extension?`.${this.config.extension}`:"",n;if(this.config.includeTimestamp){let s=Date.now();n=`${t}-${e}-${s}${r}`}else n=`${t}-${e}${r}`;return(0,H1.join)(this.baseDir,n)}async output(e,t={}){try{let r=t.metadata?.sessionId;if(!r)return!1;let n={...e,timestamp:Date.now(),sessionId:r},s=this.getFilePath(r);return(0,$m.writeFileSync)(s,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),hw,Cd,_5=fi(()=>{"use strict";dx(),fx(),gx(),hw=class{handlers=new Map;defaultOptions={};registerHandler(e,t){this.handlers.set(e,t)}registerHandlers(e){for(let t of e)if(t.enabled!==!1)try{let r=this.createHandler(t),n=t.type+"_"+Date.now();this.registerHandler(n,r)}catch(r){console.error(`[OutputManager] Failed to register ${t.type} handler:`,r)}}createHandler(e){switch(e.type){case"console":return new hx(e.config);case"webhook":return new Ax(e.config);case"temp-file":return new px(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,t){let r={...this.defaultOptions,...t},n={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([o,i])=>{try{await i.output(e,r)?n.success.push(o):n.failed.push(o)}catch(a){console.error(`[OutputManager] Handler ${o} failed:`,a),n.failed.push(o)}});return await Promise.all(s),n}async outputTo(e,t,r){let n={...this.defaultOptions,...r},s={success:[],failed:[]},o=e.map(async i=>{let a=this.handlers.get(i);if(!a){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await a.output(t,n)?s.success.push(i):s.failed.push(i)}catch(u){console.error(`[OutputManager] Handler ${i} failed:`,u),s.failed.push(i)}});return await Promise.all(o),s}async outputToType(e,t,r){let n=Array.from(this.handlers.entries()).filter(([s,o])=>o.type===e).map(([s])=>s);return this.outputTo(n,t,r)}},Cd=new hw}),S5=Lu(tv(),1),dw=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,q1.join)(process.cwd(),this.options.jsonPath);if((0,Hm.existsSync)(e))try{let t=(0,Hm.readFileSync)(e,"utf-8"),r=S5.default.parse(t);this.config={...this.config,...r},console.log(`Loaded JSON config from: ${e}`)}catch(t){console.warn(`Failed to load JSON config from ${e}:`,t)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,q1.join)(process.cwd(),this.options.envPath);if((0,Hm.existsSync)(e))try{let t=(0,oM.config)({path:e});t.parsed&&(this.config={...this.config,...this.parseEnvConfig(t.parsed)})}catch(t){console.warn(`Failed to load .env config from ${e}:`,t)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let t={};return Object.assign(t,e),t}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,t){let r=this.config[e];return r!==void 0?r:t}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,t){this.config[e]=t}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 so(e,t=500,r="internal_error",n="api_error"){let s=new Error(e);return s.statusCode=t,s.code=r,s.type=n,s}async function F5(e,t,r){t.log.error(e);let n=e.statusCode||500,s={error:{message:e.message+e.stack||"Internal Server Error",type:e.type||"api_error",code:e.code||"internal_error"}};return r.code(n).send(s)}function k5(e,t,r,n,s){let o=new Headers({"Content-Type":"application/json"});r.headers&&Object.entries(r.headers).forEach(([l,c])=>{c&&o.set(l,c)});let i,a=AbortSignal.timeout(r.TIMEOUT??60*1e3*60);if(r.signal){let l=new AbortController,c=()=>l.abort();r.signal.addEventListener("abort",c),a.addEventListener("abort",c),i=l.signal}else i=a;let u={method:"POST",headers:o,body:JSON.stringify(t),signal:i};return r.httpsProxy&&(u.dispatcher=new aM.ProxyAgent(new URL(r.httpsProxy).toString())),s?.debug({reqId:n.req.id,request:u,headers:Object.fromEntries(o.entries()),requestUrl:typeof e=="string"?e:e.toString(),useProxy:r.httpsProxy},"final request"),fetch(typeof e=="string"?e:e.toString(),u)}var T5="2.0.56",R5={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},Q5=class{states=new Map;config;probeTimer;constructor(e){this.config={...R5,...e}}getKey(e,t){return`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let r=this.getKey(e,t),n=this.states.get(r);n&&(n.successCount++,n.status==="half-open"?n.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(r):n.status==="open"&&(n.status="half-open",n.successCount=1,n.failureCount=0))}isRateLimitError(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("429")||t.includes("rate_limit")||t.includes("ratelimit")||t.includes("rate limit")||t.includes("overloaded")||t.includes("quota")}recordFailure(e,t,r){if(!this.config.enabled)return;let n=this.getKey(e,t),s=this.states.get(n);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(n,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=r;let o=this.isRateLimitError(r)?this.config.rateLimitThreshold:this.config.failureThreshold;s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=o&&(s.status="open",s.lastProbeTime=0)}getState(e,t){return this.states.get(this.getKey(e,t))}isAvailable(e,t){if(!this.config.enabled)return!0;let r=this.getState(e,t);return r?r.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,r]of this.states)r.status==="open"&&e.push(t);return e}getHalfOpenModels(){let e=[];for(let[t,r]of this.states)r.status==="half-open"&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let r=this.getKey(e,t),n=this.states.get(r);n&&n.status==="open"&&(n.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},Zm=null;function bl(e){return Zm||(Zm=new Q5(e)),Zm}var mx=new Map,N5=["x-ratelimit-remaining","x-ratelimit-remaining-requests","x-ratelimit-remaining-tokens"],O5=["x-ratelimit-limit","x-ratelimit-limit-requests","x-ratelimit-limit-tokens"],L5=["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"];function Fy(e,t,r){let n=a=>{if(r instanceof Headers)return r.get(a);let u=Object.keys(r).find(l=>l.toLowerCase()===a);return u?r[u]:null},s=Xm(n,N5),o=Xm(n,O5),i=Xm(n,L5);(s||o||i)&&mx.set(e,{provider:e,remaining:Aw(s),limit:Aw(o),reset:M5(i),capturedAt:Date.now()})}function P5(){return Array.from(mx.values())}function Xm(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function Aw(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function M5(e){if(!e)return null;let t=e.trim();if(!t)return null;let r=Number(t);if(Number.isFinite(r))return r>1e12?Math.floor(r/1e3):r>1e9?Math.floor(r):Math.floor(Date.now()/1e3+r);let n=Date.parse(t);if(Number.isFinite(n))return Math.floor(n/1e3);let s=U5(t);return s===null?null:Math.floor((Date.now()+s)/1e3)}function U5(e){let t=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,r=0,n=!1;for(let s of e.matchAll(t)){n=!0;let o=Number(s[1]),i=s[2].toLowerCase();if(Number.isFinite(o))switch(i){case"ms":r+=o;break;case"s":r+=o*1e3;break;case"m":r+=o*60*1e3;break;case"h":r+=o*60*60*1e3;break;case"d":r+=o*24*60*60*1e3;break}}return n?r:null}async function j5(e,t,r,n){let s=e.body,o=e.provider,i=r.providerService.getProvider(o);if(!i)throw so(`Provider '${o}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await Ex(s,i,n,e.headers,{req:e}),c=await yx(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&Fy(o,i.baseUrl,c.headers)}catch{}let h=await Dx(a,c,i,n,l,{req:e});return Cx(h,t,s)}catch(a){let u=await $5(e,t,r,n,a);if(u)return u;throw a}}async function $5(e,t,r,n,s){let o=e.scenarioType||"default",i=e.familyFallback,a=e.modelFamily,u=r.configService.get("fallback"),l=bl(),c=m=>{let[E,...C]=m.split(","),y=E?.trim(),D=C.join(",").trim();return!y||!D?null:{provider:y,model:D,key:`${y},${D}`}},h=[];if(a){let m=i?.[o];Array.isArray(m)&&m.length>0?h.push({name:`${a}/${o}`,models:m}):e.log.warn(`No ${a} fallback configured for ${o}; will try global ${o} fallback`)}if(Array.isArray(u?.[o])&&u[o].length>0&&h.push({name:`global/${o}`,models:u[o]}),h.length===0)return null;let A=e.provider||"",d=e.body.model||"",f=new Set;A&&d&&(l.recordFailure(A,d,s?.message),f.add(`${A},${d}`));let p=h.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${o}, trying ${p} fallback models across ${h.length} fallback stage(s)`);for(let m of h){let E=[...m.models].sort((C,y)=>{let D=c(C),w=c(y);return!D||!w?!D&&!w?0:D?-1:1:l.getPriority(D.provider,D.model)-l.getPriority(w.provider,w.model)});e.log.info(`Trying ${m.name} fallback stage with ${E.length} models`);for(let C of E){let y=c(C);if(!y){e.log.warn(`Fallback model '${C}' is invalid, skipping`);continue}if(f.has(y.key))continue;f.add(y.key);let D=y.provider,w=y.model;try{if(!l.isAvailable(D,w)){e.log.warn(`Fallback model ${C} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${C}`);let v={...e.body};v.model=w;let b={...e,provider:D,body:v},I=r.providerService.getProvider(D);if(!I){e.log.warn(`Fallback provider '${D}' not found, skipping`);continue}let{requestBody:B,config:S,bypass:x}=await Ex(v,I,n,e.headers,{req:b}),F=await yx(B,S,I,r,x,n,{req:b});try{I?.baseUrl&&F?.headers&&Fy(D,I.baseUrl,F.headers)}catch{}let R=await Dx(B,F,I,n,x,{req:b});return e.log.info(`Fallback model ${C} succeeded`),l.recordSuccess(D,w),Cx(R,t,v)}catch(v){l.recordFailure(D,w,v.message),e.log.warn(`Fallback model ${y.key} failed: ${v.message}`);continue}}}return e.log.error(`All fallback models failed for ${o}`),null}async function Ex(e,t,r,n,s){let o=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=H5(t,r,e),a&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],i.headers=n),!a&&typeof r.transformRequestOut=="function"){let u=await r.transformRequestOut(o);u.body?(o=u.body,i=u.config||{}):o=u}if(!a&&t.transformer?.use?.length)for(let u of t.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let l=await u.transformRequestIn(o,t,s);l.body?(o=l.body,i={...i,...l.config}):o=l}if(!a&&t.transformer?.[e.model]?.use?.length)for(let u of t.transformer[e.model].use)!u||typeof u.transformRequestIn!="function"||(o=await u.transformRequestIn(o,t,s));return{requestBody:o,config:i,bypass:a}}function H5(e,t,r){return e.transformer?.use?.length===1&&e.transformer.use[0].name===t.name&&(!e.transformer?.[r.model]?.use.length||e.transformer?.[r.model]?.use.length===1&&e.transformer?.[r.model]?.use[0].name===t.name)}async function yx(e,t,r,n,s,o,i){let a=t.url||new URL(r.baseUrl);if(!t.TIMEOUT){let c=n.configService.get("API_TIMEOUT_MS");c&&(t.TIMEOUT=typeof c=="string"?parseInt(c,10):c)}if(s&&typeof o.auth=="function"){let c=await o.auth(e,r);if(c.body){e=c.body;let h=t.headers||{};c.config?.headers&&(h={...h,...c.config.headers},delete h.host,delete c.config.headers),t={...t,...c.config,headers:h}}else e=c}let u={Authorization:`Bearer ${r.apiKey}`,...t?.headers||{}};for(let c in u)(u[c]==="undefined"||["authorization","Authorization"].includes(c)&&u[c]?.includes("undefined"))&&delete u[c];let l=await k5(a,e,{httpsProxy:n.configService.getHttpsProxy(),...t,headers:JSON.parse(JSON.stringify(u))},i,n.log);if(!l.ok){let c=await l.text();throw n.log.error(`[provider_response_error] Error from provider(${r.name},${e.model}: ${l.status}): ${c}`),so(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error")}return l}async function Dx(e,t,r,n,s,o){let i=t;if(!s&&r.transformer?.use?.length)for(let a of Array.from(r.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,o));if(!s&&r.transformer?.[e.model]?.use?.length)for(let a of Array.from(r.transformer[e.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,o));return!s&&n.transformResponseIn&&(i=await n.transformResponseIn(i,o)),i}function Cx(e,t,r){return e.ok||t.code(e.status),r.stream===!0?(t.header("Content-Type","text/event-stream"),t.header("Cache-Control","no-cache"),t.header("Connection","keep-alive"),t.send(e.body)):e.json()}var fw=async e=>{e.get("/",async()=>({message:"LLMs API",version:T5})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:bl().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError})),timestamp:new Date().toISOString()}));let t=e.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of t)r.endPoint&&e.post(r.endPoint,async(n,s)=>j5(n,s,e,r));e.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(r,n)=>{let{name:s,baseUrl:o,apiKey:i,models:a}=r.body;if(!s?.trim())throw so("Provider name is required",400,"invalid_request");if(!o||!q5(o))throw so("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw so("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw so("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw so(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return e.providerService.registerProvider(r.body)}),e.get("/providers",async()=>e.providerService.getProviders()),e.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=e.providerService.getProvider(r.params.id);if(!n)throw so("Provider not found",404,"provider_not_found");return n}),e.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(r,n)=>{let s=e.providerService.updateProvider(r.params.id,r.body);if(!s)throw so("Provider not found",404,"provider_not_found");return s}),e.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!e.providerService.deleteProvider(r.params.id))throw so("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),e.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(r,n)=>{if(!e.providerService.toggleProvider(r.params.id,r.body.enabled))throw so("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function q5(e){try{return new URL(e),!0}catch{return!1}}var pw=class{constructor(e,t,r){this.configService=e,this.transformerService=t,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(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let r={};t.transformer&&Object.keys(t.transformer).forEach(n=>{n==="use"?Array.isArray(t.transformer.use)&&(r.use=t.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let o=this.transformerService.getTransformer(s[0]);if(o)return new o(s[1])}if(typeof s=="string"){let o=this.transformerService.getTransformer(s);return typeof o=="function"?new o:o}}).filter(s=>typeof s<"u")):Array.isArray(t.transformer[n]?.use)&&(r[n]={use:t.transformer[n].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let o=this.transformerService.getTransformer(s[0]);if(o)return new o(s[1])}if(typeof s=="string"){let o=this.transformerService.getTransformer(s);return typeof o=="function"?new o:o}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,models:t.models||[],quotaToken:t.quota_token,transformer:t.transformer?r:void 0}),this.logger.info(`${t.name} provider registered`)}catch(r){this.logger.error(`${t.name} provider registered error: ${r}`)}})}registerProvider(e){let t={...e};return this.providers.set(t.name,t),e.models.forEach(r=>{let n=`${t.name},${r}`,s={provider:t.name,model:r,fullModel:n};this.modelRoutes.set(n,s),this.modelRoutes.has(r)||this.modelRoutes.set(r,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let r=this.providers.get(e);if(!r)return null;let n={...r,...t,updatedAt:new Date};return this.providers.set(e,n),t.models&&(r.models.forEach(s=>{let o=`${r.name},${s}`;this.modelRoutes.delete(o),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let o=`${r.name},${s}`,i={provider:r.name,model:s,fullModel:o};this.modelRoutes.set(o,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),n}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(r=>{let n=`${t.name},${r}`;this.modelRoutes.delete(n),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){return!!this.providers.get(e)}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let r=this.providers.get(t.provider);return r?{provider:r,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.models.forEach(r=>{e.push(r),e.push(`${t.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,r)=>{if(Array.isArray(r)){let[n,s={}]=r;t[n]=s}else t[r]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.models.forEach(r=>{e.push({id:r,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${r}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}},Vi=[];for(let e=0;e<256;++e)Vi.push((e+256).toString(16).slice(1));function G5(e,t=0){return(Vi[e[t+0]]+Vi[e[t+1]]+Vi[e[t+2]]+Vi[e[t+3]]+"-"+Vi[e[t+4]]+Vi[e[t+5]]+"-"+Vi[e[t+6]]+Vi[e[t+7]]+"-"+Vi[e[t+8]]+Vi[e[t+9]]+"-"+Vi[e[t+10]]+Vi[e[t+11]]+Vi[e[t+12]]+Vi[e[t+13]]+Vi[e[t+14]]+Vi[e[t+15]]).toLowerCase()}var f0=new Uint8Array(256),t0=f0.length;function V5(){return t0>f0.length-16&&((0,uM.randomFillSync)(f0),t0=0),f0.slice(t0,t0+=16)}var gw={randomUUID:lM.randomUUID};function Y5(e,t,r){if(gw.randomUUID&&!t&&!e)return gw.randomUUID();e=e||{};let n=e.random??e.rng?.()??V5();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let s=0;s<16;++s)t[r+s]=n[s];return t}return G5(n)}var xd=Y5,J5=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",z5=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),W5=class{constructor(e){this.options=e,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let r={};return this.useBearer?(r.authorization=`Bearer ${t.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=t.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let t=[];if(e.system){if(typeof e.system=="string")t.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let n=e.system.filter(s=>s.type==="text"&&s.text).map(s=>({type:"text",text:s.text,cache_control:s.cache_control}));t.push({role:"system",content:n})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(n=>{if(n.role==="user"||n.role==="assistant"){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});return}if(Array.isArray(n.content)){if(n.role==="user"){let s=n.content.filter(i=>i.type==="tool_result"&&i.tool_use_id);s.length&&s.forEach(i=>{let a={role:"tool",content:typeof i.content=="string"?i.content:JSON.stringify(i.content),tool_call_id:i.tool_use_id,cache_control:i.cache_control};t.push(a)});let o=n.content.filter(i=>i.type==="text"&&i.text||i.type==="image"&&i.source);o.length&&t.push({role:"user",content:o.map(i=>i?.type==="image"?{type:"image_url",image_url:{url:i.source?.type==="base64"?z5(i.source.data,i.source.media_type):i.source.url},media_type:i.source.media_type}:i)})}else if(n.role==="assistant"){let s={role:"assistant",content:""},o=n.content.filter(u=>u.type==="text"&&u.text);o.length&&(s.content=o.map(u=>u.text).join(`
928
+ `):`${r}${e}`}async output(e,t={}){try{let r=this.formatData(e,t);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}}}}),Ax,fx=fi(()=>{"use strict";Ax=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 t=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${t}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,t){let{format:r="json",timestamp:n=!0,prefix:s,metadata:o}=t||{},i={data:e};return n&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),o&&Object.keys(o).length>0&&(i.metadata=o),i}async sendRequest(e,t,r,n,s){let o=new AbortController,i=setTimeout(()=>o.abort(),s);try{let a=await fetch(e,{method:t,headers:r,body:JSON.stringify(n),signal:o.signal});if(clearTimeout(i),!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);return a}catch(a){throw clearTimeout(i),a}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,r,n,s,o){let i=null;for(let a=1;a<=o.maxAttempts;a++)try{return await this.sendRequest(e,t,r,n,s)}catch(u){if(i=u,a===o.maxAttempts)break;let l=o.backoffMs*Math.pow(2,a-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${a}/${o.maxAttempts}), retrying in ${l}ms...`,u.message),await this.delay(l)}throw i}async output(e,t={}){let r=t.timeout||this.defaultTimeout;try{let n=this.buildHeaders(),s=this.buildBody(e,t),o=await this.sendWithRetry(this.config.url,this.config.method,n,s,r,this.config.retry);return!0}catch(n){let s=n instanceof Error?n.message:String(n);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}}),px,gx=fi(()=>{"use strict";px=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,nM.tmpdir)();this.baseDir=(0,H1.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,$m.existsSync)(this.baseDir)||(0,$m.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let t=e.match(/_session_([a-f0-9-]+)/i);return t?t[1]:null}catch{return null}}getFilePath(e){let t=this.config.prefix||"session",r=this.config.extension?`.${this.config.extension}`:"",n;if(this.config.includeTimestamp){let s=Date.now();n=`${t}-${e}-${s}${r}`}else n=`${t}-${e}${r}`;return(0,H1.join)(this.baseDir,n)}async output(e,t={}){try{let r=t.metadata?.sessionId;if(!r)return!1;let n={...e,timestamp:Date.now(),sessionId:r},s=this.getFilePath(r);return(0,$m.writeFileSync)(s,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),hw,Cd,_5=fi(()=>{"use strict";dx(),fx(),gx(),hw=class{handlers=new Map;defaultOptions={};registerHandler(e,t){this.handlers.set(e,t)}registerHandlers(e){for(let t of e)if(t.enabled!==!1)try{let r=this.createHandler(t),n=t.type+"_"+Date.now();this.registerHandler(n,r)}catch(r){console.error(`[OutputManager] Failed to register ${t.type} handler:`,r)}}createHandler(e){switch(e.type){case"console":return new hx(e.config);case"webhook":return new Ax(e.config);case"temp-file":return new px(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,t){let r={...this.defaultOptions,...t},n={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([o,i])=>{try{await i.output(e,r)?n.success.push(o):n.failed.push(o)}catch(a){console.error(`[OutputManager] Handler ${o} failed:`,a),n.failed.push(o)}});return await Promise.all(s),n}async outputTo(e,t,r){let n={...this.defaultOptions,...r},s={success:[],failed:[]},o=e.map(async i=>{let a=this.handlers.get(i);if(!a){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await a.output(t,n)?s.success.push(i):s.failed.push(i)}catch(u){console.error(`[OutputManager] Handler ${i} failed:`,u),s.failed.push(i)}});return await Promise.all(o),s}async outputToType(e,t,r){let n=Array.from(this.handlers.entries()).filter(([s,o])=>o.type===e).map(([s])=>s);return this.outputTo(n,t,r)}},Cd=new hw}),S5=Lu(tv(),1),dw=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,q1.join)(process.cwd(),this.options.jsonPath);if((0,Hm.existsSync)(e))try{let t=(0,Hm.readFileSync)(e,"utf-8"),r=S5.default.parse(t);this.config={...this.config,...r},console.log(`Loaded JSON config from: ${e}`)}catch(t){console.warn(`Failed to load JSON config from ${e}:`,t)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,q1.join)(process.cwd(),this.options.envPath);if((0,Hm.existsSync)(e))try{let t=(0,oM.config)({path:e});t.parsed&&(this.config={...this.config,...this.parseEnvConfig(t.parsed)})}catch(t){console.warn(`Failed to load .env config from ${e}:`,t)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let t={};return Object.assign(t,e),t}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,t){let r=this.config[e];return r!==void 0?r:t}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,t){this.config[e]=t}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 so(e,t=500,r="internal_error",n="api_error"){let s=new Error(e);return s.statusCode=t,s.code=r,s.type=n,s}async function F5(e,t,r){t.log.error(e);let n=e.statusCode||500,s={error:{message:e.message+e.stack||"Internal Server Error",type:e.type||"api_error",code:e.code||"internal_error"}};return r.code(n).send(s)}function k5(e,t,r,n,s){let o=new Headers({"Content-Type":"application/json"});r.headers&&Object.entries(r.headers).forEach(([l,c])=>{c&&o.set(l,c)});let i,a=AbortSignal.timeout(r.TIMEOUT??60*1e3*60);if(r.signal){let l=new AbortController,c=()=>l.abort();r.signal.addEventListener("abort",c),a.addEventListener("abort",c),i=l.signal}else i=a;let u={method:"POST",headers:o,body:JSON.stringify(t),signal:i};return r.httpsProxy&&(u.dispatcher=new aM.ProxyAgent(new URL(r.httpsProxy).toString())),s?.debug({reqId:n.req.id,request:u,headers:Object.fromEntries(o.entries()),requestUrl:typeof e=="string"?e:e.toString(),useProxy:r.httpsProxy},"final request"),fetch(typeof e=="string"?e:e.toString(),u)}var T5="2.0.58",R5={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},Q5=class{states=new Map;config;probeTimer;constructor(e){this.config={...R5,...e}}getKey(e,t){return`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let r=this.getKey(e,t),n=this.states.get(r);n&&(n.successCount++,n.status==="half-open"?n.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(r):n.status==="open"&&(n.status="half-open",n.successCount=1,n.failureCount=0))}isRateLimitError(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("429")||t.includes("rate_limit")||t.includes("ratelimit")||t.includes("rate limit")||t.includes("overloaded")||t.includes("quota")}recordFailure(e,t,r){if(!this.config.enabled)return;let n=this.getKey(e,t),s=this.states.get(n);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(n,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=r;let o=this.isRateLimitError(r)?this.config.rateLimitThreshold:this.config.failureThreshold;s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=o&&(s.status="open",s.lastProbeTime=0)}getState(e,t){return this.states.get(this.getKey(e,t))}isAvailable(e,t){if(!this.config.enabled)return!0;let r=this.getState(e,t);return r?r.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,r]of this.states)r.status==="open"&&e.push(t);return e}getHalfOpenModels(){let e=[];for(let[t,r]of this.states)r.status==="half-open"&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let r=this.getKey(e,t),n=this.states.get(r);n&&n.status==="open"&&(n.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},Zm=null;function bl(e){return Zm||(Zm=new Q5(e)),Zm}var mx=new Map,N5=["x-ratelimit-remaining","x-ratelimit-remaining-requests","x-ratelimit-remaining-tokens"],O5=["x-ratelimit-limit","x-ratelimit-limit-requests","x-ratelimit-limit-tokens"],L5=["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"];function Fy(e,t,r){let n=a=>{if(r instanceof Headers)return r.get(a);let u=Object.keys(r).find(l=>l.toLowerCase()===a);return u?r[u]:null},s=Xm(n,N5),o=Xm(n,O5),i=Xm(n,L5);(s||o||i)&&mx.set(e,{provider:e,remaining:Aw(s),limit:Aw(o),reset:M5(i),capturedAt:Date.now()})}function P5(){return Array.from(mx.values())}function Xm(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function Aw(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function M5(e){if(!e)return null;let t=e.trim();if(!t)return null;let r=Number(t);if(Number.isFinite(r))return r>1e12?Math.floor(r/1e3):r>1e9?Math.floor(r):Math.floor(Date.now()/1e3+r);let n=Date.parse(t);if(Number.isFinite(n))return Math.floor(n/1e3);let s=U5(t);return s===null?null:Math.floor((Date.now()+s)/1e3)}function U5(e){let t=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,r=0,n=!1;for(let s of e.matchAll(t)){n=!0;let o=Number(s[1]),i=s[2].toLowerCase();if(Number.isFinite(o))switch(i){case"ms":r+=o;break;case"s":r+=o*1e3;break;case"m":r+=o*60*1e3;break;case"h":r+=o*60*60*1e3;break;case"d":r+=o*24*60*60*1e3;break}}return n?r:null}async function j5(e,t,r,n){let s=e.body,o=e.provider,i=r.providerService.getProvider(o);if(!i)throw so(`Provider '${o}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await Ex(s,i,n,e.headers,{req:e}),c=await yx(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&Fy(o,i.baseUrl,c.headers)}catch{}let h=await Dx(a,c,i,n,l,{req:e});return Cx(h,t,s)}catch(a){let u=await $5(e,t,r,n,a);if(u)return u;throw a}}async function $5(e,t,r,n,s){let o=e.scenarioType||"default",i=e.familyFallback,a=e.modelFamily,u=r.configService.get("fallback"),l=bl(),c=m=>{let[E,...C]=m.split(","),y=E?.trim(),D=C.join(",").trim();return!y||!D?null:{provider:y,model:D,key:`${y},${D}`}},h=[];if(a){let m=i?.[o];Array.isArray(m)&&m.length>0?h.push({name:`${a}/${o}`,models:m}):e.log.warn(`No ${a} fallback configured for ${o}; will try global ${o} fallback`)}if(Array.isArray(u?.[o])&&u[o].length>0&&h.push({name:`global/${o}`,models:u[o]}),h.length===0)return null;let A=e.provider||"",d=e.body.model||"",f=new Set;A&&d&&(l.recordFailure(A,d,s?.message),f.add(`${A},${d}`));let p=h.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${o}, trying ${p} fallback models across ${h.length} fallback stage(s)`);for(let m of h){let E=[...m.models].sort((C,y)=>{let D=c(C),w=c(y);return!D||!w?!D&&!w?0:D?-1:1:l.getPriority(D.provider,D.model)-l.getPriority(w.provider,w.model)});e.log.info(`Trying ${m.name} fallback stage with ${E.length} models`);for(let C of E){let y=c(C);if(!y){e.log.warn(`Fallback model '${C}' is invalid, skipping`);continue}if(f.has(y.key))continue;f.add(y.key);let D=y.provider,w=y.model;try{if(!l.isAvailable(D,w)){e.log.warn(`Fallback model ${C} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${C}`);let v={...e.body};v.model=w;let b={...e,provider:D,body:v},I=r.providerService.getProvider(D);if(!I){e.log.warn(`Fallback provider '${D}' not found, skipping`);continue}let{requestBody:B,config:S,bypass:x}=await Ex(v,I,n,e.headers,{req:b}),F=await yx(B,S,I,r,x,n,{req:b});try{I?.baseUrl&&F?.headers&&Fy(D,I.baseUrl,F.headers)}catch{}let R=await Dx(B,F,I,n,x,{req:b});return e.log.info(`Fallback model ${C} succeeded`),l.recordSuccess(D,w),Cx(R,t,v)}catch(v){l.recordFailure(D,w,v.message),e.log.warn(`Fallback model ${y.key} failed: ${v.message}`);continue}}}return e.log.error(`All fallback models failed for ${o}`),null}async function Ex(e,t,r,n,s){let o=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=H5(t,r,e),a&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],i.headers=n),!a&&typeof r.transformRequestOut=="function"){let u=await r.transformRequestOut(o);u.body?(o=u.body,i=u.config||{}):o=u}if(!a&&t.transformer?.use?.length)for(let u of t.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let l=await u.transformRequestIn(o,t,s);l.body?(o=l.body,i={...i,...l.config}):o=l}if(!a&&t.transformer?.[e.model]?.use?.length)for(let u of t.transformer[e.model].use)!u||typeof u.transformRequestIn!="function"||(o=await u.transformRequestIn(o,t,s));return{requestBody:o,config:i,bypass:a}}function H5(e,t,r){return e.transformer?.use?.length===1&&e.transformer.use[0].name===t.name&&(!e.transformer?.[r.model]?.use.length||e.transformer?.[r.model]?.use.length===1&&e.transformer?.[r.model]?.use[0].name===t.name)}async function yx(e,t,r,n,s,o,i){let a=t.url||new URL(r.baseUrl);if(!t.TIMEOUT){let c=n.configService.get("API_TIMEOUT_MS");c&&(t.TIMEOUT=typeof c=="string"?parseInt(c,10):c)}if(s&&typeof o.auth=="function"){let c=await o.auth(e,r);if(c.body){e=c.body;let h=t.headers||{};c.config?.headers&&(h={...h,...c.config.headers},delete h.host,delete c.config.headers),t={...t,...c.config,headers:h}}else e=c}let u={Authorization:`Bearer ${r.apiKey}`,...t?.headers||{}};for(let c in u)(u[c]==="undefined"||["authorization","Authorization"].includes(c)&&u[c]?.includes("undefined"))&&delete u[c];let l=await k5(a,e,{httpsProxy:n.configService.getHttpsProxy(),...t,headers:JSON.parse(JSON.stringify(u))},i,n.log);if(!l.ok){let c=await l.text();throw n.log.error(`[provider_response_error] Error from provider(${r.name},${e.model}: ${l.status}): ${c}`),so(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error")}return l}async function Dx(e,t,r,n,s,o){let i=t;if(!s&&r.transformer?.use?.length)for(let a of Array.from(r.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,o));if(!s&&r.transformer?.[e.model]?.use?.length)for(let a of Array.from(r.transformer[e.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,o));return!s&&n.transformResponseIn&&(i=await n.transformResponseIn(i,o)),i}function Cx(e,t,r){return e.ok||t.code(e.status),r.stream===!0?(t.header("Content-Type","text/event-stream"),t.header("Cache-Control","no-cache"),t.header("Connection","keep-alive"),t.send(e.body)):e.json()}var fw=async e=>{e.get("/",async()=>({message:"LLMs API",version:T5})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:bl().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError})),timestamp:new Date().toISOString()}));let t=e.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of t)r.endPoint&&e.post(r.endPoint,async(n,s)=>j5(n,s,e,r));e.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(r,n)=>{let{name:s,baseUrl:o,apiKey:i,models:a}=r.body;if(!s?.trim())throw so("Provider name is required",400,"invalid_request");if(!o||!q5(o))throw so("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw so("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw so("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw so(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return e.providerService.registerProvider(r.body)}),e.get("/providers",async()=>e.providerService.getProviders()),e.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=e.providerService.getProvider(r.params.id);if(!n)throw so("Provider not found",404,"provider_not_found");return n}),e.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(r,n)=>{let s=e.providerService.updateProvider(r.params.id,r.body);if(!s)throw so("Provider not found",404,"provider_not_found");return s}),e.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!e.providerService.deleteProvider(r.params.id))throw so("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),e.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(r,n)=>{if(!e.providerService.toggleProvider(r.params.id,r.body.enabled))throw so("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function q5(e){try{return new URL(e),!0}catch{return!1}}var pw=class{constructor(e,t,r){this.configService=e,this.transformerService=t,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(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let r={};t.transformer&&Object.keys(t.transformer).forEach(n=>{n==="use"?Array.isArray(t.transformer.use)&&(r.use=t.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let o=this.transformerService.getTransformer(s[0]);if(o)return new o(s[1])}if(typeof s=="string"){let o=this.transformerService.getTransformer(s);return typeof o=="function"?new o:o}}).filter(s=>typeof s<"u")):Array.isArray(t.transformer[n]?.use)&&(r[n]={use:t.transformer[n].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let o=this.transformerService.getTransformer(s[0]);if(o)return new o(s[1])}if(typeof s=="string"){let o=this.transformerService.getTransformer(s);return typeof o=="function"?new o:o}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,models:t.models||[],quotaToken:t.quota_token,transformer:t.transformer?r:void 0}),this.logger.info(`${t.name} provider registered`)}catch(r){this.logger.error(`${t.name} provider registered error: ${r}`)}})}registerProvider(e){let t={...e};return this.providers.set(t.name,t),e.models.forEach(r=>{let n=`${t.name},${r}`,s={provider:t.name,model:r,fullModel:n};this.modelRoutes.set(n,s),this.modelRoutes.has(r)||this.modelRoutes.set(r,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let r=this.providers.get(e);if(!r)return null;let n={...r,...t,updatedAt:new Date};return this.providers.set(e,n),t.models&&(r.models.forEach(s=>{let o=`${r.name},${s}`;this.modelRoutes.delete(o),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let o=`${r.name},${s}`,i={provider:r.name,model:s,fullModel:o};this.modelRoutes.set(o,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),n}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(r=>{let n=`${t.name},${r}`;this.modelRoutes.delete(n),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){return!!this.providers.get(e)}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let r=this.providers.get(t.provider);return r?{provider:r,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.models.forEach(r=>{e.push(r),e.push(`${t.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,r)=>{if(Array.isArray(r)){let[n,s={}]=r;t[n]=s}else t[r]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.models.forEach(r=>{e.push({id:r,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${r}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}},Vi=[];for(let e=0;e<256;++e)Vi.push((e+256).toString(16).slice(1));function G5(e,t=0){return(Vi[e[t+0]]+Vi[e[t+1]]+Vi[e[t+2]]+Vi[e[t+3]]+"-"+Vi[e[t+4]]+Vi[e[t+5]]+"-"+Vi[e[t+6]]+Vi[e[t+7]]+"-"+Vi[e[t+8]]+Vi[e[t+9]]+"-"+Vi[e[t+10]]+Vi[e[t+11]]+Vi[e[t+12]]+Vi[e[t+13]]+Vi[e[t+14]]+Vi[e[t+15]]).toLowerCase()}var f0=new Uint8Array(256),t0=f0.length;function V5(){return t0>f0.length-16&&((0,uM.randomFillSync)(f0),t0=0),f0.slice(t0,t0+=16)}var gw={randomUUID:lM.randomUUID};function Y5(e,t,r){if(gw.randomUUID&&!t&&!e)return gw.randomUUID();e=e||{};let n=e.random??e.rng?.()??V5();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let s=0;s<16;++s)t[r+s]=n[s];return t}return G5(n)}var xd=Y5,J5=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",z5=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),W5=class{constructor(e){this.options=e,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let r={};return this.useBearer?(r.authorization=`Bearer ${t.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=t.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let t=[];if(e.system){if(typeof e.system=="string")t.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let n=e.system.filter(s=>s.type==="text"&&s.text).map(s=>({type:"text",text:s.text,cache_control:s.cache_control}));t.push({role:"system",content:n})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(n=>{if(n.role==="user"||n.role==="assistant"){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});return}if(Array.isArray(n.content)){if(n.role==="user"){let s=n.content.filter(i=>i.type==="tool_result"&&i.tool_use_id);s.length&&s.forEach(i=>{let a={role:"tool",content:typeof i.content=="string"?i.content:JSON.stringify(i.content),tool_call_id:i.tool_use_id,cache_control:i.cache_control};t.push(a)});let o=n.content.filter(i=>i.type==="text"&&i.text||i.type==="image"&&i.source);o.length&&t.push({role:"user",content:o.map(i=>i?.type==="image"?{type:"image_url",image_url:{url:i.source?.type==="base64"?z5(i.source.data,i.source.media_type):i.source.url},media_type:i.source.media_type}:i)})}else if(n.role==="assistant"){let s={role:"assistant",content:""},o=n.content.filter(u=>u.type==="text"&&u.text);o.length&&(s.content=o.map(u=>u.text).join(`
929
929
  `));let i=n.content.filter(u=>u.type==="tool_use"&&u.id);i.length&&(s.tool_calls=i.map(u=>({id:u.id,type:"function",function:{name:u.name,arguments:JSON.stringify(u.input||{})}})));let a=n.content.find(u=>u.type==="thinking"&&u.signature);a&&(s.thinking={content:a.thinking,signature:a.signature}),t.push(s)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice};return e.thinking&&(r.reasoning={effort:J5(e.thinking.budget_tokens),enabled:e.thinking.type==="enabled"}),e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let r=await this.convertOpenAIStreamToAnthropic(e.body,t);return new Response(r,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let r=await e.json(),n=this.convertOpenAIResponseToAnthropic(r,t);return new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description||"",parameters:t.input_schema}}))}async convertOpenAIStreamToAnthropic(e,t){return new ReadableStream({start:async r=>{let n=new TextEncoder,s=`msg_${Date.now()}`,o=null,i="unknown",a=!1,u=!1,l=!1,c=new Map,h=new Map,A=0,d=0,f=0,p=!1,m=!1,E=0,C=-1,y=()=>{let b=E;return E++,b},D=b=>{if(!p)try{r.enqueue(b);let I=new TextDecoder().decode(b);this.logger.debug({reqId:t.req.id,data:I,type:"send data"})}catch(I){if(I instanceof TypeError&&I.message.includes("Controller is already closed"))p=!0;else throw this.logger.debug({reqId:t.req.id,error:I instanceof Error?I.message:String(I),type:"send data error"}),I}},w=()=>{if(!p)try{if(C>=0){let I={type:"content_block_stop",index:C};D(n.encode(`event: content_block_stop
930
930
  data: ${JSON.stringify(I)}
931
931
 
@@ -1228,7 +1228,7 @@ If multiple images exist, select the **most relevant imageId** based on the user
1228
1228
 
1229
1229
  Do not attempt to describe or analyze the image directly yourself.
1230
1230
  Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
1231
- Your response should consistently follow this rule whenever image-related analysis is requested.`});let r=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(o=>o.type==="image"||Array.isArray(o.content)&&o.content.some(i=>i.type==="image"))),n=1;r.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(o=>{o.type==="image"?(i0.storeImage(`${e.id}_Image#${n}`,o.source),o.type="text",delete o.source,o.text=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++):o.type==="text"&&o.text.includes("[Image #")?o.text=o.text.replace(/\[Image #\d+\]/g,""):o.type==="tool_result"&&Array.isArray(o.content)&&o.content.some(i=>i.type==="image")&&(i0.storeImage(`${e.id}_Image#${n}`,o.content[0].source),o.content=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++)})})}},h$=new c$,d$=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},Gx=new d$;Gx.registerAgent(h$);var cE=Gx,A$=require("node:events"),Gw=require("node:perf_hooks"),f$=Y4(),p$=f$.getHealthStore,Vw=new A$.EventEmitter;function Yw(e){if(e.usageSessionId)return e.usageSessionId;try{let n=e.body?.metadata?.user_id;if(n&&typeof n=="string")try{let s=JSON.parse(n);if(s.session_id)return e.usageSessionId=s.session_id,e.usageSessionId}catch{let s=n.match(/_session_([a-f0-9-]+)/i);if(s)return e.usageSessionId=s[1],e.usageSessionId}}catch{}let t=e.headers?.["x-request-id"],r=Array.isArray(t)?t[0]:t;return e.usageSessionId=e.sessionId||(typeof r=="string"?r:void 0)||e.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.usageSessionId}function hE(e){return e.body?.model?Array.isArray(e.body.model)?e.body.model.join(","):e.body.model:Array.isArray(e.model)?e.model.join(","):e.model||""}async function g$(){let e=(0,WI.homedir)(),t=(0,KI.join)(e,".claude.json");if(!(0,J4.existsSync)(t)){let r={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,z4.writeFile)(t,JSON.stringify(r,null,2))}}async function m$(e,t){let r=t.plugins||t.Plugins||[];for(let n of r){let{name:s,enabled:o=!1,options:i={}}=n;switch(s){case"token-speed":QE.registerPlugin(Ux,{enabled:o,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${s}`);break}}await QE.enablePlugins(e)}async function Vx(e={}){await g$(),await my();let t=await ZI(),r=t.Providers||t.providers||[],n=r&&r.length>0,s=t.HOST||"127.0.0.1";n?(s=t.HOST,t.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let o=t.PORT||3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):o,a=A=>(A>9?"":"0")+A,u=(A,d)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let p=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:r$(u,{path:oE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,oE.listPresets)(),h=await $7({jsonPath:oE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:s,PORT:i,LOG_FILE:(0,KI.join)((0,WI.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return await Promise.allSettled(c.map(async A=>await h.registerNamespace(`/preset/${A.name}`,A.config))),await m$(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=Gw.performance.now())}),h.addHook("preHandler",async(A,d)=>new Promise((f,p)=>{let m=E=>{E?p(E):f()};H7(t)(A,d,m).catch(p)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of cE.getAllAgents())p.shouldHandle(A,t)&&(f.push(p.name),p.reqHandler(A,t),p.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(p.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",Vw.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let m=Yw(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new lE),w,v=-1,b="",I="",B="",S=[],x=[];return p(null,i$(D,async(F,R)=>{try{if(F.event==="content_block_start"&&F?.data?.content_block?.name){let O=A.agents.find(T=>cE.getAgent(T)?.tools.get(F.data.content_block.name));if(O){w=cE.getAgent(O),v=F.data.index,b=F.data.content_block.name,B=F.data.content_block.id;return}}if(v>-1&&F.data.index===v&&F.data?.delta?.type==="input_json_delta"){I+=F.data?.delta?.partial_json;return}if(v>-1&&F.data.index===v&&F.data.type==="content_block_stop"){try{let O=s$.default.parse(I);x.push({type:"tool_use",id:B,name:b,input:O});let T=await w?.tools.get(b)?.handler(O,{req:A,config:t});S.push({tool_use_id:B,type:"tool_result",content:T}),w=void 0,v=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(F.event==="message_delta"&&S.length){A.body.messages.push({role:"assistant",content:x}),A.body.messages.push({role:"user",content:S});let O=await fetch(`http://127.0.0.1:${t.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.APIKEY,"content-type":"application/json"},body:JSON.stringify(A.body)});if(!O.ok)return;let T=O.body.pipeThrough(new lE).getReader();for(;;)try{let{value:Q,done:U}=await T.read();if(U)break;let V=Q;if(["message_start","message_stop"].includes(V.event))continue;if(!R.desiredSize)break;R.enqueue(V)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw Q}return}return F}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw O}}).pipeThrough(new n$))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new lE).getReader();try{for(;;){let{done:w,value:v}=await D.read();if(w)break;let b=v.event,I=v.data;if(I?.usage){let B={...yd.get(m)||{},...I.usage};(I.usage.cache_read_input_tokens||I.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:I.usage.cache_read_input_tokens,cache_creation:I.usage.cache_creation_input_tokens}),yd.put(m,B)}}}catch(w){w.name==="AbortError"||w.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",w)}finally{D.releaseLock()}})(C),p(null,E)}if(yd.put(m,f.usage),typeof f=="object")return f.error?p(f.error,null):p(f,null)}if(typeof f=="object"&&f.error)return p(f.error,null);p(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(Vw.emit("onSend",A,d,f),d.statusCode>=400&&A.pathname?.endsWith("/v1/messages"))try{typeof f=="string"?A.errorResponseBody=f:f&&typeof f=="object"&&(A.errorResponseBody=JSON.stringify(f))}catch{}return f}),h.addHook("onResponse",async(A,d)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=Yw(A),p=yd.get(f),m=U7(f),E=p$(),C,y;if(d.statusCode>=400){C=A.errorMessage||d.errorMessage||A.error?.message||A.error?.toString?.()||void 0,y=A.errorResponseBody;let D=hE(A);E.recordFailure(A.provider||"",D,C)}else{let D=hE(A);E.recordSuccess(A.provider||"",D)}L7({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:f,provider:A.provider||"",originalModel:A.originalModel||A.body?.model||"",model:hE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:p?.input_tokens||A.tokenCount||0,outputTokens:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:m.ttft,tokensPerSecond:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(Gw.performance.now()-A.requestStartTime):0,status:d.statusCode<400?"success":"error",errorMessage:C,responseBody:y})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{h.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,d)=>{h.app.log.error("Unhandled rejection at:",d,"reason:",A)}),h}async function E$(){let e=await Vx();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===Qy&&E$().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function Kx(e){try{let{stdout:t}=await Wx("npm view @wengine-ai/claude-code-router version"),r=t.trim();return{hasUpdate:y$(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function Zx(){try{let{stdout:e,stderr:t}=await Wx("npm update -g @wengine-ai/claude-code-router");return t&&console.error("Update stderr:",t),console.log("Update stdout:",e),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(e){return console.error("Error performing update:",e),{success:!1,message:`Failed to perform update: ${e instanceof Error?e.message:"Unknown error"}`}}}function y$(e,t){let r=e.split(".").map(Number),n=t.split(".").map(Number);for(let s=0;s<Math.max(r.length,n.length);s++){let o=s<r.length?r[s]:0,i=s<n.length?n[s]:0;if(o>i)return 1;if(o<i)return-1}return 0}var Jx,zx,Wx,Xx=jf(()=>{"use strict";Jx=require("child_process"),zx=require("util"),Wx=(0,zx.promisify)(Jx.exec)});var np,Ny=jf(()=>{np="2.0.58"});var Ly=Fr(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});var e_=require("child_process"),C$=1024*1024,t_={exec(e,t){let r={maxBuffer:2*C$,windowsHide:!0};(0,e_.exec)(e,r,t)},spawn(e,t,r){return(0,e_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
1231
+ Your response should consistently follow this rule whenever image-related analysis is requested.`});let r=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(o=>o.type==="image"||Array.isArray(o.content)&&o.content.some(i=>i.type==="image"))),n=1;r.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(o=>{o.type==="image"?(i0.storeImage(`${e.id}_Image#${n}`,o.source),o.type="text",delete o.source,o.text=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++):o.type==="text"&&o.text.includes("[Image #")?o.text=o.text.replace(/\[Image #\d+\]/g,""):o.type==="tool_result"&&Array.isArray(o.content)&&o.content.some(i=>i.type==="image")&&(i0.storeImage(`${e.id}_Image#${n}`,o.content[0].source),o.content=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++)})})}},h$=new c$,d$=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},Gx=new d$;Gx.registerAgent(h$);var cE=Gx,A$=require("node:events"),Gw=require("node:perf_hooks"),f$=Y4(),p$=f$.getHealthStore,Vw=new A$.EventEmitter;function Yw(e){if(e.usageSessionId)return e.usageSessionId;try{let n=e.body?.metadata?.user_id;if(n&&typeof n=="string")try{let s=JSON.parse(n);if(s.session_id)return e.usageSessionId=s.session_id,e.usageSessionId}catch{let s=n.match(/_session_([a-f0-9-]+)/i);if(s)return e.usageSessionId=s[1],e.usageSessionId}}catch{}let t=e.headers?.["x-request-id"],r=Array.isArray(t)?t[0]:t;return e.usageSessionId=e.sessionId||(typeof r=="string"?r:void 0)||e.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.usageSessionId}function hE(e){return e.body?.model?Array.isArray(e.body.model)?e.body.model.join(","):e.body.model:Array.isArray(e.model)?e.model.join(","):e.model||""}async function g$(){let e=(0,WI.homedir)(),t=(0,KI.join)(e,".claude.json");if(!(0,J4.existsSync)(t)){let r={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,z4.writeFile)(t,JSON.stringify(r,null,2))}}async function m$(e,t){let r=t.plugins||t.Plugins||[];for(let n of r){let{name:s,enabled:o=!1,options:i={}}=n;switch(s){case"token-speed":QE.registerPlugin(Ux,{enabled:o,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${s}`);break}}await QE.enablePlugins(e)}async function Vx(e={}){await g$(),await my();let t=await ZI(),r=t.Providers||t.providers||[],n=r&&r.length>0,s=t.HOST||"127.0.0.1";n?(s=t.HOST,t.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let o=t.PORT||3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):o,a=A=>(A>9?"":"0")+A,u=(A,d)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let p=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:r$(u,{path:oE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,oE.listPresets)(),h=await $7({jsonPath:oE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:s,PORT:i,LOG_FILE:(0,KI.join)((0,WI.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return await Promise.allSettled(c.map(async A=>await h.registerNamespace(`/preset/${A.name}`,A.config))),await m$(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=Gw.performance.now())}),h.addHook("preHandler",async(A,d)=>new Promise((f,p)=>{let m=E=>{E?p(E):f()};H7(t)(A,d,m).catch(p)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of cE.getAllAgents())p.shouldHandle(A,t)&&(f.push(p.name),p.reqHandler(A,t),p.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(p.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",Vw.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let m=Yw(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new lE),w,v=-1,b="",I="",B="",S=[],x=[];return p(null,i$(D,async(F,R)=>{try{if(F.event==="content_block_start"&&F?.data?.content_block?.name){let O=A.agents.find(T=>cE.getAgent(T)?.tools.get(F.data.content_block.name));if(O){w=cE.getAgent(O),v=F.data.index,b=F.data.content_block.name,B=F.data.content_block.id;return}}if(v>-1&&F.data.index===v&&F.data?.delta?.type==="input_json_delta"){I+=F.data?.delta?.partial_json;return}if(v>-1&&F.data.index===v&&F.data.type==="content_block_stop"){try{let O=s$.default.parse(I);x.push({type:"tool_use",id:B,name:b,input:O});let T=await w?.tools.get(b)?.handler(O,{req:A,config:t});S.push({tool_use_id:B,type:"tool_result",content:T}),w=void 0,v=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(F.event==="message_delta"&&S.length){A.body.messages.push({role:"assistant",content:x}),A.body.messages.push({role:"user",content:S});let O=await fetch(`http://127.0.0.1:${t.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.APIKEY,"content-type":"application/json"},body:JSON.stringify(A.body)});if(!O.ok)return;let T=O.body.pipeThrough(new lE).getReader();for(;;)try{let{value:Q,done:U}=await T.read();if(U)break;let V=Q;if(["message_start","message_stop"].includes(V.event))continue;if(!R.desiredSize)break;R.enqueue(V)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw Q}return}return F}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw O}}).pipeThrough(new n$))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new lE).getReader();try{for(;;){let{done:w,value:v}=await D.read();if(w)break;let b=v.event,I=v.data;if(I?.usage){let B={...yd.get(m)||{},...I.usage};(I.usage.cache_read_input_tokens||I.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:I.usage.cache_read_input_tokens,cache_creation:I.usage.cache_creation_input_tokens}),yd.put(m,B)}}}catch(w){w.name==="AbortError"||w.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",w)}finally{D.releaseLock()}})(C),p(null,E)}if(yd.put(m,f.usage),typeof f=="object")return f.error?p(f.error,null):p(f,null)}if(typeof f=="object"&&f.error)return p(f.error,null);p(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(Vw.emit("onSend",A,d,f),d.statusCode>=400&&A.pathname?.endsWith("/v1/messages"))try{typeof f=="string"?A.errorResponseBody=f:f&&typeof f=="object"&&(A.errorResponseBody=JSON.stringify(f))}catch{}return f}),h.addHook("onResponse",async(A,d)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=Yw(A),p=yd.get(f),m=U7(f),E=p$(),C,y;if(d.statusCode>=400){C=A.errorMessage||d.errorMessage||A.error?.message||A.error?.toString?.()||void 0,y=A.errorResponseBody;let D=hE(A);E.recordFailure(A.provider||"",D,C)}else{let D=hE(A);E.recordSuccess(A.provider||"",D)}L7({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:f,provider:A.provider||"",originalModel:A.originalModel||A.body?.model||"",model:hE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:p?.input_tokens||A.tokenCount||0,outputTokens:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:m.ttft,tokensPerSecond:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(Gw.performance.now()-A.requestStartTime):0,status:d.statusCode<400?"success":"error",errorMessage:C,responseBody:y})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{h.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,d)=>{h.app.log.error("Unhandled rejection at:",d,"reason:",A)}),h}async function E$(){let e=await Vx();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===Qy&&E$().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function Kx(e){try{let{stdout:t}=await Wx("npm view @wengine-ai/claude-code-router version"),r=t.trim();return{hasUpdate:y$(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function Zx(){try{let{stdout:e,stderr:t}=await Wx("npm update -g @wengine-ai/claude-code-router");return t&&console.error("Update stderr:",t),console.log("Update stdout:",e),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(e){return console.error("Error performing update:",e),{success:!1,message:`Failed to perform update: ${e instanceof Error?e.message:"Unknown error"}`}}}function y$(e,t){let r=e.split(".").map(Number),n=t.split(".").map(Number);for(let s=0;s<Math.max(r.length,n.length);s++){let o=s<r.length?r[s]:0,i=s<n.length?n[s]:0;if(o>i)return 1;if(o<i)return-1}return 0}var Jx,zx,Wx,Xx=jf(()=>{"use strict";Jx=require("child_process"),zx=require("util"),Wx=(0,zx.promisify)(Jx.exec)});var np,Ny=jf(()=>{np="2.0.59"});var Ly=Fr(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});var e_=require("child_process"),C$=1024*1024,t_={exec(e,t){let r={maxBuffer:2*C$,windowsHide:!0};(0,e_.exec)(e,r,t)},spawn(e,t,r){return(0,e_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
1232
1232
  `,r);n>=0&&(r=n+1)}return r>0?e.substring(r):e},split(e,t){let r=e.trim().split(/\s+/);return r.length>t&&(r[t-1]=r.slice(t-1).join(" ")),r},extractColumns(e,t,r){let n=e.split(/(\r\n|\n|\r)/),s=[];return r||(r=Math.max.apply(null,t)+1),n.forEach(o=>{let i=t_.split(o,r),a=[];t.forEach(u=>{a.push(i[u]||"")}),s.push(a)}),s},parseTable(e){let t=e.split(/(\r\n\r\n|\r\n\n|\n\r\n|\n\n)/).filter(r=>r&&r.trim().length>0).map(r=>r.split(/(\r\n|\n|\r)/).filter(n=>n.trim().length>0));return t.forEach(r=>{for(let n=0;r[n];){let s=r[n];s.startsWith(" ")?(r[n-1]+=s.trimLeft(),r.splice(n,1)):n+=1}}),t.map(r=>{let n={};return r.forEach(s=>{let o=s.indexOf(":"),i=s.slice(0,o).trim();n[i]=s.slice(o+1).trim()}),n})}};Oy.default=t_});var n_=Fr((r_,ip)=>{(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof ip=="object"&&ip.exports?ip.exports=t():e.log=t()})(r_,function(){"use strict";var e=function(){},t="undefined",r=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"],s={},o=null;function i(f,p){var m=f[p];if(typeof m.bind=="function")return m.bind(f);try{return Function.prototype.bind.call(m,f)}catch{return function(){return Function.prototype.apply.apply(m,[f,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function u(f){return f==="debug"&&(f="log"),typeof console===t?!1:f==="trace"&&r?a:console[f]!==void 0?i(console,f):console.log!==void 0?i(console,"log"):e}function l(){for(var f=this.getLevel(),p=0;p<n.length;p++){var m=n[p];this[m]=p<f?e:this.methodFactory(m,f,this.name)}if(this.log=this.debug,typeof console===t&&f<this.levels.SILENT)return"No console available for logging"}function c(f){return function(){typeof console!==t&&(l.call(this),this[f].apply(this,arguments))}}function h(f,p,m){return u(f)||c.apply(this,arguments)}function A(f,p){var m=this,E,C,y,D="loglevel";typeof f=="string"?D+=":"+f:typeof f=="symbol"&&(D=void 0);function w(S){var x=(n[S]||"silent").toUpperCase();if(!(typeof window===t||!D)){try{window.localStorage[D]=x;return}catch{}try{window.document.cookie=encodeURIComponent(D)+"="+x+";"}catch{}}}function v(){var S;if(!(typeof window===t||!D)){try{S=window.localStorage[D]}catch{}if(typeof S===t)try{var x=window.document.cookie,F=encodeURIComponent(D),R=x.indexOf(F+"=");R!==-1&&(S=/^([^;]+)/.exec(x.slice(R+F.length+1))[1])}catch{}return m.levels[S]===void 0&&(S=void 0),S}}function b(){if(!(typeof window===t||!D)){try{window.localStorage.removeItem(D)}catch{}try{window.document.cookie=encodeURIComponent(D)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function I(S){var x=S;if(typeof x=="string"&&m.levels[x.toUpperCase()]!==void 0&&(x=m.levels[x.toUpperCase()]),typeof x=="number"&&x>=0&&x<=m.levels.SILENT)return x;throw new TypeError("log.setLevel() called with invalid level: "+S)}m.name=f,m.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},m.methodFactory=p||h,m.getLevel=function(){return y??C??E},m.setLevel=function(S,x){return y=I(S),x!==!1&&w(y),l.call(m)},m.setDefaultLevel=function(S){C=I(S),v()||m.setLevel(S,!1)},m.resetLevel=function(){y=null,b(),l.call(m)},m.enableAll=function(S){m.setLevel(m.levels.TRACE,S)},m.disableAll=function(S){m.setLevel(m.levels.SILENT,S)},m.rebuild=function(){if(o!==m&&(E=I(o.getLevel())),l.call(m),o===m)for(var S in s)s[S].rebuild()},E=I(o?o.getLevel():"WARN");var B=v();B!=null&&(y=I(B)),l.call(m)}o=new A,o.getLogger=function(p){if(typeof p!="symbol"&&typeof p!="string"||p==="")throw new TypeError("You must supply a name when creating a logger.");var m=s[p];return m||(m=s[p]=new A(p,o.methodFactory)),m};var d=typeof window!==t?window.log:void 0;return o.noConflict=function(){return typeof window!==t&&window.log===o&&(window.log=d),o},o.getLoggers=function(){return s},o.default=o,o})});var Py=Fr(Jd=>{"use strict";var b$=Jd&&Jd.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Jd,"__esModule",{value:!0});var w$=b$(n_());Jd.default=w$.default});var o_=Fr(jo=>{"use strict";var B$=jo&&jo.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var s=Object.getOwnPropertyDescriptor(t,r);(!s||("get"in s?!t.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,s)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),I$=jo&&jo.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),i_=jo&&jo.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var n=[];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(n[n.length]=s);return n},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var n=e(t),s=0;s<n.length;s++)n[s]!=="default"&&B$(r,t,n[s]);return I$(r,t),r}})(),s_=jo&&jo.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(jo,"__esModule",{value:!0});var v$=i_(require("os")),sp=i_(require("fs")),Gs=s_(Ly()),x$=s_(Py()),_$=e=>new Promise((t,r)=>{sp.existsSync(e)?t():sp.mkdir(e,n=>{n?r(n):t()})}),Uc={darwin(e){return new Promise((t,r)=>{Gs.default.exec("netstat -anv -p TCP && netstat -anv -p UDP",function(n,s,o){if(n)r(n);else{let i=o.toString().trim();if(i){r(new Error(i));return}let a=Gs.default.stripLine(s.toString(),1),u=a.slice(0,a.indexOf(`
1233
1233
  `)),l=Gs.default.stripLine(a,1),c=u.indexOf("rxbytes")>=0?10:8,h=Gs.default.extractColumns(l,[0,3,c],10).filter(A=>!!String(A[0]).match(/^(udp|tcp)/)).find(A=>{let d=String(A[1]).match(/\.(\d+)$/);return!!(d&&d[1]===String(e))});h&&h[2].length?t(parseInt(h[2],10)):r(new Error(`pid of port (${e}) not found`))}})})},linux(e){return new Promise((t,r)=>{Gs.default.exec("netstat -tunlp",function(s,o,i){if(s)r(s);else{let a=i.toString().trim();a&&x$.default.warn(a);let u=Gs.default.stripLine(o.toString(),2),l=Gs.default.extractColumns(u,[3,6],7).find(c=>{let h=String(c[0]).match(/:(\d+)$/);return!!(h&&h[1]===String(e))});if(l&&l[1]){let c=l[1].split("/",1)[0];c.length?t(parseInt(c,10)):r(new Error(`pid of port (${e}) not found`))}else r(new Error(`pid of port (${e}) not found`))}})})},win32(e){return new Promise((t,r)=>{Gs.default.exec("netstat -ano",function(n,s,o){if(n)r(n);else{let i=o.toString().trim();if(i){r(new Error(i));return}let a=Gs.default.stripLine(s.toString(),4),u=Gs.default.extractColumns(a,[1,4],5).find(l=>{let c=String(l[0]).match(/:(\d+)$/);return!!(c&&c[1]===String(e))});u&&u[1].length&&parseInt(u[1],10)>0?t(parseInt(u[1],10)):r(new Error(`pid of port (${e}) not found`))}})})},android(e){return new Promise((t,r)=>{let n=v$.tmpdir()+"/.find-process",s=n+"/"+process.pid,o='netstat -tunp >> "'+s+'"';_$(n).then(()=>{Gs.default.exec(o,()=>{sp.readFile(s,"utf8",(i,a)=>{if(sp.unlink(s,()=>{}),i)r(i);else{a=Gs.default.stripLine(a,2);let u=Gs.default.extractColumns(a,[3,6],7).find(l=>{let c=String(l[0]).match(/:(\d+)$/);return!!(c&&c[1]===String(e))});if(u&&u[1]){let l=u[1].split("/",1)[0];l.length?t(parseInt(l,10)):r(new Error(`pid of port (${e}) not found`))}else r(new Error(`pid of port (${e}) not found`))}})})})})}};Uc.freebsd=Uc.darwin;Uc.sunos=Uc.darwin;function S$(e){let t=process.platform;return new Promise((r,n)=>{if(!(t in Uc))return n(new Error(`platform ${t} is unsupported`));let s=Uc[t];s(e).then(r,n)})}jo.default=S$});var l_=Fr($o=>{"use strict";var F$=$o&&$o.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var s=Object.getOwnPropertyDescriptor(t,r);(!s||("get"in s?!t.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,s)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),k$=$o&&$o.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),T$=$o&&$o.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var n=[];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(n[n.length]=s);return n},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var n=e(t),s=0;s<n.length;s++)n[s]!=="default"&&F$(r,t,n[s]);return k$(r,t),r}})(),R$=$o&&$o.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($o,"__esModule",{value:!0});var op=T$(require("path")),Pu=R$(Ly());function My(e,t){return t?e&&e.match?e.match(t)!==null:!1:!0}function a_(e){let t=e.split(op.sep),r=t[t.length-1];r&&(t[t.length-1]=r.split(" ")[0]);let n=[];for(let s of t){let o=s.indexOf(" -");if(o>=0){n.push(s.substring(0,o).trim());break}else if(s.endsWith(" ")){n.push(s.trim());break}n.push(s)}return n.join(op.sep)}function u_(e){if(process.platform==="darwin"){let t=e.indexOf(".app/");if(t>=0)return op.basename(e.substring(0,t))}return op.basename(e)}var Sl={darwin(e){return new Promise((t,r)=>{let n;"pid"in e&&e.pid!==void 0?n=`ps -p ${e.pid} -ww -o pid,ppid,uid,gid,args`:n="ps ax -ww -o pid,ppid,uid,gid,args",Pu.default.exec(n,function(s,o,i){if(s)"pid"in e&&e.pid!==void 0?t([]):r(s);else{let a=i.toString().trim();if(a){r(new Error(a));return}let u=Pu.default.stripLine(o.toString(),1),c=Pu.default.extractColumns(u,[0,1,2,3,4],5).filter(h=>h[0]&&e.pid!==void 0?h[0]===String(e.pid):h[4]&&e.name?My(h[4],e.name):!!h[0]).map(h=>{let A=String(h[4]),d=a_(A);return{pid:parseInt(h[0],10),ppid:parseInt(h[1],10),uid:parseInt(h[2],10),gid:parseInt(h[3],10),name:u_(d),bin:d,cmd:h[4]}});e.config.strict&&e.name&&(c=c.filter(h=>h.name===e.name)),t(c)}})})},win32(e){return new Promise((t,r)=>{let n="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-CimInstance -className win32_process | select Name,ProcessId,ParentProcessId,CommandLine,ExecutablePath",s=[],o=Pu.default.spawn("powershell.exe",["/c",n],{detached:!1,windowsHide:!0});o.stdout.on("data",i=>{s.push(i.toString())}),o.on("error",i=>{r(new Error("Command '"+n+"' failed with reason: "+i.toString()))}),o.on("close",i=>{if(i!==0)return r(new Error("Command '"+n+"' terminated with code: "+i));let a=Pu.default.parseTable(s.join("")).filter(u=>{if(e.pid!==void 0)return u.ProcessId===String(e.pid);if(e.name){let l=u.Name||"";return e.config.strict?l===e.name||l.endsWith(".exe")&&l.slice(0,-4)===e.name:My(u.CommandLine||l,e.name)}else return!0}).map(u=>({pid:parseInt(u.ProcessId,10),ppid:parseInt(u.ParentProcessId,10),bin:u.ExecutablePath,name:u.Name||"",cmd:u.CommandLine}));t(a)})})},android(e){return new Promise((t,r)=>{Pu.default.exec("ps",function(s,o,i){if(s)e.pid!==void 0?t([]):r(s);else{let a=i.toString().trim();if(a){r(new Error(a));return}let u=Pu.default.stripLine(o.toString(),1),c=Pu.default.extractColumns(u,[0,3],4).filter(h=>h[0]&&e.pid!==void 0?h[0]===String(e.pid):h[1]&&e.name?My(h[1],e.name):!!h[0]).map(h=>{let A=String(h[1]),d=a_(A);return{pid:parseInt(h[0],10),ppid:0,name:u_(d),bin:d,cmd:h[1]}});e.config.strict&&e.name&&(c=c.filter(h=>h.name===e.name)),t(c)}})})}};Sl.linux=Sl.darwin;Sl.sunos=Sl.darwin;Sl.freebsd=Sl.darwin;function Q$(e){let t=process.platform,r=Sl[t];return r?r(e):Promise.reject(new Error(`Platform "${t}" is not supported`))}$o.default=Q$});var h_=Fr(zd=>{"use strict";var jy=zd&&zd.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(zd,"__esModule",{value:!0});var N$=jy(o_()),c_=jy(l_()),O$=jy(Py()),Uy={port(e,t){return(0,N$.default)(e).then(r=>Uy.pid(r,t),()=>[])},pid(e,t){return(0,c_.default)({pid:e,config:t})},name(e,t){return(0,c_.default)({name:e,config:t,skipSelf:!0})}};function L$(e,t,r){let n=Object.assign({logLevel:"warn",strict:typeof r=="boolean"?r:!1},typeof r=="object"?r:{});return n.logLevel&&O$.default.setLevel(n.logLevel),new Promise((s,o)=>{if(!(e in Uy))o(new Error(`do not support find by "${e}"`));else{let i=/^\d+$/.test(String(t));e==="pid"&&!i?o(new Error("pid must be a number")):e==="port"&&!i?o(new Error("port must be a number")):Uy[e](t,n).then(s,o)}})}zd.default=L$});var A_=Fr(d_=>{"use strict";Object.defineProperty(d_,"__esModule",{value:!0})});var f_=Fr(Ho=>{"use strict";var P$=Ho&&Ho.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var s=Object.getOwnPropertyDescriptor(t,r);(!s||("get"in s?!t.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,s)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),M$=Ho&&Ho.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&P$(t,e,r)},U$=Ho&&Ho.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ho,"__esModule",{value:!0});Ho.default=void 0;var j$=h_();Object.defineProperty(Ho,"default",{enumerable:!0,get:function(){return U$(j$).default}});M$(A_(),Ho)});function g_(){let e=0;(0,hs.existsSync)(Yi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,hs.readFileSync)(Yi.REFERENCE_COUNT_FILE,"utf-8"))||0),e++,(0,hs.writeFileSync)(Yi.REFERENCE_COUNT_FILE,e.toString())}function $y(){let e=0;(0,hs.existsSync)(Yi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,hs.readFileSync)(Yi.REFERENCE_COUNT_FILE,"utf-8"))||0),e=Math.max(0,e-1),(0,hs.writeFileSync)(Yi.REFERENCE_COUNT_FILE,e.toString())}function m_(){return(0,hs.existsSync)(Yi.REFERENCE_COUNT_FILE)&&parseInt((0,hs.readFileSync)(Yi.REFERENCE_COUNT_FILE,"utf-8"))||0}function Fl(){if(!(0,hs.existsSync)(Yi.PID_FILE))return!1;let e;try{let t=(0,hs.readFileSync)(Yi.PID_FILE,"utf-8");if(e=parseInt(t,10),isNaN(e))return Ka(),!1}catch{return!1}try{if(process.platform==="win32"){let t=`tasklist /FI "PID eq ${e}"`;return(0,p_.execSync)(t,{stdio:"pipe"}).toString().includes(e.toString())?!0:(Ka(),!1)}else return process.kill(e,0),!0}catch{return Ka(),!1}}function Ka(){if((0,hs.existsSync)(Yi.PID_FILE))try{require("fs").unlinkSync(Yi.PID_FILE)}catch{}}function E_(){if(!(0,hs.existsSync)(Yi.PID_FILE))return null;try{let e=parseInt((0,hs.readFileSync)(Yi.PID_FILE,"utf-8"));return isNaN(e)?null:e}catch{return null}}async function ap(){let e=E_(),t=await Fl(),n=(await ys()).PORT||3456;return{running:t,pid:e,port:n,endpoint:`http://127.0.0.1:${n}`,pidFile:Yi.PID_FILE,referenceCount:m_()}}async function y_(){if(m_()===0){let t=E_();if(t&&await Fl())try{process.kill(t,"SIGTERM")}catch{}}}var hs,Yi,$$,p_,Wd=jf(()=>{"use strict";hs=require("fs"),Yi=tn(no());Mu();$$=tn(f_()),p_=require("child_process")});var x_={};Xb(x_,{backupConfigFile:()=>I_,getSettingsPath:()=>Yy,initConfig:()=>H$,initDir:()=>B_,readConfigFile:()=>ys,restartService:()=>Vy,run:()=>Gy,writeConfigFile:()=>v_});var Rs,D_,Uu,C_,b_,oi,w_,jc,qy,Hy,Kd,B_,ys,I_,v_,H$,Gy,Vy,Yy,Mu=jf(()=>{"use strict";Rs=tn(require("node:fs/promises")),D_=tn(Vf()),Uu=tn(require("node:path")),C_=require("node:crypto"),b_=tn(require("node:os")),oi=tn(no()),w_=tn(Yx()),jc=require("fs");Xx();Ny();qy=require("child_process");Wd();Hy=e=>{if(typeof e=="string")return e.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(t,r,n)=>{let s=r||n;return process.env[s]||t});if(Array.isArray(e))return e.map(Hy);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=Hy(n);return t}return e},Kd=async e=>{try{await Rs.default.access(e)}catch{await Rs.default.mkdir(e,{recursive:!0})}},B_=async()=>{await Kd(oi.HOME_DIR),await Kd(oi.PLUGINS_DIR),await Kd(oi.PRESETS_DIR),await Kd(Uu.default.join(oi.HOME_DIR,"logs"))},ys=async()=>{try{let e=await Rs.default.readFile(oi.CONFIG_FILE,"utf-8");try{let t=D_.default.parse(e);return Hy(t)}catch(t){console.error(`Failed to parse config file at ${oi.CONFIG_FILE}`),console.error("Error details:",t.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(e){if(e.code==="ENOENT")try{await B_();let t=await I_();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await v_(r),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),r}catch(t){console.error("Failed to create default configuration:",t.message),process.exit(1)}else console.error(`Failed to read config file at ${oi.CONFIG_FILE}`),console.error("Error details:",e.message),process.exit(1)}},I_=async()=>{try{if(await Rs.default.access(oi.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${oi.CONFIG_FILE}.${e}.bak`;await Rs.default.copyFile(oi.CONFIG_FILE,t);try{let r=Uu.default.dirname(oi.CONFIG_FILE),n=Uu.default.basename(oi.CONFIG_FILE),o=(await Rs.default.readdir(r)).filter(i=>i.startsWith(n)&&i.endsWith(".bak")).sort().reverse();if(o.length>3)for(let i=3;i<o.length;i++){let a=Uu.default.join(r,o[i]);await Rs.default.unlink(a)}}catch(r){console.warn("Failed to clean up old backups:",r)}return t}}catch(e){console.error("Failed to backup config file:",e)}return null},v_=async e=>{await Kd(oi.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await Rs.default.writeFile(oi.CONFIG_FILE,t)},H$=async()=>{let e=await ys();return Object.assign(process.env,e),e},Gy=async(e=[])=>{if(Fl()){console.log("claude-code-router server is running");return}let r=await(0,w_.getServer)(),n=r.app;(0,jc.writeFileSync)(oi.PID_FILE,process.pid.toString()),n.post("/api/update/perform",async()=>await Zx()),n.get("/api/update/check",async()=>await Kx(np)),n.post("/api/restart",async()=>(setTimeout(async()=>{(0,qy.spawn)("ccr",["restart"],{detached:!0,stdio:"ignore"}).unref()},100),{success:!0,message:"Service restart initiated"})),await r.start()},Vy=async()=>{try{let r=parseInt((0,jc.readFileSync)(oi.PID_FILE,"utf-8"));if(process.kill(r),Ka(),(0,jc.existsSync)(oi.REFERENCE_COUNT_FILE))try{await Rs.default.unlink(oi.REFERENCE_COUNT_FILE)}catch{}console.log("claude code router service has been stopped.")}catch{console.log("Service was not running or failed to stop."),Ka()}console.log("Starting claude code router service...");let e=Uu.default.join(__dirname,"cli.js"),t=(0,qy.spawn)("node",[e,"start"],{detached:!0,stdio:"ignore"});t.on("error",r=>{throw console.error("Failed to start service:",r),r}),t.unref(),console.log("\u2705 Service started successfully in the background.")},Yy=async e=>{let t=(0,C_.createHash)("sha256").update(e,"utf-8").digest("hex"),r=Uu.default.join(b_.default.tmpdir(),"claude-code-router"),n=`ccr-settings-${t}.json`,s=Uu.default.join(r,n);try{await Rs.default.access(r)}catch{await Rs.default.mkdir(r,{recursive:!0})}try{return await Rs.default.access(s),s}catch{return await Rs.default.writeFile(s,e,"utf-8"),s}}});var Xd=Fr((Xee,Q_)=>{var V$=require("node:tty"),Y$=V$?.WriteStream?.prototype?.hasColors?.()??!1,Dn=(e,t)=>{if(!Y$)return s=>s;let r=`\x1B[${e}m`,n=`\x1B[${t}m`;return s=>{let o=s+"",i=o.indexOf(n);if(i===-1)return r+o+n;let a=r,u=0,c=(t===22?n:"")+r;for(;i!==-1;)a+=o.slice(u,i)+c,u=i+n.length,i=o.indexOf(n,u);return a+=o.slice(u)+n,a}},mn={};mn.reset=Dn(0,0);mn.bold=Dn(1,22);mn.dim=Dn(2,22);mn.italic=Dn(3,23);mn.underline=Dn(4,24);mn.overline=Dn(53,55);mn.inverse=Dn(7,27);mn.hidden=Dn(8,28);mn.strikethrough=Dn(9,29);mn.black=Dn(30,39);mn.red=Dn(31,39);mn.green=Dn(32,39);mn.yellow=Dn(33,39);mn.blue=Dn(34,39);mn.magenta=Dn(35,39);mn.cyan=Dn(36,39);mn.white=Dn(37,39);mn.gray=Dn(90,39);mn.bgBlack=Dn(40,49);mn.bgRed=Dn(41,49);mn.bgGreen=Dn(42,49);mn.bgYellow=Dn(43,49);mn.bgBlue=Dn(44,49);mn.bgMagenta=Dn(45,49);mn.bgCyan=Dn(46,49);mn.bgWhite=Dn(47,49);mn.bgGray=Dn(100,49);mn.redBright=Dn(91,39);mn.greenBright=Dn(92,39);mn.yellowBright=Dn(93,39);mn.blueBright=Dn(94,39);mn.magentaBright=Dn(95,39);mn.cyanBright=Dn(96,39);mn.whiteBright=Dn(97,39);mn.bgRedBright=Dn(101,49);mn.bgGreenBright=Dn(102,49);mn.bgYellowBright=Dn(103,49);mn.bgBlueBright=Dn(104,49);mn.bgMagentaBright=Dn(105,49);mn.bgCyanBright=Dn(106,49);mn.bgWhiteBright=Dn(107,49);Q_.exports=mn});var j_=Fr((Ete,U_)=>{"use strict";U_.exports=tH;function eH(e){let t={defaultWidth:0,output:process.stdout,tty:require("tty")};return e?(Object.keys(t).forEach(function(r){e[r]||(e[r]=t[r])}),e):t}function tH(e){let t=eH(e);if(t.output.getWindowSize)return t.output.getWindowSize()[0]||t.defaultWidth;if(t.tty.getWindowSize)return t.tty.getWindowSize()[1]||t.defaultWidth;if(t.output.columns)return t.output.columns;if(process.env.CLI_WIDTH){let r=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(r)&&r!==0)return r}return t.defaultWidth}});var H_=Fr((yte,$_)=>{"use strict";$_.exports=({onlyFirst:e=!1}={})=>{let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}});var gp=Fr((Dte,q_)=>{"use strict";var rH=H_();q_.exports=e=>typeof e=="string"?e.replace(rH(),""):e});var V_=Fr((Cte,Zy)=>{"use strict";var G_=e=>Number.isNaN(e)?!1:e>=4352&&(e<=4447||e===9001||e===9002||11904<=e&&e<=12871&&e!==12351||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141);Zy.exports=G_;Zy.exports.default=G_});var J_=Fr((bte,Y_)=>{"use strict";Y_.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var W_=Fr((wte,Xy)=>{"use strict";var nH=gp(),iH=V_(),sH=J_(),z_=e=>{if(typeof e!="string"||e.length===0||(e=nH(e),e.length===0))return 0;e=e.replace(sH()," ");let t=0;for(let r=0;r<e.length;r++){let n=e.codePointAt(r);n<=31||n>=127&&n<=159||n>=768&&n<=879||(n>65535&&r++,t+=iH(n)?2:1)}return t};Xy.exports=z_;Xy.exports.default=z_});var Z_=Fr((Bte,K_)=>{"use strict";K_.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var eD=Fr((Ite,eS)=>{var eA=Z_(),X_={};for(let e of Object.keys(eA))X_[eA[e]]=e;var Gr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};eS.exports=Gr;for(let e of Object.keys(Gr)){if(!("channels"in Gr[e]))throw new Error("missing channels property: "+e);if(!("labels"in Gr[e]))throw new Error("missing channel labels property: "+e);if(Gr[e].labels.length!==Gr[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:t,labels:r}=Gr[e];delete Gr[e].channels,delete Gr[e].labels,Object.defineProperty(Gr[e],"channels",{value:t}),Object.defineProperty(Gr[e],"labels",{value:r})}Gr.rgb.hsl=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,s=Math.min(t,r,n),o=Math.max(t,r,n),i=o-s,a,u;o===s?a=0:t===o?a=(r-n)/i:r===o?a=2+(n-t)/i:n===o&&(a=4+(t-r)/i),a=Math.min(a*60,360),a<0&&(a+=360);let l=(s+o)/2;return o===s?u=0:l<=.5?u=i/(o+s):u=i/(2-o-s),[a,u*100,l*100]};Gr.rgb.hsv=function(e){let t,r,n,s,o,i=e[0]/255,a=e[1]/255,u=e[2]/255,l=Math.max(i,a,u),c=l-Math.min(i,a,u),h=function(A){return(l-A)/6/c+1/2};return c===0?(s=0,o=0):(o=c/l,t=h(i),r=h(a),n=h(u),i===l?s=n-r:a===l?s=1/3+t-n:u===l&&(s=2/3+r-t),s<0?s+=1:s>1&&(s-=1)),[s*360,o*100,l*100]};Gr.rgb.hwb=function(e){let t=e[0],r=e[1],n=e[2],s=Gr.rgb.hsl(e)[0],o=1/255*Math.min(t,Math.min(r,n));return n=1-1/255*Math.max(t,Math.max(r,n)),[s,o*100,n*100]};Gr.rgb.cmyk=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,s=Math.min(1-t,1-r,1-n),o=(1-t-s)/(1-s)||0,i=(1-r-s)/(1-s)||0,a=(1-n-s)/(1-s)||0;return[o*100,i*100,a*100,s*100]};function oH(e,t){return(e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2}Gr.rgb.keyword=function(e){let t=X_[e];if(t)return t;let r=1/0,n;for(let s of Object.keys(eA)){let o=eA[s],i=oH(e,o);i<r&&(r=i,n=s)}return n};Gr.keyword.rgb=function(e){return eA[e]};Gr.rgb.xyz=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255;t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;let s=t*.4124+r*.3576+n*.1805,o=t*.2126+r*.7152+n*.0722,i=t*.0193+r*.1192+n*.9505;return[s*100,o*100,i*100]};Gr.rgb.lab=function(e){let t=Gr.rgb.xyz(e),r=t[0],n=t[1],s=t[2];r/=95.047,n/=100,s/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,s=s>.008856?s**(1/3):7.787*s+16/116;let o=116*n-16,i=500*(r-n),a=200*(n-s);return[o,i,a]};Gr.hsl.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,s,o,i;if(r===0)return i=n*255,[i,i,i];n<.5?s=n*(1+r):s=n+r-n*r;let a=2*n-s,u=[0,0,0];for(let l=0;l<3;l++)o=t+1/3*-(l-1),o<0&&o++,o>1&&o--,6*o<1?i=a+(s-a)*6*o:2*o<1?i=s:3*o<2?i=a+(s-a)*(2/3-o)*6:i=a,u[l]=i*255;return u};Gr.hsl.hsv=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,s=r,o=Math.max(n,.01);n*=2,r*=n<=1?n:2-n,s*=o<=1?o:2-o;let i=(n+r)/2,a=n===0?2*s/(o+s):2*r/(n+r);return[t,a*100,i*100]};Gr.hsv.rgb=function(e){let t=e[0]/60,r=e[1]/100,n=e[2]/100,s=Math.floor(t)%6,o=t-Math.floor(t),i=255*n*(1-r),a=255*n*(1-r*o),u=255*n*(1-r*(1-o));switch(n*=255,s){case 0:return[n,u,i];case 1:return[a,n,i];case 2:return[i,n,u];case 3:return[i,a,n];case 4:return[u,i,n];case 5:return[n,i,a]}};Gr.hsv.hsl=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,s=Math.max(n,.01),o,i;i=(2-r)*n;let a=(2-r)*s;return o=r*s,o/=a<=1?a:2-a,o=o||0,i/=2,[t,o*100,i*100]};Gr.hwb.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,s=r+n,o;s>1&&(r/=s,n/=s);let i=Math.floor(6*t),a=1-n;o=6*t-i,(i&1)!==0&&(o=1-o);let u=r+o*(a-r),l,c,h;switch(i){default:case 6:case 0:l=a,c=u,h=r;break;case 1:l=u,c=a,h=r;break;case 2:l=r,c=a,h=u;break;case 3:l=r,c=u,h=a;break;case 4:l=u,c=r,h=a;break;case 5:l=a,c=r,h=u;break}return[l*255,c*255,h*255]};Gr.cmyk.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,s=e[3]/100,o=1-Math.min(1,t*(1-s)+s),i=1-Math.min(1,r*(1-s)+s),a=1-Math.min(1,n*(1-s)+s);return[o*255,i*255,a*255]};Gr.xyz.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,s,o,i;return s=t*3.2406+r*-1.5372+n*-.4986,o=t*-.9689+r*1.8758+n*.0415,i=t*.0557+r*-.204+n*1.057,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),i=Math.min(Math.max(0,i),1),[s*255,o*255,i*255]};Gr.xyz.lab=function(e){let t=e[0],r=e[1],n=e[2];t/=95.047,r/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*r-16,o=500*(t-r),i=200*(r-n);return[s,o,i]};Gr.lab.xyz=function(e){let t=e[0],r=e[1],n=e[2],s,o,i;o=(t+16)/116,s=r/500+o,i=o-n/200;let a=o**3,u=s**3,l=i**3;return o=a>.008856?a:(o-16/116)/7.787,s=u>.008856?u:(s-16/116)/7.787,i=l>.008856?l:(i-16/116)/7.787,s*=95.047,o*=100,i*=108.883,[s,o,i]};Gr.lab.lch=function(e){let t=e[0],r=e[1],n=e[2],s;s=Math.atan2(n,r)*360/2/Math.PI,s<0&&(s+=360);let i=Math.sqrt(r*r+n*n);return[t,i,s]};Gr.lch.lab=function(e){let t=e[0],r=e[1],s=e[2]/360*2*Math.PI,o=r*Math.cos(s),i=r*Math.sin(s);return[t,o,i]};Gr.rgb.ansi16=function(e,t=null){let[r,n,s]=e,o=t===null?Gr.rgb.hsv(e)[2]:t;if(o=Math.round(o/50),o===0)return 30;let i=30+(Math.round(s/255)<<2|Math.round(n/255)<<1|Math.round(r/255));return o===2&&(i+=60),i};Gr.hsv.ansi16=function(e){return Gr.rgb.ansi16(Gr.hsv.rgb(e),e[2])};Gr.rgb.ansi256=function(e){let t=e[0],r=e[1],n=e[2];return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)};Gr.ansi16.rgb=function(e){let t=e%10;if(t===0||t===7)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];let r=(~~(e>50)+1)*.5,n=(t&1)*r*255,s=(t>>1&1)*r*255,o=(t>>2&1)*r*255;return[n,s,o]};Gr.ansi256.rgb=function(e){if(e>=232){let o=(e-232)*10+8;return[o,o,o]}e-=16;let t,r=Math.floor(e/36)/5*255,n=Math.floor((t=e%36)/6)/5*255,s=t%6/5*255;return[r,n,s]};Gr.rgb.hex=function(e){let r=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Gr.hex.rgb=function(e){let t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];t[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let n=parseInt(r,16),s=n>>16&255,o=n>>8&255,i=n&255;return[s,o,i]};Gr.rgb.hcg=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,s=Math.max(Math.max(t,r),n),o=Math.min(Math.min(t,r),n),i=s-o,a,u;return i<1?a=o/(1-i):a=0,i<=0?u=0:s===t?u=(r-n)/i%6:s===r?u=2+(n-t)/i:u=4+(t-r)/i,u/=6,u%=1,[u*360,i*100,a*100]};Gr.hsl.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=r<.5?2*t*r:2*t*(1-r),s=0;return n<1&&(s=(r-.5*n)/(1-n)),[e[0],n*100,s*100]};Gr.hsv.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=t*r,s=0;return n<1&&(s=(r-n)/(1-n)),[e[0],n*100,s*100]};Gr.hcg.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100;if(r===0)return[n*255,n*255,n*255];let s=[0,0,0],o=t%1*6,i=o%1,a=1-i,u=0;switch(Math.floor(o)){case 0:s[0]=1,s[1]=i,s[2]=0;break;case 1:s[0]=a,s[1]=1,s[2]=0;break;case 2:s[0]=0,s[1]=1,s[2]=i;break;case 3:s[0]=0,s[1]=a,s[2]=1;break;case 4:s[0]=i,s[1]=0,s[2]=1;break;default:s[0]=1,s[1]=0,s[2]=a}return u=(1-r)*n,[(r*s[0]+u)*255,(r*s[1]+u)*255,(r*s[2]+u)*255]};Gr.hcg.hsv=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t),s=0;return n>0&&(s=t/n),[e[0],s*100,n*100]};Gr.hcg.hsl=function(e){let t=e[1]/100,n=e[2]/100*(1-t)+.5*t,s=0;return n>0&&n<.5?s=t/(2*n):n>=.5&&n<1&&(s=t/(2*(1-n))),[e[0],s*100,n*100]};Gr.hcg.hwb=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t);return[e[0],(n-t)*100,(1-n)*100]};Gr.hwb.hcg=function(e){let t=e[1]/100,n=1-e[2]/100,s=n-t,o=0;return s<1&&(o=(n-s)/(1-s)),[e[0],s*100,o*100]};Gr.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};Gr.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};Gr.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};Gr.gray.hsl=function(e){return[0,0,e[0]]};Gr.gray.hsv=Gr.gray.hsl;Gr.gray.hwb=function(e){return[0,100,e[0]]};Gr.gray.cmyk=function(e){return[0,0,0,e[0]]};Gr.gray.lab=function(e){return[e[0],0,0]};Gr.gray.hex=function(e){let t=Math.round(e[0]/100*255)&255,n=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(n.length)+n};Gr.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var rS=Fr((vte,tS)=>{var mp=eD();function aH(){let e={},t=Object.keys(mp);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function uH(e){let t=aH(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),s=Object.keys(mp[n]);for(let o=s.length,i=0;i<o;i++){let a=s[i],u=t[a];u.distance===-1&&(u.distance=t[n].distance+1,u.parent=n,r.unshift(a))}}return t}function lH(e,t){return function(r){return t(e(r))}}function cH(e,t){let r=[t[e].parent,e],n=mp[t[e].parent][e],s=t[e].parent;for(;t[s].parent;)r.unshift(t[s].parent),n=lH(mp[t[s].parent][s],n),s=t[s].parent;return n.conversion=r,n}tS.exports=function(e){let t=uH(e),r={},n=Object.keys(t);for(let s=n.length,o=0;o<s;o++){let i=n[o];t[i].parent!==null&&(r[i]=cH(i,t))}return r}});var iS=Fr((xte,nS)=>{var tD=eD(),hH=rS(),qc={},dH=Object.keys(tD);function AH(e){let t=function(...r){let n=r[0];return n==null?n:(n.length>1&&(r=n),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}function fH(e){let t=function(...r){let n=r[0];if(n==null)return n;n.length>1&&(r=n);let s=e(r);if(typeof s=="object")for(let o=s.length,i=0;i<o;i++)s[i]=Math.round(s[i]);return s};return"conversion"in e&&(t.conversion=e.conversion),t}dH.forEach(e=>{qc[e]={},Object.defineProperty(qc[e],"channels",{value:tD[e].channels}),Object.defineProperty(qc[e],"labels",{value:tD[e].labels});let t=hH(e);Object.keys(t).forEach(n=>{let s=t[n];qc[e][n]=fH(s),qc[e][n].raw=AH(s)})});nS.exports=qc});var cS=Fr((_te,lS)=>{"use strict";var sS=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,oS=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},aS=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},Ep=e=>e,uS=(e,t,r)=>[e,t,r],Gc=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{let n=r();return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0}),n},enumerable:!0,configurable:!0})},rD,Vc=(e,t,r,n)=>{rD===void 0&&(rD=iS());let s=n?10:0,o={};for(let[i,a]of Object.entries(rD)){let u=i==="ansi16"?"ansi":i;i===t?o[u]=e(r,s):typeof a=="object"&&(o[u]=e(a[t],s))}return o};function pH(){let e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(let[r,n]of Object.entries(t)){for(let[s,o]of Object.entries(n))t[s]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},n[s]=t[s],e.set(o[0],o[1]);Object.defineProperty(t,r,{value:n,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="\x1B[39m",t.bgColor.close="\x1B[49m",Gc(t.color,"ansi",()=>Vc(sS,"ansi16",Ep,!1)),Gc(t.color,"ansi256",()=>Vc(oS,"ansi256",Ep,!1)),Gc(t.color,"ansi16m",()=>Vc(aS,"rgb",uS,!1)),Gc(t.bgColor,"ansi",()=>Vc(sS,"ansi16",Ep,!0)),Gc(t.bgColor,"ansi256",()=>Vc(oS,"ansi256",Ep,!0)),Gc(t.bgColor,"ansi16m",()=>Vc(aS,"rgb",uS,!0)),t}Object.defineProperty(lS,"exports",{enumerable:!0,get:pH})});var AS=Fr((Ste,dS)=>{"use strict";var tA=W_(),gH=gp(),mH=cS(),iD=new Set(["\x1B","\x9B"]),EH=39,hS=e=>`${iD.values().next().value}[${e}m`,yH=e=>e.split(" ").map(t=>tA(t)),nD=(e,t,r)=>{let n=[...t],s=!1,o=tA(gH(e[e.length-1]));for(let[i,a]of n.entries()){let u=tA(a);if(o+u<=r?e[e.length-1]+=a:(e.push(a),o=0),iD.has(a))s=!0;else if(s&&a==="m"){s=!1;continue}s||(o+=u,o===r&&i<n.length-1&&(e.push(""),o=0))}!o&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop())},DH=e=>{let t=e.split(" "),r=t.length;for(;r>0&&!(tA(t[r-1])>0);)r--;return r===t.length?e:t.slice(0,r).join(" ")+t.slice(r).join("")},CH=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let n="",s="",o,i=yH(e),a=[""];for(let[u,l]of e.split(" ").entries()){r.trim!==!1&&(a[a.length-1]=a[a.length-1].trimLeft());let c=tA(a[a.length-1]);if(u!==0&&(c>=t&&(r.wordWrap===!1||r.trim===!1)&&(a.push(""),c=0),(c>0||r.trim===!1)&&(a[a.length-1]+=" ",c++)),r.hard&&i[u]>t){let h=t-c,A=1+Math.floor((i[u]-h-1)/t);Math.floor((i[u]-1)/t)<A&&a.push(""),nD(a,l,t);continue}if(c+i[u]>t&&c>0&&i[u]>0){if(r.wordWrap===!1&&c<t){nD(a,l,t);continue}a.push("")}if(c+i[u]>t&&r.wordWrap===!1){nD(a,l,t);continue}a[a.length-1]+=l}r.trim!==!1&&(a=a.map(DH)),n=a.join(`
1234
1234
  `);for(let[u,l]of[...n].entries()){if(s+=l,iD.has(l)){let h=parseFloat(/\d[^m]*/.exec(n.slice(u,u+4)));o=h===EH?null:h}let c=mH.codes.get(Number(o));o&&c&&(n[u+1]===`
@@ -1293,7 +1293,7 @@ ${Ti}Model names (comma-separated):${cn}`,validate:l=>l.trim()?!0:"At least one
1293
1293
  ${Ti}Do you want to set one of these models in router configuration?${cn}`,default:!1})&&o.length>0){let l=o[0];o.length>1&&(l=await Vo({message:`
1294
1294
  ${Ti}Select which model to configure:${cn}`,choices:o.map(h=>({name:h,value:h}))}));let c=await Vo({message:`
1295
1295
  ${Ti}Select configuration type:${cn}`,choices:[{name:"Default Model",value:"default"},{name:"Background Model",value:"background"},{name:"Think Model",value:"think"},{name:"Long Context Model",value:"longContext"},{name:"Web Search Model",value:"webSearch"},{name:"Image Model",value:"image"}]});return{providerName:t,modelName:l,modelType:c}}return null}async function g2(){console.clear();try{let e=h2();d2(e);let t=await wq();if(t==="addModel"){let r=await Iq(e);r&&(e=h2(),e.Router[r.modelType]=`${r.providerName},${r.modelName}`,qp(e),console.log(`${gA}\u2713 ${r.modelType} set to ${r.providerName},${r.modelName}${cn}`))}else{let r=await Bq(e,t);e.Router[t]=r,qp(e),console.log(`${gA}\u2713 ${t} model updated to: ${r}${cn}`)}d2(e)}catch(e){console.error(`${Hp}Error:${cn}`,e.message),process.exit(1)}}var m2=async()=>{let e=await up();for(let[t,r]of Object.entries(e))console.log(r===""?`export ${t}=""`:r===void 0?`unset ${t}`:`export ${t}="${r}"`)};Mu();Ny();var ql=require("child_process"),Jo=tn(no()),hh=tn(require("fs")),og=require("path");var Ia=tn(require("node:fs/promises")),Gp=tn(require("node:path")),C2=require("child_process"),b2=require("node:os"),nu=tn(no()),oC=tn(Vf()),E2={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bright_black:"\x1B[90m",bright_red:"\x1B[91m",bright_green:"\x1B[92m",bright_yellow:"\x1B[93m",bright_blue:"\x1B[94m",bright_magenta:"\x1B[95m",bright_cyan:"\x1B[96m",bright_white:"\x1B[97m",bg_black:"\x1B[40m",bg_red:"\x1B[41m",bg_green:"\x1B[42m",bg_yellow:"\x1B[43m",bg_blue:"\x1B[44m",bg_magenta:"\x1B[45m",bg_cyan:"\x1B[46m",bg_white:"\x1B[47m",bg_bright_black:"\x1B[100m",bg_bright_red:"\x1B[101m",bg_bright_green:"\x1B[102m",bg_bright_yellow:"\x1B[103m",bg_bright_blue:"\x1B[104m",bg_bright_magenta:"\x1B[105m",bg_bright_cyan:"\x1B[106m",bg_bright_white:"\x1B[107m"},_q="\x1B[38;2;";function Sq(e){if(e=e.replace(/^#/,"").trim(),e.length===3&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e.length!==6)return null;let t=parseInt(e.substring(0,2),16),r=parseInt(e.substring(2,4),16),n=parseInt(e.substring(4,6),16);return isNaN(t)||isNaN(r)||isNaN(n)||t<0||t>255||r<0||r>255||n<0||n>255?null:{r:t,g:r,b:n}}function y2(e){if(E2[e])return E2[e];if(e.startsWith("#")||/^[0-9a-fA-F]{6}$/.test(e)||/^[0-9a-fA-F]{3}$/.test(e)){let t=Sq(e);if(t)return`${_q}${t.r};${t.g};${t.b}m`}return""}function sC(e,t){return e.replace(/\{\{(\w+)\}\}/g,(r,n)=>t[n]||"")}async function w2(e,t,r){try{await Ia.default.access(e);let n=require(e);if(typeof n=="function"){let s=n(t,r);return s instanceof Promise?await s:s}if(n.default&&typeof n.default=="function"){let s=n.default(t);return s instanceof Promise?await s:s}return typeof n=="string"?n:n.default&&typeof n.default=="string"?n.default:""}catch(n){return console.error(`Error executing script ${e}:`,n),""}}var B2={modules:[{type:"workDir",icon:"\u{F024B}",text:"{{workDirName}}",color:"bright_blue"},{type:"gitBranch",icon:"\uE725",text:"{{gitBranch}}",color:"bright_magenta"},{type:"model",icon:"\u{F06A9}",text:"{{model}}",color:"bright_cyan"},{type:"contextCircle",icon:"\u25CB",text:"{{contextPercent}}% {{contextUsage}}",color:"#22c55e"},{type:"usage",icon:"\u2191",text:"{{inputTokens}}",color:"bright_green"},{type:"usage",icon:"\u2193",text:"{{outputTokens}}",color:"bright_yellow"},{type:"totalTokens",icon:"\u{1F4CB}",text:"{{totalTokens}}",color:"bright_white"}]},Fq={modules:[{type:"workDir",icon:"\u{F024B}",text:"{{workDirName}}",color:"white",background:"bg_bright_blue"},{type:"gitBranch",icon:"\uE725",text:"{{gitBranch}}",color:"white",background:"bg_bright_magenta"},{type:"model",icon:"\u{F06A9}",text:"{{model}}",color:"white",background:"bg_bright_cyan"},{type:"contextCircle",icon:"\u25CB",text:"{{contextPercent}}% {{contextUsage}}",color:"#22c55e",background:"bg_bright_black"},{type:"usage",icon:"\u2191",text:"{{inputTokens}}",color:"white",background:"bg_bright_green"},{type:"usage",icon:"\u2193",text:"{{outputTokens}}",color:"white",background:"bg_bright_yellow"},{type:"totalTokens",icon:"\u{1F4CB}",text:"{{totalTokens}}",color:"white",background:"bg_bright_white"}]},kq={modules:[{type:"workDir",icon:"",text:"{{workDirName}}",color:"bright_blue"},{type:"gitBranch",icon:"",text:"{{gitBranch}}",color:"bright_magenta"},{type:"model",icon:"",text:"{{model}}",color:"bright_cyan"},{type:"contextCircle",icon:"\u25CB",text:"{{contextPercent}}% {{contextUsage}}",color:"#22c55e"},{type:"usage",icon:"\u2191",text:"{{inputTokens}}",color:"bright_green"},{type:"usage",icon:"\u2193",text:"{{outputTokens}}",color:"bright_yellow"}]};function ru(e){if(e<1e3)return`${e}t`;if(e<1e6){let r=e/1e3;return`${r%1===0?r.toFixed(0):r.toFixed(1)}k`}if(e<1e9){let r=e/1e6;return`${r%1===0?r.toFixed(0):r.toFixed(1)}m`}let t=e/1e9;return`${t%1===0?t.toFixed(0):t.toFixed(1)}b`}function Tq(e,t){return`${ru(e)} ${ru(t)}`}function I2(e){if(!e||!e.current_usage)return 0;let{current_usage:t}=e;return t.input_tokens+t.cache_creation_input_tokens+t.cache_read_input_tokens}function Rq(e){return e?.context_window_size?Math.round(I2(e)/e.context_window_size*100):0}function v2(e){let t=parseInt(e||"0",10);return t>75?"#ef4444":t>50?"#eab308":"#22c55e"}function Qq(e){return e<.01?`${(e*100).toFixed(2)}\xA2`:`$${e.toFixed(2)}`}function D2(e){if(Number.isNaN(e))return"";if(e<1e3)return`${e}ms`;if(e<6e4)return`${(e/1e3).toFixed(1)}s`;{let t=Math.floor(e/6e4),r=(e%6e4/1e3).toFixed(0);return Number.isNaN(t)||Number.isNaN(r)?"":`${t}m${r}s`}}async function Nq(e){try{let t=Gp.default.join((0,b2.tmpdir)(),"claude-code-router");try{await Ia.default.access(t)}catch{return null}let r=Gp.default.join(t,`session-${e}.json`);try{await Ia.default.access(r)}catch{return null}let n=await Ia.default.readFile(r,"utf-8"),s=JSON.parse(n);if(s.tokensPerSecond!==void 0&&s.tokensPerSecond>0){let o=Date.now(),i=s.timestamp||0;return(o-i)/1e3>3?{tokensPerSecond:0,timeToFirstToken:s.timeToFirstToken}:{tokensPerSecond:parseInt(s.tokensPerSecond),timeToFirstToken:s.timeToFirstToken}}return null}catch{return null}}async function Oq(){try{let e=nu.CONFIG_FILE;try{await Ia.default.access(e)}catch{return{theme:null,style:"default"}}let t=await Ia.default.readFile(e,"utf-8"),r=oC.default.parse(t);if(r.StatusLine){let n=r.StatusLine.currentStyle||"default";if(r.StatusLine[n]&&r.StatusLine[n].modules)return{theme:r.StatusLine[n],style:n}}}catch{}return{theme:null,style:"default"}}async function Lq(e){try{let t=await(0,nu.readPresetFile)(e);if(!t)return{theme:null,style:"default"};let r=(0,nu.getPresetDir)(e),n=(0,nu.loadConfigFromManifest)(t,r);if(n.StatusLine){let s=n.StatusLine.currentStyle||"default";if(n.StatusLine[s]&&n.StatusLine[s].modules)return{theme:n.StatusLine[s],style:s}}}catch{}return{theme:null,style:"default"}}function Pq(){if(process.env.USE_SIMPLE_ICONS==="true")return!0;let e=process.env.TERM||"";return!!["dumb","unknown"].includes(e)}function Mq(){if(process.env.USE_SIMPLE_ICONS==="true")return!1;let e=["NERD_FONT","NERDFONT","FONT"];for(let s of e){let o=process.env[s];if(o&&(o.includes("Nerd")||o.includes("nerd")))return!0}let t=process.env.TERM_PROGRAM||"";if(["iTerm.app","vscode","Hyper","kitty","alacritty"].includes(t))return!0;let n=process.env.COLORTERM||"";return n.includes("truecolor")||n.includes("24bit")?!0:process.env.USE_SIMPLE_ICONS!=="true"}async function x2(e,t){try{let r=Pq(),n=Mq(),s=r||!n?kq:B2,o=null,i="default";if(t){let Z=await Lq(t);o=Z.theme,i=Z.style}if(!o){let Z=await Oq();o=Z.theme,i=Z.style}let a=o||s,u=e.workspace.current_dir,l="";try{l=(0,C2.execSync)("git branch --show-current",{cwd:u,stdio:["pipe","pipe","ignore"]}).toString().trim()}catch{}let h=(await Ia.default.readFile(e.transcript_path,"utf-8")).trim().split(`
1296
- `),A="",d=0,f=0,p=0,m=0,E=0,C=0;for(let Z=h.length-1;Z>=0;Z--)try{let le=JSON.parse(h[Z]);le.type==="assistant"&&le.message.model&&(le.message.usage&&(p+=le.message.usage.input_tokens,m+=le.message.usage.output_tokens,E+=le.message.usage.cache_creation_input_tokens||0,C+=le.message.usage.cache_read_input_tokens||0),A||(A=le.message.model,le.message.usage&&(d=le.message.usage.input_tokens,f=le.message.usage.output_tokens)))}catch{continue}if(!A)try{let Z=Gp.default.join(u,".claude-code-router","config.json"),le=Z;try{await Ia.default.access(Z)}catch{le=nu.CONFIG_FILE}let z=await Ia.default.readFile(le,"utf-8"),M=oC.default.parse(z);if(M.Router&&M.Router.default){let[,ie]=M.Router.default.split(",");ie&&(A=ie.trim())}}catch{}A||(A=e.model.display_name);let y=u.split("/").pop()||"",D=Tq(d,f),[w,v]=D.split(" "),b=await Nq(e.session_id),I=b&&b.tokensPerSecond>0?b.tokensPerSecond.toString():"",B=b!==null&&b.tokensPerSecond>0,S=B?"[Streaming]":"",x="";b?.timeToFirstToken!==void 0&&(x=D2(b.timeToFirstToken));let F=e.context_window?Rq(e.context_window):0,R=e.context_window?I2(e.context_window):0,O=p||e.context_window?.total_input_tokens||0,T=m||e.context_window?.total_output_tokens||0,Q=E+C,U=e.context_window?.context_window_size||0,P=(C>p?O:O+Q)+T,X=e.cost?.total_cost_usd||0,Ee=X>0?Qq(X):"",ne=e.cost?.total_duration_ms||0,ce=ne>0?D2(ne):"",ue=e.cost?.total_lines_added||0,be=e.cost?.total_lines_removed||0,ve={workDirName:y,gitBranch:l,model:A,inputTokens:w,outputTokens:v,tokenSpeed:I||"0",isStreaming:B?"streaming":"",timeToFirstToken:x,contextPercent:F.toString(),contextUsedTokens:ru(R),contextUsage:U?`${ru(R)}/${ru(U)}`:"",streamingIndicator:S,contextWindowSize:ru(U),totalInputTokens:ru(O),totalOutputTokens:ru(T),totalTokens:ru(P),cost:Ee||"",duration:ce||"",linesAdded:ue.toString(),linesRemoved:be.toString(),netLines:(ue-be).toString(),version:e.version||"",sessionId:e.session_id.substring(0,8)};return i==="powerline"?await Hq(a,ve):await Uq(a,ve)}catch{return""}}async function Uq(e,t){let r=e.modules||B2.modules,n=[];for(let s=0;s<r.length;s++){let o=r[s],i=o.type==="contextCircle"?v2(t.contextPercent):o.color||"",a=i?y2(i):"",u=o.background?y2(o.background):"",l=o.icon||"",c="";o.type==="script"&&o.scriptPath?c=await w2(o.scriptPath,t,o.options):c=sC(o.text,t);let h="";l&&(h+=`${l} `),h+=c,!(!h||!c)&&n.push(h)}return n.join(" ")}var jq="\uE0B0";function $q(e,t,r,n){let s=` ${e} `;return n!=null?s+` ${jq} `:s}async function Hq(e,t){let r=e.modules||Fq.modules,n=[];for(let s=0;s<Math.min(r.length,10);s++){let o=r[s],i=o.type==="contextCircle"?v2(t.contextPercent):o.color||"white",a=o.background||"",u=o.icon||"",l="";o.type==="script"&&o.scriptPath?l=await w2(o.scriptPath,t):(o.type,l=sC(o.text,t));let c="";if(u&&(c+=`${u} `),c+=l,!c||!l)continue;let h=null;s<r.length-1&&(h=r[s+1].background||null);let d=$q(c,i,a||"bg_bright_blue",h);n.push(d)}return n.join("")}var Yo=tn(require("node:fs")),mA=tn(require("node:path")),_2=tn(require("node:os")),cC=tn(no()),aC=mA.default.join(_2.default.homedir(),".claude","settings.json"),uC=mA.default.join(cC.HOME_DIR,".statusline-backup.json"),lC=mA.default.join(cC.HOME_DIR,".model-env-backup.json");function Yp(){try{let e=Yo.default.readFileSync(aC,"utf-8");return JSON.parse(e)}catch{return{}}}function Jp(e){let t=mA.default.dirname(aC);Yo.default.existsSync(t)||Yo.default.mkdirSync(t,{recursive:!0}),Yo.default.writeFileSync(aC,JSON.stringify(e,null,2),"utf-8")}function hC(e){if(!e?.StatusLine?.enabled)return;let t=Yp();t.statusLine&&t.statusLine.command!=="ccr statusline"&&Yo.default.writeFileSync(uC,JSON.stringify(t.statusLine),"utf-8"),t.statusLine={type:"command",command:"ccr statusline",padding:0},Jp(t)}function dC(){let e=Yp();if(e.statusLine?.command==="ccr statusline"){try{let t=Yo.default.readFileSync(uC,"utf-8");e.statusLine=JSON.parse(t),Yo.default.unlinkSync(uC)}catch{delete e.statusLine}Jp(e)}}function qq(e){let t=e?.Router?.families;return!t||typeof t!="object"?!1:Object.keys(t).length>0}function Vp(e){return e?.enableExtendedContext===!0}function AC(e){if(!qq(e))return;let t=e.Router.families,r=Yp();r.env||(r.env={});let n=e.PORT||3456,s=e.APIKEY||"test";r.env.ANTHROPIC_BASE_URL=`http://127.0.0.1:${n}`,r.env.ANTHROPIC_AUTH_TOKEN=s;let o={},i=["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_REASONING_MODEL"],a=!1;for(let A of i)r.env[A]&&!r.env[A].startsWith("ccr-")&&(o[A]=r.env[A],a=!0);a&&Yo.default.writeFileSync(lC,JSON.stringify(o),"utf-8");let u=Object.keys(t),l=null;for(let A of u){let d=t[A],f=Vp(d)?"[1m]":"",p=`ccr-${A}${f}`;switch(A){case"opus":r.env.ANTHROPIC_DEFAULT_OPUS_MODEL=p,l||(l="opus");break;case"sonnet":r.env.ANTHROPIC_DEFAULT_SONNET_MODEL=p,l||(l="sonnet");break;case"haiku":r.env.ANTHROPIC_DEFAULT_HAIKU_MODEL=p,l||(l="haiku");break}}let c=t.opus?"opus":l;if(c){let A=t[c],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_MODEL=`ccr-${c}${d}`}let h=u.find(A=>t[A]?.think);if(h){let A=t[h],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_REASONING_MODEL=`ccr-${h}${d}`}else if(l){let A=t[l],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_REASONING_MODEL=`ccr-${l}${d}`}Jp(r)}function fC(){let e=Yp();try{let t=JSON.parse(Yo.default.readFileSync(lC,"utf-8"));e.env||(e.env={});for(let[r,n]of Object.entries(t))e.env[r]=n;Yo.default.unlinkSync(lC)}catch{if(e.env)for(let t of Object.keys(e.env))typeof e.env[t]=="string"&&e.env[t].startsWith("ccr-")&&delete e.env[t]}Jp(e)}var $l={};Xb($l,{applyPresetCli:()=>oh,exportPresetCli:()=>zp,handlePresetCommand:()=>Zp,installPresetCli:()=>Kp});td($l,tn(no()));Mu();var F2=tn(no()),zs="\x1B[0m",Gq="\x1B[32m",Vq="\x1B[1m\x1B[32m",S2="\x1B[33m",iu="\x1B[1m\x1B[36m";async function zp(e,t={}){try{console.log(`
1296
+ `),A="",d=0,f=0,p=0,m=0,E=0,C=0;for(let Z=h.length-1;Z>=0;Z--)try{let le=JSON.parse(h[Z]);le.type==="assistant"&&le.message.model&&(le.message.usage&&(p+=le.message.usage.input_tokens,m+=le.message.usage.output_tokens,E+=le.message.usage.cache_creation_input_tokens||0,C+=le.message.usage.cache_read_input_tokens||0),A||(A=le.message.model,le.message.usage&&(d=le.message.usage.input_tokens,f=le.message.usage.output_tokens)))}catch{continue}if(!A)try{let Z=Gp.default.join(u,".claude-code-router","config.json"),le=Z;try{await Ia.default.access(Z)}catch{le=nu.CONFIG_FILE}let z=await Ia.default.readFile(le,"utf-8"),M=oC.default.parse(z);if(M.Router&&M.Router.default){let[,ie]=M.Router.default.split(",");ie&&(A=ie.trim())}}catch{}A||(A=e.model.display_name);let y=u.split("/").pop()||"",D=Tq(d,f),[w,v]=D.split(" "),b=await Nq(e.session_id),I=b&&b.tokensPerSecond>0?b.tokensPerSecond.toString():"",B=b!==null&&b.tokensPerSecond>0,S=B?"[Streaming]":"",x="";b?.timeToFirstToken!==void 0&&(x=D2(b.timeToFirstToken));let F=e.context_window?Rq(e.context_window):0,R=e.context_window?I2(e.context_window):0,O=p||e.context_window?.total_input_tokens||0,T=m||e.context_window?.total_output_tokens||0,Q=E+C,U=e.context_window?.context_window_size||0,P=(C>p?O:O+Q)+T,X=e.cost?.total_cost_usd||0,Ee=X>0?Qq(X):"",ne=e.cost?.total_duration_ms||0,ce=ne>0?D2(ne):"",ue=e.cost?.total_lines_added||0,be=e.cost?.total_lines_removed||0,ve={workDirName:y,gitBranch:l,model:A,inputTokens:w,outputTokens:v,tokenSpeed:I||"0",isStreaming:B?"streaming":"",timeToFirstToken:x,contextPercent:F.toString(),contextUsedTokens:ru(R),contextUsage:U?`${ru(R)}/${ru(U)}`:"",streamingIndicator:S,contextWindowSize:ru(U),totalInputTokens:ru(O),totalOutputTokens:ru(T),totalTokens:ru(P),cost:Ee||"",duration:ce||"",linesAdded:ue.toString(),linesRemoved:be.toString(),netLines:(ue-be).toString(),version:e.version||"",sessionId:e.session_id.substring(0,8)};return i==="powerline"?await Hq(a,ve):await Uq(a,ve)}catch{return""}}async function Uq(e,t){let r=e.modules||B2.modules,n=[];for(let s=0;s<r.length;s++){let o=r[s],i=o.type==="contextCircle"?v2(t.contextPercent):o.color||"",a=i?y2(i):"",u=o.background?y2(o.background):"",l=o.icon||"",c="";o.type==="script"&&o.scriptPath?c=await w2(o.scriptPath,t,o.options):c=sC(o.text,t);let h="";l&&(h+=`${l} `),h+=c,!(!h||!c)&&n.push(h)}return n.join(" ")}var jq="\uE0B0";function $q(e,t,r,n){let s=` ${e} `;return n!=null?s+` ${jq} `:s}async function Hq(e,t){let r=e.modules||Fq.modules,n=[];for(let s=0;s<Math.min(r.length,10);s++){let o=r[s],i=o.type==="contextCircle"?v2(t.contextPercent):o.color||"white",a=o.background||"",u=o.icon||"",l="";o.type==="script"&&o.scriptPath?l=await w2(o.scriptPath,t):(o.type,l=sC(o.text,t));let c="";if(u&&(c+=`${u} `),c+=l,!c||!l)continue;let h=null;s<r.length-1&&(h=r[s+1].background||null);let d=$q(c,i,a||"bg_bright_blue",h);n.push(d)}return n.join("")}var Yo=tn(require("node:fs")),mA=tn(require("node:path")),_2=tn(require("node:os")),cC=tn(no()),aC=mA.default.join(_2.default.homedir(),".claude","settings.json"),uC=mA.default.join(cC.HOME_DIR,".statusline-backup.json"),lC=mA.default.join(cC.HOME_DIR,".model-env-backup.json");function Yp(){try{let e=Yo.default.readFileSync(aC,"utf-8");return JSON.parse(e)}catch{return{}}}function Jp(e){let t=mA.default.dirname(aC);Yo.default.existsSync(t)||Yo.default.mkdirSync(t,{recursive:!0}),Yo.default.writeFileSync(aC,JSON.stringify(e,null,2),"utf-8")}function hC(e){if(!e?.StatusLine?.enabled)return;let t=Yp();t.statusLine&&t.statusLine.command!=="ccr statusline"&&Yo.default.writeFileSync(uC,JSON.stringify(t.statusLine),"utf-8"),t.statusLine={type:"command",command:"ccr statusline",padding:0},Jp(t)}function dC(){let e=Yp();if(e.statusLine?.command==="ccr statusline"){try{let t=Yo.default.readFileSync(uC,"utf-8");e.statusLine=JSON.parse(t),Yo.default.unlinkSync(uC)}catch{delete e.statusLine}Jp(e)}}function qq(e){let t=e?.Router?.families;return!t||typeof t!="object"?!1:Object.keys(t).length>0}function Vp(e){return e?.enableExtendedContext===!0}function AC(e){if(!qq(e))return;let t=e.Router.families,r=Yp();r.env||(r.env={});let n=e.PORT||3456,s=e.APIKEY||"test";r.env.ANTHROPIC_BASE_URL=`http://127.0.0.1:${n}`,r.env.ANTHROPIC_AUTH_TOKEN=s;let o={},i=["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_REASONING_MODEL"],a=!1;for(let A of i)r.env[A]&&!r.env[A].startsWith("ccr-")&&(o[A]=r.env[A],a=!0);a&&Yo.default.writeFileSync(lC,JSON.stringify(o),"utf-8");let u=Object.keys(t),l=null;for(let A of u){let d=t[A],f=Vp(d)?"[1m]":"",p=`ccr-${A}${f}`;switch(A){case"opus":r.env.ANTHROPIC_DEFAULT_OPUS_MODEL=p,l||(l="opus");break;case"sonnet":r.env.ANTHROPIC_DEFAULT_SONNET_MODEL=p,l||(l="sonnet");break;case"haiku":r.env.ANTHROPIC_DEFAULT_HAIKU_MODEL=p,l||(l="haiku");break}}let c=t.opus?"opus":l;if(c){let A=t[c],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_MODEL=`ccr-${c}${d}`}let h=u.find(A=>t[A]?.think);if(h){let A=t[h],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_REASONING_MODEL=`ccr-${h}${d}`}else if(l){let A=t[l],d=Vp(A)?"[1m]":"";r.env.ANTHROPIC_REASONING_MODEL=`ccr-${l}${d}`}Jp(r)}function fC(){let e=Yp();try{let t=JSON.parse(Yo.default.readFileSync(lC,"utf-8"));e.env||(e.env={});for(let[r,n]of Object.entries(t))e.env[r]=n;Yo.default.unlinkSync(lC)}catch{if(e.env)for(let t of Object.keys(e.env))typeof e.env[t]=="string"&&e.env[t].startsWith("ccr-")&&delete e.env[t]}Jp(e)}var $l={};Xb($l,{applyPresetCli:()=>oh,exportPresetCli:()=>zp,handlePresetCommand:()=>Zp,installPresetCli:()=>Kp});td($l,tn(no()));Mu();var F2=tn(no()),zs="\x1B[0m",Gq="\x1B[32m",Vq="\x1B[1m\x1B[32m",S2="\x1B[33m",iu="\x1B[1m\x1B[36m";async function zp(e,t={}){try{console.log(`
1297
1297
  ${iu}\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550${zs}`),console.log(`${iu} Preset Export${zs}`),console.log(`${iu}\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550${zs}
1298
1298
  `);let r=await ys();if(!t.description)try{t.description=await Wi({message:"Description (optional):",default:""})}catch{t.description=""}if(!t.author)try{t.author=await Wi({message:"Author (optional):",default:""})}catch{t.author=""}if(!t.tags)try{let s=await Wi({message:"Keywords (comma-separated, optional):",default:""});t.tags=s||""}catch{t.tags=""}let n=await(0,F2.exportPreset)(e,r,t);console.log(`
1299
1299
  ${Vq}\u2713 Preset exported successfully${zs}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wengine-ai/claude-code-router",
3
- "version": "2.0.59",
3
+ "version": "2.0.60",
4
4
  "description": "CLI for Claude Code Router",
5
5
  "bin": {
6
6
  "ccr": "dist/cli.js"
@@ -14,7 +14,7 @@
14
14
  "author": "musistudio",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@wengine-ai/llms": "^2.0.58",
17
+ "@wengine-ai/llms": "^2.0.59",
18
18
  "lru-cache": "^11.2.2"
19
19
  },
20
20
  "devDependencies": {