@wengine-ai/claude-code-router 2.0.36 → 2.0.37

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 +5 -5
  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 Ie
579
579
  ${this.toMarkdown(N,S+1)}`:`${T}- ${N}`).join(`
580
580
  `):typeof y=="object"&&y!==null?Object.entries(y).map(([N,V])=>typeof V=="object"&&V!==null?`${T}${N}:
581
581
  ${this.toMarkdown(V,S+1)}`:`${T}${N}: ${V}`).join(`
582
- `):`${T}${y}`}async output(y,S={}){try{let T=this.formatData(y,S);switch(this.config.level||"log"){case"info":console.info(T);break;case"warn":console.warn(T);break;case"error":console.error(T);break;case"debug":console.debug(T);break;case"log":default:console.log(T);break}return!0}catch(T){return console.error("[ConsoleOutputHandler] Output failed:",T),!1}}}}),TA,RA=u(()=>{"use strict";TA=class{type="webhook";config;defaultTimeout=3e4;constructor(y){if(!y.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...y}}buildHeaders(){let y={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(y.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let S=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");y.Authorization=`Basic ${S}`}break;case"custom":this.config.auth.custom&&(y[this.config.auth.custom.header]=this.config.auth.custom.value);break}return y}buildBody(y,S){let{format:T="json",timestamp:N=!0,prefix:V,metadata:H}=S||{},Y={data:y};return N&&(Y.timestamp=new Date().toISOString()),V&&(Y.prefix=V),H&&Object.keys(H).length>0&&(Y.metadata=H),Y}async sendRequest(y,S,T,N,V){let H=new AbortController,Y=setTimeout(()=>H.abort(),V);try{let K=await fetch(y,{method:S,headers:T,body:JSON.stringify(N),signal:H.signal});if(clearTimeout(Y),!K.ok)throw new Error(`HTTP ${K.status}: ${K.statusText}`);return K}catch(K){throw clearTimeout(Y),K}}delay(y){return new Promise(S=>setTimeout(S,y))}async sendWithRetry(y,S,T,N,V,H){let Y=null;for(let K=1;K<=H.maxAttempts;K++)try{return await this.sendRequest(y,S,T,N,V)}catch(ae){if(Y=ae,K===H.maxAttempts)break;let ee=H.backoffMs*Math.pow(2,K-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${K}/${H.maxAttempts}), retrying in ${ee}ms...`,ae.message),await this.delay(ee)}throw Y}async output(y,S={}){let T=S.timeout||this.defaultTimeout;try{let N=this.buildHeaders(),V=this.buildBody(y,S),H=await this.sendWithRetry(this.config.url,this.config.method,N,V,T,this.config.retry);return!0}catch(N){let V=N instanceof Error?N.message:String(N);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${V}`),!1;throw new Error(`Webhook output failed: ${V}`)}}}}),Yu,Os,Ju,tu,Ih=u(()=>{"use strict";Yu=require("fs"),Os=require("path"),Ju=require("os"),tu=class{type="temp-file";config;baseDir;constructor(y={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...y};let S=(0,Ju.tmpdir)();this.baseDir=(0,Os.join)(S,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,Yu.existsSync)(this.baseDir)||(0,Yu.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(y){try{let S=y.match(/_session_([a-f0-9-]+)/i);return S?S[1]:null}catch{return null}}getFilePath(y){let S=this.config.prefix||"session",T=this.config.extension?`.${this.config.extension}`:"",N;if(this.config.includeTimestamp){let V=Date.now();N=`${S}-${y}-${V}${T}`}else N=`${S}-${y}${T}`;return(0,Os.join)(this.baseDir,N)}async output(y,S={}){try{let T=S.metadata?.sessionId;if(!T)return!1;let N={...y,timestamp:Date.now(),sessionId:T},V=this.getFilePath(T);return(0,Yu.writeFileSync)(V,JSON.stringify(N,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),zu,Ls,ru=u(()=>{"use strict";kA(),RA(),Ih(),zu=class{handlers=new Map;defaultOptions={};registerHandler(y,S){this.handlers.set(y,S)}registerHandlers(y){for(let S of y)if(S.enabled!==!1)try{let T=this.createHandler(S),N=S.type+"_"+Date.now();this.registerHandler(N,T)}catch(T){console.error(`[OutputManager] Failed to register ${S.type} handler:`,T)}}createHandler(y){switch(y.type){case"console":return new FA(y.config);case"webhook":return new TA(y.config);case"temp-file":return new tu(y.config);default:throw new Error(`Unknown output handler type: ${y.type}`)}}unregisterHandler(y){return this.handlers.delete(y)}getHandler(y){return this.handlers.get(y)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(y){this.defaultOptions={...this.defaultOptions,...y}}getDefaultOptions(){return{...this.defaultOptions}}async output(y,S){let T={...this.defaultOptions,...S},N={success:[],failed:[]},V=Array.from(this.handlers.entries()).map(async([H,Y])=>{try{await Y.output(y,T)?N.success.push(H):N.failed.push(H)}catch(K){console.error(`[OutputManager] Handler ${H} failed:`,K),N.failed.push(H)}});return await Promise.all(V),N}async outputTo(y,S,T){let N={...this.defaultOptions,...T},V={success:[],failed:[]},H=y.map(async Y=>{let K=this.handlers.get(Y);if(!K){console.warn(`[OutputManager] Handler ${Y} not found`),V.failed.push(Y);return}try{await K.output(S,N)?V.success.push(Y):V.failed.push(Y)}catch(ae){console.error(`[OutputManager] Handler ${Y} failed:`,ae),V.failed.push(Y)}});return await Promise.all(H),V}async outputToType(y,S,T){let N=Array.from(this.handlers.entries()).filter(([V,H])=>H.type===y).map(([V])=>V);return this.outputTo(N,S,T)}},Ls=new zu}),Bs={};c(Bs,{ConfigService:()=>_h,ProviderHealthStore:()=>QA,ProviderService:()=>Wu,SSEParserTransform:()=>_C,SSESerializerTransform:()=>ER,TokenizerService:()=>Tg,TransformerService:()=>_g,calculateTokenCount:()=>wC,default:()=>wR,getHealthStore:()=>Jl,pluginManager:()=>gR,rewriteStream:()=>yR,router:()=>Ng,searchProjectBySession:()=>vC,sessionUsageCache:()=>CC,tokenSpeedPlugin:()=>DR}),t.exports=h(Bs);var xh=A(DB(),1),fg=A(CB(),1),qo=require("fs"),vh=require("path"),pg=bB(),Yl=A(C(),1),_h=class{config={};options;constructor(y={jsonPath:"./config.json"}){this.options={envPath:y.envPath||".env",jsonPath:y.jsonPath,useEnvFile:!1,useJsonFile:y.useJsonFile!==!1,useEnvironmentVariables:y.useEnvironmentVariables!==!1,...y},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 y=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,vh.join)(process.cwd(),this.options.jsonPath);if((0,qo.existsSync)(y))try{let S=(0,qo.readFileSync)(y,"utf-8"),T=Yl.default.parse(S);this.config={...this.config,...T},console.log(`Loaded JSON config from: ${y}`)}catch(S){console.warn(`Failed to load JSON config from ${y}:`,S)}else console.warn(`JSON config file not found: ${y}`)}loadEnvConfig(){let y=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,vh.join)(process.cwd(),this.options.envPath);if((0,qo.existsSync)(y))try{let S=(0,pg.config)({path:y});S.parsed&&(this.config={...this.config,...this.parseEnvConfig(S.parsed)})}catch(S){console.warn(`Failed to load .env config from ${y}:`,S)}}loadEnvironmentVariables(){let y=this.parseEnvConfig(process.env);this.config={...this.config,...y}}parseEnvConfig(y){let S={};return Object.assign(S,y),S}isAbsolutePath(y){return y.startsWith("/")||y.includes(":")}get(y,S){let T=this.config[y];return T!==void 0?T:S}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(y){return this.config[y]!==void 0}set(y,S){this.config[y]=S}reload(){this.config={},this.loadConfig()}getConfigSummary(){let y=[];return this.options.initialConfig&&y.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&y.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&y.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&y.push("Environment Variables"),`Config sources: ${y.join(", ")}`}};function Is(y,S=500,T="internal_error",N="api_error"){let V=new Error(y);return V.statusCode=S,V.code=T,V.type=N,V}async function gg(y,S,T){S.log.error(y);let N=y.statusCode||500,V={error:{message:y.message+y.stack||"Internal Server Error",type:y.type||"api_error",code:y.code||"internal_error"}};return T.code(N).send(V)}var mg=JB();function Eg(y,S,T,N,V){let H=new Headers({"Content-Type":"application/json"});T.headers&&Object.entries(T.headers).forEach(([ee,le])=>{le&&H.set(ee,le)});let Y,K=AbortSignal.timeout(T.TIMEOUT??60*1e3*60);if(T.signal){let ee=new AbortController,le=()=>ee.abort();T.signal.addEventListener("abort",le),K.addEventListener("abort",le),Y=ee.signal}else Y=K;let ae={method:"POST",headers:H,body:JSON.stringify(S),signal:Y};return T.httpsProxy&&(ae.dispatcher=new mg.ProxyAgent(new URL(T.httpsProxy).toString())),V?.debug({reqId:N.req.id,request:ae,headers:Object.fromEntries(H.entries()),requestUrl:typeof y=="string"?y:y.toString(),useProxy:T.httpsProxy},"final request"),fetch(typeof y=="string"?y:y.toString(),ae)}var yg="2.0.36",Dg={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},QA=class{states=new Map;config;probeTimer;constructor(y){this.config={...Dg,...y}}getKey(y,S){return`${y},${S}`}recordSuccess(y,S){if(!this.config.enabled)return;let T=this.getKey(y,S),N=this.states.get(T);N&&(N.successCount++,N.status==="half-open"?N.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(T):N.status==="open"&&(N.status="half-open",N.successCount=1,N.failureCount=0))}isRateLimitError(y){if(!y)return!1;let S=y.toLowerCase();return S.includes("429")||S.includes("rate_limit")||S.includes("ratelimit")||S.includes("rate limit")||S.includes("overloaded")||S.includes("quota")}recordFailure(y,S,T){if(!this.config.enabled)return;let N=this.getKey(y,S),V=this.states.get(N);V||(V={provider:y,model:S,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(N,V)),V.failureCount++,V.lastFailureTime=Date.now(),V.lastError=T;let H=this.isRateLimitError(T)?this.config.rateLimitThreshold:this.config.failureThreshold;V.status==="half-open"?(V.status="open",V.successCount=0,V.lastProbeTime=0):V.status==="closed"&&V.failureCount>=H&&(V.status="open",V.lastProbeTime=0)}getState(y,S){return this.states.get(this.getKey(y,S))}isAvailable(y,S){if(!this.config.enabled)return!0;let T=this.getState(y,S);return T?T.status!=="open":!0}getPriority(y,S){if(!this.config.enabled)return 0;let T=this.getState(y,S);if(!T)return 0;switch(T.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let y=[];for(let[S,T]of this.states)T.status==="open"&&y.push(S);return y}getHalfOpenModels(){let y=[];for(let[S,T]of this.states)T.status==="half-open"&&y.push(S);return y}needsProbe(y){return Date.now()-y.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(y,S){let T=this.getKey(y,S),N=this.states.get(T);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)}},Sh=null;function Jl(y){return Sh||(Sh=new QA(y)),Sh}async function Cg(y,S,T,N){let V=y.body,H=y.provider,Y=T.providerService.getProvider(H);if(!Y)throw Is(`Provider '${H}' not found`,404,"provider_not_found");try{let{requestBody:K,config:ae,bypass:ee}=await NA(V,Y,N,y.headers,{req:y}),le=await LA(K,ae,Y,T,ee,N,{req:y}),pe=await PA(K,le,Y,N,ee,{req:y});return vi(pe,S,V)}catch(K){let ae=await bg(y,S,T,N,K);if(ae)return ae;throw K}}async function bg(y,S,T,N,V){let H=y.scenarioType||"default",Y=y.familyFallback,K=T.configService.get("fallback"),ae=Jl(),ee=[];if(Y?.[H]?ee=Y[H]:K?.[H]&&(ee=K[H]),!Array.isArray(ee)||ee.length===0)return null;let le=y.provider||"",pe=y.body.model||"";ae.recordFailure(le,pe,V?.message),y.log.warn(`Request failed for ${y.scenarioType}, trying ${ee.length} fallback models`);let me=ee.sort((se,ue)=>{let[ye,De]=se.split(","),[we,ve]=ue.split(",");return ae.getPriority(ye,De)-ae.getPriority(we,ve)});for(let se of me)try{let[ue,...ye]=se.split(","),De=ye.join(",");if(!ae.isAvailable(ue,De)){y.log.warn(`Fallback model ${se} unavailable (fail pool), skipping`);continue}y.log.info(`Trying fallback model: ${se}`);let we={...y.body};we.model=De;let ve={...y,provider:ue,body:we},Ie=T.providerService.getProvider(ue);if(!Ie){y.log.warn(`Fallback provider '${ue}' not found, skipping`);continue}let{requestBody:Ee,config:Te,bypass:Pe}=await NA(we,Ie,N,y.headers,{req:ve}),et=await LA(Ee,Te,Ie,T,Pe,N,{req:ve}),At=await PA(Ee,et,Ie,N,Pe,{req:ve});return y.log.info(`Fallback model ${se} succeeded`),ae.recordSuccess(ue,De),vi(At,S,we)}catch(ue){let[ye,...De]=se.split(","),we=De.join(",");ae.recordFailure(ye,we,ue.message),y.log.warn(`Fallback model ${se} failed: ${ue.message}`);continue}return y.log.error(`All fallback models failed for ${H}`),null}async function NA(y,S,T,N,V){let H=JSON.parse(JSON.stringify(y)),Y={},K=!1;if(K=OA(S,T,y),K&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],Y.headers=N),!K&&typeof T.transformRequestOut=="function"){let ae=await T.transformRequestOut(H);ae.body?(H=ae.body,Y=ae.config||{}):H=ae}if(!K&&S.transformer?.use?.length)for(let ae of S.transformer.use){if(!ae||typeof ae.transformRequestIn!="function")continue;let ee=await ae.transformRequestIn(H,S,V);ee.body?(H=ee.body,Y={...Y,...ee.config}):H=ee}if(!K&&S.transformer?.[y.model]?.use?.length)for(let ae of S.transformer[y.model].use)!ae||typeof ae.transformRequestIn!="function"||(H=await ae.transformRequestIn(H,S,V));return{requestBody:H,config:Y,bypass:K}}function OA(y,S,T){return y.transformer?.use?.length===1&&y.transformer.use[0].name===S.name&&(!y.transformer?.[T.model]?.use.length||y.transformer?.[T.model]?.use.length===1&&y.transformer?.[T.model]?.use[0].name===S.name)}async function LA(y,S,T,N,V,H,Y){let K=S.url||new URL(T.baseUrl);if(!S.TIMEOUT){let le=N.configService.get("API_TIMEOUT_MS");le&&(S.TIMEOUT=typeof le=="string"?parseInt(le,10):le)}if(V&&typeof H.auth=="function"){let le=await H.auth(y,T);if(le.body){y=le.body;let pe=S.headers||{};le.config?.headers&&(pe={...pe,...le.config.headers},delete pe.host,delete le.config.headers),S={...S,...le.config,headers:pe}}else y=le}let ae={Authorization:`Bearer ${T.apiKey}`,...S?.headers||{}};for(let le in ae)(ae[le]==="undefined"||["authorization","Authorization"].includes(le)&&ae[le]?.includes("undefined"))&&delete ae[le];let ee=await Eg(K,y,{httpsProxy:N.configService.getHttpsProxy(),...S,headers:JSON.parse(JSON.stringify(ae))},Y,N.log);if(!ee.ok){let le=await ee.text();throw N.log.error(`[provider_response_error] Error from provider(${T.name},${y.model}: ${ee.status}): ${le}`),Is(`Error from provider(${T.name},${y.model}: ${ee.status}): ${le}`,ee.status,"provider_response_error")}return ee}async function PA(y,S,T,N,V,H){let Y=S;if(!V&&T.transformer?.use?.length)for(let K of Array.from(T.transformer.use).reverse())!K||typeof K.transformResponseOut!="function"||(Y=await K.transformResponseOut(Y,H));if(!V&&T.transformer?.[y.model]?.use?.length)for(let K of Array.from(T.transformer[y.model].use).reverse())!K||typeof K.transformResponseOut!="function"||(Y=await K.transformResponseOut(Y,H));return!V&&N.transformResponseIn&&(Y=await N.transformResponseIn(Y,H)),Y}function vi(y,S,T){return y.ok||S.code(y.status),T.stream===!0?(S.header("Content-Type","text/event-stream"),S.header("Cache-Control","no-cache"),S.header("Connection","keep-alive"),S.send(y.body)):y.json()}var nu=async y=>{y.get("/",async()=>({message:"LLMs API",version:yg})),y.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),y.get("/providers/health",async()=>({states:Jl().getAllStates().map(T=>({provider:T.provider,model:T.model,status:T.status,failureCount:T.failureCount,successCount:T.successCount,lastFailureTime:T.lastFailureTime,lastError:T.lastError})),timestamp:new Date().toISOString()}));let S=y.transformerService.getTransformersWithEndpoint();for(let{transformer:T}of S)T.endPoint&&y.post(T.endPoint,async(N,V)=>Cg(N,V,y,T));y.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(T,N)=>{let{name:V,baseUrl:H,apiKey:Y,models:K}=T.body;if(!V?.trim())throw Is("Provider name is required",400,"invalid_request");if(!H||!MA(H))throw Is("Valid base URL is required",400,"invalid_request");if(!Y?.trim())throw Is("API key is required",400,"invalid_request");if(!K||!Array.isArray(K)||K.length===0)throw Is("At least one model is required",400,"invalid_request");if(y.providerService.getProvider(T.body.name))throw Is(`Provider with name '${T.body.name}' already exists`,400,"provider_exists");return y.providerService.registerProvider(T.body)}),y.get("/providers",async()=>y.providerService.getProviders()),y.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async T=>{let N=y.providerService.getProvider(T.params.id);if(!N)throw Is("Provider not found",404,"provider_not_found");return N}),y.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(T,N)=>{let V=y.providerService.updateProvider(T.params.id,T.body);if(!V)throw Is("Provider not found",404,"provider_not_found");return V}),y.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async T=>{if(!y.providerService.deleteProvider(T.params.id))throw Is("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),y.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(T,N)=>{if(!y.providerService.toggleProvider(T.params.id,T.body.enabled))throw Is("Provider not found",404,"provider_not_found");return{message:`Provider ${T.body.enabled?"enabled":"disabled"} successfully`}})};function MA(y){try{return new URL(y),!0}catch{return!1}}var Wu=class{constructor(y,S,T){this.configService=y,this.transformerService=S,this.logger=T,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let y=this.configService.get("providers");if(y&&Array.isArray(y)){this.initializeFromProvidersArray(y);return}}initializeFromProvidersArray(y){y.forEach(S=>{try{if(!S.name||!S.api_base_url||!S.api_key)return;let T={};S.transformer&&Object.keys(S.transformer).forEach(N=>{N==="use"?Array.isArray(S.transformer.use)&&(T.use=S.transformer.use.map(V=>{if(Array.isArray(V)&&typeof V[0]=="string"){let H=this.transformerService.getTransformer(V[0]);if(H)return new H(V[1])}if(typeof V=="string"){let H=this.transformerService.getTransformer(V);return typeof H=="function"?new H:H}}).filter(V=>typeof V<"u")):Array.isArray(S.transformer[N]?.use)&&(T[N]={use:S.transformer[N].use.map(V=>{if(Array.isArray(V)&&typeof V[0]=="string"){let H=this.transformerService.getTransformer(V[0]);if(H)return new H(V[1])}if(typeof V=="string"){let H=this.transformerService.getTransformer(V);return typeof H=="function"?new H:H}}).filter(V=>typeof V<"u")})}),this.registerProvider({name:S.name,baseUrl:S.api_base_url,apiKey:S.api_key,models:S.models||[],transformer:S.transformer?T:void 0}),this.logger.info(`${S.name} provider registered`)}catch(T){this.logger.error(`${S.name} provider registered error: ${T}`)}})}registerProvider(y){let S={...y};return this.providers.set(S.name,S),y.models.forEach(T=>{let N=`${S.name},${T}`,V={provider:S.name,model:T,fullModel:N};this.modelRoutes.set(N,V),this.modelRoutes.has(T)||this.modelRoutes.set(T,V)}),S}getProviders(){return Array.from(this.providers.values())}getProvider(y){return this.providers.get(y)}updateProvider(y,S){let T=this.providers.get(y);if(!T)return null;let N={...T,...S,updatedAt:new Date};return this.providers.set(y,N),S.models&&(T.models.forEach(V=>{let H=`${T.name},${V}`;this.modelRoutes.delete(H),this.modelRoutes.delete(V)}),S.models.forEach(V=>{let H=`${T.name},${V}`,Y={provider:T.name,model:V,fullModel:H};this.modelRoutes.set(H,Y),this.modelRoutes.has(V)||this.modelRoutes.set(V,Y)})),N}deleteProvider(y){let S=this.providers.get(y);return S?(S.models.forEach(T=>{let N=`${S.name},${T}`;this.modelRoutes.delete(N),this.modelRoutes.delete(T)}),this.providers.delete(y),!0):!1}toggleProvider(y,S){return!!this.providers.get(y)}resolveModelRoute(y){let S=this.modelRoutes.get(y);if(!S)return null;let T=this.providers.get(S.provider);return T?{provider:T,originalModel:y,targetModel:S.model}:null}getAvailableModelNames(){let y=[];return this.providers.forEach(S=>{S.models.forEach(T=>{y.push(T),y.push(`${S.name},${T}`)})}),y}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(y){return y?Array.isArray(y)?y.reduce((S,T)=>{if(Array.isArray(T)){let[N,V={}]=T;S[N]=V}else S[T]={};return S},{}):y:{}}async getAvailableModels(){let y=[];return this.providers.forEach(S=>{S.models.forEach(T=>{y.push({id:T,object:"model",owned_by:S.name,provider:S.name}),y.push({id:`${S.name},${T}`,object:"model",owned_by:S.name,provider:S.name})})}),{object:"list",data:y}}},Wn=[];for(let y=0;y<256;++y)Wn.push((y+256).toString(16).slice(1));function Go(y,S=0){return(Wn[y[S+0]]+Wn[y[S+1]]+Wn[y[S+2]]+Wn[y[S+3]]+"-"+Wn[y[S+4]]+Wn[y[S+5]]+"-"+Wn[y[S+6]]+Wn[y[S+7]]+"-"+Wn[y[S+8]]+Wn[y[S+9]]+"-"+Wn[y[S+10]]+Wn[y[S+11]]+Wn[y[S+12]]+Wn[y[S+13]]+Wn[y[S+14]]+Wn[y[S+15]]).toLowerCase()}var Ps=require("crypto"),Vo=new Uint8Array(256),Ku=Vo.length;function Da(){return Ku>Vo.length-16&&((0,Ps.randomFillSync)(Vo),Ku=0),Vo.slice(Ku,Ku+=16)}var UA=require("crypto"),Fh={randomUUID:UA.randomUUID};function zl(y,S,T){if(Fh.randomUUID&&!S&&!y)return Fh.randomUUID();y=y||{};let N=y.random??y.rng?.()??Da();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,S){if(T=T||0,T<0||T+16>S.length)throw new RangeError(`UUID byte range ${T}:${T+15} is out of buffer bounds`);for(let V=0;V<16;++V)S[T+V]=N[V];return S}return Go(N)}var iu=zl,jA=y=>y<=0?"none":y<=1024?"low":y<=8192?"medium":"high",$A=(y,S)=>(y.includes("base64")&&(y=y.split("base64").pop(),y.startsWith(",")&&(y=y.slice(1))),`data:${S};base64,${y}`),Wl=class{constructor(y){this.options=y,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(y,S){let T={};return this.useBearer?(T.authorization=`Bearer ${S.apiKey}`,T["x-api-key"]=void 0):(T["x-api-key"]=S.apiKey,T.authorization=void 0),{body:y,config:{headers:T}}}async transformRequestOut(y){let S=[];if(y.system){if(typeof y.system=="string")S.push({role:"system",content:y.system});else if(Array.isArray(y.system)&&y.system.length){let N=y.system.filter(V=>V.type==="text"&&V.text).map(V=>({type:"text",text:V.text,cache_control:V.cache_control}));S.push({role:"system",content:N})}}JSON.parse(JSON.stringify(y.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){S.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let V=N.content.filter(Y=>Y.type==="tool_result"&&Y.tool_use_id);V.length&&V.forEach(Y=>{let K={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};S.push(K)});let H=N.content.filter(Y=>Y.type==="text"&&Y.text||Y.type==="image"&&Y.source);H.length&&S.push({role:"user",content:H.map(Y=>Y?.type==="image"?{type:"image_url",image_url:{url:Y.source?.type==="base64"?$A(Y.source.data,Y.source.media_type):Y.source.url},media_type:Y.source.media_type}:Y)})}else if(N.role==="assistant"){let V={role:"assistant",content:""},H=N.content.filter(ae=>ae.type==="text"&&ae.text);H.length&&(V.content=H.map(ae=>ae.text).join(`
582
+ `):`${T}${y}`}async output(y,S={}){try{let T=this.formatData(y,S);switch(this.config.level||"log"){case"info":console.info(T);break;case"warn":console.warn(T);break;case"error":console.error(T);break;case"debug":console.debug(T);break;case"log":default:console.log(T);break}return!0}catch(T){return console.error("[ConsoleOutputHandler] Output failed:",T),!1}}}}),TA,RA=u(()=>{"use strict";TA=class{type="webhook";config;defaultTimeout=3e4;constructor(y){if(!y.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...y}}buildHeaders(){let y={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(y.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let S=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");y.Authorization=`Basic ${S}`}break;case"custom":this.config.auth.custom&&(y[this.config.auth.custom.header]=this.config.auth.custom.value);break}return y}buildBody(y,S){let{format:T="json",timestamp:N=!0,prefix:V,metadata:H}=S||{},Y={data:y};return N&&(Y.timestamp=new Date().toISOString()),V&&(Y.prefix=V),H&&Object.keys(H).length>0&&(Y.metadata=H),Y}async sendRequest(y,S,T,N,V){let H=new AbortController,Y=setTimeout(()=>H.abort(),V);try{let K=await fetch(y,{method:S,headers:T,body:JSON.stringify(N),signal:H.signal});if(clearTimeout(Y),!K.ok)throw new Error(`HTTP ${K.status}: ${K.statusText}`);return K}catch(K){throw clearTimeout(Y),K}}delay(y){return new Promise(S=>setTimeout(S,y))}async sendWithRetry(y,S,T,N,V,H){let Y=null;for(let K=1;K<=H.maxAttempts;K++)try{return await this.sendRequest(y,S,T,N,V)}catch(ae){if(Y=ae,K===H.maxAttempts)break;let ee=H.backoffMs*Math.pow(2,K-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${K}/${H.maxAttempts}), retrying in ${ee}ms...`,ae.message),await this.delay(ee)}throw Y}async output(y,S={}){let T=S.timeout||this.defaultTimeout;try{let N=this.buildHeaders(),V=this.buildBody(y,S),H=await this.sendWithRetry(this.config.url,this.config.method,N,V,T,this.config.retry);return!0}catch(N){let V=N instanceof Error?N.message:String(N);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${V}`),!1;throw new Error(`Webhook output failed: ${V}`)}}}}),Yu,Os,Ju,tu,Ih=u(()=>{"use strict";Yu=require("fs"),Os=require("path"),Ju=require("os"),tu=class{type="temp-file";config;baseDir;constructor(y={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...y};let S=(0,Ju.tmpdir)();this.baseDir=(0,Os.join)(S,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,Yu.existsSync)(this.baseDir)||(0,Yu.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(y){try{let S=y.match(/_session_([a-f0-9-]+)/i);return S?S[1]:null}catch{return null}}getFilePath(y){let S=this.config.prefix||"session",T=this.config.extension?`.${this.config.extension}`:"",N;if(this.config.includeTimestamp){let V=Date.now();N=`${S}-${y}-${V}${T}`}else N=`${S}-${y}${T}`;return(0,Os.join)(this.baseDir,N)}async output(y,S={}){try{let T=S.metadata?.sessionId;if(!T)return!1;let N={...y,timestamp:Date.now(),sessionId:T},V=this.getFilePath(T);return(0,Yu.writeFileSync)(V,JSON.stringify(N,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),zu,Ls,ru=u(()=>{"use strict";kA(),RA(),Ih(),zu=class{handlers=new Map;defaultOptions={};registerHandler(y,S){this.handlers.set(y,S)}registerHandlers(y){for(let S of y)if(S.enabled!==!1)try{let T=this.createHandler(S),N=S.type+"_"+Date.now();this.registerHandler(N,T)}catch(T){console.error(`[OutputManager] Failed to register ${S.type} handler:`,T)}}createHandler(y){switch(y.type){case"console":return new FA(y.config);case"webhook":return new TA(y.config);case"temp-file":return new tu(y.config);default:throw new Error(`Unknown output handler type: ${y.type}`)}}unregisterHandler(y){return this.handlers.delete(y)}getHandler(y){return this.handlers.get(y)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(y){this.defaultOptions={...this.defaultOptions,...y}}getDefaultOptions(){return{...this.defaultOptions}}async output(y,S){let T={...this.defaultOptions,...S},N={success:[],failed:[]},V=Array.from(this.handlers.entries()).map(async([H,Y])=>{try{await Y.output(y,T)?N.success.push(H):N.failed.push(H)}catch(K){console.error(`[OutputManager] Handler ${H} failed:`,K),N.failed.push(H)}});return await Promise.all(V),N}async outputTo(y,S,T){let N={...this.defaultOptions,...T},V={success:[],failed:[]},H=y.map(async Y=>{let K=this.handlers.get(Y);if(!K){console.warn(`[OutputManager] Handler ${Y} not found`),V.failed.push(Y);return}try{await K.output(S,N)?V.success.push(Y):V.failed.push(Y)}catch(ae){console.error(`[OutputManager] Handler ${Y} failed:`,ae),V.failed.push(Y)}});return await Promise.all(H),V}async outputToType(y,S,T){let N=Array.from(this.handlers.entries()).filter(([V,H])=>H.type===y).map(([V])=>V);return this.outputTo(N,S,T)}},Ls=new zu}),Bs={};c(Bs,{ConfigService:()=>_h,ProviderHealthStore:()=>QA,ProviderService:()=>Wu,SSEParserTransform:()=>_C,SSESerializerTransform:()=>ER,TokenizerService:()=>Tg,TransformerService:()=>_g,calculateTokenCount:()=>wC,default:()=>wR,getHealthStore:()=>Jl,pluginManager:()=>gR,rewriteStream:()=>yR,router:()=>Ng,searchProjectBySession:()=>vC,sessionUsageCache:()=>CC,tokenSpeedPlugin:()=>DR}),t.exports=h(Bs);var xh=A(DB(),1),fg=A(CB(),1),qo=require("fs"),vh=require("path"),pg=bB(),Yl=A(C(),1),_h=class{config={};options;constructor(y={jsonPath:"./config.json"}){this.options={envPath:y.envPath||".env",jsonPath:y.jsonPath,useEnvFile:!1,useJsonFile:y.useJsonFile!==!1,useEnvironmentVariables:y.useEnvironmentVariables!==!1,...y},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 y=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,vh.join)(process.cwd(),this.options.jsonPath);if((0,qo.existsSync)(y))try{let S=(0,qo.readFileSync)(y,"utf-8"),T=Yl.default.parse(S);this.config={...this.config,...T},console.log(`Loaded JSON config from: ${y}`)}catch(S){console.warn(`Failed to load JSON config from ${y}:`,S)}else console.warn(`JSON config file not found: ${y}`)}loadEnvConfig(){let y=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,vh.join)(process.cwd(),this.options.envPath);if((0,qo.existsSync)(y))try{let S=(0,pg.config)({path:y});S.parsed&&(this.config={...this.config,...this.parseEnvConfig(S.parsed)})}catch(S){console.warn(`Failed to load .env config from ${y}:`,S)}}loadEnvironmentVariables(){let y=this.parseEnvConfig(process.env);this.config={...this.config,...y}}parseEnvConfig(y){let S={};return Object.assign(S,y),S}isAbsolutePath(y){return y.startsWith("/")||y.includes(":")}get(y,S){let T=this.config[y];return T!==void 0?T:S}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(y){return this.config[y]!==void 0}set(y,S){this.config[y]=S}reload(){this.config={},this.loadConfig()}getConfigSummary(){let y=[];return this.options.initialConfig&&y.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&y.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&y.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&y.push("Environment Variables"),`Config sources: ${y.join(", ")}`}};function Is(y,S=500,T="internal_error",N="api_error"){let V=new Error(y);return V.statusCode=S,V.code=T,V.type=N,V}async function gg(y,S,T){S.log.error(y);let N=y.statusCode||500,V={error:{message:y.message+y.stack||"Internal Server Error",type:y.type||"api_error",code:y.code||"internal_error"}};return T.code(N).send(V)}var mg=JB();function Eg(y,S,T,N,V){let H=new Headers({"Content-Type":"application/json"});T.headers&&Object.entries(T.headers).forEach(([ee,le])=>{le&&H.set(ee,le)});let Y,K=AbortSignal.timeout(T.TIMEOUT??60*1e3*60);if(T.signal){let ee=new AbortController,le=()=>ee.abort();T.signal.addEventListener("abort",le),K.addEventListener("abort",le),Y=ee.signal}else Y=K;let ae={method:"POST",headers:H,body:JSON.stringify(S),signal:Y};return T.httpsProxy&&(ae.dispatcher=new mg.ProxyAgent(new URL(T.httpsProxy).toString())),V?.debug({reqId:N.req.id,request:ae,headers:Object.fromEntries(H.entries()),requestUrl:typeof y=="string"?y:y.toString(),useProxy:T.httpsProxy},"final request"),fetch(typeof y=="string"?y:y.toString(),ae)}var yg="2.0.37",Dg={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},QA=class{states=new Map;config;probeTimer;constructor(y){this.config={...Dg,...y}}getKey(y,S){return`${y},${S}`}recordSuccess(y,S){if(!this.config.enabled)return;let T=this.getKey(y,S),N=this.states.get(T);N&&(N.successCount++,N.status==="half-open"?N.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(T):N.status==="open"&&(N.status="half-open",N.successCount=1,N.failureCount=0))}isRateLimitError(y){if(!y)return!1;let S=y.toLowerCase();return S.includes("429")||S.includes("rate_limit")||S.includes("ratelimit")||S.includes("rate limit")||S.includes("overloaded")||S.includes("quota")}recordFailure(y,S,T){if(!this.config.enabled)return;let N=this.getKey(y,S),V=this.states.get(N);V||(V={provider:y,model:S,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(N,V)),V.failureCount++,V.lastFailureTime=Date.now(),V.lastError=T;let H=this.isRateLimitError(T)?this.config.rateLimitThreshold:this.config.failureThreshold;V.status==="half-open"?(V.status="open",V.successCount=0,V.lastProbeTime=0):V.status==="closed"&&V.failureCount>=H&&(V.status="open",V.lastProbeTime=0)}getState(y,S){return this.states.get(this.getKey(y,S))}isAvailable(y,S){if(!this.config.enabled)return!0;let T=this.getState(y,S);return T?T.status!=="open":!0}getPriority(y,S){if(!this.config.enabled)return 0;let T=this.getState(y,S);if(!T)return 0;switch(T.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let y=[];for(let[S,T]of this.states)T.status==="open"&&y.push(S);return y}getHalfOpenModels(){let y=[];for(let[S,T]of this.states)T.status==="half-open"&&y.push(S);return y}needsProbe(y){return Date.now()-y.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(y,S){let T=this.getKey(y,S),N=this.states.get(T);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)}},Sh=null;function Jl(y){return Sh||(Sh=new QA(y)),Sh}async function Cg(y,S,T,N){let V=y.body,H=y.provider,Y=T.providerService.getProvider(H);if(!Y)throw Is(`Provider '${H}' not found`,404,"provider_not_found");try{let{requestBody:K,config:ae,bypass:ee}=await NA(V,Y,N,y.headers,{req:y}),le=await LA(K,ae,Y,T,ee,N,{req:y}),pe=await PA(K,le,Y,N,ee,{req:y});return vi(pe,S,V)}catch(K){let ae=await bg(y,S,T,N,K);if(ae)return ae;throw K}}async function bg(y,S,T,N,V){let H=y.scenarioType||"default",Y=y.familyFallback,K=T.configService.get("fallback"),ae=Jl(),ee=[];if(Y?.[H]?ee=Y[H]:K?.[H]&&(ee=K[H]),!Array.isArray(ee)||ee.length===0)return null;let le=y.provider||"",pe=y.body.model||"";ae.recordFailure(le,pe,V?.message),y.log.warn(`Request failed for ${y.scenarioType}, trying ${ee.length} fallback models`);let me=ee.sort((se,ue)=>{let[ye,De]=se.split(","),[we,ve]=ue.split(",");return ae.getPriority(ye,De)-ae.getPriority(we,ve)});for(let se of me)try{let[ue,...ye]=se.split(","),De=ye.join(",");if(!ae.isAvailable(ue,De)){y.log.warn(`Fallback model ${se} unavailable (fail pool), skipping`);continue}y.log.info(`Trying fallback model: ${se}`);let we={...y.body};we.model=De;let ve={...y,provider:ue,body:we},Ie=T.providerService.getProvider(ue);if(!Ie){y.log.warn(`Fallback provider '${ue}' not found, skipping`);continue}let{requestBody:Ee,config:Te,bypass:Pe}=await NA(we,Ie,N,y.headers,{req:ve}),et=await LA(Ee,Te,Ie,T,Pe,N,{req:ve}),At=await PA(Ee,et,Ie,N,Pe,{req:ve});return y.log.info(`Fallback model ${se} succeeded`),ae.recordSuccess(ue,De),vi(At,S,we)}catch(ue){let[ye,...De]=se.split(","),we=De.join(",");ae.recordFailure(ye,we,ue.message),y.log.warn(`Fallback model ${se} failed: ${ue.message}`);continue}return y.log.error(`All fallback models failed for ${H}`),null}async function NA(y,S,T,N,V){let H=JSON.parse(JSON.stringify(y)),Y={},K=!1;if(K=OA(S,T,y),K&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],Y.headers=N),!K&&typeof T.transformRequestOut=="function"){let ae=await T.transformRequestOut(H);ae.body?(H=ae.body,Y=ae.config||{}):H=ae}if(!K&&S.transformer?.use?.length)for(let ae of S.transformer.use){if(!ae||typeof ae.transformRequestIn!="function")continue;let ee=await ae.transformRequestIn(H,S,V);ee.body?(H=ee.body,Y={...Y,...ee.config}):H=ee}if(!K&&S.transformer?.[y.model]?.use?.length)for(let ae of S.transformer[y.model].use)!ae||typeof ae.transformRequestIn!="function"||(H=await ae.transformRequestIn(H,S,V));return{requestBody:H,config:Y,bypass:K}}function OA(y,S,T){return y.transformer?.use?.length===1&&y.transformer.use[0].name===S.name&&(!y.transformer?.[T.model]?.use.length||y.transformer?.[T.model]?.use.length===1&&y.transformer?.[T.model]?.use[0].name===S.name)}async function LA(y,S,T,N,V,H,Y){let K=S.url||new URL(T.baseUrl);if(!S.TIMEOUT){let le=N.configService.get("API_TIMEOUT_MS");le&&(S.TIMEOUT=typeof le=="string"?parseInt(le,10):le)}if(V&&typeof H.auth=="function"){let le=await H.auth(y,T);if(le.body){y=le.body;let pe=S.headers||{};le.config?.headers&&(pe={...pe,...le.config.headers},delete pe.host,delete le.config.headers),S={...S,...le.config,headers:pe}}else y=le}let ae={Authorization:`Bearer ${T.apiKey}`,...S?.headers||{}};for(let le in ae)(ae[le]==="undefined"||["authorization","Authorization"].includes(le)&&ae[le]?.includes("undefined"))&&delete ae[le];let ee=await Eg(K,y,{httpsProxy:N.configService.getHttpsProxy(),...S,headers:JSON.parse(JSON.stringify(ae))},Y,N.log);if(!ee.ok){let le=await ee.text();throw N.log.error(`[provider_response_error] Error from provider(${T.name},${y.model}: ${ee.status}): ${le}`),Is(`Error from provider(${T.name},${y.model}: ${ee.status}): ${le}`,ee.status,"provider_response_error")}return ee}async function PA(y,S,T,N,V,H){let Y=S;if(!V&&T.transformer?.use?.length)for(let K of Array.from(T.transformer.use).reverse())!K||typeof K.transformResponseOut!="function"||(Y=await K.transformResponseOut(Y,H));if(!V&&T.transformer?.[y.model]?.use?.length)for(let K of Array.from(T.transformer[y.model].use).reverse())!K||typeof K.transformResponseOut!="function"||(Y=await K.transformResponseOut(Y,H));return!V&&N.transformResponseIn&&(Y=await N.transformResponseIn(Y,H)),Y}function vi(y,S,T){return y.ok||S.code(y.status),T.stream===!0?(S.header("Content-Type","text/event-stream"),S.header("Cache-Control","no-cache"),S.header("Connection","keep-alive"),S.send(y.body)):y.json()}var nu=async y=>{y.get("/",async()=>({message:"LLMs API",version:yg})),y.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),y.get("/providers/health",async()=>({states:Jl().getAllStates().map(T=>({provider:T.provider,model:T.model,status:T.status,failureCount:T.failureCount,successCount:T.successCount,lastFailureTime:T.lastFailureTime,lastError:T.lastError})),timestamp:new Date().toISOString()}));let S=y.transformerService.getTransformersWithEndpoint();for(let{transformer:T}of S)T.endPoint&&y.post(T.endPoint,async(N,V)=>Cg(N,V,y,T));y.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(T,N)=>{let{name:V,baseUrl:H,apiKey:Y,models:K}=T.body;if(!V?.trim())throw Is("Provider name is required",400,"invalid_request");if(!H||!MA(H))throw Is("Valid base URL is required",400,"invalid_request");if(!Y?.trim())throw Is("API key is required",400,"invalid_request");if(!K||!Array.isArray(K)||K.length===0)throw Is("At least one model is required",400,"invalid_request");if(y.providerService.getProvider(T.body.name))throw Is(`Provider with name '${T.body.name}' already exists`,400,"provider_exists");return y.providerService.registerProvider(T.body)}),y.get("/providers",async()=>y.providerService.getProviders()),y.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async T=>{let N=y.providerService.getProvider(T.params.id);if(!N)throw Is("Provider not found",404,"provider_not_found");return N}),y.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(T,N)=>{let V=y.providerService.updateProvider(T.params.id,T.body);if(!V)throw Is("Provider not found",404,"provider_not_found");return V}),y.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async T=>{if(!y.providerService.deleteProvider(T.params.id))throw Is("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),y.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(T,N)=>{if(!y.providerService.toggleProvider(T.params.id,T.body.enabled))throw Is("Provider not found",404,"provider_not_found");return{message:`Provider ${T.body.enabled?"enabled":"disabled"} successfully`}})};function MA(y){try{return new URL(y),!0}catch{return!1}}var Wu=class{constructor(y,S,T){this.configService=y,this.transformerService=S,this.logger=T,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let y=this.configService.get("providers");if(y&&Array.isArray(y)){this.initializeFromProvidersArray(y);return}}initializeFromProvidersArray(y){y.forEach(S=>{try{if(!S.name||!S.api_base_url||!S.api_key)return;let T={};S.transformer&&Object.keys(S.transformer).forEach(N=>{N==="use"?Array.isArray(S.transformer.use)&&(T.use=S.transformer.use.map(V=>{if(Array.isArray(V)&&typeof V[0]=="string"){let H=this.transformerService.getTransformer(V[0]);if(H)return new H(V[1])}if(typeof V=="string"){let H=this.transformerService.getTransformer(V);return typeof H=="function"?new H:H}}).filter(V=>typeof V<"u")):Array.isArray(S.transformer[N]?.use)&&(T[N]={use:S.transformer[N].use.map(V=>{if(Array.isArray(V)&&typeof V[0]=="string"){let H=this.transformerService.getTransformer(V[0]);if(H)return new H(V[1])}if(typeof V=="string"){let H=this.transformerService.getTransformer(V);return typeof H=="function"?new H:H}}).filter(V=>typeof V<"u")})}),this.registerProvider({name:S.name,baseUrl:S.api_base_url,apiKey:S.api_key,models:S.models||[],transformer:S.transformer?T:void 0}),this.logger.info(`${S.name} provider registered`)}catch(T){this.logger.error(`${S.name} provider registered error: ${T}`)}})}registerProvider(y){let S={...y};return this.providers.set(S.name,S),y.models.forEach(T=>{let N=`${S.name},${T}`,V={provider:S.name,model:T,fullModel:N};this.modelRoutes.set(N,V),this.modelRoutes.has(T)||this.modelRoutes.set(T,V)}),S}getProviders(){return Array.from(this.providers.values())}getProvider(y){return this.providers.get(y)}updateProvider(y,S){let T=this.providers.get(y);if(!T)return null;let N={...T,...S,updatedAt:new Date};return this.providers.set(y,N),S.models&&(T.models.forEach(V=>{let H=`${T.name},${V}`;this.modelRoutes.delete(H),this.modelRoutes.delete(V)}),S.models.forEach(V=>{let H=`${T.name},${V}`,Y={provider:T.name,model:V,fullModel:H};this.modelRoutes.set(H,Y),this.modelRoutes.has(V)||this.modelRoutes.set(V,Y)})),N}deleteProvider(y){let S=this.providers.get(y);return S?(S.models.forEach(T=>{let N=`${S.name},${T}`;this.modelRoutes.delete(N),this.modelRoutes.delete(T)}),this.providers.delete(y),!0):!1}toggleProvider(y,S){return!!this.providers.get(y)}resolveModelRoute(y){let S=this.modelRoutes.get(y);if(!S)return null;let T=this.providers.get(S.provider);return T?{provider:T,originalModel:y,targetModel:S.model}:null}getAvailableModelNames(){let y=[];return this.providers.forEach(S=>{S.models.forEach(T=>{y.push(T),y.push(`${S.name},${T}`)})}),y}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(y){return y?Array.isArray(y)?y.reduce((S,T)=>{if(Array.isArray(T)){let[N,V={}]=T;S[N]=V}else S[T]={};return S},{}):y:{}}async getAvailableModels(){let y=[];return this.providers.forEach(S=>{S.models.forEach(T=>{y.push({id:T,object:"model",owned_by:S.name,provider:S.name}),y.push({id:`${S.name},${T}`,object:"model",owned_by:S.name,provider:S.name})})}),{object:"list",data:y}}},Wn=[];for(let y=0;y<256;++y)Wn.push((y+256).toString(16).slice(1));function Go(y,S=0){return(Wn[y[S+0]]+Wn[y[S+1]]+Wn[y[S+2]]+Wn[y[S+3]]+"-"+Wn[y[S+4]]+Wn[y[S+5]]+"-"+Wn[y[S+6]]+Wn[y[S+7]]+"-"+Wn[y[S+8]]+Wn[y[S+9]]+"-"+Wn[y[S+10]]+Wn[y[S+11]]+Wn[y[S+12]]+Wn[y[S+13]]+Wn[y[S+14]]+Wn[y[S+15]]).toLowerCase()}var Ps=require("crypto"),Vo=new Uint8Array(256),Ku=Vo.length;function Da(){return Ku>Vo.length-16&&((0,Ps.randomFillSync)(Vo),Ku=0),Vo.slice(Ku,Ku+=16)}var UA=require("crypto"),Fh={randomUUID:UA.randomUUID};function zl(y,S,T){if(Fh.randomUUID&&!S&&!y)return Fh.randomUUID();y=y||{};let N=y.random??y.rng?.()??Da();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,S){if(T=T||0,T<0||T+16>S.length)throw new RangeError(`UUID byte range ${T}:${T+15} is out of buffer bounds`);for(let V=0;V<16;++V)S[T+V]=N[V];return S}return Go(N)}var iu=zl,jA=y=>y<=0?"none":y<=1024?"low":y<=8192?"medium":"high",$A=(y,S)=>(y.includes("base64")&&(y=y.split("base64").pop(),y.startsWith(",")&&(y=y.slice(1))),`data:${S};base64,${y}`),Wl=class{constructor(y){this.options=y,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(y,S){let T={};return this.useBearer?(T.authorization=`Bearer ${S.apiKey}`,T["x-api-key"]=void 0):(T["x-api-key"]=S.apiKey,T.authorization=void 0),{body:y,config:{headers:T}}}async transformRequestOut(y){let S=[];if(y.system){if(typeof y.system=="string")S.push({role:"system",content:y.system});else if(Array.isArray(y.system)&&y.system.length){let N=y.system.filter(V=>V.type==="text"&&V.text).map(V=>({type:"text",text:V.text,cache_control:V.cache_control}));S.push({role:"system",content:N})}}JSON.parse(JSON.stringify(y.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){S.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let V=N.content.filter(Y=>Y.type==="tool_result"&&Y.tool_use_id);V.length&&V.forEach(Y=>{let K={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};S.push(K)});let H=N.content.filter(Y=>Y.type==="text"&&Y.text||Y.type==="image"&&Y.source);H.length&&S.push({role:"user",content:H.map(Y=>Y?.type==="image"?{type:"image_url",image_url:{url:Y.source?.type==="base64"?$A(Y.source.data,Y.source.media_type):Y.source.url},media_type:Y.source.media_type}:Y)})}else if(N.role==="assistant"){let V={role:"assistant",content:""},H=N.content.filter(ae=>ae.type==="text"&&ae.text);H.length&&(V.content=H.map(ae=>ae.text).join(`
583
583
  `));let Y=N.content.filter(ae=>ae.type==="tool_use"&&ae.id);Y.length&&(V.tool_calls=Y.map(ae=>({id:ae.id,type:"function",function:{name:ae.name,arguments:JSON.stringify(ae.input||{})}})));let K=N.content.find(ae=>ae.type==="thinking"&&ae.signature);K&&(V.thinking={content:K.thinking,signature:K.signature}),S.push(V)}return}}});let T={messages:S,model:y.model,max_tokens:y.max_tokens,temperature:y.temperature,stream:y.stream,tools:y.tools?.length?this.convertAnthropicToolsToUnified(y.tools):void 0,tool_choice:y.tool_choice};return y.thinking&&(T.reasoning={effort:jA(y.thinking.budget_tokens),enabled:y.thinking.type==="enabled"}),y.tool_choice&&(y.tool_choice.type==="tool"?T.tool_choice={type:"function",function:{name:y.tool_choice.name}}:T.tool_choice=y.tool_choice.type),T}async transformResponseIn(y,S){if(y.headers.get("Content-Type")?.includes("text/event-stream")){if(!y.body)throw new Error("Stream response body is null");let T=await this.convertOpenAIStreamToAnthropic(y.body,S);return new Response(T,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let T=await y.json(),N=this.convertOpenAIResponseToAnthropic(T,S);return new Response(JSON.stringify(N),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(y){return y.map(S=>({type:"function",function:{name:S.name,description:S.description||"",parameters:S.input_schema}}))}async convertOpenAIStreamToAnthropic(y,S){return new ReadableStream({start:async T=>{let N=new TextEncoder,V=`msg_${Date.now()}`,H=null,Y="unknown",K=!1,ae=!1,ee=!1,le=new Map,pe=new Map,me=0,se=0,ue=0,ye=!1,De=!1,we=0,ve=-1,Ie=()=>{let et=we;return we++,et},Ee=et=>{if(!ye)try{T.enqueue(et);let At=new TextDecoder().decode(et);this.logger.debug({reqId:S.req.id,data:At,type:"send data"})}catch(At){if(At instanceof TypeError&&At.message.includes("Controller is already closed"))ye=!0;else throw this.logger.debug({reqId:S.req.id,error:At instanceof Error?At.message:String(At),type:"send data error"}),At}},Te=()=>{if(!ye)try{if(ve>=0){let At={type:"content_block_stop",index:ve};Ee(N.encode(`event: content_block_stop
584
584
  data: ${JSON.stringify(At)}
585
585
 
@@ -854,7 +854,7 @@ Stack: ${y.stack}`)}}async registerDefaultTransformersInternal(){try{Object.valu
854
854
  `),y.data&&(y.data.type==="done"?T+=`data: [DONE]
855
855
  `:T+=`data: ${JSON.stringify(y.data)}
856
856
  `),T+=`
857
- `,S.enqueue(T)}})}},yR=(y,S)=>{let T=y.getReader();return new ReadableStream({async start(N){try{for(;;){let{done:V,value:H}=await T.read();if(V){N.close();break}let Y=await S(H,N);Y!==void 0&&N.enqueue(Y)}}catch(V){N.error(V)}finally{T.releaseLock()}}})};kA(),RA(),Ih(),ru();var Ph=new Map,Lg=new Map,DR={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,mR.default)(async(y,S)=>{let T={reporter:["console","temp-file"],...S},N=Array.isArray(T.reporter)?T.reporter:[T.reporter];if(T.outputHandlers&&T.outputHandlers.length>0)Ls.registerHandlers(T.outputHandlers);else{let H=[];for(let Y of N)Y==="console"?H.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):Y==="temp-file"?H.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):Y==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");H.length>0&&Ls.registerHandlers(H)}T.outputOptions&&Ls.setDefaultOptions(T.outputOptions);let V=async H=>{let Y=y.tokenizerService;if(!Y)return y.log?.warn("TokenizerService not available"),null;if(!H.provider||!H.model)return null;let K=H.provider,ae=H.model,ee=`${K}:${ae}`;if(Lg.has(ee))return Lg.get(ee);let le=Y.getTokenizerConfigForModel(K,ae);if(!le)return y.log?.debug(`No tokenizer config for ${K}:${ae}, using fallback`),null;try{let pe=await Y.getTokenizer(le);return Lg.set(ee,pe),y.log?.info(`Created tokenizer for ${K}:${ae} - ${pe.name}`),pe}catch(pe){return y.log?.warn(`Failed to create tokenizer for ${K}:${ae}: ${pe.message}`),null}};y.addHook("onRequest",async H=>{new URL(`http://127.0.0.1${H.url}`).pathname.endsWith("/v1/messages")&&(H.requestStartTime=performance.now())}),y.addHook("onSend",async(H,Y,K)=>{let ae=H.requestStartTime;if(!ae)return;let ee=H.id||Date.now().toString(),le;try{let ue=H.body?.metadata?.user_id;if(ue&&typeof ue=="string")try{let ye=JSON.parse(ue);ye.session_id&&(le=ye.session_id)}catch{let ye=ue.match(/_session_([a-f0-9-]+)/i);le=ye?ye[1]:void 0}}catch{}if(!le)return;let pe=await V(H);if(K instanceof ReadableStream){Ph.set(ee,{requestId:ee,sessionId:le,startTime:ae,lastTokenTime:ae,tokenCount:0,tokensPerSecond:0,tokenTimestamps:[],stream:!0});let[ue,ye]=K.tee();return(async()=>{let De=null,we=async ve=>{let Ie=Ph.get(ee);if(!Ie)return;let Ee=performance.now();if(ve){let Te=(Ie.lastTokenTime-Ie.startTime)/1e3;Te>0&&(Ie.tokensPerSecond=Math.round(Ie.tokenCount/Te))}else{let Te=Ee-1e3;Ie.tokenTimestamps=Ie.tokenTimestamps.filter(Pe=>Pe>Te),Ie.tokensPerSecond=Ie.tokenTimestamps.length}await SC(Ie,N,T.outputOptions,ve).catch(Te=>{y.log?.warn(`Failed to output streaming stats: ${Te.message}`)})};try{let ve=ye.pipeThrough(new TextDecoderStream).pipeThrough(new _C).getReader();for(De=setInterval(async()=>{Ph.get(ee)&&await we(!1)},1e3);;){let{done:Ie,value:Ee}=await ve.read();if(Ie)break;let Te=Ee,Pe=Ph.get(ee);if(!Pe)continue;let et=performance.now();if(!Pe.firstTokenTime&&(Te.event==="content_block_start"||Te.event==="content_block_delta"||Te.event==="text_block"||Te.event==="content_block")&&(Pe.firstTokenTime=et,Pe.timeToFirstToken=Math.round(et-Pe.startTime)),Te.event==="content_block_delta"&&Te.data?.delta){let At=Te.data.delta.type,ft="";if(At==="text_delta"?ft=Te.data.delta.text||"":At==="input_json_delta"?ft=Te.data.delta.partial_json||"":At==="thinking_delta"&&(ft=Te.data.delta.thinking||""),ft){let jt=pe&&pe.encodeText?pe.encodeText(ft).length:hf(ft);Pe.tokenCount+=jt,Pe.lastTokenTime=et;for(let Ct=0;Ct<jt;Ct++)Pe.tokenTimestamps.push(et)}}Te.event==="message_stop"&&(De&&(clearInterval(De),De=null),await we(!0),Ph.delete(ee))}}catch(ve){De&&clearInterval(De),ve.name!=="AbortError"&&ve.code!=="ERR_STREAM_PREMATURE_CLOSE"&&y.log?.warn(`Error processing token stats: ${ve.message}`)}})().catch(De=>{console.log(De),y.log?.warn(`Background stats processing failed: ${De.message}`)}),ue}let me=performance.now(),se=0;if(K&&typeof K=="string")try{let ue=JSON.parse(K);if(ue.usage?.output_tokens)se=ue.usage.output_tokens;else{let ye=ue.content||ue.message?.content||"";if(pe)Array.isArray(ye)?se=ye.reduce((De,we)=>{if(we.type==="text"){let ve=we.text||"";return De+(pe.encodeText?pe.encodeText(ve).length:hf(ve))}return De},0):typeof ye=="string"&&(se=pe.encodeText?pe.encodeText(ye).length:hf(ye));else{let De=Array.isArray(ye)?ye.map(we=>we.text).join(""):ye;se=hf(De)}}}catch{}if(se>0){let ue=(me-ae)/1e3,ye={requestId:ee,sessionId:le,startTime:ae,lastTokenTime:me,tokenCount:se,tokensPerSecond:ue>0?Math.round(se/ue):0,timeToFirstToken:Math.round(me-ae),stream:!1,tokenTimestamps:[]};await SC(ye,N,T.outputOptions,!0)}return K})})};function hf(y){let S=(y.match(/[\u4e00-\u9fa5]/g)||[]).length,T=y.length-S;return Math.ceil(S/1.5+T/4)}async function SC(y,S,T,N=!1){let V=N?"[Token Speed Final]":"[Token Speed]",H={requestId:y.requestId.substring(0,8),sessionId:y.sessionId,stream:y.stream,tokenCount:y.tokenCount,tokensPerSecond:y.tokensPerSecond,timeToFirstToken:y.timeToFirstToken?`${y.timeToFirstToken}ms`:"N/A",duration:`${((y.lastTokenTime-y.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},Y={prefix:V,metadata:{sessionId:y.sessionId},...T};for(let K of S)try{await Ls.outputToType(K,H,Y)}catch(ae){console.error(`[TokenSpeedPlugin] Failed to output to ${K}:`,ae)}}function CR(y={}){let S=(0,xh.default)({bodyLimit:52428800,...y});return S.setErrorHandler(gg),S.register(fg.default),S}var bR=class{app;configService;providerService;transformerService;tokenizerService;constructor(y={}){let{initialConfig:S,...T}=y;this.app=CR({...T,logger:T.logger??!0}),this.configService=new _h(y),this.transformerService=new _g(this.configService,this.app.log),this.tokenizerService=new Tg(this.configService,this.app.log),this.transformerService.initialize().finally(()=>{this.providerService=new Wu(this.configService,this.transformerService,this.app.log)}),this.tokenizerService.initialize().catch(N=>{this.app.log.error(`Failed to initialize TokenizerService: ${N}`)})}async register(y,S){await this.app.register(y,S)}addHook(y,S){this.app.addHook(y,S)}async registerNamespace(y,S){if(!y)throw new Error("name is required");if(y==="/"){await this.app.register(async Y=>{Y.decorate("configService",this.configService),Y.decorate("transformerService",this.transformerService),Y.decorate("providerService",this.providerService),Y.decorate("tokenizerService",this.tokenizerService),Y.addHook("preHandler",async(K,ae)=>{new URL(`http://127.0.0.1${K.url}`).pathname.endsWith("/v1/messages")&&await Ng(K,ae,{configService:this.configService,tokenizerService:this.tokenizerService})}),await nu(Y)});return}if(!S)throw new Error("options is required");let T=new _h({initialConfig:{providers:S.Providers,Router:S.Router}}),N=new _g(T,this.app.log);await N.initialize();let V=new Wu(T,N,this.app.log),H=new Tg(T,this.app.log);await H.initialize(),await this.app.register(async Y=>{Y.decorate("configService",T),Y.decorate("transformerService",N),Y.decorate("providerService",V),Y.decorate("tokenizerService",H),Y.addHook("preHandler",async(K,ae)=>{new URL(`http://127.0.0.1${K.url}`).pathname.endsWith("/v1/messages")&&await Ng(K,ae,{configService:T,tokenizerService:H})}),await nu(Y)},{prefix:y})}async start(){try{this.app._server=this,this.app.addHook("preHandler",(T,N,V)=>{if(new URL(`http://127.0.0.1${T.url}`).pathname.endsWith("/v1/messages")&&T.body){let H=T.body;T.log.info({data:H,type:"request body"}),H.stream||(H.stream=!1)}V()}),await this.registerNamespace("/"),this.app.addHook("preHandler",async(T,N)=>{if(new URL(`http://127.0.0.1${T.url}`).pathname.endsWith("/v1/messages")&&T.body)try{let V=T.body;if(!V||!V.model)return N.code(400).send({error:"Missing model in request body"});let[H,...Y]=V.model.split(",");V.model=Y.join(","),T.provider=H,T.model=Y;return}catch(V){return T.log.error({error:V},"Error in modelProviderMiddleware:"),N.code(500).send({error:"Internal server error"})}});let y=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${y}`);let S=async T=>{this.app.log.info(`Received ${T}, shutting down gracefully...`),await this.app.close(),process.exit(0)};process.on("SIGINT",()=>S("SIGINT")),process.on("SIGTERM",()=>S("SIGTERM"))}catch(y){this.app.log.error(`Error starting server: ${y}`),process.exit(1)}}},wR=bR}),BI={};RO(BI,{backupConfigFile:()=>ey,getServer:()=>gv,initConfig:()=>vI,initDir:()=>ZE,pluginManager:()=>gE,readConfigFile:()=>XE,tokenSpeedPlugin:()=>hv,writeConfigFile:()=>ty});gy.exports=QO(BI);var GP=require("fs"),VP=require("fs/promises"),II=require("os"),xI=require("path"),xu=ui(require("node:fs/promises")),YP=ui(Bw()),a0=ui(require("node:path")),Hs=ui(yd()),iE=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(iE);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=iE(n);return t}return e},u0=async e=>{try{await xu.default.access(e)}catch{await xu.default.mkdir(e,{recursive:!0})}},ZE=async()=>{await u0(Hs.HOME_DIR),await u0(Hs.PLUGINS_DIR),await u0(a0.default.join(Hs.HOME_DIR,"logs"))},XE=async()=>{try{let e=await xu.default.readFile(Hs.CONFIG_FILE,"utf-8");try{let t=YP.default.parse(e);return iE(t)}catch(t){console.error(`Failed to parse config file at ${Hs.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 ZE();let t=await ey();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await ty(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 ${Hs.CONFIG_FILE}`),console.error("Error details:",e.message),process.exit(1)}},ey=async()=>{try{if(await xu.default.access(Hs.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${Hs.CONFIG_FILE}.${e}.bak`;await xu.default.copyFile(Hs.CONFIG_FILE,t);try{let r=a0.default.dirname(Hs.CONFIG_FILE),n=a0.default.basename(Hs.CONFIG_FILE),s=(await xu.default.readdir(r)).filter(o=>o.startsWith(n)&&o.endsWith(".bak")).sort().reverse();if(s.length>3)for(let o=3;o<s.length;o++){let i=a0.default.join(r,s[o]);await xu.default.unlink(i)}}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},ty=async e=>{await u0(Hs.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await xu.default.writeFile(Hs.CONFIG_FILE,t)},vI=async()=>{let e=await XE();return Object.assign(process.env,e),e},Vf=require("node:fs"),JP=require("node:path"),na=ui(require("node:stream"),1),fc=require("node:util"),io=require("node:buffer"),mb=require("node:util"),Yf=ui(require("node:http"),1),zP=require("node:net"),WP=require("node:url"),KP=require("node:util"),ZP=ui(require("node:http"),1),XP=ui(require("node:https"),1),pc=ui(require("node:zlib"),1),ta=ui(require("node:stream"),1),Jf=require("node:buffer"),vm=require("fs"),Eb=require("path"),e4=require("os"),t4=ui(DB(),1),r4=ui(CB(),1),_m=require("fs"),yb=require("path"),n4=ui(bB(),1),i4=ui(JB(),1),s4=require("crypto"),o4=require("crypto"),a4=ui(p0(),1),zf=require("path"),u4=require("os"),Wf=require("fs"),Kf=require("fs"),l4=ui(p0(),1),sE=require("fs/promises"),Db=require("fs/promises"),oE=require("path"),g0=ui(yd(),1),c4=Object.create,ry=Object.defineProperty,h4=Object.getOwnPropertyDescriptor,d4=Object.getOwnPropertyNames,A4=Object.getPrototypeOf,f4=Object.prototype.hasOwnProperty,$r=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),Ai=(e,t)=>()=>(e&&(t=e(e=0)),t),Ir=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),_I=(e,t)=>{for(var r in t)ry(e,r,{get:t[r],enumerable:!0})},p4=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of d4(t))!f4.call(e,s)&&s!==r&&ry(e,s,{get:()=>t[s],enumerable:!(n=h4(t,s))||n.enumerable});return e},Fu=(e,t,r)=>(r=e!=null?c4(A4(e)):{},p4(t||!e||!e.__esModule?ry(r,"default",{value:e,enumerable:!0}):r,e)),g4=Ir((e,t)=>{t.exports.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,t.exports.ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,t.exports.ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/}),SI=Ir((e,t)=>{var r=g4();t.exports={isSpaceSeparator(n){return typeof n=="string"&&r.Space_Separator.test(n)},isIdStartChar(n){return typeof n=="string"&&(n>="a"&&n<="z"||n>="A"&&n<="Z"||n==="$"||n==="_"||r.ID_Start.test(n))},isIdContinueChar(n){return typeof n=="string"&&(n>="a"&&n<="z"||n>="A"&&n<="Z"||n>="0"&&n<="9"||n==="$"||n==="_"||n==="\u200C"||n==="\u200D"||r.ID_Continue.test(n))},isDigit(n){return typeof n=="string"&&/[0-9]/.test(n)},isHexDigit(n){return typeof n=="string"&&/[0-9A-Fa-f]/.test(n)}}}),m4=Ir((e,t)=>{var r=SI(),n,s,o,i,a,u,l,c,d;t.exports=function(P,Z){n=String(P),s="start",o=[],i=0,a=1,u=0,l=void 0,c=void 0,d=void 0;do l=C(),v[s]();while(l.type!=="eof");return typeof Z=="function"?A({"":d},"",Z):d};function A(P,Z,ge){let ne=P[Z];if(ne!=null&&typeof ne=="object")if(Array.isArray(ne))for(let ce=0;ce<ne.length;ce++){let oe=String(ce),Ce=A(ne,oe,ge);Ce===void 0?delete ne[oe]:Object.defineProperty(ne,oe,{value:Ce,writable:!0,enumerable:!0,configurable:!0})}else for(let ce in ne){let oe=A(ne,ce,ge);oe===void 0?delete ne[ce]:Object.defineProperty(ne,ce,{value:oe,writable:!0,enumerable:!0,configurable:!0})}return ge.call(P,Z,ne)}var h,f,p,g,m;function C(){for(h="default",f="",p=!1,g=1;;){m=E();let P=w[h]();if(P)return P}}function E(){if(n[i])return String.fromCodePoint(n.codePointAt(i))}function D(){let P=E();return P===`
857
+ `,S.enqueue(T)}})}},yR=(y,S)=>{let T=y.getReader();return new ReadableStream({async start(N){try{for(;;){let{done:V,value:H}=await T.read();if(V){N.close();break}let Y=await S(H,N);Y!==void 0&&N.enqueue(Y)}}catch(V){N.error(V)}finally{T.releaseLock()}}})};kA(),RA(),Ih(),ru();var Ph=new Map,Lg=new Map,DR={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,mR.default)(async(y,S)=>{let T={reporter:["console","temp-file"],...S},N=Array.isArray(T.reporter)?T.reporter:[T.reporter];if(T.outputHandlers&&T.outputHandlers.length>0)Ls.registerHandlers(T.outputHandlers);else{let H=[];for(let Y of N)Y==="console"?H.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):Y==="temp-file"?H.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):Y==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");H.length>0&&Ls.registerHandlers(H)}T.outputOptions&&Ls.setDefaultOptions(T.outputOptions);let V=async H=>{let Y=y.tokenizerService;if(!Y)return y.log?.warn("TokenizerService not available"),null;if(!H.provider||!H.model)return null;let K=H.provider,ae=H.model,ee=`${K}:${ae}`;if(Lg.has(ee))return Lg.get(ee);let le=Y.getTokenizerConfigForModel(K,ae);if(!le)return y.log?.debug(`No tokenizer config for ${K}:${ae}, using fallback`),null;try{let pe=await Y.getTokenizer(le);return Lg.set(ee,pe),y.log?.info(`Created tokenizer for ${K}:${ae} - ${pe.name}`),pe}catch(pe){return y.log?.warn(`Failed to create tokenizer for ${K}:${ae}: ${pe.message}`),null}};y.addHook("onRequest",async H=>{new URL(`http://127.0.0.1${H.url}`).pathname.endsWith("/v1/messages")&&(H.requestStartTime=performance.now())}),y.addHook("onSend",async(H,Y,K)=>{let ae=H.requestStartTime;if(!ae)return;let ee=H.id||Date.now().toString(),le;try{let ue=H.body?.metadata?.user_id;if(ue&&typeof ue=="string")try{let ye=JSON.parse(ue);ye.session_id&&(le=ye.session_id)}catch{let ye=ue.match(/_session_([a-f0-9-]+)/i);le=ye?ye[1]:void 0}}catch{}if(!le)return;let pe=await V(H);if(K instanceof ReadableStream){Ph.set(ee,{requestId:ee,sessionId:le,startTime:ae,lastTokenTime:ae,tokenCount:0,tokensPerSecond:0,tokenTimestamps:[],stream:!0});let[ue,ye]=K.tee();return(async()=>{let De=null,we=async ve=>{let Ie=Ph.get(ee);if(!Ie)return;let Ee=performance.now();if(ve){let Te=Ie.firstTokenTime?Ie.firstTokenTime-Ie.startTime:0,Pe=(Ie.lastTokenTime-Ie.startTime-Te)/1e3;Pe>0&&(Ie.tokensPerSecond=Math.round(Ie.tokenCount/Pe))}else{let Te=Ee-1e3;Ie.tokenTimestamps=Ie.tokenTimestamps.filter(Pe=>Pe>Te),Ie.tokensPerSecond=Ie.tokenTimestamps.length}await SC(Ie,N,T.outputOptions,ve).catch(Te=>{y.log?.warn(`Failed to output streaming stats: ${Te.message}`)})};try{let ve=ye.pipeThrough(new TextDecoderStream).pipeThrough(new _C).getReader();for(De=setInterval(async()=>{Ph.get(ee)&&await we(!1)},1e3);;){let{done:Ie,value:Ee}=await ve.read();if(Ie)break;let Te=Ee,Pe=Ph.get(ee);if(!Pe)continue;let et=performance.now();if(!Pe.firstTokenTime&&(Te.event==="content_block_start"||Te.event==="content_block_delta"||Te.event==="text_block"||Te.event==="content_block")&&(Pe.firstTokenTime=et,Pe.timeToFirstToken=Math.round(et-Pe.startTime)),Te.event==="content_block_delta"&&Te.data?.delta){let At=Te.data.delta.type,ft="";if(At==="text_delta"?ft=Te.data.delta.text||"":At==="input_json_delta"?ft=Te.data.delta.partial_json||"":At==="thinking_delta"&&(ft=Te.data.delta.thinking||""),ft){let jt=pe&&pe.encodeText?pe.encodeText(ft).length:hf(ft);Pe.tokenCount+=jt,Pe.lastTokenTime=et;for(let Ct=0;Ct<jt;Ct++)Pe.tokenTimestamps.push(et)}}Te.event==="message_stop"&&(De&&(clearInterval(De),De=null),await we(!0),Ph.delete(ee))}}catch(ve){De&&clearInterval(De),ve.name!=="AbortError"&&ve.code!=="ERR_STREAM_PREMATURE_CLOSE"&&y.log?.warn(`Error processing token stats: ${ve.message}`)}})().catch(De=>{console.log(De),y.log?.warn(`Background stats processing failed: ${De.message}`)}),ue}let me=performance.now(),se=0;if(K&&typeof K=="string")try{let ue=JSON.parse(K);if(ue.usage?.output_tokens)se=ue.usage.output_tokens;else{let ye=ue.content||ue.message?.content||"";if(pe)Array.isArray(ye)?se=ye.reduce((De,we)=>{if(we.type==="text"){let ve=we.text||"";return De+(pe.encodeText?pe.encodeText(ve).length:hf(ve))}return De},0):typeof ye=="string"&&(se=pe.encodeText?pe.encodeText(ye).length:hf(ye));else{let De=Array.isArray(ye)?ye.map(we=>we.text).join(""):ye;se=hf(De)}}}catch{}if(se>0){let ue=Math.round(me-ae),ye=me-ae-ue>0?(me-ae-ue)/1e3:(me-ae)/1e3,De={requestId:ee,sessionId:le,startTime:ae,lastTokenTime:me,tokenCount:se,tokensPerSecond:ye>0?Math.round(se/ye):0,timeToFirstToken:ue,stream:!1,tokenTimestamps:[]};await SC(De,N,T.outputOptions,!0)}return K})})};function hf(y){let S=(y.match(/[\u4e00-\u9fa5]/g)||[]).length,T=y.length-S;return Math.ceil(S/1.5+T/4)}async function SC(y,S,T,N=!1){let V=N?"[Token Speed Final]":"[Token Speed]",H={requestId:y.requestId.substring(0,8),sessionId:y.sessionId,stream:y.stream,tokenCount:y.tokenCount,tokensPerSecond:y.tokensPerSecond,timeToFirstToken:y.timeToFirstToken?`${y.timeToFirstToken}ms`:"N/A",duration:`${((y.lastTokenTime-y.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},Y={prefix:V,metadata:{sessionId:y.sessionId},...T};for(let K of S)try{await Ls.outputToType(K,H,Y)}catch(ae){console.error(`[TokenSpeedPlugin] Failed to output to ${K}:`,ae)}}function CR(y={}){let S=(0,xh.default)({bodyLimit:52428800,...y});return S.setErrorHandler(gg),S.register(fg.default),S}var bR=class{app;configService;providerService;transformerService;tokenizerService;constructor(y={}){let{initialConfig:S,...T}=y;this.app=CR({...T,logger:T.logger??!0}),this.configService=new _h(y),this.transformerService=new _g(this.configService,this.app.log),this.tokenizerService=new Tg(this.configService,this.app.log),this.transformerService.initialize().finally(()=>{this.providerService=new Wu(this.configService,this.transformerService,this.app.log)}),this.tokenizerService.initialize().catch(N=>{this.app.log.error(`Failed to initialize TokenizerService: ${N}`)})}async register(y,S){await this.app.register(y,S)}addHook(y,S){this.app.addHook(y,S)}async registerNamespace(y,S){if(!y)throw new Error("name is required");if(y==="/"){await this.app.register(async Y=>{Y.decorate("configService",this.configService),Y.decorate("transformerService",this.transformerService),Y.decorate("providerService",this.providerService),Y.decorate("tokenizerService",this.tokenizerService),Y.addHook("preHandler",async(K,ae)=>{new URL(`http://127.0.0.1${K.url}`).pathname.endsWith("/v1/messages")&&await Ng(K,ae,{configService:this.configService,tokenizerService:this.tokenizerService})}),await nu(Y)});return}if(!S)throw new Error("options is required");let T=new _h({initialConfig:{providers:S.Providers,Router:S.Router}}),N=new _g(T,this.app.log);await N.initialize();let V=new Wu(T,N,this.app.log),H=new Tg(T,this.app.log);await H.initialize(),await this.app.register(async Y=>{Y.decorate("configService",T),Y.decorate("transformerService",N),Y.decorate("providerService",V),Y.decorate("tokenizerService",H),Y.addHook("preHandler",async(K,ae)=>{new URL(`http://127.0.0.1${K.url}`).pathname.endsWith("/v1/messages")&&await Ng(K,ae,{configService:T,tokenizerService:H})}),await nu(Y)},{prefix:y})}async start(){try{this.app._server=this,this.app.addHook("preHandler",(T,N,V)=>{if(new URL(`http://127.0.0.1${T.url}`).pathname.endsWith("/v1/messages")&&T.body){let H=T.body;T.log.info({data:H,type:"request body"}),H.stream||(H.stream=!1)}V()}),await this.registerNamespace("/"),this.app.addHook("preHandler",async(T,N)=>{if(new URL(`http://127.0.0.1${T.url}`).pathname.endsWith("/v1/messages")&&T.body)try{let V=T.body;if(!V||!V.model)return N.code(400).send({error:"Missing model in request body"});let[H,...Y]=V.model.split(",");V.model=Y.join(","),T.provider=H,T.model=Y;return}catch(V){return T.log.error({error:V},"Error in modelProviderMiddleware:"),N.code(500).send({error:"Internal server error"})}});let y=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${y}`);let S=async T=>{this.app.log.info(`Received ${T}, shutting down gracefully...`),await this.app.close(),process.exit(0)};process.on("SIGINT",()=>S("SIGINT")),process.on("SIGTERM",()=>S("SIGTERM"))}catch(y){this.app.log.error(`Error starting server: ${y}`),process.exit(1)}}},wR=bR}),BI={};RO(BI,{backupConfigFile:()=>ey,getServer:()=>gv,initConfig:()=>vI,initDir:()=>ZE,pluginManager:()=>gE,readConfigFile:()=>XE,tokenSpeedPlugin:()=>hv,writeConfigFile:()=>ty});gy.exports=QO(BI);var GP=require("fs"),VP=require("fs/promises"),II=require("os"),xI=require("path"),xu=ui(require("node:fs/promises")),YP=ui(Bw()),a0=ui(require("node:path")),Hs=ui(yd()),iE=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(iE);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=iE(n);return t}return e},u0=async e=>{try{await xu.default.access(e)}catch{await xu.default.mkdir(e,{recursive:!0})}},ZE=async()=>{await u0(Hs.HOME_DIR),await u0(Hs.PLUGINS_DIR),await u0(a0.default.join(Hs.HOME_DIR,"logs"))},XE=async()=>{try{let e=await xu.default.readFile(Hs.CONFIG_FILE,"utf-8");try{let t=YP.default.parse(e);return iE(t)}catch(t){console.error(`Failed to parse config file at ${Hs.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 ZE();let t=await ey();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await ty(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 ${Hs.CONFIG_FILE}`),console.error("Error details:",e.message),process.exit(1)}},ey=async()=>{try{if(await xu.default.access(Hs.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${Hs.CONFIG_FILE}.${e}.bak`;await xu.default.copyFile(Hs.CONFIG_FILE,t);try{let r=a0.default.dirname(Hs.CONFIG_FILE),n=a0.default.basename(Hs.CONFIG_FILE),s=(await xu.default.readdir(r)).filter(o=>o.startsWith(n)&&o.endsWith(".bak")).sort().reverse();if(s.length>3)for(let o=3;o<s.length;o++){let i=a0.default.join(r,s[o]);await xu.default.unlink(i)}}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},ty=async e=>{await u0(Hs.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await xu.default.writeFile(Hs.CONFIG_FILE,t)},vI=async()=>{let e=await XE();return Object.assign(process.env,e),e},Vf=require("node:fs"),JP=require("node:path"),na=ui(require("node:stream"),1),fc=require("node:util"),io=require("node:buffer"),mb=require("node:util"),Yf=ui(require("node:http"),1),zP=require("node:net"),WP=require("node:url"),KP=require("node:util"),ZP=ui(require("node:http"),1),XP=ui(require("node:https"),1),pc=ui(require("node:zlib"),1),ta=ui(require("node:stream"),1),Jf=require("node:buffer"),vm=require("fs"),Eb=require("path"),e4=require("os"),t4=ui(DB(),1),r4=ui(CB(),1),_m=require("fs"),yb=require("path"),n4=ui(bB(),1),i4=ui(JB(),1),s4=require("crypto"),o4=require("crypto"),a4=ui(p0(),1),zf=require("path"),u4=require("os"),Wf=require("fs"),Kf=require("fs"),l4=ui(p0(),1),sE=require("fs/promises"),Db=require("fs/promises"),oE=require("path"),g0=ui(yd(),1),c4=Object.create,ry=Object.defineProperty,h4=Object.getOwnPropertyDescriptor,d4=Object.getOwnPropertyNames,A4=Object.getPrototypeOf,f4=Object.prototype.hasOwnProperty,$r=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),Ai=(e,t)=>()=>(e&&(t=e(e=0)),t),Ir=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),_I=(e,t)=>{for(var r in t)ry(e,r,{get:t[r],enumerable:!0})},p4=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of d4(t))!f4.call(e,s)&&s!==r&&ry(e,s,{get:()=>t[s],enumerable:!(n=h4(t,s))||n.enumerable});return e},Fu=(e,t,r)=>(r=e!=null?c4(A4(e)):{},p4(t||!e||!e.__esModule?ry(r,"default",{value:e,enumerable:!0}):r,e)),g4=Ir((e,t)=>{t.exports.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,t.exports.ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,t.exports.ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/}),SI=Ir((e,t)=>{var r=g4();t.exports={isSpaceSeparator(n){return typeof n=="string"&&r.Space_Separator.test(n)},isIdStartChar(n){return typeof n=="string"&&(n>="a"&&n<="z"||n>="A"&&n<="Z"||n==="$"||n==="_"||r.ID_Start.test(n))},isIdContinueChar(n){return typeof n=="string"&&(n>="a"&&n<="z"||n>="A"&&n<="Z"||n>="0"&&n<="9"||n==="$"||n==="_"||n==="\u200C"||n==="\u200D"||r.ID_Continue.test(n))},isDigit(n){return typeof n=="string"&&/[0-9]/.test(n)},isHexDigit(n){return typeof n=="string"&&/[0-9A-Fa-f]/.test(n)}}}),m4=Ir((e,t)=>{var r=SI(),n,s,o,i,a,u,l,c,d;t.exports=function(P,Z){n=String(P),s="start",o=[],i=0,a=1,u=0,l=void 0,c=void 0,d=void 0;do l=C(),v[s]();while(l.type!=="eof");return typeof Z=="function"?A({"":d},"",Z):d};function A(P,Z,ge){let ne=P[Z];if(ne!=null&&typeof ne=="object")if(Array.isArray(ne))for(let ce=0;ce<ne.length;ce++){let oe=String(ce),Ce=A(ne,oe,ge);Ce===void 0?delete ne[oe]:Object.defineProperty(ne,oe,{value:Ce,writable:!0,enumerable:!0,configurable:!0})}else for(let ce in ne){let oe=A(ne,ce,ge);oe===void 0?delete ne[ce]:Object.defineProperty(ne,ce,{value:oe,writable:!0,enumerable:!0,configurable:!0})}return ge.call(P,Z,ne)}var h,f,p,g,m;function C(){for(h="default",f="",p=!1,g=1;;){m=E();let P=w[h]();if(P)return P}}function E(){if(n[i])return String.fromCodePoint(n.codePointAt(i))}function D(){let P=E();return P===`
858
858
  `?(a++,u=0):P?u+=P.length:u++,P&&(i+=P.length),P}var w={default(){switch(m){case" ":case"\v":case"\f":case" ":case"\xA0":case"\uFEFF":case`
859
859
  `:case"\r":case"\u2028":case"\u2029":D();return;case"/":D(),h="comment";return;case void 0:return D(),x("eof")}if(r.isSpaceSeparator(m)){D();return}return w[s]()},comment(){switch(m){case"*":D(),h="multiLineComment";return;case"/":D(),h="singleLineComment";return}throw O(D())},multiLineComment(){switch(m){case"*":D(),h="multiLineCommentAsterisk";return;case void 0:throw O(D())}D()},multiLineCommentAsterisk(){switch(m){case"*":D();return;case"/":D(),h="default";return;case void 0:throw O(D())}D(),h="multiLineComment"},singleLineComment(){switch(m){case`
860
860
  `:case"\r":case"\u2028":case"\u2029":D(),h="default";return;case void 0:return D(),x("eof")}D()},value(){switch(m){case"{":case"[":return x("punctuator",D());case"n":return D(),b("ull"),x("null",null);case"t":return D(),b("rue"),x("boolean",!0);case"f":return D(),b("alse"),x("boolean",!1);case"-":case"+":D()==="-"&&(g=-1),h="sign";return;case".":f=D(),h="decimalPointLeading";return;case"0":f=D(),h="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":f=D(),h="decimalInteger";return;case"I":return D(),b("nfinity"),x("numeric",1/0);case"N":return D(),b("aN"),x("numeric",NaN);case'"':case"'":p=D()==='"',f="",h="string";return}throw O(D())},identifierNameStartEscape(){if(m!=="u")throw O(D());D();let P=_();switch(P){case"$":case"_":break;default:if(!r.isIdStartChar(P))throw Q();break}f+=P,h="identifierName"},identifierName(){switch(m){case"$":case"_":case"\u200C":case"\u200D":f+=D();return;case"\\":D(),h="identifierNameEscape";return}if(r.isIdContinueChar(m)){f+=D();return}return x("identifier",f)},identifierNameEscape(){if(m!=="u")throw O(D());D();let P=_();switch(P){case"$":case"_":case"\u200C":case"\u200D":break;default:if(!r.isIdContinueChar(P))throw Q();break}f+=P,h="identifierName"},sign(){switch(m){case".":f=D(),h="decimalPointLeading";return;case"0":f=D(),h="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":f=D(),h="decimalInteger";return;case"I":return D(),b("nfinity"),x("numeric",g*(1/0));case"N":return D(),b("aN"),x("numeric",NaN)}throw O(D())},zero(){switch(m){case".":f+=D(),h="decimalPoint";return;case"e":case"E":f+=D(),h="decimalExponent";return;case"x":case"X":f+=D(),h="hexadecimal";return}return x("numeric",g*0)},decimalInteger(){switch(m){case".":f+=D(),h="decimalPoint";return;case"e":case"E":f+=D(),h="decimalExponent";return}if(r.isDigit(m)){f+=D();return}return x("numeric",g*Number(f))},decimalPointLeading(){if(r.isDigit(m)){f+=D(),h="decimalFraction";return}throw O(D())},decimalPoint(){switch(m){case"e":case"E":f+=D(),h="decimalExponent";return}if(r.isDigit(m)){f+=D(),h="decimalFraction";return}return x("numeric",g*Number(f))},decimalFraction(){switch(m){case"e":case"E":f+=D(),h="decimalExponent";return}if(r.isDigit(m)){f+=D();return}return x("numeric",g*Number(f))},decimalExponent(){switch(m){case"+":case"-":f+=D(),h="decimalExponentSign";return}if(r.isDigit(m)){f+=D(),h="decimalExponentInteger";return}throw O(D())},decimalExponentSign(){if(r.isDigit(m)){f+=D(),h="decimalExponentInteger";return}throw O(D())},decimalExponentInteger(){if(r.isDigit(m)){f+=D();return}return x("numeric",g*Number(f))},hexadecimal(){if(r.isHexDigit(m)){f+=D(),h="hexadecimalInteger";return}throw O(D())},hexadecimalInteger(){if(r.isHexDigit(m)){f+=D();return}return x("numeric",g*Number(f))},string(){switch(m){case"\\":D(),f+=I();return;case'"':if(p)return D(),x("string",f);f+=D();return;case"'":if(!p)return D(),x("string",f);f+=D();return;case`
@@ -925,7 +925,7 @@ https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys`};var E=
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}}}}),$x,Hx=Ai(()=>{"use strict";$x=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}`)}}}}),qx,Gx=Ai(()=>{"use strict";qx=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,e4.tmpdir)();this.baseDir=(0,Eb.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,vm.existsSync)(this.baseDir)||(0,vm.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,Eb.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,vm.writeFileSync)(s,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),Ub,dd,IM=Ai(()=>{"use strict";jx(),Hx(),Gx(),Ub=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 Ux(e.config);case"webhook":return new $x(e.config);case"temp-file":return new qx(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)}},dd=new Ub}),xM=Fu(FI(),1),jb=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,yb.join)(process.cwd(),this.options.jsonPath);if((0,_m.existsSync)(e))try{let t=(0,_m.readFileSync)(e,"utf-8"),r=xM.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,yb.join)(process.cwd(),this.options.envPath);if((0,_m.existsSync)(e))try{let t=(0,n4.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 no(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 vM(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 _M(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 i4.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 SM="2.0.36",FM={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},kM=class{states=new Map;config;probeTimer;constructor(e){this.config={...FM,...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)}},Lm=null;function dy(e){return Lm||(Lm=new kM(e)),Lm}async function TM(e,t,r,n){let s=e.body,o=e.provider,i=r.providerService.getProvider(o);if(!i)throw no(`Provider '${o}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await Vx(s,i,n,e.headers,{req:e}),c=await Yx(a,u,i,r,l,n,{req:e}),d=await Jx(a,c,i,n,l,{req:e});return zx(d,t,s)}catch(a){let u=await RM(e,t,r,n,a);if(u)return u;throw a}}async function RM(e,t,r,n,s){let o=e.scenarioType||"default",i=e.familyFallback,a=r.configService.get("fallback"),u=dy(),l=[];if(i?.[o]?l=i[o]:a?.[o]&&(l=a[o]),!Array.isArray(l)||l.length===0)return null;let c=e.provider||"",d=e.body.model||"";u.recordFailure(c,d,s?.message),e.log.warn(`Request failed for ${e.scenarioType}, trying ${l.length} fallback models`);let A=l.sort((h,f)=>{let[p,g]=h.split(","),[m,C]=f.split(",");return u.getPriority(p,g)-u.getPriority(m,C)});for(let h of A)try{let[f,...p]=h.split(","),g=p.join(",");if(!u.isAvailable(f,g)){e.log.warn(`Fallback model ${h} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${h}`);let m={...e.body};m.model=g;let C={...e,provider:f,body:m},E=r.providerService.getProvider(f);if(!E){e.log.warn(`Fallback provider '${f}' not found, skipping`);continue}let{requestBody:D,config:w,bypass:x}=await Vx(m,E,n,e.headers,{req:C}),b=await Yx(D,w,E,r,x,n,{req:C}),I=await Jx(D,b,E,n,x,{req:C});return e.log.info(`Fallback model ${h} succeeded`),u.recordSuccess(f,g),zx(I,t,m)}catch(f){let[p,...g]=h.split(","),m=g.join(",");u.recordFailure(p,m,f.message),e.log.warn(`Fallback model ${h} failed: ${f.message}`);continue}return e.log.error(`All fallback models failed for ${o}`),null}async function Vx(e,t,r,n,s){let o=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=QM(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 QM(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 d=t.headers||{};c.config?.headers&&(d={...d,...c.config.headers},delete d.host,delete c.config.headers),t={...t,...c.config,headers:d}}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 _M(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}`),no(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error")}return l}async function Jx(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 zx(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 $b=async e=>{e.get("/",async()=>({message:"LLMs API",version:SM})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:dy().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)=>TM(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 no("Provider name is required",400,"invalid_request");if(!o||!NM(o))throw no("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw no("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw no("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw no(`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 no("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 no("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 no("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 no("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function NM(e){try{return new URL(e),!0}catch{return!1}}var Hb=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||[],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}}},Gi=[];for(let e=0;e<256;++e)Gi.push((e+256).toString(16).slice(1));function OM(e,t=0){return(Gi[e[t+0]]+Gi[e[t+1]]+Gi[e[t+2]]+Gi[e[t+3]]+"-"+Gi[e[t+4]]+Gi[e[t+5]]+"-"+Gi[e[t+6]]+Gi[e[t+7]]+"-"+Gi[e[t+8]]+Gi[e[t+9]]+"-"+Gi[e[t+10]]+Gi[e[t+11]]+Gi[e[t+12]]+Gi[e[t+13]]+Gi[e[t+14]]+Gi[e[t+15]]).toLowerCase()}var d0=new Uint8Array(256),Xf=d0.length;function LM(){return Xf>d0.length-16&&((0,s4.randomFillSync)(d0),Xf=0),d0.slice(Xf,Xf+=16)}var qb={randomUUID:o4.randomUUID};function PM(e,t,r){if(qb.randomUUID&&!t&&!e)return qb.randomUUID();e=e||{};let n=e.random??e.rng?.()??LM();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 OM(n)}var md=PM,MM=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",UM=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),jM=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"?UM(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}}}}),$x,Hx=Ai(()=>{"use strict";$x=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}`)}}}}),qx,Gx=Ai(()=>{"use strict";qx=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,e4.tmpdir)();this.baseDir=(0,Eb.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,vm.existsSync)(this.baseDir)||(0,vm.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,Eb.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,vm.writeFileSync)(s,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),Ub,dd,IM=Ai(()=>{"use strict";jx(),Hx(),Gx(),Ub=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 Ux(e.config);case"webhook":return new $x(e.config);case"temp-file":return new qx(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)}},dd=new Ub}),xM=Fu(FI(),1),jb=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,yb.join)(process.cwd(),this.options.jsonPath);if((0,_m.existsSync)(e))try{let t=(0,_m.readFileSync)(e,"utf-8"),r=xM.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,yb.join)(process.cwd(),this.options.envPath);if((0,_m.existsSync)(e))try{let t=(0,n4.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 no(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 vM(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 _M(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 i4.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 SM="2.0.37",FM={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2,rateLimitThreshold:1},kM=class{states=new Map;config;probeTimer;constructor(e){this.config={...FM,...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)}},Lm=null;function dy(e){return Lm||(Lm=new kM(e)),Lm}async function TM(e,t,r,n){let s=e.body,o=e.provider,i=r.providerService.getProvider(o);if(!i)throw no(`Provider '${o}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await Vx(s,i,n,e.headers,{req:e}),c=await Yx(a,u,i,r,l,n,{req:e}),d=await Jx(a,c,i,n,l,{req:e});return zx(d,t,s)}catch(a){let u=await RM(e,t,r,n,a);if(u)return u;throw a}}async function RM(e,t,r,n,s){let o=e.scenarioType||"default",i=e.familyFallback,a=r.configService.get("fallback"),u=dy(),l=[];if(i?.[o]?l=i[o]:a?.[o]&&(l=a[o]),!Array.isArray(l)||l.length===0)return null;let c=e.provider||"",d=e.body.model||"";u.recordFailure(c,d,s?.message),e.log.warn(`Request failed for ${e.scenarioType}, trying ${l.length} fallback models`);let A=l.sort((h,f)=>{let[p,g]=h.split(","),[m,C]=f.split(",");return u.getPriority(p,g)-u.getPriority(m,C)});for(let h of A)try{let[f,...p]=h.split(","),g=p.join(",");if(!u.isAvailable(f,g)){e.log.warn(`Fallback model ${h} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${h}`);let m={...e.body};m.model=g;let C={...e,provider:f,body:m},E=r.providerService.getProvider(f);if(!E){e.log.warn(`Fallback provider '${f}' not found, skipping`);continue}let{requestBody:D,config:w,bypass:x}=await Vx(m,E,n,e.headers,{req:C}),b=await Yx(D,w,E,r,x,n,{req:C}),I=await Jx(D,b,E,n,x,{req:C});return e.log.info(`Fallback model ${h} succeeded`),u.recordSuccess(f,g),zx(I,t,m)}catch(f){let[p,...g]=h.split(","),m=g.join(",");u.recordFailure(p,m,f.message),e.log.warn(`Fallback model ${h} failed: ${f.message}`);continue}return e.log.error(`All fallback models failed for ${o}`),null}async function Vx(e,t,r,n,s){let o=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=QM(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 QM(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 d=t.headers||{};c.config?.headers&&(d={...d,...c.config.headers},delete d.host,delete c.config.headers),t={...t,...c.config,headers:d}}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 _M(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}`),no(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error")}return l}async function Jx(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 zx(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 $b=async e=>{e.get("/",async()=>({message:"LLMs API",version:SM})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:dy().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)=>TM(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 no("Provider name is required",400,"invalid_request");if(!o||!NM(o))throw no("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw no("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw no("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw no(`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 no("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 no("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 no("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 no("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function NM(e){try{return new URL(e),!0}catch{return!1}}var Hb=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||[],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}}},Gi=[];for(let e=0;e<256;++e)Gi.push((e+256).toString(16).slice(1));function OM(e,t=0){return(Gi[e[t+0]]+Gi[e[t+1]]+Gi[e[t+2]]+Gi[e[t+3]]+"-"+Gi[e[t+4]]+Gi[e[t+5]]+"-"+Gi[e[t+6]]+Gi[e[t+7]]+"-"+Gi[e[t+8]]+Gi[e[t+9]]+"-"+Gi[e[t+10]]+Gi[e[t+11]]+Gi[e[t+12]]+Gi[e[t+13]]+Gi[e[t+14]]+Gi[e[t+15]]).toLowerCase()}var d0=new Uint8Array(256),Xf=d0.length;function LM(){return Xf>d0.length-16&&((0,s4.randomFillSync)(d0),Xf=0),d0.slice(Xf,Xf+=16)}var qb={randomUUID:o4.randomUUID};function PM(e,t,r){if(qb.randomUUID&&!t&&!e)return qb.randomUUID();e=e||{};let n=e.random??e.rng?.()??LM();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 OM(n)}var md=PM,MM=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",UM=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),jM=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"?UM(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:MM(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,d=new Map,A=0,h=0,f=0,p=!1,g=!1,m=0,C=-1,E=()=>{let b=m;return m++,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
 
@@ -1200,7 +1200,7 @@ Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.valu
1200
1200
  `),e.data&&(e.data.type==="done"?r+=`data: [DONE]
1201
1201
  `:r+=`data: ${JSON.stringify(e.data)}
1202
1202
  `),r+=`
1203
- `,t.enqueue(r)}})}};jx();Hx();Gx();IM();var id=new Map,jm=new Map,hv={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,K9.default)(async(e,t)=>{let r={reporter:["console","temp-file"],...t},n=Array.isArray(r.reporter)?r.reporter:[r.reporter];if(r.outputHandlers&&r.outputHandlers.length>0)dd.registerHandlers(r.outputHandlers);else{let o=[];for(let i of n)i==="console"?o.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?o.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");o.length>0&&dd.registerHandlers(o)}r.outputOptions&&dd.setDefaultOptions(r.outputOptions);let s=async o=>{let i=e.tokenizerService;if(!i)return e.log?.warn("TokenizerService not available"),null;if(!o.provider||!o.model)return null;let a=o.provider,u=o.model,l=`${a}:${u}`;if(jm.has(l))return jm.get(l);let c=i.getTokenizerConfigForModel(a,u);if(!c)return e.log?.debug(`No tokenizer config for ${a}:${u}, using fallback`),null;try{let d=await i.getTokenizer(c);return jm.set(l,d),e.log?.info(`Created tokenizer for ${a}:${u} - ${d.name}`),d}catch(d){return e.log?.warn(`Failed to create tokenizer for ${a}:${u}: ${d.message}`),null}};e.addHook("onRequest",async o=>{new URL(`http://127.0.0.1${o.url}`).pathname.endsWith("/v1/messages")&&(o.requestStartTime=performance.now())}),e.addHook("onSend",async(o,i,a)=>{let u=o.requestStartTime;if(!u)return;let l=o.id||Date.now().toString(),c;try{let f=o.body?.metadata?.user_id;if(f&&typeof f=="string")try{let p=JSON.parse(f);p.session_id&&(c=p.session_id)}catch{let p=f.match(/_session_([a-f0-9-]+)/i);c=p?p[1]:void 0}}catch{}if(!c)return;let d=await s(o);if(a instanceof ReadableStream){id.set(l,{requestId:l,sessionId:c,startTime:u,lastTokenTime:u,tokenCount:0,tokensPerSecond:0,tokenTimestamps:[],stream:!0});let[f,p]=a.tee();return(async()=>{let g=null,m=async C=>{let E=id.get(l);if(!E)return;let D=performance.now();if(C){let w=(E.lastTokenTime-E.startTime)/1e3;w>0&&(E.tokensPerSecond=Math.round(E.tokenCount/w))}else{let w=D-1e3;E.tokenTimestamps=E.tokenTimestamps.filter(x=>x>w),E.tokensPerSecond=E.tokenTimestamps.length}await hw(E,n,r.outputOptions,C).catch(w=>{e.log?.warn(`Failed to output streaming stats: ${w.message}`)})};try{let C=p.pipeThrough(new TextDecoderStream).pipeThrough(new Z9).getReader();for(g=setInterval(async()=>{id.get(l)&&await m(!1)},1e3);;){let{done:E,value:D}=await C.read();if(E)break;let w=D,x=id.get(l);if(!x)continue;let b=performance.now();if(!x.firstTokenTime&&(w.event==="content_block_start"||w.event==="content_block_delta"||w.event==="text_block"||w.event==="content_block")&&(x.firstTokenTime=b,x.timeToFirstToken=Math.round(b-x.startTime)),w.event==="content_block_delta"&&w.data?.delta){let I=w.data.delta.type,B="";if(I==="text_delta"?B=w.data.delta.text||"":I==="input_json_delta"?B=w.data.delta.partial_json||"":I==="thinking_delta"&&(B=w.data.delta.thinking||""),B){let _=d&&d.encodeText?d.encodeText(B).length:t0(B);x.tokenCount+=_,x.lastTokenTime=b;for(let v=0;v<_;v++)x.tokenTimestamps.push(b)}}w.event==="message_stop"&&(g&&(clearInterval(g),g=null),await m(!0),id.delete(l))}}catch(C){g&&clearInterval(g),C.name!=="AbortError"&&C.code!=="ERR_STREAM_PREMATURE_CLOSE"&&e.log?.warn(`Error processing token stats: ${C.message}`)}})().catch(g=>{console.log(g),e.log?.warn(`Background stats processing failed: ${g.message}`)}),f}let A=performance.now(),h=0;if(a&&typeof a=="string")try{let f=JSON.parse(a);if(f.usage?.output_tokens)h=f.usage.output_tokens;else{let p=f.content||f.message?.content||"";if(d)Array.isArray(p)?h=p.reduce((g,m)=>{if(m.type==="text"){let C=m.text||"";return g+(d.encodeText?d.encodeText(C).length:t0(C))}return g},0):typeof p=="string"&&(h=d.encodeText?d.encodeText(p).length:t0(p));else{let g=Array.isArray(p)?p.map(m=>m.text).join(""):p;h=t0(g)}}}catch{}if(h>0){let f=(A-u)/1e3,p={requestId:l,sessionId:c,startTime:u,lastTokenTime:A,tokenCount:h,tokensPerSecond:f>0?Math.round(h/f):0,timeToFirstToken:Math.round(A-u),stream:!1,tokenTimestamps:[]};await hw(p,n,r.outputOptions,!0)}return a})})};function t0(e){let t=(e.match(/[\u4e00-\u9fa5]/g)||[]).length,r=e.length-t;return Math.ceil(t/1.5+r/4)}async function hw(e,t,r,n=!1){let s=n?"[Token Speed Final]":"[Token Speed]",o={requestId:e.requestId.substring(0,8),sessionId:e.sessionId,stream:e.stream,tokenCount:e.tokenCount,tokensPerSecond:e.tokensPerSecond,timeToFirstToken:e.timeToFirstToken?`${e.timeToFirstToken}ms`:"N/A",duration:`${((e.lastTokenTime-e.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},i={prefix:s,metadata:{sessionId:e.sessionId},...r};for(let a of t)try{await dd.outputToType(a,o,i)}catch(u){console.error(`[TokenSpeedPlugin] Failed to output to ${a}:`,u)}}function X9(e={}){let t=(0,t4.default)({bodyLimit:52428800,...e});return t.setErrorHandler(vM),t.register(r4.default),t}var ej=class{app;configService;providerService;transformerService;tokenizerService;constructor(e={}){let{initialConfig:t,...r}=e;this.app=X9({...r,logger:r.logger??!0}),this.configService=new jb(e),this.transformerService=new ew(this.configService,this.app.log),this.tokenizerService=new uw(this.configService,this.app.log),this.transformerService.initialize().finally(()=>{this.providerService=new Hb(this.configService,this.transformerService,this.app.log)}),this.tokenizerService.initialize().catch(n=>{this.app.log.error(`Failed to initialize TokenizerService: ${n}`)})}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(e==="/"){await this.app.register(async i=>{i.decorate("configService",this.configService),i.decorate("transformerService",this.transformerService),i.decorate("providerService",this.providerService),i.decorate("tokenizerService",this.tokenizerService),i.addHook("preHandler",async(a,u)=>{new URL(`http://127.0.0.1${a.url}`).pathname.endsWith("/v1/messages")&&await lw(a,u,{configService:this.configService,tokenizerService:this.tokenizerService})}),await $b(i)});return}if(!t)throw new Error("options is required");let r=new jb({initialConfig:{providers:t.Providers,Router:t.Router}}),n=new ew(r,this.app.log);await n.initialize();let s=new Hb(r,n,this.app.log),o=new uw(r,this.app.log);await o.initialize(),await this.app.register(async i=>{i.decorate("configService",r),i.decorate("transformerService",n),i.decorate("providerService",s),i.decorate("tokenizerService",o),i.addHook("preHandler",async(a,u)=>{new URL(`http://127.0.0.1${a.url}`).pathname.endsWith("/v1/messages")&&await lw(a,u,{configService:r,tokenizerService:o})}),await $b(i)},{prefix:e})}async start(){try{this.app._server=this,this.app.addHook("preHandler",(r,n,s)=>{if(new URL(`http://127.0.0.1${r.url}`).pathname.endsWith("/v1/messages")&&r.body){let o=r.body;r.log.info({data:o,type:"request body"}),o.stream||(o.stream=!1)}s()}),await this.registerNamespace("/"),this.app.addHook("preHandler",async(r,n)=>{if(new URL(`http://127.0.0.1${r.url}`).pathname.endsWith("/v1/messages")&&r.body)try{let s=r.body;if(!s||!s.model)return n.code(400).send({error:"Missing model in request body"});let[o,...i]=s.model.split(",");s.model=i.join(","),r.provider=o,r.model=i;return}catch(s){return r.log.error({error:s},"Error in modelProviderMiddleware:"),n.code(500).send({error:"Internal server error"})}});let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);let t=async r=>{this.app.log.info(`Received ${r}, shutting down gracefully...`),await this.app.close(),process.exit(0)};process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM"))}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},tj=ej,wu=require("path"),rj=ui(CP()),ns=require("fs"),$m=require("os"),Fi=ui(yd()),nj=ui(TP()),ij=ui(HP()),qs=require("fs"),fd=require("path"),dv=require("os"),mE=(0,fd.join)((0,dv.homedir)(),".claude-code-router","data"),gl=(0,fd.join)(mE,"usage.jsonl"),xc=null,dw=0;function sj(){(0,qs.existsSync)(mE)||(0,qs.mkdirSync)(mE,{recursive:!0})}function py(){if(!(0,qs.existsSync)(gl))return[];let e=(0,qs.statSync)(gl).mtimeMs;if(xc&&e===dw)return xc;let t=(0,qs.readFileSync)(gl,"utf-8"),r=[];for(let n of t.split(`
1203
+ `,t.enqueue(r)}})}};jx();Hx();Gx();IM();var id=new Map,jm=new Map,hv={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,K9.default)(async(e,t)=>{let r={reporter:["console","temp-file"],...t},n=Array.isArray(r.reporter)?r.reporter:[r.reporter];if(r.outputHandlers&&r.outputHandlers.length>0)dd.registerHandlers(r.outputHandlers);else{let o=[];for(let i of n)i==="console"?o.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?o.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");o.length>0&&dd.registerHandlers(o)}r.outputOptions&&dd.setDefaultOptions(r.outputOptions);let s=async o=>{let i=e.tokenizerService;if(!i)return e.log?.warn("TokenizerService not available"),null;if(!o.provider||!o.model)return null;let a=o.provider,u=o.model,l=`${a}:${u}`;if(jm.has(l))return jm.get(l);let c=i.getTokenizerConfigForModel(a,u);if(!c)return e.log?.debug(`No tokenizer config for ${a}:${u}, using fallback`),null;try{let d=await i.getTokenizer(c);return jm.set(l,d),e.log?.info(`Created tokenizer for ${a}:${u} - ${d.name}`),d}catch(d){return e.log?.warn(`Failed to create tokenizer for ${a}:${u}: ${d.message}`),null}};e.addHook("onRequest",async o=>{new URL(`http://127.0.0.1${o.url}`).pathname.endsWith("/v1/messages")&&(o.requestStartTime=performance.now())}),e.addHook("onSend",async(o,i,a)=>{let u=o.requestStartTime;if(!u)return;let l=o.id||Date.now().toString(),c;try{let f=o.body?.metadata?.user_id;if(f&&typeof f=="string")try{let p=JSON.parse(f);p.session_id&&(c=p.session_id)}catch{let p=f.match(/_session_([a-f0-9-]+)/i);c=p?p[1]:void 0}}catch{}if(!c)return;let d=await s(o);if(a instanceof ReadableStream){id.set(l,{requestId:l,sessionId:c,startTime:u,lastTokenTime:u,tokenCount:0,tokensPerSecond:0,tokenTimestamps:[],stream:!0});let[f,p]=a.tee();return(async()=>{let g=null,m=async C=>{let E=id.get(l);if(!E)return;let D=performance.now();if(C){let w=E.firstTokenTime?E.firstTokenTime-E.startTime:0,x=(E.lastTokenTime-E.startTime-w)/1e3;x>0&&(E.tokensPerSecond=Math.round(E.tokenCount/x))}else{let w=D-1e3;E.tokenTimestamps=E.tokenTimestamps.filter(x=>x>w),E.tokensPerSecond=E.tokenTimestamps.length}await hw(E,n,r.outputOptions,C).catch(w=>{e.log?.warn(`Failed to output streaming stats: ${w.message}`)})};try{let C=p.pipeThrough(new TextDecoderStream).pipeThrough(new Z9).getReader();for(g=setInterval(async()=>{id.get(l)&&await m(!1)},1e3);;){let{done:E,value:D}=await C.read();if(E)break;let w=D,x=id.get(l);if(!x)continue;let b=performance.now();if(!x.firstTokenTime&&(w.event==="content_block_start"||w.event==="content_block_delta"||w.event==="text_block"||w.event==="content_block")&&(x.firstTokenTime=b,x.timeToFirstToken=Math.round(b-x.startTime)),w.event==="content_block_delta"&&w.data?.delta){let I=w.data.delta.type,B="";if(I==="text_delta"?B=w.data.delta.text||"":I==="input_json_delta"?B=w.data.delta.partial_json||"":I==="thinking_delta"&&(B=w.data.delta.thinking||""),B){let _=d&&d.encodeText?d.encodeText(B).length:t0(B);x.tokenCount+=_,x.lastTokenTime=b;for(let v=0;v<_;v++)x.tokenTimestamps.push(b)}}w.event==="message_stop"&&(g&&(clearInterval(g),g=null),await m(!0),id.delete(l))}}catch(C){g&&clearInterval(g),C.name!=="AbortError"&&C.code!=="ERR_STREAM_PREMATURE_CLOSE"&&e.log?.warn(`Error processing token stats: ${C.message}`)}})().catch(g=>{console.log(g),e.log?.warn(`Background stats processing failed: ${g.message}`)}),f}let A=performance.now(),h=0;if(a&&typeof a=="string")try{let f=JSON.parse(a);if(f.usage?.output_tokens)h=f.usage.output_tokens;else{let p=f.content||f.message?.content||"";if(d)Array.isArray(p)?h=p.reduce((g,m)=>{if(m.type==="text"){let C=m.text||"";return g+(d.encodeText?d.encodeText(C).length:t0(C))}return g},0):typeof p=="string"&&(h=d.encodeText?d.encodeText(p).length:t0(p));else{let g=Array.isArray(p)?p.map(m=>m.text).join(""):p;h=t0(g)}}}catch{}if(h>0){let f=Math.round(A-u),p=A-u-f>0?(A-u-f)/1e3:(A-u)/1e3,g={requestId:l,sessionId:c,startTime:u,lastTokenTime:A,tokenCount:h,tokensPerSecond:p>0?Math.round(h/p):0,timeToFirstToken:f,stream:!1,tokenTimestamps:[]};await hw(g,n,r.outputOptions,!0)}return a})})};function t0(e){let t=(e.match(/[\u4e00-\u9fa5]/g)||[]).length,r=e.length-t;return Math.ceil(t/1.5+r/4)}async function hw(e,t,r,n=!1){let s=n?"[Token Speed Final]":"[Token Speed]",o={requestId:e.requestId.substring(0,8),sessionId:e.sessionId,stream:e.stream,tokenCount:e.tokenCount,tokensPerSecond:e.tokensPerSecond,timeToFirstToken:e.timeToFirstToken?`${e.timeToFirstToken}ms`:"N/A",duration:`${((e.lastTokenTime-e.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},i={prefix:s,metadata:{sessionId:e.sessionId},...r};for(let a of t)try{await dd.outputToType(a,o,i)}catch(u){console.error(`[TokenSpeedPlugin] Failed to output to ${a}:`,u)}}function X9(e={}){let t=(0,t4.default)({bodyLimit:52428800,...e});return t.setErrorHandler(vM),t.register(r4.default),t}var ej=class{app;configService;providerService;transformerService;tokenizerService;constructor(e={}){let{initialConfig:t,...r}=e;this.app=X9({...r,logger:r.logger??!0}),this.configService=new jb(e),this.transformerService=new ew(this.configService,this.app.log),this.tokenizerService=new uw(this.configService,this.app.log),this.transformerService.initialize().finally(()=>{this.providerService=new Hb(this.configService,this.transformerService,this.app.log)}),this.tokenizerService.initialize().catch(n=>{this.app.log.error(`Failed to initialize TokenizerService: ${n}`)})}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(e==="/"){await this.app.register(async i=>{i.decorate("configService",this.configService),i.decorate("transformerService",this.transformerService),i.decorate("providerService",this.providerService),i.decorate("tokenizerService",this.tokenizerService),i.addHook("preHandler",async(a,u)=>{new URL(`http://127.0.0.1${a.url}`).pathname.endsWith("/v1/messages")&&await lw(a,u,{configService:this.configService,tokenizerService:this.tokenizerService})}),await $b(i)});return}if(!t)throw new Error("options is required");let r=new jb({initialConfig:{providers:t.Providers,Router:t.Router}}),n=new ew(r,this.app.log);await n.initialize();let s=new Hb(r,n,this.app.log),o=new uw(r,this.app.log);await o.initialize(),await this.app.register(async i=>{i.decorate("configService",r),i.decorate("transformerService",n),i.decorate("providerService",s),i.decorate("tokenizerService",o),i.addHook("preHandler",async(a,u)=>{new URL(`http://127.0.0.1${a.url}`).pathname.endsWith("/v1/messages")&&await lw(a,u,{configService:r,tokenizerService:o})}),await $b(i)},{prefix:e})}async start(){try{this.app._server=this,this.app.addHook("preHandler",(r,n,s)=>{if(new URL(`http://127.0.0.1${r.url}`).pathname.endsWith("/v1/messages")&&r.body){let o=r.body;r.log.info({data:o,type:"request body"}),o.stream||(o.stream=!1)}s()}),await this.registerNamespace("/"),this.app.addHook("preHandler",async(r,n)=>{if(new URL(`http://127.0.0.1${r.url}`).pathname.endsWith("/v1/messages")&&r.body)try{let s=r.body;if(!s||!s.model)return n.code(400).send({error:"Missing model in request body"});let[o,...i]=s.model.split(",");s.model=i.join(","),r.provider=o,r.model=i;return}catch(s){return r.log.error({error:s},"Error in modelProviderMiddleware:"),n.code(500).send({error:"Internal server error"})}});let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);let t=async r=>{this.app.log.info(`Received ${r}, shutting down gracefully...`),await this.app.close(),process.exit(0)};process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM"))}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},tj=ej,wu=require("path"),rj=ui(CP()),ns=require("fs"),$m=require("os"),Fi=ui(yd()),nj=ui(TP()),ij=ui(HP()),qs=require("fs"),fd=require("path"),dv=require("os"),mE=(0,fd.join)((0,dv.homedir)(),".claude-code-router","data"),gl=(0,fd.join)(mE,"usage.jsonl"),xc=null,dw=0;function sj(){(0,qs.existsSync)(mE)||(0,qs.mkdirSync)(mE,{recursive:!0})}function py(){if(!(0,qs.existsSync)(gl))return[];let e=(0,qs.statSync)(gl).mtimeMs;if(xc&&e===dw)return xc;let t=(0,qs.readFileSync)(gl,"utf-8"),r=[];for(let n of t.split(`
1204
1204
  `)){let s=n.trim();if(s)try{r.push(JSON.parse(s))}catch{}}return xc=r,dw=e,r}function Av(e){let t={totalRequests:e.length,successCount:0,errorCount:0,totalInputTokens:0,totalOutputTokens:0,totalCacheReadInputTokens:0,totalCacheCreationInputTokens:0,avgTtft:null,avgTokensPerSecond:null,byModel:{},byProvider:{},byScenario:{},byFamily:{},byDay:{}},r=0,n=0,s=0,o=0;for(let i of e){i.status==="success"?t.successCount++:t.errorCount++,t.totalInputTokens+=i.inputTokens,t.totalOutputTokens+=i.outputTokens,t.totalCacheReadInputTokens+=i.cacheReadInputTokens||0,t.totalCacheCreationInputTokens+=i.cacheCreationInputTokens||0,i.ttft!=null&&(r+=i.ttft,n++),i.tokensPerSecond!=null&&(s+=i.tokensPerSecond,o++);let a=i.timestamp.slice(0,10);if(sd(t.byModel,i.model,i.inputTokens,i.outputTokens,i.cacheReadInputTokens||0,i.cacheCreationInputTokens||0),sd(t.byProvider,i.provider,i.inputTokens,i.outputTokens,i.cacheReadInputTokens||0,i.cacheCreationInputTokens||0),sd(t.byScenario,i.scenarioType,i.inputTokens,i.outputTokens,i.cacheReadInputTokens||0,i.cacheCreationInputTokens||0),i.modelFamily){let u=`${i.modelFamily}/${i.scenarioType}`;sd(t.byFamily,u,i.inputTokens,i.outputTokens,i.cacheReadInputTokens||0,i.cacheCreationInputTokens||0)}sd(t.byDay,a,i.inputTokens,i.outputTokens,i.cacheReadInputTokens||0,i.cacheCreationInputTokens||0)}return n>0&&(t.avgTtft=Math.round(r/n)),o>0&&(t.avgTokensPerSecond=Math.round(s/o)),t}function sd(e,t,r,n,s,o){e[t]||(e[t]={count:0,inputTokens:0,outputTokens:0,cacheReadInputTokens:0,cacheCreationInputTokens:0}),e[t].count++,e[t].inputTokens+=r,e[t].outputTokens+=n,e[t].cacheReadInputTokens+=s,e[t].cacheCreationInputTokens+=o}function oj(e){sj(),(0,qs.appendFileSync)(gl,JSON.stringify(e)+`
1205
1205
  `,"utf-8"),xc=null}function aj(e){let t=py();e.startTime&&(t=t.filter(a=>a.timestamp>=e.startTime)),e.endTime&&(t=t.filter(a=>a.timestamp<=e.endTime)),e.model&&(t=t.filter(a=>a.model===e.model)),e.provider&&(t=t.filter(a=>a.provider===e.provider)),e.scenario&&(t=t.filter(a=>a.scenarioType===e.scenario)),e.sessionId&&(t=t.filter(a=>a.sessionId===e.sessionId)),t.sort((a,u)=>u.timestamp.localeCompare(a.timestamp));let r=Av(t),n=e.page||1,s=e.pageSize||50,o=t.length,i=(n-1)*s;return{records:t.slice(i,i+s),summary:r,total:o,page:n,pageSize:s}}function uj(e,t){let r=py();return e&&(r=r.filter(n=>n.timestamp>=e)),t&&(r=r.filter(n=>n.timestamp<=t)),Av(r)}function lj(e){if(!(0,qs.existsSync)(gl))return;if(!e){(0,qs.writeFileSync)(gl,"","utf-8"),xc=[];return}let t=py().filter(r=>r.timestamp>=e);(0,qs.writeFileSync)(gl,t.map(r=>JSON.stringify(r)).join(`
1206
1206
  `)+(t.length>0?`
@@ -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"?(r0.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")&&(r0.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++)})})}},Qj=new Rj,Nj=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}},pv=new Nj;pv.registerAgent(Qj);var Ym=pv,Oj=require("node:events"),yw=require("node:perf_hooks");function Lj(){let{ProviderHealthStore:e}=qP();return new e}var Dw=new Oj.EventEmitter;function Cw(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 Jm(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 Pj(){let e=(0,II.homedir)(),t=(0,xI.join)(e,".claude.json");if(!(0,GP.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,VP.writeFile)(t,JSON.stringify(r,null,2))}}async function Mj(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":gE.registerPlugin(hv,{enabled:o,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${s}`);break}}await gE.enablePlugins(e)}async function gv(e={}){await Pj(),await ZE();let t=await vI(),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,h)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let p=f.getFullYear()+""+a(f.getMonth()+1),g=a(f.getDate()),m=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${g}${m}${C}${a(f.getSeconds())}${h?`_${h}`:""}.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:Ij(u,{path:Hm.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,Hm.listPresets)(),d=await hj({jsonPath:Hm.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:s,PORT:i,LOG_FILE:(0,xI.join)((0,II.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return await Promise.allSettled(c.map(async A=>await d.registerNamespace(`/preset/${A.name}`,A.config))),await Mj(d,t),d.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=yw.performance.now())}),d.addHook("preHandler",async(A,h)=>new Promise((f,p)=>{let g=m=>{m?p(m):f()};dj(t)(A,h,g).catch(p)})),d.addHook("preHandler",async(A,h)=>{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("/",""))}),d.addHook("preHandler",async(A,h)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of Ym.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(g=>({name:g.name,description:g.description,input_schema:g.input_schema})))));f.length&&(A.agents=f)}}),d.addHook("onError",async(A,h,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",Dw.emit("onError",A,h,f)}),d.addHook("onSend",(A,h,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let g=Cw(A);if(f instanceof ReadableStream){if(A.agents){let E=new AbortController,D=f.pipeThrough(new Vm),w,x=-1,b="",I="",B="",_=[],v=[];return p(null,vj(D,async(F,R)=>{try{if(F.event==="content_block_start"&&F?.data?.content_block?.name){let O=A.agents.find(k=>Ym.getAgent(k)?.tools.get(F.data.content_block.name));if(O){w=Ym.getAgent(O),x=F.data.index,b=F.data.content_block.name,B=F.data.content_block.id;return}}if(x>-1&&F.data.index===x&&F.data?.delta?.type==="input_json_delta"){I+=F.data?.delta?.partial_json;return}if(x>-1&&F.data.index===x&&F.data.type==="content_block_stop"){try{let O=_j.default.parse(I);v.push({type:"tool_use",id:B,name:b,input:O});let k=await w?.tools.get(b)?.handler(O,{req:A,config:t});_.push({tool_use_id:B,type:"tool_result",content:k}),w=void 0,x=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(F.event==="message_delta"&&_.length){A.body.messages.push({role:"assistant",content:v}),A.body.messages.push({role:"user",content:_});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 k=O.body.pipeThrough(new Vm).getReader();for(;;)try{let{value:Q,done:M}=await k.read();if(M)break;let G=Q;if(["message_start","message_stop"].includes(G.event))continue;if(!R.desiredSize)break;R.enqueue(G)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){E.abort();break}throw Q}return}return F}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){E.abort();return}throw O}}).pipeThrough(new xj))}let[m,C]=f.tee();return(async E=>{let D=E.pipeThrough(new TextDecoderStream).pipeThrough(new Vm).getReader();try{for(;;){let{done:w,value:x}=await D.read();if(w)break;let b=x.event,I=x.data;if(I?.usage){let B={...hd.get(g)||{},...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}),hd.put(g,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,m)}if(hd.put(g,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)}),d.addHook("onSend",async(A,h,f)=>{if(Dw.emit("onSend",A,h,f),h.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}),d.addHook("onResponse",async(A,h)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=Cw(A),p=hd.get(f),g=cj(f),m=Lj(),C,E;if(h.statusCode>=400){C=A.errorMessage||h.errorMessage||A.error?.message||A.error?.toString?.()||void 0,E=A.errorResponseBody;let D=Jm(A);m.recordFailure(A.provider||"",D,C)}else{let D=Jm(A);m.recordSuccess(A.provider||"",D)}oj({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:Jm(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:A.tokenCount||0,outputTokens:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:g.ttft,tokensPerSecond:g.tokensPerSecond,durationMs:A.requestStartTime?Math.round(yw.performance.now()-A.requestStartTime):0,status:h.statusCode<400?"success":"error",errorMessage:C,responseBody:E})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{d.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,h)=>{d.app.log.error("Unhandled rejection at:",h,"reason:",A)}),d}async function Uj(){let e=await gv();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===gy&&Uj().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function Cv(e){try{let{stdout:t}=await Dv("npm view @wengine-ai/claude-code-router version"),r=t.trim();return{hasUpdate:jj(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function bv(){try{let{stdout:e,stderr:t}=await Dv("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 jj(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 Ev,yv,Dv,wv=Mf(()=>{"use strict";Ev=require("child_process"),yv=require("util"),Dv=(0,yv.promisify)(Ev.exec)});var X0,my=Mf(()=>{X0="2.0.36"});var yy=Fr(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});var Bv=require("child_process"),Hj=1024*1024,Iv={exec(e,t){let r={maxBuffer:2*Hj,windowsHide:!0};(0,Bv.exec)(e,r,t)},spawn(e,t,r){return(0,Bv.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"?(r0.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")&&(r0.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++)})})}},Qj=new Rj,Nj=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}},pv=new Nj;pv.registerAgent(Qj);var Ym=pv,Oj=require("node:events"),yw=require("node:perf_hooks");function Lj(){let{ProviderHealthStore:e}=qP();return new e}var Dw=new Oj.EventEmitter;function Cw(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 Jm(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 Pj(){let e=(0,II.homedir)(),t=(0,xI.join)(e,".claude.json");if(!(0,GP.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,VP.writeFile)(t,JSON.stringify(r,null,2))}}async function Mj(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":gE.registerPlugin(hv,{enabled:o,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${s}`);break}}await gE.enablePlugins(e)}async function gv(e={}){await Pj(),await ZE();let t=await vI(),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,h)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let p=f.getFullYear()+""+a(f.getMonth()+1),g=a(f.getDate()),m=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${g}${m}${C}${a(f.getSeconds())}${h?`_${h}`:""}.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:Ij(u,{path:Hm.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,Hm.listPresets)(),d=await hj({jsonPath:Hm.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:s,PORT:i,LOG_FILE:(0,xI.join)((0,II.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return await Promise.allSettled(c.map(async A=>await d.registerNamespace(`/preset/${A.name}`,A.config))),await Mj(d,t),d.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=yw.performance.now())}),d.addHook("preHandler",async(A,h)=>new Promise((f,p)=>{let g=m=>{m?p(m):f()};dj(t)(A,h,g).catch(p)})),d.addHook("preHandler",async(A,h)=>{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("/",""))}),d.addHook("preHandler",async(A,h)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of Ym.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(g=>({name:g.name,description:g.description,input_schema:g.input_schema})))));f.length&&(A.agents=f)}}),d.addHook("onError",async(A,h,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",Dw.emit("onError",A,h,f)}),d.addHook("onSend",(A,h,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let g=Cw(A);if(f instanceof ReadableStream){if(A.agents){let E=new AbortController,D=f.pipeThrough(new Vm),w,x=-1,b="",I="",B="",_=[],v=[];return p(null,vj(D,async(F,R)=>{try{if(F.event==="content_block_start"&&F?.data?.content_block?.name){let O=A.agents.find(k=>Ym.getAgent(k)?.tools.get(F.data.content_block.name));if(O){w=Ym.getAgent(O),x=F.data.index,b=F.data.content_block.name,B=F.data.content_block.id;return}}if(x>-1&&F.data.index===x&&F.data?.delta?.type==="input_json_delta"){I+=F.data?.delta?.partial_json;return}if(x>-1&&F.data.index===x&&F.data.type==="content_block_stop"){try{let O=_j.default.parse(I);v.push({type:"tool_use",id:B,name:b,input:O});let k=await w?.tools.get(b)?.handler(O,{req:A,config:t});_.push({tool_use_id:B,type:"tool_result",content:k}),w=void 0,x=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(F.event==="message_delta"&&_.length){A.body.messages.push({role:"assistant",content:v}),A.body.messages.push({role:"user",content:_});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 k=O.body.pipeThrough(new Vm).getReader();for(;;)try{let{value:Q,done:M}=await k.read();if(M)break;let G=Q;if(["message_start","message_stop"].includes(G.event))continue;if(!R.desiredSize)break;R.enqueue(G)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){E.abort();break}throw Q}return}return F}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){E.abort();return}throw O}}).pipeThrough(new xj))}let[m,C]=f.tee();return(async E=>{let D=E.pipeThrough(new TextDecoderStream).pipeThrough(new Vm).getReader();try{for(;;){let{done:w,value:x}=await D.read();if(w)break;let b=x.event,I=x.data;if(I?.usage){let B={...hd.get(g)||{},...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}),hd.put(g,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,m)}if(hd.put(g,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)}),d.addHook("onSend",async(A,h,f)=>{if(Dw.emit("onSend",A,h,f),h.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}),d.addHook("onResponse",async(A,h)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=Cw(A),p=hd.get(f),g=cj(f),m=Lj(),C,E;if(h.statusCode>=400){C=A.errorMessage||h.errorMessage||A.error?.message||A.error?.toString?.()||void 0,E=A.errorResponseBody;let D=Jm(A);m.recordFailure(A.provider||"",D,C)}else{let D=Jm(A);m.recordSuccess(A.provider||"",D)}oj({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:Jm(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:A.tokenCount||0,outputTokens:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:g.ttft,tokensPerSecond:g.tokensPerSecond,durationMs:A.requestStartTime?Math.round(yw.performance.now()-A.requestStartTime):0,status:h.statusCode<400?"success":"error",errorMessage:C,responseBody:E})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{d.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,h)=>{d.app.log.error("Unhandled rejection at:",h,"reason:",A)}),d}async function Uj(){let e=await gv();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===gy&&Uj().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function Cv(e){try{let{stdout:t}=await Dv("npm view @wengine-ai/claude-code-router version"),r=t.trim();return{hasUpdate:jj(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function bv(){try{let{stdout:e,stderr:t}=await Dv("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 jj(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 Ev,yv,Dv,wv=Mf(()=>{"use strict";Ev=require("child_process"),yv=require("util"),Dv=(0,yv.promisify)(Ev.exec)});var X0,my=Mf(()=>{X0="2.0.37"});var yy=Fr(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});var Bv=require("child_process"),Hj=1024*1024,Iv={exec(e,t){let r={maxBuffer:2*Hj,windowsHide:!0};(0,Bv.exec)(e,r,t)},spawn(e,t,r){return(0,Bv.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=Iv.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})}};Ey.default=Iv});var vv=Fr((xv,ep)=>{(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof ep=="object"&&ep.exports?ep.exports=t():e.log=t()})(xv,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 g=f[p];if(typeof g.bind=="function")return g.bind(f);try{return Function.prototype.bind.call(g,f)}catch{return function(){return Function.prototype.apply.apply(g,[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 g=n[p];this[g]=p<f?e:this.methodFactory(g,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 d(f,p,g){return u(f)||c.apply(this,arguments)}function A(f,p){var g=this,m,C,E,D="loglevel";typeof f=="string"?D+=":"+f:typeof f=="symbol"&&(D=void 0);function w(_){var v=(n[_]||"silent").toUpperCase();if(!(typeof window===t||!D)){try{window.localStorage[D]=v;return}catch{}try{window.document.cookie=encodeURIComponent(D)+"="+v+";"}catch{}}}function x(){var _;if(!(typeof window===t||!D)){try{_=window.localStorage[D]}catch{}if(typeof _===t)try{var v=window.document.cookie,F=encodeURIComponent(D),R=v.indexOf(F+"=");R!==-1&&(_=/^([^;]+)/.exec(v.slice(R+F.length+1))[1])}catch{}return g.levels[_]===void 0&&(_=void 0),_}}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(_){var v=_;if(typeof v=="string"&&g.levels[v.toUpperCase()]!==void 0&&(v=g.levels[v.toUpperCase()]),typeof v=="number"&&v>=0&&v<=g.levels.SILENT)return v;throw new TypeError("log.setLevel() called with invalid level: "+_)}g.name=f,g.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},g.methodFactory=p||d,g.getLevel=function(){return E??C??m},g.setLevel=function(_,v){return E=I(_),v!==!1&&w(E),l.call(g)},g.setDefaultLevel=function(_){C=I(_),x()||g.setLevel(_,!1)},g.resetLevel=function(){E=null,b(),l.call(g)},g.enableAll=function(_){g.setLevel(g.levels.TRACE,_)},g.disableAll=function(_){g.setLevel(g.levels.SILENT,_)},g.rebuild=function(){if(o!==g&&(m=I(o.getLevel())),l.call(g),o===g)for(var _ in s)s[_].rebuild()},m=I(o?o.getLevel():"WARN");var B=x();B!=null&&(E=I(B)),l.call(g)}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 g=s[p];return g||(g=s[p]=new A(p,o.methodFactory)),g};var h=typeof window!==t?window.log:void 0;return o.noConflict=function(){return typeof window!==t&&window.log===o&&(window.log=h),o},o.getLoggers=function(){return s},o.default=o,o})});var Dy=Fr(Pd=>{"use strict";var qj=Pd&&Pd.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Pd,"__esModule",{value:!0});var Gj=qj(vv());Pd.default=Gj.default});var Fv=Fr(Qo=>{"use strict";var Vj=Qo&&Qo.__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]})),Yj=Qo&&Qo.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),_v=Qo&&Qo.__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"&&Vj(r,t,n[s]);return Yj(r,t),r}})(),Sv=Qo&&Qo.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Qo,"__esModule",{value:!0});var Jj=_v(require("os")),tp=_v(require("fs")),Gs=Sv(yy()),zj=Sv(Dy()),Wj=e=>new Promise((t,r)=>{tp.existsSync(e)?t():tp.mkdir(e,n=>{n?r(n):t()})}),Lc={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,d=Gs.default.extractColumns(l,[0,3,c],10).filter(A=>!!String(A[0]).match(/^(udp|tcp)/)).find(A=>{let h=String(A[1]).match(/\.(\d+)$/);return!!(h&&h[1]===String(e))});d&&d[2].length?t(parseInt(d[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&&zj.default.warn(a);let u=Gs.default.stripLine(o.toString(),2),l=Gs.default.extractColumns(u,[3,6],7).find(c=>{let d=String(c[0]).match(/:(\d+)$/);return!!(d&&d[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=Jj.tmpdir()+"/.find-process",s=n+"/"+process.pid,o='netstat -tunp >> "'+s+'"';Wj(n).then(()=>{Gs.default.exec(o,()=>{tp.readFile(s,"utf8",(i,a)=>{if(tp.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`))}})})})})}};Lc.freebsd=Lc.darwin;Lc.sunos=Lc.darwin;function Kj(e){let t=process.platform;return new Promise((r,n)=>{if(!(t in Lc))return n(new Error(`platform ${t} is unsupported`));let s=Lc[t];s(e).then(r,n)})}Qo.default=Kj});var Rv=Fr(No=>{"use strict";var Zj=No&&No.__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]})),Xj=No&&No.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),e7=No&&No.__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"&&Zj(r,t,n[s]);return Xj(r,t),r}})(),t7=No&&No.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(No,"__esModule",{value:!0});var rp=e7(require("path")),ku=t7(yy());function Cy(e,t){return t?e&&e.match?e.match(t)!==null:!1:!0}function kv(e){let t=e.split(rp.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(rp.sep)}function Tv(e){if(process.platform==="darwin"){let t=e.indexOf(".app/");if(t>=0)return rp.basename(e.substring(0,t))}return rp.basename(e)}var bl={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",ku.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=ku.default.stripLine(o.toString(),1),c=ku.default.extractColumns(u,[0,1,2,3,4],5).filter(d=>d[0]&&e.pid!==void 0?d[0]===String(e.pid):d[4]&&e.name?Cy(d[4],e.name):!!d[0]).map(d=>{let A=String(d[4]),h=kv(A);return{pid:parseInt(d[0],10),ppid:parseInt(d[1],10),uid:parseInt(d[2],10),gid:parseInt(d[3],10),name:Tv(h),bin:h,cmd:d[4]}});e.config.strict&&e.name&&(c=c.filter(d=>d.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=ku.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=ku.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:Cy(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)=>{ku.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=ku.default.stripLine(o.toString(),1),c=ku.default.extractColumns(u,[0,3],4).filter(d=>d[0]&&e.pid!==void 0?d[0]===String(e.pid):d[1]&&e.name?Cy(d[1],e.name):!!d[0]).map(d=>{let A=String(d[1]),h=kv(A);return{pid:parseInt(d[0],10),ppid:0,name:Tv(h),bin:h,cmd:d[1]}});e.config.strict&&e.name&&(c=c.filter(d=>d.name===e.name)),t(c)}})})}};bl.linux=bl.darwin;bl.sunos=bl.darwin;bl.freebsd=bl.darwin;function r7(e){let t=process.platform,r=bl[t];return r?r(e):Promise.reject(new Error(`Platform "${t}" is not supported`))}No.default=r7});var Nv=Fr(Md=>{"use strict";var wy=Md&&Md.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Md,"__esModule",{value:!0});var n7=wy(Fv()),Qv=wy(Rv()),i7=wy(Dy()),by={port(e,t){return(0,n7.default)(e).then(r=>by.pid(r,t),()=>[])},pid(e,t){return(0,Qv.default)({pid:e,config:t})},name(e,t){return(0,Qv.default)({name:e,config:t,skipSelf:!0})}};function s7(e,t,r){let n=Object.assign({logLevel:"warn",strict:typeof r=="boolean"?r:!1},typeof r=="object"?r:{});return n.logLevel&&i7.default.setLevel(n.logLevel),new Promise((s,o)=>{if(!(e in by))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")):by[e](t,n).then(s,o)}})}Md.default=s7});var Lv=Fr(Ov=>{"use strict";Object.defineProperty(Ov,"__esModule",{value:!0})});var Pv=Fr(Oo=>{"use strict";var o7=Oo&&Oo.__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]})),a7=Oo&&Oo.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&o7(t,e,r)},u7=Oo&&Oo.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Oo,"__esModule",{value:!0});Oo.default=void 0;var l7=Nv();Object.defineProperty(Oo,"default",{enumerable:!0,get:function(){return u7(l7).default}});a7(Lv(),Oo)});function Uv(){let e=0;(0,cs.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,cs.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e++,(0,cs.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function By(){let e=0;(0,cs.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,cs.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e=Math.max(0,e-1),(0,cs.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function jv(){return(0,cs.existsSync)(Vi.REFERENCE_COUNT_FILE)&&parseInt((0,cs.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0}function wl(){if(!(0,cs.existsSync)(Vi.PID_FILE))return!1;let e;try{let t=(0,cs.readFileSync)(Vi.PID_FILE,"utf-8");if(e=parseInt(t,10),isNaN(e))return Ha(),!1}catch{return!1}try{if(process.platform==="win32"){let t=`tasklist /FI "PID eq ${e}"`;return(0,Mv.execSync)(t,{stdio:"pipe"}).toString().includes(e.toString())?!0:(Ha(),!1)}else return process.kill(e,0),!0}catch{return Ha(),!1}}function Ha(){if((0,cs.existsSync)(Vi.PID_FILE))try{require("fs").unlinkSync(Vi.PID_FILE)}catch{}}function $v(){if(!(0,cs.existsSync)(Vi.PID_FILE))return null;try{let e=parseInt((0,cs.readFileSync)(Vi.PID_FILE,"utf-8"));return isNaN(e)?null:e}catch{return null}}async function np(){let e=$v(),t=await wl(),n=(await ys()).PORT||3456;return{running:t,pid:e,port:n,endpoint:`http://127.0.0.1:${n}`,pidFile:Vi.PID_FILE,referenceCount:jv()}}async function Hv(){if(jv()===0){let t=$v();if(t&&await wl())try{process.kill(t,"SIGTERM")}catch{}}}var cs,Vi,c7,Mv,Ud=Mf(()=>{"use strict";cs=require("fs"),Vi=en(to());Tu();c7=en(Pv()),Mv=require("child_process")});var Kv={};_1(Kv,{backupConfigFile:()=>zv,getSettingsPath:()=>Sy,initConfig:()=>h7,initDir:()=>Jv,readConfigFile:()=>ys,restartService:()=>_y,run:()=>vy,writeConfigFile:()=>Wv});var Ts,qv,Ru,Gv,Vv,si,Yv,Pc,xy,Iy,jd,Jv,ys,zv,Wv,h7,vy,_y,Sy,Tu=Mf(()=>{"use strict";Ts=en(require("node:fs/promises")),qv=en(qf()),Ru=en(require("node:path")),Gv=require("node:crypto"),Vv=en(require("node:os")),si=en(to()),Yv=en(mv()),Pc=require("fs");wv();my();xy=require("child_process");Ud();Iy=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(Iy);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=Iy(n);return t}return e},jd=async e=>{try{await Ts.default.access(e)}catch{await Ts.default.mkdir(e,{recursive:!0})}},Jv=async()=>{await jd(si.HOME_DIR),await jd(si.PLUGINS_DIR),await jd(si.PRESETS_DIR),await jd(Ru.default.join(si.HOME_DIR,"logs"))},ys=async()=>{try{let e=await Ts.default.readFile(si.CONFIG_FILE,"utf-8");try{let t=qv.default.parse(e);return Iy(t)}catch(t){console.error(`Failed to parse config file at ${si.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 Jv();let t=await zv();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await Wv(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 ${si.CONFIG_FILE}`),console.error("Error details:",e.message),process.exit(1)}},zv=async()=>{try{if(await Ts.default.access(si.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${si.CONFIG_FILE}.${e}.bak`;await Ts.default.copyFile(si.CONFIG_FILE,t);try{let r=Ru.default.dirname(si.CONFIG_FILE),n=Ru.default.basename(si.CONFIG_FILE),o=(await Ts.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=Ru.default.join(r,o[i]);await Ts.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},Wv=async e=>{await jd(si.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await Ts.default.writeFile(si.CONFIG_FILE,t)},h7=async()=>{let e=await ys();return Object.assign(process.env,e),e},vy=async(e=[])=>{if(wl()){console.log("claude-code-router server is running");return}let r=await(0,Yv.getServer)(),n=r.app;(0,Pc.writeFileSync)(si.PID_FILE,process.pid.toString()),n.post("/api/update/perform",async()=>await bv()),n.get("/api/update/check",async()=>await Cv(X0)),n.post("/api/restart",async()=>(setTimeout(async()=>{(0,xy.spawn)("ccr",["restart"],{detached:!0,stdio:"ignore"}).unref()},100),{success:!0,message:"Service restart initiated"})),await r.start()},_y=async()=>{try{let r=parseInt((0,Pc.readFileSync)(si.PID_FILE,"utf-8"));if(process.kill(r),Ha(),(0,Pc.existsSync)(si.REFERENCE_COUNT_FILE))try{await Ts.default.unlink(si.REFERENCE_COUNT_FILE)}catch{}console.log("claude code router service has been stopped.")}catch{console.log("Service was not running or failed to stop."),Ha()}console.log("Starting claude code router service...");let e=Ru.default.join(__dirname,"cli.js"),t=(0,xy.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.")},Sy=async e=>{let t=(0,Gv.createHash)("sha256").update(e,"utf-8").digest("hex"),r=Ru.default.join(Vv.default.tmpdir(),"claude-code-router"),n=`ccr-settings-${t}.json`,s=Ru.default.join(r,n);try{await Ts.default.access(r)}catch{await Ts.default.mkdir(r,{recursive:!0})}try{return await Ts.default.access(s),s}catch{return await Ts.default.writeFile(s,e,"utf-8"),s}}});var Hd=Fr((lX,i_)=>{var f7=require("node:tty"),p7=f7?.WriteStream?.prototype?.hasColors?.()??!1,Dn=(e,t)=>{if(!p7)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);i_.exports=mn});var h_=Fr((_X,c_)=>{"use strict";c_.exports=w7;function b7(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 w7(e){let t=b7(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 A_=Fr((SX,d_)=>{"use strict";d_.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 dp=Fr((FX,f_)=>{"use strict";var B7=A_();f_.exports=e=>typeof e=="string"?e.replace(B7(),""):e});var g_=Fr((kX,Qy)=>{"use strict";var p_=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);Qy.exports=p_;Qy.exports.default=p_});var E_=Fr((TX,m_)=>{"use strict";m_.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 D_=Fr((RX,Ny)=>{"use strict";var I7=dp(),x7=g_(),v7=E_(),y_=e=>{if(typeof e!="string"||e.length===0||(e=I7(e),e.length===0))return 0;e=e.replace(v7()," ");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+=x7(n)?2:1)}return t};Ny.exports=y_;Ny.exports.default=y_});var b_=Fr((QX,C_)=>{"use strict";C_.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 Oy=Fr((NX,B_)=>{var qd=b_(),w_={};for(let e of Object.keys(qd))w_[qd[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"]}};B_.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),d=function(A){return(l-A)/6/c+1/2};return c===0?(s=0,o=0):(o=c/l,t=d(i),r=d(a),n=d(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 _7(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=w_[e];if(t)return t;let r=1/0,n;for(let s of Object.keys(qd)){let o=qd[s],i=_7(e,o);i<r&&(r=i,n=s)}return n};Gr.keyword.rgb=function(e){return qd[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,d;switch(i){default:case 6:case 0:l=a,c=u,d=r;break;case 1:l=u,c=a,d=r;break;case 2:l=r,c=a,d=u;break;case 3:l=r,c=u,d=a;break;case 4:l=u,c=r,d=a;break;case 5:l=a,c=r,d=u;break}return[l*255,c*255,d*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 x_=Fr((OX,I_)=>{var Ap=Oy();function S7(){let e={},t=Object.keys(Ap);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function F7(e){let t=S7(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),s=Object.keys(Ap[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 k7(e,t){return function(r){return t(e(r))}}function T7(e,t){let r=[t[e].parent,e],n=Ap[t[e].parent][e],s=t[e].parent;for(;t[s].parent;)r.unshift(t[s].parent),n=k7(Ap[t[s].parent][s],n),s=t[s].parent;return n.conversion=r,n}I_.exports=function(e){let t=F7(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]=T7(i,t))}return r}});var __=Fr((LX,v_)=>{var Ly=Oy(),R7=x_(),jc={},Q7=Object.keys(Ly);function N7(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 O7(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}Q7.forEach(e=>{jc[e]={},Object.defineProperty(jc[e],"channels",{value:Ly[e].channels}),Object.defineProperty(jc[e],"labels",{value:Ly[e].labels});let t=R7(e);Object.keys(t).forEach(n=>{let s=t[n];jc[e][n]=O7(s),jc[e][n].raw=N7(s)})});v_.exports=jc});var Q_=Fr((PX,R_)=>{"use strict";var S_=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,F_=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},k_=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},fp=e=>e,T_=(e,t,r)=>[e,t,r],$c=(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})},Py,Hc=(e,t,r,n)=>{Py===void 0&&(Py=__());let s=n?10:0,o={};for(let[i,a]of Object.entries(Py)){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 L7(){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",$c(t.color,"ansi",()=>Hc(S_,"ansi16",fp,!1)),$c(t.color,"ansi256",()=>Hc(F_,"ansi256",fp,!1)),$c(t.color,"ansi16m",()=>Hc(k_,"rgb",T_,!1)),$c(t.bgColor,"ansi",()=>Hc(S_,"ansi16",fp,!0)),$c(t.bgColor,"ansi256",()=>Hc(F_,"ansi256",fp,!0)),$c(t.bgColor,"ansi16m",()=>Hc(k_,"rgb",T_,!0)),t}Object.defineProperty(R_,"exports",{enumerable:!0,get:L7})});var L_=Fr((MX,O_)=>{"use strict";var Gd=D_(),P7=dp(),M7=Q_(),Uy=new Set(["\x1B","\x9B"]),U7=39,N_=e=>`${Uy.values().next().value}[${e}m`,j7=e=>e.split(" ").map(t=>Gd(t)),My=(e,t,r)=>{let n=[...t],s=!1,o=Gd(P7(e[e.length-1]));for(let[i,a]of n.entries()){let u=Gd(a);if(o+u<=r?e[e.length-1]+=a:(e.push(a),o=0),Uy.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())},$7=e=>{let t=e.split(" "),r=t.length;for(;r>0&&!(Gd(t[r-1])>0);)r--;return r===t.length?e:t.slice(0,r).join(" ")+t.slice(r).join("")},H7=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let n="",s="",o,i=j7(e),a=[""];for(let[u,l]of e.split(" ").entries()){r.trim!==!1&&(a[a.length-1]=a[a.length-1].trimLeft());let c=Gd(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 d=t-c,A=1+Math.floor((i[u]-d-1)/t);Math.floor((i[u]-1)/t)<A&&a.push(""),My(a,l,t);continue}if(c+i[u]>t&&c>0&&i[u]>0){if(r.wordWrap===!1&&c<t){My(a,l,t);continue}a.push("")}if(c+i[u]>t&&r.wordWrap===!1){My(a,l,t);continue}a[a.length-1]+=l}r.trim!==!1&&(a=a.map($7)),n=a.join(`
1234
1234
  `);for(let[u,l]of[...n].entries()){if(s+=l,Uy.has(l)){let d=parseFloat(/\d[^m]*/.exec(n.slice(u,u+4)));o=d===U7?null:d}let c=M7.codes.get(Number(o));o&&c&&(n[u+1]===`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wengine-ai/claude-code-router",
3
- "version": "2.0.36",
3
+ "version": "2.0.37",
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.36",
17
+ "@wengine-ai/llms": "^2.0.37",
18
18
  "lru-cache": "^11.2.2"
19
19
  },
20
20
  "devDependencies": {