@wengine-ai/claude-code-router 2.0.28 → 2.0.30
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 +3 -3
- package/dist/index.html +23 -23
- package/package.json +25 -30
- package/.github/workflows/docker-publish.yml +0 -85
- package/.github/workflows/docs.yml +0 -55
- package/README_zh.md +0 -677
- package/pnpm-workspace.yaml +0 -7
- package/tsconfig.base.json +0 -17
- package/tsconfig.json +0 -20
package/dist/cli.js
CHANGED
|
@@ -1014,7 +1014,7 @@ https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys`};var Rn
|
|
|
1014
1014
|
${this.toMarkdown(Xe,Ce+1)}`:`${Be}- ${Xe}`).join(`
|
|
1015
1015
|
`):typeof te=="object"&&te!==null?Object.entries(te).map(([Xe,Pt])=>typeof Pt=="object"&&Pt!==null?`${Be}${Xe}:
|
|
1016
1016
|
${this.toMarkdown(Pt,Ce+1)}`:`${Be}${Xe}: ${Pt}`).join(`
|
|
1017
|
-
`):`${Be}${te}`}async output(te,Ce={}){try{let Be=this.formatData(te,Ce);switch(this.config.level||"log"){case"info":console.info(Be);break;case"warn":console.warn(Be);break;case"error":console.error(Be);break;case"debug":console.debug(Be);break;case"log":default:console.log(Be);break}return!0}catch(Be){return console.error("[ConsoleOutputHandler] Output failed:",Be),!1}}}}),dW,Xfe=N(()=>{"use strict";dW=class{type="webhook";config;defaultTimeout=3e4;constructor(te){if(!te.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...te}}buildHeaders(){let te={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(te.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let Ce=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");te.Authorization=`Basic ${Ce}`}break;case"custom":this.config.auth.custom&&(te[this.config.auth.custom.header]=this.config.auth.custom.value);break}return te}buildBody(te,Ce){let{format:Be="json",timestamp:Xe=!0,prefix:Pt,metadata:At}=Ce||{},Ft={data:te};return Xe&&(Ft.timestamp=new Date().toISOString()),Pt&&(Ft.prefix=Pt),At&&Object.keys(At).length>0&&(Ft.metadata=At),Ft}async sendRequest(te,Ce,Be,Xe,Pt){let At=new AbortController,Ft=setTimeout(()=>At.abort(),Pt);try{let Mt=await fetch(te,{method:Ce,headers:Be,body:JSON.stringify(Xe),signal:At.signal});if(clearTimeout(Ft),!Mt.ok)throw new Error(`HTTP ${Mt.status}: ${Mt.statusText}`);return Mt}catch(Mt){throw clearTimeout(Ft),Mt}}delay(te){return new Promise(Ce=>setTimeout(Ce,te))}async sendWithRetry(te,Ce,Be,Xe,Pt,At){let Ft=null;for(let Mt=1;Mt<=At.maxAttempts;Mt++)try{return await this.sendRequest(te,Ce,Be,Xe,Pt)}catch(er){if(Ft=er,Mt===At.maxAttempts)break;let Ht=At.backoffMs*Math.pow(2,Mt-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${Mt}/${At.maxAttempts}), retrying in ${Ht}ms...`,er.message),await this.delay(Ht)}throw Ft}async output(te,Ce={}){let Be=Ce.timeout||this.defaultTimeout;try{let Xe=this.buildHeaders(),Pt=this.buildBody(te,Ce),At=await this.sendWithRetry(this.config.url,this.config.method,Xe,Pt,Be,this.config.retry);return!0}catch(Xe){let Pt=Xe instanceof Error?Xe.message:String(Xe);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${Pt}`),!1;throw new Error(`Webhook output failed: ${Pt}`)}}}}),B$,Pre,fle,mle,eme=N(()=>{"use strict";B$=require("fs"),Pre=require("path"),fle=require("os"),mle=class{type="temp-file";config;baseDir;constructor(te={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...te};let Ce=(0,fle.tmpdir)();this.baseDir=(0,Pre.join)(Ce,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,B$.existsSync)(this.baseDir)||(0,B$.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(te){try{let Ce=te.match(/_session_([a-f0-9-]+)/i);return Ce?Ce[1]:null}catch{return null}}getFilePath(te){let Ce=this.config.prefix||"session",Be=this.config.extension?`.${this.config.extension}`:"",Xe;if(this.config.includeTimestamp){let Pt=Date.now();Xe=`${Ce}-${te}-${Pt}${Be}`}else Xe=`${Ce}-${te}${Be}`;return(0,Pre.join)(this.baseDir,Xe)}async output(te,Ce={}){try{let Be=Ce.metadata?.sessionId;if(!Be)return!1;let Xe={...te,timestamp:Date.now(),sessionId:Be},Pt=this.getFilePath(Be);return(0,B$.writeFileSync)(Pt,JSON.stringify(Xe,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),hle,QY,tme=N(()=>{"use strict";Fc(),Xfe(),eme(),hle=class{handlers=new Map;defaultOptions={};registerHandler(te,Ce){this.handlers.set(te,Ce)}registerHandlers(te){for(let Ce of te)if(Ce.enabled!==!1)try{let Be=this.createHandler(Ce),Xe=Ce.type+"_"+Date.now();this.registerHandler(Xe,Be)}catch(Be){console.error(`[OutputManager] Failed to register ${Ce.type} handler:`,Be)}}createHandler(te){switch(te.type){case"console":return new Zfe(te.config);case"webhook":return new dW(te.config);case"temp-file":return new mle(te.config);default:throw new Error(`Unknown output handler type: ${te.type}`)}}unregisterHandler(te){return this.handlers.delete(te)}getHandler(te){return this.handlers.get(te)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(te){this.defaultOptions={...this.defaultOptions,...te}}getDefaultOptions(){return{...this.defaultOptions}}async output(te,Ce){let Be={...this.defaultOptions,...Ce},Xe={success:[],failed:[]},Pt=Array.from(this.handlers.entries()).map(async([At,Ft])=>{try{await Ft.output(te,Be)?Xe.success.push(At):Xe.failed.push(At)}catch(Mt){console.error(`[OutputManager] Handler ${At} failed:`,Mt),Xe.failed.push(At)}});return await Promise.all(Pt),Xe}async outputTo(te,Ce,Be){let Xe={...this.defaultOptions,...Be},Pt={success:[],failed:[]},At=te.map(async Ft=>{let Mt=this.handlers.get(Ft);if(!Mt){console.warn(`[OutputManager] Handler ${Ft} not found`),Pt.failed.push(Ft);return}try{await Mt.output(Ce,Xe)?Pt.success.push(Ft):Pt.failed.push(Ft)}catch(er){console.error(`[OutputManager] Handler ${Ft} failed:`,er),Pt.failed.push(Ft)}});return await Promise.all(At),Pt}async outputToType(te,Ce,Be){let Xe=Array.from(this.handlers.entries()).filter(([Pt,At])=>At.type===te).map(([Pt])=>Pt);return this.outputTo(Xe,Ce,Be)}},QY=new hle}),rme={};R(rme,{ConfigService:()=>Ale,ProviderHealthStore:()=>M5,ProviderService:()=>Lre,SSEParserTransform:()=>t9,SSESerializerTransform:()=>j$,TokenizerService:()=>Lve,TransformerService:()=>GD,calculateTokenCount:()=>zs,default:()=>BMe,getHealthStore:()=>Bre,pluginManager:()=>Ff,rewriteStream:()=>jXe,router:()=>Kre,searchProjectBySession:()=>ib,sessionUsageCache:()=>xR,tokenSpeedPlugin:()=>QXe}),g.exports=M(rme);var mve=Q(JFt(),1),gle=Q($Ft(),1),yle=require("fs"),pW=require("path"),nme=zFt(),ime=Q(q(),1),Ale=class{config={};options;constructor(te={jsonPath:"./config.json"}){this.options={envPath:te.envPath||".env",jsonPath:te.jsonPath,useEnvFile:!1,useJsonFile:te.useJsonFile!==!1,useEnvironmentVariables:te.useEnvironmentVariables!==!1,...te},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 te=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,pW.join)(process.cwd(),this.options.jsonPath);if((0,yle.existsSync)(te))try{let Ce=(0,yle.readFileSync)(te,"utf-8"),Be=ime.default.parse(Ce);this.config={...this.config,...Be},console.log(`Loaded JSON config from: ${te}`)}catch(Ce){console.warn(`Failed to load JSON config from ${te}:`,Ce)}else console.warn(`JSON config file not found: ${te}`)}loadEnvConfig(){let te=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,pW.join)(process.cwd(),this.options.envPath);if((0,yle.existsSync)(te))try{let Ce=(0,nme.config)({path:te});Ce.parsed&&(this.config={...this.config,...this.parseEnvConfig(Ce.parsed)})}catch(Ce){console.warn(`Failed to load .env config from ${te}:`,Ce)}}loadEnvironmentVariables(){let te=this.parseEnvConfig(process.env);this.config={...this.config,...te}}parseEnvConfig(te){let Ce={};return Object.assign(Ce,te),Ce}isAbsolutePath(te){return te.startsWith("/")||te.includes(":")}get(te,Ce){let Be=this.config[te];return Be!==void 0?Be:Ce}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(te){return this.config[te]!==void 0}set(te,Ce){this.config[te]=Ce}reload(){this.config={},this.loadConfig()}getConfigSummary(){let te=[];return this.options.initialConfig&&te.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&te.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&te.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&te.push("Environment Variables"),`Config sources: ${te.join(", ")}`}};function ZN(te,Ce=500,Be="internal_error",Xe="api_error"){let Pt=new Error(te);return Pt.statusCode=Ce,Pt.code=Be,Pt.type=Xe,Pt}async function L6(te,Ce,Be){Ce.log.error(te);let Xe=te.statusCode||500,Pt={error:{message:te.message+te.stack||"Internal Server Error",type:te.type||"api_error",code:te.code||"internal_error"}};return Be.code(Xe).send(Pt)}var UY=h6t();function ame(te,Ce,Be,Xe,Pt){let At=new Headers({"Content-Type":"application/json"});Be.headers&&Object.entries(Be.headers).forEach(([Ht,sr])=>{sr&&At.set(Ht,sr)});let Ft,Mt=AbortSignal.timeout(Be.TIMEOUT??60*1e3*60);if(Be.signal){let Ht=new AbortController,sr=()=>Ht.abort();Be.signal.addEventListener("abort",sr),Mt.addEventListener("abort",sr),Ft=Ht.signal}else Ft=Mt;let er={method:"POST",headers:At,body:JSON.stringify(Ce),signal:Ft};return Be.httpsProxy&&(er.dispatcher=new UY.ProxyAgent(new URL(Be.httpsProxy).toString())),Pt?.debug({reqId:Xe.req.id,request:er,headers:Object.fromEntries(At.entries()),requestUrl:typeof te=="string"?te:te.toString(),useProxy:Be.httpsProxy},"final request"),fetch(typeof te=="string"?te:te.toString(),er)}var vle="1.0.66",AQ=Q(Ge(),1),vQ={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},M5=class{states=new AQ.Map;config;probeTimer;constructor(te){this.config={...vQ,...te}}getKey(te,Ce){return`${te},${Ce}`}recordSuccess(te,Ce){if(!this.config.enabled)return;let Be=this.getKey(te,Ce),Xe=this.states.get(Be);Xe&&(Xe.successCount++,Xe.status==="half-open"?Xe.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(Be):Xe.status==="open"&&(Xe.status="half-open",Xe.successCount=1,Xe.failureCount=0))}recordFailure(te,Ce,Be){if(!this.config.enabled)return;let Xe=this.getKey(te,Ce),Pt=this.states.get(Xe);Pt||(Pt={provider:te,model:Ce,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(Xe,Pt)),Pt.failureCount++,Pt.lastFailureTime=Date.now(),Pt.lastError=Be,Pt.status==="half-open"?(Pt.status="open",Pt.successCount=0,Pt.lastProbeTime=0):Pt.status==="closed"&&Pt.failureCount>=this.config.failureThreshold&&(Pt.status="open",Pt.lastProbeTime=0)}getState(te,Ce){return this.states.get(this.getKey(te,Ce))}isAvailable(te,Ce){if(!this.config.enabled)return!0;let Be=this.getState(te,Ce);return Be?Be.status!=="open":!0}getPriority(te,Ce){if(!this.config.enabled)return 0;let Be=this.getState(te,Ce);if(!Be)return 0;switch(Be.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let te=[];for(let[Ce,Be]of this.states)Be.status==="open"&&te.push(Ce);return te}getHalfOpenModels(){let te=[];for(let[Ce,Be]of this.states)Be.status==="half-open"&&te.push(Ce);return te}needsProbe(te){return Date.now()-te.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(te,Ce){let Be=this.getKey(te,Ce),Xe=this.states.get(Be);Xe&&Xe.status==="open"&&(Xe.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},O$=null;function Bre(te){return O$||(O$=new M5(te)),O$}async function L$(te,Ce,Be,Xe){let Pt=te.body,At=te.provider,Ft=Be.providerService.getProvider(At);if(!Ft)throw ZN(`Provider '${At}' not found`,404,"provider_not_found");try{let{requestBody:Mt,config:er,bypass:Ht}=await ble(Pt,Ft,Xe,te.headers,{req:te}),sr=await xle(Mt,er,Ft,Be,Ht,Xe,{req:te}),Yr=await Cle(Mt,sr,Ft,Xe,Ht,{req:te});return Ore(Yr,Ce,Pt)}catch(Mt){if(Mt.code==="provider_response_error"){let er=await ome(te,Ce,Be,Xe,Mt);if(er)return er}throw Mt}}async function ome(te,Ce,Be,Xe,Pt){let At=te.scenarioType||"default",Ft=te.familyFallback,Mt=Be.configService.get("fallback"),er=Bre(),Ht=[];if(Ft?.[At]?Ht=Ft[At]:Mt?.[At]&&(Ht=Mt[At]),!Array.isArray(Ht)||Ht.length===0)return null;let sr=te.provider||"",Yr=te.body.model||"";er.recordFailure(sr,Yr,Pt?.message),te.log.warn(`Request failed for ${te.scenarioType}, trying ${Ht.length} fallback models`);let Gr=Ht.sort((tr,Dr)=>{let[gt,fn]=tr.split(","),[$r,Tr]=Dr.split(",");return er.getPriority(gt,fn)-er.getPriority($r,Tr)});for(let tr of Gr)try{let[Dr,...gt]=tr.split(","),fn=gt.join(",");if(!er.isAvailable(Dr,fn)){te.log.warn(`Fallback model ${tr} unavailable (fail pool), skipping`);continue}te.log.info(`Trying fallback model: ${tr}`);let $r={...te.body};$r.model=fn;let Tr={...te,provider:Dr,body:$r},Rn=Be.providerService.getProvider(Dr);if(!Rn){te.log.warn(`Fallback provider '${Dr}' not found, skipping`);continue}let{requestBody:jr,config:En,bypass:Fi}=await ble($r,Rn,Xe,te.headers,{req:Tr}),no=await xle(jr,En,Rn,Be,Fi,Xe,{req:Tr}),Es=await Cle(jr,no,Rn,Xe,Fi,{req:Tr});return te.log.info(`Fallback model ${tr} succeeded`),er.recordSuccess(Dr,fn),Ore(Es,Ce,$r)}catch(Dr){let[gt,...fn]=tr.split(","),$r=fn.join(",");er.recordFailure(gt,$r,Dr.message),te.log.warn(`Fallback model ${tr} failed: ${Dr.message}`);continue}return te.log.error(`All fallback models failed for ${At}`),null}async function ble(te,Ce,Be,Xe,Pt){let At=JSON.parse(JSON.stringify(te)),Ft={},Mt=!1;if(Mt=JY(Ce,Be,te),Mt&&(Xe instanceof Headers?Xe.delete("content-length"):delete Xe["content-length"],Ft.headers=Xe),!Mt&&typeof Be.transformRequestOut=="function"){let er=await Be.transformRequestOut(At);er.body?(At=er.body,Ft=er.config||{}):At=er}if(!Mt&&Ce.transformer?.use?.length)for(let er of Ce.transformer.use){if(!er||typeof er.transformRequestIn!="function")continue;let Ht=await er.transformRequestIn(At,Ce,Pt);Ht.body?(At=Ht.body,Ft={...Ft,...Ht.config}):At=Ht}if(!Mt&&Ce.transformer?.[te.model]?.use?.length)for(let er of Ce.transformer[te.model].use)!er||typeof er.transformRequestIn!="function"||(At=await er.transformRequestIn(At,Ce,Pt));return{requestBody:At,config:Ft,bypass:Mt}}function JY(te,Ce,Be){return te.transformer?.use?.length===1&&te.transformer.use[0].name===Ce.name&&(!te.transformer?.[Be.model]?.use.length||te.transformer?.[Be.model]?.use.length===1&&te.transformer?.[Be.model]?.use[0].name===Ce.name)}async function xle(te,Ce,Be,Xe,Pt,At,Ft){let Mt=Ce.url||new URL(Be.baseUrl);if(Pt&&typeof At.auth=="function"){let sr=await At.auth(te,Be);if(sr.body){te=sr.body;let Yr=Ce.headers||{};sr.config?.headers&&(Yr={...Yr,...sr.config.headers},delete Yr.host,delete sr.config.headers),Ce={...Ce,...sr.config,headers:Yr}}else te=sr}let er={Authorization:`Bearer ${Be.apiKey}`,...Ce?.headers||{}};for(let sr in er)(er[sr]==="undefined"||["authorization","Authorization"].includes(sr)&&er[sr]?.includes("undefined"))&&delete er[sr];let Ht=await ame(Mt,te,{httpsProxy:Xe.configService.getHttpsProxy(),...Ce,headers:JSON.parse(JSON.stringify(er))},Ft,Xe.log);if(!Ht.ok){let sr=await Ht.text();throw Xe.log.error(`[provider_response_error] Error from provider(${Be.name},${te.model}: ${Ht.status}): ${sr}`),ZN(`Error from provider(${Be.name},${te.model}: ${Ht.status}): ${sr}`,Ht.status,"provider_response_error")}return Ht}async function Cle(te,Ce,Be,Xe,Pt,At){let Ft=Ce;if(!Pt&&Be.transformer?.use?.length)for(let Mt of Array.from(Be.transformer.use).reverse())!Mt||typeof Mt.transformResponseOut!="function"||(Ft=await Mt.transformResponseOut(Ft,At));if(!Pt&&Be.transformer?.[te.model]?.use?.length)for(let Mt of Array.from(Be.transformer[te.model].use).reverse())!Mt||typeof Mt.transformResponseOut!="function"||(Ft=await Mt.transformResponseOut(Ft,At));return!Pt&&Xe.transformResponseIn&&(Ft=await Xe.transformResponseIn(Ft,At)),Ft}function Ore(te,Ce,Be){return te.ok||Ce.code(te.status),Be.stream===!0?(Ce.header("Content-Type","text/event-stream"),Ce.header("Cache-Control","no-cache"),Ce.header("Connection","keep-alive"),Ce.send(te.body)):te.json()}var fW=async te=>{te.get("/",async()=>({message:"LLMs API",version:vle})),te.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let Ce=te.transformerService.getTransformersWithEndpoint();for(let{transformer:Be}of Ce)Be.endPoint&&te.post(Be.endPoint,async(Xe,Pt)=>L$(Xe,Pt,te,Be));te.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(Be,Xe)=>{let{name:Pt,baseUrl:At,apiKey:Ft,models:Mt}=Be.body;if(!Pt?.trim())throw ZN("Provider name is required",400,"invalid_request");if(!At||!Ele(At))throw ZN("Valid base URL is required",400,"invalid_request");if(!Ft?.trim())throw ZN("API key is required",400,"invalid_request");if(!Mt||!Array.isArray(Mt)||Mt.length===0)throw ZN("At least one model is required",400,"invalid_request");if(te.providerService.getProvider(Be.body.name))throw ZN(`Provider with name '${Be.body.name}' already exists`,400,"provider_exists");return te.providerService.registerProvider(Be.body)}),te.get("/providers",async()=>te.providerService.getProviders()),te.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async Be=>{let Xe=te.providerService.getProvider(Be.params.id);if(!Xe)throw ZN("Provider not found",404,"provider_not_found");return Xe}),te.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(Be,Xe)=>{let Pt=te.providerService.updateProvider(Be.params.id,Be.body);if(!Pt)throw ZN("Provider not found",404,"provider_not_found");return Pt}),te.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async Be=>{if(!te.providerService.deleteProvider(Be.params.id))throw ZN("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),te.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(Be,Xe)=>{if(!te.providerService.toggleProvider(Be.params.id,Be.body.enabled))throw ZN("Provider not found",404,"provider_not_found");return{message:`Provider ${Be.body.enabled?"enabled":"disabled"} successfully`}})};function Ele(te){try{return new URL(te),!0}catch{return!1}}var Lre=class{constructor(te,Ce,Be){this.configService=te,this.transformerService=Ce,this.logger=Be,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let te=this.configService.get("providers");if(te&&Array.isArray(te)){this.initializeFromProvidersArray(te);return}}initializeFromProvidersArray(te){te.forEach(Ce=>{try{if(!Ce.name||!Ce.api_base_url||!Ce.api_key)return;let Be={};Ce.transformer&&Object.keys(Ce.transformer).forEach(Xe=>{Xe==="use"?Array.isArray(Ce.transformer.use)&&(Be.use=Ce.transformer.use.map(Pt=>{if(Array.isArray(Pt)&&typeof Pt[0]=="string"){let At=this.transformerService.getTransformer(Pt[0]);if(At)return new At(Pt[1])}if(typeof Pt=="string"){let At=this.transformerService.getTransformer(Pt);return typeof At=="function"?new At:At}}).filter(Pt=>typeof Pt<"u")):Array.isArray(Ce.transformer[Xe]?.use)&&(Be[Xe]={use:Ce.transformer[Xe].use.map(Pt=>{if(Array.isArray(Pt)&&typeof Pt[0]=="string"){let At=this.transformerService.getTransformer(Pt[0]);if(At)return new At(Pt[1])}if(typeof Pt=="string"){let At=this.transformerService.getTransformer(Pt);return typeof At=="function"?new At:At}}).filter(Pt=>typeof Pt<"u")})}),this.registerProvider({name:Ce.name,baseUrl:Ce.api_base_url,apiKey:Ce.api_key,models:Ce.models||[],transformer:Ce.transformer?Be:void 0}),this.logger.info(`${Ce.name} provider registered`)}catch(Be){this.logger.error(`${Ce.name} provider registered error: ${Be}`)}})}registerProvider(te){let Ce={...te};return this.providers.set(Ce.name,Ce),te.models.forEach(Be=>{let Xe=`${Ce.name},${Be}`,Pt={provider:Ce.name,model:Be,fullModel:Xe};this.modelRoutes.set(Xe,Pt),this.modelRoutes.has(Be)||this.modelRoutes.set(Be,Pt)}),Ce}getProviders(){return Array.from(this.providers.values())}getProvider(te){return this.providers.get(te)}updateProvider(te,Ce){let Be=this.providers.get(te);if(!Be)return null;let Xe={...Be,...Ce,updatedAt:new Date};return this.providers.set(te,Xe),Ce.models&&(Be.models.forEach(Pt=>{let At=`${Be.name},${Pt}`;this.modelRoutes.delete(At),this.modelRoutes.delete(Pt)}),Ce.models.forEach(Pt=>{let At=`${Be.name},${Pt}`,Ft={provider:Be.name,model:Pt,fullModel:At};this.modelRoutes.set(At,Ft),this.modelRoutes.has(Pt)||this.modelRoutes.set(Pt,Ft)})),Xe}deleteProvider(te){let Ce=this.providers.get(te);return Ce?(Ce.models.forEach(Be=>{let Xe=`${Ce.name},${Be}`;this.modelRoutes.delete(Xe),this.modelRoutes.delete(Be)}),this.providers.delete(te),!0):!1}toggleProvider(te,Ce){return!!this.providers.get(te)}resolveModelRoute(te){let Ce=this.modelRoutes.get(te);if(!Ce)return null;let Be=this.providers.get(Ce.provider);return Be?{provider:Be,originalModel:te,targetModel:Ce.model}:null}getAvailableModelNames(){let te=[];return this.providers.forEach(Ce=>{Ce.models.forEach(Be=>{te.push(Be),te.push(`${Ce.name},${Be}`)})}),te}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(te){return te?Array.isArray(te)?te.reduce((Ce,Be)=>{if(Array.isArray(Be)){let[Xe,Pt={}]=Be;Ce[Xe]=Pt}else Ce[Be]={};return Ce},{}):te:{}}async getAvailableModels(){let te=[];return this.providers.forEach(Ce=>{Ce.models.forEach(Be=>{te.push({id:Be,object:"model",owned_by:Ce.name,provider:Ce.name}),te.push({id:`${Ce.name},${Be}`,object:"model",owned_by:Ce.name,provider:Ce.name})})}),{object:"list",data:te}}},NF=[];for(let te=0;te<256;++te)NF.push((te+256).toString(16).slice(1));function hve(te,Ce=0){return(NF[te[Ce+0]]+NF[te[Ce+1]]+NF[te[Ce+2]]+NF[te[Ce+3]]+"-"+NF[te[Ce+4]]+NF[te[Ce+5]]+"-"+NF[te[Ce+6]]+NF[te[Ce+7]]+"-"+NF[te[Ce+8]]+NF[te[Ce+9]]+"-"+NF[te[Ce+10]]+NF[te[Ce+11]]+NF[te[Ce+12]]+NF[te[Ce+13]]+NF[te[Ce+14]]+NF[te[Ce+15]]).toLowerCase()}var gve=require("crypto"),Rre=new Uint8Array(256),Mre=Rre.length;function $Y(){return Mre>Rre.length-16&&((0,gve.randomFillSync)(Rre),Mre=0),Rre.slice(Mre,Mre+=16)}var yve=require("crypto"),Dle={randomUUID:yve.randomUUID};function sme(te,Ce,Be){if(Dle.randomUUID&&!Ce&&!te)return Dle.randomUUID();te=te||{};let Xe=te.random??te.rng?.()??$Y();if(Xe.length<16)throw new Error("Random bytes length must be >= 16");if(Xe[6]=Xe[6]&15|64,Xe[8]=Xe[8]&63|128,Ce){if(Be=Be||0,Be<0||Be+16>Ce.length)throw new RangeError(`UUID byte range ${Be}:${Be+15} is out of buffer bounds`);for(let Pt=0;Pt<16;++Pt)Ce[Be+Pt]=Xe[Pt];return Ce}return hve(Xe)}var R$=sme,Sle=te=>te<=0?"none":te<=1024?"low":te<=8192?"medium":"high",jre=(te,Ce)=>(te.includes("base64")&&(te=te.split("base64").pop(),te.startsWith(",")&&(te=te.slice(1))),`data:${Ce};base64,${te}`),ZO=class{constructor(te){this.options=te,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(te,Ce){let Be={};return this.useBearer?(Be.authorization=`Bearer ${Ce.apiKey}`,Be["x-api-key"]=void 0):(Be["x-api-key"]=Ce.apiKey,Be.authorization=void 0),{body:te,config:{headers:Be}}}async transformRequestOut(te){let Ce=[];if(te.system){if(typeof te.system=="string")Ce.push({role:"system",content:te.system});else if(Array.isArray(te.system)&&te.system.length){let Xe=te.system.filter(Pt=>Pt.type==="text"&&Pt.text).map(Pt=>({type:"text",text:Pt.text,cache_control:Pt.cache_control}));Ce.push({role:"system",content:Xe})}}JSON.parse(JSON.stringify(te.messages||[]))?.forEach(Xe=>{if(Xe.role==="user"||Xe.role==="assistant"){if(typeof Xe.content=="string"){Ce.push({role:Xe.role,content:Xe.content});return}if(Array.isArray(Xe.content)){if(Xe.role==="user"){let Pt=Xe.content.filter(Ft=>Ft.type==="tool_result"&&Ft.tool_use_id);Pt.length&&Pt.forEach(Ft=>{let Mt={role:"tool",content:typeof Ft.content=="string"?Ft.content:JSON.stringify(Ft.content),tool_call_id:Ft.tool_use_id,cache_control:Ft.cache_control};Ce.push(Mt)});let At=Xe.content.filter(Ft=>Ft.type==="text"&&Ft.text||Ft.type==="image"&&Ft.source);At.length&&Ce.push({role:"user",content:At.map(Ft=>Ft?.type==="image"?{type:"image_url",image_url:{url:Ft.source?.type==="base64"?jre(Ft.source.data,Ft.source.media_type):Ft.source.url},media_type:Ft.source.media_type}:Ft)})}else if(Xe.role==="assistant"){let Pt={role:"assistant",content:""},At=Xe.content.filter(er=>er.type==="text"&&er.text);At.length&&(Pt.content=At.map(er=>er.text).join(`
|
|
1017
|
+
`):`${Be}${te}`}async output(te,Ce={}){try{let Be=this.formatData(te,Ce);switch(this.config.level||"log"){case"info":console.info(Be);break;case"warn":console.warn(Be);break;case"error":console.error(Be);break;case"debug":console.debug(Be);break;case"log":default:console.log(Be);break}return!0}catch(Be){return console.error("[ConsoleOutputHandler] Output failed:",Be),!1}}}}),dW,Xfe=N(()=>{"use strict";dW=class{type="webhook";config;defaultTimeout=3e4;constructor(te){if(!te.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...te}}buildHeaders(){let te={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(te.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let Ce=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");te.Authorization=`Basic ${Ce}`}break;case"custom":this.config.auth.custom&&(te[this.config.auth.custom.header]=this.config.auth.custom.value);break}return te}buildBody(te,Ce){let{format:Be="json",timestamp:Xe=!0,prefix:Pt,metadata:At}=Ce||{},Ft={data:te};return Xe&&(Ft.timestamp=new Date().toISOString()),Pt&&(Ft.prefix=Pt),At&&Object.keys(At).length>0&&(Ft.metadata=At),Ft}async sendRequest(te,Ce,Be,Xe,Pt){let At=new AbortController,Ft=setTimeout(()=>At.abort(),Pt);try{let Mt=await fetch(te,{method:Ce,headers:Be,body:JSON.stringify(Xe),signal:At.signal});if(clearTimeout(Ft),!Mt.ok)throw new Error(`HTTP ${Mt.status}: ${Mt.statusText}`);return Mt}catch(Mt){throw clearTimeout(Ft),Mt}}delay(te){return new Promise(Ce=>setTimeout(Ce,te))}async sendWithRetry(te,Ce,Be,Xe,Pt,At){let Ft=null;for(let Mt=1;Mt<=At.maxAttempts;Mt++)try{return await this.sendRequest(te,Ce,Be,Xe,Pt)}catch(er){if(Ft=er,Mt===At.maxAttempts)break;let Ht=At.backoffMs*Math.pow(2,Mt-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${Mt}/${At.maxAttempts}), retrying in ${Ht}ms...`,er.message),await this.delay(Ht)}throw Ft}async output(te,Ce={}){let Be=Ce.timeout||this.defaultTimeout;try{let Xe=this.buildHeaders(),Pt=this.buildBody(te,Ce),At=await this.sendWithRetry(this.config.url,this.config.method,Xe,Pt,Be,this.config.retry);return!0}catch(Xe){let Pt=Xe instanceof Error?Xe.message:String(Xe);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${Pt}`),!1;throw new Error(`Webhook output failed: ${Pt}`)}}}}),B$,Pre,fle,mle,eme=N(()=>{"use strict";B$=require("fs"),Pre=require("path"),fle=require("os"),mle=class{type="temp-file";config;baseDir;constructor(te={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...te};let Ce=(0,fle.tmpdir)();this.baseDir=(0,Pre.join)(Ce,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,B$.existsSync)(this.baseDir)||(0,B$.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(te){try{let Ce=te.match(/_session_([a-f0-9-]+)/i);return Ce?Ce[1]:null}catch{return null}}getFilePath(te){let Ce=this.config.prefix||"session",Be=this.config.extension?`.${this.config.extension}`:"",Xe;if(this.config.includeTimestamp){let Pt=Date.now();Xe=`${Ce}-${te}-${Pt}${Be}`}else Xe=`${Ce}-${te}${Be}`;return(0,Pre.join)(this.baseDir,Xe)}async output(te,Ce={}){try{let Be=Ce.metadata?.sessionId;if(!Be)return!1;let Xe={...te,timestamp:Date.now(),sessionId:Be},Pt=this.getFilePath(Be);return(0,B$.writeFileSync)(Pt,JSON.stringify(Xe,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),hle,QY,tme=N(()=>{"use strict";Fc(),Xfe(),eme(),hle=class{handlers=new Map;defaultOptions={};registerHandler(te,Ce){this.handlers.set(te,Ce)}registerHandlers(te){for(let Ce of te)if(Ce.enabled!==!1)try{let Be=this.createHandler(Ce),Xe=Ce.type+"_"+Date.now();this.registerHandler(Xe,Be)}catch(Be){console.error(`[OutputManager] Failed to register ${Ce.type} handler:`,Be)}}createHandler(te){switch(te.type){case"console":return new Zfe(te.config);case"webhook":return new dW(te.config);case"temp-file":return new mle(te.config);default:throw new Error(`Unknown output handler type: ${te.type}`)}}unregisterHandler(te){return this.handlers.delete(te)}getHandler(te){return this.handlers.get(te)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(te){this.defaultOptions={...this.defaultOptions,...te}}getDefaultOptions(){return{...this.defaultOptions}}async output(te,Ce){let Be={...this.defaultOptions,...Ce},Xe={success:[],failed:[]},Pt=Array.from(this.handlers.entries()).map(async([At,Ft])=>{try{await Ft.output(te,Be)?Xe.success.push(At):Xe.failed.push(At)}catch(Mt){console.error(`[OutputManager] Handler ${At} failed:`,Mt),Xe.failed.push(At)}});return await Promise.all(Pt),Xe}async outputTo(te,Ce,Be){let Xe={...this.defaultOptions,...Be},Pt={success:[],failed:[]},At=te.map(async Ft=>{let Mt=this.handlers.get(Ft);if(!Mt){console.warn(`[OutputManager] Handler ${Ft} not found`),Pt.failed.push(Ft);return}try{await Mt.output(Ce,Xe)?Pt.success.push(Ft):Pt.failed.push(Ft)}catch(er){console.error(`[OutputManager] Handler ${Ft} failed:`,er),Pt.failed.push(Ft)}});return await Promise.all(At),Pt}async outputToType(te,Ce,Be){let Xe=Array.from(this.handlers.entries()).filter(([Pt,At])=>At.type===te).map(([Pt])=>Pt);return this.outputTo(Xe,Ce,Be)}},QY=new hle}),rme={};R(rme,{ConfigService:()=>Ale,ProviderHealthStore:()=>M5,ProviderService:()=>Lre,SSEParserTransform:()=>t9,SSESerializerTransform:()=>j$,TokenizerService:()=>Lve,TransformerService:()=>GD,calculateTokenCount:()=>zs,default:()=>BMe,getHealthStore:()=>Bre,pluginManager:()=>Ff,rewriteStream:()=>jXe,router:()=>Kre,searchProjectBySession:()=>ib,sessionUsageCache:()=>xR,tokenSpeedPlugin:()=>QXe}),g.exports=M(rme);var mve=Q(JFt(),1),gle=Q($Ft(),1),yle=require("fs"),pW=require("path"),nme=zFt(),ime=Q(q(),1),Ale=class{config={};options;constructor(te={jsonPath:"./config.json"}){this.options={envPath:te.envPath||".env",jsonPath:te.jsonPath,useEnvFile:!1,useJsonFile:te.useJsonFile!==!1,useEnvironmentVariables:te.useEnvironmentVariables!==!1,...te},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 te=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,pW.join)(process.cwd(),this.options.jsonPath);if((0,yle.existsSync)(te))try{let Ce=(0,yle.readFileSync)(te,"utf-8"),Be=ime.default.parse(Ce);this.config={...this.config,...Be},console.log(`Loaded JSON config from: ${te}`)}catch(Ce){console.warn(`Failed to load JSON config from ${te}:`,Ce)}else console.warn(`JSON config file not found: ${te}`)}loadEnvConfig(){let te=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,pW.join)(process.cwd(),this.options.envPath);if((0,yle.existsSync)(te))try{let Ce=(0,nme.config)({path:te});Ce.parsed&&(this.config={...this.config,...this.parseEnvConfig(Ce.parsed)})}catch(Ce){console.warn(`Failed to load .env config from ${te}:`,Ce)}}loadEnvironmentVariables(){let te=this.parseEnvConfig(process.env);this.config={...this.config,...te}}parseEnvConfig(te){let Ce={};return Object.assign(Ce,te),Ce}isAbsolutePath(te){return te.startsWith("/")||te.includes(":")}get(te,Ce){let Be=this.config[te];return Be!==void 0?Be:Ce}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(te){return this.config[te]!==void 0}set(te,Ce){this.config[te]=Ce}reload(){this.config={},this.loadConfig()}getConfigSummary(){let te=[];return this.options.initialConfig&&te.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&te.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&te.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&te.push("Environment Variables"),`Config sources: ${te.join(", ")}`}};function ZN(te,Ce=500,Be="internal_error",Xe="api_error"){let Pt=new Error(te);return Pt.statusCode=Ce,Pt.code=Be,Pt.type=Xe,Pt}async function L6(te,Ce,Be){Ce.log.error(te);let Xe=te.statusCode||500,Pt={error:{message:te.message+te.stack||"Internal Server Error",type:te.type||"api_error",code:te.code||"internal_error"}};return Be.code(Xe).send(Pt)}var UY=h6t();function ame(te,Ce,Be,Xe,Pt){let At=new Headers({"Content-Type":"application/json"});Be.headers&&Object.entries(Be.headers).forEach(([Ht,sr])=>{sr&&At.set(Ht,sr)});let Ft,Mt=AbortSignal.timeout(Be.TIMEOUT??60*1e3*60);if(Be.signal){let Ht=new AbortController,sr=()=>Ht.abort();Be.signal.addEventListener("abort",sr),Mt.addEventListener("abort",sr),Ft=Ht.signal}else Ft=Mt;let er={method:"POST",headers:At,body:JSON.stringify(Ce),signal:Ft};return Be.httpsProxy&&(er.dispatcher=new UY.ProxyAgent(new URL(Be.httpsProxy).toString())),Pt?.debug({reqId:Xe.req.id,request:er,headers:Object.fromEntries(At.entries()),requestUrl:typeof te=="string"?te:te.toString(),useProxy:Be.httpsProxy},"final request"),fetch(typeof te=="string"?te:te.toString(),er)}var vle="2.0.30",AQ=Q(Ge(),1),vQ={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},M5=class{states=new AQ.Map;config;probeTimer;constructor(te){this.config={...vQ,...te}}getKey(te,Ce){return`${te},${Ce}`}recordSuccess(te,Ce){if(!this.config.enabled)return;let Be=this.getKey(te,Ce),Xe=this.states.get(Be);Xe&&(Xe.successCount++,Xe.status==="half-open"?Xe.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(Be):Xe.status==="open"&&(Xe.status="half-open",Xe.successCount=1,Xe.failureCount=0))}recordFailure(te,Ce,Be){if(!this.config.enabled)return;let Xe=this.getKey(te,Ce),Pt=this.states.get(Xe);Pt||(Pt={provider:te,model:Ce,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(Xe,Pt)),Pt.failureCount++,Pt.lastFailureTime=Date.now(),Pt.lastError=Be,Pt.status==="half-open"?(Pt.status="open",Pt.successCount=0,Pt.lastProbeTime=0):Pt.status==="closed"&&Pt.failureCount>=this.config.failureThreshold&&(Pt.status="open",Pt.lastProbeTime=0)}getState(te,Ce){return this.states.get(this.getKey(te,Ce))}isAvailable(te,Ce){if(!this.config.enabled)return!0;let Be=this.getState(te,Ce);return Be?Be.status!=="open":!0}getPriority(te,Ce){if(!this.config.enabled)return 0;let Be=this.getState(te,Ce);if(!Be)return 0;switch(Be.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let te=[];for(let[Ce,Be]of this.states)Be.status==="open"&&te.push(Ce);return te}getHalfOpenModels(){let te=[];for(let[Ce,Be]of this.states)Be.status==="half-open"&&te.push(Ce);return te}needsProbe(te){return Date.now()-te.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(te,Ce){let Be=this.getKey(te,Ce),Xe=this.states.get(Be);Xe&&Xe.status==="open"&&(Xe.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},O$=null;function Bre(te){return O$||(O$=new M5(te)),O$}async function L$(te,Ce,Be,Xe){let Pt=te.body,At=te.provider,Ft=Be.providerService.getProvider(At);if(!Ft)throw ZN(`Provider '${At}' not found`,404,"provider_not_found");try{let{requestBody:Mt,config:er,bypass:Ht}=await ble(Pt,Ft,Xe,te.headers,{req:te}),sr=await xle(Mt,er,Ft,Be,Ht,Xe,{req:te}),Yr=await Cle(Mt,sr,Ft,Xe,Ht,{req:te});return Ore(Yr,Ce,Pt)}catch(Mt){if(Mt.code==="provider_response_error"){let er=await ome(te,Ce,Be,Xe,Mt);if(er)return er}throw Mt}}async function ome(te,Ce,Be,Xe,Pt){let At=te.scenarioType||"default",Ft=te.familyFallback,Mt=Be.configService.get("fallback"),er=Bre(),Ht=[];if(Ft?.[At]?Ht=Ft[At]:Mt?.[At]&&(Ht=Mt[At]),!Array.isArray(Ht)||Ht.length===0)return null;let sr=te.provider||"",Yr=te.body.model||"";er.recordFailure(sr,Yr,Pt?.message),te.log.warn(`Request failed for ${te.scenarioType}, trying ${Ht.length} fallback models`);let Gr=Ht.sort((tr,Dr)=>{let[gt,fn]=tr.split(","),[$r,Tr]=Dr.split(",");return er.getPriority(gt,fn)-er.getPriority($r,Tr)});for(let tr of Gr)try{let[Dr,...gt]=tr.split(","),fn=gt.join(",");if(!er.isAvailable(Dr,fn)){te.log.warn(`Fallback model ${tr} unavailable (fail pool), skipping`);continue}te.log.info(`Trying fallback model: ${tr}`);let $r={...te.body};$r.model=fn;let Tr={...te,provider:Dr,body:$r},Rn=Be.providerService.getProvider(Dr);if(!Rn){te.log.warn(`Fallback provider '${Dr}' not found, skipping`);continue}let{requestBody:jr,config:En,bypass:Fi}=await ble($r,Rn,Xe,te.headers,{req:Tr}),no=await xle(jr,En,Rn,Be,Fi,Xe,{req:Tr}),Es=await Cle(jr,no,Rn,Xe,Fi,{req:Tr});return te.log.info(`Fallback model ${tr} succeeded`),er.recordSuccess(Dr,fn),Ore(Es,Ce,$r)}catch(Dr){let[gt,...fn]=tr.split(","),$r=fn.join(",");er.recordFailure(gt,$r,Dr.message),te.log.warn(`Fallback model ${tr} failed: ${Dr.message}`);continue}return te.log.error(`All fallback models failed for ${At}`),null}async function ble(te,Ce,Be,Xe,Pt){let At=JSON.parse(JSON.stringify(te)),Ft={},Mt=!1;if(Mt=JY(Ce,Be,te),Mt&&(Xe instanceof Headers?Xe.delete("content-length"):delete Xe["content-length"],Ft.headers=Xe),!Mt&&typeof Be.transformRequestOut=="function"){let er=await Be.transformRequestOut(At);er.body?(At=er.body,Ft=er.config||{}):At=er}if(!Mt&&Ce.transformer?.use?.length)for(let er of Ce.transformer.use){if(!er||typeof er.transformRequestIn!="function")continue;let Ht=await er.transformRequestIn(At,Ce,Pt);Ht.body?(At=Ht.body,Ft={...Ft,...Ht.config}):At=Ht}if(!Mt&&Ce.transformer?.[te.model]?.use?.length)for(let er of Ce.transformer[te.model].use)!er||typeof er.transformRequestIn!="function"||(At=await er.transformRequestIn(At,Ce,Pt));return{requestBody:At,config:Ft,bypass:Mt}}function JY(te,Ce,Be){return te.transformer?.use?.length===1&&te.transformer.use[0].name===Ce.name&&(!te.transformer?.[Be.model]?.use.length||te.transformer?.[Be.model]?.use.length===1&&te.transformer?.[Be.model]?.use[0].name===Ce.name)}async function xle(te,Ce,Be,Xe,Pt,At,Ft){let Mt=Ce.url||new URL(Be.baseUrl);if(Pt&&typeof At.auth=="function"){let sr=await At.auth(te,Be);if(sr.body){te=sr.body;let Yr=Ce.headers||{};sr.config?.headers&&(Yr={...Yr,...sr.config.headers},delete Yr.host,delete sr.config.headers),Ce={...Ce,...sr.config,headers:Yr}}else te=sr}let er={Authorization:`Bearer ${Be.apiKey}`,...Ce?.headers||{}};for(let sr in er)(er[sr]==="undefined"||["authorization","Authorization"].includes(sr)&&er[sr]?.includes("undefined"))&&delete er[sr];let Ht=await ame(Mt,te,{httpsProxy:Xe.configService.getHttpsProxy(),...Ce,headers:JSON.parse(JSON.stringify(er))},Ft,Xe.log);if(!Ht.ok){let sr=await Ht.text();throw Xe.log.error(`[provider_response_error] Error from provider(${Be.name},${te.model}: ${Ht.status}): ${sr}`),ZN(`Error from provider(${Be.name},${te.model}: ${Ht.status}): ${sr}`,Ht.status,"provider_response_error")}return Ht}async function Cle(te,Ce,Be,Xe,Pt,At){let Ft=Ce;if(!Pt&&Be.transformer?.use?.length)for(let Mt of Array.from(Be.transformer.use).reverse())!Mt||typeof Mt.transformResponseOut!="function"||(Ft=await Mt.transformResponseOut(Ft,At));if(!Pt&&Be.transformer?.[te.model]?.use?.length)for(let Mt of Array.from(Be.transformer[te.model].use).reverse())!Mt||typeof Mt.transformResponseOut!="function"||(Ft=await Mt.transformResponseOut(Ft,At));return!Pt&&Xe.transformResponseIn&&(Ft=await Xe.transformResponseIn(Ft,At)),Ft}function Ore(te,Ce,Be){return te.ok||Ce.code(te.status),Be.stream===!0?(Ce.header("Content-Type","text/event-stream"),Ce.header("Cache-Control","no-cache"),Ce.header("Connection","keep-alive"),Ce.send(te.body)):te.json()}var fW=async te=>{te.get("/",async()=>({message:"LLMs API",version:vle})),te.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let Ce=te.transformerService.getTransformersWithEndpoint();for(let{transformer:Be}of Ce)Be.endPoint&&te.post(Be.endPoint,async(Xe,Pt)=>L$(Xe,Pt,te,Be));te.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(Be,Xe)=>{let{name:Pt,baseUrl:At,apiKey:Ft,models:Mt}=Be.body;if(!Pt?.trim())throw ZN("Provider name is required",400,"invalid_request");if(!At||!Ele(At))throw ZN("Valid base URL is required",400,"invalid_request");if(!Ft?.trim())throw ZN("API key is required",400,"invalid_request");if(!Mt||!Array.isArray(Mt)||Mt.length===0)throw ZN("At least one model is required",400,"invalid_request");if(te.providerService.getProvider(Be.body.name))throw ZN(`Provider with name '${Be.body.name}' already exists`,400,"provider_exists");return te.providerService.registerProvider(Be.body)}),te.get("/providers",async()=>te.providerService.getProviders()),te.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async Be=>{let Xe=te.providerService.getProvider(Be.params.id);if(!Xe)throw ZN("Provider not found",404,"provider_not_found");return Xe}),te.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(Be,Xe)=>{let Pt=te.providerService.updateProvider(Be.params.id,Be.body);if(!Pt)throw ZN("Provider not found",404,"provider_not_found");return Pt}),te.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async Be=>{if(!te.providerService.deleteProvider(Be.params.id))throw ZN("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),te.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(Be,Xe)=>{if(!te.providerService.toggleProvider(Be.params.id,Be.body.enabled))throw ZN("Provider not found",404,"provider_not_found");return{message:`Provider ${Be.body.enabled?"enabled":"disabled"} successfully`}})};function Ele(te){try{return new URL(te),!0}catch{return!1}}var Lre=class{constructor(te,Ce,Be){this.configService=te,this.transformerService=Ce,this.logger=Be,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let te=this.configService.get("providers");if(te&&Array.isArray(te)){this.initializeFromProvidersArray(te);return}}initializeFromProvidersArray(te){te.forEach(Ce=>{try{if(!Ce.name||!Ce.api_base_url||!Ce.api_key)return;let Be={};Ce.transformer&&Object.keys(Ce.transformer).forEach(Xe=>{Xe==="use"?Array.isArray(Ce.transformer.use)&&(Be.use=Ce.transformer.use.map(Pt=>{if(Array.isArray(Pt)&&typeof Pt[0]=="string"){let At=this.transformerService.getTransformer(Pt[0]);if(At)return new At(Pt[1])}if(typeof Pt=="string"){let At=this.transformerService.getTransformer(Pt);return typeof At=="function"?new At:At}}).filter(Pt=>typeof Pt<"u")):Array.isArray(Ce.transformer[Xe]?.use)&&(Be[Xe]={use:Ce.transformer[Xe].use.map(Pt=>{if(Array.isArray(Pt)&&typeof Pt[0]=="string"){let At=this.transformerService.getTransformer(Pt[0]);if(At)return new At(Pt[1])}if(typeof Pt=="string"){let At=this.transformerService.getTransformer(Pt);return typeof At=="function"?new At:At}}).filter(Pt=>typeof Pt<"u")})}),this.registerProvider({name:Ce.name,baseUrl:Ce.api_base_url,apiKey:Ce.api_key,models:Ce.models||[],transformer:Ce.transformer?Be:void 0}),this.logger.info(`${Ce.name} provider registered`)}catch(Be){this.logger.error(`${Ce.name} provider registered error: ${Be}`)}})}registerProvider(te){let Ce={...te};return this.providers.set(Ce.name,Ce),te.models.forEach(Be=>{let Xe=`${Ce.name},${Be}`,Pt={provider:Ce.name,model:Be,fullModel:Xe};this.modelRoutes.set(Xe,Pt),this.modelRoutes.has(Be)||this.modelRoutes.set(Be,Pt)}),Ce}getProviders(){return Array.from(this.providers.values())}getProvider(te){return this.providers.get(te)}updateProvider(te,Ce){let Be=this.providers.get(te);if(!Be)return null;let Xe={...Be,...Ce,updatedAt:new Date};return this.providers.set(te,Xe),Ce.models&&(Be.models.forEach(Pt=>{let At=`${Be.name},${Pt}`;this.modelRoutes.delete(At),this.modelRoutes.delete(Pt)}),Ce.models.forEach(Pt=>{let At=`${Be.name},${Pt}`,Ft={provider:Be.name,model:Pt,fullModel:At};this.modelRoutes.set(At,Ft),this.modelRoutes.has(Pt)||this.modelRoutes.set(Pt,Ft)})),Xe}deleteProvider(te){let Ce=this.providers.get(te);return Ce?(Ce.models.forEach(Be=>{let Xe=`${Ce.name},${Be}`;this.modelRoutes.delete(Xe),this.modelRoutes.delete(Be)}),this.providers.delete(te),!0):!1}toggleProvider(te,Ce){return!!this.providers.get(te)}resolveModelRoute(te){let Ce=this.modelRoutes.get(te);if(!Ce)return null;let Be=this.providers.get(Ce.provider);return Be?{provider:Be,originalModel:te,targetModel:Ce.model}:null}getAvailableModelNames(){let te=[];return this.providers.forEach(Ce=>{Ce.models.forEach(Be=>{te.push(Be),te.push(`${Ce.name},${Be}`)})}),te}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(te){return te?Array.isArray(te)?te.reduce((Ce,Be)=>{if(Array.isArray(Be)){let[Xe,Pt={}]=Be;Ce[Xe]=Pt}else Ce[Be]={};return Ce},{}):te:{}}async getAvailableModels(){let te=[];return this.providers.forEach(Ce=>{Ce.models.forEach(Be=>{te.push({id:Be,object:"model",owned_by:Ce.name,provider:Ce.name}),te.push({id:`${Ce.name},${Be}`,object:"model",owned_by:Ce.name,provider:Ce.name})})}),{object:"list",data:te}}},NF=[];for(let te=0;te<256;++te)NF.push((te+256).toString(16).slice(1));function hve(te,Ce=0){return(NF[te[Ce+0]]+NF[te[Ce+1]]+NF[te[Ce+2]]+NF[te[Ce+3]]+"-"+NF[te[Ce+4]]+NF[te[Ce+5]]+"-"+NF[te[Ce+6]]+NF[te[Ce+7]]+"-"+NF[te[Ce+8]]+NF[te[Ce+9]]+"-"+NF[te[Ce+10]]+NF[te[Ce+11]]+NF[te[Ce+12]]+NF[te[Ce+13]]+NF[te[Ce+14]]+NF[te[Ce+15]]).toLowerCase()}var gve=require("crypto"),Rre=new Uint8Array(256),Mre=Rre.length;function $Y(){return Mre>Rre.length-16&&((0,gve.randomFillSync)(Rre),Mre=0),Rre.slice(Mre,Mre+=16)}var yve=require("crypto"),Dle={randomUUID:yve.randomUUID};function sme(te,Ce,Be){if(Dle.randomUUID&&!Ce&&!te)return Dle.randomUUID();te=te||{};let Xe=te.random??te.rng?.()??$Y();if(Xe.length<16)throw new Error("Random bytes length must be >= 16");if(Xe[6]=Xe[6]&15|64,Xe[8]=Xe[8]&63|128,Ce){if(Be=Be||0,Be<0||Be+16>Ce.length)throw new RangeError(`UUID byte range ${Be}:${Be+15} is out of buffer bounds`);for(let Pt=0;Pt<16;++Pt)Ce[Be+Pt]=Xe[Pt];return Ce}return hve(Xe)}var R$=sme,Sle=te=>te<=0?"none":te<=1024?"low":te<=8192?"medium":"high",jre=(te,Ce)=>(te.includes("base64")&&(te=te.split("base64").pop(),te.startsWith(",")&&(te=te.slice(1))),`data:${Ce};base64,${te}`),ZO=class{constructor(te){this.options=te,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(te,Ce){let Be={};return this.useBearer?(Be.authorization=`Bearer ${Ce.apiKey}`,Be["x-api-key"]=void 0):(Be["x-api-key"]=Ce.apiKey,Be.authorization=void 0),{body:te,config:{headers:Be}}}async transformRequestOut(te){let Ce=[];if(te.system){if(typeof te.system=="string")Ce.push({role:"system",content:te.system});else if(Array.isArray(te.system)&&te.system.length){let Xe=te.system.filter(Pt=>Pt.type==="text"&&Pt.text).map(Pt=>({type:"text",text:Pt.text,cache_control:Pt.cache_control}));Ce.push({role:"system",content:Xe})}}JSON.parse(JSON.stringify(te.messages||[]))?.forEach(Xe=>{if(Xe.role==="user"||Xe.role==="assistant"){if(typeof Xe.content=="string"){Ce.push({role:Xe.role,content:Xe.content});return}if(Array.isArray(Xe.content)){if(Xe.role==="user"){let Pt=Xe.content.filter(Ft=>Ft.type==="tool_result"&&Ft.tool_use_id);Pt.length&&Pt.forEach(Ft=>{let Mt={role:"tool",content:typeof Ft.content=="string"?Ft.content:JSON.stringify(Ft.content),tool_call_id:Ft.tool_use_id,cache_control:Ft.cache_control};Ce.push(Mt)});let At=Xe.content.filter(Ft=>Ft.type==="text"&&Ft.text||Ft.type==="image"&&Ft.source);At.length&&Ce.push({role:"user",content:At.map(Ft=>Ft?.type==="image"?{type:"image_url",image_url:{url:Ft.source?.type==="base64"?jre(Ft.source.data,Ft.source.media_type):Ft.source.url},media_type:Ft.source.media_type}:Ft)})}else if(Xe.role==="assistant"){let Pt={role:"assistant",content:""},At=Xe.content.filter(er=>er.type==="text"&&er.text);At.length&&(Pt.content=At.map(er=>er.text).join(`
|
|
1018
1018
|
`));let Ft=Xe.content.filter(er=>er.type==="tool_use"&&er.id);Ft.length&&(Pt.tool_calls=Ft.map(er=>({id:er.id,type:"function",function:{name:er.name,arguments:JSON.stringify(er.input||{})}})));let Mt=Xe.content.find(er=>er.type==="thinking"&&er.signature);Mt&&(Pt.thinking={content:Mt.thinking,signature:Mt.signature}),Ce.push(Pt)}return}}});let Be={messages:Ce,model:te.model,max_tokens:te.max_tokens,temperature:te.temperature,stream:te.stream,tools:te.tools?.length?this.convertAnthropicToolsToUnified(te.tools):void 0,tool_choice:te.tool_choice};return te.thinking&&(Be.reasoning={effort:Sle(te.thinking.budget_tokens),enabled:te.thinking.type==="enabled"}),te.tool_choice&&(te.tool_choice.type==="tool"?Be.tool_choice={type:"function",function:{name:te.tool_choice.name}}:Be.tool_choice=te.tool_choice.type),Be}async transformResponseIn(te,Ce){if(te.headers.get("Content-Type")?.includes("text/event-stream")){if(!te.body)throw new Error("Stream response body is null");let Be=await this.convertOpenAIStreamToAnthropic(te.body,Ce);return new Response(Be,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let Be=await te.json(),Xe=this.convertOpenAIResponseToAnthropic(Be,Ce);return new Response(JSON.stringify(Xe),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(te){return te.map(Ce=>({type:"function",function:{name:Ce.name,description:Ce.description||"",parameters:Ce.input_schema}}))}async convertOpenAIStreamToAnthropic(te,Ce){return new ReadableStream({start:async Be=>{let Xe=new TextEncoder,Pt=`msg_${Date.now()}`,At=null,Ft="unknown",Mt=!1,er=!1,Ht=!1,sr=new Map,Yr=new Map,Gr=0,tr=0,Dr=0,gt=!1,fn=!1,$r=0,Tr=-1,Rn=()=>{let no=$r;return $r++,no},jr=no=>{if(!gt)try{Be.enqueue(no);let Es=new TextDecoder().decode(no);this.logger.debug({reqId:Ce.req.id,data:Es,type:"send data"})}catch(Es){if(Es instanceof TypeError&&Es.message.includes("Controller is already closed"))gt=!0;else throw this.logger.debug({reqId:Ce.req.id,error:Es instanceof Error?Es.message:String(Es),type:"send data error"}),Es}},En=()=>{if(!gt)try{if(Tr>=0){let Es={type:"content_block_stop",index:Tr};jr(Xe.encode(`event: content_block_stop
|
|
1019
1019
|
data: ${JSON.stringify(Es)}
|
|
1020
1020
|
|
|
@@ -1795,7 +1795,7 @@ https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys`};var ee
|
|
|
1795
1795
|
${this.toMarkdown(b,g+1)}`:`${y}- ${b}`).join(`
|
|
1796
1796
|
`):typeof d=="object"&&d!==null?Object.entries(d).map(([b,D])=>typeof D=="object"&&D!==null?`${y}${b}:
|
|
1797
1797
|
${this.toMarkdown(D,g+1)}`:`${y}${b}: ${D}`).join(`
|
|
1798
|
-
`):`${y}${d}`}async output(d,g={}){try{let y=this.formatData(d,g);switch(this.config.level||"log"){case"info":console.info(y);break;case"warn":console.warn(y);break;case"error":console.error(y);break;case"debug":console.debug(y);break;case"log":default:console.log(y);break}return!0}catch(y){return console.error("[ConsoleOutputHandler] Output failed:",y),!1}}}}),BIt,OIt=Y3(()=>{"use strict";BIt=class{type="webhook";config;defaultTimeout=3e4;constructor(d){if(!d.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...d}}buildHeaders(){let d={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(d.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let g=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");d.Authorization=`Basic ${g}`}break;case"custom":this.config.auth.custom&&(d[this.config.auth.custom.header]=this.config.auth.custom.value);break}return d}buildBody(d,g){let{format:y="json",timestamp:b=!0,prefix:D,metadata:S}=g||{},E={data:d};return b&&(E.timestamp=new Date().toISOString()),D&&(E.prefix=D),S&&Object.keys(S).length>0&&(E.metadata=S),E}async sendRequest(d,g,y,b,D){let S=new AbortController,E=setTimeout(()=>S.abort(),D);try{let I=await fetch(d,{method:g,headers:y,body:JSON.stringify(b),signal:S.signal});if(clearTimeout(E),!I.ok)throw new Error(`HTTP ${I.status}: ${I.statusText}`);return I}catch(I){throw clearTimeout(E),I}}delay(d){return new Promise(g=>setTimeout(g,d))}async sendWithRetry(d,g,y,b,D,S){let E=null;for(let I=1;I<=S.maxAttempts;I++)try{return await this.sendRequest(d,g,y,b,D)}catch(N){if(E=N,I===S.maxAttempts)break;let O=S.backoffMs*Math.pow(2,I-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${I}/${S.maxAttempts}), retrying in ${O}ms...`,N.message),await this.delay(O)}throw E}async output(d,g={}){let y=g.timeout||this.defaultTimeout;try{let b=this.buildHeaders(),D=this.buildBody(d,g),S=await this.sendWithRetry(this.config.url,this.config.method,b,D,y,this.config.retry);return!0}catch(b){let D=b instanceof Error?b.message:String(b);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${D}`),!1;throw new Error(`Webhook output failed: ${D}`)}}}}),LIt,RIt=Y3(()=>{"use strict";LIt=class{type="temp-file";config;baseDir;constructor(d={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...d};let g=(0,JJt.tmpdir)();this.baseDir=(0,QTt.join)(g,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,Nxt.existsSync)(this.baseDir)||(0,Nxt.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(d){try{let g=d.match(/_session_([a-f0-9-]+)/i);return g?g[1]:null}catch{return null}}getFilePath(d){let g=this.config.prefix||"session",y=this.config.extension?`.${this.config.extension}`:"",b;if(this.config.includeTimestamp){let D=Date.now();b=`${g}-${d}-${D}${y}`}else b=`${g}-${d}${y}`;return(0,QTt.join)(this.baseDir,b)}async output(d,g={}){try{let y=g.metadata?.sessionId;if(!y)return!1;let b={...d,timestamp:Date.now(),sessionId:y},D=this.getFilePath(y);return(0,Nxt.writeFileSync)(D,JSON.stringify(b,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),cwt,fZe,Szt=Y3(()=>{"use strict";PIt(),OIt(),RIt(),cwt=class{handlers=new Map;defaultOptions={};registerHandler(d,g){this.handlers.set(d,g)}registerHandlers(d){for(let g of d)if(g.enabled!==!1)try{let y=this.createHandler(g),b=g.type+"_"+Date.now();this.registerHandler(b,y)}catch(y){console.error(`[OutputManager] Failed to register ${g.type} handler:`,y)}}createHandler(d){switch(d.type){case"console":return new NIt(d.config);case"webhook":return new BIt(d.config);case"temp-file":return new LIt(d.config);default:throw new Error(`Unknown output handler type: ${d.type}`)}}unregisterHandler(d){return this.handlers.delete(d)}getHandler(d){return this.handlers.get(d)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(d){this.defaultOptions={...this.defaultOptions,...d}}getDefaultOptions(){return{...this.defaultOptions}}async output(d,g){let y={...this.defaultOptions,...g},b={success:[],failed:[]},D=Array.from(this.handlers.entries()).map(async([S,E])=>{try{await E.output(d,y)?b.success.push(S):b.failed.push(S)}catch(I){console.error(`[OutputManager] Handler ${S} failed:`,I),b.failed.push(S)}});return await Promise.all(D),b}async outputTo(d,g,y){let b={...this.defaultOptions,...y},D={success:[],failed:[]},S=d.map(async E=>{let I=this.handlers.get(E);if(!I){console.warn(`[OutputManager] Handler ${E} not found`),D.failed.push(E);return}try{await I.output(g,b)?D.success.push(E):D.failed.push(E)}catch(N){console.error(`[OutputManager] Handler ${E} failed:`,N),D.failed.push(E)}});return await Promise.all(S),D}async outputToType(d,g,y){let b=Array.from(this.handlers.entries()).filter(([D,S])=>S.type===d).map(([D])=>D);return this.outputTo(b,g,y)}},fZe=new cwt}),kzt=Ofe(d3t(),1),uwt=class{config={};options;constructor(d={jsonPath:"./config.json"}){this.options={envPath:d.envPath||".env",jsonPath:d.jsonPath,useEnvFile:!1,useJsonFile:d.useJsonFile!==!1,useEnvironmentVariables:d.useEnvironmentVariables!==!1,...d},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 d=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,UTt.join)(process.cwd(),this.options.jsonPath);if((0,Pxt.existsSync)(d))try{let g=(0,Pxt.readFileSync)(d,"utf-8"),y=kzt.default.parse(g);this.config={...this.config,...y},console.log(`Loaded JSON config from: ${d}`)}catch(g){console.warn(`Failed to load JSON config from ${d}:`,g)}else console.warn(`JSON config file not found: ${d}`)}loadEnvConfig(){let d=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,UTt.join)(process.cwd(),this.options.envPath);if((0,Pxt.existsSync)(d))try{let g=(0,HJt.config)({path:d});g.parsed&&(this.config={...this.config,...this.parseEnvConfig(g.parsed)})}catch(g){console.warn(`Failed to load .env config from ${d}:`,g)}}loadEnvironmentVariables(){let d=this.parseEnvConfig(process.env);this.config={...this.config,...d}}parseEnvConfig(d){let g={};return Object.assign(g,d),g}isAbsolutePath(d){return d.startsWith("/")||d.includes(":")}get(d,g){let y=this.config[d];return y!==void 0?y:g}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(d){return this.config[d]!==void 0}set(d,g){this.config[d]=g}reload(){this.config={},this.loadConfig()}getConfigSummary(){let d=[];return this.options.initialConfig&&d.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&d.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&d.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&d.push("Environment Variables"),`Config sources: ${d.join(", ")}`}};function yY(d,g=500,y="internal_error",b="api_error"){let D=new Error(d);return D.statusCode=g,D.code=y,D.type=b,D}async function Tzt(d,g,y){g.log.error(d);let b=d.statusCode||500,D={error:{message:d.message+d.stack||"Internal Server Error",type:d.type||"api_error",code:d.code||"internal_error"}};return y.code(b).send(D)}function wzt(d,g,y,b,D){let S=new Headers({"Content-Type":"application/json"});y.headers&&Object.entries(y.headers).forEach(([O,R])=>{R&&S.set(O,R)});let E,I=AbortSignal.timeout(y.TIMEOUT??60*1e3*60);if(y.signal){let O=new AbortController,R=()=>O.abort();y.signal.addEventListener("abort",R),I.addEventListener("abort",R),E=O.signal}else E=I;let N={method:"POST",headers:S,body:JSON.stringify(g),signal:E};return y.httpsProxy&&(N.dispatcher=new qJt.ProxyAgent(new URL(y.httpsProxy).toString())),D?.debug({reqId:b.req.id,request:N,headers:Object.fromEntries(S.entries()),requestUrl:typeof d=="string"?d:d.toString(),useProxy:y.httpsProxy},"final request"),fetch(typeof d=="string"?d:d.toString(),N)}var Fzt="1.0.66",Izt=Ofe(A$t(),1),Nzt={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},Pzt=class{states=new Izt.Map;config;probeTimer;constructor(d){this.config={...Nzt,...d}}getKey(d,g){return`${d},${g}`}recordSuccess(d,g){if(!this.config.enabled)return;let y=this.getKey(d,g),b=this.states.get(y);b&&(b.successCount++,b.status==="half-open"?b.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(y):b.status==="open"&&(b.status="half-open",b.successCount=1,b.failureCount=0))}recordFailure(d,g,y){if(!this.config.enabled)return;let b=this.getKey(d,g),D=this.states.get(b);D||(D={provider:d,model:g,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(b,D)),D.failureCount++,D.lastFailureTime=Date.now(),D.lastError=y,D.status==="half-open"?(D.status="open",D.successCount=0,D.lastProbeTime=0):D.status==="closed"&&D.failureCount>=this.config.failureThreshold&&(D.status="open",D.lastProbeTime=0)}getState(d,g){return this.states.get(this.getKey(d,g))}isAvailable(d,g){if(!this.config.enabled)return!0;let y=this.getState(d,g);return y?y.status!=="open":!0}getPriority(d,g){if(!this.config.enabled)return 0;let y=this.getState(d,g);if(!y)return 0;switch(y.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let d=[];for(let[g,y]of this.states)y.status==="open"&&d.push(g);return d}getHalfOpenModels(){let d=[];for(let[g,y]of this.states)y.status==="half-open"&&d.push(g);return d}needsProbe(d){return Date.now()-d.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(d,g){let y=this.getKey(d,g),b=this.states.get(y);b&&b.status==="open"&&(b.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},Jxt=null;function MIt(d){return Jxt||(Jxt=new Pzt(d)),Jxt}async function Bzt(d,g,y,b){let D=d.body,S=d.provider,E=y.providerService.getProvider(S);if(!E)throw yY(`Provider '${S}' not found`,404,"provider_not_found");try{let{requestBody:I,config:N,bypass:O}=await jIt(D,E,b,d.headers,{req:d}),R=await QIt(I,N,E,y,O,b,{req:d}),j=await UIt(I,R,E,b,O,{req:d});return JIt(j,g,D)}catch(I){if(I.code==="provider_response_error"){let N=await Ozt(d,g,y,b,I);if(N)return N}throw I}}async function Ozt(d,g,y,b,D){let S=d.scenarioType||"default",E=d.familyFallback,I=y.configService.get("fallback"),N=MIt(),O=[];if(E?.[S]?O=E[S]:I?.[S]&&(O=I[S]),!Array.isArray(O)||O.length===0)return null;let R=d.provider||"",j=d.body.model||"";N.recordFailure(R,j,D?.message),d.log.warn(`Request failed for ${d.scenarioType}, trying ${O.length} fallback models`);let Q=O.sort((M,U)=>{let[L,H]=M.split(","),[J,q]=U.split(",");return N.getPriority(L,H)-N.getPriority(J,q)});for(let M of Q)try{let[U,...L]=M.split(","),H=L.join(",");if(!N.isAvailable(U,H)){d.log.warn(`Fallback model ${M} unavailable (fail pool), skipping`);continue}d.log.info(`Trying fallback model: ${M}`);let J={...d.body};J.model=H;let q={...d,provider:U,body:J},ee=y.providerService.getProvider(U);if(!ee){d.log.warn(`Fallback provider '${U}' not found, skipping`);continue}let{requestBody:G,config:se,bypass:_e}=await jIt(J,ee,b,d.headers,{req:q}),oe=await QIt(G,se,ee,y,_e,b,{req:q}),fe=await UIt(G,oe,ee,b,_e,{req:q});return d.log.info(`Fallback model ${M} succeeded`),N.recordSuccess(U,H),JIt(fe,g,J)}catch(U){let[L,...H]=M.split(","),J=H.join(",");N.recordFailure(L,J,U.message),d.log.warn(`Fallback model ${M} failed: ${U.message}`);continue}return d.log.error(`All fallback models failed for ${S}`),null}async function jIt(d,g,y,b,D){let S=JSON.parse(JSON.stringify(d)),E={},I=!1;if(I=Lzt(g,y,d),I&&(b instanceof Headers?b.delete("content-length"):delete b["content-length"],E.headers=b),!I&&typeof y.transformRequestOut=="function"){let N=await y.transformRequestOut(S);N.body?(S=N.body,E=N.config||{}):S=N}if(!I&&g.transformer?.use?.length)for(let N of g.transformer.use){if(!N||typeof N.transformRequestIn!="function")continue;let O=await N.transformRequestIn(S,g,D);O.body?(S=O.body,E={...E,...O.config}):S=O}if(!I&&g.transformer?.[d.model]?.use?.length)for(let N of g.transformer[d.model].use)!N||typeof N.transformRequestIn!="function"||(S=await N.transformRequestIn(S,g,D));return{requestBody:S,config:E,bypass:I}}function Lzt(d,g,y){return d.transformer?.use?.length===1&&d.transformer.use[0].name===g.name&&(!d.transformer?.[y.model]?.use.length||d.transformer?.[y.model]?.use.length===1&&d.transformer?.[y.model]?.use[0].name===g.name)}async function QIt(d,g,y,b,D,S,E){let I=g.url||new URL(y.baseUrl);if(D&&typeof S.auth=="function"){let R=await S.auth(d,y);if(R.body){d=R.body;let j=g.headers||{};R.config?.headers&&(j={...j,...R.config.headers},delete j.host,delete R.config.headers),g={...g,...R.config,headers:j}}else d=R}let N={Authorization:`Bearer ${y.apiKey}`,...g?.headers||{}};for(let R in N)(N[R]==="undefined"||["authorization","Authorization"].includes(R)&&N[R]?.includes("undefined"))&&delete N[R];let O=await wzt(I,d,{httpsProxy:b.configService.getHttpsProxy(),...g,headers:JSON.parse(JSON.stringify(N))},E,b.log);if(!O.ok){let R=await O.text();throw b.log.error(`[provider_response_error] Error from provider(${y.name},${d.model}: ${O.status}): ${R}`),yY(`Error from provider(${y.name},${d.model}: ${O.status}): ${R}`,O.status,"provider_response_error")}return O}async function UIt(d,g,y,b,D,S){let E=g;if(!D&&y.transformer?.use?.length)for(let I of Array.from(y.transformer.use).reverse())!I||typeof I.transformResponseOut!="function"||(E=await I.transformResponseOut(E,S));if(!D&&y.transformer?.[d.model]?.use?.length)for(let I of Array.from(y.transformer[d.model].use).reverse())!I||typeof I.transformResponseOut!="function"||(E=await I.transformResponseOut(E,S));return!D&&b.transformResponseIn&&(E=await b.transformResponseIn(E,S)),E}function JIt(d,g,y){return d.ok||g.code(d.status),y.stream===!0?(g.header("Content-Type","text/event-stream"),g.header("Cache-Control","no-cache"),g.header("Connection","keep-alive"),g.send(d.body)):d.json()}var _wt=async d=>{d.get("/",async()=>({message:"LLMs API",version:Fzt})),d.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let g=d.transformerService.getTransformersWithEndpoint();for(let{transformer:y}of g)y.endPoint&&d.post(y.endPoint,async(b,D)=>Bzt(b,D,d,y));d.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(y,b)=>{let{name:D,baseUrl:S,apiKey:E,models:I}=y.body;if(!D?.trim())throw yY("Provider name is required",400,"invalid_request");if(!S||!Rzt(S))throw yY("Valid base URL is required",400,"invalid_request");if(!E?.trim())throw yY("API key is required",400,"invalid_request");if(!I||!Array.isArray(I)||I.length===0)throw yY("At least one model is required",400,"invalid_request");if(d.providerService.getProvider(y.body.name))throw yY(`Provider with name '${y.body.name}' already exists`,400,"provider_exists");return d.providerService.registerProvider(y.body)}),d.get("/providers",async()=>d.providerService.getProviders()),d.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async y=>{let b=d.providerService.getProvider(y.params.id);if(!b)throw yY("Provider not found",404,"provider_not_found");return b}),d.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(y,b)=>{let D=d.providerService.updateProvider(y.params.id,y.body);if(!D)throw yY("Provider not found",404,"provider_not_found");return D}),d.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async y=>{if(!d.providerService.deleteProvider(y.params.id))throw yY("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),d.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(y,b)=>{if(!d.providerService.toggleProvider(y.params.id,y.body.enabled))throw yY("Provider not found",404,"provider_not_found");return{message:`Provider ${y.body.enabled?"enabled":"disabled"} successfully`}})};function Rzt(d){try{return new URL(d),!0}catch{return!1}}var dwt=class{constructor(d,g,y){this.configService=d,this.transformerService=g,this.logger=y,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let d=this.configService.get("providers");if(d&&Array.isArray(d)){this.initializeFromProvidersArray(d);return}}initializeFromProvidersArray(d){d.forEach(g=>{try{if(!g.name||!g.api_base_url||!g.api_key)return;let y={};g.transformer&&Object.keys(g.transformer).forEach(b=>{b==="use"?Array.isArray(g.transformer.use)&&(y.use=g.transformer.use.map(D=>{if(Array.isArray(D)&&typeof D[0]=="string"){let S=this.transformerService.getTransformer(D[0]);if(S)return new S(D[1])}if(typeof D=="string"){let S=this.transformerService.getTransformer(D);return typeof S=="function"?new S:S}}).filter(D=>typeof D<"u")):Array.isArray(g.transformer[b]?.use)&&(y[b]={use:g.transformer[b].use.map(D=>{if(Array.isArray(D)&&typeof D[0]=="string"){let S=this.transformerService.getTransformer(D[0]);if(S)return new S(D[1])}if(typeof D=="string"){let S=this.transformerService.getTransformer(D);return typeof S=="function"?new S:S}}).filter(D=>typeof D<"u")})}),this.registerProvider({name:g.name,baseUrl:g.api_base_url,apiKey:g.api_key,models:g.models||[],transformer:g.transformer?y:void 0}),this.logger.info(`${g.name} provider registered`)}catch(y){this.logger.error(`${g.name} provider registered error: ${y}`)}})}registerProvider(d){let g={...d};return this.providers.set(g.name,g),d.models.forEach(y=>{let b=`${g.name},${y}`,D={provider:g.name,model:y,fullModel:b};this.modelRoutes.set(b,D),this.modelRoutes.has(y)||this.modelRoutes.set(y,D)}),g}getProviders(){return Array.from(this.providers.values())}getProvider(d){return this.providers.get(d)}updateProvider(d,g){let y=this.providers.get(d);if(!y)return null;let b={...y,...g,updatedAt:new Date};return this.providers.set(d,b),g.models&&(y.models.forEach(D=>{let S=`${y.name},${D}`;this.modelRoutes.delete(S),this.modelRoutes.delete(D)}),g.models.forEach(D=>{let S=`${y.name},${D}`,E={provider:y.name,model:D,fullModel:S};this.modelRoutes.set(S,E),this.modelRoutes.has(D)||this.modelRoutes.set(D,E)})),b}deleteProvider(d){let g=this.providers.get(d);return g?(g.models.forEach(y=>{let b=`${g.name},${y}`;this.modelRoutes.delete(b),this.modelRoutes.delete(y)}),this.providers.delete(d),!0):!1}toggleProvider(d,g){return!!this.providers.get(d)}resolveModelRoute(d){let g=this.modelRoutes.get(d);if(!g)return null;let y=this.providers.get(g.provider);return y?{provider:y,originalModel:d,targetModel:g.model}:null}getAvailableModelNames(){let d=[];return this.providers.forEach(g=>{g.models.forEach(y=>{d.push(y),d.push(`${g.name},${y}`)})}),d}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(d){return d?Array.isArray(d)?d.reduce((g,y)=>{if(Array.isArray(y)){let[b,D={}]=y;g[b]=D}else g[y]={};return g},{}):d:{}}async getAvailableModels(){let d=[];return this.providers.forEach(g=>{g.models.forEach(y=>{d.push({id:y,object:"model",owned_by:g.name,provider:g.name}),d.push({id:`${g.name},${y}`,object:"model",owned_by:g.name,provider:g.name})})}),{object:"list",data:d}}},zO=[];for(let d=0;d<256;++d)zO.push((d+256).toString(16).slice(1));function Mzt(d,g=0){return(zO[d[g+0]]+zO[d[g+1]]+zO[d[g+2]]+zO[d[g+3]]+"-"+zO[d[g+4]]+zO[d[g+5]]+"-"+zO[d[g+6]]+zO[d[g+7]]+"-"+zO[d[g+8]]+zO[d[g+9]]+"-"+zO[d[g+10]]+zO[d[g+11]]+zO[d[g+12]]+zO[d[g+13]]+zO[d[g+14]]+zO[d[g+15]]).toLowerCase()}var lft=new Uint8Array(256),qpt=lft.length;function jzt(){return qpt>lft.length-16&&((0,WJt.randomFillSync)(lft),qpt=0),lft.slice(qpt,qpt+=16)}var pwt={randomUUID:GJt.randomUUID};function Qzt(d,g,y){if(pwt.randomUUID&&!g&&!d)return pwt.randomUUID();d=d||{};let b=d.random??d.rng?.()??jzt();if(b.length<16)throw new Error("Random bytes length must be >= 16");if(b[6]=b[6]&15|64,b[8]=b[8]&63|128,g){if(y=y||0,y<0||y+16>g.length)throw new RangeError(`UUID byte range ${y}:${y+15} is out of buffer bounds`);for(let D=0;D<16;++D)g[y+D]=b[D];return g}return Mzt(b)}var yZe=Qzt,Uzt=d=>d<=0?"none":d<=1024?"low":d<=8192?"medium":"high",Jzt=(d,g)=>(d.includes("base64")&&(d=d.split("base64").pop(),d.startsWith(",")&&(d=d.slice(1))),`data:${g};base64,${d}`),$zt=class{constructor(d){this.options=d,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(d,g){let y={};return this.useBearer?(y.authorization=`Bearer ${g.apiKey}`,y["x-api-key"]=void 0):(y["x-api-key"]=g.apiKey,y.authorization=void 0),{body:d,config:{headers:y}}}async transformRequestOut(d){let g=[];if(d.system){if(typeof d.system=="string")g.push({role:"system",content:d.system});else if(Array.isArray(d.system)&&d.system.length){let b=d.system.filter(D=>D.type==="text"&&D.text).map(D=>({type:"text",text:D.text,cache_control:D.cache_control}));g.push({role:"system",content:b})}}JSON.parse(JSON.stringify(d.messages||[]))?.forEach(b=>{if(b.role==="user"||b.role==="assistant"){if(typeof b.content=="string"){g.push({role:b.role,content:b.content});return}if(Array.isArray(b.content)){if(b.role==="user"){let D=b.content.filter(E=>E.type==="tool_result"&&E.tool_use_id);D.length&&D.forEach(E=>{let I={role:"tool",content:typeof E.content=="string"?E.content:JSON.stringify(E.content),tool_call_id:E.tool_use_id,cache_control:E.cache_control};g.push(I)});let S=b.content.filter(E=>E.type==="text"&&E.text||E.type==="image"&&E.source);S.length&&g.push({role:"user",content:S.map(E=>E?.type==="image"?{type:"image_url",image_url:{url:E.source?.type==="base64"?Jzt(E.source.data,E.source.media_type):E.source.url},media_type:E.source.media_type}:E)})}else if(b.role==="assistant"){let D={role:"assistant",content:""},S=b.content.filter(N=>N.type==="text"&&N.text);S.length&&(D.content=S.map(N=>N.text).join(`
|
|
1798
|
+
`):`${y}${d}`}async output(d,g={}){try{let y=this.formatData(d,g);switch(this.config.level||"log"){case"info":console.info(y);break;case"warn":console.warn(y);break;case"error":console.error(y);break;case"debug":console.debug(y);break;case"log":default:console.log(y);break}return!0}catch(y){return console.error("[ConsoleOutputHandler] Output failed:",y),!1}}}}),BIt,OIt=Y3(()=>{"use strict";BIt=class{type="webhook";config;defaultTimeout=3e4;constructor(d){if(!d.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...d}}buildHeaders(){let d={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(d.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let g=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");d.Authorization=`Basic ${g}`}break;case"custom":this.config.auth.custom&&(d[this.config.auth.custom.header]=this.config.auth.custom.value);break}return d}buildBody(d,g){let{format:y="json",timestamp:b=!0,prefix:D,metadata:S}=g||{},E={data:d};return b&&(E.timestamp=new Date().toISOString()),D&&(E.prefix=D),S&&Object.keys(S).length>0&&(E.metadata=S),E}async sendRequest(d,g,y,b,D){let S=new AbortController,E=setTimeout(()=>S.abort(),D);try{let I=await fetch(d,{method:g,headers:y,body:JSON.stringify(b),signal:S.signal});if(clearTimeout(E),!I.ok)throw new Error(`HTTP ${I.status}: ${I.statusText}`);return I}catch(I){throw clearTimeout(E),I}}delay(d){return new Promise(g=>setTimeout(g,d))}async sendWithRetry(d,g,y,b,D,S){let E=null;for(let I=1;I<=S.maxAttempts;I++)try{return await this.sendRequest(d,g,y,b,D)}catch(N){if(E=N,I===S.maxAttempts)break;let O=S.backoffMs*Math.pow(2,I-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${I}/${S.maxAttempts}), retrying in ${O}ms...`,N.message),await this.delay(O)}throw E}async output(d,g={}){let y=g.timeout||this.defaultTimeout;try{let b=this.buildHeaders(),D=this.buildBody(d,g),S=await this.sendWithRetry(this.config.url,this.config.method,b,D,y,this.config.retry);return!0}catch(b){let D=b instanceof Error?b.message:String(b);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${D}`),!1;throw new Error(`Webhook output failed: ${D}`)}}}}),LIt,RIt=Y3(()=>{"use strict";LIt=class{type="temp-file";config;baseDir;constructor(d={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...d};let g=(0,JJt.tmpdir)();this.baseDir=(0,QTt.join)(g,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,Nxt.existsSync)(this.baseDir)||(0,Nxt.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(d){try{let g=d.match(/_session_([a-f0-9-]+)/i);return g?g[1]:null}catch{return null}}getFilePath(d){let g=this.config.prefix||"session",y=this.config.extension?`.${this.config.extension}`:"",b;if(this.config.includeTimestamp){let D=Date.now();b=`${g}-${d}-${D}${y}`}else b=`${g}-${d}${y}`;return(0,QTt.join)(this.baseDir,b)}async output(d,g={}){try{let y=g.metadata?.sessionId;if(!y)return!1;let b={...d,timestamp:Date.now(),sessionId:y},D=this.getFilePath(y);return(0,Nxt.writeFileSync)(D,JSON.stringify(b,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),cwt,fZe,Szt=Y3(()=>{"use strict";PIt(),OIt(),RIt(),cwt=class{handlers=new Map;defaultOptions={};registerHandler(d,g){this.handlers.set(d,g)}registerHandlers(d){for(let g of d)if(g.enabled!==!1)try{let y=this.createHandler(g),b=g.type+"_"+Date.now();this.registerHandler(b,y)}catch(y){console.error(`[OutputManager] Failed to register ${g.type} handler:`,y)}}createHandler(d){switch(d.type){case"console":return new NIt(d.config);case"webhook":return new BIt(d.config);case"temp-file":return new LIt(d.config);default:throw new Error(`Unknown output handler type: ${d.type}`)}}unregisterHandler(d){return this.handlers.delete(d)}getHandler(d){return this.handlers.get(d)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(d){this.defaultOptions={...this.defaultOptions,...d}}getDefaultOptions(){return{...this.defaultOptions}}async output(d,g){let y={...this.defaultOptions,...g},b={success:[],failed:[]},D=Array.from(this.handlers.entries()).map(async([S,E])=>{try{await E.output(d,y)?b.success.push(S):b.failed.push(S)}catch(I){console.error(`[OutputManager] Handler ${S} failed:`,I),b.failed.push(S)}});return await Promise.all(D),b}async outputTo(d,g,y){let b={...this.defaultOptions,...y},D={success:[],failed:[]},S=d.map(async E=>{let I=this.handlers.get(E);if(!I){console.warn(`[OutputManager] Handler ${E} not found`),D.failed.push(E);return}try{await I.output(g,b)?D.success.push(E):D.failed.push(E)}catch(N){console.error(`[OutputManager] Handler ${E} failed:`,N),D.failed.push(E)}});return await Promise.all(S),D}async outputToType(d,g,y){let b=Array.from(this.handlers.entries()).filter(([D,S])=>S.type===d).map(([D])=>D);return this.outputTo(b,g,y)}},fZe=new cwt}),kzt=Ofe(d3t(),1),uwt=class{config={};options;constructor(d={jsonPath:"./config.json"}){this.options={envPath:d.envPath||".env",jsonPath:d.jsonPath,useEnvFile:!1,useJsonFile:d.useJsonFile!==!1,useEnvironmentVariables:d.useEnvironmentVariables!==!1,...d},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 d=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,UTt.join)(process.cwd(),this.options.jsonPath);if((0,Pxt.existsSync)(d))try{let g=(0,Pxt.readFileSync)(d,"utf-8"),y=kzt.default.parse(g);this.config={...this.config,...y},console.log(`Loaded JSON config from: ${d}`)}catch(g){console.warn(`Failed to load JSON config from ${d}:`,g)}else console.warn(`JSON config file not found: ${d}`)}loadEnvConfig(){let d=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,UTt.join)(process.cwd(),this.options.envPath);if((0,Pxt.existsSync)(d))try{let g=(0,HJt.config)({path:d});g.parsed&&(this.config={...this.config,...this.parseEnvConfig(g.parsed)})}catch(g){console.warn(`Failed to load .env config from ${d}:`,g)}}loadEnvironmentVariables(){let d=this.parseEnvConfig(process.env);this.config={...this.config,...d}}parseEnvConfig(d){let g={};return Object.assign(g,d),g}isAbsolutePath(d){return d.startsWith("/")||d.includes(":")}get(d,g){let y=this.config[d];return y!==void 0?y:g}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(d){return this.config[d]!==void 0}set(d,g){this.config[d]=g}reload(){this.config={},this.loadConfig()}getConfigSummary(){let d=[];return this.options.initialConfig&&d.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&d.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&d.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&d.push("Environment Variables"),`Config sources: ${d.join(", ")}`}};function yY(d,g=500,y="internal_error",b="api_error"){let D=new Error(d);return D.statusCode=g,D.code=y,D.type=b,D}async function Tzt(d,g,y){g.log.error(d);let b=d.statusCode||500,D={error:{message:d.message+d.stack||"Internal Server Error",type:d.type||"api_error",code:d.code||"internal_error"}};return y.code(b).send(D)}function wzt(d,g,y,b,D){let S=new Headers({"Content-Type":"application/json"});y.headers&&Object.entries(y.headers).forEach(([O,R])=>{R&&S.set(O,R)});let E,I=AbortSignal.timeout(y.TIMEOUT??60*1e3*60);if(y.signal){let O=new AbortController,R=()=>O.abort();y.signal.addEventListener("abort",R),I.addEventListener("abort",R),E=O.signal}else E=I;let N={method:"POST",headers:S,body:JSON.stringify(g),signal:E};return y.httpsProxy&&(N.dispatcher=new qJt.ProxyAgent(new URL(y.httpsProxy).toString())),D?.debug({reqId:b.req.id,request:N,headers:Object.fromEntries(S.entries()),requestUrl:typeof d=="string"?d:d.toString(),useProxy:y.httpsProxy},"final request"),fetch(typeof d=="string"?d:d.toString(),N)}var Fzt="2.0.30",Izt=Ofe(A$t(),1),Nzt={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},Pzt=class{states=new Izt.Map;config;probeTimer;constructor(d){this.config={...Nzt,...d}}getKey(d,g){return`${d},${g}`}recordSuccess(d,g){if(!this.config.enabled)return;let y=this.getKey(d,g),b=this.states.get(y);b&&(b.successCount++,b.status==="half-open"?b.successCount>=this.config.halfOpenSuccessThreshold&&this.states.delete(y):b.status==="open"&&(b.status="half-open",b.successCount=1,b.failureCount=0))}recordFailure(d,g,y){if(!this.config.enabled)return;let b=this.getKey(d,g),D=this.states.get(b);D||(D={provider:d,model:g,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(b,D)),D.failureCount++,D.lastFailureTime=Date.now(),D.lastError=y,D.status==="half-open"?(D.status="open",D.successCount=0,D.lastProbeTime=0):D.status==="closed"&&D.failureCount>=this.config.failureThreshold&&(D.status="open",D.lastProbeTime=0)}getState(d,g){return this.states.get(this.getKey(d,g))}isAvailable(d,g){if(!this.config.enabled)return!0;let y=this.getState(d,g);return y?y.status!=="open":!0}getPriority(d,g){if(!this.config.enabled)return 0;let y=this.getState(d,g);if(!y)return 0;switch(y.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let d=[];for(let[g,y]of this.states)y.status==="open"&&d.push(g);return d}getHalfOpenModels(){let d=[];for(let[g,y]of this.states)y.status==="half-open"&&d.push(g);return d}needsProbe(d){return Date.now()-d.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(d,g){let y=this.getKey(d,g),b=this.states.get(y);b&&b.status==="open"&&(b.lastProbeTime=Date.now())}clear(){this.states.clear()}getAllStates(){return Array.from(this.states.values())}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},Jxt=null;function MIt(d){return Jxt||(Jxt=new Pzt(d)),Jxt}async function Bzt(d,g,y,b){let D=d.body,S=d.provider,E=y.providerService.getProvider(S);if(!E)throw yY(`Provider '${S}' not found`,404,"provider_not_found");try{let{requestBody:I,config:N,bypass:O}=await jIt(D,E,b,d.headers,{req:d}),R=await QIt(I,N,E,y,O,b,{req:d}),j=await UIt(I,R,E,b,O,{req:d});return JIt(j,g,D)}catch(I){if(I.code==="provider_response_error"){let N=await Ozt(d,g,y,b,I);if(N)return N}throw I}}async function Ozt(d,g,y,b,D){let S=d.scenarioType||"default",E=d.familyFallback,I=y.configService.get("fallback"),N=MIt(),O=[];if(E?.[S]?O=E[S]:I?.[S]&&(O=I[S]),!Array.isArray(O)||O.length===0)return null;let R=d.provider||"",j=d.body.model||"";N.recordFailure(R,j,D?.message),d.log.warn(`Request failed for ${d.scenarioType}, trying ${O.length} fallback models`);let Q=O.sort((M,U)=>{let[L,H]=M.split(","),[J,q]=U.split(",");return N.getPriority(L,H)-N.getPriority(J,q)});for(let M of Q)try{let[U,...L]=M.split(","),H=L.join(",");if(!N.isAvailable(U,H)){d.log.warn(`Fallback model ${M} unavailable (fail pool), skipping`);continue}d.log.info(`Trying fallback model: ${M}`);let J={...d.body};J.model=H;let q={...d,provider:U,body:J},ee=y.providerService.getProvider(U);if(!ee){d.log.warn(`Fallback provider '${U}' not found, skipping`);continue}let{requestBody:G,config:se,bypass:_e}=await jIt(J,ee,b,d.headers,{req:q}),oe=await QIt(G,se,ee,y,_e,b,{req:q}),fe=await UIt(G,oe,ee,b,_e,{req:q});return d.log.info(`Fallback model ${M} succeeded`),N.recordSuccess(U,H),JIt(fe,g,J)}catch(U){let[L,...H]=M.split(","),J=H.join(",");N.recordFailure(L,J,U.message),d.log.warn(`Fallback model ${M} failed: ${U.message}`);continue}return d.log.error(`All fallback models failed for ${S}`),null}async function jIt(d,g,y,b,D){let S=JSON.parse(JSON.stringify(d)),E={},I=!1;if(I=Lzt(g,y,d),I&&(b instanceof Headers?b.delete("content-length"):delete b["content-length"],E.headers=b),!I&&typeof y.transformRequestOut=="function"){let N=await y.transformRequestOut(S);N.body?(S=N.body,E=N.config||{}):S=N}if(!I&&g.transformer?.use?.length)for(let N of g.transformer.use){if(!N||typeof N.transformRequestIn!="function")continue;let O=await N.transformRequestIn(S,g,D);O.body?(S=O.body,E={...E,...O.config}):S=O}if(!I&&g.transformer?.[d.model]?.use?.length)for(let N of g.transformer[d.model].use)!N||typeof N.transformRequestIn!="function"||(S=await N.transformRequestIn(S,g,D));return{requestBody:S,config:E,bypass:I}}function Lzt(d,g,y){return d.transformer?.use?.length===1&&d.transformer.use[0].name===g.name&&(!d.transformer?.[y.model]?.use.length||d.transformer?.[y.model]?.use.length===1&&d.transformer?.[y.model]?.use[0].name===g.name)}async function QIt(d,g,y,b,D,S,E){let I=g.url||new URL(y.baseUrl);if(D&&typeof S.auth=="function"){let R=await S.auth(d,y);if(R.body){d=R.body;let j=g.headers||{};R.config?.headers&&(j={...j,...R.config.headers},delete j.host,delete R.config.headers),g={...g,...R.config,headers:j}}else d=R}let N={Authorization:`Bearer ${y.apiKey}`,...g?.headers||{}};for(let R in N)(N[R]==="undefined"||["authorization","Authorization"].includes(R)&&N[R]?.includes("undefined"))&&delete N[R];let O=await wzt(I,d,{httpsProxy:b.configService.getHttpsProxy(),...g,headers:JSON.parse(JSON.stringify(N))},E,b.log);if(!O.ok){let R=await O.text();throw b.log.error(`[provider_response_error] Error from provider(${y.name},${d.model}: ${O.status}): ${R}`),yY(`Error from provider(${y.name},${d.model}: ${O.status}): ${R}`,O.status,"provider_response_error")}return O}async function UIt(d,g,y,b,D,S){let E=g;if(!D&&y.transformer?.use?.length)for(let I of Array.from(y.transformer.use).reverse())!I||typeof I.transformResponseOut!="function"||(E=await I.transformResponseOut(E,S));if(!D&&y.transformer?.[d.model]?.use?.length)for(let I of Array.from(y.transformer[d.model].use).reverse())!I||typeof I.transformResponseOut!="function"||(E=await I.transformResponseOut(E,S));return!D&&b.transformResponseIn&&(E=await b.transformResponseIn(E,S)),E}function JIt(d,g,y){return d.ok||g.code(d.status),y.stream===!0?(g.header("Content-Type","text/event-stream"),g.header("Cache-Control","no-cache"),g.header("Connection","keep-alive"),g.send(d.body)):d.json()}var _wt=async d=>{d.get("/",async()=>({message:"LLMs API",version:Fzt})),d.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let g=d.transformerService.getTransformersWithEndpoint();for(let{transformer:y}of g)y.endPoint&&d.post(y.endPoint,async(b,D)=>Bzt(b,D,d,y));d.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(y,b)=>{let{name:D,baseUrl:S,apiKey:E,models:I}=y.body;if(!D?.trim())throw yY("Provider name is required",400,"invalid_request");if(!S||!Rzt(S))throw yY("Valid base URL is required",400,"invalid_request");if(!E?.trim())throw yY("API key is required",400,"invalid_request");if(!I||!Array.isArray(I)||I.length===0)throw yY("At least one model is required",400,"invalid_request");if(d.providerService.getProvider(y.body.name))throw yY(`Provider with name '${y.body.name}' already exists`,400,"provider_exists");return d.providerService.registerProvider(y.body)}),d.get("/providers",async()=>d.providerService.getProviders()),d.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async y=>{let b=d.providerService.getProvider(y.params.id);if(!b)throw yY("Provider not found",404,"provider_not_found");return b}),d.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(y,b)=>{let D=d.providerService.updateProvider(y.params.id,y.body);if(!D)throw yY("Provider not found",404,"provider_not_found");return D}),d.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async y=>{if(!d.providerService.deleteProvider(y.params.id))throw yY("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),d.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(y,b)=>{if(!d.providerService.toggleProvider(y.params.id,y.body.enabled))throw yY("Provider not found",404,"provider_not_found");return{message:`Provider ${y.body.enabled?"enabled":"disabled"} successfully`}})};function Rzt(d){try{return new URL(d),!0}catch{return!1}}var dwt=class{constructor(d,g,y){this.configService=d,this.transformerService=g,this.logger=y,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let d=this.configService.get("providers");if(d&&Array.isArray(d)){this.initializeFromProvidersArray(d);return}}initializeFromProvidersArray(d){d.forEach(g=>{try{if(!g.name||!g.api_base_url||!g.api_key)return;let y={};g.transformer&&Object.keys(g.transformer).forEach(b=>{b==="use"?Array.isArray(g.transformer.use)&&(y.use=g.transformer.use.map(D=>{if(Array.isArray(D)&&typeof D[0]=="string"){let S=this.transformerService.getTransformer(D[0]);if(S)return new S(D[1])}if(typeof D=="string"){let S=this.transformerService.getTransformer(D);return typeof S=="function"?new S:S}}).filter(D=>typeof D<"u")):Array.isArray(g.transformer[b]?.use)&&(y[b]={use:g.transformer[b].use.map(D=>{if(Array.isArray(D)&&typeof D[0]=="string"){let S=this.transformerService.getTransformer(D[0]);if(S)return new S(D[1])}if(typeof D=="string"){let S=this.transformerService.getTransformer(D);return typeof S=="function"?new S:S}}).filter(D=>typeof D<"u")})}),this.registerProvider({name:g.name,baseUrl:g.api_base_url,apiKey:g.api_key,models:g.models||[],transformer:g.transformer?y:void 0}),this.logger.info(`${g.name} provider registered`)}catch(y){this.logger.error(`${g.name} provider registered error: ${y}`)}})}registerProvider(d){let g={...d};return this.providers.set(g.name,g),d.models.forEach(y=>{let b=`${g.name},${y}`,D={provider:g.name,model:y,fullModel:b};this.modelRoutes.set(b,D),this.modelRoutes.has(y)||this.modelRoutes.set(y,D)}),g}getProviders(){return Array.from(this.providers.values())}getProvider(d){return this.providers.get(d)}updateProvider(d,g){let y=this.providers.get(d);if(!y)return null;let b={...y,...g,updatedAt:new Date};return this.providers.set(d,b),g.models&&(y.models.forEach(D=>{let S=`${y.name},${D}`;this.modelRoutes.delete(S),this.modelRoutes.delete(D)}),g.models.forEach(D=>{let S=`${y.name},${D}`,E={provider:y.name,model:D,fullModel:S};this.modelRoutes.set(S,E),this.modelRoutes.has(D)||this.modelRoutes.set(D,E)})),b}deleteProvider(d){let g=this.providers.get(d);return g?(g.models.forEach(y=>{let b=`${g.name},${y}`;this.modelRoutes.delete(b),this.modelRoutes.delete(y)}),this.providers.delete(d),!0):!1}toggleProvider(d,g){return!!this.providers.get(d)}resolveModelRoute(d){let g=this.modelRoutes.get(d);if(!g)return null;let y=this.providers.get(g.provider);return y?{provider:y,originalModel:d,targetModel:g.model}:null}getAvailableModelNames(){let d=[];return this.providers.forEach(g=>{g.models.forEach(y=>{d.push(y),d.push(`${g.name},${y}`)})}),d}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(d){return d?Array.isArray(d)?d.reduce((g,y)=>{if(Array.isArray(y)){let[b,D={}]=y;g[b]=D}else g[y]={};return g},{}):d:{}}async getAvailableModels(){let d=[];return this.providers.forEach(g=>{g.models.forEach(y=>{d.push({id:y,object:"model",owned_by:g.name,provider:g.name}),d.push({id:`${g.name},${y}`,object:"model",owned_by:g.name,provider:g.name})})}),{object:"list",data:d}}},zO=[];for(let d=0;d<256;++d)zO.push((d+256).toString(16).slice(1));function Mzt(d,g=0){return(zO[d[g+0]]+zO[d[g+1]]+zO[d[g+2]]+zO[d[g+3]]+"-"+zO[d[g+4]]+zO[d[g+5]]+"-"+zO[d[g+6]]+zO[d[g+7]]+"-"+zO[d[g+8]]+zO[d[g+9]]+"-"+zO[d[g+10]]+zO[d[g+11]]+zO[d[g+12]]+zO[d[g+13]]+zO[d[g+14]]+zO[d[g+15]]).toLowerCase()}var lft=new Uint8Array(256),qpt=lft.length;function jzt(){return qpt>lft.length-16&&((0,WJt.randomFillSync)(lft),qpt=0),lft.slice(qpt,qpt+=16)}var pwt={randomUUID:GJt.randomUUID};function Qzt(d,g,y){if(pwt.randomUUID&&!g&&!d)return pwt.randomUUID();d=d||{};let b=d.random??d.rng?.()??jzt();if(b.length<16)throw new Error("Random bytes length must be >= 16");if(b[6]=b[6]&15|64,b[8]=b[8]&63|128,g){if(y=y||0,y<0||y+16>g.length)throw new RangeError(`UUID byte range ${y}:${y+15} is out of buffer bounds`);for(let D=0;D<16;++D)g[y+D]=b[D];return g}return Mzt(b)}var yZe=Qzt,Uzt=d=>d<=0?"none":d<=1024?"low":d<=8192?"medium":"high",Jzt=(d,g)=>(d.includes("base64")&&(d=d.split("base64").pop(),d.startsWith(",")&&(d=d.slice(1))),`data:${g};base64,${d}`),$zt=class{constructor(d){this.options=d,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(d,g){let y={};return this.useBearer?(y.authorization=`Bearer ${g.apiKey}`,y["x-api-key"]=void 0):(y["x-api-key"]=g.apiKey,y.authorization=void 0),{body:d,config:{headers:y}}}async transformRequestOut(d){let g=[];if(d.system){if(typeof d.system=="string")g.push({role:"system",content:d.system});else if(Array.isArray(d.system)&&d.system.length){let b=d.system.filter(D=>D.type==="text"&&D.text).map(D=>({type:"text",text:D.text,cache_control:D.cache_control}));g.push({role:"system",content:b})}}JSON.parse(JSON.stringify(d.messages||[]))?.forEach(b=>{if(b.role==="user"||b.role==="assistant"){if(typeof b.content=="string"){g.push({role:b.role,content:b.content});return}if(Array.isArray(b.content)){if(b.role==="user"){let D=b.content.filter(E=>E.type==="tool_result"&&E.tool_use_id);D.length&&D.forEach(E=>{let I={role:"tool",content:typeof E.content=="string"?E.content:JSON.stringify(E.content),tool_call_id:E.tool_use_id,cache_control:E.cache_control};g.push(I)});let S=b.content.filter(E=>E.type==="text"&&E.text||E.type==="image"&&E.source);S.length&&g.push({role:"user",content:S.map(E=>E?.type==="image"?{type:"image_url",image_url:{url:E.source?.type==="base64"?Jzt(E.source.data,E.source.media_type):E.source.url},media_type:E.source.media_type}:E)})}else if(b.role==="assistant"){let D={role:"assistant",content:""},S=b.content.filter(N=>N.type==="text"&&N.text);S.length&&(D.content=S.map(N=>N.text).join(`
|
|
1799
1799
|
`));let E=b.content.filter(N=>N.type==="tool_use"&&N.id);E.length&&(D.tool_calls=E.map(N=>({id:N.id,type:"function",function:{name:N.name,arguments:JSON.stringify(N.input||{})}})));let I=b.content.find(N=>N.type==="thinking"&&N.signature);I&&(D.thinking={content:I.thinking,signature:I.signature}),g.push(D)}return}}});let y={messages:g,model:d.model,max_tokens:d.max_tokens,temperature:d.temperature,stream:d.stream,tools:d.tools?.length?this.convertAnthropicToolsToUnified(d.tools):void 0,tool_choice:d.tool_choice};return d.thinking&&(y.reasoning={effort:Uzt(d.thinking.budget_tokens),enabled:d.thinking.type==="enabled"}),d.tool_choice&&(d.tool_choice.type==="tool"?y.tool_choice={type:"function",function:{name:d.tool_choice.name}}:y.tool_choice=d.tool_choice.type),y}async transformResponseIn(d,g){if(d.headers.get("Content-Type")?.includes("text/event-stream")){if(!d.body)throw new Error("Stream response body is null");let y=await this.convertOpenAIStreamToAnthropic(d.body,g);return new Response(y,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let y=await d.json(),b=this.convertOpenAIResponseToAnthropic(y,g);return new Response(JSON.stringify(b),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(d){return d.map(g=>({type:"function",function:{name:g.name,description:g.description||"",parameters:g.input_schema}}))}async convertOpenAIStreamToAnthropic(d,g){return new ReadableStream({start:async y=>{let b=new TextEncoder,D=`msg_${Date.now()}`,S=null,E="unknown",I=!1,N=!1,O=!1,R=new Map,j=new Map,Q=0,M=0,U=0,L=!1,H=!1,J=0,q=-1,ee=()=>{let oe=J;return J++,oe},G=oe=>{if(!L)try{y.enqueue(oe);let fe=new TextDecoder().decode(oe);this.logger.debug({reqId:g.req.id,data:fe,type:"send data"})}catch(fe){if(fe instanceof TypeError&&fe.message.includes("Controller is already closed"))L=!0;else throw this.logger.debug({reqId:g.req.id,error:fe instanceof Error?fe.message:String(fe),type:"send data error"}),fe}},se=()=>{if(!L)try{if(q>=0){let fe={type:"content_block_stop",index:q};G(b.encode(`event: content_block_stop
|
|
1800
1800
|
data: ${JSON.stringify(fe)}
|
|
1801
1801
|
|
|
@@ -2098,7 +2098,7 @@ If multiple images exist, select the **most relevant imageId** based on the user
|
|
|
2098
2098
|
|
|
2099
2099
|
Do not attempt to describe or analyze the image directly yourself.
|
|
2100
2100
|
Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
|
|
2101
|
-
Your response should consistently follow this rule whenever image-related analysis is requested.`});let y=d.body.messages.filter(D=>D.role==="user"&&Array.isArray(D.content)&&D.content.some(S=>S.type==="image"||Array.isArray(S.content)&&S.content.some(E=>E.type==="image"))),b=1;y.forEach(D=>{Array.isArray(D.content)&&D.content.forEach(S=>{S.type==="image"?(Vpt.storeImage(`${d.id}_Image#${b}`,S.source),S.type="text",delete S.source,S.text=`[Image #${b}]This is an image, if you need to view or analyze it, you need to extract the imageId`,b++):S.type==="text"&&S.text.includes("[Image #")?S.text=S.text.replace(/\[Image #\d+\]/g,""):S.type==="tool_result"&&Array.isArray(S.content)&&S.content.some(E=>E.type==="image")&&(Vpt.storeImage(`${d.id}_Image#${b}`,S.content[0].source),S.content=`[Image #${b}]This is an image, if you need to view or analyze it, you need to extract the imageId`,b++)})})}},LGt=new OGt,RGt=class{agents=new Map;registerAgent(d){this.agents.set(d.name,d)}getAgent(d){return this.agents.get(d)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let d=[];for(let g of this.agents.values())d.push(...g.tools.values());return d}},l4t=new RGt;l4t.registerAgent(LGt);var Yxt=l4t,MGt=require("node:events"),Qwt=require("node:perf_hooks");function jGt(){let{ProviderHealthStore:d}=NJt();return new d}var Uwt=new MGt.EventEmitter;function Jwt(d){if(d.usageSessionId)return d.usageSessionId;let g=d.headers?.["x-request-id"],y=Array.isArray(g)?g[0]:g;return d.usageSessionId=d.sessionId||(typeof y=="string"?y:void 0)||d.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,d.usageSessionId}function Zxt(d){return d.body?.model?Array.isArray(d.body.model)?d.body.model.join(","):d.body.model:Array.isArray(d.model)?d.model.join(","):d.model||""}async function QGt(){let d=(0,r3t.homedir)(),g=(0,n3t.join)(d,".claude.json");if(!(0,PJt.existsSync)(g)){let y={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,BJt.writeFile)(g,JSON.stringify(y,null,2))}}async function UGt(d,g){let y=g.plugins||g.Plugins||[];for(let b of y){let{name:D,enabled:S=!1,options:E={}}=b;switch(D){case"token-speed":ICt.registerPlugin(i4t,{enabled:S,outputHandlers:[{type:"temp-file",enabled:!0}],...E});break;default:console.warn(`Unknown plugin: ${D}`);break}}await ICt.enablePlugins(d)}async function c4t(d={}){await QGt(),await pEt();let g=await i3t(),y=g.Providers||g.providers||[],b=y&&y.length>0,D=g.HOST||"127.0.0.1";b?(D=g.HOST,g.APIKEY||(D="127.0.0.1")):(D="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let S=g.PORT||3456,E=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):S,I=Q=>(Q>9?"":"0")+Q,N=(Q,M)=>{let U;Q?typeof Q=="number"?U=new Date(Q):U=Q:U=new Date;let L=U.getFullYear()+""+I(U.getMonth()+1),H=I(U.getDate()),J=I(U.getHours()),q=I(U.getMinutes());return`./logs/ccr-${L}${H}${J}${q}${I(U.getSeconds())}${M?`_${M}`:""}.log`},O;d.logger!==void 0?O=d.logger:g.LOG!==!1?(g.LOG===void 0&&(g.LOG=!0),O={level:g.LOG_LEVEL||"debug",stream:kGt(N,{path:Wxt.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):O=!1;let R=await(0,Wxt.listPresets)(),j=await pGt({jsonPath:Wxt.CONFIG_FILE,initialConfig:{providers:g.Providers||g.providers,HOST:D,PORT:E,LOG_FILE:(0,n3t.join)((0,r3t.homedir)(),".claude-code-router","claude-code-router.log")},logger:O});return await Promise.allSettled(R.map(async Q=>await j.registerNamespace(`/preset/${Q.name}`,Q.config))),await UGt(j,g),j.addHook("onRequest",async Q=>{new URL(`http://127.0.0.1${Q.url}`).pathname.endsWith("/v1/messages")&&!Q.requestStartTime&&(Q.requestStartTime=Qwt.performance.now())}),j.addHook("preHandler",async(Q,M)=>new Promise((U,L)=>{let H=J=>{J?L(J):U()};fGt(g)(Q,M,H).catch(L)})),j.addHook("preHandler",async(Q,M)=>{let U=new URL(`http://127.0.0.1${Q.url}`);Q.pathname=U.pathname,Q.pathname.endsWith("/v1/messages")&&Q.pathname!=="/v1/messages"&&(Q.preset=Q.pathname.replace("/v1/messages","").replace("/",""))}),j.addHook("preHandler",async(Q,M)=>{if(Q.pathname.endsWith("/v1/messages")){let U=[];for(let L of Yxt.getAllAgents())L.shouldHandle(Q,g)&&(U.push(L.name),L.reqHandler(Q,g),L.tools.size&&(Q.body?.tools?.length||(Q.body.tools=[]),Q.body.tools.unshift(...Array.from(L.tools.values()).map(H=>({name:H.name,description:H.description,input_schema:H.input_schema})))));U.length&&(Q.agents=U)}}),j.addHook("onError",async(Q,M,U)=>{Q.errorMessage=U?.message||U?.toString?.()||"Unknown error",Uwt.emit("onError",Q,M,U)}),j.addHook("onSend",(Q,M,U,L)=>{if(Q.pathname?.endsWith("/v1/messages")){let H=Jwt(Q);if(U instanceof ReadableStream){if(Q.agents){let ee=new AbortController,G=U.pipeThrough(new Kxt),se,_e=-1,oe="",fe="",le="",ve=[],Ae=[];return L(null,wGt(G,async(Fe,He)=>{try{if(Fe.event==="content_block_start"&&Fe?.data?.content_block?.name){let Ke=Q.agents.find(Pe=>Yxt.getAgent(Pe)?.tools.get(Fe.data.content_block.name));if(Ke){se=Yxt.getAgent(Ke),_e=Fe.data.index,oe=Fe.data.content_block.name,le=Fe.data.content_block.id;return}}if(_e>-1&&Fe.data.index===_e&&Fe.data?.delta?.type==="input_json_delta"){fe+=Fe.data?.delta?.partial_json;return}if(_e>-1&&Fe.data.index===_e&&Fe.data.type==="content_block_stop"){try{let Ke=FGt.default.parse(fe);Ae.push({type:"tool_use",id:le,name:oe,input:Ke});let Pe=await se?.tools.get(oe)?.handler(Ke,{req:Q,config:g});ve.push({tool_use_id:le,type:"tool_result",content:Pe}),se=void 0,_e=-1,oe="",fe="",le=""}catch(Ke){console.log(Ke)}return}if(Fe.event==="message_delta"&&ve.length){Q.body.messages.push({role:"assistant",content:Ae}),Q.body.messages.push({role:"user",content:ve});let Ke=await fetch(`http://127.0.0.1:${g.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":g.APIKEY,"content-type":"application/json"},body:JSON.stringify(Q.body)});if(!Ke.ok)return;let Pe=Ke.body.pipeThrough(new Kxt).getReader();for(;;)try{let{value:Ge,done:rt}=await Pe.read();if(rt)break;let Rt=Ge;if(["message_start","message_stop"].includes(Rt.event))continue;if(!He.desiredSize)break;He.enqueue(Rt)}catch(Ge){if(Ge.name==="AbortError"||Ge.code==="ERR_STREAM_PREMATURE_CLOSE"){ee.abort();break}throw Ge}return}return Fe}catch(Ke){if(console.error("Unexpected error in stream processing:",Ke),Ke.code==="ERR_STREAM_PREMATURE_CLOSE"){ee.abort();return}throw Ke}}).pipeThrough(new TGt))}let[J,q]=U.tee();return(async ee=>{let G=ee.pipeThrough(new TextDecoderStream).pipeThrough(new Kxt).getReader();try{for(;;){let{done:se,value:_e}=await G.read();if(se)break;let oe=_e.event,fe=_e.data;if(fe?.usage){let le={...pZe.get(H)||{},...fe.usage};(fe.usage.cache_read_input_tokens||fe.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:fe.usage.cache_read_input_tokens,cache_creation:fe.usage.cache_creation_input_tokens}),pZe.put(H,le)}}}catch(se){se.name==="AbortError"||se.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",se)}finally{G.releaseLock()}})(q),L(null,J)}if(pZe.put(H,U.usage),typeof U=="object")return U.error?L(U.error,null):L(U,null)}if(typeof U=="object"&&U.error)return L(U.error,null);L(null,U)}),j.addHook("onSend",async(Q,M,U)=>{if(Uwt.emit("onSend",Q,M,U),M.statusCode>=400&&Q.pathname?.endsWith("/v1/messages"))try{typeof U=="string"?Q.errorResponseBody=U:U&&typeof U=="object"&&(Q.errorResponseBody=JSON.stringify(U))}catch{}return U}),j.addHook("onResponse",async(Q,M)=>{if(Q.pathname?.endsWith("/v1/messages"))try{let U=Jwt(Q),L=pZe.get(U),H=dGt(U),J=jGt(),q,ee;if(M.statusCode>=400){q=Q.errorMessage||M.errorMessage||Q.error?.message||Q.error?.toString?.()||void 0,ee=Q.errorResponseBody;let G=Zxt(Q);J.recordFailure(Q.provider||"",G,q)}else{let G=Zxt(Q);J.recordSuccess(Q.provider||"",G)}lGt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:U,provider:Q.provider||"",originalModel:Q.originalModel||Q.body?.model||"",model:Zxt(Q),modelFamily:Q.modelFamily||"",scenarioType:Q.scenarioType||"default",stream:Q.body?.stream??!1,inputTokens:Q.tokenCount||0,outputTokens:L?.output_tokens||0,cacheReadInputTokens:L?.cache_read_input_tokens||0,cacheCreationInputTokens:L?.cache_creation_input_tokens||0,ttft:H.ttft,tokensPerSecond:H.tokensPerSecond,durationMs:Q.requestStartTime?Math.round(Qwt.performance.now()-Q.requestStartTime):0,status:M.statusCode<400?"success":"error",errorMessage:q,responseBody:ee})}catch(U){console.error("Usage tracking error:",U)}}),process.on("uncaughtException",Q=>{j.app.log.error("Uncaught exception:",Q)}),process.on("unhandledRejection",(Q,M)=>{j.app.log.error("Unhandled rejection at:",M,"reason:",Q)}),j}async function JGt(){let d=await c4t();d.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await d.start()}require.main===NEt&&JGt().catch(d=>{console.error("Failed to start server:",d),process.exit(1)});});async function f4t(d){try{let{stdout:g}=await p4t("npm view @wengine-ai/claude-code-router version"),y=g.trim();return{hasUpdate:$Gt(y,d)>0,latestVersion:y,changelog:""}}catch(g){return console.error("Error checking for updates:",g),{hasUpdate:!1,latestVersion:d,changelog:""}}}async function m4t(){try{let{stdout:d,stderr:g}=await p4t("npm update -g @wengine-ai/claude-code-router");return g&&console.error("Update stderr:",g),console.log("Update stdout:",d),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(d){return console.error("Error performing update:",d),{success:!1,message:`Failed to perform update: ${d instanceof Error?d.message:"Unknown error"}`}}}function $Gt(d,g){let y=d.split(".").map(Number),b=g.split(".").map(Number);for(let D=0;D<Math.max(y.length,b.length);D++){let S=D<y.length?y[D]:0,E=D<b.length?b[D]:0;if(S>E)return 1;if(S<E)return-1}return 0}var _4t,d4t,p4t,h4t=Npt(()=>{"use strict";_4t=require("child_process"),d4t=require("util"),p4t=(0,d4t.promisify)(_4t.exec)});var Kft,PEt=Npt(()=>{Kft="2.0.26"});var OEt=Pm(BEt=>{"use strict";Object.defineProperty(BEt,"__esModule",{value:!0});var g4t=require("child_process"),HGt=1024*1024,y4t={exec(d,g){let y={maxBuffer:2*HGt,windowsHide:!0};(0,g4t.exec)(d,y,g)},spawn(d,g,y){return(0,g4t.spawn)(d,g,y)},stripLine(d,g){let y=0;for(;g-- >0;){let b=d.indexOf(`
|
|
2101
|
+
Your response should consistently follow this rule whenever image-related analysis is requested.`});let y=d.body.messages.filter(D=>D.role==="user"&&Array.isArray(D.content)&&D.content.some(S=>S.type==="image"||Array.isArray(S.content)&&S.content.some(E=>E.type==="image"))),b=1;y.forEach(D=>{Array.isArray(D.content)&&D.content.forEach(S=>{S.type==="image"?(Vpt.storeImage(`${d.id}_Image#${b}`,S.source),S.type="text",delete S.source,S.text=`[Image #${b}]This is an image, if you need to view or analyze it, you need to extract the imageId`,b++):S.type==="text"&&S.text.includes("[Image #")?S.text=S.text.replace(/\[Image #\d+\]/g,""):S.type==="tool_result"&&Array.isArray(S.content)&&S.content.some(E=>E.type==="image")&&(Vpt.storeImage(`${d.id}_Image#${b}`,S.content[0].source),S.content=`[Image #${b}]This is an image, if you need to view or analyze it, you need to extract the imageId`,b++)})})}},LGt=new OGt,RGt=class{agents=new Map;registerAgent(d){this.agents.set(d.name,d)}getAgent(d){return this.agents.get(d)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let d=[];for(let g of this.agents.values())d.push(...g.tools.values());return d}},l4t=new RGt;l4t.registerAgent(LGt);var Yxt=l4t,MGt=require("node:events"),Qwt=require("node:perf_hooks");function jGt(){let{ProviderHealthStore:d}=NJt();return new d}var Uwt=new MGt.EventEmitter;function Jwt(d){if(d.usageSessionId)return d.usageSessionId;let g=d.headers?.["x-request-id"],y=Array.isArray(g)?g[0]:g;return d.usageSessionId=d.sessionId||(typeof y=="string"?y:void 0)||d.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,d.usageSessionId}function Zxt(d){return d.body?.model?Array.isArray(d.body.model)?d.body.model.join(","):d.body.model:Array.isArray(d.model)?d.model.join(","):d.model||""}async function QGt(){let d=(0,r3t.homedir)(),g=(0,n3t.join)(d,".claude.json");if(!(0,PJt.existsSync)(g)){let y={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,BJt.writeFile)(g,JSON.stringify(y,null,2))}}async function UGt(d,g){let y=g.plugins||g.Plugins||[];for(let b of y){let{name:D,enabled:S=!1,options:E={}}=b;switch(D){case"token-speed":ICt.registerPlugin(i4t,{enabled:S,outputHandlers:[{type:"temp-file",enabled:!0}],...E});break;default:console.warn(`Unknown plugin: ${D}`);break}}await ICt.enablePlugins(d)}async function c4t(d={}){await QGt(),await pEt();let g=await i3t(),y=g.Providers||g.providers||[],b=y&&y.length>0,D=g.HOST||"127.0.0.1";b?(D=g.HOST,g.APIKEY||(D="127.0.0.1")):(D="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let S=g.PORT||3456,E=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):S,I=Q=>(Q>9?"":"0")+Q,N=(Q,M)=>{let U;Q?typeof Q=="number"?U=new Date(Q):U=Q:U=new Date;let L=U.getFullYear()+""+I(U.getMonth()+1),H=I(U.getDate()),J=I(U.getHours()),q=I(U.getMinutes());return`./logs/ccr-${L}${H}${J}${q}${I(U.getSeconds())}${M?`_${M}`:""}.log`},O;d.logger!==void 0?O=d.logger:g.LOG!==!1?(g.LOG===void 0&&(g.LOG=!0),O={level:g.LOG_LEVEL||"debug",stream:kGt(N,{path:Wxt.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):O=!1;let R=await(0,Wxt.listPresets)(),j=await pGt({jsonPath:Wxt.CONFIG_FILE,initialConfig:{providers:g.Providers||g.providers,HOST:D,PORT:E,LOG_FILE:(0,n3t.join)((0,r3t.homedir)(),".claude-code-router","claude-code-router.log")},logger:O});return await Promise.allSettled(R.map(async Q=>await j.registerNamespace(`/preset/${Q.name}`,Q.config))),await UGt(j,g),j.addHook("onRequest",async Q=>{new URL(`http://127.0.0.1${Q.url}`).pathname.endsWith("/v1/messages")&&!Q.requestStartTime&&(Q.requestStartTime=Qwt.performance.now())}),j.addHook("preHandler",async(Q,M)=>new Promise((U,L)=>{let H=J=>{J?L(J):U()};fGt(g)(Q,M,H).catch(L)})),j.addHook("preHandler",async(Q,M)=>{let U=new URL(`http://127.0.0.1${Q.url}`);Q.pathname=U.pathname,Q.pathname.endsWith("/v1/messages")&&Q.pathname!=="/v1/messages"&&(Q.preset=Q.pathname.replace("/v1/messages","").replace("/",""))}),j.addHook("preHandler",async(Q,M)=>{if(Q.pathname.endsWith("/v1/messages")){let U=[];for(let L of Yxt.getAllAgents())L.shouldHandle(Q,g)&&(U.push(L.name),L.reqHandler(Q,g),L.tools.size&&(Q.body?.tools?.length||(Q.body.tools=[]),Q.body.tools.unshift(...Array.from(L.tools.values()).map(H=>({name:H.name,description:H.description,input_schema:H.input_schema})))));U.length&&(Q.agents=U)}}),j.addHook("onError",async(Q,M,U)=>{Q.errorMessage=U?.message||U?.toString?.()||"Unknown error",Uwt.emit("onError",Q,M,U)}),j.addHook("onSend",(Q,M,U,L)=>{if(Q.pathname?.endsWith("/v1/messages")){let H=Jwt(Q);if(U instanceof ReadableStream){if(Q.agents){let ee=new AbortController,G=U.pipeThrough(new Kxt),se,_e=-1,oe="",fe="",le="",ve=[],Ae=[];return L(null,wGt(G,async(Fe,He)=>{try{if(Fe.event==="content_block_start"&&Fe?.data?.content_block?.name){let Ke=Q.agents.find(Pe=>Yxt.getAgent(Pe)?.tools.get(Fe.data.content_block.name));if(Ke){se=Yxt.getAgent(Ke),_e=Fe.data.index,oe=Fe.data.content_block.name,le=Fe.data.content_block.id;return}}if(_e>-1&&Fe.data.index===_e&&Fe.data?.delta?.type==="input_json_delta"){fe+=Fe.data?.delta?.partial_json;return}if(_e>-1&&Fe.data.index===_e&&Fe.data.type==="content_block_stop"){try{let Ke=FGt.default.parse(fe);Ae.push({type:"tool_use",id:le,name:oe,input:Ke});let Pe=await se?.tools.get(oe)?.handler(Ke,{req:Q,config:g});ve.push({tool_use_id:le,type:"tool_result",content:Pe}),se=void 0,_e=-1,oe="",fe="",le=""}catch(Ke){console.log(Ke)}return}if(Fe.event==="message_delta"&&ve.length){Q.body.messages.push({role:"assistant",content:Ae}),Q.body.messages.push({role:"user",content:ve});let Ke=await fetch(`http://127.0.0.1:${g.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":g.APIKEY,"content-type":"application/json"},body:JSON.stringify(Q.body)});if(!Ke.ok)return;let Pe=Ke.body.pipeThrough(new Kxt).getReader();for(;;)try{let{value:Ge,done:rt}=await Pe.read();if(rt)break;let Rt=Ge;if(["message_start","message_stop"].includes(Rt.event))continue;if(!He.desiredSize)break;He.enqueue(Rt)}catch(Ge){if(Ge.name==="AbortError"||Ge.code==="ERR_STREAM_PREMATURE_CLOSE"){ee.abort();break}throw Ge}return}return Fe}catch(Ke){if(console.error("Unexpected error in stream processing:",Ke),Ke.code==="ERR_STREAM_PREMATURE_CLOSE"){ee.abort();return}throw Ke}}).pipeThrough(new TGt))}let[J,q]=U.tee();return(async ee=>{let G=ee.pipeThrough(new TextDecoderStream).pipeThrough(new Kxt).getReader();try{for(;;){let{done:se,value:_e}=await G.read();if(se)break;let oe=_e.event,fe=_e.data;if(fe?.usage){let le={...pZe.get(H)||{},...fe.usage};(fe.usage.cache_read_input_tokens||fe.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:fe.usage.cache_read_input_tokens,cache_creation:fe.usage.cache_creation_input_tokens}),pZe.put(H,le)}}}catch(se){se.name==="AbortError"||se.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",se)}finally{G.releaseLock()}})(q),L(null,J)}if(pZe.put(H,U.usage),typeof U=="object")return U.error?L(U.error,null):L(U,null)}if(typeof U=="object"&&U.error)return L(U.error,null);L(null,U)}),j.addHook("onSend",async(Q,M,U)=>{if(Uwt.emit("onSend",Q,M,U),M.statusCode>=400&&Q.pathname?.endsWith("/v1/messages"))try{typeof U=="string"?Q.errorResponseBody=U:U&&typeof U=="object"&&(Q.errorResponseBody=JSON.stringify(U))}catch{}return U}),j.addHook("onResponse",async(Q,M)=>{if(Q.pathname?.endsWith("/v1/messages"))try{let U=Jwt(Q),L=pZe.get(U),H=dGt(U),J=jGt(),q,ee;if(M.statusCode>=400){q=Q.errorMessage||M.errorMessage||Q.error?.message||Q.error?.toString?.()||void 0,ee=Q.errorResponseBody;let G=Zxt(Q);J.recordFailure(Q.provider||"",G,q)}else{let G=Zxt(Q);J.recordSuccess(Q.provider||"",G)}lGt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:U,provider:Q.provider||"",originalModel:Q.originalModel||Q.body?.model||"",model:Zxt(Q),modelFamily:Q.modelFamily||"",scenarioType:Q.scenarioType||"default",stream:Q.body?.stream??!1,inputTokens:Q.tokenCount||0,outputTokens:L?.output_tokens||0,cacheReadInputTokens:L?.cache_read_input_tokens||0,cacheCreationInputTokens:L?.cache_creation_input_tokens||0,ttft:H.ttft,tokensPerSecond:H.tokensPerSecond,durationMs:Q.requestStartTime?Math.round(Qwt.performance.now()-Q.requestStartTime):0,status:M.statusCode<400?"success":"error",errorMessage:q,responseBody:ee})}catch(U){console.error("Usage tracking error:",U)}}),process.on("uncaughtException",Q=>{j.app.log.error("Uncaught exception:",Q)}),process.on("unhandledRejection",(Q,M)=>{j.app.log.error("Unhandled rejection at:",M,"reason:",Q)}),j}async function JGt(){let d=await c4t();d.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await d.start()}require.main===NEt&&JGt().catch(d=>{console.error("Failed to start server:",d),process.exit(1)});});async function f4t(d){try{let{stdout:g}=await p4t("npm view @wengine-ai/claude-code-router version"),y=g.trim();return{hasUpdate:$Gt(y,d)>0,latestVersion:y,changelog:""}}catch(g){return console.error("Error checking for updates:",g),{hasUpdate:!1,latestVersion:d,changelog:""}}}async function m4t(){try{let{stdout:d,stderr:g}=await p4t("npm update -g @wengine-ai/claude-code-router");return g&&console.error("Update stderr:",g),console.log("Update stdout:",d),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(d){return console.error("Error performing update:",d),{success:!1,message:`Failed to perform update: ${d instanceof Error?d.message:"Unknown error"}`}}}function $Gt(d,g){let y=d.split(".").map(Number),b=g.split(".").map(Number);for(let D=0;D<Math.max(y.length,b.length);D++){let S=D<y.length?y[D]:0,E=D<b.length?b[D]:0;if(S>E)return 1;if(S<E)return-1}return 0}var _4t,d4t,p4t,h4t=Npt(()=>{"use strict";_4t=require("child_process"),d4t=require("util"),p4t=(0,d4t.promisify)(_4t.exec)});var Kft,PEt=Npt(()=>{Kft="2.0.30"});var OEt=Pm(BEt=>{"use strict";Object.defineProperty(BEt,"__esModule",{value:!0});var g4t=require("child_process"),HGt=1024*1024,y4t={exec(d,g){let y={maxBuffer:2*HGt,windowsHide:!0};(0,g4t.exec)(d,y,g)},spawn(d,g,y){return(0,g4t.spawn)(d,g,y)},stripLine(d,g){let y=0;for(;g-- >0;){let b=d.indexOf(`
|
|
2102
2102
|
`,y);b>=0&&(y=b+1)}return y>0?d.substring(y):d},split(d,g){let y=d.trim().split(/\s+/);return y.length>g&&(y[g-1]=y.slice(g-1).join(" ")),y},extractColumns(d,g,y){let b=d.split(/(\r\n|\n|\r)/),D=[];return y||(y=Math.max.apply(null,g)+1),b.forEach(S=>{let E=y4t.split(S,y),I=[];g.forEach(N=>{I.push(E[N]||"")}),D.push(I)}),D},parseTable(d){let g=d.split(/(\r\n\r\n|\r\n\n|\n\r\n|\n\n)/).filter(y=>y&&y.trim().length>0).map(y=>y.split(/(\r\n|\n|\r)/).filter(b=>b.trim().length>0));return g.forEach(y=>{for(let b=0;y[b];){let D=y[b];D.startsWith(" ")?(y[b-1]+=D.trimLeft(),y.splice(b,1)):b+=1}}),g.map(y=>{let b={};return y.forEach(D=>{let S=D.indexOf(":"),E=D.slice(0,S).trim();b[E]=D.slice(S+1).trim()}),b})}};BEt.default=y4t});var v4t=Pm((A4t,Yft)=>{(function(d,g){"use strict";typeof define=="function"&&define.amd?define(g):typeof Yft=="object"&&Yft.exports?Yft.exports=g():d.log=g()})(A4t,function(){"use strict";var d=function(){},g="undefined",y=typeof window!==g&&typeof window.navigator!==g&&/Trident\/|MSIE /.test(window.navigator.userAgent),b=["trace","debug","info","warn","error"],D={},S=null;function E(U,L){var H=U[L];if(typeof H.bind=="function")return H.bind(U);try{return Function.prototype.bind.call(H,U)}catch{return function(){return Function.prototype.apply.apply(H,[U,arguments])}}}function I(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function N(U){return U==="debug"&&(U="log"),typeof console===g?!1:U==="trace"&&y?I:console[U]!==void 0?E(console,U):console.log!==void 0?E(console,"log"):d}function O(){for(var U=this.getLevel(),L=0;L<b.length;L++){var H=b[L];this[H]=L<U?d:this.methodFactory(H,U,this.name)}if(this.log=this.debug,typeof console===g&&U<this.levels.SILENT)return"No console available for logging"}function R(U){return function(){typeof console!==g&&(O.call(this),this[U].apply(this,arguments))}}function j(U,L,H){return N(U)||R.apply(this,arguments)}function Q(U,L){var H=this,J,q,ee,G="loglevel";typeof U=="string"?G+=":"+U:typeof U=="symbol"&&(G=void 0);function se(ve){var Ae=(b[ve]||"silent").toUpperCase();if(!(typeof window===g||!G)){try{window.localStorage[G]=Ae;return}catch{}try{window.document.cookie=encodeURIComponent(G)+"="+Ae+";"}catch{}}}function _e(){var ve;if(!(typeof window===g||!G)){try{ve=window.localStorage[G]}catch{}if(typeof ve===g)try{var Ae=window.document.cookie,Fe=encodeURIComponent(G),He=Ae.indexOf(Fe+"=");He!==-1&&(ve=/^([^;]+)/.exec(Ae.slice(He+Fe.length+1))[1])}catch{}return H.levels[ve]===void 0&&(ve=void 0),ve}}function oe(){if(!(typeof window===g||!G)){try{window.localStorage.removeItem(G)}catch{}try{window.document.cookie=encodeURIComponent(G)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function fe(ve){var Ae=ve;if(typeof Ae=="string"&&H.levels[Ae.toUpperCase()]!==void 0&&(Ae=H.levels[Ae.toUpperCase()]),typeof Ae=="number"&&Ae>=0&&Ae<=H.levels.SILENT)return Ae;throw new TypeError("log.setLevel() called with invalid level: "+ve)}H.name=U,H.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},H.methodFactory=L||j,H.getLevel=function(){return ee??q??J},H.setLevel=function(ve,Ae){return ee=fe(ve),Ae!==!1&&se(ee),O.call(H)},H.setDefaultLevel=function(ve){q=fe(ve),_e()||H.setLevel(ve,!1)},H.resetLevel=function(){ee=null,oe(),O.call(H)},H.enableAll=function(ve){H.setLevel(H.levels.TRACE,ve)},H.disableAll=function(ve){H.setLevel(H.levels.SILENT,ve)},H.rebuild=function(){if(S!==H&&(J=fe(S.getLevel())),O.call(H),S===H)for(var ve in D)D[ve].rebuild()},J=fe(S?S.getLevel():"WARN");var le=_e();le!=null&&(ee=fe(le)),O.call(H)}S=new Q,S.getLogger=function(L){if(typeof L!="symbol"&&typeof L!="string"||L==="")throw new TypeError("You must supply a name when creating a logger.");var H=D[L];return H||(H=D[L]=new Q(L,S.methodFactory)),H};var M=typeof window!==g?window.log:void 0;return S.noConflict=function(){return typeof window!==g&&window.log===S&&(window.log=M),S},S.getLoggers=function(){return D},S.default=S,S})});var LEt=Pm(QZe=>{"use strict";var qGt=QZe&&QZe.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(QZe,"__esModule",{value:!0});var WGt=qGt(v4t());QZe.default=WGt.default});var C4t=Pm(Are=>{"use strict";var GGt=Are&&Are.__createBinding||(Object.create?(function(d,g,y,b){b===void 0&&(b=y);var D=Object.getOwnPropertyDescriptor(g,y);(!D||("get"in D?!g.__esModule:D.writable||D.configurable))&&(D={enumerable:!0,get:function(){return g[y]}}),Object.defineProperty(d,b,D)}):(function(d,g,y,b){b===void 0&&(b=y),d[b]=g[y]})),VGt=Are&&Are.__setModuleDefault||(Object.create?(function(d,g){Object.defineProperty(d,"default",{enumerable:!0,value:g})}):function(d,g){d.default=g}),b4t=Are&&Are.__importStar||(function(){var d=function(g){return d=Object.getOwnPropertyNames||function(y){var b=[];for(var D in y)Object.prototype.hasOwnProperty.call(y,D)&&(b[b.length]=D);return b},d(g)};return function(g){if(g&&g.__esModule)return g;var y={};if(g!=null)for(var b=d(g),D=0;D<b.length;D++)b[D]!=="default"&&GGt(y,g,b[D]);return VGt(y,g),y}})(),x4t=Are&&Are.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(Are,"__esModule",{value:!0});var KGt=b4t(require("os")),Zft=b4t(require("fs")),rW=x4t(OEt()),YGt=x4t(LEt()),ZGt=d=>new Promise((g,y)=>{Zft.existsSync(d)?g():Zft.mkdir(d,b=>{b?y(b):g()})}),kRe={darwin(d){return new Promise((g,y)=>{rW.default.exec("netstat -anv -p TCP && netstat -anv -p UDP",function(b,D,S){if(b)y(b);else{let E=S.toString().trim();if(E){y(new Error(E));return}let I=rW.default.stripLine(D.toString(),1),N=I.slice(0,I.indexOf(`
|
|
2103
2103
|
`)),O=rW.default.stripLine(I,1),R=N.indexOf("rxbytes")>=0?10:8,j=rW.default.extractColumns(O,[0,3,R],10).filter(Q=>!!String(Q[0]).match(/^(udp|tcp)/)).find(Q=>{let M=String(Q[1]).match(/\.(\d+)$/);return!!(M&&M[1]===String(d))});j&&j[2].length?g(parseInt(j[2],10)):y(new Error(`pid of port (${d}) not found`))}})})},linux(d){return new Promise((g,y)=>{rW.default.exec("netstat -tunlp",function(D,S,E){if(D)y(D);else{let I=E.toString().trim();I&&YGt.default.warn(I);let N=rW.default.stripLine(S.toString(),2),O=rW.default.extractColumns(N,[3,6],7).find(R=>{let j=String(R[0]).match(/:(\d+)$/);return!!(j&&j[1]===String(d))});if(O&&O[1]){let R=O[1].split("/",1)[0];R.length?g(parseInt(R,10)):y(new Error(`pid of port (${d}) not found`))}else y(new Error(`pid of port (${d}) not found`))}})})},win32(d){return new Promise((g,y)=>{rW.default.exec("netstat -ano",function(b,D,S){if(b)y(b);else{let E=S.toString().trim();if(E){y(new Error(E));return}let I=rW.default.stripLine(D.toString(),4),N=rW.default.extractColumns(I,[1,4],5).find(O=>{let R=String(O[0]).match(/:(\d+)$/);return!!(R&&R[1]===String(d))});N&&N[1].length&&parseInt(N[1],10)>0?g(parseInt(N[1],10)):y(new Error(`pid of port (${d}) not found`))}})})},android(d){return new Promise((g,y)=>{let b=KGt.tmpdir()+"/.find-process",D=b+"/"+process.pid,S='netstat -tunp >> "'+D+'"';ZGt(b).then(()=>{rW.default.exec(S,()=>{Zft.readFile(D,"utf8",(E,I)=>{if(Zft.unlink(D,()=>{}),E)y(E);else{I=rW.default.stripLine(I,2);let N=rW.default.extractColumns(I,[3,6],7).find(O=>{let R=String(O[0]).match(/:(\d+)$/);return!!(R&&R[1]===String(d))});if(N&&N[1]){let O=N[1].split("/",1)[0];O.length?g(parseInt(O,10)):y(new Error(`pid of port (${d}) not found`))}else y(new Error(`pid of port (${d}) not found`))}})})})})}};kRe.freebsd=kRe.darwin;kRe.sunos=kRe.darwin;function XGt(d){let g=process.platform;return new Promise((y,b)=>{if(!(g in kRe))return b(new Error(`platform ${g} is unsupported`));let D=kRe[g];D(d).then(y,b)})}Are.default=XGt});var S4t=Pm(vre=>{"use strict";var eVt=vre&&vre.__createBinding||(Object.create?(function(d,g,y,b){b===void 0&&(b=y);var D=Object.getOwnPropertyDescriptor(g,y);(!D||("get"in D?!g.__esModule:D.writable||D.configurable))&&(D={enumerable:!0,get:function(){return g[y]}}),Object.defineProperty(d,b,D)}):(function(d,g,y,b){b===void 0&&(b=y),d[b]=g[y]})),tVt=vre&&vre.__setModuleDefault||(Object.create?(function(d,g){Object.defineProperty(d,"default",{enumerable:!0,value:g})}):function(d,g){d.default=g}),rVt=vre&&vre.__importStar||(function(){var d=function(g){return d=Object.getOwnPropertyNames||function(y){var b=[];for(var D in y)Object.prototype.hasOwnProperty.call(y,D)&&(b[b.length]=D);return b},d(g)};return function(g){if(g&&g.__esModule)return g;var y={};if(g!=null)for(var b=d(g),D=0;D<b.length;D++)b[D]!=="default"&&eVt(y,g,b[D]);return tVt(y,g),y}})(),nVt=vre&&vre.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(vre,"__esModule",{value:!0});var Xft=rVt(require("path")),Y2e=nVt(OEt());function REt(d,g){return g?d&&d.match?d.match(g)!==null:!1:!0}function E4t(d){let g=d.split(Xft.sep),y=g[g.length-1];y&&(g[g.length-1]=y.split(" ")[0]);let b=[];for(let D of g){let S=D.indexOf(" -");if(S>=0){b.push(D.substring(0,S).trim());break}else if(D.endsWith(" ")){b.push(D.trim());break}b.push(D)}return b.join(Xft.sep)}function D4t(d){if(process.platform==="darwin"){let g=d.indexOf(".app/");if(g>=0)return Xft.basename(d.substring(0,g))}return Xft.basename(d)}var SFe={darwin(d){return new Promise((g,y)=>{let b;"pid"in d&&d.pid!==void 0?b=`ps -p ${d.pid} -ww -o pid,ppid,uid,gid,args`:b="ps ax -ww -o pid,ppid,uid,gid,args",Y2e.default.exec(b,function(D,S,E){if(D)"pid"in d&&d.pid!==void 0?g([]):y(D);else{let I=E.toString().trim();if(I){y(new Error(I));return}let N=Y2e.default.stripLine(S.toString(),1),R=Y2e.default.extractColumns(N,[0,1,2,3,4],5).filter(j=>j[0]&&d.pid!==void 0?j[0]===String(d.pid):j[4]&&d.name?REt(j[4],d.name):!!j[0]).map(j=>{let Q=String(j[4]),M=E4t(Q);return{pid:parseInt(j[0],10),ppid:parseInt(j[1],10),uid:parseInt(j[2],10),gid:parseInt(j[3],10),name:D4t(M),bin:M,cmd:j[4]}});d.config.strict&&d.name&&(R=R.filter(j=>j.name===d.name)),g(R)}})})},win32(d){return new Promise((g,y)=>{let b="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-CimInstance -className win32_process | select Name,ProcessId,ParentProcessId,CommandLine,ExecutablePath",D=[],S=Y2e.default.spawn("powershell.exe",["/c",b],{detached:!1,windowsHide:!0});S.stdout.on("data",E=>{D.push(E.toString())}),S.on("error",E=>{y(new Error("Command '"+b+"' failed with reason: "+E.toString()))}),S.on("close",E=>{if(E!==0)return y(new Error("Command '"+b+"' terminated with code: "+E));let I=Y2e.default.parseTable(D.join("")).filter(N=>{if(d.pid!==void 0)return N.ProcessId===String(d.pid);if(d.name){let O=N.Name||"";return d.config.strict?O===d.name||O.endsWith(".exe")&&O.slice(0,-4)===d.name:REt(N.CommandLine||O,d.name)}else return!0}).map(N=>({pid:parseInt(N.ProcessId,10),ppid:parseInt(N.ParentProcessId,10),bin:N.ExecutablePath,name:N.Name||"",cmd:N.CommandLine}));g(I)})})},android(d){return new Promise((g,y)=>{Y2e.default.exec("ps",function(D,S,E){if(D)d.pid!==void 0?g([]):y(D);else{let I=E.toString().trim();if(I){y(new Error(I));return}let N=Y2e.default.stripLine(S.toString(),1),R=Y2e.default.extractColumns(N,[0,3],4).filter(j=>j[0]&&d.pid!==void 0?j[0]===String(d.pid):j[1]&&d.name?REt(j[1],d.name):!!j[0]).map(j=>{let Q=String(j[1]),M=E4t(Q);return{pid:parseInt(j[0],10),ppid:0,name:D4t(M),bin:M,cmd:j[1]}});d.config.strict&&d.name&&(R=R.filter(j=>j.name===d.name)),g(R)}})})}};SFe.linux=SFe.darwin;SFe.sunos=SFe.darwin;SFe.freebsd=SFe.darwin;function iVt(d){let g=process.platform,y=SFe[g];return y?y(d):Promise.reject(new Error(`Platform "${g}" is not supported`))}vre.default=iVt});var T4t=Pm(UZe=>{"use strict";var jEt=UZe&&UZe.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(UZe,"__esModule",{value:!0});var aVt=jEt(C4t()),k4t=jEt(S4t()),oVt=jEt(LEt()),MEt={port(d,g){return(0,aVt.default)(d).then(y=>MEt.pid(y,g),()=>[])},pid(d,g){return(0,k4t.default)({pid:d,config:g})},name(d,g){return(0,k4t.default)({name:d,config:g,skipSelf:!0})}};function sVt(d,g,y){let b=Object.assign({logLevel:"warn",strict:typeof y=="boolean"?y:!1},typeof y=="object"?y:{});return b.logLevel&&oVt.default.setLevel(b.logLevel),new Promise((D,S)=>{if(!(d in MEt))S(new Error(`do not support find by "${d}"`));else{let E=/^\d+$/.test(String(g));d==="pid"&&!E?S(new Error("pid must be a number")):d==="port"&&!E?S(new Error("port must be a number")):MEt[d](g,b).then(D,S)}})}UZe.default=sVt});var F4t=Pm(w4t=>{"use strict";Object.defineProperty(w4t,"__esModule",{value:!0})});var I4t=Pm(bre=>{"use strict";var lVt=bre&&bre.__createBinding||(Object.create?(function(d,g,y,b){b===void 0&&(b=y);var D=Object.getOwnPropertyDescriptor(g,y);(!D||("get"in D?!g.__esModule:D.writable||D.configurable))&&(D={enumerable:!0,get:function(){return g[y]}}),Object.defineProperty(d,b,D)}):(function(d,g,y,b){b===void 0&&(b=y),d[b]=g[y]})),cVt=bre&&bre.__exportStar||function(d,g){for(var y in d)y!=="default"&&!Object.prototype.hasOwnProperty.call(g,y)&&lVt(g,d,y)},uVt=bre&&bre.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(bre,"__esModule",{value:!0});bre.default=void 0;var _Vt=T4t();Object.defineProperty(bre,"default",{enumerable:!0,get:function(){return uVt(_Vt).default}});cVt(F4t(),bre)});function P4t(){let d=0;(0,pR.existsSync)(HO.REFERENCE_COUNT_FILE)&&(d=parseInt((0,pR.readFileSync)(HO.REFERENCE_COUNT_FILE,"utf-8"))||0),d++,(0,pR.writeFileSync)(HO.REFERENCE_COUNT_FILE,d.toString())}function QEt(){let d=0;(0,pR.existsSync)(HO.REFERENCE_COUNT_FILE)&&(d=parseInt((0,pR.readFileSync)(HO.REFERENCE_COUNT_FILE,"utf-8"))||0),d=Math.max(0,d-1),(0,pR.writeFileSync)(HO.REFERENCE_COUNT_FILE,d.toString())}function B4t(){return(0,pR.existsSync)(HO.REFERENCE_COUNT_FILE)&&parseInt((0,pR.readFileSync)(HO.REFERENCE_COUNT_FILE,"utf-8"))||0}function kFe(){if(!(0,pR.existsSync)(HO.PID_FILE))return!1;let d;try{let g=(0,pR.readFileSync)(HO.PID_FILE,"utf-8");if(d=parseInt(g,10),isNaN(d))return Rfe(),!1}catch{return!1}try{if(process.platform==="win32"){let g=`tasklist /FI "PID eq ${d}"`;return(0,N4t.execSync)(g,{stdio:"pipe"}).toString().includes(d.toString())?!0:(Rfe(),!1)}else return process.kill(d,0),!0}catch{return Rfe(),!1}}function Rfe(){if((0,pR.existsSync)(HO.PID_FILE))try{require("fs").unlinkSync(HO.PID_FILE)}catch{}}function O4t(){if(!(0,pR.existsSync)(HO.PID_FILE))return null;try{let d=parseInt((0,pR.readFileSync)(HO.PID_FILE,"utf-8"));return isNaN(d)?null:d}catch{return null}}async function emt(){let d=O4t(),g=await kFe(),b=(await dQ()).PORT||3456;return{running:g,pid:d,port:b,endpoint:`http://127.0.0.1:${b}`,pidFile:HO.PID_FILE,referenceCount:B4t()}}async function L4t(){if(B4t()===0){let g=O4t();if(g&&await kFe())try{process.kill(g,"SIGTERM")}catch{}}}var pR,HO,dVt,N4t,JZe=Npt(()=>{"use strict";pR=require("fs"),HO=Wy(hY());Z2e();dVt=Wy(I4t()),N4t=require("child_process")});var z4t={};Kkt(z4t,{backupConfigFile:()=>J4t,getSettingsPath:()=>HEt,initConfig:()=>pVt,initDir:()=>U4t,readConfigFile:()=>dQ,restartService:()=>zEt,run:()=>$Et,writeConfigFile:()=>$4t});var S$,R4t,X2e,M4t,j4t,FF,Q4t,TRe,JEt,UEt,$Ze,U4t,dQ,J4t,$4t,pVt,$Et,zEt,HEt,Z2e=Npt(()=>{"use strict";S$=Wy(require("node:fs/promises")),R4t=Wy(Rpt()),X2e=Wy(require("node:path")),M4t=require("node:crypto"),j4t=Wy(require("node:os")),FF=Wy(hY()),Q4t=Wy(u4t()),TRe=require("fs");h4t();PEt();JEt=require("child_process");JZe();UEt=d=>{if(typeof d=="string")return d.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(g,y,b)=>{let D=y||b;return process.env[D]||g});if(Array.isArray(d))return d.map(UEt);if(d!==null&&typeof d=="object"){let g={};for(let[y,b]of Object.entries(d))g[y]=UEt(b);return g}return d},$Ze=async d=>{try{await S$.default.access(d)}catch{await S$.default.mkdir(d,{recursive:!0})}},U4t=async()=>{await $Ze(FF.HOME_DIR),await $Ze(FF.PLUGINS_DIR),await $Ze(FF.PRESETS_DIR),await $Ze(X2e.default.join(FF.HOME_DIR,"logs"))},dQ=async()=>{try{let d=await S$.default.readFile(FF.CONFIG_FILE,"utf-8");try{let g=R4t.default.parse(d);return UEt(g)}catch(g){console.error(`Failed to parse config file at ${FF.CONFIG_FILE}`),console.error("Error details:",g.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(d){if(d.code==="ENOENT")try{await U4t();let g=await J4t();g&&console.log(`Backed up existing configuration file to ${g}`);let y={PORT:3456,Providers:[],Router:{}};return await $4t(y),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),y}catch(g){console.error("Failed to create default configuration:",g.message),process.exit(1)}else console.error(`Failed to read config file at ${FF.CONFIG_FILE}`),console.error("Error details:",d.message),process.exit(1)}},J4t=async()=>{try{if(await S$.default.access(FF.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let d=new Date().toISOString().replace(/[:.]/g,"-"),g=`${FF.CONFIG_FILE}.${d}.bak`;await S$.default.copyFile(FF.CONFIG_FILE,g);try{let y=X2e.default.dirname(FF.CONFIG_FILE),b=X2e.default.basename(FF.CONFIG_FILE),S=(await S$.default.readdir(y)).filter(E=>E.startsWith(b)&&E.endsWith(".bak")).sort().reverse();if(S.length>3)for(let E=3;E<S.length;E++){let I=X2e.default.join(y,S[E]);await S$.default.unlink(I)}}catch(y){console.warn("Failed to clean up old backups:",y)}return g}}catch(d){console.error("Failed to backup config file:",d)}return null},$4t=async d=>{await $Ze(FF.HOME_DIR);let g=`${JSON.stringify(d,null,2)}`;await S$.default.writeFile(FF.CONFIG_FILE,g)},pVt=async()=>{let d=await dQ();return Object.assign(process.env,d),d},$Et=async(d=[])=>{if(kFe()){console.log("claude-code-router server is running");return}let y=await(0,Q4t.getServer)(),b=y.app;(0,TRe.writeFileSync)(FF.PID_FILE,process.pid.toString()),b.post("/api/update/perform",async()=>await m4t()),b.get("/api/update/check",async()=>await f4t(Kft)),b.post("/api/restart",async()=>(setTimeout(async()=>{(0,JEt.spawn)("ccr",["restart"],{detached:!0,stdio:"ignore"}).unref()},100),{success:!0,message:"Service restart initiated"})),await y.start()},zEt=async()=>{try{let y=parseInt((0,TRe.readFileSync)(FF.PID_FILE,"utf-8"));if(process.kill(y),Rfe(),(0,TRe.existsSync)(FF.REFERENCE_COUNT_FILE))try{await S$.default.unlink(FF.REFERENCE_COUNT_FILE)}catch{}console.log("claude code router service has been stopped.")}catch{console.log("Service was not running or failed to stop."),Rfe()}console.log("Starting claude code router service...");let d=X2e.default.join(__dirname,"cli.js"),g=(0,JEt.spawn)("node",[d,"start"],{detached:!0,stdio:"ignore"});g.on("error",y=>{throw console.error("Failed to start service:",y),y}),g.unref(),console.log("\u2705 Service started successfully in the background.")},HEt=async d=>{let g=(0,M4t.createHash)("sha256").update(d,"utf-8").digest("hex"),y=X2e.default.join(j4t.default.tmpdir(),"claude-code-router"),b=`ccr-settings-${g}.json`,D=X2e.default.join(y,b);try{await S$.default.access(y)}catch{await S$.default.mkdir(y,{recursive:!0})}try{return await S$.default.access(D),D}catch{return await S$.default.writeFile(D,d,"utf-8"),D}}});var HZe=Pm((xlr,Y4t)=>{var mVt=require("node:tty"),hVt=mVt?.WriteStream?.prototype?.hasColors?.()??!1,fv=(d,g)=>{if(!hVt)return D=>D;let y=`\x1B[${d}m`,b=`\x1B[${g}m`;return D=>{let S=D+"",E=S.indexOf(b);if(E===-1)return y+S+b;let I=y,N=0,R=(g===22?b:"")+y;for(;E!==-1;)I+=S.slice(N,E)+R,N=E+b.length,E=S.indexOf(b,N);return I+=S.slice(N)+b,I}},q2={};q2.reset=fv(0,0);q2.bold=fv(1,22);q2.dim=fv(2,22);q2.italic=fv(3,23);q2.underline=fv(4,24);q2.overline=fv(53,55);q2.inverse=fv(7,27);q2.hidden=fv(8,28);q2.strikethrough=fv(9,29);q2.black=fv(30,39);q2.red=fv(31,39);q2.green=fv(32,39);q2.yellow=fv(33,39);q2.blue=fv(34,39);q2.magenta=fv(35,39);q2.cyan=fv(36,39);q2.white=fv(37,39);q2.gray=fv(90,39);q2.bgBlack=fv(40,49);q2.bgRed=fv(41,49);q2.bgGreen=fv(42,49);q2.bgYellow=fv(43,49);q2.bgBlue=fv(44,49);q2.bgMagenta=fv(45,49);q2.bgCyan=fv(46,49);q2.bgWhite=fv(47,49);q2.bgGray=fv(100,49);q2.redBright=fv(91,39);q2.greenBright=fv(92,39);q2.yellowBright=fv(93,39);q2.blueBright=fv(94,39);q2.magentaBright=fv(95,39);q2.cyanBright=fv(96,39);q2.whiteBright=fv(97,39);q2.bgRedBright=fv(101,49);q2.bgGreenBright=fv(102,49);q2.bgYellowBright=fv(103,49);q2.bgBlueBright=fv(104,49);q2.bgMagentaBright=fv(105,49);q2.bgCyanBright=fv(106,49);q2.bgWhiteBright=fv(107,49);Y4t.exports=q2});var iNt=Pm((Ulr,nNt)=>{"use strict";nNt.exports=EVt;function CVt(d){let g={defaultWidth:0,output:process.stdout,tty:require("tty")};return d?(Object.keys(g).forEach(function(y){d[y]||(d[y]=g[y])}),d):g}function EVt(d){let g=CVt(d);if(g.output.getWindowSize)return g.output.getWindowSize()[0]||g.defaultWidth;if(g.tty.getWindowSize)return g.tty.getWindowSize()[1]||g.defaultWidth;if(g.output.columns)return g.output.columns;if(process.env.CLI_WIDTH){let y=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(y)&&y!==0)return y}return g.defaultWidth}});var oNt=Pm((Jlr,aNt)=>{"use strict";aNt.exports=({onlyFirst:d=!1}={})=>{let g=["[\\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(g,d?void 0:"g")}});var cmt=Pm(($lr,sNt)=>{"use strict";var DVt=oNt();sNt.exports=d=>typeof d=="string"?d.replace(DVt(),""):d});var cNt=Pm((zlr,VEt)=>{"use strict";var lNt=d=>Number.isNaN(d)?!1:d>=4352&&(d<=4447||d===9001||d===9002||11904<=d&&d<=12871&&d!==12351||12880<=d&&d<=19903||19968<=d&&d<=42182||43360<=d&&d<=43388||44032<=d&&d<=55203||63744<=d&&d<=64255||65040<=d&&d<=65049||65072<=d&&d<=65131||65281<=d&&d<=65376||65504<=d&&d<=65510||110592<=d&&d<=110593||127488<=d&&d<=127569||131072<=d&&d<=262141);VEt.exports=lNt;VEt.exports.default=lNt});var _Nt=Pm((Hlr,uNt)=>{"use strict";uNt.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 pNt=Pm((qlr,KEt)=>{"use strict";var SVt=cmt(),kVt=cNt(),TVt=_Nt(),dNt=d=>{if(typeof d!="string"||d.length===0||(d=SVt(d),d.length===0))return 0;d=d.replace(TVt()," ");let g=0;for(let y=0;y<d.length;y++){let b=d.codePointAt(y);b<=31||b>=127&&b<=159||b>=768&&b<=879||(b>65535&&y++,g+=kVt(b)?2:1)}return g};KEt.exports=dNt;KEt.exports.default=dNt});var mNt=Pm((Wlr,fNt)=>{"use strict";fNt.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 YEt=Pm((Glr,gNt)=>{var qZe=mNt(),hNt={};for(let d of Object.keys(qZe))hNt[qZe[d]]=d;var D0={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"]}};gNt.exports=D0;for(let d of Object.keys(D0)){if(!("channels"in D0[d]))throw new Error("missing channels property: "+d);if(!("labels"in D0[d]))throw new Error("missing channel labels property: "+d);if(D0[d].labels.length!==D0[d].channels)throw new Error("channel and label counts mismatch: "+d);let{channels:g,labels:y}=D0[d];delete D0[d].channels,delete D0[d].labels,Object.defineProperty(D0[d],"channels",{value:g}),Object.defineProperty(D0[d],"labels",{value:y})}D0.rgb.hsl=function(d){let g=d[0]/255,y=d[1]/255,b=d[2]/255,D=Math.min(g,y,b),S=Math.max(g,y,b),E=S-D,I,N;S===D?I=0:g===S?I=(y-b)/E:y===S?I=2+(b-g)/E:b===S&&(I=4+(g-y)/E),I=Math.min(I*60,360),I<0&&(I+=360);let O=(D+S)/2;return S===D?N=0:O<=.5?N=E/(S+D):N=E/(2-S-D),[I,N*100,O*100]};D0.rgb.hsv=function(d){let g,y,b,D,S,E=d[0]/255,I=d[1]/255,N=d[2]/255,O=Math.max(E,I,N),R=O-Math.min(E,I,N),j=function(Q){return(O-Q)/6/R+1/2};return R===0?(D=0,S=0):(S=R/O,g=j(E),y=j(I),b=j(N),E===O?D=b-y:I===O?D=1/3+g-b:N===O&&(D=2/3+y-g),D<0?D+=1:D>1&&(D-=1)),[D*360,S*100,O*100]};D0.rgb.hwb=function(d){let g=d[0],y=d[1],b=d[2],D=D0.rgb.hsl(d)[0],S=1/255*Math.min(g,Math.min(y,b));return b=1-1/255*Math.max(g,Math.max(y,b)),[D,S*100,b*100]};D0.rgb.cmyk=function(d){let g=d[0]/255,y=d[1]/255,b=d[2]/255,D=Math.min(1-g,1-y,1-b),S=(1-g-D)/(1-D)||0,E=(1-y-D)/(1-D)||0,I=(1-b-D)/(1-D)||0;return[S*100,E*100,I*100,D*100]};function wVt(d,g){return(d[0]-g[0])**2+(d[1]-g[1])**2+(d[2]-g[2])**2}D0.rgb.keyword=function(d){let g=hNt[d];if(g)return g;let y=1/0,b;for(let D of Object.keys(qZe)){let S=qZe[D],E=wVt(d,S);E<y&&(y=E,b=D)}return b};D0.keyword.rgb=function(d){return qZe[d]};D0.rgb.xyz=function(d){let g=d[0]/255,y=d[1]/255,b=d[2]/255;g=g>.04045?((g+.055)/1.055)**2.4:g/12.92,y=y>.04045?((y+.055)/1.055)**2.4:y/12.92,b=b>.04045?((b+.055)/1.055)**2.4:b/12.92;let D=g*.4124+y*.3576+b*.1805,S=g*.2126+y*.7152+b*.0722,E=g*.0193+y*.1192+b*.9505;return[D*100,S*100,E*100]};D0.rgb.lab=function(d){let g=D0.rgb.xyz(d),y=g[0],b=g[1],D=g[2];y/=95.047,b/=100,D/=108.883,y=y>.008856?y**(1/3):7.787*y+16/116,b=b>.008856?b**(1/3):7.787*b+16/116,D=D>.008856?D**(1/3):7.787*D+16/116;let S=116*b-16,E=500*(y-b),I=200*(b-D);return[S,E,I]};D0.hsl.rgb=function(d){let g=d[0]/360,y=d[1]/100,b=d[2]/100,D,S,E;if(y===0)return E=b*255,[E,E,E];b<.5?D=b*(1+y):D=b+y-b*y;let I=2*b-D,N=[0,0,0];for(let O=0;O<3;O++)S=g+1/3*-(O-1),S<0&&S++,S>1&&S--,6*S<1?E=I+(D-I)*6*S:2*S<1?E=D:3*S<2?E=I+(D-I)*(2/3-S)*6:E=I,N[O]=E*255;return N};D0.hsl.hsv=function(d){let g=d[0],y=d[1]/100,b=d[2]/100,D=y,S=Math.max(b,.01);b*=2,y*=b<=1?b:2-b,D*=S<=1?S:2-S;let E=(b+y)/2,I=b===0?2*D/(S+D):2*y/(b+y);return[g,I*100,E*100]};D0.hsv.rgb=function(d){let g=d[0]/60,y=d[1]/100,b=d[2]/100,D=Math.floor(g)%6,S=g-Math.floor(g),E=255*b*(1-y),I=255*b*(1-y*S),N=255*b*(1-y*(1-S));switch(b*=255,D){case 0:return[b,N,E];case 1:return[I,b,E];case 2:return[E,b,N];case 3:return[E,I,b];case 4:return[N,E,b];case 5:return[b,E,I]}};D0.hsv.hsl=function(d){let g=d[0],y=d[1]/100,b=d[2]/100,D=Math.max(b,.01),S,E;E=(2-y)*b;let I=(2-y)*D;return S=y*D,S/=I<=1?I:2-I,S=S||0,E/=2,[g,S*100,E*100]};D0.hwb.rgb=function(d){let g=d[0]/360,y=d[1]/100,b=d[2]/100,D=y+b,S;D>1&&(y/=D,b/=D);let E=Math.floor(6*g),I=1-b;S=6*g-E,(E&1)!==0&&(S=1-S);let N=y+S*(I-y),O,R,j;switch(E){default:case 6:case 0:O=I,R=N,j=y;break;case 1:O=N,R=I,j=y;break;case 2:O=y,R=I,j=N;break;case 3:O=y,R=N,j=I;break;case 4:O=N,R=y,j=I;break;case 5:O=I,R=y,j=N;break}return[O*255,R*255,j*255]};D0.cmyk.rgb=function(d){let g=d[0]/100,y=d[1]/100,b=d[2]/100,D=d[3]/100,S=1-Math.min(1,g*(1-D)+D),E=1-Math.min(1,y*(1-D)+D),I=1-Math.min(1,b*(1-D)+D);return[S*255,E*255,I*255]};D0.xyz.rgb=function(d){let g=d[0]/100,y=d[1]/100,b=d[2]/100,D,S,E;return D=g*3.2406+y*-1.5372+b*-.4986,S=g*-.9689+y*1.8758+b*.0415,E=g*.0557+y*-.204+b*1.057,D=D>.0031308?1.055*D**(1/2.4)-.055:D*12.92,S=S>.0031308?1.055*S**(1/2.4)-.055:S*12.92,E=E>.0031308?1.055*E**(1/2.4)-.055:E*12.92,D=Math.min(Math.max(0,D),1),S=Math.min(Math.max(0,S),1),E=Math.min(Math.max(0,E),1),[D*255,S*255,E*255]};D0.xyz.lab=function(d){let g=d[0],y=d[1],b=d[2];g/=95.047,y/=100,b/=108.883,g=g>.008856?g**(1/3):7.787*g+16/116,y=y>.008856?y**(1/3):7.787*y+16/116,b=b>.008856?b**(1/3):7.787*b+16/116;let D=116*y-16,S=500*(g-y),E=200*(y-b);return[D,S,E]};D0.lab.xyz=function(d){let g=d[0],y=d[1],b=d[2],D,S,E;S=(g+16)/116,D=y/500+S,E=S-b/200;let I=S**3,N=D**3,O=E**3;return S=I>.008856?I:(S-16/116)/7.787,D=N>.008856?N:(D-16/116)/7.787,E=O>.008856?O:(E-16/116)/7.787,D*=95.047,S*=100,E*=108.883,[D,S,E]};D0.lab.lch=function(d){let g=d[0],y=d[1],b=d[2],D;D=Math.atan2(b,y)*360/2/Math.PI,D<0&&(D+=360);let E=Math.sqrt(y*y+b*b);return[g,E,D]};D0.lch.lab=function(d){let g=d[0],y=d[1],D=d[2]/360*2*Math.PI,S=y*Math.cos(D),E=y*Math.sin(D);return[g,S,E]};D0.rgb.ansi16=function(d,g=null){let[y,b,D]=d,S=g===null?D0.rgb.hsv(d)[2]:g;if(S=Math.round(S/50),S===0)return 30;let E=30+(Math.round(D/255)<<2|Math.round(b/255)<<1|Math.round(y/255));return S===2&&(E+=60),E};D0.hsv.ansi16=function(d){return D0.rgb.ansi16(D0.hsv.rgb(d),d[2])};D0.rgb.ansi256=function(d){let g=d[0],y=d[1],b=d[2];return g===y&&y===b?g<8?16:g>248?231:Math.round((g-8)/247*24)+232:16+36*Math.round(g/255*5)+6*Math.round(y/255*5)+Math.round(b/255*5)};D0.ansi16.rgb=function(d){let g=d%10;if(g===0||g===7)return d>50&&(g+=3.5),g=g/10.5*255,[g,g,g];let y=(~~(d>50)+1)*.5,b=(g&1)*y*255,D=(g>>1&1)*y*255,S=(g>>2&1)*y*255;return[b,D,S]};D0.ansi256.rgb=function(d){if(d>=232){let S=(d-232)*10+8;return[S,S,S]}d-=16;let g,y=Math.floor(d/36)/5*255,b=Math.floor((g=d%36)/6)/5*255,D=g%6/5*255;return[y,b,D]};D0.rgb.hex=function(d){let y=(((Math.round(d[0])&255)<<16)+((Math.round(d[1])&255)<<8)+(Math.round(d[2])&255)).toString(16).toUpperCase();return"000000".substring(y.length)+y};D0.hex.rgb=function(d){let g=d.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!g)return[0,0,0];let y=g[0];g[0].length===3&&(y=y.split("").map(I=>I+I).join(""));let b=parseInt(y,16),D=b>>16&255,S=b>>8&255,E=b&255;return[D,S,E]};D0.rgb.hcg=function(d){let g=d[0]/255,y=d[1]/255,b=d[2]/255,D=Math.max(Math.max(g,y),b),S=Math.min(Math.min(g,y),b),E=D-S,I,N;return E<1?I=S/(1-E):I=0,E<=0?N=0:D===g?N=(y-b)/E%6:D===y?N=2+(b-g)/E:N=4+(g-y)/E,N/=6,N%=1,[N*360,E*100,I*100]};D0.hsl.hcg=function(d){let g=d[1]/100,y=d[2]/100,b=y<.5?2*g*y:2*g*(1-y),D=0;return b<1&&(D=(y-.5*b)/(1-b)),[d[0],b*100,D*100]};D0.hsv.hcg=function(d){let g=d[1]/100,y=d[2]/100,b=g*y,D=0;return b<1&&(D=(y-b)/(1-b)),[d[0],b*100,D*100]};D0.hcg.rgb=function(d){let g=d[0]/360,y=d[1]/100,b=d[2]/100;if(y===0)return[b*255,b*255,b*255];let D=[0,0,0],S=g%1*6,E=S%1,I=1-E,N=0;switch(Math.floor(S)){case 0:D[0]=1,D[1]=E,D[2]=0;break;case 1:D[0]=I,D[1]=1,D[2]=0;break;case 2:D[0]=0,D[1]=1,D[2]=E;break;case 3:D[0]=0,D[1]=I,D[2]=1;break;case 4:D[0]=E,D[1]=0,D[2]=1;break;default:D[0]=1,D[1]=0,D[2]=I}return N=(1-y)*b,[(y*D[0]+N)*255,(y*D[1]+N)*255,(y*D[2]+N)*255]};D0.hcg.hsv=function(d){let g=d[1]/100,y=d[2]/100,b=g+y*(1-g),D=0;return b>0&&(D=g/b),[d[0],D*100,b*100]};D0.hcg.hsl=function(d){let g=d[1]/100,b=d[2]/100*(1-g)+.5*g,D=0;return b>0&&b<.5?D=g/(2*b):b>=.5&&b<1&&(D=g/(2*(1-b))),[d[0],D*100,b*100]};D0.hcg.hwb=function(d){let g=d[1]/100,y=d[2]/100,b=g+y*(1-g);return[d[0],(b-g)*100,(1-b)*100]};D0.hwb.hcg=function(d){let g=d[1]/100,b=1-d[2]/100,D=b-g,S=0;return D<1&&(S=(b-D)/(1-D)),[d[0],D*100,S*100]};D0.apple.rgb=function(d){return[d[0]/65535*255,d[1]/65535*255,d[2]/65535*255]};D0.rgb.apple=function(d){return[d[0]/255*65535,d[1]/255*65535,d[2]/255*65535]};D0.gray.rgb=function(d){return[d[0]/100*255,d[0]/100*255,d[0]/100*255]};D0.gray.hsl=function(d){return[0,0,d[0]]};D0.gray.hsv=D0.gray.hsl;D0.gray.hwb=function(d){return[0,100,d[0]]};D0.gray.cmyk=function(d){return[0,0,0,d[0]]};D0.gray.lab=function(d){return[d[0],0,0]};D0.gray.hex=function(d){let g=Math.round(d[0]/100*255)&255,b=((g<<16)+(g<<8)+g).toString(16).toUpperCase();return"000000".substring(b.length)+b};D0.rgb.gray=function(d){return[(d[0]+d[1]+d[2])/3/255*100]}});var ANt=Pm((Vlr,yNt)=>{var umt=YEt();function FVt(){let d={},g=Object.keys(umt);for(let y=g.length,b=0;b<y;b++)d[g[b]]={distance:-1,parent:null};return d}function IVt(d){let g=FVt(),y=[d];for(g[d].distance=0;y.length;){let b=y.pop(),D=Object.keys(umt[b]);for(let S=D.length,E=0;E<S;E++){let I=D[E],N=g[I];N.distance===-1&&(N.distance=g[b].distance+1,N.parent=b,y.unshift(I))}}return g}function NVt(d,g){return function(y){return g(d(y))}}function PVt(d,g){let y=[g[d].parent,d],b=umt[g[d].parent][d],D=g[d].parent;for(;g[D].parent;)y.unshift(g[D].parent),b=NVt(umt[g[D].parent][D],b),D=g[D].parent;return b.conversion=y,b}yNt.exports=function(d){let g=IVt(d),y={},b=Object.keys(g);for(let D=b.length,S=0;S<D;S++){let E=b[S];g[E].parent!==null&&(y[E]=PVt(E,g))}return y}});var bNt=Pm((Klr,vNt)=>{var ZEt=YEt(),BVt=ANt(),IRe={},OVt=Object.keys(ZEt);function LVt(d){let g=function(...y){let b=y[0];return b==null?b:(b.length>1&&(y=b),d(y))};return"conversion"in d&&(g.conversion=d.conversion),g}function RVt(d){let g=function(...y){let b=y[0];if(b==null)return b;b.length>1&&(y=b);let D=d(y);if(typeof D=="object")for(let S=D.length,E=0;E<S;E++)D[E]=Math.round(D[E]);return D};return"conversion"in d&&(g.conversion=d.conversion),g}OVt.forEach(d=>{IRe[d]={},Object.defineProperty(IRe[d],"channels",{value:ZEt[d].channels}),Object.defineProperty(IRe[d],"labels",{value:ZEt[d].labels});let g=BVt(d);Object.keys(g).forEach(b=>{let D=g[b];IRe[d][b]=RVt(D),IRe[d][b].raw=LVt(D)})});vNt.exports=IRe});var kNt=Pm((Ylr,SNt)=>{"use strict";var xNt=(d,g)=>(...y)=>`\x1B[${d(...y)+g}m`,CNt=(d,g)=>(...y)=>{let b=d(...y);return`\x1B[${38+g};5;${b}m`},ENt=(d,g)=>(...y)=>{let b=d(...y);return`\x1B[${38+g};2;${b[0]};${b[1]};${b[2]}m`},_mt=d=>d,DNt=(d,g,y)=>[d,g,y],NRe=(d,g,y)=>{Object.defineProperty(d,g,{get:()=>{let b=y();return Object.defineProperty(d,g,{value:b,enumerable:!0,configurable:!0}),b},enumerable:!0,configurable:!0})},XEt,PRe=(d,g,y,b)=>{XEt===void 0&&(XEt=bNt());let D=b?10:0,S={};for(let[E,I]of Object.entries(XEt)){let N=E==="ansi16"?"ansi":E;E===g?S[N]=d(y,D):typeof I=="object"&&(S[N]=d(I[g],D))}return S};function MVt(){let d=new Map,g={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]}};g.color.gray=g.color.blackBright,g.bgColor.bgGray=g.bgColor.bgBlackBright,g.color.grey=g.color.blackBright,g.bgColor.bgGrey=g.bgColor.bgBlackBright;for(let[y,b]of Object.entries(g)){for(let[D,S]of Object.entries(b))g[D]={open:`\x1B[${S[0]}m`,close:`\x1B[${S[1]}m`},b[D]=g[D],d.set(S[0],S[1]);Object.defineProperty(g,y,{value:b,enumerable:!1})}return Object.defineProperty(g,"codes",{value:d,enumerable:!1}),g.color.close="\x1B[39m",g.bgColor.close="\x1B[49m",NRe(g.color,"ansi",()=>PRe(xNt,"ansi16",_mt,!1)),NRe(g.color,"ansi256",()=>PRe(CNt,"ansi256",_mt,!1)),NRe(g.color,"ansi16m",()=>PRe(ENt,"rgb",DNt,!1)),NRe(g.bgColor,"ansi",()=>PRe(xNt,"ansi16",_mt,!0)),NRe(g.bgColor,"ansi256",()=>PRe(CNt,"ansi256",_mt,!0)),NRe(g.bgColor,"ansi16m",()=>PRe(ENt,"rgb",DNt,!0)),g}Object.defineProperty(SNt,"exports",{enumerable:!0,get:MVt})});var FNt=Pm((Zlr,wNt)=>{"use strict";var WZe=pNt(),jVt=cmt(),QVt=kNt(),tDt=new Set(["\x1B","\x9B"]),UVt=39,TNt=d=>`${tDt.values().next().value}[${d}m`,JVt=d=>d.split(" ").map(g=>WZe(g)),eDt=(d,g,y)=>{let b=[...g],D=!1,S=WZe(jVt(d[d.length-1]));for(let[E,I]of b.entries()){let N=WZe(I);if(S+N<=y?d[d.length-1]+=I:(d.push(I),S=0),tDt.has(I))D=!0;else if(D&&I==="m"){D=!1;continue}D||(S+=N,S===y&&E<b.length-1&&(d.push(""),S=0))}!S&&d[d.length-1].length>0&&d.length>1&&(d[d.length-2]+=d.pop())},$Vt=d=>{let g=d.split(" "),y=g.length;for(;y>0&&!(WZe(g[y-1])>0);)y--;return y===g.length?d:g.slice(0,y).join(" ")+g.slice(y).join("")},zVt=(d,g,y={})=>{if(y.trim!==!1&&d.trim()==="")return"";let b="",D="",S,E=JVt(d),I=[""];for(let[N,O]of d.split(" ").entries()){y.trim!==!1&&(I[I.length-1]=I[I.length-1].trimLeft());let R=WZe(I[I.length-1]);if(N!==0&&(R>=g&&(y.wordWrap===!1||y.trim===!1)&&(I.push(""),R=0),(R>0||y.trim===!1)&&(I[I.length-1]+=" ",R++)),y.hard&&E[N]>g){let j=g-R,Q=1+Math.floor((E[N]-j-1)/g);Math.floor((E[N]-1)/g)<Q&&I.push(""),eDt(I,O,g);continue}if(R+E[N]>g&&R>0&&E[N]>0){if(y.wordWrap===!1&&R<g){eDt(I,O,g);continue}I.push("")}if(R+E[N]>g&&y.wordWrap===!1){eDt(I,O,g);continue}I[I.length-1]+=O}y.trim!==!1&&(I=I.map($Vt)),b=I.join(`
|
|
2104
2104
|
`);for(let[N,O]of[...b].entries()){if(D+=O,tDt.has(O)){let j=parseFloat(/\d[^m]*/.exec(b.slice(N,N+4)));S=j===UVt?null:j}let R=QVt.codes.get(Number(S));S&&R&&(b[N+1]===`
|