@wengine-ai/claude-code-router-next 2.1.23 → 2.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +5 -5
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -581,9 +581,9 @@ ${this.toMarkdown(Q,_+1)}`:`${F}- ${Q}`).join(`
581
581
  ${this.toMarkdown(j,_+1)}`:`${F}${Q}: ${j}`).join(`
582
582
  `):`${F}${p}`}async output(p,_={}){try{let F=this.formatData(p,_);switch(this.config.level||"log"){case"info":console.info(F);break;case"warn":console.warn(F);break;case"error":console.error(F);break;case"debug":console.debug(F);break;case"log":default:console.log(F);break}return!0}catch(F){return console.error("[ConsoleOutputHandler] Output failed:",F),!1}}}}),sf,ka=u(()=>{"use strict";sf=class{type="webhook";config;defaultTimeout=3e4;constructor(p){if(!p.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...p}}buildHeaders(){let p={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(p.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let _=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");p.Authorization=`Basic ${_}`}break;case"custom":this.config.auth.custom&&(p[this.config.auth.custom.header]=this.config.auth.custom.value);break}return p}buildBody(p,_){let{format:F="json",timestamp:Q=!0,prefix:j,metadata:P}=_||{},G={data:p};return Q&&(G.timestamp=new Date().toISOString()),j&&(G.prefix=j),P&&Object.keys(P).length>0&&(G.metadata=P),G}async sendRequest(p,_,F,Q,j){let P=new AbortController,G=setTimeout(()=>P.abort(),j);try{let Y=await fetch(p,{method:_,headers:F,body:JSON.stringify(Q),signal:P.signal});if(clearTimeout(G),!Y.ok)throw new Error(`HTTP ${Y.status}: ${Y.statusText}`);return Y}catch(Y){throw clearTimeout(G),Y}}delay(p){return new Promise(_=>setTimeout(_,p))}async sendWithRetry(p,_,F,Q,j,P){let G=null;for(let Y=1;Y<=P.maxAttempts;Y++)try{return await this.sendRequest(p,_,F,Q,j)}catch(te){if(G=te,Y===P.maxAttempts)break;let W=P.backoffMs*Math.pow(2,Y-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${Y}/${P.maxAttempts}), retrying in ${W}ms...`,te.message),await this.delay(W)}throw G}async output(p,_={}){let F=_.timeout||this.defaultTimeout;try{let Q=this.buildHeaders(),j=this.buildBody(p,_),P=await this.sendWithRetry(this.config.url,this.config.method,Q,j,F,this.config.retry);return!0}catch(Q){let j=Q instanceof Error?Q.message:String(Q);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${j}`),!1;throw new Error(`Webhook output failed: ${j}`)}}}}),hl,Vh,dl,af,uf=u(()=>{"use strict";hl=require("fs"),Vh=require("path"),dl=require("os"),af=class{type="temp-file";config;baseDir;constructor(p={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...p};let _=(0,dl.tmpdir)();this.baseDir=(0,Vh.join)(_,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,hl.existsSync)(this.baseDir)||(0,hl.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(p){try{let _=p.match(/_session_([a-f0-9-]+)/i);return _?_[1]:null}catch{return null}}getFilePath(p){let _=this.config.prefix||"session",F=this.config.extension?`.${this.config.extension}`:"",Q;if(this.config.includeTimestamp){let j=Date.now();Q=`${_}-${p}-${j}${F}`}else Q=`${_}-${p}${F}`;return(0,Vh.join)(this.baseDir,Q)}async output(p,_={}){try{let F=_.metadata?.sessionId;if(!F)return!1;let Q={...p,timestamp:Date.now(),sessionId:F},j=this.getFilePath(F);return(0,hl.writeFileSync)(j,JSON.stringify(Q,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),lf,Al,Ug=u(()=>{"use strict";yc(),ka(),uf(),lf=class{handlers=new Map;defaultOptions={};registerHandler(p,_){this.handlers.set(p,_)}registerHandlers(p){for(let _ of p)if(_.enabled!==!1)try{let F=this.createHandler(_),Q=_.type+"_"+Date.now();this.registerHandler(Q,F)}catch(F){console.error(`[OutputManager] Failed to register ${_.type} handler:`,F)}}createHandler(p){switch(p.type){case"console":return new ko(p.config);case"webhook":return new sf(p.config);case"temp-file":return new af(p.config);default:throw new Error(`Unknown output handler type: ${p.type}`)}}unregisterHandler(p){return this.handlers.delete(p)}getHandler(p){return this.handlers.get(p)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(p){this.defaultOptions={...this.defaultOptions,...p}}getDefaultOptions(){return{...this.defaultOptions}}async output(p,_){let F={...this.defaultOptions,..._},Q={success:[],failed:[]},j=Array.from(this.handlers.entries()).map(async([P,G])=>{try{await G.output(p,F)?Q.success.push(P):Q.failed.push(P)}catch(Y){console.error(`[OutputManager] Handler ${P} failed:`,Y),Q.failed.push(P)}});return await Promise.all(j),Q}async outputTo(p,_,F){let Q={...this.defaultOptions,...F},j={success:[],failed:[]},P=p.map(async G=>{let Y=this.handlers.get(G);if(!Y){console.warn(`[OutputManager] Handler ${G} not found`),j.failed.push(G);return}try{await Y.output(_,Q)?j.success.push(G):j.failed.push(G)}catch(te){console.error(`[OutputManager] Handler ${G} failed:`,te),j.failed.push(G)}});return await Promise.all(P),j}async outputToType(p,_,F){let Q=Array.from(this.handlers.entries()).filter(([j,P])=>P.type===p).map(([j])=>j);return this.outputTo(Q,_,F)}},Al=new lf}),cf={};c(cf,{ActiveProbeService:()=>kb,ConfigService:()=>Jh,ProviderHealthStore:()=>k,ProviderService:()=>yl,SSEParserTransform:()=>Nb,SSESerializerTransform:()=>HN,TokenizerService:()=>om,TransformerService:()=>tm,calculateTokenCount:()=>wb,default:()=>zN,getActiveProbeService:()=>Tb,getAllQuotaResults:()=>dN,getAllRateLimitInfo:()=>td,getHealthStore:()=>S,getQuotaAdapter:()=>Fb,getQuotaResult:()=>Cb,getRateLimitInfo:()=>ed,getRuntimeDebugLog:()=>oa,initQuotaStorePersistence:()=>fN,initRateLimitPersistence:()=>yf,pluginManager:()=>jN,resetActiveProbeService:()=>MN,rewriteStream:()=>qN,router:()=>cm,searchProjectBySession:()=>Sb,sessionUsageCache:()=>gb,setRuntimeDebugLog:()=>ia,startActiveProbe:()=>Rb,stopActiveProbe:()=>Qb,storeQuotaResult:()=>Db,tokenSpeedPlugin:()=>VN}),t.exports=d(cf);var jg=A(NI(),1),$g=A(OI(),1),Yh=require("fs"),hf=require("path"),Hg=LI(),qg=A(C(),1),Jh=class{config={};options;constructor(p={jsonPath:"./config.json"}){this.options={envPath:p.envPath||".env",jsonPath:p.jsonPath,useEnvFile:!1,useJsonFile:p.useJsonFile!==!1,useEnvironmentVariables:p.useEnvironmentVariables!==!1,...p},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 p=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,hf.join)(process.cwd(),this.options.jsonPath);if((0,Yh.existsSync)(p))try{let _=(0,Yh.readFileSync)(p,"utf-8"),F=qg.default.parse(_);this.config={...this.config,...F},console.log(`Loaded JSON config from: ${p}`)}catch(_){console.warn(`Failed to load JSON config from ${p}:`,_)}else console.warn(`JSON config file not found: ${p}`)}loadEnvConfig(){let p=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,hf.join)(process.cwd(),this.options.envPath);if((0,Yh.existsSync)(p))try{let _=(0,Hg.config)({path:p});_.parsed&&(this.config={...this.config,...this.parseEnvConfig(_.parsed)})}catch(_){console.warn(`Failed to load .env config from ${p}:`,_)}}loadEnvironmentVariables(){let p=this.parseEnvConfig(process.env);this.config={...this.config,...p}}parseEnvConfig(p){let _={};return Object.assign(_,p),_}isAbsolutePath(p){return p.startsWith("/")||p.includes(":")}get(p,_){let F=this.config[p];return F!==void 0?F:_}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(p){return this.config[p]!==void 0}set(p,_){this.config[p]=_}reload(){this.config={},this.loadConfig()}getConfigSummary(){let p=[];return this.options.initialConfig&&p.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&p.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&p.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&p.push("Environment Variables"),`Config sources: ${p.join(", ")}`}};function Xi(p,_=500,F="internal_error",Q="api_error"){let j=new Error(p);return j.statusCode=_,j.code=F,j.type=Q,j}async function Gg(p,_,F){_.log.error(p);let Q=p.statusCode||500;if(p.rawBody)try{let P=JSON.parse(p.rawBody);return F.code(Q).send(P)}catch{return F.code(Q).send(p.rawBody)}let j={error:{message:p.message+(p.stack||"Internal Server Error"),type:p.type||"api_error",code:p.code||"internal_error"}};return F.code(Q).send(j)}var Vg=lo();function Qi(p,_,F,Q,j){let P=new Headers({"Content-Type":"application/json"});F.headers&&Object.entries(F.headers).forEach(([W,ne])=>{ne&&P.set(W,ne)});let G,Y=AbortSignal.timeout(F.TIMEOUT??60*1e3*60);if(F.signal){let W=new AbortController,ne=()=>W.abort();F.signal.addEventListener("abort",ne),Y.addEventListener("abort",ne),G=W.signal}else G=Y;let te={method:"POST",headers:P,body:JSON.stringify(_),signal:G};return F.httpsProxy&&(te.dispatcher=new Vg.ProxyAgent(new URL(F.httpsProxy).toString())),j?.debug({reqId:Q.req.id,request:te,headers:Object.fromEntries(P.entries()),requestUrl:typeof p=="string"?p:p.toString(),useProxy:F.httpsProxy},"final request"),fetch(typeof p=="string"?p:p.toString(),te)}var fl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Ta={maxBodyLength:4096,maxStreamChunks:100},pl=!1;function ia(p){pl=p}function oa(){return pl}function go(p){return pl||p.get("DEBUG_LOG")===!0}function gl(p){let _=p.get("DEBUG_LOG_OPTIONS");return!_||typeof _!="object"?Ta:{maxBodyLength:_.maxBodyLength??Ta.maxBodyLength,maxStreamChunks:_.maxStreamChunks??Ta.maxStreamChunks}}function zh(p){let _={};for(let[F,Q]of Object.entries(p))fl.has(F.toLowerCase())?_[F]="***MASKED***":_[F]=Q;return _}function xs(p,_){return p.length<=_?p:p.slice(0,_)+`...[truncated, total ${p.length} bytes]`}function df(p,_,F){let Q=typeof F.body=="string"?F.body:JSON.stringify(F.body);p.info({debug_log:!0,reqId:_,phase:"provider_request",url:F.url,headers:zh(F.headers),body:xs(Q,Ta.maxBodyLength)})}function Af(p,_,F){p.info({debug_log:!0,reqId:_,phase:"provider_response",status:F.status,headers:zh(F.headers),...F.body!==void 0?{body:xs(F.body,Ta.maxBodyLength)}:{}})}function ml(p,_,F,Q){p.info({debug_log:!0,reqId:_,phase:"provider_stream_chunk",chunkIndex:F,data:xs(Q,Ta.maxBodyLength)})}function Wh(p,_,F){p.info({debug_log:!0,reqId:_,phase:"provider_stream_end",totalChunks:F})}function ff(p,_,F,Q){(async()=>{let j=p.pipeThrough(new TextDecoderStream).getReader(),P=0;try{let G="";for(;;){let{done:Y,value:te}=await j.read();if(Y)break;G+=te;let W=G.split(`
583
583
 
584
- `);G=W.pop()||"";for(let ne of W)ne.trim()&&(P<Q.maxStreamChunks?ml(_,F,P,ne):P===Q.maxStreamChunks&&_.info({debug_log:!0,reqId:F,phase:"provider_stream_chunk_omitted",message:`[chunks after #${P} omitted, maxStreamChunks=${Q.maxStreamChunks}]`}),P++)}G.trim()&&(P<Q.maxStreamChunks&&ml(_,F,P,G.trim()),P++),Wh(_,F,P)}catch(G){console.error(`[debug_log] Error reading debug stream for reqId=${F}:`,G),Wh(_,F,P)}finally{j.releaseLock()}})()}var pf="2.1.10";O();var sa=require("fs"),Kh=require("path"),gf=Ka(),Zh=(0,Kh.join)(gf.HOME_DIR,"runtime"),Xh=(0,Kh.join)(Zh,"rate-limit.json"),gu=new Map,mf=!1,Yg=null,Dc=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Jg=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],Ef=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Cc(p,_,F){let Q=Y=>{if(F instanceof Headers)return F.get(Y);let te=Object.keys(F).find(W=>W.toLowerCase()===Y);return te?F[te]:null},j=mu(Q,Dc),P=mu(Q,Jg),G=mu(Q,Ef);(j||P||G)&&gu.set(p,{provider:p,remaining:_s(j),limit:_s(P),reset:bc(G),capturedAt:Date.now()})}function ed(p){return gu.get(p)}function td(){return Array.from(gu.values())}function mu(p,_){for(let F of _){let Q=p(F);if(Q)return Q}return null}function _s(p){if(!p)return null;let _=Number(p.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function bc(p){if(!p)return null;let _=p.trim();if(!_)return null;let F=Number(_);if(Number.isFinite(F))return F>1e12?Math.floor(F/1e3):F>1e9?Math.floor(F):Math.floor(Date.now()/1e3+F);let Q=Date.parse(_);if(Number.isFinite(Q))return Math.floor(Q/1e3);let j=zg(_);return j===null?null:Math.floor((Date.now()+j)/1e3)}function zg(p){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,F=0,Q=!1;for(let j of p.matchAll(_)){Q=!0;let P=Number(j[1]),G=j[2].toLowerCase();if(Number.isFinite(P))switch(G){case"ms":F+=P;break;case"s":F+=P*1e3;break;case"m":F+=P*60*1e3;break;case"h":F+=P*60*60*1e3;break;case"d":F+=P*24*60*60*1e3;break}}return Q?F:null}function Wg(){try{if(!(0,sa.existsSync)(Xh))return;let p=JSON.parse((0,sa.readFileSync)(Xh,"utf-8"));if(!Array.isArray(p))return;let _=Date.now();for(let F of p)if(F&&F.provider){if(F.capturedAt&&_-F.capturedAt>3600*1e3)continue;gu.set(F.provider,F)}}catch{}}function El(){try{if(gu.size===0)return;(0,sa.existsSync)(Zh)||(0,sa.mkdirSync)(Zh,{recursive:!0}),(0,sa.writeFileSync)(Xh,JSON.stringify(Array.from(gu.values()),null,2),"utf-8")}catch{}}function yf(){mf||(mf=!0,Wg(),Yg=setInterval(El,6e4),process.on("exit",El))}B();async function Kg(p,_,F,Q){let j=p.body,P=p.provider,G=F.providerService.getProvider(P);if(!G)throw Xi(`Provider '${P}' not found`,404,"provider_not_found");try{let{requestBody:Y,config:te,bypass:W}=await Cf(j,G,Q,p.headers,{req:p}),ne=await bf(Y,te,G,F,W,Q,{req:p});try{G?.baseUrl&&ne?.headers&&Cc(P,G.baseUrl,ne.headers)}catch{}let le=await wf(Y,ne,G,Q,W,{req:p}),Ae=Bf(le,_,j,F);try{let re=j.model||p.originalModel;P&&re&&S().recordSuccess(P,re)}catch{}return Ae}catch(Y){let te=await Df(p,_,F,Q,Y);if(te)return te;throw Y}}async function Df(p,_,F,Q,j){let P=p.scenarioType||"default",G=p.familyFallback,Y=p.modelFamily,te=F.configService.get("fallback"),W=S(),ne=p.provider||"",le=p.body.model||"",Ae=new Set;if(ne&&le&&(W.recordFailure(ne,le,j?.message),Ae.add(`${ne},${le}`),F.recordUsage?.({provider:ne,model:le,originalModel:p.originalModel||le,scenarioType:P,modelFamily:p.modelFamily,errorMessage:j?.message||String(j),sessionId:p.usageSessionId||p.id,stream:p.body.stream,inputTokens:p.tokenCount||0})),!F.configService.get("Router")?.enableFallback)return p.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let re=De=>{let[Ce,...xe]=De.split(","),Be=Ce?.trim(),me=xe.join(",").trim();return!Be||!me?null:{provider:Be,model:me,key:`${Be},${me}`}},he=[];if(Y){let De=G?.[P];Array.isArray(De)&&De.length>0?he.push({name:`${Y}/${P}`,models:De}):p.log.warn(`No ${Y} fallback configured for ${P}; will try global ${P} fallback`)}if(Array.isArray(te?.[P])&&te[P].length>0&&he.push({name:`global/${P}`,models:te[P]}),he.length===0)return null;let ye=he.reduce((De,Ce)=>De+Ce.models.length,0);p.log.warn(`Request failed for ${P}, trying ${ye} fallback models across ${he.length} fallback stage(s)`);for(let De of he){p.log.info(`Trying ${De.name} fallback stage with ${De.models.length} models`);for(let Ce of De.models){let xe=re(Ce);if(!xe){p.log.warn(`Fallback model '${Ce}' is invalid, skipping`);continue}if(Ae.has(xe.key))continue;Ae.add(xe.key);let Be=xe.provider,me=xe.model;try{if(!W.isAvailable(Be,me)){p.log.warn(`Fallback model ${Ce} unavailable (fail pool), skipping`);continue}p.log.info(`Trying fallback model: ${Ce}`);let Te={...p.body};Te.model=me;let Pe={...p,provider:Be,body:Te},et=F.providerService.getProvider(Be);if(!et){p.log.warn(`Fallback provider '${Be}' not found, skipping`);continue}if(et.enabled===!1){p.log.warn(`Fallback provider '${Be}' is disabled, skipping`);continue}let{requestBody:dt,config:ft,bypass:kt}=await Cf(Te,et,Q,p.headers,{req:Pe}),Dt=await bf(dt,ft,et,F,kt,Q,{req:Pe});try{et?.baseUrl&&Dt?.headers&&Cc(Be,et.baseUrl,Dt.headers)}catch{}let Ar=await wf(dt,Dt,et,Q,kt,{req:Pe});return p.log.info(`Fallback model ${Ce} succeeded`),W.recordSuccess(Be,me),ne&&le&&(D().promote(ne,le,P,Be,me),p.log.info(`Promoted fallback model ${Be},${me} for ${ne},${le}:${P}`),W.forceOpen(ne,le,j?.message),p.log.info(`Marked original model ${ne},${le} as unavailable`)),p.provider=Be,p.body=Te,Bf(Ar,_,Te,F)}catch(Te){W.recordFailure(Be,me,Te.message),p.log.warn(`Fallback model ${xe.key} failed: ${Te.message}`),F.recordUsage?.({provider:Be,model:me,originalModel:p.body.model,scenarioType:P,modelFamily:p.modelFamily,errorMessage:Te.message,sessionId:p.usageSessionId||p.id,stream:p.body.stream});continue}}}return p.log.error(`All fallback models failed for ${P}`),null}async function Cf(p,_,F,Q,j){let P=JSON.parse(JSON.stringify(p)),G={},Y=!1;if(Y=Zg(_,F,p),Y&&(Q instanceof Headers?Q.delete("content-length"):delete Q["content-length"],G.headers=Q),!Y&&typeof F.transformRequestOut=="function"){let te=await F.transformRequestOut(P);te.body?(P=te.body,G=te.config||{}):P=te}if(!Y&&_.transformer?.use?.length)for(let te of _.transformer.use){if(!te||typeof te.transformRequestIn!="function")continue;let W=await te.transformRequestIn(P,_,j);W.body?(P=W.body,G={...G,...W.config}):P=W}if(!Y&&_.transformer?.[p.model]?.use?.length)for(let te of _.transformer[p.model].use)!te||typeof te.transformRequestIn!="function"||(P=await te.transformRequestIn(P,_,j));return{requestBody:P,config:G,bypass:Y}}function Zg(p,_,F){return p.transformer?.use?.length===1&&p.transformer.use[0].name===_.name&&(!p.transformer?.[F.model]?.use.length||p.transformer?.[F.model]?.use.length===1&&p.transformer?.[F.model]?.use[0].name===_.name)}async function bf(p,_,F,Q,j,P,G){let Y=_.url||new URL(F.baseUrl);if(!_.TIMEOUT){let ne=Q.configService.get("API_TIMEOUT_MS");ne&&(_.TIMEOUT=typeof ne=="string"?parseInt(ne,10):ne)}if(j&&typeof P.auth=="function"){let ne=await P.auth(p,F);if(ne.body){p=ne.body;let le=_.headers||{};ne.config?.headers&&(le={...le,...ne.config.headers},delete le.host,delete ne.config.headers),_={..._,...ne.config,headers:le}}else p=ne}let te={Authorization:`Bearer ${F.apiKey}`,..._?.headers||{}};for(let ne in te)(te[ne]==="undefined"||["authorization","Authorization"].includes(ne)&&te[ne]?.includes("undefined"))&&delete te[ne];go(Q.configService)&&df(Q.log,G.req.id,{url:String(Y),headers:te,body:p});let W=await Qi(Y,p,{httpsProxy:Q.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(te))},G,Q.log);if(!W.ok){let ne=await W.text();Q.log.error(`[provider_response_error] Error from provider(${F.name},${p.model}: ${W.status}): ${ne}`);let le=Xi(`Error from provider(${F.name},${p.model}: ${W.status}): ${ne}`,W.status,"provider_response_error");throw le.rawBody=ne,le}if(W.ok&&(W.headers.get("content-type")||"").includes("application/json")){let ne=W.clone();try{let le=await ne.text(),Ae=JSON.parse(le);if(Ae&&typeof Ae=="object"&&Ae.error&&(typeof Ae.error=="string"||typeof Ae.error=="object"&&Object.keys(Ae.error).length>0)){Q.log.error(`[provider_response_error] Hidden error from provider(${F.name},${p.model}: ${W.status}): ${le}`);let re=Xi(`Error from provider(${F.name},${p.model}: ${W.status}): ${le}`,400,"provider_response_error");throw re.rawBody=le,re}}catch{}}if(!p.stream&&go(Q.configService)){let ne=await W.clone().text();Af(Q.log,G.req.id,{status:W.status,headers:Object.fromEntries(W.headers.entries()),body:ne})}return W}async function wf(p,_,F,Q,j,P){let G=_;if(!j&&F.transformer?.use?.length)for(let Y of Array.from(F.transformer.use).reverse())!Y||typeof Y.transformResponseOut!="function"||(G=await Y.transformResponseOut(G,P));if(!j&&F.transformer?.[p.model]?.use?.length)for(let Y of Array.from(F.transformer[p.model].use).reverse())!Y||typeof Y.transformResponseOut!="function"||(G=await Y.transformResponseOut(G,P));return!j&&Q.transformResponseIn&&(G=await Q.transformResponseIn(G,P)),G}function Bf(p,_,F,Q){if(p.ok||_.code(p.status),F.stream===!0){if(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),Q&&go(Q.configService)){let[j,P]=p.body.tee(),G=gl(Q.configService);return ff(j,Q.log,_.request.id,G),_.send(P)}return _.send(p.body)}else return p.json()}var If=async p=>{p.get("/",async()=>({message:"LLMs API",version:pf})),p.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),p.get("/providers/health",async()=>({states:S().getAllStates().map(F=>({provider:F.provider,model:F.model,status:F.status,failureCount:F.failureCount,successCount:F.successCount,lastFailureTime:F.lastFailureTime,lastError:F.lastError})),timestamp:new Date().toISOString()}));let _=p.transformerService.getTransformersWithEndpoint();for(let{transformer:F}of _)F.endPoint&&p.post(F.endPoint,async(Q,j)=>Kg(Q,j,p,F));p.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(F,Q)=>{let{name:j,baseUrl:P,apiKey:G,models:Y}=F.body;if(!j?.trim())throw Xi("Provider name is required",400,"invalid_request");if(!P||!wc(P))throw Xi("Valid base URL is required",400,"invalid_request");if(!G?.trim())throw Xi("API key is required",400,"invalid_request");if(!Y||!Array.isArray(Y)||Y.length===0)throw Xi("At least one model is required",400,"invalid_request");if(p.providerService.getProvider(F.body.name))throw Xi(`Provider with name '${F.body.name}' already exists`,400,"provider_exists");return p.providerService.registerProvider(F.body)}),p.get("/providers",async()=>p.providerService.getProviders()),p.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{let Q=p.providerService.getProvider(F.params.id);if(!Q)throw Xi("Provider not found",404,"provider_not_found");return Q}),p.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(F,Q)=>{let j=p.providerService.updateProvider(F.params.id,F.body);if(!j)throw Xi("Provider not found",404,"provider_not_found");return j}),p.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{if(!p.providerService.deleteProvider(F.params.id))throw Xi("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),p.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(F,Q)=>{if(!p.providerService.toggleProvider(F.params.id,F.body.enabled))throw Xi("Provider not found",404,"provider_not_found");return{message:`Provider ${F.body.enabled?"enabled":"disabled"} successfully`}})};function wc(p){try{return new URL(p),!0}catch{return!1}}var yl=class{constructor(p,_,F){this.configService=p,this.transformerService=_,this.logger=F,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let p=this.configService.get("providers");if(p&&Array.isArray(p)){this.initializeFromProvidersArray(p);return}}initializeFromProvidersArray(p){p.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let F={};_.transformer&&Object.keys(_.transformer).forEach(Q=>{Q==="use"?Array.isArray(_.transformer.use)&&(F.use=_.transformer.use.map(j=>{if(Array.isArray(j)&&typeof j[0]=="string"){let P=this.transformerService.getTransformer(j[0]);if(P)return new P(j[1])}if(typeof j=="string"){let P=this.transformerService.getTransformer(j);return typeof P=="function"?new P:P}}).filter(j=>typeof j<"u")):Array.isArray(_.transformer[Q]?.use)&&(F[Q]={use:_.transformer[Q].use.map(j=>{if(Array.isArray(j)&&typeof j[0]=="string"){let P=this.transformerService.getTransformer(j[0]);if(P)return new P(j[1])}if(typeof j=="string"){let P=this.transformerService.getTransformer(j);return typeof P=="function"?new P:P}}).filter(j=>typeof j<"u")})}),this.registerProvider({name:_.name,baseUrl:_.api_base_url,apiKey:_.api_key,models:_.models||[],quotaToken:_.quota_token,transformer:_.transformer?F:void 0,enabled:_.enabled!==!1,wakeupEnabled:_.wakeup_enabled===!0,wakeupTime:_.wakeup_time||"06:00",wakeupModel:_.wakeup_model||""}),this.logger.info(`${_.name} provider registered`)}catch(F){this.logger.error(`${_.name} provider registered error: ${F}`)}})}registerProvider(p){let _={...p,enabled:p.enabled!==!1,wakeupEnabled:p.wakeupEnabled===!0,wakeupTime:p.wakeupTime||"06:00",wakeupModel:p.wakeupModel||""};return this.providers.set(_.name,_),p.models.forEach(F=>{let Q=`${_.name},${F}`,j={provider:_.name,model:F,fullModel:Q};this.modelRoutes.set(Q,j),this.modelRoutes.has(F)||this.modelRoutes.set(F,j)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(p){return this.providers.get(p)}updateProvider(p,_){let F=this.providers.get(p);if(!F)return null;let Q={...F,..._,updatedAt:new Date};return this.providers.set(p,Q),_.models&&(F.models.forEach(j=>{let P=`${F.name},${j}`;this.modelRoutes.delete(P),this.modelRoutes.delete(j)}),_.models.forEach(j=>{let P=`${F.name},${j}`,G={provider:F.name,model:j,fullModel:P};this.modelRoutes.set(P,G),this.modelRoutes.has(j)||this.modelRoutes.set(j,G)})),Q}deleteProvider(p){let _=this.providers.get(p);return _?(_.models.forEach(F=>{let Q=`${_.name},${F}`;this.modelRoutes.delete(Q),this.modelRoutes.delete(F)}),this.providers.delete(p),!0):!1}toggleProvider(p,_){let F=this.providers.get(p);if(!F)return!1;F.enabled=_;let Q=this.configService.get("providers");if(Q&&Array.isArray(Q)){let j=Q.find(P=>P.name===p);j&&(j.enabled=_)}return!0}resolveModelRoute(p){let _=this.modelRoutes.get(p);if(!_)return null;let F=this.providers.get(_.provider);return F?{provider:F,originalModel:p,targetModel:_.model}:null}getAvailableModelNames(){let p=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{p.push(F),p.push(`${_.name},${F}`)})}),p}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(p){return p?Array.isArray(p)?p.reduce((_,F)=>{if(Array.isArray(F)){let[Q,j={}]=F;_[Q]=j}else _[F]={};return _},{}):p:{}}async getAvailableModels(){let p=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{p.push({id:F,object:"model",owned_by:_.name,provider:_.name}),p.push({id:`${_.name},${F}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:p}}},si=[];for(let p=0;p<256;++p)si.push((p+256).toString(16).slice(1));function vf(p,_=0){return(si[p[_+0]]+si[p[_+1]]+si[p[_+2]]+si[p[_+3]]+"-"+si[p[_+4]]+si[p[_+5]]+"-"+si[p[_+6]]+si[p[_+7]]+"-"+si[p[_+8]]+si[p[_+9]]+"-"+si[p[_+10]]+si[p[_+11]]+si[p[_+12]]+si[p[_+13]]+si[p[_+14]]+si[p[_+15]]).toLowerCase()}var H=require("crypto"),ie=new Uint8Array(256),_e=ie.length;function Je(){return _e>ie.length-16&&((0,H.randomFillSync)(ie),_e=0),ie.slice(_e,_e+=16)}var wt=require("crypto"),Jt={randomUUID:wt.randomUUID};function sr(p,_,F){if(Jt.randomUUID&&!_&&!p)return Jt.randomUUID();p=p||{};let Q=p.random??p.rng?.()??Je();if(Q.length<16)throw new Error("Random bytes length must be >= 16");if(Q[6]=Q[6]&15|64,Q[8]=Q[8]&63|128,_){if(F=F||0,F<0||F+16>_.length)throw new RangeError(`UUID byte range ${F}:${F+15} is out of buffer bounds`);for(let j=0;j<16;++j)_[F+j]=Q[j];return _}return vf(Q)}var Qr=sr,Yr=p=>p<=0?"none":p<=1024?"low":p<=8192?"medium":"high",sn=(p,_)=>(p.includes("base64")&&(p=p.split("base64").pop(),p.startsWith(",")&&(p=p.slice(1))),`data:${_};base64,${p}`);function yn(p){return p.map(_=>({name:_.function.name,description:_.function.description,input_schema:_.function.parameters}))}function Dn(p){let _=[],F=[];p.messages.forEach(P=>{P.role==="system"?typeof P.content=="string"?F.push(P.content):Array.isArray(P.content)&&P.content.forEach(G=>{G&&typeof G=="object"&&G.type==="text"&&G.text?F.push(G.text):typeof G=="string"&&F.push(G)}):_.push(P)});let Q=[];for(let P=0;P<_.length;P++){let G=_[P];if(G.role==="tool"){let Y=G.content;try{typeof G.content=="string"&&(Y=JSON.parse(G.content))}catch{}let te={type:"tool_result",tool_use_id:G.tool_call_id,content:Y};G.cache_control&&(te.cache_control=G.cache_control);let W=Q[Q.length-1];W&&W.role==="user"&&Array.isArray(W.content)?W.content.push(te):Q.push({role:"user",content:[te]})}else if(G.role==="user"){let Y=[];typeof G.content=="string"?Y.push({type:"text",text:G.content}):Array.isArray(G.content)&&G.content.forEach(W=>{W&&typeof W=="object"&&W.type==="image_url"&&W.image_url?.url?Y.push({type:"image",source:{type:"base64",media_type:W.media_type||"image/jpeg",data:W.image_url.url.split(",")[1]||W.image_url.url}}):Y.push(W)});let te=Q[Q.length-1];te&&te.role==="user"&&Array.isArray(te.content)?te.content.push(...Y):Q.push({role:"user",content:Y.length>0?Y:[{type:"text",text:" "}]})}else if(G.role==="assistant"){let Y=[];G.content&&(typeof G.content=="string"?Y.push({type:"text",text:G.content}):Array.isArray(G.content)&&Y.push(...G.content)),G.tool_calls&&G.tool_calls.length>0&&G.tool_calls.forEach(W=>{let ne={};try{ne=JSON.parse(W.function.arguments)}catch{ne=W.function.arguments}Y.push({type:"tool_use",id:W.id,name:W.function.name,input:ne})}),G.thinking&&Y.unshift({type:"thinking",thinking:G.thinking.content,signature:G.thinking.signature});let te=Q[Q.length-1];te&&te.role==="assistant"&&Array.isArray(te.content)?te.content.push(...Y):Q.push({role:"assistant",content:Y.length>0?Y:[{type:"text",text:" "}]})}}let j={messages:Q,model:p.model,max_tokens:p.max_tokens||4096,temperature:p.temperature,stream:p.stream};return F.length>0&&(j.system=F.join(`
584
+ `);G=W.pop()||"";for(let ne of W)ne.trim()&&(P<Q.maxStreamChunks?ml(_,F,P,ne):P===Q.maxStreamChunks&&_.info({debug_log:!0,reqId:F,phase:"provider_stream_chunk_omitted",message:`[chunks after #${P} omitted, maxStreamChunks=${Q.maxStreamChunks}]`}),P++)}G.trim()&&(P<Q.maxStreamChunks&&ml(_,F,P,G.trim()),P++),Wh(_,F,P)}catch(G){console.error(`[debug_log] Error reading debug stream for reqId=${F}:`,G),Wh(_,F,P)}finally{j.releaseLock()}})()}var pf="2.1.11";O();var sa=require("fs"),Kh=require("path"),gf=Ka(),Zh=(0,Kh.join)(gf.HOME_DIR,"runtime"),Xh=(0,Kh.join)(Zh,"rate-limit.json"),gu=new Map,mf=!1,Yg=null,Dc=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Jg=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],Ef=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Cc(p,_,F){let Q=Y=>{if(F instanceof Headers)return F.get(Y);let te=Object.keys(F).find(W=>W.toLowerCase()===Y);return te?F[te]:null},j=mu(Q,Dc),P=mu(Q,Jg),G=mu(Q,Ef);(j||P||G)&&gu.set(p,{provider:p,remaining:_s(j),limit:_s(P),reset:bc(G),capturedAt:Date.now()})}function ed(p){return gu.get(p)}function td(){return Array.from(gu.values())}function mu(p,_){for(let F of _){let Q=p(F);if(Q)return Q}return null}function _s(p){if(!p)return null;let _=Number(p.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function bc(p){if(!p)return null;let _=p.trim();if(!_)return null;let F=Number(_);if(Number.isFinite(F))return F>1e12?Math.floor(F/1e3):F>1e9?Math.floor(F):Math.floor(Date.now()/1e3+F);let Q=Date.parse(_);if(Number.isFinite(Q))return Math.floor(Q/1e3);let j=zg(_);return j===null?null:Math.floor((Date.now()+j)/1e3)}function zg(p){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,F=0,Q=!1;for(let j of p.matchAll(_)){Q=!0;let P=Number(j[1]),G=j[2].toLowerCase();if(Number.isFinite(P))switch(G){case"ms":F+=P;break;case"s":F+=P*1e3;break;case"m":F+=P*60*1e3;break;case"h":F+=P*60*60*1e3;break;case"d":F+=P*24*60*60*1e3;break}}return Q?F:null}function Wg(){try{if(!(0,sa.existsSync)(Xh))return;let p=JSON.parse((0,sa.readFileSync)(Xh,"utf-8"));if(!Array.isArray(p))return;let _=Date.now();for(let F of p)if(F&&F.provider){if(F.capturedAt&&_-F.capturedAt>3600*1e3)continue;gu.set(F.provider,F)}}catch{}}function El(){try{if(gu.size===0)return;(0,sa.existsSync)(Zh)||(0,sa.mkdirSync)(Zh,{recursive:!0}),(0,sa.writeFileSync)(Xh,JSON.stringify(Array.from(gu.values()),null,2),"utf-8")}catch{}}function yf(){mf||(mf=!0,Wg(),Yg=setInterval(El,6e4),process.on("exit",El))}B();async function Kg(p,_,F,Q){let j=p.body,P=p.provider,G=F.providerService.getProvider(P);if(!G)throw Xi(`Provider '${P}' not found`,404,"provider_not_found");try{let{requestBody:Y,config:te,bypass:W}=await Cf(j,G,Q,p.headers,{req:p}),ne=await bf(Y,te,G,F,W,Q,{req:p});try{G?.baseUrl&&ne?.headers&&Cc(P,G.baseUrl,ne.headers)}catch{}let le=await wf(Y,ne,G,Q,W,{req:p}),Ae=Bf(le,_,j,F);try{let re=j.model||p.originalModel;P&&re&&S().recordSuccess(P,re)}catch{}return Ae}catch(Y){let te=await Df(p,_,F,Q,Y);if(te)return te;throw Y}}async function Df(p,_,F,Q,j){let P=p.scenarioType||"default",G=p.familyFallback,Y=p.modelFamily,te=F.configService.get("fallback"),W=S(),ne=p.provider||"",le=p.body.model||"",Ae=new Set;if(ne&&le&&(W.recordFailure(ne,le,j?.message),Ae.add(`${ne},${le}`),F.recordUsage?.({provider:ne,model:le,originalModel:p.originalModel||le,scenarioType:P,modelFamily:p.modelFamily,errorMessage:j?.message||String(j),sessionId:p.usageSessionId||p.id,stream:p.body.stream,inputTokens:p.tokenCount||0})),!F.configService.get("Router")?.enableFallback)return p.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let re=De=>{let[Ce,...xe]=De.split(","),Be=Ce?.trim(),me=xe.join(",").trim();return!Be||!me?null:{provider:Be,model:me,key:`${Be},${me}`}},he=[];if(Y){let De=G?.[P];Array.isArray(De)&&De.length>0?he.push({name:`${Y}/${P}`,models:De}):p.log.warn(`No ${Y} fallback configured for ${P}; will try global ${P} fallback`)}if(Array.isArray(te?.[P])&&te[P].length>0&&he.push({name:`global/${P}`,models:te[P]}),he.length===0)return null;let ye=he.reduce((De,Ce)=>De+Ce.models.length,0);p.log.warn(`Request failed for ${P}, trying ${ye} fallback models across ${he.length} fallback stage(s)`);for(let De of he){p.log.info(`Trying ${De.name} fallback stage with ${De.models.length} models`);for(let Ce of De.models){let xe=re(Ce);if(!xe){p.log.warn(`Fallback model '${Ce}' is invalid, skipping`);continue}if(Ae.has(xe.key))continue;Ae.add(xe.key);let Be=xe.provider,me=xe.model;try{if(!W.isAvailable(Be,me)){p.log.warn(`Fallback model ${Ce} unavailable (fail pool), skipping`);continue}p.log.info(`Trying fallback model: ${Ce}`);let Te={...p.body};Te.model=me;let Pe={...p,provider:Be,body:Te},et=F.providerService.getProvider(Be);if(!et){p.log.warn(`Fallback provider '${Be}' not found, skipping`);continue}if(et.enabled===!1){p.log.warn(`Fallback provider '${Be}' is disabled, skipping`);continue}let{requestBody:dt,config:ft,bypass:kt}=await Cf(Te,et,Q,p.headers,{req:Pe}),Dt=await bf(dt,ft,et,F,kt,Q,{req:Pe});try{et?.baseUrl&&Dt?.headers&&Cc(Be,et.baseUrl,Dt.headers)}catch{}let Ar=await wf(dt,Dt,et,Q,kt,{req:Pe});return p.log.info(`Fallback model ${Ce} succeeded`),W.recordSuccess(Be,me),ne&&le&&(D().promote(ne,le,P,Be,me),p.log.info(`Promoted fallback model ${Be},${me} for ${ne},${le}:${P}`),W.forceOpen(ne,le,j?.message),p.log.info(`Marked original model ${ne},${le} as unavailable`)),p.provider=Be,p.body=Te,Bf(Ar,_,Te,F)}catch(Te){W.recordFailure(Be,me,Te.message),p.log.warn(`Fallback model ${xe.key} failed: ${Te.message}`),F.recordUsage?.({provider:Be,model:me,originalModel:p.body.model,scenarioType:P,modelFamily:p.modelFamily,errorMessage:Te.message,sessionId:p.usageSessionId||p.id,stream:p.body.stream});continue}}}return p.log.error(`All fallback models failed for ${P}`),null}async function Cf(p,_,F,Q,j){let P=JSON.parse(JSON.stringify(p)),G={},Y=!1;if(Y=Zg(_,F,p),Y&&(Q instanceof Headers?Q.delete("content-length"):delete Q["content-length"],G.headers=Q),!Y&&typeof F.transformRequestOut=="function"){let te=await F.transformRequestOut(P);te.body?(P=te.body,G=te.config||{}):P=te}if(!Y&&_.transformer?.use?.length)for(let te of _.transformer.use){if(!te||typeof te.transformRequestIn!="function")continue;let W=await te.transformRequestIn(P,_,j);W.body?(P=W.body,G={...G,...W.config}):P=W}if(!Y&&_.transformer?.[p.model]?.use?.length)for(let te of _.transformer[p.model].use)!te||typeof te.transformRequestIn!="function"||(P=await te.transformRequestIn(P,_,j));return{requestBody:P,config:G,bypass:Y}}function Zg(p,_,F){return F?.messages?.some(Q=>Q.role==="system")?!1:p.transformer?.use?.length===1&&p.transformer.use[0].name===_.name&&(!p.transformer?.[F.model]?.use.length||p.transformer?.[F.model]?.use.length===1&&p.transformer?.[F.model]?.use[0].name===_.name)}async function bf(p,_,F,Q,j,P,G){let Y=_.url||new URL(F.baseUrl);if(!_.TIMEOUT){let ne=Q.configService.get("API_TIMEOUT_MS");ne&&(_.TIMEOUT=typeof ne=="string"?parseInt(ne,10):ne)}if(j&&typeof P.auth=="function"){let ne=await P.auth(p,F);if(ne.body){p=ne.body;let le=_.headers||{};ne.config?.headers&&(le={...le,...ne.config.headers},delete le.host,delete ne.config.headers),_={..._,...ne.config,headers:le}}else p=ne}let te={Authorization:`Bearer ${F.apiKey}`,..._?.headers||{}};for(let ne in te)(te[ne]==="undefined"||["authorization","Authorization"].includes(ne)&&te[ne]?.includes("undefined"))&&delete te[ne];go(Q.configService)&&df(Q.log,G.req.id,{url:String(Y),headers:te,body:p});let W=await Qi(Y,p,{httpsProxy:Q.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(te))},G,Q.log);if(!W.ok){let ne=await W.text();Q.log.error(`[provider_response_error] Error from provider(${F.name},${p.model}: ${W.status}): ${ne}`);let le=Xi(`Error from provider(${F.name},${p.model}: ${W.status}): ${ne}`,W.status,"provider_response_error");throw le.rawBody=ne,le}if(W.ok&&(W.headers.get("content-type")||"").includes("application/json")){let ne=W.clone();try{let le=await ne.text(),Ae=JSON.parse(le);if(Ae&&typeof Ae=="object"&&Ae.error&&(typeof Ae.error=="string"||typeof Ae.error=="object"&&Object.keys(Ae.error).length>0)){Q.log.error(`[provider_response_error] Hidden error from provider(${F.name},${p.model}: ${W.status}): ${le}`);let re=Xi(`Error from provider(${F.name},${p.model}: ${W.status}): ${le}`,400,"provider_response_error");throw re.rawBody=le,re}}catch{}}if(!p.stream&&go(Q.configService)){let ne=await W.clone().text();Af(Q.log,G.req.id,{status:W.status,headers:Object.fromEntries(W.headers.entries()),body:ne})}return W}async function wf(p,_,F,Q,j,P){let G=_;if(!j&&F.transformer?.use?.length)for(let Y of Array.from(F.transformer.use).reverse())!Y||typeof Y.transformResponseOut!="function"||(G=await Y.transformResponseOut(G,P));if(!j&&F.transformer?.[p.model]?.use?.length)for(let Y of Array.from(F.transformer[p.model].use).reverse())!Y||typeof Y.transformResponseOut!="function"||(G=await Y.transformResponseOut(G,P));return!j&&Q.transformResponseIn&&(G=await Q.transformResponseIn(G,P)),G}function Bf(p,_,F,Q){if(p.ok||_.code(p.status),F.stream===!0){if(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),Q&&go(Q.configService)){let[j,P]=p.body.tee(),G=gl(Q.configService);return ff(j,Q.log,_.request.id,G),_.send(P)}return _.send(p.body)}else return p.json()}var If=async p=>{p.get("/",async()=>({message:"LLMs API",version:pf})),p.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),p.get("/providers/health",async()=>({states:S().getAllStates().map(F=>({provider:F.provider,model:F.model,status:F.status,failureCount:F.failureCount,successCount:F.successCount,lastFailureTime:F.lastFailureTime,lastError:F.lastError})),timestamp:new Date().toISOString()}));let _=p.transformerService.getTransformersWithEndpoint();for(let{transformer:F}of _)F.endPoint&&p.post(F.endPoint,async(Q,j)=>Kg(Q,j,p,F));p.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(F,Q)=>{let{name:j,baseUrl:P,apiKey:G,models:Y}=F.body;if(!j?.trim())throw Xi("Provider name is required",400,"invalid_request");if(!P||!wc(P))throw Xi("Valid base URL is required",400,"invalid_request");if(!G?.trim())throw Xi("API key is required",400,"invalid_request");if(!Y||!Array.isArray(Y)||Y.length===0)throw Xi("At least one model is required",400,"invalid_request");if(p.providerService.getProvider(F.body.name))throw Xi(`Provider with name '${F.body.name}' already exists`,400,"provider_exists");return p.providerService.registerProvider(F.body)}),p.get("/providers",async()=>p.providerService.getProviders()),p.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{let Q=p.providerService.getProvider(F.params.id);if(!Q)throw Xi("Provider not found",404,"provider_not_found");return Q}),p.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(F,Q)=>{let j=p.providerService.updateProvider(F.params.id,F.body);if(!j)throw Xi("Provider not found",404,"provider_not_found");return j}),p.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{if(!p.providerService.deleteProvider(F.params.id))throw Xi("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),p.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(F,Q)=>{if(!p.providerService.toggleProvider(F.params.id,F.body.enabled))throw Xi("Provider not found",404,"provider_not_found");return{message:`Provider ${F.body.enabled?"enabled":"disabled"} successfully`}})};function wc(p){try{return new URL(p),!0}catch{return!1}}var yl=class{constructor(p,_,F){this.configService=p,this.transformerService=_,this.logger=F,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let p=this.configService.get("providers");if(p&&Array.isArray(p)){this.initializeFromProvidersArray(p);return}}initializeFromProvidersArray(p){p.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let F={};_.transformer&&Object.keys(_.transformer).forEach(Q=>{Q==="use"?Array.isArray(_.transformer.use)&&(F.use=_.transformer.use.map(j=>{if(Array.isArray(j)&&typeof j[0]=="string"){let P=this.transformerService.getTransformer(j[0]);if(P)return new P(j[1])}if(typeof j=="string"){let P=this.transformerService.getTransformer(j);return typeof P=="function"?new P:P}}).filter(j=>typeof j<"u")):Array.isArray(_.transformer[Q]?.use)&&(F[Q]={use:_.transformer[Q].use.map(j=>{if(Array.isArray(j)&&typeof j[0]=="string"){let P=this.transformerService.getTransformer(j[0]);if(P)return new P(j[1])}if(typeof j=="string"){let P=this.transformerService.getTransformer(j);return typeof P=="function"?new P:P}}).filter(j=>typeof j<"u")})}),this.registerProvider({name:_.name,baseUrl:_.api_base_url,apiKey:_.api_key,models:_.models||[],quotaToken:_.quota_token,transformer:_.transformer?F:void 0,enabled:_.enabled!==!1,wakeupEnabled:_.wakeup_enabled===!0,wakeupTime:_.wakeup_time||"06:00",wakeupModel:_.wakeup_model||""}),this.logger.info(`${_.name} provider registered`)}catch(F){this.logger.error(`${_.name} provider registered error: ${F}`)}})}registerProvider(p){let _={...p,enabled:p.enabled!==!1,wakeupEnabled:p.wakeupEnabled===!0,wakeupTime:p.wakeupTime||"06:00",wakeupModel:p.wakeupModel||""};return this.providers.set(_.name,_),p.models.forEach(F=>{let Q=`${_.name},${F}`,j={provider:_.name,model:F,fullModel:Q};this.modelRoutes.set(Q,j),this.modelRoutes.has(F)||this.modelRoutes.set(F,j)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(p){return this.providers.get(p)}updateProvider(p,_){let F=this.providers.get(p);if(!F)return null;let Q={...F,..._,updatedAt:new Date};return this.providers.set(p,Q),_.models&&(F.models.forEach(j=>{let P=`${F.name},${j}`;this.modelRoutes.delete(P),this.modelRoutes.delete(j)}),_.models.forEach(j=>{let P=`${F.name},${j}`,G={provider:F.name,model:j,fullModel:P};this.modelRoutes.set(P,G),this.modelRoutes.has(j)||this.modelRoutes.set(j,G)})),Q}deleteProvider(p){let _=this.providers.get(p);return _?(_.models.forEach(F=>{let Q=`${_.name},${F}`;this.modelRoutes.delete(Q),this.modelRoutes.delete(F)}),this.providers.delete(p),!0):!1}toggleProvider(p,_){let F=this.providers.get(p);if(!F)return!1;F.enabled=_;let Q=this.configService.get("providers");if(Q&&Array.isArray(Q)){let j=Q.find(P=>P.name===p);j&&(j.enabled=_)}return!0}resolveModelRoute(p){let _=this.modelRoutes.get(p);if(!_)return null;let F=this.providers.get(_.provider);return F?{provider:F,originalModel:p,targetModel:_.model}:null}getAvailableModelNames(){let p=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{p.push(F),p.push(`${_.name},${F}`)})}),p}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(p){return p?Array.isArray(p)?p.reduce((_,F)=>{if(Array.isArray(F)){let[Q,j={}]=F;_[Q]=j}else _[F]={};return _},{}):p:{}}async getAvailableModels(){let p=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{p.push({id:F,object:"model",owned_by:_.name,provider:_.name}),p.push({id:`${_.name},${F}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:p}}},si=[];for(let p=0;p<256;++p)si.push((p+256).toString(16).slice(1));function vf(p,_=0){return(si[p[_+0]]+si[p[_+1]]+si[p[_+2]]+si[p[_+3]]+"-"+si[p[_+4]]+si[p[_+5]]+"-"+si[p[_+6]]+si[p[_+7]]+"-"+si[p[_+8]]+si[p[_+9]]+"-"+si[p[_+10]]+si[p[_+11]]+si[p[_+12]]+si[p[_+13]]+si[p[_+14]]+si[p[_+15]]).toLowerCase()}var H=require("crypto"),ie=new Uint8Array(256),_e=ie.length;function Je(){return _e>ie.length-16&&((0,H.randomFillSync)(ie),_e=0),ie.slice(_e,_e+=16)}var wt=require("crypto"),Jt={randomUUID:wt.randomUUID};function sr(p,_,F){if(Jt.randomUUID&&!_&&!p)return Jt.randomUUID();p=p||{};let Q=p.random??p.rng?.()??Je();if(Q.length<16)throw new Error("Random bytes length must be >= 16");if(Q[6]=Q[6]&15|64,Q[8]=Q[8]&63|128,_){if(F=F||0,F<0||F+16>_.length)throw new RangeError(`UUID byte range ${F}:${F+15} is out of buffer bounds`);for(let j=0;j<16;++j)_[F+j]=Q[j];return _}return vf(Q)}var Qr=sr,Yr=p=>p<=0?"none":p<=1024?"low":p<=8192?"medium":"high",sn=(p,_)=>(p.includes("base64")&&(p=p.split("base64").pop(),p.startsWith(",")&&(p=p.slice(1))),`data:${_};base64,${p}`);function yn(p){return p.map(_=>({name:_.function.name,description:_.function.description,input_schema:_.function.parameters}))}function Dn(p){let _=[],F=[];p.messages.forEach(P=>{P.role==="system"?typeof P.content=="string"?F.push(P.content):Array.isArray(P.content)&&P.content.forEach(G=>{G&&typeof G=="object"&&G.type==="text"&&G.text?F.push(G.text):typeof G=="string"&&F.push(G)}):_.push(P)});let Q=[];for(let P=0;P<_.length;P++){let G=_[P];if(G.role==="tool"){let Y=G.content;try{typeof G.content=="string"&&(Y=JSON.parse(G.content))}catch{}let te={type:"tool_result",tool_use_id:G.tool_call_id,content:Y};G.cache_control&&(te.cache_control=G.cache_control);let W=Q[Q.length-1];W&&W.role==="user"&&Array.isArray(W.content)?W.content.push(te):Q.push({role:"user",content:[te]})}else if(G.role==="user"){let Y=[];typeof G.content=="string"?Y.push({type:"text",text:G.content}):Array.isArray(G.content)&&G.content.forEach(W=>{W&&typeof W=="object"&&W.type==="image_url"&&W.image_url?.url?Y.push({type:"image",source:{type:"base64",media_type:W.media_type||"image/jpeg",data:W.image_url.url.split(",")[1]||W.image_url.url}}):Y.push(W)});let te=Q[Q.length-1];te&&te.role==="user"&&Array.isArray(te.content)?te.content.push(...Y):Q.push({role:"user",content:Y.length>0?Y:[{type:"text",text:" "}]})}else if(G.role==="assistant"){let Y=[];G.content&&(typeof G.content=="string"?Y.push({type:"text",text:G.content}):Array.isArray(G.content)&&Y.push(...G.content)),G.tool_calls&&G.tool_calls.length>0&&G.tool_calls.forEach(W=>{let ne={};try{ne=JSON.parse(W.function.arguments)}catch{ne=W.function.arguments}Y.push({type:"tool_use",id:W.id,name:W.function.name,input:ne})}),G.thinking&&Y.unshift({type:"thinking",thinking:G.thinking.content,signature:G.thinking.signature});let te=Q[Q.length-1];te&&te.role==="assistant"&&Array.isArray(te.content)?te.content.push(...Y):Q.push({role:"assistant",content:Y.length>0?Y:[{type:"text",text:" "}]})}}let j={messages:Q,model:p.model,max_tokens:p.max_tokens||4096,temperature:p.temperature,stream:p.stream};return F.length>0&&(j.system=F.join(`
585
585
 
586
- `)),p.tools&&p.tools.length>0&&(j.tools=yn(p.tools),p.tool_choice&&(p.tool_choice==="auto"?j.tool_choice={type:"auto"}:p.tool_choice==="any"||p.tool_choice==="required"?j.tool_choice={type:"any"}:typeof p.tool_choice=="string"?j.tool_choice={type:"tool",name:p.tool_choice}:typeof p.tool_choice=="object"&&p.tool_choice.type==="function"&&(j.tool_choice={type:"tool",name:p.tool_choice.function.name}))),j}var qn=class{constructor(p){this.options=p,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(p,_){let F={};return this.useBearer?(F.authorization=`Bearer ${_.apiKey}`,F["x-api-key"]=void 0):(F["x-api-key"]=_.apiKey,F.authorization=void 0),{body:p,config:{headers:F}}}async transformRequestOut(p){let _=[];if(p.system){if(typeof p.system=="string")_.push({role:"system",content:p.system});else if(Array.isArray(p.system)&&p.system.length){let Q=p.system.filter(j=>j.type==="text"&&j.text).map(j=>({type:"text",text:j.text,cache_control:j.cache_control}));_.push({role:"system",content:Q})}}JSON.parse(JSON.stringify(p.messages||[]))?.forEach(Q=>{if(Q.role==="user"||Q.role==="assistant"){if(typeof Q.content=="string"){_.push({role:Q.role,content:Q.content});return}if(Array.isArray(Q.content)){if(Q.role==="user"){let j=Q.content.filter(G=>G.type==="tool_result"&&G.tool_use_id);j.length&&j.forEach(G=>{let Y={role:"tool",content:typeof G.content=="string"?G.content:JSON.stringify(G.content),tool_call_id:G.tool_use_id,cache_control:G.cache_control};_.push(Y)});let P=Q.content.filter(G=>G.type==="text"&&G.text||G.type==="image"&&G.source);P.length&&_.push({role:"user",content:P.map(G=>G?.type==="image"?{type:"image_url",image_url:{url:G.source?.type==="base64"?sn(G.source.data,G.source.media_type):G.source.url},media_type:G.source.media_type}:G)})}else if(Q.role==="assistant"){let j={role:"assistant",content:""},P=Q.content.filter(te=>te.type==="text"&&te.text);P.length&&(j.content=P.map(te=>te.text).join(`
586
+ `)),p.tools&&p.tools.length>0&&(j.tools=yn(p.tools),p.tool_choice&&(p.tool_choice==="auto"?j.tool_choice={type:"auto"}:p.tool_choice==="any"||p.tool_choice==="required"?j.tool_choice={type:"any"}:typeof p.tool_choice=="string"?j.tool_choice={type:"tool",name:p.tool_choice}:typeof p.tool_choice=="object"&&p.tool_choice.type==="function"&&(j.tool_choice={type:"tool",name:p.tool_choice.function.name}))),j}var qn=class{constructor(p){this.options=p,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(p,_){let F={};return this.useBearer?(F.authorization=`Bearer ${_.apiKey}`,F["x-api-key"]=void 0):(F["x-api-key"]=_.apiKey,F.authorization=void 0),{body:p,config:{headers:F}}}async transformRequestOut(p){let _=[];if(p.system){if(typeof p.system=="string")_.push({role:"system",content:p.system});else if(Array.isArray(p.system)&&p.system.length){let Q=p.system.filter(j=>j.type==="text"&&j.text).map(j=>({type:"text",text:j.text,cache_control:j.cache_control}));_.push({role:"system",content:Q})}}JSON.parse(JSON.stringify(p.messages||[]))?.forEach(Q=>{if(Q.role==="system"){_.push({role:"system",content:Q.content});return}if(Q.role==="user"||Q.role==="assistant"){if(typeof Q.content=="string"){_.push({role:Q.role,content:Q.content});return}if(Array.isArray(Q.content)){if(Q.role==="user"){let j=Q.content.filter(G=>G.type==="tool_result"&&G.tool_use_id);j.length&&j.forEach(G=>{let Y={role:"tool",content:typeof G.content=="string"?G.content:JSON.stringify(G.content),tool_call_id:G.tool_use_id,cache_control:G.cache_control};_.push(Y)});let P=Q.content.filter(G=>G.type==="text"&&G.text||G.type==="image"&&G.source);P.length&&_.push({role:"user",content:P.map(G=>G?.type==="image"?{type:"image_url",image_url:{url:G.source?.type==="base64"?sn(G.source.data,G.source.media_type):G.source.url},media_type:G.source.media_type}:G)})}else if(Q.role==="assistant"){let j={role:"assistant",content:""},P=Q.content.filter(te=>te.type==="text"&&te.text);P.length&&(j.content=P.map(te=>te.text).join(`
587
587
  `));let G=Q.content.filter(te=>te.type==="tool_use"&&te.id);G.length&&(j.tool_calls=G.map(te=>({id:te.id,type:"function",function:{name:te.name,arguments:JSON.stringify(te.input||{})}})));let Y=Q.content.find(te=>te.type==="thinking");Y&&(j.thinking={content:Y.thinking,signature:Y.signature}),_.push(j)}return}}});let F={messages:_,model:p.model,max_tokens:p.max_tokens,temperature:p.temperature,stream:p.stream,tools:p.tools?.length?this.convertAnthropicToolsToUnified(p.tools):void 0,tool_choice:p.tool_choice};return p.thinking&&(F.reasoning={effort:Yr(p.thinking.budget_tokens),enabled:p.thinking.type==="enabled"}),p.tool_choice&&(p.tool_choice.type==="tool"?F.tool_choice={type:"function",function:{name:p.tool_choice.name}}:F.tool_choice=p.tool_choice.type),F}async transformRequestIn(p,_,F){let Q=Dn(p),j={};return this.useBearer?(j.authorization=`Bearer ${_.apiKey}`,j["x-api-key"]=void 0):(j["x-api-key"]=_.apiKey,j.authorization=void 0),j["anthropic-version"]="2023-06-01",j["content-type"]="application/json",{body:Q,config:{url:new URL(this.endPoint||"/v1/messages",_.baseUrl),headers:j}}}async transformResponseIn(p,_){if(p.headers.get("Content-Type")?.includes("text/event-stream")){if(!p.body)throw new Error("Stream response body is null");let F=await this.convertOpenAIStreamToAnthropic(p.body,_);return new Response(F,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let F=await p.json(),Q=this.convertOpenAIResponseToAnthropic(F,_);return new Response(JSON.stringify(Q),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(p){return p.map(_=>({type:"function",function:{name:_.name,description:_.description||"",parameters:_.input_schema}}))}async convertOpenAIStreamToAnthropic(p,_){return new ReadableStream({start:async F=>{let Q=new TextEncoder,j=`msg_${Date.now()}`,P=null,G="unknown",Y=!1,te=!1,W=!1,ne=new Map,le=new Map,Ae=0,re=0,he=0,ye=!1,De=!1,Ce=0,xe=-1,Be=()=>{let et=Ce;return Ce++,et},me=et=>{if(!ye)try{F.enqueue(et);let dt=new TextDecoder().decode(et);this.logger.debug({reqId:_.req.id,data:dt,type:"send data"})}catch(dt){if(dt instanceof TypeError&&dt.message.includes("Controller is already closed"))ye=!0;else throw this.logger.debug({reqId:_.req.id,error:dt instanceof Error?dt.message:String(dt),type:"send data error"}),dt}},Te=()=>{if(!ye)try{if(xe>=0){let dt={type:"content_block_stop",index:xe};me(Q.encode(`event: content_block_stop
588
588
  data: ${JSON.stringify(dt)}
589
589
 
@@ -935,9 +935,9 @@ ${this.toMarkdown(n,t+1)}`:`${r}- ${n}`).join(`
935
935
  ${this.toMarkdown(o,t+1)}`:`${r}${n}: ${o}`).join(`
936
936
  `):`${r}${e}`}async output(e,t={}){try{let r=this.formatData(e,t);switch(this.config.level||"log"){case"info":console.info(r);break;case"warn":console.warn(r);break;case"error":console.error(r);break;case"debug":console.debug(r);break;case"log":default:console.log(r);break}return!0}catch(r){return console.error("[ConsoleOutputHandler] Output failed:",r),!1}}}}),u_,l_=ui(()=>{"use strict";u_=class{type="webhook";config;defaultTimeout=3e4;constructor(e){if(!e.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...e}}buildHeaders(){let e={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(e.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let t=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${t}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,t){let{format:r="json",timestamp:n=!0,prefix:o,metadata:s}=t||{},i={data:e};return n&&(i.timestamp=new Date().toISOString()),o&&(i.prefix=o),s&&Object.keys(s).length>0&&(i.metadata=s),i}async sendRequest(e,t,r,n,o){let s=new AbortController,i=setTimeout(()=>s.abort(),o);try{let a=await fetch(e,{method:t,headers:r,body:JSON.stringify(n),signal:s.signal});if(clearTimeout(i),!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);return a}catch(a){throw clearTimeout(i),a}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,r,n,o,s){let i=null;for(let a=1;a<=s.maxAttempts;a++)try{return await this.sendRequest(e,t,r,n,o)}catch(u){if(i=u,a===s.maxAttempts)break;let l=s.backoffMs*Math.pow(2,a-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${a}/${s.maxAttempts}), retrying in ${l}ms...`,u.message),await this.delay(l)}throw i}async output(e,t={}){let r=t.timeout||this.defaultTimeout;try{let n=this.buildHeaders(),o=this.buildBody(e,t),s=await this.sendWithRetry(this.config.url,this.config.method,n,o,r,this.config.retry);return!0}catch(n){let o=n instanceof Error?n.message:String(n);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${o}`),!1;throw new Error(`Webhook output failed: ${o}`)}}}}),c_,h_=ui(()=>{"use strict";c_=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,IU.tmpdir)();this.baseDir=(0,vw.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,iE.existsSync)(this.baseDir)||(0,iE.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let t=e.match(/_session_([a-f0-9-]+)/i);return t?t[1]:null}catch{return null}}getFilePath(e){let t=this.config.prefix||"session",r=this.config.extension?`.${this.config.extension}`:"",n;if(this.config.includeTimestamp){let o=Date.now();n=`${t}-${e}-${o}${r}`}else n=`${t}-${e}${r}`;return(0,vw.join)(this.baseDir,n)}async output(e,t={}){try{let r=t.metadata?.sessionId;if(!r)return!1;let n={...e,timestamp:Date.now(),sessionId:r},o=this.getFilePath(r);return(0,iE.writeFileSync)(o,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),Ww,Od,X5=ui(()=>{"use strict";a_(),l_(),h_(),Ww=class{handlers=new Map;defaultOptions={};registerHandler(e,t){this.handlers.set(e,t)}registerHandlers(e){for(let t of e)if(t.enabled!==!1)try{let r=this.createHandler(t),n=t.type+"_"+Date.now();this.registerHandler(n,r)}catch(r){console.error(`[OutputManager] Failed to register ${t.type} handler:`,r)}}createHandler(e){switch(e.type){case"console":return new s_(e.config);case"webhook":return new u_(e.config);case"temp-file":return new c_(e.config);default:throw new Error(`Unknown output handler type: ${e.type}`)}}unregisterHandler(e){return this.handlers.delete(e)}getHandler(e){return this.handlers.get(e)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}getDefaultOptions(){return{...this.defaultOptions}}async output(e,t){let r={...this.defaultOptions,...t},n={success:[],failed:[]},o=Array.from(this.handlers.entries()).map(async([s,i])=>{try{await i.output(e,r)?n.success.push(s):n.failed.push(s)}catch(a){console.error(`[OutputManager] Handler ${s} failed:`,a),n.failed.push(s)}});return await Promise.all(o),n}async outputTo(e,t,r){let n={...this.defaultOptions,...r},o={success:[],failed:[]},s=e.map(async i=>{let a=this.handlers.get(i);if(!a){console.warn(`[OutputManager] Handler ${i} not found`),o.failed.push(i);return}try{await a.output(t,n)?o.success.push(i):o.failed.push(i)}catch(u){console.error(`[OutputManager] Handler ${i} failed:`,u),o.failed.push(i)}});return await Promise.all(s),o}async outputToType(e,t,r){let n=Array.from(this.handlers.entries()).filter(([o,s])=>s.type===e).map(([o])=>o);return this.outputTo(n,t,r)}},Od=new Ww}),e9=Hu(Yv(),1),Kw=class{config={};options;constructor(e={jsonPath:"./config.json"}){this.options={envPath:e.envPath||".env",jsonPath:e.jsonPath,useEnvFile:!1,useJsonFile:e.useJsonFile!==!1,useEnvironmentVariables:e.useEnvironmentVariables!==!1,...e},this.loadConfig()}loadConfig(){this.options.useJsonFile&&this.options.jsonPath&&this.loadJsonConfig(),this.options.initialConfig&&(this.config={...this.config,...this.options.initialConfig}),this.options.useEnvFile&&this.loadEnvConfig(),this.config.LOG_FILE&&(process.env.LOG_FILE=this.config.LOG_FILE),this.config.LOG&&(process.env.LOG=this.config.LOG)}loadJsonConfig(){if(!this.options.jsonPath)return;let e=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,xw.join)(process.cwd(),this.options.jsonPath);if((0,oE.existsSync)(e))try{let t=(0,oE.readFileSync)(e,"utf-8"),r=e9.default.parse(t);this.config={...this.config,...r},console.log(`Loaded JSON config from: ${e}`)}catch(t){console.warn(`Failed to load JSON config from ${e}:`,t)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,xw.join)(process.cwd(),this.options.envPath);if((0,oE.existsSync)(e))try{let t=(0,_U.config)({path:e});t.parsed&&(this.config={...this.config,...this.parseEnvConfig(t.parsed)})}catch(t){console.warn(`Failed to load .env config from ${e}:`,t)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let t={};return Object.assign(t,e),t}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,t){let r=this.config[e];return r!==void 0?r:t}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(e){return this.config[e]!==void 0}set(e,t){this.config[e]=t}reload(){this.config={},this.loadConfig()}getConfigSummary(){let e=[];return this.options.initialConfig&&e.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&e.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&e.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&e.push("Environment Variables"),`Config sources: ${e.join(", ")}`}};function Go(e,t=500,r="internal_error",n="api_error"){let o=new Error(e);return o.statusCode=t,o.code=r,o.type=n,o}async function t9(e,t,r){t.log.error(e);let n=e.statusCode||500;if(e.rawBody)try{let s=JSON.parse(e.rawBody);return r.code(n).send(s)}catch{return r.code(n).send(e.rawBody)}let o={error:{message:e.message+(e.stack||"Internal Server Error"),type:e.type||"api_error",code:e.code||"internal_error"}};return r.code(n).send(o)}function r9(e,t,r,n,o){let s=new Headers({"Content-Type":"application/json"});r.headers&&Object.entries(r.headers).forEach(([l,c])=>{c&&s.set(l,c)});let i,a=AbortSignal.timeout(r.TIMEOUT??60*1e3*60);if(r.signal){let l=new AbortController,c=()=>l.abort();r.signal.addEventListener("abort",c),a.addEventListener("abort",c),i=l.signal}else i=a;let u={method:"POST",headers:s,body:JSON.stringify(t),signal:i};return r.httpsProxy&&(u.dispatcher=new SU.ProxyAgent(new URL(r.httpsProxy).toString())),o?.debug({reqId:n.req.id,request:u,headers:Object.fromEntries(s.entries()),requestUrl:typeof e=="string"?e:e.toString(),useProxy:r.httpsProxy},"final request"),fetch(typeof e=="string"?e:e.toString(),u)}var n9=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Kc={maxBodyLength:4096,maxStreamChunks:100},Jy=!1;function i9(e){Jy=e}function Zw(){return Jy}function JE(e){return Jy||e.get("DEBUG_LOG")===!0}function o9(e){let t=e.get("DEBUG_LOG_OPTIONS");return!t||typeof t!="object"?Kc:{maxBodyLength:t.maxBodyLength??Kc.maxBodyLength,maxStreamChunks:t.maxStreamChunks??Kc.maxStreamChunks}}function d_(e){let t={};for(let[r,n]of Object.entries(e))n9.has(r.toLowerCase())?t[r]="***MASKED***":t[r]=n;return t}function zy(e,t){return e.length<=t?e:e.slice(0,t)+`...[truncated, total ${e.length} bytes]`}function s9(e,t,r){let n=typeof r.body=="string"?r.body:JSON.stringify(r.body);e.info({debug_log:!0,reqId:t,phase:"provider_request",url:r.url,headers:d_(r.headers),body:zy(n,Kc.maxBodyLength)})}function a9(e,t,r){e.info({debug_log:!0,reqId:t,phase:"provider_response",status:r.status,headers:d_(r.headers),...r.body!==void 0?{body:zy(r.body,Kc.maxBodyLength)}:{}})}function Xw(e,t,r,n){e.info({debug_log:!0,reqId:t,phase:"provider_stream_chunk",chunkIndex:r,data:zy(n,Kc.maxBodyLength)})}function eB(e,t,r){e.info({debug_log:!0,reqId:t,phase:"provider_stream_end",totalChunks:r})}function u9(e,t,r,n){(async()=>{let o=e.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let i="";for(;;){let{done:a,value:u}=await o.read();if(a)break;i+=u;let l=i.split(`
937
937
 
938
- `);i=l.pop()||"";for(let c of l)c.trim()&&(s<n.maxStreamChunks?Xw(t,r,s,c):s===n.maxStreamChunks&&t.info({debug_log:!0,reqId:r,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${n.maxStreamChunks}]`}),s++)}i.trim()&&(s<n.maxStreamChunks&&Xw(t,r,s,i.trim()),s++),eB(t,r,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${r}:`,i),eB(t,r,s)}finally{o.releaseLock()}})()}var l9="2.1.10";nA();var c9=(0,Hv.join)(FU.HOME_DIR,"runtime"),wY=(0,Hv.join)(c9,"rate-limit.json"),A_=new Map,h9=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],d9=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],A9=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Wy(e,t,r){let n=a=>{if(r instanceof Headers)return r.get(a);let u=Object.keys(r).find(l=>l.toLowerCase()===a);return u?r[u]:null},o=fE(n,h9),s=fE(n,d9),i=fE(n,A9);(o||s||i)&&A_.set(e,{provider:e,remaining:tB(o),limit:tB(s),reset:p9(i),capturedAt:Date.now()})}function f9(){return Array.from(A_.values())}function fE(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function tB(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function p9(e){if(!e)return null;let t=e.trim();if(!t)return null;let r=Number(t);if(Number.isFinite(r))return r>1e12?Math.floor(r/1e3):r>1e9?Math.floor(r):Math.floor(Date.now()/1e3+r);let n=Date.parse(t);if(Number.isFinite(n))return Math.floor(n/1e3);let o=g9(t);return o===null?null:Math.floor((Date.now()+o)/1e3)}function g9(e){let t=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,r=0,n=!1;for(let o of e.matchAll(t)){n=!0;let s=Number(o[1]),i=o[2].toLowerCase();if(Number.isFinite(s))switch(i){case"ms":r+=s;break;case"s":r+=s*1e3;break;case"m":r+=s*60*1e3;break;case"h":r+=s*60*60*1e3;break;case"d":r+=s*24*60*60*1e3;break}}return n?r:null}Py();async function m9(e,t,r,n){let o=e.body,s=e.provider,i=r.providerService.getProvider(s);if(!i)throw Go(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await f_(o,i,n,e.headers,{req:e}),c=await p_(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&Wy(s,i.baseUrl,c.headers)}catch{}let h=await g_(a,c,i,n,l,{req:e}),A=m_(h,t,o,r);try{let d=o.model||e.originalModel;s&&d&&qs().recordSuccess(s,d)}catch{}return A}catch(a){let u=await E9(e,t,r,n,a);if(u)return u;throw a}}async function E9(e,t,r,n,o){let s=e.scenarioType||"default",i=e.familyFallback,a=e.modelFamily,u=r.configService.get("fallback"),l=qs(),c=e.provider||"",h=e.body.model||"",A=new Set;if(c&&h&&(l.recordFailure(c,h,o?.message),A.add(`${c},${h}`),r.recordUsage?.({provider:c,model:h,originalModel:e.originalModel||h,scenarioType:s,modelFamily:e.modelFamily,errorMessage:o?.message||String(o),sessionId:e.usageSessionId||e.id,stream:e.body.stream,inputTokens:e.tokenCount||0})),!r.configService.get("Router")?.enableFallback)return e.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let d=m=>{let[E,...C]=m.split(","),y=E?.trim(),D=C.join(",").trim();return!y||!D?null:{provider:y,model:D,key:`${y},${D}`}},f=[];if(a){let m=i?.[s];Array.isArray(m)&&m.length>0?f.push({name:`${a}/${s}`,models:m}):e.log.warn(`No ${a} fallback configured for ${s}; will try global ${s} fallback`)}if(Array.isArray(u?.[s])&&u[s].length>0&&f.push({name:`global/${s}`,models:u[s]}),f.length===0)return null;let g=f.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${s}, trying ${g} fallback models across ${f.length} fallback stage(s)`);for(let m of f){e.log.info(`Trying ${m.name} fallback stage with ${m.models.length} models`);for(let E of m.models){let C=d(E);if(!C){e.log.warn(`Fallback model '${E}' is invalid, skipping`);continue}if(A.has(C.key))continue;A.add(C.key);let y=C.provider,D=C.model;try{if(!l.isAvailable(y,D)){e.log.warn(`Fallback model ${E} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${E}`);let w={...e.body};w.model=D;let v={...e,provider:y,body:w},b=r.providerService.getProvider(y);if(!b){e.log.warn(`Fallback provider '${y}' not found, skipping`);continue}if(b.enabled===!1){e.log.warn(`Fallback provider '${y}' is disabled, skipping`);continue}let{requestBody:I,config:B,bypass:S}=await f_(w,b,n,e.headers,{req:v}),x=await p_(I,B,b,r,S,n,{req:v});try{b?.baseUrl&&x?.headers&&Wy(y,b.baseUrl,x.headers)}catch{}let k=await g_(I,x,b,n,S,{req:v});return e.log.info(`Fallback model ${E} succeeded`),l.recordSuccess(y,D),c&&h&&(Ly().promote(c,h,s,y,D),e.log.info(`Promoted fallback model ${y},${D} for ${c},${h}:${s}`),l.forceOpen(c,h,o?.message),e.log.info(`Marked original model ${c},${h} as unavailable`)),e.provider=y,e.body=w,m_(k,t,w,r)}catch(w){l.recordFailure(y,D,w.message),e.log.warn(`Fallback model ${C.key} failed: ${w.message}`),r.recordUsage?.({provider:y,model:D,originalModel:e.body.model,scenarioType:s,modelFamily:e.modelFamily,errorMessage:w.message,sessionId:e.usageSessionId||e.id,stream:e.body.stream});continue}}}return e.log.error(`All fallback models failed for ${s}`),null}async function f_(e,t,r,n,o){let s=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=y9(t,r,e),a&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],i.headers=n),!a&&typeof r.transformRequestOut=="function"){let u=await r.transformRequestOut(s);u.body?(s=u.body,i=u.config||{}):s=u}if(!a&&t.transformer?.use?.length)for(let u of t.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let l=await u.transformRequestIn(s,t,o);l.body?(s=l.body,i={...i,...l.config}):s=l}if(!a&&t.transformer?.[e.model]?.use?.length)for(let u of t.transformer[e.model].use)!u||typeof u.transformRequestIn!="function"||(s=await u.transformRequestIn(s,t,o));return{requestBody:s,config:i,bypass:a}}function y9(e,t,r){return e.transformer?.use?.length===1&&e.transformer.use[0].name===t.name&&(!e.transformer?.[r.model]?.use.length||e.transformer?.[r.model]?.use.length===1&&e.transformer?.[r.model]?.use[0].name===t.name)}async function p_(e,t,r,n,o,s,i){let a=t.url||new URL(r.baseUrl);if(!t.TIMEOUT){let c=n.configService.get("API_TIMEOUT_MS");c&&(t.TIMEOUT=typeof c=="string"?parseInt(c,10):c)}if(o&&typeof s.auth=="function"){let c=await s.auth(e,r);if(c.body){e=c.body;let h=t.headers||{};c.config?.headers&&(h={...h,...c.config.headers},delete h.host,delete c.config.headers),t={...t,...c.config,headers:h}}else e=c}let u={Authorization:`Bearer ${r.apiKey}`,...t?.headers||{}};for(let c in u)(u[c]==="undefined"||["authorization","Authorization"].includes(c)&&u[c]?.includes("undefined"))&&delete u[c];JE(n.configService)&&s9(n.log,i.req.id,{url:String(a),headers:u,body:e});let l=await r9(a,e,{httpsProxy:n.configService.getHttpsProxy(),...t,headers:JSON.parse(JSON.stringify(u))},i,n.log);if(!l.ok){let c=await l.text();n.log.error(`[provider_response_error] Error from provider(${r.name},${e.model}: ${l.status}): ${c}`);let h=Go(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error");throw h.rawBody=c,h}if(l.ok&&(l.headers.get("content-type")||"").includes("application/json")){let c=l.clone();try{let h=await c.text(),A=JSON.parse(h);if(A&&typeof A=="object"&&A.error&&(typeof A.error=="string"||typeof A.error=="object"&&Object.keys(A.error).length>0)){n.log.error(`[provider_response_error] Hidden error from provider(${r.name},${e.model}: ${l.status}): ${h}`);let d=Go(`Error from provider(${r.name},${e.model}: ${l.status}): ${h}`,400,"provider_response_error");throw d.rawBody=h,d}}catch{}}if(!e.stream&&JE(n.configService)){let c=await l.clone().text();a9(n.log,i.req.id,{status:l.status,headers:Object.fromEntries(l.headers.entries()),body:c})}return l}async function g_(e,t,r,n,o,s){let i=t;if(!o&&r.transformer?.use?.length)for(let a of Array.from(r.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!o&&r.transformer?.[e.model]?.use?.length)for(let a of Array.from(r.transformer[e.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));return!o&&n.transformResponseIn&&(i=await n.transformResponseIn(i,s)),i}function m_(e,t,r,n){if(e.ok||t.code(e.status),r.stream===!0){if(t.header("Content-Type","text/event-stream"),t.header("Cache-Control","no-cache"),t.header("Connection","keep-alive"),n&&JE(n.configService)){let[o,s]=e.body.tee(),i=o9(n.configService);return u9(o,n.log,t.request.id,i),t.send(s)}return t.send(e.body)}else return e.json()}var rB=async e=>{e.get("/",async()=>({message:"LLMs API",version:l9})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:qs().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError})),timestamp:new Date().toISOString()}));let t=e.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of t)r.endPoint&&e.post(r.endPoint,async(n,o)=>m9(n,o,e,r));e.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(r,n)=>{let{name:o,baseUrl:s,apiKey:i,models:a}=r.body;if(!o?.trim())throw Go("Provider name is required",400,"invalid_request");if(!s||!D9(s))throw Go("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw Go("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw Go("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw Go(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return e.providerService.registerProvider(r.body)}),e.get("/providers",async()=>e.providerService.getProviders()),e.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=e.providerService.getProvider(r.params.id);if(!n)throw Go("Provider not found",404,"provider_not_found");return n}),e.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},enabled:{type:"boolean"}}}}},async(r,n)=>{let o=e.providerService.updateProvider(r.params.id,r.body);if(!o)throw Go("Provider not found",404,"provider_not_found");return o}),e.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!e.providerService.deleteProvider(r.params.id))throw Go("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),e.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(r,n)=>{if(!e.providerService.toggleProvider(r.params.id,r.body.enabled))throw Go("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function D9(e){try{return new URL(e),!0}catch{return!1}}var nB=class{constructor(e,t,r){this.configService=e,this.transformerService=t,this.logger=r,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let r={};t.transformer&&Object.keys(t.transformer).forEach(n=>{n==="use"?Array.isArray(t.transformer.use)&&(r.use=t.transformer.use.map(o=>{if(Array.isArray(o)&&typeof o[0]=="string"){let s=this.transformerService.getTransformer(o[0]);if(s)return new s(o[1])}if(typeof o=="string"){let s=this.transformerService.getTransformer(o);return typeof s=="function"?new s:s}}).filter(o=>typeof o<"u")):Array.isArray(t.transformer[n]?.use)&&(r[n]={use:t.transformer[n].use.map(o=>{if(Array.isArray(o)&&typeof o[0]=="string"){let s=this.transformerService.getTransformer(o[0]);if(s)return new s(o[1])}if(typeof o=="string"){let s=this.transformerService.getTransformer(o);return typeof s=="function"?new s:s}}).filter(o=>typeof o<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,models:t.models||[],quotaToken:t.quota_token,transformer:t.transformer?r:void 0,enabled:t.enabled!==!1,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(r){this.logger.error(`${t.name} provider registered error: ${r}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(r=>{let n=`${t.name},${r}`,o={provider:t.name,model:r,fullModel:n};this.modelRoutes.set(n,o),this.modelRoutes.has(r)||this.modelRoutes.set(r,o)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let r=this.providers.get(e);if(!r)return null;let n={...r,...t,updatedAt:new Date};return this.providers.set(e,n),t.models&&(r.models.forEach(o=>{let s=`${r.name},${o}`;this.modelRoutes.delete(s),this.modelRoutes.delete(o)}),t.models.forEach(o=>{let s=`${r.name},${o}`,i={provider:r.name,model:o,fullModel:s};this.modelRoutes.set(s,i),this.modelRoutes.has(o)||this.modelRoutes.set(o,i)})),n}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(r=>{let n=`${t.name},${r}`;this.modelRoutes.delete(n),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let r=this.providers.get(e);if(!r)return!1;r.enabled=t;let n=this.configService.get("providers");if(n&&Array.isArray(n)){let o=n.find(s=>s.name===e);o&&(o.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let r=this.providers.get(t.provider);return r?{provider:r,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(r=>{e.push(r),e.push(`${t.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,r)=>{if(Array.isArray(r)){let[n,o={}]=r;t[n]=o}else t[r]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(r=>{e.push({id:r,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${r}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}},Gi=[];for(let e=0;e<256;++e)Gi.push((e+256).toString(16).slice(1));function C9(e,t=0){return(Gi[e[t+0]]+Gi[e[t+1]]+Gi[e[t+2]]+Gi[e[t+3]]+"-"+Gi[e[t+4]]+Gi[e[t+5]]+"-"+Gi[e[t+6]]+Gi[e[t+7]]+"-"+Gi[e[t+8]]+Gi[e[t+9]]+"-"+Gi[e[t+10]]+Gi[e[t+11]]+Gi[e[t+12]]+Gi[e[t+13]]+Gi[e[t+14]]+Gi[e[t+15]]).toLowerCase()}var M0=new Uint8Array(256),I0=M0.length;function b9(){return I0>M0.length-16&&((0,kU.randomFillSync)(M0),I0=0),M0.slice(I0,I0+=16)}var iB={randomUUID:TU.randomUUID};function w9(e,t,r){if(iB.randomUUID&&!t&&!e)return iB.randomUUID();e=e||{};let n=e.random??e.rng?.()??b9();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;++o)t[r+o]=n[o];return t}return C9(n)}var $d=w9,B9=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",I9=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`);function v9(e){return e.map(t=>({name:t.function.name,description:t.function.description,input_schema:t.function.parameters}))}function x9(e){let t=[],r=[];e.messages.forEach(s=>{s.role==="system"?typeof s.content=="string"?r.push(s.content):Array.isArray(s.content)&&s.content.forEach(i=>{i&&typeof i=="object"&&i.type==="text"&&i.text?r.push(i.text):typeof i=="string"&&r.push(i)}):t.push(s)});let n=[];for(let s=0;s<t.length;s++){let i=t[s];if(i.role==="tool"){let a=i.content;try{typeof i.content=="string"&&(a=JSON.parse(i.content))}catch{}let u={type:"tool_result",tool_use_id:i.tool_call_id,content:a};i.cache_control&&(u.cache_control=i.cache_control);let l=n[n.length-1];l&&l.role==="user"&&Array.isArray(l.content)?l.content.push(u):n.push({role:"user",content:[u]})}else if(i.role==="user"){let a=[];typeof i.content=="string"?a.push({type:"text",text:i.content}):Array.isArray(i.content)&&i.content.forEach(l=>{l&&typeof l=="object"&&l.type==="image_url"&&l.image_url?.url?a.push({type:"image",source:{type:"base64",media_type:l.media_type||"image/jpeg",data:l.image_url.url.split(",")[1]||l.image_url.url}}):a.push(l)});let u=n[n.length-1];u&&u.role==="user"&&Array.isArray(u.content)?u.content.push(...a):n.push({role:"user",content:a.length>0?a:[{type:"text",text:" "}]})}else if(i.role==="assistant"){let a=[];i.content&&(typeof i.content=="string"?a.push({type:"text",text:i.content}):Array.isArray(i.content)&&a.push(...i.content)),i.tool_calls&&i.tool_calls.length>0&&i.tool_calls.forEach(l=>{let c={};try{c=JSON.parse(l.function.arguments)}catch{c=l.function.arguments}a.push({type:"tool_use",id:l.id,name:l.function.name,input:c})}),i.thinking&&a.unshift({type:"thinking",thinking:i.thinking.content,signature:i.thinking.signature});let u=n[n.length-1];u&&u.role==="assistant"&&Array.isArray(u.content)?u.content.push(...a):n.push({role:"assistant",content:a.length>0?a:[{type:"text",text:" "}]})}}let o={messages:n,model:e.model,max_tokens:e.max_tokens||4096,temperature:e.temperature,stream:e.stream};return r.length>0&&(o.system=r.join(`
938
+ `);i=l.pop()||"";for(let c of l)c.trim()&&(s<n.maxStreamChunks?Xw(t,r,s,c):s===n.maxStreamChunks&&t.info({debug_log:!0,reqId:r,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${n.maxStreamChunks}]`}),s++)}i.trim()&&(s<n.maxStreamChunks&&Xw(t,r,s,i.trim()),s++),eB(t,r,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${r}:`,i),eB(t,r,s)}finally{o.releaseLock()}})()}var l9="2.1.11";nA();var c9=(0,Hv.join)(FU.HOME_DIR,"runtime"),wY=(0,Hv.join)(c9,"rate-limit.json"),A_=new Map,h9=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],d9=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],A9=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Wy(e,t,r){let n=a=>{if(r instanceof Headers)return r.get(a);let u=Object.keys(r).find(l=>l.toLowerCase()===a);return u?r[u]:null},o=fE(n,h9),s=fE(n,d9),i=fE(n,A9);(o||s||i)&&A_.set(e,{provider:e,remaining:tB(o),limit:tB(s),reset:p9(i),capturedAt:Date.now()})}function f9(){return Array.from(A_.values())}function fE(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function tB(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function p9(e){if(!e)return null;let t=e.trim();if(!t)return null;let r=Number(t);if(Number.isFinite(r))return r>1e12?Math.floor(r/1e3):r>1e9?Math.floor(r):Math.floor(Date.now()/1e3+r);let n=Date.parse(t);if(Number.isFinite(n))return Math.floor(n/1e3);let o=g9(t);return o===null?null:Math.floor((Date.now()+o)/1e3)}function g9(e){let t=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,r=0,n=!1;for(let o of e.matchAll(t)){n=!0;let s=Number(o[1]),i=o[2].toLowerCase();if(Number.isFinite(s))switch(i){case"ms":r+=s;break;case"s":r+=s*1e3;break;case"m":r+=s*60*1e3;break;case"h":r+=s*60*60*1e3;break;case"d":r+=s*24*60*60*1e3;break}}return n?r:null}Py();async function m9(e,t,r,n){let o=e.body,s=e.provider,i=r.providerService.getProvider(s);if(!i)throw Go(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await f_(o,i,n,e.headers,{req:e}),c=await p_(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&Wy(s,i.baseUrl,c.headers)}catch{}let h=await g_(a,c,i,n,l,{req:e}),A=m_(h,t,o,r);try{let d=o.model||e.originalModel;s&&d&&qs().recordSuccess(s,d)}catch{}return A}catch(a){let u=await E9(e,t,r,n,a);if(u)return u;throw a}}async function E9(e,t,r,n,o){let s=e.scenarioType||"default",i=e.familyFallback,a=e.modelFamily,u=r.configService.get("fallback"),l=qs(),c=e.provider||"",h=e.body.model||"",A=new Set;if(c&&h&&(l.recordFailure(c,h,o?.message),A.add(`${c},${h}`),r.recordUsage?.({provider:c,model:h,originalModel:e.originalModel||h,scenarioType:s,modelFamily:e.modelFamily,errorMessage:o?.message||String(o),sessionId:e.usageSessionId||e.id,stream:e.body.stream,inputTokens:e.tokenCount||0})),!r.configService.get("Router")?.enableFallback)return e.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let d=m=>{let[E,...C]=m.split(","),y=E?.trim(),D=C.join(",").trim();return!y||!D?null:{provider:y,model:D,key:`${y},${D}`}},f=[];if(a){let m=i?.[s];Array.isArray(m)&&m.length>0?f.push({name:`${a}/${s}`,models:m}):e.log.warn(`No ${a} fallback configured for ${s}; will try global ${s} fallback`)}if(Array.isArray(u?.[s])&&u[s].length>0&&f.push({name:`global/${s}`,models:u[s]}),f.length===0)return null;let g=f.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${s}, trying ${g} fallback models across ${f.length} fallback stage(s)`);for(let m of f){e.log.info(`Trying ${m.name} fallback stage with ${m.models.length} models`);for(let E of m.models){let C=d(E);if(!C){e.log.warn(`Fallback model '${E}' is invalid, skipping`);continue}if(A.has(C.key))continue;A.add(C.key);let y=C.provider,D=C.model;try{if(!l.isAvailable(y,D)){e.log.warn(`Fallback model ${E} unavailable (fail pool), skipping`);continue}e.log.info(`Trying fallback model: ${E}`);let w={...e.body};w.model=D;let v={...e,provider:y,body:w},b=r.providerService.getProvider(y);if(!b){e.log.warn(`Fallback provider '${y}' not found, skipping`);continue}if(b.enabled===!1){e.log.warn(`Fallback provider '${y}' is disabled, skipping`);continue}let{requestBody:I,config:B,bypass:S}=await f_(w,b,n,e.headers,{req:v}),x=await p_(I,B,b,r,S,n,{req:v});try{b?.baseUrl&&x?.headers&&Wy(y,b.baseUrl,x.headers)}catch{}let k=await g_(I,x,b,n,S,{req:v});return e.log.info(`Fallback model ${E} succeeded`),l.recordSuccess(y,D),c&&h&&(Ly().promote(c,h,s,y,D),e.log.info(`Promoted fallback model ${y},${D} for ${c},${h}:${s}`),l.forceOpen(c,h,o?.message),e.log.info(`Marked original model ${c},${h} as unavailable`)),e.provider=y,e.body=w,m_(k,t,w,r)}catch(w){l.recordFailure(y,D,w.message),e.log.warn(`Fallback model ${C.key} failed: ${w.message}`),r.recordUsage?.({provider:y,model:D,originalModel:e.body.model,scenarioType:s,modelFamily:e.modelFamily,errorMessage:w.message,sessionId:e.usageSessionId||e.id,stream:e.body.stream});continue}}}return e.log.error(`All fallback models failed for ${s}`),null}async function f_(e,t,r,n,o){let s=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=y9(t,r,e),a&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],i.headers=n),!a&&typeof r.transformRequestOut=="function"){let u=await r.transformRequestOut(s);u.body?(s=u.body,i=u.config||{}):s=u}if(!a&&t.transformer?.use?.length)for(let u of t.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let l=await u.transformRequestIn(s,t,o);l.body?(s=l.body,i={...i,...l.config}):s=l}if(!a&&t.transformer?.[e.model]?.use?.length)for(let u of t.transformer[e.model].use)!u||typeof u.transformRequestIn!="function"||(s=await u.transformRequestIn(s,t,o));return{requestBody:s,config:i,bypass:a}}function y9(e,t,r){return r?.messages?.some(n=>n.role==="system")?!1:e.transformer?.use?.length===1&&e.transformer.use[0].name===t.name&&(!e.transformer?.[r.model]?.use.length||e.transformer?.[r.model]?.use.length===1&&e.transformer?.[r.model]?.use[0].name===t.name)}async function p_(e,t,r,n,o,s,i){let a=t.url||new URL(r.baseUrl);if(!t.TIMEOUT){let c=n.configService.get("API_TIMEOUT_MS");c&&(t.TIMEOUT=typeof c=="string"?parseInt(c,10):c)}if(o&&typeof s.auth=="function"){let c=await s.auth(e,r);if(c.body){e=c.body;let h=t.headers||{};c.config?.headers&&(h={...h,...c.config.headers},delete h.host,delete c.config.headers),t={...t,...c.config,headers:h}}else e=c}let u={Authorization:`Bearer ${r.apiKey}`,...t?.headers||{}};for(let c in u)(u[c]==="undefined"||["authorization","Authorization"].includes(c)&&u[c]?.includes("undefined"))&&delete u[c];JE(n.configService)&&s9(n.log,i.req.id,{url:String(a),headers:u,body:e});let l=await r9(a,e,{httpsProxy:n.configService.getHttpsProxy(),...t,headers:JSON.parse(JSON.stringify(u))},i,n.log);if(!l.ok){let c=await l.text();n.log.error(`[provider_response_error] Error from provider(${r.name},${e.model}: ${l.status}): ${c}`);let h=Go(`Error from provider(${r.name},${e.model}: ${l.status}): ${c}`,l.status,"provider_response_error");throw h.rawBody=c,h}if(l.ok&&(l.headers.get("content-type")||"").includes("application/json")){let c=l.clone();try{let h=await c.text(),A=JSON.parse(h);if(A&&typeof A=="object"&&A.error&&(typeof A.error=="string"||typeof A.error=="object"&&Object.keys(A.error).length>0)){n.log.error(`[provider_response_error] Hidden error from provider(${r.name},${e.model}: ${l.status}): ${h}`);let d=Go(`Error from provider(${r.name},${e.model}: ${l.status}): ${h}`,400,"provider_response_error");throw d.rawBody=h,d}}catch{}}if(!e.stream&&JE(n.configService)){let c=await l.clone().text();a9(n.log,i.req.id,{status:l.status,headers:Object.fromEntries(l.headers.entries()),body:c})}return l}async function g_(e,t,r,n,o,s){let i=t;if(!o&&r.transformer?.use?.length)for(let a of Array.from(r.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!o&&r.transformer?.[e.model]?.use?.length)for(let a of Array.from(r.transformer[e.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));return!o&&n.transformResponseIn&&(i=await n.transformResponseIn(i,s)),i}function m_(e,t,r,n){if(e.ok||t.code(e.status),r.stream===!0){if(t.header("Content-Type","text/event-stream"),t.header("Cache-Control","no-cache"),t.header("Connection","keep-alive"),n&&JE(n.configService)){let[o,s]=e.body.tee(),i=o9(n.configService);return u9(o,n.log,t.request.id,i),t.send(s)}return t.send(e.body)}else return e.json()}var rB=async e=>{e.get("/",async()=>({message:"LLMs API",version:l9})),e.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),e.get("/providers/health",async()=>({states:qs().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError})),timestamp:new Date().toISOString()}));let t=e.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of t)r.endPoint&&e.post(r.endPoint,async(n,o)=>m9(n,o,e,r));e.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(r,n)=>{let{name:o,baseUrl:s,apiKey:i,models:a}=r.body;if(!o?.trim())throw Go("Provider name is required",400,"invalid_request");if(!s||!D9(s))throw Go("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw Go("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw Go("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw Go(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return e.providerService.registerProvider(r.body)}),e.get("/providers",async()=>e.providerService.getProviders()),e.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=e.providerService.getProvider(r.params.id);if(!n)throw Go("Provider not found",404,"provider_not_found");return n}),e.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},enabled:{type:"boolean"}}}}},async(r,n)=>{let o=e.providerService.updateProvider(r.params.id,r.body);if(!o)throw Go("Provider not found",404,"provider_not_found");return o}),e.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!e.providerService.deleteProvider(r.params.id))throw Go("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),e.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(r,n)=>{if(!e.providerService.toggleProvider(r.params.id,r.body.enabled))throw Go("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function D9(e){try{return new URL(e),!0}catch{return!1}}var nB=class{constructor(e,t,r){this.configService=e,this.transformerService=t,this.logger=r,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let r={};t.transformer&&Object.keys(t.transformer).forEach(n=>{n==="use"?Array.isArray(t.transformer.use)&&(r.use=t.transformer.use.map(o=>{if(Array.isArray(o)&&typeof o[0]=="string"){let s=this.transformerService.getTransformer(o[0]);if(s)return new s(o[1])}if(typeof o=="string"){let s=this.transformerService.getTransformer(o);return typeof s=="function"?new s:s}}).filter(o=>typeof o<"u")):Array.isArray(t.transformer[n]?.use)&&(r[n]={use:t.transformer[n].use.map(o=>{if(Array.isArray(o)&&typeof o[0]=="string"){let s=this.transformerService.getTransformer(o[0]);if(s)return new s(o[1])}if(typeof o=="string"){let s=this.transformerService.getTransformer(o);return typeof s=="function"?new s:s}}).filter(o=>typeof o<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,models:t.models||[],quotaToken:t.quota_token,transformer:t.transformer?r:void 0,enabled:t.enabled!==!1,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(r){this.logger.error(`${t.name} provider registered error: ${r}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(r=>{let n=`${t.name},${r}`,o={provider:t.name,model:r,fullModel:n};this.modelRoutes.set(n,o),this.modelRoutes.has(r)||this.modelRoutes.set(r,o)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let r=this.providers.get(e);if(!r)return null;let n={...r,...t,updatedAt:new Date};return this.providers.set(e,n),t.models&&(r.models.forEach(o=>{let s=`${r.name},${o}`;this.modelRoutes.delete(s),this.modelRoutes.delete(o)}),t.models.forEach(o=>{let s=`${r.name},${o}`,i={provider:r.name,model:o,fullModel:s};this.modelRoutes.set(s,i),this.modelRoutes.has(o)||this.modelRoutes.set(o,i)})),n}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(r=>{let n=`${t.name},${r}`;this.modelRoutes.delete(n),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let r=this.providers.get(e);if(!r)return!1;r.enabled=t;let n=this.configService.get("providers");if(n&&Array.isArray(n)){let o=n.find(s=>s.name===e);o&&(o.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let r=this.providers.get(t.provider);return r?{provider:r,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(r=>{e.push(r),e.push(`${t.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,r)=>{if(Array.isArray(r)){let[n,o={}]=r;t[n]=o}else t[r]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(r=>{e.push({id:r,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${r}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}},Gi=[];for(let e=0;e<256;++e)Gi.push((e+256).toString(16).slice(1));function C9(e,t=0){return(Gi[e[t+0]]+Gi[e[t+1]]+Gi[e[t+2]]+Gi[e[t+3]]+"-"+Gi[e[t+4]]+Gi[e[t+5]]+"-"+Gi[e[t+6]]+Gi[e[t+7]]+"-"+Gi[e[t+8]]+Gi[e[t+9]]+"-"+Gi[e[t+10]]+Gi[e[t+11]]+Gi[e[t+12]]+Gi[e[t+13]]+Gi[e[t+14]]+Gi[e[t+15]]).toLowerCase()}var M0=new Uint8Array(256),I0=M0.length;function b9(){return I0>M0.length-16&&((0,kU.randomFillSync)(M0),I0=0),M0.slice(I0,I0+=16)}var iB={randomUUID:TU.randomUUID};function w9(e,t,r){if(iB.randomUUID&&!t&&!e)return iB.randomUUID();e=e||{};let n=e.random??e.rng?.()??b9();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;++o)t[r+o]=n[o];return t}return C9(n)}var $d=w9,B9=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",I9=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`);function v9(e){return e.map(t=>({name:t.function.name,description:t.function.description,input_schema:t.function.parameters}))}function x9(e){let t=[],r=[];e.messages.forEach(s=>{s.role==="system"?typeof s.content=="string"?r.push(s.content):Array.isArray(s.content)&&s.content.forEach(i=>{i&&typeof i=="object"&&i.type==="text"&&i.text?r.push(i.text):typeof i=="string"&&r.push(i)}):t.push(s)});let n=[];for(let s=0;s<t.length;s++){let i=t[s];if(i.role==="tool"){let a=i.content;try{typeof i.content=="string"&&(a=JSON.parse(i.content))}catch{}let u={type:"tool_result",tool_use_id:i.tool_call_id,content:a};i.cache_control&&(u.cache_control=i.cache_control);let l=n[n.length-1];l&&l.role==="user"&&Array.isArray(l.content)?l.content.push(u):n.push({role:"user",content:[u]})}else if(i.role==="user"){let a=[];typeof i.content=="string"?a.push({type:"text",text:i.content}):Array.isArray(i.content)&&i.content.forEach(l=>{l&&typeof l=="object"&&l.type==="image_url"&&l.image_url?.url?a.push({type:"image",source:{type:"base64",media_type:l.media_type||"image/jpeg",data:l.image_url.url.split(",")[1]||l.image_url.url}}):a.push(l)});let u=n[n.length-1];u&&u.role==="user"&&Array.isArray(u.content)?u.content.push(...a):n.push({role:"user",content:a.length>0?a:[{type:"text",text:" "}]})}else if(i.role==="assistant"){let a=[];i.content&&(typeof i.content=="string"?a.push({type:"text",text:i.content}):Array.isArray(i.content)&&a.push(...i.content)),i.tool_calls&&i.tool_calls.length>0&&i.tool_calls.forEach(l=>{let c={};try{c=JSON.parse(l.function.arguments)}catch{c=l.function.arguments}a.push({type:"tool_use",id:l.id,name:l.function.name,input:c})}),i.thinking&&a.unshift({type:"thinking",thinking:i.thinking.content,signature:i.thinking.signature});let u=n[n.length-1];u&&u.role==="assistant"&&Array.isArray(u.content)?u.content.push(...a):n.push({role:"assistant",content:a.length>0?a:[{type:"text",text:" "}]})}}let o={messages:n,model:e.model,max_tokens:e.max_tokens||4096,temperature:e.temperature,stream:e.stream};return r.length>0&&(o.system=r.join(`
939
939
 
940
- `)),e.tools&&e.tools.length>0&&(o.tools=v9(e.tools),e.tool_choice&&(e.tool_choice==="auto"?o.tool_choice={type:"auto"}:e.tool_choice==="any"||e.tool_choice==="required"?o.tool_choice={type:"any"}:typeof e.tool_choice=="string"?o.tool_choice={type:"tool",name:e.tool_choice}:typeof e.tool_choice=="object"&&e.tool_choice.type==="function"&&(o.tool_choice={type:"tool",name:e.tool_choice.function.name}))),o}var _9=class{constructor(e){this.options=e,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let r={};return this.useBearer?(r.authorization=`Bearer ${t.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=t.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let t=[];if(e.system){if(typeof e.system=="string")t.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let n=e.system.filter(o=>o.type==="text"&&o.text).map(o=>({type:"text",text:o.text,cache_control:o.cache_control}));t.push({role:"system",content:n})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(n=>{if(n.role==="user"||n.role==="assistant"){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});return}if(Array.isArray(n.content)){if(n.role==="user"){let o=n.content.filter(i=>i.type==="tool_result"&&i.tool_use_id);o.length&&o.forEach(i=>{let a={role:"tool",content:typeof i.content=="string"?i.content:JSON.stringify(i.content),tool_call_id:i.tool_use_id,cache_control:i.cache_control};t.push(a)});let s=n.content.filter(i=>i.type==="text"&&i.text||i.type==="image"&&i.source);s.length&&t.push({role:"user",content:s.map(i=>i?.type==="image"?{type:"image_url",image_url:{url:i.source?.type==="base64"?I9(i.source.data,i.source.media_type):i.source.url},media_type:i.source.media_type}:i)})}else if(n.role==="assistant"){let o={role:"assistant",content:""},s=n.content.filter(u=>u.type==="text"&&u.text);s.length&&(o.content=s.map(u=>u.text).join(`
940
+ `)),e.tools&&e.tools.length>0&&(o.tools=v9(e.tools),e.tool_choice&&(e.tool_choice==="auto"?o.tool_choice={type:"auto"}:e.tool_choice==="any"||e.tool_choice==="required"?o.tool_choice={type:"any"}:typeof e.tool_choice=="string"?o.tool_choice={type:"tool",name:e.tool_choice}:typeof e.tool_choice=="object"&&e.tool_choice.type==="function"&&(o.tool_choice={type:"tool",name:e.tool_choice.function.name}))),o}var _9=class{constructor(e){this.options=e,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let r={};return this.useBearer?(r.authorization=`Bearer ${t.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=t.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let t=[];if(e.system){if(typeof e.system=="string")t.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let n=e.system.filter(o=>o.type==="text"&&o.text).map(o=>({type:"text",text:o.text,cache_control:o.cache_control}));t.push({role:"system",content:n})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(n=>{if(n.role==="system"){t.push({role:"system",content:n.content});return}if(n.role==="user"||n.role==="assistant"){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});return}if(Array.isArray(n.content)){if(n.role==="user"){let o=n.content.filter(i=>i.type==="tool_result"&&i.tool_use_id);o.length&&o.forEach(i=>{let a={role:"tool",content:typeof i.content=="string"?i.content:JSON.stringify(i.content),tool_call_id:i.tool_use_id,cache_control:i.cache_control};t.push(a)});let s=n.content.filter(i=>i.type==="text"&&i.text||i.type==="image"&&i.source);s.length&&t.push({role:"user",content:s.map(i=>i?.type==="image"?{type:"image_url",image_url:{url:i.source?.type==="base64"?I9(i.source.data,i.source.media_type):i.source.url},media_type:i.source.media_type}:i)})}else if(n.role==="assistant"){let o={role:"assistant",content:""},s=n.content.filter(u=>u.type==="text"&&u.text);s.length&&(o.content=s.map(u=>u.text).join(`
941
941
  `));let i=n.content.filter(u=>u.type==="tool_use"&&u.id);i.length&&(o.tool_calls=i.map(u=>({id:u.id,type:"function",function:{name:u.name,arguments:JSON.stringify(u.input||{})}})));let a=n.content.find(u=>u.type==="thinking");a&&(o.thinking={content:a.thinking,signature:a.signature}),t.push(o)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice};return e.thinking&&(r.reasoning={effort:B9(e.thinking.budget_tokens),enabled:e.thinking.type==="enabled"}),e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,r){let n=x9(e),o={};return this.useBearer?(o.authorization=`Bearer ${t.apiKey}`,o["x-api-key"]=void 0):(o["x-api-key"]=t.apiKey,o.authorization=void 0),o["anthropic-version"]="2023-06-01",o["content-type"]="application/json",{body:n,config:{url:new URL(this.endPoint||"/v1/messages",t.baseUrl),headers:o}}}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let r=await this.convertOpenAIStreamToAnthropic(e.body,t);return new Response(r,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let r=await e.json(),n=this.convertOpenAIResponseToAnthropic(r,t);return new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description||"",parameters:t.input_schema}}))}async convertOpenAIStreamToAnthropic(e,t){return new ReadableStream({start:async r=>{let n=new TextEncoder,o=`msg_${Date.now()}`,s=null,i="unknown",a=!1,u=!1,l=!1,c=new Map,h=new Map,A=0,d=0,f=0,g=!1,m=!1,E=0,C=-1,y=()=>{let b=E;return E++,b},D=b=>{if(!g)try{r.enqueue(b);let I=new TextDecoder().decode(b);this.logger.debug({reqId:t.req.id,data:I,type:"send data"})}catch(I){if(I instanceof TypeError&&I.message.includes("Controller is already closed"))g=!0;else throw this.logger.debug({reqId:t.req.id,error:I instanceof Error?I.message:String(I),type:"send data error"}),I}},w=()=>{if(!g)try{if(C>=0){let I={type:"content_block_stop",index:C};D(n.encode(`event: content_block_stop
942
942
  data: ${JSON.stringify(I)}
943
943
 
@@ -1244,7 +1244,7 @@ If multiple images exist, select the **most relevant imageId** based on the user
1244
1244
 
1245
1245
  Do not attempt to describe or analyze the image directly yourself.
1246
1246
  Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
1247
- Your response should consistently follow this rule whenever image-related analysis is requested.`});let r=e.body.messages.filter(o=>o.role==="user"&&Array.isArray(o.content)&&o.content.some(s=>s.type==="image"||Array.isArray(s.content)&&s.content.some(i=>i.type==="image"))),n=1;r.forEach(o=>{Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="image"?(_0.storeImage(`${e.id}_Image#${n}`,s.source),s.type="text",delete s.source,s.text=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++):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(i=>i.type==="image")&&(_0.storeImage(`${e.id}_Image#${n}`,s.content[0].source),s.content=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++)})})}},XH=new ZH,eq=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},U_=new eq;U_.registerAgent(XH);var IE=U_,tq=require("node:events"),NB=require("node:perf_hooks"),rq=vv(),nq=rq.getHealthStore,OB=new tq.EventEmitter;function vE(e){if(e.usageSessionId)return e.usageSessionId;try{let n=e.body?.metadata?.user_id;if(n&&typeof n=="string")try{let o=JSON.parse(n);if(o.session_id)return e.usageSessionId=o.session_id,e.usageSessionId}catch{let o=n.match(/_session_([a-f0-9-]+)/i);if(o)return e.usageSessionId=o[1],e.usageSessionId}}catch{}let t=e.headers?.["x-request-id"],r=Array.isArray(t)?t[0]:t;return e.usageSessionId=e.sessionId||(typeof r=="string"?r:void 0)||e.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.usageSessionId}function xE(e){return e.body?.model?Array.isArray(e.body.model)?e.body.model.join(","):e.body.model:Array.isArray(e.model)?e.model.join(","):e.model||""}async function iq(){let e=(0,Uv.homedir)(),t=(0,jv.join)(e,".claude.json");if(!(0,gU.existsSync)(t)){let r={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,mU.writeFile)(t,JSON.stringify(r,null,2))}}async function oq(e,t){let r=t.plugins||t.Plugins||[];for(let n of r){let{name:o,enabled:s=!1,options:i={}}=n;switch(o){case"token-speed":WE.registerPlugin(Q_,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${o}`);break}}await WE.enablePlugins(e)}async function j_(e={}){await iq(),await Ry();let t=await $v(),r=t.Providers||t.providers||[],n=r&&r.length>0,o=t.HOST||"127.0.0.1";n?(o=t.HOST,t.APIKEY||(o="127.0.0.1")):(o="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let s=t.PORT||3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):s,a=A=>(A>9?"":"0")+A,u=(A,d)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let g=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${g}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:qH(u,{path:CE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,CE.listPresets)(),h=await FH({jsonPath:CE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:o,PORT:i,LOG_FILE:(0,jv.join)((0,Uv.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return h.recordUsage=A=>{try{SB({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:A.sessionId||"",provider:A.provider||"",originalModel:A.originalModel||"",model:A.model||"",modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.stream??!1,inputTokens:A.inputTokens||0,outputTokens:0,cacheReadInputTokens:A.cacheReadInputTokens||0,cacheCreationInputTokens:A.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:A.errorMessage,responseBody:void 0})}catch(d){console.error("Fallback usage tracking error:",d)}},await Promise.allSettled(c.map(async A=>await h.registerNamespace(`/preset/${A.name}`,A.config))),await oq(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=NB.performance.now())}),h.addHook("preHandler",async(A,d)=>{if(new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")){let f=vE(A);Yc.put(f,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0})}}),h.addHook("preHandler",async(A,d)=>new Promise((f,g)=>{let m=E=>{E?g(E):f()};kH(t)(A,d,m).catch(g)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let g of IE.getAllAgents())g.shouldHandle(A,t)&&(f.push(g.name),g.reqHandler(A,t),g.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(g.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",OB.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,g)=>{if(A.pathname?.endsWith("/v1/messages")){let m=vE(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new BE),w,v=-1,b="",I="",B="",S=[],x=[];return g(null,VH(D,async(k,R)=>{try{if(k.event==="content_block_start"&&k?.data?.content_block?.name){let O=A.agents.find(T=>IE.getAgent(T)?.tools.get(k.data.content_block.name));if(O){w=IE.getAgent(O),v=k.data.index,b=k.data.content_block.name,B=k.data.content_block.id;return}}if(v>-1&&k.data.index===v&&k.data?.delta?.type==="input_json_delta"){I+=k.data?.delta?.partial_json;return}if(v>-1&&k.data.index===v&&k.data.type==="content_block_stop"){try{let O=YH.default.parse(I);x.push({type:"tool_use",id:B,name:b,input:O});let T=await w?.tools.get(b)?.handler(O,{req:A,config:t});S.push({tool_use_id:B,type:"tool_result",content:T}),w=void 0,v=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(k.event==="message_delta"&&S.length){A.body.messages.push({role:"assistant",content:x}),A.body.messages.push({role:"user",content:S});let O=await fetch(`http://127.0.0.1:${t.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.APIKEY,"content-type":"application/json"},body:JSON.stringify(A.body)});if(!O.ok)return;let T=O.body.pipeThrough(new BE).getReader();for(;;)try{let{value:N,done:$}=await T.read();if($)break;let J=N;if(["message_start","message_stop"].includes(J.event))continue;if(!R.desiredSize)break;R.enqueue(J)}catch(N){if(N.name==="AbortError"||N.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw N}return}return k}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw O}}).pipeThrough(new GH))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new BE).getReader();try{for(;;){let{done:w,value:v}=await D.read();if(w)break;let b=v.event,I=v.data;if(I?.usage){let B=Yc.get(m)||{},S={...b==="message_start"?{}:B,...I.usage};(I.usage.cache_read_input_tokens||I.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:I.usage.cache_read_input_tokens,cache_creation:I.usage.cache_creation_input_tokens}),Yc.put(m,S)}}}catch(w){w.name==="AbortError"||w.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",w)}finally{D.releaseLock()}})(C),g(null,E)}if(Yc.put(m,f.usage),typeof f=="object")return f.error?g(f.error,null):g(f,null)}if(typeof f=="object"&&f.error)return g(f.error,null);g(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(OB.emit("onSend",A,d,f),d.statusCode>=400&&A.pathname?.endsWith("/v1/messages"))try{typeof f=="string"?A.errorResponseBody=f:f&&typeof f=="object"&&(A.errorResponseBody=JSON.stringify(f))}catch{}return f}),h.addHook("onResponse",async(A,d)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=vE(A),g=Yc.get(f),m=vH(f),E=nq(),C,y,D=A.sseError,w=D&&(D.type||D.code||D.message),v=g?.output_tokens&&g.output_tokens>0,b=d.statusCode>=400||w&&!v;if(b){C=A.errorMessage||d.errorMessage||A.error?.message||A.error?.toString?.()||void 0,w&&(C=C||JSON.stringify(D),y=JSON.stringify(D)),y=y||A.errorResponseBody;let I=xE(A);E.recordFailure(A.provider||"",I,C)}else{let I=xE(A);E.recordSuccess(A.provider||"",I)}SB({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:f,provider:A.provider||"",originalModel:A.originalModel||A.body?.model||"",model:xE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:g?.input_tokens||A.tokenCount||0,outputTokens:b?0:g?.output_tokens||0,cacheReadInputTokens:g?.cache_read_input_tokens||0,cacheCreationInputTokens:g?.cache_creation_input_tokens||0,ttft:b?null:m.ttft,tokensPerSecond:b?null:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(NB.performance.now()-A.requestStartTime):0,status:b?"error":"success",errorMessage:C,responseBody:y})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{h.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,d)=>{h.app.log.error("Unhandled rejection at:",d,"reason:",A)}),h}async function sq(){let e=await j_();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===rD&&sq().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function V_(e){try{let{stdout:t}=await G_("npm view claude-code-router-next version"),r=t.trim();return{hasUpdate:aq(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function Y_(){try{let{stdout:e,stderr:t}=await G_("npm install -g claude-code-router-next@latest");return t&&console.error("Update stderr:",t),console.log("Update stdout:",e),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(e){return console.error("Error performing update:",e),{success:!1,message:`Failed to perform update: ${e instanceof Error?e.message:"Unknown error"}`}}}function aq(e,t){let r=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<Math.max(r.length,n.length);o++){let s=o<r.length?r[o]:0,i=o<n.length?n[o]:0;if(s>i)return 1;if(s<i)return-1}return 0}var H_,q_,G_,J_=h0(()=>{"use strict";H_=require("child_process"),q_=require("util"),G_=(0,q_.promisify)(H_.exec)});var _p,nD=h0(()=>{_p="2.1.23"});var oD=Fr(iD=>{"use strict";Object.defineProperty(iD,"__esModule",{value:!0});var z_=require("child_process"),lq=1024*1024,W_={exec(e,t){let r={maxBuffer:2*lq,windowsHide:!0};(0,z_.exec)(e,r,t)},spawn(e,t,r){return(0,z_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
1247
+ Your response should consistently follow this rule whenever image-related analysis is requested.`});let r=e.body.messages.filter(o=>o.role==="user"&&Array.isArray(o.content)&&o.content.some(s=>s.type==="image"||Array.isArray(s.content)&&s.content.some(i=>i.type==="image"))),n=1;r.forEach(o=>{Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="image"?(_0.storeImage(`${e.id}_Image#${n}`,s.source),s.type="text",delete s.source,s.text=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++):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(i=>i.type==="image")&&(_0.storeImage(`${e.id}_Image#${n}`,s.content[0].source),s.content=`[Image #${n}]This is an image, if you need to view or analyze it, you need to extract the imageId`,n++)})})}},XH=new ZH,eq=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},U_=new eq;U_.registerAgent(XH);var IE=U_,tq=require("node:events"),NB=require("node:perf_hooks"),rq=vv(),nq=rq.getHealthStore,OB=new tq.EventEmitter;function vE(e){if(e.usageSessionId)return e.usageSessionId;try{let n=e.body?.metadata?.user_id;if(n&&typeof n=="string")try{let o=JSON.parse(n);if(o.session_id)return e.usageSessionId=o.session_id,e.usageSessionId}catch{let o=n.match(/_session_([a-f0-9-]+)/i);if(o)return e.usageSessionId=o[1],e.usageSessionId}}catch{}let t=e.headers?.["x-request-id"],r=Array.isArray(t)?t[0]:t;return e.usageSessionId=e.sessionId||(typeof r=="string"?r:void 0)||e.id||`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.usageSessionId}function xE(e){return e.body?.model?Array.isArray(e.body.model)?e.body.model.join(","):e.body.model:Array.isArray(e.model)?e.model.join(","):e.model||""}async function iq(){let e=(0,Uv.homedir)(),t=(0,jv.join)(e,".claude.json");if(!(0,gU.existsSync)(t)){let r={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,mU.writeFile)(t,JSON.stringify(r,null,2))}}async function oq(e,t){let r=t.plugins||t.Plugins||[];for(let n of r){let{name:o,enabled:s=!1,options:i={}}=n;switch(o){case"token-speed":WE.registerPlugin(Q_,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${o}`);break}}await WE.enablePlugins(e)}async function j_(e={}){await iq(),await Ry();let t=await $v(),r=t.Providers||t.providers||[],n=r&&r.length>0,o=t.HOST||"127.0.0.1";n?(o=t.HOST,t.APIKEY||(o="127.0.0.1")):(o="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let s=t.PORT||3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):s,a=A=>(A>9?"":"0")+A,u=(A,d)=>{let f;A?typeof A=="number"?f=new Date(A):f=A:f=new Date;let g=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${g}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:qH(u,{path:CE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,CE.listPresets)(),h=await FH({jsonPath:CE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:o,PORT:i,LOG_FILE:(0,jv.join)((0,Uv.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return h.recordUsage=A=>{try{SB({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:A.sessionId||"",provider:A.provider||"",originalModel:A.originalModel||"",model:A.model||"",modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.stream??!1,inputTokens:A.inputTokens||0,outputTokens:0,cacheReadInputTokens:A.cacheReadInputTokens||0,cacheCreationInputTokens:A.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:A.errorMessage,responseBody:void 0})}catch(d){console.error("Fallback usage tracking error:",d)}},await Promise.allSettled(c.map(async A=>await h.registerNamespace(`/preset/${A.name}`,A.config))),await oq(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=NB.performance.now())}),h.addHook("preHandler",async(A,d)=>{if(new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")){let f=vE(A);Yc.put(f,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0})}}),h.addHook("preHandler",async(A,d)=>new Promise((f,g)=>{let m=E=>{E?g(E):f()};kH(t)(A,d,m).catch(g)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let g of IE.getAllAgents())g.shouldHandle(A,t)&&(f.push(g.name),g.reqHandler(A,t),g.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(g.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",OB.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,g)=>{if(A.pathname?.endsWith("/v1/messages")){let m=vE(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new BE),w,v=-1,b="",I="",B="",S=[],x=[];return g(null,VH(D,async(k,R)=>{try{if(k.event==="content_block_start"&&k?.data?.content_block?.name){let O=A.agents.find(T=>IE.getAgent(T)?.tools.get(k.data.content_block.name));if(O){w=IE.getAgent(O),v=k.data.index,b=k.data.content_block.name,B=k.data.content_block.id;return}}if(v>-1&&k.data.index===v&&k.data?.delta?.type==="input_json_delta"){I+=k.data?.delta?.partial_json;return}if(v>-1&&k.data.index===v&&k.data.type==="content_block_stop"){try{let O=YH.default.parse(I);x.push({type:"tool_use",id:B,name:b,input:O});let T=await w?.tools.get(b)?.handler(O,{req:A,config:t});S.push({tool_use_id:B,type:"tool_result",content:T}),w=void 0,v=-1,b="",I="",B=""}catch(O){console.log(O)}return}if(k.event==="message_delta"&&S.length){A.body.messages.push({role:"assistant",content:x}),A.body.messages.push({role:"user",content:S});let O=await fetch(`http://127.0.0.1:${t.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.APIKEY,"content-type":"application/json"},body:JSON.stringify(A.body)});if(!O.ok)return;let T=O.body.pipeThrough(new BE).getReader();for(;;)try{let{value:N,done:$}=await T.read();if($)break;let J=N;if(["message_start","message_stop"].includes(J.event))continue;if(!R.desiredSize)break;R.enqueue(J)}catch(N){if(N.name==="AbortError"||N.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw N}return}return k}catch(O){if(console.error("Unexpected error in stream processing:",O),O.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw O}}).pipeThrough(new GH))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new BE).getReader();try{for(;;){let{done:w,value:v}=await D.read();if(w)break;let b=v.event,I=v.data;if(I?.usage){let B=Yc.get(m)||{},S={...b==="message_start"?{}:B,...I.usage};(I.usage.cache_read_input_tokens||I.usage.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:I.usage.cache_read_input_tokens,cache_creation:I.usage.cache_creation_input_tokens}),Yc.put(m,S)}}}catch(w){w.name==="AbortError"||w.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",w)}finally{D.releaseLock()}})(C),g(null,E)}if(Yc.put(m,f.usage),typeof f=="object")return f.error?g(f.error,null):g(f,null)}if(typeof f=="object"&&f.error)return g(f.error,null);g(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(OB.emit("onSend",A,d,f),d.statusCode>=400&&A.pathname?.endsWith("/v1/messages"))try{typeof f=="string"?A.errorResponseBody=f:f&&typeof f=="object"&&(A.errorResponseBody=JSON.stringify(f))}catch{}return f}),h.addHook("onResponse",async(A,d)=>{if(A.pathname?.endsWith("/v1/messages"))try{let f=vE(A),g=Yc.get(f),m=vH(f),E=nq(),C,y,D=A.sseError,w=D&&(D.type||D.code||D.message),v=g?.output_tokens&&g.output_tokens>0,b=d.statusCode>=400||w&&!v;if(b){C=A.errorMessage||d.errorMessage||A.error?.message||A.error?.toString?.()||void 0,w&&(C=C||JSON.stringify(D),y=JSON.stringify(D)),y=y||A.errorResponseBody;let I=xE(A);E.recordFailure(A.provider||"",I,C)}else{let I=xE(A);E.recordSuccess(A.provider||"",I)}SB({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:f,provider:A.provider||"",originalModel:A.originalModel||A.body?.model||"",model:xE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:g?.input_tokens||A.tokenCount||0,outputTokens:b?0:g?.output_tokens||0,cacheReadInputTokens:g?.cache_read_input_tokens||0,cacheCreationInputTokens:g?.cache_creation_input_tokens||0,ttft:b?null:m.ttft,tokensPerSecond:b?null:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(NB.performance.now()-A.requestStartTime):0,status:b?"error":"success",errorMessage:C,responseBody:y})}catch(f){console.error("Usage tracking error:",f)}}),process.on("uncaughtException",A=>{h.app.log.error("Uncaught exception:",A)}),process.on("unhandledRejection",(A,d)=>{h.app.log.error("Unhandled rejection at:",d,"reason:",A)}),h}async function sq(){let e=await j_();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===rD&&sq().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function V_(e){try{let{stdout:t}=await G_("npm view claude-code-router-next version"),r=t.trim();return{hasUpdate:aq(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function Y_(){try{let{stdout:e,stderr:t}=await G_("npm install -g claude-code-router-next@latest");return t&&console.error("Update stderr:",t),console.log("Update stdout:",e),{success:!0,message:"Update completed successfully. Please restart the application to apply changes."}}catch(e){return console.error("Error performing update:",e),{success:!1,message:`Failed to perform update: ${e instanceof Error?e.message:"Unknown error"}`}}}function aq(e,t){let r=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<Math.max(r.length,n.length);o++){let s=o<r.length?r[o]:0,i=o<n.length?n[o]:0;if(s>i)return 1;if(s<i)return-1}return 0}var H_,q_,G_,J_=h0(()=>{"use strict";H_=require("child_process"),q_=require("util"),G_=(0,q_.promisify)(H_.exec)});var _p,nD=h0(()=>{_p="2.1.24"});var oD=Fr(iD=>{"use strict";Object.defineProperty(iD,"__esModule",{value:!0});var z_=require("child_process"),lq=1024*1024,W_={exec(e,t){let r={maxBuffer:2*lq,windowsHide:!0};(0,z_.exec)(e,r,t)},spawn(e,t,r){return(0,z_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
1248
1248
  `,r);n>=0&&(r=n+1)}return r>0?e.substring(r):e},split(e,t){let r=e.trim().split(/\s+/);return r.length>t&&(r[t-1]=r.slice(t-1).join(" ")),r},extractColumns(e,t,r){let n=e.split(/(\r\n|\n|\r)/),o=[];return r||(r=Math.max.apply(null,t)+1),n.forEach(s=>{let i=W_.split(s,r),a=[];t.forEach(u=>{a.push(i[u]||"")}),o.push(a)}),o},parseTable(e){let t=e.split(/(\r\n\r\n|\r\n\n|\n\r\n|\n\n)/).filter(r=>r&&r.trim().length>0).map(r=>r.split(/(\r\n|\n|\r)/).filter(n=>n.trim().length>0));return t.forEach(r=>{for(let n=0;r[n];){let o=r[n];o.startsWith(" ")?(r[n-1]+=o.trimLeft(),r.splice(n,1)):n+=1}}),t.map(r=>{let n={};return r.forEach(o=>{let s=o.indexOf(":"),i=o.slice(0,s).trim();n[i]=o.slice(s+1).trim()}),n})}};iD.default=W_});var Z_=Fr((K_,Sp)=>{(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof Sp=="object"&&Sp.exports?Sp.exports=t():e.log=t()})(K_,function(){"use strict";var e=function(){},t="undefined",r=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"],o={},s=null;function i(f,g){var m=f[g];if(typeof m.bind=="function")return m.bind(f);try{return Function.prototype.bind.call(m,f)}catch{return function(){return Function.prototype.apply.apply(m,[f,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function u(f){return f==="debug"&&(f="log"),typeof console===t?!1:f==="trace"&&r?a:console[f]!==void 0?i(console,f):console.log!==void 0?i(console,"log"):e}function l(){for(var f=this.getLevel(),g=0;g<n.length;g++){var m=n[g];this[m]=g<f?e:this.methodFactory(m,f,this.name)}if(this.log=this.debug,typeof console===t&&f<this.levels.SILENT)return"No console available for logging"}function c(f){return function(){typeof console!==t&&(l.call(this),this[f].apply(this,arguments))}}function h(f,g,m){return u(f)||c.apply(this,arguments)}function A(f,g){var m=this,E,C,y,D="loglevel";typeof f=="string"?D+=":"+f:typeof f=="symbol"&&(D=void 0);function w(S){var x=(n[S]||"silent").toUpperCase();if(!(typeof window===t||!D)){try{window.localStorage[D]=x;return}catch{}try{window.document.cookie=encodeURIComponent(D)+"="+x+";"}catch{}}}function v(){var S;if(!(typeof window===t||!D)){try{S=window.localStorage[D]}catch{}if(typeof S===t)try{var x=window.document.cookie,k=encodeURIComponent(D),R=x.indexOf(k+"=");R!==-1&&(S=/^([^;]+)/.exec(x.slice(R+k.length+1))[1])}catch{}return m.levels[S]===void 0&&(S=void 0),S}}function b(){if(!(typeof window===t||!D)){try{window.localStorage.removeItem(D)}catch{}try{window.document.cookie=encodeURIComponent(D)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function I(S){var x=S;if(typeof x=="string"&&m.levels[x.toUpperCase()]!==void 0&&(x=m.levels[x.toUpperCase()]),typeof x=="number"&&x>=0&&x<=m.levels.SILENT)return x;throw new TypeError("log.setLevel() called with invalid level: "+S)}m.name=f,m.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},m.methodFactory=g||h,m.getLevel=function(){return y??C??E},m.setLevel=function(S,x){return y=I(S),x!==!1&&w(y),l.call(m)},m.setDefaultLevel=function(S){C=I(S),v()||m.setLevel(S,!1)},m.resetLevel=function(){y=null,b(),l.call(m)},m.enableAll=function(S){m.setLevel(m.levels.TRACE,S)},m.disableAll=function(S){m.setLevel(m.levels.SILENT,S)},m.rebuild=function(){if(s!==m&&(E=I(s.getLevel())),l.call(m),s===m)for(var S in o)o[S].rebuild()},E=I(s?s.getLevel():"WARN");var B=v();B!=null&&(y=I(B)),l.call(m)}s=new A,s.getLogger=function(g){if(typeof g!="symbol"&&typeof g!="string"||g==="")throw new TypeError("You must supply a name when creating a logger.");var m=o[g];return m||(m=o[g]=new A(g,s.methodFactory)),m};var d=typeof window!==t?window.log:void 0;return s.noConflict=function(){return typeof window!==t&&window.log===s&&(window.log=d),s},s.getLoggers=function(){return o},s.default=s,s})});var sD=Fr(lA=>{"use strict";var cq=lA&&lA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(lA,"__esModule",{value:!0});var hq=cq(Z_());lA.default=hq.default});var tS=Fr(Js=>{"use strict";var dq=Js&&Js.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),Aq=Js&&Js.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),X_=Js&&Js.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var n=[];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(n[n.length]=o);return n},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var n=e(t),o=0;o<n.length;o++)n[o]!=="default"&&dq(r,t,n[o]);return Aq(r,t),r}})(),eS=Js&&Js.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Js,"__esModule",{value:!0});var fq=X_(require("os")),Fp=X_(require("fs")),Jo=eS(oD()),pq=eS(sD()),gq=e=>new Promise((t,r)=>{Fp.existsSync(e)?t():Fp.mkdir(e,n=>{n?r(n):t()})}),lh={darwin(e){return new Promise((t,r)=>{Jo.default.exec("netstat -anv -p TCP && netstat -anv -p UDP",function(n,o,s){if(n)r(n);else{let i=s.toString().trim();if(i){r(new Error(i));return}let a=Jo.default.stripLine(o.toString(),1),u=a.slice(0,a.indexOf(`
1249
1249
  `)),l=Jo.default.stripLine(a,1),c=u.indexOf("rxbytes")>=0?10:8,h=Jo.default.extractColumns(l,[0,3,c],10).filter(A=>!!String(A[0]).match(/^(udp|tcp)/)).find(A=>{let d=String(A[1]).match(/\.(\d+)$/);return!!(d&&d[1]===String(e))});h&&h[2].length?t(parseInt(h[2],10)):r(new Error(`pid of port (${e}) not found`))}})})},linux(e){return new Promise((t,r)=>{Jo.default.exec("netstat -tunlp",function(o,s,i){if(o)r(o);else{let a=i.toString().trim();a&&pq.default.warn(a);let u=Jo.default.stripLine(s.toString(),2),l=Jo.default.extractColumns(u,[3,6],7).find(c=>{let h=String(c[0]).match(/:(\d+)$/);return!!(h&&h[1]===String(e))});if(l&&l[1]){let c=l[1].split("/",1)[0];c.length?t(parseInt(c,10)):r(new Error(`pid of port (${e}) not found`))}else r(new Error(`pid of port (${e}) not found`))}})})},win32(e){return new Promise((t,r)=>{Jo.default.exec("netstat -ano",function(n,o,s){if(n)r(n);else{let i=s.toString().trim();if(i){r(new Error(i));return}let a=Jo.default.stripLine(o.toString(),4),u=Jo.default.extractColumns(a,[1,4],5).find(l=>{let c=String(l[0]).match(/:(\d+)$/);return!!(c&&c[1]===String(e))});u&&u[1].length&&parseInt(u[1],10)>0?t(parseInt(u[1],10)):r(new Error(`pid of port (${e}) not found`))}})})},android(e){return new Promise((t,r)=>{let n=fq.tmpdir()+"/.find-process",o=n+"/"+process.pid,s='netstat -tunp >> "'+o+'"';gq(n).then(()=>{Jo.default.exec(s,()=>{Fp.readFile(o,"utf8",(i,a)=>{if(Fp.unlink(o,()=>{}),i)r(i);else{a=Jo.default.stripLine(a,2);let u=Jo.default.extractColumns(a,[3,6],7).find(l=>{let c=String(l[0]).match(/:(\d+)$/);return!!(c&&c[1]===String(e))});if(u&&u[1]){let l=u[1].split("/",1)[0];l.length?t(parseInt(l,10)):r(new Error(`pid of port (${e}) not found`))}else r(new Error(`pid of port (${e}) not found`))}})})})})}};lh.freebsd=lh.darwin;lh.sunos=lh.darwin;function mq(e){let t=process.platform;return new Promise((r,n)=>{if(!(t in lh))return n(new Error(`platform ${t} is unsupported`));let o=lh[t];o(e).then(r,n)})}Js.default=mq});var iS=Fr(zs=>{"use strict";var Eq=zs&&zs.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),yq=zs&&zs.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),Dq=zs&&zs.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var n=[];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(n[n.length]=o);return n},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var n=e(t),o=0;o<n.length;o++)n[o]!=="default"&&Eq(r,t,n[o]);return yq(r,t),r}})(),Cq=zs&&zs.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(zs,"__esModule",{value:!0});var kp=Dq(require("path")),qu=Cq(oD());function aD(e,t){return t?e&&e.match?e.match(t)!==null:!1:!0}function rS(e){let t=e.split(kp.sep),r=t[t.length-1];r&&(t[t.length-1]=r.split(" ")[0]);let n=[];for(let o of t){let s=o.indexOf(" -");if(s>=0){n.push(o.substring(0,s).trim());break}else if(o.endsWith(" ")){n.push(o.trim());break}n.push(o)}return n.join(kp.sep)}function nS(e){if(process.platform==="darwin"){let t=e.indexOf(".app/");if(t>=0)return kp.basename(e.substring(0,t))}return kp.basename(e)}var Vl={darwin(e){return new Promise((t,r)=>{let n;"pid"in e&&e.pid!==void 0?n=`ps -p ${e.pid} -ww -o pid,ppid,uid,gid,args`:n="ps ax -ww -o pid,ppid,uid,gid,args",qu.default.exec(n,function(o,s,i){if(o)"pid"in e&&e.pid!==void 0?t([]):r(o);else{let a=i.toString().trim();if(a){r(new Error(a));return}let u=qu.default.stripLine(s.toString(),1),c=qu.default.extractColumns(u,[0,1,2,3,4],5).filter(h=>h[0]&&e.pid!==void 0?h[0]===String(e.pid):h[4]&&e.name?aD(h[4],e.name):!!h[0]).map(h=>{let A=String(h[4]),d=rS(A);return{pid:parseInt(h[0],10),ppid:parseInt(h[1],10),uid:parseInt(h[2],10),gid:parseInt(h[3],10),name:nS(d),bin:d,cmd:h[4]}});e.config.strict&&e.name&&(c=c.filter(h=>h.name===e.name)),t(c)}})})},win32(e){return new Promise((t,r)=>{let n="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-CimInstance -className win32_process | select Name,ProcessId,ParentProcessId,CommandLine,ExecutablePath",o=[],s=qu.default.spawn("powershell.exe",["/c",n],{detached:!1,windowsHide:!0});s.stdout.on("data",i=>{o.push(i.toString())}),s.on("error",i=>{r(new Error("Command '"+n+"' failed with reason: "+i.toString()))}),s.on("close",i=>{if(i!==0)return r(new Error("Command '"+n+"' terminated with code: "+i));let a=qu.default.parseTable(o.join("")).filter(u=>{if(e.pid!==void 0)return u.ProcessId===String(e.pid);if(e.name){let l=u.Name||"";return e.config.strict?l===e.name||l.endsWith(".exe")&&l.slice(0,-4)===e.name:aD(u.CommandLine||l,e.name)}else return!0}).map(u=>({pid:parseInt(u.ProcessId,10),ppid:parseInt(u.ParentProcessId,10),bin:u.ExecutablePath,name:u.Name||"",cmd:u.CommandLine}));t(a)})})},android(e){return new Promise((t,r)=>{qu.default.exec("ps",function(o,s,i){if(o)e.pid!==void 0?t([]):r(o);else{let a=i.toString().trim();if(a){r(new Error(a));return}let u=qu.default.stripLine(s.toString(),1),c=qu.default.extractColumns(u,[0,3],4).filter(h=>h[0]&&e.pid!==void 0?h[0]===String(e.pid):h[1]&&e.name?aD(h[1],e.name):!!h[0]).map(h=>{let A=String(h[1]),d=rS(A);return{pid:parseInt(h[0],10),ppid:0,name:nS(d),bin:d,cmd:h[1]}});e.config.strict&&e.name&&(c=c.filter(h=>h.name===e.name)),t(c)}})})}};Vl.linux=Vl.darwin;Vl.sunos=Vl.darwin;Vl.freebsd=Vl.darwin;function bq(e){let t=process.platform,r=Vl[t];return r?r(e):Promise.reject(new Error(`Platform "${t}" is not supported`))}zs.default=bq});var sS=Fr(cA=>{"use strict";var lD=cA&&cA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(cA,"__esModule",{value:!0});var wq=lD(tS()),oS=lD(iS()),Bq=lD(sD()),uD={port(e,t){return(0,wq.default)(e).then(r=>uD.pid(r,t),()=>[])},pid(e,t){return(0,oS.default)({pid:e,config:t})},name(e,t){return(0,oS.default)({name:e,config:t,skipSelf:!0})}};function Iq(e,t,r){let n=Object.assign({logLevel:"warn",strict:typeof r=="boolean"?r:!1},typeof r=="object"?r:{});return n.logLevel&&Bq.default.setLevel(n.logLevel),new Promise((o,s)=>{if(!(e in uD))s(new Error(`do not support find by "${e}"`));else{let i=/^\d+$/.test(String(t));e==="pid"&&!i?s(new Error("pid must be a number")):e==="port"&&!i?s(new Error("port must be a number")):uD[e](t,n).then(o,s)}})}cA.default=Iq});var uS=Fr(aS=>{"use strict";Object.defineProperty(aS,"__esModule",{value:!0})});var lS=Fr(Ws=>{"use strict";var vq=Ws&&Ws.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),xq=Ws&&Ws.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&vq(t,e,r)},_q=Ws&&Ws.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ws,"__esModule",{value:!0});Ws.default=void 0;var Sq=sS();Object.defineProperty(Ws,"default",{enumerable:!0,get:function(){return _q(Sq).default}});xq(uS(),Ws)});function hS(){let e=0;(0,po.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,po.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e++,(0,po.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function cD(){let e=0;(0,po.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,po.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e=Math.max(0,e-1),(0,po.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function dS(){return(0,po.existsSync)(Vi.REFERENCE_COUNT_FILE)&&parseInt((0,po.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0}function Yl(){if(!(0,po.existsSync)(Vi.PID_FILE))return!1;let e;try{let t=(0,po.readFileSync)(Vi.PID_FILE,"utf-8");if(e=parseInt(t,10),isNaN(e))return eu(),!1}catch{return!1}try{if(process.platform==="win32"){let t=`tasklist /FI "PID eq ${e}"`;return(0,cS.execSync)(t,{stdio:"pipe"}).toString().includes(e.toString())?!0:(eu(),!1)}else return process.kill(e,0),!0}catch{return eu(),!1}}function eu(){if((0,po.existsSync)(Vi.PID_FILE))try{require("fs").unlinkSync(Vi.PID_FILE)}catch{}}function AS(){if(!(0,po.existsSync)(Vi.PID_FILE))return null;try{let e=parseInt((0,po.readFileSync)(Vi.PID_FILE,"utf-8"));return isNaN(e)?null:e}catch{return null}}async function Tp(){let e=AS(),t=await Yl(),n=(await vo()).PORT||3456;return{running:t,pid:e,port:n,endpoint:`http://127.0.0.1:${n}`,pidFile:Vi.PID_FILE,referenceCount:dS()}}async function fS(){if(dS()===0){let t=AS();if(t&&await Yl())try{process.kill(t,"SIGTERM")}catch{}}}var po,Vi,Fq,cS,hA=h0(()=>{"use strict";po=require("fs"),Vi=Zr(us());Gu();Fq=Zr(lS()),cS=require("child_process")});var bS={};O1(bS,{backupConfigFile:()=>DS,getSettingsPath:()=>pD,initConfig:()=>kq,initDir:()=>yS,readConfigFile:()=>vo,restartService:()=>fD,run:()=>AD,writeConfigFile:()=>CS});var Lo,pS,Vu,gS,mS,li,ES,ch,dD,hD,dA,yS,vo,DS,CS,kq,AD,fD,pD,Gu=h0(()=>{"use strict";Lo=Zr(require("node:fs/promises")),pS=Zr(g0()),Vu=Zr(require("node:path")),gS=require("node:crypto"),mS=Zr(require("node:os")),li=Zr(us()),ES=Zr($_()),ch=require("fs");J_();nD();dD=require("child_process");hA();hD=e=>{if(typeof e=="string")return e.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(t,r,n)=>{let o=r||n;return process.env[o]||t});if(Array.isArray(e))return e.map(hD);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=hD(n);return t}return e},dA=async e=>{try{await Lo.default.access(e)}catch{await Lo.default.mkdir(e,{recursive:!0})}},yS=async()=>{await dA(li.HOME_DIR),await dA(li.PLUGINS_DIR),await dA(li.PRESETS_DIR),await dA(Vu.default.join(li.HOME_DIR,"logs"))},vo=async()=>{try{let e=await Lo.default.readFile(li.CONFIG_FILE,"utf-8");try{let t=pS.default.parse(e);return hD(t)}catch(t){console.error(`Failed to parse config file at ${li.CONFIG_FILE}`),console.error("Error details:",t.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(e){if(e.code==="ENOENT")try{await yS();let t=await DS();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await CS(r),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),r}catch(t){console.error("Failed to create default configuration:",t.message),process.exit(1)}else console.error(`Failed to read config file at ${li.CONFIG_FILE}`),console.error("Error details:",e.message),process.exit(1)}},DS=async()=>{try{if(await Lo.default.access(li.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${li.CONFIG_FILE}.${e}.bak`;await Lo.default.copyFile(li.CONFIG_FILE,t);try{let r=Vu.default.dirname(li.CONFIG_FILE),n=Vu.default.basename(li.CONFIG_FILE),s=(await Lo.default.readdir(r)).filter(i=>i.startsWith(n)&&i.endsWith(".bak")).sort().reverse();if(s.length>3)for(let i=3;i<s.length;i++){let a=Vu.default.join(r,s[i]);await Lo.default.unlink(a)}}catch(r){console.warn("Failed to clean up old backups:",r)}return t}}catch(e){console.error("Failed to backup config file:",e)}return null},CS=async e=>{await dA(li.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await Lo.default.writeFile(li.CONFIG_FILE,t)},kq=async()=>{let e=await vo();return Object.assign(process.env,e),e},AD=async(e=[])=>{if(Yl()){console.log("claude-code-router server is running");return}let r=await(0,ES.getServer)(),n=r.app;(0,ch.writeFileSync)(li.PID_FILE,process.pid.toString()),n.post("/api/update/perform",async()=>await Y_()),n.get("/api/update/check",async()=>await V_(_p)),n.post("/api/restart",async()=>(setTimeout(async()=>{(0,dD.spawn)("ccr",["restart"],{detached:!0,stdio:"ignore"}).unref()},100),{success:!0,message:"Service restart initiated"})),await r.start()},fD=async()=>{try{let r=parseInt((0,ch.readFileSync)(li.PID_FILE,"utf-8"));if(process.kill(r),eu(),(0,ch.existsSync)(li.REFERENCE_COUNT_FILE))try{await Lo.default.unlink(li.REFERENCE_COUNT_FILE)}catch{}console.log("claude code router service has been stopped.")}catch{console.log("Service was not running or failed to stop."),eu()}console.log("Starting claude code router service...");let e=Vu.default.join(__dirname,"cli.js"),t=(0,dD.spawn)("node",[e,"start"],{detached:!0,stdio:"ignore"});t.on("error",r=>{throw console.error("Failed to start service:",r),r}),t.unref(),console.log("\u2705 Service started successfully in the background.")},pD=async e=>{let t=(0,gS.createHash)("sha256").update(e,"utf-8").digest("hex"),r=Vu.default.join(mS.default.tmpdir(),"claude-code-router"),n=`ccr-settings-${t}.json`,o=Vu.default.join(r,n);try{await Lo.default.access(r)}catch{await Lo.default.mkdir(r,{recursive:!0})}try{return await Lo.default.access(o),o}catch{return await Lo.default.writeFile(o,e,"utf-8"),o}}});var fA=Fr((Xre,SS)=>{var Qq=require("node:tty"),Nq=Qq?.WriteStream?.prototype?.hasColors?.()??!1,Cn=(e,t)=>{if(!Nq)return o=>o;let r=`\x1B[${e}m`,n=`\x1B[${t}m`;return o=>{let s=o+"",i=s.indexOf(n);if(i===-1)return r+s+n;let a=r,u=0,c=(t===22?n:"")+r;for(;i!==-1;)a+=s.slice(u,i)+c,u=i+n.length,i=s.indexOf(n,u);return a+=s.slice(u)+n,a}},mn={};mn.reset=Cn(0,0);mn.bold=Cn(1,22);mn.dim=Cn(2,22);mn.italic=Cn(3,23);mn.underline=Cn(4,24);mn.overline=Cn(53,55);mn.inverse=Cn(7,27);mn.hidden=Cn(8,28);mn.strikethrough=Cn(9,29);mn.black=Cn(30,39);mn.red=Cn(31,39);mn.green=Cn(32,39);mn.yellow=Cn(33,39);mn.blue=Cn(34,39);mn.magenta=Cn(35,39);mn.cyan=Cn(36,39);mn.white=Cn(37,39);mn.gray=Cn(90,39);mn.bgBlack=Cn(40,49);mn.bgRed=Cn(41,49);mn.bgGreen=Cn(42,49);mn.bgYellow=Cn(43,49);mn.bgBlue=Cn(44,49);mn.bgMagenta=Cn(45,49);mn.bgCyan=Cn(46,49);mn.bgWhite=Cn(47,49);mn.bgGray=Cn(100,49);mn.redBright=Cn(91,39);mn.greenBright=Cn(92,39);mn.yellowBright=Cn(93,39);mn.blueBright=Cn(94,39);mn.magentaBright=Cn(95,39);mn.cyanBright=Cn(96,39);mn.whiteBright=Cn(97,39);mn.bgRedBright=Cn(101,49);mn.bgGreenBright=Cn(102,49);mn.bgYellowBright=Cn(103,49);mn.bgBlueBright=Cn(104,49);mn.bgMagentaBright=Cn(105,49);mn.bgCyanBright=Cn(106,49);mn.bgWhiteBright=Cn(107,49);SS.exports=mn});var OS=Fr((Ene,NS)=>{"use strict";NS.exports=Hq;function $q(e){let t={defaultWidth:0,output:process.stdout,tty:require("tty")};return e?(Object.keys(t).forEach(function(r){e[r]||(e[r]=t[r])}),e):t}function Hq(e){let t=$q(e);if(t.output.getWindowSize)return t.output.getWindowSize()[0]||t.defaultWidth;if(t.tty.getWindowSize)return t.tty.getWindowSize()[1]||t.defaultWidth;if(t.output.columns)return t.output.columns;if(process.env.CLI_WIDTH){let r=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(r)&&r!==0)return r}return t.defaultWidth}});var PS=Fr((yne,LS)=>{"use strict";LS.exports=({onlyFirst:e=!1}={})=>{let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}});var jp=Fr((Dne,MS)=>{"use strict";var qq=PS();MS.exports=e=>typeof e=="string"?e.replace(qq(),""):e});var jS=Fr((Cne,DD)=>{"use strict";var US=e=>Number.isNaN(e)?!1:e>=4352&&(e<=4447||e===9001||e===9002||11904<=e&&e<=12871&&e!==12351||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141);DD.exports=US;DD.exports.default=US});var HS=Fr((bne,$S)=>{"use strict";$S.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 GS=Fr((wne,CD)=>{"use strict";var Gq=jp(),Vq=jS(),Yq=HS(),qS=e=>{if(typeof e!="string"||e.length===0||(e=Gq(e),e.length===0))return 0;e=e.replace(Yq()," ");let t=0;for(let r=0;r<e.length;r++){let n=e.codePointAt(r);n<=31||n>=127&&n<=159||n>=768&&n<=879||(n>65535&&r++,t+=Vq(n)?2:1)}return t};CD.exports=qS;CD.exports.default=qS});var YS=Fr((Bne,VS)=>{"use strict";VS.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 bD=Fr((Ine,zS)=>{var pA=YS(),JS={};for(let e of Object.keys(pA))JS[pA[e]]=e;var Gr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};zS.exports=Gr;for(let e of Object.keys(Gr)){if(!("channels"in Gr[e]))throw new Error("missing channels property: "+e);if(!("labels"in Gr[e]))throw new Error("missing channel labels property: "+e);if(Gr[e].labels.length!==Gr[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:t,labels:r}=Gr[e];delete Gr[e].channels,delete Gr[e].labels,Object.defineProperty(Gr[e],"channels",{value:t}),Object.defineProperty(Gr[e],"labels",{value:r})}Gr.rgb.hsl=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,o=Math.min(t,r,n),s=Math.max(t,r,n),i=s-o,a,u;s===o?a=0:t===s?a=(r-n)/i:r===s?a=2+(n-t)/i:n===s&&(a=4+(t-r)/i),a=Math.min(a*60,360),a<0&&(a+=360);let l=(o+s)/2;return s===o?u=0:l<=.5?u=i/(s+o):u=i/(2-s-o),[a,u*100,l*100]};Gr.rgb.hsv=function(e){let t,r,n,o,s,i=e[0]/255,a=e[1]/255,u=e[2]/255,l=Math.max(i,a,u),c=l-Math.min(i,a,u),h=function(A){return(l-A)/6/c+1/2};return c===0?(o=0,s=0):(s=c/l,t=h(i),r=h(a),n=h(u),i===l?o=n-r:a===l?o=1/3+t-n:u===l&&(o=2/3+r-t),o<0?o+=1:o>1&&(o-=1)),[o*360,s*100,l*100]};Gr.rgb.hwb=function(e){let t=e[0],r=e[1],n=e[2],o=Gr.rgb.hsl(e)[0],s=1/255*Math.min(t,Math.min(r,n));return n=1-1/255*Math.max(t,Math.max(r,n)),[o,s*100,n*100]};Gr.rgb.cmyk=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,o=Math.min(1-t,1-r,1-n),s=(1-t-o)/(1-o)||0,i=(1-r-o)/(1-o)||0,a=(1-n-o)/(1-o)||0;return[s*100,i*100,a*100,o*100]};function Jq(e,t){return(e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2}Gr.rgb.keyword=function(e){let t=JS[e];if(t)return t;let r=1/0,n;for(let o of Object.keys(pA)){let s=pA[o],i=Jq(e,s);i<r&&(r=i,n=o)}return n};Gr.keyword.rgb=function(e){return pA[e]};Gr.rgb.xyz=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255;t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;let o=t*.4124+r*.3576+n*.1805,s=t*.2126+r*.7152+n*.0722,i=t*.0193+r*.1192+n*.9505;return[o*100,s*100,i*100]};Gr.rgb.lab=function(e){let t=Gr.rgb.xyz(e),r=t[0],n=t[1],o=t[2];r/=95.047,n/=100,o/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let s=116*n-16,i=500*(r-n),a=200*(n-o);return[s,i,a]};Gr.hsl.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,o,s,i;if(r===0)return i=n*255,[i,i,i];n<.5?o=n*(1+r):o=n+r-n*r;let a=2*n-o,u=[0,0,0];for(let l=0;l<3;l++)s=t+1/3*-(l-1),s<0&&s++,s>1&&s--,6*s<1?i=a+(o-a)*6*s:2*s<1?i=o:3*s<2?i=a+(o-a)*(2/3-s)*6:i=a,u[l]=i*255;return u};Gr.hsl.hsv=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,o=r,s=Math.max(n,.01);n*=2,r*=n<=1?n:2-n,o*=s<=1?s:2-s;let i=(n+r)/2,a=n===0?2*o/(s+o):2*r/(n+r);return[t,a*100,i*100]};Gr.hsv.rgb=function(e){let t=e[0]/60,r=e[1]/100,n=e[2]/100,o=Math.floor(t)%6,s=t-Math.floor(t),i=255*n*(1-r),a=255*n*(1-r*s),u=255*n*(1-r*(1-s));switch(n*=255,o){case 0:return[n,u,i];case 1:return[a,n,i];case 2:return[i,n,u];case 3:return[i,a,n];case 4:return[u,i,n];case 5:return[n,i,a]}};Gr.hsv.hsl=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,o=Math.max(n,.01),s,i;i=(2-r)*n;let a=(2-r)*o;return s=r*o,s/=a<=1?a:2-a,s=s||0,i/=2,[t,s*100,i*100]};Gr.hwb.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,o=r+n,s;o>1&&(r/=o,n/=o);let i=Math.floor(6*t),a=1-n;s=6*t-i,(i&1)!==0&&(s=1-s);let u=r+s*(a-r),l,c,h;switch(i){default:case 6:case 0:l=a,c=u,h=r;break;case 1:l=u,c=a,h=r;break;case 2:l=r,c=a,h=u;break;case 3:l=r,c=u,h=a;break;case 4:l=u,c=r,h=a;break;case 5:l=a,c=r,h=u;break}return[l*255,c*255,h*255]};Gr.cmyk.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,o=e[3]/100,s=1-Math.min(1,t*(1-o)+o),i=1-Math.min(1,r*(1-o)+o),a=1-Math.min(1,n*(1-o)+o);return[s*255,i*255,a*255]};Gr.xyz.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,o,s,i;return o=t*3.2406+r*-1.5372+n*-.4986,s=t*-.9689+r*1.8758+n*.0415,i=t*.0557+r*-.204+n*1.057,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,o=Math.min(Math.max(0,o),1),s=Math.min(Math.max(0,s),1),i=Math.min(Math.max(0,i),1),[o*255,s*255,i*255]};Gr.xyz.lab=function(e){let t=e[0],r=e[1],n=e[2];t/=95.047,r/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let o=116*r-16,s=500*(t-r),i=200*(r-n);return[o,s,i]};Gr.lab.xyz=function(e){let t=e[0],r=e[1],n=e[2],o,s,i;s=(t+16)/116,o=r/500+s,i=s-n/200;let a=s**3,u=o**3,l=i**3;return s=a>.008856?a:(s-16/116)/7.787,o=u>.008856?u:(o-16/116)/7.787,i=l>.008856?l:(i-16/116)/7.787,o*=95.047,s*=100,i*=108.883,[o,s,i]};Gr.lab.lch=function(e){let t=e[0],r=e[1],n=e[2],o;o=Math.atan2(n,r)*360/2/Math.PI,o<0&&(o+=360);let i=Math.sqrt(r*r+n*n);return[t,i,o]};Gr.lch.lab=function(e){let t=e[0],r=e[1],o=e[2]/360*2*Math.PI,s=r*Math.cos(o),i=r*Math.sin(o);return[t,s,i]};Gr.rgb.ansi16=function(e,t=null){let[r,n,o]=e,s=t===null?Gr.rgb.hsv(e)[2]:t;if(s=Math.round(s/50),s===0)return 30;let i=30+(Math.round(o/255)<<2|Math.round(n/255)<<1|Math.round(r/255));return s===2&&(i+=60),i};Gr.hsv.ansi16=function(e){return Gr.rgb.ansi16(Gr.hsv.rgb(e),e[2])};Gr.rgb.ansi256=function(e){let t=e[0],r=e[1],n=e[2];return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)};Gr.ansi16.rgb=function(e){let t=e%10;if(t===0||t===7)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];let r=(~~(e>50)+1)*.5,n=(t&1)*r*255,o=(t>>1&1)*r*255,s=(t>>2&1)*r*255;return[n,o,s]};Gr.ansi256.rgb=function(e){if(e>=232){let s=(e-232)*10+8;return[s,s,s]}e-=16;let t,r=Math.floor(e/36)/5*255,n=Math.floor((t=e%36)/6)/5*255,o=t%6/5*255;return[r,n,o]};Gr.rgb.hex=function(e){let r=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Gr.hex.rgb=function(e){let t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];t[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let n=parseInt(r,16),o=n>>16&255,s=n>>8&255,i=n&255;return[o,s,i]};Gr.rgb.hcg=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,o=Math.max(Math.max(t,r),n),s=Math.min(Math.min(t,r),n),i=o-s,a,u;return i<1?a=s/(1-i):a=0,i<=0?u=0:o===t?u=(r-n)/i%6:o===r?u=2+(n-t)/i:u=4+(t-r)/i,u/=6,u%=1,[u*360,i*100,a*100]};Gr.hsl.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=r<.5?2*t*r:2*t*(1-r),o=0;return n<1&&(o=(r-.5*n)/(1-n)),[e[0],n*100,o*100]};Gr.hsv.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=t*r,o=0;return n<1&&(o=(r-n)/(1-n)),[e[0],n*100,o*100]};Gr.hcg.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100;if(r===0)return[n*255,n*255,n*255];let o=[0,0,0],s=t%1*6,i=s%1,a=1-i,u=0;switch(Math.floor(s)){case 0:o[0]=1,o[1]=i,o[2]=0;break;case 1:o[0]=a,o[1]=1,o[2]=0;break;case 2:o[0]=0,o[1]=1,o[2]=i;break;case 3:o[0]=0,o[1]=a,o[2]=1;break;case 4:o[0]=i,o[1]=0,o[2]=1;break;default:o[0]=1,o[1]=0,o[2]=a}return u=(1-r)*n,[(r*o[0]+u)*255,(r*o[1]+u)*255,(r*o[2]+u)*255]};Gr.hcg.hsv=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t),o=0;return n>0&&(o=t/n),[e[0],o*100,n*100]};Gr.hcg.hsl=function(e){let t=e[1]/100,n=e[2]/100*(1-t)+.5*t,o=0;return n>0&&n<.5?o=t/(2*n):n>=.5&&n<1&&(o=t/(2*(1-n))),[e[0],o*100,n*100]};Gr.hcg.hwb=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t);return[e[0],(n-t)*100,(1-n)*100]};Gr.hwb.hcg=function(e){let t=e[1]/100,n=1-e[2]/100,o=n-t,s=0;return o<1&&(s=(n-o)/(1-o)),[e[0],o*100,s*100]};Gr.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};Gr.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};Gr.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};Gr.gray.hsl=function(e){return[0,0,e[0]]};Gr.gray.hsv=Gr.gray.hsl;Gr.gray.hwb=function(e){return[0,100,e[0]]};Gr.gray.cmyk=function(e){return[0,0,0,e[0]]};Gr.gray.lab=function(e){return[e[0],0,0]};Gr.gray.hex=function(e){let t=Math.round(e[0]/100*255)&255,n=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(n.length)+n};Gr.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var KS=Fr((vne,WS)=>{var $p=bD();function zq(){let e={},t=Object.keys($p);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function Wq(e){let t=zq(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),o=Object.keys($p[n]);for(let s=o.length,i=0;i<s;i++){let a=o[i],u=t[a];u.distance===-1&&(u.distance=t[n].distance+1,u.parent=n,r.unshift(a))}}return t}function Kq(e,t){return function(r){return t(e(r))}}function Zq(e,t){let r=[t[e].parent,e],n=$p[t[e].parent][e],o=t[e].parent;for(;t[o].parent;)r.unshift(t[o].parent),n=Kq($p[t[o].parent][o],n),o=t[o].parent;return n.conversion=r,n}WS.exports=function(e){let t=Wq(e),r={},n=Object.keys(t);for(let o=n.length,s=0;s<o;s++){let i=n[s];t[i].parent!==null&&(r[i]=Zq(i,t))}return r}});var XS=Fr((xne,ZS)=>{var wD=bD(),Xq=KS(),Ah={},eG=Object.keys(wD);function tG(e){let t=function(...r){let n=r[0];return n==null?n:(n.length>1&&(r=n),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}function rG(e){let t=function(...r){let n=r[0];if(n==null)return n;n.length>1&&(r=n);let o=e(r);if(typeof o=="object")for(let s=o.length,i=0;i<s;i++)o[i]=Math.round(o[i]);return o};return"conversion"in e&&(t.conversion=e.conversion),t}eG.forEach(e=>{Ah[e]={},Object.defineProperty(Ah[e],"channels",{value:wD[e].channels}),Object.defineProperty(Ah[e],"labels",{value:wD[e].labels});let t=Xq(e);Object.keys(t).forEach(n=>{let o=t[n];Ah[e][n]=rG(o),Ah[e][n].raw=tG(o)})});ZS.exports=Ah});var oF=Fr((_ne,iF)=>{"use strict";var eF=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,tF=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},rF=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},Hp=e=>e,nF=(e,t,r)=>[e,t,r],fh=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{let n=r();return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0}),n},enumerable:!0,configurable:!0})},BD,ph=(e,t,r,n)=>{BD===void 0&&(BD=XS());let o=n?10:0,s={};for(let[i,a]of Object.entries(BD)){let u=i==="ansi16"?"ansi":i;i===t?s[u]=e(r,o):typeof a=="object"&&(s[u]=e(a[t],o))}return s};function nG(){let e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(let[r,n]of Object.entries(t)){for(let[o,s]of Object.entries(n))t[o]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[o]=t[o],e.set(s[0],s[1]);Object.defineProperty(t,r,{value:n,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="\x1B[39m",t.bgColor.close="\x1B[49m",fh(t.color,"ansi",()=>ph(eF,"ansi16",Hp,!1)),fh(t.color,"ansi256",()=>ph(tF,"ansi256",Hp,!1)),fh(t.color,"ansi16m",()=>ph(rF,"rgb",nF,!1)),fh(t.bgColor,"ansi",()=>ph(eF,"ansi16",Hp,!0)),fh(t.bgColor,"ansi256",()=>ph(tF,"ansi256",Hp,!0)),fh(t.bgColor,"ansi16m",()=>ph(rF,"rgb",nF,!0)),t}Object.defineProperty(iF,"exports",{enumerable:!0,get:nG})});var uF=Fr((Sne,aF)=>{"use strict";var gA=GS(),iG=jp(),oG=oF(),vD=new Set(["\x1B","\x9B"]),sG=39,sF=e=>`${vD.values().next().value}[${e}m`,aG=e=>e.split(" ").map(t=>gA(t)),ID=(e,t,r)=>{let n=[...t],o=!1,s=gA(iG(e[e.length-1]));for(let[i,a]of n.entries()){let u=gA(a);if(s+u<=r?e[e.length-1]+=a:(e.push(a),s=0),vD.has(a))o=!0;else if(o&&a==="m"){o=!1;continue}o||(s+=u,s===r&&i<n.length-1&&(e.push(""),s=0))}!s&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop())},uG=e=>{let t=e.split(" "),r=t.length;for(;r>0&&!(gA(t[r-1])>0);)r--;return r===t.length?e:t.slice(0,r).join(" ")+t.slice(r).join("")},lG=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let n="",o="",s,i=aG(e),a=[""];for(let[u,l]of e.split(" ").entries()){r.trim!==!1&&(a[a.length-1]=a[a.length-1].trimLeft());let c=gA(a[a.length-1]);if(u!==0&&(c>=t&&(r.wordWrap===!1||r.trim===!1)&&(a.push(""),c=0),(c>0||r.trim===!1)&&(a[a.length-1]+=" ",c++)),r.hard&&i[u]>t){let h=t-c,A=1+Math.floor((i[u]-h-1)/t);Math.floor((i[u]-1)/t)<A&&a.push(""),ID(a,l,t);continue}if(c+i[u]>t&&c>0&&i[u]>0){if(r.wordWrap===!1&&c<t){ID(a,l,t);continue}a.push("")}if(c+i[u]>t&&r.wordWrap===!1){ID(a,l,t);continue}a[a.length-1]+=l}r.trim!==!1&&(a=a.map(uG)),n=a.join(`
1250
1250
  `);for(let[u,l]of[...n].entries()){if(o+=l,vD.has(l)){let h=parseFloat(/\d[^m]*/.exec(n.slice(u,u+4)));s=h===sG?null:h}let c=oG.codes.get(Number(s));s&&c&&(n[u+1]===`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wengine-ai/claude-code-router-next",
3
- "version": "2.1.23",
3
+ "version": "2.1.24",
4
4
  "description": "CLI for Claude Code Router",
5
5
  "bin": {
6
6
  "ccr": "dist/cli.js"
@@ -14,7 +14,7 @@
14
14
  "author": "musistudio",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@wengine-ai/llms": "^2.1.10",
17
+ "@wengine-ai/llms": "^2.1.11",
18
18
  "lru-cache": "^11.2.2"
19
19
  },
20
20
  "devDependencies": {