@wengine-ai/llms 2.3.2419 → 2.3.2421

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.
@@ -1,55 +1,55 @@
1
- "use strict";var Il=Object.create;var bn=Object.defineProperty;var Ml=Object.getOwnPropertyDescriptor;var Ll=Object.getOwnPropertyNames;var Nl=Object.getPrototypeOf,$l=Object.prototype.hasOwnProperty;var w=(n,e)=>()=>(n&&(e=n(n=0)),e);var _n=(n,e)=>{for(var t in e)bn(n,t,{get:e[t],enumerable:!0})},Js=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ll(e))!$l.call(n,r)&&r!==t&&bn(n,r,{get:()=>e[r],enumerable:!(o=Ml(e,r))||o.enumerable});return n};var q=(n,e,t)=>(t=n!=null?Il(Nl(n)):{},Js(e||!n||!n.__esModule?bn(t,"default",{value:n,enumerable:!0}):t,n)),Ws=n=>Js(bn({},"__esModule",{value:!0}),n);function Fl(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(Dl.test(e))return{ok:!0};try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?{ok:!1,error:`Unsupported proxy protocol: ${t.protocol}. Only http:// and https:// are allowed.`}:{ok:!0}}catch{return{ok:!1,error:`Invalid proxy URL: ${e}`}}}function Vs(n){let e=[];for(let t of[...Ks,Gs]){let o=n[t];if(o==null)continue;let r=Fl(o);r.ok||e.push({key:t,error:r.error})}return e}function Qo(){return Vo||(Vo=new Tn.Agent({connect:{timeout:15e3}})),Vo}function Qs(n){let e=n.get(Gs);return(typeof e=="string"?e.trim():"")||void 0}function Ys(n){return n?Y(n):Qo()}function wt(n){for(let e of Ks){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function Yo(n){if(n==null||n==="")return!0;if(typeof n=="string"){let e=n.trim().toLowerCase();return e==="false"||e==="0"?!1:e==="true"||e==="1"?!0:!!e}return n===!1||n===0?!1:n===!0||n===1?!0:!!n}function ge(n,e){let t=wt(n);if(t)return Yo(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function Y(n){let e=Ul(n),t=kn.get(e);if(t)return t;let o=new Tn.ProxyAgent(e);return kn.set(e,o),o}async function vn(){let n=Array.from(kn.values());kn.clear(),await Promise.allSettled(n.map(e=>e.close()))}function Ul(n){let e=n.trim();if(!e)throw new TypeError("Proxy URL must not be empty");let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")throw new TypeError(`Unsupported proxy protocol: ${t.protocol}`);return t.toString()}var Tn,Ks,Gs,Dl,kn,Vo,ae=w(()=>{"use strict";Tn=require("undici"),Ks=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],Gs="SUBSCRIPTION_PROXY_URL",Dl=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;kn=new Map});var Pt,Xo,Xs,Zs,je,Zo=w(()=>{"use strict";Pt=require("fs"),Xo=require("path"),Xs=require("dotenv"),Zs=q(require("json5"),1);ae();je=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,Xo.join)(process.cwd(),this.options.jsonPath);if((0,Pt.existsSync)(e))try{let t=(0,Pt.readFileSync)(e,"utf-8"),o=Zs.default.parse(t);this.config={...this.config,...o},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,Xo.join)(process.cwd(),this.options.envPath);if((0,Pt.existsSync)(e))try{let t=(0,Xs.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 o=this.config[e];return o!==void 0?o:t}getAll(){return{...this.config}}getHttpsProxy(){return wt(this)}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 W(n,e=500,t="internal_error",o="api_error"){let r=new Error(n);return r.statusCode=e,r.code=t,r.type=o,r}async function qs(n,e,t){e.log.error(n);let o=n.statusCode||500;if(n.rawBody)try{let s=JSON.parse(n.rawBody);return t.code(o).send(s)}catch{return t.code(o).send(n.rawBody)}let r={error:{message:n.message||"Internal Server Error",type:n.type||"api_error",code:n.code||"internal_error"}};return t.code(o).send(r)}var xn=w(()=>{"use strict"});function Sn(n){qo=n}function Et(){return qo}function Cn(n){return qo||n.get("DEBUG_LOG")===!0}function ni(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Ze:{maxBodyLength:e.maxBodyLength??Ze.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Ze.maxStreamChunks}}function Rn(n){let e={};for(let[t,o]of Object.entries(n)){let r=t.toLowerCase();jl.has(r)||Hl.test(r)&&!/^(?:x-|anthropic-)?ratelimit-/.test(r)?e[t]="***MASKED***":e[t]=o}return e}function wn(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function oi(n,e,t){let o=typeof t.body=="string"?t.body:JSON.stringify(t.body);n.info({debug_log:!0,reqId:e,phase:"provider_request",url:t.url,headers:Rn(t.headers),body:wn(o,Ze.maxBodyLength)})}function ri(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:Rn(t.headers),...t.body!==void 0?{body:wn(t.body,Ze.maxBodyLength)}:{}})}function ei(n,e,t,o){let r=zl(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:wn(o,Ze.maxBodyLength)})}function zl(n){let e=[];for(let t of n.split(/\r?\n/)){if(!t.startsWith("data:"))continue;let o=t.slice(5).trim();if(!(!o||o==="[DONE]"))try{let r=JSON.parse(o),s=r?.usage||r?.response?.usage;s&&e.push({path:r?.usage?"usage":"response.usage",usage:s,choicesLength:Array.isArray(r?.choices)?r.choices.length:void 0,finishReason:r?.choices?.[0]?.finish_reason})}catch{e.push({parseError:!0,data:wn(o,512)})}}if(e.length)return e.length===1?e[0]:e}function ti(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function si(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let a="";for(;;){let{done:i,value:c}=await r.read();if(i)break;a+=c;let l=a.split(`
1
+ "use strict";var Il=Object.create;var _n=Object.defineProperty;var Ml=Object.getOwnPropertyDescriptor;var Ll=Object.getOwnPropertyNames;var Nl=Object.getPrototypeOf,$l=Object.prototype.hasOwnProperty;var R=(n,e)=>()=>(n&&(e=n(n=0)),e);var bn=(n,e)=>{for(var t in e)_n(n,t,{get:e[t],enumerable:!0})},Js=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ll(e))!$l.call(n,r)&&r!==t&&_n(n,r,{get:()=>e[r],enumerable:!(o=Ml(e,r))||o.enumerable});return n};var q=(n,e,t)=>(t=n!=null?Il(Nl(n)):{},Js(e||!n||!n.__esModule?_n(t,"default",{value:n,enumerable:!0}):t,n)),Ws=n=>Js(_n({},"__esModule",{value:!0}),n);function Fl(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(Dl.test(e))return{ok:!0};try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?{ok:!1,error:`Unsupported proxy protocol: ${t.protocol}. Only http:// and https:// are allowed.`}:{ok:!0}}catch{return{ok:!1,error:`Invalid proxy URL: ${e}`}}}function Vs(n){let e=[];for(let t of[...Ks,Gs]){let o=n[t];if(o==null)continue;let r=Fl(o);r.ok||e.push({key:t,error:r.error})}return e}function Qo(){return Vo||(Vo=new Tn.Agent({connect:{timeout:15e3}})),Vo}function Qs(n){let e=n.get(Gs);return(typeof e=="string"?e.trim():"")||void 0}function Ys(n){return n?Y(n):Qo()}function wt(n){for(let e of Ks){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function Yo(n){if(n==null||n==="")return!0;if(typeof n=="string"){let e=n.trim().toLowerCase();return e==="false"||e==="0"?!1:e==="true"||e==="1"?!0:!!e}return n===!1||n===0?!1:n===!0||n===1?!0:!!n}function ge(n,e){let t=wt(n);if(t)return Yo(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function Y(n){let e=Ul(n),t=kn.get(e);if(t)return t;let o=new Tn.ProxyAgent(e);return kn.set(e,o),o}async function vn(){let n=Array.from(kn.values());kn.clear(),await Promise.allSettled(n.map(e=>e.close()))}function Ul(n){let e=n.trim();if(!e)throw new TypeError("Proxy URL must not be empty");let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")throw new TypeError(`Unsupported proxy protocol: ${t.protocol}`);return t.toString()}var Tn,Ks,Gs,Dl,kn,Vo,ae=R(()=>{"use strict";Tn=require("undici"),Ks=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],Gs="SUBSCRIPTION_PROXY_URL",Dl=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;kn=new Map});var Pt,Xo,Xs,Zs,je,Zo=R(()=>{"use strict";Pt=require("fs"),Xo=require("path"),Xs=require("dotenv"),Zs=q(require("json5"),1);ae();je=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,Xo.join)(process.cwd(),this.options.jsonPath);if((0,Pt.existsSync)(e))try{let t=(0,Pt.readFileSync)(e,"utf-8"),o=Zs.default.parse(t);this.config={...this.config,...o},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,Xo.join)(process.cwd(),this.options.envPath);if((0,Pt.existsSync)(e))try{let t=(0,Xs.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 o=this.config[e];return o!==void 0?o:t}getAll(){return{...this.config}}getHttpsProxy(){return wt(this)}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 K(n,e=500,t="internal_error",o="api_error"){let r=new Error(n);return r.statusCode=e,r.code=t,r.type=o,r}async function qs(n,e,t){e.log.error(n);let o=n.statusCode||500;if(n.rawBody)try{let s=JSON.parse(n.rawBody);return t.code(o).send(s)}catch{return t.code(o).send(n.rawBody)}let r={error:{message:n.message||"Internal Server Error",type:n.type||"api_error",code:n.code||"internal_error"}};return t.code(o).send(r)}var xn=R(()=>{"use strict"});function Sn(n){qo=n}function Et(){return qo}function Cn(n){return qo||n.get("DEBUG_LOG")===!0}function ni(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?qe:{maxBodyLength:e.maxBodyLength??qe.maxBodyLength,maxStreamChunks:e.maxStreamChunks??qe.maxStreamChunks}}function Rn(n){let e={};for(let[t,o]of Object.entries(n)){let r=t.toLowerCase();jl.has(r)||Hl.test(r)&&!/^(?:x-|anthropic-)?ratelimit-/.test(r)?e[t]="***MASKED***":e[t]=o}return e}function wn(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function oi(n,e,t){let o=typeof t.body=="string"?t.body:JSON.stringify(t.body);n.info({debug_log:!0,reqId:e,phase:"provider_request",url:t.url,headers:Rn(t.headers),body:wn(o,qe.maxBodyLength)})}function ri(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:Rn(t.headers),...t.body!==void 0?{body:wn(t.body,qe.maxBodyLength)}:{}})}function ei(n,e,t,o){let r=zl(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:wn(o,qe.maxBodyLength)})}function zl(n){let e=[];for(let t of n.split(/\r?\n/)){if(!t.startsWith("data:"))continue;let o=t.slice(5).trim();if(!(!o||o==="[DONE]"))try{let r=JSON.parse(o),s=r?.usage||r?.response?.usage;s&&e.push({path:r?.usage?"usage":"response.usage",usage:s,choicesLength:Array.isArray(r?.choices)?r.choices.length:void 0,finishReason:r?.choices?.[0]?.finish_reason})}catch{e.push({parseError:!0,data:wn(o,512)})}}if(e.length)return e.length===1?e[0]:e}function ti(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function si(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let a="";for(;;){let{done:i,value:c}=await r.read();if(i)break;a+=c;let l=a.split(`
2
2
 
3
- `);a=l.pop()||"";for(let u of l)u.trim()&&(s<o.maxStreamChunks?ei(e,t,s,u):s===o.maxStreamChunks&&e.info({debug_log:!0,reqId:t,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${o.maxStreamChunks}]`}),s++)}a.trim()&&(s<o.maxStreamChunks&&ei(e,t,s,a.trim()),s++),ti(e,t,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,a),ti(e,t,s)}finally{r.releaseLock()}})()}var jl,Hl,Ze,qo,At=w(()=>{"use strict";jl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Hl=/token|secret|credential|passwd|password/i,Ze={maxBodyLength:4096,maxStreamChunks:100},qo=!1});function ii(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([l,u])=>{u&&s.set(l,u)});let a,i=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let l=new AbortController,u=()=>l.abort();t.signal.addEventListener("abort",u),i.addEventListener("abort",u),a=l.signal}else a=i;let c={method:"POST",headers:s,body:JSON.stringify(e),signal:a,...t.redirect?{redirect:t.redirect}:{}};return t.dispatcher?c.dispatcher=t.dispatcher:t.httpsProxy&&(c.dispatcher=Y(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:Rn(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:Bl(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),c)}function Bl(n){if(!(typeof n!="string"||!n.trim()))try{let e=new URL(n);return e.username||e.password?(e.username="",e.password="",`${e.toString()} (credentials redacted)`):e.toString()}catch{return"[invalid proxy URL]"}}var ai=w(()=>{ae();At()});function Wl(n){return n.includes('"delta"')?/"delta"\s*:\s*\{[^}]*"(content|tool_calls|reasoning_content|reasoning|function_call)"\s*:\s*("|\[|\{)/.test(n):!1}function ci(n){return/"type"\s*:\s*"response\.[A-Za-z0-9_.]+"/.test(n)||/(^|\n)\s*(event:\s*)?response\.[A-Za-z0-9_.]+/.test(n)}function er(n){if(ci(n))return"pending";let e=!1,t=!1;for(let o of n.split(`
4
- `)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(Jl.some(s=>r.includes(s))){e=!0;break}Kl.some(s=>r.includes(s))&&(t=!0)}}return e||Wl(n)?"content":t?"empty":"pending"}async function li(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],a="",i=0,c=Date.now()+t,l=(u,p)=>({verdict:u,chunks:s,bytes:i,rest:p});try{for(;;){let u=c-Date.now(),p=Symbol("timeout"),d,m=o.read(),h=u<=0?p:await Promise.race([m,new Promise(g=>{d=setTimeout(()=>g(p),u)})]);if(d&&clearTimeout(d),h===p)return l(er(a)==="content"?"content":"pending",Pn(o,m));if(h.done){a+=r.decode();let g=er(a);return l(g==="empty"?"empty":"pending",null)}if(!h.value)continue;s.push(h.value),i+=h.value.byteLength,a+=r.decode(h.value,{stream:!0});let f=er(a);if(f==="content")return l("content",Pn(o));if(f==="empty")return await o.cancel().catch(()=>{}),l("empty",null);if(ci(a)||i>=e)return l("pending",Pn(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function Pn(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:a,value:i})=>{a?t.close():(t.enqueue(i),r())}).catch(a=>t.error(a))};r()},cancel(t){return n.cancel(t)}})}function ui(n,e){let t=e?.getReader();return new ReadableStream({start(o){for(let s of n)o.enqueue(s);if(!t){o.close();return}let r=()=>{t.read().then(({done:s,value:a})=>{s?o.close():(o.enqueue(a),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var Jl,Kl,di=w(()=>{"use strict";Jl=["content_block_start","content_block_delta","content_block_stop"];Kl=["message_stop","response.completed","response.incomplete","[DONE]"]});function Gl(n,e){return`${n.name}|${e?.name??""}`}function tr(n){return n.__ccrPluginRequestState??={budgets:new Map}}function qe(n,e,t){let o=tr(n),r=Gl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function nr(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(qe(n,e,o).terminalError=t,!0)}var pi=w(()=>{"use strict"});var or=w(()=>{"use strict"});function mi(n,e){let t=new Error(e.message);return t.code=e.code,t.statusCode=e.httpStatus,e.cooldownMs&&(t.cooldownMs=e.cooldownMs),e.validationUrl&&(t.validationUrl=e.validationUrl),t.plugin=n,t.nonRetryable=!e.retryable,t.pluginClassified=!0,t}var fi,Ot,Vl,sr,En=w(()=>{"use strict";fi=q(require("fastify"),1);or();Ot=class{plugins=new Map;transformerServices=new Set;disposed=!1;revision=0;attachTransformerService(e){this.assertOpen();let t=[...this.plugins.values()].flatMap(r=>[...r.transformers].map(([s,a])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(a)]})),o=[];try{for(let[r,s]of t)o.push(r),e.registerTransformer(r,s);this.transformerServices.add(e)}catch(r){for(let s of o)e.removeTransformer(s);throw r}}beginActivation(e,t,o,r){if(this.assertOpen(),this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);let s={manifest:{...e},directory:r,runtimes:new Map,transformers:new Map,protectors:[],routes:[],preparedRoutes:[]},a="staging",i,c=u=>{try{if(this.assertOpen(),a!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw i=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>c(()=>{let p=typeof u.TransformerName=="string"?u.TransformerName:new u().name;if(typeof p!="string"||!p)throw new Error("plugin transformer has no name");if(s.transformers.has(p))throw new Error(`transformer "${p}" is already registered`);s.transformers.set(p,u)}),registerManagedRuntime:u=>c(()=>{if(!u.name||typeof u.isManaged!="function"||typeof u.signRequest!="function")throw new Error("invalid managed runtime");if(s.runtimes.has(u.name))throw new Error(`managed runtime "${u.name}" is already registered`);s.runtimes.set(u.name,u)}),registerAdminRoutes:u=>c(()=>{s.routes.push(u)}),registerConfigProtector:u=>c(()=>{s.protectors.push(u)}),registerUiCard:u=>c(()=>{if(s.cardPath)throw new Error("plugin card is already registered");if(!/^[A-Za-z0-9][A-Za-z0-9._-]*\.js$/.test(u.cardPath))throw new Error("card must be a single JavaScript file");s.cardPath=u.cardPath}),registerLocales:u=>c(()=>{s.locales=u})},commit:async(u,p)=>{this.assertOpen();let d=this.revision;if(s.routes.length){if(!p)throw new Error("plugin admin routes require a host app");s.preparedRoutes=await this.prepareRoutes(s.routes,p)}if(this.assertOpen(),this.revision!==d)throw new Error("plugin registry changed during activation; retry activation");if(a!=="staging")throw new Error("plugin activation is no longer open");if(i)throw i;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let f of this.plugins.values()){for(let g of s.runtimes.keys())if(f.runtimes.has(g))throw new Error(`managed runtime "${g}" is already registered`);for(let g of s.transformers.keys())if(f.transformers.has(g))throw new Error(`transformer "${g}" is already registered`)}let m=[...this.transformerServices].flatMap(f=>[...s.transformers].map(([g,y])=>{if(f.hasTransformer(g))throw new Error(`transformer "${g}" is already registered`);return{service:f,name:g,value:f.preparePluginTransformer(y)}})),h=[];try{for(let f of m)h.push(f),f.service.registerTransformer(f.name,f.value);s.card=u,this.plugins.set(e.name,s),this.revision++,a="committed"}catch(f){for(let g of h)g.service.removeTransformer(g.name);throw a="aborted",f}},get cardPath(){return s.cardPath},abort:()=>{a="aborted"}}}getManagedRuntimeFor(e){for(let t of this.plugins.values())for(let o of t.runtimes.values())try{if(o.isManaged(e))return o}catch{}}getRegisteredRuntimes(){return[...this.plugins.values()].flatMap(e=>[...e.runtimes.values()])}applyConfigProtectors(e,t){for(let o of this.plugins.values())for(let r of o.protectors)r(e,t)}listLoadedPlugins(){return[...this.plugins.values()].map(e=>({name:e.manifest.name,version:e.manifest.version,enabled:!0,...e.card?{cardUrl:`/plugins/${e.manifest.name}/${e.cardPath}`}:{},...e.locales?{locales:e.locales}:{}}))}getPublicCard(e,t){let o=this.plugins.get(e);return o?.cardPath===t&&o.card?Buffer.from(o.card):void 0}async prepareRoutes(e,t){let o=new Set(["get","post","put","patch","delete","head","options","all"]),r=[],s=new Proxy(t,{get:(i,c)=>{if(c==="route")return u=>(r.push(u),s);if(o.has(String(c)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:c==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(c).toUpperCase(),url:u,handler:d??p}),s);let l=Reflect.get(i,c);return typeof l=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(c)}`)}:l}}),a=(0,fi.default)({logger:!1});try{for(let i of e){let c=i(s);c!==s&&await c}for(let i of this.plugins.values())for(let c of i.preparedRoutes)a.route(c);for(let i of r){let c=Array.isArray(i.method)?i.method:[i.method];for(let l of c)if(t.hasRoute({method:l,url:i.url,constraints:i.constraints}))throw new Error(`plugin route ${l} ${i.url} is already registered`);a.route(i)}return await a.ready(),r}finally{await a.close()}}async registerAllRoutes(e){this.assertOpen();for(let t of this.plugins.values())for(let o of t.preparedRoutes)e.route(o)}dispose(){if(!this.disposed){for(let e of this.transformerServices)for(let t of this.plugins.values())for(let o of t.transformers.keys())e.removeTransformer(o);this.plugins.clear(),this.transformerServices.clear(),this.disposed=!0}}assertOpen(){if(this.disposed)throw new Error("plugin host is disposed")}},Vl=new Ot,sr=()=>Vl});async function He(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let a=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",i=s?{...s,code:a,message:`Provider plugin request failed (${a}).`}:{code:a,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(i)}catch{}let c=mi(n.name,i);return c.isRateLimit=i.httpStatus===429,c.upstreamStatus=e,r?.errorName&&(c.upstreamErrorName=r.errorName),c}var gi=w(()=>{"use strict";En()});var An,ir=w(()=>{An="2.3.2418"});var hi={};_n(hi,{getFallbackPromotionStore:()=>et,resetFallbackPromotionStore:()=>Xl});function et(n){return ze||(ze=new ar,n&&ze.configure(n)),ze}function Xl(){ze&&(ze.clearAll(),ze=null)}var Yl,ar,ze,On=w(()=>{"use strict";ue();Yl=600*1e3,ar=class{promotions=new Map;enabled=!0;ttlMs=Yl;configure(e){e?.enabled!==void 0&&(this.enabled=e.enabled),e?.ttlMinutes!==void 0&&(this.ttlMs=e.ttlMinutes*60*1e3)}getKey(e,t,o){return`${e},${t}:${o}`}promote(e,t,o,r,s,a){if(!this.enabled)return;let i=this.getKey(e,t,o),c=`${r},${s}`;this.promotions.set(i,{promotedModel:c,timestamp:Date.now(),ttlMs:a??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),a=this.promotions.get(s);if(!a)return null;if(Date.now()-a.timestamp>=a.ttlMs)return this.promotions.delete(s),null;let[c,...l]=a.promotedModel.split(","),u=l.join(",");if(!j().isAvailable(c,u))return this.promotions.delete(s),null;let d=r.find(h=>h.name.toLowerCase()===c.toLowerCase()),m=d?.models?.find(h=>String(h).toLowerCase()===u.toLowerCase());return!d||!m||d.enabled===!1?(this.promotions.delete(s),null):`${d.name},${m}`}clear(e,t,o){let r=this.getKey(e,t,o);this.promotions.delete(r)}clearByPrimary(e,t){let o=`${e},${t}:`,r=0;for(let s of this.promotions.keys())s.startsWith(o)&&(this.promotions.delete(s),r++);return r}clearAll(){this.promotions.clear()}clearExpired(){let e=Date.now();for(let[t,o]of this.promotions)e-o.timestamp>=o.ttlMs&&this.promotions.delete(t)}getAllPromotions(){let e=Date.now(),t=[];for(let[o,r]of this.promotions){let s=r.ttlMs-(e-r.timestamp);s>0&&t.push({key:o,promotedModel:r.promotedModel,remainingMs:s})}return t}},ze=null});function tu(n){try{if(!(0,ke.existsSync)(ur))return;let e=JSON.parse((0,ke.readFileSync)(ur,"utf-8"));if(!Array.isArray(e))return;let t=Date.now();for(let o of e){if(!o||!o.provider||!o.model)continue;let r=o.updatedAt||o.lastFailureTime||0;r&&t-r>1440*60*1e3||n.restore({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount??0,successCount:o.successCount??0,lastFailureTime:o.lastFailureTime??0,lastProbeTime:o.lastProbeTime??0,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil})}}catch{}}function bi(n){try{let e=n.getAllStates();if(e.length===0)return;(0,ke.existsSync)(lr)||(0,ke.mkdirSync)(lr,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,ke.writeFileSync)(ur,JSON.stringify(t,null,2),"utf-8")}catch{}}function In(){if(yi)return;yi=!0;let n=j();tu(n),eu=setInterval(()=>bi(n),6e4),process.on("exit",()=>bi(n))}function j(n){return cr||(cr=new It(n)),cr}var ke,dr,_i,Zl,ql,It,lr,ur,yi,eu,cr,ue=w(()=>{"use strict";ke=require("fs"),dr=require("path"),_i=require("@wengine-ai/claude-code-router-shared"),Zl=120,ql={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},It=class{states=new Map;config;probeTimer;constructor(e){this.config={...ql,...e}}getKey(e,t){return!e||!t?null:`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);if(!r||(r.successCount++,r.rateLimitUntil&&r.rateLimitUntil>Date.now()))return;let s=!!r.rateLimitUntil;r.rateLimitUntil=void 0,r.status==="half-open"?r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o)):r.status==="open"&&(r.status="half-open",r.successCount=1,r.failureCount=0),s&&r.status==="half-open"&&r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(On(),Ws(hi));o().clearByPrimary(e,t)}catch{}}recordFailure(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(r,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=o,s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=this.config.failureThreshold&&(s.status="open",s.lastProbeTime=0)}getState(e,t){let o=this.getKey(e,t);if(o)return this.states.get(o)}isAvailable(e,t,o=!1){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let s=this.getState(e,t);return s?s.status==="open"&&s.rateLimitUntil?!(Date.now()<s.rateLimitUntil):s.status==="open"&&o&&Date.now()-Math.max(s.lastFailureTime,s.lastProbeTime)>=this.config.probeIntervalMinutes*6e4?(s.status="half-open",s.successCount=0,s.lastProbeTime=Date.now(),!0):s.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;if(!this.getKey(e,t))return 2;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&e.push(t);return e}recordProbeAttempt(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&(r.lastProbeTime=Date.now())}markParkedUntil(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s&&(!Number.isFinite(o)||o<=Date.now()||s.rateLimitUntil&&s.rateLimitUntil>=o||(s.rateLimitUntil=o))}getHalfOpenModels(){let e=[];for(let[t,o]of this.states)o.status==="half-open"&&e.push(t);return e}forceOpen(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s?(s.status="open",s.failureCount=Math.max(s.failureCount,this.config.failureThreshold),s.lastFailureTime=Date.now(),s.lastError=o,s.lastProbeTime=0):(s={provider:e,model:t,status:"open",failureCount:this.config.failureThreshold,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:o},this.states.set(r,s))}markRateLimited(e,t,o,r){if(!this.config.enabled)return;let s=this.getKey(e,t);if(!s)return;let a=this.states.get(s);a?(a.status="open",a.lastFailureTime=Date.now(),a.lastError=r||"rate-limited",a.lastProbeTime=0):(a={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,a));let i=(o??Zl)*1e3;a.rateLimitUntil=Date.now()+i}getRateLimitedModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&o.rateLimitUntil&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&r.status==="open"&&(r.lastProbeTime=Date.now())}clear(){this.states.clear()}recover(e,t){let o=this.getKey(e,t);o&&this.states.delete(o)}getAllStates(){return Array.from(this.states.values())}restore(e){let t=this.getKey(e.provider,e.model);t&&this.states.set(t,{...e})}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},lr=(0,dr.join)(_i.HOME_DIR,"runtime"),ur=(0,dr.join)(lr,"provider-health.json"),yi=!1,eu=null;cr=null});function Mt(n,e,t){let o=i=>{if(t instanceof Headers)return t.get(i);let c=Object.keys(t).find(l=>l.toLowerCase()===i);return c?t[c]:null},r=pr(o,nu),s=pr(o,ou),a=pr(o,ru);(r||s||a)&&tt.set(n,{provider:n,remaining:vi(r),limit:vi(s),reset:su(a),capturedAt:Date.now()})}function Ci(n){return tt.get(n)}function Mn(){return Array.from(tt.values())}function pr(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function vi(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function su(n){if(!n)return null;let e=n.trim();if(!e)return null;let t=Number(e);if(Number.isFinite(t))return t>1e12?Math.floor(t/1e3):t>1e9?Math.floor(t):Math.floor(Date.now()/1e3+t);let o=Date.parse(e);if(Number.isFinite(o))return Math.floor(o/1e3);let r=iu(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function iu(n){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,t=0,o=!1;for(let r of n.matchAll(e)){o=!0;let s=Number(r[1]),a=r[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":t+=s;break;case"s":t+=s*1e3;break;case"m":t+=s*60*1e3;break;case"h":t+=s*60*60*1e3;break;case"d":t+=s*24*60*60*1e3;break}}return o?t:null}function au(){try{if(!(0,Te.existsSync)(mr))return;let n=JSON.parse((0,Te.readFileSync)(mr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>3600*1e3)continue;tt.set(t.provider,t)}}catch{}}function xi(){try{if(tt.size===0)return;(0,Te.existsSync)(fr)||(0,Te.mkdirSync)(fr,{recursive:!0}),(0,Te.writeFileSync)(mr,JSON.stringify(Array.from(tt.values()),null,2),"utf-8")}catch{}}function nt(){ki||(ki=!0,au(),Ti=setInterval(xi,6e4),Ti.unref?.(),process.on("exit",xi))}var Te,gr,Si,fr,mr,tt,ki,Ti,nu,ou,ru,ot=w(()=>{"use strict";Te=require("fs"),gr=require("path"),Si=require("@wengine-ai/claude-code-router-shared"),fr=(0,gr.join)(Si.HOME_DIR,"runtime"),mr=(0,gr.join)(fr,"rate-limit.json"),tt=new Map,ki=!1,Ti=null,nu=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],ou=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],ru=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Nn(){return hr||(hr=new br),hr}function kr(){return yr||(yr=new _r),yr}function cu(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function Ri(n){let e=cu(n);if(!e)return"";let t=typeof n?.modelFamily=="string"?n.modelFamily:"",o=typeof n?.scenarioType=="string"&&n.scenarioType?n.scenarioType:"default";return`${e}:${t}:${o}`}function wi(n,e){let t=Nn(),o=n?.[Ln];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Ln]=t.acquire(e)}function Tr(n){let e=n?.[Ln];e&&Nn().release(e)}function Pi(n,e){let t=Ri(n),o=n?.[Ln],r=t?kr().get(t)!==void 0:!1;!o&&!r||(t&&kr().bind(t,e),wi(n,e))}function lu(n,e,t){let o=Nn(),r=null,s=1/0;for(let a of e){if(!a||typeof a!="string")continue;let i=t(a);if(!i||i===n)continue;let c=o.count(i);c<s&&(r=i,s=c)}return r}function Ei(n,e,t){let o=Ri(n),r=kr(),s=Nn(),a=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,i;if(o){let c=r.get(o);if(c&&c!==e){let l=t.resolve(c);l?(i=l,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${l}`)):r.unbind(o)}else c&&(i=e)}if(!i){let c=s.count(e);if(c>=a){let l=lu(e,t.fallbackModels,t.resolve);l&&(i=l,t.log?.(`Concurrency priority: model ${e} has ${c} in-flight request(s) (>= ${a}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${l}`))}i=i||e,o&&r.bind(o,i)}return wi(n,i),i}var br,_r,hr,yr,Ln,$n=w(()=>{"use strict";br=class{leases=new Map;nextId=1;acquire(e){let t={id:this.nextId++,key:e,createdAt:Date.now(),released:!1};return this.leases.set(t.id,t),t}release(e){!e||e.released||(e.released=!0,this.leases.delete(e.id))}prune(){let e=Date.now();for(let[t,o]of this.leases)e-o.createdAt>18e5&&this.leases.delete(t)}count(e){this.prune();let t=0;for(let o of this.leases.values())o.key===e&&t++;return t}clear(){this.leases.clear()}},_r=class{bindings=new Map;get(e){let t=this.bindings.get(e);if(t){if(Date.now()-t.updatedAt>864e5){this.bindings.delete(e);return}return t.updatedAt=Date.now(),this.bindings.delete(e),this.bindings.set(e,t),t.modelKey}}bind(e,t){for(this.bindings.delete(e),this.bindings.set(e,{modelKey:t,updatedAt:Date.now()});this.bindings.size>2e3;){let o=this.bindings.keys().next().value;if(o===void 0)break;this.bindings.delete(o)}}unbind(e){this.bindings.delete(e)}clear(){this.bindings.clear()}},hr=null,yr=null;Ln="__concurrencyLease"});async function U(n){let e=await n.text();return uu(e,n.status)}function uu(n,e){let t=n.replace(/^/,"").trim();try{return JSON.parse(t)}catch{let o=t.length>200?`${t.slice(0,200)}...`:t,r=e!==void 0?` (HTTP ${e})`:"";throw new Error(`Upstream returned a non-JSON response${r}: ${o||"(empty body)"}`)}}function Ai(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function Lt(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function ve(n){if(!n.body||n.body.locked)return null;let[e,t]=n.body.tee(),o=e.getReader(),r=new TextDecoder,s="";try{for(let a=0;a<8;a++){let{value:i,done:c}=await o.read();if(c||(i&&(s+=r.decode(i,{stream:!0})),Lt(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:Lt(s)}}async function Ee(n){try{let e=await n.text();if(Lt(e)){let o=new TextEncoder,r=new ReadableStream({start(s){s.enqueue(o.encode(e)),s.close()}});return{response:new Response(r,{status:n.status,statusText:n.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),isSSE:!0}}return{response:new Response(e,{status:n.status,statusText:n.statusText,headers:n.headers}),isSSE:!1}}catch{return{response:n,isSSE:!1}}}var ne=w(()=>{"use strict"});var rt,vr=w(()=>{"use strict";ne();rt=class{name="openai-responses";endPoint="/v1/responses";getCacheReadInputTokens(e){return e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0}getCacheCreationInputTokens(e){return e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_write_tokens??0}buildResponsesUsage(e){let t=e?.input_tokens??e?.prompt_tokens??0,o=e?.output_tokens??e?.completion_tokens??0,r=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:t,output_tokens:o,total_tokens:e?.total_tokens??t+o,input_tokens_details:{cached_tokens:r,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:r,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:e.reasoning.summary||"auto"});let t=[],o=e.messages.filter(r=>r.role==="system");if(o.length>0){let r=o[0];Array.isArray(r.content)?r.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),t.push({role:"system",content:a})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(a=>this.normalizeRequestContent(a,r.role)).filter(a=>a!==null);s.length>0?r.content=s:delete r.content}if(r.role==="tool"){let s={...r};s.type="function_call_output",s.call_id=r.tool_call_id,s.output=r.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,t.push(s);return}if(r.role==="assistant"&&Array.isArray(r.tool_calls)){r.tool_calls.forEach(s=>{t.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}t.push(r)}}),e.input=t,delete e.messages,Array.isArray(e.tools)){let r=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),r&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e,t){let o=e.headers.get("Content-Type")||"";if(!o.includes("text/event-stream")&&!o.includes("application/json")&&e.body){let r=await ve(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}r?.body&&(e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(o.includes("application/json")){let r=await ve(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}if(r?.body)e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(r===null){let s=await Ee(e);if(s.isSSE)return this.transformResponseOut(s.response);e=s.response}}if(o.includes("application/json")){let r=await U(e);if(r.object==="response"&&r.output){let s=this.convertResponseToChat(r);return new Response(JSON.stringify(s),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(o.includes("text/event-stream")){if(!e.body)return e;let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let _=0;_<8;_++){let{value:b,done:k}=await a.read();if(k||(b&&(c+=i.decode(b,{stream:!0})),l.some(v=>c.includes(v)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}if(r.cancel().catch(()=>{}),c.includes("message_start")||c.includes("content_block_start"))return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});if((c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))&&t?.req?.codexDetected)return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});let d=new TextDecoder,m=new TextEncoder,h="",f=!1,g=this,y=new ReadableStream({async start(_){let b=s.getReader(),k=-1,v="",x=T=>(T!==v&&(k++,v=T),k);try{for(;;){let{done:T,value:R}=await b.read();if(T){f||_.enqueue(m.encode(`data: [DONE]
3
+ `);a=l.pop()||"";for(let u of l)u.trim()&&(s<o.maxStreamChunks?ei(e,t,s,u):s===o.maxStreamChunks&&e.info({debug_log:!0,reqId:t,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${o.maxStreamChunks}]`}),s++)}a.trim()&&(s<o.maxStreamChunks&&ei(e,t,s,a.trim()),s++),ti(e,t,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,a),ti(e,t,s)}finally{r.releaseLock()}})()}var jl,Hl,qe,qo,At=R(()=>{"use strict";jl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Hl=/token|secret|credential|passwd|password/i,qe={maxBodyLength:4096,maxStreamChunks:100},qo=!1});function ii(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([l,u])=>{u&&s.set(l,u)});let a,i=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let l=new AbortController,u=()=>l.abort();t.signal.addEventListener("abort",u),i.addEventListener("abort",u),a=l.signal}else a=i;let c={method:"POST",headers:s,body:JSON.stringify(e),signal:a,...t.redirect?{redirect:t.redirect}:{}};return t.dispatcher?c.dispatcher=t.dispatcher:t.httpsProxy&&(c.dispatcher=Y(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:Rn(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:Bl(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),c)}function Bl(n){if(!(typeof n!="string"||!n.trim()))try{let e=new URL(n);return e.username||e.password?(e.username="",e.password="",`${e.toString()} (credentials redacted)`):e.toString()}catch{return"[invalid proxy URL]"}}var ai=R(()=>{ae();At()});function Wl(n){return n.includes('"delta"')?/"delta"\s*:\s*\{[^}]*"(content|tool_calls|reasoning_content|reasoning|function_call)"\s*:\s*("|\[|\{)/.test(n):!1}function ci(n){return/"type"\s*:\s*"response\.[A-Za-z0-9_.]+"/.test(n)||/(^|\n)\s*(event:\s*)?response\.[A-Za-z0-9_.]+/.test(n)}function er(n){if(ci(n))return"pending";let e=!1,t=!1;for(let o of n.split(`
4
+ `)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(Jl.some(s=>r.includes(s))){e=!0;break}Kl.some(s=>r.includes(s))&&(t=!0)}}return e||Wl(n)?"content":t?"empty":"pending"}async function li(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],a="",i=0,c=Date.now()+t,l=(u,p)=>({verdict:u,chunks:s,bytes:i,rest:p});try{for(;;){let u=c-Date.now(),p=Symbol("timeout"),d,f=o.read(),h=u<=0?p:await Promise.race([f,new Promise(m=>{d=setTimeout(()=>m(p),u)})]);if(d&&clearTimeout(d),h===p)return l(er(a)==="content"?"content":"pending",Pn(o,f));if(h.done){a+=r.decode();let m=er(a);return l(m==="empty"?"empty":"pending",null)}if(!h.value)continue;s.push(h.value),i+=h.value.byteLength,a+=r.decode(h.value,{stream:!0});let g=er(a);if(g==="content")return l("content",Pn(o));if(g==="empty")return await o.cancel().catch(()=>{}),l("empty",null);if(ci(a)||i>=e)return l("pending",Pn(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function Pn(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:a,value:i})=>{a?t.close():(t.enqueue(i),r())}).catch(a=>t.error(a))};r()},cancel(t){return n.cancel(t)}})}function ui(n,e){let t=e?.getReader();return new ReadableStream({start(o){for(let s of n)o.enqueue(s);if(!t){o.close();return}let r=()=>{t.read().then(({done:s,value:a})=>{s?o.close():(o.enqueue(a),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var Jl,Kl,di=R(()=>{"use strict";Jl=["content_block_start","content_block_delta","content_block_stop"];Kl=["message_stop","response.completed","response.incomplete","[DONE]"]});function Gl(n,e){return`${n.name}|${e?.name??""}`}function tr(n){return n.__ccrPluginRequestState??={budgets:new Map}}function et(n,e,t){let o=tr(n),r=Gl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function nr(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(et(n,e,o).terminalError=t,!0)}var pi=R(()=>{"use strict"});var or=R(()=>{"use strict"});function mi(n,e){let t=new Error(e.message);return t.code=e.code,t.statusCode=e.httpStatus,e.cooldownMs&&(t.cooldownMs=e.cooldownMs),e.validationUrl&&(t.validationUrl=e.validationUrl),t.plugin=n,t.nonRetryable=!e.retryable,t.pluginClassified=!0,t}var fi,Ot,Vl,sr,En=R(()=>{"use strict";fi=q(require("fastify"),1);or();Ot=class{plugins=new Map;transformerServices=new Set;disposed=!1;revision=0;attachTransformerService(e){this.assertOpen();let t=[...this.plugins.values()].flatMap(r=>[...r.transformers].map(([s,a])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(a)]})),o=[];try{for(let[r,s]of t)o.push(r),e.registerTransformer(r,s);this.transformerServices.add(e)}catch(r){for(let s of o)e.removeTransformer(s);throw r}}beginActivation(e,t,o,r){if(this.assertOpen(),this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);let s={manifest:{...e},directory:r,runtimes:new Map,transformers:new Map,protectors:[],routes:[],preparedRoutes:[]},a="staging",i,c=u=>{try{if(this.assertOpen(),a!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw i=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>c(()=>{let p=typeof u.TransformerName=="string"?u.TransformerName:new u().name;if(typeof p!="string"||!p)throw new Error("plugin transformer has no name");if(s.transformers.has(p))throw new Error(`transformer "${p}" is already registered`);s.transformers.set(p,u)}),registerManagedRuntime:u=>c(()=>{if(!u.name||typeof u.isManaged!="function"||typeof u.signRequest!="function")throw new Error("invalid managed runtime");if(s.runtimes.has(u.name))throw new Error(`managed runtime "${u.name}" is already registered`);s.runtimes.set(u.name,u)}),registerAdminRoutes:u=>c(()=>{s.routes.push(u)}),registerConfigProtector:u=>c(()=>{s.protectors.push(u)}),registerUiCard:u=>c(()=>{if(s.cardPath)throw new Error("plugin card is already registered");if(!/^[A-Za-z0-9][A-Za-z0-9._-]*\.js$/.test(u.cardPath))throw new Error("card must be a single JavaScript file");s.cardPath=u.cardPath}),registerLocales:u=>c(()=>{s.locales=u})},commit:async(u,p)=>{this.assertOpen();let d=this.revision;if(s.routes.length){if(!p)throw new Error("plugin admin routes require a host app");s.preparedRoutes=await this.prepareRoutes(s.routes,p)}if(this.assertOpen(),this.revision!==d)throw new Error("plugin registry changed during activation; retry activation");if(a!=="staging")throw new Error("plugin activation is no longer open");if(i)throw i;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let g of this.plugins.values()){for(let m of s.runtimes.keys())if(g.runtimes.has(m))throw new Error(`managed runtime "${m}" is already registered`);for(let m of s.transformers.keys())if(g.transformers.has(m))throw new Error(`transformer "${m}" is already registered`)}let f=[...this.transformerServices].flatMap(g=>[...s.transformers].map(([m,_])=>{if(g.hasTransformer(m))throw new Error(`transformer "${m}" is already registered`);return{service:g,name:m,value:g.preparePluginTransformer(_)}})),h=[];try{for(let g of f)h.push(g),g.service.registerTransformer(g.name,g.value);s.card=u,this.plugins.set(e.name,s),this.revision++,a="committed"}catch(g){for(let m of h)m.service.removeTransformer(m.name);throw a="aborted",g}},get cardPath(){return s.cardPath},abort:()=>{a="aborted"}}}getManagedRuntimeFor(e){for(let t of this.plugins.values())for(let o of t.runtimes.values())try{if(o.isManaged(e))return o}catch{}}getRegisteredRuntimes(){return[...this.plugins.values()].flatMap(e=>[...e.runtimes.values()])}applyConfigProtectors(e,t){for(let o of this.plugins.values())for(let r of o.protectors)r(e,t)}listLoadedPlugins(){return[...this.plugins.values()].map(e=>({name:e.manifest.name,version:e.manifest.version,enabled:!0,...e.card?{cardUrl:`/plugins/${e.manifest.name}/${e.cardPath}`}:{},...e.locales?{locales:e.locales}:{}}))}getPublicCard(e,t){let o=this.plugins.get(e);return o?.cardPath===t&&o.card?Buffer.from(o.card):void 0}async prepareRoutes(e,t){let o=new Set(["get","post","put","patch","delete","head","options","all"]),r=[],s=new Proxy(t,{get:(i,c)=>{if(c==="route")return u=>(r.push(u),s);if(o.has(String(c)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:c==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(c).toUpperCase(),url:u,handler:d??p}),s);let l=Reflect.get(i,c);return typeof l=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(c)}`)}:l}}),a=(0,fi.default)({logger:!1});try{for(let i of e){let c=i(s);c!==s&&await c}for(let i of this.plugins.values())for(let c of i.preparedRoutes)a.route(c);for(let i of r){let c=Array.isArray(i.method)?i.method:[i.method];for(let l of c)if(t.hasRoute({method:l,url:i.url,constraints:i.constraints}))throw new Error(`plugin route ${l} ${i.url} is already registered`);a.route(i)}return await a.ready(),r}finally{await a.close()}}async registerAllRoutes(e){this.assertOpen();for(let t of this.plugins.values())for(let o of t.preparedRoutes)e.route(o)}dispose(){if(!this.disposed){for(let e of this.transformerServices)for(let t of this.plugins.values())for(let o of t.transformers.keys())e.removeTransformer(o);this.plugins.clear(),this.transformerServices.clear(),this.disposed=!0}}assertOpen(){if(this.disposed)throw new Error("plugin host is disposed")}},Vl=new Ot,sr=()=>Vl});async function He(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let a=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",i=s?{...s,code:a,message:`Provider plugin request failed (${a}).`}:{code:a,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(i)}catch{}let c=mi(n.name,i);return c.isRateLimit=i.httpStatus===429,c.upstreamStatus=e,r?.errorName&&(c.upstreamErrorName=r.errorName),c}var gi=R(()=>{"use strict";En()});var An,ir=R(()=>{An="2.3.2421"});var hi={};bn(hi,{getFallbackPromotionStore:()=>tt,resetFallbackPromotionStore:()=>Xl});function tt(n){return ze||(ze=new ar,n&&ze.configure(n)),ze}function Xl(){ze&&(ze.clearAll(),ze=null)}var Yl,ar,ze,On=R(()=>{"use strict";ue();Yl=600*1e3,ar=class{promotions=new Map;enabled=!0;ttlMs=Yl;configure(e){e?.enabled!==void 0&&(this.enabled=e.enabled),e?.ttlMinutes!==void 0&&(this.ttlMs=e.ttlMinutes*60*1e3)}getKey(e,t,o){return`${e},${t}:${o}`}promote(e,t,o,r,s,a){if(!this.enabled)return;let i=this.getKey(e,t,o),c=`${r},${s}`;this.promotions.set(i,{promotedModel:c,timestamp:Date.now(),ttlMs:a??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),a=this.promotions.get(s);if(!a)return null;if(Date.now()-a.timestamp>=a.ttlMs)return this.promotions.delete(s),null;let[c,...l]=a.promotedModel.split(","),u=l.join(",");if(!j().isAvailable(c,u))return this.promotions.delete(s),null;let d=r.find(h=>h.name.toLowerCase()===c.toLowerCase()),f=d?.models?.find(h=>String(h).toLowerCase()===u.toLowerCase());return!d||!f||d.enabled===!1?(this.promotions.delete(s),null):`${d.name},${f}`}clear(e,t,o){let r=this.getKey(e,t,o);this.promotions.delete(r)}clearByPrimary(e,t){let o=`${e},${t}:`,r=0;for(let s of this.promotions.keys())s.startsWith(o)&&(this.promotions.delete(s),r++);return r}clearAll(){this.promotions.clear()}clearExpired(){let e=Date.now();for(let[t,o]of this.promotions)e-o.timestamp>=o.ttlMs&&this.promotions.delete(t)}getAllPromotions(){let e=Date.now(),t=[];for(let[o,r]of this.promotions){let s=r.ttlMs-(e-r.timestamp);s>0&&t.push({key:o,promotedModel:r.promotedModel,remainingMs:s})}return t}},ze=null});function tu(n){try{if(!(0,ke.existsSync)(ur))return;let e=JSON.parse((0,ke.readFileSync)(ur,"utf-8"));if(!Array.isArray(e))return;let t=Date.now();for(let o of e){if(!o||!o.provider||!o.model)continue;let r=o.updatedAt||o.lastFailureTime||0;r&&t-r>1440*60*1e3||n.restore({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount??0,successCount:o.successCount??0,lastFailureTime:o.lastFailureTime??0,lastProbeTime:o.lastProbeTime??0,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil})}}catch{}}function _i(n){try{let e=n.getAllStates();if(e.length===0)return;(0,ke.existsSync)(lr)||(0,ke.mkdirSync)(lr,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,ke.writeFileSync)(ur,JSON.stringify(t,null,2),"utf-8")}catch{}}function In(){if(yi)return;yi=!0;let n=j();tu(n),eu=setInterval(()=>_i(n),6e4),process.on("exit",()=>_i(n))}function j(n){return cr||(cr=new It(n)),cr}var ke,dr,bi,Zl,ql,It,lr,ur,yi,eu,cr,ue=R(()=>{"use strict";ke=require("fs"),dr=require("path"),bi=require("@wengine-ai/claude-code-router-shared"),Zl=120,ql={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},It=class{states=new Map;config;probeTimer;constructor(e){this.config={...ql,...e}}getKey(e,t){return!e||!t?null:`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);if(!r||(r.successCount++,r.rateLimitUntil&&r.rateLimitUntil>Date.now()))return;let s=!!r.rateLimitUntil;r.rateLimitUntil=void 0,r.status==="half-open"?r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o)):r.status==="open"&&(r.status="half-open",r.successCount=1,r.failureCount=0),s&&r.status==="half-open"&&r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(On(),Ws(hi));o().clearByPrimary(e,t)}catch{}}recordFailure(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(r,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=o,s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=this.config.failureThreshold&&(s.status="open",s.lastProbeTime=0)}getState(e,t){let o=this.getKey(e,t);if(o)return this.states.get(o)}isAvailable(e,t,o=!1){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let s=this.getState(e,t);return s?s.status==="open"&&s.rateLimitUntil?!(Date.now()<s.rateLimitUntil):s.status==="open"&&o&&Date.now()-Math.max(s.lastFailureTime,s.lastProbeTime)>=this.config.probeIntervalMinutes*6e4?(s.status="half-open",s.successCount=0,s.lastProbeTime=Date.now(),!0):s.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;if(!this.getKey(e,t))return 2;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&e.push(t);return e}recordProbeAttempt(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&(r.lastProbeTime=Date.now())}markParkedUntil(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s&&(!Number.isFinite(o)||o<=Date.now()||s.rateLimitUntil&&s.rateLimitUntil>=o||(s.rateLimitUntil=o))}getHalfOpenModels(){let e=[];for(let[t,o]of this.states)o.status==="half-open"&&e.push(t);return e}forceOpen(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s?(s.status="open",s.failureCount=Math.max(s.failureCount,this.config.failureThreshold),s.lastFailureTime=Date.now(),s.lastError=o,s.lastProbeTime=0):(s={provider:e,model:t,status:"open",failureCount:this.config.failureThreshold,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:o},this.states.set(r,s))}markRateLimited(e,t,o,r){if(!this.config.enabled)return;let s=this.getKey(e,t);if(!s)return;let a=this.states.get(s);a?(a.status="open",a.lastFailureTime=Date.now(),a.lastError=r||"rate-limited",a.lastProbeTime=0):(a={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,a));let i=(o??Zl)*1e3;a.rateLimitUntil=Date.now()+i}getRateLimitedModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&o.rateLimitUntil&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&r.status==="open"&&(r.lastProbeTime=Date.now())}clear(){this.states.clear()}recover(e,t){let o=this.getKey(e,t);o&&this.states.delete(o)}getAllStates(){return Array.from(this.states.values())}restore(e){let t=this.getKey(e.provider,e.model);t&&this.states.set(t,{...e})}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},lr=(0,dr.join)(bi.HOME_DIR,"runtime"),ur=(0,dr.join)(lr,"provider-health.json"),yi=!1,eu=null;cr=null});function Mt(n,e,t){let o=i=>{if(t instanceof Headers)return t.get(i);let c=Object.keys(t).find(l=>l.toLowerCase()===i);return c?t[c]:null},r=pr(o,nu),s=pr(o,ou),a=pr(o,ru);(r||s||a)&&nt.set(n,{provider:n,remaining:vi(r),limit:vi(s),reset:su(a),capturedAt:Date.now()})}function Ci(n){return nt.get(n)}function Mn(){return Array.from(nt.values())}function pr(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function vi(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function su(n){if(!n)return null;let e=n.trim();if(!e)return null;let t=Number(e);if(Number.isFinite(t))return t>1e12?Math.floor(t/1e3):t>1e9?Math.floor(t):Math.floor(Date.now()/1e3+t);let o=Date.parse(e);if(Number.isFinite(o))return Math.floor(o/1e3);let r=iu(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function iu(n){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,t=0,o=!1;for(let r of n.matchAll(e)){o=!0;let s=Number(r[1]),a=r[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":t+=s;break;case"s":t+=s*1e3;break;case"m":t+=s*60*1e3;break;case"h":t+=s*60*60*1e3;break;case"d":t+=s*24*60*60*1e3;break}}return o?t:null}function au(){try{if(!(0,Te.existsSync)(mr))return;let n=JSON.parse((0,Te.readFileSync)(mr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>3600*1e3)continue;nt.set(t.provider,t)}}catch{}}function xi(){try{if(nt.size===0)return;(0,Te.existsSync)(fr)||(0,Te.mkdirSync)(fr,{recursive:!0}),(0,Te.writeFileSync)(mr,JSON.stringify(Array.from(nt.values()),null,2),"utf-8")}catch{}}function ot(){ki||(ki=!0,au(),Ti=setInterval(xi,6e4),Ti.unref?.(),process.on("exit",xi))}var Te,gr,Si,fr,mr,nt,ki,Ti,nu,ou,ru,rt=R(()=>{"use strict";Te=require("fs"),gr=require("path"),Si=require("@wengine-ai/claude-code-router-shared"),fr=(0,gr.join)(Si.HOME_DIR,"runtime"),mr=(0,gr.join)(fr,"rate-limit.json"),nt=new Map,ki=!1,Ti=null,nu=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],ou=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],ru=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Nn(){return hr||(hr=new _r),hr}function kr(){return yr||(yr=new br),yr}function cu(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function Ri(n){let e=cu(n);if(!e)return"";let t=typeof n?.modelFamily=="string"?n.modelFamily:"",o=typeof n?.scenarioType=="string"&&n.scenarioType?n.scenarioType:"default";return`${e}:${t}:${o}`}function wi(n,e){let t=Nn(),o=n?.[Ln];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Ln]=t.acquire(e)}function Tr(n){let e=n?.[Ln];e&&Nn().release(e)}function Pi(n,e){let t=Ri(n),o=n?.[Ln],r=t?kr().get(t)!==void 0:!1;!o&&!r||(t&&kr().bind(t,e),wi(n,e))}function lu(n,e,t){let o=Nn(),r=null,s=1/0;for(let a of e){if(!a||typeof a!="string")continue;let i=t(a);if(!i||i===n)continue;let c=o.count(i);c<s&&(r=i,s=c)}return r}function Ei(n,e,t){let o=Ri(n),r=kr(),s=Nn(),a=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,i;if(o){let c=r.get(o);if(c&&c!==e){let l=t.resolve(c);l?(i=l,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${l}`)):r.unbind(o)}else c&&(i=e)}if(!i){let c=s.count(e);if(c>=a){let l=lu(e,t.fallbackModels,t.resolve);l&&(i=l,t.log?.(`Concurrency priority: model ${e} has ${c} in-flight request(s) (>= ${a}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${l}`))}i=i||e,o&&r.bind(o,i)}return wi(n,i),i}var _r,br,hr,yr,Ln,$n=R(()=>{"use strict";_r=class{leases=new Map;nextId=1;acquire(e){let t={id:this.nextId++,key:e,createdAt:Date.now(),released:!1};return this.leases.set(t.id,t),t}release(e){!e||e.released||(e.released=!0,this.leases.delete(e.id))}prune(){let e=Date.now();for(let[t,o]of this.leases)e-o.createdAt>18e5&&this.leases.delete(t)}count(e){this.prune();let t=0;for(let o of this.leases.values())o.key===e&&t++;return t}clear(){this.leases.clear()}},br=class{bindings=new Map;get(e){let t=this.bindings.get(e);if(t){if(Date.now()-t.updatedAt>864e5){this.bindings.delete(e);return}return t.updatedAt=Date.now(),this.bindings.delete(e),this.bindings.set(e,t),t.modelKey}}bind(e,t){for(this.bindings.delete(e),this.bindings.set(e,{modelKey:t,updatedAt:Date.now()});this.bindings.size>2e3;){let o=this.bindings.keys().next().value;if(o===void 0)break;this.bindings.delete(o)}}unbind(e){this.bindings.delete(e)}clear(){this.bindings.clear()}},hr=null,yr=null;Ln="__concurrencyLease"});async function U(n){let e=await n.text();return uu(e,n.status)}function uu(n,e){let t=n.replace(/^/,"").trim();try{return JSON.parse(t)}catch{let o=t.length>200?`${t.slice(0,200)}...`:t,r=e!==void 0?` (HTTP ${e})`:"";throw new Error(`Upstream returned a non-JSON response${r}: ${o||"(empty body)"}`)}}function Ai(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function Lt(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function ve(n){if(!n.body||n.body.locked)return null;let[e,t]=n.body.tee(),o=e.getReader(),r=new TextDecoder,s="";try{for(let a=0;a<8;a++){let{value:i,done:c}=await o.read();if(c||(i&&(s+=r.decode(i,{stream:!0})),Lt(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:Lt(s)}}async function Ee(n){try{let e=await n.text();if(Lt(e)){let o=new TextEncoder,r=new ReadableStream({start(s){s.enqueue(o.encode(e)),s.close()}});return{response:new Response(r,{status:n.status,statusText:n.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),isSSE:!0}}return{response:new Response(e,{status:n.status,statusText:n.statusText,headers:n.headers}),isSSE:!1}}catch{return{response:n,isSSE:!1}}}var ne=R(()=>{"use strict"});function du(n){if(!n||typeof n!="object")return;let e=Number(n.input_tokens??n.prompt_tokens??0)||0,t=Number(n.output_tokens??n.completion_tokens??0)||0,o=Number(n.input_tokens_details?.cached_tokens??n.prompt_tokens_details?.cached_tokens??n.cache_read_input_tokens??0)||0,r=Number(n.input_tokens_details?.cache_write_tokens??n.input_tokens_details?.cache_creation_tokens??n.cache_creation_input_tokens??0)||0;return{prompt_tokens:e,completion_tokens:t,total_tokens:Number(n.total_tokens??e+t)||0,prompt_tokens_details:{cached_tokens:o,cache_write_tokens:r},completion_tokens_details:{reasoning_tokens:Number(n.output_tokens_details?.reasoning_tokens??0)||0}}}var st,vr=R(()=>{"use strict";ne();st=class{name="openai-responses";endPoint="/v1/responses";getCacheReadInputTokens(e){return e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0}getCacheCreationInputTokens(e){return e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_write_tokens??0}buildResponsesUsage(e){let t=e?.input_tokens??e?.prompt_tokens??0,o=e?.output_tokens??e?.completion_tokens??0,r=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:t,output_tokens:o,total_tokens:e?.total_tokens??t+o,input_tokens_details:{cached_tokens:r,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:r,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:e.reasoning.summary||"auto"});let t=[],o=e.messages.filter(r=>r.role==="system");if(o.length>0){let r=o[0];Array.isArray(r.content)?r.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),t.push({role:"system",content:a})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(a=>this.normalizeRequestContent(a,r.role)).filter(a=>a!==null);s.length>0?r.content=s:delete r.content}if(r.role==="tool"){let s={...r};s.type="function_call_output",s.call_id=r.tool_call_id,s.output=r.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,t.push(s);return}if(r.role==="assistant"&&Array.isArray(r.tool_calls)){r.tool_calls.forEach(s=>{t.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}t.push(r)}}),e.input=t,delete e.messages,Array.isArray(e.tools)){let r=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),r&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e,t){let o=e.headers.get("Content-Type")||"";if(!o.includes("text/event-stream")&&!o.includes("application/json")&&e.body){let r=await ve(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}r?.body&&(e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(o.includes("application/json")){let r=await ve(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}if(r?.body)e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(r===null){let s=await Ee(e);if(s.isSSE)return this.transformResponseOut(s.response);e=s.response}}if(o.includes("application/json")){let r=await U(e);if(r.object==="response"&&r.output){let s=this.convertResponseToChat(r);return new Response(JSON.stringify(s),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(o.includes("text/event-stream")){if(!e.body)return e;let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let y=0;y<8;y++){let{value:k,done:v}=await a.read();if(v||(k&&(c+=i.decode(k,{stream:!0})),l.some(x=>c.includes(x)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}if(r.cancel().catch(()=>{}),c.includes("message_start")||c.includes("content_block_start"))return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});if((c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))&&t?.req?.codexDetected)return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});let d=new TextDecoder,f=new TextEncoder,h=String(t?.req?.model??t?.req?.body?.model??t?.req?.originalModel??"unknown"),g="",m=!1,_=this,b=new ReadableStream({async start(y){let k=s.getReader(),v=-1,x="",T=C=>(C!==x&&(v++,x=C),v);try{for(;;){let{done:C,value:S}=await k.read();if(C){m||y.enqueue(f.encode(`data: [DONE]
5
5
 
6
- `));break}let S=d.decode(R,{stream:!0});h+=S;let P=h.split(/\r?\n/);h=P.pop()||"";for(let O of P)if(O.trim())try{if(O.startsWith("event: "))continue;if(O.startsWith("data: ")){let I=O.slice(5).trim();if(I==="[DONE]"){f=!0,_.enqueue(m.encode(`data: [DONE]
6
+ `));break}let P=d.decode(S,{stream:!0});g+=P;let M=g.split(/\r?\n/);g=M.pop()||"";for(let I of M)if(I.trim())try{if(I.startsWith("event: "))continue;if(I.startsWith("data: ")){let A=I.slice(5).trim();if(A==="[DONE]"){m=!0,y.enqueue(f.encode(`data: [DONE]
7
7
 
8
- `));continue}try{let C=JSON.parse(I);if(C.type==="response.output_text.delta"){let A={id:C.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model,choices:[{index:x(C.type),delta:{content:C.delta||""},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
8
+ `));continue}try{let w=JSON.parse(A);if(w.type==="response.output_text.delta"){let O={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:{content:w.delta||""},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
9
9
 
10
- `))}else if(C.type==="response.output_item.added"&&C.item?.type==="function_call"){let A={id:C.item.call_id||C.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model||"gpt-5-codex-",choices:[{index:x(C.type),delta:{role:"assistant",tool_calls:[{index:0,id:C.item.call_id||C.item.id,function:{name:C.item.name||"",arguments:""},type:"function"}]},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
10
+ `))}else if(w.type==="response.output_item.added"&&w.item?.type==="function_call"){let O={id:w.item.call_id||w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{role:"assistant",tool_calls:[{index:0,id:w.item.call_id||w.item.id,function:{name:w.item.name||"",arguments:""},type:"function"}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
11
11
 
12
- `))}else if(C.type==="response.output_item.added"&&C.item?.type==="message"){let A=[];(C.item.content||[]).forEach($=>{$.type==="output_text"&&A.push({type:"text",text:$.text||""})});let M={role:"assistant"};if(A.length===1&&A[0].type==="text"?M.content=A[0].text:A.length>0&&(M.content=A),M.content){let $={id:C.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model,choices:[{index:x(C.type),delta:M,finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify($)}
12
+ `))}else if(w.type==="response.output_item.added"&&w.item?.type==="message"){let O=[];(w.item.content||[]).forEach(H=>{H.type==="output_text"&&O.push({type:"text",text:H.text||""})});let $={role:"assistant"};if(O.length===1&&O[0].type==="text"?$.content=O[0].text:O.length>0&&($.content=O),$.content){let H={id:w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:$,finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(H)}
13
13
 
14
- `))}}else if(C.type==="response.output_text.annotation.added"){let A={id:C.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model||"gpt-5-codex",choices:[{index:x(C.type),delta:{annotations:[{type:"url_citation",url_citation:{url:C.annotation?.url||"",title:C.annotation?.title||"",content:"",start_index:C.annotation?.start_index||0,end_index:C.annotation?.end_index||0}}]},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
14
+ `))}}else if(w.type==="response.output_text.annotation.added"){let O={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{annotations:[{type:"url_citation",url_citation:{url:w.annotation?.url||"",title:w.annotation?.title||"",content:"",start_index:w.annotation?.start_index||0,end_index:w.annotation?.end_index||0}}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
15
15
 
16
- `))}else if(C.type==="response.function_call_arguments.delta"){let A={id:C.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model||"gpt-5-codex-",choices:[{index:x(C.type),delta:{tool_calls:[{index:0,function:{arguments:C.delta||""}}]},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
16
+ `))}else if(w.type==="response.function_call_arguments.delta"){let O={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{tool_calls:[{index:0,function:{arguments:w.delta||""}}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
17
17
 
18
- `))}else if(C.type==="response.completed"){let A=C.response?.output?.some($=>$.type==="function_call")?"tool_calls":"stop",M={id:C.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model||"gpt-5-codex-",choices:[{index:0,delta:{},finish_reason:A}]};_.enqueue(m.encode(`data: ${JSON.stringify(M)}
18
+ `))}else if(w.type==="response.completed"){let O=w.response?.output?.some(H=>H.type==="function_call")?"tool_calls":"stop",$={id:w.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:0,delta:{},finish_reason:O}],...w.response?.usage?{usage:du(w.response.usage)}:{}};y.enqueue(f.encode(`data: ${JSON.stringify($)}
19
19
 
20
- `)),f=!0}else if(C.type==="response.reasoning_summary_text.delta"){let A={id:C.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model,choices:[{index:x(C.type),delta:{thinking:{content:C.delta||""}},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
20
+ `)),m=!0}else if(w.type==="response.reasoning_summary_text.delta"){let O={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:{thinking:{content:w.delta||""}},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
21
21
 
22
- `))}else if(C.type==="response.reasoning_summary_part.done"&&C.part){let A={id:C.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:C.response?.model,choices:[{index:k,delta:{thinking:{signature:C.item_id}},finish_reason:null}]};_.enqueue(m.encode(`data: ${JSON.stringify(A)}
22
+ `))}else if(w.type==="response.reasoning_summary_part.done"&&w.part){let O={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:v,delta:{thinking:{signature:w.item_id}},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(O)}
23
23
 
24
- `))}}catch{_.enqueue(m.encode(O+`
25
- `))}}else _.enqueue(m.encode(O+`
26
- `))}catch(I){console.error("Error processing line:",O,I),_.enqueue(m.encode(O+`
27
- `))}}h.trim()&&_.enqueue(m.encode(h+`
28
- `)),f||_.enqueue(m.encode(`data: [DONE]
24
+ `))}}catch{y.enqueue(f.encode(I+`
25
+ `))}}else y.enqueue(f.encode(I+`
26
+ `))}catch(A){console.error("Error processing line:",I,A),y.enqueue(f.encode(I+`
27
+ `))}}g.trim()&&y.enqueue(f.encode(g+`
28
+ `)),m||y.enqueue(f.encode(`data: [DONE]
29
29
 
30
- `))}catch(T){console.error("Stream error:",T),_.error(T)}finally{try{b.releaseLock()}catch(T){console.error("Error releasing reader lock:",T)}_.close()}}});return new Response(y,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"}})}return e}normalizeRequestContent(e,t){let o={...e};if(delete o.cache_control,e.type==="text")return{type:t==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){let r={type:t==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(r.image_url=e.image_url.url),r}return null}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let h=0;h<8;h++){let{value:f,done:g}=await a.read();if(g||(f&&(c+=i.decode(f,{stream:!0})),l.some(y=>c.includes(y)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}r.cancel().catch(()=>{});let u=c.includes("message_start")||c.includes("content_block_start"),p=c.includes("chat.completion.chunk");if(c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))return new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}});if(p&&!u){let h=this.convertOpenAIChatStreamToResponsesAPI(s,t);return new Response(h,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let m=this.convertAnthropicStreamToResponsesAPI(s,t);return new Response(m,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}try{let r=await U(e);return new Response(JSON.stringify(this.wrapChatInResponses(r)),{headers:{"Content-Type":"application/json"}})}catch{return e}}convertOpenAIChatStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i=0,c=!1,l=!1,u="",p=-1,d=[],m=(f,g)=>r.encode(`event: ${f}
31
- data: ${JSON.stringify(g)}
30
+ `))}catch(C){console.error("Stream error:",C),y.error(C)}finally{try{k.releaseLock()}catch(C){console.error("Error releasing reader lock:",C)}y.close()}}});return new Response(b,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"}})}return e}normalizeRequestContent(e,t){let o={...e};if(delete o.cache_control,e.type==="text")return{type:t==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){let r={type:t==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(r.image_url=e.image_url.url),r}return null}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let h=0;h<8;h++){let{value:g,done:m}=await a.read();if(m||(g&&(c+=i.decode(g,{stream:!0})),l.some(_=>c.includes(_)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}r.cancel().catch(()=>{});let u=c.includes("message_start")||c.includes("content_block_start"),p=c.includes("chat.completion.chunk");if(c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))return new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}});if(p&&!u){let h=this.convertOpenAIChatStreamToResponsesAPI(s,t);return new Response(h,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let f=this.convertAnthropicStreamToResponsesAPI(s,t);return new Response(f,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}try{let r=await U(e);return new Response(JSON.stringify(this.wrapChatInResponses(r)),{headers:{"Content-Type":"application/json"}})}catch{return e}}convertOpenAIChatStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i=0,c=!1,l=!1,u="",p=-1,d=[],f=(g,m)=>r.encode(`event: ${g}
31
+ data: ${JSON.stringify(m)}
32
32
 
33
- `),h=(f,g=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:f,model:s,output:g,usage:this.buildResponsesUsage()});return new ReadableStream({async start(f){try{let g=e.getReader(),y="",_=!1,b=k=>{if(!_){_=!0;for(let v of d)if(v.type==="function_call"){let x=d.indexOf(v);f.enqueue(m("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:v.call_id||v.id,output_index:x,arguments:v.arguments||""})),v.status="completed",f.enqueue(m("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}for(let v of d)if(v.type==="message"){let x=d.indexOf(v);v.status="completed",f.enqueue(m("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}f.enqueue(m("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:k?.model||s,output:d.slice(),usage:k?.usage?{...this.buildResponsesUsage(k.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:k,value:v}=await g.read();if(k)break;y+=o.decode(v,{stream:!0});let x=y.split(`
34
- `);y=x.pop()||"";for(let T of x){let R=T.trim();if(!R||R.startsWith("event:")||!R.startsWith("data:"))continue;let S=R.slice(5).trim();if(S==="[DONE]"){b({}),f.enqueue(r.encode(`data: [DONE]
33
+ `),h=(g,m=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:g,model:s,output:m,usage:this.buildResponsesUsage()});return new ReadableStream({async start(g){try{let m=e.getReader(),_="",b=!1,y=k=>{if(!b){b=!0;for(let v of d)if(v.type==="function_call"){let x=d.indexOf(v);g.enqueue(f("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:v.call_id||v.id,output_index:x,arguments:v.arguments||""})),v.status="completed",g.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}for(let v of d)if(v.type==="message"){let x=d.indexOf(v);v.status="completed",g.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}g.enqueue(f("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:k?.model||s,output:d.slice(),usage:k?.usage?{...this.buildResponsesUsage(k.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:k,value:v}=await m.read();if(k)break;_+=o.decode(v,{stream:!0});let x=_.split(`
34
+ `);_=x.pop()||"";for(let T of x){let C=T.trim();if(!C||C.startsWith("event:")||!C.startsWith("data:"))continue;let S=C.slice(5).trim();if(S==="[DONE]"){y({}),g.enqueue(r.encode(`data: [DONE]
35
35
 
36
- `));continue}let P;try{P=JSON.parse(S)}catch{continue}c||(c=!0,f.enqueue(m("response.created",{type:"response.created",response:h("in_progress")})),f.enqueue(m("response.in_progress",{type:"response.in_progress",response:h("in_progress")})));let O=P.choices?.[0];if(!O)continue;let I=O.delta;if(I?.content){if(!l){l=!0;let C=i++,A={id:`${a}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};d.push(A),f.enqueue(m("response.output_item.added",{type:"response.output_item.added",output_index:C,item:A}))}f.enqueue(m("response.output_text.delta",{type:"response.output_text.delta",item_id:`${a}_msg`,output_index:i-1,content_index:0,delta:I.content}))}if(Array.isArray(I?.tool_calls))for(let C of I.tool_calls){if(C.id){u=C.id,p=i++;let A={id:C.id,type:"function_call",status:"in_progress",call_id:C.id,name:C.function?.name||"",arguments:""};d.push(A),f.enqueue(m("response.output_item.added",{type:"response.output_item.added",output_index:p,item:A}))}if(C.function?.arguments){f.enqueue(m("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u,output_index:p,delta:C.function.arguments}));let A=d.find(M=>M.call_id===u);A&&(A.arguments+=C.function.arguments)}}O.finish_reason&&b(P)}}_||b({}),f.close()}catch(g){f.error(g)}}})}convertAnthropicStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i="",c="",l=-1,u="",p="",d="",m=-1,h="",f="",g=-1,y=0,_=!1,b=!1,k=!1,v=!1,x=null,T=[],R=(A,M)=>r.encode(`event: ${A}
37
- data: ${JSON.stringify(M)}
36
+ `));continue}let P;try{P=JSON.parse(S)}catch{continue}c||(c=!0,g.enqueue(f("response.created",{type:"response.created",response:h("in_progress")})),g.enqueue(f("response.in_progress",{type:"response.in_progress",response:h("in_progress")})));let M=P.choices?.[0];if(!M)continue;let I=M.delta;if(I?.content){if(!l){l=!0;let A=i++,w={id:`${a}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};d.push(w),g.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:A,item:w}))}g.enqueue(f("response.output_text.delta",{type:"response.output_text.delta",item_id:`${a}_msg`,output_index:i-1,content_index:0,delta:I.content}))}if(Array.isArray(I?.tool_calls))for(let A of I.tool_calls){if(A.id){u=A.id,p=i++;let w={id:A.id,type:"function_call",status:"in_progress",call_id:A.id,name:A.function?.name||"",arguments:""};d.push(w),g.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:p,item:w}))}if(A.function?.arguments){g.enqueue(f("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u,output_index:p,delta:A.function.arguments}));let w=d.find(O=>O.call_id===u);w&&(w.arguments+=A.function.arguments)}}M.finish_reason&&y(P)}}b||y({}),g.close()}catch(m){g.error(m)}}})}convertAnthropicStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i="",c="",l=-1,u="",p="",d="",f=-1,h="",g="",m=-1,_=0,b=!1,y=!1,k=!1,v=!1,x=null,T=[],C=(w,O)=>r.encode(`event: ${w}
37
+ data: ${JSON.stringify(O)}
38
38
 
39
- `),S=(A,M=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:A,model:s,output:M,usage:this.buildResponsesUsage()}),P=()=>{_||(_=!0,C.enqueue(R("response.created",{type:"response.created",response:S("in_progress")})),C.enqueue(R("response.in_progress",{type:"response.in_progress",response:S("in_progress")})))},O=(A,M)=>{C.enqueue(R("response.output_item.done",{type:"response.output_item.done",output_index:A,item:{...M,status:"completed"}}))},I=A=>{if(!v){if(v=!0,b){let M=T.find($=>$.type==="message");M&&(M.content=[{type:"output_text",text:i}],M.status="completed")}for(let M of T)M.type==="function_call"&&(M.status="completed");return R("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:T,usage:A?{...this.buildResponsesUsage(A)}:this.buildResponsesUsage()}})}},C;return new ReadableStream({async start(A){C=A;try{let M=e.getReader(),$="";for(;;){let{done:D,value:F}=await M.read();if(D)break;$+=o.decode(F,{stream:!0});let J=$.split(`
40
- `);$=J.pop()||"";for(let Pe of J){let B=Pe.trim();if(!B||B.startsWith("event:")||!B.startsWith("data:"))continue;let ie=B.slice(5).trim();if(ie==="[DONE]")continue;let G;try{G=JSON.parse(ie)}catch{continue}if(G.type==="message_start"&&(a=G.message?.id||a,P()),G.type==="content_block_start"){let L=G.content_block;if(x=L?.type||null,L?.type==="tool_use"){u=L.id||"",p=L.name||"",d="",m=y++;let Q={id:u,type:"function_call",status:"in_progress",call_id:u,name:p,arguments:""};T.push(Q),C.enqueue(R("response.output_item.added",{type:"response.output_item.added",output_index:m,item:Q}))}if(L?.type==="thinking"&&(h=L.thinking||"",!k)){k=!0,g=y++,f=`rs_${a}`;let Q={id:f,type:"reasoning",status:"in_progress",summary:[]};T.push(Q),C.enqueue(R("response.output_item.added",{type:"response.output_item.added",output_index:g,item:Q}))}if(L?.type==="text"&&(i=L?.text||"",!b)){b=!0,l=y++,c=`${a}_msg`;let Q={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(Q),C.enqueue(R("response.output_item.added",{type:"response.output_item.added",output_index:l,item:Q}))}}if(G.type==="content_block_delta"){let L=G.delta;if(L?.type==="text_delta"){if(!b){b=!0,l=y++,c=`${a}_msg`;let Q={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(Q),C.enqueue(R("response.output_item.added",{type:"response.output_item.added",output_index:l,item:Q}))}i+=L.text||"",C.enqueue(R("response.output_text.delta",{type:"response.output_text.delta",item_id:c,output_index:l,content_index:0,delta:L.text||""}))}L?.type==="thinking_delta"&&(h+=L.thinking||"",C.enqueue(R("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:f||`rs_${a}`,output_index:g>=0?g:0,summary_index:0,delta:L.thinking||""}))),L?.type==="input_json_delta"&&(d+=L.partial_json||"",C.enqueue(R("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u||"call_0",output_index:m>=0?m:0,delta:L.partial_json||""})))}if(G.type==="content_block_stop"){if(x==="tool_use"&&u){C.enqueue(R("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:u,output_index:m,arguments:d}));let L=T.find(Q=>Q.call_id===u);L&&(L.arguments=d,L.status="completed"),L&&O(m,L)}if(x==="text"&&b){C.enqueue(R("response.output_text.done",{type:"response.output_text.done",item_id:c,output_index:l,content_index:0,text:i}));let L=T.find(Q=>Q.type==="message");L&&(L.content=[{type:"output_text",text:i}],O(l,L))}if(x==="thinking"&&k){let L=T.find(Q=>Q.type==="reasoning");L&&(L.summary=[{type:"summary_text",text:h}],O(g,L))}x=null}if(G.type==="message_delta"){let L=I(G.usage);L&&C.enqueue(L)}if(G.type==="message_stop"){let L=I();L&&C.enqueue(L),C.enqueue(r.encode(`data: [DONE]
39
+ `),S=(w,O=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:w,model:s,output:O,usage:this.buildResponsesUsage()}),P=()=>{b||(b=!0,A.enqueue(C("response.created",{type:"response.created",response:S("in_progress")})),A.enqueue(C("response.in_progress",{type:"response.in_progress",response:S("in_progress")})))},M=(w,O)=>{A.enqueue(C("response.output_item.done",{type:"response.output_item.done",output_index:w,item:{...O,status:"completed"}}))},I=w=>{if(!v){if(v=!0,y){let O=T.find($=>$.type==="message");O&&(O.content=[{type:"output_text",text:i}],O.status="completed")}for(let O of T)O.type==="function_call"&&(O.status="completed");return C("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:T,usage:w?{...this.buildResponsesUsage(w)}:this.buildResponsesUsage()}})}},A;return new ReadableStream({async start(w){A=w;try{let O=e.getReader(),$="";for(;;){let{done:D,value:F}=await O.read();if(D)break;$+=o.decode(F,{stream:!0});let W=$.split(`
40
+ `);$=W.pop()||"";for(let Pe of W){let J=Pe.trim();if(!J||J.startsWith("event:")||!J.startsWith("data:"))continue;let ie=J.slice(5).trim();if(ie==="[DONE]")continue;let G;try{G=JSON.parse(ie)}catch{continue}if(G.type==="message_start"&&(a=G.message?.id||a,P()),G.type==="content_block_start"){let L=G.content_block;if(x=L?.type||null,L?.type==="tool_use"){u=L.id||"",p=L.name||"",d="",f=_++;let Q={id:u,type:"function_call",status:"in_progress",call_id:u,name:p,arguments:""};T.push(Q),A.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:f,item:Q}))}if(L?.type==="thinking"&&(h=L.thinking||"",!k)){k=!0,m=_++,g=`rs_${a}`;let Q={id:g,type:"reasoning",status:"in_progress",summary:[]};T.push(Q),A.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:m,item:Q}))}if(L?.type==="text"&&(i=L?.text||"",!y)){y=!0,l=_++,c=`${a}_msg`;let Q={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(Q),A.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:l,item:Q}))}}if(G.type==="content_block_delta"){let L=G.delta;if(L?.type==="text_delta"){if(!y){y=!0,l=_++,c=`${a}_msg`;let Q={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(Q),A.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:l,item:Q}))}i+=L.text||"",A.enqueue(C("response.output_text.delta",{type:"response.output_text.delta",item_id:c,output_index:l,content_index:0,delta:L.text||""}))}L?.type==="thinking_delta"&&(h+=L.thinking||"",A.enqueue(C("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:g||`rs_${a}`,output_index:m>=0?m:0,summary_index:0,delta:L.thinking||""}))),L?.type==="input_json_delta"&&(d+=L.partial_json||"",A.enqueue(C("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u||"call_0",output_index:f>=0?f:0,delta:L.partial_json||""})))}if(G.type==="content_block_stop"){if(x==="tool_use"&&u){A.enqueue(C("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:u,output_index:f,arguments:d}));let L=T.find(Q=>Q.call_id===u);L&&(L.arguments=d,L.status="completed"),L&&M(f,L)}if(x==="text"&&y){A.enqueue(C("response.output_text.done",{type:"response.output_text.done",item_id:c,output_index:l,content_index:0,text:i}));let L=T.find(Q=>Q.type==="message");L&&(L.content=[{type:"output_text",text:i}],M(l,L))}if(x==="thinking"&&k){let L=T.find(Q=>Q.type==="reasoning");L&&(L.summary=[{type:"summary_text",text:h}],M(m,L))}x=null}if(G.type==="message_delta"){let L=I(G.usage);L&&A.enqueue(L)}if(G.type==="message_stop"){let L=I();L&&A.enqueue(L),A.enqueue(r.encode(`data: [DONE]
41
41
 
42
- `))}}}P();let K=I();K&&C.enqueue(K),$="",C.close()}catch(M){C.error(M)}}})}wrapChatInResponses(e){let t=e?.choices?.[0],o=[],r=[];if(t?.message?.content&&r.push({type:"output_text",text:t.message.content}),o.push({type:"message",role:"assistant",content:r}),Array.isArray(t?.message?.tool_calls))for(let s of t.message.tool_calls)o.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:o,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let t=e.output?.find(l=>l.type==="message"),o=e.output?.find(l=>l.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(l=>({type:"url_citation",url_citation:{url:l.url||"",title:l.title||"",content:"",start_index:l.start_index||0,end_index:l.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,a=null,i=null;if(t&&t.reasoning&&(i={content:t.reasoning}),t&&t.content){let l=[],u=[];if(t.content.forEach(p=>{if(p.type==="output_text")l.push(p.text||"");else if(p.type==="output_image"){let d=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});d&&u.push(d)}else if(p.type==="output_image_base64"){let d=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});d&&u.push(d)}}),u.length>0){let p=[];l.length>0&&p.push({type:"text",text:l.join("")}),p.push(...u),s=p}else s=l.join("")}return o&&(a=[{id:o.call_id||o.id,function:{name:o.name,arguments:o.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:i,annotations:r},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0,prompt_tokens_details:{cached_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_tokens:this.getCacheCreationInputTokens(e.usage)},cache_read_input_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_input_tokens:this.getCacheCreationInputTokens(e.usage)}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}}});var xr,ee,Dn=w(()=>{"use strict";xr=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let t=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,t),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let o=this.cache.keys().next().value;o!==void 0&&this.cache.delete(o)}this.cache.set(e,t)}values(){return Array.from(this.cache.values())}delete(e){return this.cache.delete(e)}},ee=new xr(100)});function Fn(n,e){n&&st.set(n,{...e,provider:n,capturedAt:Date.now()})}function Nt(n){let e=st.get(n);return e?{...e}:void 0}function Un(){return Array.from(st.values()).map(n=>({...n}))}function du(){try{if(!(0,xe.existsSync)(Cr))return;let n=JSON.parse((0,xe.readFileSync)(Cr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>1440*60*1e3)continue;st.set(t.provider,t)}}catch{}}function Mi(){try{if(st.size===0)return;(0,xe.existsSync)(Sr)||(0,xe.mkdirSync)(Sr,{recursive:!0}),(0,xe.writeFileSync)(Cr,JSON.stringify(Array.from(st.values()),null,2),"utf-8")}catch{}}function it(){Oi||(Oi=!0,du(),Ii=setInterval(Mi,6e4),Ii.unref?.(),process.on("exit",Mi))}var xe,Rr,Li,Sr,Cr,st,Oi,Ii,at=w(()=>{"use strict";xe=require("fs"),Rr=require("path"),Li=require("@wengine-ai/claude-code-router-shared"),Sr=(0,Rr.join)(Li.HOME_DIR,"runtime"),Cr=(0,Rr.join)(Sr,"quota-store.json"),st=new Map,Oi=!1,Ii=null});function Se(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!pu.test(e)))return e}function Ce(n){if(!n)return;if(typeof n=="object")return Se(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=Se(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return Se(e.slice(o+t.length))}var pu,ct=w(()=>{"use strict";pu=/^[A-Za-z0-9_-]+$/});function ku(){if(lt.size<=Ni)return;let n=[...lt.keys()].slice(0,lt.size-Ni);for(let e of n)lt.delete(e)}function Tu(){if(ut.size<=$i)return;let n=[...ut].slice(0,ut.size-$i);for(let e of n)ut.delete(e)}function vu(n){let e=n.trim();if(!e||e==="."||e===".."||/[/\\\0]/.test(e))return[];let t=e.replace(/^sess_/,"");return[...new Set([e,t,`sess_${t}`])].filter(Boolean)}function xu(n,e){let t;try{t=(0,Fi.openSqliteDatabase)(n,{readonly:!0}).db;let o=t.prepare("SELECT workspace_path FROM tasks WHERE task_id = ? OR acp_session_id = ? ORDER BY updated_at DESC LIMIT 1");for(let r of e){let a=o.get(r,r)?.workspace_path;if(typeof a=="string"&&a.trim())return a.trim()}return null}catch{return null}finally{try{t?.close()}catch{}}}async function Su(n,e){let t;try{t=await(0,jn.readdir)(n)}catch{return null}for(let o of t)for(let r of e){let s=(0,he.join)(n,o,`${r}.json`);if((0,wr.existsSync)(s))try{let a=JSON.parse(await(0,jn.readFile)(s,"utf8")),i=a?.meta?.workspacePath??a?.workspacePath;if(typeof i=="string"&&i.trim())return i.trim()}catch{}}return null}async function Ui(n){let e=typeof n=="string"?n.trim():"";if(!e)return null;let t=lt.get(e);if(t)return t;let o=async()=>{let r=vu(e);if(r.length===0)return null;let s=(0,he.join)(fu(),mu),a=(0,he.join)(s,gu);if((0,wr.existsSync)(a)){let i=xu(a,r);if(i)return i}return Su((0,he.join)(s,hu),r)};try{let r=await o();if(!r&&!ut.has(e)){ut.add(e),Tu();for(let a=0;a<yu&&!r;a++)await _u(bu),r=await o()}if(!r||!(0,he.isAbsolute)(r))return null;let s=(0,he.normalize)(r);return lt.set(e,s),ku(),s}catch{return null}}var wr,jn,Di,he,Fi,fu,mu,gu,hu,Ni,$i,yu,bu,lt,ut,_u,ji=w(()=>{"use strict";wr=require("fs"),jn=require("fs/promises"),Di=require("os"),he=require("path"),Fi=require("@wengine-ai/claude-code-router-shared"),fu=()=>process.env.CCR_ZCODE_DIR||(0,he.join)((0,Di.homedir)(),".zcode"),mu="v2",gu="tasks-index.sqlite",hu="sessions",Ni=500,$i=500,yu=3,bu=50,lt=new Map,ut=new Set,_u=n=>new Promise(e=>setTimeout(e,n))});function Ji(n){return typeof n=="string"&&n.length<=Cu}function Ru(n){if(!(!n?.headers||typeof n.headers!="object"))for(let e of Bi){let{value:t}=Hn(n,e);if(!Ji(t))continue;let o=Se(t);if(o)return o}}function Pu(n){if(typeof n=="string")return n.slice(0,1e3);if(Array.isArray(n)){let e=n.find(t=>t&&typeof t.text=="string");return e?String(e.text).slice(0,1e3):""}return""}function Eu(n){if(typeof n?.pathname=="string")return n.pathname;if(typeof n?.url!="string")return"";try{return new URL(n.url,"http://127.0.0.1").pathname}catch{return n.url}}function Hn(n,e){let t=n?.headers;if(!t||typeof t!="object")return{present:!1};let o=Object.keys(t).find(s=>s.toLowerCase()===e);if(!o)return{present:!1};let r=t[o];return typeof r=="string"?{present:!0,value:r.trim()}:Array.isArray(r)&&typeof r[0]=="string"?{present:!0,value:r[0].trim()}:{present:!0}}function Hi(n,e){if(!(!n?.headers||typeof n.headers!="object"))for(let t of Object.keys(n.headers))t.toLowerCase()===e&&delete n.headers[t]}function $t(n,e=!0){return{clientType:n,usageScope:"request",supportsExplicitExtendedContext:e}}function Pr(n,e,t=!0){let o=Ce(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function Ar(n){return typeof n=="string"&&wu.includes(n)}function Fu(n,e){return/zcode/i.test(e)?!0:Object.keys(n).some(t=>t.toLowerCase().startsWith("x-zcode"))}function Be(n){if(Ar(n?.clientType))return n.clientType;let e=Eu(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=Pu(r.system);if(/\bYou are Qwen Code\b/i.test(s)||/Qwen Code, an interactive CLI agent/i.test(s))return"qwen-code";if(/operating inside pi\b/i.test(s)||/a coding agent harness/i.test(s))return"pi";if(/\bYou are opencode\b/i.test(s))return"opencode";if(Hn(n,zn.CCR_PROJECT_HEADER).present||Hn(n,"x-session-affinity").present)return"pi";if(Fu(t,o))return"zcode";let a=t["x-anthropic-billing-header"];if(typeof a=="string"&&a.includes("cc_version="))return"claude-code";if(o.includes("codex")||o.includes("Codex")||e.endsWith("/v1/responses"))return"codex";if(r.metadata&&typeof r.metadata=="object"&&typeof r.metadata.user_id=="string")return"claude-code";if(o.includes("opencode"))return"opencode";if(o.includes("pi-coding-agent"))return"pi";if(o.includes("QwenCode"))return"qwen-code";let i=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(i)?o.includes("Anthropic/")?"pi":o.includes("claude-cli")||o.includes("Claude-CLI")?"qwen-code":typeof t["x-stainless-package-version"]=="string"?"pi":"claude-code":o.includes("claude-cli")||o.includes("Claude-CLI")?"claude-code":String(i).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function Or(n){return Er[n]}function Uu(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||(0,zi.randomUUID)();return n.__ccrRequestScopeId=e,e}function Ae(n,e={}){let t=Be(n),o=Or(t).createContext(n,e),r=o.usageScope==="session"&&o.stableSessionId?o.stableSessionId:Uu(n),s=o.usageScope==="session"?"session":"request";n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,o.projectHeaderPresent?n.projectId=o.projectId:delete n.projectId,Hi(n,zn.CCR_PROJECT_HEADER),t==="pi"&&o.stableSessionId&&(n.__ccrSessionAffinity=o.stableSessionId);for(let a of Bi)Hi(n,a);return n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function Wi(){}var zi,zn,Bi,Cu,wu,Au,Ou,Iu,Mu,Lu,Nu,$u,Du,Er,dt=w(()=>{"use strict";zi=require("node:crypto"),zn=require("@wengine-ai/claude-code-router-shared");ct();Bi=["x-session-affinity","x-session-id","x-litellm-session-id"],Cu=256;wu=["claude-code","zcode","pi","qwen-code","opencode","codex","api","unknown"];Au={type:"claude-code",createContext(n){return Pr(n,"claude-code")}},Ou={type:"zcode",createContext(n){return Pr(n,"zcode")}},Iu={type:"pi",createContext(n){let e=Hn(n,zn.CCR_PROJECT_HEADER),t=Ru(n)||(typeof n?.__ccrSessionAffinity=="string"?n.__ccrSessionAffinity:void 0)||Ce(n?.body?.metadata?.user_id),o=Ji(t)?t:void 0;return{...$t("pi",!1),stableSessionId:o,projectId:e.value,projectHeaderPresent:e.present}}},Mu={type:"qwen-code",createContext(n){return Pr(n,"qwen-code")}},Lu={type:"opencode",createContext(){return $t("opencode")}},Nu={type:"codex",createContext(){return $t("codex")}},$u={type:"api",createContext(){return $t("api")}},Du={type:"unknown",createContext(){return $t("unknown")}},Er={"claude-code":Au,zcode:Ou,pi:Iu,"qwen-code":Mu,opencode:Lu,codex:Nu,api:$u,unknown:Du}});function ce(n,e,t,o){let r=Ir(e,t);if(r.code==="model_unhealthy"){let i=X(e,t,!0);if(i)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),i}let s=n.sessionId||n.clientContext?.stableSessionId,a=Yi[r.code]||502;throw new re(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:a})}function Kn(n){let e=n||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function Ut(n){let e=Kn(n),t=e.includes("[1m]")||e.endsWith("[1m"),o=e.replace(/\[1m\]|\[1m$/g,""),r=o.match(/^ccr-(opus|sonnet|haiku)$/i);if(r)return{family:r[1].toLowerCase(),extended:t,isCcrAlias:!0};let s=o.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||o.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:t,isCcrAlias:!1}:{family:null,extended:t,isCcrAlias:!1}}function zu(n,e){if(!e||!n)return null;let t=Kn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=Ut(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let a=Kn(r);if(a&&t.includes(a))return s}return null}function Bu(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function Bn(n){if(!n?.includes(","))return null;let[e,...t]=n.split(","),o=e.trim(),r=t.join(",").trim();return!o||!r?null:{providerName:o,routeModel:r}}function Dt(n,e,t){let o=n.find(s=>s.name.toLowerCase()===e.toLowerCase());if(!o||o.enabled===!1)return null;let r=o.models?.find(s=>String(s).toLowerCase()===t.toLowerCase());return r?{provider:o,model:String(r)}:null}function Ir(n,e){let t=Bn(n);if(!t)return{reason:`invalid model format "${n}" (expected "provider,model")`,code:"invalid_model_format"};let{providerName:o,routeModel:r}=t,s=e.find(l=>l.name?.toLowerCase()===o.toLowerCase());if(!s)return{reason:`provider "${o}" not found`,code:"provider_not_found"};if(s.enabled===!1)return{reason:`provider "${o}" is disabled`,code:"provider_disabled"};let a=s.models?.find(l=>String(l).toLowerCase()===r.toLowerCase());if(!a)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(a),s.apiKey?.startsWith("ccr-managed-")===!0||s.api_key?.startsWith("ccr-managed-")===!0))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let c=Nt(s.name);if(c){let l=c.limitDaily!==void 0&&c.usedDailyBalance!==void 0&&c.usedDailyBalance>=c.limitDaily,u=c.totalBalance!==void 0&&c.usedBalance!==void 0&&c.usedBalance>=c.totalBalance;if(l||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function X(n,e,t,o,r,s,a){let i=Bn(n);if(!i)return a?null:n;let{providerName:c,routeModel:l}=i,u=Dt(e,c,l);if(!u){if(r===!0&&o&&!t&&s!==!1){let d=et(),m=d.getPromotion(c,l,o,e);if(m){let h=Bn(m);if(h){let f=Dt(e,h.providerName,h.routeModel);if(f)return`${f.provider.name},${f.model}`}d.clear(c,l,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let d=et(),m=d.getPromotion(c,l,o,e);if(m){let h=Bn(m);if(h){let f=Dt(e,h.providerName,h.routeModel);if(f)return`${f.provider.name},${f.model}`}d.clear(c,l,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model,u.provider.apiKey?.startsWith("ccr-managed-")===!0||u.provider.api_key?.startsWith("ccr-managed-")===!0))return null;let p=Nt(u.provider.name);if(p){let d=p.limitDaily!==void 0&&p.usedDailyBalance!==void 0&&p.usedDailyBalance>=p.limitDaily,m=p.totalBalance!==void 0&&p.usedBalance!==void 0&&p.usedBalance>=p.totalBalance;if(d||m)return null}return`${u.provider.name},${u.model}`}function oe(n,e,t,o,r,s){let a=j(),i=[t?.[n],o?.[n]];for(let c of i)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let u=X(l,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Ju(n){return n.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function jt(n){let e=Kn(n);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(o=>o.test(e))}function Xi(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,Bu(e))}function Zi(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Wu(n,e,t,o,r,s,a,i,c,l,u,p){let d=n.clientContext,m=d?.longContextThreshold??t.longContextThreshold??c??6e4,h=Xi(e,r,d),f=n.modelFamily,g=Zi(d,t,l),y=d?.supportsExplicitExtendedContext!==!1&&s===!0;if((y||h>g)&&t.extendedContext){let k=X(t.extendedContext,o,!1,"extendedContext",i,p,u);if(k)return n.log.info(`Family: using extended context model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${y}, threshold: ${g}`),{model:k,scenarioType:"extendedContext",isFallback:!1};let v=i?oe("extendedContext",o,t.fallback,a,f,u):null;if(v)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${y}, threshold: ${g}`),{model:v,scenarioType:"extendedContext",isFallback:!0};if(u){let x=ce(n,t.extendedContext,o,"extendedContext");if(x)return{model:x,scenarioType:"extendedContext",isFallback:!1}}n.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(h>m&&(t.longContext||t.fallback?.longContext?.length||a?.longContext?.length)){let k=t.longContext?X(t.longContext,o,!1,"longContext",i,p,u):null;if(k)return n.log.info(`Family: using long context model, tokens: ${h}, estimated: ${e}`),{model:k,scenarioType:"longContext",isFallback:!1};let v=i?oe("longContext",o,t.fallback,a,f,u):null;if(v)return n.log.info(`Family: using long context fallback model, tokens: ${h}, estimated: ${e}`),{model:v,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=ce(n,t.longContext,o,"longContext");if(x)return{model:x,scenarioType:"longContext",isFallback:!1}}n.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(n.body.tools)&&n.body.tools.some(k=>k.type?.startsWith("web_search"))&&t.webSearch){let k=X(t.webSearch,o,!1,"webSearch",i,p,u);if(k)return{model:k,scenarioType:"webSearch",isFallback:!1};let v=i?oe("webSearch",o,t.fallback,a,f,u):null;if(v)return n.log.info("Family: using webSearch fallback model"),{model:v,scenarioType:"webSearch",isFallback:!0};if(u){let x=ce(n,t.webSearch,o,"webSearch");if(x)return{model:x,scenarioType:"webSearch",isFallback:!1}}n.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(n.body.thinking?.type==="enabled"&&t.think){let k=X(t.think,o,!1,"think",i,p,u);if(k)return{model:k,scenarioType:"think",isFallback:!1};let v=i?oe("think",o,t.fallback,a,f,u):null;if(v)return n.log.info("Family: using think fallback model"),{model:v,scenarioType:"think",isFallback:!0};if(u){let x=ce(n,t.think,o,"think");if(x)return{model:x,scenarioType:"think",isFallback:!1}}n.log.warn("Family: think model unavailable (fail pool), skipping")}if(t.default){let k=X(t.default,o,!1,"default",i,p,u);if(k)return{model:k,scenarioType:"default",isFallback:!1};let v=i?oe("default",o,t.fallback,a,f,u):null;if(v)return n.log.info("Family: using default fallback model"),{model:v,scenarioType:"default",isFallback:!0};if(u){let x=ce(n,t.default,o,"default");if(x)return{model:x,scenarioType:"default",isFallback:!1}}n.log.warn("Family: default model unavailable (fail pool), skipping")}return null}function Yu(){if(Je.size<=Ki)return;let n=[...Je.keys()].slice(0,Je.size-Ki);for(let e of n)Je.delete(e)}function Xu(){if(pt.size<=Gi)return;let n=[...pt].slice(0,pt.size-Gi);for(let e of n)pt.delete(e)}var Qi,Jn,Gn,Wn,de,Yi,re,ye,Ft,Hu,Ku,Ht,Je,Ki,pt,Gi,Gu,Vu,Qu,Vi,Mr,We=w(()=>{"use strict";Qi=require("tiktoken");Dn();Jn=require("fs/promises"),Gn=require("fs/promises"),Wn=require("path"),de=require("@wengine-ai/claude-code-router-shared");ue();at();On();$n();ct();ji();dt();Yi={provider_not_found:404,model_not_found:404,invalid_model_format:400,provider_disabled:503,model_unhealthy:503,quota_exhausted:503,resolution_failed:502,project_config_error:500,invalid_project_id:400,project_config_not_found:404},re=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||Yi[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ye=(0,Qi.get_encoding)("cl100k_base"),Ft=(n,e,t)=>{let o=0;return Array.isArray(n)&&n.forEach(r=>{typeof r.content=="string"?o+=ye.encode(r.content).length:Array.isArray(r.content)&&r.content.forEach(s=>{if(s.type==="text")o+=ye.encode(s.text).length;else if(s.type==="tool_use")o+=ye.encode(JSON.stringify(s.input)).length;else if(s.type==="tool_result"){let a=s.content;if(Array.isArray(a))for(let i of a)i?.type!=="image"&&(o+=ye.encode(i?.type==="text"?String(i.text??""):JSON.stringify(i)).length);else o+=ye.encode(typeof a=="string"?a:JSON.stringify(a)).length}})}),typeof e=="string"?o+=ye.encode(e).length:Array.isArray(e)&&e.forEach(r=>{r.type==="text"&&(typeof r.text=="string"?o+=ye.encode(r.text).length:Array.isArray(r.text)&&r.text.forEach(s=>{o+=ye.encode(s||"").length}))}),t&&t.forEach(r=>{r.description&&(o+=ye.encode(r.name+r.description).length),r.input_schema&&(o+=ye.encode(JSON.stringify(r.input_schema)).length)}),o},Hu=async(n,e)=>{let t=n.clientContext?.projectHeaderPresent===!0,o=n.clientContext?.projectId;if(t&&(typeof o!="string"||o.length===0||o.length>1024||o==="."||o===".."||/[/\\\0]/.test(o)))throw new re(`Project routing error: invalid managed project id "${String(o)}".`,{configuredTarget:String(o),code:"invalid_project_id"});let r=t?o:n.sessionId?await Mr(n.sessionId):null;if(!r&&!t&&n.clientType==="zcode"&&n.sessionId){let s=await Ui(n.sessionId);s&&(0,de.isZcodeProjectTakeoverActive)(s)&&(r=(0,de.getClaudeProjectId)(s))}if(r){n.projectId=r;let s=(0,Wn.join)(de.HOME_DIR,r,"config.json");if(!t&&n.sessionId){let a=(0,Wn.join)(de.HOME_DIR,r,`${n.sessionId}.json`);try{let i=JSON.parse(await(0,Jn.readFile)(a,"utf8"));if(i&&i.Router&&Object.keys(i.Router).length>0)return i.Router}catch{}}try{let a=JSON.parse(await(0,Jn.readFile)(s,"utf8"));if(t&&(typeof a?.projectPath!="string"||(0,de.getClaudeProjectId)(a.projectPath)!==o))throw new re(`Project routing error: managed project id "${o}" does not match its stored project path.`,{configuredTarget:s,code:"invalid_project_id"});if(a&&a.Router&&Object.keys(a.Router).length>0)return a.Router}catch(a){if(a instanceof re)throw a;if(t&&a?.code==="ENOENT")throw new re(`Project routing error: managed project "${o}" no longer has a project config.`,{configuredTarget:s,code:"project_config_not_found"});if(!a||a.code!=="ENOENT"){let i=n.sessionId||n.clientContext?.stableSessionId;throw new re(`Project routing error: project config.json is malformed or unreadable in project "${r}". ${a.message}. Session: "${i||"unknown"}".`,{sessionId:i,configuredTarget:s,code:"project_config_error",statusCode:500})}}}};Ku=async(n,e,t,o,r,s)=>{let a=t.get("providers")||[],i=r||t.get("Router"),c=i?.enableFallback===!0,l=c?i?.fallback:void 0,u=c&&!s?l||t.get("fallback"):l,p=!s,d=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let T=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);T&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${T[1]}</CCR-SUBAGENT-MODEL>`,""),d=T[1])}let{family:m,extended:h,isCcrAlias:f}=Ut(n.body.model),g=i?.families?.[m||""];if(g&&i?.enableFamilyRouting){n.log.info(`Using model family routing for: ${m}${h?" (1M)":""}`),n.modelFamily=m,n.familyFallback=g.fallback;let T=Wu(n,e,g,a,o,h,u,c,i?.longContextThreshold,i?.extendedContextThreshold,s,p);if(T)return{model:T.model,scenarioType:T.scenarioType}}if(n.body.model.includes(",")&&!s){let T=X(n.body.model,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let R=c?oe("default",a,void 0,u,void 0,s):null;if(R)return n.log.info(`Using fallback for explicit model: ${R}`),{model:R,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let y=f&&!i?.enableFamilyRouting?null:zu(n.body.model,i?.models);if(y){let T=X(y,a,!1,"modelMapping",c,p,s);if(T)return n.log.info(`Using mapped model for ${n.body.model}: ${y}`),{model:T,scenarioType:"modelMapping"};let R=c?oe("modelMapping",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"modelMapping"};if(s){let S=ce(n,y,a,"modelMapping");if(S)return{model:S,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${y} unavailable (fail pool), skipping`)}let _=n.clientContext,b=Xi(e,o,_),k=Zi(_,void 0,i?.extendedContextThreshold);if(b>k&&i?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${b}, estimated: ${e}, threshold: ${k}`);let T=X(i.extendedContext,a,!1,"extendedContext",c,p,s);if(T)return{model:T,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${i.extendedContext} unavailable (fail pool), trying fallback`);let R=c?oe("extendedContext",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"extendedContext"};if(s){let S=ce(n,i.extendedContext,a,"extendedContext");if(S)return{model:S,scenarioType:"extendedContext"}}}let v=_?.longContextThreshold??i?.longContextThreshold??6e4;if(b>v&&i?.longContext){n.log.info(`Using long context model due to token count: ${b}, estimated: ${e}, threshold: ${v}`);let T=X(i.longContext,a,!1,"longContext",c,p,s);if(T)return{model:T,scenarioType:"longContext"};n.log.warn(`Long context model ${i.longContext} unavailable (fail pool), trying fallback`);let R=c?oe("longContext",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"longContext"};if(s){let S=ce(n,i.longContext,a,"longContext");if(S)return{model:S,scenarioType:"longContext"}}}if(!s&&d)return n.subagentOverrideModel=d,{model:d,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&i?.background){n.log.info(`Using background model for ${n.body.model}`);let T=X(i.background,a,!1,"background",c,p,s);if(T)return{model:T,scenarioType:"background"};let R=c?oe("background",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"background"};if(s){let S=ce(n,i.background,a,"background");if(S)return{model:S,scenarioType:"background"}}n.log.warn(`Background model ${i.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(T=>T.type?.startsWith("web_search"))&&i?.webSearch){let T=X(i.webSearch,a,!1,"webSearch",c,p,s);if(T)return{model:T,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${i.webSearch} unavailable (fail pool), trying fallback`);let R=c?oe("webSearch",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"webSearch"};if(s){let S=ce(n,i.webSearch,a,"webSearch");if(S)return{model:S,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&i?.think){n.log.info(`Using think model for ${n.body.thinking}`);let T=X(i.think,a,!1,"think",c,p,s);if(T)return{model:T,scenarioType:"think"};n.log.warn(`Think model ${i.think} unavailable (fail pool), trying fallback`);let R=c?oe("think",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"think"};if(s){let S=ce(n,i.think,a,"think");if(S)return{model:S,scenarioType:"think"}}}if(i?.default){let T=X(i.default,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Default model ${i.default} unavailable (fail pool), trying fallback`);let R=c?oe("default",a,void 0,u,void 0,s):null;if(R)return{model:R,scenarioType:"default"};let S=X(i.default,a,!0,"default",c,p,s);if(S)return n.log.warn(`No fallback available; retrying default model ${i.default} despite fail-pool state (strict=${s})`),{model:S,scenarioType:"default"}}if(s){let T=ce(n,i?.default||n.body.model,a,"default");if(T)return{model:T,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Ht=async(n,e,t)=>{let{configService:o,event:r}=t;!n.originalModel&&n.body.model&&(n.originalModel=n.body.model),(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&Ae(n,o.getAll());let s=await Hu(n,o),a=s||o.get("Router"),i=a?.enableFallback===!0,c=o.get("providers")||[],l=!!s;n.enableFallback=i,n.strictProjectRouting=l,n.fallbackConfig=l?a?.fallback:a?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??ee.get(n.usageCacheKey):void 0,{messages:p,system:d=[],tools:m}=n.body,h=o.get("REWRITE_SYSTEM_PROMPT");if(h&&d.length>1&&d[1]?.text?.includes("<env>")){let f=await(0,Jn.readFile)(h,"utf-8");d[1].text=`${f}<env>${d[1].text.split("<env>").pop()}`}try{let[f,g]=n.body.model.split(","),y=t.tokenizerService?.getTokenizerConfigForModel(f,g),_;t.tokenizerService?_=(await t.tokenizerService.countTokens({messages:p,system:d,tools:m},y,f)).tokenCount:_=Ft(p,d,m),n.tokenCount=_;let b,k=l?void 0:o.get("CUSTOM_ROUTER_PATH");if(k)try{b=await require(k)(n,o.getAll(),{event:r})}catch(R){n.log.error(`failed to load custom router: ${R.message}`)}if(b)n.scenarioType="default";else{let R=await Ku(n,_,o,u,s,!!s);b=R.model,n.scenarioType=R.scenarioType}let{family:v}=Ut(n.originalModel||n.body.model),x=a?.enableFamilyRouting&&v?a.families?.[v]:void 0,T=[x?.image,a?.image].filter((R,S,P)=>!!R&&P.indexOf(R)===S);if(T.length>0&&Ju(n)&&!jt(b))if(T.includes(b))n.scenarioType="image";else{let R=T.map(S=>X(S,c,!1,"image",i,!l,l)).find(S=>!!S);if(R)n.log.info(`Using image model fallback for ${b}`),b=R,n.scenarioType="image";else{let S=i?oe("image",c,x?.fallback,n.fallbackConfig,v||void 0,l):null;if(S)n.log.info(`Using image fallback model: ${S}`),b=S,n.scenarioType="image";else if(l){let P=ce(n,T[0],c,"image");P&&(b=P,n.scenarioType="image")}else n.log.warn(`Image models ${T.join(", ")} unavailable (fail pool), keeping ${b}`),n.scenarioType="image"}}if(a?.enableConcurrencyPriority===!0&&!(n.originalModel||"").includes(",")&&!n.subagentOverrideModel&&typeof b=="string"&&b.trim()){let R=n.scenarioType||"default",S=[...(n.familyFallback||{})[R]||[],...(n.fallbackConfig||{})[R]||[]];b=Ei(n,b,{threshold:Number(a?.concurrencyThreshold)||3,fallbackModels:S,resolve:P=>X(P,c,!1,R,i,!l,l),log:P=>n.log.info(P)})}typeof b=="string"&&b.trim()?n.body.model=b:(n.log.warn(`Router could not resolve a valid model for ${n.originalModel||n.body.model}; keeping original request model`),n.scenarioType=n.scenarioType||"default")}catch(f){if(f instanceof re)throw f;if(n.log.error(`Error in router middleware: ${f.message}`),l){let g=n.sessionId||n.clientContext?.stableSessionId;throw new re(`Project routing error: router failure in project mode. ${f.message}. Session: "${g||"unknown"}".`,{sessionId:g,configuredTarget:a?.default,code:"project_router_failure",statusCode:502})}n.body.model=a?.default,n.scenarioType="default"}},Je=new Map,Ki=1e3,pt=new Set,Gi=1e3,Gu=3,Vu=50,Qu=n=>new Promise(e=>setTimeout(e,n));Vi=async n=>{let e=await(0,Gn.opendir)(de.CLAUDE_PROJECTS_DIR),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let a=(0,Wn.join)(de.CLAUDE_PROJECTS_DIR,s,`${n}.jsonl`);try{return(await(0,Gn.stat)(a)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Mr=async n=>{let e=Se(n);if(!e)return null;if(Je.has(e))return Je.get(e)||null;try{let t=await Vi(e);if(!t&&!pt.has(e)){pt.add(e),Xu();for(let o=0;o<Gu&&!t;o++)await Qu(Vu),t=await Vi(e)}return t?(Je.set(e,t),Yu(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function zt(n){let e=[],t=Array.isArray(n.input)?n.input:[n.input];for(let o of t)if(o.type==="function_call")e.push({role:"assistant",tool_calls:[{id:o.call_id,type:"function",function:{name:o.name,arguments:o.arguments||"{}"}}]});else if(o.type==="function_call_output")e.push({role:"tool",tool_call_id:o.call_id,content:typeof o.output=="string"?o.output:JSON.stringify(o.output)});else if(o.type==="reasoning"){let r=Array.isArray(o.summary)?o.summary.filter(s=>s.type==="summary_text"&&s.text).map(s=>s.text).join(`
42
+ `))}}}P();let H=I();H&&A.enqueue(H),$="",A.close()}catch(O){A.error(O)}}})}wrapChatInResponses(e){let t=e?.choices?.[0],o=[],r=[];if(t?.message?.content&&r.push({type:"output_text",text:t.message.content}),o.push({type:"message",role:"assistant",content:r}),Array.isArray(t?.message?.tool_calls))for(let s of t.message.tool_calls)o.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:o,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let t=e.output?.find(l=>l.type==="message"),o=e.output?.find(l=>l.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(l=>({type:"url_citation",url_citation:{url:l.url||"",title:l.title||"",content:"",start_index:l.start_index||0,end_index:l.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,a=null,i=null;if(t&&t.reasoning&&(i={content:t.reasoning}),t&&t.content){let l=[],u=[];if(t.content.forEach(p=>{if(p.type==="output_text")l.push(p.text||"");else if(p.type==="output_image"){let d=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});d&&u.push(d)}else if(p.type==="output_image_base64"){let d=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});d&&u.push(d)}}),u.length>0){let p=[];l.length>0&&p.push({type:"text",text:l.join("")}),p.push(...u),s=p}else s=l.join("")}return o&&(a=[{id:o.call_id||o.id,function:{name:o.name,arguments:o.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:i,annotations:r},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0,prompt_tokens_details:{cached_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_tokens:this.getCacheCreationInputTokens(e.usage)},cache_read_input_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_input_tokens:this.getCacheCreationInputTokens(e.usage)}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}}});var xr,ee,Dn=R(()=>{"use strict";xr=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let t=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,t),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let o=this.cache.keys().next().value;o!==void 0&&this.cache.delete(o)}this.cache.set(e,t)}values(){return Array.from(this.cache.values())}delete(e){return this.cache.delete(e)}},ee=new xr(100)});function Fn(n,e){n&&it.set(n,{...e,provider:n,capturedAt:Date.now()})}function Nt(n){let e=it.get(n);return e?{...e}:void 0}function Un(){return Array.from(it.values()).map(n=>({...n}))}function pu(){try{if(!(0,xe.existsSync)(Cr))return;let n=JSON.parse((0,xe.readFileSync)(Cr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>1440*60*1e3)continue;it.set(t.provider,t)}}catch{}}function Mi(){try{if(it.size===0)return;(0,xe.existsSync)(Sr)||(0,xe.mkdirSync)(Sr,{recursive:!0}),(0,xe.writeFileSync)(Cr,JSON.stringify(Array.from(it.values()),null,2),"utf-8")}catch{}}function at(){Oi||(Oi=!0,pu(),Ii=setInterval(Mi,6e4),Ii.unref?.(),process.on("exit",Mi))}var xe,Rr,Li,Sr,Cr,it,Oi,Ii,ct=R(()=>{"use strict";xe=require("fs"),Rr=require("path"),Li=require("@wengine-ai/claude-code-router-shared"),Sr=(0,Rr.join)(Li.HOME_DIR,"runtime"),Cr=(0,Rr.join)(Sr,"quota-store.json"),it=new Map,Oi=!1,Ii=null});function Se(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!fu.test(e)))return e}function Ce(n){if(!n)return;if(typeof n=="object")return Se(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=Se(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return Se(e.slice(o+t.length))}var fu,lt=R(()=>{"use strict";fu=/^[A-Za-z0-9_-]+$/});function Tu(){if(ut.size<=Ni)return;let n=[...ut.keys()].slice(0,ut.size-Ni);for(let e of n)ut.delete(e)}function vu(){if(dt.size<=$i)return;let n=[...dt].slice(0,dt.size-$i);for(let e of n)dt.delete(e)}function xu(n){let e=n.trim();if(!e||e==="."||e===".."||/[/\\\0]/.test(e))return[];let t=e.replace(/^sess_/,"");return[...new Set([e,t,`sess_${t}`])].filter(Boolean)}function Su(n,e){let t;try{t=(0,Fi.openSqliteDatabase)(n,{readonly:!0}).db;let o=t.prepare("SELECT workspace_path FROM tasks WHERE task_id = ? OR acp_session_id = ? ORDER BY updated_at DESC LIMIT 1");for(let r of e){let a=o.get(r,r)?.workspace_path;if(typeof a=="string"&&a.trim())return a.trim()}return null}catch{return null}finally{try{t?.close()}catch{}}}async function Cu(n,e){let t;try{t=await(0,jn.readdir)(n)}catch{return null}for(let o of t)for(let r of e){let s=(0,he.join)(n,o,`${r}.json`);if((0,wr.existsSync)(s))try{let a=JSON.parse(await(0,jn.readFile)(s,"utf8")),i=a?.meta?.workspacePath??a?.workspacePath;if(typeof i=="string"&&i.trim())return i.trim()}catch{}}return null}async function Ui(n){let e=typeof n=="string"?n.trim():"";if(!e)return null;let t=ut.get(e);if(t)return t;let o=async()=>{let r=xu(e);if(r.length===0)return null;let s=(0,he.join)(mu(),gu),a=(0,he.join)(s,hu);if((0,wr.existsSync)(a)){let i=Su(a,r);if(i)return i}return Cu((0,he.join)(s,yu),r)};try{let r=await o();if(!r&&!dt.has(e)){dt.add(e),vu();for(let a=0;a<_u&&!r;a++)await ku(bu),r=await o()}if(!r||!(0,he.isAbsolute)(r))return null;let s=(0,he.normalize)(r);return ut.set(e,s),Tu(),s}catch{return null}}var wr,jn,Di,he,Fi,mu,gu,hu,yu,Ni,$i,_u,bu,ut,dt,ku,ji=R(()=>{"use strict";wr=require("fs"),jn=require("fs/promises"),Di=require("os"),he=require("path"),Fi=require("@wengine-ai/claude-code-router-shared"),mu=()=>process.env.CCR_ZCODE_DIR||(0,he.join)((0,Di.homedir)(),".zcode"),gu="v2",hu="tasks-index.sqlite",yu="sessions",Ni=500,$i=500,_u=3,bu=50,ut=new Map,dt=new Set,ku=n=>new Promise(e=>setTimeout(e,n))});function Ji(n){return typeof n=="string"&&n.length<=Ru}function wu(n){if(!(!n?.headers||typeof n.headers!="object"))for(let e of Bi){let{value:t}=Hn(n,e);if(!Ji(t))continue;let o=Se(t);if(o)return o}}function Eu(n){if(typeof n=="string")return n.slice(0,1e3);if(Array.isArray(n)){let e=n.find(t=>t&&typeof t.text=="string");return e?String(e.text).slice(0,1e3):""}return""}function Au(n){if(typeof n?.pathname=="string")return n.pathname;if(typeof n?.url!="string")return"";try{return new URL(n.url,"http://127.0.0.1").pathname}catch{return n.url}}function Hn(n,e){let t=n?.headers;if(!t||typeof t!="object")return{present:!1};let o=Object.keys(t).find(s=>s.toLowerCase()===e);if(!o)return{present:!1};let r=t[o];return typeof r=="string"?{present:!0,value:r.trim()}:Array.isArray(r)&&typeof r[0]=="string"?{present:!0,value:r[0].trim()}:{present:!0}}function Hi(n,e){if(!(!n?.headers||typeof n.headers!="object"))for(let t of Object.keys(n.headers))t.toLowerCase()===e&&delete n.headers[t]}function $t(n,e=!0){return{clientType:n,usageScope:"request",supportsExplicitExtendedContext:e}}function Pr(n,e,t=!0){let o=Ce(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function Ar(n){return typeof n=="string"&&Pu.includes(n)}function Uu(n,e){return/zcode/i.test(e)?!0:Object.keys(n).some(t=>t.toLowerCase().startsWith("x-zcode"))}function Be(n){if(Ar(n?.clientType))return n.clientType;let e=Au(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=Eu(r.system);if(/\bYou are Qwen Code\b/i.test(s)||/Qwen Code, an interactive CLI agent/i.test(s))return"qwen-code";if(/operating inside pi\b/i.test(s)||/a coding agent harness/i.test(s))return"pi";if(/\bYou are opencode\b/i.test(s))return"opencode";if(Hn(n,zn.CCR_PROJECT_HEADER).present||Hn(n,"x-session-affinity").present)return"pi";if(Uu(t,o))return"zcode";let a=t["x-anthropic-billing-header"];if(typeof a=="string"&&a.includes("cc_version="))return"claude-code";if(o.includes("codex")||o.includes("Codex")||e.endsWith("/v1/responses"))return"codex";if(r.metadata&&typeof r.metadata=="object"&&typeof r.metadata.user_id=="string")return"claude-code";if(o.includes("opencode"))return"opencode";if(o.includes("pi-coding-agent"))return"pi";if(o.includes("QwenCode"))return"qwen-code";let i=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(i)?o.includes("Anthropic/")?"pi":o.includes("claude-cli")||o.includes("Claude-CLI")?"qwen-code":typeof t["x-stainless-package-version"]=="string"?"pi":"claude-code":o.includes("claude-cli")||o.includes("Claude-CLI")?"claude-code":String(i).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function Or(n){return Er[n]}function ju(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||(0,zi.randomUUID)();return n.__ccrRequestScopeId=e,e}function Ae(n,e={}){let t=Be(n),o=Or(t).createContext(n,e),r=o.usageScope==="session"&&o.stableSessionId?o.stableSessionId:ju(n),s=o.usageScope==="session"?"session":"request";n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,o.projectHeaderPresent?n.projectId=o.projectId:delete n.projectId,Hi(n,zn.CCR_PROJECT_HEADER),t==="pi"&&o.stableSessionId&&(n.__ccrSessionAffinity=o.stableSessionId);for(let a of Bi)Hi(n,a);return n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function Wi(){}var zi,zn,Bi,Ru,Pu,Ou,Iu,Mu,Lu,Nu,$u,Du,Fu,Er,pt=R(()=>{"use strict";zi=require("node:crypto"),zn=require("@wengine-ai/claude-code-router-shared");lt();Bi=["x-session-affinity","x-session-id","x-litellm-session-id"],Ru=256;Pu=["claude-code","zcode","pi","qwen-code","opencode","codex","api","unknown"];Ou={type:"claude-code",createContext(n){return Pr(n,"claude-code")}},Iu={type:"zcode",createContext(n){return Pr(n,"zcode")}},Mu={type:"pi",createContext(n){let e=Hn(n,zn.CCR_PROJECT_HEADER),t=wu(n)||(typeof n?.__ccrSessionAffinity=="string"?n.__ccrSessionAffinity:void 0)||Ce(n?.body?.metadata?.user_id),o=Ji(t)?t:void 0;return{...$t("pi",!1),stableSessionId:o,projectId:e.value,projectHeaderPresent:e.present}}},Lu={type:"qwen-code",createContext(n){return Pr(n,"qwen-code")}},Nu={type:"opencode",createContext(){return $t("opencode")}},$u={type:"codex",createContext(){return $t("codex")}},Du={type:"api",createContext(){return $t("api")}},Fu={type:"unknown",createContext(){return $t("unknown")}},Er={"claude-code":Ou,zcode:Iu,pi:Mu,"qwen-code":Lu,opencode:Nu,codex:$u,api:Du,unknown:Fu}});function ce(n,e,t,o){let r=Ir(e,t);if(r.code==="model_unhealthy"){let i=X(e,t,!0);if(i)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),i}let s=n.sessionId||n.clientContext?.stableSessionId,a=Yi[r.code]||502;throw new re(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:a})}function Kn(n){let e=n||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function Ut(n){let e=Kn(n),t=e.includes("[1m]")||e.endsWith("[1m"),o=e.replace(/\[1m\]|\[1m$/g,""),r=o.match(/^ccr-(opus|sonnet|haiku)$/i);if(r)return{family:r[1].toLowerCase(),extended:t,isCcrAlias:!0};let s=o.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||o.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:t,isCcrAlias:!1}:{family:null,extended:t,isCcrAlias:!1}}function Bu(n,e){if(!e||!n)return null;let t=Kn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=Ut(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let a=Kn(r);if(a&&t.includes(a))return s}return null}function Ju(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function Bn(n){if(!n?.includes(","))return null;let[e,...t]=n.split(","),o=e.trim(),r=t.join(",").trim();return!o||!r?null:{providerName:o,routeModel:r}}function Dt(n,e,t){let o=n.find(s=>s.name.toLowerCase()===e.toLowerCase());if(!o||o.enabled===!1)return null;let r=o.models?.find(s=>String(s).toLowerCase()===t.toLowerCase());return r?{provider:o,model:String(r)}:null}function Ir(n,e){let t=Bn(n);if(!t)return{reason:`invalid model format "${n}" (expected "provider,model")`,code:"invalid_model_format"};let{providerName:o,routeModel:r}=t,s=e.find(l=>l.name?.toLowerCase()===o.toLowerCase());if(!s)return{reason:`provider "${o}" not found`,code:"provider_not_found"};if(s.enabled===!1)return{reason:`provider "${o}" is disabled`,code:"provider_disabled"};let a=s.models?.find(l=>String(l).toLowerCase()===r.toLowerCase());if(!a)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(a),s.apiKey?.startsWith("ccr-managed-")===!0||s.api_key?.startsWith("ccr-managed-")===!0))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let c=Nt(s.name);if(c){let l=c.limitDaily!==void 0&&c.usedDailyBalance!==void 0&&c.usedDailyBalance>=c.limitDaily,u=c.totalBalance!==void 0&&c.usedBalance!==void 0&&c.usedBalance>=c.totalBalance;if(l||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function X(n,e,t,o,r,s,a){let i=Bn(n);if(!i)return a?null:n;let{providerName:c,routeModel:l}=i,u=Dt(e,c,l);if(!u){if(r===!0&&o&&!t&&s!==!1){let d=tt(),f=d.getPromotion(c,l,o,e);if(f){let h=Bn(f);if(h){let g=Dt(e,h.providerName,h.routeModel);if(g)return`${g.provider.name},${g.model}`}d.clear(c,l,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let d=tt(),f=d.getPromotion(c,l,o,e);if(f){let h=Bn(f);if(h){let g=Dt(e,h.providerName,h.routeModel);if(g)return`${g.provider.name},${g.model}`}d.clear(c,l,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model,u.provider.apiKey?.startsWith("ccr-managed-")===!0||u.provider.api_key?.startsWith("ccr-managed-")===!0))return null;let p=Nt(u.provider.name);if(p){let d=p.limitDaily!==void 0&&p.usedDailyBalance!==void 0&&p.usedDailyBalance>=p.limitDaily,f=p.totalBalance!==void 0&&p.usedBalance!==void 0&&p.usedBalance>=p.totalBalance;if(d||f)return null}return`${u.provider.name},${u.model}`}function oe(n,e,t,o,r,s){let a=j(),i=[t?.[n],o?.[n]];for(let c of i)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let u=X(l,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Wu(n){return n.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function jt(n){let e=Kn(n);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(o=>o.test(e))}function Xi(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,Ju(e))}function Zi(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Ku(n,e,t,o,r,s,a,i,c,l,u,p){let d=n.clientContext,f=d?.longContextThreshold??t.longContextThreshold??c??6e4,h=Xi(e,r,d),g=n.modelFamily,m=Zi(d,t,l),_=d?.supportsExplicitExtendedContext!==!1&&s===!0;if((_||h>m)&&t.extendedContext){let k=X(t.extendedContext,o,!1,"extendedContext",i,p,u);if(k)return n.log.info(`Family: using extended context model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${m}`),{model:k,scenarioType:"extendedContext",isFallback:!1};let v=i?oe("extendedContext",o,t.fallback,a,g,u):null;if(v)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${m}`),{model:v,scenarioType:"extendedContext",isFallback:!0};if(u){let x=ce(n,t.extendedContext,o,"extendedContext");if(x)return{model:x,scenarioType:"extendedContext",isFallback:!1}}n.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(h>f&&(t.longContext||t.fallback?.longContext?.length||a?.longContext?.length)){let k=t.longContext?X(t.longContext,o,!1,"longContext",i,p,u):null;if(k)return n.log.info(`Family: using long context model, tokens: ${h}, estimated: ${e}`),{model:k,scenarioType:"longContext",isFallback:!1};let v=i?oe("longContext",o,t.fallback,a,g,u):null;if(v)return n.log.info(`Family: using long context fallback model, tokens: ${h}, estimated: ${e}`),{model:v,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=ce(n,t.longContext,o,"longContext");if(x)return{model:x,scenarioType:"longContext",isFallback:!1}}n.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(n.body.tools)&&n.body.tools.some(k=>k.type?.startsWith("web_search"))&&t.webSearch){let k=X(t.webSearch,o,!1,"webSearch",i,p,u);if(k)return{model:k,scenarioType:"webSearch",isFallback:!1};let v=i?oe("webSearch",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using webSearch fallback model"),{model:v,scenarioType:"webSearch",isFallback:!0};if(u){let x=ce(n,t.webSearch,o,"webSearch");if(x)return{model:x,scenarioType:"webSearch",isFallback:!1}}n.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(n.body.thinking?.type==="enabled"&&t.think){let k=X(t.think,o,!1,"think",i,p,u);if(k)return{model:k,scenarioType:"think",isFallback:!1};let v=i?oe("think",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using think fallback model"),{model:v,scenarioType:"think",isFallback:!0};if(u){let x=ce(n,t.think,o,"think");if(x)return{model:x,scenarioType:"think",isFallback:!1}}n.log.warn("Family: think model unavailable (fail pool), skipping")}if(t.default){let k=X(t.default,o,!1,"default",i,p,u);if(k)return{model:k,scenarioType:"default",isFallback:!1};let v=i?oe("default",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using default fallback model"),{model:v,scenarioType:"default",isFallback:!0};if(u){let x=ce(n,t.default,o,"default");if(x)return{model:x,scenarioType:"default",isFallback:!1}}n.log.warn("Family: default model unavailable (fail pool), skipping")}return null}function Xu(){if(Je.size<=Ki)return;let n=[...Je.keys()].slice(0,Je.size-Ki);for(let e of n)Je.delete(e)}function Zu(){if(ft.size<=Gi)return;let n=[...ft].slice(0,ft.size-Gi);for(let e of n)ft.delete(e)}var Qi,Jn,Gn,Wn,de,Yi,re,ye,Ft,zu,Gu,Ht,Je,Ki,ft,Gi,Vu,Qu,Yu,Vi,Mr,We=R(()=>{"use strict";Qi=require("tiktoken");Dn();Jn=require("fs/promises"),Gn=require("fs/promises"),Wn=require("path"),de=require("@wengine-ai/claude-code-router-shared");ue();ct();On();$n();lt();ji();pt();Yi={provider_not_found:404,model_not_found:404,invalid_model_format:400,provider_disabled:503,model_unhealthy:503,quota_exhausted:503,resolution_failed:502,project_config_error:500,invalid_project_id:400,project_config_not_found:404},re=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||Yi[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ye=(0,Qi.get_encoding)("cl100k_base"),Ft=(n,e,t)=>{let o=0;return Array.isArray(n)&&n.forEach(r=>{typeof r.content=="string"?o+=ye.encode(r.content).length:Array.isArray(r.content)&&r.content.forEach(s=>{if(s.type==="text")o+=ye.encode(s.text).length;else if(s.type==="tool_use")o+=ye.encode(JSON.stringify(s.input)).length;else if(s.type==="tool_result"){let a=s.content;if(Array.isArray(a))for(let i of a)i?.type!=="image"&&(o+=ye.encode(i?.type==="text"?String(i.text??""):JSON.stringify(i)).length);else o+=ye.encode(typeof a=="string"?a:JSON.stringify(a)).length}})}),typeof e=="string"?o+=ye.encode(e).length:Array.isArray(e)&&e.forEach(r=>{r.type==="text"&&(typeof r.text=="string"?o+=ye.encode(r.text).length:Array.isArray(r.text)&&r.text.forEach(s=>{o+=ye.encode(s||"").length}))}),t&&t.forEach(r=>{r.description&&(o+=ye.encode(r.name+r.description).length),r.input_schema&&(o+=ye.encode(JSON.stringify(r.input_schema)).length)}),o},zu=async(n,e)=>{let t=n.clientContext?.projectHeaderPresent===!0,o=n.clientContext?.projectId;if(t&&(typeof o!="string"||o.length===0||o.length>1024||o==="."||o===".."||/[/\\\0]/.test(o)))throw new re(`Project routing error: invalid managed project id "${String(o)}".`,{configuredTarget:String(o),code:"invalid_project_id"});let r=t?o:n.sessionId?await Mr(n.sessionId):null;if(!r&&!t&&n.clientType==="zcode"&&n.sessionId){let s=await Ui(n.sessionId);s&&(0,de.isZcodeProjectTakeoverActive)(s)&&(r=(0,de.getClaudeProjectId)(s))}if(r){n.projectId=r;let s=(0,Wn.join)(de.HOME_DIR,r,"config.json");if(!t&&n.sessionId){let a=(0,Wn.join)(de.HOME_DIR,r,`${n.sessionId}.json`);try{let i=JSON.parse(await(0,Jn.readFile)(a,"utf8"));if(i&&i.Router&&Object.keys(i.Router).length>0)return i.Router}catch{}}try{let a=JSON.parse(await(0,Jn.readFile)(s,"utf8"));if(t&&(typeof a?.projectPath!="string"||(0,de.getClaudeProjectId)(a.projectPath)!==o))throw new re(`Project routing error: managed project id "${o}" does not match its stored project path.`,{configuredTarget:s,code:"invalid_project_id"});if(a&&a.Router&&Object.keys(a.Router).length>0)return a.Router}catch(a){if(a instanceof re)throw a;if(t&&a?.code==="ENOENT")throw new re(`Project routing error: managed project "${o}" no longer has a project config.`,{configuredTarget:s,code:"project_config_not_found"});if(!a||a.code!=="ENOENT"){let i=n.sessionId||n.clientContext?.stableSessionId;throw new re(`Project routing error: project config.json is malformed or unreadable in project "${r}". ${a.message}. Session: "${i||"unknown"}".`,{sessionId:i,configuredTarget:s,code:"project_config_error",statusCode:500})}}}};Gu=async(n,e,t,o,r,s)=>{let a=t.get("providers")||[],i=r||t.get("Router"),c=i?.enableFallback===!0,l=c?i?.fallback:void 0,u=c&&!s?l||t.get("fallback"):l,p=!s,d=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let T=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);T&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${T[1]}</CCR-SUBAGENT-MODEL>`,""),d=T[1])}let{family:f,extended:h,isCcrAlias:g}=Ut(n.body.model),m=i?.families?.[f||""];if(m&&i?.enableFamilyRouting){n.log.info(`Using model family routing for: ${f}${h?" (1M)":""}`),n.modelFamily=f,n.familyFallback=m.fallback;let T=Ku(n,e,m,a,o,h,u,c,i?.longContextThreshold,i?.extendedContextThreshold,s,p);if(T)return{model:T.model,scenarioType:T.scenarioType}}if(n.body.model.includes(",")&&!s){let T=X(n.body.model,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let C=c?oe("default",a,void 0,u,void 0,s):null;if(C)return n.log.info(`Using fallback for explicit model: ${C}`),{model:C,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let _=g&&!i?.enableFamilyRouting?null:Bu(n.body.model,i?.models);if(_){let T=X(_,a,!1,"modelMapping",c,p,s);if(T)return n.log.info(`Using mapped model for ${n.body.model}: ${_}`),{model:T,scenarioType:"modelMapping"};let C=c?oe("modelMapping",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"modelMapping"};if(s){let S=ce(n,_,a,"modelMapping");if(S)return{model:S,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${_} unavailable (fail pool), skipping`)}let b=n.clientContext,y=Xi(e,o,b),k=Zi(b,void 0,i?.extendedContextThreshold);if(y>k&&i?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${y}, estimated: ${e}, threshold: ${k}`);let T=X(i.extendedContext,a,!1,"extendedContext",c,p,s);if(T)return{model:T,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${i.extendedContext} unavailable (fail pool), trying fallback`);let C=c?oe("extendedContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"extendedContext"};if(s){let S=ce(n,i.extendedContext,a,"extendedContext");if(S)return{model:S,scenarioType:"extendedContext"}}}let v=b?.longContextThreshold??i?.longContextThreshold??6e4;if(y>v&&i?.longContext){n.log.info(`Using long context model due to token count: ${y}, estimated: ${e}, threshold: ${v}`);let T=X(i.longContext,a,!1,"longContext",c,p,s);if(T)return{model:T,scenarioType:"longContext"};n.log.warn(`Long context model ${i.longContext} unavailable (fail pool), trying fallback`);let C=c?oe("longContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"longContext"};if(s){let S=ce(n,i.longContext,a,"longContext");if(S)return{model:S,scenarioType:"longContext"}}}if(!s&&d)return n.subagentOverrideModel=d,{model:d,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&i?.background){n.log.info(`Using background model for ${n.body.model}`);let T=X(i.background,a,!1,"background",c,p,s);if(T)return{model:T,scenarioType:"background"};let C=c?oe("background",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"background"};if(s){let S=ce(n,i.background,a,"background");if(S)return{model:S,scenarioType:"background"}}n.log.warn(`Background model ${i.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(T=>T.type?.startsWith("web_search"))&&i?.webSearch){let T=X(i.webSearch,a,!1,"webSearch",c,p,s);if(T)return{model:T,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${i.webSearch} unavailable (fail pool), trying fallback`);let C=c?oe("webSearch",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"webSearch"};if(s){let S=ce(n,i.webSearch,a,"webSearch");if(S)return{model:S,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&i?.think){n.log.info(`Using think model for ${n.body.thinking}`);let T=X(i.think,a,!1,"think",c,p,s);if(T)return{model:T,scenarioType:"think"};n.log.warn(`Think model ${i.think} unavailable (fail pool), trying fallback`);let C=c?oe("think",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"think"};if(s){let S=ce(n,i.think,a,"think");if(S)return{model:S,scenarioType:"think"}}}if(i?.default){let T=X(i.default,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Default model ${i.default} unavailable (fail pool), trying fallback`);let C=c?oe("default",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"default"};let S=X(i.default,a,!0,"default",c,p,s);if(S)return n.log.warn(`No fallback available; retrying default model ${i.default} despite fail-pool state (strict=${s})`),{model:S,scenarioType:"default"}}if(s){let T=ce(n,i?.default||n.body.model,a,"default");if(T)return{model:T,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Ht=async(n,e,t)=>{let{configService:o,event:r}=t;!n.originalModel&&n.body.model&&(n.originalModel=n.body.model),(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&Ae(n,o.getAll());let s=await zu(n,o),a=s||o.get("Router"),i=a?.enableFallback===!0,c=o.get("providers")||[],l=!!s;n.enableFallback=i,n.strictProjectRouting=l,n.fallbackConfig=l?a?.fallback:a?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??ee.get(n.usageCacheKey):void 0,{messages:p,system:d=[],tools:f}=n.body,h=o.get("REWRITE_SYSTEM_PROMPT");if(h&&d.length>1&&d[1]?.text?.includes("<env>")){let g=await(0,Jn.readFile)(h,"utf-8");d[1].text=`${g}<env>${d[1].text.split("<env>").pop()}`}try{let[g,m]=n.body.model.split(","),_=t.tokenizerService?.getTokenizerConfigForModel(g,m),b;t.tokenizerService?b=(await t.tokenizerService.countTokens({messages:p,system:d,tools:f},_,g)).tokenCount:b=Ft(p,d,f),n.tokenCount=b;let y,k=l?void 0:o.get("CUSTOM_ROUTER_PATH");if(k)try{y=await require(k)(n,o.getAll(),{event:r})}catch(C){n.log.error(`failed to load custom router: ${C.message}`)}if(y)n.scenarioType="default";else{let C=await Gu(n,b,o,u,s,!!s);y=C.model,n.scenarioType=C.scenarioType}let{family:v}=Ut(n.originalModel||n.body.model),x=a?.enableFamilyRouting&&v?a.families?.[v]:void 0,T=[x?.image,a?.image].filter((C,S,P)=>!!C&&P.indexOf(C)===S);if(T.length>0&&Wu(n)&&!jt(y))if(T.includes(y))n.scenarioType="image";else{let C=T.map(S=>X(S,c,!1,"image",i,!l,l)).find(S=>!!S);if(C)n.log.info(`Using image model fallback for ${y}`),y=C,n.scenarioType="image";else{let S=i?oe("image",c,x?.fallback,n.fallbackConfig,v||void 0,l):null;if(S)n.log.info(`Using image fallback model: ${S}`),y=S,n.scenarioType="image";else if(l){let P=ce(n,T[0],c,"image");P&&(y=P,n.scenarioType="image")}else n.log.warn(`Image models ${T.join(", ")} unavailable (fail pool), keeping ${y}`),n.scenarioType="image"}}if(a?.enableConcurrencyPriority===!0&&!(n.originalModel||"").includes(",")&&!n.subagentOverrideModel&&typeof y=="string"&&y.trim()){let C=n.scenarioType||"default",S=[...(n.familyFallback||{})[C]||[],...(n.fallbackConfig||{})[C]||[]];y=Ei(n,y,{threshold:Number(a?.concurrencyThreshold)||3,fallbackModels:S,resolve:P=>X(P,c,!1,C,i,!l,l),log:P=>n.log.info(P)})}typeof y=="string"&&y.trim()?n.body.model=y:(n.log.warn(`Router could not resolve a valid model for ${n.originalModel||n.body.model}; keeping original request model`),n.scenarioType=n.scenarioType||"default")}catch(g){if(g instanceof re)throw g;if(n.log.error(`Error in router middleware: ${g.message}`),l){let m=n.sessionId||n.clientContext?.stableSessionId;throw new re(`Project routing error: router failure in project mode. ${g.message}. Session: "${m||"unknown"}".`,{sessionId:m,configuredTarget:a?.default,code:"project_router_failure",statusCode:502})}n.body.model=a?.default,n.scenarioType="default"}},Je=new Map,Ki=1e3,ft=new Set,Gi=1e3,Vu=3,Qu=50,Yu=n=>new Promise(e=>setTimeout(e,n));Vi=async n=>{let e=await(0,Gn.opendir)(de.CLAUDE_PROJECTS_DIR),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let a=(0,Wn.join)(de.CLAUDE_PROJECTS_DIR,s,`${n}.jsonl`);try{return(await(0,Gn.stat)(a)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Mr=async n=>{let e=Se(n);if(!e)return null;if(Je.has(e))return Je.get(e)||null;try{let t=await Vi(e);if(!t&&!ft.has(e)){ft.add(e),Zu();for(let o=0;o<Vu&&!t;o++)await Yu(Qu),t=await Vi(e)}return t?(Je.set(e,t),Xu(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function zt(n){let e=[],t=Array.isArray(n.input)?n.input:[n.input];for(let o of t)if(o.type==="function_call")e.push({role:"assistant",tool_calls:[{id:o.call_id,type:"function",function:{name:o.name,arguments:o.arguments||"{}"}}]});else if(o.type==="function_call_output")e.push({role:"tool",tool_call_id:o.call_id,content:typeof o.output=="string"?o.output:JSON.stringify(o.output)});else if(o.type==="reasoning"){let r=Array.isArray(o.summary)?o.summary.filter(s=>s.type==="summary_text"&&s.text).map(s=>s.text).join(`
43
43
  `):"";r&&e.push({role:"assistant",content:[{type:"text",text:`[reasoning]
44
- ${r}`}],_reasoningItem:!0})}else if(o.role){let r=o.content;Array.isArray(r)&&(r=r.map(s=>s.type==="input_text"?{type:"text",text:s.text}:s.type==="output_text"?{type:"text",text:s.text}:s.type==="input_image"?{type:"image_url",image_url:{url:s.image_url},media_type:s.mime_type}:s)),e.push({role:o.role,content:r})}n.messages=e,delete n.input,n.instructions&&typeof n.instructions=="string"&&(n.system=n.instructions,delete n.instructions),Array.isArray(n.tools)&&(n.tools=n.tools.filter(o=>o&&typeof o=="object").map(o=>o.type==="function"&&o.name&&!o.function?{type:"function",function:{name:o.name,description:o.description||"",parameters:o.parameters||{type:"object",properties:{}}}}:o.function?.name?o:o.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),n.reasoning&&typeof n.reasoning=="object"&&(n.reasoning={enabled:!0,effort:n.reasoning.effort}),delete n.store,delete n.previous_response_id,delete n.include}async function ea(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),tr(n),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&&zt(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Zu.test(r.model)&&await Ht(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let l=r.model.split(",");l.length>1&&(s=l[0],r.model=l.slice(1).join(","))}let a=s?t.providerService.getProvider(s):void 0;if(!a&&r?.model){let l=t.providerService.resolveModelRoute(r.model);l&&(a=l.provider,r.model=l.targetModel)}if(!a&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[p,...d]=u.split(","),m=t.providerService.getProvider(p);m&&(a=m,r.model=d.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!a)throw W(`Provider '${s}' not found`,404,"provider_not_found");n.provider=a.name||s;let i=nd(n),c=o.endPoint==="/v1/messages"&&i;i&&e.header("X-Codex-Detected","true"),c&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=c,n.codexDetected=i;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&&zt(r);let l={req:n,isCodexOnMessagesEndpoint:c,pluginRegistry:t.pluginRegistry},{requestBody:u,config:p,bypass:d}=await na(r,a,o,n.headers,l);if(u?.messages&&!d&&!n.isTargetAnthropic){let g=u.messages,y=new Set,_=[],b=[];for(let k of g){if(k?.role!=="system"){b.push(k);continue}let v=JSON.stringify(k.content??"");y.has(v)||(y.add(v),_.push(k))}_.length>0&&b.length>0&&(u.messages=[..._,...b])}let m=await oa(u,p,a,t,d,o,l);try{a?.baseUrl&&m?.headers&&Mt(s,a.baseUrl,m.headers)}catch{}let h=await ra(u,m,a,o,d,l);h=await ta(r,h,a.name||s);let f=sa(h,e,r,t);try{let g=r.model||n.originalModel;s&&g&&j().recordSuccess(s,g)}catch{}return f}catch(l){if(l instanceof re)throw l;if(!nr(n,t.pluginRegistry.getManagedRuntimeFor(a),l,a)&&!n.__retryAttempted){n.__retryAttempted=!0;try{return await ea(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;l=d}}let p=await qu(n,e,t,o,l);if(p)return p;throw n.__fallbackExhausted=!0,l}}async function ta(n,e,t){if(!e?.body||!(e.headers?.get?.("content-type")??"").includes("text/event-stream")&&!n?.stream)return e;let s=e.body.getReader(),a=new TextDecoder,i=[],c="";for(let d=0;d<8;d++){let m=await s.read();if(m.done||(m.value&&(i.push(m.value),c+=a.decode(m.value,{stream:!0})),c.split(`
45
- `).some(h=>h.startsWith("data:"))))break}if(c+=a.decode(),i.length===0)throw s.releaseLock(),W(`Provider returned empty streaming response from ${t}`,400,"provider_response_error");if(c.includes("event: error")){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw W(`Provider ${t} returned error in SSE stream: ${d}`,400,"provider_response_error")}if(c.split(`
46
- `).filter(d=>d.startsWith("data:")&&d.trim().length>5).length===0){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw W(`Provider ${t} returned streaming response with no SSE data lines: ${d}`,400,"provider_response_error")}let u=new ReadableStream({start:d=>{for(let h of i)d.enqueue(h);let m=()=>{s.read().then(({done:h,value:f})=>{h?d.close():(d.enqueue(f),m())}).catch(h=>d.error(h))};m()},cancel:()=>{s.cancel()}}),p=await li(u);if(p.verdict==="empty")throw W(`Provider ${t} returned an empty answer (200 with no content blocks)`,400,"provider_response_error");return new Response(ui(p.chunks,p.rest),{headers:e.headers,status:e.status,statusText:e.statusText})}async function qu(n,e,t,o,r){let s=n.scenarioType||"default",a=n.familyFallback,i=n.modelFamily,c=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),l=j(),u=n.provider||"",p=n.body.model||"",d=new Set,m=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&Vn(r.rawBody)||r?.message&&Vn(r.message);if(u&&p&&(m?(l.markRateLimited(u,p,120,r?.message),n.log.warn(`Primary model ${u},${p} rate-limited, will try fallbacks`)):l.recordFailure(u,p,r?.message),d.add(`${u},${p}`),t.recordUsage?.({provider:u,model:p,originalModel:n.originalModel||p,scenarioType:s,modelFamily:n.modelFamily,errorMessage:r?.message||String(r),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})),!(n.enableFallback??t.configService.get("Router")?.enableFallback===!0))return n.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let f=_=>{let[b,...k]=_.split(","),v=b?.trim(),x=k.join(",").trim();return!v||!x?null:{provider:v,model:x,key:`${v},${x}`}},g=[];if(i){let _=a?.[s];if(Array.isArray(_)&&_.length>0)g.push({name:`${i}/${s}`,models:_});else{let b=n.strictProjectRouting;n.log.warn(`No ${i} fallback configured for ${s}; ${b?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(c?.[s])&&c[s].length>0&&g.push({name:`global/${s}`,models:c[s]}),g.length===0&&s!=="image"&&n.body?.messages?.some(k=>k.role==="user"&&Array.isArray(k.content)&&k.content.some(v=>v.type==="image"||v.type==="image_url"||Array.isArray(v?.content)&&v.content.some(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(c?.image)&&c.image.length>0&&(n.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),g.push({name:"global/image (auto-detected)",models:c.image})),g.length===0)return null;let y=g.reduce((_,b)=>_+b.models.length,0);n.log.warn(`Request failed for ${s}, trying ${y} fallback models across ${g.length} fallback stage(s)`);for(let _ of g){n.log.info(`Trying ${_.name} fallback stage with ${_.models.length} models`);for(let b of _.models){let k=f(b);if(!k){n.log.warn(`Fallback model '${b}' is invalid, skipping`);continue}if(d.has(k.key))continue;d.add(k.key);let v=t.providerService.getProviders(),x=Dt(v,k.provider,k.model);if(!x){n.log.warn(`Fallback model ${b} is not configured or provider is disabled, skipping`);continue}let T=x.provider.name,R=x.model;if(!l.isAvailable(T,R,x.provider.apiKey?.startsWith("ccr-managed-")===!0)){n.log.warn(`Fallback model ${b} unavailable (fail pool), skipping`);continue}let S=t.pluginRegistry.getManagedRuntimeFor(x.provider);if(S&&qe(n,S,{name:T}).terminalError)continue;let P;for(let O=1;O<=2;O++)try{n.log.info(`Trying fallback model: ${T},${R}${O>1?" (retry)":""}`);let I={...n.body};I.model=R;let C={...n,provider:T,body:I},A=x.provider,M={pluginRegistry:t.pluginRegistry,req:C,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1},{requestBody:$,config:K,bypass:D}=await na(I,A,o,n.headers,M),F=await oa($,K,A,t,D,o,M);try{A?.baseUrl&&F?.headers&&Mt(T,A.baseUrl,F.headers)}catch{}let J=await ra($,F,A,o,D,M);return J=await ta(I,J,T),n.log.info(`Fallback model ${T},${R} succeeded`),l.recordSuccess(T,R),u&&p&&!n.strictProjectRouting&&(et().promote(u,p,s,T,R),n.log.info(`Promoted fallback model ${T},${R} for ${u},${p}:${s}`),m?n.log.info(`Rate-limited original model ${u},${p} already marked unavailable with cooldown`):(l.forceOpen(u,p,r?.message),n.log.info(`Marked original model ${u},${p} as unavailable`))),n.provider=T,n.body=I,Pi(n,`${T},${R}`),sa(J,e,I,t)}catch(I){if(P=I,nr(n,S,I,{name:T}))break;if(O===1){n.log.warn(`Fallback model ${T},${R} failed, retrying once: ${I.message}`);continue}}l.recordFailure(T,R,P?.message),n.log.warn(`Fallback model ${T},${R} failed after retry: ${P?.message}`),t.recordUsage?.({provider:T,model:R,originalModel:n.originalModel||p||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:P?.message||String(P),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})}}return n.log.error(`All fallback models failed for ${s}`),null}async function na(n,e,t,o,r){if(typeof e.apiKey=="string"&&e.apiKey.startsWith("ccr-managed-")&&!r.pluginRegistry.getManagedRuntimeFor(e))throw W("Provider plugin missing or disabled; install and enable its provider plugin.",503,"plugin_missing");let s=r.pluginRegistry.getManagedRuntimeFor(e);if(s){let u=qe(r.req,s,e).terminalError;if(u)throw u;await s.ensureUsable?.()}let a=JSON.parse(JSON.stringify(n)),i=a?.system;if(typeof i=="string"&&i.includes("cch="))a.system=i.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(i))for(let u=0;u<i.length;u++){let p=i[u],d=typeof p=="string"?p:p?.text??"";if(d.includes("cch=")){let m=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof p=="string"?i[u]=m:typeof p?.text=="string"&&(p.text=m)}}let c={},l=!1;if(l=ed(e,t,n),l&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],c.headers=o),!l&&typeof t.transformRequestOut=="function"){let u=await t.transformRequestOut(a);u.body?(a=u.body,c=u.config||{}):a=u}if(!l&&e.transformer?.use?.length)for(let u of e.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let p=await u.transformRequestIn(a,e,r);p.body?(a=p.body,c={...c,...p.config}):a=p}if(!l&&e.transformer?.[n.model]?.use?.length)for(let u of e.transformer[n.model].use)!u||typeof u.transformRequestIn!="function"||(a=await u.transformRequestIn(a,e,r));return{requestBody:a,config:c,bypass:l}}function ed(n,e,t){return e.endPoint==="/v1/chat/completions"&&Array.isArray(t?.system)?!1:n.transformer?.use?.length===1&&n.transformer.use[0].name===e.name&&(!n.transformer?.[t.model]?.use.length||n.transformer?.[t.model]?.use.length===1&&n.transformer?.[t.model]?.use[0].name===e.name)}function td(n,e){if(e?.clientType!=="pi")return;let t=e?.clientContext?.stableSessionId;if(!(typeof t!="string"||!t)){for(let o of Object.keys(n))o.toLowerCase()==="x-litellm-session-id"&&delete n[o];n["x-litellm-session-id"]=t}}function nd(n){if(n.clientType)return n.clientType==="codex";let e=n.headers||{},t=e["x-anthropic-billing-header"]||"";if(typeof t=="string"&&t.includes("cc_version="))return!1;let o=e["user-agent"]||"";if(typeof o=="string"&&/codex/i.test(o))return!0;let r=n.pathname||n.url||"";if(typeof r=="string"&&r.split("?",1)[0].endsWith("/v1/responses"))return!0;let s=n.originalModel||n.body?.model||"";return typeof s=="string"&&s.toLowerCase()==="ccr-codex"}async function oa(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);return i?.dispatchRequest?i.dispatchRequest({attempt:()=>qi(n,e,t,o,r,s,a),requestBody:n,config:e,provider:t,req:a?.req}):qi(n,e,t,o,r,s,a)}function ft(n){let e=n?.request?.systemInstruction?.parts??n?.systemInstruction?.parts;return Array.isArray(e)?e.map(t=>typeof t?.text=="string"?t.text:"").join(`
47
- `):""}async function qi(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);i&&(await i.ensureUsable?.(),await i.lockUpstream?.(e,t));let c=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let d=o.configService.get("API_TIMEOUT_MS");d&&(e.TIMEOUT=typeof d=="string"?parseInt(d,10):d)}if(r&&typeof s.auth=="function"){let d=await s.auth(n,t,a);if(d.body){n=d.body;let m=e.headers||{};d.config?.headers&&(m={...m,...d.config.headers},delete m.host,delete d.config.headers),e={...e,...d.config,headers:m}}else n=d}let l={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};i&&(l=await i.signRequest({headers:l,requestBody:n,provider:t,config:e})),td(l,a?.req);for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];!i?.suppressDebugLog&&Cn(o.configService)&&oi(o.log,a.req.id,{url:String(c),headers:l,body:n});let u,p=()=>ii(c,n,{...e,headers:JSON.parse(JSON.stringify(l)),httpsProxy:i?void 0:ge(o.configService,t)},a,i?void 0:o.log);try{u=await p()}catch(d){throw i?await He(i,0,void 0,ft(n),{errorName:d?.name}):d}if(!u.ok&&i?.authRefresh&&u.status===401&&!qe(a.req,i,t).refreshUsed){qe(a.req,i,t).refreshUsed=!0;try{await i.authRefresh.forceRefresh(),l=await i.signRequest({headers:l,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(a.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(h){throw i?await He(i,u.status,void 0,ft(n)):h}if(i){let h=await He(i,u.status,d,ft(n));throw o.log.error(`[provider_response_error] Plugin(${i.name}) status=${u.status} code=${h.code}`),h}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let m=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw m.isRateLimit=u.status===429||Vn(d),m.rawBody=d,m}if(u.ok){let d=u.headers.get("content-type")||"",m=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${m} contentType=${d} ok=${u.ok} status=${u.status} hasBody=${!!u.body}`),!m||d.includes("application/json")){let h="";try{if(h=await u.clone().text(),!h||h.trim()==="")throw new SyntaxError("Empty JSON body");if(Lt(h))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let g=JSON.parse(h);if(i?.isErrorEnvelope?.(g))throw await He(i,u.status,h,ft(n));if(g&&typeof g=="object"&&g.error&&(typeof g.error=="string"||typeof g.error=="object"&&Object.keys(g.error).length>0)){if(i)throw await He(i,u.status,h,ft(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${h}`);let _=Vn(h),b=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${h}`,400,"provider_response_error");throw b.isRateLimit=_,b.rawBody=h,b}}catch(f){if(i)throw f?.pluginClassified===!0?f:await He(i,u.status,void 0,ft(n));if(f instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${h}"`);let g=W(`API returned an empty or malformed response (HTTP 200) from ${t.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw g.rawBody=h,g}throw f}}}if(!i?.suppressDebugLog&&!n.stream&&Cn(o.configService)){let m=await u.clone().text();ri(o.log,a.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:m})}return u}async function ra(n,e,t,o,r,s){let a=e;if(!r&&t.transformer?.use?.length)for(let i of Array.from(t.transformer.use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let i of Array.from(t.transformer[n.model].use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),a=await o.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new rt().transformResponseIn(a,{...s,provider:t})}catch(i){console.error("Failed to apply Responses API conversion for codex client:",i)}return a}async function sa(n,e,t,o){n.ok||e.code(n.status);let r=Ai(n);if(!r){let s=await ve(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let a=await Ee(n);n=a.response,a.isSSE&&(r=!0)}}if(r){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),o&&!o.pluginRegistry.getManagedRuntimeFor(o.providerService.getProvider(e.request.provider||""))?.suppressDebugLog&&Cn(o.configService)){let[s,a]=n.body.tee(),i=ni(o.configService);return si(s,o.log,e.request.id,i),e.send(a)}return e.send(n.body)}else return U(n)}function Vn(n){let e=n.toLowerCase();return e.includes("rate limit")||e.includes("rate_limit")||e.includes("rate_limit_error")||e.includes("too many requests")||e.includes("too many")||e.includes("quota exhausted")||e.includes("qps_limit")||e.includes("token_limit")||e.includes("\u9650\u6D41")||e.includes("\u9891\u7387\u9650\u5236")}function od(n){try{return new URL(n),!0}catch{return!1}}var Zu,ia,Qn=w(()=>{"use strict";ai();xn();di();pi();gi();At();ir();ue();ot();On();$n();vr();ne();We();ae();Zu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;ia=async n=>{n.get("/",async()=>({message:"LLMs API",version:An})),n.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),n.get("/providers/health",async()=>({states:j().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError,rateLimitUntil:r.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=n.transformerService.getTransformersWithEndpoint();for(let{transformer:t}of e)t.endPoint&&n.post(t.endPoint,async(o,r)=>ea(o,r,n,t));n.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"}},proxyEnabled:{type:"boolean"}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(t,o)=>{let{name:r,baseUrl:s,apiKey:a,models:i}=t.body;if(!r?.trim())throw W("Provider name is required",400,"invalid_request");if(!s||!od(s))throw W("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw W("API key is required",400,"invalid_request");if(!i||!Array.isArray(i)||i.length===0)throw W("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw W(`Provider with name '${t.body.name}' already exists`,400,"provider_exists");return n.providerService.registerProvider(t.body)}),n.get("/providers",async()=>n.providerService.getProviders()),n.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{let o=n.providerService.getProvider(t.params.id);if(!o)throw W("Provider not found",404,"provider_not_found");return o}),n.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"}},proxyEnabled:{type:"boolean"},enabled:{type:"boolean"}}}}},async(t,o)=>{let r=n.providerService.updateProvider(t.params.id,t.body);if(!r)throw W("Provider not found",404,"provider_not_found");return r}),n.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{if(!n.providerService.deleteProvider(t.params.id))throw W("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),n.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(t,o)=>{if(!n.providerService.toggleProvider(t.params.id,t.body.enabled))throw W("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var Ke,Lr=w(()=>{"use strict";Ke=class n{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;reload(){let e=new n(this.configService,this.transformerService,this.logger);this.providers=e.providers,this.modelRoutes=e.modelRoutes}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 o={};t.transformer&&Object.keys(t.transformer).forEach(s=>{s==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let a=new s({level:r});o.use=[a,...o.use||[]]}else this.logger.warn(`default_thinking_level set on ${t.name} but defaultthinking transformer is not registered`)}this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,pluginManaged:t.ccr_managed===!0,models:t.models||[],quotaToken:t.quota_token,quotaSecToken:t.quota_sec_token,transformer:t.transformer?o:void 0,cacheMode:t.cache_mode||"exclusive",enabled:t.enabled!==!1,proxyEnabled:t.proxy_enabled===!0,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(o){this.logger.error(`${t.name} provider registered error: ${o}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,proxyEnabled:e.proxyEnabled===!0,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(o=>{let r=`${t.name},${o}`,s={provider:t.name,model:o,fullModel:r};this.modelRoutes.set(r,s),this.modelRoutes.has(o)||this.modelRoutes.set(o,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let o=this.providers.get(e);if(!o)return null;let r={...o,...t,updatedAt:new Date};return this.providers.set(e,r),t.models&&(o.models.forEach(s=>{let a=`${o.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let a=`${o.name},${s}`,i={provider:o.name,model:s,fullModel:a};this.modelRoutes.set(a,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),r}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(o=>{let r=`${t.name},${o}`;this.modelRoutes.delete(r),this.modelRoutes.delete(o)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let o=this.providers.get(e);if(!o)return!1;o.enabled=t;let r=this.configService.get("providers");if(r&&Array.isArray(r)){let s=r.find(a=>a.name===e);s&&(s.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let o=this.providers.get(t.provider);return o?{provider:o,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push(o),e.push(`${t.name},${o}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,o)=>{if(Array.isArray(o)){let[r,s={}]=o;t[r]=s}else t[o]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push({id:o,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${o}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}}});var Oe,Yn,aa,rd,ca,mt=w(()=>{"use strict";Oe=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",Yn=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,aa=["low","medium","high"],rd={none:"none",off:"none",disabled:"none",min:"low",minimal:"low",light:"low",low:"low",medium:"medium",mid:"medium",high:"high",xhigh:"max",max:"max",maximum:"max",ultra:"max",ultracode:"max"},ca=n=>{if(typeof n=="string")return rd[n.trim().toLowerCase()]}});var Nr,la=w(()=>{Nr=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function sd(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function ua(n){let e=[],t=[],o=d=>{if(typeof d=="string"){t.push({type:"text",text:d});return}Array.isArray(d)&&d.forEach(m=>{if(typeof m=="string"){t.push({type:"text",text:m});return}m&&typeof m=="object"&&m.type==="text"&&m.text&&t.push({...m})})},r=()=>{let d=new Map;for(let m=0;m<t.length;m++){let h=t[m],f=h?.text??JSON.stringify(h),g=d.get(f);if(g===void 0){d.set(f,m);continue}!t[g]?.cache_control&&h?.cache_control&&(t[g]=h),t.splice(m,1),m--}};n.messages.forEach(d=>{d.role==="system"?o(d.content):e.push(d)}),r();let s=[];for(let d=0;d<e.length;d++){let m=e[d];if(m.role==="tool"){let h=m.content;try{typeof m.content=="string"&&(h=JSON.parse(m.content))}catch{}h!=null&&typeof h!="object"&&typeof h!="string"&&(h=String(h));let f={type:"tool_result",tool_use_id:m.tool_call_id,content:h};m.cache_control&&(f.cache_control=m.cache_control);let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(f):s.push({role:"user",content:[f]})}else if(m.role==="user"){let h=[];typeof m.content=="string"?h.push({type:"text",text:m.content}):Array.isArray(m.content)&&m.content.forEach(g=>{g&&typeof g=="object"&&g.type==="image_url"&&g.image_url?.url?h.push({type:"image",source:{type:"base64",media_type:g.media_type||"image/jpeg",data:g.image_url.url.split(",")[1]||g.image_url.url}}):h.push(g)});let f=s[s.length-1];f&&f.role==="user"&&Array.isArray(f.content)?f.content.push(...h):s.push({role:"user",content:h.length>0?h:[{type:"text",text:" "}]})}else if(m.role==="assistant"){let h=[];m.content&&(typeof m.content=="string"?h.push({type:"text",text:m.content}):Array.isArray(m.content)&&h.push(...m.content)),m.tool_calls&&m.tool_calls.length>0&&m.tool_calls.forEach(g=>{let y={};try{y=JSON.parse(g.function.arguments)}catch{y=g.function.arguments}h.push({type:"tool_use",id:g.id,name:g.function.name,input:y})}),m.thinking&&h.unshift({type:"thinking",thinking:m.thinking.content,signature:m.thinking.signature});let f=s[s.length-1];f&&f.role==="assistant"&&Array.isArray(f.content)?f.content.push(...h):s.push({role:"assistant",content:h.length>0?h:[{type:"text",text:" "}]})}}let a=()=>{let d=t.filter(m=>m?.cache_control).length;for(let m of s)Array.isArray(m.content)&&(d+=m.content.filter(h=>h?.cache_control).length);return d},i=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},c=()=>{for(let d=s.length-1;d>=0;d--){let m=s[d]?.content;if(!Array.isArray(m))continue;let h=m.find(f=>f?.cache_control);if(h?.cache_control)return h.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},l=(d,m)=>{if(!Array.isArray(d?.content)||d.content.some(f=>f?.cache_control))return!1;let h=d.content.find(f=>f&&typeof f=="object"&&!f.cache_control);return h?(h.cache_control=i(m),!0):!1};(()=>{let d=4-a();if(d<=0||s.length===0)return;let m=s,h=c(),f=[];for(let g=m.length-1;g>=0;g--)m[g]?.role!=="user"||!Array.isArray(m[g].content)||f.push(g);for(let g of f){if(d<=0)break;l(m[g],h)&&d--}})();let p={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(n.reasoning?.enabled){let d=n.reasoning.max_tokens||Yn(n.reasoning.effort||"medium"),m=Math.min(d,p.max_tokens-1024);m>=1024&&(p.thinking={type:"enabled",budget_tokens:m});let h=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:Oe(d);aa.includes(h)&&(p.output_config={...p.output_config||{},effort:h})}if(t.length>0){let d=t.some(m=>m?.cache_control);p.system=d?t:t.map(m=>m.text||"").join(`
48
-
49
- `)}return n.tools&&n.tools.length>0&&(p.tools=sd(n.tools),n.tool_choice&&(n.tool_choice==="auto"?p.tool_choice={type:"auto"}:n.tool_choice==="any"||n.tool_choice==="required"?p.tool_choice={type:"any"}:typeof n.tool_choice=="string"?p.tool_choice={type:"tool",name:n.tool_choice}:typeof n.tool_choice=="object"&&n.tool_choice.type==="function"&&(p.tool_choice={type:"tool",name:n.tool_choice.function.name}))),p}var da=w(()=>{mt()});function id(n){if(n===!0)return!0;if(n===!1)return!1;if(typeof n!="string")return;let e=n.trim().toLowerCase();if(e==="enabled"||e==="adaptive"||e==="true")return!0;if(e==="disabled"||e==="off"||e==="none"||e==="false")return!1}var Xn,Zn,pa=w(()=>{"use strict";Xn=require("uuid");mt();xn();ne();la();da();We();Zn=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let o={};return this.useBearer?(o.authorization=`Bearer ${t.apiKey}`,o["x-api-key"]=void 0):(o["x-api-key"]=t.apiKey,o.authorization=void 0),{body:e,config:{headers:o}}}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 i=e.system.filter(c=>c.type==="text"&&c.text).map(c=>({type:"text",text:c.text,cache_control:c.cache_control}));t.push({role:"system",content:i})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(i=>{i.role==="system"&&t.push({role:"system",content:i.content})}),o?.forEach(i=>{if(i.role!=="system"&&(i.role==="user"||i.role==="assistant")){if(typeof i.content=="string"){t.push({role:i.role,content:i.content});return}if(Array.isArray(i.content)){if(i.role==="user"){let c=i.content.filter(u=>u.type==="tool_result"&&u.tool_use_id);if(c.length){let u=jt(String(e.model??"")),p=[];c.forEach(d=>{let m=Array.isArray(d.content)?d.content:null,h=m?m.filter(y=>y?.type==="image"&&y?.source):[],f=typeof d.content=="string"?d.content:JSON.stringify(d.content);if(h.length>0){let y=m.filter(_=>!(_?.type==="image"&&_?.source)).map(_=>_?.type==="text"?String(_.text??""):JSON.stringify(_)).filter(_=>_.length>0).join(`
50
- `);u?(f=y||"[tool image]",p.push(...h)):(f=[y,...h.map(()=>"(tool image omitted: target model does not support image input)")].filter(_=>_.length>0).join(`
51
- `),this.logger?.debug?.({type:"tool_image_omitted",model:String(e.model??""),count:h.length}))}let g={role:"tool",content:f,tool_call_id:d.tool_use_id,cache_control:d.cache_control};t.push(g)}),p.length>0&&t.push({role:"user",content:p.map(d=>({type:"image_url",image_url:{url:d.source?.type==="base64"?Nr(d.source.data,d.source.media_type):d.source.url},media_type:d.source.media_type}))})}let l=i.content.filter(u=>u.type==="text"&&u.text||u.type==="image"&&u.source);l.length&&t.push({role:"user",content:l.map(u=>u?.type==="image"?{type:"image_url",image_url:{url:u.source?.type==="base64"?Nr(u.source.data,u.source.media_type):u.source.url},media_type:u.source.media_type}:u)})}else if(i.role==="assistant"){let c={role:"assistant",content:""},l=i.content.filter(d=>d.type==="text"&&d.text);l.length&&(c.content=l.map(d=>d.text).join(`
52
- `));let u=i.content.filter(d=>d.type==="tool_use"&&d.id);u.length&&(c.tool_calls=u.map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input||{})}})));let p=i.content.find(d=>d.type==="thinking");p&&(c.thinking={content:p.thinking,signature:p.signature}),t.push(c)}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},s=ca(e.output_config?.effort),a=typeof e.thinking?.budget_tokens=="number"?e.thinking.budget_tokens:void 0;if(e.thinking!==void 0||s!==void 0){let i={},l=id(e.thinking?.type)??(s!==void 0||(a??0)>0);l!==void 0&&(i.enabled=l),s!==void 0?i.effort=s:a!==void 0&&(i.effort=Oe(a)),a!==void 0&&a>0&&(i.max_tokens=a),Object.keys(i).length>0&&(r.reasoning=i)}return e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=ua(e),s={};return this.useBearer?(s.authorization=`Bearer ${t.apiKey}`,s["x-api-key"]=void 0):(s["x-api-key"]=t.apiKey,s.authorization=void 0),s["anthropic-version"]="2023-06-01",s["content-type"]="application/json",{body:r,config:{headers:s}}}isAnthropicMessagesEndpoint(e){try{return new URL(e.trim()).pathname.replace(/\/+$/,"").endsWith("/messages")}catch{return!1}}async transformResponseIn(e,t){if(t?.req?.isTargetAnthropic)return e;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 ve(e);if((r?.isSSE??!1)&&r?.body){let l=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(l,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let a;if(r?.body)a=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let l=await Ee(e);if(l.isSSE){let u=await this.convertOpenAIStreamToAnthropic(l.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}a=l.response}let i=await U(a),c=this.convertOpenAIResponseToAnthropic(i,t);return new Response(JSON.stringify(c),{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 s=new TextEncoder,a=`msg_${Date.now()}`,i=null,c="unknown",l=!1,u=!1,p=!1,d=new Map,m=new Map,h=0,f=0,g=0,y=!1,_=!1,b=0,k=-1,v=()=>{let S=b;return b++,S},x=S=>{if(!y)try{r.enqueue(S);let P=new TextDecoder().decode(S);this.logger.debug({reqId:t.req.id,data:P,type:"send data"})}catch(P){if(P instanceof TypeError&&P.message.includes("Controller is already closed"))y=!0;else throw this.logger.debug({reqId:t.req.id,error:P instanceof Error?P.message:String(P),type:"send data error"}),P}},T=()=>{if(!y)try{if(!l){this.logger?.warn("[empty_stream] Upstream produced no data, closing silently"),r.close(),y=!0;return}if(k>=0){let P={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
44
+ ${r}`}],_reasoningItem:!0})}else if(o.role){let r=o.content;Array.isArray(r)&&(r=r.map(s=>s.type==="input_text"?{type:"text",text:s.text}:s.type==="output_text"?{type:"text",text:s.text}:s.type==="input_image"?{type:"image_url",image_url:{url:s.image_url},media_type:s.mime_type}:s)),e.push({role:o.role,content:r})}n.messages=e,delete n.input,n.instructions&&typeof n.instructions=="string"&&(n.system=n.instructions,delete n.instructions),Array.isArray(n.tools)&&(n.tools=n.tools.filter(o=>o&&typeof o=="object").map(o=>o.type==="function"&&o.name&&!o.function?{type:"function",function:{name:o.name,description:o.description||"",parameters:o.parameters||{type:"object",properties:{}}}}:o.function?.name?o:o.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),n.reasoning&&typeof n.reasoning=="object"&&(n.reasoning={enabled:!0,effort:n.reasoning.effort}),delete n.store,delete n.previous_response_id,delete n.include}async function ea(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),tr(n),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&&zt(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&qu.test(r.model)&&await Ht(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let l=r.model.split(",");l.length>1&&(s=l[0],r.model=l.slice(1).join(","))}let a=s?t.providerService.getProvider(s):void 0;if(!a&&r?.model){let l=t.providerService.resolveModelRoute(r.model);l&&(a=l.provider,r.model=l.targetModel)}if(!a&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[p,...d]=u.split(","),f=t.providerService.getProvider(p);f&&(a=f,r.model=d.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!a)throw K(`Provider '${s}' not found`,404,"provider_not_found");n.provider=a.name||s;let i=od(n),c=o.endPoint==="/v1/messages"&&i;i&&e.header("X-Codex-Detected","true"),c&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=c,n.codexDetected=i;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&&zt(r);let l={req:n,isCodexOnMessagesEndpoint:c,pluginRegistry:t.pluginRegistry},{requestBody:u,config:p,bypass:d}=await na(r,a,o,n.headers,l);if(u?.messages&&!d&&!n.isTargetAnthropic){let m=u.messages,_=new Set,b=[],y=[];for(let k of m){if(k?.role!=="system"){y.push(k);continue}let v=JSON.stringify(k.content??"");_.has(v)||(_.add(v),b.push(k))}b.length>0&&y.length>0&&(u.messages=[...b,...y])}let f=await oa(u,p,a,t,d,o,l);try{a?.baseUrl&&f?.headers&&Mt(s,a.baseUrl,f.headers)}catch{}let h=await ra(u,f,a,o,d,l);h=await ta(r,h,a.name||s);let g=sa(h,e,r,t);try{let m=r.model||n.originalModel;s&&m&&j().recordSuccess(s,m)}catch{}return g}catch(l){if(l instanceof re)throw l;if(!nr(n,t.pluginRegistry.getManagedRuntimeFor(a),l,a)&&!n.__retryAttempted){n.__retryAttempted=!0;try{return await ea(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;l=d}}let p=await ed(n,e,t,o,l);if(p)return p;throw n.__fallbackExhausted=!0,l}}async function ta(n,e,t){if(!e?.body||!(e.headers?.get?.("content-type")??"").includes("text/event-stream")&&!n?.stream)return e;let s=e.body.getReader(),a=new TextDecoder,i=[],c="";for(let d=0;d<8;d++){let f=await s.read();if(f.done||(f.value&&(i.push(f.value),c+=a.decode(f.value,{stream:!0})),c.split(`
45
+ `).some(h=>h.startsWith("data:"))))break}if(c+=a.decode(),i.length===0)throw s.releaseLock(),K(`Provider returned empty streaming response from ${t}`,400,"provider_response_error");if(c.includes("event: error")){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw K(`Provider ${t} returned error in SSE stream: ${d}`,400,"provider_response_error")}if(c.split(`
46
+ `).filter(d=>d.startsWith("data:")&&d.trim().length>5).length===0){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw K(`Provider ${t} returned streaming response with no SSE data lines: ${d}`,400,"provider_response_error")}let u=new ReadableStream({start:d=>{for(let h of i)d.enqueue(h);let f=()=>{s.read().then(({done:h,value:g})=>{h?d.close():(d.enqueue(g),f())}).catch(h=>d.error(h))};f()},cancel:()=>{s.cancel()}}),p=await li(u);if(p.verdict==="empty")throw K(`Provider ${t} returned an empty answer (200 with no content blocks)`,400,"provider_response_error");return new Response(ui(p.chunks,p.rest),{headers:e.headers,status:e.status,statusText:e.statusText})}async function ed(n,e,t,o,r){let s=n.scenarioType||"default",a=n.familyFallback,i=n.modelFamily,c=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),l=j(),u=n.provider||"",p=n.body.model||"",d=new Set,f=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&Vn(r.rawBody)||r?.message&&Vn(r.message);if(u&&p&&(f?(l.markRateLimited(u,p,120,r?.message),n.log.warn(`Primary model ${u},${p} rate-limited, will try fallbacks`)):l.recordFailure(u,p,r?.message),d.add(`${u},${p}`),t.recordUsage?.({provider:u,model:p,originalModel:n.originalModel||p,scenarioType:s,modelFamily:n.modelFamily,errorMessage:r?.message||String(r),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})),!(n.enableFallback??t.configService.get("Router")?.enableFallback===!0))return n.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let g=b=>{let[y,...k]=b.split(","),v=y?.trim(),x=k.join(",").trim();return!v||!x?null:{provider:v,model:x,key:`${v},${x}`}},m=[];if(i){let b=a?.[s];if(Array.isArray(b)&&b.length>0)m.push({name:`${i}/${s}`,models:b});else{let y=n.strictProjectRouting;n.log.warn(`No ${i} fallback configured for ${s}; ${y?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(c?.[s])&&c[s].length>0&&m.push({name:`global/${s}`,models:c[s]}),m.length===0&&s!=="image"&&n.body?.messages?.some(k=>k.role==="user"&&Array.isArray(k.content)&&k.content.some(v=>v.type==="image"||v.type==="image_url"||Array.isArray(v?.content)&&v.content.some(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(c?.image)&&c.image.length>0&&(n.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),m.push({name:"global/image (auto-detected)",models:c.image})),m.length===0)return null;let _=m.reduce((b,y)=>b+y.models.length,0);n.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${m.length} fallback stage(s)`);for(let b of m){n.log.info(`Trying ${b.name} fallback stage with ${b.models.length} models`);for(let y of b.models){let k=g(y);if(!k){n.log.warn(`Fallback model '${y}' is invalid, skipping`);continue}if(d.has(k.key))continue;d.add(k.key);let v=t.providerService.getProviders(),x=Dt(v,k.provider,k.model);if(!x){n.log.warn(`Fallback model ${y} is not configured or provider is disabled, skipping`);continue}let T=x.provider.name,C=x.model;if(!l.isAvailable(T,C,x.provider.apiKey?.startsWith("ccr-managed-")===!0)){n.log.warn(`Fallback model ${y} unavailable (fail pool), skipping`);continue}let S=t.pluginRegistry.getManagedRuntimeFor(x.provider);if(S&&et(n,S,{name:T}).terminalError)continue;let P;for(let M=1;M<=2;M++)try{n.log.info(`Trying fallback model: ${T},${C}${M>1?" (retry)":""}`);let I={...n.body};I.model=C;let A={...n,provider:T,body:I},w=x.provider,O={pluginRegistry:t.pluginRegistry,req:A,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1},{requestBody:$,config:H,bypass:D}=await na(I,w,o,n.headers,O),F=await oa($,H,w,t,D,o,O);try{w?.baseUrl&&F?.headers&&Mt(T,w.baseUrl,F.headers)}catch{}let W=await ra($,F,w,o,D,O);return W=await ta(I,W,T),n.log.info(`Fallback model ${T},${C} succeeded`),l.recordSuccess(T,C),u&&p&&!n.strictProjectRouting&&(tt().promote(u,p,s,T,C),n.log.info(`Promoted fallback model ${T},${C} for ${u},${p}:${s}`),f?n.log.info(`Rate-limited original model ${u},${p} already marked unavailable with cooldown`):(l.forceOpen(u,p,r?.message),n.log.info(`Marked original model ${u},${p} as unavailable`))),n.provider=T,n.body=I,Pi(n,`${T},${C}`),sa(W,e,I,t)}catch(I){if(P=I,nr(n,S,I,{name:T}))break;if(M===1){n.log.warn(`Fallback model ${T},${C} failed, retrying once: ${I.message}`);continue}}l.recordFailure(T,C,P?.message),n.log.warn(`Fallback model ${T},${C} failed after retry: ${P?.message}`),t.recordUsage?.({provider:T,model:C,originalModel:n.originalModel||p||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:P?.message||String(P),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})}}return n.log.error(`All fallback models failed for ${s}`),null}async function na(n,e,t,o,r){if(typeof e.apiKey=="string"&&e.apiKey.startsWith("ccr-managed-")&&!r.pluginRegistry.getManagedRuntimeFor(e))throw K("Provider plugin missing or disabled; install and enable its provider plugin.",503,"plugin_missing");let s=r.pluginRegistry.getManagedRuntimeFor(e);if(s){let u=et(r.req,s,e).terminalError;if(u)throw u;await s.ensureUsable?.()}let a=JSON.parse(JSON.stringify(n)),i=a?.system;if(typeof i=="string"&&i.includes("cch="))a.system=i.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(i))for(let u=0;u<i.length;u++){let p=i[u],d=typeof p=="string"?p:p?.text??"";if(d.includes("cch=")){let f=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof p=="string"?i[u]=f:typeof p?.text=="string"&&(p.text=f)}}let c={},l=!1;if(l=td(e,t,n),l&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],c.headers=o),!l&&typeof t.transformRequestOut=="function"){let u=await t.transformRequestOut(a);u.body?(a=u.body,c=u.config||{}):a=u}if(!l&&e.transformer?.use?.length)for(let u of e.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let p=await u.transformRequestIn(a,e,r);p.body?(a=p.body,c={...c,...p.config}):a=p}if(!l&&e.transformer?.[n.model]?.use?.length)for(let u of e.transformer[n.model].use)!u||typeof u.transformRequestIn!="function"||(a=await u.transformRequestIn(a,e,r));return{requestBody:a,config:c,bypass:l}}function td(n,e,t){return e.endPoint==="/v1/chat/completions"&&Array.isArray(t?.system)?!1:n.transformer?.use?.length===1&&n.transformer.use[0].name===e.name&&(!n.transformer?.[t.model]?.use.length||n.transformer?.[t.model]?.use.length===1&&n.transformer?.[t.model]?.use[0].name===e.name)}function nd(n,e){if(e?.clientType!=="pi")return;let t=e?.clientContext?.stableSessionId;if(!(typeof t!="string"||!t)){for(let o of Object.keys(n))o.toLowerCase()==="x-litellm-session-id"&&delete n[o];n["x-litellm-session-id"]=t}}function od(n){if(n.clientType)return n.clientType==="codex";let e=n.headers||{},t=e["x-anthropic-billing-header"]||"";if(typeof t=="string"&&t.includes("cc_version="))return!1;let o=e["user-agent"]||"";if(typeof o=="string"&&/codex/i.test(o))return!0;let r=n.pathname||n.url||"";if(typeof r=="string"&&r.split("?",1)[0].endsWith("/v1/responses"))return!0;let s=n.originalModel||n.body?.model||"";return typeof s=="string"&&s.toLowerCase()==="ccr-codex"}async function oa(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);return i?.dispatchRequest?i.dispatchRequest({attempt:()=>qi(n,e,t,o,r,s,a),requestBody:n,config:e,provider:t,req:a?.req}):qi(n,e,t,o,r,s,a)}function mt(n){let e=n?.request?.systemInstruction?.parts??n?.systemInstruction?.parts;return Array.isArray(e)?e.map(t=>typeof t?.text=="string"?t.text:"").join(`
47
+ `):""}async function qi(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);i&&(await i.ensureUsable?.(),await i.lockUpstream?.(e,t));let c=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let d=o.configService.get("API_TIMEOUT_MS");d&&(e.TIMEOUT=typeof d=="string"?parseInt(d,10):d)}if(r&&typeof s.auth=="function"){let d=await s.auth(n,t,a);if(d.body){n=d.body;let f=e.headers||{};d.config?.headers&&(f={...f,...d.config.headers},delete f.host,delete d.config.headers),e={...e,...d.config,headers:f}}else n=d}let l={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};i&&(l=await i.signRequest({headers:l,requestBody:n,provider:t,config:e})),nd(l,a?.req);for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];!i?.suppressDebugLog&&Cn(o.configService)&&oi(o.log,a.req.id,{url:String(c),headers:l,body:n});let u,p=()=>ii(c,n,{...e,headers:JSON.parse(JSON.stringify(l)),httpsProxy:i?void 0:ge(o.configService,t)},a,i?void 0:o.log);try{u=await p()}catch(d){throw i?await He(i,0,void 0,mt(n),{errorName:d?.name}):d}if(!u.ok&&i?.authRefresh&&u.status===401&&!et(a.req,i,t).refreshUsed){et(a.req,i,t).refreshUsed=!0;try{await i.authRefresh.forceRefresh(),l=await i.signRequest({headers:l,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(a.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(h){throw i?await He(i,u.status,void 0,mt(n)):h}if(i){let h=await He(i,u.status,d,mt(n));throw o.log.error(`[provider_response_error] Plugin(${i.name}) status=${u.status} code=${h.code}`),h}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let f=K(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw f.isRateLimit=u.status===429||Vn(d),f.rawBody=d,f}if(u.ok){let d=u.headers.get("content-type")||"",f=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${f} contentType=${d} ok=${u.ok} status=${u.status} hasBody=${!!u.body}`),!f||d.includes("application/json")){let h="";try{if(h=await u.clone().text(),!h||h.trim()==="")throw new SyntaxError("Empty JSON body");if(Lt(h))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let m=JSON.parse(h);if(i?.isErrorEnvelope?.(m))throw await He(i,u.status,h,mt(n));if(m&&typeof m=="object"&&m.error&&(typeof m.error=="string"||typeof m.error=="object"&&Object.keys(m.error).length>0)){if(i)throw await He(i,u.status,h,mt(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${h}`);let b=Vn(h),y=K(`Error from provider(${t.name},${n.model}: ${u.status}): ${h}`,400,"provider_response_error");throw y.isRateLimit=b,y.rawBody=h,y}}catch(g){if(i)throw g?.pluginClassified===!0?g:await He(i,u.status,void 0,mt(n));if(g instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${h}"`);let m=K(`API returned an empty or malformed response (HTTP 200) from ${t.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw m.rawBody=h,m}throw g}}}if(!i?.suppressDebugLog&&!n.stream&&Cn(o.configService)){let f=await u.clone().text();ri(o.log,a.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:f})}return u}async function ra(n,e,t,o,r,s){let a=e;if(!r&&t.transformer?.use?.length)for(let i of Array.from(t.transformer.use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let i of Array.from(t.transformer[n.model].use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),a=await o.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new st().transformResponseIn(a,{...s,provider:t})}catch(i){console.error("Failed to apply Responses API conversion for codex client:",i)}return a}async function sa(n,e,t,o){n.ok||e.code(n.status);let r=Ai(n);if(!r){let s=await ve(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let a=await Ee(n);n=a.response,a.isSSE&&(r=!0)}}if(r){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),o&&!o.pluginRegistry.getManagedRuntimeFor(o.providerService.getProvider(e.request.provider||""))?.suppressDebugLog&&Cn(o.configService)){let[s,a]=n.body.tee(),i=ni(o.configService);return si(s,o.log,e.request.id,i),e.send(a)}return e.send(n.body)}else return U(n)}function Vn(n){let e=n.toLowerCase();return e.includes("rate limit")||e.includes("rate_limit")||e.includes("rate_limit_error")||e.includes("too many requests")||e.includes("too many")||e.includes("quota exhausted")||e.includes("qps_limit")||e.includes("token_limit")||e.includes("\u9650\u6D41")||e.includes("\u9891\u7387\u9650\u5236")}function rd(n){try{return new URL(n),!0}catch{return!1}}var qu,ia,Qn=R(()=>{"use strict";ai();xn();di();pi();gi();At();ir();ue();rt();On();$n();vr();ne();We();ae();qu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;ia=async n=>{n.get("/",async()=>({message:"LLMs API",version:An})),n.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),n.get("/providers/health",async()=>({states:j().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError,rateLimitUntil:r.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=n.transformerService.getTransformersWithEndpoint();for(let{transformer:t}of e)t.endPoint&&n.post(t.endPoint,async(o,r)=>ea(o,r,n,t));n.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"}},proxyEnabled:{type:"boolean"}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(t,o)=>{let{name:r,baseUrl:s,apiKey:a,models:i}=t.body;if(!r?.trim())throw K("Provider name is required",400,"invalid_request");if(!s||!rd(s))throw K("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw K("API key is required",400,"invalid_request");if(!i||!Array.isArray(i)||i.length===0)throw K("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw K(`Provider with name '${t.body.name}' already exists`,400,"provider_exists");return n.providerService.registerProvider(t.body)}),n.get("/providers",async()=>n.providerService.getProviders()),n.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{let o=n.providerService.getProvider(t.params.id);if(!o)throw K("Provider not found",404,"provider_not_found");return o}),n.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"}},proxyEnabled:{type:"boolean"},enabled:{type:"boolean"}}}}},async(t,o)=>{let r=n.providerService.updateProvider(t.params.id,t.body);if(!r)throw K("Provider not found",404,"provider_not_found");return r}),n.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{if(!n.providerService.deleteProvider(t.params.id))throw K("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),n.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(t,o)=>{if(!n.providerService.toggleProvider(t.params.id,t.body.enabled))throw K("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var Ke,Lr=R(()=>{"use strict";Ke=class n{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;reload(){let e=new n(this.configService,this.transformerService,this.logger);this.providers=e.providers,this.modelRoutes=e.modelRoutes}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 o={};t.transformer&&Object.keys(t.transformer).forEach(s=>{s==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let a=new s({level:r});o.use=[a,...o.use||[]]}else this.logger.warn(`default_thinking_level set on ${t.name} but defaultthinking transformer is not registered`)}this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,pluginManaged:t.ccr_managed===!0,models:t.models||[],quotaToken:t.quota_token,quotaSecToken:t.quota_sec_token,transformer:t.transformer?o:void 0,cacheMode:t.cache_mode||"exclusive",enabled:t.enabled!==!1,proxyEnabled:t.proxy_enabled===!0,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(o){this.logger.error(`${t.name} provider registered error: ${o}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,proxyEnabled:e.proxyEnabled===!0,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(o=>{let r=`${t.name},${o}`,s={provider:t.name,model:o,fullModel:r};this.modelRoutes.set(r,s),this.modelRoutes.has(o)||this.modelRoutes.set(o,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let o=this.providers.get(e);if(!o)return null;let r={...o,...t,updatedAt:new Date};return this.providers.set(e,r),t.models&&(o.models.forEach(s=>{let a=`${o.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let a=`${o.name},${s}`,i={provider:o.name,model:s,fullModel:a};this.modelRoutes.set(a,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),r}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(o=>{let r=`${t.name},${o}`;this.modelRoutes.delete(r),this.modelRoutes.delete(o)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let o=this.providers.get(e);if(!o)return!1;o.enabled=t;let r=this.configService.get("providers");if(r&&Array.isArray(r)){let s=r.find(a=>a.name===e);s&&(s.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let o=this.providers.get(t.provider);return o?{provider:o,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push(o),e.push(`${t.name},${o}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,o)=>{if(Array.isArray(o)){let[r,s={}]=o;t[r]=s}else t[o]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push({id:o,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${o}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}}});var Oe,Yn,aa,sd,ca,gt=R(()=>{"use strict";Oe=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",Yn=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,aa=["low","medium","high"],sd={none:"none",off:"none",disabled:"none",min:"low",minimal:"low",light:"low",low:"low",medium:"medium",mid:"medium",high:"high",xhigh:"max",max:"max",maximum:"max",ultra:"max",ultracode:"max"},ca=n=>{if(typeof n=="string")return sd[n.trim().toLowerCase()]}});var Nr,la=R(()=>{Nr=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function id(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function ua(n){let e=[],t=[],o=d=>{if(typeof d=="string"){t.push({type:"text",text:d});return}Array.isArray(d)&&d.forEach(f=>{if(typeof f=="string"){t.push({type:"text",text:f});return}f&&typeof f=="object"&&f.type==="text"&&f.text&&t.push({...f})})},r=()=>{let d=new Map;for(let f=0;f<t.length;f++){let h=t[f],g=h?.text??JSON.stringify(h),m=d.get(g);if(m===void 0){d.set(g,f);continue}!t[m]?.cache_control&&h?.cache_control&&(t[m]=h),t.splice(f,1),f--}};n.messages.forEach(d=>{d.role==="system"?o(d.content):e.push(d)}),r();let s=[];for(let d=0;d<e.length;d++){let f=e[d];if(f.role==="tool"){let h=f.content;try{typeof f.content=="string"&&(h=JSON.parse(f.content))}catch{}h!=null&&typeof h!="object"&&typeof h!="string"&&(h=String(h));let g={type:"tool_result",tool_use_id:f.tool_call_id,content:h};f.cache_control&&(g.cache_control=f.cache_control);let m=s[s.length-1];m&&m.role==="user"&&Array.isArray(m.content)?m.content.push(g):s.push({role:"user",content:[g]})}else if(f.role==="user"){let h=[];typeof f.content=="string"?h.push({type:"text",text:f.content}):Array.isArray(f.content)&&f.content.forEach(m=>{m&&typeof m=="object"&&m.type==="image_url"&&m.image_url?.url?h.push({type:"image",source:{type:"base64",media_type:m.media_type||"image/jpeg",data:m.image_url.url.split(",")[1]||m.image_url.url}}):h.push(m)});let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(...h):s.push({role:"user",content:h.length>0?h:[{type:"text",text:" "}]})}else if(f.role==="assistant"){let h=[];f.content&&(typeof f.content=="string"?h.push({type:"text",text:f.content}):Array.isArray(f.content)&&h.push(...f.content)),f.tool_calls&&f.tool_calls.length>0&&f.tool_calls.forEach(m=>{let _={};try{_=JSON.parse(m.function.arguments)}catch{_=m.function.arguments}h.push({type:"tool_use",id:m.id,name:m.function.name,input:_})}),f.thinking&&h.unshift({type:"thinking",thinking:f.thinking.content,signature:f.thinking.signature});let g=s[s.length-1];g&&g.role==="assistant"&&Array.isArray(g.content)?g.content.push(...h):s.push({role:"assistant",content:h.length>0?h:[{type:"text",text:" "}]})}}let a=()=>{let d=t.filter(f=>f?.cache_control).length;for(let f of s)Array.isArray(f.content)&&(d+=f.content.filter(h=>h?.cache_control).length);return d},i=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},c=()=>{for(let d=s.length-1;d>=0;d--){let f=s[d]?.content;if(!Array.isArray(f))continue;let h=f.find(g=>g?.cache_control);if(h?.cache_control)return h.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},l=(d,f)=>{if(!Array.isArray(d?.content)||d.content.some(g=>g?.cache_control))return!1;let h=d.content.find(g=>g&&typeof g=="object"&&!g.cache_control);return h?(h.cache_control=i(f),!0):!1};(()=>{let d=4-a();if(d<=0||s.length===0)return;let f=s,h=c(),g=[];for(let m=f.length-1;m>=0;m--)f[m]?.role!=="user"||!Array.isArray(f[m].content)||g.push(m);for(let m of g){if(d<=0)break;l(f[m],h)&&d--}})();let p={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(n.reasoning?.enabled){let d=n.reasoning.max_tokens||Yn(n.reasoning.effort||"medium"),f=Math.min(d,p.max_tokens-1024);f>=1024&&(p.thinking={type:"enabled",budget_tokens:f});let h=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:Oe(d);aa.includes(h)&&(p.output_config={...p.output_config||{},effort:h})}if(t.length>0){let d=t.some(f=>f?.cache_control);p.system=d?t:t.map(f=>f.text||"").join(`
48
+
49
+ `)}return n.tools&&n.tools.length>0&&(p.tools=id(n.tools),n.tool_choice&&(n.tool_choice==="auto"?p.tool_choice={type:"auto"}:n.tool_choice==="any"||n.tool_choice==="required"?p.tool_choice={type:"any"}:typeof n.tool_choice=="string"?p.tool_choice={type:"tool",name:n.tool_choice}:typeof n.tool_choice=="object"&&n.tool_choice.type==="function"&&(p.tool_choice={type:"tool",name:n.tool_choice.function.name}))),p}var da=R(()=>{gt()});function ad(n){if(n===!0)return!0;if(n===!1)return!1;if(typeof n!="string")return;let e=n.trim().toLowerCase();if(e==="enabled"||e==="adaptive"||e==="true")return!0;if(e==="disabled"||e==="off"||e==="none"||e==="false")return!1}var Xn,Zn,pa=R(()=>{"use strict";Xn=require("uuid");gt();xn();ne();la();da();We();Zn=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let o={};return this.useBearer?(o.authorization=`Bearer ${t.apiKey}`,o["x-api-key"]=void 0):(o["x-api-key"]=t.apiKey,o.authorization=void 0),{body:e,config:{headers:o}}}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 i=e.system.filter(c=>c.type==="text"&&c.text).map(c=>({type:"text",text:c.text,cache_control:c.cache_control}));t.push({role:"system",content:i})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(i=>{i.role==="system"&&t.push({role:"system",content:i.content})}),o?.forEach(i=>{if(i.role!=="system"&&(i.role==="user"||i.role==="assistant")){if(typeof i.content=="string"){t.push({role:i.role,content:i.content});return}if(Array.isArray(i.content)){if(i.role==="user"){let c=i.content.filter(u=>u.type==="tool_result"&&u.tool_use_id);if(c.length){let u=jt(String(e.model??"")),p=[];c.forEach(d=>{let f=Array.isArray(d.content)?d.content:null,h=f?f.filter(_=>_?.type==="image"&&_?.source):[],g=typeof d.content=="string"?d.content:JSON.stringify(d.content);if(h.length>0){let _=f.filter(b=>!(b?.type==="image"&&b?.source)).map(b=>b?.type==="text"?String(b.text??""):JSON.stringify(b)).filter(b=>b.length>0).join(`
50
+ `);u?(g=_||"[tool image]",p.push(...h)):(g=[_,...h.map(()=>"(tool image omitted: target model does not support image input)")].filter(b=>b.length>0).join(`
51
+ `),this.logger?.debug?.({type:"tool_image_omitted",model:String(e.model??""),count:h.length}))}let m={role:"tool",content:g,tool_call_id:d.tool_use_id,cache_control:d.cache_control};t.push(m)}),p.length>0&&t.push({role:"user",content:p.map(d=>({type:"image_url",image_url:{url:d.source?.type==="base64"?Nr(d.source.data,d.source.media_type):d.source.url},media_type:d.source.media_type}))})}let l=i.content.filter(u=>u.type==="text"&&u.text||u.type==="image"&&u.source);l.length&&t.push({role:"user",content:l.map(u=>u?.type==="image"?{type:"image_url",image_url:{url:u.source?.type==="base64"?Nr(u.source.data,u.source.media_type):u.source.url},media_type:u.source.media_type}:u)})}else if(i.role==="assistant"){let c={role:"assistant",content:""},l=i.content.filter(d=>d.type==="text"&&d.text);l.length&&(c.content=l.map(d=>d.text).join(`
52
+ `));let u=i.content.filter(d=>d.type==="tool_use"&&d.id);u.length&&(c.tool_calls=u.map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input||{})}})));let p=i.content.find(d=>d.type==="thinking");p&&(c.thinking={content:p.thinking,signature:p.signature}),t.push(c)}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},s=ca(e.output_config?.effort),a=typeof e.thinking?.budget_tokens=="number"?e.thinking.budget_tokens:void 0;if(e.thinking!==void 0||s!==void 0){let i={},l=ad(e.thinking?.type)??(s!==void 0||(a??0)>0);l!==void 0&&(i.enabled=l),s!==void 0?i.effort=s:a!==void 0&&(i.effort=Oe(a)),a!==void 0&&a>0&&(i.max_tokens=a),Object.keys(i).length>0&&(r.reasoning=i)}return e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=ua(e),s={};return this.useBearer?(s.authorization=`Bearer ${t.apiKey}`,s["x-api-key"]=void 0):(s["x-api-key"]=t.apiKey,s.authorization=void 0),s["anthropic-version"]="2023-06-01",s["content-type"]="application/json",{body:r,config:{headers:s}}}isAnthropicMessagesEndpoint(e){try{return new URL(e.trim()).pathname.replace(/\/+$/,"").endsWith("/messages")}catch{return!1}}async transformResponseIn(e,t){if(t?.req?.isTargetAnthropic)return e;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 ve(e);if((r?.isSSE??!1)&&r?.body){let l=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(l,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let a;if(r?.body)a=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let l=await Ee(e);if(l.isSSE){let u=await this.convertOpenAIStreamToAnthropic(l.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}a=l.response}let i=await U(a),c=this.convertOpenAIResponseToAnthropic(i,t);return new Response(JSON.stringify(c),{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 s=new TextEncoder,a=`msg_${Date.now()}`,i=null,c=String(t?.req?.body?.model??"unknown"),l=!1,u=!1,p=!1,d=new Map,f=new Map,h=0,g=0,m=0,_=!1,b=!1,y=0,k=-1,v=()=>{let S=y;return y++,S},x=S=>{if(!_)try{r.enqueue(S);let P=new TextDecoder().decode(S);this.logger.debug({reqId:t.req.id,data:P,type:"send data"})}catch(P){if(P instanceof TypeError&&P.message.includes("Controller is already closed"))_=!0;else throw this.logger.debug({reqId:t.req.id,error:P instanceof Error?P.message:String(P),type:"send data error"}),P}},T=()=>{if(!_)try{if(!l){this.logger?.warn("[empty_stream] Upstream produced no data, closing silently"),r.close(),_=!0;return}if(k>=0){let P={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
53
53
  data: ${JSON.stringify(P)}
54
54
 
55
55
  `)),k=-1}if(i)x(s.encode(`event: message_delta
@@ -61,163 +61,163 @@ data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn",stop_
61
61
  `))}let S={type:"message_stop"};x(s.encode(`event: message_stop
62
62
  data: ${JSON.stringify(S)}
63
63
 
64
- `)),r.close(),y=!0}catch(S){if(S instanceof TypeError&&S.message.includes("Controller is already closed"))y=!0;else throw S}},R=null;try{R=e.getReader();let S=new TextDecoder,P="";for(;!y;){let{done:O,value:I}=await R.read();if(O)break;P+=S.decode(I,{stream:!0});let C=P.split(`
65
- `);P=C.pop()||"";for(let A of C){if(y)break;if(!A.startsWith("data:"))continue;let M=A.slice(5).trim();if(this.logger.debug({reqId:t.req.id,type:"recieved data",data:M}),M!=="[DONE]")try{let $=JSON.parse(M);if(h++,this.logger.debug({reqId:t.req.id,response:$,tppe:"Original Response"}),$.error){t?.req&&(t.req.sseError=$.error);let D={type:"error",message:{type:"api_error",message:JSON.stringify($.error)}};x(s.encode(`event: error
64
+ `)),r.close(),_=!0}catch(S){if(S instanceof TypeError&&S.message.includes("Controller is already closed"))_=!0;else throw S}},C=null;try{C=e.getReader();let S=new TextDecoder,P="";for(;!_;){let{done:M,value:I}=await C.read();if(M)break;P+=S.decode(I,{stream:!0});let A=P.split(`
65
+ `);P=A.pop()||"";for(let w of A){if(_)break;if(!w.startsWith("data:"))continue;let O=w.slice(5).trim();if(this.logger.debug({reqId:t.req.id,type:"recieved data",data:O}),O!=="[DONE]")try{let $=JSON.parse(O);if(h++,this.logger.debug({reqId:t.req.id,response:$,tppe:"Original Response"}),$.error){t?.req&&(t.req.sseError=$.error);let D={type:"error",message:{type:"api_error",message:JSON.stringify($.error)}};x(s.encode(`event: error
66
66
  data: ${JSON.stringify(D)}
67
67
 
68
- `));continue}if(c=$.model||c,!l&&!y&&!p){l=!0;let D=t?.req?.tokenCount||0,F={type:"message_start",message:{id:a,type:"message",role:"assistant",content:[],model:c,stop_reason:null,stop_sequence:null,usage:{input_tokens:D,output_tokens:0}}};x(s.encode(`event: message_start
68
+ `));continue}if(c=$.model||c,!l&&!_&&!p){l=!0;let D=t?.req?.tokenCount||0,F={type:"message_start",message:{id:a,type:"message",role:"assistant",content:[],model:c,stop_reason:null,stop_sequence:null,usage:{input_tokens:D,output_tokens:0}}};x(s.encode(`event: message_start
69
69
  data: ${JSON.stringify(F)}
70
70
 
71
- `))}let K=$.choices?.[0];if($.usage){let D=$.usage?.prompt_tokens_details?.cached_tokens??$.usage?.prompt_cache_hit_tokens??0,J=($.usage?.prompt_tokens||0)-D,Pe=$.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:$.usage,mappedUsage:{input_tokens:J,output_tokens:Pe,cache_read_input_tokens:D},choicesLength:Array.isArray($.choices)?$.choices.length:void 0,finishReason:K?.finish_reason});let B={input_tokens:J,output_tokens:Pe,cache_read_input_tokens:D};if(!i)i={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...B}};else{let ie=i.usage||{};i.usage={input_tokens:B.input_tokens||ie.input_tokens||0,output_tokens:B.output_tokens||ie.output_tokens||0,cache_read_input_tokens:B.cache_read_input_tokens||ie.cache_read_input_tokens||0}}}if(!K)continue;if(K?.delta?.thinking&&!y&&!p&&!u){if(!_){let D=v(),F={type:"content_block_start",index:D,content_block:{type:"thinking",thinking:""}};x(s.encode(`event: content_block_start
71
+ `))}let H=$.choices?.[0];if($.usage){let D=$.usage?.prompt_tokens_details?.cached_tokens??$.usage?.prompt_cache_hit_tokens??0,W=($.usage?.prompt_tokens||0)-D,Pe=$.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:$.usage,mappedUsage:{input_tokens:W,output_tokens:Pe,cache_read_input_tokens:D},choicesLength:Array.isArray($.choices)?$.choices.length:void 0,finishReason:H?.finish_reason});let J={input_tokens:W,output_tokens:Pe,cache_read_input_tokens:D};if(!i)i={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...J}};else{let ie=i.usage||{};i.usage={input_tokens:J.input_tokens||ie.input_tokens||0,output_tokens:J.output_tokens||ie.output_tokens||0,cache_read_input_tokens:J.cache_read_input_tokens||ie.cache_read_input_tokens||0}}}if(!H)continue;if(H?.delta?.thinking&&!_&&!p&&!u){if(!b){let D=v(),F={type:"content_block_start",index:D,content_block:{type:"thinking",thinking:""}};x(s.encode(`event: content_block_start
72
72
  data: ${JSON.stringify(F)}
73
73
 
74
- `)),k=D,_=!0}if(K.delta.thinking.signature){let D={type:"content_block_delta",index:k,delta:{type:"signature_delta",signature:K.delta.thinking.signature}};x(s.encode(`event: content_block_delta
74
+ `)),k=D,b=!0}if(H.delta.thinking.signature){let D={type:"content_block_delta",index:k,delta:{type:"signature_delta",signature:H.delta.thinking.signature}};x(s.encode(`event: content_block_delta
75
75
  data: ${JSON.stringify(D)}
76
76
 
77
77
  `));let F={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
78
78
  data: ${JSON.stringify(F)}
79
79
 
80
- `)),k=-1}else if(K.delta.thinking.content){let D={type:"content_block_delta",index:k,delta:{type:"thinking_delta",thinking:K.delta.thinking.content||""}};x(s.encode(`event: content_block_delta
80
+ `)),k=-1}else if(H.delta.thinking.content){let D={type:"content_block_delta",index:k,delta:{type:"thinking_delta",thinking:H.delta.thinking.content||""}};x(s.encode(`event: content_block_delta
81
81
  data: ${JSON.stringify(D)}
82
82
 
83
- `))}}if(K?.delta?.content&&!y&&!p){if(f++,k>=0&&!u){let F={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
83
+ `))}}if(H?.delta?.content&&!_&&!p){if(g++,k>=0&&!u){let F={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
84
84
  data: ${JSON.stringify(F)}
85
85
 
86
86
  `)),k=-1}if(!u&&!p){u=!0;let D=v(),F={type:"content_block_start",index:D,content_block:{type:"text",text:""}};x(s.encode(`event: content_block_start
87
87
  data: ${JSON.stringify(F)}
88
88
 
89
- `)),k=D}if(!y&&!p){let D={type:"content_block_delta",index:k,delta:{type:"text_delta",text:K.delta.content}};x(s.encode(`event: content_block_delta
89
+ `)),k=D}if(!_&&!p){let D={type:"content_block_delta",index:k,delta:{type:"text_delta",text:H.delta.content}};x(s.encode(`event: content_block_delta
90
90
  data: ${JSON.stringify(D)}
91
91
 
92
- `))}}if(K?.delta?.annotations?.length&&!y&&!p){if(k>=0&&u){let D={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
92
+ `))}}if(H?.delta?.annotations?.length&&!_&&!p){if(k>=0&&u){let D={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
93
93
  data: ${JSON.stringify(D)}
94
94
 
95
- `)),k=-1,u=!1}K?.delta?.annotations.forEach(D=>{let F=v(),J={type:"content_block_start",index:F,content_block:{type:"web_search_tool_result",tool_use_id:`srvtoolu_${(0,Xn.v4)()}`,content:[{type:"web_search_result",title:D.url_citation.title,url:D.url_citation.url}]}};x(s.encode(`event: content_block_start
96
- data: ${JSON.stringify(J)}
95
+ `)),k=-1,u=!1}H?.delta?.annotations.forEach(D=>{let F=v(),W={type:"content_block_start",index:F,content_block:{type:"web_search_tool_result",tool_use_id:`srvtoolu_${(0,Xn.v4)()}`,content:[{type:"web_search_result",title:D.url_citation.title,url:D.url_citation.url}]}};x(s.encode(`event: content_block_start
96
+ data: ${JSON.stringify(W)}
97
97
 
98
98
  `));let Pe={type:"content_block_stop",index:F};x(s.encode(`event: content_block_stop
99
99
  data: ${JSON.stringify(Pe)}
100
100
 
101
- `)),k=-1})}if(K?.delta?.tool_calls&&!y&&!p){g++;let D=new Set;for(let F of K.delta.tool_calls){if(y)break;let J=F.index??0;if(D.has(J))continue;if(D.add(J),!m.has(J)){if(k>=0){let Ol={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
101
+ `)),k=-1})}if(H?.delta?.tool_calls&&!_&&!p){m++;let D=new Set;for(let F of H.delta.tool_calls){if(_)break;let W=F.index??0;if(D.has(W))continue;if(D.add(W),!f.has(W)){if(k>=0){let Ol={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
102
102
  data: ${JSON.stringify(Ol)}
103
103
 
104
- `)),k=-1}let B=v();m.set(J,B);let ie=F.id||`call_ccr_${J}`,G=F.function?.name||`tool_${J}`,L={type:"content_block_start",index:B,content_block:{type:"tool_use",id:ie,name:G,input:{}}};x(s.encode(`event: content_block_start
104
+ `)),k=-1}let J=v();f.set(W,J);let ie=F.id||`call_ccr_${W}`,G=F.function?.name||`tool_${W}`,L={type:"content_block_start",index:J,content_block:{type:"tool_use",id:ie,name:G,input:{}}};x(s.encode(`event: content_block_start
105
105
  data: ${JSON.stringify(L)}
106
106
 
107
- `)),k=B;let Q={id:ie,name:G,arguments:"",contentBlockIndex:B};d.set(J,Q)}else if(F.id&&F.function?.name){let B=d.get(J);B.id.startsWith("call_")&&B.name.startsWith("tool_")&&(B.id=F.id,B.name=F.function.name)}if(F.function?.arguments&&!y&&!p){let B=m.get(J);if(B===void 0)continue;let ie=d.get(J);ie&&(ie.arguments+=F.function.arguments);try{let G={type:"content_block_delta",index:B,delta:{type:"input_json_delta",partial_json:F.function.arguments}};x(s.encode(`event: content_block_delta
107
+ `)),k=J;let Q={id:ie,name:G,arguments:"",contentBlockIndex:J};d.set(W,Q)}else if(F.id&&F.function?.name){let J=d.get(W);J.id.startsWith("call_")&&J.name.startsWith("tool_")&&(J.id=F.id,J.name=F.function.name)}if(F.function?.arguments&&!_&&!p){let J=f.get(W);if(J===void 0)continue;let ie=d.get(W);ie&&(ie.arguments+=F.function.arguments);try{let G={type:"content_block_delta",index:J,delta:{type:"input_json_delta",partial_json:F.function.arguments}};x(s.encode(`event: content_block_delta
108
108
  data: ${JSON.stringify(G)}
109
109
 
110
- `))}catch{try{let G=F.function.arguments.replace(/[\x00-\x1F\x7F-\x9F]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"'),L={type:"content_block_delta",index:B,delta:{type:"input_json_delta",partial_json:G}};x(s.encode(`event: content_block_delta
110
+ `))}catch{try{let G=F.function.arguments.replace(/[\x00-\x1F\x7F-\x9F]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"'),L={type:"content_block_delta",index:J,delta:{type:"input_json_delta",partial_json:G}};x(s.encode(`event: content_block_delta
111
111
  data: ${JSON.stringify(L)}
112
112
 
113
- `))}catch(G){console.error(G)}}}}}if(K?.finish_reason&&!y&&!p){if(f===0&&g===0&&console.error("Warning: No content in the stream response!"),k>=0){let D={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
113
+ `))}catch(G){console.error(G)}}}}}if(H?.finish_reason&&!_&&!p){if(g===0&&m===0&&console.error("Warning: No content in the stream response!"),k>=0){let D={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
114
114
  data: ${JSON.stringify(D)}
115
115
 
116
- `)),k=-1}if(!y){let F={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[K.finish_reason]||"end_turn";i?i.delta={...i.delta,stop_reason:F,stop_sequence:null}:i={type:"message_delta",delta:{stop_reason:F,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}p=!0}}catch($){this.logger?.error(`parseError: ${$.name} message: ${$.message} stack: ${$.stack} data: ${M}`)}}}T()}catch(S){if(!y)try{r.error(S)}catch(P){console.error(P)}}finally{if(R)try{R.releaseLock()}catch(S){console.error(S)}}},cancel:r=>{this.logger.debug({reqId:t.req.id},`cancle stream: ${r}`)}})}convertOpenAIResponseToAnthropic(e,t){this.logger.debug({reqId:t.req.id,response:e},"Original OpenAI response");try{let o=e.choices[0];if(!o)throw new Error("No choices found in OpenAI response");let r=[];if(o.message.annotations){let c=`srvtoolu_${(0,Xn.v4)()}`;r.push({type:"server_tool_use",id:c,name:"web_search",input:{query:""}}),r.push({type:"web_search_tool_result",tool_use_id:c,content:o.message.annotations.map(l=>({type:"web_search_result",url:l.url_citation.url,title:l.url_citation.title}))})}o.message.content&&r.push({type:"text",text:o.message.content}),o.message.tool_calls&&o.message.tool_calls.length>0&&o.message.tool_calls.forEach(c=>{let l={};try{let u=c.function.arguments||"{}";typeof u=="object"?l=u:typeof u=="string"&&(l=JSON.parse(u))}catch{l={text:c.function.arguments||""}}r.push({type:"tool_use",id:c.id,name:c.function.name,input:l})}),o.message?.thinking?.content&&r.push({type:"thinking",thinking:o.message.thinking.content,signature:o.message.thinking.signature});let s=e.usage?.prompt_tokens_details?.cached_tokens??e.usage?.prompt_cache_hit_tokens??0,a=(e.usage?.prompt_tokens||0)-s,i={id:e.id?.startsWith("msg_")?e.id:`msg_${(0,Xn.v4)().replace(/-/g,"")}`,type:"message",role:"assistant",model:e.model,content:r,stop_reason:o.finish_reason==="stop"?"end_turn":o.finish_reason==="length"?"max_tokens":o.finish_reason==="tool_calls"?"tool_use":o.finish_reason==="content_filter"?"stop_sequence":"end_turn",stop_sequence:null,usage:{input_tokens:a,cache_creation_input_tokens:0,cache_read_input_tokens:s,output_tokens:e.usage?.completion_tokens||0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"},stop_details:null,context_management:null};return this.logger.debug({reqId:t.req.id,result:i},"Conversion complete, final Anthropic response"),i}catch{throw W(`Provider error: ${JSON.stringify(e)}`,500,"provider_error")}}}});function ad(n,e){n.includes("null")&&(e.nullable=!0);let t=n.filter(o=>o!=="null");if(t.length===1){let o=t[0].toUpperCase();e.type=Object.values(gt).includes(o)?o:gt.TYPE_UNSPECIFIED}else{e.anyOf=[];for(let o of t){let r=o.toUpperCase();e.anyOf.push({type:Object.values(gt).includes(r)?r:gt.TYPE_UNSPECIFIED})}}}function Bt(n){let e={},t=["items"],o=["anyOf"],r=["properties"];if(n.type&&n.anyOf)throw new Error("type and anyOf cannot be both populated.");let s=n.anyOf;s!=null&&Array.isArray(s)&&s.length==2&&(s[0]&&s[0].type==="null"?(e.nullable=!0,n=s[1]):s[1]&&s[1].type==="null"&&(e.nullable=!0,n=s[0])),n.type&&Array.isArray(n.type)&&ad(n.type,e);for(let[a,i]of Object.entries(n))if(i!=null)if(a=="type"){if(i==="null")throw new Error("type: null can not be the only possible type for the field.");if(Array.isArray(i))continue;let c=i.toUpperCase();e.type=Object.values(gt).includes(c)?c:gt.TYPE_UNSPECIFIED}else if(t.includes(a))e[a]=Bt(i);else if(o.includes(a)){let c=[];for(let l of i){if(l.type=="null"){e.nullable=!0;continue}c.push(Bt(l))}e[a]=c}else if(r.includes(a)){let c={};for(let[l,u]of Object.entries(i))c[l]=Bt(u);e[a]=c}else{if(a==="additionalProperties")continue;e[a]=i}return e}function cd(n){if(n.functionDeclarations)for(let e of n.functionDeclarations)e.parameters&&(Object.keys(e.parameters).includes("$schema")?e.parametersJsonSchema||(e.parametersJsonSchema=e.parameters,delete e.parameters):e.parameters=Bt(e.parameters)),e.response&&(Object.keys(e.response).includes("$schema")?e.responseJsonSchema||(e.responseJsonSchema=e.response,delete e.response):e.response=Bt(e.response));return n}function qn(n){let e=[],t=n.tools?.filter(c=>c.function.name!=="web_search")?.map(c=>({name:c.function.name,description:c.function.description,parametersJsonSchema:c.function.parameters}));t?.length&&e.push(cd({functionDeclarations:t})),n.tools?.find(c=>c.function.name==="web_search")&&e.push({googleSearch:{}});let r=[],s=n.messages.filter(c=>c.role==="tool");n.messages.filter(c=>c.role!=="tool").forEach(c=>{let l;c.role==="assistant"?l="model":(["user","system"].includes(c.role),l="user");let u=[];if(typeof c.content=="string"){let p={text:c.content};c.thinking?.signature&&(p.thoughtSignature=c.thinking.signature),u.push(p)}else Array.isArray(c.content)?u.push(...c.content.map(p=>{if(p.type==="text")return{text:p.text||""};if(p.type==="image_url")return p.image_url.url.startsWith("http")?{file_data:{mime_type:p.media_type,file_uri:p.image_url.url}}:{inlineData:{mime_type:p.media_type,data:p.image_url.url?.split(",")?.pop()||p.image_url.url}}})):c.content&&typeof c.content=="object"&&(c.content.text?u.push({text:c.content.text}):u.push({text:JSON.stringify(c.content)}));if(Array.isArray(c.tool_calls)&&u.push(...c.tool_calls.map(p=>{let d={functionCall:{id:p.id||`tool_${Math.random().toString(36).substring(2,15)}`,name:p.function.name,args:JSON.parse(p.function.arguments||"{}")}};return c.thinking?.signature&&(d.thoughtSignature=c.thinking.signature),d})),u.length===0&&u.push({text:""}),r.push({role:l,parts:u}),l==="model"&&c.tool_calls){let p=c.tool_calls.map(d=>{let m=s.find(h=>h.tool_call_id===d.id);return{functionResponse:{name:d?.function?.name,response:{result:m?.content}}}});r.push({role:"user",parts:p})}});let a={};if(n.reasoning&&n.reasoning.effort&&n.reasoning.effort!=="none")if(a.thinkingConfig={includeThoughts:!0},n.model.includes("gemini-3"))a.thinkingConfig.thinkingLevel=n.reasoning.effort;else{let c=n.model.includes("pro")?[128,32768]:[0,24576],l,u=n.reasoning.max_tokens;typeof u<"u"&&(u>=c[0]&&u<=c[1]?l=u:u<c[0]?l=c[0]:u>c[1]&&(l=c[1]),a.thinkingConfig.thinkingBudget=l)}let i={contents:r,tools:e.length?e:void 0,generationConfig:a};if(n.tool_choice){let c={functionCallingConfig:{}};n.tool_choice==="auto"?c.functionCallingConfig.mode="auto":n.tool_choice==="none"?c.functionCallingConfig.mode="none":n.tool_choice==="required"?c.functionCallingConfig.mode="any":n.tool_choice?.function?.name&&(c.functionCallingConfig.mode="any",c.functionCallingConfig.allowedFunctionNames=[n.tool_choice?.function?.name]),i.toolConfig=c}return i}function eo(n){let e=n.contents,t=n.tools,o=n.model,r=n.max_tokens,s=n.temperature,a=n.stream,i=n.tool_choice,c={messages:[],model:o,max_tokens:r,temperature:s,stream:a,tool_choice:i};return Array.isArray(e)&&e.forEach(l=>{typeof l=="string"?c.messages.push({role:"user",content:l}):typeof l.text=="string"?c.messages.push({role:"user",content:l.text||null}):l.role==="user"?c.messages.push({role:"user",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]}):l.role==="model"&&c.messages.push({role:"assistant",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]})}),Array.isArray(t)&&(c.tools=[],t.forEach(l=>{Array.isArray(l.functionDeclarations)&&l.functionDeclarations.forEach(u=>{c.tools.push({type:"function",function:{name:u.name,description:u.description,parameters:u.parameters}})})})),c}async function to(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json();t?.debug({response:o},`${e} response:`);let r="",s="",a=o.candidates[0]?.content?.parts||[],i=[];for(let p of a)p.text&&p.thought===!0?r+=p.text:i.push(p);s=a.find(p=>p.thoughtSignature)?.thoughtSignature;let c=i?.filter(p=>p.functionCall)?.map(p=>({id:p.functionCall?.id||`tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:p.functionCall?.name,arguments:JSON.stringify(p.functionCall?.args||{})}}))||[],l=i?.filter(p=>p.text)?.map(p=>p.text)?.join(`
117
- `)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:l,role:"assistant",tool_calls:c.length>0?c:void 0,...s&&{thinking:{content:r||"(no content)",signature:s}}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.modelVersion,object:"chat.completion",usage:{completion_tokens:o.usageMetadata?.candidatesTokenCount||0,prompt_tokens:o.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:o.usageMetadata?.cachedContentTokenCount||0},total_tokens:o.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:o.usageMetadata?.thoughtsTokenCount||0}}};return new Response(JSON.stringify(u),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=!1,a=!1,i=!1,c="",l=0,u=-1,p=new ReadableStream({async start(d){let m=async(g,y)=>{if(g.startsWith("data: ")){let _=g.slice(6).trim();if(_){t?.debug({chunkStr:_},`${e} chunk:`);try{let b=JSON.parse(_);if(!b.candidates||!b.candidates[0]){t?.debug({chunkStr:_},"Invalid chunk structure");return}let k=b.candidates[0],v=k.content?.parts||[];v.filter(S=>S.text&&S.thought===!0).forEach(S=>{i||(i=!0);let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:S.text}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};y.enqueue(r.encode(`data: ${JSON.stringify(P)}
116
+ `)),k=-1}if(!_){let F={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[H.finish_reason]||"end_turn";i?i.delta={...i.delta,stop_reason:F,stop_sequence:null}:i={type:"message_delta",delta:{stop_reason:F,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}p=!0}}catch($){this.logger?.error(`parseError: ${$.name} message: ${$.message} stack: ${$.stack} data: ${O}`)}}}T()}catch(S){if(!_)try{r.error(S)}catch(P){console.error(P)}}finally{if(C)try{C.releaseLock()}catch(S){console.error(S)}}},cancel:r=>{this.logger.debug({reqId:t.req.id},`cancle stream: ${r}`)}})}convertOpenAIResponseToAnthropic(e,t){this.logger.debug({reqId:t.req.id,response:e},"Original OpenAI response");try{let o=e.choices[0];if(!o)throw new Error("No choices found in OpenAI response");let r=[];if(o.message.annotations){let c=`srvtoolu_${(0,Xn.v4)()}`;r.push({type:"server_tool_use",id:c,name:"web_search",input:{query:""}}),r.push({type:"web_search_tool_result",tool_use_id:c,content:o.message.annotations.map(l=>({type:"web_search_result",url:l.url_citation.url,title:l.url_citation.title}))})}o.message.content&&r.push({type:"text",text:o.message.content}),o.message.tool_calls&&o.message.tool_calls.length>0&&o.message.tool_calls.forEach(c=>{let l={};try{let u=c.function.arguments||"{}";typeof u=="object"?l=u:typeof u=="string"&&(l=JSON.parse(u))}catch{l={text:c.function.arguments||""}}r.push({type:"tool_use",id:c.id,name:c.function.name,input:l})}),o.message?.thinking?.content&&r.push({type:"thinking",thinking:o.message.thinking.content,signature:o.message.thinking.signature});let s=e.usage?.prompt_tokens_details?.cached_tokens??e.usage?.prompt_cache_hit_tokens??0,a=(e.usage?.prompt_tokens||0)-s,i={id:e.id?.startsWith("msg_")?e.id:`msg_${(0,Xn.v4)().replace(/-/g,"")}`,type:"message",role:"assistant",model:e.model,content:r,stop_reason:o.finish_reason==="stop"?"end_turn":o.finish_reason==="length"?"max_tokens":o.finish_reason==="tool_calls"?"tool_use":o.finish_reason==="content_filter"?"stop_sequence":"end_turn",stop_sequence:null,usage:{input_tokens:a,cache_creation_input_tokens:0,cache_read_input_tokens:s,output_tokens:e.usage?.completion_tokens||0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"},stop_details:null,context_management:null};return this.logger.debug({reqId:t.req.id,result:i},"Conversion complete, final Anthropic response"),i}catch{throw K(`Provider error: ${JSON.stringify(e)}`,500,"provider_error")}}}});function cd(n,e){n.includes("null")&&(e.nullable=!0);let t=n.filter(o=>o!=="null");if(t.length===1){let o=t[0].toUpperCase();e.type=Object.values(ht).includes(o)?o:ht.TYPE_UNSPECIFIED}else{e.anyOf=[];for(let o of t){let r=o.toUpperCase();e.anyOf.push({type:Object.values(ht).includes(r)?r:ht.TYPE_UNSPECIFIED})}}}function Bt(n){let e={},t=["items"],o=["anyOf"],r=["properties"];if(n.type&&n.anyOf)throw new Error("type and anyOf cannot be both populated.");let s=n.anyOf;s!=null&&Array.isArray(s)&&s.length==2&&(s[0]&&s[0].type==="null"?(e.nullable=!0,n=s[1]):s[1]&&s[1].type==="null"&&(e.nullable=!0,n=s[0])),n.type&&Array.isArray(n.type)&&cd(n.type,e);for(let[a,i]of Object.entries(n))if(i!=null)if(a=="type"){if(i==="null")throw new Error("type: null can not be the only possible type for the field.");if(Array.isArray(i))continue;let c=i.toUpperCase();e.type=Object.values(ht).includes(c)?c:ht.TYPE_UNSPECIFIED}else if(t.includes(a))e[a]=Bt(i);else if(o.includes(a)){let c=[];for(let l of i){if(l.type=="null"){e.nullable=!0;continue}c.push(Bt(l))}e[a]=c}else if(r.includes(a)){let c={};for(let[l,u]of Object.entries(i))c[l]=Bt(u);e[a]=c}else{if(a==="additionalProperties")continue;e[a]=i}return e}function ld(n){if(n.functionDeclarations)for(let e of n.functionDeclarations)e.parameters&&(Object.keys(e.parameters).includes("$schema")?e.parametersJsonSchema||(e.parametersJsonSchema=e.parameters,delete e.parameters):e.parameters=Bt(e.parameters)),e.response&&(Object.keys(e.response).includes("$schema")?e.responseJsonSchema||(e.responseJsonSchema=e.response,delete e.response):e.response=Bt(e.response));return n}function qn(n){let e=[],t=n.tools?.filter(c=>c.function.name!=="web_search")?.map(c=>({name:c.function.name,description:c.function.description,parametersJsonSchema:c.function.parameters}));t?.length&&e.push(ld({functionDeclarations:t})),n.tools?.find(c=>c.function.name==="web_search")&&e.push({googleSearch:{}});let r=[],s=n.messages.filter(c=>c.role==="tool");n.messages.filter(c=>c.role!=="tool").forEach(c=>{let l;c.role==="assistant"?l="model":(["user","system"].includes(c.role),l="user");let u=[];if(typeof c.content=="string"){let p={text:c.content};c.thinking?.signature&&(p.thoughtSignature=c.thinking.signature),u.push(p)}else Array.isArray(c.content)?u.push(...c.content.map(p=>{if(p.type==="text")return{text:p.text||""};if(p.type==="image_url")return p.image_url.url.startsWith("http")?{file_data:{mime_type:p.media_type,file_uri:p.image_url.url}}:{inlineData:{mime_type:p.media_type,data:p.image_url.url?.split(",")?.pop()||p.image_url.url}}})):c.content&&typeof c.content=="object"&&(c.content.text?u.push({text:c.content.text}):u.push({text:JSON.stringify(c.content)}));if(Array.isArray(c.tool_calls)&&u.push(...c.tool_calls.map(p=>{let d={functionCall:{id:p.id||`tool_${Math.random().toString(36).substring(2,15)}`,name:p.function.name,args:JSON.parse(p.function.arguments||"{}")}};return c.thinking?.signature&&(d.thoughtSignature=c.thinking.signature),d})),u.length===0&&u.push({text:""}),r.push({role:l,parts:u}),l==="model"&&c.tool_calls){let p=c.tool_calls.map(d=>{let f=s.find(h=>h.tool_call_id===d.id);return{functionResponse:{name:d?.function?.name,response:{result:f?.content}}}});r.push({role:"user",parts:p})}});let a={};if(n.reasoning&&n.reasoning.effort&&n.reasoning.effort!=="none")if(a.thinkingConfig={includeThoughts:!0},n.model.includes("gemini-3"))a.thinkingConfig.thinkingLevel=n.reasoning.effort;else{let c=n.model.includes("pro")?[128,32768]:[0,24576],l,u=n.reasoning.max_tokens;typeof u<"u"&&(u>=c[0]&&u<=c[1]?l=u:u<c[0]?l=c[0]:u>c[1]&&(l=c[1]),a.thinkingConfig.thinkingBudget=l)}let i={contents:r,tools:e.length?e:void 0,generationConfig:a};if(n.tool_choice){let c={functionCallingConfig:{}};n.tool_choice==="auto"?c.functionCallingConfig.mode="auto":n.tool_choice==="none"?c.functionCallingConfig.mode="none":n.tool_choice==="required"?c.functionCallingConfig.mode="any":n.tool_choice?.function?.name&&(c.functionCallingConfig.mode="any",c.functionCallingConfig.allowedFunctionNames=[n.tool_choice?.function?.name]),i.toolConfig=c}return i}function eo(n){let e=n.contents,t=n.tools,o=n.model,r=n.max_tokens,s=n.temperature,a=n.stream,i=n.tool_choice,c={messages:[],model:o,max_tokens:r,temperature:s,stream:a,tool_choice:i};return Array.isArray(e)&&e.forEach(l=>{typeof l=="string"?c.messages.push({role:"user",content:l}):typeof l.text=="string"?c.messages.push({role:"user",content:l.text||null}):l.role==="user"?c.messages.push({role:"user",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]}):l.role==="model"&&c.messages.push({role:"assistant",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]})}),Array.isArray(t)&&(c.tools=[],t.forEach(l=>{Array.isArray(l.functionDeclarations)&&l.functionDeclarations.forEach(u=>{c.tools.push({type:"function",function:{name:u.name,description:u.description,parameters:u.parameters}})})})),c}async function to(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json();t?.debug({response:o},`${e} response:`);let r="",s="",a=o.candidates[0]?.content?.parts||[],i=[];for(let p of a)p.text&&p.thought===!0?r+=p.text:i.push(p);s=a.find(p=>p.thoughtSignature)?.thoughtSignature;let c=i?.filter(p=>p.functionCall)?.map(p=>({id:p.functionCall?.id||`tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:p.functionCall?.name,arguments:JSON.stringify(p.functionCall?.args||{})}}))||[],l=i?.filter(p=>p.text)?.map(p=>p.text)?.join(`
117
+ `)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:l,role:"assistant",tool_calls:c.length>0?c:void 0,...s&&{thinking:{content:r||"(no content)",signature:s}}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.modelVersion,object:"chat.completion",usage:{completion_tokens:o.usageMetadata?.candidatesTokenCount||0,prompt_tokens:o.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:o.usageMetadata?.cachedContentTokenCount||0},total_tokens:o.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:o.usageMetadata?.thoughtsTokenCount||0}}};return new Response(JSON.stringify(u),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=!1,a=!1,i=!1,c="",l=0,u=-1,p=new ReadableStream({async start(d){let f=async(m,_)=>{if(m.startsWith("data: ")){let b=m.slice(6).trim();if(b){t?.debug({chunkStr:b},`${e} chunk:`);try{let y=JSON.parse(b);if(!y.candidates||!y.candidates[0]){t?.debug({chunkStr:b},"Invalid chunk structure");return}let k=y.candidates[0],v=k.content?.parts||[];v.filter(S=>S.text&&S.thought===!0).forEach(S=>{i||(i=!0);let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:S.text}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
118
118
 
119
- `))});let x=v.find(S=>S.thoughtSignature)?.thoughtSignature;if(x&&!s){if(!i){let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:"(no content)"}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};y.enqueue(r.encode(`data: ${JSON.stringify(P)}
119
+ `))});let x=v.find(S=>S.thoughtSignature)?.thoughtSignature;if(x&&!s){if(!i){let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:"(no content)"}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
120
120
 
121
- `))}let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:x}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};if(y.enqueue(r.encode(`data: ${JSON.stringify(S)}
121
+ `))}let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:x}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};if(_.enqueue(r.encode(`data: ${JSON.stringify(S)}
122
122
 
123
- `)),s=!0,l++,c){let P={choices:[{delta:{role:"assistant",content:c},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};y.enqueue(r.encode(`data: ${JSON.stringify(P)}
123
+ `)),s=!0,l++,c){let P={choices:[{delta:{role:"assistant",content:c},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
124
124
 
125
- `)),c="",a||(a=!0)}}let T=v.filter(S=>S.functionCall).map(S=>({id:S.functionCall?.id||`ccr_tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:S.functionCall?.name,arguments:JSON.stringify(S.functionCall?.args||{})}})),R=v.filter(S=>S.text&&S.thought!==!0).map(S=>S.text).join(`
126
- `);if(!R&&s&&!a){let S={choices:[{delta:{role:"assistant",content:"(no content)"},index:l,finish_reason:null,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};y.enqueue(r.encode(`data: ${JSON.stringify(S)}
125
+ `)),c="",a||(a=!0)}}let T=v.filter(S=>S.functionCall).map(S=>({id:S.functionCall?.id||`ccr_tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:S.functionCall?.name,arguments:JSON.stringify(S.functionCall?.args||{})}})),C=v.filter(S=>S.text&&S.thought!==!0).map(S=>S.text).join(`
126
+ `);if(!C&&s&&!a){let S={choices:[{delta:{role:"assistant",content:"(no content)"},index:l,finish_reason:null,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(S)}
127
127
 
128
- `)),a||(a=!0)}if(i&&R&&!s)if(b.modelVersion.includes("3")){c+=R;return}else{let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:`ccr_${+new Date}`}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};y.enqueue(r.encode(`data: ${JSON.stringify(S)}
128
+ `)),a||(a=!0)}if(i&&C&&!s)if(y.modelVersion.includes("3")){c+=C;return}else{let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:`ccr_${+new Date}`}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(S)}
129
129
 
130
- `)),s=!0}if(R){c||l++;let S={choices:[{delta:{role:"assistant",content:R},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:b.usageMetadata?.candidatesTokenCount||0,prompt_tokens:b.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:b.usageMetadata?.cachedContentTokenCount||0},total_tokens:b.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:b.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(S.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((P,O)=>{let I=k?.groundingMetadata?.groundingSupports?.filter(C=>C.groundingChunkIndices?.includes(O));return{type:"url_citation",url_citation:{url:P?.web?.uri||"",title:P?.web?.title||"",content:I?.[0]?.segment?.text||"",start_index:I?.[0]?.segment?.startIndex||0,end_index:I?.[0]?.segment?.endIndex||0}}})),y.enqueue(r.encode(`data: ${JSON.stringify(S)}
130
+ `)),s=!0}if(C){c||l++;let S={choices:[{delta:{role:"assistant",content:C},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:y.usageMetadata?.candidatesTokenCount||0,prompt_tokens:y.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:y.usageMetadata?.cachedContentTokenCount||0},total_tokens:y.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:y.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(S.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((P,M)=>{let I=k?.groundingMetadata?.groundingSupports?.filter(A=>A.groundingChunkIndices?.includes(M));return{type:"url_citation",url_citation:{url:P?.web?.uri||"",title:P?.web?.title||"",content:I?.[0]?.segment?.text||"",start_index:I?.[0]?.segment?.startIndex||0,end_index:I?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(S)}
131
131
 
132
- `)),!a&&R&&(a=!0)}T.length>0&&(T.forEach(S=>{l++,u++;let P={choices:[{delta:{role:"assistant",tool_calls:[{...S,index:u}]},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:b.responseId||"",model:b.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:b.usageMetadata?.candidatesTokenCount||0,prompt_tokens:b.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:b.usageMetadata?.cachedContentTokenCount||0},total_tokens:b.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:b.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(P.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((O,I)=>{let C=k?.groundingMetadata?.groundingSupports?.filter(A=>A.groundingChunkIndices?.includes(I));return{type:"url_citation",url_citation:{url:O?.web?.uri||"",title:O?.web?.title||"",content:C?.[0]?.segment?.text||"",start_index:C?.[0]?.segment?.startIndex||0,end_index:C?.[0]?.segment?.endIndex||0}}})),y.enqueue(r.encode(`data: ${JSON.stringify(P)}
132
+ `)),!a&&C&&(a=!0)}T.length>0&&(T.forEach(S=>{l++,u++;let P={choices:[{delta:{role:"assistant",tool_calls:[{...S,index:u}]},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:y.usageMetadata?.candidatesTokenCount||0,prompt_tokens:y.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:y.usageMetadata?.cachedContentTokenCount||0},total_tokens:y.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:y.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(P.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((M,I)=>{let A=k?.groundingMetadata?.groundingSupports?.filter(w=>w.groundingChunkIndices?.includes(I));return{type:"url_citation",url_citation:{url:M?.web?.uri||"",title:M?.web?.title||"",content:A?.[0]?.segment?.text||"",start_index:A?.[0]?.segment?.startIndex||0,end_index:A?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(P)}
133
133
 
134
- `))}),!a&&R&&(a=!0))}catch(b){t?.error(`Error parsing ${e} stream chunk`,_,b.message)}}}},h=n.body.getReader(),f="";try{for(;;){let{done:g,value:y}=await h.read();if(g){f&&await m(f,d);break}f+=o.decode(y,{stream:!0});let _=f.split(`
135
- `);f=_.pop()||"";for(let b of _)await m(b,d)}}catch(g){d.error(g)}finally{d.close()}}});return new Response(p,{status:n.status,statusText:n.statusText,headers:n.headers})}}var gt,$r=w(()=>{"use strict";gt={TYPE_UNSPECIFIED:"TYPE_UNSPECIFIED",STRING:"STRING",NUMBER:"NUMBER",INTEGER:"INTEGER",BOOLEAN:"BOOLEAN",ARRAY:"ARRAY",OBJECT:"OBJECT",NULL:"NULL"}});var no,fa=w(()=>{"use strict";$r();no=class{name="gemini";endPoint="/v1beta/models/:modelAndAction";async transformRequestIn(e,t){return{body:qn(e),config:{url:new URL(`./${e.model}:${e.stream?"streamGenerateContent?alt=sse":"generateContent"}`,t.baseUrl),headers:{"x-goog-api-key":t.apiKey,Authorization:void 0}}}}transformRequestOut=eo;async transformResponseOut(e){return to(e,this.name,this.logger)}}});async function ld(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
134
+ `))}),!a&&C&&(a=!0))}catch(y){t?.error(`Error parsing ${e} stream chunk`,b,y.message)}}}},h=n.body.getReader(),g="";try{for(;;){let{done:m,value:_}=await h.read();if(m){g&&await f(g,d);break}g+=o.decode(_,{stream:!0});let b=g.split(`
135
+ `);g=b.pop()||"";for(let y of b)await f(y,d)}}catch(m){d.error(m)}finally{d.close()}}});return new Response(p,{status:n.status,statusText:n.statusText,headers:n.headers})}}var ht,$r=R(()=>{"use strict";ht={TYPE_UNSPECIFIED:"TYPE_UNSPECIFIED",STRING:"STRING",NUMBER:"NUMBER",INTEGER:"INTEGER",BOOLEAN:"BOOLEAN",ARRAY:"ARRAY",OBJECT:"OBJECT",NULL:"NULL"}});var no,fa=R(()=>{"use strict";$r();no=class{name="gemini";endPoint="/v1beta/models/:modelAndAction";async transformRequestIn(e,t){return{body:qn(e),config:{url:new URL(`./${e.model}:${e.stream?"streamGenerateContent?alt=sse":"generateContent"}`,t.baseUrl),headers:{"x-goog-api-key":t.apiKey,Authorization:void 0}}}}transformRequestOut=eo;async transformResponseOut(e){return to(e,this.name,this.logger)}}});async function ud(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
136
136
  1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
137
137
  2. Run "gcloud auth application-default login"
138
- 3. Use Google Cloud environment with default service account`)}}var oo,ma=w(()=>{"use strict";$r();oo=class{name="vertex-gemini";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-central1";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await ld();return{body:qn(e),config:{url:new URL(`./v1beta1/projects/${o}/locations/${r}/publishers/google/models/${e.model}:${e.stream?"streamGenerateContent":"generateContent"}`,t.baseUrl.endsWith("/")?t.baseUrl:t.baseUrl+"/"||`https://${r}-aiplatform.googleapis.com`),headers:{Authorization:`Bearer ${s}`,"x-goog-api-key":void 0}}}}async transformRequestOut(e){return eo(e)}async transformResponseOut(e){return to(e,this.name)}}});var ro,ga=w(()=>{"use strict";ne();ro=class{name="deepseek";async transformRequestIn(e){e.max_tokens&&e.max_tokens>8192&&(e.max_tokens=8192);let t=e.model?.includes("reasoner")||e.model?.includes("v4")||e.model?.includes("pro")||e.model?.includes("think"),o=e.thinking||e.reasoning?.enabled||e.messages.some(r=>r.thinking?.content)||t;return o&&e.tool_choice&&delete e.tool_choice,e.messages.forEach(r=>{if(r.role==="assistant"){let s=r.thinking?.content,a=r.thinking?.signature,i="";if(typeof r.content=="string"){let l=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);l&&(i=l[1].trim(),r.content=r.content.replace(l[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,a&&(r.reasoning_content_signature=a)):i&&(r.reasoning_content=i),o&&!r.reasoning_content&&(r.reasoning_content=" "),r.thinking&&delete r.thinking}}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,m,h)=>{let f=d.split(`
139
- `);for(let g of f)g.trim()&&m.enqueue(h.encode(g+`
140
- `))},p=(d,m)=>{let{controller:h,encoder:f}=m;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let g=JSON.parse(d.slice(6));if(g.choices?.[0]?.delta?.reasoning_content){m.appendReasoningContent(g.choices[0].delta.reasoning_content);let y={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete y.choices[0].delta.reasoning_content;let _=`data: ${JSON.stringify(y)}
138
+ 3. Use Google Cloud environment with default service account`)}}var oo,ma=R(()=>{"use strict";$r();oo=class{name="vertex-gemini";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-central1";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await ud();return{body:qn(e),config:{url:new URL(`./v1beta1/projects/${o}/locations/${r}/publishers/google/models/${e.model}:${e.stream?"streamGenerateContent":"generateContent"}`,t.baseUrl.endsWith("/")?t.baseUrl:t.baseUrl+"/"||`https://${r}-aiplatform.googleapis.com`),headers:{Authorization:`Bearer ${s}`,"x-goog-api-key":void 0}}}}async transformRequestOut(e){return eo(e)}async transformResponseOut(e){return to(e,this.name)}}});var ro,ga=R(()=>{"use strict";ne();ro=class{name="deepseek";async transformRequestIn(e){e.max_tokens&&e.max_tokens>8192&&(e.max_tokens=8192);let t=e.model?.includes("reasoner")||e.model?.includes("v4")||e.model?.includes("pro")||e.model?.includes("think"),o=e.thinking||e.reasoning?.enabled||e.messages.some(r=>r.thinking?.content)||t;return o&&e.tool_choice&&delete e.tool_choice,e.messages.forEach(r=>{if(r.role==="assistant"){let s=r.thinking?.content,a=r.thinking?.signature,i="";if(typeof r.content=="string"){let l=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);l&&(i=l[1].trim(),r.content=r.content.replace(l[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,a&&(r.reasoning_content_signature=a)):i&&(r.reasoning_content=i),o&&!r.reasoning_content&&(r.reasoning_content=" "),r.thinking&&delete r.thinking}}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
139
+ `);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
140
+ `))},p=(d,f)=>{let{controller:h,encoder:g}=f;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let m=JSON.parse(d.slice(6));if(m.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(m.choices[0].delta.reasoning_content);let _={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,thinking:{content:m.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(_)}
141
141
 
142
- `;h.enqueue(f.encode(_));return}if(g.choices?.[0]?.delta?.content&&m.reasoningContent()&&!m.isReasoningComplete()){m.setReasoningComplete(!0);let y="ccr_think_signature",_=g.choices[0].delta.content,b={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:null,thinking:{content:m.reasoningContent(),signature:y}}}]};delete b.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(b)}
142
+ `;h.enqueue(g.encode(b));return}if(m.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",b=m.choices[0].delta.content,y={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete y.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(y)}
143
143
 
144
- `;h.enqueue(f.encode(k));let v={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:_}}]};delete v.choices[0].delta.reasoning_content;let x=`data: ${JSON.stringify(v)}
144
+ `;h.enqueue(g.encode(k));let v={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:b}}]};delete v.choices[0].delta.reasoning_content;let x=`data: ${JSON.stringify(v)}
145
145
 
146
- `;h.enqueue(f.encode(x));return}if(g.choices[0]?.delta?.reasoning_content&&delete g.choices[0].delta.reasoning_content,g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0){let y=`data: ${JSON.stringify(g)}
146
+ `;h.enqueue(g.encode(x));return}if(m.choices[0]?.delta?.reasoning_content&&delete m.choices[0].delta.reasoning_content,m.choices?.[0]?.delta&&Object.keys(m.choices[0].delta).length>0){let _=`data: ${JSON.stringify(m)}
147
147
 
148
- `;h.enqueue(f.encode(y))}}catch{h.enqueue(f.encode(d+`
149
- `))}else h.enqueue(f.encode(d+`
150
- `))};try{for(;;){let{done:d,value:m}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(m,{stream:!0});a+=h;let f=a.split(`
151
- `);a=f.pop()||"";for(let g of f)if(g.trim())try{p(g,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:y=>r+=y,isReasoningComplete:()=>s,setReasoningComplete:y=>s=y})}catch(y){console.error("Error processing line:",g,y),c.enqueue(o.encode(g+`
152
- `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var so,ha=w(()=>{"use strict";ne();so=class{name="tooluse";transformRequestIn(e){return e.messages.push({role:"system",content:"<system-reminder>Tool mode is active. The user expects you to proactively execute the most suitable tool to help complete the task. \nBefore invoking a tool, you must carefully evaluate whether it matches the current task. If no available tool is appropriate for the task, you MUST call the `ExitTool` to exit tool mode \u2014 this is the only valid way to terminate tool mode.\nAlways prioritize completing the user's task effectively and efficiently by using tools whenever appropriate.</system-reminder>"}),e.tools?.length&&(e.tool_choice="required",e.tools.push({type:"function",function:{name:"ExitTool",description:`Use this tool when you are in tool mode and have completed the task. This is the only valid way to exit tool mode.
148
+ `;h.enqueue(g.encode(_))}}catch{h.enqueue(g.encode(d+`
149
+ `))}else h.enqueue(g.encode(d+`
150
+ `))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
151
+ `);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
152
+ `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var so,ha=R(()=>{"use strict";ne();so=class{name="tooluse";transformRequestIn(e){return e.messages.push({role:"system",content:"<system-reminder>Tool mode is active. The user expects you to proactively execute the most suitable tool to help complete the task. \nBefore invoking a tool, you must carefully evaluate whether it matches the current task. If no available tool is appropriate for the task, you MUST call the `ExitTool` to exit tool mode \u2014 this is the only valid way to terminate tool mode.\nAlways prioritize completing the user's task effectively and efficiently by using tools whenever appropriate.</system-reminder>"}),e.tools?.length&&(e.tool_choice="required",e.tools.push({type:"function",function:{name:"ExitTool",description:`Use this tool when you are in tool mode and have completed the task. This is the only valid way to exit tool mode.
153
153
  IMPORTANT: Before using this tool, ensure that none of the available tools are applicable to the current task. You must evaluate all available options \u2014 only if no suitable tool can help you complete the task should you use ExitTool to terminate tool mode.
154
154
  Examples:
155
155
  1. Task: "Use a tool to summarize this document" \u2014 Do not use ExitTool if a summarization tool is available.
156
- 2. Task: "What\u2019s the weather today?" \u2014 If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`,parameters:{type:"object",properties:{response:{type:"string",description:"Your response will be forwarded to the user exactly as returned \u2014 the tool will not modify or post-process it in any way."}},required:["response"]}}})),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);if(t?.choices?.[0]?.message.tool_calls?.length&&t?.choices?.[0]?.message.tool_calls[0]?.function?.name==="ExitTool"){let o=t?.choices[0]?.message.tool_calls[0],r=JSON.parse(o.function.arguments||"{}");t.choices[0].message.content=r.response||"",delete t.choices[0].message.tool_calls}return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=-1,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,m,h)=>{let f=d.split(`
157
- `);for(let g of f)g.trim()&&m.enqueue(h.encode(g+`
158
- `))},p=(d,m)=>{let{controller:h,encoder:f,exitToolIndex:g,setExitToolIndex:y,appendExitToolResponse:_}=m;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let b=JSON.parse(d.slice(6));if(b.choices[0]?.delta?.tool_calls?.length){let k=b.choices[0].delta.tool_calls[0];if(k.function?.name==="ExitTool"){y(k.index);return}else if(g()>-1&&k.index===g()&&k.function.arguments){_(k.function.arguments);try{let v=JSON.parse(m.exitToolResponse());b.choices=[{delta:{role:"assistant",content:v.response||""}}];let x=`data: ${JSON.stringify(b)}
159
-
160
- `;h.enqueue(f.encode(x))}catch{}return}}if(b.choices?.[0]?.delta&&Object.keys(b.choices[0].delta).length>0){let k=`data: ${JSON.stringify(b)}
161
-
162
- `;h.enqueue(f.encode(k))}}catch{h.enqueue(f.encode(d+`
163
- `))}else h.enqueue(f.encode(d+`
164
- `))};try{for(;;){let{done:d,value:m}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(m,{stream:!0});a+=h;let f=a.split(`
165
- `);a=f.pop()||"";for(let g of f)if(g.trim())try{p(g,{controller:c,encoder:o,exitToolIndex:()=>r,setExitToolIndex:y=>r=y,exitToolResponse:()=>s,appendExitToolResponse:y=>s+=y})}catch(y){console.error("Error processing line:",g,y),c.enqueue(o.encode(g+`
166
- `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var ya,io,ba=w(()=>{"use strict";ne();ya=require("uuid"),io=class{constructor(e){this.options=e}static TransformerName="openrouter";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,f,g)=>{let y=h.split(`
167
- `);for(let _ of y)_.trim()&&f.enqueue(g.encode(_+`
168
- `))},m=(h,f)=>{let{controller:g,encoder:y}=f;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let _=h.slice(6);try{let b=JSON.parse(_);if(b.usage&&(this.logger?.debug({usage:b.usage,hasToolCall:i},"usage"),b.choices[0].finish_reason=i?"tool_calls":"stop"),b.choices?.[0]?.finish_reason==="error"){g.enqueue(y.encode(`data: ${JSON.stringify({error:b.choices?.[0].error})}
169
-
170
- `));return}b.choices?.[0]?.delta?.content&&!f.hasTextContent()&&f.setHasTextContent(!0);let k=b.choices?.[0]?.delta?.reasoning||b.choices?.[0]?.delta?.reasoning_content;if(k){f.appendReasoningContent(k);let S={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,thinking:{content:k}}}]};S.choices?.[0]?.delta&&(delete S.choices[0].delta.reasoning,delete S.choices[0].delta.reasoning_content);let P=`data: ${JSON.stringify(S)}
171
-
172
- `;g.enqueue(y.encode(P));return}if(b.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let S="ccr_think_signature",P=b.choices[0].delta.content,O={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:S}}}]};O.choices?.[0]?.delta&&delete O.choices[0].delta.reasoning;let I=`data: ${JSON.stringify(O)}
173
-
174
- `;g.enqueue(y.encode(I));let C={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:P}}]};C.choices?.[0]?.delta&&(delete C.choices[0].delta.reasoning,delete C.choices[0].delta.reasoning_content);let A=`data: ${JSON.stringify(C)}
175
-
176
- `;g.enqueue(y.encode(A));return}b.choices?.[0]?.delta?.reasoning&&delete b.choices[0].delta.reasoning,b.choices?.[0]?.delta?.reasoning_content&&delete b.choices[0].delta.reasoning_content,b.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(b.choices?.[0]?.delta?.tool_calls[0].id,10))&&b.choices?.[0]?.delta?.tool_calls.forEach(S=>{S.id=`call_${(0,ya.v4)()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let v=b.choices?.[0]?.delta,x=v&&Object.keys(v).length>0,T=b.choices?.[0]?.finish_reason,R=b.usage;if(x||T||R){let S=`data: ${JSON.stringify(b)}
177
-
178
- `;g.enqueue(y.encode(S))}}catch{g.enqueue(y.encode(h+`
179
- `))}}else g.enqueue(y.encode(h+`
180
- `))};try{for(;;){let{done:h,value:f}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!f||f.length===0)continue;let g;try{g=t.decode(f,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(g.length===0)continue;if(c+=g,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=c.split(`
181
- `);c=_.pop()||"";for(let b of _)if(b.trim())try{m(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",b,k),u.enqueue(o.encode(b+`
182
- `))}continue}let y=c.split(`
183
- `);c=y.pop()||"";for(let _ of y)if(_.trim())try{m(_,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),u.enqueue(o.encode(_+`
184
- `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var ao,_a=w(()=>{"use strict";ao=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens}static TransformerName="maxtoken";max_tokens;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),e}}});var ka,co,Ta=w(()=>{"use strict";ne();ka=require("uuid"),co=class{name="groq";async transformRequestIn(e){return e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),Array.isArray(e.tools)&&e.tools.forEach(t=>{delete t.function.parameters.$schema}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i="",c=new ReadableStream({async start(l){let u=e.body.getReader(),p=(m,h,f)=>{let g=m.split(`
185
- `);for(let y of g)y.trim()&&h.enqueue(f.encode(y+`
186
- `))},d=(m,h)=>{let{controller:f,encoder:g}=h;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]"){let y=m.slice(6);try{let _=JSON.parse(y);if(_.error)throw new Error(JSON.stringify(_));_.choices?.[0]?.delta?.content&&!h.hasTextContent()&&h.setHasTextContent(!0),_.choices?.[0]?.delta?.tool_calls?.length&&_.choices?.[0]?.delta?.tool_calls.forEach(k=>{k.id=`call_${(0,ka.v4)()}`}),_.choices?.[0]?.delta?.tool_calls?.length&&h.hasTextContent()&&(typeof _.choices[0].index=="number"?_.choices[0].index+=1:_.choices[0].index=1);let b=`data: ${JSON.stringify(_)}
187
-
188
- `;f.enqueue(g.encode(b))}catch{f.enqueue(g.encode(m+`
189
- `))}}else f.enqueue(g.encode(m+`
190
- `))};try{for(;;){let{done:m,value:h}=await u.read();if(m){i.trim()&&p(i,l,o);break}if(!h||h.length===0)continue;let f;try{f=t.decode(h,{stream:!0})}catch(y){console.warn("Failed to decode chunk",y);continue}if(f.length===0)continue;if(i+=f,i.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let y=i.split(`
191
- `);i=y.pop()||"";for(let _ of y)if(_.trim())try{d(_,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),l.enqueue(o.encode(_+`
192
- `))}continue}let g=i.split(`
193
- `);i=g.pop()||"";for(let y of g)if(y.trim())try{d(y,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:_=>r=_,reasoningContent:()=>s,appendReasoningContent:_=>s+=_,isReasoningComplete:()=>a,setReasoningComplete:_=>a=_})}catch(_){console.error("Error processing line:",y,_),l.enqueue(o.encode(y+`
194
- `))}}}catch(m){console.error("Stream error:",m),l.error(m)}finally{try{u.releaseLock()}catch(m){console.error("Error releasing reader lock:",m)}l.close()}}});return new Response(c,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var lo,va=w(()=>{"use strict";lo=class{name="cleancache";async transformRequestIn(e){return Array.isArray(e.messages)&&e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),e}}});function Dr(n,e){if(!n||n.trim()===""||n==="{}")return"{}";try{return JSON.parse(n),e?.debug("\u5DE5\u5177\u8C03\u7528\u53C2\u6570\u6807\u51C6JSON\u89E3\u6790\u6210\u529F / Tool arguments standard JSON parsing successful"),n}catch(t){try{let o=xa.default.parse(n);return e?.debug("Tool arguments JSON5 parsing successful"),JSON.stringify(o)}catch(o){try{let r=(0,Sa.jsonrepair)(n);return e?.debug("Tool arguments safely repaired"),r}catch(r){return e?.error(`JSON parsing failed: ${t.message}. JSON5 parsing failed: ${o.message}. JSON repair failed: ${r.message}. Input data: ${JSON.stringify(n)}`),e?.debug("Returning safe empty object as fallback"),"{}"}}}}var xa,Sa,Ca=w(()=>{xa=q(require("json5")),Sa=require("jsonrepair")});var uo,Ra=w(()=>{"use strict";Ca();ne();uo=class{name="enhancetool";async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);if(t?.choices?.[0]?.message?.tool_calls?.length)for(let o of t.choices[0].message.tool_calls)o.function?.arguments&&(o.function.arguments=Dr(o.function.arguments,this.logger));return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r={},s=!1,a="",i=!1,c=!1,l="",u=new ReadableStream({async start(p){let d=e.body.getReader(),m=(g,y,_)=>{let b=g.split(`
195
- `);for(let k of b)k.trim()&&y.enqueue(_.encode(k+`
196
- `))},h=(g,y,_)=>{let b="";try{b=Dr(r.arguments||"",this.logger)}catch(T){console.error(`${T.message} ${T.stack} \u5DE5\u5177\u8C03\u7528\u53C2\u6570\u89E3\u6790\u5931\u8D25: ${JSON.stringify(r)}`),b=r.arguments||""}let k={role:"assistant",tool_calls:[{function:{name:r.name,arguments:b},id:r.id,index:r.index,type:"function"}]},v={...g,choices:[{...g.choices[0],delta:k}]};v.choices[0].delta.content!==void 0&&delete v.choices[0].delta.content;let x=`data: ${JSON.stringify(v)}
197
-
198
- `;y.enqueue(_.encode(x))},f=(g,y)=>{let{controller:_,encoder:b}=y;if(g.startsWith("data: ")&&g.trim()!=="data: [DONE]"){let k=g.slice(6);try{let v=JSON.parse(k);if(v.choices?.[0]?.delta?.tool_calls?.length){let T=v.choices[0].delta.tool_calls[0];if(typeof r.index>"u"){r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""},T.function?.arguments&&(T.function.arguments="");let R=`data: ${JSON.stringify(v)}
199
-
200
- `;_.enqueue(b.encode(R));return}else if(r.index===T.index){T.function?.arguments&&(r.arguments+=T.function.arguments);return}else{h(v,_,b),r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""};return}}if(v.choices?.[0]?.finish_reason==="tool_calls"&&r.index!==void 0){h(v,_,b),r={};return}v.choices?.[0]?.delta?.tool_calls?.length&&y.hasTextContent()&&(typeof v.choices[0].index=="number"?v.choices[0].index+=1:v.choices[0].index=1);let x=`data: ${JSON.stringify(v)}
201
-
202
- `;_.enqueue(b.encode(x))}catch{_.enqueue(b.encode(g+`
203
- `))}}else _.enqueue(b.encode(g+`
204
- `))};try{for(;;){let{done:g,value:y}=await d.read();if(g){l.trim()&&m(l,p,o);break}if(!y||y.length===0)continue;let _;try{_=t.decode(y,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(_.length===0)continue;if(l+=_,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
205
- `);l=k.pop()||"";for(let v of k)if(v.trim())try{f(v,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:x=>s=x,reasoningContent:()=>a,appendReasoningContent:x=>a+=x,isReasoningComplete:()=>i,setReasoningComplete:x=>i=x})}catch(x){console.error("Error processing line:",v,x),p.enqueue(o.encode(v+`
206
- `))}continue}let b=l.split(`
207
- `);l=b.pop()||"";for(let k of b)if(k.trim())try{f(k,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:v=>s=v,reasoningContent:()=>a,appendReasoningContent:v=>a+=v,isReasoningComplete:()=>i,setReasoningComplete:v=>i=v})}catch(v){console.error("Error processing line:",k,v),p.enqueue(o.encode(k+`
208
- `))}}}catch(g){console.error("Stream error:",g),p.error(g)}finally{try{d.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}p.close()}}});return new Response(u,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var po,wa=w(()=>{"use strict";ne();mt();po=class{constructor(e){this.options=e;this.enable=this.options?.enable??!0}static TransformerName="reasoning";enable;async transformRequestIn(e){return this.enable?(e.reasoning&&(e.thinking={type:"enabled",budget_tokens:e.reasoning.max_tokens??Yn(e.reasoning.effort||"medium")},e.enable_thinking=!0),e):(e.thinking={type:"disabled",budget_tokens:-1},e.enable_thinking=!1,e)}async transformResponseOut(e){if(!this.enable)return e;if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return t.choices[0]?.message.reasoning_content&&(t.thinking={content:t.choices[0]?.message.reasoning_content}),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,m,h)=>{let f=d.split(`
209
- `);for(let g of f)g.trim()&&m.enqueue(h.encode(g+`
210
- `))},p=(d,m)=>{let{controller:h,encoder:f}=m;if(this.logger?.debug({line:d},"Processing reason line"),d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let g=JSON.parse(d.slice(6));if(console.log(JSON.stringify(g)),g.choices?.[0]?.delta?.reasoning_content){m.appendReasoningContent(g.choices[0].delta.reasoning_content);let y={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete y.choices[0].delta.reasoning_content;let _=`data: ${JSON.stringify(y)}
211
-
212
- `;h.enqueue(f.encode(_));return}if(g.choices?.[0]?.delta?.content&&m.reasoningContent()&&!m.isReasoningComplete()){m.setReasoningComplete(!0);let y="ccr_think_signature",_=g.choices[0].delta.content,b={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:null,thinking:{content:m.reasoningContent(),signature:y}}}]};delete b.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(b)}
213
-
214
- `;h.enqueue(f.encode(k))}if(g.choices?.[0]?.delta?.reasoning_content&&delete g.choices[0].delta.reasoning_content,g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0){m.isReasoningComplete()&&g.choices[0].index++;let y=`data: ${JSON.stringify(g)}
215
-
216
- `;h.enqueue(f.encode(y))}}catch{h.enqueue(f.encode(d+`
217
- `))}else h.enqueue(f.encode(d+`
218
- `))};try{for(;;){let{done:d,value:m}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(m,{stream:!0});a+=h;let f=a.split(`
219
- `);a=f.pop()||"";for(let g of f)if(g.trim())try{p(g,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:y=>r+=y,isReasoningComplete:()=>s,setReasoningComplete:y=>s=y})}catch(y){console.error("Error processing line:",g,y),c.enqueue(o.encode(g+`
220
- `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var fo,Pa=w(()=>{"use strict";fo=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens,this.temperature=this.options?.temperature,this.top_p=this.options?.top_p,this.top_k=this.options?.top_k,this.repetition_penalty=this.options?.repetition_penalty}static TransformerName="sampling";max_tokens;temperature;top_p;top_k;repetition_penalty;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),typeof this.temperature<"u"&&(e.temperature=this.temperature),typeof this.top_p<"u"&&(e.top_p=this.top_p),typeof this.top_k<"u"&&(e.top_k=this.top_k),typeof this.repetition_penalty<"u"&&(e.repetition_penalty=this.repetition_penalty),e}}});var mo,Ea=w(()=>{"use strict";mo=class{static TransformerName="maxcompletiontokens";async transformRequestIn(e){return e.max_tokens&&(e.max_completion_tokens=e.max_tokens,delete e.max_tokens),e}}});function Aa(n){let e=[];for(let o=0;o<n.messages.length;o++){let r=n.messages[o],s=o===n.messages.length-1,a=r.role==="assistant",i=[];typeof r.content=="string"?i.push({type:"text",text:r.content}):Array.isArray(r.content)&&r.content.forEach(c=>{c.type==="text"?i.push({type:"text",text:c.text||""}):c.type==="image_url"&&i.push({type:"image",source:{type:"base64",media_type:c.media_type||"image/jpeg",data:c.image_url.url}})}),!(!s&&i.length===0&&!r.tool_calls&&!r.content)&&(s&&a&&i.length===0&&r.tool_calls&&i.push({type:"text",text:""}),e.push({role:r.role==="assistant"?"assistant":"user",content:i}))}let t={anthropic_version:"vertex-2023-10-16",messages:e,max_tokens:n.max_tokens||1e3,stream:n.stream||!1,...n.temperature&&{temperature:n.temperature}};return n.tools&&n.tools.length>0&&(t.tools=n.tools.map(o=>({name:o.function.name,description:o.function.description,input_schema:o.function.parameters}))),n.tool_choice&&(n.tool_choice==="auto"||n.tool_choice==="none"?t.tool_choice=n.tool_choice:typeof n.tool_choice=="string"&&(t.tool_choice={type:"tool",name:n.tool_choice})),t}function Oa(n){let e=n,o={messages:e.messages.map(r=>{let s=r.content.map(a=>a.type==="text"?{type:"text",text:a.text||""}:a.type==="image"&&a.source?{type:"image_url",image_url:{url:a.source.data},media_type:a.source.media_type}:{type:"text",text:""});return{role:r.role,content:s}}),model:n.model||"claude-sonnet-4@20250514",max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream};return e.tools&&e.tools.length>0&&(o.tools=e.tools.map(r=>({type:"function",function:{name:r.name,description:r.description,parameters:{type:"object",properties:r.input_schema.properties,required:r.input_schema.required,additionalProperties:r.input_schema.additionalProperties,$schema:r.input_schema.$schema}}}))),e.tool_choice&&(typeof e.tool_choice=="string"?o.tool_choice=e.tool_choice:e.tool_choice.type==="tool"&&(o.tool_choice=e.tool_choice.name)),o}async function Ia(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json(),r;o.tool_use&&o.tool_use.length>0&&(r=o.tool_use.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}})));let s={id:o.id,choices:[{finish_reason:o.stop_reason||null,index:0,message:{content:o.content[0]?.text||"",role:"assistant",...r&&{tool_calls:r}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.model,object:"chat.completion",usage:{completion_tokens:o.usage.output_tokens,prompt_tokens:o.usage.input_tokens,total_tokens:o.usage.input_tokens+o.usage.output_tokens}};return new Response(JSON.stringify(s),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=(i,c)=>{if(i.startsWith("data: ")){let l=i.slice(6).trim();if(l){t?.debug({chunkStr:l},`${e} chunk:`);try{let u=JSON.parse(l);if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"){let p={choices:[{delta:{role:"assistant",content:u.delta.text||""},finish_reason:null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
156
+ 2. Task: "What\u2019s the weather today?" \u2014 If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`,parameters:{type:"object",properties:{response:{type:"string",description:"Your response will be forwarded to the user exactly as returned \u2014 the tool will not modify or post-process it in any way."}},required:["response"]}}})),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);if(t?.choices?.[0]?.message.tool_calls?.length&&t?.choices?.[0]?.message.tool_calls[0]?.function?.name==="ExitTool"){let o=t?.choices[0]?.message.tool_calls[0],r=JSON.parse(o.function.arguments||"{}");t.choices[0].message.content=r.response||"",delete t.choices[0].message.tool_calls}return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=-1,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
157
+ `);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
158
+ `))},p=(d,f)=>{let{controller:h,encoder:g,exitToolIndex:m,setExitToolIndex:_,appendExitToolResponse:b}=f;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let y=JSON.parse(d.slice(6));if(y.choices[0]?.delta?.tool_calls?.length){let k=y.choices[0].delta.tool_calls[0];if(k.function?.name==="ExitTool"){_(k.index);return}else if(m()>-1&&k.index===m()&&k.function.arguments){b(k.function.arguments);try{let v=JSON.parse(f.exitToolResponse());y.choices=[{delta:{role:"assistant",content:v.response||""}}];let x=`data: ${JSON.stringify(y)}
159
+
160
+ `;h.enqueue(g.encode(x))}catch{}return}}if(y.choices?.[0]?.delta&&Object.keys(y.choices[0].delta).length>0){let k=`data: ${JSON.stringify(y)}
161
+
162
+ `;h.enqueue(g.encode(k))}}catch{h.enqueue(g.encode(d+`
163
+ `))}else h.enqueue(g.encode(d+`
164
+ `))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
165
+ `);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,exitToolIndex:()=>r,setExitToolIndex:_=>r=_,exitToolResponse:()=>s,appendExitToolResponse:_=>s+=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
166
+ `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var ya,io,_a=R(()=>{"use strict";ne();ya=require("uuid"),io=class{constructor(e){this.options=e}static TransformerName="openrouter";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
167
+ `);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
168
+ `))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let b=h.slice(6);try{let y=JSON.parse(b);if(y.usage&&(this.logger?.debug({usage:y.usage,hasToolCall:i},"usage"),y.choices[0].finish_reason=i?"tool_calls":"stop"),y.choices?.[0]?.finish_reason==="error"){m.enqueue(_.encode(`data: ${JSON.stringify({error:y.choices?.[0].error})}
169
+
170
+ `));return}y.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0);let k=y.choices?.[0]?.delta?.reasoning||y.choices?.[0]?.delta?.reasoning_content;if(k){g.appendReasoningContent(k);let S={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,thinking:{content:k}}}]};S.choices?.[0]?.delta&&(delete S.choices[0].delta.reasoning,delete S.choices[0].delta.reasoning_content);let P=`data: ${JSON.stringify(S)}
171
+
172
+ `;m.enqueue(_.encode(P));return}if(y.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let S="ccr_think_signature",P=y.choices[0].delta.content,M={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:S}}}]};M.choices?.[0]?.delta&&delete M.choices[0].delta.reasoning;let I=`data: ${JSON.stringify(M)}
173
+
174
+ `;m.enqueue(_.encode(I));let A={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:P}}]};A.choices?.[0]?.delta&&(delete A.choices[0].delta.reasoning,delete A.choices[0].delta.reasoning_content);let w=`data: ${JSON.stringify(A)}
175
+
176
+ `;m.enqueue(_.encode(w));return}y.choices?.[0]?.delta?.reasoning&&delete y.choices[0].delta.reasoning,y.choices?.[0]?.delta?.reasoning_content&&delete y.choices[0].delta.reasoning_content,y.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(y.choices?.[0]?.delta?.tool_calls[0].id,10))&&y.choices?.[0]?.delta?.tool_calls.forEach(S=>{S.id=`call_${(0,ya.v4)()}`}),y.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let v=y.choices?.[0]?.delta,x=v&&Object.keys(v).length>0,T=y.choices?.[0]?.finish_reason,C=y.usage;if(x||T||C){let S=`data: ${JSON.stringify(y)}
177
+
178
+ `;m.enqueue(_.encode(S))}}catch{m.enqueue(_.encode(h+`
179
+ `))}}else m.enqueue(_.encode(h+`
180
+ `))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
181
+ `);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
182
+ `))}continue}let _=c.split(`
183
+ `);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
184
+ `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var ao,ba=R(()=>{"use strict";ao=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens}static TransformerName="maxtoken";max_tokens;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),e}}});var ka,co,Ta=R(()=>{"use strict";ne();ka=require("uuid"),co=class{name="groq";async transformRequestIn(e){return e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),Array.isArray(e.tools)&&e.tools.forEach(t=>{delete t.function.parameters.$schema}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i="",c=new ReadableStream({async start(l){let u=e.body.getReader(),p=(f,h,g)=>{let m=f.split(`
185
+ `);for(let _ of m)_.trim()&&h.enqueue(g.encode(_+`
186
+ `))},d=(f,h)=>{let{controller:g,encoder:m}=h;if(f.startsWith("data: ")&&f.trim()!=="data: [DONE]"){let _=f.slice(6);try{let b=JSON.parse(_);if(b.error)throw new Error(JSON.stringify(b));b.choices?.[0]?.delta?.content&&!h.hasTextContent()&&h.setHasTextContent(!0),b.choices?.[0]?.delta?.tool_calls?.length&&b.choices?.[0]?.delta?.tool_calls.forEach(k=>{k.id=`call_${(0,ka.v4)()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&h.hasTextContent()&&(typeof b.choices[0].index=="number"?b.choices[0].index+=1:b.choices[0].index=1);let y=`data: ${JSON.stringify(b)}
187
+
188
+ `;g.enqueue(m.encode(y))}catch{g.enqueue(m.encode(f+`
189
+ `))}}else g.enqueue(m.encode(f+`
190
+ `))};try{for(;;){let{done:f,value:h}=await u.read();if(f){i.trim()&&p(i,l,o);break}if(!h||h.length===0)continue;let g;try{g=t.decode(h,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(g.length===0)continue;if(i+=g,i.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=i.split(`
191
+ `);i=_.pop()||"";for(let b of _)if(b.trim())try{d(b,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),l.enqueue(o.encode(b+`
192
+ `))}continue}let m=i.split(`
193
+ `);i=m.pop()||"";for(let _ of m)if(_.trim())try{d(_,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),l.enqueue(o.encode(_+`
194
+ `))}}}catch(f){console.error("Stream error:",f),l.error(f)}finally{try{u.releaseLock()}catch(f){console.error("Error releasing reader lock:",f)}l.close()}}});return new Response(c,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var lo,va=R(()=>{"use strict";lo=class{name="cleancache";async transformRequestIn(e){return Array.isArray(e.messages)&&e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),e}}});function Dr(n,e){if(!n||n.trim()===""||n==="{}")return"{}";try{return JSON.parse(n),e?.debug("\u5DE5\u5177\u8C03\u7528\u53C2\u6570\u6807\u51C6JSON\u89E3\u6790\u6210\u529F / Tool arguments standard JSON parsing successful"),n}catch(t){try{let o=xa.default.parse(n);return e?.debug("Tool arguments JSON5 parsing successful"),JSON.stringify(o)}catch(o){try{let r=(0,Sa.jsonrepair)(n);return e?.debug("Tool arguments safely repaired"),r}catch(r){return e?.error(`JSON parsing failed: ${t.message}. JSON5 parsing failed: ${o.message}. JSON repair failed: ${r.message}. Input data: ${JSON.stringify(n)}`),e?.debug("Returning safe empty object as fallback"),"{}"}}}}var xa,Sa,Ca=R(()=>{xa=q(require("json5")),Sa=require("jsonrepair")});var uo,Ra=R(()=>{"use strict";Ca();ne();uo=class{name="enhancetool";async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);if(t?.choices?.[0]?.message?.tool_calls?.length)for(let o of t.choices[0].message.tool_calls)o.function?.arguments&&(o.function.arguments=Dr(o.function.arguments,this.logger));return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r={},s=!1,a="",i=!1,c=!1,l="",u=new ReadableStream({async start(p){let d=e.body.getReader(),f=(m,_,b)=>{let y=m.split(`
195
+ `);for(let k of y)k.trim()&&_.enqueue(b.encode(k+`
196
+ `))},h=(m,_,b)=>{let y="";try{y=Dr(r.arguments||"",this.logger)}catch(T){console.error(`${T.message} ${T.stack} \u5DE5\u5177\u8C03\u7528\u53C2\u6570\u89E3\u6790\u5931\u8D25: ${JSON.stringify(r)}`),y=r.arguments||""}let k={role:"assistant",tool_calls:[{function:{name:r.name,arguments:y},id:r.id,index:r.index,type:"function"}]},v={...m,choices:[{...m.choices[0],delta:k}]};v.choices[0].delta.content!==void 0&&delete v.choices[0].delta.content;let x=`data: ${JSON.stringify(v)}
197
+
198
+ `;_.enqueue(b.encode(x))},g=(m,_)=>{let{controller:b,encoder:y}=_;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]"){let k=m.slice(6);try{let v=JSON.parse(k);if(v.choices?.[0]?.delta?.tool_calls?.length){let T=v.choices[0].delta.tool_calls[0];if(typeof r.index>"u"){r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""},T.function?.arguments&&(T.function.arguments="");let C=`data: ${JSON.stringify(v)}
199
+
200
+ `;b.enqueue(y.encode(C));return}else if(r.index===T.index){T.function?.arguments&&(r.arguments+=T.function.arguments);return}else{h(v,b,y),r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""};return}}if(v.choices?.[0]?.finish_reason==="tool_calls"&&r.index!==void 0){h(v,b,y),r={};return}v.choices?.[0]?.delta?.tool_calls?.length&&_.hasTextContent()&&(typeof v.choices[0].index=="number"?v.choices[0].index+=1:v.choices[0].index=1);let x=`data: ${JSON.stringify(v)}
201
+
202
+ `;b.enqueue(y.encode(x))}catch{b.enqueue(y.encode(m+`
203
+ `))}}else b.enqueue(y.encode(m+`
204
+ `))};try{for(;;){let{done:m,value:_}=await d.read();if(m){l.trim()&&f(l,p,o);break}if(!_||_.length===0)continue;let b;try{b=t.decode(_,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(b.length===0)continue;if(l+=b,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
205
+ `);l=k.pop()||"";for(let v of k)if(v.trim())try{g(v,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:x=>s=x,reasoningContent:()=>a,appendReasoningContent:x=>a+=x,isReasoningComplete:()=>i,setReasoningComplete:x=>i=x})}catch(x){console.error("Error processing line:",v,x),p.enqueue(o.encode(v+`
206
+ `))}continue}let y=l.split(`
207
+ `);l=y.pop()||"";for(let k of y)if(k.trim())try{g(k,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:v=>s=v,reasoningContent:()=>a,appendReasoningContent:v=>a+=v,isReasoningComplete:()=>i,setReasoningComplete:v=>i=v})}catch(v){console.error("Error processing line:",k,v),p.enqueue(o.encode(k+`
208
+ `))}}}catch(m){console.error("Stream error:",m),p.error(m)}finally{try{d.releaseLock()}catch(m){console.error("Error releasing reader lock:",m)}p.close()}}});return new Response(u,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var po,wa=R(()=>{"use strict";ne();gt();po=class{constructor(e){this.options=e;this.enable=this.options?.enable??!0}static TransformerName="reasoning";enable;async transformRequestIn(e){return this.enable?(e.reasoning&&(e.thinking={type:"enabled",budget_tokens:e.reasoning.max_tokens??Yn(e.reasoning.effort||"medium")},e.enable_thinking=!0),e):(e.thinking={type:"disabled",budget_tokens:-1},e.enable_thinking=!1,e)}async transformResponseOut(e){if(!this.enable)return e;if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return t.choices[0]?.message.reasoning_content&&(t.thinking={content:t.choices[0]?.message.reasoning_content}),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
209
+ `);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
210
+ `))},p=(d,f)=>{let{controller:h,encoder:g}=f;if(this.logger?.debug({line:d},"Processing reason line"),d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let m=JSON.parse(d.slice(6));if(console.log(JSON.stringify(m)),m.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(m.choices[0].delta.reasoning_content);let _={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,thinking:{content:m.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(_)}
211
+
212
+ `;h.enqueue(g.encode(b));return}if(m.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",b=m.choices[0].delta.content,y={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete y.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(y)}
213
+
214
+ `;h.enqueue(g.encode(k))}if(m.choices?.[0]?.delta?.reasoning_content&&delete m.choices[0].delta.reasoning_content,m.choices?.[0]?.delta&&Object.keys(m.choices[0].delta).length>0){f.isReasoningComplete()&&m.choices[0].index++;let _=`data: ${JSON.stringify(m)}
215
+
216
+ `;h.enqueue(g.encode(_))}}catch{h.enqueue(g.encode(d+`
217
+ `))}else h.enqueue(g.encode(d+`
218
+ `))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
219
+ `);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
220
+ `))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var fo,Pa=R(()=>{"use strict";fo=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens,this.temperature=this.options?.temperature,this.top_p=this.options?.top_p,this.top_k=this.options?.top_k,this.repetition_penalty=this.options?.repetition_penalty}static TransformerName="sampling";max_tokens;temperature;top_p;top_k;repetition_penalty;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),typeof this.temperature<"u"&&(e.temperature=this.temperature),typeof this.top_p<"u"&&(e.top_p=this.top_p),typeof this.top_k<"u"&&(e.top_k=this.top_k),typeof this.repetition_penalty<"u"&&(e.repetition_penalty=this.repetition_penalty),e}}});var mo,Ea=R(()=>{"use strict";mo=class{static TransformerName="maxcompletiontokens";async transformRequestIn(e){return e.max_tokens&&(e.max_completion_tokens=e.max_tokens,delete e.max_tokens),e}}});function Aa(n){let e=[];for(let o=0;o<n.messages.length;o++){let r=n.messages[o],s=o===n.messages.length-1,a=r.role==="assistant",i=[];typeof r.content=="string"?i.push({type:"text",text:r.content}):Array.isArray(r.content)&&r.content.forEach(c=>{c.type==="text"?i.push({type:"text",text:c.text||""}):c.type==="image_url"&&i.push({type:"image",source:{type:"base64",media_type:c.media_type||"image/jpeg",data:c.image_url.url}})}),!(!s&&i.length===0&&!r.tool_calls&&!r.content)&&(s&&a&&i.length===0&&r.tool_calls&&i.push({type:"text",text:""}),e.push({role:r.role==="assistant"?"assistant":"user",content:i}))}let t={anthropic_version:"vertex-2023-10-16",messages:e,max_tokens:n.max_tokens||1e3,stream:n.stream||!1,...n.temperature&&{temperature:n.temperature}};return n.tools&&n.tools.length>0&&(t.tools=n.tools.map(o=>({name:o.function.name,description:o.function.description,input_schema:o.function.parameters}))),n.tool_choice&&(n.tool_choice==="auto"||n.tool_choice==="none"?t.tool_choice=n.tool_choice:typeof n.tool_choice=="string"&&(t.tool_choice={type:"tool",name:n.tool_choice})),t}function Oa(n){let e=n,o={messages:e.messages.map(r=>{let s=r.content.map(a=>a.type==="text"?{type:"text",text:a.text||""}:a.type==="image"&&a.source?{type:"image_url",image_url:{url:a.source.data},media_type:a.source.media_type}:{type:"text",text:""});return{role:r.role,content:s}}),model:n.model||"claude-sonnet-4@20250514",max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream};return e.tools&&e.tools.length>0&&(o.tools=e.tools.map(r=>({type:"function",function:{name:r.name,description:r.description,parameters:{type:"object",properties:r.input_schema.properties,required:r.input_schema.required,additionalProperties:r.input_schema.additionalProperties,$schema:r.input_schema.$schema}}}))),e.tool_choice&&(typeof e.tool_choice=="string"?o.tool_choice=e.tool_choice:e.tool_choice.type==="tool"&&(o.tool_choice=e.tool_choice.name)),o}async function Ia(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json(),r;o.tool_use&&o.tool_use.length>0&&(r=o.tool_use.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}})));let s={id:o.id,choices:[{finish_reason:o.stop_reason||null,index:0,message:{content:o.content[0]?.text||"",role:"assistant",...r&&{tool_calls:r}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.model,object:"chat.completion",usage:{completion_tokens:o.usage.output_tokens,prompt_tokens:o.usage.input_tokens,total_tokens:o.usage.input_tokens+o.usage.output_tokens}};return new Response(JSON.stringify(s),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=(i,c)=>{if(i.startsWith("data: ")){let l=i.slice(6).trim();if(l){t?.debug({chunkStr:l},`${e} chunk:`);try{let u=JSON.parse(l);if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"){let p={choices:[{delta:{role:"assistant",content:u.delta.text||""},finish_reason:null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
221
221
 
222
222
  `))}else if(u.type==="content_block_delta"&&u.delta?.type==="input_json_delta"){let p={choices:[{delta:{tool_calls:[{index:u.index||0,function:{arguments:u.delta.partial_json||""}}]},finish_reason:null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
223
223
 
@@ -230,94 +230,94 @@ Examples:
230
230
  `));else{let p={choices:[{delta:{role:"assistant",content:u.content?.[0]?.text||""},finish_reason:u.stop_reason?.toLowerCase()||null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
231
231
 
232
232
  `))}}catch(u){t?.error(`Error parsing ${e} stream chunk`,l,u.message)}}}},a=new ReadableStream({async start(i){let c=n.body.getReader(),l="";try{for(;;){let{done:u,value:p}=await c.read();if(u){l&&s(l,i);break}l+=o.decode(p,{stream:!0});let d=l.split(`
233
- `);l=d.pop()||"";for(let m of d)s(m,i)}}catch(u){i.error(u)}finally{i.close()}}});return new Response(a,{status:n.status,statusText:n.statusText,headers:n.headers})}return n}var Ma=w(()=>{"use strict"});async function ud(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
233
+ `);l=d.pop()||"";for(let f of d)s(f,i)}}catch(u){i.error(u)}finally{i.close()}}});return new Response(a,{status:n.status,statusText:n.statusText,headers:n.headers})}return n}var Ma=R(()=>{"use strict"});async function dd(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
234
234
  1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
235
235
  2. Run "gcloud auth application-default login"
236
- 3. Use Google Cloud environment with default service account`)}}var go,La=w(()=>{"use strict";Ma();go=class{name="vertex-claude";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-east5";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await ud();return{body:Aa(e),config:{url:new URL(`/v1/projects/${o}/locations/${r}/publishers/anthropic/models/${e.model}:${e.stream?"streamRawPredict":"rawPredict"}`,`https://${r}-aiplatform.googleapis.com`).toString(),headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}}}async transformRequestOut(e){return Oa(e)}async transformResponseOut(e){return Ia(e,this.name,this.logger)}}});var ho,Na=w(()=>{"use strict";ho=class{name="cerebras";async transformRequestIn(e,t){let o=JSON.parse(JSON.stringify(e));return o.reasoning?delete o.reasoning:o.disable_reasoning=!1,{body:o,config:{headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"}}}}async transformResponseOut(e){return e}}});var yo,$a=w(()=>{"use strict";yo=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var bo,Da=w(()=>{"use strict";bo=class{name="OpenAI";endPoint="/v1/chat/completions"}});var _o,Fa=w(()=>{"use strict";_o=class{static TransformerName="customparams";options;constructor(e={}){this.options=e}async transformRequestIn(e){let t={...e},o=Object.entries(this.options);for(let[r,s]of o)if(r in t)if(typeof t[r]=="object"&&typeof s=="object"&&!Array.isArray(t[r])&&!Array.isArray(s)&&t[r]!==null&&s!==null)t[r]=this.deepMergeObjects(t[r],s);else continue;else t[r]=this.cloneValue(s);return t}async transformResponseOut(e){return e}deepMergeObjects(e,t){let o={...e};for(let[r,s]of Object.entries(t))r in o&&typeof o[r]=="object"&&typeof s=="object"&&!Array.isArray(o[r])&&!Array.isArray(s)&&o[r]!==null&&s!==null?o[r]=this.deepMergeObjects(o[r],s):o[r]=this.cloneValue(s);return o}cloneValue(e){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>this.cloneValue(o));let t={};for(let[o,r]of Object.entries(e))t[o]=this.cloneValue(r);return t}}});var Ua,ko,ja=w(()=>{"use strict";ne();Ua=require("uuid"),ko=class{constructor(e){this.options=e}static TransformerName="vercel";endPoint="/v1/chat/completions";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,f,g)=>{let y=h.split(`
237
- `);for(let _ of y)_.trim()&&f.enqueue(g.encode(_+`
238
- `))},m=(h,f)=>{let{controller:g,encoder:y}=f;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let _=h.slice(6);try{let b=JSON.parse(_);if(b.usage&&(this.logger?.debug({usage:b.usage,hasToolCall:i},"usage"),b.choices[0].finish_reason=i?"tool_calls":"stop"),b.choices?.[0]?.finish_reason==="error"&&g.enqueue(y.encode(`data: ${JSON.stringify({error:b.choices?.[0].error})}
236
+ 3. Use Google Cloud environment with default service account`)}}var go,La=R(()=>{"use strict";Ma();go=class{name="vertex-claude";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-east5";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await dd();return{body:Aa(e),config:{url:new URL(`/v1/projects/${o}/locations/${r}/publishers/anthropic/models/${e.model}:${e.stream?"streamRawPredict":"rawPredict"}`,`https://${r}-aiplatform.googleapis.com`).toString(),headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}}}async transformRequestOut(e){return Oa(e)}async transformResponseOut(e){return Ia(e,this.name,this.logger)}}});var ho,Na=R(()=>{"use strict";ho=class{name="cerebras";async transformRequestIn(e,t){let o=JSON.parse(JSON.stringify(e));return o.reasoning?delete o.reasoning:o.disable_reasoning=!1,{body:o,config:{headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"}}}}async transformResponseOut(e){return e}}});var yo,$a=R(()=>{"use strict";yo=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var _o,Da=R(()=>{"use strict";_o=class{name="OpenAI";endPoint="/v1/chat/completions"}});var bo,Fa=R(()=>{"use strict";bo=class{static TransformerName="customparams";options;constructor(e={}){this.options=e}async transformRequestIn(e){let t={...e},o=Object.entries(this.options);for(let[r,s]of o)if(r in t)if(typeof t[r]=="object"&&typeof s=="object"&&!Array.isArray(t[r])&&!Array.isArray(s)&&t[r]!==null&&s!==null)t[r]=this.deepMergeObjects(t[r],s);else continue;else t[r]=this.cloneValue(s);return t}async transformResponseOut(e){return e}deepMergeObjects(e,t){let o={...e};for(let[r,s]of Object.entries(t))r in o&&typeof o[r]=="object"&&typeof s=="object"&&!Array.isArray(o[r])&&!Array.isArray(s)&&o[r]!==null&&s!==null?o[r]=this.deepMergeObjects(o[r],s):o[r]=this.cloneValue(s);return o}cloneValue(e){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>this.cloneValue(o));let t={};for(let[o,r]of Object.entries(e))t[o]=this.cloneValue(r);return t}}});var Ua,ko,ja=R(()=>{"use strict";ne();Ua=require("uuid"),ko=class{constructor(e){this.options=e}static TransformerName="vercel";endPoint="/v1/chat/completions";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
237
+ `);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
238
+ `))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let b=h.slice(6);try{let y=JSON.parse(b);if(y.usage&&(this.logger?.debug({usage:y.usage,hasToolCall:i},"usage"),y.choices[0].finish_reason=i?"tool_calls":"stop"),y.choices?.[0]?.finish_reason==="error"&&m.enqueue(_.encode(`data: ${JSON.stringify({error:y.choices?.[0].error})}
239
239
 
240
- `)),b.choices?.[0]?.delta?.content&&!f.hasTextContent()&&f.setHasTextContent(!0),b.choices?.[0]?.delta?.reasoning){f.appendReasoningContent(b.choices[0].delta.reasoning);let v={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,thinking:{content:b.choices[0].delta.reasoning}}}]};v.choices?.[0]?.delta&&delete v.choices[0].delta.reasoning;let x=`data: ${JSON.stringify(v)}
240
+ `)),y.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0),y.choices?.[0]?.delta?.reasoning){g.appendReasoningContent(y.choices[0].delta.reasoning);let v={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,thinking:{content:y.choices[0].delta.reasoning}}}]};v.choices?.[0]?.delta&&delete v.choices[0].delta.reasoning;let x=`data: ${JSON.stringify(v)}
241
241
 
242
- `;g.enqueue(y.encode(x));return}if(b.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let x={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:"ccr_think_signature"}}}]};x.choices?.[0]?.delta&&delete x.choices[0].delta.reasoning;let T=`data: ${JSON.stringify(x)}
242
+ `;m.enqueue(_.encode(x));return}if(y.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let x={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:"ccr_think_signature"}}}]};x.choices?.[0]?.delta&&delete x.choices[0].delta.reasoning;let T=`data: ${JSON.stringify(x)}
243
243
 
244
- `;g.enqueue(y.encode(T))}b.choices?.[0]?.delta?.reasoning&&delete b.choices[0].delta.reasoning,b.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(b.choices?.[0]?.delta?.tool_calls[0].id,10))&&b.choices?.[0]?.delta?.tool_calls.forEach(v=>{v.id=`call_${(0,Ua.v4)()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0),b.choices?.[0]?.delta?.tool_calls?.length&&f.hasTextContent()&&(typeof b.choices[0].index=="number"?b.choices[0].index+=1:b.choices[0].index=1);let k=`data: ${JSON.stringify(b)}
244
+ `;m.enqueue(_.encode(T))}y.choices?.[0]?.delta?.reasoning&&delete y.choices[0].delta.reasoning,y.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(y.choices?.[0]?.delta?.tool_calls[0].id,10))&&y.choices?.[0]?.delta?.tool_calls.forEach(v=>{v.id=`call_${(0,Ua.v4)()}`}),y.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0),y.choices?.[0]?.delta?.tool_calls?.length&&g.hasTextContent()&&(typeof y.choices[0].index=="number"?y.choices[0].index+=1:y.choices[0].index=1);let k=`data: ${JSON.stringify(y)}
245
245
 
246
- `;g.enqueue(y.encode(k))}catch{g.enqueue(y.encode(h+`
247
- `))}}else g.enqueue(y.encode(h+`
248
- `))};try{for(;;){let{done:h,value:f}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!f||f.length===0)continue;let g;try{g=t.decode(f,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(g.length===0)continue;if(c+=g,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=c.split(`
249
- `);c=_.pop()||"";for(let b of _)if(b.trim())try{m(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",b,k),u.enqueue(o.encode(b+`
250
- `))}continue}let y=c.split(`
251
- `);c=y.pop()||"";for(let _ of y)if(_.trim())try{m(_,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),u.enqueue(o.encode(_+`
252
- `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Fr,dd,To,Ha=w(()=>{"use strict";ne();Fr=`Always think before answering. Even if the problem seems simple, always write down your reasoning process explicitly.
246
+ `;m.enqueue(_.encode(k))}catch{m.enqueue(_.encode(h+`
247
+ `))}}else m.enqueue(_.encode(h+`
248
+ `))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
249
+ `);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
250
+ `))}continue}let _=c.split(`
251
+ `);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
252
+ `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Fr,pd,To,Ha=R(()=>{"use strict";ne();Fr=`Always think before answering. Even if the problem seems simple, always write down your reasoning process explicitly.
253
253
 
254
254
  Output format:
255
255
  <reasoning_content>
256
256
  Your detailed thinking process goes here
257
257
  </reasoning_content>
258
- Your final answer must follow after the closing tag above.`,dd=10,To=class{name="forcereasoning";async transformRequestIn(e){let t=0;e.messages.filter(r=>r.role==="assistant").reverse().forEach(r=>{r.thinking&&(r.thinking.content&&(!r.content||t<dd)&&(t++,r.content=`<reasoning_content>${r.thinking.content}</reasoning_content>
259
- ${r.content}`),delete r.thinking)});let o=e.messages[e.messages.length-1];return o.role==="user"&&(Array.isArray(o.content)?o.content.push({type:"text",text:Fr}):o.content=[{type:"text",text:Fr},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:Fr}]}),e}async transformResponseOut(e){let t="<reasoning_content>",o="</reasoning_content>";if(e.headers.get("Content-Type")?.includes("application/json")){let r=await U(e);if(r.choices[0]?.message.content){let s=/<reasoning_content>(.*?)<\/reasoning_content>/s,a=r.choices[0]?.message.content.match(s);a&&a[1]&&(r.thinking={content:a[1]})}return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let r=0,s=new TextDecoder,a=new TextEncoder,i=new ReadableStream({async start(c){let l=e.body.getReader(),u="",p="SEARCHING",d="",m="",h=(f,g)=>{if(typeof g!="string"){f.choices?.[0]?.delta&&Object.keys(f.choices[0].delta).length>0&&!f.choices[0].delta.content&&(f.choices[0].index=r,c.enqueue(a.encode(`data: ${JSON.stringify(f)}
258
+ Your final answer must follow after the closing tag above.`,pd=10,To=class{name="forcereasoning";async transformRequestIn(e){let t=0;e.messages.filter(r=>r.role==="assistant").reverse().forEach(r=>{r.thinking&&(r.thinking.content&&(!r.content||t<pd)&&(t++,r.content=`<reasoning_content>${r.thinking.content}</reasoning_content>
259
+ ${r.content}`),delete r.thinking)});let o=e.messages[e.messages.length-1];return o.role==="user"&&(Array.isArray(o.content)?o.content.push({type:"text",text:Fr}):o.content=[{type:"text",text:Fr},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:Fr}]}),e}async transformResponseOut(e){let t="<reasoning_content>",o="</reasoning_content>";if(e.headers.get("Content-Type")?.includes("application/json")){let r=await U(e);if(r.choices[0]?.message.content){let s=/<reasoning_content>(.*?)<\/reasoning_content>/s,a=r.choices[0]?.message.content.match(s);a&&a[1]&&(r.thinking={content:a[1]})}return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let r=0,s=new TextDecoder,a=new TextEncoder,i=new ReadableStream({async start(c){let l=e.body.getReader(),u="",p="SEARCHING",d="",f="",h=(g,m)=>{if(typeof m!="string"){g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0&&!g.choices[0].delta.content&&(g.choices[0].index=r,c.enqueue(a.encode(`data: ${JSON.stringify(g)}
260
260
 
261
- `)));return}let y=d+g;for(d="";y.length>0;)if(p==="SEARCHING"){let _=y.indexOf(t);if(_!==-1)y=y.substring(_+t.length),p="REASONING";else{for(let b=t.length-1;b>0;b--)if(y.endsWith(t.substring(0,b))){d=y.substring(y.length-b);break}y=""}}else if(p==="REASONING"){let _=y.indexOf(o);if(_!==-1){let b=y.substring(0,_);if(b.length>0){let x={...f.choices[0].delta,thinking:{content:b}};delete x.content;let T={...f,choices:[{...f.choices[0],delta:x,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(T)}
261
+ `)));return}let _=d+m;for(d="";_.length>0;)if(p==="SEARCHING"){let b=_.indexOf(t);if(b!==-1)_=_.substring(b+t.length),p="REASONING";else{for(let y=t.length-1;y>0;y--)if(_.endsWith(t.substring(0,y))){d=_.substring(_.length-y);break}_=""}}else if(p==="REASONING"){let b=_.indexOf(o);if(b!==-1){let y=_.substring(0,b);if(y.length>0){let x={...g.choices[0].delta,thinking:{content:y}};delete x.content;let T={...g,choices:[{...g.choices[0],delta:x,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(T)}
262
262
 
263
- `))}let k={...f.choices[0].delta,thinking:{signature:"ccr_think_signature"}};delete k.content;let v={...f,choices:[{...f.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
263
+ `))}let k={...g.choices[0].delta,thinking:{signature:"ccr_think_signature"}};delete k.content;let v={...g,choices:[{...g.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
264
264
 
265
- `)),r++,y=y.substring(_+o.length),p="FINAL"}else{let b=y;for(let k=o.length-1;k>0;k--)if(y.endsWith(o.substring(0,k))){d=y.substring(y.length-k),b=y.substring(0,y.length-k);break}if(b.length>0){let k={...f.choices[0].delta,thinking:{content:b}};delete k.content;let v={...f,choices:[{...f.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
265
+ `)),r++,_=_.substring(b+o.length),p="FINAL"}else{let y=_;for(let k=o.length-1;k>0;k--)if(_.endsWith(o.substring(0,k))){d=_.substring(_.length-k),y=_.substring(0,_.length-k);break}if(y.length>0){let k={...g.choices[0].delta,thinking:{content:y}};delete k.content;let v={...g,choices:[{...g.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
266
266
 
267
- `))}y=""}}else if(p==="FINAL"){if(y.length>0)if(/^\s*$/.test(y))m+=y;else{let b=m+y,k={...f.choices[0].delta,content:b};k.thinking&&delete k.thinking;let v={...f,choices:[{...f.choices[0],delta:k}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
267
+ `))}_=""}}else if(p==="FINAL"){if(_.length>0)if(/^\s*$/.test(_))f+=_;else{let y=f+_,k={...g.choices[0].delta,content:y};k.thinking&&delete k.thinking;let v={...g,choices:[{...g.choices[0],delta:k}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
268
268
 
269
- `)),m=""}r++,y=""}};try{for(;;){let{done:f,value:g}=await l.read();if(f)break;let y=s.decode(g,{stream:!0});u+=y;let _=u.split(`
270
- `);u=_.pop()||"";for(let b of _)if(b.trim()){if(b.trim()==="data: [DONE]"){c.enqueue(a.encode(b+`
269
+ `)),f=""}r++,_=""}};try{for(;;){let{done:g,value:m}=await l.read();if(g)break;let _=s.decode(m,{stream:!0});u+=_;let b=u.split(`
270
+ `);u=b.pop()||"";for(let y of b)if(y.trim()){if(y.trim()==="data: [DONE]"){c.enqueue(a.encode(y+`
271
271
 
272
- `));break}if(b.startsWith("data:"))try{let k=JSON.parse(b.slice(5));h(k,k.choices?.[0]?.delta?.content)}catch{c.enqueue(a.encode(b+`
273
- `))}else c.enqueue(a.encode(b+`
274
- `))}}}catch(f){console.error("Stream error:",f),c.error(f)}finally{try{l.releaseLock()}catch(f){console.error("Error releasing reader lock:",f)}if(p==="REASONING"){let g={choices:[{delta:{thinking:{signature:"ccr_think_signature"}}}]};c.enqueue(a.encode(`data: ${JSON.stringify(g)}
272
+ `));break}if(y.startsWith("data:"))try{let k=JSON.parse(y.slice(5));h(k,k.choices?.[0]?.delta?.content)}catch{c.enqueue(a.encode(y+`
273
+ `))}else c.enqueue(a.encode(y+`
274
+ `))}}}catch(g){console.error("Stream error:",g),c.error(g)}finally{try{l.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}if(p==="REASONING"){let m={choices:[{delta:{thinking:{signature:"ccr_think_signature"}}}]};c.enqueue(a.encode(`data: ${JSON.stringify(m)}
275
275
 
276
- `))}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var vo,za=w(()=>{"use strict";ne();vo=class{name="kimi";async transformRequestIn(e){return(e.thinking||e.reasoning?.enabled||e.messages.some(o=>o.thinking?.content))&&e.messages.forEach(o=>{if(o.role==="assistant"){let r=o.thinking?.content,s=o.thinking?.signature;r&&typeof r=="string"&&r.trim()&&(o.reasoning_content=r,s&&(o.reasoning_content_signature=s)),o.tool_calls&&o.tool_calls.length>0&&(o.reasoning_content||(o.reasoning_content="")),o.thinking&&delete o.thinking}}),e}async transformResponseOut(e){let t=e.headers.get("Content-Type");if(t?.includes("stream")){if(!e.body)return e;let o=new TextDecoder,r=new TextEncoder,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader();try{for(;;){let{done:u,value:p}=await l.read();if(u){a.trim()&&c.enqueue(r.encode(a+`
277
- `));break}let d=o.decode(p,{stream:!0});a+=d;let m=a.split(`
278
- `);a=m.pop()||"";for(let h of m)if(h.trim())if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let f=JSON.parse(h.slice(6));if(f.choices?.[0]?.delta?.reasoning_content){s+=f.choices[0].delta.reasoning_content;let g={...f,choices:[{...f.choices[0],delta:{thinking:{content:f.choices[0].delta.reasoning_content}}}]};delete g.choices[0].delta.reasoning_content,c.enqueue(r.encode(`data: ${JSON.stringify(g)}
276
+ `))}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var vo,za=R(()=>{"use strict";ne();vo=class{name="kimi";async transformRequestIn(e){return(e.thinking||e.reasoning?.enabled||e.messages.some(o=>o.thinking?.content))&&e.messages.forEach(o=>{if(o.role==="assistant"){let r=o.thinking?.content,s=o.thinking?.signature;r&&typeof r=="string"&&r.trim()&&(o.reasoning_content=r,s&&(o.reasoning_content_signature=s)),o.tool_calls&&o.tool_calls.length>0&&(o.reasoning_content||(o.reasoning_content="")),o.thinking&&delete o.thinking}}),e}async transformResponseOut(e){let t=e.headers.get("Content-Type");if(t?.includes("stream")){if(!e.body)return e;let o=new TextDecoder,r=new TextEncoder,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader();try{for(;;){let{done:u,value:p}=await l.read();if(u){a.trim()&&c.enqueue(r.encode(a+`
277
+ `));break}let d=o.decode(p,{stream:!0});a+=d;let f=a.split(`
278
+ `);a=f.pop()||"";for(let h of f)if(h.trim())if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let g=JSON.parse(h.slice(6));if(g.choices?.[0]?.delta?.reasoning_content){s+=g.choices[0].delta.reasoning_content;let m={...g,choices:[{...g.choices[0],delta:{thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete m.choices[0].delta.reasoning_content,c.enqueue(r.encode(`data: ${JSON.stringify(m)}
279
279
 
280
- `));continue}if(f.choices?.[0]?.delta?.content&&s&&!f.choices[0]?.delta?.reasoning_content){let g=Date.now().toString(),y={...f,choices:[{...f.choices[0],delta:{content:null,thinking:{content:s,signature:g}}}]};c.enqueue(r.encode(`data: ${JSON.stringify(y)}
280
+ `));continue}if(g.choices?.[0]?.delta?.content&&s&&!g.choices[0]?.delta?.reasoning_content){let m=Date.now().toString(),_={...g,choices:[{...g.choices[0],delta:{content:null,thinking:{content:s,signature:m}}}]};c.enqueue(r.encode(`data: ${JSON.stringify(_)}
281
281
 
282
- `)),s=""}f.choices?.[0]?.delta?.reasoning_content&&delete f.choices[0].delta.reasoning_content,f.choices?.[0]?.delta&&Object.keys(f.choices[0].delta).length>0&&c.enqueue(r.encode(`data: ${JSON.stringify(f)}
282
+ `)),s=""}g.choices?.[0]?.delta?.reasoning_content&&delete g.choices[0].delta.reasoning_content,g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0&&c.enqueue(r.encode(`data: ${JSON.stringify(g)}
283
283
 
284
284
  `))}catch{c.enqueue(r.encode(h+`
285
285
  `))}else c.enqueue(r.encode(h+`
286
- `))}}catch(u){c.error(u)}finally{try{l.releaseLock()}catch{}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":t||"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}if(t?.includes("application/json")){let o=await U(e);return o.choices?.[0]?.message?.reasoning_content&&(o.choices[0].message.thinking={content:o.choices[0].message.reasoning_content},delete o.choices[0].message.reasoning_content),new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return e}}});var Ur,xo,Ba=w(()=>{"use strict";ne();ct();Ur=require("uuid"),xo=class{constructor(e){this.options=e}static TransformerName="opencode";endPoint="/v1/chat/completions";resolveSessionId(e,t){let o=t?.req,r=o?.headers||{},s=a=>{let i=Object.keys(r).find(l=>l.toLowerCase()===a),c=i?r[i]:void 0;return typeof c=="string"&&c.trim()?c.trim():void 0};return s("x-opencode-session")||o?.clientContext?.stableSessionId||o?.sessionId||Ce(e.metadata?.user_id)||s("session_id")||(0,Ur.v4)()}async transformRequestIn(e,t,o){let r=e.reasoning?.enabled||e.messages.some(s=>s.thinking?.content);return e.messages.forEach(s=>{if(Array.isArray(s.content)&&s.content.forEach(a=>{a.type==="image_url"&&(a.image_url.url.startsWith("http")||(a.image_url.url=`data:${a.media_type};base64,${a.image_url.url}`),delete a.media_type)}),s.role==="assistant"){let a=s.thinking?.content,i=s.thinking?.signature;a&&typeof a=="string"&&a.trim()?(s.reasoning_content=a,i&&(s.reasoning_content_signature=i)):r&&s.tool_calls?.length&&!s.reasoning_content&&(s.reasoning_content=" "),s.thinking&&delete s.thinking}}),Object.assign(e,this.options||{}),{body:e,config:{headers:{"x-opencode-session":this.resolveSessionId(e,o)}}}}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return t.choices?.[0]?.message?.reasoning_content&&(t.choices[0].message.thinking={content:t.choices[0].message.reasoning_content},delete t.choices[0].message.reasoning_content),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,f,g)=>{let y=h.split(`
287
- `);for(let _ of y)_.trim()&&f.enqueue(g.encode(_+`
288
- `))},m=(h,f)=>{let{controller:g,encoder:y}=f;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let _=JSON.parse(h.slice(6));if(_.usage&&(_.choices[0].finish_reason=i?"tool_calls":"stop"),_.choices?.[0]?.finish_reason==="error"){g.enqueue(y.encode(`data: ${JSON.stringify({error:_.choices?.[0]?.error})}
286
+ `))}}catch(u){c.error(u)}finally{try{l.releaseLock()}catch{}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":t||"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}if(t?.includes("application/json")){let o=await U(e);return o.choices?.[0]?.message?.reasoning_content&&(o.choices[0].message.thinking={content:o.choices[0].message.reasoning_content},delete o.choices[0].message.reasoning_content),new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return e}}});var Ur,xo,Ba=R(()=>{"use strict";ne();lt();Ur=require("uuid"),xo=class{constructor(e){this.options=e}static TransformerName="opencode";endPoint="/v1/chat/completions";resolveSessionId(e,t){let o=t?.req,r=o?.headers||{},s=a=>{let i=Object.keys(r).find(l=>l.toLowerCase()===a),c=i?r[i]:void 0;return typeof c=="string"&&c.trim()?c.trim():void 0};return s("x-opencode-session")||o?.clientContext?.stableSessionId||o?.sessionId||Ce(e.metadata?.user_id)||s("session_id")||(0,Ur.v4)()}async transformRequestIn(e,t,o){let r=e.reasoning?.enabled||e.messages.some(s=>s.thinking?.content);return e.messages.forEach(s=>{if(Array.isArray(s.content)&&s.content.forEach(a=>{a.type==="image_url"&&(a.image_url.url.startsWith("http")||(a.image_url.url=`data:${a.media_type};base64,${a.image_url.url}`),delete a.media_type)}),s.role==="assistant"){let a=s.thinking?.content,i=s.thinking?.signature;a&&typeof a=="string"&&a.trim()?(s.reasoning_content=a,i&&(s.reasoning_content_signature=i)):r&&s.tool_calls?.length&&!s.reasoning_content&&(s.reasoning_content=" "),s.thinking&&delete s.thinking}}),Object.assign(e,this.options||{}),{body:e,config:{headers:{"x-opencode-session":this.resolveSessionId(e,o)}}}}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await U(e);return t.choices?.[0]?.message?.reasoning_content&&(t.choices[0].message.thinking={content:t.choices[0].message.reasoning_content},delete t.choices[0].message.reasoning_content),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
287
+ `);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
288
+ `))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let b=JSON.parse(h.slice(6));if(b.usage&&(b.choices[0].finish_reason=i?"tool_calls":"stop"),b.choices?.[0]?.finish_reason==="error"){m.enqueue(_.encode(`data: ${JSON.stringify({error:b.choices?.[0]?.error})}
289
289
 
290
- `));return}_.choices?.[0]?.delta?.content&&!f.hasTextContent()&&f.setHasTextContent(!0);let b=_.choices?.[0]?.delta?.reasoning||_.choices?.[0]?.delta?.reasoning_content;if(b){f.appendReasoningContent(b);let R={..._,choices:[{..._.choices?.[0],delta:{..._.choices[0].delta,thinking:{content:b}}}]};R.choices?.[0]?.delta&&(delete R.choices[0].delta.reasoning,delete R.choices[0].delta.reasoning_content),g.enqueue(y.encode(`data: ${JSON.stringify(R)}
290
+ `));return}b.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0);let y=b.choices?.[0]?.delta?.reasoning||b.choices?.[0]?.delta?.reasoning_content;if(y){g.appendReasoningContent(y);let C={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,thinking:{content:y}}}]};C.choices?.[0]?.delta&&(delete C.choices[0].delta.reasoning,delete C.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(C)}
291
291
 
292
- `));return}if(_.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let R="ccr_think_signature",S=_.choices[0].delta.content,P={..._,choices:[{..._.choices?.[0],delta:{..._.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:R}}}]};P.choices?.[0]?.delta&&(delete P.choices[0].delta.reasoning,delete P.choices[0].delta.reasoning_content),g.enqueue(y.encode(`data: ${JSON.stringify(P)}
292
+ `));return}if(b.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let C="ccr_think_signature",S=b.choices[0].delta.content,P={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:C}}}]};P.choices?.[0]?.delta&&(delete P.choices[0].delta.reasoning,delete P.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(P)}
293
293
 
294
- `));let O={..._,choices:[{..._.choices?.[0],delta:{..._.choices[0].delta,content:S}}]};O.choices?.[0]?.delta&&(delete O.choices[0].delta.reasoning,delete O.choices[0].delta.reasoning_content),g.enqueue(y.encode(`data: ${JSON.stringify(O)}
294
+ `));let M={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:S}}]};M.choices?.[0]?.delta&&(delete M.choices[0].delta.reasoning,delete M.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(M)}
295
295
 
296
- `));return}_.choices?.[0]?.delta?.reasoning&&delete _.choices[0].delta.reasoning,_.choices?.[0]?.delta?.reasoning_content&&delete _.choices[0].delta.reasoning_content,_.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(_.choices?.[0]?.delta?.tool_calls[0].id,10))&&_.choices?.[0]?.delta?.tool_calls.forEach(R=>{R.id=`call_${(0,Ur.v4)()}`}),_.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let k=_.choices?.[0]?.delta,v=k&&Object.keys(k).length>0,x=_.choices?.[0]?.finish_reason,T=_.usage;(v||x||T)&&g.enqueue(y.encode(`data: ${JSON.stringify(_)}
296
+ `));return}b.choices?.[0]?.delta?.reasoning&&delete b.choices[0].delta.reasoning,b.choices?.[0]?.delta?.reasoning_content&&delete b.choices[0].delta.reasoning_content,b.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(b.choices?.[0]?.delta?.tool_calls[0].id,10))&&b.choices?.[0]?.delta?.tool_calls.forEach(C=>{C.id=`call_${(0,Ur.v4)()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let k=b.choices?.[0]?.delta,v=k&&Object.keys(k).length>0,x=b.choices?.[0]?.finish_reason,T=b.usage;(v||x||T)&&m.enqueue(_.encode(`data: ${JSON.stringify(b)}
297
297
 
298
- `))}catch{g.enqueue(y.encode(h+`
299
- `))}else g.enqueue(y.encode(h+`
300
- `))};try{for(;;){let{done:h,value:f}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!f||f.length===0)continue;let g;try{g=t.decode(f,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(g.length===0)continue;if(c+=g,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=c.split(`
301
- `);c=_.pop()||"";for(let b of _)if(b.trim())try{m(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",b,k),u.enqueue(o.encode(b+`
302
- `))}continue}let y=c.split(`
303
- `);c=y.pop()||"";for(let _ of y)if(_.trim())try{m(_,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),u.enqueue(o.encode(_+`
304
- `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});function fd(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim();if(!e)return;let t=e.toLowerCase();return["none","low","medium","high","max"].includes(t)?t:/^\d+$/.test(e)?parseInt(e,10):e}function md(n){let e="";try{e=new URL(String(n||"")).pathname.replace(/\/+$/,"")}catch{return"chat"}return e.endsWith("/messages")?"anthropic":e.endsWith("/responses")?"responses":"chat"}var pd,So,Ja=w(()=>{"use strict";mt();pd={min:"low",minimal:"low",light:"low",xhigh:"max",maximum:"max",ultra:"max",ultracode:"max"};So=class{constructor(e){this.options=e}static TransformerName="defaultthinking";async transformRequestIn(e,t){let o=fd(this.options?.level??this.options?.value);if(o===void 0||o==="none"||e.reasoning)return e;let r=md(t?.baseUrl);if(typeof o=="number"){if(o<=0)return e;if(r==="anthropic")e.reasoning={enabled:!0,max_tokens:Math.max(1024,Math.floor(o))};else{let a=Oe(o);r==="chat"?e.reasoning_effort=a:e.reasoning={enabled:!0,effort:a}}return e}if(o==="low"||o==="medium"||o==="high"||o==="max")return r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e;let s=pd[o.toLowerCase()];return s?(r==="anthropic"?e.reasoning={enabled:!0,effort:s}:r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e):(r==="chat"?e.reasoning_effort=o:r==="responses"&&(e.reasoning={enabled:!0,effort:o}),e)}}});function Wa(n,e=!1){if(!n||typeof n!="object"||n.thinking)return!1;let t=n.reasoning,o=typeof t=="string"?t:t?.content;return typeof o=="string"&&o.length>0?(e&&typeof t=="object"?n.thinking={content:o}:(n.thinking=typeof t=="string"?{content:o}:{...t},delete n.reasoning),!0):typeof n.reasoning_content=="string"&&n.reasoning_content?(n.thinking={content:n.reasoning_content},!0):!1}var Co,Ka=w(()=>{"use strict";mt();ne();Co=class{static TransformerName="amd";name="amd";resolveEffort(e,t){if(!e)return;let o=(t??"").toLowerCase(),r=o.includes("glm"),s=!r&&o.includes("qwen"),a=!r&&!s&&o.includes("deepseek");if(e==="none")return a||o.split("/").pop()==="qwen3.8-flash-next"?"none":void 0;switch(e){case"minimal":return a?"minimal":"low";case"low":case"medium":return e;case"high":return s?"xhigh":"high";case"xhigh":case"max":return a?e:s?"xhigh":"high";default:return"medium"}}async transformRequestIn(e){let t=JSON.parse(JSON.stringify(e)),o=t.model,r=t.reasoning,s,a=r?.enabled===!1;r&&typeof r.effort=="string"?(s=r.effort===""?void 0:r.effort,a=a||r.effort==="none"):typeof r?.max_tokens=="number"?s=Oe(r.max_tokens):r?.enabled===!0?s=t.reasoning_effort??"medium":(s=t.reasoning_effort,!a&&(t.enable_thinking===!1||t.thinking?.type==="disabled")&&(a=!0));let i=this.resolveEffort(a?"none":s,o);return i?t.reasoning_effort=i:delete t.reasoning_effort,delete t.reasoning,delete t.thinking,delete t.enable_thinking,t}async transformResponseOut(e){let t=e.headers.get("Content-Type")??"";if(t.includes("application/json")){if(!e.body)return e;let o=await ve(e);if(o){let a=new Headers(e.headers);if(o.isSSE&&a.set("Content-Type","text/event-stream"),e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:a}),o.isSSE)return this.transformStream(e)}else{let a=await Ee(e);if(e=a.response,a.isSSE)return this.transformStream(e)}let r=await U(e);this.liftMessageReasoning(r);let s=new Headers(e.headers);return s.delete("content-length"),new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:s})}return(t.includes("stream")||t.includes("event-stream"))&&e.body?this.transformStream(e):e}liftMessageReasoning(e){if(Array.isArray(e?.choices))for(let t of e.choices)Wa(t?.message)}transformStream(e){let t=new TextDecoder,o=new TextEncoder,r="",s=l=>{if(!l.startsWith("data:"))return l;let u=l.slice(5).trim();if(u==="[DONE]")return l;let p;try{p=JSON.parse(u)}catch{return l}let d=!1,m=Array.isArray(p?.choices)?p.choices:[];for(let h of m)Wa(h?.delta,!0)&&(d=!0);return d?`data: ${JSON.stringify(p)}`:l},a=(l,u=!1)=>{let p=/\r\n|\r|\n/g,d=0,m,h="";for(;(m=p.exec(r))!==null&&!(!u&&m[0]==="\r"&&p.lastIndex===r.length);)h+=s(r.slice(d,m.index))+m[0],d=p.lastIndex;r=r.slice(d),u&&(h+=s(r),r=""),h&&l.enqueue(o.encode(h))},i=e.body.pipeThrough(new TransformStream({transform(l,u){r+=t.decode(l,{stream:!0}),a(u)},flush(l){r+=t.decode(),a(l,!0)}})),c=new Headers(e.headers);return c.delete("content-length"),new Response(i,{status:e.status,statusText:e.statusText,headers:c})}}});var Ga,Va=w(()=>{pa();fa();ma();ga();ha();ba();_a();Ta();va();Ra();wa();Pa();Ea();La();Na();$a();Da();Fa();ja();vr();Ha();za();Ba();Ja();Ka();Ga={AnthropicTransformer:Zn,GeminiTransformer:no,VertexGeminiTransformer:oo,VertexClaudeTransformer:go,DeepseekTransformer:ro,TooluseTransformer:so,OpenrouterTransformer:io,OpenAITransformer:bo,MaxTokenTransformer:ao,GroqTransformer:co,CleancacheTransformer:lo,EnhanceToolTransformer:uo,ReasoningTransformer:po,SamplingTransformer:fo,MaxCompletionTokens:mo,CerebrasTransformer:ho,StreamOptionsTransformer:yo,CustomParamsTransformer:_o,VercelTransformer:ko,OpenAIResponsesTransformer:rt,ForceReasoningTransformer:To,KimiTransformer:vo,OpenCodeTransformer:xo,DefaultThinkingTransformer:So,AmdTransformer:Co}});var Ge,jr=w(()=>{"use strict";Va();Ge=class{constructor(e,t){this.configService=e;this.logger=t}transformers=new Map;preparePluginTransformer(e){if(typeof e.TransformerName=="string")return e;let t=new e;if(!t?.name)throw new Error("plugin transformer has no name");return t.logger=this.logger,t}registerTransformer(e,t){this.transformers.set(e,t),this.logger.info(`register transformer: ${e}${t.endPoint?` (endpoint: ${t.endPoint})`:" (no endpoint)"}`)}getTransformer(e){return this.transformers.get(e)}getAllTransformers(){return new Map(this.transformers)}getTransformersWithEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&t.endPoint&&e.push({name:o,transformer:t})}),e}getTransformersWithoutEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&!t.endPoint&&e.push({name:o,transformer:t})}),e}removeTransformer(e){return this.transformers.delete(e)}hasTransformer(e){return this.transformers.has(e)}async registerTransformerFromConfig(e){try{if(e.path){let t=require(require.resolve(e.path));if(t){let o=new t(e.options);if(o&&typeof o=="object"&&(o.logger=this.logger),!o.name)throw new Error(`Transformer instance from ${e.path} does not have a name property.`);return this.registerTransformer(o.name,o),!0}}return!1}catch(t){return this.logger.error(`load transformer (${e.path})
298
+ `))}catch{m.enqueue(_.encode(h+`
299
+ `))}else m.enqueue(_.encode(h+`
300
+ `))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
301
+ `);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
302
+ `))}continue}let _=c.split(`
303
+ `);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
304
+ `))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});function md(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim();if(!e)return;let t=e.toLowerCase();return["none","low","medium","high","max"].includes(t)?t:/^\d+$/.test(e)?parseInt(e,10):e}function gd(n){let e="";try{e=new URL(String(n||"")).pathname.replace(/\/+$/,"")}catch{return"chat"}return e.endsWith("/messages")?"anthropic":e.endsWith("/responses")?"responses":"chat"}var fd,So,Ja=R(()=>{"use strict";gt();fd={min:"low",minimal:"low",light:"low",xhigh:"max",maximum:"max",ultra:"max",ultracode:"max"};So=class{constructor(e){this.options=e}static TransformerName="defaultthinking";async transformRequestIn(e,t){let o=md(this.options?.level??this.options?.value);if(o===void 0||o==="none"||e.reasoning)return e;let r=gd(t?.baseUrl);if(typeof o=="number"){if(o<=0)return e;if(r==="anthropic")e.reasoning={enabled:!0,max_tokens:Math.max(1024,Math.floor(o))};else{let a=Oe(o);r==="chat"?e.reasoning_effort=a:e.reasoning={enabled:!0,effort:a}}return e}if(o==="low"||o==="medium"||o==="high"||o==="max")return r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e;let s=fd[o.toLowerCase()];return s?(r==="anthropic"?e.reasoning={enabled:!0,effort:s}:r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e):(r==="chat"?e.reasoning_effort=o:r==="responses"&&(e.reasoning={enabled:!0,effort:o}),e)}}});function Wa(n,e=!1){if(!n||typeof n!="object"||n.thinking)return!1;let t=n.reasoning,o=typeof t=="string"?t:t?.content;return typeof o=="string"&&o.length>0?(e&&typeof t=="object"?n.thinking={content:o}:(n.thinking=typeof t=="string"?{content:o}:{...t},delete n.reasoning),!0):typeof n.reasoning_content=="string"&&n.reasoning_content?(n.thinking={content:n.reasoning_content},!0):!1}var Co,Ka=R(()=>{"use strict";gt();ne();Co=class{static TransformerName="amd";name="amd";resolveEffort(e,t){if(!e)return;let o=(t??"").toLowerCase(),r=o.includes("glm"),s=!r&&o.includes("qwen"),a=!r&&!s&&o.includes("deepseek");if(e==="none")return a||o.split("/").pop()==="qwen3.8-flash-next"?"none":void 0;switch(e){case"minimal":return a?"minimal":"low";case"low":case"medium":return e;case"high":return s?"xhigh":"high";case"xhigh":case"max":return a?e:s?"xhigh":"high";default:return"medium"}}async transformRequestIn(e){let t=JSON.parse(JSON.stringify(e)),o=t.model,r=t.reasoning,s,a=r?.enabled===!1;r&&typeof r.effort=="string"?(s=r.effort===""?void 0:r.effort,a=a||r.effort==="none"):typeof r?.max_tokens=="number"?s=Oe(r.max_tokens):r?.enabled===!0?s=t.reasoning_effort??"medium":(s=t.reasoning_effort,!a&&(t.enable_thinking===!1||t.thinking?.type==="disabled")&&(a=!0));let i=this.resolveEffort(a?"none":s,o);return i?t.reasoning_effort=i:delete t.reasoning_effort,delete t.reasoning,delete t.thinking,delete t.enable_thinking,t}async transformResponseOut(e){let t=e.headers.get("Content-Type")??"";if(t.includes("application/json")){if(!e.body)return e;let o=await ve(e);if(o){let a=new Headers(e.headers);if(o.isSSE&&a.set("Content-Type","text/event-stream"),e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:a}),o.isSSE)return this.transformStream(e)}else{let a=await Ee(e);if(e=a.response,a.isSSE)return this.transformStream(e)}let r=await U(e);this.liftMessageReasoning(r);let s=new Headers(e.headers);return s.delete("content-length"),new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:s})}return(t.includes("stream")||t.includes("event-stream"))&&e.body?this.transformStream(e):e}liftMessageReasoning(e){if(Array.isArray(e?.choices))for(let t of e.choices)Wa(t?.message)}transformStream(e){let t=new TextDecoder,o=new TextEncoder,r="",s=l=>{if(!l.startsWith("data:"))return l;let u=l.slice(5).trim();if(u==="[DONE]")return l;let p;try{p=JSON.parse(u)}catch{return l}let d=!1,f=Array.isArray(p?.choices)?p.choices:[];for(let h of f)Wa(h?.delta,!0)&&(d=!0);return d?`data: ${JSON.stringify(p)}`:l},a=(l,u=!1)=>{let p=/\r\n|\r|\n/g,d=0,f,h="";for(;(f=p.exec(r))!==null&&!(!u&&f[0]==="\r"&&p.lastIndex===r.length);)h+=s(r.slice(d,f.index))+f[0],d=p.lastIndex;r=r.slice(d),u&&(h+=s(r),r=""),h&&l.enqueue(o.encode(h))},i=e.body.pipeThrough(new TransformStream({transform(l,u){r+=t.decode(l,{stream:!0}),a(u)},flush(l){r+=t.decode(),a(l,!0)}})),c=new Headers(e.headers);return c.delete("content-length"),new Response(i,{status:e.status,statusText:e.statusText,headers:c})}}});var Ga,Va=R(()=>{pa();fa();ma();ga();ha();_a();ba();Ta();va();Ra();wa();Pa();Ea();La();Na();$a();Da();Fa();ja();vr();Ha();za();Ba();Ja();Ka();Ga={AnthropicTransformer:Zn,GeminiTransformer:no,VertexGeminiTransformer:oo,VertexClaudeTransformer:go,DeepseekTransformer:ro,TooluseTransformer:so,OpenrouterTransformer:io,OpenAITransformer:_o,MaxTokenTransformer:ao,GroqTransformer:co,CleancacheTransformer:lo,EnhanceToolTransformer:uo,ReasoningTransformer:po,SamplingTransformer:fo,MaxCompletionTokens:mo,CerebrasTransformer:ho,StreamOptionsTransformer:yo,CustomParamsTransformer:bo,VercelTransformer:ko,OpenAIResponsesTransformer:st,ForceReasoningTransformer:To,KimiTransformer:vo,OpenCodeTransformer:xo,DefaultThinkingTransformer:So,AmdTransformer:Co}});var Ge,jr=R(()=>{"use strict";Va();Ge=class{constructor(e,t){this.configService=e;this.logger=t}transformers=new Map;preparePluginTransformer(e){if(typeof e.TransformerName=="string")return e;let t=new e;if(!t?.name)throw new Error("plugin transformer has no name");return t.logger=this.logger,t}registerTransformer(e,t){this.transformers.set(e,t),this.logger.info(`register transformer: ${e}${t.endPoint?` (endpoint: ${t.endPoint})`:" (no endpoint)"}`)}getTransformer(e){return this.transformers.get(e)}getAllTransformers(){return new Map(this.transformers)}getTransformersWithEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&t.endPoint&&e.push({name:o,transformer:t})}),e}getTransformersWithoutEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&!t.endPoint&&e.push({name:o,transformer:t})}),e}removeTransformer(e){return this.transformers.delete(e)}hasTransformer(e){return this.transformers.has(e)}async registerTransformerFromConfig(e){try{if(e.path){let t=require(require.resolve(e.path));if(t){let o=new t(e.options);if(o&&typeof o=="object"&&(o.logger=this.logger),!o.name)throw new Error(`Transformer instance from ${e.path} does not have a name property.`);return this.registerTransformer(o.name,o),!0}}return!1}catch(t){return this.logger.error(`load transformer (${e.path})
305
305
  error: ${t.message}
306
306
  stack: ${t.stack}`),!1}}async initialize(){try{await this.registerDefaultTransformersInternal(),await this.loadFromConfig()}catch(e){this.logger.error(`TransformerService init error: ${e.message}
307
- Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.values(Ga).forEach(e=>{if("TransformerName"in e&&typeof e.TransformerName=="string")this.registerTransformer(e.TransformerName,e);else{let t=new e;t&&typeof t=="object"&&(t.logger=this.logger),this.registerTransformer(t.name,t)}})}catch(e){this.logger.error({error:e},"transformer regist error:")}}async loadFromConfig(){let e=this.configService.get("transformers",[]);for(let t of e)await this.registerTransformerFromConfig(t)}}});var Qa,Jt,Ya=w(()=>{"use strict";Qa=require("tiktoken"),Jt=class{type="tiktoken";name;encoding;constructor(e="cl100k_base"){this.name=`tiktoken-${e}`;try{this.encoding=(0,Qa.get_encoding)(e)}catch{throw new Error(`Failed to initialize tiktoken encoding: ${e}`)}}async initialize(){if(!this.encoding)throw new Error("Tiktoken encoding not initialized")}async countTokens(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");let o=0,{messages:r,system:s,tools:a}=e;return Array.isArray(r)&&r.forEach(i=>{typeof i.content=="string"?o+=t.encode(i.content).length:Array.isArray(i.content)&&i.content.forEach(c=>{if(c.type==="text")o+=t.encode(c.text).length;else if(c.type==="tool_use")o+=t.encode(JSON.stringify(c.input)).length;else if(c.type==="tool_result"){let l=c.content;if(Array.isArray(l))for(let u of l)u?.type!=="image"&&(o+=t.encode(u?.type==="text"?String(u.text??""):JSON.stringify(u)).length);else{let u=typeof l=="string"?l:JSON.stringify(l);o+=t.encode(u).length}}})}),typeof s=="string"?o+=t.encode(s).length:Array.isArray(s)&&s.forEach(i=>{i.type==="text"&&(typeof i.text=="string"?o+=t.encode(i.text).length:Array.isArray(i.text)&&i.text.forEach(c=>{o+=t.encode(c||"").length}))}),a&&a.forEach(i=>{i.description&&(o+=t.encode(i.name+i.description).length),i.input_schema&&(o+=t.encode(JSON.stringify(i.input_schema)).length)}),o}isInitialized(){return this.encoding!==void 0}encodeText(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");return Array.from(t.encode(e))}dispose(){this.encoding&&(this.encoding.free(),this.encoding=void 0)}}});var Wt,Xa,ht,Kt,Za,Ro,qa=w(()=>{"use strict";Wt=require("path"),Xa=require("os"),ht=require("fs"),Kt=require("fs"),Za=require("@huggingface/tokenizers"),Ro=class{type="huggingface";name;modelId;logger;options;tokenizer=null;cacheDir;safeModelName;constructor(e,t,o={}){this.modelId=e,this.logger=t,this.options=o,this.cacheDir=o.cacheDir||(0,Wt.join)((0,Xa.homedir)(),".claude-code-router",".huggingface"),this.safeModelName=e.replace(/\//g,"_").replace(/[^a-zA-Z0-9_-]/g,"_"),this.name=`huggingface-${e.split("/").pop()}`}getCachePaths(){let e=(0,Wt.join)(this.cacheDir,this.safeModelName);return{modelDir:e,tokenizerJson:(0,Wt.join)(e,"tokenizer.json"),tokenizerConfig:(0,Wt.join)(e,"tokenizer_config.json")}}ensureDir(e){(0,ht.existsSync)(e)||(0,ht.mkdirSync)(e,{recursive:!0})}async loadFromCache(){try{let e=this.getCachePaths();if(!(0,ht.existsSync)(e.tokenizerJson)||!(0,ht.existsSync)(e.tokenizerConfig))return null;let[t,o]=await Promise.all([Kt.promises.readFile(e.tokenizerJson,"utf-8"),Kt.promises.readFile(e.tokenizerConfig,"utf-8")]);return{tokenizerJson:JSON.parse(t),tokenizerConfig:JSON.parse(o)}}catch(e){return this.logger?.warn(`Failed to load from cache: ${e.message}`),null}}async downloadAndCache(){let e=this.getCachePaths(),t={json:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer.json`,config:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer_config.json`};this.logger?.info(`Downloading tokenizer files for ${this.modelId}`);let o=new AbortController,r=setTimeout(()=>o.abort(),this.options.timeout||3e4);try{let[s,a]=await Promise.all([fetch(t.json,{signal:o.signal}),fetch(t.config,{signal:o.signal})]);if(!s.ok)throw new Error(`Failed to fetch tokenizer.json: ${s.statusText}`);let[i,c]=await Promise.all([s.json(),a.ok?a.json():Promise.resolve({})]);return this.ensureDir(e.modelDir),await Promise.all([Kt.promises.writeFile(e.tokenizerJson,JSON.stringify(i,null,2)),Kt.promises.writeFile(e.tokenizerConfig,JSON.stringify(c,null,2))]),{tokenizerJson:i,tokenizerConfig:c}}finally{clearTimeout(r)}}async initialize(){try{this.logger?.info(`Initializing HuggingFace tokenizer: ${this.modelId}`);let e=this.getCachePaths();this.ensureDir(this.cacheDir);let t=await this.loadFromCache()||await this.downloadAndCache();this.tokenizer=new Za.Tokenizer(t.tokenizerJson,t.tokenizerConfig),this.logger?.info(`Tokenizer initialized: ${this.name}`)}catch(e){throw this.logger?.error(`Failed to initialize tokenizer: ${e.message}`),new Error(`Failed to initialize HuggingFace tokenizer for ${this.modelId}: ${e.message}`)}}async countTokens(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");try{let t=this.extractTextFromRequest(e);return this.tokenizer.encode(t).ids.length}catch(t){throw this.logger?.error(`Error counting tokens: ${t.message}`),t}}isInitialized(){return this.tokenizer!==null}encodeText(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");return this.tokenizer.encode(e).ids}dispose(){this.tokenizer=null}extractTextFromRequest(e){let t=[],{messages:o,system:r,tools:s}=e;if(Array.isArray(o)){for(let a of o)if(typeof a.content=="string")t.push(a.content);else if(Array.isArray(a.content)){for(let i of a.content)if(i.type==="text"&&i.text)t.push(i.text);else if(i.type==="tool_use"&&i.input)t.push(JSON.stringify(i.input));else if(i.type==="tool_result")if(Array.isArray(i.content))for(let c of i.content)c?.type!=="image"&&t.push(c?.type==="text"?String(c.text??""):JSON.stringify(c));else t.push(typeof i.content=="string"?i.content:JSON.stringify(i.content))}}if(typeof r=="string")t.push(r);else if(Array.isArray(r)){for(let a of r)if(a.type==="text"){if(typeof a.text=="string")t.push(a.text);else if(Array.isArray(a.text))for(let i of a.text)i&&t.push(i)}}if(s)for(let a of s)a.name&&t.push(a.name),a.description&&t.push(a.description),a.input_schema&&t.push(JSON.stringify(a.input_schema));return t.join(" ")}}});var wo,ec=w(()=>{"use strict";ae();wo=class{type="api";name;config;logger;options;constructor(e,t,o={}){if(!e.url||!e.apiKey)throw new Error("API tokenizer requires url and apiKey");this.config={url:e.url,apiKey:e.apiKey,requestFormat:e.requestFormat||"standard",responseField:e.responseField||"token_count",headers:e.headers||{}},this.logger=t,this.options=o;try{let r=new URL(e.url);this.name=`api-${r.hostname}`}catch{this.name=`api-${e.url}`}}async initialize(){try{new URL(this.config.url)}catch{throw new Error(`Invalid API URL: ${this.config.url}`)}}async countTokens(e){try{let t=this.formatRequestBody(e),o={"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,...this.config.headers},r=new AbortController,s=setTimeout(()=>r.abort(),this.options.timeout||3e4),a={method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal},i=this.options.resolveProxyUrl?.();i&&(a.dispatcher=Y(i));let c=await fetch(this.config.url,a);if(clearTimeout(s),!c.ok)throw new Error(`API tokenizer request failed: ${c.status} ${c.statusText}`);let l=await c.json();return this.extractTokenCount(l)}catch(t){throw t.name==="AbortError"?new Error("API tokenizer request timed out"):t}}isInitialized(){return!0}dispose(){}formatRequestBody(e){switch(this.config.requestFormat){case"standard":return e;case"openai":return{model:"gpt-3.5-turbo",messages:this.extractMessagesAsOpenAIFormat(e)};case"anthropic":return{messages:e.messages||[],system:e.system,tools:e.tools};case"custom":return{text:this.extractConcatenatedText(e)};default:return e}}extractMessagesAsOpenAIFormat(e){return e.messages?e.messages.map(t=>({role:t.role,content:this.extractTextFromMessage(t)})):[]}extractTextFromMessage(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.map(t=>t.type==="text"&&t.text?t.text:t.type==="tool_use"&&t.input?JSON.stringify(t.input):t.type==="tool_result"?Array.isArray(t.content)?t.content.filter(o=>o?.type!=="image").map(o=>o?.type==="text"?String(o.text??""):JSON.stringify(o)).join(`
308
- `):typeof t.content=="string"?t.content:JSON.stringify(t.content):"").join(" "):""}extractConcatenatedText(e){let t=[];return e.messages&&e.messages.forEach(o=>{t.push(this.extractTextFromMessage(o))}),typeof e.system=="string"?t.push(e.system):Array.isArray(e.system)&&e.system.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?t.push(o.text):Array.isArray(o.text)&&o.text.forEach(r=>{r&&t.push(r)}))}),e.tools&&e.tools.forEach(o=>{o.name&&t.push(o.name),o.description&&t.push(o.description),o.input_schema&&t.push(JSON.stringify(o.input_schema))}),t.join(" ")}extractTokenCount(e){try{let t=this.config.responseField,o=t.split("."),r=e;for(let s of o){if(r==null)throw new Error(`Field path '${t}' not found in response`);r=r[s]}if(typeof r!="number")throw new Error(`Expected number at field path '${t}', got ${typeof r}`);return r}catch(t){throw this.logger?.error(`Failed to extract token count from API response: ${t.message}. Response: ${JSON.stringify(e)}`),new Error(`Invalid response from API tokenizer: ${t.message}`)}}}});var Ve,Hr=w(()=>{"use strict";Ya();qa();ec();ae();Ve=class{tokenizers=new Map;configService;logger;options;fallbackTokenizer;constructor(e,t,o={}){this.configService=e,this.logger=t,this.options={timeout:o.timeout??3e4,...o}}async initialize(){try{this.fallbackTokenizer=new Jt("cl100k_base"),await this.fallbackTokenizer.initialize(),this.tokenizers.set("fallback",this.fallbackTokenizer),this.logger?.info("TokenizerService initialized successfully")}catch(e){throw this.logger?.error(`TokenizerService initialization error: ${e.message}`),e}}async getTokenizer(e,t){let o=this.getCacheKey(e,t);if(this.tokenizers.has(o))return this.tokenizers.get(o);let r;try{switch(e.type){case"tiktoken":r=new Jt(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new Ro(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new wo(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return ge(this.configService,s)}});break;default:throw new Error(`Unknown tokenizer type: ${e.type}`)}return this.logger?.info(`Calling initialize() on ${e.type} tokenizer...`),await r.initialize(),this.tokenizers.set(o,r),this.logger?.info(`Tokenizer initialized successfully: ${e.type} (${o})`),r}catch(s){return this.logger?.error(`Failed to initialize ${e.type} tokenizer: ${s.message}`),this.logger?.error(`Error stack: ${s.stack}`),this.fallbackTokenizer||await this.initialize(),this.fallbackTokenizer}}async countTokens(e,t,o){let r=t?await this.getTokenizer(t,o):this.fallbackTokenizer;return{tokenCount:await r.countTokens(e),tokenizerUsed:r.name,cached:!1}}getTokenizerConfigForModel(e,t){let r=(this.configService.get("providers")||[]).find(s=>s.name===e);if(r?.tokenizer)return r.tokenizer.models?.[t]?r.tokenizer.models[t]:r.tokenizer.default}dispose(){this.tokenizers.forEach(e=>{try{e.dispose()}catch(t){this.logger?.error(`Error disposing tokenizer: ${t}`)}}),this.tokenizers.clear()}getCacheKey(e,t){switch(e.type){case"tiktoken":return`tiktoken:${e.encoding||"cl100k_base"}`;case"huggingface":return`hf:${e.model}`;case"api":return`api:${t||"unscoped"}:${e.url}`;default:return`unknown:${JSON.stringify(e)}`}}getRawProvider(e){return(this.configService.get("providers")||[]).find(o=>o?.name===e)}}});function tc(n){if(!n||typeof n!="object"||Td(n))return null;for(let t of kd(n)){let o=_d(t);if(o)return o}return null}function _d(n){if(!n||typeof n!="object")return null;let e={},t=Po(n,gd);if(t!==void 0){let a=nc(t);e.usedDailyBalance=a,e.limitDaily=100}let o=Po(n,hd);if(o!==void 0){let a=nc(o);e.usedBalance=a,e.totalBalance=100}let r=Po(n,yd);if(r!==void 0){let a=oc(r);a&&(e.resetTime=a)}let s=Po(n,bd);if(s!==void 0){let a=oc(s);a&&(e.resetTime7d=a,e.resetTime||(e.resetTime=a))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function nc(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function Po(n,e){for(let t of e){let o=N(n?.[t]);if(o!==void 0)return o}}function kd(n){let e=[],t=new WeakSet,o=["data","Data","DataV2"],r=s=>{if(!(!s||typeof s!="object")&&!t.has(s)){t.add(s),e.push(s);for(let a of o)s[a]&&typeof s[a]=="object"&&r(s[a])}};return r(n),e}function Td(n){let e=n?.data;return e&&typeof e=="object"&&(e.success===!1||e.errorCode||e.errorMsg)?String(e.errorCode||e.errorMsg||"gateway-error"):null}function oc(n){if(typeof n!="string"&&typeof n!="number")return;let e=n;if(typeof n=="number"&&n<1e12&&(e=n*1e3),typeof n=="string"){let o=Number(n.trim());Number.isFinite(o)&&o<1e12&&(e=o*1e3)}let t=new Date(e);return isNaN(t.getTime())?void 0:t.toISOString()}function Eo(n){let e=qr(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?Ed:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?Ad:e==="deepseek.com"||e.endsWith(".deepseek.com")?vd:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?xd:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Sd:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?Cd:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?Rd:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?wd:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?Pd:null:null}function Od(n){let e=qr(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function Id(n,e){let t=Xr(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let a=s?.codingPlanAppCredentialDTO||s?.appCredential||s,i=String(a?.apiKey||a?.api_key||"").trim();return i&&o.some(c=>c.includes(i)||i.includes(c))})||t[0]}function Xr(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>Xr(e)):Object.values(n).flatMap(e=>Xr(e))}function Zr(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function qr(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function N(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim().replace(/,/g,"");if(!e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}var pe,zr,Br,Jr,Wr,Kr,gd,hd,yd,bd,Gr,Vr,Qr,Yr,vd,xd,Sd,Cd,Rd,wd,Pd,Ed,Ad,es=w(()=>{"use strict";ae();pe=class{async fetchJson(e,t,o,r,s){let a=s||t.apiKey;if(!a)return null;let i={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${a}`},signal:AbortSignal.timeout(o)};try{r&&(i.dispatcher=Y(r));let c=await fetch(e,i);return c.ok?await c.json():null}catch{return null}}hasQuotaData(e){return e.totalBalance!==void 0||e.usedBalance!==void 0||e.remainingBalance!==void 0||e.usedDailyBalance!==void 0||e.limitDaily!==void 0||e.resetTime!==void 0}},zr=class extends pe{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),a=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(c=>N(c?.total_balance)!==void 0);if(!a)return null;let i=N(a.total_balance);return i===void 0?null:{totalBalance:i,currency:typeof a.currency=="string"?a.currency:void 0}}},Br=class extends pe{async queryQuota(e,t,o){let s=(await this.fetchJson("https://openrouter.ai/api/v1/key",e,t,o))?.data;if(!s||typeof s!="object")return null;let a={},i=N(s.limit),c=N(s.limit_remaining),l=N(s.usage),u=N(s.usage_daily);return i!==void 0&&(a.totalBalance=i),c!==void 0&&(a.remainingBalance=c),l!==void 0&&(a.usedBalance=l),u!==void 0&&(a.usedDailyBalance=u),this.hasQuotaData(a)?a:null}},Jr=class extends pe{async queryQuota(e,t,o){let r=Od(e.baseUrl),a=(await this.fetchJson(r,e,t,o))?.data;if(!a||typeof a!="object")return null;let i={},c=N(a.totalBalance),l=N(a.balance);return c!==void 0&&(i.totalBalance=c),l!==void 0&&(i.remainingBalance=l),c!==void 0&&l!==void 0&&(i.usedBalance=Math.max(0,c-l)),this.hasQuotaData(i)?i:null}},Wr=class extends pe{async queryQuota(e,t,o){if(!e.apiKey)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:e.apiKey.trim()},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!a.ok)return null;let i=await a.json(),c=Array.isArray(i?.data?.limits)?i.data.limits:[],l=null,u=null,p=null;for(let m of c)m.type==="TOKENS_LIMIT"?m.unit===3?l=m:m.unit===6?u=m:l||(l=m):m.type==="TIME_LIMIT"&&(p=m);let d={};if(l){let m=N(l.currentValue),h=N(l.usage),f=N(l.remaining),g=N(l.percentage);m!==void 0?d.usedDailyBalance=m:g!==void 0&&(d.usedDailyBalance=g,d.limitDaily=100),h!==void 0?d.limitDaily=h:m!==void 0&&f!==void 0&&(d.limitDaily=m+f),l.nextResetTime&&(d.resetTime=new Date(l.nextResetTime).toISOString())}if(u){let m=N(u.currentValue),h=N(u.usage),f=N(u.remaining),g=N(u.percentage);m!==void 0?d.usedBalance=m:g!==void 0&&(d.usedBalance=g,d.totalBalance=100),h!==void 0?d.totalBalance=h:m!==void 0&&f!==void 0&&(d.totalBalance=m+f),u.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(u.nextResetTime).toISOString())}if(p){if(d.usedDailyBalance===void 0){let m=N(p.currentValue);m!==void 0&&(d.usedDailyBalance=m)}if(d.limitDaily===void 0){let m=N(p.usage),h=N(p.currentValue),f=N(p.remaining);m!==void 0?d.limitDaily=m:h!==void 0&&f!==void 0&&(d.limitDaily=h+f)}p.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(p.nextResetTime).toISOString())}return this.hasQuotaData(d)?d:null}catch{return null}}},Kr=class extends pe{async queryQuota(e,t,o){if(!e.quotaToken)return null;let r={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing",Cookie:e.quotaToken},signal:AbortSignal.timeout(t)},s=JSON.stringify({Api:"zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",V:"1.0",Data:{queryCodingPlanInstanceInfoRequest:{commodityCode:"sfm_codingplan_public_cn",onlyLatestOne:!0},cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=Y(o));let i=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:a});if(!i.ok)return null;let l=(await i.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(l)||l.length===0)return null;let u=l[0]?.codingPlanQuotaInfo;if(!u)return null;let p={},d=N(u.per5HourUsedQuota),m=N(u.per5HourTotalQuota);d!==void 0&&(p.usedDailyBalance=d),m!==void 0&&(p.limitDaily=m);let h=N(u.perWeekUsedQuota),f=N(u.perWeekTotalQuota);return h!==void 0&&(p.usedBalance=h),f!==void 0&&(p.totalBalance=f),this.hasQuotaData(p)?p:null}catch{return null}}};gd=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],hd=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],yd=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],bd=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];Gr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let a=await this.queryOfficialEndpoint(r,s,t,o);if(a)return a}catch{}return this.queryLegacyEndpoint(r,t,o)}return this.queryLegacyEndpoint(r,t,o)}async queryOfficialEndpoint(e,t,o,r){let s="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",a=Zr(e,"cna")||"",i=JSON.stringify({Api:s,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan#/efm/subscription/token-plan/personal",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN","X-Anonymous-Id":a}}}),c=new URLSearchParams({params:i,region:"cn-beijing",sec_token:t}).toString(),l={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan"},body:c,signal:AbortSignal.timeout(o)};try{r&&(l.dispatcher=Y(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,l);if(!u.ok)return null;let p=await u.json();return tc(p)}catch{return null}}async queryLegacyEndpoint(e,t,o){let r="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",s=JSON.stringify({Api:r,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString(),i={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/"},body:a,signal:AbortSignal.timeout(t)};try{o&&(i.dispatcher=Y(o));let c=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,i);if(!c.ok)return null;let l=await c.json();return tc(l)}catch{return null}}},Vr=class extends pe{async queryQuota(e,t,o){if(!e.quotaToken)return null;let s={method:"GET",headers:{Accept:"application/json","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://maas.xfyun.cn",Referer:"https://maas.xfyun.cn/packageSubscription",Authorization:(Zr(e.quotaToken,"atp-auth-token")||Zr(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!a.ok)return null;let i=await a.json();if(i?.succeed===!1||i?.failed===!0)return null;let c=Id(i,e.apiKey),l=c?.codingPlanUsageDTO||c?.usage||c;if(!l||typeof l!="object")return null;let u={},p=N(l.rp5hUsage),d=N(l.rp5hLimit);p!==void 0&&(u.usedDailyBalance=p),d!==void 0&&(u.limitDaily=d);let m=N(l.rpwUsage),h=N(l.rpwLimit);return m!==void 0&&(u.usedBalance=m),h!==void 0&&(u.totalBalance=h),u.remainingBalance===void 0&&h!==void 0&&m!==void 0&&(u.remainingBalance=Math.max(0,h-m)),this.hasQuotaData(u)?u:null}catch{return null}}},Qr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${r.trim()}`},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!a.ok)return null;let i=await a.json(),c={},l=Array.isArray(i?.limits)?i.limits:[];if(l.length>0&&l[0]?.detail){let p=l[0].detail,d=N(p.limit),m=N(p.remaining),h=p.resetTime;d!==void 0&&m!==void 0&&(c.usedDailyBalance=Math.max(0,d-m),c.limitDaily=d),h&&(c.resetTime=new Date(h).toISOString())}let u=i?.usage;if(u){let p=N(u.limit),d=N(u.remaining),m=N(u.used),h=u.resetTime;p!==void 0&&(c.totalBalance=p,m!==void 0?c.usedBalance=m:d!==void 0&&(c.usedBalance=Math.max(0,p-d),c.remainingBalance=d)),h&&(c.resetTime7d=new Date(h).toISOString(),c.resetTime||(c.resetTime=c.resetTime7d))}return this.hasQuotaData(c)?c:null}catch{return null}}},Yr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=qr(e.baseUrl)||"api.minimaxi.com",a=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let i=[`https://${a}/v1/token_plan/remains`,`https://${a}/v1/api/openplatform/coding_plan/remains`],c=null;for(let k of i)if(c=await this.fetchJson(k,e,t,o,r.trim()),c)break;if(!c)return null;if(c?.base_resp){let k=c.base_resp.status_code;if(k!==void 0&&k!==0)return null}let l=Array.isArray(c?.model_remains)?c.model_remains:[];if(l.length===0)return null;let u=l[0],p={},d=N(u.current_interval_total_count),m=N(u.current_interval_usage_count),h=N(u.current_interval_remaining_percent),f=N(u.end_time);d!==void 0&&m!==void 0&&d>0?(p.usedDailyBalance=Math.max(0,d-m),p.limitDaily=d):h!==void 0&&(p.limitDaily=100,p.usedDailyBalance=Math.max(0,100-h)),f&&(p.resetTime=new Date(f).toISOString());let g=N(u.current_weekly_total_count),y=N(u.current_weekly_usage_count),_=N(u.current_weekly_remaining_percent),b=N(u.weekly_end_time);return g!==void 0&&y!==void 0&&g>0?(p.usedBalance=Math.max(0,g-y),p.remainingBalance=y,p.totalBalance=g):_!==void 0&&(p.totalBalance=100,p.usedBalance=Math.max(0,100-_),p.remainingBalance=_),b&&!p.resetTime&&(p.resetTime=new Date(b).toISOString()),this.hasQuotaData(p)?p:null}catch{return null}}},vd=new zr,xd=new Br,Sd=new Jr,Cd=new Wr,Rd=new Kr,wd=new Gr,Pd=new Vr,Ed=new Qr,Ad=new Yr});function rc(n){return{[Md]:n,[Ld]:An}}function Qe(n){return typeof n.apiKey=="string"&&n.apiKey.startsWith("ccr-managed-")}function $d(n){return n===!0||n==="true"||n===1||n==="1"}function Dd(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function Fd(n){try{let e=new URL(n),t=e.pathname;return t.endsWith("/v1/messages")?t=t.slice(0,-12):t.endsWith("/messages")?t=t.slice(0,-9):t.endsWith("/v1/chat/completions")?t=t.slice(0,-20):t.endsWith("/chat/completions")&&(t=t.slice(0,-17)),t.endsWith("/v1")||(t=t.endsWith("/")?`${t}v1`:`${t}/v1`),e.pathname=`${t}/models`,e.toString()}catch{return null}}function Ud(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function ts(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o));if(Qe(n))return{success:!1,skipped:!0,error:ns,latencyMs:r()};let s=Fd(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let a={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(a.dispatcher=Y(t));let i=await fetch(s,a);if(i.headers&&Mt(n.name,n.baseUrl,i.headers),i.ok)return{success:!0,headers:i.headers,latencyMs:r()};if(i.status===429)return{success:!1,error:`HTTP 429: ${(await i.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:i.headers,latencyMs:r(),errorKind:"http"};if(i.status>=400&&i.status<500)return{success:!0,headers:i.headers,latencyMs:r()};let c=await i.text().catch(()=>"");return{success:!1,error:`HTTP ${i.status}: ${c.slice(0,100)}`,headers:i.headers,latencyMs:r(),errorKind:"http"}}catch(a){let i=a?.message||a?.toString()||"Unknown probe error",c=a?.name==="TimeoutError"||a?.name==="AbortError"||a?.code===20||a?.code==="ABORT_ERR";return{success:!1,error:i,latencyMs:r(),errorKind:c?"timeout":"network"}}}async function jd(n,e,t,o){if(Qe(n))return{success:!1,skipped:!0,error:ns};let r=n.wakeupModel||(Array.isArray(n.models)?n.models[0]:void 0);if(!r)return{success:!1,error:"No models configured for provider"};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||r.includes("claude");try{let i={"Content-Type":"application/json",...rc("scheduled-wakeup")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:r,messages:[{role:"user",content:"Wake up and acknowledge with a short greeting."}],max_tokens:10}),signal:AbortSignal.timeout(e)};t&&(c.dispatcher=Y(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown wake-up error"}}}async function Hd(n,e,t,o,r){if(Qe(n))return{success:!1,skipped:!0,error:ns};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||e.includes("claude");try{let i={"Content-Type":"application/json",...rc("rate-limit-probe")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(c.dispatcher=Y(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown ping error"}}}function os(n,e,t,o,r,s){return Ie||(Ie=new Gt(n,e,t,o,r,s)),Ie}function yt(n,e,t,o,r,s){let a=os(n,e,t,o,r,s);return a.start(),a}function Ao(){Ie&&Ie.stop()}function Oo(){Ie&&(Ie.stop(),Ie=null)}var Md,Ld,Nd,ns,Gt,Ie,Io=w(()=>{"use strict";ue();ot();es();at();ir();ae();Md="x-claude-code-router-source",Ld="x-claude-code-router-version";Nd={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};ns="Managed provider requires its plugin's authenticated model sync";Gt=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;resolveManagedRuntime;managedProbeTimer;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s,a){this.config={...Nd,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s,this.resolveManagedRuntime=a}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,a;t.success?a=s?"slow":"healthy":a=t.errorKind==="timeout"?"timeout":"error";let i=this.probeTelemetry.get(e),c={provider:e,latencyMs:t.latencyMs,status:a,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:i?.lastSuccessAt,source:o};return this.probeTelemetry.set(e,c),s&&this.logger?.warn?.(`Slow network detected for provider ${e}: probe took ${t.latencyMs} ms (threshold ${this.config.slowThresholdMs} ms)`),c}getProbeTelemetry(){return Array.from(this.probeTelemetry.values()).map(e=>({...e}))}getProviderProbeTelemetry(e){let t=this.probeTelemetry.get(e);return t?{...t}:void 0}start(){if(this.running)return;let e=this.isWakeupGloballyEnabled();!this.config.enabled&&!e||(this.running=!0,setTimeout(()=>{this.running&&(this.config.enabled&&(this.runQuotaProbe(),this.runHealthProbe(),this.runRateLimitProbe()),this.runScheduledWakeup())},this.config.initialDelayMs),this.config.enabled&&(this.quotaProbeTimer=setInterval(()=>this.runQuotaProbe(),this.config.quotaProbeIntervalMinutes*60*1e3),this.healthProbeTimer=setInterval(()=>this.runHealthProbe(),300*1e3),this.rateLimitProbeTimer=setInterval(()=>this.runRateLimitProbe(),120*1e3),this.managedProbeTimer=setInterval(()=>this.runManagedRecoveryProbe(),this.config.quotaProbeIntervalMinutes*60*1e3)),this.wakeupTimer=setInterval(()=>this.runScheduledWakeup(),60*1e3),this.logger?.info("Active probe service started"))}stop(){this.running=!1,this.quotaProbeTimer&&(clearInterval(this.quotaProbeTimer),this.quotaProbeTimer=void 0),this.healthProbeTimer&&(clearInterval(this.healthProbeTimer),this.healthProbeTimer=void 0),this.managedProbeTimer&&(clearInterval(this.managedProbeTimer),this.managedProbeTimer=void 0),this.rateLimitProbeTimer&&(clearInterval(this.rateLimitProbeTimer),this.rateLimitProbeTimer=void 0),this.wakeupTimer&&(clearInterval(this.wakeupTimer),this.wakeupTimer=void 0),this.logger?.info("Active probe service stopped")}async runQuotaProbe(){let e=this.getProviders().filter(s=>s?.name&&s.enabled!==!1&&!Qe(s)&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let a=Eo(s.baseUrl),i=Array.isArray(s.models)?s.models:[],c=this.resolveProxyUrl?.(s);if(!a){let l;try{l=new URL(s.baseUrl).hostname}catch{l=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(l?` (host: ${l})`:"")+" \u2014 skipping quota probe")}a&&o.push({provider:s.name,models:i,type:"quota-adapter",promise:a.queryQuota(s,this.config.probeTimeoutMs,c).then(l=>{if(l){Fn(s.name,l),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=l.limitDaily!==void 0&&l.usedDailyBalance!==void 0&&l.usedDailyBalance>=l.limitDaily,p=l.totalBalance!==void 0&&l.usedBalance!==void 0&&l.usedBalance>=l.totalBalance;if(u||p){let d=u?`Quota exhausted: 5h limit reached (${l.usedDailyBalance}/${l.limitDaily})`:`Quota exhausted: 7d balance depleted (${l.usedBalance}/${l.totalBalance})`;for(let m of i){if(t.getState(s.name,m)?.rateLimitUntil){this.logger?.debug?.(`Skip forceOpen for ${s.name} (${m}): already rate-limited with active cooldown`);continue}t.forceOpen(s.name,m,d)}this.logger?.warn?.(`${d} for ${s.name}, marked as unhealthy`)}else for(let d of i){let m=t.getState(s.name,d);m&&m.status==="open"&&m.lastError?.includes("Quota exhausted")&&(t.recover(s.name,d),this.logger?.info?.(`Quota recovered for ${s.name} (${d}), marked as healthy`))}}})}),Ud(s.baseUrl)&&o.push({provider:s.name,models:i,type:"rate-limit-headers",promise:ts(s,this.config.probeTimeoutMs,c).then(l=>{this.recordProbe(s.name,l,"rate-limit-headers")})})}if(o.length===0)return;this.logger?.debug?.(`Running quota probe with ${o.length} tasks for ${e.length} providers`);let r=await Promise.allSettled(o.map(s=>s.promise));for(let s=0;s<o.length;s++){let a=r[s];if(a.status==="rejected"){let i=o[s];this.logger?.warn?.(`Quota probe failed for ${i.provider} (${i.type}): ${a.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!Qe(r)&&!this.config.excludeProviders.includes(r.name));if(t.length===0)return;this.logger?.debug?.(`Running health probe for ${t.length} providers`);let o=await Promise.allSettled(t.map(r=>ts(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],a=o[r],i=Array.isArray(s.models)?s.models:[];if(a.status==="fulfilled"){let c=a.value;if(c.skipped)continue;if(this.recordProbe(s.name,c,"health"),c.success){let l=0;for(let u of i){let p=e.getState(s.name,u);if(p&&p.status==="open"){let d=p.lastError?.includes("Quota exhausted"),m=p.rateLimitUntil||p.lastError&&(p.lastError.includes("429")||p.lastError.toLowerCase().includes("rate limit")||p.lastError.toLowerCase().includes("rate_limit")||p.lastError.toLowerCase().includes("too many requests")||p.lastError.toLowerCase().includes("\u9650\u6D41"));if(d){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(m||p.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),l++}l>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let l of i)e.recordFailure(s.name,l,c.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${c.error}`)}}else{this.recordProbe(s.name,{success:!1,error:a.reason?.message||String(a.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let c of i)e.recordFailure(s.name,c,a.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${a.reason}`)}}}async runManagedRecoveryProbe(){let e=j();if(!this.resolveManagedRuntime)return;let t=e.getFailPoolModels();if(t.length===0)return;let o=new Map;for(let r of t){let[s,...a]=r.split(","),i=a.join(",");if(!s||!i)continue;let c=o.get(s)??[];c.push(i),o.set(s,c)}for(let[r,s]of o){let a=this.getProviders().find(d=>d?.name===r&&d.enabled!==!1);if(!a)continue;let i=this.resolveManagedRuntime(a);if(!i)continue;let c=s[0],l=e.getState(r,c);if(!l||l.status!=="open"||l.rateLimitUntil&&Date.now()<l.rateLimitUntil)continue;let u=Math.max(l.lastFailureTime??0,l.lastProbeTime??0);Date.now()-u<this.config.quotaProbeIntervalMinutes*6e4||!await this.probeManagedAccountState(r,i,a,c,s,e)||await this.probeManagedLiveness(r,i,a,c,s,e)}}async probeManagedAccountState(e,t,o,r,s,a){try{if(typeof t.probeAccountState=="function"){let i=await t.probeAccountState();return i&&i.available===!1?(a.recordProbeAttempt?.(e,r),typeof i.parkedUntil=="number"&&i.parkedUntil>Date.now()&&a.markParkedUntil?.(e,r,i.parkedUntil),this.logger?.debug?.(`Managed probe: ${e} account parked (${i.reason??"unavailable"}), skipping liveness`),!1):!0}return typeof t.ensureUsable=="function"&&await t.ensureUsable(),!0}catch(i){return a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed probe: ${e} account unusable (${i?.code||i?.message||i}), skipping liveness`),!1}}async probeManagedLiveness(e,t,o,r,s,a){let i=this.config.probeTimeoutMs,c={model:r,max_tokens:1,messages:[{role:"user",content:"ping"}],stream:!1},l=async()=>{let p=o.baseUrl||o.api_base_url;return await fetch(p,{method:"POST",headers:{"content-type":"application/json",...o.apiKey?{authorization:`Bearer ${o.apiKey}`}:{}},body:JSON.stringify(c),signal:AbortSignal.timeout(i)})},u={TIMEOUT:i};try{this.logger?.debug?.(`Managed liveness probe for ${e} (${r})`);let p=typeof t.probeLiveness=="function"?await t.probeLiveness({attempt:l,model:r,provider:o,config:u}):typeof t.dispatchRequest=="function"?await t.dispatchRequest({attempt:l,requestBody:c,config:u,provider:o}):await l();if(p?.ok){for(let d of s)a.recover(e,d);this.logger?.info?.(`Managed liveness probe succeeded for ${e}, restored ${s.length} model(s)`)}else a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe failed for ${e}: HTTP ${p?.status}`)}catch(p){a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe errored for ${e}: ${p?.message||p}`)}}async runRateLimitProbe(){let e=j(),t=e.getRateLimitedModels();if(t.length===0)return;let o=this.getProviders(),r=this.config.probeTimeoutMs;this.logger?.debug?.(`Running rate-limit recovery probe for ${t.length} model(s)`);for(let s of t){let[a,...i]=s.split(","),c=i.join(",");if(!a||!c)continue;let l=o.find(d=>d?.name===a);if(l&&Qe(l))continue;let u=e.getState(a,c);if(!u||!u.rateLimitUntil)continue;if(Date.now()>=u.rateLimitUntil){e.recover(a,c),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let p=o.find(d=>d?.name===a&&d.enabled!==!1);if(!p){this.logger?.warn?.(`Provider ${a} not found or disabled for rate-limit probe`);continue}try{let d=await Hd(p,c,r,this.resolveProxyUrl?.(p),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(a,c);else if(d.error&&(d.error.includes("429")||d.error.toLowerCase().includes("rate limit")||d.error.toLowerCase().includes("rate_limit")||d.error.toLowerCase().includes("too many requests")||d.error.toLowerCase().includes("\u9650\u6D41"))){let m=Date.now();u.rateLimitUntil&&u.rateLimitUntil>m?u.rateLimitUntil+=120*1e3:u.rateLimitUntil=m+120*1e3,this.logger?.debug?.(`Rate-limit probe for ${s} confirmed still limited, extending cooldown`)}else this.logger?.debug?.(`Rate-limit probe for ${s} returned non-rate-limit error: ${d.error?.slice(0,100)}`)}catch(d){this.logger?.warn?.(`Rate-limit probe exception for ${s}: ${d?.message||d}`)}}}async runScheduledWakeup(){if(!this.isWakeupGloballyEnabled())return;let e=this.getProviders().filter(i=>i?.name&&i.enabled!==!1&&!Qe(i)&&i.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=Dd(t),a=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let i of e){let c=i.wakeupTime||a,[l,u]=c.split(":"),p=parseInt(l,10),d=parseInt(u,10);if(isNaN(p)||isNaN(d))continue;let m=o>p||o===p&&r>=d,h=(p*60+d)*6e4-(o*60+r)*6e4,f=h>0&&h<=300*1e3;(m||f)&&!this.hasWakeupFiredToday(i.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${i.name} at ${c}`),jd(i,3e4,this.resolveProxyUrl?.(i),this.logger).then(g=>{g.success?this.logger?.info?.(`Successfully woke up provider ${i.name}`):this.logger?.error?.(`Failed to wake up provider ${i.name}: ${g.error}`)}).catch(g=>{this.logger?.error?.(`Error in wake-up task for ${i.name}: ${g}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?$d(this.getConfig("WAKEUP_ENABLED")):!1}hasWakeupFiredToday(e,t){return this.lastWakeupDate.get(e)===t?!0:(this.lastWakeupDate.set(e,t),!1)}async probeProviderManually(e){let o=this.getProviders().find(i=>i.name===e);if(!o)return this.logger?.warn?.(`Provider ${e} not found for manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} not found`};if(o.enabled===!1)return this.logger?.warn?.(`Provider ${e} is disabled, skipping manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} is disabled`};let r=await ts(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o));if(r.skipped)return{success:!1,skipped:!0,latencyMs:r.latencyMs,status:"skipped",isSlow:!1,error:r.error};let s=this.recordProbe(o.name,r,"manual"),a=Array.isArray(o.models)?o.models:[];if(r.success)for(let i of a)j().recordSuccess(o.name,i);else for(let i of a)j().recordFailure(o.name,i,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},Ie=null});var sc=w(()=>{"use strict"});var rs,bt,ic=w(()=>{"use strict";rs=class{plugins=new Map;pluginInstances=new Map;registerPlugin(e,t={}){this.pluginInstances.set(e.name,e),this.plugins.set(e.name,{name:e.name,enabled:t.enabled!==!1,options:t})}async enablePlugin(e,t){let o=this.plugins.get(e),r=this.pluginInstances.get(e);if(!o||!r)throw new Error(`Plugin ${e} not found`);o.enabled&&await t.register(r.register,o.options)}async enablePlugins(e){for(let[t,o]of this.plugins)if(o.enabled)try{await this.enablePlugin(t,e)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.error(`Failed to enable plugin ${t}: ${s}`)}}getPlugins(){return Array.from(this.plugins.values())}getPlugin(e){return this.pluginInstances.get(e)}hasPlugin(e){return this.pluginInstances.has(e)}isPluginEnabled(e){return this.plugins.get(e)?.enabled||!1}setPluginEnabled(e,t){let o=this.plugins.get(e);o&&(o.enabled=t)}removePlugin(e){this.plugins.delete(e),this.pluginInstances.delete(e)}clear(){this.plugins.clear(),this.pluginInstances.clear()}},bt=new rs});var le,ss=w(()=>{"use strict";le=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
309
- `);this.buffer=o.pop()||"";for(let r of o){let s=this.processLine(r);s&&t.enqueue(s)}},flush:e=>{if(this.buffer.trim()){let t=[];this.processLine(this.buffer.trim(),t),t.forEach(o=>e.enqueue(o))}Object.keys(this.currentEvent).length>0&&e.enqueue(this.currentEvent)}})}processLine(e,t){if(!e.trim()){if(Object.keys(this.currentEvent).length>0){let o={...this.currentEvent};return this.currentEvent={},t?(t.push(o),null):o}return null}if(e.startsWith("event:"))this.currentEvent.event=e.slice(6).trim();else if(e.startsWith("data:")){let o=e.slice(5).trim();if(o==="[DONE]")this.currentEvent.data={type:"done"};else try{this.currentEvent.data=JSON.parse(o)}catch{this.currentEvent.data={raw:o,error:"JSON parse failed"}}}else e.startsWith("id:")?this.currentEvent.id=e.slice(3).trim():e.startsWith("retry:")&&(this.currentEvent.retry=parseInt(e.slice(6).trim()));return null}}});var Ye,is=w(()=>{"use strict";Ye=class extends TransformStream{constructor(){super({transform:(e,t)=>{let o="";e.event&&(o+=`event: ${e.event}
307
+ Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.values(Ga).forEach(e=>{if("TransformerName"in e&&typeof e.TransformerName=="string")this.registerTransformer(e.TransformerName,e);else{let t=new e;t&&typeof t=="object"&&(t.logger=this.logger),this.registerTransformer(t.name,t)}})}catch(e){this.logger.error({error:e},"transformer regist error:")}}async loadFromConfig(){let e=this.configService.get("transformers",[]);for(let t of e)await this.registerTransformerFromConfig(t)}}});var Qa,Jt,Ya=R(()=>{"use strict";Qa=require("tiktoken"),Jt=class{type="tiktoken";name;encoding;constructor(e="cl100k_base"){this.name=`tiktoken-${e}`;try{this.encoding=(0,Qa.get_encoding)(e)}catch{throw new Error(`Failed to initialize tiktoken encoding: ${e}`)}}async initialize(){if(!this.encoding)throw new Error("Tiktoken encoding not initialized")}async countTokens(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");let o=0,{messages:r,system:s,tools:a}=e;return Array.isArray(r)&&r.forEach(i=>{typeof i.content=="string"?o+=t.encode(i.content).length:Array.isArray(i.content)&&i.content.forEach(c=>{if(c.type==="text")o+=t.encode(c.text).length;else if(c.type==="tool_use")o+=t.encode(JSON.stringify(c.input)).length;else if(c.type==="tool_result"){let l=c.content;if(Array.isArray(l))for(let u of l)u?.type!=="image"&&(o+=t.encode(u?.type==="text"?String(u.text??""):JSON.stringify(u)).length);else{let u=typeof l=="string"?l:JSON.stringify(l);o+=t.encode(u).length}}})}),typeof s=="string"?o+=t.encode(s).length:Array.isArray(s)&&s.forEach(i=>{i.type==="text"&&(typeof i.text=="string"?o+=t.encode(i.text).length:Array.isArray(i.text)&&i.text.forEach(c=>{o+=t.encode(c||"").length}))}),a&&a.forEach(i=>{i.description&&(o+=t.encode(i.name+i.description).length),i.input_schema&&(o+=t.encode(JSON.stringify(i.input_schema)).length)}),o}isInitialized(){return this.encoding!==void 0}encodeText(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");return Array.from(t.encode(e))}dispose(){this.encoding&&(this.encoding.free(),this.encoding=void 0)}}});var Wt,Xa,yt,Kt,Za,Ro,qa=R(()=>{"use strict";Wt=require("path"),Xa=require("os"),yt=require("fs"),Kt=require("fs"),Za=require("@huggingface/tokenizers"),Ro=class{type="huggingface";name;modelId;logger;options;tokenizer=null;cacheDir;safeModelName;constructor(e,t,o={}){this.modelId=e,this.logger=t,this.options=o,this.cacheDir=o.cacheDir||(0,Wt.join)((0,Xa.homedir)(),".claude-code-router",".huggingface"),this.safeModelName=e.replace(/\//g,"_").replace(/[^a-zA-Z0-9_-]/g,"_"),this.name=`huggingface-${e.split("/").pop()}`}getCachePaths(){let e=(0,Wt.join)(this.cacheDir,this.safeModelName);return{modelDir:e,tokenizerJson:(0,Wt.join)(e,"tokenizer.json"),tokenizerConfig:(0,Wt.join)(e,"tokenizer_config.json")}}ensureDir(e){(0,yt.existsSync)(e)||(0,yt.mkdirSync)(e,{recursive:!0})}async loadFromCache(){try{let e=this.getCachePaths();if(!(0,yt.existsSync)(e.tokenizerJson)||!(0,yt.existsSync)(e.tokenizerConfig))return null;let[t,o]=await Promise.all([Kt.promises.readFile(e.tokenizerJson,"utf-8"),Kt.promises.readFile(e.tokenizerConfig,"utf-8")]);return{tokenizerJson:JSON.parse(t),tokenizerConfig:JSON.parse(o)}}catch(e){return this.logger?.warn(`Failed to load from cache: ${e.message}`),null}}async downloadAndCache(){let e=this.getCachePaths(),t={json:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer.json`,config:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer_config.json`};this.logger?.info(`Downloading tokenizer files for ${this.modelId}`);let o=new AbortController,r=setTimeout(()=>o.abort(),this.options.timeout||3e4);try{let[s,a]=await Promise.all([fetch(t.json,{signal:o.signal}),fetch(t.config,{signal:o.signal})]);if(!s.ok)throw new Error(`Failed to fetch tokenizer.json: ${s.statusText}`);let[i,c]=await Promise.all([s.json(),a.ok?a.json():Promise.resolve({})]);return this.ensureDir(e.modelDir),await Promise.all([Kt.promises.writeFile(e.tokenizerJson,JSON.stringify(i,null,2)),Kt.promises.writeFile(e.tokenizerConfig,JSON.stringify(c,null,2))]),{tokenizerJson:i,tokenizerConfig:c}}finally{clearTimeout(r)}}async initialize(){try{this.logger?.info(`Initializing HuggingFace tokenizer: ${this.modelId}`);let e=this.getCachePaths();this.ensureDir(this.cacheDir);let t=await this.loadFromCache()||await this.downloadAndCache();this.tokenizer=new Za.Tokenizer(t.tokenizerJson,t.tokenizerConfig),this.logger?.info(`Tokenizer initialized: ${this.name}`)}catch(e){throw this.logger?.error(`Failed to initialize tokenizer: ${e.message}`),new Error(`Failed to initialize HuggingFace tokenizer for ${this.modelId}: ${e.message}`)}}async countTokens(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");try{let t=this.extractTextFromRequest(e);return this.tokenizer.encode(t).ids.length}catch(t){throw this.logger?.error(`Error counting tokens: ${t.message}`),t}}isInitialized(){return this.tokenizer!==null}encodeText(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");return this.tokenizer.encode(e).ids}dispose(){this.tokenizer=null}extractTextFromRequest(e){let t=[],{messages:o,system:r,tools:s}=e;if(Array.isArray(o)){for(let a of o)if(typeof a.content=="string")t.push(a.content);else if(Array.isArray(a.content)){for(let i of a.content)if(i.type==="text"&&i.text)t.push(i.text);else if(i.type==="tool_use"&&i.input)t.push(JSON.stringify(i.input));else if(i.type==="tool_result")if(Array.isArray(i.content))for(let c of i.content)c?.type!=="image"&&t.push(c?.type==="text"?String(c.text??""):JSON.stringify(c));else t.push(typeof i.content=="string"?i.content:JSON.stringify(i.content))}}if(typeof r=="string")t.push(r);else if(Array.isArray(r)){for(let a of r)if(a.type==="text"){if(typeof a.text=="string")t.push(a.text);else if(Array.isArray(a.text))for(let i of a.text)i&&t.push(i)}}if(s)for(let a of s)a.name&&t.push(a.name),a.description&&t.push(a.description),a.input_schema&&t.push(JSON.stringify(a.input_schema));return t.join(" ")}}});var wo,ec=R(()=>{"use strict";ae();wo=class{type="api";name;config;logger;options;constructor(e,t,o={}){if(!e.url||!e.apiKey)throw new Error("API tokenizer requires url and apiKey");this.config={url:e.url,apiKey:e.apiKey,requestFormat:e.requestFormat||"standard",responseField:e.responseField||"token_count",headers:e.headers||{}},this.logger=t,this.options=o;try{let r=new URL(e.url);this.name=`api-${r.hostname}`}catch{this.name=`api-${e.url}`}}async initialize(){try{new URL(this.config.url)}catch{throw new Error(`Invalid API URL: ${this.config.url}`)}}async countTokens(e){try{let t=this.formatRequestBody(e),o={"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,...this.config.headers},r=new AbortController,s=setTimeout(()=>r.abort(),this.options.timeout||3e4),a={method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal},i=this.options.resolveProxyUrl?.();i&&(a.dispatcher=Y(i));let c=await fetch(this.config.url,a);if(clearTimeout(s),!c.ok)throw new Error(`API tokenizer request failed: ${c.status} ${c.statusText}`);let l=await c.json();return this.extractTokenCount(l)}catch(t){throw t.name==="AbortError"?new Error("API tokenizer request timed out"):t}}isInitialized(){return!0}dispose(){}formatRequestBody(e){switch(this.config.requestFormat){case"standard":return e;case"openai":return{model:"gpt-3.5-turbo",messages:this.extractMessagesAsOpenAIFormat(e)};case"anthropic":return{messages:e.messages||[],system:e.system,tools:e.tools};case"custom":return{text:this.extractConcatenatedText(e)};default:return e}}extractMessagesAsOpenAIFormat(e){return e.messages?e.messages.map(t=>({role:t.role,content:this.extractTextFromMessage(t)})):[]}extractTextFromMessage(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.map(t=>t.type==="text"&&t.text?t.text:t.type==="tool_use"&&t.input?JSON.stringify(t.input):t.type==="tool_result"?Array.isArray(t.content)?t.content.filter(o=>o?.type!=="image").map(o=>o?.type==="text"?String(o.text??""):JSON.stringify(o)).join(`
308
+ `):typeof t.content=="string"?t.content:JSON.stringify(t.content):"").join(" "):""}extractConcatenatedText(e){let t=[];return e.messages&&e.messages.forEach(o=>{t.push(this.extractTextFromMessage(o))}),typeof e.system=="string"?t.push(e.system):Array.isArray(e.system)&&e.system.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?t.push(o.text):Array.isArray(o.text)&&o.text.forEach(r=>{r&&t.push(r)}))}),e.tools&&e.tools.forEach(o=>{o.name&&t.push(o.name),o.description&&t.push(o.description),o.input_schema&&t.push(JSON.stringify(o.input_schema))}),t.join(" ")}extractTokenCount(e){try{let t=this.config.responseField,o=t.split("."),r=e;for(let s of o){if(r==null)throw new Error(`Field path '${t}' not found in response`);r=r[s]}if(typeof r!="number")throw new Error(`Expected number at field path '${t}', got ${typeof r}`);return r}catch(t){throw this.logger?.error(`Failed to extract token count from API response: ${t.message}. Response: ${JSON.stringify(e)}`),new Error(`Invalid response from API tokenizer: ${t.message}`)}}}});var Ve,Hr=R(()=>{"use strict";Ya();qa();ec();ae();Ve=class{tokenizers=new Map;configService;logger;options;fallbackTokenizer;constructor(e,t,o={}){this.configService=e,this.logger=t,this.options={timeout:o.timeout??3e4,...o}}async initialize(){try{this.fallbackTokenizer=new Jt("cl100k_base"),await this.fallbackTokenizer.initialize(),this.tokenizers.set("fallback",this.fallbackTokenizer),this.logger?.info("TokenizerService initialized successfully")}catch(e){throw this.logger?.error(`TokenizerService initialization error: ${e.message}`),e}}async getTokenizer(e,t){let o=this.getCacheKey(e,t);if(this.tokenizers.has(o))return this.tokenizers.get(o);let r;try{switch(e.type){case"tiktoken":r=new Jt(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new Ro(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new wo(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return ge(this.configService,s)}});break;default:throw new Error(`Unknown tokenizer type: ${e.type}`)}return this.logger?.info(`Calling initialize() on ${e.type} tokenizer...`),await r.initialize(),this.tokenizers.set(o,r),this.logger?.info(`Tokenizer initialized successfully: ${e.type} (${o})`),r}catch(s){return this.logger?.error(`Failed to initialize ${e.type} tokenizer: ${s.message}`),this.logger?.error(`Error stack: ${s.stack}`),this.fallbackTokenizer||await this.initialize(),this.fallbackTokenizer}}async countTokens(e,t,o){let r=t?await this.getTokenizer(t,o):this.fallbackTokenizer;return{tokenCount:await r.countTokens(e),tokenizerUsed:r.name,cached:!1}}getTokenizerConfigForModel(e,t){let r=(this.configService.get("providers")||[]).find(s=>s.name===e);if(r?.tokenizer)return r.tokenizer.models?.[t]?r.tokenizer.models[t]:r.tokenizer.default}dispose(){this.tokenizers.forEach(e=>{try{e.dispose()}catch(t){this.logger?.error(`Error disposing tokenizer: ${t}`)}}),this.tokenizers.clear()}getCacheKey(e,t){switch(e.type){case"tiktoken":return`tiktoken:${e.encoding||"cl100k_base"}`;case"huggingface":return`hf:${e.model}`;case"api":return`api:${t||"unscoped"}:${e.url}`;default:return`unknown:${JSON.stringify(e)}`}}getRawProvider(e){return(this.configService.get("providers")||[]).find(o=>o?.name===e)}}});function tc(n){if(!n||typeof n!="object"||vd(n))return null;for(let t of Td(n)){let o=kd(t);if(o)return o}return null}function kd(n){if(!n||typeof n!="object")return null;let e={},t=Po(n,hd);if(t!==void 0){let a=nc(t);e.usedDailyBalance=a,e.limitDaily=100}let o=Po(n,yd);if(o!==void 0){let a=nc(o);e.usedBalance=a,e.totalBalance=100}let r=Po(n,_d);if(r!==void 0){let a=oc(r);a&&(e.resetTime=a)}let s=Po(n,bd);if(s!==void 0){let a=oc(s);a&&(e.resetTime7d=a,e.resetTime||(e.resetTime=a))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function nc(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function Po(n,e){for(let t of e){let o=N(n?.[t]);if(o!==void 0)return o}}function Td(n){let e=[],t=new WeakSet,o=["data","Data","DataV2"],r=s=>{if(!(!s||typeof s!="object")&&!t.has(s)){t.add(s),e.push(s);for(let a of o)s[a]&&typeof s[a]=="object"&&r(s[a])}};return r(n),e}function vd(n){let e=n?.data;return e&&typeof e=="object"&&(e.success===!1||e.errorCode||e.errorMsg)?String(e.errorCode||e.errorMsg||"gateway-error"):null}function oc(n){if(typeof n!="string"&&typeof n!="number")return;let e=n;if(typeof n=="number"&&n<1e12&&(e=n*1e3),typeof n=="string"){let o=Number(n.trim());Number.isFinite(o)&&o<1e12&&(e=o*1e3)}let t=new Date(e);return isNaN(t.getTime())?void 0:t.toISOString()}function Eo(n){let e=qr(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?Ad:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?Od:e==="deepseek.com"||e.endsWith(".deepseek.com")?xd:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?Sd:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Cd:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?Rd:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?wd:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?Pd:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?Ed:null:null}function Id(n){let e=qr(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function Md(n,e){let t=Xr(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let a=s?.codingPlanAppCredentialDTO||s?.appCredential||s,i=String(a?.apiKey||a?.api_key||"").trim();return i&&o.some(c=>c.includes(i)||i.includes(c))})||t[0]}function Xr(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>Xr(e)):Object.values(n).flatMap(e=>Xr(e))}function Zr(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function qr(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function N(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim().replace(/,/g,"");if(!e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}var pe,zr,Br,Jr,Wr,Kr,hd,yd,_d,bd,Gr,Vr,Qr,Yr,xd,Sd,Cd,Rd,wd,Pd,Ed,Ad,Od,es=R(()=>{"use strict";ae();pe=class{async fetchJson(e,t,o,r,s){let a=s||t.apiKey;if(!a)return null;let i={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${a}`},signal:AbortSignal.timeout(o)};try{r&&(i.dispatcher=Y(r));let c=await fetch(e,i);return c.ok?await c.json():null}catch{return null}}hasQuotaData(e){return e.totalBalance!==void 0||e.usedBalance!==void 0||e.remainingBalance!==void 0||e.usedDailyBalance!==void 0||e.limitDaily!==void 0||e.resetTime!==void 0}},zr=class extends pe{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),a=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(c=>N(c?.total_balance)!==void 0);if(!a)return null;let i=N(a.total_balance);return i===void 0?null:{totalBalance:i,currency:typeof a.currency=="string"?a.currency:void 0}}},Br=class extends pe{async queryQuota(e,t,o){let s=(await this.fetchJson("https://openrouter.ai/api/v1/key",e,t,o))?.data;if(!s||typeof s!="object")return null;let a={},i=N(s.limit),c=N(s.limit_remaining),l=N(s.usage),u=N(s.usage_daily);return i!==void 0&&(a.totalBalance=i),c!==void 0&&(a.remainingBalance=c),l!==void 0&&(a.usedBalance=l),u!==void 0&&(a.usedDailyBalance=u),this.hasQuotaData(a)?a:null}},Jr=class extends pe{async queryQuota(e,t,o){let r=Id(e.baseUrl),a=(await this.fetchJson(r,e,t,o))?.data;if(!a||typeof a!="object")return null;let i={},c=N(a.totalBalance),l=N(a.balance);return c!==void 0&&(i.totalBalance=c),l!==void 0&&(i.remainingBalance=l),c!==void 0&&l!==void 0&&(i.usedBalance=Math.max(0,c-l)),this.hasQuotaData(i)?i:null}},Wr=class extends pe{async queryQuota(e,t,o){if(!e.apiKey)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:e.apiKey.trim()},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!a.ok)return null;let i=await a.json(),c=Array.isArray(i?.data?.limits)?i.data.limits:[],l=null,u=null,p=null;for(let f of c)f.type==="TOKENS_LIMIT"?f.unit===3?l=f:f.unit===6?u=f:l||(l=f):f.type==="TIME_LIMIT"&&(p=f);let d={};if(l){let f=N(l.currentValue),h=N(l.usage),g=N(l.remaining),m=N(l.percentage);f!==void 0?d.usedDailyBalance=f:m!==void 0&&(d.usedDailyBalance=m,d.limitDaily=100),h!==void 0?d.limitDaily=h:f!==void 0&&g!==void 0&&(d.limitDaily=f+g),l.nextResetTime&&(d.resetTime=new Date(l.nextResetTime).toISOString())}if(u){let f=N(u.currentValue),h=N(u.usage),g=N(u.remaining),m=N(u.percentage);f!==void 0?d.usedBalance=f:m!==void 0&&(d.usedBalance=m,d.totalBalance=100),h!==void 0?d.totalBalance=h:f!==void 0&&g!==void 0&&(d.totalBalance=f+g),u.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(u.nextResetTime).toISOString())}if(p){if(d.usedDailyBalance===void 0){let f=N(p.currentValue);f!==void 0&&(d.usedDailyBalance=f)}if(d.limitDaily===void 0){let f=N(p.usage),h=N(p.currentValue),g=N(p.remaining);f!==void 0?d.limitDaily=f:h!==void 0&&g!==void 0&&(d.limitDaily=h+g)}p.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(p.nextResetTime).toISOString())}return this.hasQuotaData(d)?d:null}catch{return null}}},Kr=class extends pe{async queryQuota(e,t,o){if(!e.quotaToken)return null;let r={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing",Cookie:e.quotaToken},signal:AbortSignal.timeout(t)},s=JSON.stringify({Api:"zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",V:"1.0",Data:{queryCodingPlanInstanceInfoRequest:{commodityCode:"sfm_codingplan_public_cn",onlyLatestOne:!0},cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=Y(o));let i=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:a});if(!i.ok)return null;let l=(await i.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(l)||l.length===0)return null;let u=l[0]?.codingPlanQuotaInfo;if(!u)return null;let p={},d=N(u.per5HourUsedQuota),f=N(u.per5HourTotalQuota);d!==void 0&&(p.usedDailyBalance=d),f!==void 0&&(p.limitDaily=f);let h=N(u.perWeekUsedQuota),g=N(u.perWeekTotalQuota);return h!==void 0&&(p.usedBalance=h),g!==void 0&&(p.totalBalance=g),this.hasQuotaData(p)?p:null}catch{return null}}};hd=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],yd=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],_d=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],bd=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];Gr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let a=await this.queryOfficialEndpoint(r,s,t,o);if(a)return a}catch{}return this.queryLegacyEndpoint(r,t,o)}return this.queryLegacyEndpoint(r,t,o)}async queryOfficialEndpoint(e,t,o,r){let s="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",a=Zr(e,"cna")||"",i=JSON.stringify({Api:s,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan#/efm/subscription/token-plan/personal",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN","X-Anonymous-Id":a}}}),c=new URLSearchParams({params:i,region:"cn-beijing",sec_token:t}).toString(),l={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan"},body:c,signal:AbortSignal.timeout(o)};try{r&&(l.dispatcher=Y(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,l);if(!u.ok)return null;let p=await u.json();return tc(p)}catch{return null}}async queryLegacyEndpoint(e,t,o){let r="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",s=JSON.stringify({Api:r,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString(),i={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/"},body:a,signal:AbortSignal.timeout(t)};try{o&&(i.dispatcher=Y(o));let c=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,i);if(!c.ok)return null;let l=await c.json();return tc(l)}catch{return null}}},Vr=class extends pe{async queryQuota(e,t,o){if(!e.quotaToken)return null;let s={method:"GET",headers:{Accept:"application/json","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://maas.xfyun.cn",Referer:"https://maas.xfyun.cn/packageSubscription",Authorization:(Zr(e.quotaToken,"atp-auth-token")||Zr(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!a.ok)return null;let i=await a.json();if(i?.succeed===!1||i?.failed===!0)return null;let c=Md(i,e.apiKey),l=c?.codingPlanUsageDTO||c?.usage||c;if(!l||typeof l!="object")return null;let u={},p=N(l.rp5hUsage),d=N(l.rp5hLimit);p!==void 0&&(u.usedDailyBalance=p),d!==void 0&&(u.limitDaily=d);let f=N(l.rpwUsage),h=N(l.rpwLimit);return f!==void 0&&(u.usedBalance=f),h!==void 0&&(u.totalBalance=h),u.remainingBalance===void 0&&h!==void 0&&f!==void 0&&(u.remainingBalance=Math.max(0,h-f)),this.hasQuotaData(u)?u:null}catch{return null}}},Qr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${r.trim()}`},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=Y(o));let a=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!a.ok)return null;let i=await a.json(),c={},l=Array.isArray(i?.limits)?i.limits:[];if(l.length>0&&l[0]?.detail){let p=l[0].detail,d=N(p.limit),f=N(p.remaining),h=p.resetTime;d!==void 0&&f!==void 0&&(c.usedDailyBalance=Math.max(0,d-f),c.limitDaily=d),h&&(c.resetTime=new Date(h).toISOString())}let u=i?.usage;if(u){let p=N(u.limit),d=N(u.remaining),f=N(u.used),h=u.resetTime;p!==void 0&&(c.totalBalance=p,f!==void 0?c.usedBalance=f:d!==void 0&&(c.usedBalance=Math.max(0,p-d),c.remainingBalance=d)),h&&(c.resetTime7d=new Date(h).toISOString(),c.resetTime||(c.resetTime=c.resetTime7d))}return this.hasQuotaData(c)?c:null}catch{return null}}},Yr=class extends pe{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=qr(e.baseUrl)||"api.minimaxi.com",a=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let i=[`https://${a}/v1/token_plan/remains`,`https://${a}/v1/api/openplatform/coding_plan/remains`],c=null;for(let k of i)if(c=await this.fetchJson(k,e,t,o,r.trim()),c)break;if(!c)return null;if(c?.base_resp){let k=c.base_resp.status_code;if(k!==void 0&&k!==0)return null}let l=Array.isArray(c?.model_remains)?c.model_remains:[];if(l.length===0)return null;let u=l[0],p={},d=N(u.current_interval_total_count),f=N(u.current_interval_usage_count),h=N(u.current_interval_remaining_percent),g=N(u.end_time);d!==void 0&&f!==void 0&&d>0?(p.usedDailyBalance=Math.max(0,d-f),p.limitDaily=d):h!==void 0&&(p.limitDaily=100,p.usedDailyBalance=Math.max(0,100-h)),g&&(p.resetTime=new Date(g).toISOString());let m=N(u.current_weekly_total_count),_=N(u.current_weekly_usage_count),b=N(u.current_weekly_remaining_percent),y=N(u.weekly_end_time);return m!==void 0&&_!==void 0&&m>0?(p.usedBalance=Math.max(0,m-_),p.remainingBalance=_,p.totalBalance=m):b!==void 0&&(p.totalBalance=100,p.usedBalance=Math.max(0,100-b),p.remainingBalance=b),y&&!p.resetTime&&(p.resetTime=new Date(y).toISOString()),this.hasQuotaData(p)?p:null}catch{return null}}},xd=new zr,Sd=new Br,Cd=new Jr,Rd=new Wr,wd=new Kr,Pd=new Gr,Ed=new Vr,Ad=new Qr,Od=new Yr});function rc(n){return{[Ld]:n,[Nd]:An}}function Qe(n){return typeof n.apiKey=="string"&&n.apiKey.startsWith("ccr-managed-")}function Dd(n){return n===!0||n==="true"||n===1||n==="1"}function Fd(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function Ud(n){try{let e=new URL(n),t=e.pathname;return t.endsWith("/v1/messages")?t=t.slice(0,-12):t.endsWith("/messages")?t=t.slice(0,-9):t.endsWith("/v1/chat/completions")?t=t.slice(0,-20):t.endsWith("/chat/completions")&&(t=t.slice(0,-17)),t.endsWith("/v1")||(t=t.endsWith("/")?`${t}v1`:`${t}/v1`),e.pathname=`${t}/models`,e.toString()}catch{return null}}function jd(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function ts(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o));if(Qe(n))return{success:!1,skipped:!0,error:ns,latencyMs:r()};let s=Ud(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let a={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(a.dispatcher=Y(t));let i=await fetch(s,a);if(i.headers&&Mt(n.name,n.baseUrl,i.headers),i.ok)return{success:!0,headers:i.headers,latencyMs:r()};if(i.status===429)return{success:!1,error:`HTTP 429: ${(await i.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:i.headers,latencyMs:r(),errorKind:"http"};if(i.status>=400&&i.status<500)return{success:!0,headers:i.headers,latencyMs:r()};let c=await i.text().catch(()=>"");return{success:!1,error:`HTTP ${i.status}: ${c.slice(0,100)}`,headers:i.headers,latencyMs:r(),errorKind:"http"}}catch(a){let i=a?.message||a?.toString()||"Unknown probe error",c=a?.name==="TimeoutError"||a?.name==="AbortError"||a?.code===20||a?.code==="ABORT_ERR";return{success:!1,error:i,latencyMs:r(),errorKind:c?"timeout":"network"}}}async function Hd(n,e,t,o){if(Qe(n))return{success:!1,skipped:!0,error:ns};let r=n.wakeupModel||(Array.isArray(n.models)?n.models[0]:void 0);if(!r)return{success:!1,error:"No models configured for provider"};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||r.includes("claude");try{let i={"Content-Type":"application/json",...rc("scheduled-wakeup")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:r,messages:[{role:"user",content:"Wake up and acknowledge with a short greeting."}],max_tokens:10}),signal:AbortSignal.timeout(e)};t&&(c.dispatcher=Y(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown wake-up error"}}}async function zd(n,e,t,o,r){if(Qe(n))return{success:!1,skipped:!0,error:ns};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||e.includes("claude");try{let i={"Content-Type":"application/json",...rc("rate-limit-probe")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(c.dispatcher=Y(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown ping error"}}}function os(n,e,t,o,r,s){return Ie||(Ie=new Gt(n,e,t,o,r,s)),Ie}function _t(n,e,t,o,r,s){let a=os(n,e,t,o,r,s);return a.start(),a}function Ao(){Ie&&Ie.stop()}function Oo(){Ie&&(Ie.stop(),Ie=null)}var Ld,Nd,$d,ns,Gt,Ie,Io=R(()=>{"use strict";ue();rt();es();ct();ir();ae();Ld="x-claude-code-router-source",Nd="x-claude-code-router-version";$d={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};ns="Managed provider requires its plugin's authenticated model sync";Gt=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;resolveManagedRuntime;managedProbeTimer;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s,a){this.config={...$d,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s,this.resolveManagedRuntime=a}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,a;t.success?a=s?"slow":"healthy":a=t.errorKind==="timeout"?"timeout":"error";let i=this.probeTelemetry.get(e),c={provider:e,latencyMs:t.latencyMs,status:a,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:i?.lastSuccessAt,source:o};return this.probeTelemetry.set(e,c),s&&this.logger?.warn?.(`Slow network detected for provider ${e}: probe took ${t.latencyMs} ms (threshold ${this.config.slowThresholdMs} ms)`),c}getProbeTelemetry(){return Array.from(this.probeTelemetry.values()).map(e=>({...e}))}getProviderProbeTelemetry(e){let t=this.probeTelemetry.get(e);return t?{...t}:void 0}start(){if(this.running)return;let e=this.isWakeupGloballyEnabled();!this.config.enabled&&!e||(this.running=!0,setTimeout(()=>{this.running&&(this.config.enabled&&(this.runQuotaProbe(),this.runHealthProbe(),this.runRateLimitProbe()),this.runScheduledWakeup())},this.config.initialDelayMs),this.config.enabled&&(this.quotaProbeTimer=setInterval(()=>this.runQuotaProbe(),this.config.quotaProbeIntervalMinutes*60*1e3),this.healthProbeTimer=setInterval(()=>this.runHealthProbe(),300*1e3),this.rateLimitProbeTimer=setInterval(()=>this.runRateLimitProbe(),120*1e3),this.managedProbeTimer=setInterval(()=>this.runManagedRecoveryProbe(),this.config.quotaProbeIntervalMinutes*60*1e3)),this.wakeupTimer=setInterval(()=>this.runScheduledWakeup(),60*1e3),this.logger?.info("Active probe service started"))}stop(){this.running=!1,this.quotaProbeTimer&&(clearInterval(this.quotaProbeTimer),this.quotaProbeTimer=void 0),this.healthProbeTimer&&(clearInterval(this.healthProbeTimer),this.healthProbeTimer=void 0),this.managedProbeTimer&&(clearInterval(this.managedProbeTimer),this.managedProbeTimer=void 0),this.rateLimitProbeTimer&&(clearInterval(this.rateLimitProbeTimer),this.rateLimitProbeTimer=void 0),this.wakeupTimer&&(clearInterval(this.wakeupTimer),this.wakeupTimer=void 0),this.logger?.info("Active probe service stopped")}async runQuotaProbe(){let e=this.getProviders().filter(s=>s?.name&&s.enabled!==!1&&!Qe(s)&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let a=Eo(s.baseUrl),i=Array.isArray(s.models)?s.models:[],c=this.resolveProxyUrl?.(s);if(!a){let l;try{l=new URL(s.baseUrl).hostname}catch{l=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(l?` (host: ${l})`:"")+" \u2014 skipping quota probe")}a&&o.push({provider:s.name,models:i,type:"quota-adapter",promise:a.queryQuota(s,this.config.probeTimeoutMs,c).then(l=>{if(l){Fn(s.name,l),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=l.limitDaily!==void 0&&l.usedDailyBalance!==void 0&&l.usedDailyBalance>=l.limitDaily,p=l.totalBalance!==void 0&&l.usedBalance!==void 0&&l.usedBalance>=l.totalBalance;if(u||p){let d=u?`Quota exhausted: 5h limit reached (${l.usedDailyBalance}/${l.limitDaily})`:`Quota exhausted: 7d balance depleted (${l.usedBalance}/${l.totalBalance})`;for(let f of i){if(t.getState(s.name,f)?.rateLimitUntil){this.logger?.debug?.(`Skip forceOpen for ${s.name} (${f}): already rate-limited with active cooldown`);continue}t.forceOpen(s.name,f,d)}this.logger?.warn?.(`${d} for ${s.name}, marked as unhealthy`)}else for(let d of i){let f=t.getState(s.name,d);f&&f.status==="open"&&f.lastError?.includes("Quota exhausted")&&(t.recover(s.name,d),this.logger?.info?.(`Quota recovered for ${s.name} (${d}), marked as healthy`))}}})}),jd(s.baseUrl)&&o.push({provider:s.name,models:i,type:"rate-limit-headers",promise:ts(s,this.config.probeTimeoutMs,c).then(l=>{this.recordProbe(s.name,l,"rate-limit-headers")})})}if(o.length===0)return;this.logger?.debug?.(`Running quota probe with ${o.length} tasks for ${e.length} providers`);let r=await Promise.allSettled(o.map(s=>s.promise));for(let s=0;s<o.length;s++){let a=r[s];if(a.status==="rejected"){let i=o[s];this.logger?.warn?.(`Quota probe failed for ${i.provider} (${i.type}): ${a.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!Qe(r)&&!this.config.excludeProviders.includes(r.name));if(t.length===0)return;this.logger?.debug?.(`Running health probe for ${t.length} providers`);let o=await Promise.allSettled(t.map(r=>ts(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],a=o[r],i=Array.isArray(s.models)?s.models:[];if(a.status==="fulfilled"){let c=a.value;if(c.skipped)continue;if(this.recordProbe(s.name,c,"health"),c.success){let l=0;for(let u of i){let p=e.getState(s.name,u);if(p&&p.status==="open"){let d=p.lastError?.includes("Quota exhausted"),f=p.rateLimitUntil||p.lastError&&(p.lastError.includes("429")||p.lastError.toLowerCase().includes("rate limit")||p.lastError.toLowerCase().includes("rate_limit")||p.lastError.toLowerCase().includes("too many requests")||p.lastError.toLowerCase().includes("\u9650\u6D41"));if(d){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(f||p.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),l++}l>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let l of i)e.recordFailure(s.name,l,c.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${c.error}`)}}else{this.recordProbe(s.name,{success:!1,error:a.reason?.message||String(a.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let c of i)e.recordFailure(s.name,c,a.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${a.reason}`)}}}async runManagedRecoveryProbe(){let e=j();if(!this.resolveManagedRuntime)return;let t=e.getFailPoolModels();if(t.length===0)return;let o=new Map;for(let r of t){let[s,...a]=r.split(","),i=a.join(",");if(!s||!i)continue;let c=o.get(s)??[];c.push(i),o.set(s,c)}for(let[r,s]of o){let a=this.getProviders().find(d=>d?.name===r&&d.enabled!==!1);if(!a)continue;let i=this.resolveManagedRuntime(a);if(!i)continue;let c=s[0],l=e.getState(r,c);if(!l||l.status!=="open"||l.rateLimitUntil&&Date.now()<l.rateLimitUntil)continue;let u=Math.max(l.lastFailureTime??0,l.lastProbeTime??0);Date.now()-u<this.config.quotaProbeIntervalMinutes*6e4||!await this.probeManagedAccountState(r,i,a,c,s,e)||await this.probeManagedLiveness(r,i,a,c,s,e)}}async probeManagedAccountState(e,t,o,r,s,a){try{if(typeof t.probeAccountState=="function"){let i=await t.probeAccountState();return i&&i.available===!1?(a.recordProbeAttempt?.(e,r),typeof i.parkedUntil=="number"&&i.parkedUntil>Date.now()&&a.markParkedUntil?.(e,r,i.parkedUntil),this.logger?.debug?.(`Managed probe: ${e} account parked (${i.reason??"unavailable"}), skipping liveness`),!1):!0}return typeof t.ensureUsable=="function"&&await t.ensureUsable(),!0}catch(i){return a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed probe: ${e} account unusable (${i?.code||i?.message||i}), skipping liveness`),!1}}async probeManagedLiveness(e,t,o,r,s,a){let i=this.config.probeTimeoutMs,c={model:r,max_tokens:1,messages:[{role:"user",content:"ping"}],stream:!1},l=async()=>{let p=o.baseUrl||o.api_base_url;return await fetch(p,{method:"POST",headers:{"content-type":"application/json",...o.apiKey?{authorization:`Bearer ${o.apiKey}`}:{}},body:JSON.stringify(c),signal:AbortSignal.timeout(i)})},u={TIMEOUT:i};try{this.logger?.debug?.(`Managed liveness probe for ${e} (${r})`);let p=typeof t.probeLiveness=="function"?await t.probeLiveness({attempt:l,model:r,provider:o,config:u}):typeof t.dispatchRequest=="function"?await t.dispatchRequest({attempt:l,requestBody:c,config:u,provider:o}):await l();if(p?.ok){for(let d of s)a.recover(e,d);this.logger?.info?.(`Managed liveness probe succeeded for ${e}, restored ${s.length} model(s)`)}else a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe failed for ${e}: HTTP ${p?.status}`)}catch(p){a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe errored for ${e}: ${p?.message||p}`)}}async runRateLimitProbe(){let e=j(),t=e.getRateLimitedModels();if(t.length===0)return;let o=this.getProviders(),r=this.config.probeTimeoutMs;this.logger?.debug?.(`Running rate-limit recovery probe for ${t.length} model(s)`);for(let s of t){let[a,...i]=s.split(","),c=i.join(",");if(!a||!c)continue;let l=o.find(d=>d?.name===a);if(l&&Qe(l))continue;let u=e.getState(a,c);if(!u||!u.rateLimitUntil)continue;if(Date.now()>=u.rateLimitUntil){e.recover(a,c),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let p=o.find(d=>d?.name===a&&d.enabled!==!1);if(!p){this.logger?.warn?.(`Provider ${a} not found or disabled for rate-limit probe`);continue}try{let d=await zd(p,c,r,this.resolveProxyUrl?.(p),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(a,c);else if(d.error&&(d.error.includes("429")||d.error.toLowerCase().includes("rate limit")||d.error.toLowerCase().includes("rate_limit")||d.error.toLowerCase().includes("too many requests")||d.error.toLowerCase().includes("\u9650\u6D41"))){let f=Date.now();u.rateLimitUntil&&u.rateLimitUntil>f?u.rateLimitUntil+=120*1e3:u.rateLimitUntil=f+120*1e3,this.logger?.debug?.(`Rate-limit probe for ${s} confirmed still limited, extending cooldown`)}else this.logger?.debug?.(`Rate-limit probe for ${s} returned non-rate-limit error: ${d.error?.slice(0,100)}`)}catch(d){this.logger?.warn?.(`Rate-limit probe exception for ${s}: ${d?.message||d}`)}}}async runScheduledWakeup(){if(!this.isWakeupGloballyEnabled())return;let e=this.getProviders().filter(i=>i?.name&&i.enabled!==!1&&!Qe(i)&&i.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=Fd(t),a=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let i of e){let c=i.wakeupTime||a,[l,u]=c.split(":"),p=parseInt(l,10),d=parseInt(u,10);if(isNaN(p)||isNaN(d))continue;let f=o>p||o===p&&r>=d,h=(p*60+d)*6e4-(o*60+r)*6e4,g=h>0&&h<=300*1e3;(f||g)&&!this.hasWakeupFiredToday(i.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${i.name} at ${c}`),Hd(i,3e4,this.resolveProxyUrl?.(i),this.logger).then(m=>{m.success?this.logger?.info?.(`Successfully woke up provider ${i.name}`):this.logger?.error?.(`Failed to wake up provider ${i.name}: ${m.error}`)}).catch(m=>{this.logger?.error?.(`Error in wake-up task for ${i.name}: ${m}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?Dd(this.getConfig("WAKEUP_ENABLED")):!1}hasWakeupFiredToday(e,t){return this.lastWakeupDate.get(e)===t?!0:(this.lastWakeupDate.set(e,t),!1)}async probeProviderManually(e){let o=this.getProviders().find(i=>i.name===e);if(!o)return this.logger?.warn?.(`Provider ${e} not found for manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} not found`};if(o.enabled===!1)return this.logger?.warn?.(`Provider ${e} is disabled, skipping manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} is disabled`};let r=await ts(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o));if(r.skipped)return{success:!1,skipped:!0,latencyMs:r.latencyMs,status:"skipped",isSlow:!1,error:r.error};let s=this.recordProbe(o.name,r,"manual"),a=Array.isArray(o.models)?o.models:[];if(r.success)for(let i of a)j().recordSuccess(o.name,i);else for(let i of a)j().recordFailure(o.name,i,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},Ie=null});var sc=R(()=>{"use strict"});var rs,bt,ic=R(()=>{"use strict";rs=class{plugins=new Map;pluginInstances=new Map;registerPlugin(e,t={}){this.pluginInstances.set(e.name,e),this.plugins.set(e.name,{name:e.name,enabled:t.enabled!==!1,options:t})}async enablePlugin(e,t){let o=this.plugins.get(e),r=this.pluginInstances.get(e);if(!o||!r)throw new Error(`Plugin ${e} not found`);o.enabled&&await t.register(r.register,o.options)}async enablePlugins(e){for(let[t,o]of this.plugins)if(o.enabled)try{await this.enablePlugin(t,e)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.error(`Failed to enable plugin ${t}: ${s}`)}}getPlugins(){return Array.from(this.plugins.values())}getPlugin(e){return this.pluginInstances.get(e)}hasPlugin(e){return this.pluginInstances.has(e)}isPluginEnabled(e){return this.plugins.get(e)?.enabled||!1}setPluginEnabled(e,t){let o=this.plugins.get(e);o&&(o.enabled=t)}removePlugin(e){this.plugins.delete(e),this.pluginInstances.delete(e)}clear(){this.plugins.clear(),this.pluginInstances.clear()}},bt=new rs});var le,ss=R(()=>{"use strict";le=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
309
+ `);this.buffer=o.pop()||"";for(let r of o){let s=this.processLine(r);s&&t.enqueue(s)}},flush:e=>{if(this.buffer.trim()){let t=[];this.processLine(this.buffer.trim(),t),t.forEach(o=>e.enqueue(o))}Object.keys(this.currentEvent).length>0&&e.enqueue(this.currentEvent)}})}processLine(e,t){if(!e.trim()){if(Object.keys(this.currentEvent).length>0){let o={...this.currentEvent};return this.currentEvent={},t?(t.push(o),null):o}return null}if(e.startsWith("event:"))this.currentEvent.event=e.slice(6).trim();else if(e.startsWith("data:")){let o=e.slice(5).trim();if(o==="[DONE]")this.currentEvent.data={type:"done"};else try{this.currentEvent.data=JSON.parse(o)}catch{this.currentEvent.data={raw:o,error:"JSON parse failed"}}}else e.startsWith("id:")?this.currentEvent.id=e.slice(3).trim():e.startsWith("retry:")&&(this.currentEvent.retry=parseInt(e.slice(6).trim()));return null}}});var Ye,is=R(()=>{"use strict";Ye=class extends TransformStream{constructor(){super({transform:(e,t)=>{let o="";e.event&&(o+=`event: ${e.event}
310
310
  `),e.id&&(o+=`id: ${e.id}
311
311
  `),e.retry&&(o+=`retry: ${e.retry}
312
312
  `),e.data&&(e.data.type==="done"?o+=`data: [DONE]
313
313
  `:o+=`data: ${JSON.stringify(e.data)}
314
314
  `),o+=`
315
- `,t.enqueue(o)}})}}});var Vt,as=w(()=>{"use strict";Vt=(n,e)=>{let t=n.getReader();return new ReadableStream({async start(o){try{for(;;){let{done:r,value:s}=await t.read();if(r){o.close();break}let a=await e(s,o);a!==void 0&&o.enqueue(a)}}catch(r){o.error(r)}finally{t.releaseLock()}}})}});var cs=w(()=>{"use strict";ss();is();as()});var ac=w(()=>{"use strict"});var Qt,ls=w(()=>{"use strict";Qt=class{type="console";config;colors={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m"};constructor(e={}){this.config={colors:!0,level:"log",...e}}formatData(e,t){let{format:o="text",timestamp:r=!0,prefix:s,metadata:a}=t||{},i="";if(r){let c=new Date().toISOString();i+=this.config.colors?`${this.colors.cyan}[${c}]${this.colors.reset} `:`[${c}] `}switch(s&&(i+=this.config.colors?`${this.colors.bright}${s}${this.colors.reset} `:`${s} `),o){case"json":i+=JSON.stringify(e,null,2);break;case"markdown":typeof e=="object"?i+=this.toMarkdown(e):i+=String(e);break;case"text":default:typeof e=="object"?i+=JSON.stringify(e,null,2):i+=String(e);break}return a&&Object.keys(a).length>0&&(i+=`
315
+ `,t.enqueue(o)}})}}});var Vt,as=R(()=>{"use strict";Vt=(n,e)=>{let t=n.getReader();return new ReadableStream({async start(o){try{for(;;){let{done:r,value:s}=await t.read();if(r){o.close();break}let a=await e(s,o);a!==void 0&&o.enqueue(a)}}catch(r){o.error(r)}finally{t.releaseLock()}}})}});var cs=R(()=>{"use strict";ss();is();as()});var ac=R(()=>{"use strict"});var Qt,ls=R(()=>{"use strict";Qt=class{type="console";config;colors={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m"};constructor(e={}){this.config={colors:!0,level:"log",...e}}formatData(e,t){let{format:o="text",timestamp:r=!0,prefix:s,metadata:a}=t||{},i="";if(r){let c=new Date().toISOString();i+=this.config.colors?`${this.colors.cyan}[${c}]${this.colors.reset} `:`[${c}] `}switch(s&&(i+=this.config.colors?`${this.colors.bright}${s}${this.colors.reset} `:`${s} `),o){case"json":i+=JSON.stringify(e,null,2);break;case"markdown":typeof e=="object"?i+=this.toMarkdown(e):i+=String(e);break;case"text":default:typeof e=="object"?i+=JSON.stringify(e,null,2):i+=String(e);break}return a&&Object.keys(a).length>0&&(i+=`
316
316
  `+(this.config.colors?`${this.colors.dim}`:""),i+="Metadata: "+JSON.stringify(a,null,2),this.config.colors&&(i+=this.colors.reset)),i}toMarkdown(e,t=0){let o=" ".repeat(t);return Array.isArray(e)?e.map(r=>typeof r=="object"?`${o}-
317
317
  ${this.toMarkdown(r,t+1)}`:`${o}- ${r}`).join(`
318
318
  `):typeof e=="object"&&e!==null?Object.entries(e).map(([r,s])=>typeof s=="object"&&s!==null?`${o}${r}:
319
319
  ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
320
- `):`${o}${e}`}async output(e,t={}){try{let o=this.formatData(e,t);switch(this.config.level||"log"){case"info":console.info(o);break;case"warn":console.warn(o);break;case"error":console.error(o);break;case"debug":console.debug(o);break;case"log":default:console.log(o);break}return!0}catch(o){return console.error("[ConsoleOutputHandler] Output failed:",o),!1}}}});var Yt,us=w(()=>{"use strict";Yt=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:o="json",timestamp:r=!0,prefix:s,metadata:a}=t||{},i={data:e};return r&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),a&&Object.keys(a).length>0&&(i.metadata=a),i}async sendRequest(e,t,o,r,s){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:a.signal});if(clearTimeout(i),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c}catch(c){throw clearTimeout(i),c}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,a){let i=null;for(let c=1;c<=a.maxAttempts;c++)try{return await this.sendRequest(e,t,o,r,s)}catch(l){if(i=l,c===a.maxAttempts)break;let u=a.backoffMs*Math.pow(2,c-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${c}/${a.maxAttempts}), retrying in ${u}ms...`,l.message),await this.delay(u)}throw i}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),a=await this.sendWithRetry(this.config.url,this.config.method,r,s,o,this.config.retry);return!0}catch(r){let s=r instanceof Error?r.message:String(r);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});async function Lo(n,e){let t=(0,Xe.resolve)(n),o=Mo.get(t),r,s=new Promise(a=>{r=a});Mo.set(t,s);try{return await o,await e()}finally{r(),Mo.get(t)===s&&Mo.delete(t)}}function uc(n,e){return n.dev===e.dev&&n.ino===e.ino}async function cc(n,e){try{let t=await(0,Re.lstat)(n);return t.isDirectory()&&!t.isSymbolicLink()&&uc(e,t)}catch{return!1}}function Gd(){return new Promise(n=>{setTimeout(n,10).unref()})}async function dc(n,e,t,o){let r=(0,Xe.resolve)(n);if(o?.aborted||ds.has(r))return 0;ds.add(r);let s=0;try{let a=await(0,Re.lstat)(r);if(!a.isDirectory()||a.isSymbolicLink()||o?.aborted)return 0;let i=await(0,Re.opendir)(r,{bufferSize:32});try{let c=0,l=!0;for await(let u of i){if(o?.aborted||!l)break;try{if(!u.isFile()||u.isSymbolicLink()||!t(u.name))continue;let p=(0,Xe.join)(r,u.name);try{let d=await(0,Re.lstat)(p);if(!d.isFile()||d.isSymbolicLink()||d.mtimeMs>=e)continue;await Lo(p,async()=>{if(o?.aborted||!await cc(r,a))return!1;let h=await(0,Re.lstat)(p);return!h.isFile()||h.isSymbolicLink()||!uc(d,h)||h.mtimeMs!==d.mtimeMs||h.mtimeMs>=e||o?.aborted?!1:(await(0,Re.unlink)(p),!0)})&&s++}catch{}}finally{++c%64===0&&(await Gd(),l=!o?.aborted&&await cc(r,a))}}}finally{await i.close().catch(()=>{})}}catch{}finally{ds.delete(r)}return s}function pc(n,e,t,o,r){if(!Number.isFinite(o)||o<=0)return Promise.resolve(0);let s=`${e}-`,a=t?`.${t}`:"";return dc(n,Date.now()-o,i=>Kd.test(i)?!0:!i.endsWith(".tmp")&&i.startsWith(s)&&i.endsWith(a),r)}function Vd(n,e){let t=Date.now()-Bd;return dc(n,t,o=>{let r=Wd.exec(o);return r!==null&&Number(r[1])<t},e)}function fs(n,e,t){let o=ps.get(n);if(!o){let s=new AbortController,a,i=()=>{s.signal.aborted||Promise.resolve().then(()=>e(s.signal)).catch(()=>{})},c=setTimeout(()=>{s.signal.aborted||(i(),a=setInterval(i,Jd),a.unref())},t);c.unref(),o={users:0,stop:()=>{s.abort(),clearTimeout(c),a&&clearInterval(a)}},ps.set(n,o)}o.users++;let r=!1;return()=>{r||(r=!0,--o.users===0&&(o.stop(),ps.delete(n)))}}function fc(n=(0,Xe.join)((0,lc.tmpdir)(),"claude-code-router")){return fs(`legacy:${(0,Xe.resolve)(n)}`,e=>Vd(n,e),1e3)}var Re,Xe,lc,Bd,Jd,Wd,Kd,ds,Mo,ps,ms=w(()=>{"use strict";Re=require("node:fs/promises"),Xe=require("node:path"),lc=require("node:os"),Bd=3600*1e3,Jd=600*1e3,Wd=/^session-[A-Za-z0-9_.-]+-(\d{13})\.json$/,Kd=/^\.ccr-tmp-[1-9]\d*-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.tmp$/,ds=new Set,Mo=new Map,ps=new Map});var be,mc,gc,Me,hc,Xt,gs=w(()=>{"use strict";be=require("node:fs/promises"),mc=require("node:crypto"),gc=require("@wengine-ai/claude-code-router-shared"),Me=require("node:path"),hc=require("node:os");ms();Xt=class{type="temp-file";config;baseDir;controller=new AbortController;stopSchedule;constructor(e={}){if(this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",retentionMs:36e5,...e},this.baseDir=(0,Me.resolve)((0,Me.join)((0,hc.tmpdir)(),this.config.subdirectory)),Number.isFinite(this.config.retentionMs)&&this.config.retentionMs>0){let t=JSON.stringify([this.baseDir,this.config.prefix,this.config.extension,this.config.retentionMs]);this.stopSchedule=fs(`handler:${t}`,o=>this.pruneOldFiles(o),6e4)}}async ensureDir(){await(0,be.mkdir)(this.baseDir,{recursive:!0});let e=await(0,be.lstat)(this.baseDir);if(!e.isDirectory()||e.isSymbolicLink())throw new Error("Unsafe temp output directory")}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r=this.config.includeTimestamp?`-${Date.now()}`:"",s=`${t}-${(0,gc.sanitizeTempFileKey)(e)}${r}${o}`;if((0,Me.basename)(s)!==s||s.includes("\\"))throw new Error("Temp file configuration must not contain path separators");return(0,Me.join)(this.baseDir,s)}async output(e,t={}){try{let o=typeof t.metadata?.statsKey=="string"&&t.metadata.statsKey?t.metadata.statsKey:t.metadata?.sessionId;if(!o)return!1;let r=t.metadata?.sessionId??o,s=JSON.stringify({...e,timestamp:Date.now(),sessionId:r},null,2),a=this.getFilePath(o);return await Lo(a,async()=>{await this.ensureDir();let i=(0,Me.join)(this.baseDir,`.ccr-tmp-${process.pid}-${(0,mc.randomUUID)()}.tmp`);return Lo(i,async()=>{let c=!1;try{let l=await(0,be.open)(i,"wx");c=!0;try{await l.writeFile(s,"utf-8")}finally{await l.close()}return await(0,be.rename)(i,a),!0}finally{c&&await(0,be.unlink)(i).catch(()=>{})}})})}catch{return!1}}pruneOldFiles(e=this.controller.signal){return pc(this.baseDir,this.config.prefix||"session",this.config.extension||"",this.config.retentionMs,e)}dispose(){this.controller.abort(),this.stopSchedule?.()}getBaseDir(){return this.baseDir}}});var hs,_t,yc=w(()=>{"use strict";ls();us();gs();hs=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 o=this.createHandler(t),r=t.type+"_"+Date.now();this.registerHandler(r,o)}catch(o){console.error(`[OutputManager] Failed to register ${t.type} handler:`,o)}}createHandler(e){switch(e.type){case"console":return new Qt(e.config);case"webhook":return new Yt(e.config);case"temp-file":return new Xt(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 o={...this.defaultOptions,...t},r={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,i])=>{try{await i.output(e,o)?r.success.push(a):r.failed.push(a)}catch(c){console.error(`[OutputManager] Handler ${a} failed:`,c),r.failed.push(a)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},a=e.map(async i=>{let c=this.handlers.get(i);if(!c){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await c.output(t,r)?s.success.push(i):s.failed.push(i)}catch(l){console.error(`[OutputManager] Handler ${i} failed:`,l),s.failed.push(i)}});return await Promise.all(a),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},_t=new hs});var ys=w(()=>{"use strict";ac();ls();us();gs();yc()});function No(){return{subdirectory:Tc.TOKEN_SPEED_TEMP_SUBDIRECTORY,extension:"json",includeTimestamp:!1,prefix:"session"}}function bc(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,Qd);return Math.round(n/o)}function qt(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function _c(n,e,t,o=!1){let r=o?"[Token Speed Final]":"[Token Speed]",s={requestId:n.requestId.substring(0,8),sessionId:n.sessionId,stream:n.stream,tokenCount:n.tokenCount,tokensPerSecond:n.tokensPerSecond,timeToFirstToken:n.timeToFirstToken?`${n.timeToFirstToken}ms`:"N/A",duration:`${((n.lastTokenTime-n.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},a={prefix:r,metadata:{sessionId:n.sessionId,statsKey:n.statsKey},...t};for(let i of e)try{await _t.outputToType(i,s,a)}catch(c){console.error(`[TokenSpeedPlugin] Failed to output to ${i}:`,c)}}var kc,Tc,Zt,bs,Qd,en,vc=w(()=>{"use strict";kc=q(require("fastify-plugin"),1);cs();ys();ct();Tc=require("@wengine-ai/claude-code-router-shared");Zt=new Map,bs=new Map,Qd=1,en={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,kc.default)(async(n,e)=>{let t={reporter:["console","temp-file"],...e},o=Array.isArray(t.reporter)?t.reporter:[t.reporter];if(t.outputHandlers&&t.outputHandlers.length>0)_t.registerHandlers(t.outputHandlers);else{let a=[];for(let i of o)i==="console"?a.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?a.push({type:"temp-file",enabled:!0,config:No()}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");a.length>0&&_t.registerHandlers(a)}t.outputOptions&&_t.setDefaultOptions(t.outputOptions);let r=async a=>{let i=n.tokenizerService;if(!i)return n.log?.warn("TokenizerService not available"),null;if(!a.provider||!a.model)return null;let c=a.provider,l=a.model,u=`${c}:${l}`;if(bs.has(u))return bs.get(u);let p=i.getTokenizerConfigForModel(c,l);if(!p)return n.log?.debug(`No tokenizer config for ${c}:${l}, using fallback`),null;try{let d=await i.getTokenizer(p,c);return bs.set(u,d),n.log?.info(`Created tokenizer for ${c}:${l} - ${d.name}`),d}catch(d){return n.log?.warn(`Failed to create tokenizer for ${c}:${l}: ${d.message}`),null}},s=a=>{let i=new URL(`http://127.0.0.1${a}`).pathname;return i.endsWith("/v1/messages")||i.endsWith("/v1/responses")};n.addHook("onRequest",async a=>{s(a.url)&&(a.requestStartTime=performance.now())}),n.addHook("onSend",async(a,i,c)=>{let l=a.requestStartTime;if(!l)return;let u=a.id||Date.now().toString(),p=a.usageSessionId||u,d=a.sessionId;if(!d)try{d=Ce(a.body?.metadata?.user_id)||p}catch{d=p}let m=await r(a);if(c instanceof ReadableStream){Zt.set(u,{requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:l,tokenCount:0,tokensPerSecond:0,stream:!0});let[y,_]=c.tee(),b=async()=>{let k=null,v=async x=>{let T=Zt.get(u);if(!T)return;let R=T.firstTokenTime?T.firstTokenTime-T.startTime:0,P=(x?T.lastTokenTime:performance.now())-T.startTime;T.tokensPerSecond=bc(T.tokenCount,P,R),await _c(T,o,t.outputOptions,x).catch(O=>{n.log?.warn(`Failed to output streaming stats: ${O.message}`)})};try{let T=_.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();for(k=setInterval(async()=>{Zt.get(u)&&await v(!1)},1e3);;){let{done:R,value:S}=await T.read();if(R)break;let P=S,O=Zt.get(u);if(!O)continue;let I=performance.now(),C=P.event||P.data?.type,A=P.event==="content_block_start"||P.event==="content_block_delta"||P.event==="text_block"||P.event==="content_block"||C==="response.output_text.delta"||C==="response.function_call_arguments.delta"||C==="response.reasoning_summary_text.delta";!O.firstTokenTime&&A&&(O.firstTokenTime=I,O.timeToFirstToken=Math.round(I-O.startTime));let M="";if(P.event==="content_block_delta"&&P.data?.delta){let $=P.data.delta.type;$==="text_delta"?M=P.data.delta.text||"":$==="input_json_delta"?M=P.data.delta.partial_json||"":$==="thinking_delta"&&(M=P.data.delta.thinking||"")}if((C==="response.output_text.delta"||C==="response.function_call_arguments.delta"||C==="response.reasoning_summary_text.delta")&&(M=typeof P.data?.delta=="string"?P.data.delta:""),M){let $=m&&m.encodeText?m.encodeText(M).length:qt(M);O.tokenCount+=$,O.lastTokenTime=I}(P.event==="message_stop"||C==="response.completed"||C==="response.failed")&&(k&&(clearInterval(k),k=null),await v(!0),Zt.delete(u))}}catch(x){k&&clearInterval(k),x.name!=="AbortError"&&x.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${x.message}`)}};return a.tokenSpeedCapturePromise=b().catch(k=>{console.log(k),n.log?.warn(`Background stats processing failed: ${k.message}`)}),y}let h=performance.now(),f=0,g=!1;if(c&&typeof c=="string")try{let y=JSON.parse(c);if(typeof y.usage?.output_tokens=="number")f=y.usage.output_tokens,g=!0;else{let _=y.content??y.message?.content;if(_!==void 0)if(g=!0,m)Array.isArray(_)?f=_.reduce((b,k)=>{if(k.type==="text"){let v=k.text||"";return b+(m.encodeText?m.encodeText(v).length:qt(v))}return b},0):typeof _=="string"&&(f=m.encodeText?m.encodeText(_).length:qt(_));else{let b=Array.isArray(_)?_.map(k=>k.text).join(""):typeof _=="string"?_:"";f=qt(b)}}}catch{}if(g){let y=h-l,_={requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:h,tokenCount:f,tokensPerSecond:bc(f,y),stream:!1};await _c(_,o,t.outputOptions,!0)}return c})})}});var _s=w(()=>{"use strict";sc();ic();vc();ys()});function xc(){if(process.env.VITEST||process.env.CI)throw new Error("Config write attempted during test/CI. Set CCR_CONFIG_DIR to a temp dir to isolate.")}var se,Ts,Le,V,ks,tn,nn,kt,te,on,fe,Yd,$o,rn=w(()=>{"use strict";se=q(require("node:fs/promises"),1),Ts=q(require("json5"),1),Le=q(require("node:path"),1),V=require("@wengine-ai/claude-code-router-shared"),ks=n=>{if(typeof n=="string")return n.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(e,t,o)=>{let r=t||o;return process.env[r]||e});if(Array.isArray(n))return n.map(ks);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=ks(o);return e}return n},tn=async n=>{try{await se.default.access(n)}catch{await se.default.mkdir(n,{recursive:!0})}},nn=async()=>{await tn(V.HOME_DIR),await tn(V.PLUGINS_DIR),await tn(Le.default.join(V.HOME_DIR,"logs"))},kt=async()=>{let n=await se.default.readFile(V.CONFIG_FILE,"utf-8");return Ts.default.parse(n)},te=async()=>{try{let n=await se.default.readFile(V.CONFIG_FILE,"utf-8");try{let e=Ts.default.parse(n);return ks(e)}catch(e){console.error(`Failed to parse config file at ${V.CONFIG_FILE}`),console.error("Error details:",e.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(n){if(n.code==="ENOENT")try{await nn();let e=await on();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await fe(t),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),t}catch(e){console.error("Failed to create default configuration:",e.message),process.exit(1)}else console.error(`Failed to read config file at ${V.CONFIG_FILE}`),console.error("Error details:",n.message),process.exit(1)}};on=async()=>{xc();try{if(await se.default.access(V.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${V.CONFIG_FILE}.${n}.bak`;await se.default.copyFile(V.CONFIG_FILE,e);try{let t=Le.default.dirname(V.CONFIG_FILE),o=Le.default.basename(V.CONFIG_FILE),s=(await se.default.readdir(t)).filter(a=>a.startsWith(o)&&a.endsWith(".bak")).sort().reverse();if(s.length>3)for(let a=3;a<s.length;a++){let i=Le.default.join(t,s[a]);await se.default.unlink(i)}}catch(t){console.warn("Failed to clean up old backups:",t)}return e}}catch(n){console.error("Failed to backup config file:",n)}return null},fe=async n=>{xc(),await tn(V.HOME_DIR),await Yd();let e=`${JSON.stringify(n,null,2)}`;await se.default.writeFile(V.CONFIG_FILE,e)},Yd=async()=>{if(!await se.default.access(V.CONFIG_FILE).then(()=>!0).catch(()=>!1))return;let e=Le.default.join(V.HOME_DIR,"config-history");await tn(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=Le.default.join(e,`config-${t}.json`);await se.default.copyFile(V.CONFIG_FILE,o);try{let s=(await se.default.readdir(e)).filter(a=>a.startsWith("config-")&&a.endsWith(".json")).sort().reverse();if(s.length>50)for(let a of s.slice(50))await se.default.unlink(Le.default.join(e,a))}catch(r){console.warn("Failed to prune config-history:",r)}},$o=async()=>{let n=await te();return Object.assign(process.env,n),n}});function Xd(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function Zd(n){return n?.cache_creation_input_tokens??n?.input_tokens_details?.cache_creation_tokens??n?.input_tokens_details?.cache_write_tokens??n?.prompt_tokens_details?.cache_creation_tokens??n?.prompt_tokens_details?.cache_write_tokens??0}function Ne(n){if(!(!n||typeof n!="object"))return{...n,input_tokens:n.input_tokens??n.prompt_tokens??0,output_tokens:n.output_tokens??n.completion_tokens??0,cache_read_input_tokens:Xd(n),cache_creation_input_tokens:Zd(n)}}function Tt(n,e,t){let o=t?{}:n||{},r=e||{};return{...o,input_tokens:r.input_tokens||o.input_tokens||0,output_tokens:r.output_tokens||o.output_tokens||0,cache_read_input_tokens:r.cache_read_input_tokens||o.cache_read_input_tokens||0,cache_creation_input_tokens:r.cache_creation_input_tokens||o.cache_creation_input_tokens||0}}var vs=w(()=>{"use strict"});function Do(n,e,t){if(n){if(typeof n=="string"){let o=n.indexOf(",");if(o>0){let r=n.slice(0,o).trim(),s=n.slice(o+1).trim();r&&s&&e.has(r)&&t.add(xs(r,s))}return}if(Array.isArray(n)){for(let o of n)Do(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))Do(o,e,t)}}function Ss(n){let e=n?.Providers||n?.providers||[],t=new Set,o=new Set;for(let r of e){let s=r?.name;if(!s)continue;t.add(s);let a=Array.isArray(r?.models)?r.models:[];for(let i of a)i&&o.add(xs(s,i))}return Do(n?.Router,t,o),Do(n?.fallback,t,o),o}function vt(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Ss(n),r=0;for(let s of t.getAllStates()||[]){let a=s?.provider,i=s?.model;!a||!i||o.has(xs(a,i))||(t.recover(a,i),r++)}return r>0&&e?.info?.(`[health-reconcile] Pruned ${r} orphaned provider-health entr${r===1?"y":"ies"}`),r}catch(t){return e?.warn?.(`[health-reconcile] Failed to reconcile health store: ${t?.message||t}`),0}}function sn(n,e){try{if(!n)return 0;let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=0;for(let r of t.getAllStates()||[])r?.provider===n&&r?.model&&(t.recover(n,r.model),o++);return o>0&&e?.info?.(`[health-reconcile] Cleared ${o} health entr${o===1?"y":"ies"} for probed provider ${n}`),o}catch(t){return e?.warn?.(`[health-reconcile] Failed to clear provider health for ${n}: ${t?.message||t}`),0}}var qd,xs,an=w(()=>{"use strict";ue();qd="\0",xs=(n,e)=>`${n}${qd}${e}`});function ep(n){return/\[1m\]/i.test(n)?1e6:2e5}function tp(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function np(n,e=n){let t=ep(n),o=tp(n);return{type:"model",id:n,display_name:e,created_at:"2024-01-01T00:00:00Z",context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o,capabilities:{context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o}}}function op(n,e,t){if(!n)return!1;try{return!n(e,t)}catch{return!1}}function Fo(n,e){let t=new Map,o=(r,s=r)=>{!r||t.has(r)||t.set(r,np(r,s))};o("ccr-opus","CCR Opus"),o("ccr-sonnet","CCR Sonnet"),o("ccr-haiku","CCR Haiku"),o("ccr-opus[1m]","CCR Opus 1M"),o("ccr-sonnet[1m]","CCR Sonnet 1M"),o("ccr-haiku[1m]","CCR Haiku 1M");for(let r of n.Providers||n.providers||[])if(!(!r?.name||!Array.isArray(r.models)))for(let s of r.models){if(typeof s!="string"||!s)continue;let a=op(e,r.name,s);a||o(s,s),a||o(`${r.name},${s}`,`${r.name}/${s}`)}return Array.from(t.values())}var Cs=w(()=>{"use strict"});function rp(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var cn,Rs=w(()=>{"use strict";cn=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||rp(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let a=n.APIKEY;if(!a){let u=[`http://127.0.0.1:${n.PORT||3456}`,`http://localhost:${n.PORT||3456}`];if(e.headers.origin&&!u.includes(e.headers.origin)){t.status(403).send("CORS not allowed for this origin");return}else t.header("Access-Control-Allow-Origin",`http://127.0.0.1:${n.PORT||3456}`),t.header("Access-Control-Allow-Origin",`http://localhost:${n.PORT||3456}`);return o()}let i=e.headers.authorization||e.headers["x-api-key"],c=Array.isArray(i)?i[0]:i||"";if(!c){t.log.warn({url:e.url,headers:Object.keys(e.headers)},"[AUTH] No auth header"),t.status(401).send("APIKEY is missing");return}let l="";if(c.startsWith("Bearer")?l=c.split(" ")[1]:l=c,l!==a){t.log.warn({url:e.url,gotPrefix:l.slice(0,10),gotSuffix:l.slice(-6),gotLen:l.length,expectedPrefix:a.slice(0,6),expectedSuffix:a.slice(-6),expectedLen:a.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var Is={};_n(Is,{append:()=>mn,clear:()=>As,close:()=>kp,getOldestRecordTimestamp:()=>Tp,query:()=>Es,querySummary:()=>gn,readTokenSpeedStats:()=>Os});function lp(){(0,Fe.existsSync)(jo)||(0,Fe.mkdirSync)(jo,{recursive:!0})}function fn(){if(De)return De;lp();let n=(0,wc.openSqliteDatabase)(sp),e=n.db;n.driver==="node:sqlite"&&console.error(`[usage] better-sqlite3 unavailable, using built-in node:sqlite fallback. Reason: ${n.fallbackReason}`),e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("busy_timeout = 5000");let t=e.pragma("user_version",{simple:!0})||0;return t<1&&(up(e),e.pragma("user_version = 1")),t<2&&(e.prepare("PRAGMA table_info(usage_records)").all().some(r=>r.name==="upstream_model")||e.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),e.pragma("user_version = 2")),pp(e),Ac(e,!0),Ps=e.prepare(`
320
+ `):`${o}${e}`}async output(e,t={}){try{let o=this.formatData(e,t);switch(this.config.level||"log"){case"info":console.info(o);break;case"warn":console.warn(o);break;case"error":console.error(o);break;case"debug":console.debug(o);break;case"log":default:console.log(o);break}return!0}catch(o){return console.error("[ConsoleOutputHandler] Output failed:",o),!1}}}});var Yt,us=R(()=>{"use strict";Yt=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:o="json",timestamp:r=!0,prefix:s,metadata:a}=t||{},i={data:e};return r&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),a&&Object.keys(a).length>0&&(i.metadata=a),i}async sendRequest(e,t,o,r,s){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:a.signal});if(clearTimeout(i),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c}catch(c){throw clearTimeout(i),c}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,a){let i=null;for(let c=1;c<=a.maxAttempts;c++)try{return await this.sendRequest(e,t,o,r,s)}catch(l){if(i=l,c===a.maxAttempts)break;let u=a.backoffMs*Math.pow(2,c-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${c}/${a.maxAttempts}), retrying in ${u}ms...`,l.message),await this.delay(u)}throw i}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),a=await this.sendWithRetry(this.config.url,this.config.method,r,s,o,this.config.retry);return!0}catch(r){let s=r instanceof Error?r.message:String(r);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});async function Lo(n,e){let t=(0,Xe.resolve)(n),o=Mo.get(t),r,s=new Promise(a=>{r=a});Mo.set(t,s);try{return await o,await e()}finally{r(),Mo.get(t)===s&&Mo.delete(t)}}function uc(n,e){return n.dev===e.dev&&n.ino===e.ino}async function cc(n,e){try{let t=await(0,Re.lstat)(n);return t.isDirectory()&&!t.isSymbolicLink()&&uc(e,t)}catch{return!1}}function Vd(){return new Promise(n=>{setTimeout(n,10).unref()})}async function dc(n,e,t,o){let r=(0,Xe.resolve)(n);if(o?.aborted||ds.has(r))return 0;ds.add(r);let s=0;try{let a=await(0,Re.lstat)(r);if(!a.isDirectory()||a.isSymbolicLink()||o?.aborted)return 0;let i=await(0,Re.opendir)(r,{bufferSize:32});try{let c=0,l=!0;for await(let u of i){if(o?.aborted||!l)break;try{if(!u.isFile()||u.isSymbolicLink()||!t(u.name))continue;let p=(0,Xe.join)(r,u.name);try{let d=await(0,Re.lstat)(p);if(!d.isFile()||d.isSymbolicLink()||d.mtimeMs>=e)continue;await Lo(p,async()=>{if(o?.aborted||!await cc(r,a))return!1;let h=await(0,Re.lstat)(p);return!h.isFile()||h.isSymbolicLink()||!uc(d,h)||h.mtimeMs!==d.mtimeMs||h.mtimeMs>=e||o?.aborted?!1:(await(0,Re.unlink)(p),!0)})&&s++}catch{}}finally{++c%64===0&&(await Vd(),l=!o?.aborted&&await cc(r,a))}}}finally{await i.close().catch(()=>{})}}catch{}finally{ds.delete(r)}return s}function pc(n,e,t,o,r){if(!Number.isFinite(o)||o<=0)return Promise.resolve(0);let s=`${e}-`,a=t?`.${t}`:"";return dc(n,Date.now()-o,i=>Gd.test(i)?!0:!i.endsWith(".tmp")&&i.startsWith(s)&&i.endsWith(a),r)}function Qd(n,e){let t=Date.now()-Jd;return dc(n,t,o=>{let r=Kd.exec(o);return r!==null&&Number(r[1])<t},e)}function fs(n,e,t){let o=ps.get(n);if(!o){let s=new AbortController,a,i=()=>{s.signal.aborted||Promise.resolve().then(()=>e(s.signal)).catch(()=>{})},c=setTimeout(()=>{s.signal.aborted||(i(),a=setInterval(i,Wd),a.unref())},t);c.unref(),o={users:0,stop:()=>{s.abort(),clearTimeout(c),a&&clearInterval(a)}},ps.set(n,o)}o.users++;let r=!1;return()=>{r||(r=!0,--o.users===0&&(o.stop(),ps.delete(n)))}}function fc(n=(0,Xe.join)((0,lc.tmpdir)(),"claude-code-router")){return fs(`legacy:${(0,Xe.resolve)(n)}`,e=>Qd(n,e),1e3)}var Re,Xe,lc,Jd,Wd,Kd,Gd,ds,Mo,ps,ms=R(()=>{"use strict";Re=require("node:fs/promises"),Xe=require("node:path"),lc=require("node:os"),Jd=3600*1e3,Wd=600*1e3,Kd=/^session-[A-Za-z0-9_.-]+-(\d{13})\.json$/,Gd=/^\.ccr-tmp-[1-9]\d*-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.tmp$/,ds=new Set,Mo=new Map,ps=new Map});var _e,mc,gc,Me,hc,Xt,gs=R(()=>{"use strict";_e=require("node:fs/promises"),mc=require("node:crypto"),gc=require("@wengine-ai/claude-code-router-shared"),Me=require("node:path"),hc=require("node:os");ms();Xt=class{type="temp-file";config;baseDir;controller=new AbortController;stopSchedule;constructor(e={}){if(this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",retentionMs:36e5,...e},this.baseDir=(0,Me.resolve)((0,Me.join)((0,hc.tmpdir)(),this.config.subdirectory)),Number.isFinite(this.config.retentionMs)&&this.config.retentionMs>0){let t=JSON.stringify([this.baseDir,this.config.prefix,this.config.extension,this.config.retentionMs]);this.stopSchedule=fs(`handler:${t}`,o=>this.pruneOldFiles(o),6e4)}}async ensureDir(){await(0,_e.mkdir)(this.baseDir,{recursive:!0});let e=await(0,_e.lstat)(this.baseDir);if(!e.isDirectory()||e.isSymbolicLink())throw new Error("Unsafe temp output directory")}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r=this.config.includeTimestamp?`-${Date.now()}`:"",s=`${t}-${(0,gc.sanitizeTempFileKey)(e)}${r}${o}`;if((0,Me.basename)(s)!==s||s.includes("\\"))throw new Error("Temp file configuration must not contain path separators");return(0,Me.join)(this.baseDir,s)}async output(e,t={}){try{let o=typeof t.metadata?.statsKey=="string"&&t.metadata.statsKey?t.metadata.statsKey:t.metadata?.sessionId;if(!o)return!1;let r=t.metadata?.sessionId??o,s=JSON.stringify({...e,timestamp:Date.now(),sessionId:r},null,2),a=this.getFilePath(o);return await Lo(a,async()=>{await this.ensureDir();let i=(0,Me.join)(this.baseDir,`.ccr-tmp-${process.pid}-${(0,mc.randomUUID)()}.tmp`);return Lo(i,async()=>{let c=!1;try{let l=await(0,_e.open)(i,"wx");c=!0;try{await l.writeFile(s,"utf-8")}finally{await l.close()}return await(0,_e.rename)(i,a),!0}finally{c&&await(0,_e.unlink)(i).catch(()=>{})}})})}catch{return!1}}pruneOldFiles(e=this.controller.signal){return pc(this.baseDir,this.config.prefix||"session",this.config.extension||"",this.config.retentionMs,e)}dispose(){this.controller.abort(),this.stopSchedule?.()}getBaseDir(){return this.baseDir}}});var hs,kt,yc=R(()=>{"use strict";ls();us();gs();hs=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 o=this.createHandler(t),r=t.type+"_"+Date.now();this.registerHandler(r,o)}catch(o){console.error(`[OutputManager] Failed to register ${t.type} handler:`,o)}}createHandler(e){switch(e.type){case"console":return new Qt(e.config);case"webhook":return new Yt(e.config);case"temp-file":return new Xt(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 o={...this.defaultOptions,...t},r={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,i])=>{try{await i.output(e,o)?r.success.push(a):r.failed.push(a)}catch(c){console.error(`[OutputManager] Handler ${a} failed:`,c),r.failed.push(a)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},a=e.map(async i=>{let c=this.handlers.get(i);if(!c){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await c.output(t,r)?s.success.push(i):s.failed.push(i)}catch(l){console.error(`[OutputManager] Handler ${i} failed:`,l),s.failed.push(i)}});return await Promise.all(a),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},kt=new hs});var ys=R(()=>{"use strict";ac();ls();us();gs();yc()});function No(){return{subdirectory:Tc.TOKEN_SPEED_TEMP_SUBDIRECTORY,extension:"json",includeTimestamp:!1,prefix:"session"}}function _c(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,Yd);return Math.round(n/o)}function qt(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function bc(n,e,t,o=!1){let r=o?"[Token Speed Final]":"[Token Speed]",s={requestId:n.requestId.substring(0,8),sessionId:n.sessionId,stream:n.stream,tokenCount:n.tokenCount,tokensPerSecond:n.tokensPerSecond,timeToFirstToken:n.timeToFirstToken?`${n.timeToFirstToken}ms`:"N/A",duration:`${((n.lastTokenTime-n.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},a={prefix:r,metadata:{sessionId:n.sessionId,statsKey:n.statsKey},...t};for(let i of e)try{await kt.outputToType(i,s,a)}catch(c){console.error(`[TokenSpeedPlugin] Failed to output to ${i}:`,c)}}var kc,Tc,Zt,_s,Yd,en,vc=R(()=>{"use strict";kc=q(require("fastify-plugin"),1);cs();ys();lt();Tc=require("@wengine-ai/claude-code-router-shared");Zt=new Map,_s=new Map,Yd=1,en={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,kc.default)(async(n,e)=>{let t={reporter:["console","temp-file"],...e},o=Array.isArray(t.reporter)?t.reporter:[t.reporter];if(t.outputHandlers&&t.outputHandlers.length>0)kt.registerHandlers(t.outputHandlers);else{let a=[];for(let i of o)i==="console"?a.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?a.push({type:"temp-file",enabled:!0,config:No()}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");a.length>0&&kt.registerHandlers(a)}t.outputOptions&&kt.setDefaultOptions(t.outputOptions);let r=async a=>{let i=n.tokenizerService;if(!i)return n.log?.warn("TokenizerService not available"),null;if(!a.provider||!a.model)return null;let c=a.provider,l=a.model,u=`${c}:${l}`;if(_s.has(u))return _s.get(u);let p=i.getTokenizerConfigForModel(c,l);if(!p)return n.log?.debug(`No tokenizer config for ${c}:${l}, using fallback`),null;try{let d=await i.getTokenizer(p,c);return _s.set(u,d),n.log?.info(`Created tokenizer for ${c}:${l} - ${d.name}`),d}catch(d){return n.log?.warn(`Failed to create tokenizer for ${c}:${l}: ${d.message}`),null}},s=a=>{let i=new URL(`http://127.0.0.1${a}`).pathname;return i.endsWith("/v1/messages")||i.endsWith("/v1/responses")};n.addHook("onRequest",async a=>{s(a.url)&&(a.requestStartTime=performance.now())}),n.addHook("onSend",async(a,i,c)=>{let l=a.requestStartTime;if(!l)return;let u=a.id||Date.now().toString(),p=a.usageSessionId||u,d=a.sessionId;if(!d)try{d=Ce(a.body?.metadata?.user_id)||p}catch{d=p}let f=await r(a);if(c instanceof ReadableStream){Zt.set(u,{requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:l,tokenCount:0,tokensPerSecond:0,stream:!0});let[_,b]=c.tee(),y=async()=>{let k=null,v=async x=>{let T=Zt.get(u);if(!T)return;let C=T.firstTokenTime?T.firstTokenTime-T.startTime:0,P=(x?T.lastTokenTime:performance.now())-T.startTime;T.tokensPerSecond=_c(T.tokenCount,P,C),await bc(T,o,t.outputOptions,x).catch(M=>{n.log?.warn(`Failed to output streaming stats: ${M.message}`)})};try{let T=b.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();for(k=setInterval(async()=>{Zt.get(u)&&await v(!1)},1e3);;){let{done:C,value:S}=await T.read();if(C)break;let P=S,M=Zt.get(u);if(!M)continue;let I=performance.now(),A=P.event||P.data?.type,w=P.event==="content_block_start"||P.event==="content_block_delta"||P.event==="text_block"||P.event==="content_block"||A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta";!M.firstTokenTime&&w&&(M.firstTokenTime=I,M.timeToFirstToken=Math.round(I-M.startTime));let O="";if(P.event==="content_block_delta"&&P.data?.delta){let $=P.data.delta.type;$==="text_delta"?O=P.data.delta.text||"":$==="input_json_delta"?O=P.data.delta.partial_json||"":$==="thinking_delta"&&(O=P.data.delta.thinking||"")}if((A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta")&&(O=typeof P.data?.delta=="string"?P.data.delta:""),O){let $=f&&f.encodeText?f.encodeText(O).length:qt(O);M.tokenCount+=$,M.lastTokenTime=I}(P.event==="message_stop"||A==="response.completed"||A==="response.failed")&&(k&&(clearInterval(k),k=null),await v(!0),Zt.delete(u))}}catch(x){k&&clearInterval(k),x.name!=="AbortError"&&x.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${x.message}`)}};return a.tokenSpeedCapturePromise=y().catch(k=>{console.log(k),n.log?.warn(`Background stats processing failed: ${k.message}`)}),_}let h=performance.now(),g=0,m=!1;if(c&&typeof c=="string")try{let _=JSON.parse(c);if(typeof _.usage?.output_tokens=="number")g=_.usage.output_tokens,m=!0;else{let b=_.content??_.message?.content;if(b!==void 0)if(m=!0,f)Array.isArray(b)?g=b.reduce((y,k)=>{if(k.type==="text"){let v=k.text||"";return y+(f.encodeText?f.encodeText(v).length:qt(v))}return y},0):typeof b=="string"&&(g=f.encodeText?f.encodeText(b).length:qt(b));else{let y=Array.isArray(b)?b.map(k=>k.text).join(""):typeof b=="string"?b:"";g=qt(y)}}}catch{}if(m){let _=h-l,b={requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:h,tokenCount:g,tokensPerSecond:_c(g,_),stream:!1};await bc(b,o,t.outputOptions,!0)}return c})})}});var bs=R(()=>{"use strict";sc();ic();vc();ys()});function xc(){if(process.env.VITEST||process.env.CI)throw new Error("Config write attempted during test/CI. Set CCR_CONFIG_DIR to a temp dir to isolate.")}var se,Ts,Le,V,ks,tn,nn,Tt,te,on,fe,Xd,$o,rn=R(()=>{"use strict";se=q(require("node:fs/promises"),1),Ts=q(require("json5"),1),Le=q(require("node:path"),1),V=require("@wengine-ai/claude-code-router-shared"),ks=n=>{if(typeof n=="string")return n.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(e,t,o)=>{let r=t||o;return process.env[r]||e});if(Array.isArray(n))return n.map(ks);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=ks(o);return e}return n},tn=async n=>{try{await se.default.access(n)}catch{await se.default.mkdir(n,{recursive:!0})}},nn=async()=>{await tn(V.HOME_DIR),await tn(V.PLUGINS_DIR),await tn(Le.default.join(V.HOME_DIR,"logs"))},Tt=async()=>{let n=await se.default.readFile(V.CONFIG_FILE,"utf-8");return Ts.default.parse(n)},te=async()=>{try{let n=await se.default.readFile(V.CONFIG_FILE,"utf-8");try{let e=Ts.default.parse(n);return ks(e)}catch(e){console.error(`Failed to parse config file at ${V.CONFIG_FILE}`),console.error("Error details:",e.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(n){if(n.code==="ENOENT")try{await nn();let e=await on();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await fe(t),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),t}catch(e){console.error("Failed to create default configuration:",e.message),process.exit(1)}else console.error(`Failed to read config file at ${V.CONFIG_FILE}`),console.error("Error details:",n.message),process.exit(1)}};on=async()=>{xc();try{if(await se.default.access(V.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${V.CONFIG_FILE}.${n}.bak`;await se.default.copyFile(V.CONFIG_FILE,e);try{let t=Le.default.dirname(V.CONFIG_FILE),o=Le.default.basename(V.CONFIG_FILE),s=(await se.default.readdir(t)).filter(a=>a.startsWith(o)&&a.endsWith(".bak")).sort().reverse();if(s.length>3)for(let a=3;a<s.length;a++){let i=Le.default.join(t,s[a]);await se.default.unlink(i)}}catch(t){console.warn("Failed to clean up old backups:",t)}return e}}catch(n){console.error("Failed to backup config file:",n)}return null},fe=async n=>{xc(),await tn(V.HOME_DIR),await Xd();let e=`${JSON.stringify(n,null,2)}`;await se.default.writeFile(V.CONFIG_FILE,e)},Xd=async()=>{if(!await se.default.access(V.CONFIG_FILE).then(()=>!0).catch(()=>!1))return;let e=Le.default.join(V.HOME_DIR,"config-history");await tn(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=Le.default.join(e,`config-${t}.json`);await se.default.copyFile(V.CONFIG_FILE,o);try{let s=(await se.default.readdir(e)).filter(a=>a.startsWith("config-")&&a.endsWith(".json")).sort().reverse();if(s.length>50)for(let a of s.slice(50))await se.default.unlink(Le.default.join(e,a))}catch(r){console.warn("Failed to prune config-history:",r)}},$o=async()=>{let n=await te();return Object.assign(process.env,n),n}});function Zd(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function qd(n){return n?.cache_creation_input_tokens??n?.input_tokens_details?.cache_creation_tokens??n?.input_tokens_details?.cache_write_tokens??n?.prompt_tokens_details?.cache_creation_tokens??n?.prompt_tokens_details?.cache_write_tokens??0}function Ne(n){if(!(!n||typeof n!="object"))return{...n,input_tokens:n.input_tokens??n.prompt_tokens??0,output_tokens:n.output_tokens??n.completion_tokens??0,cache_read_input_tokens:Zd(n),cache_creation_input_tokens:qd(n)}}function vt(n,e,t){let o=t?{}:n||{},r=e||{};return{...o,input_tokens:r.input_tokens||o.input_tokens||0,output_tokens:r.output_tokens||o.output_tokens||0,cache_read_input_tokens:r.cache_read_input_tokens||o.cache_read_input_tokens||0,cache_creation_input_tokens:r.cache_creation_input_tokens||o.cache_creation_input_tokens||0}}var vs=R(()=>{"use strict"});function Do(n,e,t){if(n){if(typeof n=="string"){let o=n.indexOf(",");if(o>0){let r=n.slice(0,o).trim(),s=n.slice(o+1).trim();r&&s&&e.has(r)&&t.add(xs(r,s))}return}if(Array.isArray(n)){for(let o of n)Do(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))Do(o,e,t)}}function Ss(n){let e=n?.Providers||n?.providers||[],t=new Set,o=new Set;for(let r of e){let s=r?.name;if(!s)continue;t.add(s);let a=Array.isArray(r?.models)?r.models:[];for(let i of a)i&&o.add(xs(s,i))}return Do(n?.Router,t,o),Do(n?.fallback,t,o),o}function xt(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Ss(n),r=0;for(let s of t.getAllStates()||[]){let a=s?.provider,i=s?.model;!a||!i||o.has(xs(a,i))||(t.recover(a,i),r++)}return r>0&&e?.info?.(`[health-reconcile] Pruned ${r} orphaned provider-health entr${r===1?"y":"ies"}`),r}catch(t){return e?.warn?.(`[health-reconcile] Failed to reconcile health store: ${t?.message||t}`),0}}function sn(n,e){try{if(!n)return 0;let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=0;for(let r of t.getAllStates()||[])r?.provider===n&&r?.model&&(t.recover(n,r.model),o++);return o>0&&e?.info?.(`[health-reconcile] Cleared ${o} health entr${o===1?"y":"ies"} for probed provider ${n}`),o}catch(t){return e?.warn?.(`[health-reconcile] Failed to clear provider health for ${n}: ${t?.message||t}`),0}}var ep,xs,an=R(()=>{"use strict";ue();ep="\0",xs=(n,e)=>`${n}${ep}${e}`});function tp(n){return/\[1m\]/i.test(n)?1e6:2e5}function np(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function op(n,e=n){let t=tp(n),o=np(n);return{type:"model",id:n,display_name:e,created_at:"2024-01-01T00:00:00Z",context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o,capabilities:{context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o}}}function rp(n,e,t){if(!n)return!1;try{return!n(e,t)}catch{return!1}}function Fo(n,e){let t=new Map,o=(r,s=r)=>{!r||t.has(r)||t.set(r,op(r,s))};o("ccr-opus","CCR Opus"),o("ccr-sonnet","CCR Sonnet"),o("ccr-haiku","CCR Haiku"),o("ccr-opus[1m]","CCR Opus 1M"),o("ccr-sonnet[1m]","CCR Sonnet 1M"),o("ccr-haiku[1m]","CCR Haiku 1M");for(let r of n.Providers||n.providers||[])if(!(!r?.name||!Array.isArray(r.models)))for(let s of r.models){if(typeof s!="string"||!s)continue;let a=rp(e,r.name,s);a||o(s,s),a||o(`${r.name},${s}`,`${r.name}/${s}`)}return Array.from(t.values())}var Cs=R(()=>{"use strict"});function sp(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var cn,Rs=R(()=>{"use strict";cn=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||sp(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let a=n.APIKEY;if(!a){let u=[`http://127.0.0.1:${n.PORT||3456}`,`http://localhost:${n.PORT||3456}`];if(e.headers.origin&&!u.includes(e.headers.origin)){t.status(403).send("CORS not allowed for this origin");return}else t.header("Access-Control-Allow-Origin",`http://127.0.0.1:${n.PORT||3456}`),t.header("Access-Control-Allow-Origin",`http://localhost:${n.PORT||3456}`);return o()}let i=e.headers.authorization||e.headers["x-api-key"],c=Array.isArray(i)?i[0]:i||"";if(!c){t.log.warn({url:e.url,headers:Object.keys(e.headers)},"[AUTH] No auth header"),t.status(401).send("APIKEY is missing");return}let l="";if(c.startsWith("Bearer")?l=c.split(" ")[1]:l=c,l!==a){t.log.warn({url:e.url,gotPrefix:l.slice(0,10),gotSuffix:l.slice(-6),gotLen:l.length,expectedPrefix:a.slice(0,6),expectedSuffix:a.slice(-6),expectedLen:a.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var Is={};bn(Is,{append:()=>mn,clear:()=>As,close:()=>Tp,getOldestRecordTimestamp:()=>vp,query:()=>Es,querySummary:()=>gn,readTokenSpeedStats:()=>Os});function up(){(0,Fe.existsSync)(jo)||(0,Fe.mkdirSync)(jo,{recursive:!0})}function fn(){if(De)return De;up();let n=(0,wc.openSqliteDatabase)(ip),e=n.db;n.driver==="node:sqlite"&&console.error(`[usage] better-sqlite3 unavailable, using built-in node:sqlite fallback. Reason: ${n.fallbackReason}`),e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("busy_timeout = 5000");let t=e.pragma("user_version",{simple:!0})||0;return t<1&&(dp(e),e.pragma("user_version = 1")),t<2&&(e.prepare("PRAGMA table_info(usage_records)").all().some(r=>r.name==="upstream_model")||e.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),e.pragma("user_version = 2")),fp(e),Ac(e,!0),Ps=e.prepare(`
321
321
  INSERT INTO usage_records (
322
322
  id, timestamp, session_id, provider, original_model, model, upstream_model, model_family,
323
323
  scenario_type, client_type,
@@ -331,7 +331,7 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
331
331
  @cache_read_input_tokens, @cache_creation_input_tokens, @ttft,
332
332
  @tokens_per_second, @duration_ms, @status, @error_message, @response_body
333
333
  )
334
- `),De=e,De}function up(n){n.exec(`
334
+ `),De=e,De}function dp(n){n.exec(`
335
335
  CREATE TABLE IF NOT EXISTS usage_records (
336
336
  id TEXT PRIMARY KEY,
337
337
  timestamp TEXT NOT NULL,
@@ -368,12 +368,12 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
368
368
  CREATE INDEX IF NOT EXISTS idx_usage_records_scenario_timestamp ON usage_records(scenario_type, timestamp);
369
369
  CREATE INDEX IF NOT EXISTS idx_usage_records_client_timestamp ON usage_records(client_type, timestamp);
370
370
  CREATE INDEX IF NOT EXISTS idx_usage_records_session_timestamp ON usage_records(session_id, timestamp);
371
- `)}function dp(n,e){return n.prepare("SELECT value FROM usage_meta WHERE key = ?").get(e)?.value}function ln(n,e,t){n.prepare(`
371
+ `)}function pp(n,e){return n.prepare("SELECT value FROM usage_meta WHERE key = ?").get(e)?.value}function ln(n,e,t){n.prepare(`
372
372
  INSERT INTO usage_meta (key, value)
373
373
  VALUES (?, ?)
374
374
  ON CONFLICT(key) DO UPDATE SET value = excluded.value
375
- `).run(e,t)}function pp(n){if(dp(n,Sc)||!(0,Fe.existsSync)(ws))return;let e=mp(n,"INSERT OR IGNORE"),t=(0,Fe.readFileSync)(ws,"utf-8"),o=0,r=0,s=0;n.transaction(()=>{for(let i of t.split(`
376
- `)){let c=i.trim();if(c)try{let l=JSON.parse(c);if(!fp(l)){r++;continue}e.run(Ec(Ho(l))).changes>0?o++:s++}catch{r++}}ln(n,Sc,new Date().toISOString()),ln(n,"legacy_usage_jsonl_migrated_path",ws),ln(n,"legacy_usage_jsonl_imported_count",String(o)),ln(n,"legacy_usage_jsonl_skipped_count",String(r)),ln(n,"legacy_usage_jsonl_duplicate_count",String(s))})()}function fp(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.id=="string"&&e.id.length>0&&typeof e.timestamp=="string"&&e.timestamp.length>0}function mp(n,e="INSERT"){return n.prepare(`
375
+ `).run(e,t)}function fp(n){if(pp(n,Sc)||!(0,Fe.existsSync)(ws))return;let e=gp(n,"INSERT OR IGNORE"),t=(0,Fe.readFileSync)(ws,"utf-8"),o=0,r=0,s=0;n.transaction(()=>{for(let i of t.split(`
376
+ `)){let c=i.trim();if(c)try{let l=JSON.parse(c);if(!mp(l)){r++;continue}e.run(Ec(Ho(l))).changes>0?o++:s++}catch{r++}}ln(n,Sc,new Date().toISOString()),ln(n,"legacy_usage_jsonl_migrated_path",ws),ln(n,"legacy_usage_jsonl_imported_count",String(o)),ln(n,"legacy_usage_jsonl_skipped_count",String(r)),ln(n,"legacy_usage_jsonl_duplicate_count",String(s))})()}function mp(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.id=="string"&&e.id.length>0&&typeof e.timestamp=="string"&&e.timestamp.length>0}function gp(n,e="INSERT"){return n.prepare(`
377
377
  ${e} INTO usage_records (
378
378
  id, timestamp, session_id, provider, original_model, model, upstream_model, model_family,
379
379
  scenario_type, client_type,
@@ -387,7 +387,7 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
387
387
  @cache_read_input_tokens, @cache_creation_input_tokens, @ttft,
388
388
  @tokens_per_second, @duration_ms, @status, @error_message, @response_body
389
389
  )
390
- `)}function gp(n,e,t){if(n<=0||e==null||!Number.isFinite(e))return null;let o=t!=null&&Number.isFinite(t)?t:0,r=Math.max((e-o)/1e3,ip);return Math.round(n/r)}function Ho(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?dn(n.ttft):null;return{...n,ttft:r,tokensPerSecond:gp(e,o,r)}}function $e(n){return typeof n=="string"?n:n==null?"":String(n)}function Uo(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function un(n){let e=Number(n);return Number.isFinite(e)?e:0}function Pc(n){return n==="success"?"success":"error"}function Ec(n){let e=Ho(n);return{id:$e(e.id),timestamp:$e(e.timestamp),session_id:$e(e.sessionId),provider:$e(e.provider),original_model:$e(e.originalModel),model:$e(e.model),upstream_model:Uo(e.upstreamModel)??null,model_family:$e(e.modelFamily),scenario_type:$e(e.scenarioType),client_type:Uo(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(un(e.inputTokens)),output_tokens:Math.trunc(un(e.outputTokens)),cache_read_input_tokens:Math.trunc(un(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(un(e.cacheCreationInputTokens)),ttft:dn(e.ttft),tokens_per_second:dn(e.tokensPerSecond),duration_ms:Math.trunc(un(e.durationMs)),status:Pc(e.status),error_message:Uo(e.errorMessage)??null,response_body:Uo(e.responseBody)??null}}function hp(n){return Ho({id:n.id,timestamp:n.timestamp,sessionId:n.session_id,provider:n.provider,originalModel:n.original_model,model:n.model,upstreamModel:n.upstream_model??void 0,modelFamily:n.model_family,scenarioType:n.scenario_type,clientType:n.client_type??void 0,stream:n.stream===1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,ttft:n.ttft,tokensPerSecond:n.tokens_per_second,durationMs:n.duration_ms,status:Pc(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function yp(){return new Date(Date.now()-ap*24*60*60*1e3).toISOString()}function Ac(n,e=!1){let t=Date.now();!e&&t-Cc<cp||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(yp()),Cc=t)}function Oc(n){let e=[],t=[];return n.startTime&&(e.push("timestamp >= ?"),t.push(n.startTime)),n.endTime&&(e.push("timestamp <= ?"),t.push(n.endTime)),n.model&&(e.push("model = ?"),t.push(n.model)),n.provider&&(e.push("provider = ?"),t.push(n.provider)),n.scenario&&(e.push("scenario_type = ?"),t.push(n.scenario)),n.clientType&&(n.clientType==="unknown"?(e.push("(client_type IS NULL OR client_type = '' OR client_type = ?)"),t.push(n.clientType)):(e.push("client_type = ?"),t.push(n.clientType))),n.sessionId&&(e.push("session_id = ?"),t.push(n.sessionId)),n.status&&(e.push("status = ?"),t.push(n.status)),{sql:e.length>0?`WHERE ${e.join(" AND ")}`:"",params:t}}function xt(n,e,t,o=""){let r=o?e.sql?`${e.sql} AND ${o}`:`WHERE ${o}`:e.sql,s=n.prepare(`
390
+ `)}function hp(n,e,t){if(n<=0||e==null||!Number.isFinite(e))return null;let o=t!=null&&Number.isFinite(t)?t:0,r=Math.max((e-o)/1e3,ap);return Math.round(n/r)}function Ho(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?dn(n.ttft):null;return{...n,ttft:r,tokensPerSecond:hp(e,o,r)}}function $e(n){return typeof n=="string"?n:n==null?"":String(n)}function Uo(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function un(n){let e=Number(n);return Number.isFinite(e)?e:0}function Pc(n){return n==="success"?"success":"error"}function Ec(n){let e=Ho(n);return{id:$e(e.id),timestamp:$e(e.timestamp),session_id:$e(e.sessionId),provider:$e(e.provider),original_model:$e(e.originalModel),model:$e(e.model),upstream_model:Uo(e.upstreamModel)??null,model_family:$e(e.modelFamily),scenario_type:$e(e.scenarioType),client_type:Uo(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(un(e.inputTokens)),output_tokens:Math.trunc(un(e.outputTokens)),cache_read_input_tokens:Math.trunc(un(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(un(e.cacheCreationInputTokens)),ttft:dn(e.ttft),tokens_per_second:dn(e.tokensPerSecond),duration_ms:Math.trunc(un(e.durationMs)),status:Pc(e.status),error_message:Uo(e.errorMessage)??null,response_body:Uo(e.responseBody)??null}}function yp(n){return Ho({id:n.id,timestamp:n.timestamp,sessionId:n.session_id,provider:n.provider,originalModel:n.original_model,model:n.model,upstreamModel:n.upstream_model??void 0,modelFamily:n.model_family,scenarioType:n.scenario_type,clientType:n.client_type??void 0,stream:n.stream===1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,ttft:n.ttft,tokensPerSecond:n.tokens_per_second,durationMs:n.duration_ms,status:Pc(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function _p(){return new Date(Date.now()-cp*24*60*60*1e3).toISOString()}function Ac(n,e=!1){let t=Date.now();!e&&t-Cc<lp||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(_p()),Cc=t)}function Oc(n){let e=[],t=[];return n.startTime&&(e.push("timestamp >= ?"),t.push(n.startTime)),n.endTime&&(e.push("timestamp <= ?"),t.push(n.endTime)),n.model&&(e.push("model = ?"),t.push(n.model)),n.provider&&(e.push("provider = ?"),t.push(n.provider)),n.scenario&&(e.push("scenario_type = ?"),t.push(n.scenario)),n.clientType&&(n.clientType==="unknown"?(e.push("(client_type IS NULL OR client_type = '' OR client_type = ?)"),t.push(n.clientType)):(e.push("client_type = ?"),t.push(n.clientType))),n.sessionId&&(e.push("session_id = ?"),t.push(n.sessionId)),n.status&&(e.push("status = ?"),t.push(n.status)),{sql:e.length>0?`WHERE ${e.join(" AND ")}`:"",params:t}}function St(n,e,t,o=""){let r=o?e.sql?`${e.sql} AND ${o}`:`WHERE ${o}`:e.sql,s=n.prepare(`
391
391
  SELECT ${t} AS key, ${bp}
392
392
  FROM usage_records ${r}
393
393
  GROUP BY key
@@ -402,14 +402,14 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
402
402
  AVG(CASE WHEN status = 'success' AND ttft IS NOT NULL THEN ttft END) AS avgTtft,
403
403
  AVG(CASE WHEN status = 'success' AND tokens_per_second IS NOT NULL THEN tokens_per_second END) AS avgTokensPerSecond
404
404
  FROM usage_records ${t.sql}
405
- `).get(...t.params);return{totalRequests:o.totalRequests,successCount:o.successCount,errorCount:o.totalRequests-o.successCount,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,totalCacheReadInputTokens:o.totalCacheReadInputTokens,totalCacheCreationInputTokens:o.totalCacheCreationInputTokens,avgTtft:o.avgTtft!=null?Math.round(o.avgTtft):null,avgTokensPerSecond:o.avgTokensPerSecond!=null?Math.round(o.avgTokensPerSecond):null,byModel:xt(n,t,"model"),byProvider:xt(n,t,"provider"),byScenario:xt(n,t,"scenario_type"),byFamily:xt(n,t,"model_family || '/' || scenario_type","model_family IS NOT NULL AND model_family != ''"),byDay:xt(n,t,"date(timestamp, 'localtime')"),byClient:xt(n,t,"CASE WHEN client_type IS NULL OR client_type = '' THEN 'unknown' ELSE client_type END")}}function mn(n){let e=fn(),t=Ho(n);Ps.run(Ec(t)),Ac(e)}function Es(n){let e=fn(),t=Oc(n),o=Number.isFinite(n.page)&&n.page>0?Math.floor(n.page):1,r=Number.isFinite(n.pageSize)&&n.pageSize>0?Math.min(Math.floor(n.pageSize),_p):50,s=(o-1)*r,a=e.prepare(`SELECT COUNT(*) AS count FROM usage_records ${t.sql}`).get(...t.params),i=e.prepare(`SELECT * FROM usage_records ${t.sql} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...t.params,r,s),c=Ic(e,n);return{records:i.map(hp),summary:c,total:a.count,page:o,pageSize:r}}function gn(n,e,t){let o=fn();return Ic(o,{startTime:n,endTime:e,status:t})}function As(n){let e=fn();if(!n){e.prepare("DELETE FROM usage_records").run();return}e.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(n)}function kp(){De&&(De.pragma("wal_checkpoint(TRUNCATE)"),De.close(),De=null,Ps=null)}function dn(n){if(n==null)return null;if(typeof n=="number")return n;let e=parseFloat(String(n));return isNaN(e)?null:e}function Os(n){let e=(0,pn.join)((0,Rc.tmpdir)(),St.TOKEN_SPEED_TEMP_SUBDIRECTORY,`session-${(0,St.sanitizeTempFileKey)(n)}.json`);try{let t=JSON.parse((0,Fe.readFileSync)(e,"utf-8"));return{ttft:dn(t.timeToFirstToken),tokensPerSecond:dn(t.tokensPerSecond)}}catch{return{ttft:null,tokensPerSecond:null}}}function Tp(n,e,t){return fn().prepare("SELECT MIN(timestamp) AS timestamp FROM usage_records WHERE provider = ? AND timestamp >= ? AND timestamp <= ?").get(n,e,t)?.timestamp??void 0}var Fe,pn,Rc,wc,St,jo,sp,ws,ip,ap,cp,Sc,De,Ps,Cc,bp,_p,hn=w(()=>{"use strict";Fe=require("fs"),pn=require("path"),Rc=require("os"),wc=require("@wengine-ai/claude-code-router-shared"),St=require("@wengine-ai/claude-code-router-shared"),jo=(0,pn.join)(St.HOME_DIR,"data"),sp=(0,pn.join)(jo,"usage.sqlite"),ws=(0,pn.join)(jo,"usage.jsonl"),ip=1,ap=180,cp=3600*1e3,Sc="legacy_usage_jsonl_migrated_at",De=null,Ps=null,Cc=0;bp=`
405
+ `).get(...t.params);return{totalRequests:o.totalRequests,successCount:o.successCount,errorCount:o.totalRequests-o.successCount,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,totalCacheReadInputTokens:o.totalCacheReadInputTokens,totalCacheCreationInputTokens:o.totalCacheCreationInputTokens,avgTtft:o.avgTtft!=null?Math.round(o.avgTtft):null,avgTokensPerSecond:o.avgTokensPerSecond!=null?Math.round(o.avgTokensPerSecond):null,byModel:St(n,t,"model"),byProvider:St(n,t,"provider"),byScenario:St(n,t,"scenario_type"),byFamily:St(n,t,"model_family || '/' || scenario_type","model_family IS NOT NULL AND model_family != ''"),byDay:St(n,t,"date(timestamp, 'localtime')"),byClient:St(n,t,"CASE WHEN client_type IS NULL OR client_type = '' THEN 'unknown' ELSE client_type END")}}function mn(n){let e=fn(),t=Ho(n);Ps.run(Ec(t)),Ac(e)}function Es(n){let e=fn(),t=Oc(n),o=Number.isFinite(n.page)&&n.page>0?Math.floor(n.page):1,r=Number.isFinite(n.pageSize)&&n.pageSize>0?Math.min(Math.floor(n.pageSize),kp):50,s=(o-1)*r,a=e.prepare(`SELECT COUNT(*) AS count FROM usage_records ${t.sql}`).get(...t.params),i=e.prepare(`SELECT * FROM usage_records ${t.sql} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...t.params,r,s),c=Ic(e,n);return{records:i.map(yp),summary:c,total:a.count,page:o,pageSize:r}}function gn(n,e,t){let o=fn();return Ic(o,{startTime:n,endTime:e,status:t})}function As(n){let e=fn();if(!n){e.prepare("DELETE FROM usage_records").run();return}e.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(n)}function Tp(){De&&(De.pragma("wal_checkpoint(TRUNCATE)"),De.close(),De=null,Ps=null)}function dn(n){if(n==null)return null;if(typeof n=="number")return n;let e=parseFloat(String(n));return isNaN(e)?null:e}function Os(n){let e=(0,pn.join)((0,Rc.tmpdir)(),Ct.TOKEN_SPEED_TEMP_SUBDIRECTORY,`session-${(0,Ct.sanitizeTempFileKey)(n)}.json`);try{let t=JSON.parse((0,Fe.readFileSync)(e,"utf-8"));return{ttft:dn(t.timeToFirstToken),tokensPerSecond:dn(t.tokensPerSecond)}}catch{return{ttft:null,tokensPerSecond:null}}}function vp(n,e,t){return fn().prepare("SELECT MIN(timestamp) AS timestamp FROM usage_records WHERE provider = ? AND timestamp >= ? AND timestamp <= ?").get(n,e,t)?.timestamp??void 0}var Fe,pn,Rc,wc,Ct,jo,ip,ws,ap,cp,lp,Sc,De,Ps,Cc,bp,kp,hn=R(()=>{"use strict";Fe=require("fs"),pn=require("path"),Rc=require("os"),wc=require("@wengine-ai/claude-code-router-shared"),Ct=require("@wengine-ai/claude-code-router-shared"),jo=(0,pn.join)(Ct.HOME_DIR,"data"),ip=(0,pn.join)(jo,"usage.sqlite"),ws=(0,pn.join)(jo,"usage.jsonl"),ap=1,cp=180,lp=3600*1e3,Sc="legacy_usage_jsonl_migrated_at",De=null,Ps=null,Cc=0;bp=`
406
406
  COUNT(*) AS count,
407
407
  COALESCE(SUM(CASE WHEN status = 'success' THEN input_tokens ELSE 0 END), 0) AS inputTokens,
408
408
  COALESCE(SUM(CASE WHEN status = 'success' THEN output_tokens ELSE 0 END), 0) AS outputTokens,
409
409
  COALESCE(SUM(CASE WHEN status = 'success' THEN cache_read_input_tokens ELSE 0 END), 0) AS cacheReadInputTokens,
410
410
  COALESCE(SUM(CASE WHEN status = 'success' THEN cache_creation_input_tokens ELSE 0 END), 0) AS cacheCreationInputTokens
411
- `;_p=200});async function Dc(){let n=(0,Lc.homedir)(),e=(0,Nc.join)(n,".claude.json");if(!(0,Mc.existsSync)(e)){let o={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,$c.writeFile)(e,JSON.stringify(o,null,2))}}var Mc,Lc,Nc,$c,Fc=w(()=>{"use strict";Mc=require("fs"),Lc=require("os"),Nc=require("path"),$c=require("fs/promises")});function jc(n=(0,Ms.join)(Hc.HOME_DIR,"logs")){try{if(!(0,Ue.existsSync)(n))return;let e=Date.now()-xp;for(let t of(0,Ue.readdirSync)(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=(0,Ms.join)(n,t),r=(0,Ue.statSync)(o);r.isFile()&&r.mtime.getTime()<e&&(0,Ue.unlinkSync)(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function zc(){Uc||(Uc=!0,jc(),setInterval(jc,Sp).unref())}var Ue,Ms,Hc,vp,xp,Sp,Uc,Bc=w(()=>{"use strict";Ue=require("fs"),Ms=require("path"),Hc=require("@wengine-ai/claude-code-router-shared"),vp=7,xp=vp*24*60*60*1e3,Sp=1440*60*1e3,Uc=!1});async function Jc(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:a={}}=o;switch(r){case"token-speed":bt.registerPlugin(en,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:No()}],...a});break;default:console.warn(`Unknown plugin: ${r}`);break}}await bt.enablePlugins(n)}var Wc=w(()=>{"use strict";_s()});function Ct(n,e,t){if(n?.configService)try{n.configService.reload(),n.reloadProviders?n.reloadProviders(e):(n.configService.set("providers",e?.Providers??e?.providers??[]),n.providerService?.reload()),vt(e,t),Oo();let o={enabled:n.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:n.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:n.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(n.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:n.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:n.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};n.activeProbeService=yt(()=>n.providerService.getProviders(),o,r=>ge(n.configService,r),t,r=>n.configService.get(r))}catch(o){t.warn(`Config saved but runtime reload failed: ${o?.message||o}`)}}var zo=w(()=>{"use strict";an();Io();ae()});function Vc(n){try{let e=JSON.parse((0,H.readFileSync)((0,_e.join)(Cp(n),"plugins.json"),"utf8"));return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"):[]}catch{return[]}}function Ns(n,e){if(!Gc(e))return null;try{let t=(0,H.realpathSync)(n),o=(0,_e.join)(t,"plugins"),r=(0,_e.join)(o,e);return(0,H.lstatSync)(o).isSymbolicLink()||!(0,H.lstatSync)(o).isDirectory()||(0,H.lstatSync)(r).isSymbolicLink()||!(0,H.lstatSync)(r).isDirectory()||(0,H.realpathSync)(o)!==o||(0,H.realpathSync)(r)!==r||!r.startsWith(o+_e.sep)?null:r}catch{return null}}function Ls(n,e,t){if(!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t))throw new Error("invalid plugin file");let o=Ns(n,e);if(!o)throw new Error("unsafe plugin directory");let r=(0,_e.join)(o,t),s=(0,H.lstatSync)(r);if(s.isSymbolicLink()||!s.isFile()||(0,H.realpathSync)(r)!==r)throw new Error("unsafe plugin file");let a=(0,H.openSync)(r,H.constants.O_RDONLY|H.constants.O_NOFOLLOW|H.constants.O_NONBLOCK);try{let i=(0,H.fstatSync)(a),c=(0,H.lstatSync)(r);if(!i.isFile()||c.isSymbolicLink()||i.dev!==s.dev||i.ino!==s.ino||i.dev!==c.dev||i.ino!==c.ino||Ns(n,e)!==o||(0,H.realpathSync)(r)!==r)throw new Error("plugin file changed while opening");return(0,H.readFileSync)(a)}finally{(0,H.closeSync)(a)}}function Rp(n){let e=n?.configService,t=e?Qs(e):String(process.env.SUBSCRIPTION_PROXY_URL??"").trim()||void 0;return Ys(t)}async function Qc(n){let{configDir:e,log:t}=n,o=n.registry??n.getServer()?.pluginRegistry??sr(),r={configDir:e,readConfig:()=>te(),readRawConfig:()=>kt(),writeConfig:i=>fe(i),reloadRuntime:async i=>Ct(n.getServer(),i??await te(),t),getDirectDispatcher:Qo,getSubscriptionDispatcher:()=>Rp(n.getServer())},s={loaded:[],failed:[],skipped:[]},a=new Set;for(let i of Vc(e)){let c;try{if(!Gc(i.name))throw new Error("invalid plugin install name");if(a.has(i.name))throw new Error(`duplicate plugin install record "${i.name}"`);if(a.add(i.name),i.enabled===!1){s.skipped.push({name:i.name,reason:"disabled"});continue}let l=Ns(e,i.name);if(!l){s.skipped.push({name:i.name,reason:"directory missing or unsafe"});continue}let u;try{let f=JSON.parse(Ls(e,i.name,"plugin.json").toString("utf8"));if(!f||typeof f.name!="string"||typeof f.version!="string")throw new Error;u={name:f.name,version:f.version,coreApi:String(f.coreApi??"1"),description:f.description}}catch{throw new Error("plugin.json missing or malformed")}if(u.name!==i.name)throw new Error("manifest name does not match install directory");if(u.coreApi.split(".")[0]!=="1".split(".")[0])throw new Error(`coreApi ${u.coreApi} incompatible with core ${"1"}`);let p=o.beginActivation(u,{info:f=>t.info(`[plugin:${u.name}] ${f}`),warn:f=>t.warn(`[plugin:${u.name}] ${f}`),error:f=>t.error(`[plugin:${u.name}] ${f}`)},r,l);c=p,Ls(e,i.name,"plugin.js");let d=await import((0,Kc.pathToFileURL)((0,_e.join)(l,"plugin.js")).href),m=d?.activate??d?.default?.activate;if(typeof m!="function")throw new Error("entry exports no activate()");await m(p.context);let h=p.cardPath?Ls(e,i.name,p.cardPath):void 0;await p.commit(h,n.getServer()?.app),s.loaded.push(u.name),t.info(`plugin loaded: ${u.name}@${u.version}`)}catch(l){c?.abort(),s.failed.push({name:i.name,error:l?.message??String(l)}),t.warn(`plugin ${i.name} failed to load: ${l?.message??String(l)}`)}}return s}function Yc(n,e=sr()){let t=new Map(e.listLoadedPlugins().map(o=>[o.name,o]));return Vc(n).map(o=>{let r=o.enabled!==!1?t.get(o.name):void 0;return r?{...r,enabled:!0}:{name:o.name,version:null,enabled:o.enabled!==!1,error:"plugin missing or failed to load \u2014 its providers are unavailable until it is reinstalled"}})}var H,_e,Kc,Gc,Cp,$s=w(()=>{"use strict";H=require("node:fs"),_e=require("node:path"),Kc=require("node:url");or();En();zo();rn();ae();Gc=n=>/^[a-z0-9][a-z0-9-]*$/i.test(n),Cp=n=>(0,_e.join)(n,"plugins")});async function Pp(n,e,t){let o=`${n}/-/v1/search?text=${encodeURIComponent(`keywords:${e}`)}&size=100`,r=await fetch(o,{signal:AbortSignal.timeout(t),headers:{accept:"application/json"}});if(!r.ok)throw new Error(`registry_status_${r.status}`);let s=await r.json();return Array.isArray(s?.objects)?s.objects:[]}async function Ep(n,e={}){let t=(e.registryBase??wp).replace(/\/$/,""),o=e.timeoutMs??3e4,r=await Promise.allSettled(Xc.map(f=>Pp(t,f,o))),s=new Map,a=!1;for(let f of r)if(f.status==="fulfilled"){a=!0;for(let g of f.value){let y=g?.package,_=typeof y?.name=="string"?y.name:"";if(!_||!me.NPM_SPEC_PATTERN.test(_)||!(Array.isArray(y?.keywords)?y.keywords.filter(v=>typeof v=="string"):[]).some(v=>Xc.includes(v)))continue;let k=typeof y?.version=="string"?y.version:"";s.has(_)||s.set(_,{name:_,version:k,description:typeof y?.description=="string"?y.description:""})}}if(!a)return{ok:!0,plugins:[],warning:"registry_unavailable"};let i=(0,me.readPluginRecords)(n),c=new Map(i.map(f=>[f.name,f])),l=new Map(i.filter(f=>typeof f.source=="string"&&f.source!=="").map(f=>[f.source,f])),u=f=>{if(!me.PLUGIN_NAME_PATTERN.test(f))return null;try{let g=JSON.parse((0,yn.readFileSync)((0,Bo.join)(n,"plugins",f,"plugin.json"),"utf8"));return typeof g?.version=="string"?g.version:null}catch{return null}},p=[...s.values()].sort((f,g)=>f.name.localeCompare(g.name)).map(f=>{let g=c.get(f.name)??l.get(f.name),y=g!==void 0||(0,yn.existsSync)((0,Bo.join)(n,"plugins",f.name)),_=y?u(g?g.name:f.name):null;return{...f,installed:y,installedVersion:_,...y&&_!==null&&_!==f.version?{updateAvailable:!0}:{}}}),d=new Set(p.map(f=>f.name)),m=new Set,h=new Map;for(let[f,g]of l)m.add(g.name),!d.has(f)&&h.set(f,g.name);for(let f of i)d.has(f.name)||m.has(f.name)||h.set(f.name,f.name);for(let[f,g]of h){if(!me.PLUGIN_NAME_PATTERN.test(g)||!(0,yn.existsSync)((0,Bo.join)(n,"plugins",g)))continue;let y=u(g);y!==null&&p.push({name:f,description:"",version:y,installed:!0,installedVersion:y,localOnly:!0})}return p.sort((f,g)=>f.name.localeCompare(g.name)),{ok:!0,plugins:p}}function Ap(n){switch(n){case"invalid_spec":return 400;case"already_installed":case"plugins_json_corrupted":return 409;case"npm_pack_failed":case"npm_pack_timeout":return 502;case"archive_too_large":case"archive_too_many_files":case"unsafe_archive_member":case"extract_failed":case"invalid_manifest":return 422;default:return 500}}function Zc(n,e,t){let o=n.ip||n.connection?.remoteAddress||"";if(!(o==="127.0.0.1"||o==="::1"||o==="::ffff:127.0.0.1"))return!1;let s=e.server?.address?.(),a=typeof s?.port=="number"&&s.port>0?s.port:t,i=new Set([`127.0.0.1:${a}`,`localhost:${a}`,`[::1]:${a}`]),c=n.headers?.host;if(typeof c=="string"&&!i.has(c))return!1;let l=n.headers?.origin;if(l!==void 0&&l!==""){if(typeof l!="string")return!1;let u="";try{let p=new URL(l);if(!["http:","https:"].includes(p.protocol))return!1;u=p.host}catch{return!1}if(!i.has(u))return!1}return!0}function qc(n,e){let t=e.configuredPort??3456,o=(r,s,a)=>r.status(s).send({ok:!1,error:a});n.get("/api/plugins/catalog",async(r,s)=>{if(!Zc(r,n,t))return o(s,403,"local_only");try{return await Ep(e.configDir,{registryBase:e.catalogRegistryBase??e.registry,timeoutMs:e.catalogTimeoutMs})}catch(a){return n.log?.warn?.(`plugin catalog failed: ${a?.code??a?.name??"error"}`),{ok:!0,plugins:[],warning:"registry_unavailable"}}}),n.post("/api/plugins/install",async(r,s)=>{if(!Zc(r,n,t))return o(s,403,"local_only");let a=r.body??{},i=a.name??a.spec,c=a.force===!0;try{let l=await(0,me.installPluginFromNpm)({spec:i,configDir:e.configDir,force:c,registry:e.registry,timeoutMs:e.npmTimeoutMs});return n.log?.info?.(`provider plugin installed via API: ${l.manifest.name}@${l.manifest.version} (restart to activate)`),{ok:!0,name:l.manifest.name,version:l.manifest.version,restartRequired:!0}}catch(l){if(l instanceof me.PluginInstallError){let u=Ap(l.code);return u===502?n.log?.warn?.(`plugin install failed: ${l.code}`):n.log?.warn?.(`plugin install rejected: ${l.code}: ${l.message}`),o(s,u,l.code)}return n.log?.error?.(`plugin install crashed: ${l?.message??l}`),o(s,500,"install_failed")}})}var yn,Bo,me,Xc,wp,el=w(()=>{"use strict";yn=require("node:fs"),Bo=require("node:path"),me=require("@wengine-ai/claude-code-router-shared"),Xc=["ccr-provider-plugin","claude-code-router-plugin"],wp="https://registry.npmjs.org"});function tl(n){let e=j();return Fo(n,(t,o)=>e.isAvailable(t,o))}function nl(n,e,t){return e.failed.length===0?!0:(n.log?.warn?.({source:t,projectTakeoverSync:e},"Client configuration changed but some project takeovers failed to sync"),!1)}function Op(n){let e=new Date().toISOString(),t=new Date(Date.now()-300*60*1e3).toISOString(),o=new Date(Date.now()-10080*60*1e3).toISOString(),r=gn(t,e),s=gn(o,e),a=[],i=new Set;for(let c of n||[])c&&c.name&&i.add(c.name);for(let c of Object.keys(r.byProvider||{}))i.add(c);for(let c of Object.keys(s.byProvider||{}))i.add(c);for(let c of i){let l=r.byProvider[c]||{inputTokens:0,outputTokens:0},u=s.byProvider[c]||{inputTokens:0,outputTokens:0},p=(l.inputTokens||0)+(l.outputTokens||0),d=(u.inputTokens||0)+(u.outputTokens||0),m,h,f=(n||[]).find(g=>g&&g.name===c);f&&f.quota&&(m=f.quota.limit5h,h=f.quota.limit7d),a.push({provider:c,used5h:p,used7d:d,limit5h:m,limit7d:h})}return a}async function cl(n,e){let t=n.app;nt(),it(),t.register(il.default,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let i=tl(e);return{object:"list",data:i,first_id:i[0]?.id||null,last_id:i[i.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(i,c)=>{let l=decodeURIComponent(i.params.modelId),u=tl(e).find(p=>p.id===l);return u||(c.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${l}`}})}),t.post("/v1/messages/count_tokens",async(i,c)=>{let{messages:l,tools:u,system:p,model:d}=i.body,m=t._server.tokenizerService;if(d&&d.includes(",")&&m)try{let[f,g]=d.split(",");i.log?.info(`Looking up tokenizer for provider: ${f}, model: ${g}`);let y=m.getTokenizerConfigForModel(f,g);y?i.log?.info(`Using tokenizer config: ${JSON.stringify(y)}`):i.log?.warn(`No tokenizer config found for ${f},${g}, using default tiktoken`);let _=await m.countTokens({messages:l,system:p,tools:u},y,f);return{input_tokens:_.tokenCount,tokenizer:_.tokenizerUsed}}catch(f){i.log?.error(`Error using configured tokenizer: ${f.message}`),i.log?.error(f.stack)}else d?d.includes(",")?m||i.log?.warn("TokenizerService not available, using default tiktoken"):i.log?.info(`Model "${d}" does not contain comma, using default tiktoken`):i.log?.info("No model specified, using default tiktoken");return{input_tokens:Ft(l,p,u)}}),t.get("/api/config",async(i,c)=>await kt()),t.get("/api/transformers",async(i,c)=>{let l=t._server.transformerService.getAllTransformers();return{transformers:Array.from(l.entries()).map(([p,d])=>({name:p,endpoint:d.endPoint||null}))}}),t.post("/api/config",async(i,c)=>{let l=i.body,u=Vs(l||{});if(u.length>0)return c.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(f=>`${f.key}: ${f.error}`).join("; "),proxyErrors:u};let p=await on();p&&console.log(`Backed up existing configuration file to ${p}`);let d=null;try{d=await te()}catch{}let m=(0,ol.ensureCcrSelfProvider)(l,d);n.pluginRegistry.applyConfigProtectors(l,d),await fe(l);let h;try{h=await(0,E.syncGlobalProjectTakeovers)(l),h.failed.length>0&&t.log?.warn?.({projectTakeoverSync:h},"Config saved but some global project takeovers failed to sync")}catch(f){t.log?.warn?.(`Config saved but global project takeover sync failed: ${f?.message||f}`)}return Ct(n,l,t.log),{success:!0,message:"Config saved successfully",projectTakeoverSync:h}}),t.get("/api/clients",async(i,c)=>{try{let l=await te();return{clients:(0,E.listClientStatuses)(l)}}catch(l){console.error("Failed to get client integrations:",l),c.status(500).send({error:l.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(i,c)=>{try{let l=i.body,u=Array.isArray(l?.enabled)?l.enabled:[],p=await te(),d=(0,E.applyClientSelection)(p,u);await fe(d.config);let m=await(0,E.syncGlobalProjectTakeovers)(d.config),h=nl(t,m,"clients/apply");return{...d,success:d.success&&h,projectTakeoverSync:m}}catch(l){console.error("Failed to apply client integrations:",l),c.status(500).send({error:l.message||"Failed to apply client integrations"})}});async function o(i,c,l){try{let{id:u}=i.params;if(!(0,E.isClientId)(u)){c.status(404).send({error:`Unknown client: ${u}`});return}let p=await te(),d=l==="enable"?(0,E.enableClient)(p,u):l==="restore"?(0,E.restoreClient)(p,u):(0,E.disableClient)(p,u);await fe(p);let m=await(0,E.syncGlobalProjectTakeovers)(p),h=nl(t,m,`clients/${u}/${l}`);return{success:d.success&&h,result:d,results:[d],clients:(0,E.listClientStatuses)(p),config:p,projectTakeoverSync:m}}catch(u){console.error(`Failed to ${l} client integration:`,u),c.status(500).send({error:u.message||`Failed to ${l} client integration`})}}t.post("/api/clients/:id/enable",async(i,c)=>o(i,c,"enable")),t.post("/api/clients/:id/disable",async(i,c)=>o(i,c,"disable")),t.post("/api/clients/:id/restore",async(i,c)=>o(i,c,"restore")),t.get("/api/projects",async(i,c)=>{try{let l=await(0,E.listProjectConfigs)();return{projects:await Promise.all(l.map(async p=>{let d=await(0,E.getProjectTakeoverClients)(p.path);return{...p,ccrTakeoverClients:d,ccrTakeover:d.length>0}}))}}catch(l){console.error("Failed to list project configs:",l),c.status(500).send({error:l.message||"Failed to list project configs"})}}),t.post("/api/projects",async(i,c)=>{try{let{path:l}=i.body||{};if(!l||typeof l!="string"||!(0,Z.isAbsolute)(l)){c.status(400).send({error:"A valid absolute project path is required"});return}let u=(0,Z.normalize)(l).replace(/[\\/]+$/,"")||l;if(await(0,E.readProjectConfig)(u)){c.status(409).send({error:"Project is already configured"});return}await(0,E.writeProjectConfig)(u,{Router:{}});try{let m=await te();await(0,E.setProjectTakeover)(u,["claudeCode"],m)}catch(m){console.error("Failed to auto-enable ccr takeover for new project:",m)}let d=await(0,E.getProjectTakeoverClients)(u);return{id:(0,E.getClaudeProjectId)(u),path:u,configPath:(0,E.getProjectConfigPath)(u),Router:{},ccrTakeoverClients:d,ccrTakeover:d.length>0}}catch(l){console.error("Failed to add project config:",l),c.status(500).send({error:l.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,{Router:u}=i.body||{};if(!u||typeof u!="object"){c.status(400).send({error:"Router must be an object"});return}let p=await(0,E.readProjectConfigById)(l);if(!p){c.status(404).send({error:"Project config not found"});return}await(0,E.writeProjectConfig)(p.path,{Router:u});let d=await te();Object.keys(u).length===0?await(0,E.refreshProjectTakeovers)(p.path,d):(await(0,E.refreshCcrProjectTakeover)(p.path,d,u),await(0,E.refreshPiProjectTakeover)(p.path,d,u));let m=await(0,E.getProjectTakeoverClients)(p.path);return{id:l,path:p.path,configPath:p.configPath,Router:u,ccrTakeoverClients:m,ccrTakeover:m.length>0}}catch(l){console.error("Failed to update project config:",l),c.status(500).send({error:l.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(i,c)=>{try{let{id:l}=i.params,u=i.body||{},p;if(Array.isArray(u.clients))p=u.clients.filter(E.isProjectTakeoverClient);else if(typeof u.enabled=="boolean")p=u.enabled?["claudeCode"]:[];else{c.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let d=await(0,E.readProjectConfigById)(l);if(!d){c.status(404).send({error:"Project config not found"});return}let m=await te(),h=await(0,E.setProjectTakeover)(d.path,p,m);return{id:l,path:d.path,ccrTakeoverClients:h,ccrTakeover:h.length>0}}catch(l){console.error("Failed to update ccr takeover status:",l),c.status(500).send({error:l.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,u=await(0,E.readProjectConfigById)(l);if(!u){c.status(404).send({error:"Project config not found"});return}try{let p=await te();await(0,E.setProjectTakeover)(u.path,[],p)}catch(p){console.error("Failed to remove ccr takeover while deleting project:",p)}return await(0,E.deleteProjectConfig)(u.path),{success:!0}}catch(l){console.error("Failed to delete project config:",l),c.status(500).send({error:l.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:(0,Z.dirname)((0,rl.fileURLToPath)(void 0)),s=(0,z.existsSync)((0,Z.join)(r,"index.html"))?r:(0,z.existsSync)((0,Z.join)(r,"..","index.html"))?(0,Z.join)(r,".."):(0,Z.join)(r,"..","dist");t.register(sl.default,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(i,c)=>c.redirect("/ui/")),t.get("/api/logs/files",async(i,c)=>{try{let l=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs"),u=[];if((0,z.existsSync)(l)){let p=(0,z.readdirSync)(l);for(let d of p)if(d.endsWith(".log")){let m=(0,Z.join)(l,d),h=(0,z.statSync)(m);u.push({name:d,path:m,size:h.size,lastModified:h.mtime.toISOString()})}u.sort((d,m)=>new Date(m.lastModified).getTime()-new Date(d.lastModified).getTime())}return u}catch(l){console.error("Failed to get log files:",l),c.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs","app.log"),(0,z.existsSync)(u)?(0,z.readFileSync)(u,"utf8").split(`
412
- `).filter(m=>m.trim()):[]}catch(l){console.error("Failed to get logs:",l),c.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs","app.log"),(0,z.existsSync)(u)&&(0,z.writeFileSync)(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(l){console.error("Failed to clear logs:",l),c.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:Et()})),t.put("/api/debug-log",async i=>{let{enabled:c}=i.body;return Sn(c),{enabled:Et()}}),t.get("/api/usage",async(i,c)=>{try{let l=i.query;return Es({startTime:l.startDate,endTime:l.endDate,model:l.model,provider:l.provider,scenario:l.scenario,clientType:l.clientType,sessionId:l.sessionId,status:l.status,page:l.page?parseInt(l.page,10):void 0,pageSize:l.pageSize?parseInt(l.pageSize,10):void 0})}catch(l){console.error("Failed to query usage:",l),c.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(i,c)=>{try{let l=i.query;return gn(l.startDate,l.endDate,l.status)}catch(l){console.error("Failed to query usage summary:",l),c.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(i,c)=>{try{let l=i.query;return As(l.beforeDate),{success:!0,message:l.beforeDate?"Usage data cleared before "+l.beforeDate:"All usage data cleared"}}catch(l){console.error("Failed to clear usage:",l),c.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(i,c)=>{try{let u=j().getAllStates(),d=t._server?.activeProbeService?.getProbeTelemetry?.()||[];return{states:u.map(m=>({provider:m.provider,model:m.model,status:m.status,failureCount:m.failureCount,successCount:m.successCount,lastFailureTime:m.lastFailureTime,lastError:m.lastError,rateLimitUntil:m.rateLimitUntil??null})),probes:d,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to get provider health:",l),c.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(i,c)=>{try{let{providerName:l}=i.body;if(!l)return c.status(400),{error:"providerName is required"};let p=t._server?.activeProbeService;if(!p?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let d=await p.probeProviderManually(l);return d.success&&sn(l,i.log),{provider:l,success:d.success,latencyMs:d.latencyMs,status:d.status,isSlow:d.isSlow,errorKind:d.errorKind??null,error:d.error,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe provider:",l),c.status(500).send({error:l.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(i,c)=>{try{let l=t._server,u=l?.activeProbeService;if(!u?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let p=(l?.providerService?.getProviders?.()||[]).filter(m=>m?.name&&m.enabled!==!1),d=await Promise.all(p.map(async m=>{let h=await u.probeProviderManually(m.name);return h.success&&sn(m.name,i?.log),{provider:m.name,success:h.success,latencyMs:h.latencyMs,status:h.status,isSlow:h.isSlow,errorKind:h.errorKind??null,error:h.error}}));return{results:d,successCount:d.filter(m=>m.success).length,total:d.length,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe all providers:",l),c.status(500).send({error:l.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(i,c)=>{try{let u=(await te()).Providers||[],p=Op(u),d=new Map(p.map(f=>[f.provider,f])),m=Mn();for(let f of p){let g=m.find(y=>y.provider===f.provider);g&&g.limit!=null&&(f.limit5h=g.limit,f.used5h=g.limit-(g.remaining??0),g.reset&&(f.reset5h=new Date(g.reset*1e3).toISOString()))}let h=Un();for(let f of h){let g=d.get(f.provider);g||(g={provider:f.provider,used5h:0,used7d:0},p.push(g),d.set(f.provider,g)),typeof f.totalBalance=="number"?(g.limit7d=f.totalBalance,g.type7d=f.currency?"balance":"rateLimit",f.currency&&(g.currency=f.currency),typeof f.usedBalance=="number"?g.used7d=f.usedBalance:typeof f.remainingBalance=="number"?g.used7d=Math.max(0,f.totalBalance-f.remainingBalance):(g.used7d=0,g.limit7d=f.totalBalance)):typeof f.usedBalance=="number"&&(g.used7d=f.usedBalance),typeof f.usedDailyBalance=="number"&&(g.used5h=f.usedDailyBalance,g.type5h="rateLimit"),typeof f.limitDaily=="number"&&(g.limit5h=f.limitDaily,g.type5h="rateLimit"),typeof f.resetTime=="string"&&(f.limitDaily!==void 0?g.reset5h=f.resetTime:g.reset7d=f.resetTime),typeof f.resetTime7d=="string"&&(g.reset7d=f.resetTime7d)}return{quotas:p,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to compute provider quota:",l),c.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(i,c)=>{try{let l=(0,Z.join)(E.HOME_DIR,"presets");if(!(0,z.existsSync)(l))return{presets:[]};let p=(0,z.readdirSync)(l,{withFileTypes:!0}).filter(m=>m.isDirectory()&&!m.name.startsWith(".")).map(m=>m.name),d=[];for(let m of p){let h=(0,Z.join)(l,m);try{let f=(0,Z.join)(h,"manifest.json"),g=(0,z.readFileSync)(f,"utf-8"),y=JSON.parse(g),{Providers:_,Router:b,PORT:k,HOST:v,API_TIMEOUT_MS:x,PROXY_URL:T,PROXY_GLOBAL_ENABLED:R,LOG:S,LOG_LEVEL:P,StatusLine:O,NON_INTERACTIVE_MODE:I,...C}=y;d.push({id:m,name:C.name||m,version:C.version||"1.0.0",description:C.description,author:C.author,homepage:C.homepage,repository:C.repository,license:C.license,keywords:C.keywords,ccrVersion:C.ccrVersion,source:C.source,sourceType:C.sourceType,checksum:C.checksum,installed:!0})}catch(f){console.error(`Failed to read preset ${m}:`,f)}}return{presets:d}}catch(l){console.error("Failed to get presets:",l),c.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=(0,E.getPresetDir)(l);if(!(0,z.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}let p=await(0,E.readManifestFromDir)(u);return{...(0,E.manifestToPresetFile)(p),config:(0,E.loadConfigFromManifest)(p,u),userValues:p.userValues||{}}}catch(l){console.error("Failed to get preset:",l),c.status(500).send({error:l.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(i,c)=>{try{let{name:l}=i.params,{secrets:u}=i.body,p=(0,E.getPresetDir)(l);if(!(0,z.existsSync)(p)){c.status(404).send({error:"Preset not found"});return}let m={...await(0,E.readManifestFromDir)(p)};return u&&Object.keys(u).length>0&&(m.userValues={...m.userValues,...u}),await(0,E.saveManifest)(l,m),{success:!0,message:"Preset applied successfully"}}catch(l){console.error("Failed to apply preset:",l),c.status(500).send({error:l.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=(0,E.getPresetDir)(l);if(!(0,z.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}return(0,z.rmSync)(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(l){console.error("Failed to delete preset:",l),c.status(500).send({error:l.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(i,c)=>{try{return{presets:await(0,E.getMarketPresets)()}}catch(l){console.error("Failed to get market presets:",l),c.status(500).send({error:l.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(i,c)=>{try{let{presetName:l}=i.body;if(!l){c.status(400).send({error:"Preset name is required"});return}let u=await(0,E.findMarketPresetByName)(l);if(!u){c.status(400).send({error:"Preset not found in marketplace",message:`Preset '${l}' is not available in the official marketplace. Please check the available presets.`});return}if(!u.repo){c.status(400).send({error:"Invalid preset data",message:`Preset '${l}' does not have repository information`});return}let p=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!p){c.status(400).send({error:"Invalid GitHub repository URL"});return}let[,d,m]=p,h=u.name||l;if(await(0,E.isPresetInstalled)(h)){c.status(409).send({error:"Preset already installed",message:`Preset '${h}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:h});return}let f=`https://github.com/${d}/${m}/archive/refs/heads/main.zip`,g=await(0,E.downloadPresetToTemp)(f),y=await a(g);if(await(0,E.isPresetInstalled)(h)){(0,z.unlinkSync)(g),c.status(409).send({error:"Preset already installed",message:`Preset '${h}' was installed while downloading. Please try again.`,presetName:h});return}let _=(0,E.getPresetDir)(h);await(0,E.extractPreset)(g,_);let b=await(0,E.readManifestFromDir)(_);return b.repository=u.repo,u.url&&(b.source=u.url),await(0,E.saveManifest)(h,b),(0,z.unlinkSync)(g),{success:!0,presetName:h,preset:{...y.metadata,installed:!0}}}catch(l){console.error("Failed to install preset from GitHub:",l),c.status(500).send({error:l.message||"Failed to install preset from GitHub"})}});async function a(i){let c=new al.default(i),l=c.getEntry("manifest.json");if(l||(l=c.getEntries().find(d=>d.entryName.includes("manifest.json"))||null),!l)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(l.getData().toString("utf-8"));return(0,E.manifestToPresetFile)(u)}return t.get("/api/plugins",async()=>({plugins:Yc(E.HOME_DIR,n.pluginRegistry)})),qc(t,{configDir:E.HOME_DIR,configuredPort:Number(e.PORT)||3456,registry:typeof e.CCR_PLUGIN_NPM_REGISTRY=="string"&&/^https?:\/\//.test(e.CCR_PLUGIN_NPM_REGISTRY)?e.CCR_PLUGIN_NPM_REGISTRY:void 0}),t.get("/plugins/:name/:file",async(i,c)=>{let{name:l,file:u}=i.params,p=n.pluginRegistry.getPublicCard(l,u);return p?(c.header("Content-Type","application/javascript; charset=utf-8"),c.header("X-Content-Type-Options","nosniff"),c.header("Cache-Control","no-store"),c.send(p)):c.status(404).send({error:"plugin_not_found"})}),await n.pluginRegistry.registerAllRoutes(n.app??n),n}var ol,Z,rl,sl,z,Jo,E,il,al,ll=w(()=>{"use strict";We();ot();at();ae();At();ue();an();zo();$s();el();rn();ol=require("@wengine-ai/claude-code-router-shared"),Z=require("path"),rl=require("url"),sl=q(require("@fastify/static"),1),z=require("fs"),Jo=require("os"),E=require("@wengine-ai/claude-code-router-shared"),il=q(require("@fastify/multipart"),1),al=q(require("adm-zip"),1);hn();Cs()});function Ip(n,e){let t=n?.Router,{family:o}=Ut(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function ul(n){return n?.Router?.image}function Mp(n){return n.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function Lp(n){let e=n[n.length-1];if(e?.role!=="user"||!Array.isArray(e.content))return;let t=[];e.content.filter(o=>o.type==="tool_result").forEach(o=>{if(!Array.isArray(o.content))return;let r=o.content.filter(s=>s.type==="image"?(t.push(s),!1):!0);r.length!==o.content.length&&(o.content=r.length>0?r:"read image successfully")}),e.content.push(...t)}var Ds,Wo,Fs,dl,pl=w(()=>{"use strict";We();Ds=class{cache=new Map;maxSize;ttl;constructor(e=100,t=300*1e3){this.maxSize=e,this.ttl=t}evictExpired(){let e=Date.now();for(let[t,o]of this.cache)e-o.timestamp>this.ttl&&this.cache.delete(t)}trim(){if(this.cache.size<=this.maxSize)return;let e=[...this.cache.keys()].slice(0,this.cache.size-this.maxSize);for(let t of e)this.cache.delete(t)}storeImage(e,t){this.hasImage(e)||(this.evictExpired(),this.cache.set(e,{source:t,timestamp:Date.now()}),this.trim())}getImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),null):t.source:null}hasImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),!1):!0:!1}clear(){this.cache.clear()}size(){return this.evictExpired(),this.cache.size}},Wo=new Ds;Fs=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=Ip(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!Mp(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&jt(e.body.model)?!1:(Lp(e.body.messages),s&&!!ul(t))}appendTools(){this.tools.set("analyzeImage",{name:"analyzeImage",description:"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.",input_schema:{type:"object",properties:{imageId:{type:"array",description:"an array of IDs to analyse",items:{type:"string"}},task:{type:"string",description:"Details of task to perform on the image.The more detailed, the better"},regions:{type:"array",description:"Optional regions of interest within the image",items:{type:"object",properties:{name:{type:"string",description:"Optional label for the region"},x:{type:"number",description:"X coordinate"},y:{type:"number",description:"Y coordinate"},w:{type:"number",description:"Width of the region"},h:{type:"number",description:"Height of the region"},units:{type:"string",enum:["px","pct"],description:"Units for coordinates and size"}},required:["x","y","w","h","units"]}}},required:["imageId","task"]},handler:async(e,t)=>{let o=[],r;if(e.imageId){if(Array.isArray(e.imageId))e.imageId.forEach(i=>{let c=Wo.getImage(`${t.req.id}_Image#${i}`);c&&o.push({type:"image",source:c})});else{let i=Wo.getImage(`${t.req.id}_Image#${e.imageId}`);i&&o.push({type:"image",source:i})}r=e.imageId,delete e.imageId}let s=t.req.body.messages[t.req.body.messages.length-1];if(s.role==="user"&&Array.isArray(s.content)){let i=s.content.filter(c=>c.type==="text"&&!c.text.includes("This is an image, if you need to view or analyze it, you need to extract the imageId"));o.push(...i)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let a=await fetch(`http://127.0.0.1:${t.config.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.config.APIKEY,"content-type":"application/json"},body:JSON.stringify({model:ul(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
411
+ `;kp=200});async function Dc(){let n=(0,Lc.homedir)(),e=(0,Nc.join)(n,".claude.json");if(!(0,Mc.existsSync)(e)){let o={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await(0,$c.writeFile)(e,JSON.stringify(o,null,2))}}var Mc,Lc,Nc,$c,Fc=R(()=>{"use strict";Mc=require("fs"),Lc=require("os"),Nc=require("path"),$c=require("fs/promises")});function jc(n=(0,Ms.join)(Hc.HOME_DIR,"logs")){try{if(!(0,Ue.existsSync)(n))return;let e=Date.now()-Sp;for(let t of(0,Ue.readdirSync)(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=(0,Ms.join)(n,t),r=(0,Ue.statSync)(o);r.isFile()&&r.mtime.getTime()<e&&(0,Ue.unlinkSync)(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function zc(){Uc||(Uc=!0,jc(),setInterval(jc,Cp).unref())}var Ue,Ms,Hc,xp,Sp,Cp,Uc,Bc=R(()=>{"use strict";Ue=require("fs"),Ms=require("path"),Hc=require("@wengine-ai/claude-code-router-shared"),xp=7,Sp=xp*24*60*60*1e3,Cp=1440*60*1e3,Uc=!1});async function Jc(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:a={}}=o;switch(r){case"token-speed":bt.registerPlugin(en,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:No()}],...a});break;default:console.warn(`Unknown plugin: ${r}`);break}}await bt.enablePlugins(n)}var Wc=R(()=>{"use strict";bs()});function Rt(n,e,t){if(n?.configService)try{n.configService.reload(),n.reloadProviders?n.reloadProviders(e):(n.configService.set("providers",e?.Providers??e?.providers??[]),n.providerService?.reload()),xt(e,t),Oo();let o={enabled:n.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:n.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:n.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(n.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:n.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:n.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};n.activeProbeService=_t(()=>n.providerService.getProviders(),o,r=>ge(n.configService,r),t,r=>n.configService.get(r))}catch(o){t.warn(`Config saved but runtime reload failed: ${o?.message||o}`)}}var zo=R(()=>{"use strict";an();Io();ae()});function Vc(n){try{let e=JSON.parse((0,z.readFileSync)((0,be.join)(Rp(n),"plugins.json"),"utf8"));return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"):[]}catch{return[]}}function Ns(n,e){if(!Gc(e))return null;try{let t=(0,z.realpathSync)(n),o=(0,be.join)(t,"plugins"),r=(0,be.join)(o,e);return(0,z.lstatSync)(o).isSymbolicLink()||!(0,z.lstatSync)(o).isDirectory()||(0,z.lstatSync)(r).isSymbolicLink()||!(0,z.lstatSync)(r).isDirectory()||(0,z.realpathSync)(o)!==o||(0,z.realpathSync)(r)!==r||!r.startsWith(o+be.sep)?null:r}catch{return null}}function Ls(n,e,t){if(!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t))throw new Error("invalid plugin file");let o=Ns(n,e);if(!o)throw new Error("unsafe plugin directory");let r=(0,be.join)(o,t),s=(0,z.lstatSync)(r);if(s.isSymbolicLink()||!s.isFile()||(0,z.realpathSync)(r)!==r)throw new Error("unsafe plugin file");let a=(0,z.openSync)(r,z.constants.O_RDONLY|z.constants.O_NOFOLLOW|z.constants.O_NONBLOCK);try{let i=(0,z.fstatSync)(a),c=(0,z.lstatSync)(r);if(!i.isFile()||c.isSymbolicLink()||i.dev!==s.dev||i.ino!==s.ino||i.dev!==c.dev||i.ino!==c.ino||Ns(n,e)!==o||(0,z.realpathSync)(r)!==r)throw new Error("plugin file changed while opening");return(0,z.readFileSync)(a)}finally{(0,z.closeSync)(a)}}function wp(n){let e=n?.configService,t=e?Qs(e):String(process.env.SUBSCRIPTION_PROXY_URL??"").trim()||void 0;return Ys(t)}async function Qc(n){let{configDir:e,log:t}=n,o=n.registry??n.getServer()?.pluginRegistry??sr(),r={configDir:e,readConfig:()=>te(),readRawConfig:()=>Tt(),writeConfig:i=>fe(i),reloadRuntime:async i=>Rt(n.getServer(),i??await te(),t),getDirectDispatcher:Qo,getSubscriptionDispatcher:()=>wp(n.getServer())},s={loaded:[],failed:[],skipped:[]},a=new Set;for(let i of Vc(e)){let c;try{if(!Gc(i.name))throw new Error("invalid plugin install name");if(a.has(i.name))throw new Error(`duplicate plugin install record "${i.name}"`);if(a.add(i.name),i.enabled===!1){s.skipped.push({name:i.name,reason:"disabled"});continue}let l=Ns(e,i.name);if(!l){s.skipped.push({name:i.name,reason:"directory missing or unsafe"});continue}let u;try{let g=JSON.parse(Ls(e,i.name,"plugin.json").toString("utf8"));if(!g||typeof g.name!="string"||typeof g.version!="string")throw new Error;u={name:g.name,version:g.version,coreApi:String(g.coreApi??"1"),description:g.description}}catch{throw new Error("plugin.json missing or malformed")}if(u.name!==i.name)throw new Error("manifest name does not match install directory");if(u.coreApi.split(".")[0]!=="1".split(".")[0])throw new Error(`coreApi ${u.coreApi} incompatible with core ${"1"}`);let p=o.beginActivation(u,{info:g=>t.info(`[plugin:${u.name}] ${g}`),warn:g=>t.warn(`[plugin:${u.name}] ${g}`),error:g=>t.error(`[plugin:${u.name}] ${g}`)},r,l);c=p,Ls(e,i.name,"plugin.js");let d=await import((0,Kc.pathToFileURL)((0,be.join)(l,"plugin.js")).href),f=d?.activate??d?.default?.activate;if(typeof f!="function")throw new Error("entry exports no activate()");await f(p.context);let h=p.cardPath?Ls(e,i.name,p.cardPath):void 0;await p.commit(h,n.getServer()?.app),s.loaded.push(u.name),t.info(`plugin loaded: ${u.name}@${u.version}`)}catch(l){c?.abort(),s.failed.push({name:i.name,error:l?.message??String(l)}),t.warn(`plugin ${i.name} failed to load: ${l?.message??String(l)}`)}}return s}function Yc(n,e=sr()){let t=new Map(e.listLoadedPlugins().map(o=>[o.name,o]));return Vc(n).map(o=>{let r=o.enabled!==!1?t.get(o.name):void 0;return r?{...r,enabled:!0}:{name:o.name,version:null,enabled:o.enabled!==!1,error:"plugin missing or failed to load \u2014 its providers are unavailable until it is reinstalled"}})}var z,be,Kc,Gc,Rp,$s=R(()=>{"use strict";z=require("node:fs"),be=require("node:path"),Kc=require("node:url");or();En();zo();rn();ae();Gc=n=>/^[a-z0-9][a-z0-9-]*$/i.test(n),Rp=n=>(0,be.join)(n,"plugins")});async function Ep(n,e,t){let o=`${n}/-/v1/search?text=${encodeURIComponent(`keywords:${e}`)}&size=100`,r=await fetch(o,{signal:AbortSignal.timeout(t),headers:{accept:"application/json"}});if(!r.ok)throw new Error(`registry_status_${r.status}`);let s=await r.json();return Array.isArray(s?.objects)?s.objects:[]}async function Ap(n,e={}){let t=(e.registryBase??Pp).replace(/\/$/,""),o=e.timeoutMs??3e4,r=await Promise.allSettled(Xc.map(m=>Ep(t,m,o))),s=new Map,a=!1;for(let m of r)if(m.status==="fulfilled"){a=!0;for(let _ of m.value){let b=_?.package,y=typeof b?.name=="string"?b.name:"";if(!y||!me.NPM_SPEC_PATTERN.test(y)||!(Array.isArray(b?.keywords)?b.keywords.filter(x=>typeof x=="string"):[]).some(x=>Xc.includes(x)))continue;let v=typeof b?.version=="string"?b.version:"";s.has(y)||s.set(y,{name:y,version:v,description:typeof b?.description=="string"?b.description:""})}}if(!a)return{ok:!0,plugins:[],warning:"registry_unavailable"};let i=(0,me.readPluginRecords)(n),c=new Map(i.map(m=>[m.name,m])),l=m=>{let _=m.indexOf("@",m.startsWith("@")?1:0);return _>0?m.slice(0,_):m},u=new Map(i.filter(m=>typeof m.source=="string"&&m.source!=="").map(m=>[l(m.source),m])),p=m=>{if(!me.PLUGIN_NAME_PATTERN.test(m))return null;try{let _=JSON.parse((0,yn.readFileSync)((0,Bo.join)(n,"plugins",m,"plugin.json"),"utf8"));return typeof _?.version=="string"?_.version:null}catch{return null}},d=[...s.values()].sort((m,_)=>m.name.localeCompare(_.name)).map(m=>{let _=c.get(m.name)??u.get(m.name),b=_!==void 0||(0,yn.existsSync)((0,Bo.join)(n,"plugins",m.name)),y=b?p(_?_.name:m.name):null;return{...m,installed:b,installedVersion:y,...b&&y!==null&&y!==m.version?{updateAvailable:!0}:{}}}),f=new Set(d.map(m=>m.name)),h=new Set,g=new Map;for(let[m,_]of u)h.add(_.name),!f.has(m)&&g.set(m,_.name);for(let m of i)f.has(m.name)||h.has(m.name)||g.set(m.name,m.name);for(let[m,_]of g){if(!me.PLUGIN_NAME_PATTERN.test(_)||!(0,yn.existsSync)((0,Bo.join)(n,"plugins",_)))continue;let b=p(_);b!==null&&d.push({name:m,description:"",version:b,installed:!0,installedVersion:b,localOnly:!0})}return d.sort((m,_)=>m.name.localeCompare(_.name)),{ok:!0,plugins:d}}function Op(n){switch(n){case"invalid_spec":return 400;case"already_installed":case"plugins_json_corrupted":return 409;case"npm_pack_failed":case"npm_pack_timeout":return 502;case"archive_too_large":case"archive_too_many_files":case"unsafe_archive_member":case"extract_failed":case"invalid_manifest":return 422;default:return 500}}function Zc(n,e,t){let o=n.ip||n.connection?.remoteAddress||"";if(!(o==="127.0.0.1"||o==="::1"||o==="::ffff:127.0.0.1"))return!1;let s=e.server?.address?.(),a=typeof s?.port=="number"&&s.port>0?s.port:t,i=new Set([`127.0.0.1:${a}`,`localhost:${a}`,`[::1]:${a}`]),c=n.headers?.host;if(typeof c=="string"&&!i.has(c))return!1;let l=n.headers?.origin;if(l!==void 0&&l!==""){if(typeof l!="string")return!1;let u="";try{let p=new URL(l);if(!["http:","https:"].includes(p.protocol))return!1;u=p.host}catch{return!1}if(!i.has(u))return!1}return!0}function qc(n,e){let t=e.configuredPort??3456,o=(r,s,a)=>r.status(s).send({ok:!1,error:a});n.get("/api/plugins/catalog",async(r,s)=>{if(!Zc(r,n,t))return o(s,403,"local_only");try{return await Ap(e.configDir,{registryBase:e.catalogRegistryBase??e.registry,timeoutMs:e.catalogTimeoutMs})}catch(a){return n.log?.warn?.(`plugin catalog failed: ${a?.code??a?.name??"error"}`),{ok:!0,plugins:[],warning:"registry_unavailable"}}}),n.post("/api/plugins/install",async(r,s)=>{if(!Zc(r,n,t))return o(s,403,"local_only");let a=r.body??{},i=a.name??a.spec,c=a.force===!0;try{let l=await(0,me.installPluginFromNpm)({spec:i,configDir:e.configDir,force:c,registry:e.registry,timeoutMs:e.npmTimeoutMs});return n.log?.info?.(`provider plugin installed via API: ${l.manifest.name}@${l.manifest.version} (restart to activate)`),{ok:!0,name:l.manifest.name,version:l.manifest.version,restartRequired:!0}}catch(l){if(l instanceof me.PluginInstallError){let u=Op(l.code);return u===502?n.log?.warn?.(`plugin install failed: ${l.code}`):n.log?.warn?.(`plugin install rejected: ${l.code}: ${l.message}`),o(s,u,l.code)}return n.log?.error?.(`plugin install crashed: ${l?.message??l}`),o(s,500,"install_failed")}})}var yn,Bo,me,Xc,Pp,el=R(()=>{"use strict";yn=require("node:fs"),Bo=require("node:path"),me=require("@wengine-ai/claude-code-router-shared"),Xc=["ccr-provider-plugin","claude-code-router-plugin"],Pp="https://registry.npmjs.org"});function tl(n){let e=j();return Fo(n,(t,o)=>e.isAvailable(t,o))}function nl(n,e,t){return e.failed.length===0?!0:(n.log?.warn?.({source:t,projectTakeoverSync:e},"Client configuration changed but some project takeovers failed to sync"),!1)}function Ip(n){let e=new Date().toISOString(),t=new Date(Date.now()-300*60*1e3).toISOString(),o=new Date(Date.now()-10080*60*1e3).toISOString(),r=gn(t,e),s=gn(o,e),a=[],i=new Set;for(let c of n||[])c&&c.name&&i.add(c.name);for(let c of Object.keys(r.byProvider||{}))i.add(c);for(let c of Object.keys(s.byProvider||{}))i.add(c);for(let c of i){let l=r.byProvider[c]||{inputTokens:0,outputTokens:0},u=s.byProvider[c]||{inputTokens:0,outputTokens:0},p=(l.inputTokens||0)+(l.outputTokens||0),d=(u.inputTokens||0)+(u.outputTokens||0),f,h,g=(n||[]).find(m=>m&&m.name===c);g&&g.quota&&(f=g.quota.limit5h,h=g.quota.limit7d),a.push({provider:c,used5h:p,used7d:d,limit5h:f,limit7d:h})}return a}async function cl(n,e){let t=n.app;ot(),at(),t.register(il.default,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let i=tl(e);return{object:"list",data:i,first_id:i[0]?.id||null,last_id:i[i.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(i,c)=>{let l=decodeURIComponent(i.params.modelId),u=tl(e).find(p=>p.id===l);return u||(c.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${l}`}})}),t.post("/v1/messages/count_tokens",async(i,c)=>{let{messages:l,tools:u,system:p,model:d}=i.body,f=t._server.tokenizerService;if(d&&d.includes(",")&&f)try{let[g,m]=d.split(",");i.log?.info(`Looking up tokenizer for provider: ${g}, model: ${m}`);let _=f.getTokenizerConfigForModel(g,m);_?i.log?.info(`Using tokenizer config: ${JSON.stringify(_)}`):i.log?.warn(`No tokenizer config found for ${g},${m}, using default tiktoken`);let b=await f.countTokens({messages:l,system:p,tools:u},_,g);return{input_tokens:b.tokenCount,tokenizer:b.tokenizerUsed}}catch(g){i.log?.error(`Error using configured tokenizer: ${g.message}`),i.log?.error(g.stack)}else d?d.includes(",")?f||i.log?.warn("TokenizerService not available, using default tiktoken"):i.log?.info(`Model "${d}" does not contain comma, using default tiktoken`):i.log?.info("No model specified, using default tiktoken");return{input_tokens:Ft(l,p,u)}}),t.get("/api/config",async(i,c)=>await Tt()),t.get("/api/transformers",async(i,c)=>{let l=t._server.transformerService.getAllTransformers();return{transformers:Array.from(l.entries()).map(([p,d])=>({name:p,endpoint:d.endPoint||null}))}}),t.post("/api/config",async(i,c)=>{let l=i.body,u=Vs(l||{});if(u.length>0)return c.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(g=>`${g.key}: ${g.error}`).join("; "),proxyErrors:u};let p=await on();p&&console.log(`Backed up existing configuration file to ${p}`);let d=null;try{d=await te()}catch{}let f=(0,ol.ensureCcrSelfProvider)(l,d);n.pluginRegistry.applyConfigProtectors(l,d),await fe(l);let h;try{h=await(0,E.syncGlobalProjectTakeovers)(l),h.failed.length>0&&t.log?.warn?.({projectTakeoverSync:h},"Config saved but some global project takeovers failed to sync")}catch(g){t.log?.warn?.(`Config saved but global project takeover sync failed: ${g?.message||g}`)}return Rt(n,l,t.log),{success:!0,message:"Config saved successfully",projectTakeoverSync:h}}),t.get("/api/clients",async(i,c)=>{try{let l=await te();return{clients:(0,E.listClientStatuses)(l)}}catch(l){console.error("Failed to get client integrations:",l),c.status(500).send({error:l.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(i,c)=>{try{let l=i.body,u=Array.isArray(l?.enabled)?l.enabled:[],p=await te(),d=(0,E.applyClientSelection)(p,u);await fe(d.config);let f=await(0,E.syncGlobalProjectTakeovers)(d.config),h=nl(t,f,"clients/apply");return{...d,success:d.success&&h,projectTakeoverSync:f}}catch(l){console.error("Failed to apply client integrations:",l),c.status(500).send({error:l.message||"Failed to apply client integrations"})}});async function o(i,c,l){try{let{id:u}=i.params;if(!(0,E.isClientId)(u)){c.status(404).send({error:`Unknown client: ${u}`});return}let p=await te(),d=l==="enable"?(0,E.enableClient)(p,u):l==="restore"?(0,E.restoreClient)(p,u):(0,E.disableClient)(p,u);await fe(p);let f=await(0,E.syncGlobalProjectTakeovers)(p),h=nl(t,f,`clients/${u}/${l}`);return{success:d.success&&h,result:d,results:[d],clients:(0,E.listClientStatuses)(p),config:p,projectTakeoverSync:f}}catch(u){console.error(`Failed to ${l} client integration:`,u),c.status(500).send({error:u.message||`Failed to ${l} client integration`})}}t.post("/api/clients/:id/enable",async(i,c)=>o(i,c,"enable")),t.post("/api/clients/:id/disable",async(i,c)=>o(i,c,"disable")),t.post("/api/clients/:id/restore",async(i,c)=>o(i,c,"restore")),t.get("/api/projects",async(i,c)=>{try{let l=await(0,E.listProjectConfigs)();return{projects:await Promise.all(l.map(async p=>{let d=await(0,E.getProjectTakeoverClients)(p.path);return{...p,ccrTakeoverClients:d,ccrTakeover:d.length>0}}))}}catch(l){console.error("Failed to list project configs:",l),c.status(500).send({error:l.message||"Failed to list project configs"})}}),t.post("/api/projects",async(i,c)=>{try{let{path:l}=i.body||{};if(!l||typeof l!="string"||!(0,Z.isAbsolute)(l)){c.status(400).send({error:"A valid absolute project path is required"});return}let u=(0,Z.normalize)(l).replace(/[\\/]+$/,"")||l;if(await(0,E.readProjectConfig)(u)){c.status(409).send({error:"Project is already configured"});return}await(0,E.writeProjectConfig)(u,{Router:{}});try{let f=await te();await(0,E.setProjectTakeover)(u,["claudeCode"],f)}catch(f){console.error("Failed to auto-enable ccr takeover for new project:",f)}let d=await(0,E.getProjectTakeoverClients)(u);return{id:(0,E.getClaudeProjectId)(u),path:u,configPath:(0,E.getProjectConfigPath)(u),Router:{},ccrTakeoverClients:d,ccrTakeover:d.length>0}}catch(l){console.error("Failed to add project config:",l),c.status(500).send({error:l.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,{Router:u}=i.body||{};if(!u||typeof u!="object"){c.status(400).send({error:"Router must be an object"});return}let p=await(0,E.readProjectConfigById)(l);if(!p){c.status(404).send({error:"Project config not found"});return}await(0,E.writeProjectConfig)(p.path,{Router:u});let d=await te();Object.keys(u).length===0?await(0,E.refreshProjectTakeovers)(p.path,d):(await(0,E.refreshCcrProjectTakeover)(p.path,d,u),await(0,E.refreshPiProjectTakeover)(p.path,d,u));let f=await(0,E.getProjectTakeoverClients)(p.path);return{id:l,path:p.path,configPath:p.configPath,Router:u,ccrTakeoverClients:f,ccrTakeover:f.length>0}}catch(l){console.error("Failed to update project config:",l),c.status(500).send({error:l.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(i,c)=>{try{let{id:l}=i.params,u=i.body||{},p;if(Array.isArray(u.clients))p=u.clients.filter(E.isProjectTakeoverClient);else if(typeof u.enabled=="boolean")p=u.enabled?["claudeCode"]:[];else{c.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let d=await(0,E.readProjectConfigById)(l);if(!d){c.status(404).send({error:"Project config not found"});return}let f=await te(),h=await(0,E.setProjectTakeover)(d.path,p,f);return{id:l,path:d.path,ccrTakeoverClients:h,ccrTakeover:h.length>0}}catch(l){console.error("Failed to update ccr takeover status:",l),c.status(500).send({error:l.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,u=await(0,E.readProjectConfigById)(l);if(!u){c.status(404).send({error:"Project config not found"});return}try{let p=await te();await(0,E.setProjectTakeover)(u.path,[],p)}catch(p){console.error("Failed to remove ccr takeover while deleting project:",p)}return await(0,E.deleteProjectConfig)(u.path),{success:!0}}catch(l){console.error("Failed to delete project config:",l),c.status(500).send({error:l.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:(0,Z.dirname)((0,rl.fileURLToPath)(void 0)),s=(0,B.existsSync)((0,Z.join)(r,"index.html"))?r:(0,B.existsSync)((0,Z.join)(r,"..","index.html"))?(0,Z.join)(r,".."):(0,Z.join)(r,"..","dist");t.register(sl.default,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(i,c)=>c.redirect("/ui/")),t.get("/api/logs/files",async(i,c)=>{try{let l=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs"),u=[];if((0,B.existsSync)(l)){let p=(0,B.readdirSync)(l);for(let d of p)if(d.endsWith(".log")){let f=(0,Z.join)(l,d),h=(0,B.statSync)(f);u.push({name:d,path:f,size:h.size,lastModified:h.mtime.toISOString()})}u.sort((d,f)=>new Date(f.lastModified).getTime()-new Date(d.lastModified).getTime())}return u}catch(l){console.error("Failed to get log files:",l),c.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs","app.log"),(0,B.existsSync)(u)?(0,B.readFileSync)(u,"utf8").split(`
412
+ `).filter(f=>f.trim()):[]}catch(l){console.error("Failed to get logs:",l),c.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=(0,Z.join)((0,Jo.homedir)(),".claude-code-router","logs","app.log"),(0,B.existsSync)(u)&&(0,B.writeFileSync)(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(l){console.error("Failed to clear logs:",l),c.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:Et()})),t.put("/api/debug-log",async i=>{let{enabled:c}=i.body;return Sn(c),{enabled:Et()}}),t.get("/api/usage",async(i,c)=>{try{let l=i.query;return Es({startTime:l.startDate,endTime:l.endDate,model:l.model,provider:l.provider,scenario:l.scenario,clientType:l.clientType,sessionId:l.sessionId,status:l.status,page:l.page?parseInt(l.page,10):void 0,pageSize:l.pageSize?parseInt(l.pageSize,10):void 0})}catch(l){console.error("Failed to query usage:",l),c.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(i,c)=>{try{let l=i.query;return gn(l.startDate,l.endDate,l.status)}catch(l){console.error("Failed to query usage summary:",l),c.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(i,c)=>{try{let l=i.query;return As(l.beforeDate),{success:!0,message:l.beforeDate?"Usage data cleared before "+l.beforeDate:"All usage data cleared"}}catch(l){console.error("Failed to clear usage:",l),c.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(i,c)=>{try{let u=j().getAllStates(),d=t._server?.activeProbeService?.getProbeTelemetry?.()||[];return{states:u.map(f=>({provider:f.provider,model:f.model,status:f.status,failureCount:f.failureCount,successCount:f.successCount,lastFailureTime:f.lastFailureTime,lastError:f.lastError,rateLimitUntil:f.rateLimitUntil??null})),probes:d,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to get provider health:",l),c.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(i,c)=>{try{let{providerName:l}=i.body;if(!l)return c.status(400),{error:"providerName is required"};let p=t._server?.activeProbeService;if(!p?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let d=await p.probeProviderManually(l);return d.success&&sn(l,i.log),{provider:l,success:d.success,latencyMs:d.latencyMs,status:d.status,isSlow:d.isSlow,errorKind:d.errorKind??null,error:d.error,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe provider:",l),c.status(500).send({error:l.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(i,c)=>{try{let l=t._server,u=l?.activeProbeService;if(!u?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let p=(l?.providerService?.getProviders?.()||[]).filter(f=>f?.name&&f.enabled!==!1),d=await Promise.all(p.map(async f=>{let h=await u.probeProviderManually(f.name);return h.success&&sn(f.name,i?.log),{provider:f.name,success:h.success,latencyMs:h.latencyMs,status:h.status,isSlow:h.isSlow,errorKind:h.errorKind??null,error:h.error}}));return{results:d,successCount:d.filter(f=>f.success).length,total:d.length,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe all providers:",l),c.status(500).send({error:l.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(i,c)=>{try{let u=(await te()).Providers||[],p=Ip(u),d=new Map(p.map(g=>[g.provider,g])),f=Mn();for(let g of p){let m=f.find(_=>_.provider===g.provider);m&&m.limit!=null&&(g.limit5h=m.limit,g.used5h=m.limit-(m.remaining??0),m.reset&&(g.reset5h=new Date(m.reset*1e3).toISOString()))}let h=Un();for(let g of h){let m=d.get(g.provider);m||(m={provider:g.provider,used5h:0,used7d:0},p.push(m),d.set(g.provider,m)),typeof g.totalBalance=="number"?(m.limit7d=g.totalBalance,m.type7d=g.currency?"balance":"rateLimit",g.currency&&(m.currency=g.currency),typeof g.usedBalance=="number"?m.used7d=g.usedBalance:typeof g.remainingBalance=="number"?m.used7d=Math.max(0,g.totalBalance-g.remainingBalance):(m.used7d=0,m.limit7d=g.totalBalance)):typeof g.usedBalance=="number"&&(m.used7d=g.usedBalance),typeof g.usedDailyBalance=="number"&&(m.used5h=g.usedDailyBalance,m.type5h="rateLimit"),typeof g.limitDaily=="number"&&(m.limit5h=g.limitDaily,m.type5h="rateLimit"),typeof g.resetTime=="string"&&(g.limitDaily!==void 0?m.reset5h=g.resetTime:m.reset7d=g.resetTime),typeof g.resetTime7d=="string"&&(m.reset7d=g.resetTime7d)}return{quotas:p,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to compute provider quota:",l),c.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(i,c)=>{try{let l=(0,Z.join)(E.HOME_DIR,"presets");if(!(0,B.existsSync)(l))return{presets:[]};let p=(0,B.readdirSync)(l,{withFileTypes:!0}).filter(f=>f.isDirectory()&&!f.name.startsWith(".")).map(f=>f.name),d=[];for(let f of p){let h=(0,Z.join)(l,f);try{let g=(0,Z.join)(h,"manifest.json"),m=(0,B.readFileSync)(g,"utf-8"),_=JSON.parse(m),{Providers:b,Router:y,PORT:k,HOST:v,API_TIMEOUT_MS:x,PROXY_URL:T,PROXY_GLOBAL_ENABLED:C,LOG:S,LOG_LEVEL:P,StatusLine:M,NON_INTERACTIVE_MODE:I,...A}=_;d.push({id:f,name:A.name||f,version:A.version||"1.0.0",description:A.description,author:A.author,homepage:A.homepage,repository:A.repository,license:A.license,keywords:A.keywords,ccrVersion:A.ccrVersion,source:A.source,sourceType:A.sourceType,checksum:A.checksum,installed:!0})}catch(g){console.error(`Failed to read preset ${f}:`,g)}}return{presets:d}}catch(l){console.error("Failed to get presets:",l),c.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=(0,E.getPresetDir)(l);if(!(0,B.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}let p=await(0,E.readManifestFromDir)(u);return{...(0,E.manifestToPresetFile)(p),config:(0,E.loadConfigFromManifest)(p,u),userValues:p.userValues||{}}}catch(l){console.error("Failed to get preset:",l),c.status(500).send({error:l.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(i,c)=>{try{let{name:l}=i.params,{secrets:u}=i.body,p=(0,E.getPresetDir)(l);if(!(0,B.existsSync)(p)){c.status(404).send({error:"Preset not found"});return}let f={...await(0,E.readManifestFromDir)(p)};return u&&Object.keys(u).length>0&&(f.userValues={...f.userValues,...u}),await(0,E.saveManifest)(l,f),{success:!0,message:"Preset applied successfully"}}catch(l){console.error("Failed to apply preset:",l),c.status(500).send({error:l.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=(0,E.getPresetDir)(l);if(!(0,B.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}return(0,B.rmSync)(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(l){console.error("Failed to delete preset:",l),c.status(500).send({error:l.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(i,c)=>{try{return{presets:await(0,E.getMarketPresets)()}}catch(l){console.error("Failed to get market presets:",l),c.status(500).send({error:l.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(i,c)=>{try{let{presetName:l}=i.body;if(!l){c.status(400).send({error:"Preset name is required"});return}let u=await(0,E.findMarketPresetByName)(l);if(!u){c.status(400).send({error:"Preset not found in marketplace",message:`Preset '${l}' is not available in the official marketplace. Please check the available presets.`});return}if(!u.repo){c.status(400).send({error:"Invalid preset data",message:`Preset '${l}' does not have repository information`});return}let p=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!p){c.status(400).send({error:"Invalid GitHub repository URL"});return}let[,d,f]=p,h=u.name||l;if(await(0,E.isPresetInstalled)(h)){c.status(409).send({error:"Preset already installed",message:`Preset '${h}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:h});return}let g=`https://github.com/${d}/${f}/archive/refs/heads/main.zip`,m=await(0,E.downloadPresetToTemp)(g),_=await a(m);if(await(0,E.isPresetInstalled)(h)){(0,B.unlinkSync)(m),c.status(409).send({error:"Preset already installed",message:`Preset '${h}' was installed while downloading. Please try again.`,presetName:h});return}let b=(0,E.getPresetDir)(h);await(0,E.extractPreset)(m,b);let y=await(0,E.readManifestFromDir)(b);return y.repository=u.repo,u.url&&(y.source=u.url),await(0,E.saveManifest)(h,y),(0,B.unlinkSync)(m),{success:!0,presetName:h,preset:{..._.metadata,installed:!0}}}catch(l){console.error("Failed to install preset from GitHub:",l),c.status(500).send({error:l.message||"Failed to install preset from GitHub"})}});async function a(i){let c=new al.default(i),l=c.getEntry("manifest.json");if(l||(l=c.getEntries().find(d=>d.entryName.includes("manifest.json"))||null),!l)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(l.getData().toString("utf-8"));return(0,E.manifestToPresetFile)(u)}return t.get("/api/plugins",async()=>({plugins:Yc(E.HOME_DIR,n.pluginRegistry)})),qc(t,{configDir:E.HOME_DIR,configuredPort:Number(e.PORT)||3456,registry:typeof e.CCR_PLUGIN_NPM_REGISTRY=="string"&&/^https?:\/\//.test(e.CCR_PLUGIN_NPM_REGISTRY)?e.CCR_PLUGIN_NPM_REGISTRY:void 0}),t.get("/plugins/:name/:file",async(i,c)=>{let{name:l,file:u}=i.params,p=n.pluginRegistry.getPublicCard(l,u);return p?(c.header("Content-Type","application/javascript; charset=utf-8"),c.header("X-Content-Type-Options","nosniff"),c.header("Cache-Control","no-store"),c.send(p)):c.status(404).send({error:"plugin_not_found"})}),await n.pluginRegistry.registerAllRoutes(n.app??n),n}var ol,Z,rl,sl,B,Jo,E,il,al,ll=R(()=>{"use strict";We();rt();ct();ae();At();ue();an();zo();$s();el();rn();ol=require("@wengine-ai/claude-code-router-shared"),Z=require("path"),rl=require("url"),sl=q(require("@fastify/static"),1),B=require("fs"),Jo=require("os"),E=require("@wengine-ai/claude-code-router-shared"),il=q(require("@fastify/multipart"),1),al=q(require("adm-zip"),1);hn();Cs()});function Mp(n,e){let t=n?.Router,{family:o}=Ut(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function ul(n){return n?.Router?.image}function Lp(n){return n.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function Np(n){let e=n[n.length-1];if(e?.role!=="user"||!Array.isArray(e.content))return;let t=[];e.content.filter(o=>o.type==="tool_result").forEach(o=>{if(!Array.isArray(o.content))return;let r=o.content.filter(s=>s.type==="image"?(t.push(s),!1):!0);r.length!==o.content.length&&(o.content=r.length>0?r:"read image successfully")}),e.content.push(...t)}var Ds,Wo,Fs,dl,pl=R(()=>{"use strict";We();Ds=class{cache=new Map;maxSize;ttl;constructor(e=100,t=300*1e3){this.maxSize=e,this.ttl=t}evictExpired(){let e=Date.now();for(let[t,o]of this.cache)e-o.timestamp>this.ttl&&this.cache.delete(t)}trim(){if(this.cache.size<=this.maxSize)return;let e=[...this.cache.keys()].slice(0,this.cache.size-this.maxSize);for(let t of e)this.cache.delete(t)}storeImage(e,t){this.hasImage(e)||(this.evictExpired(),this.cache.set(e,{source:t,timestamp:Date.now()}),this.trim())}getImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),null):t.source:null}hasImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),!1):!0:!1}clear(){this.cache.clear()}size(){return this.evictExpired(),this.cache.size}},Wo=new Ds;Fs=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=Mp(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!Lp(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&jt(e.body.model)?!1:(Np(e.body.messages),s&&!!ul(t))}appendTools(){this.tools.set("analyzeImage",{name:"analyzeImage",description:"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.",input_schema:{type:"object",properties:{imageId:{type:"array",description:"an array of IDs to analyse",items:{type:"string"}},task:{type:"string",description:"Details of task to perform on the image.The more detailed, the better"},regions:{type:"array",description:"Optional regions of interest within the image",items:{type:"object",properties:{name:{type:"string",description:"Optional label for the region"},x:{type:"number",description:"X coordinate"},y:{type:"number",description:"Y coordinate"},w:{type:"number",description:"Width of the region"},h:{type:"number",description:"Height of the region"},units:{type:"string",enum:["px","pct"],description:"Units for coordinates and size"}},required:["x","y","w","h","units"]}}},required:["imageId","task"]},handler:async(e,t)=>{let o=[],r;if(e.imageId){if(Array.isArray(e.imageId))e.imageId.forEach(i=>{let c=Wo.getImage(`${t.req.id}_Image#${i}`);c&&o.push({type:"image",source:c})});else{let i=Wo.getImage(`${t.req.id}_Image#${e.imageId}`);i&&o.push({type:"image",source:i})}r=e.imageId,delete e.imageId}let s=t.req.body.messages[t.req.body.messages.length-1];if(s.role==="user"&&Array.isArray(s.content)){let i=s.content.filter(c=>c.type==="text"&&!c.text.includes("This is an image, if you need to view or analyze it, you need to extract the imageId"));o.push(...i)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let a=await fetch(`http://127.0.0.1:${t.config.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.config.APIKEY,"content-type":"application/json"},body:JSON.stringify({model:ul(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
413
413
  When an image placeholder is provided, your role is to parse the image content only within the scope of the user\u2019s instructions.
414
414
  Do not ignore or deviate from the task.
415
415
  Always ensure that your response reflects a clear, accurate interpretation of the image aligned with the given objective.`}],messages:[{role:"user",content:o}],stream:!1})}).then(i=>i.json()).catch(i=>null);return!a||!a.content?"analyzeImage Error":a.content[0].text}})}reqHandler(e,t){e.body?.system?.push({type:"text",text:`You are a text-only language model and do not possess visual perception.
@@ -422,5 +422,5 @@ If multiple images exist, select the **most relevant imageId** based on the user
422
422
 
423
423
  Do not attempt to describe or analyze the image directly yourself.
424
424
  Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
425
- Your response should consistently follow this rule whenever image-related analysis is requested.`});let o=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(a=>a.type==="image"||Array.isArray(a.content)&&a.content.some(i=>i.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(a=>{if(a.type==="image")Wo.storeImage(`${e.id}_Image#${r}`,a.source),a.type="text",delete a.source,a.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(a.type==="text"&&a.text.includes("[Image #"))a.text=a.text.replace(/\[Image #\d+\]/g,"");else if(a.type==="tool_result"&&Array.isArray(a.content)&&a.content.some(i=>i.type==="image")){let i=[],c=a.content.filter(u=>u.type!=="image"?!0:(Wo.storeImage(`${e.id}_Image#${r}`,u.source),i.push(`[Image #${r}]`),r++,!1)),l=`${i.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;a.content=c.length>0?[{type:"text",text:l},...c]:l}})})}},dl=new Fs});var Us,fl,Ko,ml=w(()=>{"use strict";pl();Us=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}},fl=new Us;fl.registerAgent(dl);Ko=fl});function $p(n,e){return n===429||!!(e&&/rate[\s_]limit|too many|限流|频率限制|qps_limit|token_limit|quota exhausted|usage limit|limit reached/i.test(e))}function bl(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&Ae(n,e)}function Hs(n){return n.usageSessionId||n.id}function Go(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${Hs(n)}`}function Rt(n){return n.body?.model?Array.isArray(n.body.model)?n.body.model.join(","):n.body.model:Array.isArray(n.model)?n.model.join(","):n.model||""}function Dp(n){if(!n)return;let e=n;if(Buffer.isBuffer(n)&&(e=n.toString("utf8")),typeof e=="string")try{e=JSON.parse(e)}catch{return}if(typeof e!="object")return;let t=e.usage?Ne(e.usage):e.response?.usage?Ne(e.response.usage):void 0,o=e.model||e.response?.model;if(!(!t&&!o))return{usage:t,model:o}}async function Fp(n,e,t){if(await new Promise((r,s)=>{let a=i=>i?s(i):r();cn(t)(n,e,a).then(()=>r(),s)}),e.sent)return;let o=new URL(`http://127.0.0.1${n.url}`);if(n.pathname=o.pathname,n.pathname.endsWith("/v1/messages")&&n.pathname!=="/v1/messages"&&(n.preset=n.pathname.replace("/v1/messages","").replace("/","")),n.pathname.endsWith("/v1/responses")&&n.pathname!=="/v1/responses"&&(n.preset=n.pathname.replace("/v1/responses","").replace("/","")),n.pathname.endsWith("/v1/messages")||n.pathname.endsWith("/v1/responses")){bl(n,t);let r=Go(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=ee.get(r))}}async function Up(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of Ko.getAllAgents())r.shouldHandle(n,t)&&(o.push(r.name),r.reqHandler(n,t),r.tools.size&&(n.body?.tools?.length||(n.body.tools=[]),n.body.tools.unshift(...Array.from(r.tools.values()).map(s=>({name:s.name,description:s.description,input_schema:s.input_schema})))));o.length&&(n.agents=o)}function _l(n){return{authClient:(e,t)=>Fp(e,t,n),agent:(e,t)=>Up(e,t,n)}}function kl(n,e){n.addHook("onRequest",async t=>{let o=new URL(`http://127.0.0.1${t.url}`);t.pathname=o.pathname,(o.pathname.endsWith("/v1/messages")||o.pathname.endsWith("/v1/responses"))&&!t.requestStartTime&&(t.requestStartTime=js.performance.now())}),n.addHook("preHandler",async(t,o)=>{let r=t.pathname||new URL(`http://127.0.0.1${t.url}`).pathname;r.endsWith("/v1/messages")||r.endsWith("/v1/responses")||await new Promise((s,a)=>{let i=c=>c?a(c):s();cn(e)(t,o,i).then(()=>s(),a)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",gl.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let a=t.pathname?.endsWith("/v1/messages"),i=t.pathname?.endsWith("/v1/responses");if(a||i){bl(t,e);let c=Hs(t),l=Go(t);if(r instanceof ReadableStream){if(a&&t.agents){let h=new AbortController,f=r.pipeThrough(new le),g,y=-1,_="",b="",k="",v=[],x=[];return s(null,Vt(f,async(T,R)=>{try{if(T.event==="content_block_start"&&T?.data?.content_block?.name){let S=t.agents.find(P=>Ko.getAgent(P)?.tools.get(T.data.content_block.name));if(S){g=Ko.getAgent(S),y=T.data.index,_=T.data.content_block.name,k=T.data.content_block.id;return}}if(y>-1&&T.data.index===y&&T.data?.delta?.type==="input_json_delta"){b+=T.data?.delta?.partial_json;return}if(y>-1&&T.data.index===y&&T.data?.type==="content_block_stop"){try{let S=yl.default.parse(b);x.push({type:"tool_use",id:k,name:_,input:S});let P=await g?.tools.get(_)?.handler(S,{req:t,config:e});v.push({tool_use_id:k,type:"tool_result",content:P}),g=void 0,y=-1,_="",b="",k=""}catch(S){console.log(S)}return}if(T.event==="message_delta"&&v.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:v});let S=await fetch(`http://127.0.0.1:${e.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":e.APIKEY,"content-type":"application/json"},body:JSON.stringify(t.body)});if(!S.ok)return;let O=S.body.pipeThrough(new le).getReader();for(;;)try{let{value:I,done:C}=await O.read();if(C)break;let A=I;if(["message_start","message_stop"].includes(A.event))continue;if(!R.desiredSize)break;R.enqueue(A)}catch(I){if(I.name==="AbortError"||I.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();break}throw I}return}return T}catch(S){if(console.error("Unexpected error in stream processing:",S),S.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();return}throw S}}).pipeThrough(new Ye))}let[p,d]=r.tee(),m=async h=>{let g=h.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();try{for(;;){let{done:y,value:_}=await g.read();if(y)break;let b=_.event,k=_.data;if(b==="message_start"&&k?.message?.model&&(t.upstreamModel=k.message.model),b==="response.completed"&&k?.response?.model&&(t.upstreamModel=k.response.model),k?.usage){let v=ee.get(l)||{},x=Ne(k.usage),T=Tt(v,x,b==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:b,provider:t.provider,model:Rt(t),usageSessionId:c,capturedUsage:x,mergedUsage:T}),(x?.cache_read_input_tokens||x?.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:x?.cache_read_input_tokens,cache_creation:x?.cache_creation_input_tokens}),ee.put(l,T)}if(k?.response?.usage){let v=Ne(k.response.usage),x=ee.get(l)||{},T=Tt(x,v,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:b,provider:t.provider,model:Rt(t),usageSessionId:c,capturedUsage:v,mergedUsage:T}),ee.put(l,T)}}}catch(y){y.name==="AbortError"||y.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",y)}finally{g.releaseLock()}};return t.usageCapturePromise=m(d),s(null,p)}if(r instanceof ReadableStream){let[p,d]=r.tee();return t.usageCapturePromise=(async()=>{let m=d.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();try{for(;;){let{done:h,value:f}=await m.read();if(h)break;let g=f.event,y=f.data;g==="message_start"&&y?.message?.model&&(t.upstreamModel=y.message.model),g==="response.completed"&&y?.response?.model&&(t.upstreamModel=y.response.model);let _=y?.usage??y?.response?.usage;if(_){let b=Ne(_),k=ee.get(l)||{},v=Tt(k,b,g==="message_start");ee.put(l,v)}}}catch(h){h?.name!=="AbortError"&&h?.code!=="ERR_STREAM_PREMATURE_CLOSE"&&t.log?.warn?.({phase:"usage_capture_plain_stream",err:String(h)})}finally{m.releaseLock()}})(),s(null,p)}let u=Dp(r);if(u?.usage&&ee.put(l,u.usage),u?.model&&(t.upstreamModel=u.model),typeof r=="object")return r.error?s(r.error,null):s(r,null)}if(typeof r=="object"&&r.error)return s(r.error,null);s(null,r)}),n.addHook("onSend",async(t,o,r)=>{if(gl.emit("onSend",t,o,r),o.statusCode>=400&&(t.pathname?.endsWith("/v1/messages")||t.pathname?.endsWith("/v1/responses")))try{typeof r=="string"?t.errorResponseBody=r:r&&typeof r=="object"&&(t.errorResponseBody=JSON.stringify(r))}catch{}return r}),n.addHook("onRequestAbort",async t=>{Tr(t)}),n.addHook("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),Tr(t),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{let r=async x=>{if(!x)return;let T;try{await Promise.race([x,new Promise(R=>{T=setTimeout(R,Np)})])}finally{T&&clearTimeout(T)}};await r(t.usageCapturePromise),await r(t.tokenSpeedCapturePromise);let s=Hs(t),a=s,i=t.sessionId||s,c=o.statusCode>=400,l=c?void 0:ee.get(Go(t)),u=Os(a),p=j(),d,m,h=t.sseError,f=h&&(h.type||h.code||h.message),g=l?.output_tokens&&l.output_tokens>0,y=c||f&&!g;if(y){d=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,f&&(d=d||JSON.stringify(h),m=JSON.stringify(h)),m=m||t.errorResponseBody;let x=Rt(t);$p(o.statusCode,d)?p.markRateLimited(t.provider||"",x,120,d):p.recordFailure(t.provider||"",x,d)}else{let x=Rt(t);p.recordSuccess(t.provider||"",x)}let _=l?.cache_read_input_tokens??0,k=l?.input_tokens||0||t.tokenCount||0;!_&&t.tokenCount&&l?.input_tokens&&l.input_tokens<t.tokenCount&&(_=t.tokenCount-l.input_tokens,_&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:l.input_tokens,impliedCache:_}));let v=y?0:l?.output_tokens||0;!y&&t.body?.stream&&k===0&&v===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:Rt(t),usageSessionId:i,tokenCount:t.tokenCount,cachedUsage:l,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),mn({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:i,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:Rt(t),upstreamModel:t.upstreamModel,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||Be(t),stream:t.body?.stream??!1,inputTokens:k,outputTokens:v,cacheReadInputTokens:_,cacheCreationInputTokens:l?.cache_creation_input_tokens||0,ttft:y||!t.body?.stream?null:u.ttft,tokensPerSecond:y?null:u.tokensPerSecond,durationMs:t.requestStartTime?Math.round(js.performance.now()-t.requestStartTime):0,status:y?"error":"success",errorMessage:d,responseBody:m}),t.clientContext?.usageScope!=="session"&&ee.delete(Go(t))}catch(r){console.error("Usage tracking error:",r)}})}var hl,js,yl,Np,gl,Tl=w(()=>{"use strict";hl=require("node:events"),js=require("node:perf_hooks"),yl=q(require("json5"),1);dt();Dn();$n();ue();ss();is();as();hn();vs();ml();Rs();Qn();Np=1500;gl=new hl.EventEmitter});var Cl={};_n(Cl,{createCcrServer:()=>jp});async function jp(n={}){await Dc(),await nn();let e=await $o();(0,we.ensureCcrSelfProvider)(e).changed&&(await fe(e),console.log('\u2139\uFE0F Added the preset "ccr" provider pointing at this server (delete it in the UI to remove it for good).'));let o=e.Providers||e.providers||[],r=o&&o.length>0,s=e.HOST||"127.0.0.1";r?(s=e.HOST,e.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let a=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):a;fc();let c=m=>(m>9?"":"0")+m,l=(m,h)=>{let f;m?typeof m=="number"?f=new Date(m):f=m:f=new Date;let g=f.getFullYear()+""+c(f.getMonth()+1),y=c(f.getDate()),_=c(f.getHours()),b=c(f.getMinutes());return`./logs/ccr-${g}${y}${_}${b}${c(f.getSeconds())}${h?`_${h}`:""}.log`},u;n.logger!==void 0?u=n.logger:(zc(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),u={level:e.LOG_LEVEL||"error",stream:(0,Sl.createStream)(l,{path:we.HOME_DIR,interval:"1d",size:"50M",compress:!1})}):u=!1);let p=await(0,we.listPresets)(),d=new zs({jsonPath:we.CONFIG_FILE,initialConfig:{providers:e.Providers||e.providers,HOST:s,PORT:i,LOG_FILE:(0,xl.join)((0,vl.homedir)(),".claude-code-router","claude-code-router.log")},logger:u});try{await d.ready();let m=await Qc({configDir:we.HOME_DIR,registry:d.pluginRegistry,getServer:()=>d,log:{info:y=>d.app?.log?.info?.(y),warn:y=>d.app?.log?.warn?.(y),error:y=>d.app?.log?.error?.(y)}});m.failed.length&&d.app?.log?.warn?.(`plugins failed to load: ${m.failed.map(y=>`${y.name} (${y.error})`).join("; ")}`),d.pluginRegistry.listLoadedPlugins().length&&d.app?.log?.info?.(`provider plugins active: ${d.pluginRegistry.listLoadedPlugins().map(y=>`${y.name}@${y.version}`).join(", ")}`),m.loaded.length&&Ct(d,e,d.app.log),await cl(d,e),d.recordUsage=y=>{try{let _=y.req?y.req.clientType||Be(y.req):"unknown";mn({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:y.sessionId||"",provider:y.provider||"",originalModel:y.originalModel||"",model:y.model||"",modelFamily:y.modelFamily||"",scenarioType:y.scenarioType||"default",clientType:_,stream:y.stream??!1,inputTokens:y.inputTokens||0,outputTokens:0,cacheReadInputTokens:y.cacheReadInputTokens||0,cacheCreationInputTokens:y.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:y.errorMessage,responseBody:void 0})}catch(_){console.error("Fallback usage tracking error:",_)}},kl(d,e),d.ccrPreHandlerCallbacks=_l(e),(await Promise.allSettled(p.map(async y=>await d.registerNamespace(`/preset/${y.name}`,y.config)))).forEach((y,_)=>{if(y.status==="rejected"){let b=p[_],k=y.reason instanceof Error?y.reason.message:String(y.reason);d.app?.log?.error?.(`Failed to register preset "${b?.name}": ${k}`)}}),await Jc(d,e),vt(e,d.app?.log);let f=y=>{d.app.log.error({err:y},"Uncaught exception")},g=(y,_)=>{d.app.log.error({reason:y,promise:_},"Unhandled rejection")};return process.on("uncaughtException",f),process.on("unhandledRejection",g),d.app.addHook("onClose",async()=>{process.off("uncaughtException",f),process.off("unhandledRejection",g)}),d}catch(m){throw d.pluginRegistry.dispose(),await d.app.close().catch(()=>{}),m}}var vl,xl,Sl,we,Rl=w(()=>{"use strict";vl=require("os"),xl=require("path");wl();Sl=require("rotating-file-stream"),we=require("@wengine-ai/claude-code-router-shared");Fc();rn();Bc();ms();Wc();ll();$s();zo();Tl();an();hn();dt()});var Bp={};_n(Bp,{ActiveProbeService:()=>Gt,ConfigService:()=>je,ProjectRoutingError:()=>re,ProviderHealthStore:()=>It,ProviderService:()=>Ke,SSEParserTransform:()=>le,SSESerializerTransform:()=>Ye,TokenizerService:()=>Ve,TransformerService:()=>Ge,apiKeyAuth:()=>cn,applyClientAdapter:()=>Ae,backupConfigFile:()=>on,builtinClientAdapterRegistry:()=>Er,calculateTokenCount:()=>Ft,clearClientAdapterCaches:()=>Wi,clearProviderHealth:()=>sn,closeProxyDispatchers:()=>vn,collectReachableModelKeys:()=>Ss,createCcrServer:()=>Al,default:()=>zs,detectClientType:()=>Be,diagnoseResolutionFailure:()=>Ir,extractSessionIdFromUserId:()=>Ce,getActiveProbeService:()=>os,getAllQuotaResults:()=>Un,getAllRateLimitInfo:()=>Mn,getClientAdapter:()=>Or,getConfiguredProxyUrl:()=>wt,getHealthStore:()=>j,getProxyDispatcher:()=>Y,getQuotaAdapter:()=>Eo,getQuotaResult:()=>Nt,getRateLimitInfo:()=>Ci,getRuntimeDebugLog:()=>Et,getServer:()=>zp,initConfig:()=>$o,initDir:()=>nn,initProviderHealthPersistence:()=>In,initQuotaStorePersistence:()=>it,initRateLimitPersistence:()=>nt,isClientType:()=>Ar,isGlobalProxyEnabled:()=>Yo,listAnthropicCompatibleModels:()=>Fo,mergeUsageCapture:()=>Tt,normalizeSessionId:()=>Se,normalizeUsagePayload:()=>Ne,pluginManager:()=>bt,readConfigFile:()=>te,readConfigFileRaw:()=>kt,reconcileHealthStore:()=>vt,resetActiveProbeService:()=>Oo,resolveProviderProxyUrl:()=>ge,rewriteStream:()=>Vt,router:()=>Ht,searchProjectBySession:()=>Mr,sessionUsageCache:()=>ee,setRuntimeDebugLog:()=>Sn,startActiveProbe:()=>yt,stopActiveProbe:()=>Ao,storeQuotaResult:()=>Fn,tokenSpeedPlugin:()=>en,usageStore:()=>Is,writeConfigFile:()=>fe});module.exports=Ws(Bp);function Hp(n={}){let e=(0,Pl.default)({bodyLimit:52428800,...n});return e.setErrorHandler(qs),e.register(El.default),e}async function Al(n={}){return(await Promise.resolve().then(()=>(Rl(),Cl))).createCcrServer(n)}var Pl,El,Bs,zs,zp,wl=w(()=>{Pl=q(require("fastify"),1),El=q(require("@fastify/cors"),1);Zo();xn();Qn();Lr();jr();Hr();We();Dn();Io();ue();ot();at();ae();dt();Qn();En();ct();dt();We();Zo();Lr();jr();Hr();_s();cs();ue();ot();es();at();ue();Io();At();ae();rn();vs();an();Cs();Rs();hn();Bs=class{app;pluginRegistry=new Ot;namespaceProviders=[];reloadProviders(e){let t=e?.Providers??e?.providers??[];this.configService.set("providers",t),this.providerService.reload();for(let o of this.namespaceProviders)o.providers.reload()}reloadNamespaceProviders(e,t){let o=this.namespaceProviders.find(r=>r.name===e);if(!o)throw new Error(`unknown namespace ${e}`);o.config.set("providers",t),o.providers.reload()}configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:a,useEnvironmentVariables:i,...c}=e;this.app=Hp({...c,logger:c.logger??!0}),this.app._server=this,this.app.addHook("onClose",async()=>{this.pluginRegistry.dispose(),this.tokenizerService?.dispose()});let l={initialConfig:t};o!==void 0&&(l.jsonPath=o),r!==void 0&&(l.envPath=r),s!==void 0&&(l.useEnvFile=s),a!==void 0&&(l.useJsonFile=a),i!==void 0&&(l.useEnvironmentVariables=i),this.configService=new je(l),this.transformerService=new Ge(this.configService,this.app.log),this.tokenizerService=new Ve(this.configService,this.app.log);let u=this.transformerService;this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.pluginRegistry.attachTransformerService(u),this.providerService=new Ke(this.configService,this.transformerService,this.app.log)})()}async ready(){await this.readiness}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(await this.ready(),e==="/"&&this.mainNamespaceRegistered)return;let o=this.configService,r=this.transformerService,s=this.providerService,a=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new je({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Ge(o,this.app.log),a=new Ve(o,this.app.log),await Promise.all([r.initialize(),a.initialize()]),this.pluginRegistry.attachTransformerService(r),s=new Ke(o,r,this.app.log),this.namespaceProviders.push({name:e,config:o,providers:s})}let i=async c=>{c.decorate("pluginRegistry",this.pluginRegistry),c.decorate("configService",o),c.decorate("transformerService",r),c.decorate("providerService",s),c.decorate("tokenizerService",a),c.decorate("recordUsage",this.recordUsage||(()=>{})),c.addHook("preHandler",async(l,u)=>{let p=new URL(`http://127.0.0.1${l.url}`);l.pathname=p.pathname;let d=p.pathname.endsWith("/v1/messages"),m=p.pathname.endsWith("/v1/responses");if(!d&&!m||!l.body||typeof l.body!="object")return;let h=l.ccrHookOrder||=[];if(h.push("request-normalize"),m&&l.body.input&&!l.body.messages&&zt(l.body),l.body.stream===void 0&&(l.body.stream=!1),l.log.info({data:l.body,type:"request body"}),h.push("adapter"),!l.originalModel&&l.body.model&&(l.originalModel=l.body.model),Ae(l,o.getAll()),h.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(l,u),u.sent))&&(h.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(l,u),u.sent)))){h.push("router"),l.body?.model&&await Ht(l,u,{configService:o,tokenizerService:a}),l.usageCacheKey&&ee.put(l.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),h.push("provider-model-normalize");try{let f=l.body;if(!f||!f.model)return u.code(400).send({error:"Missing model in request body"});let g=f.model.split(","),y=f.model;if(g.length>1){let[_,...b]=g;y=b.join(","),f.model=y,l.provider=_}l.model=y}catch(f){return l.log.error({error:f},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await ia(c)};e==="/"?(await this.app.register(i),this.mainNamespaceRegistered=!0):await this.app.register(i,{prefix:e})}async start(){try{if(await this.ready(),await this.registerNamespace("/"),!this.signalHandlersRegistered){this.signalHandlersRegistered=!0;let t=async s=>{this.app.log.info(`Received ${s}, shutting down gracefully...`);try{Ao()}catch{}await this.app.close(),process.exit(0)},o=()=>void t("SIGINT"),r=()=>void t("SIGTERM");process.on("SIGINT",o),process.on("SIGTERM",r),this.app.addHook("onClose",async()=>{process.off("SIGINT",o),process.off("SIGTERM",r),this.signalHandlersRegistered=!1;try{this.tokenizerService.dispose()}catch{}await vn()})}await this.app.ready();let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);try{nt()}catch{}try{it()}catch{}try{In()}catch{}try{let t={enabled:this.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:this.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:this.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(this.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:this.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:this.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};this.activeProbeService=yt(()=>this.providerService.getProviders(),t,o=>ge(this.configService,o),this.app.log,o=>this.configService.get(o),o=>this.pluginRegistry?.getManagedRuntimeFor(o))}catch(t){this.app.log.warn?.(`Failed to start active probe service: ${t.message}`)}}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},zs=Bs;zp=Al});wl();0&&(module.exports={ActiveProbeService,ConfigService,ProjectRoutingError,ProviderHealthStore,ProviderService,SSEParserTransform,SSESerializerTransform,TokenizerService,TransformerService,apiKeyAuth,applyClientAdapter,backupConfigFile,builtinClientAdapterRegistry,calculateTokenCount,clearClientAdapterCaches,clearProviderHealth,closeProxyDispatchers,collectReachableModelKeys,createCcrServer,detectClientType,diagnoseResolutionFailure,extractSessionIdFromUserId,getActiveProbeService,getAllQuotaResults,getAllRateLimitInfo,getClientAdapter,getConfiguredProxyUrl,getHealthStore,getProxyDispatcher,getQuotaAdapter,getQuotaResult,getRateLimitInfo,getRuntimeDebugLog,getServer,initConfig,initDir,initProviderHealthPersistence,initQuotaStorePersistence,initRateLimitPersistence,isClientType,isGlobalProxyEnabled,listAnthropicCompatibleModels,mergeUsageCapture,normalizeSessionId,normalizeUsagePayload,pluginManager,readConfigFile,readConfigFileRaw,reconcileHealthStore,resetActiveProbeService,resolveProviderProxyUrl,rewriteStream,router,searchProjectBySession,sessionUsageCache,setRuntimeDebugLog,startActiveProbe,stopActiveProbe,storeQuotaResult,tokenSpeedPlugin,usageStore,writeConfigFile});
425
+ Your response should consistently follow this rule whenever image-related analysis is requested.`});let o=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(a=>a.type==="image"||Array.isArray(a.content)&&a.content.some(i=>i.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(a=>{if(a.type==="image")Wo.storeImage(`${e.id}_Image#${r}`,a.source),a.type="text",delete a.source,a.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(a.type==="text"&&a.text.includes("[Image #"))a.text=a.text.replace(/\[Image #\d+\]/g,"");else if(a.type==="tool_result"&&Array.isArray(a.content)&&a.content.some(i=>i.type==="image")){let i=[],c=a.content.filter(u=>u.type!=="image"?!0:(Wo.storeImage(`${e.id}_Image#${r}`,u.source),i.push(`[Image #${r}]`),r++,!1)),l=`${i.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;a.content=c.length>0?[{type:"text",text:l},...c]:l}})})}},dl=new Fs});var Us,fl,Ko,ml=R(()=>{"use strict";pl();Us=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}},fl=new Us;fl.registerAgent(dl);Ko=fl});function Dp(n,e){return n===429||!!(e&&/rate[\s_]limit|too many|限流|频率限制|qps_limit|token_limit|quota exhausted|usage limit|limit reached/i.test(e))}function _l(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&Ae(n,e)}function Hs(n){return n.usageSessionId||n.id}function Go(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${Hs(n)}`}function Ze(n){return n.body?.model?Array.isArray(n.body.model)?n.body.model.join(","):n.body.model:Array.isArray(n.model)?n.model.join(","):n.model||""}function Fp(n){if(!n)return;let e=n;if(Buffer.isBuffer(n)&&(e=n.toString("utf8")),typeof e=="string")try{e=JSON.parse(e)}catch{return}if(typeof e!="object")return;let t=e.usage?Ne(e.usage):e.response?.usage?Ne(e.response.usage):void 0,o=e.model||e.response?.model;if(!(!t&&!o))return{usage:t,model:o}}async function Up(n,e,t){if(await new Promise((r,s)=>{let a=i=>i?s(i):r();cn(t)(n,e,a).then(()=>r(),s)}),e.sent)return;let o=new URL(`http://127.0.0.1${n.url}`);if(n.pathname=o.pathname,n.pathname.endsWith("/v1/messages")&&n.pathname!=="/v1/messages"&&(n.preset=n.pathname.replace("/v1/messages","").replace("/","")),n.pathname.endsWith("/v1/responses")&&n.pathname!=="/v1/responses"&&(n.preset=n.pathname.replace("/v1/responses","").replace("/","")),n.pathname.endsWith("/v1/messages")||n.pathname.endsWith("/v1/responses")){_l(n,t);let r=Go(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=ee.get(r))}}async function jp(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of Ko.getAllAgents())r.shouldHandle(n,t)&&(o.push(r.name),r.reqHandler(n,t),r.tools.size&&(n.body?.tools?.length||(n.body.tools=[]),n.body.tools.unshift(...Array.from(r.tools.values()).map(s=>({name:s.name,description:s.description,input_schema:s.input_schema})))));o.length&&(n.agents=o)}function bl(n){return{authClient:(e,t)=>Up(e,t,n),agent:(e,t)=>jp(e,t,n)}}function kl(n,e){n.addHook("onRequest",async t=>{let o=new URL(`http://127.0.0.1${t.url}`);t.pathname=o.pathname,(o.pathname.endsWith("/v1/messages")||o.pathname.endsWith("/v1/responses"))&&!t.requestStartTime&&(t.requestStartTime=js.performance.now())}),n.addHook("preHandler",async(t,o)=>{let r=t.pathname||new URL(`http://127.0.0.1${t.url}`).pathname;r.endsWith("/v1/messages")||r.endsWith("/v1/responses")||await new Promise((s,a)=>{let i=c=>c?a(c):s();cn(e)(t,o,i).then(()=>s(),a)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",gl.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let a=t.pathname?.endsWith("/v1/messages"),i=t.pathname?.endsWith("/v1/responses");if(a||i){_l(t,e);let c=Hs(t),l=Go(t);if(r instanceof ReadableStream){if(a&&t.agents){let h=new AbortController,g=r.pipeThrough(new le),m,_=-1,b="",y="",k="",v=[],x=[];return s(null,Vt(g,async(T,C)=>{try{if(T.event==="content_block_start"&&T?.data?.content_block?.name){let S=t.agents.find(P=>Ko.getAgent(P)?.tools.get(T.data.content_block.name));if(S){m=Ko.getAgent(S),_=T.data.index,b=T.data.content_block.name,k=T.data.content_block.id;return}}if(_>-1&&T.data.index===_&&T.data?.delta?.type==="input_json_delta"){y+=T.data?.delta?.partial_json;return}if(_>-1&&T.data.index===_&&T.data?.type==="content_block_stop"){try{let S=yl.default.parse(y);x.push({type:"tool_use",id:k,name:b,input:S});let P=await m?.tools.get(b)?.handler(S,{req:t,config:e});v.push({tool_use_id:k,type:"tool_result",content:P}),m=void 0,_=-1,b="",y="",k=""}catch(S){console.log(S)}return}if(T.event==="message_delta"&&v.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:v});let S=await fetch(`http://127.0.0.1:${e.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":e.APIKEY,"content-type":"application/json"},body:JSON.stringify(t.body)});if(!S.ok)return;let M=S.body.pipeThrough(new le).getReader();for(;;)try{let{value:I,done:A}=await M.read();if(A)break;let w=I;if(["message_start","message_stop"].includes(w.event))continue;if(!C.desiredSize)break;C.enqueue(w)}catch(I){if(I.name==="AbortError"||I.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();break}throw I}return}return T}catch(S){if(console.error("Unexpected error in stream processing:",S),S.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();return}throw S}}).pipeThrough(new Ye))}let[p,d]=r.tee(),f=async h=>{let m=h.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();try{for(;;){let{done:_,value:b}=await m.read();if(_)break;let y=b.event,k=b.data;if(y==="message_start"&&k?.message?.model&&(t.upstreamModel=k.message.model),!t.upstreamModel&&k?.response?.model&&(t.upstreamModel=k.response.model),y==="response.completed"&&k?.response?.model&&(t.upstreamModel=k.response.model),k?.usage){let v=ee.get(l)||{},x=Ne(k.usage),T=vt(v,x,y==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:y,provider:t.provider,model:Ze(t),usageSessionId:c,capturedUsage:x,mergedUsage:T}),(x?.cache_read_input_tokens||x?.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:x?.cache_read_input_tokens,cache_creation:x?.cache_creation_input_tokens}),ee.put(l,T)}if(k?.response?.usage){let v=Ne(k.response.usage),x=ee.get(l)||{},T=vt(x,v,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:y,provider:t.provider,model:Ze(t),usageSessionId:c,capturedUsage:v,mergedUsage:T}),ee.put(l,T)}}}catch(_){_.name==="AbortError"||_.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",_)}finally{m.releaseLock()}};return t.usageCapturePromise=f(d),s(null,p)}if(r instanceof ReadableStream){let[p,d]=r.tee();return t.usageCapturePromise=(async()=>{let f=d.pipeThrough(new TextDecoderStream).pipeThrough(new le).getReader();try{for(;;){let{done:h,value:g}=await f.read();if(h)break;let m=g.event,_=g.data;m==="message_start"&&_?.message?.model&&(t.upstreamModel=_.message.model),m==="response.completed"&&_?.response?.model&&(t.upstreamModel=_.response.model);let b=_?.usage??_?.response?.usage;if(b){let y=Ne(b),k=ee.get(l)||{},v=vt(k,y,m==="message_start");ee.put(l,v)}}}catch(h){h?.name!=="AbortError"&&h?.code!=="ERR_STREAM_PREMATURE_CLOSE"&&t.log?.warn?.({phase:"usage_capture_plain_stream",err:String(h)})}finally{f.releaseLock()}})(),s(null,p)}let u=Fp(r);if(u?.usage&&ee.put(l,u.usage),u?.model&&(t.upstreamModel=u.model),typeof r=="object")return r.error?s(r.error,null):s(r,null)}if(typeof r=="object"&&r.error)return s(r.error,null);s(null,r)}),n.addHook("onSend",async(t,o,r)=>{if(gl.emit("onSend",t,o,r),o.statusCode>=400&&(t.pathname?.endsWith("/v1/messages")||t.pathname?.endsWith("/v1/responses")))try{typeof r=="string"?t.errorResponseBody=r:r&&typeof r=="object"&&(t.errorResponseBody=JSON.stringify(r))}catch{}return r}),n.addHook("onRequestAbort",async t=>{Tr(t)}),n.addHook("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),Tr(t),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{let r=async x=>{if(!x)return;let T;try{await Promise.race([x,new Promise(C=>{T=setTimeout(C,$p)})])}finally{T&&clearTimeout(T)}};await r(t.usageCapturePromise),await r(t.tokenSpeedCapturePromise);let s=Hs(t),a=s,i=t.sessionId||s,c=o.statusCode>=400,l=c?void 0:ee.get(Go(t)),u=Os(a),p=j(),d,f,h=t.sseError,g=h&&(h.type||h.code||h.message),m=l?.output_tokens&&l.output_tokens>0,_=c||g&&!m;if(_){d=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,g&&(d=d||JSON.stringify(h),f=JSON.stringify(h)),f=f||t.errorResponseBody;let x=Ze(t);Dp(o.statusCode,d)?p.markRateLimited(t.provider||"",x,120,d):p.recordFailure(t.provider||"",x,d)}else{let x=Ze(t);p.recordSuccess(t.provider||"",x)}let b=l?.cache_read_input_tokens??0,k=l?.input_tokens||0||t.tokenCount||0;!b&&t.tokenCount&&l?.input_tokens&&l.input_tokens<t.tokenCount&&(b=t.tokenCount-l.input_tokens,b&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:l.input_tokens,impliedCache:b}));let v=_?0:l?.output_tokens||0;!_&&t.body?.stream&&k===0&&v===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:Ze(t),usageSessionId:i,tokenCount:t.tokenCount,cachedUsage:l,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),mn({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:i,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:Ze(t),upstreamModel:t.upstreamModel||Ze(t)||void 0,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||Be(t),stream:t.body?.stream??!1,inputTokens:k,outputTokens:v,cacheReadInputTokens:b,cacheCreationInputTokens:l?.cache_creation_input_tokens||0,ttft:_||!t.body?.stream?null:u.ttft,tokensPerSecond:_?null:u.tokensPerSecond,durationMs:t.requestStartTime?Math.round(js.performance.now()-t.requestStartTime):0,status:_?"error":"success",errorMessage:d,responseBody:f}),t.clientContext?.usageScope!=="session"&&ee.delete(Go(t))}catch(r){console.error("Usage tracking error:",r)}})}var hl,js,yl,$p,gl,Tl=R(()=>{"use strict";hl=require("node:events"),js=require("node:perf_hooks"),yl=q(require("json5"),1);pt();Dn();$n();ue();ss();is();as();hn();vs();ml();Rs();Qn();$p=1500;gl=new hl.EventEmitter});var Cl={};bn(Cl,{createCcrServer:()=>Hp});async function Hp(n={}){await Dc(),await nn();let e=await $o();(0,we.ensureCcrSelfProvider)(e).changed&&(await fe(e),console.log('\u2139\uFE0F Added the preset "ccr" provider pointing at this server (delete it in the UI to remove it for good).'));let o=e.Providers||e.providers||[],r=o&&o.length>0,s=e.HOST||"127.0.0.1";r?(s=e.HOST,e.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let a=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):a;fc();let c=f=>(f>9?"":"0")+f,l=(f,h)=>{let g;f?typeof f=="number"?g=new Date(f):g=f:g=new Date;let m=g.getFullYear()+""+c(g.getMonth()+1),_=c(g.getDate()),b=c(g.getHours()),y=c(g.getMinutes());return`./logs/ccr-${m}${_}${b}${y}${c(g.getSeconds())}${h?`_${h}`:""}.log`},u;n.logger!==void 0?u=n.logger:(zc(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),u={level:e.LOG_LEVEL||"error",stream:(0,Sl.createStream)(l,{path:we.HOME_DIR,interval:"1d",size:"50M",compress:!1})}):u=!1);let p=await(0,we.listPresets)(),d=new zs({jsonPath:we.CONFIG_FILE,initialConfig:{providers:e.Providers||e.providers,HOST:s,PORT:i,LOG_FILE:(0,xl.join)((0,vl.homedir)(),".claude-code-router","claude-code-router.log")},logger:u});try{await d.ready();let f=await Qc({configDir:we.HOME_DIR,registry:d.pluginRegistry,getServer:()=>d,log:{info:_=>d.app?.log?.info?.(_),warn:_=>d.app?.log?.warn?.(_),error:_=>d.app?.log?.error?.(_)}});f.failed.length&&d.app?.log?.warn?.(`plugins failed to load: ${f.failed.map(_=>`${_.name} (${_.error})`).join("; ")}`),d.pluginRegistry.listLoadedPlugins().length&&d.app?.log?.info?.(`provider plugins active: ${d.pluginRegistry.listLoadedPlugins().map(_=>`${_.name}@${_.version}`).join(", ")}`),f.loaded.length&&Rt(d,e,d.app.log),await cl(d,e),d.recordUsage=_=>{try{let b=_.req?_.req.clientType||Be(_.req):"unknown";mn({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:_.sessionId||"",provider:_.provider||"",originalModel:_.originalModel||"",model:_.model||"",modelFamily:_.modelFamily||"",scenarioType:_.scenarioType||"default",clientType:b,stream:_.stream??!1,inputTokens:_.inputTokens||0,outputTokens:0,cacheReadInputTokens:_.cacheReadInputTokens||0,cacheCreationInputTokens:_.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:_.errorMessage,responseBody:void 0})}catch(b){console.error("Fallback usage tracking error:",b)}},kl(d,e),d.ccrPreHandlerCallbacks=bl(e),(await Promise.allSettled(p.map(async _=>await d.registerNamespace(`/preset/${_.name}`,_.config)))).forEach((_,b)=>{if(_.status==="rejected"){let y=p[b],k=_.reason instanceof Error?_.reason.message:String(_.reason);d.app?.log?.error?.(`Failed to register preset "${y?.name}": ${k}`)}}),await Jc(d,e),xt(e,d.app?.log);let g=_=>{d.app.log.error({err:_},"Uncaught exception")},m=(_,b)=>{d.app.log.error({reason:_,promise:b},"Unhandled rejection")};return process.on("uncaughtException",g),process.on("unhandledRejection",m),d.app.addHook("onClose",async()=>{process.off("uncaughtException",g),process.off("unhandledRejection",m)}),d}catch(f){throw d.pluginRegistry.dispose(),await d.app.close().catch(()=>{}),f}}var vl,xl,Sl,we,Rl=R(()=>{"use strict";vl=require("os"),xl=require("path");wl();Sl=require("rotating-file-stream"),we=require("@wengine-ai/claude-code-router-shared");Fc();rn();Bc();ms();Wc();ll();$s();zo();Tl();an();hn();pt()});var Jp={};bn(Jp,{ActiveProbeService:()=>Gt,ConfigService:()=>je,ProjectRoutingError:()=>re,ProviderHealthStore:()=>It,ProviderService:()=>Ke,SSEParserTransform:()=>le,SSESerializerTransform:()=>Ye,TokenizerService:()=>Ve,TransformerService:()=>Ge,apiKeyAuth:()=>cn,applyClientAdapter:()=>Ae,backupConfigFile:()=>on,builtinClientAdapterRegistry:()=>Er,calculateTokenCount:()=>Ft,clearClientAdapterCaches:()=>Wi,clearProviderHealth:()=>sn,closeProxyDispatchers:()=>vn,collectReachableModelKeys:()=>Ss,createCcrServer:()=>Al,default:()=>zs,detectClientType:()=>Be,diagnoseResolutionFailure:()=>Ir,extractSessionIdFromUserId:()=>Ce,getActiveProbeService:()=>os,getAllQuotaResults:()=>Un,getAllRateLimitInfo:()=>Mn,getClientAdapter:()=>Or,getConfiguredProxyUrl:()=>wt,getHealthStore:()=>j,getProxyDispatcher:()=>Y,getQuotaAdapter:()=>Eo,getQuotaResult:()=>Nt,getRateLimitInfo:()=>Ci,getRuntimeDebugLog:()=>Et,getServer:()=>Bp,initConfig:()=>$o,initDir:()=>nn,initProviderHealthPersistence:()=>In,initQuotaStorePersistence:()=>at,initRateLimitPersistence:()=>ot,isClientType:()=>Ar,isGlobalProxyEnabled:()=>Yo,listAnthropicCompatibleModels:()=>Fo,mergeUsageCapture:()=>vt,normalizeSessionId:()=>Se,normalizeUsagePayload:()=>Ne,pluginManager:()=>bt,readConfigFile:()=>te,readConfigFileRaw:()=>Tt,reconcileHealthStore:()=>xt,resetActiveProbeService:()=>Oo,resolveProviderProxyUrl:()=>ge,rewriteStream:()=>Vt,router:()=>Ht,searchProjectBySession:()=>Mr,sessionUsageCache:()=>ee,setRuntimeDebugLog:()=>Sn,startActiveProbe:()=>_t,stopActiveProbe:()=>Ao,storeQuotaResult:()=>Fn,tokenSpeedPlugin:()=>en,usageStore:()=>Is,writeConfigFile:()=>fe});module.exports=Ws(Jp);function zp(n={}){let e=(0,Pl.default)({bodyLimit:52428800,...n});return e.setErrorHandler(qs),e.register(El.default),e}async function Al(n={}){return(await Promise.resolve().then(()=>(Rl(),Cl))).createCcrServer(n)}var Pl,El,Bs,zs,Bp,wl=R(()=>{Pl=q(require("fastify"),1),El=q(require("@fastify/cors"),1);Zo();xn();Qn();Lr();jr();Hr();We();Dn();Io();ue();rt();ct();ae();pt();Qn();En();lt();pt();We();Zo();Lr();jr();Hr();bs();cs();ue();rt();es();ct();ue();Io();At();ae();rn();vs();an();Cs();Rs();hn();Bs=class{app;pluginRegistry=new Ot;namespaceProviders=[];reloadProviders(e){let t=e?.Providers??e?.providers??[];this.configService.set("providers",t),this.providerService.reload();for(let o of this.namespaceProviders)o.providers.reload()}reloadNamespaceProviders(e,t){let o=this.namespaceProviders.find(r=>r.name===e);if(!o)throw new Error(`unknown namespace ${e}`);o.config.set("providers",t),o.providers.reload()}configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:a,useEnvironmentVariables:i,...c}=e;this.app=zp({...c,logger:c.logger??!0}),this.app._server=this,this.app.addHook("onClose",async()=>{this.pluginRegistry.dispose(),this.tokenizerService?.dispose()});let l={initialConfig:t};o!==void 0&&(l.jsonPath=o),r!==void 0&&(l.envPath=r),s!==void 0&&(l.useEnvFile=s),a!==void 0&&(l.useJsonFile=a),i!==void 0&&(l.useEnvironmentVariables=i),this.configService=new je(l),this.transformerService=new Ge(this.configService,this.app.log),this.tokenizerService=new Ve(this.configService,this.app.log);let u=this.transformerService;this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.pluginRegistry.attachTransformerService(u),this.providerService=new Ke(this.configService,this.transformerService,this.app.log)})()}async ready(){await this.readiness}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(await this.ready(),e==="/"&&this.mainNamespaceRegistered)return;let o=this.configService,r=this.transformerService,s=this.providerService,a=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new je({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Ge(o,this.app.log),a=new Ve(o,this.app.log),await Promise.all([r.initialize(),a.initialize()]),this.pluginRegistry.attachTransformerService(r),s=new Ke(o,r,this.app.log),this.namespaceProviders.push({name:e,config:o,providers:s})}let i=async c=>{c.decorate("pluginRegistry",this.pluginRegistry),c.decorate("configService",o),c.decorate("transformerService",r),c.decorate("providerService",s),c.decorate("tokenizerService",a),c.decorate("recordUsage",this.recordUsage||(()=>{})),c.addHook("preHandler",async(l,u)=>{let p=new URL(`http://127.0.0.1${l.url}`);l.pathname=p.pathname;let d=p.pathname.endsWith("/v1/messages"),f=p.pathname.endsWith("/v1/responses");if(!d&&!f||!l.body||typeof l.body!="object")return;let h=l.ccrHookOrder||=[];if(h.push("request-normalize"),f&&l.body.input&&!l.body.messages&&zt(l.body),l.body.stream===void 0&&(l.body.stream=!1),l.log.info({data:l.body,type:"request body"}),h.push("adapter"),!l.originalModel&&l.body.model&&(l.originalModel=l.body.model),Ae(l,o.getAll()),h.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(l,u),u.sent))&&(h.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(l,u),u.sent)))){h.push("router"),l.body?.model&&await Ht(l,u,{configService:o,tokenizerService:a}),l.usageCacheKey&&ee.put(l.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),h.push("provider-model-normalize");try{let g=l.body;if(!g||!g.model)return u.code(400).send({error:"Missing model in request body"});let m=g.model.split(","),_=g.model;if(m.length>1){let[b,...y]=m;_=y.join(","),g.model=_,l.provider=b}l.model=_}catch(g){return l.log.error({error:g},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await ia(c)};e==="/"?(await this.app.register(i),this.mainNamespaceRegistered=!0):await this.app.register(i,{prefix:e})}async start(){try{if(await this.ready(),await this.registerNamespace("/"),!this.signalHandlersRegistered){this.signalHandlersRegistered=!0;let t=async s=>{this.app.log.info(`Received ${s}, shutting down gracefully...`);try{Ao()}catch{}await this.app.close(),process.exit(0)},o=()=>void t("SIGINT"),r=()=>void t("SIGTERM");process.on("SIGINT",o),process.on("SIGTERM",r),this.app.addHook("onClose",async()=>{process.off("SIGINT",o),process.off("SIGTERM",r),this.signalHandlersRegistered=!1;try{this.tokenizerService.dispose()}catch{}await vn()})}await this.app.ready();let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);try{ot()}catch{}try{at()}catch{}try{In()}catch{}try{let t={enabled:this.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:this.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:this.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(this.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:this.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:this.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};this.activeProbeService=_t(()=>this.providerService.getProviders(),t,o=>ge(this.configService,o),this.app.log,o=>this.configService.get(o),o=>this.pluginRegistry?.getManagedRuntimeFor(o))}catch(t){this.app.log.warn?.(`Failed to start active probe service: ${t.message}`)}}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},zs=Bs;Bp=Al});wl();0&&(module.exports={ActiveProbeService,ConfigService,ProjectRoutingError,ProviderHealthStore,ProviderService,SSEParserTransform,SSESerializerTransform,TokenizerService,TransformerService,apiKeyAuth,applyClientAdapter,backupConfigFile,builtinClientAdapterRegistry,calculateTokenCount,clearClientAdapterCaches,clearProviderHealth,closeProxyDispatchers,collectReachableModelKeys,createCcrServer,detectClientType,diagnoseResolutionFailure,extractSessionIdFromUserId,getActiveProbeService,getAllQuotaResults,getAllRateLimitInfo,getClientAdapter,getConfiguredProxyUrl,getHealthStore,getProxyDispatcher,getQuotaAdapter,getQuotaResult,getRateLimitInfo,getRuntimeDebugLog,getServer,initConfig,initDir,initProviderHealthPersistence,initQuotaStorePersistence,initRateLimitPersistence,isClientType,isGlobalProxyEnabled,listAnthropicCompatibleModels,mergeUsageCapture,normalizeSessionId,normalizeUsagePayload,pluginManager,readConfigFile,readConfigFileRaw,reconcileHealthStore,resetActiveProbeService,resolveProviderProxyUrl,rewriteStream,router,searchProjectBySession,sessionUsageCache,setRuntimeDebugLog,startActiveProbe,stopActiveProbe,storeQuotaResult,tokenSpeedPlugin,usageStore,writeConfigFile});
426
426
  //# sourceMappingURL=server.cjs.map