@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.
- package/dist/cli.js +5 -5
- 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;
|
|
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.
|
|
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.
|
|
17
|
+
"@wengine-ai/llms": "^2.0.37",
|
|
18
18
|
"lru-cache": "^11.2.2"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|