@wengine-ai/claude-code-router-next 2.1.19 → 2.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +4 -4
- package/dist/index.html +3 -3
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -581,7 +581,7 @@ ${this.toMarkdown(N,_+1)}`:`${F}- ${N}`).join(`
|
|
|
581
581
|
${this.toMarkdown(q,_+1)}`:`${F}${N}: ${q}`).join(`
|
|
582
582
|
`):`${F}${g}`}async output(g,_={}){try{let F=this.formatData(g,_);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}}}}),of,Ta=u(()=>{"use strict";of=class{type="webhook";config;defaultTimeout=3e4;constructor(g){if(!g.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...g}}buildHeaders(){let g={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(g.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let _=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");g.Authorization=`Basic ${_}`}break;case"custom":this.config.auth.custom&&(g[this.config.auth.custom.header]=this.config.auth.custom.value);break}return g}buildBody(g,_){let{format:F="json",timestamp:N=!0,prefix:q,metadata:P}=_||{},V={data:g};return N&&(V.timestamp=new Date().toISOString()),q&&(V.prefix=q),P&&Object.keys(P).length>0&&(V.metadata=P),V}async sendRequest(g,_,F,N,q){let P=new AbortController,V=setTimeout(()=>P.abort(),q);try{let J=await fetch(g,{method:_,headers:F,body:JSON.stringify(N),signal:P.signal});if(clearTimeout(V),!J.ok)throw new Error(`HTTP ${J.status}: ${J.statusText}`);return J}catch(J){throw clearTimeout(V),J}}delay(g){return new Promise(_=>setTimeout(_,g))}async sendWithRetry(g,_,F,N,q,P){let V=null;for(let J=1;J<=P.maxAttempts;J++)try{return await this.sendRequest(g,_,F,N,q)}catch(oe){if(V=oe,J===P.maxAttempts)break;let Z=P.backoffMs*Math.pow(2,J-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${J}/${P.maxAttempts}), retrying in ${Z}ms...`,oe.message),await this.delay(Z)}throw V}async output(g,_={}){let F=_.timeout||this.defaultTimeout;try{let N=this.buildHeaders(),q=this.buildBody(g,_),P=await this.sendWithRetry(this.config.url,this.config.method,N,q,F,this.config.retry);return!0}catch(N){let q=N instanceof Error?N.message:String(N);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${q}`),!1;throw new Error(`Webhook output failed: ${q}`)}}}}),dl,Vh,Al,sf,af=u(()=>{"use strict";dl=require("fs"),Vh=require("path"),Al=require("os"),sf=class{type="temp-file";config;baseDir;constructor(g={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...g};let _=(0,Al.tmpdir)();this.baseDir=(0,Vh.join)(_,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,dl.existsSync)(this.baseDir)||(0,dl.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}extractSessionId(g){try{let _=g.match(/_session_([a-f0-9-]+)/i);return _?_[1]:null}catch{return null}}getFilePath(g){let _=this.config.prefix||"session",F=this.config.extension?`.${this.config.extension}`:"",N;if(this.config.includeTimestamp){let q=Date.now();N=`${_}-${g}-${q}${F}`}else N=`${_}-${g}${F}`;return(0,Vh.join)(this.baseDir,N)}async output(g,_={}){try{let F=_.metadata?.sessionId;if(!F)return!1;let N={...g,timestamp:Date.now(),sessionId:F},q=this.getFilePath(F);return(0,dl.writeFileSync)(q,JSON.stringify(N,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),uf,fl,Mg=u(()=>{"use strict";Dc(),Ta(),af(),uf=class{handlers=new Map;defaultOptions={};registerHandler(g,_){this.handlers.set(g,_)}registerHandlers(g){for(let _ of g)if(_.enabled!==!1)try{let F=this.createHandler(_),N=_.type+"_"+Date.now();this.registerHandler(N,F)}catch(F){console.error(`[OutputManager] Failed to register ${_.type} handler:`,F)}}createHandler(g){switch(g.type){case"console":return new So(g.config);case"webhook":return new of(g.config);case"temp-file":return new sf(g.config);default:throw new Error(`Unknown output handler type: ${g.type}`)}}unregisterHandler(g){return this.handlers.delete(g)}getHandler(g){return this.handlers.get(g)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(g){this.defaultOptions={...this.defaultOptions,...g}}getDefaultOptions(){return{...this.defaultOptions}}async output(g,_){let F={...this.defaultOptions,..._},N={success:[],failed:[]},q=Array.from(this.handlers.entries()).map(async([P,V])=>{try{await V.output(g,F)?N.success.push(P):N.failed.push(P)}catch(J){console.error(`[OutputManager] Handler ${P} failed:`,J),N.failed.push(P)}});return await Promise.all(q),N}async outputTo(g,_,F){let N={...this.defaultOptions,...F},q={success:[],failed:[]},P=g.map(async V=>{let J=this.handlers.get(V);if(!J){console.warn(`[OutputManager] Handler ${V} not found`),q.failed.push(V);return}try{await J.output(_,N)?q.success.push(V):q.failed.push(V)}catch(oe){console.error(`[OutputManager] Handler ${V} failed:`,oe),q.failed.push(V)}});return await Promise.all(P),q}async outputToType(g,_,F){let N=Array.from(this.handlers.entries()).filter(([q,P])=>P.type===g).map(([q])=>q);return this.outputTo(N,_,F)}},fl=new uf}),lf={};c(lf,{ActiveProbeService:()=>Fb,ConfigService:()=>Jh,ProviderHealthStore:()=>k,ProviderService:()=>Dl,SSEParserTransform:()=>Qb,SSESerializerTransform:()=>UN,TokenizerService:()=>im,TransformerService:()=>em,calculateTokenCount:()=>bb,default:()=>VN,getActiveProbeService:()=>kb,getAllQuotaResults:()=>cN,getAllRateLimitInfo:()=>td,getHealthStore:()=>S,getQuotaAdapter:()=>Sb,getQuotaResult:()=>Db,getRateLimitInfo:()=>ed,getRuntimeDebugLog:()=>oa,initQuotaStorePersistence:()=>dN,initRateLimitPersistence:()=>Ef,pluginManager:()=>PN,resetActiveProbeService:()=>ON,rewriteStream:()=>jN,router:()=>lm,searchProjectBySession:()=>_b,sessionUsageCache:()=>pb,setRuntimeDebugLog:()=>ia,startActiveProbe:()=>Tb,stopActiveProbe:()=>Rb,storeQuotaResult:()=>yb,tokenSpeedPlugin:()=>HN}),t.exports=d(lf);var Ug=A(QI(),1),jg=A(NI(),1),Yh=require("fs"),cf=require("path"),$g=OI(),Hg=A(C(),1),Jh=class{config={};options;constructor(g={jsonPath:"./config.json"}){this.options={envPath:g.envPath||".env",jsonPath:g.jsonPath,useEnvFile:!1,useJsonFile:g.useJsonFile!==!1,useEnvironmentVariables:g.useEnvironmentVariables!==!1,...g},this.loadConfig()}loadConfig(){this.options.useJsonFile&&this.options.jsonPath&&this.loadJsonConfig(),this.options.initialConfig&&(this.config={...this.config,...this.options.initialConfig}),this.options.useEnvFile&&this.loadEnvConfig(),this.config.LOG_FILE&&(process.env.LOG_FILE=this.config.LOG_FILE),this.config.LOG&&(process.env.LOG=this.config.LOG)}loadJsonConfig(){if(!this.options.jsonPath)return;let g=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,cf.join)(process.cwd(),this.options.jsonPath);if((0,Yh.existsSync)(g))try{let _=(0,Yh.readFileSync)(g,"utf-8"),F=Hg.default.parse(_);this.config={...this.config,...F},console.log(`Loaded JSON config from: ${g}`)}catch(_){console.warn(`Failed to load JSON config from ${g}:`,_)}else console.warn(`JSON config file not found: ${g}`)}loadEnvConfig(){let g=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,cf.join)(process.cwd(),this.options.envPath);if((0,Yh.existsSync)(g))try{let _=(0,$g.config)({path:g});_.parsed&&(this.config={...this.config,...this.parseEnvConfig(_.parsed)})}catch(_){console.warn(`Failed to load .env config from ${g}:`,_)}}loadEnvironmentVariables(){let g=this.parseEnvConfig(process.env);this.config={...this.config,...g}}parseEnvConfig(g){let _={};return Object.assign(_,g),_}isAbsolutePath(g){return g.startsWith("/")||g.includes(":")}get(g,_){let F=this.config[g];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(g){return this.config[g]!==void 0}set(g,_){this.config[g]=_}reload(){this.config={},this.loadConfig()}getConfigSummary(){let g=[];return this.options.initialConfig&&g.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&g.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&g.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&g.push("Environment Variables"),`Config sources: ${g.join(", ")}`}};function Xi(g,_=500,F="internal_error",N="api_error"){let q=new Error(g);return q.statusCode=_,q.code=F,q.type=N,q}async function qg(g,_,F){_.log.error(g);let N=g.statusCode||500;if(g.rawBody)try{let P=JSON.parse(g.rawBody);return F.code(N).send(P)}catch{return F.code(N).send(g.rawBody)}let q={error:{message:g.message+(g.stack||"Internal Server Error"),type:g.type||"api_error",code:g.code||"internal_error"}};return F.code(N).send(q)}var Gg=Qo();function Qi(g,_,F,N,q){let P=new Headers({"Content-Type":"application/json"});F.headers&&Object.entries(F.headers).forEach(([Z,ne])=>{ne&&P.set(Z,ne)});let V,J=AbortSignal.timeout(F.TIMEOUT??60*1e3*60);if(F.signal){let Z=new AbortController,ne=()=>Z.abort();F.signal.addEventListener("abort",ne),J.addEventListener("abort",ne),V=Z.signal}else V=J;let oe={method:"POST",headers:P,body:JSON.stringify(_),signal:V};return F.httpsProxy&&(oe.dispatcher=new Gg.ProxyAgent(new URL(F.httpsProxy).toString())),q?.debug({reqId:N.req.id,request:oe,headers:Object.fromEntries(P.entries()),requestUrl:typeof g=="string"?g:g.toString(),useProxy:F.httpsProxy},"final request"),fetch(typeof g=="string"?g:g.toString(),oe)}var pl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Ra={maxBodyLength:4096,maxStreamChunks:100},gl=!1;function ia(g){gl=g}function oa(){return gl}function fo(g){return gl||g.get("DEBUG_LOG")===!0}function ml(g){let _=g.get("DEBUG_LOG_OPTIONS");return!_||typeof _!="object"?Ra:{maxBodyLength:_.maxBodyLength??Ra.maxBodyLength,maxStreamChunks:_.maxStreamChunks??Ra.maxStreamChunks}}function zh(g){let _={};for(let[F,N]of Object.entries(g))pl.has(F.toLowerCase())?_[F]="***MASKED***":_[F]=N;return _}function xs(g,_){return g.length<=_?g:g.slice(0,_)+`...[truncated, total ${g.length} bytes]`}function hf(g,_,F){let N=typeof F.body=="string"?F.body:JSON.stringify(F.body);g.info({debug_log:!0,reqId:_,phase:"provider_request",url:F.url,headers:zh(F.headers),body:xs(N,Ra.maxBodyLength)})}function df(g,_,F){g.info({debug_log:!0,reqId:_,phase:"provider_response",status:F.status,headers:zh(F.headers),...F.body!==void 0?{body:xs(F.body,Ra.maxBodyLength)}:{}})}function El(g,_,F,N){g.info({debug_log:!0,reqId:_,phase:"provider_stream_chunk",chunkIndex:F,data:xs(N,Ra.maxBodyLength)})}function Wh(g,_,F){g.info({debug_log:!0,reqId:_,phase:"provider_stream_end",totalChunks:F})}function Af(g,_,F,N){(async()=>{let q=g.pipeThrough(new TextDecoderStream).getReader(),P=0;try{let V="";for(;;){let{done:J,value:oe}=await q.read();if(J)break;V+=oe;let Z=V.split(`
|
|
583
583
|
|
|
584
|
-
`);V=Z.pop()||"";for(let ne of Z)ne.trim()&&(P<N.maxStreamChunks?El(_,F,P,ne):P===N.maxStreamChunks&&_.info({debug_log:!0,reqId:F,phase:"provider_stream_chunk_omitted",message:`[chunks after #${P} omitted, maxStreamChunks=${N.maxStreamChunks}]`}),P++)}V.trim()&&(P<N.maxStreamChunks&&El(_,F,P,V.trim()),P++),Wh(_,F,P)}catch(V){console.error(`[debug_log] Error reading debug stream for reqId=${F}:`,V),Wh(_,F,P)}finally{q.releaseLock()}})()}var ff="2.1.5";O();var sa=require("fs"),Kh=require("path"),pf=Za(),Zh=(0,Kh.join)(pf.HOME_DIR,"runtime"),Xh=(0,Kh.join)(Zh,"rate-limit.json"),mu=new Map,gf=!1,Vg=null,Cc=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Yg=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],mf=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function bc(g,_,F){let N=J=>{if(F instanceof Headers)return F.get(J);let oe=Object.keys(F).find(Z=>Z.toLowerCase()===J);return oe?F[oe]:null},q=Eu(N,Cc),P=Eu(N,Yg),V=Eu(N,mf);(q||P||V)&&mu.set(g,{provider:g,remaining:_s(q),limit:_s(P),reset:wc(V),capturedAt:Date.now()})}function ed(g){return mu.get(g)}function td(){return Array.from(mu.values())}function Eu(g,_){for(let F of _){let N=g(F);if(N)return N}return null}function _s(g){if(!g)return null;let _=Number(g.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function wc(g){if(!g)return null;let _=g.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 N=Date.parse(_);if(Number.isFinite(N))return Math.floor(N/1e3);let q=Jg(_);return q===null?null:Math.floor((Date.now()+q)/1e3)}function Jg(g){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,F=0,N=!1;for(let q of g.matchAll(_)){N=!0;let P=Number(q[1]),V=q[2].toLowerCase();if(Number.isFinite(P))switch(V){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 N?F:null}function zg(){try{if(!(0,sa.existsSync)(Xh))return;let g=JSON.parse((0,sa.readFileSync)(Xh,"utf-8"));if(!Array.isArray(g))return;let _=Date.now();for(let F of g)if(F&&F.provider){if(F.capturedAt&&_-F.capturedAt>3600*1e3)continue;mu.set(F.provider,F)}}catch{}}function yl(){try{if(mu.size===0)return;(0,sa.existsSync)(Zh)||(0,sa.mkdirSync)(Zh,{recursive:!0}),(0,sa.writeFileSync)(Xh,JSON.stringify(Array.from(mu.values()),null,2),"utf-8")}catch{}}function Ef(){gf||(gf=!0,zg(),Vg=setInterval(yl,6e4),process.on("exit",yl))}B();async function Wg(g,_,F,N){let q=g.body,P=g.provider,V=F.providerService.getProvider(P);if(!V)throw Xi(`Provider '${P}' not found`,404,"provider_not_found");try{let{requestBody:J,config:oe,bypass:Z}=await Df(q,V,N,g.headers,{req:g}),ne=await Cf(J,oe,V,F,Z,N,{req:g});try{V?.baseUrl&&ne?.headers&&bc(P,V.baseUrl,ne.headers)}catch{}let le=await bf(J,ne,V,N,Z,{req:g}),Ae=wf(le,_,q,F);try{let te=q.model||g.originalModel;P&&te&&S().recordSuccess(P,te)}catch{}return Ae}catch(J){let oe=await yf(g,_,F,N,J);if(oe)return oe;throw J}}async function yf(g,_,F,N,q){let P=g.scenarioType||"default",V=g.familyFallback,J=g.modelFamily,oe=F.configService.get("fallback"),Z=S(),ne=g.provider||"",le=g.body.model||"",Ae=new Set;if(ne&&le&&(Z.recordFailure(ne,le,q?.message),Ae.add(`${ne},${le}`),F.recordUsage?.({provider:ne,model:le,originalModel:g.originalModel||le,scenarioType:P,modelFamily:g.modelFamily,errorMessage:q?.message||String(q),sessionId:g.usageSessionId||g.id,stream:g.body.stream,inputTokens:g.tokenCount||0})),!F.configService.get("Router")?.enableFallback)return g.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let te=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(J){let De=V?.[P];Array.isArray(De)&&De.length>0?he.push({name:`${J}/${P}`,models:De}):g.log.warn(`No ${J} fallback configured for ${P}; will try global ${P} fallback`)}if(Array.isArray(oe?.[P])&&oe[P].length>0&&he.push({name:`global/${P}`,models:oe[P]}),he.length===0)return null;let ye=he.reduce((De,Ce)=>De+Ce.models.length,0);g.log.warn(`Request failed for ${P}, trying ${ye} fallback models across ${he.length} fallback stage(s)`);for(let De of he){g.log.info(`Trying ${De.name} fallback stage with ${De.models.length} models`);for(let Ce of De.models){let xe=te(Ce);if(!xe){g.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(!Z.isAvailable(Be,me)){g.log.warn(`Fallback model ${Ce} unavailable (fail pool), skipping`);continue}g.log.info(`Trying fallback model: ${Ce}`);let Te={...g.body};Te.model=me;let Pe={...g,provider:Be,body:Te},et=F.providerService.getProvider(Be);if(!et){g.log.warn(`Fallback provider '${Be}' not found, skipping`);continue}if(et.enabled===!1){g.log.warn(`Fallback provider '${Be}' is disabled, skipping`);continue}let{requestBody:dt,config:ft,bypass:kt}=await Df(Te,et,N,g.headers,{req:Pe}),Dt=await Cf(dt,ft,et,F,kt,N,{req:Pe});try{et?.baseUrl&&Dt?.headers&&bc(Be,et.baseUrl,Dt.headers)}catch{}let Ar=await bf(dt,Dt,et,N,kt,{req:Pe});return g.log.info(`Fallback model ${Ce} succeeded`),Z.recordSuccess(Be,me),ne&&le&&(D().promote(ne,le,P,Be,me),g.log.info(`Promoted fallback model ${Be},${me} for ${ne},${le}:${P}`),Z.forceOpen(ne,le,q?.message),g.log.info(`Marked original model ${ne},${le} as unavailable`)),g.provider=Be,g.body=Te,wf(Ar,_,Te,F)}catch(Te){Z.recordFailure(Be,me,Te.message),g.log.warn(`Fallback model ${xe.key} failed: ${Te.message}`),F.recordUsage?.({provider:Be,model:me,originalModel:g.body.model,scenarioType:P,modelFamily:g.modelFamily,errorMessage:Te.message,sessionId:g.usageSessionId||g.id,stream:g.body.stream});continue}}}return g.log.error(`All fallback models failed for ${P}`),null}async function Df(g,_,F,N,q){let P=JSON.parse(JSON.stringify(g)),V={},J=!1;if(J=Kg(_,F,g),J&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],V.headers=N),!J&&typeof F.transformRequestOut=="function"){let oe=await F.transformRequestOut(P);oe.body?(P=oe.body,V=oe.config||{}):P=oe}if(!J&&_.transformer?.use?.length)for(let oe of _.transformer.use){if(!oe||typeof oe.transformRequestIn!="function")continue;let Z=await oe.transformRequestIn(P,_,q);Z.body?(P=Z.body,V={...V,...Z.config}):P=Z}if(!J&&_.transformer?.[g.model]?.use?.length)for(let oe of _.transformer[g.model].use)!oe||typeof oe.transformRequestIn!="function"||(P=await oe.transformRequestIn(P,_,q));return{requestBody:P,config:V,bypass:J}}function Kg(g,_,F){return g.transformer?.use?.length===1&&g.transformer.use[0].name===_.name&&(!g.transformer?.[F.model]?.use.length||g.transformer?.[F.model]?.use.length===1&&g.transformer?.[F.model]?.use[0].name===_.name)}async function Cf(g,_,F,N,q,P,V){let J=_.url||new URL(F.baseUrl);if(!_.TIMEOUT){let ne=N.configService.get("API_TIMEOUT_MS");ne&&(_.TIMEOUT=typeof ne=="string"?parseInt(ne,10):ne)}if(q&&typeof P.auth=="function"){let ne=await P.auth(g,F);if(ne.body){g=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 g=ne}let oe={Authorization:`Bearer ${F.apiKey}`,..._?.headers||{}};for(let ne in oe)(oe[ne]==="undefined"||["authorization","Authorization"].includes(ne)&&oe[ne]?.includes("undefined"))&&delete oe[ne];fo(N.configService)&&hf(N.log,V.req.id,{url:String(J),headers:oe,body:g});let Z=await Qi(J,g,{httpsProxy:N.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(oe))},V,N.log);if(!Z.ok){let ne=await Z.text();N.log.error(`[provider_response_error] Error from provider(${F.name},${g.model}: ${Z.status}): ${ne}`);let le=Xi(`Error from provider(${F.name},${g.model}: ${Z.status}): ${ne}`,Z.status,"provider_response_error");throw le.rawBody=ne,le}if(Z.ok&&(Z.headers.get("content-type")||"").includes("application/json")){let ne=Z.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)){N.log.error(`[provider_response_error] Hidden error from provider(${F.name},${g.model}: ${Z.status}): ${le}`);let te=Xi(`Error from provider(${F.name},${g.model}: ${Z.status}): ${le}`,400,"provider_response_error");throw te.rawBody=le,te}}catch{}}if(!g.stream&&fo(N.configService)){let ne=await Z.clone().text();df(N.log,V.req.id,{status:Z.status,headers:Object.fromEntries(Z.headers.entries()),body:ne})}return Z}async function bf(g,_,F,N,q,P){let V=_;if(!q&&F.transformer?.use?.length)for(let J of Array.from(F.transformer.use).reverse())!J||typeof J.transformResponseOut!="function"||(V=await J.transformResponseOut(V,P));if(!q&&F.transformer?.[g.model]?.use?.length)for(let J of Array.from(F.transformer[g.model].use).reverse())!J||typeof J.transformResponseOut!="function"||(V=await J.transformResponseOut(V,P));return!q&&N.transformResponseIn&&(V=await N.transformResponseIn(V,P)),V}function wf(g,_,F,N){if(g.ok||_.code(g.status),F.stream===!0){if(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),N&&fo(N.configService)){let[q,P]=g.body.tee(),V=ml(N.configService);return Af(q,N.log,_.request.id,V),_.send(P)}return _.send(g.body)}else return g.json()}var Bf=async g=>{g.get("/",async()=>({message:"LLMs API",version:ff})),g.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),g.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 _=g.transformerService.getTransformersWithEndpoint();for(let{transformer:F}of _)F.endPoint&&g.post(F.endPoint,async(N,q)=>Wg(N,q,g,F));g.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(F,N)=>{let{name:q,baseUrl:P,apiKey:V,models:J}=F.body;if(!q?.trim())throw Xi("Provider name is required",400,"invalid_request");if(!P||!Bc(P))throw Xi("Valid base URL is required",400,"invalid_request");if(!V?.trim())throw Xi("API key is required",400,"invalid_request");if(!J||!Array.isArray(J)||J.length===0)throw Xi("At least one model is required",400,"invalid_request");if(g.providerService.getProvider(F.body.name))throw Xi(`Provider with name '${F.body.name}' already exists`,400,"provider_exists");return g.providerService.registerProvider(F.body)}),g.get("/providers",async()=>g.providerService.getProviders()),g.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{let N=g.providerService.getProvider(F.params.id);if(!N)throw Xi("Provider not found",404,"provider_not_found");return N}),g.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},enabled:{type:"boolean"}}}}},async(F,N)=>{let q=g.providerService.updateProvider(F.params.id,F.body);if(!q)throw Xi("Provider not found",404,"provider_not_found");return q}),g.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{if(!g.providerService.deleteProvider(F.params.id))throw Xi("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),g.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(F,N)=>{if(!g.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 Bc(g){try{return new URL(g),!0}catch{return!1}}var Dl=class{constructor(g,_,F){this.configService=g,this.transformerService=_,this.logger=F,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let g=this.configService.get("providers");if(g&&Array.isArray(g)){this.initializeFromProvidersArray(g);return}}initializeFromProvidersArray(g){g.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let F={};_.transformer&&Object.keys(_.transformer).forEach(N=>{N==="use"?Array.isArray(_.transformer.use)&&(F.use=_.transformer.use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let P=this.transformerService.getTransformer(q[0]);if(P)return new P(q[1])}if(typeof q=="string"){let P=this.transformerService.getTransformer(q);return typeof P=="function"?new P:P}}).filter(q=>typeof q<"u")):Array.isArray(_.transformer[N]?.use)&&(F[N]={use:_.transformer[N].use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let P=this.transformerService.getTransformer(q[0]);if(P)return new P(q[1])}if(typeof q=="string"){let P=this.transformerService.getTransformer(q);return typeof P=="function"?new P:P}}).filter(q=>typeof q<"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}),this.logger.info(`${_.name} provider registered`)}catch(F){this.logger.error(`${_.name} provider registered error: ${F}`)}})}registerProvider(g){let _={...g,enabled:g.enabled!==!1};return this.providers.set(_.name,_),g.models.forEach(F=>{let N=`${_.name},${F}`,q={provider:_.name,model:F,fullModel:N};this.modelRoutes.set(N,q),this.modelRoutes.has(F)||this.modelRoutes.set(F,q)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(g){return this.providers.get(g)}updateProvider(g,_){let F=this.providers.get(g);if(!F)return null;let N={...F,..._,updatedAt:new Date};return this.providers.set(g,N),_.models&&(F.models.forEach(q=>{let P=`${F.name},${q}`;this.modelRoutes.delete(P),this.modelRoutes.delete(q)}),_.models.forEach(q=>{let P=`${F.name},${q}`,V={provider:F.name,model:q,fullModel:P};this.modelRoutes.set(P,V),this.modelRoutes.has(q)||this.modelRoutes.set(q,V)})),N}deleteProvider(g){let _=this.providers.get(g);return _?(_.models.forEach(F=>{let N=`${_.name},${F}`;this.modelRoutes.delete(N),this.modelRoutes.delete(F)}),this.providers.delete(g),!0):!1}toggleProvider(g,_){let F=this.providers.get(g);if(!F)return!1;F.enabled=_;let N=this.configService.get("providers");if(N&&Array.isArray(N)){let q=N.find(P=>P.name===g);q&&(q.enabled=_)}return!0}resolveModelRoute(g){let _=this.modelRoutes.get(g);if(!_)return null;let F=this.providers.get(_.provider);return F?{provider:F,originalModel:g,targetModel:_.model}:null}getAvailableModelNames(){let g=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{g.push(F),g.push(`${_.name},${F}`)})}),g}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(g){return g?Array.isArray(g)?g.reduce((_,F)=>{if(Array.isArray(F)){let[N,q={}]=F;_[N]=q}else _[F]={};return _},{}):g:{}}async getAvailableModels(){let g=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{g.push({id:F,object:"model",owned_by:_.name,provider:_.name}),g.push({id:`${_.name},${F}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:g}}},si=[];for(let g=0;g<256;++g)si.push((g+256).toString(16).slice(1));function If(g,_=0){return(si[g[_+0]]+si[g[_+1]]+si[g[_+2]]+si[g[_+3]]+"-"+si[g[_+4]]+si[g[_+5]]+"-"+si[g[_+6]]+si[g[_+7]]+"-"+si[g[_+8]]+si[g[_+9]]+"-"+si[g[_+10]]+si[g[_+11]]+si[g[_+12]]+si[g[_+13]]+si[g[_+14]]+si[g[_+15]]).toLowerCase()}var $=require("crypto"),re=new Uint8Array(256),_e=re.length;function Je(){return _e>re.length-16&&((0,$.randomFillSync)(re),_e=0),re.slice(_e,_e+=16)}var wt=require("crypto"),Jt={randomUUID:wt.randomUUID};function sr(g,_,F){if(Jt.randomUUID&&!_&&!g)return Jt.randomUUID();g=g||{};let N=g.random??g.rng?.()??Je();if(N.length<16)throw new Error("Random bytes length must be >= 16");if(N[6]=N[6]&15|64,N[8]=N[8]&63|128,_){if(F=F||0,F<0||F+16>_.length)throw new RangeError(`UUID byte range ${F}:${F+15} is out of buffer bounds`);for(let q=0;q<16;++q)_[F+q]=N[q];return _}return If(N)}var Qr=sr,Yr=g=>g<=0?"none":g<=1024?"low":g<=8192?"medium":"high",sn=(g,_)=>(g.includes("base64")&&(g=g.split("base64").pop(),g.startsWith(",")&&(g=g.slice(1))),`data:${_};base64,${g}`),Dn=class{constructor(g){this.options=g,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(g,_){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:g,config:{headers:F}}}async transformRequestOut(g){let _=[];if(g.system){if(typeof g.system=="string")_.push({role:"system",content:g.system});else if(Array.isArray(g.system)&&g.system.length){let N=g.system.filter(q=>q.type==="text"&&q.text).map(q=>({type:"text",text:q.text,cache_control:q.cache_control}));_.push({role:"system",content:N})}}JSON.parse(JSON.stringify(g.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){_.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let q=N.content.filter(V=>V.type==="tool_result"&&V.tool_use_id);q.length&&q.forEach(V=>{let J={role:"tool",content:typeof V.content=="string"?V.content:JSON.stringify(V.content),tool_call_id:V.tool_use_id,cache_control:V.cache_control};_.push(J)});let P=N.content.filter(V=>V.type==="text"&&V.text||V.type==="image"&&V.source);P.length&&_.push({role:"user",content:P.map(V=>V?.type==="image"?{type:"image_url",image_url:{url:V.source?.type==="base64"?sn(V.source.data,V.source.media_type):V.source.url},media_type:V.source.media_type}:V)})}else if(N.role==="assistant"){let q={role:"assistant",content:""},P=N.content.filter(oe=>oe.type==="text"&&oe.text);P.length&&(q.content=P.map(oe=>oe.text).join(`
|
|
584
|
+
`);V=Z.pop()||"";for(let ne of Z)ne.trim()&&(P<N.maxStreamChunks?El(_,F,P,ne):P===N.maxStreamChunks&&_.info({debug_log:!0,reqId:F,phase:"provider_stream_chunk_omitted",message:`[chunks after #${P} omitted, maxStreamChunks=${N.maxStreamChunks}]`}),P++)}V.trim()&&(P<N.maxStreamChunks&&El(_,F,P,V.trim()),P++),Wh(_,F,P)}catch(V){console.error(`[debug_log] Error reading debug stream for reqId=${F}:`,V),Wh(_,F,P)}finally{q.releaseLock()}})()}var ff="2.1.6";O();var sa=require("fs"),Kh=require("path"),pf=Za(),Zh=(0,Kh.join)(pf.HOME_DIR,"runtime"),Xh=(0,Kh.join)(Zh,"rate-limit.json"),mu=new Map,gf=!1,Vg=null,Cc=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Yg=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],mf=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function bc(g,_,F){let N=J=>{if(F instanceof Headers)return F.get(J);let oe=Object.keys(F).find(Z=>Z.toLowerCase()===J);return oe?F[oe]:null},q=Eu(N,Cc),P=Eu(N,Yg),V=Eu(N,mf);(q||P||V)&&mu.set(g,{provider:g,remaining:_s(q),limit:_s(P),reset:wc(V),capturedAt:Date.now()})}function ed(g){return mu.get(g)}function td(){return Array.from(mu.values())}function Eu(g,_){for(let F of _){let N=g(F);if(N)return N}return null}function _s(g){if(!g)return null;let _=Number(g.trim().replace(/,/g,""));return Number.isFinite(_)?_:null}function wc(g){if(!g)return null;let _=g.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 N=Date.parse(_);if(Number.isFinite(N))return Math.floor(N/1e3);let q=Jg(_);return q===null?null:Math.floor((Date.now()+q)/1e3)}function Jg(g){let _=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,F=0,N=!1;for(let q of g.matchAll(_)){N=!0;let P=Number(q[1]),V=q[2].toLowerCase();if(Number.isFinite(P))switch(V){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 N?F:null}function zg(){try{if(!(0,sa.existsSync)(Xh))return;let g=JSON.parse((0,sa.readFileSync)(Xh,"utf-8"));if(!Array.isArray(g))return;let _=Date.now();for(let F of g)if(F&&F.provider){if(F.capturedAt&&_-F.capturedAt>3600*1e3)continue;mu.set(F.provider,F)}}catch{}}function yl(){try{if(mu.size===0)return;(0,sa.existsSync)(Zh)||(0,sa.mkdirSync)(Zh,{recursive:!0}),(0,sa.writeFileSync)(Xh,JSON.stringify(Array.from(mu.values()),null,2),"utf-8")}catch{}}function Ef(){gf||(gf=!0,zg(),Vg=setInterval(yl,6e4),process.on("exit",yl))}B();async function Wg(g,_,F,N){let q=g.body,P=g.provider,V=F.providerService.getProvider(P);if(!V)throw Xi(`Provider '${P}' not found`,404,"provider_not_found");try{let{requestBody:J,config:oe,bypass:Z}=await Df(q,V,N,g.headers,{req:g}),ne=await Cf(J,oe,V,F,Z,N,{req:g});try{V?.baseUrl&&ne?.headers&&bc(P,V.baseUrl,ne.headers)}catch{}let le=await bf(J,ne,V,N,Z,{req:g}),Ae=wf(le,_,q,F);try{let te=q.model||g.originalModel;P&&te&&S().recordSuccess(P,te)}catch{}return Ae}catch(J){let oe=await yf(g,_,F,N,J);if(oe)return oe;throw J}}async function yf(g,_,F,N,q){let P=g.scenarioType||"default",V=g.familyFallback,J=g.modelFamily,oe=F.configService.get("fallback"),Z=S(),ne=g.provider||"",le=g.body.model||"",Ae=new Set;if(ne&&le&&(Z.recordFailure(ne,le,q?.message),Ae.add(`${ne},${le}`),F.recordUsage?.({provider:ne,model:le,originalModel:g.originalModel||le,scenarioType:P,modelFamily:g.modelFamily,errorMessage:q?.message||String(q),sessionId:g.usageSessionId||g.id,stream:g.body.stream,inputTokens:g.tokenCount||0})),!F.configService.get("Router")?.enableFallback)return g.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let te=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(J){let De=V?.[P];Array.isArray(De)&&De.length>0?he.push({name:`${J}/${P}`,models:De}):g.log.warn(`No ${J} fallback configured for ${P}; will try global ${P} fallback`)}if(Array.isArray(oe?.[P])&&oe[P].length>0&&he.push({name:`global/${P}`,models:oe[P]}),he.length===0)return null;let ye=he.reduce((De,Ce)=>De+Ce.models.length,0);g.log.warn(`Request failed for ${P}, trying ${ye} fallback models across ${he.length} fallback stage(s)`);for(let De of he){g.log.info(`Trying ${De.name} fallback stage with ${De.models.length} models`);for(let Ce of De.models){let xe=te(Ce);if(!xe){g.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(!Z.isAvailable(Be,me)){g.log.warn(`Fallback model ${Ce} unavailable (fail pool), skipping`);continue}g.log.info(`Trying fallback model: ${Ce}`);let Te={...g.body};Te.model=me;let Pe={...g,provider:Be,body:Te},et=F.providerService.getProvider(Be);if(!et){g.log.warn(`Fallback provider '${Be}' not found, skipping`);continue}if(et.enabled===!1){g.log.warn(`Fallback provider '${Be}' is disabled, skipping`);continue}let{requestBody:dt,config:ft,bypass:kt}=await Df(Te,et,N,g.headers,{req:Pe}),Dt=await Cf(dt,ft,et,F,kt,N,{req:Pe});try{et?.baseUrl&&Dt?.headers&&bc(Be,et.baseUrl,Dt.headers)}catch{}let Ar=await bf(dt,Dt,et,N,kt,{req:Pe});return g.log.info(`Fallback model ${Ce} succeeded`),Z.recordSuccess(Be,me),ne&&le&&(D().promote(ne,le,P,Be,me),g.log.info(`Promoted fallback model ${Be},${me} for ${ne},${le}:${P}`),Z.forceOpen(ne,le,q?.message),g.log.info(`Marked original model ${ne},${le} as unavailable`)),g.provider=Be,g.body=Te,wf(Ar,_,Te,F)}catch(Te){Z.recordFailure(Be,me,Te.message),g.log.warn(`Fallback model ${xe.key} failed: ${Te.message}`),F.recordUsage?.({provider:Be,model:me,originalModel:g.body.model,scenarioType:P,modelFamily:g.modelFamily,errorMessage:Te.message,sessionId:g.usageSessionId||g.id,stream:g.body.stream});continue}}}return g.log.error(`All fallback models failed for ${P}`),null}async function Df(g,_,F,N,q){let P=JSON.parse(JSON.stringify(g)),V={},J=!1;if(J=Kg(_,F,g),J&&(N instanceof Headers?N.delete("content-length"):delete N["content-length"],V.headers=N),!J&&typeof F.transformRequestOut=="function"){let oe=await F.transformRequestOut(P);oe.body?(P=oe.body,V=oe.config||{}):P=oe}if(!J&&_.transformer?.use?.length)for(let oe of _.transformer.use){if(!oe||typeof oe.transformRequestIn!="function")continue;let Z=await oe.transformRequestIn(P,_,q);Z.body?(P=Z.body,V={...V,...Z.config}):P=Z}if(!J&&_.transformer?.[g.model]?.use?.length)for(let oe of _.transformer[g.model].use)!oe||typeof oe.transformRequestIn!="function"||(P=await oe.transformRequestIn(P,_,q));return{requestBody:P,config:V,bypass:J}}function Kg(g,_,F){return g.transformer?.use?.length===1&&g.transformer.use[0].name===_.name&&(!g.transformer?.[F.model]?.use.length||g.transformer?.[F.model]?.use.length===1&&g.transformer?.[F.model]?.use[0].name===_.name)}async function Cf(g,_,F,N,q,P,V){let J=_.url||new URL(F.baseUrl);if(!_.TIMEOUT){let ne=N.configService.get("API_TIMEOUT_MS");ne&&(_.TIMEOUT=typeof ne=="string"?parseInt(ne,10):ne)}if(q&&typeof P.auth=="function"){let ne=await P.auth(g,F);if(ne.body){g=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 g=ne}let oe={Authorization:`Bearer ${F.apiKey}`,..._?.headers||{}};for(let ne in oe)(oe[ne]==="undefined"||["authorization","Authorization"].includes(ne)&&oe[ne]?.includes("undefined"))&&delete oe[ne];fo(N.configService)&&hf(N.log,V.req.id,{url:String(J),headers:oe,body:g});let Z=await Qi(J,g,{httpsProxy:N.configService.getHttpsProxy(),..._,headers:JSON.parse(JSON.stringify(oe))},V,N.log);if(!Z.ok){let ne=await Z.text();N.log.error(`[provider_response_error] Error from provider(${F.name},${g.model}: ${Z.status}): ${ne}`);let le=Xi(`Error from provider(${F.name},${g.model}: ${Z.status}): ${ne}`,Z.status,"provider_response_error");throw le.rawBody=ne,le}if(Z.ok&&(Z.headers.get("content-type")||"").includes("application/json")){let ne=Z.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)){N.log.error(`[provider_response_error] Hidden error from provider(${F.name},${g.model}: ${Z.status}): ${le}`);let te=Xi(`Error from provider(${F.name},${g.model}: ${Z.status}): ${le}`,400,"provider_response_error");throw te.rawBody=le,te}}catch{}}if(!g.stream&&fo(N.configService)){let ne=await Z.clone().text();df(N.log,V.req.id,{status:Z.status,headers:Object.fromEntries(Z.headers.entries()),body:ne})}return Z}async function bf(g,_,F,N,q,P){let V=_;if(!q&&F.transformer?.use?.length)for(let J of Array.from(F.transformer.use).reverse())!J||typeof J.transformResponseOut!="function"||(V=await J.transformResponseOut(V,P));if(!q&&F.transformer?.[g.model]?.use?.length)for(let J of Array.from(F.transformer[g.model].use).reverse())!J||typeof J.transformResponseOut!="function"||(V=await J.transformResponseOut(V,P));return!q&&N.transformResponseIn&&(V=await N.transformResponseIn(V,P)),V}function wf(g,_,F,N){if(g.ok||_.code(g.status),F.stream===!0){if(_.header("Content-Type","text/event-stream"),_.header("Cache-Control","no-cache"),_.header("Connection","keep-alive"),N&&fo(N.configService)){let[q,P]=g.body.tee(),V=ml(N.configService);return Af(q,N.log,_.request.id,V),_.send(P)}return _.send(g.body)}else return g.json()}var Bf=async g=>{g.get("/",async()=>({message:"LLMs API",version:ff})),g.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),g.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 _=g.transformerService.getTransformersWithEndpoint();for(let{transformer:F}of _)F.endPoint&&g.post(F.endPoint,async(N,q)=>Wg(N,q,g,F));g.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(F,N)=>{let{name:q,baseUrl:P,apiKey:V,models:J}=F.body;if(!q?.trim())throw Xi("Provider name is required",400,"invalid_request");if(!P||!Bc(P))throw Xi("Valid base URL is required",400,"invalid_request");if(!V?.trim())throw Xi("API key is required",400,"invalid_request");if(!J||!Array.isArray(J)||J.length===0)throw Xi("At least one model is required",400,"invalid_request");if(g.providerService.getProvider(F.body.name))throw Xi(`Provider with name '${F.body.name}' already exists`,400,"provider_exists");return g.providerService.registerProvider(F.body)}),g.get("/providers",async()=>g.providerService.getProviders()),g.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{let N=g.providerService.getProvider(F.params.id);if(!N)throw Xi("Provider not found",404,"provider_not_found");return N}),g.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},enabled:{type:"boolean"}}}}},async(F,N)=>{let q=g.providerService.updateProvider(F.params.id,F.body);if(!q)throw Xi("Provider not found",404,"provider_not_found");return q}),g.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async F=>{if(!g.providerService.deleteProvider(F.params.id))throw Xi("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),g.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(F,N)=>{if(!g.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 Bc(g){try{return new URL(g),!0}catch{return!1}}var Dl=class{constructor(g,_,F){this.configService=g,this.transformerService=_,this.logger=F,this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let g=this.configService.get("providers");if(g&&Array.isArray(g)){this.initializeFromProvidersArray(g);return}}initializeFromProvidersArray(g){g.forEach(_=>{try{if(!_.name||!_.api_base_url||!_.api_key)return;let F={};_.transformer&&Object.keys(_.transformer).forEach(N=>{N==="use"?Array.isArray(_.transformer.use)&&(F.use=_.transformer.use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let P=this.transformerService.getTransformer(q[0]);if(P)return new P(q[1])}if(typeof q=="string"){let P=this.transformerService.getTransformer(q);return typeof P=="function"?new P:P}}).filter(q=>typeof q<"u")):Array.isArray(_.transformer[N]?.use)&&(F[N]={use:_.transformer[N].use.map(q=>{if(Array.isArray(q)&&typeof q[0]=="string"){let P=this.transformerService.getTransformer(q[0]);if(P)return new P(q[1])}if(typeof q=="string"){let P=this.transformerService.getTransformer(q);return typeof P=="function"?new P:P}}).filter(q=>typeof q<"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}),this.logger.info(`${_.name} provider registered`)}catch(F){this.logger.error(`${_.name} provider registered error: ${F}`)}})}registerProvider(g){let _={...g,enabled:g.enabled!==!1};return this.providers.set(_.name,_),g.models.forEach(F=>{let N=`${_.name},${F}`,q={provider:_.name,model:F,fullModel:N};this.modelRoutes.set(N,q),this.modelRoutes.has(F)||this.modelRoutes.set(F,q)}),_}getProviders(){return Array.from(this.providers.values())}getProvider(g){return this.providers.get(g)}updateProvider(g,_){let F=this.providers.get(g);if(!F)return null;let N={...F,..._,updatedAt:new Date};return this.providers.set(g,N),_.models&&(F.models.forEach(q=>{let P=`${F.name},${q}`;this.modelRoutes.delete(P),this.modelRoutes.delete(q)}),_.models.forEach(q=>{let P=`${F.name},${q}`,V={provider:F.name,model:q,fullModel:P};this.modelRoutes.set(P,V),this.modelRoutes.has(q)||this.modelRoutes.set(q,V)})),N}deleteProvider(g){let _=this.providers.get(g);return _?(_.models.forEach(F=>{let N=`${_.name},${F}`;this.modelRoutes.delete(N),this.modelRoutes.delete(F)}),this.providers.delete(g),!0):!1}toggleProvider(g,_){let F=this.providers.get(g);if(!F)return!1;F.enabled=_;let N=this.configService.get("providers");if(N&&Array.isArray(N)){let q=N.find(P=>P.name===g);q&&(q.enabled=_)}return!0}resolveModelRoute(g){let _=this.modelRoutes.get(g);if(!_)return null;let F=this.providers.get(_.provider);return F?{provider:F,originalModel:g,targetModel:_.model}:null}getAvailableModelNames(){let g=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{g.push(F),g.push(`${_.name},${F}`)})}),g}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(g){return g?Array.isArray(g)?g.reduce((_,F)=>{if(Array.isArray(F)){let[N,q={}]=F;_[N]=q}else _[F]={};return _},{}):g:{}}async getAvailableModels(){let g=[];return this.providers.forEach(_=>{_.enabled!==!1&&_.models.forEach(F=>{g.push({id:F,object:"model",owned_by:_.name,provider:_.name}),g.push({id:`${_.name},${F}`,object:"model",owned_by:_.name,provider:_.name})})}),{object:"list",data:g}}},si=[];for(let g=0;g<256;++g)si.push((g+256).toString(16).slice(1));function If(g,_=0){return(si[g[_+0]]+si[g[_+1]]+si[g[_+2]]+si[g[_+3]]+"-"+si[g[_+4]]+si[g[_+5]]+"-"+si[g[_+6]]+si[g[_+7]]+"-"+si[g[_+8]]+si[g[_+9]]+"-"+si[g[_+10]]+si[g[_+11]]+si[g[_+12]]+si[g[_+13]]+si[g[_+14]]+si[g[_+15]]).toLowerCase()}var $=require("crypto"),re=new Uint8Array(256),_e=re.length;function Je(){return _e>re.length-16&&((0,$.randomFillSync)(re),_e=0),re.slice(_e,_e+=16)}var wt=require("crypto"),Jt={randomUUID:wt.randomUUID};function sr(g,_,F){if(Jt.randomUUID&&!_&&!g)return Jt.randomUUID();g=g||{};let N=g.random??g.rng?.()??Je();if(N.length<16)throw new Error("Random bytes length must be >= 16");if(N[6]=N[6]&15|64,N[8]=N[8]&63|128,_){if(F=F||0,F<0||F+16>_.length)throw new RangeError(`UUID byte range ${F}:${F+15} is out of buffer bounds`);for(let q=0;q<16;++q)_[F+q]=N[q];return _}return If(N)}var Qr=sr,Yr=g=>g<=0?"none":g<=1024?"low":g<=8192?"medium":"high",sn=(g,_)=>(g.includes("base64")&&(g=g.split("base64").pop(),g.startsWith(",")&&(g=g.slice(1))),`data:${_};base64,${g}`),Dn=class{constructor(g){this.options=g,this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(g,_){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:g,config:{headers:F}}}async transformRequestOut(g){let _=[];if(g.system){if(typeof g.system=="string")_.push({role:"system",content:g.system});else if(Array.isArray(g.system)&&g.system.length){let N=g.system.filter(q=>q.type==="text"&&q.text).map(q=>({type:"text",text:q.text,cache_control:q.cache_control}));_.push({role:"system",content:N})}}JSON.parse(JSON.stringify(g.messages||[]))?.forEach(N=>{if(N.role==="user"||N.role==="assistant"){if(typeof N.content=="string"){_.push({role:N.role,content:N.content});return}if(Array.isArray(N.content)){if(N.role==="user"){let q=N.content.filter(V=>V.type==="tool_result"&&V.tool_use_id);q.length&&q.forEach(V=>{let J={role:"tool",content:typeof V.content=="string"?V.content:JSON.stringify(V.content),tool_call_id:V.tool_use_id,cache_control:V.cache_control};_.push(J)});let P=N.content.filter(V=>V.type==="text"&&V.text||V.type==="image"&&V.source);P.length&&_.push({role:"user",content:P.map(V=>V?.type==="image"?{type:"image_url",image_url:{url:V.source?.type==="base64"?sn(V.source.data,V.source.media_type):V.source.url},media_type:V.source.media_type}:V)})}else if(N.role==="assistant"){let q={role:"assistant",content:""},P=N.content.filter(oe=>oe.type==="text"&&oe.text);P.length&&(q.content=P.map(oe=>oe.text).join(`
|
|
585
585
|
`));let V=N.content.filter(oe=>oe.type==="tool_use"&&oe.id);V.length&&(q.tool_calls=V.map(oe=>({id:oe.id,type:"function",function:{name:oe.name,arguments:JSON.stringify(oe.input||{})}})));let J=N.content.find(oe=>oe.type==="thinking");J&&(q.thinking={content:J.thinking,signature:J.signature}),_.push(q)}return}}});let F={messages:_,model:g.model,max_tokens:g.max_tokens,temperature:g.temperature,stream:g.stream,tools:g.tools?.length?this.convertAnthropicToolsToUnified(g.tools):void 0,tool_choice:g.tool_choice};return g.thinking&&(F.reasoning={effort:Yr(g.thinking.budget_tokens),enabled:g.thinking.type==="enabled"}),g.tool_choice&&(g.tool_choice.type==="tool"?F.tool_choice={type:"function",function:{name:g.tool_choice.name}}:F.tool_choice=g.tool_choice.type),F}async transformResponseIn(g,_){if(g.headers.get("Content-Type")?.includes("text/event-stream")){if(!g.body)throw new Error("Stream response body is null");let F=await this.convertOpenAIStreamToAnthropic(g.body,_);return new Response(F,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let F=await g.json(),N=this.convertOpenAIResponseToAnthropic(F,_);return new Response(JSON.stringify(N),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(g){return g.map(_=>({type:"function",function:{name:_.name,description:_.description||"",parameters:_.input_schema}}))}async convertOpenAIStreamToAnthropic(g,_){return new ReadableStream({start:async F=>{let N=new TextEncoder,q=`msg_${Date.now()}`,P=null,V="unknown",J=!1,oe=!1,Z=!1,ne=new Map,le=new Map,Ae=0,te=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(N.encode(`event: content_block_stop
|
|
586
586
|
data: ${JSON.stringify(dt)}
|
|
587
587
|
|
|
@@ -933,7 +933,7 @@ ${this.toMarkdown(n,t+1)}`:`${r}- ${n}`).join(`
|
|
|
933
933
|
${this.toMarkdown(o,t+1)}`:`${r}${n}: ${o}`).join(`
|
|
934
934
|
`):`${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}}}}),a_,u_=ui(()=>{"use strict";a_=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}`)}}}}),l_,c_=ui(()=>{"use strict";l_=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,bU.tmpdir)();this.baseDir=(0,Iw.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,nE.existsSync)(this.baseDir)||(0,nE.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,Iw.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,nE.writeFileSync)(o,JSON.stringify(n,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}}),zw,Nd,W5=ui(()=>{"use strict";s_(),u_(),c_(),zw=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 o_(e.config);case"webhook":return new a_(e.config);case"temp-file":return new l_(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)}},Nd=new zw}),K5=qu(Vv(),1),Ww=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,vw.join)(process.cwd(),this.options.jsonPath);if((0,iE.existsSync)(e))try{let t=(0,iE.readFileSync)(e,"utf-8"),r=K5.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,vw.join)(process.cwd(),this.options.envPath);if((0,iE.existsSync)(e))try{let t=(0,IU.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 qo(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 Z5(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 X5(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 vU.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 e9=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Kc={maxBodyLength:4096,maxStreamChunks:100},Yy=!1;function t9(e){Yy=e}function Kw(){return Yy}function YE(e){return Yy||e.get("DEBUG_LOG")===!0}function r9(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 h_(e){let t={};for(let[r,n]of Object.entries(e))e9.has(r.toLowerCase())?t[r]="***MASKED***":t[r]=n;return t}function Jy(e,t){return e.length<=t?e:e.slice(0,t)+`...[truncated, total ${e.length} bytes]`}function n9(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:h_(r.headers),body:Jy(n,Kc.maxBodyLength)})}function i9(e,t,r){e.info({debug_log:!0,reqId:t,phase:"provider_response",status:r.status,headers:h_(r.headers),...r.body!==void 0?{body:Jy(r.body,Kc.maxBodyLength)}:{}})}function Zw(e,t,r,n){e.info({debug_log:!0,reqId:t,phase:"provider_stream_chunk",chunkIndex:r,data:Jy(n,Kc.maxBodyLength)})}function Xw(e,t,r){e.info({debug_log:!0,reqId:t,phase:"provider_stream_end",totalChunks:r})}function o9(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(`
|
|
935
935
|
|
|
936
|
-
`);i=l.pop()||"";for(let c of l)c.trim()&&(s<n.maxStreamChunks?Zw(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&&Zw(t,r,s,i.trim()),s++),Xw(t,r,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${r}:`,i),Xw(t,r,s)}finally{o.releaseLock()}})()}var s9="2.1.5";rA();var a9=(0,$v.join)(xU.HOME_DIR,"runtime"),mY=(0,$v.join)(a9,"rate-limit.json"),d_=new Map,u9=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],l9=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],c9=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function zy(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=AE(n,u9),s=AE(n,l9),i=AE(n,c9);(o||s||i)&&d_.set(e,{provider:e,remaining:eB(o),limit:eB(s),reset:d9(i),capturedAt:Date.now()})}function h9(){return Array.from(d_.values())}function AE(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function eB(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function d9(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=A9(t);return o===null?null:Math.floor((Date.now()+o)/1e3)}function A9(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}Ly();async function f9(e,t,r,n){let o=e.body,s=e.provider,i=r.providerService.getProvider(s);if(!i)throw qo(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await A_(o,i,n,e.headers,{req:e}),c=await f_(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&zy(s,i.baseUrl,c.headers)}catch{}let h=await p_(a,c,i,n,l,{req:e}),A=g_(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 p9(e,t,r,n,a);if(u)return u;throw a}}async function p9(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 p=f.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${s}, trying ${p} 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 A_(w,b,n,e.headers,{req:v}),x=await f_(I,B,b,r,S,n,{req:v});try{b?.baseUrl&&x?.headers&&zy(y,b.baseUrl,x.headers)}catch{}let k=await p_(I,x,b,n,S,{req:v});return e.log.info(`Fallback model ${E} succeeded`),l.recordSuccess(y,D),c&&h&&(Oy().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,g_(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 A_(e,t,r,n,o){let s=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=g9(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 g9(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 f_(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];YE(n.configService)&&n9(n.log,i.req.id,{url:String(a),headers:u,body:e});let l=await X5(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=qo(`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=qo(`Error from provider(${r.name},${e.model}: ${l.status}): ${h}`,400,"provider_response_error");throw d.rawBody=h,d}}catch{}}if(!e.stream&&YE(n.configService)){let c=await l.clone().text();i9(n.log,i.req.id,{status:l.status,headers:Object.fromEntries(l.headers.entries()),body:c})}return l}async function p_(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 g_(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&&YE(n.configService)){let[o,s]=e.body.tee(),i=r9(n.configService);return o9(o,n.log,t.request.id,i),t.send(s)}return t.send(e.body)}else return e.json()}var tB=async e=>{e.get("/",async()=>({message:"LLMs API",version:s9})),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)=>f9(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 qo("Provider name is required",400,"invalid_request");if(!s||!m9(s))throw qo("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw qo("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw qo("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw qo(`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 qo("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 qo("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 qo("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 qo("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function m9(e){try{return new URL(e),!0}catch{return!1}}var rB=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}),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};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 E9(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 P0=new Uint8Array(256),B0=P0.length;function y9(){return B0>P0.length-16&&((0,_U.randomFillSync)(P0),B0=0),P0.slice(B0,B0+=16)}var nB={randomUUID:SU.randomUUID};function D9(e,t,r){if(nB.randomUUID&&!t&&!e)return nB.randomUUID();e=e||{};let n=e.random??e.rng?.()??y9();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 E9(n)}var jd=D9,C9=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",b9=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),w9=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"?b9(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(`
|
|
936
|
+
`);i=l.pop()||"";for(let c of l)c.trim()&&(s<n.maxStreamChunks?Zw(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&&Zw(t,r,s,i.trim()),s++),Xw(t,r,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${r}:`,i),Xw(t,r,s)}finally{o.releaseLock()}})()}var s9="2.1.6";rA();var a9=(0,$v.join)(xU.HOME_DIR,"runtime"),mY=(0,$v.join)(a9,"rate-limit.json"),d_=new Map,u9=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],l9=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],c9=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function zy(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=AE(n,u9),s=AE(n,l9),i=AE(n,c9);(o||s||i)&&d_.set(e,{provider:e,remaining:eB(o),limit:eB(s),reset:d9(i),capturedAt:Date.now()})}function h9(){return Array.from(d_.values())}function AE(e,t){for(let r of t){let n=e(r);if(n)return n}return null}function eB(e){if(!e)return null;let t=Number(e.trim().replace(/,/g,""));return Number.isFinite(t)?t:null}function d9(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=A9(t);return o===null?null:Math.floor((Date.now()+o)/1e3)}function A9(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}Ly();async function f9(e,t,r,n){let o=e.body,s=e.provider,i=r.providerService.getProvider(s);if(!i)throw qo(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:a,config:u,bypass:l}=await A_(o,i,n,e.headers,{req:e}),c=await f_(a,u,i,r,l,n,{req:e});try{i?.baseUrl&&c?.headers&&zy(s,i.baseUrl,c.headers)}catch{}let h=await p_(a,c,i,n,l,{req:e}),A=g_(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 p9(e,t,r,n,a);if(u)return u;throw a}}async function p9(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 p=f.reduce((m,E)=>m+E.models.length,0);e.log.warn(`Request failed for ${s}, trying ${p} 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 A_(w,b,n,e.headers,{req:v}),x=await f_(I,B,b,r,S,n,{req:v});try{b?.baseUrl&&x?.headers&&zy(y,b.baseUrl,x.headers)}catch{}let k=await p_(I,x,b,n,S,{req:v});return e.log.info(`Fallback model ${E} succeeded`),l.recordSuccess(y,D),c&&h&&(Oy().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,g_(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 A_(e,t,r,n,o){let s=JSON.parse(JSON.stringify(e)),i={},a=!1;if(a=g9(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 g9(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 f_(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];YE(n.configService)&&n9(n.log,i.req.id,{url:String(a),headers:u,body:e});let l=await X5(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=qo(`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=qo(`Error from provider(${r.name},${e.model}: ${l.status}): ${h}`,400,"provider_response_error");throw d.rawBody=h,d}}catch{}}if(!e.stream&&YE(n.configService)){let c=await l.clone().text();i9(n.log,i.req.id,{status:l.status,headers:Object.fromEntries(l.headers.entries()),body:c})}return l}async function p_(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 g_(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&&YE(n.configService)){let[o,s]=e.body.tee(),i=r9(n.configService);return o9(o,n.log,t.request.id,i),t.send(s)}return t.send(e.body)}else return e.json()}var tB=async e=>{e.get("/",async()=>({message:"LLMs API",version:s9})),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)=>f9(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 qo("Provider name is required",400,"invalid_request");if(!s||!m9(s))throw qo("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw qo("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw qo("At least one model is required",400,"invalid_request");if(e.providerService.getProvider(r.body.name))throw qo(`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 qo("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 qo("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 qo("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 qo("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function m9(e){try{return new URL(e),!0}catch{return!1}}var rB=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}),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};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 E9(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 P0=new Uint8Array(256),B0=P0.length;function y9(){return B0>P0.length-16&&((0,_U.randomFillSync)(P0),B0=0),P0.slice(B0,B0+=16)}var nB={randomUUID:SU.randomUUID};function D9(e,t,r){if(nB.randomUUID&&!t&&!e)return nB.randomUUID();e=e||{};let n=e.random??e.rng?.()??y9();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 E9(n)}var jd=D9,C9=e=>e<=0?"none":e<=1024?"low":e<=8192?"medium":"high",b9=(e,t)=>(e.includes("base64")&&(e=e.split("base64").pop(),e.startsWith(",")&&(e=e.slice(1))),`data:${t};base64,${e}`),w9=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"?b9(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(`
|
|
937
937
|
`));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:C9(e.thinking.budget_tokens),enabled:e.thinking.type==="enabled"}),e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let r=await this.convertOpenAIStreamToAnthropic(e.body,t);return new Response(r,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let r=await e.json(),n=this.convertOpenAIResponseToAnthropic(r,t);return new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description||"",parameters:t.input_schema}}))}async convertOpenAIStreamToAnthropic(e,t){return new ReadableStream({start:async r=>{let n=new TextEncoder,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,p=!1,m=!1,E=0,C=-1,y=()=>{let b=E;return E++,b},D=b=>{if(!p)try{r.enqueue(b);let I=new TextDecoder().decode(b);this.logger.debug({reqId:t.req.id,data:I,type:"send data"})}catch(I){if(I instanceof TypeError&&I.message.includes("Controller is already closed"))p=!0;else throw this.logger.debug({reqId:t.req.id,error:I instanceof Error?I.message:String(I),type:"send data error"}),I}},w=()=>{if(!p)try{if(C>=0){let I={type:"content_block_stop",index:C};D(n.encode(`event: content_block_stop
|
|
938
938
|
data: ${JSON.stringify(I)}
|
|
939
939
|
|
|
@@ -1240,7 +1240,7 @@ If multiple images exist, select the **most relevant imageId** based on the user
|
|
|
1240
1240
|
|
|
1241
1241
|
Do not attempt to describe or analyze the image directly yourself.
|
|
1242
1242
|
Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
|
|
1243
|
-
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"?(x0.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")&&(x0.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++)})})}},YH=new VH,JH=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}},M_=new JH;M_.registerAgent(YH);var BE=M_,zH=require("node:events"),QB=require("node:perf_hooks"),WH=Iv(),KH=WH.getHealthStore,NB=new zH.EventEmitter;function IE(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 vE(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 ZH(){let e=(0,Mv.homedir)(),t=(0,Uv.join)(e,".claude.json");if(!(0,AU.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,fU.writeFile)(t,JSON.stringify(r,null,2))}}async function XH(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":zE.registerPlugin(R_,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${o}`);break}}await zE.enablePlugins(e)}async function U_(e={}){await ZH(),await Ty();let t=await jv(),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 p=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:PH(u,{path:DE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,DE.listPresets)(),h=await BH({jsonPath:DE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:o,PORT:i,LOG_FILE:(0,Uv.join)((0,Mv.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return h.recordUsage=A=>{try{_B({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 XH(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=QB.performance.now())}),h.addHook("preHandler",async(A,d)=>{if(new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")){let f=IE(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,p)=>{let m=E=>{E?p(E):f()};IH(t)(A,d,m).catch(p)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of BE.getAllAgents())p.shouldHandle(A,t)&&(f.push(p.name),p.reqHandler(A,t),p.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(p.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",NB.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let m=IE(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new wE),w,v=-1,b="",I="",B="",S=[],x=[];return p(null,UH(D,async(k,R)=>{try{if(k.event==="content_block_start"&&k?.data?.content_block?.name){let O=A.agents.find(T=>BE.getAgent(T)?.tools.get(k.data.content_block.name));if(O){w=BE.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=jH.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 wE).getReader();for(;;)try{let{value:Q,done:j}=await T.read();if(j)break;let Y=Q;if(["message_start","message_stop"].includes(Y.event))continue;if(!R.desiredSize)break;R.enqueue(Y)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw Q}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 MH))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new wE).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),p(null,E)}if(Yc.put(m,f.usage),typeof f=="object")return f.error?p(f.error,null):p(f,null)}if(typeof f=="object"&&f.error)return p(f.error,null);p(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(NB.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=IE(A),p=Yc.get(f),m=DH(f),E=KH(),C,y,D=A.sseError,w=D&&(D.type||D.code||D.message),v=p?.output_tokens&&p.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=vE(A);E.recordFailure(A.provider||"",I,C)}else{let I=vE(A);E.recordSuccess(A.provider||"",I)}_B({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:vE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:p?.input_tokens||A.tokenCount||0,outputTokens:b?0:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:b?null:m.ttft,tokensPerSecond:b?null:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(QB.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 eq(){let e=await U_();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===tD&&eq().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function G_(e){try{let{stdout:t}=await q_("npm view claude-code-router-next version"),r=t.trim();return{hasUpdate:tq(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function V_(){try{let{stdout:e,stderr:t}=await q_("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 tq(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_,Y_=c0(()=>{"use strict";$_=require("child_process"),H_=require("util"),q_=(0,H_.promisify)($_.exec)});var xp,rD=c0(()=>{xp="2.1.19"});var iD=Fr(nD=>{"use strict";Object.defineProperty(nD,"__esModule",{value:!0});var J_=require("child_process"),nq=1024*1024,z_={exec(e,t){let r={maxBuffer:2*nq,windowsHide:!0};(0,J_.exec)(e,r,t)},spawn(e,t,r){return(0,J_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
|
|
1243
|
+
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"?(x0.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")&&(x0.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++)})})}},YH=new VH,JH=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}},M_=new JH;M_.registerAgent(YH);var BE=M_,zH=require("node:events"),QB=require("node:perf_hooks"),WH=Iv(),KH=WH.getHealthStore,NB=new zH.EventEmitter;function IE(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 vE(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 ZH(){let e=(0,Mv.homedir)(),t=(0,Uv.join)(e,".claude.json");if(!(0,AU.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,fU.writeFile)(t,JSON.stringify(r,null,2))}}async function XH(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":zE.registerPlugin(R_,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0}],...i});break;default:console.warn(`Unknown plugin: ${o}`);break}}await zE.enablePlugins(e)}async function U_(e={}){await ZH(),await Ty();let t=await jv(),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 p=f.getFullYear()+""+a(f.getMonth()+1),m=a(f.getDate()),E=a(f.getHours()),C=a(f.getMinutes());return`./logs/ccr-${p}${m}${E}${C}${a(f.getSeconds())}${d?`_${d}`:""}.log`},l;e.logger!==void 0?l=e.logger:t.LOG!==!1?(t.LOG===void 0&&(t.LOG=!0),l={level:t.LOG_LEVEL||"debug",stream:PH(u,{path:DE.HOME_DIR,maxFiles:3,interval:"1d",compress:!1,maxSize:"50M"})}):l=!1;let c=await(0,DE.listPresets)(),h=await BH({jsonPath:DE.CONFIG_FILE,initialConfig:{providers:t.Providers||t.providers,HOST:o,PORT:i,LOG_FILE:(0,Uv.join)((0,Mv.homedir)(),".claude-code-router","claude-code-router.log")},logger:l});return h.recordUsage=A=>{try{_B({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 XH(h,t),h.addHook("onRequest",async A=>{new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")&&!A.requestStartTime&&(A.requestStartTime=QB.performance.now())}),h.addHook("preHandler",async(A,d)=>{if(new URL(`http://127.0.0.1${A.url}`).pathname.endsWith("/v1/messages")){let f=IE(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,p)=>{let m=E=>{E?p(E):f()};IH(t)(A,d,m).catch(p)})),h.addHook("preHandler",async(A,d)=>{let f=new URL(`http://127.0.0.1${A.url}`);A.pathname=f.pathname,A.pathname.endsWith("/v1/messages")&&A.pathname!=="/v1/messages"&&(A.preset=A.pathname.replace("/v1/messages","").replace("/",""))}),h.addHook("preHandler",async(A,d)=>{if(A.pathname.endsWith("/v1/messages")){let f=[];for(let p of BE.getAllAgents())p.shouldHandle(A,t)&&(f.push(p.name),p.reqHandler(A,t),p.tools.size&&(A.body?.tools?.length||(A.body.tools=[]),A.body.tools.unshift(...Array.from(p.tools.values()).map(m=>({name:m.name,description:m.description,input_schema:m.input_schema})))));f.length&&(A.agents=f)}}),h.addHook("onError",async(A,d,f)=>{A.errorMessage=f?.message||f?.toString?.()||"Unknown error",NB.emit("onError",A,d,f)}),h.addHook("onSend",(A,d,f,p)=>{if(A.pathname?.endsWith("/v1/messages")){let m=IE(A);if(f instanceof ReadableStream){if(A.agents){let y=new AbortController,D=f.pipeThrough(new wE),w,v=-1,b="",I="",B="",S=[],x=[];return p(null,UH(D,async(k,R)=>{try{if(k.event==="content_block_start"&&k?.data?.content_block?.name){let O=A.agents.find(T=>BE.getAgent(T)?.tools.get(k.data.content_block.name));if(O){w=BE.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=jH.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 wE).getReader();for(;;)try{let{value:Q,done:j}=await T.read();if(j)break;let Y=Q;if(["message_start","message_stop"].includes(Y.event))continue;if(!R.desiredSize)break;R.enqueue(Y)}catch(Q){if(Q.name==="AbortError"||Q.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw Q}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 MH))}let[E,C]=f.tee();return(async y=>{let D=y.pipeThrough(new TextDecoderStream).pipeThrough(new wE).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),p(null,E)}if(Yc.put(m,f.usage),typeof f=="object")return f.error?p(f.error,null):p(f,null)}if(typeof f=="object"&&f.error)return p(f.error,null);p(null,f)}),h.addHook("onSend",async(A,d,f)=>{if(NB.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=IE(A),p=Yc.get(f),m=DH(f),E=KH(),C,y,D=A.sseError,w=D&&(D.type||D.code||D.message),v=p?.output_tokens&&p.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=vE(A);E.recordFailure(A.provider||"",I,C)}else{let I=vE(A);E.recordSuccess(A.provider||"",I)}_B({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:vE(A),modelFamily:A.modelFamily||"",scenarioType:A.scenarioType||"default",stream:A.body?.stream??!1,inputTokens:p?.input_tokens||A.tokenCount||0,outputTokens:b?0:p?.output_tokens||0,cacheReadInputTokens:p?.cache_read_input_tokens||0,cacheCreationInputTokens:p?.cache_creation_input_tokens||0,ttft:b?null:m.ttft,tokensPerSecond:b?null:m.tokensPerSecond,durationMs:A.requestStartTime?Math.round(QB.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 eq(){let e=await U_();e.app.post("/api/restart",async()=>(setTimeout(async()=>{process.exit(0)},100),{success:!0,message:"Service restart initiated"})),await e.start()}require.main===tD&&eq().catch(e=>{console.error("Failed to start server:",e),process.exit(1)});});async function G_(e){try{let{stdout:t}=await q_("npm view claude-code-router-next version"),r=t.trim();return{hasUpdate:tq(r,e)>0,latestVersion:r,changelog:""}}catch(t){return console.error("Error checking for updates:",t),{hasUpdate:!1,latestVersion:e,changelog:""}}}async function V_(){try{let{stdout:e,stderr:t}=await q_("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 tq(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_,Y_=c0(()=>{"use strict";$_=require("child_process"),H_=require("util"),q_=(0,H_.promisify)($_.exec)});var xp,rD=c0(()=>{xp="2.1.20"});var iD=Fr(nD=>{"use strict";Object.defineProperty(nD,"__esModule",{value:!0});var J_=require("child_process"),nq=1024*1024,z_={exec(e,t){let r={maxBuffer:2*nq,windowsHide:!0};(0,J_.exec)(e,r,t)},spawn(e,t,r){return(0,J_.spawn)(e,t,r)},stripLine(e,t){let r=0;for(;t-- >0;){let n=e.indexOf(`
|
|
1244
1244
|
`,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=z_.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})}};nD.default=z_});var K_=Fr((W_,_p)=>{(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof _p=="object"&&_p.exports?_p.exports=t():e.log=t()})(W_,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,p){var m=f[p];if(typeof m.bind=="function")return m.bind(f);try{return Function.prototype.bind.call(m,f)}catch{return function(){return Function.prototype.apply.apply(m,[f,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function u(f){return f==="debug"&&(f="log"),typeof console===t?!1:f==="trace"&&r?a:console[f]!==void 0?i(console,f):console.log!==void 0?i(console,"log"):e}function l(){for(var f=this.getLevel(),p=0;p<n.length;p++){var m=n[p];this[m]=p<f?e:this.methodFactory(m,f,this.name)}if(this.log=this.debug,typeof console===t&&f<this.levels.SILENT)return"No console available for logging"}function c(f){return function(){typeof console!==t&&(l.call(this),this[f].apply(this,arguments))}}function h(f,p,m){return u(f)||c.apply(this,arguments)}function A(f,p){var m=this,E,C,y,D="loglevel";typeof f=="string"?D+=":"+f:typeof f=="symbol"&&(D=void 0);function w(S){var x=(n[S]||"silent").toUpperCase();if(!(typeof window===t||!D)){try{window.localStorage[D]=x;return}catch{}try{window.document.cookie=encodeURIComponent(D)+"="+x+";"}catch{}}}function v(){var S;if(!(typeof window===t||!D)){try{S=window.localStorage[D]}catch{}if(typeof S===t)try{var x=window.document.cookie,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=p||h,m.getLevel=function(){return y??C??E},m.setLevel=function(S,x){return y=I(S),x!==!1&&w(y),l.call(m)},m.setDefaultLevel=function(S){C=I(S),v()||m.setLevel(S,!1)},m.resetLevel=function(){y=null,b(),l.call(m)},m.enableAll=function(S){m.setLevel(m.levels.TRACE,S)},m.disableAll=function(S){m.setLevel(m.levels.SILENT,S)},m.rebuild=function(){if(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(p){if(typeof p!="symbol"&&typeof p!="string"||p==="")throw new TypeError("You must supply a name when creating a logger.");var m=o[p];return m||(m=o[p]=new A(p,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 oD=Fr(uA=>{"use strict";var iq=uA&&uA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(uA,"__esModule",{value:!0});var oq=iq(K_());uA.default=oq.default});var eS=Fr(Js=>{"use strict";var sq=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}),Z_=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"&&sq(r,t,n[o]);return aq(r,t),r}})(),X_=Js&&Js.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Js,"__esModule",{value:!0});var uq=Z_(require("os")),Sp=Z_(require("fs")),Yo=X_(iD()),lq=X_(oD()),cq=e=>new Promise((t,r)=>{Sp.existsSync(e)?t():Sp.mkdir(e,n=>{n?r(n):t()})}),lh={darwin(e){return new Promise((t,r)=>{Yo.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=Yo.default.stripLine(o.toString(),1),u=a.slice(0,a.indexOf(`
|
|
1245
1245
|
`)),l=Yo.default.stripLine(a,1),c=u.indexOf("rxbytes")>=0?10:8,h=Yo.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)=>{Yo.default.exec("netstat -tunlp",function(o,s,i){if(o)r(o);else{let a=i.toString().trim();a&&lq.default.warn(a);let u=Yo.default.stripLine(s.toString(),2),l=Yo.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)=>{Yo.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=Yo.default.stripLine(o.toString(),4),u=Yo.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=uq.tmpdir()+"/.find-process",o=n+"/"+process.pid,s='netstat -tunp >> "'+o+'"';cq(n).then(()=>{Yo.default.exec(s,()=>{Sp.readFile(o,"utf8",(i,a)=>{if(Sp.unlink(o,()=>{}),i)r(i);else{a=Yo.default.stripLine(a,2);let u=Yo.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 hq(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=hq});var nS=Fr(zs=>{"use strict";var dq=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]})),Aq=zs&&zs.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),fq=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"&&dq(r,t,n[o]);return Aq(r,t),r}})(),pq=zs&&zs.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(zs,"__esModule",{value:!0});var Fp=fq(require("path")),Gu=pq(iD());function sD(e,t){return t?e&&e.match?e.match(t)!==null:!1:!0}function tS(e){let t=e.split(Fp.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(Fp.sep)}function rS(e){if(process.platform==="darwin"){let t=e.indexOf(".app/");if(t>=0)return Fp.basename(e.substring(0,t))}return Fp.basename(e)}var Yl={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",Gu.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=Gu.default.stripLine(s.toString(),1),c=Gu.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?sD(h[4],e.name):!!h[0]).map(h=>{let A=String(h[4]),d=tS(A);return{pid:parseInt(h[0],10),ppid:parseInt(h[1],10),uid:parseInt(h[2],10),gid:parseInt(h[3],10),name:rS(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=Gu.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=Gu.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:sD(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)=>{Gu.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=Gu.default.stripLine(s.toString(),1),c=Gu.default.extractColumns(u,[0,3],4).filter(h=>h[0]&&e.pid!==void 0?h[0]===String(e.pid):h[1]&&e.name?sD(h[1],e.name):!!h[0]).map(h=>{let A=String(h[1]),d=tS(A);return{pid:parseInt(h[0],10),ppid:0,name:rS(d),bin:d,cmd:h[1]}});e.config.strict&&e.name&&(c=c.filter(h=>h.name===e.name)),t(c)}})})}};Yl.linux=Yl.darwin;Yl.sunos=Yl.darwin;Yl.freebsd=Yl.darwin;function gq(e){let t=process.platform,r=Yl[t];return r?r(e):Promise.reject(new Error(`Platform "${t}" is not supported`))}zs.default=gq});var oS=Fr(lA=>{"use strict";var uD=lA&&lA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(lA,"__esModule",{value:!0});var mq=uD(eS()),iS=uD(nS()),Eq=uD(oD()),aD={port(e,t){return(0,mq.default)(e).then(r=>aD.pid(r,t),()=>[])},pid(e,t){return(0,iS.default)({pid:e,config:t})},name(e,t){return(0,iS.default)({name:e,config:t,skipSelf:!0})}};function yq(e,t,r){let n=Object.assign({logLevel:"warn",strict:typeof r=="boolean"?r:!1},typeof r=="object"?r:{});return n.logLevel&&Eq.default.setLevel(n.logLevel),new Promise((o,s)=>{if(!(e in aD))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")):aD[e](t,n).then(o,s)}})}lA.default=yq});var aS=Fr(sS=>{"use strict";Object.defineProperty(sS,"__esModule",{value:!0})});var uS=Fr(Ws=>{"use strict";var Dq=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]})),Cq=Ws&&Ws.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Dq(t,e,r)},bq=Ws&&Ws.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ws,"__esModule",{value:!0});Ws.default=void 0;var wq=oS();Object.defineProperty(Ws,"default",{enumerable:!0,get:function(){return bq(wq).default}});Cq(aS(),Ws)});function cS(){let e=0;(0,Ao.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,Ao.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e++,(0,Ao.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function lD(){let e=0;(0,Ao.existsSync)(Vi.REFERENCE_COUNT_FILE)&&(e=parseInt((0,Ao.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0),e=Math.max(0,e-1),(0,Ao.writeFileSync)(Vi.REFERENCE_COUNT_FILE,e.toString())}function hS(){return(0,Ao.existsSync)(Vi.REFERENCE_COUNT_FILE)&&parseInt((0,Ao.readFileSync)(Vi.REFERENCE_COUNT_FILE,"utf-8"))||0}function Jl(){if(!(0,Ao.existsSync)(Vi.PID_FILE))return!1;let e;try{let t=(0,Ao.readFileSync)(Vi.PID_FILE,"utf-8");if(e=parseInt(t,10),isNaN(e))return tu(),!1}catch{return!1}try{if(process.platform==="win32"){let t=`tasklist /FI "PID eq ${e}"`;return(0,lS.execSync)(t,{stdio:"pipe"}).toString().includes(e.toString())?!0:(tu(),!1)}else return process.kill(e,0),!0}catch{return tu(),!1}}function tu(){if((0,Ao.existsSync)(Vi.PID_FILE))try{require("fs").unlinkSync(Vi.PID_FILE)}catch{}}function dS(){if(!(0,Ao.existsSync)(Vi.PID_FILE))return null;try{let e=parseInt((0,Ao.readFileSync)(Vi.PID_FILE,"utf-8"));return isNaN(e)?null:e}catch{return null}}async function kp(){let e=dS(),t=await Jl(),n=(await Bo()).PORT||3456;return{running:t,pid:e,port:n,endpoint:`http://127.0.0.1:${n}`,pidFile:Vi.PID_FILE,referenceCount:hS()}}async function AS(){if(hS()===0){let t=dS();if(t&&await Jl())try{process.kill(t,"SIGTERM")}catch{}}}var Ao,Vi,Bq,lS,cA=c0(()=>{"use strict";Ao=require("fs"),Vi=Zr(us());Vu();Bq=Zr(uS()),lS=require("child_process")});var CS={};N1(CS,{backupConfigFile:()=>yS,getSettingsPath:()=>fD,initConfig:()=>Iq,initDir:()=>ES,readConfigFile:()=>Bo,restartService:()=>AD,run:()=>dD,writeConfigFile:()=>DS});var Oo,fS,Yu,pS,gS,li,mS,ch,hD,cD,hA,ES,Bo,yS,DS,Iq,dD,AD,fD,Vu=c0(()=>{"use strict";Oo=Zr(require("node:fs/promises")),fS=Zr(p0()),Yu=Zr(require("node:path")),pS=require("node:crypto"),gS=Zr(require("node:os")),li=Zr(us()),mS=Zr(j_()),ch=require("fs");Y_();rD();hD=require("child_process");cA();cD=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(cD);if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e))t[r]=cD(n);return t}return e},hA=async e=>{try{await Oo.default.access(e)}catch{await Oo.default.mkdir(e,{recursive:!0})}},ES=async()=>{await hA(li.HOME_DIR),await hA(li.PLUGINS_DIR),await hA(li.PRESETS_DIR),await hA(Yu.default.join(li.HOME_DIR,"logs"))},Bo=async()=>{try{let e=await Oo.default.readFile(li.CONFIG_FILE,"utf-8");try{let t=fS.default.parse(e);return cD(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 ES();let t=await yS();t&&console.log(`Backed up existing configuration file to ${t}`);let r={PORT:3456,Providers:[],Router:{}};return await DS(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)}},yS=async()=>{try{if(await Oo.default.access(li.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=`${li.CONFIG_FILE}.${e}.bak`;await Oo.default.copyFile(li.CONFIG_FILE,t);try{let r=Yu.default.dirname(li.CONFIG_FILE),n=Yu.default.basename(li.CONFIG_FILE),s=(await Oo.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=Yu.default.join(r,s[i]);await Oo.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},DS=async e=>{await hA(li.HOME_DIR);let t=`${JSON.stringify(e,null,2)}`;await Oo.default.writeFile(li.CONFIG_FILE,t)},Iq=async()=>{let e=await Bo();return Object.assign(process.env,e),e},dD=async(e=[])=>{if(Jl()){console.log("claude-code-router server is running");return}let r=await(0,mS.getServer)(),n=r.app;(0,ch.writeFileSync)(li.PID_FILE,process.pid.toString()),n.post("/api/update/perform",async()=>await V_()),n.get("/api/update/check",async()=>await G_(xp)),n.post("/api/restart",async()=>(setTimeout(async()=>{(0,hD.spawn)("ccr",["restart"],{detached:!0,stdio:"ignore"}).unref()},100),{success:!0,message:"Service restart initiated"})),await r.start()},AD=async()=>{try{let r=parseInt((0,ch.readFileSync)(li.PID_FILE,"utf-8"));if(process.kill(r),tu(),(0,ch.existsSync)(li.REFERENCE_COUNT_FILE))try{await Oo.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."),tu()}console.log("Starting claude code router service...");let e=Yu.default.join(__dirname,"cli.js"),t=(0,hD.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.")},fD=async e=>{let t=(0,pS.createHash)("sha256").update(e,"utf-8").digest("hex"),r=Yu.default.join(gS.default.tmpdir(),"claude-code-router"),n=`ccr-settings-${t}.json`,o=Yu.default.join(r,n);try{await Oo.default.access(r)}catch{await Oo.default.mkdir(r,{recursive:!0})}try{return await Oo.default.access(o),o}catch{return await Oo.default.writeFile(o,e,"utf-8"),o}}});var AA=Fr((Yre,_S)=>{var _q=require("node:tty"),Sq=_q?.WriteStream?.prototype?.hasColors?.()??!1,Cn=(e,t)=>{if(!Sq)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}},En={};En.reset=Cn(0,0);En.bold=Cn(1,22);En.dim=Cn(2,22);En.italic=Cn(3,23);En.underline=Cn(4,24);En.overline=Cn(53,55);En.inverse=Cn(7,27);En.hidden=Cn(8,28);En.strikethrough=Cn(9,29);En.black=Cn(30,39);En.red=Cn(31,39);En.green=Cn(32,39);En.yellow=Cn(33,39);En.blue=Cn(34,39);En.magenta=Cn(35,39);En.cyan=Cn(36,39);En.white=Cn(37,39);En.gray=Cn(90,39);En.bgBlack=Cn(40,49);En.bgRed=Cn(41,49);En.bgGreen=Cn(42,49);En.bgYellow=Cn(43,49);En.bgBlue=Cn(44,49);En.bgMagenta=Cn(45,49);En.bgCyan=Cn(46,49);En.bgWhite=Cn(47,49);En.bgGray=Cn(100,49);En.redBright=Cn(91,39);En.greenBright=Cn(92,39);En.yellowBright=Cn(93,39);En.blueBright=Cn(94,39);En.magentaBright=Cn(95,39);En.cyanBright=Cn(96,39);En.whiteBright=Cn(97,39);En.bgRedBright=Cn(101,49);En.bgGreenBright=Cn(102,49);En.bgYellowBright=Cn(103,49);En.bgBlueBright=Cn(104,49);En.bgMagentaBright=Cn(105,49);En.bgCyanBright=Cn(106,49);En.bgWhiteBright=Cn(107,49);_S.exports=En});var NS=Fr((dne,QS)=>{"use strict";QS.exports=Lq;function Oq(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 Lq(e){let t=Oq(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 LS=Fr((Ane,OS)=>{"use strict";OS.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 Up=Fr((fne,PS)=>{"use strict";var Pq=LS();PS.exports=e=>typeof e=="string"?e.replace(Pq(),""):e});var US=Fr((pne,yD)=>{"use strict";var MS=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);yD.exports=MS;yD.exports.default=MS});var $S=Fr((gne,jS)=>{"use strict";jS.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 qS=Fr((mne,DD)=>{"use strict";var Mq=Up(),Uq=US(),jq=$S(),HS=e=>{if(typeof e!="string"||e.length===0||(e=Mq(e),e.length===0))return 0;e=e.replace(jq()," ");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+=Uq(n)?2:1)}return t};DD.exports=HS;DD.exports.default=HS});var VS=Fr((Ene,GS)=>{"use strict";GS.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 CD=Fr((yne,JS)=>{var fA=VS(),YS={};for(let e of Object.keys(fA))YS[fA[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"]}};JS.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 $q(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=YS[e];if(t)return t;let r=1/0,n;for(let o of Object.keys(fA)){let s=fA[o],i=$q(e,s);i<r&&(r=i,n=o)}return n};Gr.keyword.rgb=function(e){return fA[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 WS=Fr((Dne,zS)=>{var jp=CD();function Hq(){let e={},t=Object.keys(jp);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function qq(e){let t=Hq(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),o=Object.keys(jp[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 Gq(e,t){return function(r){return t(e(r))}}function Vq(e,t){let r=[t[e].parent,e],n=jp[t[e].parent][e],o=t[e].parent;for(;t[o].parent;)r.unshift(t[o].parent),n=Gq(jp[t[o].parent][o],n),o=t[o].parent;return n.conversion=r,n}zS.exports=function(e){let t=qq(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]=Vq(i,t))}return r}});var ZS=Fr((Cne,KS)=>{var bD=CD(),Yq=WS(),Ah={},Jq=Object.keys(bD);function zq(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 Wq(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}Jq.forEach(e=>{Ah[e]={},Object.defineProperty(Ah[e],"channels",{value:bD[e].channels}),Object.defineProperty(Ah[e],"labels",{value:bD[e].labels});let t=Yq(e);Object.keys(t).forEach(n=>{let o=t[n];Ah[e][n]=Wq(o),Ah[e][n].raw=zq(o)})});KS.exports=Ah});var iF=Fr((bne,nF)=>{"use strict";var XS=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,eF=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},tF=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},$p=e=>e,rF=(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})},wD,ph=(e,t,r,n)=>{wD===void 0&&(wD=ZS());let o=n?10:0,s={};for(let[i,a]of Object.entries(wD)){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 Kq(){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(XS,"ansi16",$p,!1)),fh(t.color,"ansi256",()=>ph(eF,"ansi256",$p,!1)),fh(t.color,"ansi16m",()=>ph(tF,"rgb",rF,!1)),fh(t.bgColor,"ansi",()=>ph(XS,"ansi16",$p,!0)),fh(t.bgColor,"ansi256",()=>ph(eF,"ansi256",$p,!0)),fh(t.bgColor,"ansi16m",()=>ph(tF,"rgb",rF,!0)),t}Object.defineProperty(nF,"exports",{enumerable:!0,get:Kq})});var aF=Fr((wne,sF)=>{"use strict";var pA=qS(),Zq=Up(),Xq=iF(),ID=new Set(["\x1B","\x9B"]),eG=39,oF=e=>`${ID.values().next().value}[${e}m`,tG=e=>e.split(" ").map(t=>pA(t)),BD=(e,t,r)=>{let n=[...t],o=!1,s=pA(Zq(e[e.length-1]));for(let[i,a]of n.entries()){let u=pA(a);if(s+u<=r?e[e.length-1]+=a:(e.push(a),s=0),ID.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())},rG=e=>{let t=e.split(" "),r=t.length;for(;r>0&&!(pA(t[r-1])>0);)r--;return r===t.length?e:t.slice(0,r).join(" ")+t.slice(r).join("")},nG=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let n="",o="",s,i=tG(e),a=[""];for(let[u,l]of e.split(" ").entries()){r.trim!==!1&&(a[a.length-1]=a[a.length-1].trimLeft());let c=pA(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(""),BD(a,l,t);continue}if(c+i[u]>t&&c>0&&i[u]>0){if(r.wordWrap===!1&&c<t){BD(a,l,t);continue}a.push("")}if(c+i[u]>t&&r.wordWrap===!1){BD(a,l,t);continue}a[a.length-1]+=l}r.trim!==!1&&(a=a.map(rG)),n=a.join(`
|
|
1246
1246
|
`);for(let[u,l]of[...n].entries()){if(o+=l,ID.has(l)){let h=parseFloat(/\d[^m]*/.exec(n.slice(u,u+4)));s=h===eG?null:h}let c=Xq.codes.get(Number(s));s&&c&&(n[u+1]===`
|
|
@@ -1272,7 +1272,7 @@ ${b}${B}${S}${x}${BF.default.cursorHide}`});var Z2=require("node:async_hooks"),X
|
|
|
1272
1272
|
${s.style.help("(Use arrow keys to reveal more choices)")}`:E=s.style.help("(Use arrow keys)"));let y=mA({items:c,active:d,renderItem({item:w,isActive:v}){if(ms.isSeparator(w))return` ${w.separator}`;if(w.disabled){let B=typeof w.disabled=="string"?w.disabled:"(disabled)";return s.style.disabled(`${w.name} ${B}`)}let b=v?s.style.highlight:B=>B,I=v?s.icon.cursor:" ";return b(`${I} ${w.name}`)},pageSize:n,loop:r});if(a==="done")return`${i} ${m} ${s.style.answer(p.short)}`;let D=p.description?`
|
|
1273
1273
|
${s.style.description(p.description)}`:"";return`${[i,m,E].filter(Boolean).join(" ")}
|
|
1274
1274
|
${y}${C}${D}${nk.default.cursorHide}`});var hn="\x1B[0m",ik="\x1B[2m",ak="\x1B[1m\x1B[32m",rV="\x1B[36m",vo="\x1B[1m\x1B[36m",FA="\x1B[32m",Ag="\x1B[33m",ki="\x1B[1m\x1B[33m",nV=["anthropic","deepseek","gemini","openrouter","groq","maxtoken","tooluse","gemini-cli","reasoning","sampling","enhancetool","cleancache","vertex-gemini","chutes-glm","qwen-cli","rovo-cli"];function uk(){let e=IC.join(process.env.HOME||process.env.USERPROFILE||"",".claude-code-router"),t=IC.join(e,"config.json");if(!xh.existsSync(t))throw new Error(`config.json not found at ${t}`);return t}function ok(){let e=uk();return JSON.parse(xh.readFileSync(e,"utf-8"))}function fg(e){let t=uk();xh.writeFileSync(t,JSON.stringify(e,null,2),"utf-8"),console.log(`${FA}\u2713 config.json updated successfully${hn}
|
|
1275
|
-
`)}function iV(e){let t=[];for(let r of e.Providers)for(let n of r.models)t.push({name:`${vo}${r.name}${hn} \u2192 ${rV} ${n}`,value:`${r.name},${n}`,description:`
|
|
1275
|
+
`)}function iV(e){let t=[];for(let r of e.Providers)if(r.enabled!==!1)for(let n of r.models)t.push({name:`${vo}${r.name}${hn} \u2192 ${rV} ${n}`,value:`${r.name},${n}`,description:`
|
|
1276
1276
|
${vo}Provider:${hn} ${r.name}`,provider:r.name,model:n});return t}function sk(e){console.log(`
|
|
1277
1277
|
${vo}\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550${hn}`),console.log(`${vo} Current Configuration${hn}`),console.log(`${vo}\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550${hn}
|
|
1278
1278
|
`);let t=r=>{if(!r||typeof r=="number")return`${ik}Not configured${hn}`;let[n,o]=r.split(",");return`${Ag}${n}${hn} | ${o}
|