@wengine-ai/llms 2.3.2402 → 2.3.2404

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,70 +1,70 @@
1
- "use strict";var $a=Object.create;var Yt=Object.defineProperty;var Na=Object.getOwnPropertyDescriptor;var La=Object.getOwnPropertyNames;var Da=Object.getPrototypeOf,Fa=Object.prototype.hasOwnProperty;var w=(n,e)=>()=>(n&&(e=n(n=0)),e);var Xt=(n,e)=>{for(var t in e)Yt(n,t,{get:e[t],enumerable:!0})},Fr=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of La(e))!Fa.call(n,r)&&r!==t&&Yt(n,r,{get:()=>e[r],enumerable:!(o=Na(e,r))||o.enumerable});return n};var X=(n,e,t)=>(t=n!=null?$a(Da(n)):{},Fr(e||!n||!n.__esModule?Yt(t,"default",{value:n,enumerable:!0}):t,n)),Ur=n=>Fr(Yt({},"__esModule",{value:!0}),n);function ja(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(Ua.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 zr(n){let e=[];for(let t of Hr){let o=n[t];if(o==null)continue;let r=ja(o);r.ok||e.push({key:t,error:r.error})}return e}function lt(n){for(let e of Hr){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function fo(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 de(n,e){let t=lt(n);if(t)return fo(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function V(n){let e=Ha(n),t=qt.get(e);if(t)return t;let o=new jr.ProxyAgent(e);return qt.set(e,o),o}async function Zt(){let n=Array.from(qt.values());qt.clear(),await Promise.allSettled(n.map(e=>e.close()))}function Ha(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 jr,Hr,Ua,qt,ae=w(()=>{"use strict";jr=require("undici"),Hr=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],Ua=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;qt=new Map});var ut,mo,Jr,Br,Se,go=w(()=>{"use strict";ut=require("fs"),mo=require("path"),Jr=require("dotenv"),Br=X(require("json5"),1);ae();Se=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,mo.join)(process.cwd(),this.options.jsonPath);if((0,ut.existsSync)(e))try{let t=(0,ut.readFileSync)(e,"utf-8"),o=Br.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,mo.join)(process.cwd(),this.options.envPath);if((0,ut.existsSync)(e))try{let t=(0,Jr.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 lt(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 Wr(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 en=w(()=>{"use strict"});function tn(n){ho=n}function dt(){return ho}function nn(n){return ho||n.get("DEBUG_LOG")===!0}function Qr(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Fe:{maxBodyLength:e.maxBodyLength??Fe.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Fe.maxStreamChunks}}function on(n){let e={};for(let[t,o]of Object.entries(n))za.has(t.toLowerCase())?e[t]="***MASKED***":e[t]=o;return e}function rn(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function Vr(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:on(t.headers),body:rn(o,Fe.maxBodyLength)})}function Yr(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:on(t.headers),...t.body!==void 0?{body:rn(t.body,Fe.maxBodyLength)}:{}})}function Gr(n,e,t,o){let r=Ja(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:rn(o,Fe.maxBodyLength)})}function Ja(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:rn(o,512)})}}if(e.length)return e.length===1?e[0]:e}function Kr(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function Xr(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let i="";for(;;){let{done:l,value:c}=await r.read();if(l)break;i+=c;let a=i.split(`
1
+ "use strict";var Da=Object.create;var Yt=Object.defineProperty;var Fa=Object.getOwnPropertyDescriptor;var Ua=Object.getOwnPropertyNames;var ja=Object.getPrototypeOf,Ha=Object.prototype.hasOwnProperty;var w=(n,e)=>()=>(n&&(e=n(n=0)),e);var Xt=(n,e)=>{for(var t in e)Yt(n,t,{get:e[t],enumerable:!0})},jr=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ua(e))!Ha.call(n,r)&&r!==t&&Yt(n,r,{get:()=>e[r],enumerable:!(o=Fa(e,r))||o.enumerable});return n};var X=(n,e,t)=>(t=n!=null?Da(ja(n)):{},jr(e||!n||!n.__esModule?Yt(t,"default",{value:n,enumerable:!0}):t,n)),Hr=n=>jr(Yt({},"__esModule",{value:!0}),n);function Ja(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(za.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 Br(n){let e=[];for(let t of Jr){let o=n[t];if(o==null)continue;let r=Ja(o);r.ok||e.push({key:t,error:r.error})}return e}function ut(n){for(let e of Jr){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function mo(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 pe(n,e){let t=ut(n);if(t)return mo(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function V(n){let e=Ba(n),t=qt.get(e);if(t)return t;let o=new zr.ProxyAgent(e);return qt.set(e,o),o}async function Zt(){let n=Array.from(qt.values());qt.clear(),await Promise.allSettled(n.map(e=>e.close()))}function Ba(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 zr,Jr,za,qt,ce=w(()=>{"use strict";zr=require("undici"),Jr=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],za=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;qt=new Map});var dt,go,Wr,Gr,we,ho=w(()=>{"use strict";dt=require("fs"),go=require("path"),Wr=require("dotenv"),Gr=X(require("json5"),1);ce();we=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,go.join)(process.cwd(),this.options.jsonPath);if((0,dt.existsSync)(e))try{let t=(0,dt.readFileSync)(e,"utf-8"),o=Gr.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,go.join)(process.cwd(),this.options.envPath);if((0,dt.existsSync)(e))try{let t=(0,Wr.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 ut(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 Kr(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 en=w(()=>{"use strict"});function tn(n){yo=n}function pt(){return yo}function nn(n){return yo||n.get("DEBUG_LOG")===!0}function Yr(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?je:{maxBodyLength:e.maxBodyLength??je.maxBodyLength,maxStreamChunks:e.maxStreamChunks??je.maxStreamChunks}}function on(n){let e={};for(let[t,o]of Object.entries(n))Wa.has(t.toLowerCase())?e[t]="***MASKED***":e[t]=o;return e}function rn(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function Xr(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:on(t.headers),body:rn(o,je.maxBodyLength)})}function qr(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:on(t.headers),...t.body!==void 0?{body:rn(t.body,je.maxBodyLength)}:{}})}function Qr(n,e,t,o){let r=Ga(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:rn(o,je.maxBodyLength)})}function Ga(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:rn(o,512)})}}if(e.length)return e.length===1?e[0]:e}function Vr(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function Zr(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let i="";for(;;){let{done:c,value:l}=await r.read();if(c)break;i+=l;let a=i.split(`
2
2
 
3
- `);i=a.pop()||"";for(let u of a)u.trim()&&(s<o.maxStreamChunks?Gr(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++)}i.trim()&&(s<o.maxStreamChunks&&Gr(e,t,s,i.trim()),s++),Kr(e,t,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,i),Kr(e,t,s)}finally{r.releaseLock()}})()}var za,Fe,ho,pt=w(()=>{"use strict";za=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Fe={maxBodyLength:4096,maxStreamChunks:100},ho=!1});function qr(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([a,u])=>{u&&s.set(a,u)});let i,l=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let a=new AbortController,u=()=>a.abort();t.signal.addEventListener("abort",u),l.addEventListener("abort",u),i=a.signal}else i=l;let c={method:"POST",headers:s,body:JSON.stringify(e),signal:i};return t.httpsProxy&&(c.dispatcher=V(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:on(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:Ba(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),c)}function Ba(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 Zr=w(()=>{ae();pt()});var sn,yo=w(()=>{sn="2.3.2402"});var es={};Xt(es,{getFallbackPromotionStore:()=>Ue,resetFallbackPromotionStore:()=>Ka});function Ue(n){return Re||(Re=new _o,n&&Re.configure(n)),Re}function Ka(){Re&&(Re.clearAll(),Re=null)}var Ga,_o,Re,an=w(()=>{"use strict";ce();Ga=600*1e3,_o=class{promotions=new Map;enabled=!0;ttlMs=Ga;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,i){if(!this.enabled)return;let l=this.getKey(e,t,o),c=`${r},${s}`;this.promotions.set(l,{promotedModel:c,timestamp:Date.now(),ttlMs:i??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),i=this.promotions.get(s);if(!i)return null;if(Date.now()-i.timestamp>=i.ttlMs)return this.promotions.delete(s),null;let[c,...a]=i.promotedModel.split(","),u=a.join(",");if(!j().isAvailable(c,u))return this.promotions.delete(s),null;let g=r.find(y=>y.name.toLowerCase()===c.toLowerCase()),m=g?.models?.find(y=>String(y).toLowerCase()===u.toLowerCase());return!g||!m||g.enabled===!1?(this.promotions.delete(s),null):`${g.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}},Re=null});function Xa(n){try{if(!(0,me.existsSync)(To))return;let e=JSON.parse((0,me.readFileSync)(To,"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 ns(n){try{let e=n.getAllStates();if(e.length===0)return;(0,me.existsSync)(bo)||(0,me.mkdirSync)(bo,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,me.writeFileSync)(To,JSON.stringify(t,null,2),"utf-8")}catch{}}function cn(){if(ts)return;ts=!0;let n=j();Xa(n),Ya=setInterval(()=>ns(n),6e4),process.on("exit",()=>ns(n))}function j(n){return ko||(ko=new ft(n)),ko}var me,Co,os,Qa,Va,ft,bo,To,ts,Ya,ko,ce=w(()=>{"use strict";me=require("fs"),Co=require("path"),os=require("@wengine-ai/claude-code-router-shared"),Qa=120,Va={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},ft=class{states=new Map;config;probeTimer;constructor(e){this.config={...Va,...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);r&&(r.successCount++,!r.rateLimitUntil&&(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)))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(an(),Ur(es));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){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let r=this.getState(e,t);return r?r.status==="open"&&r.rateLimitUntil?!(Date.now()<r.rateLimitUntil):r.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}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 i=this.states.get(s);i?(i.status="open",i.lastFailureTime=Date.now(),i.lastError=r||"rate-limited",i.lastProbeTime=0):(i={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,i));let l=(o??Qa)*1e3;i.rateLimitUntil=Date.now()+l}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)}},bo=(0,Co.join)(os.HOME_DIR,"runtime"),To=(0,Co.join)(bo,"provider-health.json"),ts=!1,Ya=null;ko=null});function mt(n,e,t){let o=l=>{if(t instanceof Headers)return t.get(l);let c=Object.keys(t).find(a=>a.toLowerCase()===l);return c?t[c]:null},r=vo(o,qa),s=vo(o,Za),i=vo(o,ec);(r||s||i)&&je.set(n,{provider:n,remaining:is(r),limit:is(s),reset:tc(i),capturedAt:Date.now()})}function ls(n){return je.get(n)}function ln(){return Array.from(je.values())}function vo(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function is(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function tc(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=nc(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function nc(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]),i=r[2].toLowerCase();if(Number.isFinite(s))switch(i){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 oc(){try{if(!(0,ge.existsSync)(So))return;let n=JSON.parse((0,ge.readFileSync)(So,"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;je.set(t.provider,t)}}catch{}}function as(){try{if(je.size===0)return;(0,ge.existsSync)(xo)||(0,ge.mkdirSync)(xo,{recursive:!0}),(0,ge.writeFileSync)(So,JSON.stringify(Array.from(je.values()),null,2),"utf-8")}catch{}}function He(){rs||(rs=!0,oc(),ss=setInterval(as,6e4),ss.unref?.(),process.on("exit",as))}var ge,Ro,cs,xo,So,je,rs,ss,qa,Za,ec,ze=w(()=>{"use strict";ge=require("fs"),Ro=require("path"),cs=require("@wengine-ai/claude-code-router-shared"),xo=(0,Ro.join)(cs.HOME_DIR,"runtime"),So=(0,Ro.join)(xo,"rate-limit.json"),je=new Map,rs=!1,ss=null,qa=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Za=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],ec=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});async function U(n){let e=await n.text();return rc(e,n.status)}function rc(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 us(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function gt(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function Je(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 i=0;i<8;i++){let{value:l,done:c}=await o.read();if(c||(l&&(s+=r.decode(l,{stream:!0})),gt(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:gt(s)}}async function Be(n){try{let e=await n.text();if(gt(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 Z=w(()=>{"use strict"});var We,wo=w(()=>{"use strict";Z();We=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 i="";typeof s=="string"?i=s:s&&typeof s=="object"&&"text"in s&&(i=s.text),t.push({role:"system",content:i})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(i=>this.normalizeRequestContent(i,r.role)).filter(i=>i!==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){let t=e.headers.get("Content-Type")||"";if(t.includes("application/json")){let o=await Je(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}if(o?.body)e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(o===null){let r=await Be(e);if(r.isSSE)return this.transformResponseOut(r.response);e=r.response}}if(t.includes("application/json")){let o=await U(e);if(o.object==="response"&&o.output){let r=this.convertResponseToChat(o);return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}return o.type==="message"&&Array.isArray(o.content)?new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(t.includes("text/event-stream")){if(!e.body)return e;let[o,r]=e.body.tee(),s=o.getReader(),i="";try{let{value:f,done:_}=await s.read();!_&&f&&(i=new TextDecoder().decode(f))}finally{s.releaseLock()}if(o.cancel().catch(()=>{}),i.includes("message_start")||i.includes("content_block_start")){let f=this.prependToStream(i,r);return new Response(f,{status:e.status,statusText:e.statusText,headers:e.headers})}if(i.includes("response.created")||i.includes("response.output_text.delta")||i.includes("response.in_progress")||i.includes("response.output_item.added")){let f=this.prependToStream(i,r);return new Response(f,{status:e.status,statusText:e.statusText,headers:e.headers})}let a=this.prependToStream(i,r),u=new TextDecoder,d=new TextEncoder,g="",m=!1,y=this,p=new ReadableStream({async start(f){let _=a.getReader(),k=-1,h="",b=T=>(T!==h&&(k++,h=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){m||f.enqueue(d.encode(`data: [DONE]
3
+ `);i=a.pop()||"";for(let u of a)u.trim()&&(s<o.maxStreamChunks?Qr(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++)}i.trim()&&(s<o.maxStreamChunks&&Qr(e,t,s,i.trim()),s++),Vr(e,t,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,i),Vr(e,t,s)}finally{r.releaseLock()}})()}var Wa,je,yo,ft=w(()=>{"use strict";Wa=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),je={maxBodyLength:4096,maxStreamChunks:100},yo=!1});function es(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([a,u])=>{u&&s.set(a,u)});let i,c=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let a=new AbortController,u=()=>a.abort();t.signal.addEventListener("abort",u),c.addEventListener("abort",u),i=a.signal}else i=c;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:i};return t.httpsProxy&&(l.dispatcher=V(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:on(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:Ka(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),l)}function Ka(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 ts=w(()=>{ce();ft()});var sn,_o=w(()=>{sn="2.3.2404"});var ns={};Xt(ns,{getFallbackPromotionStore:()=>He,resetFallbackPromotionStore:()=>Ya});function He(n){return Pe||(Pe=new ko,n&&Pe.configure(n)),Pe}function Ya(){Pe&&(Pe.clearAll(),Pe=null)}var Va,ko,Pe,an=w(()=>{"use strict";le();Va=600*1e3,ko=class{promotions=new Map;enabled=!0;ttlMs=Va;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,i){if(!this.enabled)return;let c=this.getKey(e,t,o),l=`${r},${s}`;this.promotions.set(c,{promotedModel:l,timestamp:Date.now(),ttlMs:i??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),i=this.promotions.get(s);if(!i)return null;if(Date.now()-i.timestamp>=i.ttlMs)return this.promotions.delete(s),null;let[l,...a]=i.promotedModel.split(","),u=a.join(",");if(!j().isAvailable(l,u))return this.promotions.delete(s),null;let m=r.find(y=>y.name.toLowerCase()===l.toLowerCase()),f=m?.models?.find(y=>String(y).toLowerCase()===u.toLowerCase());return!m||!f||m.enabled===!1?(this.promotions.delete(s),null):`${m.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}},Pe=null});function ec(n){try{if(!(0,me.existsSync)(vo))return;let e=JSON.parse((0,me.readFileSync)(vo,"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 rs(n){try{let e=n.getAllStates();if(e.length===0)return;(0,me.existsSync)(To)||(0,me.mkdirSync)(To,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,me.writeFileSync)(vo,JSON.stringify(t,null,2),"utf-8")}catch{}}function cn(){if(os)return;os=!0;let n=j();ec(n),Za=setInterval(()=>rs(n),6e4),process.on("exit",()=>rs(n))}function j(n){return bo||(bo=new mt(n)),bo}var me,Co,ss,Xa,qa,mt,To,vo,os,Za,bo,le=w(()=>{"use strict";me=require("fs"),Co=require("path"),ss=require("@wengine-ai/claude-code-router-shared"),Xa=120,qa={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},mt=class{states=new Map;config;probeTimer;constructor(e){this.config={...qa,...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);r&&(r.successCount++,!r.rateLimitUntil&&(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)))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(an(),Hr(ns));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){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let r=this.getState(e,t);return r?r.status==="open"&&r.rateLimitUntil?!(Date.now()<r.rateLimitUntil):r.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}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 i=this.states.get(s);i?(i.status="open",i.lastFailureTime=Date.now(),i.lastError=r||"rate-limited",i.lastProbeTime=0):(i={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,i));let c=(o??Xa)*1e3;i.rateLimitUntil=Date.now()+c}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)}},To=(0,Co.join)(ss.HOME_DIR,"runtime"),vo=(0,Co.join)(To,"provider-health.json"),os=!1,Za=null;bo=null});function gt(n,e,t){let o=c=>{if(t instanceof Headers)return t.get(c);let l=Object.keys(t).find(a=>a.toLowerCase()===c);return l?t[l]:null},r=xo(o,tc),s=xo(o,nc),i=xo(o,oc);(r||s||i)&&ze.set(n,{provider:n,remaining:cs(r),limit:cs(s),reset:rc(i),capturedAt:Date.now()})}function ds(n){return ze.get(n)}function ln(){return Array.from(ze.values())}function xo(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function cs(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function rc(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=sc(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function sc(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]),i=r[2].toLowerCase();if(Number.isFinite(s))switch(i){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 ic(){try{if(!(0,ge.existsSync)(Ro))return;let n=JSON.parse((0,ge.readFileSync)(Ro,"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;ze.set(t.provider,t)}}catch{}}function ls(){try{if(ze.size===0)return;(0,ge.existsSync)(So)||(0,ge.mkdirSync)(So,{recursive:!0}),(0,ge.writeFileSync)(Ro,JSON.stringify(Array.from(ze.values()),null,2),"utf-8")}catch{}}function Je(){is||(is=!0,ic(),as=setInterval(ls,6e4),as.unref?.(),process.on("exit",ls))}var ge,wo,us,So,Ro,ze,is,as,tc,nc,oc,Be=w(()=>{"use strict";ge=require("fs"),wo=require("path"),us=require("@wengine-ai/claude-code-router-shared"),So=(0,wo.join)(us.HOME_DIR,"runtime"),Ro=(0,wo.join)(So,"rate-limit.json"),ze=new Map,is=!1,as=null,tc=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],nc=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],oc=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});async function U(n){let e=await n.text();return ac(e,n.status)}function ac(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 ps(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function ht(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function We(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 i=0;i<8;i++){let{value:c,done:l}=await o.read();if(l||(c&&(s+=r.decode(c,{stream:!0})),ht(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:ht(s)}}async function Ge(n){try{let e=await n.text();if(ht(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 Z=w(()=>{"use strict"});var Ke,Po=w(()=>{"use strict";Z();Ke=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 i="";typeof s=="string"?i=s:s&&typeof s=="object"&&"text"in s&&(i=s.text),t.push({role:"system",content:i})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(i=>this.normalizeRequestContent(i,r.role)).filter(i=>i!==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){let t=e.headers.get("Content-Type")||"";if(t.includes("application/json")){let o=await We(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}if(o?.body)e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(o===null){let r=await Ge(e);if(r.isSSE)return this.transformResponseOut(r.response);e=r.response}}if(t.includes("application/json")){let o=await U(e);if(o.object==="response"&&o.output){let r=this.convertResponseToChat(o);return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}return o.type==="message"&&Array.isArray(o.content)?new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(t.includes("text/event-stream")){if(!e.body)return e;let[o,r]=e.body.tee(),s=o.getReader(),i="";try{let{value:g,done:_}=await s.read();!_&&g&&(i=new TextDecoder().decode(g))}finally{s.releaseLock()}if(o.cancel().catch(()=>{}),i.includes("message_start")||i.includes("content_block_start")){let g=this.prependToStream(i,r);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}if(i.includes("response.created")||i.includes("response.output_text.delta")||i.includes("response.in_progress")||i.includes("response.output_item.added")){let g=this.prependToStream(i,r);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}let a=this.prependToStream(i,r),u=new TextDecoder,d=new TextEncoder,m="",f=!1,y=this,p=new ReadableStream({async start(g){let _=a.getReader(),k=-1,h="",b=T=>(T!==h&&(k++,h=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){f||g.enqueue(d.encode(`data: [DONE]
4
4
 
5
- `));break}let v=u.decode(x,{stream:!0});g+=v;let S=g.split(/\r?\n/);g=S.pop()||"";for(let C of S)if(C.trim())try{if(C.startsWith("event: "))continue;if(C.startsWith("data: ")){let P=C.slice(5).trim();if(P==="[DONE]"){m=!0,f.enqueue(d.encode(`data: [DONE]
5
+ `));break}let C=u.decode(x,{stream:!0});m+=C;let S=m.split(/\r?\n/);m=S.pop()||"";for(let v of S)if(v.trim())try{if(v.startsWith("event: "))continue;if(v.startsWith("data: ")){let E=v.slice(5).trim();if(E==="[DONE]"){f=!0,g.enqueue(d.encode(`data: [DONE]
6
6
 
7
- `));continue}try{let R=JSON.parse(P);if(R.type==="response.output_text.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:{content:R.delta||""},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
7
+ `));continue}try{let R=JSON.parse(E);if(R.type==="response.output_text.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:{content:R.delta||""},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
8
8
 
9
- `))}else if(R.type==="response.output_item.added"&&R.item?.type==="function_call"){let A={id:R.item.call_id||R.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:b(R.type),delta:{role:"assistant",tool_calls:[{index:0,id:R.item.call_id||R.item.id,function:{name:R.item.name||"",arguments:""},type:"function"}]},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
9
+ `))}else if(R.type==="response.output_item.added"&&R.item?.type==="function_call"){let A={id:R.item.call_id||R.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:b(R.type),delta:{role:"assistant",tool_calls:[{index:0,id:R.item.call_id||R.item.id,function:{name:R.item.name||"",arguments:""},type:"function"}]},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
10
10
 
11
- `))}else if(R.type==="response.output_item.added"&&R.item?.type==="message"){let A=[];(R.item.content||[]).forEach(I=>{I.type==="output_text"&&A.push({type:"text",text:I.text||""})});let O={role:"assistant"};if(A.length===1&&A[0].type==="text"?O.content=A[0].text:A.length>0&&(O.content=A),O.content){let I={id:R.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:O,finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(I)}
11
+ `))}else if(R.type==="response.output_item.added"&&R.item?.type==="message"){let A=[];(R.item.content||[]).forEach(I=>{I.type==="output_text"&&A.push({type:"text",text:I.text||""})});let O={role:"assistant"};if(A.length===1&&A[0].type==="text"?O.content=A[0].text:A.length>0&&(O.content=A),O.content){let I={id:R.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:O,finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(I)}
12
12
 
13
- `))}}else if(R.type==="response.output_text.annotation.added"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex",choices:[{index:b(R.type),delta:{annotations:[{type:"url_citation",url_citation:{url:R.annotation?.url||"",title:R.annotation?.title||"",content:"",start_index:R.annotation?.start_index||0,end_index:R.annotation?.end_index||0}}]},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
13
+ `))}}else if(R.type==="response.output_text.annotation.added"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex",choices:[{index:b(R.type),delta:{annotations:[{type:"url_citation",url_citation:{url:R.annotation?.url||"",title:R.annotation?.title||"",content:"",start_index:R.annotation?.start_index||0,end_index:R.annotation?.end_index||0}}]},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
14
14
 
15
- `))}else if(R.type==="response.function_call_arguments.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:b(R.type),delta:{tool_calls:[{index:0,function:{arguments:R.delta||""}}]},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
15
+ `))}else if(R.type==="response.function_call_arguments.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:b(R.type),delta:{tool_calls:[{index:0,function:{arguments:R.delta||""}}]},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
16
16
 
17
- `))}else if(R.type==="response.completed"){let A=R.response?.output?.some(I=>I.type==="function_call")?"tool_calls":"stop",O={id:R.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:0,delta:{},finish_reason:A}]};f.enqueue(d.encode(`data: ${JSON.stringify(O)}
17
+ `))}else if(R.type==="response.completed"){let A=R.response?.output?.some(I=>I.type==="function_call")?"tool_calls":"stop",O={id:R.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model||"gpt-5-codex-",choices:[{index:0,delta:{},finish_reason:A}]};g.enqueue(d.encode(`data: ${JSON.stringify(O)}
18
18
 
19
- `)),m=!0}else if(R.type==="response.reasoning_summary_text.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:{thinking:{content:R.delta||""}},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
19
+ `)),f=!0}else if(R.type==="response.reasoning_summary_text.delta"){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:b(R.type),delta:{thinking:{content:R.delta||""}},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
20
20
 
21
- `))}else if(R.type==="response.reasoning_summary_part.done"&&R.part){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:k,delta:{thinking:{signature:R.item_id}},finish_reason:null}]};f.enqueue(d.encode(`data: ${JSON.stringify(A)}
21
+ `))}else if(R.type==="response.reasoning_summary_part.done"&&R.part){let A={id:R.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:R.response?.model,choices:[{index:k,delta:{thinking:{signature:R.item_id}},finish_reason:null}]};g.enqueue(d.encode(`data: ${JSON.stringify(A)}
22
22
 
23
- `))}}catch{f.enqueue(d.encode(C+`
24
- `))}}else f.enqueue(d.encode(C+`
25
- `))}catch(P){console.error("Error processing line:",C,P),f.enqueue(d.encode(C+`
26
- `))}}g.trim()&&f.enqueue(d.encode(g+`
27
- `)),m||f.enqueue(d.encode(`data: [DONE]
23
+ `))}}catch{g.enqueue(d.encode(v+`
24
+ `))}}else g.enqueue(d.encode(v+`
25
+ `))}catch(E){console.error("Error processing line:",v,E),g.enqueue(d.encode(v+`
26
+ `))}}m.trim()&&g.enqueue(d.encode(m+`
27
+ `)),f||g.enqueue(d.encode(`data: [DONE]
28
28
 
29
- `))}catch(T){console.error("Stream error:",T),f.error(T)}finally{try{_.releaseLock()}catch(T){console.error("Error releasing reader lock:",T)}f.close()}}});return new Response(p,{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"){console.log(e);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(),i=r.getReader(),l="";try{let{value:g,done:m}=await i.read();!m&&g&&(l=new TextDecoder().decode(g))}finally{i.releaseLock()}r.cancel().catch(()=>{});let c=l.includes("message_start")||l.includes("content_block_start"),a=l.includes("chat.completion.chunk");if(l.includes("response.created")||l.includes("response.output_text.delta")||l.includes("response.in_progress")||l.includes("response.output_item.added"))return new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}});if(a&&!c){let g=this.convertOpenAIChatStreamToResponsesAPI(s,t);return new Response(g,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let d=this.convertAnthropicStreamToResponsesAPI(s,t);return new Response(d,{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}}prependToStream(e,t){let r=new TextEncoder().encode(e),s=t.getReader(),i=!1;return new ReadableStream({async pull(l){i||(i=!0,l.enqueue(r));try{let{done:c,value:a}=await s.read();c?l.close():l.enqueue(a)}catch(c){l.error(c)}},cancel(){s.cancel().catch(()=>{})}})}convertOpenAIChatStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",i=`resp_${Date.now()}`,l=0,c=!1,a=!1,u="",d=-1,g=[],m=(p,f)=>r.encode(`event: ${p}
30
- data: ${JSON.stringify(f)}
29
+ `))}catch(T){console.error("Stream error:",T),g.error(T)}finally{try{_.releaseLock()}catch(T){console.error("Error releasing reader lock:",T)}g.close()}}});return new Response(p,{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"){console.log(e);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(),i=r.getReader(),c="";try{let{value:m,done:f}=await i.read();!f&&m&&(c=new TextDecoder().decode(m))}finally{i.releaseLock()}r.cancel().catch(()=>{});let l=c.includes("message_start")||c.includes("content_block_start"),a=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(a&&!l){let m=this.convertOpenAIChatStreamToResponsesAPI(s,t);return new Response(m,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let d=this.convertAnthropicStreamToResponsesAPI(s,t);return new Response(d,{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}}prependToStream(e,t){let r=new TextEncoder().encode(e),s=t.getReader(),i=!1;return new ReadableStream({async pull(c){i||(i=!0,c.enqueue(r));try{let{done:l,value:a}=await s.read();l?c.close():c.enqueue(a)}catch(l){c.error(l)}},cancel(){s.cancel().catch(()=>{})}})}convertOpenAIChatStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",i=`resp_${Date.now()}`,c=0,l=!1,a=!1,u="",d=-1,m=[],f=(p,g)=>r.encode(`event: ${p}
30
+ data: ${JSON.stringify(g)}
31
31
 
32
- `),y=(p,f=[])=>({id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:p,model:s,output:f,usage:this.buildResponsesUsage()});return new ReadableStream({async start(p){try{let f=e.getReader(),_="",k=!1,h=b=>{if(!k){k=!0;for(let T of g)if(T.type==="function_call"){let x=g.indexOf(T);p.enqueue(m("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",p.enqueue(m("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of g)if(T.type==="message"){let x=g.indexOf(T);T.status="completed",p.enqueue(m("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}p.enqueue(m("response.completed",{type:"response.completed",response:{id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:b?.model||s,output:g.slice(),usage:b?.usage?{...this.buildResponsesUsage(b.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:b,value:T}=await f.read();if(b)break;_+=o.decode(T,{stream:!0});let x=_.split(`
33
- `);_=x.pop()||"";for(let v of x){let S=v.trim();if(!S||S.startsWith("event:")||!S.startsWith("data:"))continue;let C=S.slice(5).trim();if(C==="[DONE]"){h({}),p.enqueue(r.encode(`data: [DONE]
32
+ `),y=(p,g=[])=>({id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:p,model:s,output:g,usage:this.buildResponsesUsage()});return new ReadableStream({async start(p){try{let g=e.getReader(),_="",k=!1,h=b=>{if(!k){k=!0;for(let T of m)if(T.type==="function_call"){let x=m.indexOf(T);p.enqueue(f("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",p.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of m)if(T.type==="message"){let x=m.indexOf(T);T.status="completed",p.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}p.enqueue(f("response.completed",{type:"response.completed",response:{id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:b?.model||s,output:m.slice(),usage:b?.usage?{...this.buildResponsesUsage(b.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:b,value:T}=await g.read();if(b)break;_+=o.decode(T,{stream:!0});let x=_.split(`
33
+ `);_=x.pop()||"";for(let C of x){let S=C.trim();if(!S||S.startsWith("event:")||!S.startsWith("data:"))continue;let v=S.slice(5).trim();if(v==="[DONE]"){h({}),p.enqueue(r.encode(`data: [DONE]
34
34
 
35
- `));continue}let P;try{P=JSON.parse(C)}catch{continue}c||(c=!0,p.enqueue(m("response.created",{type:"response.created",response:y("in_progress")})),p.enqueue(m("response.in_progress",{type:"response.in_progress",response:y("in_progress")})));let R=P.choices?.[0];if(!R)continue;let A=R.delta;if(A?.content){if(!a){a=!0;let O=l++,I={id:`${i}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};g.push(I),p.enqueue(m("response.output_item.added",{type:"response.output_item.added",output_index:O,item:I}))}p.enqueue(m("response.output_text.delta",{type:"response.output_text.delta",item_id:`${i}_msg`,output_index:l-1,content_index:0,delta:A.content}))}if(Array.isArray(A?.tool_calls))for(let O of A.tool_calls){if(O.id){u=O.id,d=l++;let I={id:O.id,type:"function_call",status:"in_progress",call_id:O.id,name:O.function?.name||"",arguments:""};g.push(I),p.enqueue(m("response.output_item.added",{type:"response.output_item.added",output_index:d,item:I}))}if(O.function?.arguments){p.enqueue(m("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u,output_index:d,delta:O.function.arguments}));let I=g.find(L=>L.call_id===u);I&&(I.arguments+=O.function.arguments)}}R.finish_reason&&h(P)}}k||h({}),p.close()}catch(f){p.error(f)}}})}convertAnthropicStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",i=`resp_${Date.now()}`,l="",c="",a=-1,u="",d="",g="",m=-1,y="",p="",f=-1,_=0,k=!1,h=!1,b=!1,T=!1,x=null,v=[],S=(I,L)=>r.encode(`event: ${I}
35
+ `));continue}let E;try{E=JSON.parse(v)}catch{continue}l||(l=!0,p.enqueue(f("response.created",{type:"response.created",response:y("in_progress")})),p.enqueue(f("response.in_progress",{type:"response.in_progress",response:y("in_progress")})));let R=E.choices?.[0];if(!R)continue;let A=R.delta;if(A?.content){if(!a){a=!0;let O=c++,I={id:`${i}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};m.push(I),p.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:O,item:I}))}p.enqueue(f("response.output_text.delta",{type:"response.output_text.delta",item_id:`${i}_msg`,output_index:c-1,content_index:0,delta:A.content}))}if(Array.isArray(A?.tool_calls))for(let O of A.tool_calls){if(O.id){u=O.id,d=c++;let I={id:O.id,type:"function_call",status:"in_progress",call_id:O.id,name:O.function?.name||"",arguments:""};m.push(I),p.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:d,item:I}))}if(O.function?.arguments){p.enqueue(f("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u,output_index:d,delta:O.function.arguments}));let I=m.find(L=>L.call_id===u);I&&(I.arguments+=O.function.arguments)}}R.finish_reason&&h(E)}}k||h({}),p.close()}catch(g){p.error(g)}}})}convertAnthropicStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",i=`resp_${Date.now()}`,c="",l="",a=-1,u="",d="",m="",f=-1,y="",p="",g=-1,_=0,k=!1,h=!1,b=!1,T=!1,x=null,C=[],S=(I,L)=>r.encode(`event: ${I}
36
36
  data: ${JSON.stringify(L)}
37
37
 
38
- `),C=(I,L=[])=>({id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:I,model:s,output:L,usage:this.buildResponsesUsage()}),P=()=>{k||(k=!0,O.enqueue(S("response.created",{type:"response.created",response:C("in_progress")})),O.enqueue(S("response.in_progress",{type:"response.in_progress",response:C("in_progress")})))},R=(I,L)=>{O.enqueue(S("response.output_item.done",{type:"response.output_item.done",output_index:I,item:{...L,status:"completed"}}))},A=I=>{if(!T){if(T=!0,h){let L=v.find(F=>F.type==="message");L&&(L.content=[{type:"output_text",text:l}],L.status="completed")}for(let L of v)L.type==="function_call"&&(L.status="completed");return S("response.completed",{type:"response.completed",response:{id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:v,usage:I?{...this.buildResponsesUsage(I)}:this.buildResponsesUsage()}})}},O;return new ReadableStream({async start(I){O=I;try{let L=e.getReader(),F="";for(;;){let{done:N,value:D}=await L.read();if(N)break;F+=o.decode(D,{stream:!0});let Q=F.split(`
39
- `);F=Q.pop()||"";for(let xe of Q){let z=xe.trim();if(!z||z.startsWith("event:")||!z.startsWith("data:"))continue;let oe=z.slice(5).trim();if(oe==="[DONE]")continue;let B;try{B=JSON.parse(oe)}catch{continue}if(B.type==="message_start"&&(i=B.message?.id||i,P()),B.type==="content_block_start"){let M=B.content_block;if(x=M?.type||null,M?.type==="tool_use"){u=M.id||"",d=M.name||"",g="",m=_++;let G={id:u,type:"function_call",status:"in_progress",call_id:u,name:d,arguments:""};v.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:m,item:G}))}if(M?.type==="thinking"&&(y=M.thinking||"",!b)){b=!0,f=_++,p=`rs_${i}`;let G={id:p,type:"reasoning",status:"in_progress",summary:[]};v.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:f,item:G}))}if(M?.type==="text"&&(l=M?.text||"",!h)){h=!0,a=_++,c=`${i}_msg`;let G={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};v.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:a,item:G}))}}if(B.type==="content_block_delta"){let M=B.delta;if(M?.type==="text_delta"){if(!h){h=!0,a=_++,c=`${i}_msg`;let G={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};v.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:a,item:G}))}l+=M.text||"",O.enqueue(S("response.output_text.delta",{type:"response.output_text.delta",item_id:c,output_index:a,content_index:0,delta:M.text||""}))}M?.type==="thinking_delta"&&(y+=M.thinking||"",O.enqueue(S("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:p||`rs_${i}`,output_index:f>=0?f:0,summary_index:0,delta:M.thinking||""}))),M?.type==="input_json_delta"&&(g+=M.partial_json||"",O.enqueue(S("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u||"call_0",output_index:m>=0?m:0,delta:M.partial_json||""})))}if(B.type==="content_block_stop"){if(x==="tool_use"&&u){O.enqueue(S("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:u,output_index:m,arguments:g}));let M=v.find(G=>G.call_id===u);M&&(M.arguments=g,M.status="completed"),M&&R(m,M)}if(x==="text"&&h){O.enqueue(S("response.output_text.done",{type:"response.output_text.done",item_id:c,output_index:a,content_index:0,text:l}));let M=v.find(G=>G.type==="message");M&&(M.content=[{type:"output_text",text:l}],R(a,M))}if(x==="thinking"&&b){let M=v.find(G=>G.type==="reasoning");M&&(M.summary=[{type:"summary_text",text:y}],R(f,M))}x=null}if(B.type==="message_delta"){let M=A(B.usage);M&&O.enqueue(M)}if(B.type==="message_stop"){let M=A();M&&O.enqueue(M),O.enqueue(r.encode(`data: [DONE]
38
+ `),v=(I,L=[])=>({id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:I,model:s,output:L,usage:this.buildResponsesUsage()}),E=()=>{k||(k=!0,O.enqueue(S("response.created",{type:"response.created",response:v("in_progress")})),O.enqueue(S("response.in_progress",{type:"response.in_progress",response:v("in_progress")})))},R=(I,L)=>{O.enqueue(S("response.output_item.done",{type:"response.output_item.done",output_index:I,item:{...L,status:"completed"}}))},A=I=>{if(!T){if(T=!0,h){let L=C.find(F=>F.type==="message");L&&(L.content=[{type:"output_text",text:c}],L.status="completed")}for(let L of C)L.type==="function_call"&&(L.status="completed");return S("response.completed",{type:"response.completed",response:{id:i,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:C,usage:I?{...this.buildResponsesUsage(I)}:this.buildResponsesUsage()}})}},O;return new ReadableStream({async start(I){O=I;try{let L=e.getReader(),F="";for(;;){let{done:N,value:D}=await L.read();if(N)break;F+=o.decode(D,{stream:!0});let Q=F.split(`
39
+ `);F=Q.pop()||"";for(let Re of Q){let z=Re.trim();if(!z||z.startsWith("event:")||!z.startsWith("data:"))continue;let re=z.slice(5).trim();if(re==="[DONE]")continue;let B;try{B=JSON.parse(re)}catch{continue}if(B.type==="message_start"&&(i=B.message?.id||i,E()),B.type==="content_block_start"){let M=B.content_block;if(x=M?.type||null,M?.type==="tool_use"){u=M.id||"",d=M.name||"",m="",f=_++;let G={id:u,type:"function_call",status:"in_progress",call_id:u,name:d,arguments:""};C.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:f,item:G}))}if(M?.type==="thinking"&&(y=M.thinking||"",!b)){b=!0,g=_++,p=`rs_${i}`;let G={id:p,type:"reasoning",status:"in_progress",summary:[]};C.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:g,item:G}))}if(M?.type==="text"&&(c=M?.text||"",!h)){h=!0,a=_++,l=`${i}_msg`;let G={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};C.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:a,item:G}))}}if(B.type==="content_block_delta"){let M=B.delta;if(M?.type==="text_delta"){if(!h){h=!0,a=_++,l=`${i}_msg`;let G={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};C.push(G),O.enqueue(S("response.output_item.added",{type:"response.output_item.added",output_index:a,item:G}))}c+=M.text||"",O.enqueue(S("response.output_text.delta",{type:"response.output_text.delta",item_id:l,output_index:a,content_index:0,delta:M.text||""}))}M?.type==="thinking_delta"&&(y+=M.thinking||"",O.enqueue(S("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:p||`rs_${i}`,output_index:g>=0?g:0,summary_index:0,delta:M.thinking||""}))),M?.type==="input_json_delta"&&(m+=M.partial_json||"",O.enqueue(S("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u||"call_0",output_index:f>=0?f:0,delta:M.partial_json||""})))}if(B.type==="content_block_stop"){if(x==="tool_use"&&u){O.enqueue(S("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:u,output_index:f,arguments:m}));let M=C.find(G=>G.call_id===u);M&&(M.arguments=m,M.status="completed"),M&&R(f,M)}if(x==="text"&&h){O.enqueue(S("response.output_text.done",{type:"response.output_text.done",item_id:l,output_index:a,content_index:0,text:c}));let M=C.find(G=>G.type==="message");M&&(M.content=[{type:"output_text",text:c}],R(a,M))}if(x==="thinking"&&b){let M=C.find(G=>G.type==="reasoning");M&&(M.summary=[{type:"summary_text",text:y}],R(g,M))}x=null}if(B.type==="message_delta"){let M=A(B.usage);M&&O.enqueue(M)}if(B.type==="message_stop"){let M=A();M&&O.enqueue(M),O.enqueue(r.encode(`data: [DONE]
40
40
 
41
- `))}}}P();let J=A();J&&O.enqueue(J),F="",O.close()}catch(L){O.error(L)}}})}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(a=>a.type==="message"),o=e.output?.find(a=>a.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(a=>({type:"url_citation",url_citation:{url:a.url||"",title:a.title||"",content:"",start_index:a.start_index||0,end_index:a.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,i=null,l=null;if(t&&t.reasoning&&(l={content:t.reasoning}),t&&t.content){let a=[],u=[];if(t.content.forEach(d=>{if(d.type==="output_text")a.push(d.text||"");else if(d.type==="output_image"){let g=this.buildImageContent({url:d.image_url,mime_type:d.mime_type});g&&u.push(g)}else if(d.type==="output_image_base64"){let g=this.buildImageContent({b64_json:d.image_base64,mime_type:d.mime_type});g&&u.push(g)}}),u.length>0){let d=[];a.length>0&&d.push({type:"text",text:a.join("")}),d.push(...u),s=d}else s=a.join("")}return o&&(i=[{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:i,thinking:l,annotations:r},logprobs:null,finish_reason:i?"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 Po,ee,un=w(()=>{"use strict";Po=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 Po(100)});function dn(n,e){n&&Ge.set(n,{...e,provider:n,capturedAt:Date.now()})}function ht(n){let e=Ge.get(n);return e?{...e}:void 0}function pn(){return Array.from(Ge.values()).map(n=>({...n}))}function sc(){try{if(!(0,he.existsSync)(Oo))return;let n=JSON.parse((0,he.readFileSync)(Oo,"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;Ge.set(t.provider,t)}}catch{}}function fs(){try{if(Ge.size===0)return;(0,he.existsSync)(Eo)||(0,he.mkdirSync)(Eo,{recursive:!0}),(0,he.writeFileSync)(Oo,JSON.stringify(Array.from(Ge.values()),null,2),"utf-8")}catch{}}function Ke(){ds||(ds=!0,sc(),ps=setInterval(fs,6e4),ps.unref?.(),process.on("exit",fs))}var he,Ao,ms,Eo,Oo,Ge,ds,ps,Qe=w(()=>{"use strict";he=require("fs"),Ao=require("path"),ms=require("@wengine-ai/claude-code-router-shared"),Eo=(0,Ao.join)(ms.HOME_DIR,"runtime"),Oo=(0,Ao.join)(Eo,"quota-store.json"),Ge=new Map,ds=!1,ps=null});function we(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!ic.test(e)))return e}function Ve(n){if(!n)return;if(typeof n=="object")return we(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=we(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return we(e.slice(o+t.length))}var ic,yt=w(()=>{"use strict";ic=/^[A-Za-z0-9_-]+$/});function cc(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 lc(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 _t(n,e=!0){return{clientType:n,usageScope:"request",supportsExplicitExtendedContext:e}}function hs(n,e,t=!0){let o=Ve(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function Mo(n){return typeof n=="string"&&ac.includes(n)}function Pe(n){if(Mo(n?.clientType))return n.clientType;let e=lc(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=cc(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";let i=t["x-anthropic-billing-header"];if(typeof i=="string"&&i.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 l=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(l)?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(l).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function $o(n){return Io[n]}function yc(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||(0,gs.randomUUID)();return n.__ccrRequestScopeId=e,e}function _e(n,e={}){let t=Pe(n),o=$o(t).createContext(n,e),r=o.stableSessionId||yc(n),s=o.usageScope==="session"?"session":"request";return n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function ys(){}var gs,ac,uc,dc,pc,fc,mc,gc,hc,Io,Ye=w(()=>{"use strict";gs=require("node:crypto");yt();ac=["claude-code","pi","qwen-code","opencode","codex","api","unknown"];uc={type:"claude-code",createContext(n){return hs(n,"claude-code")}},dc={type:"pi",createContext(){return _t("pi",!1)}},pc={type:"qwen-code",createContext(n){return hs(n,"qwen-code")}},fc={type:"opencode",createContext(){return _t("opencode")}},mc={type:"codex",createContext(){return _t("codex")}},gc={type:"api",createContext(){return _t("api")}},hc={type:"unknown",createContext(){return _t("unknown")}},Io={"claude-code":uc,pi:dc,"qwen-code":pc,opencode:fc,codex:mc,api:gc,unknown:hc}});function re(n,e,t,o){let r=No(e,t);if(r.code==="model_unhealthy"){let l=q(e,t,!0);if(l)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),l}let s=n.sessionId||n.clientContext?.stableSessionId,i=Cs[r.code]||502;throw new pe(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:i})}function hn(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 Tt(n){let e=hn(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 kc(n,e){if(!e||!n)return null;let t=hn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=Tt(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let i=hn(r);if(i&&t.includes(i))return s}return null}function bc(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function fn(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 kt(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 No(n,e){let t=fn(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(a=>a.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 i=s.models?.find(a=>String(a).toLowerCase()===r.toLowerCase());if(!i)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(i)))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let c=ht(s.name);if(c){let a=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(a||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function q(n,e,t,o,r,s,i){let l=fn(n);if(!l)return i?null:n;let{providerName:c,routeModel:a}=l,u=kt(e,c,a);if(!u){if(r===!0&&o&&!t&&s!==!1){let g=Ue(),m=g.getPromotion(c,a,o,e);if(m){let y=fn(m);if(y){let p=kt(e,y.providerName,y.routeModel);if(p)return`${p.provider.name},${p.model}`}g.clear(c,a,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let g=Ue(),m=g.getPromotion(c,a,o,e);if(m){let y=fn(m);if(y){let p=kt(e,y.providerName,y.routeModel);if(p)return`${p.provider.name},${p.model}`}g.clear(c,a,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model))return null;let d=ht(u.provider.name);if(d){let g=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,m=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(g||m)return null}return`${u.provider.name},${u.model}`}function te(n,e,t,o,r,s){let i=j(),l=[t?.[n],o?.[n]];for(let c of l)if(!(!Array.isArray(c)||c.length===0))for(let a of c){let u=q(a,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Tc(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 Lo(n){let e=hn(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 vs(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,bc(e))}function xs(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Cc(n,e,t,o,r,s,i,l,c,a,u,d){let g=n.clientContext,m=g?.longContextThreshold??t.longContextThreshold??c??6e4,y=vs(e,r,g),p=n.modelFamily,f=xs(g,t,a),_=g?.supportsExplicitExtendedContext!==!1&&s===!0;if((_||y>f)&&t.extendedContext){let b=q(t.extendedContext,o,!1,"extendedContext",l,d,u);if(b)return n.log.info(`Family: using extended context model (1M+), tokens: ${y}, estimated: ${e}, explicit: ${_}, threshold: ${f}`),{model:b,scenarioType:"extendedContext",isFallback:!1};let T=l?te("extendedContext",o,t.fallback,i,p,u):null;if(T)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${y}, estimated: ${e}, explicit: ${_}, threshold: ${f}`),{model:T,scenarioType:"extendedContext",isFallback:!0};if(u){let x=re(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(y>m&&(t.longContext||t.fallback?.longContext?.length||i?.longContext?.length)){let b=t.longContext?q(t.longContext,o,!1,"longContext",l,d,u):null;if(b)return n.log.info(`Family: using long context model, tokens: ${y}, estimated: ${e}`),{model:b,scenarioType:"longContext",isFallback:!1};let T=l?te("longContext",o,t.fallback,i,p,u):null;if(T)return n.log.info(`Family: using long context fallback model, tokens: ${y}, estimated: ${e}`),{model:T,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=re(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(b=>b.type?.startsWith("web_search"))&&t.webSearch){let b=q(t.webSearch,o,!1,"webSearch",l,d,u);if(b)return{model:b,scenarioType:"webSearch",isFallback:!1};let T=l?te("webSearch",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using webSearch fallback model"),{model:T,scenarioType:"webSearch",isFallback:!0};if(u){let x=re(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 b=q(t.think,o,!1,"think",l,d,u);if(b)return{model:b,scenarioType:"think",isFallback:!1};let T=l?te("think",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using think fallback model"),{model:T,scenarioType:"think",isFallback:!0};if(u){let x=re(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 b=q(t.default,o,!1,"default",l,d,u);if(b)return{model:b,scenarioType:"default",isFallback:!1};let T=l?te("default",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using default fallback model"),{model:T,scenarioType:"default",isFallback:!0};if(u){let x=re(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 wc(){if(Ee.size<=_s)return;let n=[...Ee.keys()].slice(0,Ee.size-_s);for(let e of n)Ee.delete(e)}function Pc(){if(Xe.size<=ks)return;let n=[...Xe].slice(0,Xe.size-ks);for(let e of n)Xe.delete(e)}var Ts,mn,yn,gn,qe,Cs,pe,ye,bt,_c,vc,Ct,Ee,_s,Xe,ks,xc,Sc,Rc,bs,Do,Ze=w(()=>{"use strict";Ts=require("tiktoken");un();mn=require("fs/promises"),yn=require("fs/promises"),gn=require("path"),qe=require("@wengine-ai/claude-code-router-shared");ce();Qe();an();yt();Ye();Cs={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},pe=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||Cs[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ye=(0,Ts.get_encoding)("cl100k_base"),bt=(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=>{s.type==="text"?o+=ye.encode(s.text).length:s.type==="tool_use"?o+=ye.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(o+=ye.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).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},_c=async(n,e)=>{if(n.sessionId){let t=await Do(n.sessionId);if(t){let o=(0,gn.join)(qe.HOME_DIR,t,"config.json"),r=(0,gn.join)(qe.HOME_DIR,t,`${n.sessionId}.json`);try{let s=JSON.parse(await(0,mn.readFile)(r,"utf8"));if(s&&s.Router&&Object.keys(s.Router).length>0)return s.Router}catch{}try{let s=JSON.parse(await(0,mn.readFile)(o,"utf8"));if(s&&s.Router&&Object.keys(s.Router).length>0)return s.Router}catch(s){if(s&&s.code!=="ENOENT"){let i=n.sessionId||n.clientContext?.stableSessionId;throw new pe(`Project routing error: project config.json is malformed or unreadable in project "${t}". ${s.message}. Session: "${i||"unknown"}".`,{sessionId:i,configuredTarget:o,code:"project_config_error",statusCode:500})}}}}};vc=async(n,e,t,o,r,s)=>{let i=t.get("providers")||[],l=r||t.get("Router"),c=l?.enableFallback===!0,a=c?l?.fallback:void 0,u=c&&!s?a||t.get("fallback"):a,d=!s,g=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let v=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);v&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${v[1]}</CCR-SUBAGENT-MODEL>`,""),g=v[1])}let{family:m,extended:y,isCcrAlias:p}=Tt(n.body.model),f=l?.families?.[m||""];if(f&&l?.enableFamilyRouting){n.log.info(`Using model family routing for: ${m}${y?" (1M)":""}`),n.modelFamily=m,n.familyFallback=f.fallback;let v=Cc(n,e,f,i,o,y,u,c,l?.longContextThreshold,l?.extendedContextThreshold,s,d);if(v)return{model:v.model,scenarioType:v.scenarioType}}if(n.body.model.includes(",")&&!s){let v=q(n.body.model,i,!1,"default",c,d,s);if(v)return{model:v,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let S=c?te("default",i,void 0,u,void 0,s):null;if(S)return n.log.info(`Using fallback for explicit model: ${S}`),{model:S,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let _=p&&!l?.enableFamilyRouting?null:kc(n.body.model,l?.models);if(_){let v=q(_,i,!1,"modelMapping",c,d,s);if(v)return n.log.info(`Using mapped model for ${n.body.model}: ${_}`),{model:v,scenarioType:"modelMapping"};let S=c?te("modelMapping",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"modelMapping"};if(s){let C=re(n,_,i,"modelMapping");if(C)return{model:C,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${_} unavailable (fail pool), skipping`)}let k=n.clientContext,h=vs(e,o,k),b=xs(k,void 0,l?.extendedContextThreshold);if(h>b&&l?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${h}, estimated: ${e}, threshold: ${b}`);let v=q(l.extendedContext,i,!1,"extendedContext",c,d,s);if(v)return{model:v,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${l.extendedContext} unavailable (fail pool), trying fallback`);let S=c?te("extendedContext",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"extendedContext"};if(s){let C=re(n,l.extendedContext,i,"extendedContext");if(C)return{model:C,scenarioType:"extendedContext"}}}let T=k?.longContextThreshold??l?.longContextThreshold??6e4;if(h>T&&l?.longContext){n.log.info(`Using long context model due to token count: ${h}, estimated: ${e}, threshold: ${T}`);let v=q(l.longContext,i,!1,"longContext",c,d,s);if(v)return{model:v,scenarioType:"longContext"};n.log.warn(`Long context model ${l.longContext} unavailable (fail pool), trying fallback`);let S=c?te("longContext",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"longContext"};if(s){let C=re(n,l.longContext,i,"longContext");if(C)return{model:C,scenarioType:"longContext"}}}if(!s&&g)return{model:g,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&l?.background){n.log.info(`Using background model for ${n.body.model}`);let v=q(l.background,i,!1,"background",c,d,s);if(v)return{model:v,scenarioType:"background"};let S=c?te("background",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"background"};if(s){let C=re(n,l.background,i,"background");if(C)return{model:C,scenarioType:"background"}}n.log.warn(`Background model ${l.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(v=>v.type?.startsWith("web_search"))&&l?.webSearch){let v=q(l.webSearch,i,!1,"webSearch",c,d,s);if(v)return{model:v,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${l.webSearch} unavailable (fail pool), trying fallback`);let S=c?te("webSearch",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"webSearch"};if(s){let C=re(n,l.webSearch,i,"webSearch");if(C)return{model:C,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&l?.think){n.log.info(`Using think model for ${n.body.thinking}`);let v=q(l.think,i,!1,"think",c,d,s);if(v)return{model:v,scenarioType:"think"};n.log.warn(`Think model ${l.think} unavailable (fail pool), trying fallback`);let S=c?te("think",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"think"};if(s){let C=re(n,l.think,i,"think");if(C)return{model:C,scenarioType:"think"}}}if(l?.default){let v=q(l.default,i,!1,"default",c,d,s);if(v)return{model:v,scenarioType:"default"};n.log.warn(`Default model ${l.default} unavailable (fail pool), trying fallback`);let S=c?te("default",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"default"};let C=q(l.default,i,!0,"default",c,d,s);if(C)return n.log.warn(`No fallback available; retrying default model ${l.default} despite fail-pool state (strict=${s})`),{model:C,scenarioType:"default"}}if(s){let v=re(n,l?.default||n.body.model,i,"default");if(v)return{model:v,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Ct=async(n,e,t)=>{let{configService:o,event:r}=t;!n.originalModel&&n.body.model&&(n.originalModel=n.body.model),_e(n,o.getAll());let s=await _c(n,o),i=s||o.get("Router"),l=i?.enableFallback===!0,c=o.get("providers")||[],a=!!s;n.enableFallback=l,n.strictProjectRouting=a,n.fallbackConfig=a?i?.fallback:i?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??ee.get(n.usageCacheKey):void 0,{messages:d,system:g=[],tools:m}=n.body,y=o.get("REWRITE_SYSTEM_PROMPT");if(y&&g.length>1&&g[1]?.text?.includes("<env>")){let p=await(0,mn.readFile)(y,"utf-8");g[1].text=`${p}<env>${g[1].text.split("<env>").pop()}`}try{let[p,f]=n.body.model.split(","),_=t.tokenizerService?.getTokenizerConfigForModel(p,f),k;t.tokenizerService?k=(await t.tokenizerService.countTokens({messages:d,system:g,tools:m},_,p)).tokenCount:k=bt(d,g,m),n.tokenCount=k;let h,b=a?void 0:o.get("CUSTOM_ROUTER_PATH");if(b)try{h=await require(b)(n,o.getAll(),{event:r})}catch(S){n.log.error(`failed to load custom router: ${S.message}`)}if(h)n.scenarioType="default";else{let S=await vc(n,k,o,u,s,!!s);h=S.model,n.scenarioType=S.scenarioType}let{family:T}=Tt(n.originalModel||n.body.model),x=i?.enableFamilyRouting&&T?i.families?.[T]:void 0,v=[x?.image,i?.image].filter((S,C,P)=>!!S&&P.indexOf(S)===C);if(v.length>0&&Tc(n)&&!Lo(h))if(v.includes(h))n.scenarioType="image";else{let S=v.map(C=>q(C,c,!1,"image",l,!a,a)).find(C=>!!C);if(S)n.log.info(`Using image model fallback for ${h}`),h=S,n.scenarioType="image";else{let C=l?te("image",c,x?.fallback,n.fallbackConfig,T||void 0,a):null;if(C)n.log.info(`Using image fallback model: ${C}`),h=C,n.scenarioType="image";else if(a){let P=re(n,v[0],c,"image");P&&(h=P,n.scenarioType="image")}else n.log.warn(`Image models ${v.join(", ")} unavailable (fail pool), keeping ${h}`),n.scenarioType="image"}}typeof h=="string"&&h.trim()?n.body.model=h:(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(p){if(p instanceof pe)throw p;if(n.log.error(`Error in router middleware: ${p.message}`),a){let f=n.sessionId||n.clientContext?.stableSessionId;throw new pe(`Project routing error: router failure in project mode. ${p.message}. Session: "${f||"unknown"}".`,{sessionId:f,configuredTarget:i?.default,code:"project_router_failure",statusCode:502})}n.body.model=i?.default,n.scenarioType="default"}},Ee=new Map,_s=1e3,Xe=new Set,ks=1e3,xc=3,Sc=50,Rc=n=>new Promise(e=>setTimeout(e,n));bs=async n=>{let e=await(0,yn.opendir)(qe.CLAUDE_PROJECTS_DIR),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let i=(0,gn.join)(qe.CLAUDE_PROJECTS_DIR,s,`${n}.jsonl`);try{return(await(0,yn.stat)(i)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Do=async n=>{let e=we(n);if(!e)return null;if(Ee.has(e))return Ee.get(e)||null;try{let t=await bs(e);if(!t&&!Xe.has(e)){Xe.add(e),Pc();for(let o=0;o<xc&&!t;o++)await Rc(Sc),t=await bs(e)}return t?(Ee.set(e,t),wc(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function vt(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(`
41
+ `))}}}E();let J=A();J&&O.enqueue(J),F="",O.close()}catch(L){O.error(L)}}})}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(a=>a.type==="message"),o=e.output?.find(a=>a.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(a=>({type:"url_citation",url_citation:{url:a.url||"",title:a.title||"",content:"",start_index:a.start_index||0,end_index:a.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,i=null,c=null;if(t&&t.reasoning&&(c={content:t.reasoning}),t&&t.content){let a=[],u=[];if(t.content.forEach(d=>{if(d.type==="output_text")a.push(d.text||"");else if(d.type==="output_image"){let m=this.buildImageContent({url:d.image_url,mime_type:d.mime_type});m&&u.push(m)}else if(d.type==="output_image_base64"){let m=this.buildImageContent({b64_json:d.image_base64,mime_type:d.mime_type});m&&u.push(m)}}),u.length>0){let d=[];a.length>0&&d.push({type:"text",text:a.join("")}),d.push(...u),s=d}else s=a.join("")}return o&&(i=[{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:i,thinking:c,annotations:r},logprobs:null,finish_reason:i?"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 Eo,ee,un=w(()=>{"use strict";Eo=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 Eo(100)});function dn(n,e){n&&Qe.set(n,{...e,provider:n,capturedAt:Date.now()})}function yt(n){let e=Qe.get(n);return e?{...e}:void 0}function pn(){return Array.from(Qe.values()).map(n=>({...n}))}function cc(){try{if(!(0,he.existsSync)(Ao))return;let n=JSON.parse((0,he.readFileSync)(Ao,"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;Qe.set(t.provider,t)}}catch{}}function gs(){try{if(Qe.size===0)return;(0,he.existsSync)(Oo)||(0,he.mkdirSync)(Oo,{recursive:!0}),(0,he.writeFileSync)(Ao,JSON.stringify(Array.from(Qe.values()),null,2),"utf-8")}catch{}}function Ve(){fs||(fs=!0,cc(),ms=setInterval(gs,6e4),ms.unref?.(),process.on("exit",gs))}var he,Io,hs,Oo,Ao,Qe,fs,ms,Ye=w(()=>{"use strict";he=require("fs"),Io=require("path"),hs=require("@wengine-ai/claude-code-router-shared"),Oo=(0,Io.join)(hs.HOME_DIR,"runtime"),Ao=(0,Io.join)(Oo,"quota-store.json"),Qe=new Map,fs=!1,ms=null});function Ee(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!lc.test(e)))return e}function _e(n){if(!n)return;if(typeof n=="object")return Ee(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=Ee(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return Ee(e.slice(o+t.length))}var lc,Xe=w(()=>{"use strict";lc=/^[A-Za-z0-9_-]+$/});function dc(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 pc(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 _s(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 fc(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 ks(n,e,t=!0){let o=_e(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function $o(n){return typeof n=="string"&&uc.includes(n)}function Oe(n){if($o(n?.clientType))return n.clientType;let e=pc(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=dc(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(_s(n,fn.CCR_PROJECT_HEADER).present)return"pi";let i=t["x-anthropic-billing-header"];if(typeof i=="string"&&i.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 c=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(c)?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(c).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function No(n){return Mo[n]}function Tc(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||(0,ys.randomUUID)();return n.__ccrRequestScopeId=e,e}function ke(n,e={}){let t=Oe(n),o=No(t).createContext(n,e),r=o.stableSessionId||Tc(n),s=o.usageScope==="session"?"session":"request";return n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,o.projectHeaderPresent?n.projectId=o.projectId:delete n.projectId,fc(n,fn.CCR_PROJECT_HEADER),n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function bs(){}var ys,fn,uc,mc,gc,hc,yc,_c,kc,bc,Mo,qe=w(()=>{"use strict";ys=require("node:crypto"),fn=require("@wengine-ai/claude-code-router-shared");Xe();uc=["claude-code","pi","qwen-code","opencode","codex","api","unknown"];mc={type:"claude-code",createContext(n){return ks(n,"claude-code")}},gc={type:"pi",createContext(n){let e=_s(n,fn.CCR_PROJECT_HEADER);return{..._t("pi",!1),projectId:e.value,projectHeaderPresent:e.present}}},hc={type:"qwen-code",createContext(n){return ks(n,"qwen-code")}},yc={type:"opencode",createContext(){return _t("opencode")}},_c={type:"codex",createContext(){return _t("codex")}},kc={type:"api",createContext(){return _t("api")}},bc={type:"unknown",createContext(){return _t("unknown")}},Mo={"claude-code":mc,pi:gc,"qwen-code":hc,opencode:yc,codex:_c,api:kc,unknown:bc}});function se(n,e,t,o){let r=Lo(e,t);if(r.code==="model_unhealthy"){let c=q(e,t,!0);if(c)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),c}let s=n.sessionId||n.clientContext?.stableSessionId,i=Ss[r.code]||502;throw new ne(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:i})}function yn(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 Tt(n){let e=yn(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 Cc(n,e){if(!e||!n)return null;let t=yn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=Tt(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let i=yn(r);if(i&&t.includes(i))return s}return null}function xc(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function mn(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 kt(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 Lo(n,e){let t=mn(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(a=>a.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 i=s.models?.find(a=>String(a).toLowerCase()===r.toLowerCase());if(!i)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(i)))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let l=yt(s.name);if(l){let a=l.limitDaily!==void 0&&l.usedDailyBalance!==void 0&&l.usedDailyBalance>=l.limitDaily,u=l.totalBalance!==void 0&&l.usedBalance!==void 0&&l.usedBalance>=l.totalBalance;if(a||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function q(n,e,t,o,r,s,i){let c=mn(n);if(!c)return i?null:n;let{providerName:l,routeModel:a}=c,u=kt(e,l,a);if(!u){if(r===!0&&o&&!t&&s!==!1){let m=He(),f=m.getPromotion(l,a,o,e);if(f){let y=mn(f);if(y){let p=kt(e,y.providerName,y.routeModel);if(p)return`${p.provider.name},${p.model}`}m.clear(l,a,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let m=He(),f=m.getPromotion(l,a,o,e);if(f){let y=mn(f);if(y){let p=kt(e,y.providerName,y.routeModel);if(p)return`${p.provider.name},${p.model}`}m.clear(l,a,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model))return null;let d=yt(u.provider.name);if(d){let m=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,f=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(m||f)return null}return`${u.provider.name},${u.model}`}function te(n,e,t,o,r,s){let i=j(),c=[t?.[n],o?.[n]];for(let l of c)if(!(!Array.isArray(l)||l.length===0))for(let a of l){let u=q(a,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Sc(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 Do(n){let e=yn(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 Rs(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,xc(e))}function ws(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Rc(n,e,t,o,r,s,i,c,l,a,u,d){let m=n.clientContext,f=m?.longContextThreshold??t.longContextThreshold??l??6e4,y=Rs(e,r,m),p=n.modelFamily,g=ws(m,t,a),_=m?.supportsExplicitExtendedContext!==!1&&s===!0;if((_||y>g)&&t.extendedContext){let b=q(t.extendedContext,o,!1,"extendedContext",c,d,u);if(b)return n.log.info(`Family: using extended context model (1M+), tokens: ${y}, estimated: ${e}, explicit: ${_}, threshold: ${g}`),{model:b,scenarioType:"extendedContext",isFallback:!1};let T=c?te("extendedContext",o,t.fallback,i,p,u):null;if(T)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${y}, estimated: ${e}, explicit: ${_}, threshold: ${g}`),{model:T,scenarioType:"extendedContext",isFallback:!0};if(u){let x=se(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(y>f&&(t.longContext||t.fallback?.longContext?.length||i?.longContext?.length)){let b=t.longContext?q(t.longContext,o,!1,"longContext",c,d,u):null;if(b)return n.log.info(`Family: using long context model, tokens: ${y}, estimated: ${e}`),{model:b,scenarioType:"longContext",isFallback:!1};let T=c?te("longContext",o,t.fallback,i,p,u):null;if(T)return n.log.info(`Family: using long context fallback model, tokens: ${y}, estimated: ${e}`),{model:T,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=se(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(b=>b.type?.startsWith("web_search"))&&t.webSearch){let b=q(t.webSearch,o,!1,"webSearch",c,d,u);if(b)return{model:b,scenarioType:"webSearch",isFallback:!1};let T=c?te("webSearch",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using webSearch fallback model"),{model:T,scenarioType:"webSearch",isFallback:!0};if(u){let x=se(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 b=q(t.think,o,!1,"think",c,d,u);if(b)return{model:b,scenarioType:"think",isFallback:!1};let T=c?te("think",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using think fallback model"),{model:T,scenarioType:"think",isFallback:!0};if(u){let x=se(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 b=q(t.default,o,!1,"default",c,d,u);if(b)return{model:b,scenarioType:"default",isFallback:!1};let T=c?te("default",o,t.fallback,i,p,u):null;if(T)return n.log.info("Family: using default fallback model"),{model:T,scenarioType:"default",isFallback:!0};if(u){let x=se(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 Ac(){if(Ae.size<=Ts)return;let n=[...Ae.keys()].slice(0,Ae.size-Ts);for(let e of n)Ae.delete(e)}function Ic(){if(Ze.size<=vs)return;let n=[...Ze].slice(0,Ze.size-vs);for(let e of n)Ze.delete(e)}var xs,gn,_n,hn,be,Ss,ne,ye,bt,vc,wc,vt,Ae,Ts,Ze,vs,Pc,Ec,Oc,Cs,Fo,et=w(()=>{"use strict";xs=require("tiktoken");un();gn=require("fs/promises"),_n=require("fs/promises"),hn=require("path"),be=require("@wengine-ai/claude-code-router-shared");le();Ye();an();Xe();qe();Ss={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},ne=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||Ss[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ye=(0,xs.get_encoding)("cl100k_base"),bt=(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=>{s.type==="text"?o+=ye.encode(s.text).length:s.type==="tool_use"?o+=ye.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(o+=ye.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).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},vc=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 ne(`Project routing error: invalid managed project id "${String(o)}".`,{configuredTarget:String(o),code:"invalid_project_id"});let r=t?o:n.sessionId?await Fo(n.sessionId):null;if(r){n.projectId=r;let s=(0,hn.join)(be.HOME_DIR,r,"config.json");if(!t&&n.sessionId){let i=(0,hn.join)(be.HOME_DIR,r,`${n.sessionId}.json`);try{let c=JSON.parse(await(0,gn.readFile)(i,"utf8"));if(c&&c.Router&&Object.keys(c.Router).length>0)return c.Router}catch{}}try{let i=JSON.parse(await(0,gn.readFile)(s,"utf8"));if(t&&(typeof i?.projectPath!="string"||(0,be.getClaudeProjectId)(i.projectPath)!==o))throw new ne(`Project routing error: managed project id "${o}" does not match its stored project path.`,{configuredTarget:s,code:"invalid_project_id"});if(i&&i.Router&&Object.keys(i.Router).length>0)return i.Router}catch(i){if(i instanceof ne)throw i;if(t&&i?.code==="ENOENT")throw new ne(`Project routing error: managed project "${o}" no longer has a project config.`,{configuredTarget:s,code:"project_config_not_found"});if(!i||i.code!=="ENOENT"){let c=n.sessionId||n.clientContext?.stableSessionId;throw new ne(`Project routing error: project config.json is malformed or unreadable in project "${r}". ${i.message}. Session: "${c||"unknown"}".`,{sessionId:c,configuredTarget:s,code:"project_config_error",statusCode:500})}}}};wc=async(n,e,t,o,r,s)=>{let i=t.get("providers")||[],c=r||t.get("Router"),l=c?.enableFallback===!0,a=l?c?.fallback:void 0,u=l&&!s?a||t.get("fallback"):a,d=!s,m=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let C=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);C&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${C[1]}</CCR-SUBAGENT-MODEL>`,""),m=C[1])}let{family:f,extended:y,isCcrAlias:p}=Tt(n.body.model),g=c?.families?.[f||""];if(g&&c?.enableFamilyRouting){n.log.info(`Using model family routing for: ${f}${y?" (1M)":""}`),n.modelFamily=f,n.familyFallback=g.fallback;let C=Rc(n,e,g,i,o,y,u,l,c?.longContextThreshold,c?.extendedContextThreshold,s,d);if(C)return{model:C.model,scenarioType:C.scenarioType}}if(n.body.model.includes(",")&&!s){let C=q(n.body.model,i,!1,"default",l,d,s);if(C)return{model:C,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let S=l?te("default",i,void 0,u,void 0,s):null;if(S)return n.log.info(`Using fallback for explicit model: ${S}`),{model:S,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let _=p&&!c?.enableFamilyRouting?null:Cc(n.body.model,c?.models);if(_){let C=q(_,i,!1,"modelMapping",l,d,s);if(C)return n.log.info(`Using mapped model for ${n.body.model}: ${_}`),{model:C,scenarioType:"modelMapping"};let S=l?te("modelMapping",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"modelMapping"};if(s){let v=se(n,_,i,"modelMapping");if(v)return{model:v,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${_} unavailable (fail pool), skipping`)}let k=n.clientContext,h=Rs(e,o,k),b=ws(k,void 0,c?.extendedContextThreshold);if(h>b&&c?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${h}, estimated: ${e}, threshold: ${b}`);let C=q(c.extendedContext,i,!1,"extendedContext",l,d,s);if(C)return{model:C,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${c.extendedContext} unavailable (fail pool), trying fallback`);let S=l?te("extendedContext",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"extendedContext"};if(s){let v=se(n,c.extendedContext,i,"extendedContext");if(v)return{model:v,scenarioType:"extendedContext"}}}let T=k?.longContextThreshold??c?.longContextThreshold??6e4;if(h>T&&c?.longContext){n.log.info(`Using long context model due to token count: ${h}, estimated: ${e}, threshold: ${T}`);let C=q(c.longContext,i,!1,"longContext",l,d,s);if(C)return{model:C,scenarioType:"longContext"};n.log.warn(`Long context model ${c.longContext} unavailable (fail pool), trying fallback`);let S=l?te("longContext",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"longContext"};if(s){let v=se(n,c.longContext,i,"longContext");if(v)return{model:v,scenarioType:"longContext"}}}if(!s&&m)return{model:m,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&c?.background){n.log.info(`Using background model for ${n.body.model}`);let C=q(c.background,i,!1,"background",l,d,s);if(C)return{model:C,scenarioType:"background"};let S=l?te("background",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"background"};if(s){let v=se(n,c.background,i,"background");if(v)return{model:v,scenarioType:"background"}}n.log.warn(`Background model ${c.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(C=>C.type?.startsWith("web_search"))&&c?.webSearch){let C=q(c.webSearch,i,!1,"webSearch",l,d,s);if(C)return{model:C,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${c.webSearch} unavailable (fail pool), trying fallback`);let S=l?te("webSearch",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"webSearch"};if(s){let v=se(n,c.webSearch,i,"webSearch");if(v)return{model:v,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&c?.think){n.log.info(`Using think model for ${n.body.thinking}`);let C=q(c.think,i,!1,"think",l,d,s);if(C)return{model:C,scenarioType:"think"};n.log.warn(`Think model ${c.think} unavailable (fail pool), trying fallback`);let S=l?te("think",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"think"};if(s){let v=se(n,c.think,i,"think");if(v)return{model:v,scenarioType:"think"}}}if(c?.default){let C=q(c.default,i,!1,"default",l,d,s);if(C)return{model:C,scenarioType:"default"};n.log.warn(`Default model ${c.default} unavailable (fail pool), trying fallback`);let S=l?te("default",i,void 0,u,void 0,s):null;if(S)return{model:S,scenarioType:"default"};let v=q(c.default,i,!0,"default",l,d,s);if(v)return n.log.warn(`No fallback available; retrying default model ${c.default} despite fail-pool state (strict=${s})`),{model:v,scenarioType:"default"}}if(s){let C=se(n,c?.default||n.body.model,i,"default");if(C)return{model:C,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},vt=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)&&ke(n,o.getAll());let s=await vc(n,o),i=s||o.get("Router"),c=i?.enableFallback===!0,l=o.get("providers")||[],a=!!s;n.enableFallback=c,n.strictProjectRouting=a,n.fallbackConfig=a?i?.fallback:i?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??ee.get(n.usageCacheKey):void 0,{messages:d,system:m=[],tools:f}=n.body,y=o.get("REWRITE_SYSTEM_PROMPT");if(y&&m.length>1&&m[1]?.text?.includes("<env>")){let p=await(0,gn.readFile)(y,"utf-8");m[1].text=`${p}<env>${m[1].text.split("<env>").pop()}`}try{let[p,g]=n.body.model.split(","),_=t.tokenizerService?.getTokenizerConfigForModel(p,g),k;t.tokenizerService?k=(await t.tokenizerService.countTokens({messages:d,system:m,tools:f},_,p)).tokenCount:k=bt(d,m,f),n.tokenCount=k;let h,b=a?void 0:o.get("CUSTOM_ROUTER_PATH");if(b)try{h=await require(b)(n,o.getAll(),{event:r})}catch(S){n.log.error(`failed to load custom router: ${S.message}`)}if(h)n.scenarioType="default";else{let S=await wc(n,k,o,u,s,!!s);h=S.model,n.scenarioType=S.scenarioType}let{family:T}=Tt(n.originalModel||n.body.model),x=i?.enableFamilyRouting&&T?i.families?.[T]:void 0,C=[x?.image,i?.image].filter((S,v,E)=>!!S&&E.indexOf(S)===v);if(C.length>0&&Sc(n)&&!Do(h))if(C.includes(h))n.scenarioType="image";else{let S=C.map(v=>q(v,l,!1,"image",c,!a,a)).find(v=>!!v);if(S)n.log.info(`Using image model fallback for ${h}`),h=S,n.scenarioType="image";else{let v=c?te("image",l,x?.fallback,n.fallbackConfig,T||void 0,a):null;if(v)n.log.info(`Using image fallback model: ${v}`),h=v,n.scenarioType="image";else if(a){let E=se(n,C[0],l,"image");E&&(h=E,n.scenarioType="image")}else n.log.warn(`Image models ${C.join(", ")} unavailable (fail pool), keeping ${h}`),n.scenarioType="image"}}typeof h=="string"&&h.trim()?n.body.model=h:(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(p){if(p instanceof ne)throw p;if(n.log.error(`Error in router middleware: ${p.message}`),a){let g=n.sessionId||n.clientContext?.stableSessionId;throw new ne(`Project routing error: router failure in project mode. ${p.message}. Session: "${g||"unknown"}".`,{sessionId:g,configuredTarget:i?.default,code:"project_router_failure",statusCode:502})}n.body.model=i?.default,n.scenarioType="default"}},Ae=new Map,Ts=1e3,Ze=new Set,vs=1e3,Pc=3,Ec=50,Oc=n=>new Promise(e=>setTimeout(e,n));Cs=async n=>{let e=await(0,_n.opendir)(be.CLAUDE_PROJECTS_DIR),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let i=(0,hn.join)(be.CLAUDE_PROJECTS_DIR,s,`${n}.jsonl`);try{return(await(0,_n.stat)(i)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Fo=async n=>{let e=Ee(n);if(!e)return null;if(Ae.has(e))return Ae.get(e)||null;try{let t=await Cs(e);if(!t&&!Ze.has(e)){Ze.add(e),Ic();for(let o=0;o<Pc&&!t;o++)await Oc(Ec),t=await Cs(e)}return t?(Ae.set(e,t),Ac(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function Ct(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
42
  `):"";r&&e.push({role:"assistant",content:[{type:"text",text:`[reasoning]
43
- ${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 Ss(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&&vt(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Ec.test(r.model)&&await Ct(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let a=r.model.split(",");a.length>1&&(s=a[0],r.model=a.slice(1).join(","))}let i=s?t.providerService.getProvider(s):void 0;if(!i&&r?.model){let a=t.providerService.resolveModelRoute(r.model);a&&(i=a.provider,r.model=a.targetModel)}if(!i&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[d,...g]=u.split(","),m=t.providerService.getProvider(d);m&&(i=m,r.model=g.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!i)throw K(`Provider '${s}' not found`,404,"provider_not_found");n.provider=i.name||s;let l=Ic(n),c=o.endPoint==="/v1/messages"&&l;l&&e.header("X-Codex-Detected","true"),c&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=c,n.codexDetected=l;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&&vt(r);let{requestBody:a,config:u,bypass:d}=await ws(r,i,o,n.headers,{req:n});if(a?.messages&&!d&&!n.isTargetAnthropic){let p=a.messages,f=new Set,_=[],k=[];for(let h of p){if(h?.role!=="system"){k.push(h);continue}let b=JSON.stringify(h.content??"");f.has(b)||(f.add(b),_.push(h))}_.length>0&&k.length>0&&(a.messages=[..._,...k])}let g=await Ps(a,u,i,t,d,o,{req:n});try{i?.baseUrl&&g?.headers&&mt(s,i.baseUrl,g.headers)}catch{}let m=await Es(a,g,i,o,d,{req:n,isCodexOnMessagesEndpoint:c});m=await Rs(r,m,i.name||s);let y=Os(m,e,r,t);try{let p=r.model||n.originalModel;s&&p&&j().recordSuccess(s,p)}catch{}return y}catch(a){if(a instanceof pe)throw a;if(!n.__retryAttempted){n.__retryAttempted=!0;try{return await Ss(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;a=d}}let u=await Oc(n,e,t,o,a);if(u)return u;throw n.__fallbackExhausted=!0,a}}async function Rs(n,e,t){if(!n?.stream||!e?.body)return e;let o=e.body.getReader(),r=new TextDecoder,s=[],i="";for(let a=0;a<8;a++){let u=await o.read();if(u.done||(u.value&&(s.push(u.value),i+=r.decode(u.value,{stream:!0})),i.split(`
43
+ ${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 Ps(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&&Ct(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Mc.test(r.model)&&await vt(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let a=r.model.split(",");a.length>1&&(s=a[0],r.model=a.slice(1).join(","))}let i=s?t.providerService.getProvider(s):void 0;if(!i&&r?.model){let a=t.providerService.resolveModelRoute(r.model);a&&(i=a.provider,r.model=a.targetModel)}if(!i&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[d,...m]=u.split(","),f=t.providerService.getProvider(d);f&&(i=f,r.model=m.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!i)throw K(`Provider '${s}' not found`,404,"provider_not_found");n.provider=i.name||s;let c=Lc(n),l=o.endPoint==="/v1/messages"&&c;c&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=l,n.codexDetected=c;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&&Ct(r);let{requestBody:a,config:u,bypass:d}=await Os(r,i,o,n.headers,{req:n});if(a?.messages&&!d&&!n.isTargetAnthropic){let p=a.messages,g=new Set,_=[],k=[];for(let h of p){if(h?.role!=="system"){k.push(h);continue}let b=JSON.stringify(h.content??"");g.has(b)||(g.add(b),_.push(h))}_.length>0&&k.length>0&&(a.messages=[..._,...k])}let m=await As(a,u,i,t,d,o,{req:n});try{i?.baseUrl&&m?.headers&&gt(s,i.baseUrl,m.headers)}catch{}let f=await Is(a,m,i,o,d,{req:n,isCodexOnMessagesEndpoint:l});f=await Es(r,f,i.name||s);let y=Ms(f,e,r,t);try{let p=r.model||n.originalModel;s&&p&&j().recordSuccess(s,p)}catch{}return y}catch(a){if(a instanceof ne)throw a;if(!n.__retryAttempted){n.__retryAttempted=!0;try{return await Ps(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;a=d}}let u=await $c(n,e,t,o,a);if(u)return u;throw n.__fallbackExhausted=!0,a}}async function Es(n,e,t){if(!n?.stream||!e?.body)return e;let o=e.body.getReader(),r=new TextDecoder,s=[],i="";for(let a=0;a<8;a++){let u=await o.read();if(u.done||(u.value&&(s.push(u.value),i+=r.decode(u.value,{stream:!0})),i.split(`
44
44
  `).some(d=>d.startsWith("data:"))))break}if(i+=r.decode(),s.length===0)throw o.releaseLock(),K(`Provider returned empty streaming response from ${t}`,400,"provider_response_error");if(i.includes("event: error")){o.releaseLock();let a=i.length<500?i:i.slice(0,500);throw K(`Provider ${t} returned error in SSE stream: ${a}`,400,"provider_response_error")}if(i.split(`
45
- `).filter(a=>a.startsWith("data:")&&a.trim().length>5).length===0){o.releaseLock();let a=i.length<500?i:i.slice(0,500);throw K(`Provider ${t} returned streaming response with no SSE data lines: ${a}`,400,"provider_response_error")}let c=new ReadableStream({start:a=>{for(let d of s)a.enqueue(d);let u=()=>{o.read().then(({done:d,value:g})=>{d?a.close():(a.enqueue(g),u())}).catch(d=>a.error(d))};u()},cancel:()=>{o.cancel()}});return new Response(c,{headers:e.headers,status:e.status,statusText:e.statusText})}async function Oc(n,e,t,o,r){let s=n.scenarioType||"default",i=n.familyFallback,l=n.modelFamily,c=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),a=j(),u=n.provider||"",d=n.body.model||"",g=new Set,m=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&_n(r.rawBody)||r?.message&&_n(r.message);if(u&&d&&(m?(a.markRateLimited(u,d,120,r?.message),n.log.warn(`Primary model ${u},${d} rate-limited, will try fallbacks`)):a.recordFailure(u,d,r?.message),g.add(`${u},${d}`),t.recordUsage?.({provider:u,model:d,originalModel:n.originalModel||d,scenarioType:s,modelFamily:n.modelFamily,errorMessage:r?.message||String(r),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 p=k=>{let[h,...b]=k.split(","),T=h?.trim(),x=b.join(",").trim();return!T||!x?null:{provider:T,model:x,key:`${T},${x}`}},f=[];if(l){let k=i?.[s];if(Array.isArray(k)&&k.length>0)f.push({name:`${l}/${s}`,models:k});else{let h=n.strictProjectRouting;n.log.warn(`No ${l} fallback configured for ${s}; ${h?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(c?.[s])&&c[s].length>0&&f.push({name:`global/${s}`,models:c[s]}),f.length===0&&s!=="image"&&n.body?.messages?.some(b=>b.role==="user"&&Array.isArray(b.content)&&b.content.some(T=>T.type==="image"||T.type==="image_url"||Array.isArray(T?.content)&&T.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`),f.push({name:"global/image (auto-detected)",models:c.image})),f.length===0)return null;let _=f.reduce((k,h)=>k+h.models.length,0);n.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${f.length} fallback stage(s)`);for(let k of f){n.log.info(`Trying ${k.name} fallback stage with ${k.models.length} models`);for(let h of k.models){let b=p(h);if(!b){n.log.warn(`Fallback model '${h}' is invalid, skipping`);continue}if(g.has(b.key))continue;g.add(b.key);let T=t.providerService.getProviders(),x=kt(T,b.provider,b.model);if(!x){n.log.warn(`Fallback model ${h} is not configured or provider is disabled, skipping`);continue}let v=x.provider.name,S=x.model;if(!a.isAvailable(v,S)){n.log.warn(`Fallback model ${h} unavailable (fail pool), skipping`);continue}let C;for(let P=1;P<=2;P++)try{n.log.info(`Trying fallback model: ${v},${S}${P>1?" (retry)":""}`);let R={...n.body};R.model=S;let A={...n,provider:v,body:R},O=x.provider,{requestBody:I,config:L,bypass:F}=await ws(R,O,o,n.headers,{req:A}),J=await Ps(I,L,O,t,F,o,{req:A});try{O?.baseUrl&&J?.headers&&mt(v,O.baseUrl,J.headers)}catch{}let N=await Es(I,J,O,o,F,{req:A,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1});return N=await Rs(R,N,v),n.log.info(`Fallback model ${v},${S} succeeded`),a.recordSuccess(v,S),u&&d&&!n.strictProjectRouting&&(Ue().promote(u,d,s,v,S),n.log.info(`Promoted fallback model ${v},${S} for ${u},${d}:${s}`),m?n.log.info(`Rate-limited original model ${u},${d} already marked unavailable with cooldown`):(a.forceOpen(u,d,r?.message),n.log.info(`Marked original model ${u},${d} as unavailable`))),n.provider=v,n.body=R,Os(N,e,R,t)}catch(R){if(C=R,P===1){n.log.warn(`Fallback model ${v},${S} failed, retrying once: ${R.message}`);continue}}a.recordFailure(v,S,C?.message),n.log.warn(`Fallback model ${v},${S} failed after retry: ${C?.message}`),t.recordUsage?.({provider:v,model:S,originalModel:n.originalModel||d||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:C?.message||String(C),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 ws(n,e,t,o,r){let s=JSON.parse(JSON.stringify(n)),i=s?.system;if(typeof i=="string"&&i.includes("cch="))s.system=i.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(i))for(let a=0;a<i.length;a++){let u=i[a],d=typeof u=="string"?u:u?.text??"";if(d.includes("cch=")){let g=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof u=="string"?i[a]=g:typeof u?.text=="string"&&(u.text=g)}}let l={},c=!1;if(c=Ac(e,t,n),c&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],l.headers=o),!c&&typeof t.transformRequestOut=="function"){let a=await t.transformRequestOut(s);a.body?(s=a.body,l=a.config||{}):s=a}if(!c&&e.transformer?.use?.length)for(let a of e.transformer.use){if(!a||typeof a.transformRequestIn!="function")continue;let u=await a.transformRequestIn(s,e,r);u.body?(s=u.body,l={...l,...u.config}):s=u}if(!c&&e.transformer?.[n.model]?.use?.length)for(let a of e.transformer[n.model].use)!a||typeof a.transformRequestIn!="function"||(s=await a.transformRequestIn(s,e,r));return{requestBody:s,config:l,bypass:c}}function Ac(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 Ic(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 Ps(n,e,t,o,r,s,i){let l=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let u=o.configService.get("API_TIMEOUT_MS");u&&(e.TIMEOUT=typeof u=="string"?parseInt(u,10):u)}if(r&&typeof s.auth=="function"){let u=await s.auth(n,t);if(u.body){n=u.body;let d=e.headers||{};u.config?.headers&&(d={...d,...u.config.headers},delete d.host,delete u.config.headers),e={...e,...u.config,headers:d}}else n=u}let c={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};for(let u in c)(c[u]==="undefined"||["authorization","Authorization"].includes(u)&&c[u]?.includes("undefined"))&&delete c[u];nn(o.configService)&&Vr(o.log,i.req.id,{url:String(l),headers:c,body:n});let a=await qr(l,n,{...e,headers:JSON.parse(JSON.stringify(c)),httpsProxy:de(o.configService,t)},i,o.log);if(!a.ok){let u=await a.text();o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${a.status}): ${u}`);let d=K(`Error from provider(${t.name},${n.model}: ${a.status}): ${u}`,a.status,"provider_response_error");throw d.isRateLimit=a.status===429||_n(u),d.rawBody=u,d}if(a.ok){let u=a.headers.get("content-type")||"",d=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${d} contentType=${u} ok=${a.ok} status=${a.status} hasBody=${!!a.body}`),!d||u.includes("application/json")){let g=a.clone(),m="";try{if(m=await g.text(),!m||m.trim()==="")throw new SyntaxError("Empty JSON body");if(gt(m))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${u}, skipping JSON validation`),a;let y=JSON.parse(m);if(y&&typeof y=="object"&&y.error&&(typeof y.error=="string"||typeof y.error=="object"&&Object.keys(y.error).length>0)){o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${a.status}): ${m}`);let f=_n(m),_=K(`Error from provider(${t.name},${n.model}: ${a.status}): ${m}`,400,"provider_response_error");throw _.isRateLimit=f,_.rawBody=m,_}}catch(y){if(y instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${m}"`);let p=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 p.rawBody=m,p}throw y}}}if(!n.stream&&nn(o.configService)){let d=await a.clone().text();Yr(o.log,i.req.id,{status:a.status,headers:Object.fromEntries(a.headers.entries()),body:d})}return a}async function Es(n,e,t,o,r,s){let i=e;if(!r&&t.transformer?.use?.length)for(let l of Array.from(t.transformer.use).reverse())!l||typeof l.transformResponseOut!="function"||(i=await l.transformResponseOut(i,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let l of Array.from(t.transformer[n.model].use).reverse())!l||typeof l.transformResponseOut!="function"||(i=await l.transformResponseOut(i,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),i=await o.transformResponseIn(i,s)),s?.isCodexOnMessagesEndpoint)try{i=await new We().transformResponseIn(i,{...s,provider:t})}catch(l){console.error("Failed to apply Responses API conversion for codex client:",l)}return i}async function Os(n,e,t,o){n.ok||e.code(n.status);let r=us(n);if(!r){let s=await Je(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let i=await Be(n);n=i.response,i.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&&nn(o.configService)){let[s,i]=n.body.tee(),l=Qr(o.configService);return Xr(s,o.log,e.request.id,l),e.send(i)}return e.send(n.body)}else return U(n)}function _n(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 Mc(n){try{return new URL(n),!0}catch{return!1}}var Ec,As,kn=w(()=>{"use strict";Zr();en();pt();yo();ce();ze();an();wo();Z();Ze();ae();Ec=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;As=async n=>{n.get("/",async()=>({message:"LLMs API",version:sn})),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)=>Ss(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:i,models:l}=t.body;if(!r?.trim())throw K("Provider name is required",400,"invalid_request");if(!s||!Mc(s))throw K("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw K("API key is required",400,"invalid_request");if(!l||!Array.isArray(l)||l.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 fe,bn=w(()=>{"use strict";fe=class{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let o={};t.transformer&&Object.keys(t.transformer).forEach(r=>{r==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let i=this.transformerService.getTransformer(s[0]);if(i)return new i(s[1])}if(typeof s=="string"){let i=this.transformerService.getTransformer(s);return typeof i=="function"?new i:i}}).filter(s=>typeof s<"u")):Array.isArray(t.transformer[r]?.use)&&(o[r]={use:t.transformer[r].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let i=this.transformerService.getTransformer(s[0]);if(i)return new i(s[1])}if(typeof s=="string"){let i=this.transformerService.getTransformer(s);return typeof i=="function"?new i:i}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,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 i=`${o.name},${s}`;this.modelRoutes.delete(i),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let i=`${o.name},${s}`,l={provider:o.name,model:s,fullModel:i};this.modelRoutes.set(i,l),this.modelRoutes.has(s)||this.modelRoutes.set(s,l)})),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(i=>i.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 Is,Ms=w(()=>{Is=n=>n<=0?"none":n<=1024?"low":n<=8192?"medium":"high"});var $s,Ns=w(()=>{$s=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function $c(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function Ls(n){let e=[],t=[],o=g=>{if(typeof g=="string"){t.push({type:"text",text:g});return}Array.isArray(g)&&g.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 g=new Map;for(let m=0;m<t.length;m++){let y=t[m],p=y?.text??JSON.stringify(y),f=g.get(p);if(f===void 0){g.set(p,m);continue}!t[f]?.cache_control&&y?.cache_control&&(t[f]=y),t.splice(m,1),m--}};n.messages.forEach(g=>{g.role==="system"?o(g.content):e.push(g)}),r();let s=[];for(let g=0;g<e.length;g++){let m=e[g];if(m.role==="tool"){let y=m.content;try{typeof m.content=="string"&&(y=JSON.parse(m.content))}catch{}y!=null&&typeof y!="object"&&typeof y!="string"&&(y=String(y));let p={type:"tool_result",tool_use_id:m.tool_call_id,content:y};m.cache_control&&(p.cache_control=m.cache_control);let f=s[s.length-1];f&&f.role==="user"&&Array.isArray(f.content)?f.content.push(p):s.push({role:"user",content:[p]})}else if(m.role==="user"){let y=[];typeof m.content=="string"?y.push({type:"text",text:m.content}):Array.isArray(m.content)&&m.content.forEach(f=>{f&&typeof f=="object"&&f.type==="image_url"&&f.image_url?.url?y.push({type:"image",source:{type:"base64",media_type:f.media_type||"image/jpeg",data:f.image_url.url.split(",")[1]||f.image_url.url}}):y.push(f)});let p=s[s.length-1];p&&p.role==="user"&&Array.isArray(p.content)?p.content.push(...y):s.push({role:"user",content:y.length>0?y:[{type:"text",text:" "}]})}else if(m.role==="assistant"){let y=[];m.content&&(typeof m.content=="string"?y.push({type:"text",text:m.content}):Array.isArray(m.content)&&y.push(...m.content)),m.tool_calls&&m.tool_calls.length>0&&m.tool_calls.forEach(f=>{let _={};try{_=JSON.parse(f.function.arguments)}catch{_=f.function.arguments}y.push({type:"tool_use",id:f.id,name:f.function.name,input:_})}),m.thinking&&y.unshift({type:"thinking",thinking:m.thinking.content,signature:m.thinking.signature});let p=s[s.length-1];p&&p.role==="assistant"&&Array.isArray(p.content)?p.content.push(...y):s.push({role:"assistant",content:y.length>0?y:[{type:"text",text:" "}]})}}let i=()=>{let g=t.filter(m=>m?.cache_control).length;for(let m of s)Array.isArray(m.content)&&(g+=m.content.filter(y=>y?.cache_control).length);return g},l=g=>g&&typeof g=="object"?{...g}:{type:"ephemeral"},c=()=>{for(let g=s.length-1;g>=0;g--){let m=s[g]?.content;if(!Array.isArray(m))continue;let y=m.find(p=>p?.cache_control);if(y?.cache_control)return y.cache_control}for(let g=t.length-1;g>=0;g--)if(t[g]?.cache_control)return t[g].cache_control;return{type:"ephemeral"}},a=(g,m)=>{if(!Array.isArray(g?.content)||g.content.some(p=>p?.cache_control))return!1;let y=g.content.find(p=>p&&typeof p=="object"&&!p.cache_control);return y?(y.cache_control=l(m),!0):!1};(()=>{let g=4-i();if(g<=0||s.length===0)return;let m=s,y=c(),p=[];for(let f=m.length-1;f>=0;f--)m[f]?.role!=="user"||!Array.isArray(m[f].content)||p.push(f);for(let f of p){if(g<=0)break;a(m[f],y)&&g--}})();let d={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(t.length>0){let g=t.some(m=>m?.cache_control);d.system=g?t:t.map(m=>m.text||"").join(`
45
+ `).filter(a=>a.startsWith("data:")&&a.trim().length>5).length===0){o.releaseLock();let a=i.length<500?i:i.slice(0,500);throw K(`Provider ${t} returned streaming response with no SSE data lines: ${a}`,400,"provider_response_error")}let l=new ReadableStream({start:a=>{for(let d of s)a.enqueue(d);let u=()=>{o.read().then(({done:d,value:m})=>{d?a.close():(a.enqueue(m),u())}).catch(d=>a.error(d))};u()},cancel:()=>{o.cancel()}});return new Response(l,{headers:e.headers,status:e.status,statusText:e.statusText})}async function $c(n,e,t,o,r){let s=n.scenarioType||"default",i=n.familyFallback,c=n.modelFamily,l=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),a=j(),u=n.provider||"",d=n.body.model||"",m=new Set,f=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&kn(r.rawBody)||r?.message&&kn(r.message);if(u&&d&&(f?(a.markRateLimited(u,d,120,r?.message),n.log.warn(`Primary model ${u},${d} rate-limited, will try fallbacks`)):a.recordFailure(u,d,r?.message),m.add(`${u},${d}`),t.recordUsage?.({provider:u,model:d,originalModel:n.originalModel||d,scenarioType:s,modelFamily:n.modelFamily,errorMessage:r?.message||String(r),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 p=k=>{let[h,...b]=k.split(","),T=h?.trim(),x=b.join(",").trim();return!T||!x?null:{provider:T,model:x,key:`${T},${x}`}},g=[];if(c){let k=i?.[s];if(Array.isArray(k)&&k.length>0)g.push({name:`${c}/${s}`,models:k});else{let h=n.strictProjectRouting;n.log.warn(`No ${c} fallback configured for ${s}; ${h?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(l?.[s])&&l[s].length>0&&g.push({name:`global/${s}`,models:l[s]}),g.length===0&&s!=="image"&&n.body?.messages?.some(b=>b.role==="user"&&Array.isArray(b.content)&&b.content.some(T=>T.type==="image"||T.type==="image_url"||Array.isArray(T?.content)&&T.content.some(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(l?.image)&&l.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:l.image})),g.length===0)return null;let _=g.reduce((k,h)=>k+h.models.length,0);n.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${g.length} fallback stage(s)`);for(let k of g){n.log.info(`Trying ${k.name} fallback stage with ${k.models.length} models`);for(let h of k.models){let b=p(h);if(!b){n.log.warn(`Fallback model '${h}' is invalid, skipping`);continue}if(m.has(b.key))continue;m.add(b.key);let T=t.providerService.getProviders(),x=kt(T,b.provider,b.model);if(!x){n.log.warn(`Fallback model ${h} is not configured or provider is disabled, skipping`);continue}let C=x.provider.name,S=x.model;if(!a.isAvailable(C,S)){n.log.warn(`Fallback model ${h} unavailable (fail pool), skipping`);continue}let v;for(let E=1;E<=2;E++)try{n.log.info(`Trying fallback model: ${C},${S}${E>1?" (retry)":""}`);let R={...n.body};R.model=S;let A={...n,provider:C,body:R},O=x.provider,{requestBody:I,config:L,bypass:F}=await Os(R,O,o,n.headers,{req:A}),J=await As(I,L,O,t,F,o,{req:A});try{O?.baseUrl&&J?.headers&&gt(C,O.baseUrl,J.headers)}catch{}let N=await Is(I,J,O,o,F,{req:A,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1});return N=await Es(R,N,C),n.log.info(`Fallback model ${C},${S} succeeded`),a.recordSuccess(C,S),u&&d&&!n.strictProjectRouting&&(He().promote(u,d,s,C,S),n.log.info(`Promoted fallback model ${C},${S} for ${u},${d}:${s}`),f?n.log.info(`Rate-limited original model ${u},${d} already marked unavailable with cooldown`):(a.forceOpen(u,d,r?.message),n.log.info(`Marked original model ${u},${d} as unavailable`))),n.provider=C,n.body=R,Ms(N,e,R,t)}catch(R){if(v=R,E===1){n.log.warn(`Fallback model ${C},${S} failed, retrying once: ${R.message}`);continue}}a.recordFailure(C,S,v?.message),n.log.warn(`Fallback model ${C},${S} failed after retry: ${v?.message}`),t.recordUsage?.({provider:C,model:S,originalModel:n.originalModel||d||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:v?.message||String(v),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 Os(n,e,t,o,r){let s=JSON.parse(JSON.stringify(n)),i=s?.system;if(typeof i=="string"&&i.includes("cch="))s.system=i.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(i))for(let a=0;a<i.length;a++){let u=i[a],d=typeof u=="string"?u:u?.text??"";if(d.includes("cch=")){let m=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof u=="string"?i[a]=m:typeof u?.text=="string"&&(u.text=m)}}let c={},l=!1;if(l=Nc(e,t,n),l&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],c.headers=o),!l&&typeof t.transformRequestOut=="function"){let a=await t.transformRequestOut(s);a.body?(s=a.body,c=a.config||{}):s=a}if(!l&&e.transformer?.use?.length)for(let a of e.transformer.use){if(!a||typeof a.transformRequestIn!="function")continue;let u=await a.transformRequestIn(s,e,r);u.body?(s=u.body,c={...c,...u.config}):s=u}if(!l&&e.transformer?.[n.model]?.use?.length)for(let a of e.transformer[n.model].use)!a||typeof a.transformRequestIn!="function"||(s=await a.transformRequestIn(s,e,r));return{requestBody:s,config:c,bypass:l}}function Nc(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 Lc(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 As(n,e,t,o,r,s,i){let c=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let u=o.configService.get("API_TIMEOUT_MS");u&&(e.TIMEOUT=typeof u=="string"?parseInt(u,10):u)}if(r&&typeof s.auth=="function"){let u=await s.auth(n,t);if(u.body){n=u.body;let d=e.headers||{};u.config?.headers&&(d={...d,...u.config.headers},delete d.host,delete u.config.headers),e={...e,...u.config,headers:d}}else n=u}let l={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};for(let u in l)(l[u]==="undefined"||["authorization","Authorization"].includes(u)&&l[u]?.includes("undefined"))&&delete l[u];nn(o.configService)&&Xr(o.log,i.req.id,{url:String(c),headers:l,body:n});let a=await es(c,n,{...e,headers:JSON.parse(JSON.stringify(l)),httpsProxy:pe(o.configService,t)},i,o.log);if(!a.ok){let u=await a.text();o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${a.status}): ${u}`);let d=K(`Error from provider(${t.name},${n.model}: ${a.status}): ${u}`,a.status,"provider_response_error");throw d.isRateLimit=a.status===429||kn(u),d.rawBody=u,d}if(a.ok){let u=a.headers.get("content-type")||"",d=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${d} contentType=${u} ok=${a.ok} status=${a.status} hasBody=${!!a.body}`),!d||u.includes("application/json")){let m=a.clone(),f="";try{if(f=await m.text(),!f||f.trim()==="")throw new SyntaxError("Empty JSON body");if(ht(f))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${u}, skipping JSON validation`),a;let y=JSON.parse(f);if(y&&typeof y=="object"&&y.error&&(typeof y.error=="string"||typeof y.error=="object"&&Object.keys(y.error).length>0)){o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${a.status}): ${f}`);let g=kn(f),_=K(`Error from provider(${t.name},${n.model}: ${a.status}): ${f}`,400,"provider_response_error");throw _.isRateLimit=g,_.rawBody=f,_}}catch(y){if(y instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${f}"`);let p=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 p.rawBody=f,p}throw y}}}if(!n.stream&&nn(o.configService)){let d=await a.clone().text();qr(o.log,i.req.id,{status:a.status,headers:Object.fromEntries(a.headers.entries()),body:d})}return a}async function Is(n,e,t,o,r,s){let i=e;if(!r&&t.transformer?.use?.length)for(let c of Array.from(t.transformer.use).reverse())!c||typeof c.transformResponseOut!="function"||(i=await c.transformResponseOut(i,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let c of Array.from(t.transformer[n.model].use).reverse())!c||typeof c.transformResponseOut!="function"||(i=await c.transformResponseOut(i,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),i=await o.transformResponseIn(i,s)),s?.isCodexOnMessagesEndpoint)try{i=await new Ke().transformResponseIn(i,{...s,provider:t})}catch(c){console.error("Failed to apply Responses API conversion for codex client:",c)}return i}async function Ms(n,e,t,o){n.ok||e.code(n.status);let r=ps(n);if(!r){let s=await We(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let i=await Ge(n);n=i.response,i.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&&nn(o.configService)){let[s,i]=n.body.tee(),c=Yr(o.configService);return Zr(s,o.log,e.request.id,c),e.send(i)}return e.send(n.body)}else return U(n)}function kn(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 Dc(n){try{return new URL(n),!0}catch{return!1}}var Mc,$s,bn=w(()=>{"use strict";ts();en();ft();_o();le();Be();an();Po();Z();et();ce();Mc=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;$s=async n=>{n.get("/",async()=>({message:"LLMs API",version:sn})),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)=>Ps(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:i,models:c}=t.body;if(!r?.trim())throw K("Provider name is required",400,"invalid_request");if(!s||!Dc(s))throw K("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw K("API key is required",400,"invalid_request");if(!c||!Array.isArray(c)||c.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 fe,Tn=w(()=>{"use strict";fe=class{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let o={};t.transformer&&Object.keys(t.transformer).forEach(r=>{r==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let i=this.transformerService.getTransformer(s[0]);if(i)return new i(s[1])}if(typeof s=="string"){let i=this.transformerService.getTransformer(s);return typeof i=="function"?new i:i}}).filter(s=>typeof s<"u")):Array.isArray(t.transformer[r]?.use)&&(o[r]={use:t.transformer[r].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let i=this.transformerService.getTransformer(s[0]);if(i)return new i(s[1])}if(typeof s=="string"){let i=this.transformerService.getTransformer(s);return typeof i=="function"?new i:i}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,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 i=`${o.name},${s}`;this.modelRoutes.delete(i),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let i=`${o.name},${s}`,c={provider:o.name,model:s,fullModel:i};this.modelRoutes.set(i,c),this.modelRoutes.has(s)||this.modelRoutes.set(s,c)})),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(i=>i.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 Ns,Ls=w(()=>{Ns=n=>n<=0?"none":n<=1024?"low":n<=8192?"medium":"high"});var Ds,Fs=w(()=>{Ds=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function Fc(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function Us(n){let e=[],t=[],o=m=>{if(typeof m=="string"){t.push({type:"text",text:m});return}Array.isArray(m)&&m.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 m=new Map;for(let f=0;f<t.length;f++){let y=t[f],p=y?.text??JSON.stringify(y),g=m.get(p);if(g===void 0){m.set(p,f);continue}!t[g]?.cache_control&&y?.cache_control&&(t[g]=y),t.splice(f,1),f--}};n.messages.forEach(m=>{m.role==="system"?o(m.content):e.push(m)}),r();let s=[];for(let m=0;m<e.length;m++){let f=e[m];if(f.role==="tool"){let y=f.content;try{typeof f.content=="string"&&(y=JSON.parse(f.content))}catch{}y!=null&&typeof y!="object"&&typeof y!="string"&&(y=String(y));let p={type:"tool_result",tool_use_id:f.tool_call_id,content:y};f.cache_control&&(p.cache_control=f.cache_control);let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(p):s.push({role:"user",content:[p]})}else if(f.role==="user"){let y=[];typeof f.content=="string"?y.push({type:"text",text:f.content}):Array.isArray(f.content)&&f.content.forEach(g=>{g&&typeof g=="object"&&g.type==="image_url"&&g.image_url?.url?y.push({type:"image",source:{type:"base64",media_type:g.media_type||"image/jpeg",data:g.image_url.url.split(",")[1]||g.image_url.url}}):y.push(g)});let p=s[s.length-1];p&&p.role==="user"&&Array.isArray(p.content)?p.content.push(...y):s.push({role:"user",content:y.length>0?y:[{type:"text",text:" "}]})}else if(f.role==="assistant"){let y=[];f.content&&(typeof f.content=="string"?y.push({type:"text",text:f.content}):Array.isArray(f.content)&&y.push(...f.content)),f.tool_calls&&f.tool_calls.length>0&&f.tool_calls.forEach(g=>{let _={};try{_=JSON.parse(g.function.arguments)}catch{_=g.function.arguments}y.push({type:"tool_use",id:g.id,name:g.function.name,input:_})}),f.thinking&&y.unshift({type:"thinking",thinking:f.thinking.content,signature:f.thinking.signature});let p=s[s.length-1];p&&p.role==="assistant"&&Array.isArray(p.content)?p.content.push(...y):s.push({role:"assistant",content:y.length>0?y:[{type:"text",text:" "}]})}}let i=()=>{let m=t.filter(f=>f?.cache_control).length;for(let f of s)Array.isArray(f.content)&&(m+=f.content.filter(y=>y?.cache_control).length);return m},c=m=>m&&typeof m=="object"?{...m}:{type:"ephemeral"},l=()=>{for(let m=s.length-1;m>=0;m--){let f=s[m]?.content;if(!Array.isArray(f))continue;let y=f.find(p=>p?.cache_control);if(y?.cache_control)return y.cache_control}for(let m=t.length-1;m>=0;m--)if(t[m]?.cache_control)return t[m].cache_control;return{type:"ephemeral"}},a=(m,f)=>{if(!Array.isArray(m?.content)||m.content.some(p=>p?.cache_control))return!1;let y=m.content.find(p=>p&&typeof p=="object"&&!p.cache_control);return y?(y.cache_control=c(f),!0):!1};(()=>{let m=4-i();if(m<=0||s.length===0)return;let f=s,y=l(),p=[];for(let g=f.length-1;g>=0;g--)f[g]?.role!=="user"||!Array.isArray(f[g].content)||p.push(g);for(let g of p){if(m<=0)break;a(f[g],y)&&m--}})();let d={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(t.length>0){let m=t.some(f=>f?.cache_control);d.system=m?t:t.map(f=>f.text||"").join(`
46
46
 
47
- `)}return n.tools&&n.tools.length>0&&(d.tools=$c(n.tools),n.tool_choice&&(n.tool_choice==="auto"?d.tool_choice={type:"auto"}:n.tool_choice==="any"||n.tool_choice==="required"?d.tool_choice={type:"any"}:typeof n.tool_choice=="string"?d.tool_choice={type:"tool",name:n.tool_choice}:typeof n.tool_choice=="object"&&n.tool_choice.type==="function"&&(d.tool_choice={type:"tool",name:n.tool_choice.function.name}))),d}var Ds=w(()=>{});var Tn,Cn,Fs=w(()=>{"use strict";Tn=require("uuid");Ms();en();Z();Ns();Ds();Cn=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 s=e.system.filter(i=>i.type==="text"&&i.text).map(i=>({type:"text",text:i.text,cache_control:i.cache_control}));t.push({role:"system",content:s})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(s=>{s.role==="system"&&t.push({role:"system",content:s.content})}),o?.forEach(s=>{if(s.role!=="system"&&(s.role==="user"||s.role==="assistant")){if(typeof s.content=="string"){t.push({role:s.role,content:s.content});return}if(Array.isArray(s.content)){if(s.role==="user"){let i=s.content.filter(c=>c.type==="tool_result"&&c.tool_use_id);i.length&&i.forEach(c=>{let a={role:"tool",content:typeof c.content=="string"?c.content:JSON.stringify(c.content),tool_call_id:c.tool_use_id,cache_control:c.cache_control};t.push(a)});let l=s.content.filter(c=>c.type==="text"&&c.text||c.type==="image"&&c.source);l.length&&t.push({role:"user",content:l.map(c=>c?.type==="image"?{type:"image_url",image_url:{url:c.source?.type==="base64"?$s(c.source.data,c.source.media_type):c.source.url},media_type:c.source.media_type}:c)})}else if(s.role==="assistant"){let i={role:"assistant",content:""},l=s.content.filter(u=>u.type==="text"&&u.text);l.length&&(i.content=l.map(u=>u.text).join(`
48
- `));let c=s.content.filter(u=>u.type==="tool_use"&&u.id);c.length&&(i.tool_calls=c.map(u=>({id:u.id,type:"function",function:{name:u.name,arguments:JSON.stringify(u.input||{})}})));let a=s.content.find(u=>u.type==="thinking");a&&(i.thinking={content:a.thinking,signature:a.signature}),t.push(i)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice};return e.thinking&&(r.reasoning={effort:Is(e.thinking.budget_tokens),enabled:e.thinking.type==="enabled"}),e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=Ls(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 Je(e);if((r?.isSSE??!1)&&r?.body){let a=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(a,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let i;if(r?.body)i=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let a=await Be(e);if(a.isSSE){let u=await this.convertOpenAIStreamToAnthropic(a.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}i=a.response}let l=await U(i),c=this.convertOpenAIResponseToAnthropic(l,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,i=`msg_${Date.now()}`,l=null,c="unknown",a=!1,u=!1,d=!1,g=new Map,m=new Map,y=0,p=0,f=0,_=!1,k=!1,h=0,b=-1,T=()=>{let C=h;return h++,C},x=C=>{if(!_)try{r.enqueue(C);let P=new TextDecoder().decode(C);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}},v=()=>{if(!_)try{if(!a){this.logger?.warn("[empty_stream] Upstream produced no data, closing silently"),r.close(),_=!0;return}if(b>=0){let P={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
49
- data: ${JSON.stringify(P)}
47
+ `)}return n.tools&&n.tools.length>0&&(d.tools=Fc(n.tools),n.tool_choice&&(n.tool_choice==="auto"?d.tool_choice={type:"auto"}:n.tool_choice==="any"||n.tool_choice==="required"?d.tool_choice={type:"any"}:typeof n.tool_choice=="string"?d.tool_choice={type:"tool",name:n.tool_choice}:typeof n.tool_choice=="object"&&n.tool_choice.type==="function"&&(d.tool_choice={type:"tool",name:n.tool_choice.function.name}))),d}var js=w(()=>{});var vn,Cn,Hs=w(()=>{"use strict";vn=require("uuid");Ls();en();Z();Fs();js();Cn=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 s=e.system.filter(i=>i.type==="text"&&i.text).map(i=>({type:"text",text:i.text,cache_control:i.cache_control}));t.push({role:"system",content:s})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(s=>{s.role==="system"&&t.push({role:"system",content:s.content})}),o?.forEach(s=>{if(s.role!=="system"&&(s.role==="user"||s.role==="assistant")){if(typeof s.content=="string"){t.push({role:s.role,content:s.content});return}if(Array.isArray(s.content)){if(s.role==="user"){let i=s.content.filter(l=>l.type==="tool_result"&&l.tool_use_id);i.length&&i.forEach(l=>{let a={role:"tool",content:typeof l.content=="string"?l.content:JSON.stringify(l.content),tool_call_id:l.tool_use_id,cache_control:l.cache_control};t.push(a)});let c=s.content.filter(l=>l.type==="text"&&l.text||l.type==="image"&&l.source);c.length&&t.push({role:"user",content:c.map(l=>l?.type==="image"?{type:"image_url",image_url:{url:l.source?.type==="base64"?Ds(l.source.data,l.source.media_type):l.source.url},media_type:l.source.media_type}:l)})}else if(s.role==="assistant"){let i={role:"assistant",content:""},c=s.content.filter(u=>u.type==="text"&&u.text);c.length&&(i.content=c.map(u=>u.text).join(`
48
+ `));let l=s.content.filter(u=>u.type==="tool_use"&&u.id);l.length&&(i.tool_calls=l.map(u=>({id:u.id,type:"function",function:{name:u.name,arguments:JSON.stringify(u.input||{})}})));let a=s.content.find(u=>u.type==="thinking");a&&(i.thinking={content:a.thinking,signature:a.signature}),t.push(i)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice};return e.thinking&&(r.reasoning={effort:Ns(e.thinking.budget_tokens),enabled:e.thinking.type==="enabled"}),e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=Us(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 We(e);if((r?.isSSE??!1)&&r?.body){let a=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(a,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let i;if(r?.body)i=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let a=await Ge(e);if(a.isSSE){let u=await this.convertOpenAIStreamToAnthropic(a.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}i=a.response}let c=await U(i),l=this.convertOpenAIResponseToAnthropic(c,t);return new Response(JSON.stringify(l),{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,i=`msg_${Date.now()}`,c=null,l="unknown",a=!1,u=!1,d=!1,m=new Map,f=new Map,y=0,p=0,g=0,_=!1,k=!1,h=0,b=-1,T=()=>{let v=h;return h++,v},x=v=>{if(!_)try{r.enqueue(v);let E=new TextDecoder().decode(v);this.logger.debug({reqId:t.req.id,data:E,type:"send data"})}catch(E){if(E instanceof TypeError&&E.message.includes("Controller is already closed"))_=!0;else throw this.logger.debug({reqId:t.req.id,error:E instanceof Error?E.message:String(E),type:"send data error"}),E}},C=()=>{if(!_)try{if(!a){this.logger?.warn("[empty_stream] Upstream produced no data, closing silently"),r.close(),_=!0;return}if(b>=0){let E={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
49
+ data: ${JSON.stringify(E)}
50
50
 
51
- `)),b=-1}if(l)x(s.encode(`event: message_delta
52
- data: ${JSON.stringify(l)}
51
+ `)),b=-1}if(c)x(s.encode(`event: message_delta
52
+ data: ${JSON.stringify(c)}
53
53
 
54
- `)),l=null;else{let P=t?.req?.tokenCount||0;x(s.encode(`event: message_delta
55
- data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:P,output_tokens:0,cache_read_input_tokens:0}})}
54
+ `)),c=null;else{let E=t?.req?.tokenCount||0;x(s.encode(`event: message_delta
55
+ data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:E,output_tokens:0,cache_read_input_tokens:0}})}
56
56
 
57
- `))}let C={type:"message_stop"};x(s.encode(`event: message_stop
58
- data: ${JSON.stringify(C)}
57
+ `))}let v={type:"message_stop"};x(s.encode(`event: message_stop
58
+ data: ${JSON.stringify(v)}
59
59
 
60
- `)),r.close(),_=!0}catch(C){if(C instanceof TypeError&&C.message.includes("Controller is already closed"))_=!0;else throw C}},S=null;try{S=e.getReader();let C=new TextDecoder,P="";for(;!_;){let{done:R,value:A}=await S.read();if(R)break;P+=C.decode(A,{stream:!0});let O=P.split(`
61
- `);P=O.pop()||"";for(let I of O){if(_)break;if(!I.startsWith("data:"))continue;let L=I.slice(5).trim();if(this.logger.debug({reqId:t.req.id,type:"recieved data",data:L}),L!=="[DONE]")try{let F=JSON.parse(L);if(y++,this.logger.debug({reqId:t.req.id,response:F,tppe:"Original Response"}),F.error){t?.req&&(t.req.sseError=F.error);let N={type:"error",message:{type:"api_error",message:JSON.stringify(F.error)}};x(s.encode(`event: error
60
+ `)),r.close(),_=!0}catch(v){if(v instanceof TypeError&&v.message.includes("Controller is already closed"))_=!0;else throw v}},S=null;try{S=e.getReader();let v=new TextDecoder,E="";for(;!_;){let{done:R,value:A}=await S.read();if(R)break;E+=v.decode(A,{stream:!0});let O=E.split(`
61
+ `);E=O.pop()||"";for(let I of O){if(_)break;if(!I.startsWith("data:"))continue;let L=I.slice(5).trim();if(this.logger.debug({reqId:t.req.id,type:"recieved data",data:L}),L!=="[DONE]")try{let F=JSON.parse(L);if(y++,this.logger.debug({reqId:t.req.id,response:F,tppe:"Original Response"}),F.error){t?.req&&(t.req.sseError=F.error);let N={type:"error",message:{type:"api_error",message:JSON.stringify(F.error)}};x(s.encode(`event: error
62
62
  data: ${JSON.stringify(N)}
63
63
 
64
- `));continue}if(c=F.model||c,!a&&!_&&!d){a=!0;let N=t?.req?.tokenCount||0,D={type:"message_start",message:{id:i,type:"message",role:"assistant",content:[],model:c,stop_reason:null,stop_sequence:null,usage:{input_tokens:N,output_tokens:0}}};x(s.encode(`event: message_start
64
+ `));continue}if(l=F.model||l,!a&&!_&&!d){a=!0;let N=t?.req?.tokenCount||0,D={type:"message_start",message:{id:i,type:"message",role:"assistant",content:[],model:l,stop_reason:null,stop_sequence:null,usage:{input_tokens:N,output_tokens:0}}};x(s.encode(`event: message_start
65
65
  data: ${JSON.stringify(D)}
66
66
 
67
- `))}let J=F.choices?.[0];if(F.usage){let N=F.usage?.prompt_tokens_details?.cached_tokens??F.usage?.prompt_cache_hit_tokens??0,Q=(F.usage?.prompt_tokens||0)-N,xe=F.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:F.usage,mappedUsage:{input_tokens:Q,output_tokens:xe,cache_read_input_tokens:N},choicesLength:Array.isArray(F.choices)?F.choices.length:void 0,finishReason:J?.finish_reason});let z={input_tokens:Q,output_tokens:xe,cache_read_input_tokens:N};if(!l)l={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...z}};else{let oe=l.usage||{};l.usage={input_tokens:z.input_tokens||oe.input_tokens||0,output_tokens:z.output_tokens||oe.output_tokens||0,cache_read_input_tokens:z.cache_read_input_tokens||oe.cache_read_input_tokens||0}}}if(!J)continue;if(J?.delta?.thinking&&!_&&!d&&!u){if(!k){let N=T(),D={type:"content_block_start",index:N,content_block:{type:"thinking",thinking:""}};x(s.encode(`event: content_block_start
67
+ `))}let J=F.choices?.[0];if(F.usage){let N=F.usage?.prompt_tokens_details?.cached_tokens??F.usage?.prompt_cache_hit_tokens??0,Q=(F.usage?.prompt_tokens||0)-N,Re=F.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:F.usage,mappedUsage:{input_tokens:Q,output_tokens:Re,cache_read_input_tokens:N},choicesLength:Array.isArray(F.choices)?F.choices.length:void 0,finishReason:J?.finish_reason});let z={input_tokens:Q,output_tokens:Re,cache_read_input_tokens:N};if(!c)c={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...z}};else{let re=c.usage||{};c.usage={input_tokens:z.input_tokens||re.input_tokens||0,output_tokens:z.output_tokens||re.output_tokens||0,cache_read_input_tokens:z.cache_read_input_tokens||re.cache_read_input_tokens||0}}}if(!J)continue;if(J?.delta?.thinking&&!_&&!d&&!u){if(!k){let N=T(),D={type:"content_block_start",index:N,content_block:{type:"thinking",thinking:""}};x(s.encode(`event: content_block_start
68
68
  data: ${JSON.stringify(D)}
69
69
 
70
70
  `)),b=N,k=!0}if(J.delta.thinking.signature){let N={type:"content_block_delta",index:b,delta:{type:"signature_delta",signature:J.delta.thinking.signature}};x(s.encode(`event: content_block_delta
@@ -88,231 +88,231 @@ data: ${JSON.stringify(N)}
88
88
  `))}}if(J?.delta?.annotations?.length&&!_&&!d){if(b>=0&&u){let N={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
89
89
  data: ${JSON.stringify(N)}
90
90
 
91
- `)),b=-1,u=!1}J?.delta?.annotations.forEach(N=>{let D=T(),Q={type:"content_block_start",index:D,content_block:{type:"web_search_tool_result",tool_use_id:`srvtoolu_${(0,Tn.v4)()}`,content:[{type:"web_search_result",title:N.url_citation.title,url:N.url_citation.url}]}};x(s.encode(`event: content_block_start
91
+ `)),b=-1,u=!1}J?.delta?.annotations.forEach(N=>{let D=T(),Q={type:"content_block_start",index:D,content_block:{type:"web_search_tool_result",tool_use_id:`srvtoolu_${(0,vn.v4)()}`,content:[{type:"web_search_result",title:N.url_citation.title,url:N.url_citation.url}]}};x(s.encode(`event: content_block_start
92
92
  data: ${JSON.stringify(Q)}
93
93
 
94
- `));let xe={type:"content_block_stop",index:D};x(s.encode(`event: content_block_stop
95
- data: ${JSON.stringify(xe)}
94
+ `));let Re={type:"content_block_stop",index:D};x(s.encode(`event: content_block_stop
95
+ data: ${JSON.stringify(Re)}
96
96
 
97
- `)),b=-1})}if(J?.delta?.tool_calls&&!_&&!d){f++;let N=new Set;for(let D of J.delta.tool_calls){if(_)break;let Q=D.index??0;if(N.has(Q))continue;if(N.add(Q),!m.has(Q)){if(b>=0){let Ma={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
98
- data: ${JSON.stringify(Ma)}
97
+ `)),b=-1})}if(J?.delta?.tool_calls&&!_&&!d){g++;let N=new Set;for(let D of J.delta.tool_calls){if(_)break;let Q=D.index??0;if(N.has(Q))continue;if(N.add(Q),!f.has(Q)){if(b>=0){let La={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
98
+ data: ${JSON.stringify(La)}
99
99
 
100
- `)),b=-1}let z=T();m.set(Q,z);let oe=D.id||`call_ccr_${Q}`,B=D.function?.name||`tool_${Q}`,M={type:"content_block_start",index:z,content_block:{type:"tool_use",id:oe,name:B,input:{}}};x(s.encode(`event: content_block_start
100
+ `)),b=-1}let z=T();f.set(Q,z);let re=D.id||`call_ccr_${Q}`,B=D.function?.name||`tool_${Q}`,M={type:"content_block_start",index:z,content_block:{type:"tool_use",id:re,name:B,input:{}}};x(s.encode(`event: content_block_start
101
101
  data: ${JSON.stringify(M)}
102
102
 
103
- `)),b=z;let G={id:oe,name:B,arguments:"",contentBlockIndex:z};g.set(Q,G)}else if(D.id&&D.function?.name){let z=g.get(Q);z.id.startsWith("call_")&&z.name.startsWith("tool_")&&(z.id=D.id,z.name=D.function.name)}if(D.function?.arguments&&!_&&!d){let z=m.get(Q);if(z===void 0)continue;let oe=g.get(Q);oe&&(oe.arguments+=D.function.arguments);try{let B={type:"content_block_delta",index:z,delta:{type:"input_json_delta",partial_json:D.function.arguments}};x(s.encode(`event: content_block_delta
103
+ `)),b=z;let G={id:re,name:B,arguments:"",contentBlockIndex:z};m.set(Q,G)}else if(D.id&&D.function?.name){let z=m.get(Q);z.id.startsWith("call_")&&z.name.startsWith("tool_")&&(z.id=D.id,z.name=D.function.name)}if(D.function?.arguments&&!_&&!d){let z=f.get(Q);if(z===void 0)continue;let re=m.get(Q);re&&(re.arguments+=D.function.arguments);try{let B={type:"content_block_delta",index:z,delta:{type:"input_json_delta",partial_json:D.function.arguments}};x(s.encode(`event: content_block_delta
104
104
  data: ${JSON.stringify(B)}
105
105
 
106
106
  `))}catch{try{let B=D.function.arguments.replace(/[\x00-\x1F\x7F-\x9F]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"'),M={type:"content_block_delta",index:z,delta:{type:"input_json_delta",partial_json:B}};x(s.encode(`event: content_block_delta
107
107
  data: ${JSON.stringify(M)}
108
108
 
109
- `))}catch(B){console.error(B)}}}}}if(J?.finish_reason&&!_&&!d){if(p===0&&f===0&&console.error("Warning: No content in the stream response!"),b>=0){let N={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
109
+ `))}catch(B){console.error(B)}}}}}if(J?.finish_reason&&!_&&!d){if(p===0&&g===0&&console.error("Warning: No content in the stream response!"),b>=0){let N={type:"content_block_stop",index:b};x(s.encode(`event: content_block_stop
110
110
  data: ${JSON.stringify(N)}
111
111
 
112
- `)),b=-1}if(!_){let D={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[J.finish_reason]||"end_turn";l?l.delta={...l.delta,stop_reason:D,stop_sequence:null}:l={type:"message_delta",delta:{stop_reason:D,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}d=!0}}catch(F){this.logger?.error(`parseError: ${F.name} message: ${F.message} stack: ${F.stack} data: ${L}`)}}}v()}catch(C){if(!_)try{r.error(C)}catch(P){console.error(P)}}finally{if(S)try{S.releaseLock()}catch(C){console.error(C)}}},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,Tn.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(a=>({type:"web_search_result",url:a.url_citation.url,title:a.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 a={};try{let u=c.function.arguments||"{}";typeof u=="object"?a=u:typeof u=="string"&&(a=JSON.parse(u))}catch{a={text:c.function.arguments||""}}r.push({type:"tool_use",id:c.id,name:c.function.name,input:a})}),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,i=(e.usage?.prompt_tokens||0)-s,l={id:e.id?.startsWith("msg_")?e.id:`msg_${(0,Tn.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:i,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:l},"Conversion complete, final Anthropic response"),l}catch{throw K(`Provider error: ${JSON.stringify(e)}`,500,"provider_error")}}}});function Nc(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(et).includes(o)?o:et.TYPE_UNSPECIFIED}else{e.anyOf=[];for(let o of t){let r=o.toUpperCase();e.anyOf.push({type:Object.values(et).includes(r)?r:et.TYPE_UNSPECIFIED})}}}function xt(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)&&Nc(n.type,e);for(let[i,l]of Object.entries(n))if(l!=null)if(i=="type"){if(l==="null")throw new Error("type: null can not be the only possible type for the field.");if(Array.isArray(l))continue;let c=l.toUpperCase();e.type=Object.values(et).includes(c)?c:et.TYPE_UNSPECIFIED}else if(t.includes(i))e[i]=xt(l);else if(o.includes(i)){let c=[];for(let a of l){if(a.type=="null"){e.nullable=!0;continue}c.push(xt(a))}e[i]=c}else if(r.includes(i)){let c={};for(let[a,u]of Object.entries(l))c[a]=xt(u);e[i]=c}else{if(i==="additionalProperties")continue;e[i]=l}return e}function Lc(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=xt(e.parameters)),e.response&&(Object.keys(e.response).includes("$schema")?e.responseJsonSchema||(e.responseJsonSchema=e.response,delete e.response):e.response=xt(e.response));return n}function vn(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(Lc({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 a;c.role==="assistant"?a="model":(["user","system"].includes(c.role),a="user");let u=[];if(typeof c.content=="string"){let d={text:c.content};c.thinking?.signature&&(d.thoughtSignature=c.thinking.signature),u.push(d)}else Array.isArray(c.content)?u.push(...c.content.map(d=>{if(d.type==="text")return{text:d.text||""};if(d.type==="image_url")return d.image_url.url.startsWith("http")?{file_data:{mime_type:d.media_type,file_uri:d.image_url.url}}:{inlineData:{mime_type:d.media_type,data:d.image_url.url?.split(",")?.pop()||d.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(d=>{let g={functionCall:{id:d.id||`tool_${Math.random().toString(36).substring(2,15)}`,name:d.function.name,args:JSON.parse(d.function.arguments||"{}")}};return c.thinking?.signature&&(g.thoughtSignature=c.thinking.signature),g})),u.length===0&&u.push({text:""}),r.push({role:a,parts:u}),a==="model"&&c.tool_calls){let d=c.tool_calls.map(g=>{let m=s.find(y=>y.tool_call_id===g.id);return{functionResponse:{name:g?.function?.name,response:{result:m?.content}}}});r.push({role:"user",parts:d})}});let i={};if(n.reasoning&&n.reasoning.effort&&n.reasoning.effort!=="none")if(i.thinkingConfig={includeThoughts:!0},n.model.includes("gemini-3"))i.thinkingConfig.thinkingLevel=n.reasoning.effort;else{let c=n.model.includes("pro")?[128,32768]:[0,24576],a,u=n.reasoning.max_tokens;typeof u<"u"&&(u>=c[0]&&u<=c[1]?a=u:u<c[0]?a=c[0]:u>c[1]&&(a=c[1]),i.thinkingConfig.thinkingBudget=a)}let l={contents:r,tools:e.length?e:void 0,generationConfig:i};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]),l.toolConfig=c}return l}function xn(n){let e=n.contents,t=n.tools,o=n.model,r=n.max_tokens,s=n.temperature,i=n.stream,l=n.tool_choice,c={messages:[],model:o,max_tokens:r,temperature:s,stream:i,tool_choice:l};return Array.isArray(e)&&e.forEach(a=>{typeof a=="string"?c.messages.push({role:"user",content:a}):typeof a.text=="string"?c.messages.push({role:"user",content:a.text||null}):a.role==="user"?c.messages.push({role:"user",content:a?.parts?.map(u=>({type:"text",text:u.text||""}))||[]}):a.role==="model"&&c.messages.push({role:"assistant",content:a?.parts?.map(u=>({type:"text",text:u.text||""}))||[]})}),Array.isArray(t)&&(c.tools=[],t.forEach(a=>{Array.isArray(a.functionDeclarations)&&a.functionDeclarations.forEach(u=>{c.tools.push({type:"function",function:{name:u.name,description:u.description,parameters:u.parameters}})})})),c}async function Sn(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="",i=o.candidates[0]?.content?.parts||[],l=[];for(let d of i)d.text&&d.thought===!0?r+=d.text:l.push(d);s=i.find(d=>d.thoughtSignature)?.thoughtSignature;let c=l?.filter(d=>d.functionCall)?.map(d=>({id:d.functionCall?.id||`tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:d.functionCall?.name,arguments:JSON.stringify(d.functionCall?.args||{})}}))||[],a=l?.filter(d=>d.text)?.map(d=>d.text)?.join(`
113
- `)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:a,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,i=!1,l=!1,c="",a=0,u=-1,d=new ReadableStream({async start(g){let m=async(f,_)=>{if(f.startsWith("data: ")){let k=f.slice(6).trim();if(k){t?.debug({chunkStr:k},`${e} chunk:`);try{let h=JSON.parse(k);if(!h.candidates||!h.candidates[0]){t?.debug({chunkStr:k},"Invalid chunk structure");return}let b=h.candidates[0],T=b.content?.parts||[];T.filter(C=>C.text&&C.thought===!0).forEach(C=>{l||(l=!0);let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:C.text}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
112
+ `)),b=-1}if(!_){let D={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[J.finish_reason]||"end_turn";c?c.delta={...c.delta,stop_reason:D,stop_sequence:null}:c={type:"message_delta",delta:{stop_reason:D,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}d=!0}}catch(F){this.logger?.error(`parseError: ${F.name} message: ${F.message} stack: ${F.stack} data: ${L}`)}}}C()}catch(v){if(!_)try{r.error(v)}catch(E){console.error(E)}}finally{if(S)try{S.releaseLock()}catch(v){console.error(v)}}},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 l=`srvtoolu_${(0,vn.v4)()}`;r.push({type:"server_tool_use",id:l,name:"web_search",input:{query:""}}),r.push({type:"web_search_tool_result",tool_use_id:l,content:o.message.annotations.map(a=>({type:"web_search_result",url:a.url_citation.url,title:a.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(l=>{let a={};try{let u=l.function.arguments||"{}";typeof u=="object"?a=u:typeof u=="string"&&(a=JSON.parse(u))}catch{a={text:l.function.arguments||""}}r.push({type:"tool_use",id:l.id,name:l.function.name,input:a})}),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,i=(e.usage?.prompt_tokens||0)-s,c={id:e.id?.startsWith("msg_")?e.id:`msg_${(0,vn.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:i,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:c},"Conversion complete, final Anthropic response"),c}catch{throw K(`Provider error: ${JSON.stringify(e)}`,500,"provider_error")}}}});function Uc(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(tt).includes(o)?o:tt.TYPE_UNSPECIFIED}else{e.anyOf=[];for(let o of t){let r=o.toUpperCase();e.anyOf.push({type:Object.values(tt).includes(r)?r:tt.TYPE_UNSPECIFIED})}}}function xt(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)&&Uc(n.type,e);for(let[i,c]of Object.entries(n))if(c!=null)if(i=="type"){if(c==="null")throw new Error("type: null can not be the only possible type for the field.");if(Array.isArray(c))continue;let l=c.toUpperCase();e.type=Object.values(tt).includes(l)?l:tt.TYPE_UNSPECIFIED}else if(t.includes(i))e[i]=xt(c);else if(o.includes(i)){let l=[];for(let a of c){if(a.type=="null"){e.nullable=!0;continue}l.push(xt(a))}e[i]=l}else if(r.includes(i)){let l={};for(let[a,u]of Object.entries(c))l[a]=xt(u);e[i]=l}else{if(i==="additionalProperties")continue;e[i]=c}return e}function jc(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=xt(e.parameters)),e.response&&(Object.keys(e.response).includes("$schema")?e.responseJsonSchema||(e.responseJsonSchema=e.response,delete e.response):e.response=xt(e.response));return n}function xn(n){let e=[],t=n.tools?.filter(l=>l.function.name!=="web_search")?.map(l=>({name:l.function.name,description:l.function.description,parametersJsonSchema:l.function.parameters}));t?.length&&e.push(jc({functionDeclarations:t})),n.tools?.find(l=>l.function.name==="web_search")&&e.push({googleSearch:{}});let r=[],s=n.messages.filter(l=>l.role==="tool");n.messages.filter(l=>l.role!=="tool").forEach(l=>{let a;l.role==="assistant"?a="model":(["user","system"].includes(l.role),a="user");let u=[];if(typeof l.content=="string"){let d={text:l.content};l.thinking?.signature&&(d.thoughtSignature=l.thinking.signature),u.push(d)}else Array.isArray(l.content)?u.push(...l.content.map(d=>{if(d.type==="text")return{text:d.text||""};if(d.type==="image_url")return d.image_url.url.startsWith("http")?{file_data:{mime_type:d.media_type,file_uri:d.image_url.url}}:{inlineData:{mime_type:d.media_type,data:d.image_url.url?.split(",")?.pop()||d.image_url.url}}})):l.content&&typeof l.content=="object"&&(l.content.text?u.push({text:l.content.text}):u.push({text:JSON.stringify(l.content)}));if(Array.isArray(l.tool_calls)&&u.push(...l.tool_calls.map(d=>{let m={functionCall:{id:d.id||`tool_${Math.random().toString(36).substring(2,15)}`,name:d.function.name,args:JSON.parse(d.function.arguments||"{}")}};return l.thinking?.signature&&(m.thoughtSignature=l.thinking.signature),m})),u.length===0&&u.push({text:""}),r.push({role:a,parts:u}),a==="model"&&l.tool_calls){let d=l.tool_calls.map(m=>{let f=s.find(y=>y.tool_call_id===m.id);return{functionResponse:{name:m?.function?.name,response:{result:f?.content}}}});r.push({role:"user",parts:d})}});let i={};if(n.reasoning&&n.reasoning.effort&&n.reasoning.effort!=="none")if(i.thinkingConfig={includeThoughts:!0},n.model.includes("gemini-3"))i.thinkingConfig.thinkingLevel=n.reasoning.effort;else{let l=n.model.includes("pro")?[128,32768]:[0,24576],a,u=n.reasoning.max_tokens;typeof u<"u"&&(u>=l[0]&&u<=l[1]?a=u:u<l[0]?a=l[0]:u>l[1]&&(a=l[1]),i.thinkingConfig.thinkingBudget=a)}let c={contents:r,tools:e.length?e:void 0,generationConfig:i};if(n.tool_choice){let l={functionCallingConfig:{}};n.tool_choice==="auto"?l.functionCallingConfig.mode="auto":n.tool_choice==="none"?l.functionCallingConfig.mode="none":n.tool_choice==="required"?l.functionCallingConfig.mode="any":n.tool_choice?.function?.name&&(l.functionCallingConfig.mode="any",l.functionCallingConfig.allowedFunctionNames=[n.tool_choice?.function?.name]),c.toolConfig=l}return c}function Sn(n){let e=n.contents,t=n.tools,o=n.model,r=n.max_tokens,s=n.temperature,i=n.stream,c=n.tool_choice,l={messages:[],model:o,max_tokens:r,temperature:s,stream:i,tool_choice:c};return Array.isArray(e)&&e.forEach(a=>{typeof a=="string"?l.messages.push({role:"user",content:a}):typeof a.text=="string"?l.messages.push({role:"user",content:a.text||null}):a.role==="user"?l.messages.push({role:"user",content:a?.parts?.map(u=>({type:"text",text:u.text||""}))||[]}):a.role==="model"&&l.messages.push({role:"assistant",content:a?.parts?.map(u=>({type:"text",text:u.text||""}))||[]})}),Array.isArray(t)&&(l.tools=[],t.forEach(a=>{Array.isArray(a.functionDeclarations)&&a.functionDeclarations.forEach(u=>{l.tools.push({type:"function",function:{name:u.name,description:u.description,parameters:u.parameters}})})})),l}async function Rn(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="",i=o.candidates[0]?.content?.parts||[],c=[];for(let d of i)d.text&&d.thought===!0?r+=d.text:c.push(d);s=i.find(d=>d.thoughtSignature)?.thoughtSignature;let l=c?.filter(d=>d.functionCall)?.map(d=>({id:d.functionCall?.id||`tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:d.functionCall?.name,arguments:JSON.stringify(d.functionCall?.args||{})}}))||[],a=c?.filter(d=>d.text)?.map(d=>d.text)?.join(`
113
+ `)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:a,role:"assistant",tool_calls:l.length>0?l: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,i=!1,c=!1,l="",a=0,u=-1,d=new ReadableStream({async start(m){let f=async(g,_)=>{if(g.startsWith("data: ")){let k=g.slice(6).trim();if(k){t?.debug({chunkStr:k},`${e} chunk:`);try{let h=JSON.parse(k);if(!h.candidates||!h.candidates[0]){t?.debug({chunkStr:k},"Invalid chunk structure");return}let b=h.candidates[0],T=b.content?.parts||[];T.filter(v=>v.text&&v.thought===!0).forEach(v=>{c||(c=!0);let E={choices:[{delta:{role:"assistant",content:null,thinking:{content:v.text}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(E)}
114
114
 
115
- `))});let x=T.find(C=>C.thoughtSignature)?.thoughtSignature;if(x&&!s){if(!l){let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:"(no content)"}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
115
+ `))});let x=T.find(v=>v.thoughtSignature)?.thoughtSignature;if(x&&!s){if(!c){let E={choices:[{delta:{role:"assistant",content:null,thinking:{content:"(no content)"}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(E)}
116
116
 
117
- `))}let C={choices:[{delta:{role:"assistant",content:null,thinking:{signature:x}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};if(_.enqueue(r.encode(`data: ${JSON.stringify(C)}
117
+ `))}let v={choices:[{delta:{role:"assistant",content:null,thinking:{signature:x}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};if(_.enqueue(r.encode(`data: ${JSON.stringify(v)}
118
118
 
119
- `)),s=!0,a++,c){let P={choices:[{delta:{role:"assistant",content:c},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
119
+ `)),s=!0,a++,l){let E={choices:[{delta:{role:"assistant",content:l},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(E)}
120
120
 
121
- `)),c="",i||(i=!0)}}let v=T.filter(C=>C.functionCall).map(C=>({id:C.functionCall?.id||`ccr_tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:C.functionCall?.name,arguments:JSON.stringify(C.functionCall?.args||{})}})),S=T.filter(C=>C.text&&C.thought!==!0).map(C=>C.text).join(`
122
- `);if(!S&&s&&!i){let C={choices:[{delta:{role:"assistant",content:"(no content)"},index:a,finish_reason:null,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(C)}
121
+ `)),l="",i||(i=!0)}}let C=T.filter(v=>v.functionCall).map(v=>({id:v.functionCall?.id||`ccr_tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:v.functionCall?.name,arguments:JSON.stringify(v.functionCall?.args||{})}})),S=T.filter(v=>v.text&&v.thought!==!0).map(v=>v.text).join(`
122
+ `);if(!S&&s&&!i){let v={choices:[{delta:{role:"assistant",content:"(no content)"},index:a,finish_reason:null,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(v)}
123
123
 
124
- `)),i||(i=!0)}if(l&&S&&!s)if(h.modelVersion.includes("3")){c+=S;return}else{let C={choices:[{delta:{role:"assistant",content:null,thinking:{signature:`ccr_${+new Date}`}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(C)}
124
+ `)),i||(i=!0)}if(c&&S&&!s)if(h.modelVersion.includes("3")){l+=S;return}else{let v={choices:[{delta:{role:"assistant",content:null,thinking:{signature:`ccr_${+new Date}`}},finish_reason:null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(v)}
125
125
 
126
- `)),s=!0}if(S){c||a++;let C={choices:[{delta:{role:"assistant",content:S},finish_reason:b.finishReason?.toLowerCase()||null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:h.usageMetadata?.candidatesTokenCount||0,prompt_tokens:h.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:h.usageMetadata?.cachedContentTokenCount||0},total_tokens:h.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:h.usageMetadata?.thoughtsTokenCount||0}}};b?.groundingMetadata?.groundingChunks?.length&&(C.choices[0].delta.annotations=b.groundingMetadata.groundingChunks.map((P,R)=>{let A=b?.groundingMetadata?.groundingSupports?.filter(O=>O.groundingChunkIndices?.includes(R));return{type:"url_citation",url_citation:{url:P?.web?.uri||"",title:P?.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(C)}
126
+ `)),s=!0}if(S){l||a++;let v={choices:[{delta:{role:"assistant",content:S},finish_reason:b.finishReason?.toLowerCase()||null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:h.usageMetadata?.candidatesTokenCount||0,prompt_tokens:h.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:h.usageMetadata?.cachedContentTokenCount||0},total_tokens:h.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:h.usageMetadata?.thoughtsTokenCount||0}}};b?.groundingMetadata?.groundingChunks?.length&&(v.choices[0].delta.annotations=b.groundingMetadata.groundingChunks.map((E,R)=>{let A=b?.groundingMetadata?.groundingSupports?.filter(O=>O.groundingChunkIndices?.includes(R));return{type:"url_citation",url_citation:{url:E?.web?.uri||"",title:E?.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(v)}
127
127
 
128
- `)),!i&&S&&(i=!0)}v.length>0&&(v.forEach(C=>{a++,u++;let P={choices:[{delta:{role:"assistant",tool_calls:[{...C,index:u}]},finish_reason:b.finishReason?.toLowerCase()||null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:h.usageMetadata?.candidatesTokenCount||0,prompt_tokens:h.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:h.usageMetadata?.cachedContentTokenCount||0},total_tokens:h.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:h.usageMetadata?.thoughtsTokenCount||0}}};b?.groundingMetadata?.groundingChunks?.length&&(P.choices[0].delta.annotations=b.groundingMetadata.groundingChunks.map((R,A)=>{let O=b?.groundingMetadata?.groundingSupports?.filter(I=>I.groundingChunkIndices?.includes(A));return{type:"url_citation",url_citation:{url:R?.web?.uri||"",title:R?.web?.title||"",content:O?.[0]?.segment?.text||"",start_index:O?.[0]?.segment?.startIndex||0,end_index:O?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(P)}
128
+ `)),!i&&S&&(i=!0)}C.length>0&&(C.forEach(v=>{a++,u++;let E={choices:[{delta:{role:"assistant",tool_calls:[{...v,index:u}]},finish_reason:b.finishReason?.toLowerCase()||null,index:a,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:h.responseId||"",model:h.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:h.usageMetadata?.candidatesTokenCount||0,prompt_tokens:h.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:h.usageMetadata?.cachedContentTokenCount||0},total_tokens:h.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:h.usageMetadata?.thoughtsTokenCount||0}}};b?.groundingMetadata?.groundingChunks?.length&&(E.choices[0].delta.annotations=b.groundingMetadata.groundingChunks.map((R,A)=>{let O=b?.groundingMetadata?.groundingSupports?.filter(I=>I.groundingChunkIndices?.includes(A));return{type:"url_citation",url_citation:{url:R?.web?.uri||"",title:R?.web?.title||"",content:O?.[0]?.segment?.text||"",start_index:O?.[0]?.segment?.startIndex||0,end_index:O?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(E)}
129
129
 
130
- `))}),!i&&S&&(i=!0))}catch(h){t?.error(`Error parsing ${e} stream chunk`,k,h.message)}}}},y=n.body.getReader(),p="";try{for(;;){let{done:f,value:_}=await y.read();if(f){p&&await m(p,g);break}p+=o.decode(_,{stream:!0});let k=p.split(`
131
- `);p=k.pop()||"";for(let h of k)await m(h,g)}}catch(f){g.error(f)}finally{g.close()}}});return new Response(d,{status:n.status,statusText:n.statusText,headers:n.headers})}}var et,Fo=w(()=>{"use strict";et={TYPE_UNSPECIFIED:"TYPE_UNSPECIFIED",STRING:"STRING",NUMBER:"NUMBER",INTEGER:"INTEGER",BOOLEAN:"BOOLEAN",ARRAY:"ARRAY",OBJECT:"OBJECT",NULL:"NULL"}});var Rn,Us=w(()=>{"use strict";Fo();Rn=class{name="gemini";endPoint="/v1beta/models/:modelAndAction";async transformRequestIn(e,t){return{body:vn(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=xn;async transformResponseOut(e){return Sn(e,this.name,this.logger)}}});async function Dc(){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:
130
+ `))}),!i&&S&&(i=!0))}catch(h){t?.error(`Error parsing ${e} stream chunk`,k,h.message)}}}},y=n.body.getReader(),p="";try{for(;;){let{done:g,value:_}=await y.read();if(g){p&&await f(p,m);break}p+=o.decode(_,{stream:!0});let k=p.split(`
131
+ `);p=k.pop()||"";for(let h of k)await f(h,m)}}catch(g){m.error(g)}finally{m.close()}}});return new Response(d,{status:n.status,statusText:n.statusText,headers:n.headers})}}var tt,Uo=w(()=>{"use strict";tt={TYPE_UNSPECIFIED:"TYPE_UNSPECIFIED",STRING:"STRING",NUMBER:"NUMBER",INTEGER:"INTEGER",BOOLEAN:"BOOLEAN",ARRAY:"ARRAY",OBJECT:"OBJECT",NULL:"NULL"}});var wn,zs=w(()=>{"use strict";Uo();wn=class{name="gemini";endPoint="/v1beta/models/:modelAndAction";async transformRequestIn(e,t){return{body:xn(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=Sn;async transformResponseOut(e){return Rn(e,this.name,this.logger)}}});async function Hc(){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:
132
132
  1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
133
133
  2. Run "gcloud auth application-default login"
134
- 3. Use Google Cloud environment with default service account`)}}var wn,js=w(()=>{"use strict";Fo();wn=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 l=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(l);c&&c.project_id&&(o=c.project_id)}catch(i){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",i)}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 Dc();return{body:vn(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 xn(e)}async transformResponseOut(e){return Sn(e,this.name)}}});var Pn,Hs=w(()=>{"use strict";Z();Pn=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,i=r.thinking?.signature,l="";if(typeof r.content=="string"){let a=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);a&&(l=a[1].trim(),r.content=r.content.replace(a[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,i&&(r.reasoning_content_signature=i)):l&&(r.reasoning_content=l),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,i="",l=new ReadableStream({async start(c){let a=e.body.getReader(),u=(g,m,y)=>{let p=g.split(`
135
- `);for(let f of p)f.trim()&&m.enqueue(y.encode(f+`
136
- `))},d=(g,m)=>{let{controller:y,encoder:p}=m;if(g.startsWith("data: ")&&g.trim()!=="data: [DONE]")try{let f=JSON.parse(g.slice(6));if(f.choices?.[0]?.delta?.reasoning_content){m.appendReasoningContent(f.choices[0].delta.reasoning_content);let _={...f,choices:[{...f.choices[0],delta:{...f.choices[0].delta,thinking:{content:f.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(_)}
134
+ 3. Use Google Cloud environment with default service account`)}}var Pn,Js=w(()=>{"use strict";Uo();Pn=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 c=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),l=JSON.parse(c);l&&l.project_id&&(o=l.project_id)}catch(i){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",i)}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 Hc();return{body:xn(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 Sn(e)}async transformResponseOut(e){return Rn(e,this.name)}}});var En,Bs=w(()=>{"use strict";Z();En=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,i=r.thinking?.signature,c="";if(typeof r.content=="string"){let a=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);a&&(c=a[1].trim(),r.content=r.content.replace(a[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,i&&(r.reasoning_content_signature=i)):c&&(r.reasoning_content=c),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,i="",c=new ReadableStream({async start(l){let a=e.body.getReader(),u=(m,f,y)=>{let p=m.split(`
135
+ `);for(let g of p)g.trim()&&f.enqueue(y.encode(g+`
136
+ `))},d=(m,f)=>{let{controller:y,encoder:p}=f;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]")try{let g=JSON.parse(m.slice(6));if(g.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(g.choices[0].delta.reasoning_content);let _={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(_)}
137
137
 
138
- `;y.enqueue(p.encode(k));return}if(f.choices?.[0]?.delta?.content&&m.reasoningContent()&&!m.isReasoningComplete()){m.setReasoningComplete(!0);let _="ccr_think_signature",k=f.choices[0].delta.content,h={...f,choices:[{...f.choices[0],delta:{...f.choices[0].delta,content:null,thinking:{content:m.reasoningContent(),signature:_}}}]};delete h.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(h)}
138
+ `;y.enqueue(p.encode(k));return}if(g.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",k=g.choices[0].delta.content,h={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete h.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(h)}
139
139
 
140
- `;y.enqueue(p.encode(b));let T={...f,choices:[{...f.choices[0],delta:{...f.choices[0].delta,content:k}}]};delete T.choices[0].delta.reasoning_content;let x=`data: ${JSON.stringify(T)}
140
+ `;y.enqueue(p.encode(b));let T={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:k}}]};delete T.choices[0].delta.reasoning_content;let x=`data: ${JSON.stringify(T)}
141
141
 
142
- `;y.enqueue(p.encode(x));return}if(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){let _=`data: ${JSON.stringify(f)}
142
+ `;y.enqueue(p.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 _=`data: ${JSON.stringify(g)}
143
143
 
144
- `;y.enqueue(p.encode(_))}}catch{y.enqueue(p.encode(g+`
145
- `))}else y.enqueue(p.encode(g+`
146
- `))};try{for(;;){let{done:g,value:m}=await a.read();if(g){i.trim()&&u(i,c,o);break}let y=t.decode(m,{stream:!0});i+=y;let p=i.split(`
147
- `);i=p.pop()||"";for(let f of p)if(f.trim())try{d(f,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",f,_),c.enqueue(o.encode(f+`
148
- `))}}}catch(g){console.error("Stream error:",g),c.error(g)}finally{try{a.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}c.close()}}});return new Response(l,{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 En,zs=w(()=>{"use strict";Z();En=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.
144
+ `;y.enqueue(p.encode(_))}}catch{y.enqueue(p.encode(m+`
145
+ `))}else y.enqueue(p.encode(m+`
146
+ `))};try{for(;;){let{done:m,value:f}=await a.read();if(m){i.trim()&&u(i,l,o);break}let y=t.decode(f,{stream:!0});i+=y;let p=i.split(`
147
+ `);i=p.pop()||"";for(let g of p)if(g.trim())try{d(g,{controller:l,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",g,_),l.enqueue(o.encode(g+`
148
+ `))}}}catch(m){console.error("Stream error:",m),l.error(m)}finally{try{a.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":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var On,Ws=w(()=>{"use strict";Z();On=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.
149
149
  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.
150
150
  Examples:
151
151
  1. Task: "Use a tool to summarize this document" \u2014 Do not use ExitTool if a summarization tool is available.
152
- 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="",i="",l=new ReadableStream({async start(c){let a=e.body.getReader(),u=(g,m,y)=>{let p=g.split(`
153
- `);for(let f of p)f.trim()&&m.enqueue(y.encode(f+`
154
- `))},d=(g,m)=>{let{controller:y,encoder:p,exitToolIndex:f,setExitToolIndex:_,appendExitToolResponse:k}=m;if(g.startsWith("data: ")&&g.trim()!=="data: [DONE]")try{let h=JSON.parse(g.slice(6));if(h.choices[0]?.delta?.tool_calls?.length){let b=h.choices[0].delta.tool_calls[0];if(b.function?.name==="ExitTool"){_(b.index);return}else if(f()>-1&&b.index===f()&&b.function.arguments){k(b.function.arguments);try{let T=JSON.parse(m.exitToolResponse());h.choices=[{delta:{role:"assistant",content:T.response||""}}];let x=`data: ${JSON.stringify(h)}
152
+ 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="",i="",c=new ReadableStream({async start(l){let a=e.body.getReader(),u=(m,f,y)=>{let p=m.split(`
153
+ `);for(let g of p)g.trim()&&f.enqueue(y.encode(g+`
154
+ `))},d=(m,f)=>{let{controller:y,encoder:p,exitToolIndex:g,setExitToolIndex:_,appendExitToolResponse:k}=f;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]")try{let h=JSON.parse(m.slice(6));if(h.choices[0]?.delta?.tool_calls?.length){let b=h.choices[0].delta.tool_calls[0];if(b.function?.name==="ExitTool"){_(b.index);return}else if(g()>-1&&b.index===g()&&b.function.arguments){k(b.function.arguments);try{let T=JSON.parse(f.exitToolResponse());h.choices=[{delta:{role:"assistant",content:T.response||""}}];let x=`data: ${JSON.stringify(h)}
155
155
 
156
156
  `;y.enqueue(p.encode(x))}catch{}return}}if(h.choices?.[0]?.delta&&Object.keys(h.choices[0].delta).length>0){let b=`data: ${JSON.stringify(h)}
157
157
 
158
- `;y.enqueue(p.encode(b))}}catch{y.enqueue(p.encode(g+`
159
- `))}else y.enqueue(p.encode(g+`
160
- `))};try{for(;;){let{done:g,value:m}=await a.read();if(g){i.trim()&&u(i,c,o);break}let y=t.decode(m,{stream:!0});i+=y;let p=i.split(`
161
- `);i=p.pop()||"";for(let f of p)if(f.trim())try{d(f,{controller:c,encoder:o,exitToolIndex:()=>r,setExitToolIndex:_=>r=_,exitToolResponse:()=>s,appendExitToolResponse:_=>s+=_})}catch(_){console.error("Error processing line:",f,_),c.enqueue(o.encode(f+`
162
- `))}}}catch(g){console.error("Stream error:",g),c.error(g)}finally{try{a.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}c.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 Js,On,Bs=w(()=>{"use strict";Z();Js=require("uuid"),On=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="",i=!1,l=!1,c="",a=new ReadableStream({async start(u){let d=e.body.getReader(),g=(y,p,f)=>{let _=y.split(`
163
- `);for(let k of _)k.trim()&&p.enqueue(f.encode(k+`
164
- `))},m=(y,p)=>{let{controller:f,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]"){let k=y.slice(6);try{let h=JSON.parse(k);if(h.usage&&(this.logger?.debug({usage:h.usage,hasToolCall:l},"usage"),h.choices[0].finish_reason=l?"tool_calls":"stop"),h.choices?.[0]?.finish_reason==="error"){f.enqueue(_.encode(`data: ${JSON.stringify({error:h.choices?.[0].error})}
165
-
166
- `));return}h.choices?.[0]?.delta?.content&&!p.hasTextContent()&&p.setHasTextContent(!0);let b=h.choices?.[0]?.delta?.reasoning||h.choices?.[0]?.delta?.reasoning_content;if(b){p.appendReasoningContent(b);let C={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,thinking:{content:b}}}]};C.choices?.[0]?.delta&&(delete C.choices[0].delta.reasoning,delete C.choices[0].delta.reasoning_content);let P=`data: ${JSON.stringify(C)}
167
-
168
- `;f.enqueue(_.encode(P));return}if(h.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let C="ccr_think_signature",P=h.choices[0].delta.content,R={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:C}}}]};R.choices?.[0]?.delta&&delete R.choices[0].delta.reasoning;let A=`data: ${JSON.stringify(R)}
169
-
170
- `;f.enqueue(_.encode(A));let O={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:P}}]};O.choices?.[0]?.delta&&(delete O.choices[0].delta.reasoning,delete O.choices[0].delta.reasoning_content);let I=`data: ${JSON.stringify(O)}
171
-
172
- `;f.enqueue(_.encode(I));return}h.choices?.[0]?.delta?.reasoning&&delete h.choices[0].delta.reasoning,h.choices?.[0]?.delta?.reasoning_content&&delete h.choices[0].delta.reasoning_content,h.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(h.choices?.[0]?.delta?.tool_calls[0].id,10))&&h.choices?.[0]?.delta?.tool_calls.forEach(C=>{C.id=`call_${(0,Js.v4)()}`}),h.choices?.[0]?.delta?.tool_calls?.length&&!l&&(l=!0);let T=h.choices?.[0]?.delta,x=T&&Object.keys(T).length>0,v=h.choices?.[0]?.finish_reason,S=h.usage;if(x||v||S){let C=`data: ${JSON.stringify(h)}
173
-
174
- `;f.enqueue(_.encode(C))}}catch{f.enqueue(_.encode(y+`
175
- `))}}else f.enqueue(_.encode(y+`
176
- `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){c.trim()&&g(c,u,o);break}if(!p||p.length===0)continue;let f;try{f=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(f.length===0)continue;if(c+=f,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=c.split(`
177
- `);c=k.pop()||"";for(let h of k)if(h.trim())try{m(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
178
- `))}continue}let _=c.split(`
179
- `);c=_.pop()||"";for(let k of _)if(k.trim())try{m(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
180
- `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var An,Ws=w(()=>{"use strict";An=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 Gs,In,Ks=w(()=>{"use strict";Z();Gs=require("uuid"),In=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="",i=!1,l="",c=new ReadableStream({async start(a){let u=e.body.getReader(),d=(m,y,p)=>{let f=m.split(`
181
- `);for(let _ of f)_.trim()&&y.enqueue(p.encode(_+`
182
- `))},g=(m,y)=>{let{controller:p,encoder:f}=y;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]"){let _=m.slice(6);try{let k=JSON.parse(_);if(k.error)throw new Error(JSON.stringify(k));k.choices?.[0]?.delta?.content&&!y.hasTextContent()&&y.setHasTextContent(!0),k.choices?.[0]?.delta?.tool_calls?.length&&k.choices?.[0]?.delta?.tool_calls.forEach(b=>{b.id=`call_${(0,Gs.v4)()}`}),k.choices?.[0]?.delta?.tool_calls?.length&&y.hasTextContent()&&(typeof k.choices[0].index=="number"?k.choices[0].index+=1:k.choices[0].index=1);let h=`data: ${JSON.stringify(k)}
183
-
184
- `;p.enqueue(f.encode(h))}catch{p.enqueue(f.encode(m+`
185
- `))}}else p.enqueue(f.encode(m+`
186
- `))};try{for(;;){let{done:m,value:y}=await u.read();if(m){l.trim()&&d(l,a,o);break}if(!y||y.length===0)continue;let p;try{p=t.decode(y,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(p.length===0)continue;if(l+=p,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=l.split(`
187
- `);l=_.pop()||"";for(let k of _)if(k.trim())try{g(k,{controller:a,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),a.enqueue(o.encode(k+`
188
- `))}continue}let f=l.split(`
189
- `);l=f.pop()||"";for(let _ of f)if(_.trim())try{g(_,{controller:a,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>i,setReasoningComplete:k=>i=k})}catch(k){console.error("Error processing line:",_,k),a.enqueue(o.encode(_+`
190
- `))}}}catch(m){console.error("Stream error:",m),a.error(m)}finally{try{u.releaseLock()}catch(m){console.error("Error releasing reader lock:",m)}a.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 Mn,Qs=w(()=>{"use strict";Mn=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 Uo(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=Vs.default.parse(n);return e?.debug("Tool arguments JSON5 parsing successful"),JSON.stringify(o)}catch(o){try{let r=(0,Ys.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 Vs,Ys,Xs=w(()=>{Vs=X(require("json5")),Ys=require("jsonrepair")});var $n,qs=w(()=>{"use strict";Xs();Z();$n=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=Uo(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,i="",l=!1,c=!1,a="",u=new ReadableStream({async start(d){let g=e.body.getReader(),m=(f,_,k)=>{let h=f.split(`
158
+ `;y.enqueue(p.encode(b))}}catch{y.enqueue(p.encode(m+`
159
+ `))}else y.enqueue(p.encode(m+`
160
+ `))};try{for(;;){let{done:m,value:f}=await a.read();if(m){i.trim()&&u(i,l,o);break}let y=t.decode(f,{stream:!0});i+=y;let p=i.split(`
161
+ `);i=p.pop()||"";for(let g of p)if(g.trim())try{d(g,{controller:l,encoder:o,exitToolIndex:()=>r,setExitToolIndex:_=>r=_,exitToolResponse:()=>s,appendExitToolResponse:_=>s+=_})}catch(_){console.error("Error processing line:",g,_),l.enqueue(o.encode(g+`
162
+ `))}}}catch(m){console.error("Stream error:",m),l.error(m)}finally{try{a.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 Gs,An,Ks=w(()=>{"use strict";Z();Gs=require("uuid"),An=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="",i=!1,c=!1,l="",a=new ReadableStream({async start(u){let d=e.body.getReader(),m=(y,p,g)=>{let _=y.split(`
163
+ `);for(let k of _)k.trim()&&p.enqueue(g.encode(k+`
164
+ `))},f=(y,p)=>{let{controller:g,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]"){let k=y.slice(6);try{let h=JSON.parse(k);if(h.usage&&(this.logger?.debug({usage:h.usage,hasToolCall:c},"usage"),h.choices[0].finish_reason=c?"tool_calls":"stop"),h.choices?.[0]?.finish_reason==="error"){g.enqueue(_.encode(`data: ${JSON.stringify({error:h.choices?.[0].error})}
165
+
166
+ `));return}h.choices?.[0]?.delta?.content&&!p.hasTextContent()&&p.setHasTextContent(!0);let b=h.choices?.[0]?.delta?.reasoning||h.choices?.[0]?.delta?.reasoning_content;if(b){p.appendReasoningContent(b);let v={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,thinking:{content:b}}}]};v.choices?.[0]?.delta&&(delete v.choices[0].delta.reasoning,delete v.choices[0].delta.reasoning_content);let E=`data: ${JSON.stringify(v)}
167
+
168
+ `;g.enqueue(_.encode(E));return}if(h.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let v="ccr_think_signature",E=h.choices[0].delta.content,R={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:v}}}]};R.choices?.[0]?.delta&&delete R.choices[0].delta.reasoning;let A=`data: ${JSON.stringify(R)}
169
+
170
+ `;g.enqueue(_.encode(A));let O={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:E}}]};O.choices?.[0]?.delta&&(delete O.choices[0].delta.reasoning,delete O.choices[0].delta.reasoning_content);let I=`data: ${JSON.stringify(O)}
171
+
172
+ `;g.enqueue(_.encode(I));return}h.choices?.[0]?.delta?.reasoning&&delete h.choices[0].delta.reasoning,h.choices?.[0]?.delta?.reasoning_content&&delete h.choices[0].delta.reasoning_content,h.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(h.choices?.[0]?.delta?.tool_calls[0].id,10))&&h.choices?.[0]?.delta?.tool_calls.forEach(v=>{v.id=`call_${(0,Gs.v4)()}`}),h.choices?.[0]?.delta?.tool_calls?.length&&!c&&(c=!0);let T=h.choices?.[0]?.delta,x=T&&Object.keys(T).length>0,C=h.choices?.[0]?.finish_reason,S=h.usage;if(x||C||S){let v=`data: ${JSON.stringify(h)}
173
+
174
+ `;g.enqueue(_.encode(v))}}catch{g.enqueue(_.encode(y+`
175
+ `))}}else g.enqueue(_.encode(y+`
176
+ `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){l.trim()&&m(l,u,o);break}if(!p||p.length===0)continue;let g;try{g=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(g.length===0)continue;if(l+=g,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
177
+ `);l=k.pop()||"";for(let h of k)if(h.trim())try{f(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
178
+ `))}continue}let _=l.split(`
179
+ `);l=_.pop()||"";for(let k of _)if(k.trim())try{f(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
180
+ `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var In,Qs=w(()=>{"use strict";In=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 Vs,Mn,Ys=w(()=>{"use strict";Z();Vs=require("uuid"),Mn=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="",i=!1,c="",l=new ReadableStream({async start(a){let u=e.body.getReader(),d=(f,y,p)=>{let g=f.split(`
181
+ `);for(let _ of g)_.trim()&&y.enqueue(p.encode(_+`
182
+ `))},m=(f,y)=>{let{controller:p,encoder:g}=y;if(f.startsWith("data: ")&&f.trim()!=="data: [DONE]"){let _=f.slice(6);try{let k=JSON.parse(_);if(k.error)throw new Error(JSON.stringify(k));k.choices?.[0]?.delta?.content&&!y.hasTextContent()&&y.setHasTextContent(!0),k.choices?.[0]?.delta?.tool_calls?.length&&k.choices?.[0]?.delta?.tool_calls.forEach(b=>{b.id=`call_${(0,Vs.v4)()}`}),k.choices?.[0]?.delta?.tool_calls?.length&&y.hasTextContent()&&(typeof k.choices[0].index=="number"?k.choices[0].index+=1:k.choices[0].index=1);let h=`data: ${JSON.stringify(k)}
183
+
184
+ `;p.enqueue(g.encode(h))}catch{p.enqueue(g.encode(f+`
185
+ `))}}else p.enqueue(g.encode(f+`
186
+ `))};try{for(;;){let{done:f,value:y}=await u.read();if(f){c.trim()&&d(c,a,o);break}if(!y||y.length===0)continue;let p;try{p=t.decode(y,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(p.length===0)continue;if(c+=p,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=c.split(`
187
+ `);c=_.pop()||"";for(let k of _)if(k.trim())try{m(k,{controller:a,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),a.enqueue(o.encode(k+`
188
+ `))}continue}let g=c.split(`
189
+ `);c=g.pop()||"";for(let _ of g)if(_.trim())try{m(_,{controller:a,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>i,setReasoningComplete:k=>i=k})}catch(k){console.error("Error processing line:",_,k),a.enqueue(o.encode(_+`
190
+ `))}}}catch(f){console.error("Stream error:",f),a.error(f)}finally{try{u.releaseLock()}catch(f){console.error("Error releasing reader lock:",f)}a.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 $n,Xs=w(()=>{"use strict";$n=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 jo(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=qs.default.parse(n);return e?.debug("Tool arguments JSON5 parsing successful"),JSON.stringify(o)}catch(o){try{let r=(0,Zs.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 qs,Zs,ei=w(()=>{qs=X(require("json5")),Zs=require("jsonrepair")});var Nn,ti=w(()=>{"use strict";ei();Z();Nn=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=jo(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,i="",c=!1,l=!1,a="",u=new ReadableStream({async start(d){let m=e.body.getReader(),f=(g,_,k)=>{let h=g.split(`
191
191
  `);for(let b of h)b.trim()&&_.enqueue(k.encode(b+`
192
- `))},y=(f,_,k)=>{let h="";try{h=Uo(r.arguments||"",this.logger)}catch(v){console.error(`${v.message} ${v.stack} \u5DE5\u5177\u8C03\u7528\u53C2\u6570\u89E3\u6790\u5931\u8D25: ${JSON.stringify(r)}`),h=r.arguments||""}let b={role:"assistant",tool_calls:[{function:{name:r.name,arguments:h},id:r.id,index:r.index,type:"function"}]},T={...f,choices:[{...f.choices[0],delta:b}]};T.choices[0].delta.content!==void 0&&delete T.choices[0].delta.content;let x=`data: ${JSON.stringify(T)}
192
+ `))},y=(g,_,k)=>{let h="";try{h=jo(r.arguments||"",this.logger)}catch(C){console.error(`${C.message} ${C.stack} \u5DE5\u5177\u8C03\u7528\u53C2\u6570\u89E3\u6790\u5931\u8D25: ${JSON.stringify(r)}`),h=r.arguments||""}let b={role:"assistant",tool_calls:[{function:{name:r.name,arguments:h},id:r.id,index:r.index,type:"function"}]},T={...g,choices:[{...g.choices[0],delta:b}]};T.choices[0].delta.content!==void 0&&delete T.choices[0].delta.content;let x=`data: ${JSON.stringify(T)}
193
193
 
194
- `;_.enqueue(k.encode(x))},p=(f,_)=>{let{controller:k,encoder:h}=_;if(f.startsWith("data: ")&&f.trim()!=="data: [DONE]"){let b=f.slice(6);try{let T=JSON.parse(b);if(T.choices?.[0]?.delta?.tool_calls?.length){let v=T.choices[0].delta.tool_calls[0];if(typeof r.index>"u"){r={index:v.index,name:v.function?.name||"",id:v.id||"",arguments:v.function?.arguments||""},v.function?.arguments&&(v.function.arguments="");let S=`data: ${JSON.stringify(T)}
194
+ `;_.enqueue(k.encode(x))},p=(g,_)=>{let{controller:k,encoder:h}=_;if(g.startsWith("data: ")&&g.trim()!=="data: [DONE]"){let b=g.slice(6);try{let T=JSON.parse(b);if(T.choices?.[0]?.delta?.tool_calls?.length){let C=T.choices[0].delta.tool_calls[0];if(typeof r.index>"u"){r={index:C.index,name:C.function?.name||"",id:C.id||"",arguments:C.function?.arguments||""},C.function?.arguments&&(C.function.arguments="");let S=`data: ${JSON.stringify(T)}
195
195
 
196
- `;k.enqueue(h.encode(S));return}else if(r.index===v.index){v.function?.arguments&&(r.arguments+=v.function.arguments);return}else{y(T,k,h),r={index:v.index,name:v.function?.name||"",id:v.id||"",arguments:v.function?.arguments||""};return}}if(T.choices?.[0]?.finish_reason==="tool_calls"&&r.index!==void 0){y(T,k,h),r={};return}T.choices?.[0]?.delta?.tool_calls?.length&&_.hasTextContent()&&(typeof T.choices[0].index=="number"?T.choices[0].index+=1:T.choices[0].index=1);let x=`data: ${JSON.stringify(T)}
196
+ `;k.enqueue(h.encode(S));return}else if(r.index===C.index){C.function?.arguments&&(r.arguments+=C.function.arguments);return}else{y(T,k,h),r={index:C.index,name:C.function?.name||"",id:C.id||"",arguments:C.function?.arguments||""};return}}if(T.choices?.[0]?.finish_reason==="tool_calls"&&r.index!==void 0){y(T,k,h),r={};return}T.choices?.[0]?.delta?.tool_calls?.length&&_.hasTextContent()&&(typeof T.choices[0].index=="number"?T.choices[0].index+=1:T.choices[0].index=1);let x=`data: ${JSON.stringify(T)}
197
197
 
198
- `;k.enqueue(h.encode(x))}catch{k.enqueue(h.encode(f+`
199
- `))}}else k.enqueue(h.encode(f+`
200
- `))};try{for(;;){let{done:f,value:_}=await g.read();if(f){a.trim()&&m(a,d,o);break}if(!_||_.length===0)continue;let k;try{k=t.decode(_,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(k.length===0)continue;if(a+=k,a.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=a.split(`
201
- `);a=b.pop()||"";for(let T of b)if(T.trim())try{p(T,{controller:d,encoder:o,hasTextContent:()=>s,setHasTextContent:x=>s=x,reasoningContent:()=>i,appendReasoningContent:x=>i+=x,isReasoningComplete:()=>l,setReasoningComplete:x=>l=x})}catch(x){console.error("Error processing line:",T,x),d.enqueue(o.encode(T+`
198
+ `;k.enqueue(h.encode(x))}catch{k.enqueue(h.encode(g+`
199
+ `))}}else k.enqueue(h.encode(g+`
200
+ `))};try{for(;;){let{done:g,value:_}=await m.read();if(g){a.trim()&&f(a,d,o);break}if(!_||_.length===0)continue;let k;try{k=t.decode(_,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(k.length===0)continue;if(a+=k,a.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=a.split(`
201
+ `);a=b.pop()||"";for(let T of b)if(T.trim())try{p(T,{controller:d,encoder:o,hasTextContent:()=>s,setHasTextContent:x=>s=x,reasoningContent:()=>i,appendReasoningContent:x=>i+=x,isReasoningComplete:()=>c,setReasoningComplete:x=>c=x})}catch(x){console.error("Error processing line:",T,x),d.enqueue(o.encode(T+`
202
202
  `))}continue}let h=a.split(`
203
- `);a=h.pop()||"";for(let b of h)if(b.trim())try{p(b,{controller:d,encoder:o,hasTextContent:()=>s,setHasTextContent:T=>s=T,reasoningContent:()=>i,appendReasoningContent:T=>i+=T,isReasoningComplete:()=>l,setReasoningComplete:T=>l=T})}catch(T){console.error("Error processing line:",b,T),d.enqueue(o.encode(b+`
204
- `))}}}catch(f){console.error("Stream error:",f),d.error(f)}finally{try{g.releaseLock()}catch(f){console.error("Error releasing reader lock:",f)}d.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 Nn,Zs=w(()=>{"use strict";Z();Nn=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},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,i="",l=new ReadableStream({async start(c){let a=e.body.getReader(),u=(g,m,y)=>{let p=g.split(`
205
- `);for(let f of p)f.trim()&&m.enqueue(y.encode(f+`
206
- `))},d=(g,m)=>{let{controller:y,encoder:p}=m;if(this.logger?.debug({line:g},"Processing reason line"),g.startsWith("data: ")&&g.trim()!=="data: [DONE]")try{let f=JSON.parse(g.slice(6));if(console.log(JSON.stringify(f)),f.choices?.[0]?.delta?.reasoning_content){m.appendReasoningContent(f.choices[0].delta.reasoning_content);let _={...f,choices:[{...f.choices[0],delta:{...f.choices[0].delta,thinking:{content:f.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(_)}
203
+ `);a=h.pop()||"";for(let b of h)if(b.trim())try{p(b,{controller:d,encoder:o,hasTextContent:()=>s,setHasTextContent:T=>s=T,reasoningContent:()=>i,appendReasoningContent:T=>i+=T,isReasoningComplete:()=>c,setReasoningComplete:T=>c=T})}catch(T){console.error("Error processing line:",b,T),d.enqueue(o.encode(b+`
204
+ `))}}}catch(g){console.error("Stream error:",g),d.error(g)}finally{try{m.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}d.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 Ln,ni=w(()=>{"use strict";Z();Ln=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},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,i="",c=new ReadableStream({async start(l){let a=e.body.getReader(),u=(m,f,y)=>{let p=m.split(`
205
+ `);for(let g of p)g.trim()&&f.enqueue(y.encode(g+`
206
+ `))},d=(m,f)=>{let{controller:y,encoder:p}=f;if(this.logger?.debug({line:m},"Processing reason line"),m.startsWith("data: ")&&m.trim()!=="data: [DONE]")try{let g=JSON.parse(m.slice(6));if(console.log(JSON.stringify(g)),g.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(g.choices[0].delta.reasoning_content);let _={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(_)}
207
207
 
208
- `;y.enqueue(p.encode(k));return}if(f.choices?.[0]?.delta?.content&&m.reasoningContent()&&!m.isReasoningComplete()){m.setReasoningComplete(!0);let _="ccr_think_signature",k=f.choices[0].delta.content,h={...f,choices:[{...f.choices[0],delta:{...f.choices[0].delta,content:null,thinking:{content:m.reasoningContent(),signature:_}}}]};delete h.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(h)}
208
+ `;y.enqueue(p.encode(k));return}if(g.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",k=g.choices[0].delta.content,h={...g,choices:[{...g.choices[0],delta:{...g.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete h.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(h)}
209
209
 
210
- `;y.enqueue(p.encode(b))}if(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){m.isReasoningComplete()&&f.choices[0].index++;let _=`data: ${JSON.stringify(f)}
210
+ `;y.enqueue(p.encode(b))}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){f.isReasoningComplete()&&g.choices[0].index++;let _=`data: ${JSON.stringify(g)}
211
211
 
212
- `;y.enqueue(p.encode(_))}}catch{y.enqueue(p.encode(g+`
213
- `))}else y.enqueue(p.encode(g+`
214
- `))};try{for(;;){let{done:g,value:m}=await a.read();if(g){i.trim()&&u(i,c,o);break}let y=t.decode(m,{stream:!0});i+=y;let p=i.split(`
215
- `);i=p.pop()||"";for(let f of p)if(f.trim())try{d(f,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",f,_),c.enqueue(o.encode(f+`
216
- `))}}}catch(g){console.error("Stream error:",g),c.error(g)}finally{try{a.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}c.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 Ln,ei=w(()=>{"use strict";Ln=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 Dn,ti=w(()=>{"use strict";Dn=class{static TransformerName="maxcompletiontokens";async transformRequestIn(e){return e.max_tokens&&(e.max_completion_tokens=e.max_tokens,delete e.max_tokens),e}}});function ni(n){let e=[];for(let o=0;o<n.messages.length;o++){let r=n.messages[o],s=o===n.messages.length-1,i=r.role==="assistant",l=[];typeof r.content=="string"?l.push({type:"text",text:r.content}):Array.isArray(r.content)&&r.content.forEach(c=>{c.type==="text"?l.push({type:"text",text:c.text||""}):c.type==="image_url"&&l.push({type:"image",source:{type:"base64",media_type:c.media_type||"image/jpeg",data:c.image_url.url}})}),!(!s&&l.length===0&&!r.tool_calls&&!r.content)&&(s&&i&&l.length===0&&r.tool_calls&&l.push({type:"text",text:""}),e.push({role:r.role==="assistant"?"assistant":"user",content:l}))}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 oi(n){let e=n,o={messages:e.messages.map(r=>{let s=r.content.map(i=>i.type==="text"?{type:"text",text:i.text||""}:i.type==="image"&&i.source?{type:"image_url",image_url:{url:i.source.data},media_type:i.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 ri(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(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.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=(l,c)=>{if(l.startsWith("data: ")){let a=l.slice(6).trim();if(a){t?.debug({chunkStr:a},`${e} chunk:`);try{let u=JSON.parse(a);if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"){let d={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(d)}
212
+ `;y.enqueue(p.encode(_))}}catch{y.enqueue(p.encode(m+`
213
+ `))}else y.enqueue(p.encode(m+`
214
+ `))};try{for(;;){let{done:m,value:f}=await a.read();if(m){i.trim()&&u(i,l,o);break}let y=t.decode(f,{stream:!0});i+=y;let p=i.split(`
215
+ `);i=p.pop()||"";for(let g of p)if(g.trim())try{d(g,{controller:l,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",g,_),l.enqueue(o.encode(g+`
216
+ `))}}}catch(m){console.error("Stream error:",m),l.error(m)}finally{try{a.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 Dn,oi=w(()=>{"use strict";Dn=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 Fn,ri=w(()=>{"use strict";Fn=class{static TransformerName="maxcompletiontokens";async transformRequestIn(e){return e.max_tokens&&(e.max_completion_tokens=e.max_tokens,delete e.max_tokens),e}}});function si(n){let e=[];for(let o=0;o<n.messages.length;o++){let r=n.messages[o],s=o===n.messages.length-1,i=r.role==="assistant",c=[];typeof r.content=="string"?c.push({type:"text",text:r.content}):Array.isArray(r.content)&&r.content.forEach(l=>{l.type==="text"?c.push({type:"text",text:l.text||""}):l.type==="image_url"&&c.push({type:"image",source:{type:"base64",media_type:l.media_type||"image/jpeg",data:l.image_url.url}})}),!(!s&&c.length===0&&!r.tool_calls&&!r.content)&&(s&&i&&c.length===0&&r.tool_calls&&c.push({type:"text",text:""}),e.push({role:r.role==="assistant"?"assistant":"user",content:c}))}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 ii(n){let e=n,o={messages:e.messages.map(r=>{let s=r.content.map(i=>i.type==="text"?{type:"text",text:i.text||""}:i.type==="image"&&i.source?{type:"image_url",image_url:{url:i.source.data},media_type:i.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 ai(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(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.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=(c,l)=>{if(c.startsWith("data: ")){let a=c.slice(6).trim();if(a){t?.debug({chunkStr:a},`${e} chunk:`);try{let u=JSON.parse(a);if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"){let d={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)}};l.enqueue(r.encode(`data: ${JSON.stringify(d)}
217
217
 
218
- `))}else if(u.type==="content_block_delta"&&u.delta?.type==="input_json_delta"){let d={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(d)}
218
+ `))}else if(u.type==="content_block_delta"&&u.delta?.type==="input_json_delta"){let d={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)}};l.enqueue(r.encode(`data: ${JSON.stringify(d)}
219
219
 
220
- `))}else if(u.type==="content_block_start"&&u.content_block?.type==="tool_use"){let d={choices:[{delta:{tool_calls:[{index:u.index||0,id:u.content_block.id,type:"function",function:{name:u.content_block.name,arguments:""}}]},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(d)}
220
+ `))}else if(u.type==="content_block_start"&&u.content_block?.type==="tool_use"){let d={choices:[{delta:{tool_calls:[{index:u.index||0,id:u.content_block.id,type:"function",function:{name:u.content_block.name,arguments:""}}]},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)}};l.enqueue(r.encode(`data: ${JSON.stringify(d)}
221
221
 
222
- `))}else if(u.type==="message_delta"){let d={choices:[{delta:{},finish_reason:u.delta?.stop_reason==="tool_use"?"tool_calls":u.delta?.stop_reason==="max_tokens"?"length":u.delta?.stop_reason==="stop_sequence"?"content_filter":"stop",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(d)}
222
+ `))}else if(u.type==="message_delta"){let d={choices:[{delta:{},finish_reason:u.delta?.stop_reason==="tool_use"?"tool_calls":u.delta?.stop_reason==="max_tokens"?"length":u.delta?.stop_reason==="stop_sequence"?"content_filter":"stop",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)}};l.enqueue(r.encode(`data: ${JSON.stringify(d)}
223
223
 
224
- `))}else if(u.type==="message_stop")c.enqueue(r.encode(`data: [DONE]
224
+ `))}else if(u.type==="message_stop")l.enqueue(r.encode(`data: [DONE]
225
225
 
226
- `));else{let d={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(d)}
226
+ `));else{let d={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)}};l.enqueue(r.encode(`data: ${JSON.stringify(d)}
227
227
 
228
- `))}}catch(u){t?.error(`Error parsing ${e} stream chunk`,a,u.message)}}}},i=new ReadableStream({async start(l){let c=n.body.getReader(),a="";try{for(;;){let{done:u,value:d}=await c.read();if(u){a&&s(a,l);break}a+=o.decode(d,{stream:!0});let g=a.split(`
229
- `);a=g.pop()||"";for(let m of g)s(m,l)}}catch(u){l.error(u)}finally{l.close()}}});return new Response(i,{status:n.status,statusText:n.statusText,headers:n.headers})}return n}var si=w(()=>{"use strict"});async function Fc(){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:
228
+ `))}}catch(u){t?.error(`Error parsing ${e} stream chunk`,a,u.message)}}}},i=new ReadableStream({async start(c){let l=n.body.getReader(),a="";try{for(;;){let{done:u,value:d}=await l.read();if(u){a&&s(a,c);break}a+=o.decode(d,{stream:!0});let m=a.split(`
229
+ `);a=m.pop()||"";for(let f of m)s(f,c)}}catch(u){c.error(u)}finally{c.close()}}});return new Response(i,{status:n.status,statusText:n.statusText,headers:n.headers})}return n}var ci=w(()=>{"use strict"});async function zc(){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:
230
230
  1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
231
231
  2. Run "gcloud auth application-default login"
232
- 3. Use Google Cloud environment with default service account`)}}var Fn,ii=w(()=>{"use strict";si();Fn=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 l=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(l);c&&c.project_id&&(o=c.project_id)}catch(i){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",i)}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 Fc();return{body:ni(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 oi(e)}async transformResponseOut(e){return ri(e,this.name,this.logger)}}});var Un,ai=w(()=>{"use strict";Un=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 jn,ci=w(()=>{"use strict";jn=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var Hn,li=w(()=>{"use strict";Hn=class{name="OpenAI";endPoint="/v1/chat/completions"}});var zn,ui=w(()=>{"use strict";zn=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 di,Jn,pi=w(()=>{"use strict";Z();di=require("uuid"),Jn=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="",i=!1,l=!1,c="",a=new ReadableStream({async start(u){let d=e.body.getReader(),g=(y,p,f)=>{let _=y.split(`
233
- `);for(let k of _)k.trim()&&p.enqueue(f.encode(k+`
234
- `))},m=(y,p)=>{let{controller:f,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]"){let k=y.slice(6);try{let h=JSON.parse(k);if(h.usage&&(this.logger?.debug({usage:h.usage,hasToolCall:l},"usage"),h.choices[0].finish_reason=l?"tool_calls":"stop"),h.choices?.[0]?.finish_reason==="error"&&f.enqueue(_.encode(`data: ${JSON.stringify({error:h.choices?.[0].error})}
232
+ 3. Use Google Cloud environment with default service account`)}}var Un,li=w(()=>{"use strict";ci();Un=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 c=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),l=JSON.parse(c);l&&l.project_id&&(o=l.project_id)}catch(i){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",i)}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 zc();return{body:si(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 ii(e)}async transformResponseOut(e){return ai(e,this.name,this.logger)}}});var jn,ui=w(()=>{"use strict";jn=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 Hn,di=w(()=>{"use strict";Hn=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var zn,pi=w(()=>{"use strict";zn=class{name="OpenAI";endPoint="/v1/chat/completions"}});var Jn,fi=w(()=>{"use strict";Jn=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 mi,Bn,gi=w(()=>{"use strict";Z();mi=require("uuid"),Bn=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="",i=!1,c=!1,l="",a=new ReadableStream({async start(u){let d=e.body.getReader(),m=(y,p,g)=>{let _=y.split(`
233
+ `);for(let k of _)k.trim()&&p.enqueue(g.encode(k+`
234
+ `))},f=(y,p)=>{let{controller:g,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]"){let k=y.slice(6);try{let h=JSON.parse(k);if(h.usage&&(this.logger?.debug({usage:h.usage,hasToolCall:c},"usage"),h.choices[0].finish_reason=c?"tool_calls":"stop"),h.choices?.[0]?.finish_reason==="error"&&g.enqueue(_.encode(`data: ${JSON.stringify({error:h.choices?.[0].error})}
235
235
 
236
236
  `)),h.choices?.[0]?.delta?.content&&!p.hasTextContent()&&p.setHasTextContent(!0),h.choices?.[0]?.delta?.reasoning){p.appendReasoningContent(h.choices[0].delta.reasoning);let T={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,thinking:{content:h.choices[0].delta.reasoning}}}]};T.choices?.[0]?.delta&&delete T.choices[0].delta.reasoning;let x=`data: ${JSON.stringify(T)}
237
237
 
238
- `;f.enqueue(_.encode(x));return}if(h.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let x={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:"ccr_think_signature"}}}]};x.choices?.[0]?.delta&&delete x.choices[0].delta.reasoning;let v=`data: ${JSON.stringify(x)}
238
+ `;g.enqueue(_.encode(x));return}if(h.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let x={...h,choices:[{...h.choices?.[0],delta:{...h.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:"ccr_think_signature"}}}]};x.choices?.[0]?.delta&&delete x.choices[0].delta.reasoning;let C=`data: ${JSON.stringify(x)}
239
239
 
240
- `;f.enqueue(_.encode(v))}h.choices?.[0]?.delta?.reasoning&&delete h.choices[0].delta.reasoning,h.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(h.choices?.[0]?.delta?.tool_calls[0].id,10))&&h.choices?.[0]?.delta?.tool_calls.forEach(T=>{T.id=`call_${(0,di.v4)()}`}),h.choices?.[0]?.delta?.tool_calls?.length&&!l&&(l=!0),h.choices?.[0]?.delta?.tool_calls?.length&&p.hasTextContent()&&(typeof h.choices[0].index=="number"?h.choices[0].index+=1:h.choices[0].index=1);let b=`data: ${JSON.stringify(h)}
240
+ `;g.enqueue(_.encode(C))}h.choices?.[0]?.delta?.reasoning&&delete h.choices[0].delta.reasoning,h.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(h.choices?.[0]?.delta?.tool_calls[0].id,10))&&h.choices?.[0]?.delta?.tool_calls.forEach(T=>{T.id=`call_${(0,mi.v4)()}`}),h.choices?.[0]?.delta?.tool_calls?.length&&!c&&(c=!0),h.choices?.[0]?.delta?.tool_calls?.length&&p.hasTextContent()&&(typeof h.choices[0].index=="number"?h.choices[0].index+=1:h.choices[0].index=1);let b=`data: ${JSON.stringify(h)}
241
241
 
242
- `;f.enqueue(_.encode(b))}catch{f.enqueue(_.encode(y+`
243
- `))}}else f.enqueue(_.encode(y+`
244
- `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){c.trim()&&g(c,u,o);break}if(!p||p.length===0)continue;let f;try{f=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(f.length===0)continue;if(c+=f,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=c.split(`
245
- `);c=k.pop()||"";for(let h of k)if(h.trim())try{m(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
246
- `))}continue}let _=c.split(`
247
- `);c=_.pop()||"";for(let k of _)if(k.trim())try{m(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
248
- `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var jo,Uc,Bn,fi=w(()=>{"use strict";Z();jo=`Always think before answering. Even if the problem seems simple, always write down your reasoning process explicitly.
242
+ `;g.enqueue(_.encode(b))}catch{g.enqueue(_.encode(y+`
243
+ `))}}else g.enqueue(_.encode(y+`
244
+ `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){l.trim()&&m(l,u,o);break}if(!p||p.length===0)continue;let g;try{g=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(g.length===0)continue;if(l+=g,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
245
+ `);l=k.pop()||"";for(let h of k)if(h.trim())try{f(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
246
+ `))}continue}let _=l.split(`
247
+ `);l=_.pop()||"";for(let k of _)if(k.trim())try{f(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
248
+ `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Ho,Jc,Wn,hi=w(()=>{"use strict";Z();Ho=`Always think before answering. Even if the problem seems simple, always write down your reasoning process explicitly.
249
249
 
250
250
  Output format:
251
251
  <reasoning_content>
252
252
  Your detailed thinking process goes here
253
253
  </reasoning_content>
254
- Your final answer must follow after the closing tag above.`,Uc=10,Bn=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<Uc)&&(t++,r.content=`<reasoning_content>${r.thinking.content}</reasoning_content>
255
- ${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:jo}):o.content=[{type:"text",text:jo},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:jo}]}),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,i=r.choices[0]?.message.content.match(s);i&&i[1]&&(r.thinking={content:i[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,i=new TextEncoder,l=new ReadableStream({async start(c){let a=e.body.getReader(),u="",d="SEARCHING",g="",m="",y=(p,f)=>{if(typeof f!="string"){p.choices?.[0]?.delta&&Object.keys(p.choices[0].delta).length>0&&!p.choices[0].delta.content&&(p.choices[0].index=r,c.enqueue(i.encode(`data: ${JSON.stringify(p)}
254
+ Your final answer must follow after the closing tag above.`,Jc=10,Wn=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<Jc)&&(t++,r.content=`<reasoning_content>${r.thinking.content}</reasoning_content>
255
+ ${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:Ho}):o.content=[{type:"text",text:Ho},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:Ho}]}),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,i=r.choices[0]?.message.content.match(s);i&&i[1]&&(r.thinking={content:i[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,i=new TextEncoder,c=new ReadableStream({async start(l){let a=e.body.getReader(),u="",d="SEARCHING",m="",f="",y=(p,g)=>{if(typeof g!="string"){p.choices?.[0]?.delta&&Object.keys(p.choices[0].delta).length>0&&!p.choices[0].delta.content&&(p.choices[0].index=r,l.enqueue(i.encode(`data: ${JSON.stringify(p)}
256
256
 
257
- `)));return}let _=g+f;for(g="";_.length>0;)if(d==="SEARCHING"){let k=_.indexOf(t);if(k!==-1)_=_.substring(k+t.length),d="REASONING";else{for(let h=t.length-1;h>0;h--)if(_.endsWith(t.substring(0,h))){g=_.substring(_.length-h);break}_=""}}else if(d==="REASONING"){let k=_.indexOf(o);if(k!==-1){let h=_.substring(0,k);if(h.length>0){let x={...p.choices[0].delta,thinking:{content:h}};delete x.content;let v={...p,choices:[{...p.choices[0],delta:x,index:r}]};c.enqueue(i.encode(`data: ${JSON.stringify(v)}
257
+ `)));return}let _=m+g;for(m="";_.length>0;)if(d==="SEARCHING"){let k=_.indexOf(t);if(k!==-1)_=_.substring(k+t.length),d="REASONING";else{for(let h=t.length-1;h>0;h--)if(_.endsWith(t.substring(0,h))){m=_.substring(_.length-h);break}_=""}}else if(d==="REASONING"){let k=_.indexOf(o);if(k!==-1){let h=_.substring(0,k);if(h.length>0){let x={...p.choices[0].delta,thinking:{content:h}};delete x.content;let C={...p,choices:[{...p.choices[0],delta:x,index:r}]};l.enqueue(i.encode(`data: ${JSON.stringify(C)}
258
258
 
259
- `))}let b={...p.choices[0].delta,thinking:{signature:"ccr_think_signature"}};delete b.content;let T={...p,choices:[{...p.choices[0],delta:b,index:r}]};c.enqueue(i.encode(`data: ${JSON.stringify(T)}
259
+ `))}let b={...p.choices[0].delta,thinking:{signature:"ccr_think_signature"}};delete b.content;let T={...p,choices:[{...p.choices[0],delta:b,index:r}]};l.enqueue(i.encode(`data: ${JSON.stringify(T)}
260
260
 
261
- `)),r++,_=_.substring(k+o.length),d="FINAL"}else{let h=_;for(let b=o.length-1;b>0;b--)if(_.endsWith(o.substring(0,b))){g=_.substring(_.length-b),h=_.substring(0,_.length-b);break}if(h.length>0){let b={...p.choices[0].delta,thinking:{content:h}};delete b.content;let T={...p,choices:[{...p.choices[0],delta:b,index:r}]};c.enqueue(i.encode(`data: ${JSON.stringify(T)}
261
+ `)),r++,_=_.substring(k+o.length),d="FINAL"}else{let h=_;for(let b=o.length-1;b>0;b--)if(_.endsWith(o.substring(0,b))){m=_.substring(_.length-b),h=_.substring(0,_.length-b);break}if(h.length>0){let b={...p.choices[0].delta,thinking:{content:h}};delete b.content;let T={...p,choices:[{...p.choices[0],delta:b,index:r}]};l.enqueue(i.encode(`data: ${JSON.stringify(T)}
262
262
 
263
- `))}_=""}}else if(d==="FINAL"){if(_.length>0)if(/^\s*$/.test(_))m+=_;else{let h=m+_,b={...p.choices[0].delta,content:h};b.thinking&&delete b.thinking;let T={...p,choices:[{...p.choices[0],delta:b}]};c.enqueue(i.encode(`data: ${JSON.stringify(T)}
263
+ `))}_=""}}else if(d==="FINAL"){if(_.length>0)if(/^\s*$/.test(_))f+=_;else{let h=f+_,b={...p.choices[0].delta,content:h};b.thinking&&delete b.thinking;let T={...p,choices:[{...p.choices[0],delta:b}]};l.enqueue(i.encode(`data: ${JSON.stringify(T)}
264
264
 
265
- `)),m=""}r++,_=""}};try{for(;;){let{done:p,value:f}=await a.read();if(p)break;let _=s.decode(f,{stream:!0});u+=_;let k=u.split(`
266
- `);u=k.pop()||"";for(let h of k)if(h.trim()){if(h.trim()==="data: [DONE]"){c.enqueue(i.encode(h+`
265
+ `)),f=""}r++,_=""}};try{for(;;){let{done:p,value:g}=await a.read();if(p)break;let _=s.decode(g,{stream:!0});u+=_;let k=u.split(`
266
+ `);u=k.pop()||"";for(let h of k)if(h.trim()){if(h.trim()==="data: [DONE]"){l.enqueue(i.encode(h+`
267
267
 
268
- `));break}if(h.startsWith("data:"))try{let b=JSON.parse(h.slice(5));y(b,b.choices?.[0]?.delta?.content)}catch{c.enqueue(i.encode(h+`
269
- `))}else c.enqueue(i.encode(h+`
270
- `))}}}catch(p){console.error("Stream error:",p),c.error(p)}finally{try{a.releaseLock()}catch(p){console.error("Error releasing reader lock:",p)}if(d==="REASONING"){let f={choices:[{delta:{thinking:{signature:"ccr_think_signature"}}}]};c.enqueue(i.encode(`data: ${JSON.stringify(f)}
268
+ `));break}if(h.startsWith("data:"))try{let b=JSON.parse(h.slice(5));y(b,b.choices?.[0]?.delta?.content)}catch{l.enqueue(i.encode(h+`
269
+ `))}else l.enqueue(i.encode(h+`
270
+ `))}}}catch(p){console.error("Stream error:",p),l.error(p)}finally{try{a.releaseLock()}catch(p){console.error("Error releasing reader lock:",p)}if(d==="REASONING"){let g={choices:[{delta:{thinking:{signature:"ccr_think_signature"}}}]};l.enqueue(i.encode(`data: ${JSON.stringify(g)}
271
271
 
272
- `))}c.close()}}});return new Response(l,{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 Wn,mi=w(()=>{"use strict";Z();Wn=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="",i="",l=new ReadableStream({async start(c){let a=e.body.getReader();try{for(;;){let{done:u,value:d}=await a.read();if(u){i.trim()&&c.enqueue(r.encode(i+`
273
- `));break}let g=o.decode(d,{stream:!0});i+=g;let m=i.split(`
274
- `);i=m.pop()||"";for(let y of m)if(y.trim())if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]")try{let p=JSON.parse(y.slice(6));if(p.choices?.[0]?.delta?.reasoning_content){s+=p.choices[0].delta.reasoning_content;let f={...p,choices:[{...p.choices[0],delta:{thinking:{content:p.choices[0].delta.reasoning_content}}}]};delete f.choices[0].delta.reasoning_content,c.enqueue(r.encode(`data: ${JSON.stringify(f)}
272
+ `))}l.close()}}});return new Response(c,{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 Gn,yi=w(()=>{"use strict";Z();Gn=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="",i="",c=new ReadableStream({async start(l){let a=e.body.getReader();try{for(;;){let{done:u,value:d}=await a.read();if(u){i.trim()&&l.enqueue(r.encode(i+`
273
+ `));break}let m=o.decode(d,{stream:!0});i+=m;let f=i.split(`
274
+ `);i=f.pop()||"";for(let y of f)if(y.trim())if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]")try{let p=JSON.parse(y.slice(6));if(p.choices?.[0]?.delta?.reasoning_content){s+=p.choices[0].delta.reasoning_content;let g={...p,choices:[{...p.choices[0],delta:{thinking:{content:p.choices[0].delta.reasoning_content}}}]};delete g.choices[0].delta.reasoning_content,l.enqueue(r.encode(`data: ${JSON.stringify(g)}
275
275
 
276
- `));continue}if(p.choices?.[0]?.delta?.content&&s&&!p.choices[0]?.delta?.reasoning_content){let f=Date.now().toString(),_={...p,choices:[{...p.choices[0],delta:{content:null,thinking:{content:s,signature:f}}}]};c.enqueue(r.encode(`data: ${JSON.stringify(_)}
276
+ `));continue}if(p.choices?.[0]?.delta?.content&&s&&!p.choices[0]?.delta?.reasoning_content){let g=Date.now().toString(),_={...p,choices:[{...p.choices[0],delta:{content:null,thinking:{content:s,signature:g}}}]};l.enqueue(r.encode(`data: ${JSON.stringify(_)}
277
277
 
278
- `)),s=""}p.choices?.[0]?.delta?.reasoning_content&&delete p.choices[0].delta.reasoning_content,p.choices?.[0]?.delta&&Object.keys(p.choices[0].delta).length>0&&c.enqueue(r.encode(`data: ${JSON.stringify(p)}
278
+ `)),s=""}p.choices?.[0]?.delta?.reasoning_content&&delete p.choices[0].delta.reasoning_content,p.choices?.[0]?.delta&&Object.keys(p.choices[0].delta).length>0&&l.enqueue(r.encode(`data: ${JSON.stringify(p)}
279
279
 
280
- `))}catch{c.enqueue(r.encode(y+`
281
- `))}else c.enqueue(r.encode(y+`
282
- `))}}catch(u){c.error(u)}finally{try{a.releaseLock()}catch{}c.close()}}});return new Response(l,{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 gi,Gn,hi=w(()=>{"use strict";Z();gi=require("uuid"),Gn=class{constructor(e){this.options=e}static TransformerName="opencode";endPoint="/v1/chat/completions";async transformRequestIn(e){let t=e.reasoning?.enabled||e.messages.some(o=>o.thinking?.content);return e.messages.forEach(o=>{if(Array.isArray(o.content)&&o.content.forEach(r=>{r.type==="image_url"&&(r.image_url.url.startsWith("http")||(r.image_url.url=`data:${r.media_type};base64,${r.image_url.url}`),delete r.media_type)}),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)):t&&o.tool_calls?.length&&!o.reasoning_content&&(o.reasoning_content=" "),o.thinking&&delete o.thinking}}),Object.assign(e,this.options||{}),e}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="",i=!1,l=!1,c="",a=new ReadableStream({async start(u){let d=e.body.getReader(),g=(y,p,f)=>{let _=y.split(`
283
- `);for(let k of _)k.trim()&&p.enqueue(f.encode(k+`
284
- `))},m=(y,p)=>{let{controller:f,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]")try{let k=JSON.parse(y.slice(6));if(k.usage&&(k.choices[0].finish_reason=l?"tool_calls":"stop"),k.choices?.[0]?.finish_reason==="error"){f.enqueue(_.encode(`data: ${JSON.stringify({error:k.choices?.[0]?.error})}
280
+ `))}catch{l.enqueue(r.encode(y+`
281
+ `))}else l.enqueue(r.encode(y+`
282
+ `))}}catch(u){l.error(u)}finally{try{a.releaseLock()}catch{}l.close()}}});return new Response(c,{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 zo,Kn,_i=w(()=>{"use strict";Z();Xe();zo=require("uuid"),Kn=class{constructor(e){this.options=e}static TransformerName="opencode";endPoint="/v1/chat/completions";resolveSessionId(e,t){let o=t?.req,r=o?.headers||{},s=i=>{let c=Object.keys(r).find(a=>a.toLowerCase()===i),l=c?r[c]:void 0;return typeof l=="string"&&l.trim()?l.trim():void 0};return s("x-opencode-session")||o?.clientContext?.stableSessionId||o?.sessionId||_e(e.metadata?.user_id)||s("session_id")||(0,zo.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(i=>{i.type==="image_url"&&(i.image_url.url.startsWith("http")||(i.image_url.url=`data:${i.media_type};base64,${i.image_url.url}`),delete i.media_type)}),s.role==="assistant"){let i=s.thinking?.content,c=s.thinking?.signature;i&&typeof i=="string"&&i.trim()?(s.reasoning_content=i,c&&(s.reasoning_content_signature=c)):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="",i=!1,c=!1,l="",a=new ReadableStream({async start(u){let d=e.body.getReader(),m=(y,p,g)=>{let _=y.split(`
283
+ `);for(let k of _)k.trim()&&p.enqueue(g.encode(k+`
284
+ `))},f=(y,p)=>{let{controller:g,encoder:_}=p;if(y.startsWith("data: ")&&y.trim()!=="data: [DONE]")try{let k=JSON.parse(y.slice(6));if(k.usage&&(k.choices[0].finish_reason=c?"tool_calls":"stop"),k.choices?.[0]?.finish_reason==="error"){g.enqueue(_.encode(`data: ${JSON.stringify({error:k.choices?.[0]?.error})}
285
285
 
286
- `));return}k.choices?.[0]?.delta?.content&&!p.hasTextContent()&&p.setHasTextContent(!0);let h=k.choices?.[0]?.delta?.reasoning||k.choices?.[0]?.delta?.reasoning_content;if(h){p.appendReasoningContent(h);let S={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,thinking:{content:h}}}]};S.choices?.[0]?.delta&&(delete S.choices[0].delta.reasoning,delete S.choices[0].delta.reasoning_content),f.enqueue(_.encode(`data: ${JSON.stringify(S)}
286
+ `));return}k.choices?.[0]?.delta?.content&&!p.hasTextContent()&&p.setHasTextContent(!0);let h=k.choices?.[0]?.delta?.reasoning||k.choices?.[0]?.delta?.reasoning_content;if(h){p.appendReasoningContent(h);let S={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,thinking:{content:h}}}]};S.choices?.[0]?.delta&&(delete S.choices[0].delta.reasoning,delete S.choices[0].delta.reasoning_content),g.enqueue(_.encode(`data: ${JSON.stringify(S)}
287
287
 
288
- `));return}if(k.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let S="ccr_think_signature",C=k.choices[0].delta.content,P={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:S}}}]};P.choices?.[0]?.delta&&(delete P.choices[0].delta.reasoning,delete P.choices[0].delta.reasoning_content),f.enqueue(_.encode(`data: ${JSON.stringify(P)}
288
+ `));return}if(k.choices?.[0]?.delta?.content&&p.reasoningContent()&&!p.isReasoningComplete()){p.setReasoningComplete(!0);let S="ccr_think_signature",v=k.choices[0].delta.content,E={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,content:null,thinking:{content:p.reasoningContent(),signature:S}}}]};E.choices?.[0]?.delta&&(delete E.choices[0].delta.reasoning,delete E.choices[0].delta.reasoning_content),g.enqueue(_.encode(`data: ${JSON.stringify(E)}
289
289
 
290
- `));let R={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,content:C}}]};R.choices?.[0]?.delta&&(delete R.choices[0].delta.reasoning,delete R.choices[0].delta.reasoning_content),f.enqueue(_.encode(`data: ${JSON.stringify(R)}
290
+ `));let R={...k,choices:[{...k.choices?.[0],delta:{...k.choices[0].delta,content:v}}]};R.choices?.[0]?.delta&&(delete R.choices[0].delta.reasoning,delete R.choices[0].delta.reasoning_content),g.enqueue(_.encode(`data: ${JSON.stringify(R)}
291
291
 
292
- `));return}k.choices?.[0]?.delta?.reasoning&&delete k.choices[0].delta.reasoning,k.choices?.[0]?.delta?.reasoning_content&&delete k.choices[0].delta.reasoning_content,k.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(k.choices?.[0]?.delta?.tool_calls[0].id,10))&&k.choices?.[0]?.delta?.tool_calls.forEach(S=>{S.id=`call_${(0,gi.v4)()}`}),k.choices?.[0]?.delta?.tool_calls?.length&&!l&&(l=!0);let b=k.choices?.[0]?.delta,T=b&&Object.keys(b).length>0,x=k.choices?.[0]?.finish_reason,v=k.usage;(T||x||v)&&f.enqueue(_.encode(`data: ${JSON.stringify(k)}
292
+ `));return}k.choices?.[0]?.delta?.reasoning&&delete k.choices[0].delta.reasoning,k.choices?.[0]?.delta?.reasoning_content&&delete k.choices[0].delta.reasoning_content,k.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(k.choices?.[0]?.delta?.tool_calls[0].id,10))&&k.choices?.[0]?.delta?.tool_calls.forEach(S=>{S.id=`call_${(0,zo.v4)()}`}),k.choices?.[0]?.delta?.tool_calls?.length&&!c&&(c=!0);let b=k.choices?.[0]?.delta,T=b&&Object.keys(b).length>0,x=k.choices?.[0]?.finish_reason,C=k.usage;(T||x||C)&&g.enqueue(_.encode(`data: ${JSON.stringify(k)}
293
293
 
294
- `))}catch{f.enqueue(_.encode(y+`
295
- `))}else f.enqueue(_.encode(y+`
296
- `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){c.trim()&&g(c,u,o);break}if(!p||p.length===0)continue;let f;try{f=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(f.length===0)continue;if(c+=f,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=c.split(`
297
- `);c=k.pop()||"";for(let h of k)if(h.trim())try{m(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
298
- `))}continue}let _=c.split(`
299
- `);c=_.pop()||"";for(let k of _)if(k.trim())try{m(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
300
- `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var yi,_i=w(()=>{Fs();Us();js();Hs();zs();Bs();Ws();Ks();Qs();qs();Zs();ei();ti();ii();ai();ci();li();ui();pi();wo();fi();mi();hi();yi={AnthropicTransformer:Cn,GeminiTransformer:Rn,VertexGeminiTransformer:wn,VertexClaudeTransformer:Fn,DeepseekTransformer:Pn,TooluseTransformer:En,OpenrouterTransformer:On,OpenAITransformer:Hn,MaxTokenTransformer:An,GroqTransformer:In,CleancacheTransformer:Mn,EnhanceToolTransformer:$n,ReasoningTransformer:Nn,SamplingTransformer:Ln,MaxCompletionTokens:Dn,CerebrasTransformer:Un,StreamOptionsTransformer:jn,CustomParamsTransformer:zn,VercelTransformer:Jn,OpenAIResponsesTransformer:We,ForceReasoningTransformer:Bn,KimiTransformer:Wn,OpenCodeTransformer:Gn}});var Oe,Ho=w(()=>{"use strict";_i();Oe=class{constructor(e,t){this.configService=e;this.logger=t}transformers=new Map;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})
294
+ `))}catch{g.enqueue(_.encode(y+`
295
+ `))}else g.enqueue(_.encode(y+`
296
+ `))};try{for(;;){let{done:y,value:p}=await d.read();if(y){l.trim()&&m(l,u,o);break}if(!p||p.length===0)continue;let g;try{g=t.decode(p,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(g.length===0)continue;if(l+=g,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
297
+ `);l=k.pop()||"";for(let h of k)if(h.trim())try{f(h,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>i,setReasoningComplete:b=>i=b})}catch(b){console.error("Error processing line:",h,b),u.enqueue(o.encode(h+`
298
+ `))}continue}let _=l.split(`
299
+ `);l=_.pop()||"";for(let k of _)if(k.trim())try{f(k,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:h=>r=h,reasoningContent:()=>s,appendReasoningContent:h=>s+=h,isReasoningComplete:()=>i,setReasoningComplete:h=>i=h})}catch(h){console.error("Error processing line:",k,h),u.enqueue(o.encode(k+`
300
+ `))}}}catch(y){console.error("Stream error:",y),u.error(y)}finally{try{d.releaseLock()}catch(y){console.error("Error releasing reader lock:",y)}u.close()}}});return new Response(a,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var ki,bi=w(()=>{Hs();zs();Js();Bs();Ws();Ks();Qs();Ys();Xs();ti();ni();oi();ri();li();ui();di();pi();fi();gi();Po();hi();yi();_i();ki={AnthropicTransformer:Cn,GeminiTransformer:wn,VertexGeminiTransformer:Pn,VertexClaudeTransformer:Un,DeepseekTransformer:En,TooluseTransformer:On,OpenrouterTransformer:An,OpenAITransformer:zn,MaxTokenTransformer:In,GroqTransformer:Mn,CleancacheTransformer:$n,EnhanceToolTransformer:Nn,ReasoningTransformer:Ln,SamplingTransformer:Dn,MaxCompletionTokens:Fn,CerebrasTransformer:jn,StreamOptionsTransformer:Hn,CustomParamsTransformer:Jn,VercelTransformer:Bn,OpenAIResponsesTransformer:Ke,ForceReasoningTransformer:Wn,KimiTransformer:Gn,OpenCodeTransformer:Kn}});var Ie,Jo=w(()=>{"use strict";bi();Ie=class{constructor(e,t){this.configService=e;this.logger=t}transformers=new Map;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})
301
301
  error: ${t.message}
302
302
  stack: ${t.stack}`),!1}}async initialize(){try{await this.registerDefaultTransformersInternal(),await this.loadFromConfig()}catch(e){this.logger.error(`TransformerService init error: ${e.message}
303
- Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.values(yi).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 ki,St,bi=w(()=>{"use strict";ki=require("tiktoken"),St=class{type="tiktoken";name;encoding;constructor(e="cl100k_base"){this.name=`tiktoken-${e}`;try{this.encoding=(0,ki.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:i}=e;return Array.isArray(r)&&r.forEach(l=>{typeof l.content=="string"?o+=t.encode(l.content).length:Array.isArray(l.content)&&l.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 a=typeof c.content=="string"?c.content:JSON.stringify(c.content);o+=t.encode(a).length}})}),typeof s=="string"?o+=t.encode(s).length:Array.isArray(s)&&s.forEach(l=>{l.type==="text"&&(typeof l.text=="string"?o+=t.encode(l.text).length:Array.isArray(l.text)&&l.text.forEach(c=>{o+=t.encode(c||"").length}))}),i&&i.forEach(l=>{l.description&&(o+=t.encode(l.name+l.description).length),l.input_schema&&(o+=t.encode(JSON.stringify(l.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 Rt,Ti,tt,wt,Ci,Kn,vi=w(()=>{"use strict";Rt=require("path"),Ti=require("os"),tt=require("fs"),wt=require("fs"),Ci=require("@huggingface/tokenizers"),Kn=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,Rt.join)((0,Ti.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,Rt.join)(this.cacheDir,this.safeModelName);return{modelDir:e,tokenizerJson:(0,Rt.join)(e,"tokenizer.json"),tokenizerConfig:(0,Rt.join)(e,"tokenizer_config.json")}}ensureDir(e){(0,tt.existsSync)(e)||(0,tt.mkdirSync)(e,{recursive:!0})}async loadFromCache(){try{let e=this.getCachePaths();if(!(0,tt.existsSync)(e.tokenizerJson)||!(0,tt.existsSync)(e.tokenizerConfig))return null;let[t,o]=await Promise.all([wt.promises.readFile(e.tokenizerJson,"utf-8"),wt.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,i]=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[l,c]=await Promise.all([s.json(),i.ok?i.json():Promise.resolve({})]);return this.ensureDir(e.modelDir),await Promise.all([wt.promises.writeFile(e.tokenizerJson,JSON.stringify(l,null,2)),wt.promises.writeFile(e.tokenizerConfig,JSON.stringify(c,null,2))]),{tokenizerJson:l,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 Ci.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 i of o)if(typeof i.content=="string")t.push(i.content);else if(Array.isArray(i.content))for(let l of i.content)l.type==="text"&&l.text?t.push(l.text):l.type==="tool_use"&&l.input?t.push(JSON.stringify(l.input)):l.type==="tool_result"&&t.push(typeof l.content=="string"?l.content:JSON.stringify(l.content))}if(typeof r=="string")t.push(r);else if(Array.isArray(r)){for(let i of r)if(i.type==="text"){if(typeof i.text=="string")t.push(i.text);else if(Array.isArray(i.text))for(let l of i.text)l&&t.push(l)}}if(s)for(let i of s)i.name&&t.push(i.name),i.description&&t.push(i.description),i.input_schema&&t.push(JSON.stringify(i.input_schema));return t.join(" ")}}});var Qn,xi=w(()=>{"use strict";ae();Qn=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),i={method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal},l=this.options.resolveProxyUrl?.();l&&(i.dispatcher=V(l));let c=await fetch(this.config.url,i);if(clearTimeout(s),!c.ok)throw new Error(`API tokenizer request failed: ${c.status} ${c.statusText}`);let a=await c.json();return this.extractTokenCount(a)}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"?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 Ae,zo=w(()=>{"use strict";bi();vi();xi();ae();Ae=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 St("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 St(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new Kn(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new Qn(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return de(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 Si(n){if(!n||typeof n!="object"||Gc(n))return null;for(let t of Wc(n)){let o=Bc(t);if(o)return o}return null}function Bc(n){if(!n||typeof n!="object")return null;let e={},t=Vn(n,jc);if(t!==void 0){let i=Ri(t);e.usedDailyBalance=i,e.limitDaily=100}let o=Vn(n,Hc);if(o!==void 0){let i=Ri(o);e.usedBalance=i,e.totalBalance=100}let r=Vn(n,zc);if(r!==void 0){let i=wi(r);i&&(e.resetTime=i)}let s=Vn(n,Jc);if(s!==void 0){let i=wi(s);i&&(e.resetTime7d=i,e.resetTime||(e.resetTime=i))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function Ri(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function Vn(n,e){for(let t of e){let o=$(n?.[t]);if(o!==void 0)return o}}function Wc(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 i of o)s[i]&&typeof s[i]=="object"&&r(s[i])}};return r(n),e}function Gc(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 wi(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 Yn(n){let e=er(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?el:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?tl:e==="deepseek.com"||e.endsWith(".deepseek.com")?Kc:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?Qc:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Vc:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?Yc:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?Xc:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?qc:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?Zc:null:null}function nl(n){let e=er(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function ol(n,e){let t=qo(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let i=s?.codingPlanAppCredentialDTO||s?.appCredential||s,l=String(i?.apiKey||i?.api_key||"").trim();return l&&o.some(c=>c.includes(l)||l.includes(c))})||t[0]}function qo(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>qo(e)):Object.values(n).flatMap(e=>qo(e))}function Zo(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function er(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function $(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 le,Jo,Bo,Wo,Go,Ko,jc,Hc,zc,Jc,Qo,Vo,Yo,Xo,Kc,Qc,Vc,Yc,Xc,qc,Zc,el,tl,tr=w(()=>{"use strict";ae();le=class{async fetchJson(e,t,o,r,s){let i=s||t.apiKey;if(!i)return null;let l={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${i}`},signal:AbortSignal.timeout(o)};try{r&&(l.dispatcher=V(r));let c=await fetch(e,l);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}},Jo=class extends le{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),i=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(c=>$(c?.total_balance)!==void 0);if(!i)return null;let l=$(i.total_balance);return l===void 0?null:{totalBalance:l,currency:typeof i.currency=="string"?i.currency:void 0}}},Bo=class extends le{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 i={},l=$(s.limit),c=$(s.limit_remaining),a=$(s.usage),u=$(s.usage_daily);return l!==void 0&&(i.totalBalance=l),c!==void 0&&(i.remainingBalance=c),a!==void 0&&(i.usedBalance=a),u!==void 0&&(i.usedDailyBalance=u),this.hasQuotaData(i)?i:null}},Wo=class extends le{async queryQuota(e,t,o){let r=nl(e.baseUrl),i=(await this.fetchJson(r,e,t,o))?.data;if(!i||typeof i!="object")return null;let l={},c=$(i.totalBalance),a=$(i.balance);return c!==void 0&&(l.totalBalance=c),a!==void 0&&(l.remainingBalance=a),c!==void 0&&a!==void 0&&(l.usedBalance=Math.max(0,c-a)),this.hasQuotaData(l)?l:null}},Go=class extends le{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=V(o));let i=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!i.ok)return null;let l=await i.json(),c=Array.isArray(l?.data?.limits)?l.data.limits:[],a=null,u=null,d=null;for(let m of c)m.type==="TOKENS_LIMIT"?m.unit===3?a=m:m.unit===6?u=m:a||(a=m):m.type==="TIME_LIMIT"&&(d=m);let g={};if(a){let m=$(a.currentValue),y=$(a.usage),p=$(a.remaining),f=$(a.percentage);m!==void 0?g.usedDailyBalance=m:f!==void 0&&(g.usedDailyBalance=f,g.limitDaily=100),y!==void 0?g.limitDaily=y:m!==void 0&&p!==void 0&&(g.limitDaily=m+p),a.nextResetTime&&(g.resetTime=new Date(a.nextResetTime).toISOString())}if(u){let m=$(u.currentValue),y=$(u.usage),p=$(u.remaining),f=$(u.percentage);m!==void 0?g.usedBalance=m:f!==void 0&&(g.usedBalance=f,g.totalBalance=100),y!==void 0?g.totalBalance=y:m!==void 0&&p!==void 0&&(g.totalBalance=m+p),u.nextResetTime&&!g.resetTime&&(g.resetTime=new Date(u.nextResetTime).toISOString())}if(d){if(g.usedDailyBalance===void 0){let m=$(d.currentValue);m!==void 0&&(g.usedDailyBalance=m)}if(g.limitDaily===void 0){let m=$(d.usage),y=$(d.currentValue),p=$(d.remaining);m!==void 0?g.limitDaily=m:y!==void 0&&p!==void 0&&(g.limitDaily=y+p)}d.nextResetTime&&!g.resetTime&&(g.resetTime=new Date(d.nextResetTime).toISOString())}return this.hasQuotaData(g)?g:null}catch{return null}}},Ko=class extends le{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"}}}),i=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=V(o));let l=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:i});if(!l.ok)return null;let a=(await l.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(a)||a.length===0)return null;let u=a[0]?.codingPlanQuotaInfo;if(!u)return null;let d={},g=$(u.per5HourUsedQuota),m=$(u.per5HourTotalQuota);g!==void 0&&(d.usedDailyBalance=g),m!==void 0&&(d.limitDaily=m);let y=$(u.perWeekUsedQuota),p=$(u.perWeekTotalQuota);return y!==void 0&&(d.usedBalance=y),p!==void 0&&(d.totalBalance=p),this.hasQuotaData(d)?d:null}catch{return null}}};jc=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],Hc=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],zc=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],Jc=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];Qo=class extends le{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let i=await this.queryOfficialEndpoint(r,s,t,o);if(i)return i}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",i=Zo(e,"cna")||"",l=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":i}}}),c=new URLSearchParams({params:l,region:"cn-beijing",sec_token:t}).toString(),a={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&&(a.dispatcher=V(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,a);if(!u.ok)return null;let d=await u.json();return Si(d)}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"}}}),i=new URLSearchParams({params:s,region:"cn-beijing"}).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/"},body:i,signal:AbortSignal.timeout(t)};try{o&&(l.dispatcher=V(o));let c=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,l);if(!c.ok)return null;let a=await c.json();return Si(a)}catch{return null}}},Vo=class extends le{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:(Zo(e.quotaToken,"atp-auth-token")||Zo(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=V(o));let i=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!i.ok)return null;let l=await i.json();if(l?.succeed===!1||l?.failed===!0)return null;let c=ol(l,e.apiKey),a=c?.codingPlanUsageDTO||c?.usage||c;if(!a||typeof a!="object")return null;let u={},d=$(a.rp5hUsage),g=$(a.rp5hLimit);d!==void 0&&(u.usedDailyBalance=d),g!==void 0&&(u.limitDaily=g);let m=$(a.rpwUsage),y=$(a.rpwLimit);return m!==void 0&&(u.usedBalance=m),y!==void 0&&(u.totalBalance=y),u.remainingBalance===void 0&&y!==void 0&&m!==void 0&&(u.remainingBalance=Math.max(0,y-m)),this.hasQuotaData(u)?u:null}catch{return null}}},Yo=class extends le{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=V(o));let i=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!i.ok)return null;let l=await i.json(),c={},a=Array.isArray(l?.limits)?l.limits:[];if(a.length>0&&a[0]?.detail){let d=a[0].detail,g=$(d.limit),m=$(d.remaining),y=d.resetTime;g!==void 0&&m!==void 0&&(c.usedDailyBalance=Math.max(0,g-m),c.limitDaily=g),y&&(c.resetTime=new Date(y).toISOString())}let u=l?.usage;if(u){let d=$(u.limit),g=$(u.remaining),m=$(u.used),y=u.resetTime;d!==void 0&&(c.totalBalance=d,m!==void 0?c.usedBalance=m:g!==void 0&&(c.usedBalance=Math.max(0,d-g),c.remainingBalance=g)),y&&(c.resetTime7d=new Date(y).toISOString(),c.resetTime||(c.resetTime=c.resetTime7d))}return this.hasQuotaData(c)?c:null}catch{return null}}},Xo=class extends le{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=er(e.baseUrl)||"api.minimaxi.com",i=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let l=[`https://${i}/v1/token_plan/remains`,`https://${i}/v1/api/openplatform/coding_plan/remains`],c=null;for(let b of l)if(c=await this.fetchJson(b,e,t,o,r.trim()),c)break;if(!c)return null;if(c?.base_resp){let b=c.base_resp.status_code;if(b!==void 0&&b!==0)return null}let a=Array.isArray(c?.model_remains)?c.model_remains:[];if(a.length===0)return null;let u=a[0],d={},g=$(u.current_interval_total_count),m=$(u.current_interval_usage_count),y=$(u.current_interval_remaining_percent),p=$(u.end_time);g!==void 0&&m!==void 0&&g>0?(d.usedDailyBalance=Math.max(0,g-m),d.limitDaily=g):y!==void 0&&(d.limitDaily=100,d.usedDailyBalance=Math.max(0,100-y)),p&&(d.resetTime=new Date(p).toISOString());let f=$(u.current_weekly_total_count),_=$(u.current_weekly_usage_count),k=$(u.current_weekly_remaining_percent),h=$(u.weekly_end_time);return f!==void 0&&_!==void 0&&f>0?(d.usedBalance=Math.max(0,f-_),d.remainingBalance=_,d.totalBalance=f):k!==void 0&&(d.totalBalance=100,d.usedBalance=Math.max(0,100-k),d.remainingBalance=k),h&&!d.resetTime&&(d.resetTime=new Date(h).toISOString()),this.hasQuotaData(d)?d:null}catch{return null}}},Kc=new Jo,Qc=new Bo,Vc=new Wo,Yc=new Go,Xc=new Ko,qc=new Qo,Zc=new Vo,el=new Yo,tl=new Xo});function Pi(n){return{[rl]:n,[sl]:sn}}function al(n){return n===!0||n==="true"||n===1||n==="1"}function cl(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 ll(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 ul(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function nr(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o)),s=ll(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let i={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(i.dispatcher=V(t));let l=await fetch(s,i);if(l.headers&&mt(n.name,n.baseUrl,l.headers),l.ok)return{success:!0,headers:l.headers,latencyMs:r()};if(l.status===429)return{success:!1,error:`HTTP 429: ${(await l.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:l.headers,latencyMs:r(),errorKind:"http"};if(l.status>=400&&l.status<500)return{success:!0,headers:l.headers,latencyMs:r()};let c=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${c.slice(0,100)}`,headers:l.headers,latencyMs:r(),errorKind:"http"}}catch(i){let l=i?.message||i?.toString()||"Unknown probe error",c=i?.name==="TimeoutError"||i?.name==="AbortError"||i?.code===20||i?.code==="ABORT_ERR";return{success:!1,error:l,latencyMs:r(),errorKind:c?"timeout":"network"}}}async function dl(n,e,t,o){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,i=n.baseUrl.includes("/messages")||r.includes("claude");try{let l={"Content-Type":"application/json",...Pi("scheduled-wakeup")};i?(l["x-api-key"]=n.apiKey,l["anthropic-version"]="2023-06-01"):l.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:l,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=V(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let a=await fetch(s,c);if(a.ok)return{success:!0};let u=await a.text().catch(()=>"");return{success:!1,error:`HTTP ${a.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(l){return{success:!1,error:l?.message||l?.toString()||"Unknown wake-up error"}}}async function pl(n,e,t,o,r){let s=n.baseUrl,i=n.baseUrl.includes("/messages")||e.includes("claude");try{let l={"Content-Type":"application/json",...Pi("rate-limit-probe")};i?(l["x-api-key"]=n.apiKey,l["anthropic-version"]="2023-06-01"):l.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:l,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(c.dispatcher=V(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let a=await fetch(s,c);if(a.ok)return{success:!0};let u=await a.text().catch(()=>"");return{success:!1,error:`HTTP ${a.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(l){return{success:!1,error:l?.message||l?.toString()||"Unknown ping error"}}}function or(n,e,t,o,r){return ke||(ke=new Pt(n,e,t,o,r)),ke}function Ie(n,e,t,o,r){let s=or(n,e,t,o,r);return s.start(),s}function Xn(){ke&&ke.stop()}function Et(){ke&&(ke.stop(),ke=null)}var rl,sl,il,Pt,ke,qn=w(()=>{"use strict";ce();ze();tr();Qe();yo();ae();rl="x-claude-code-router-source",sl="x-claude-code-router-version";il={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};Pt=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s){this.config={...il,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,i;t.success?i=s?"slow":"healthy":i=t.errorKind==="timeout"?"timeout":"error";let l=this.probeTelemetry.get(e),c={provider:e,latencyMs:t.latencyMs,status:i,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:l?.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.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.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&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let i=Yn(s.baseUrl),l=Array.isArray(s.models)?s.models:[],c=this.resolveProxyUrl?.(s);if(!i){let a;try{a=new URL(s.baseUrl).hostname}catch{a=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(a?` (host: ${a})`:"")+" \u2014 skipping quota probe")}i&&o.push({provider:s.name,models:l,type:"quota-adapter",promise:i.queryQuota(s,this.config.probeTimeoutMs,c).then(a=>{if(a){dn(s.name,a),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=a.limitDaily!==void 0&&a.usedDailyBalance!==void 0&&a.usedDailyBalance>=a.limitDaily,d=a.totalBalance!==void 0&&a.usedBalance!==void 0&&a.usedBalance>=a.totalBalance;if(u||d){let g=u?`Quota exhausted: 5h limit reached (${a.usedDailyBalance}/${a.limitDaily})`:`Quota exhausted: 7d balance depleted (${a.usedBalance}/${a.totalBalance})`;for(let m of l){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,g)}this.logger?.warn?.(`${g} for ${s.name}, marked as unhealthy`)}else for(let g of l){let m=t.getState(s.name,g);m&&m.status==="open"&&m.lastError?.includes("Quota exhausted")&&(t.recover(s.name,g),this.logger?.info?.(`Quota recovered for ${s.name} (${g}), marked as healthy`))}}})}),ul(s.baseUrl)&&o.push({provider:s.name,models:l,type:"rate-limit-headers",promise:nr(s,this.config.probeTimeoutMs,c).then(a=>{this.recordProbe(s.name,a,"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 i=r[s];if(i.status==="rejected"){let l=o[s];this.logger?.warn?.(`Quota probe failed for ${l.provider} (${l.type}): ${i.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!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=>nr(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],i=o[r],l=Array.isArray(s.models)?s.models:[];if(i.status==="fulfilled"){let c=i.value;if(this.recordProbe(s.name,c,"health"),c.success){let a=0;for(let u of l){let d=e.getState(s.name,u);if(d&&d.status==="open"){let g=d.lastError?.includes("Quota exhausted"),m=d.rateLimitUntil||d.lastError&&(d.lastError.includes("429")||d.lastError.toLowerCase().includes("rate limit")||d.lastError.toLowerCase().includes("rate_limit")||d.lastError.toLowerCase().includes("too many requests")||d.lastError.toLowerCase().includes("\u9650\u6D41"));if(g){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(m||d.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),a++}a>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let a of l)e.recordFailure(s.name,a,c.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${c.error}`)}}else{this.recordProbe(s.name,{success:!1,error:i.reason?.message||String(i.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let c of l)e.recordFailure(s.name,c,i.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${i.reason}`)}}}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[i,...l]=s.split(","),c=l.join(",");if(!i||!c)continue;let a=e.getState(i,c);if(!a||!a.rateLimitUntil)continue;if(Date.now()>=a.rateLimitUntil){e.recover(i,c),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let u=o.find(d=>d?.name===i&&d.enabled!==!1);if(!u){this.logger?.warn?.(`Provider ${i} not found or disabled for rate-limit probe`);continue}try{let d=await pl(u,c,r,this.resolveProxyUrl?.(u),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(i,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 g=Date.now();a.rateLimitUntil&&a.rateLimitUntil>g?a.rateLimitUntil+=120*1e3:a.rateLimitUntil=g+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(l=>l?.name&&l.enabled!==!1&&l.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=cl(t),i=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let l of e){let c=l.wakeupTime||i,[a,u]=c.split(":"),d=parseInt(a,10),g=parseInt(u,10);if(isNaN(d)||isNaN(g))continue;let m=o>d||o===d&&r>=g,y=(d*60+g)*6e4-(o*60+r)*6e4,p=y>0&&y<=300*1e3;(m||p)&&!this.hasWakeupFiredToday(l.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${l.name} at ${c}`),dl(l,3e4,this.resolveProxyUrl?.(l),this.logger).then(f=>{f.success?this.logger?.info?.(`Successfully woke up provider ${l.name}`):this.logger?.error?.(`Failed to wake up provider ${l.name}: ${f.error}`)}).catch(f=>{this.logger?.error?.(`Error in wake-up task for ${l.name}: ${f}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?al(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(l=>l.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 nr(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o)),s=this.recordProbe(o.name,r,"manual"),i=Array.isArray(o.models)?o.models:[];if(r.success)for(let l of i)j().recordSuccess(o.name,l);else for(let l of i)j().recordFailure(o.name,l,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},ke=null});var Ei=w(()=>{"use strict"});var rr,nt,Oi=w(()=>{"use strict";rr=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()}},nt=new rr});var ue,sr=w(()=>{"use strict";ue=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
304
- `);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 Me,ir=w(()=>{"use strict";Me=class extends TransformStream{constructor(){super({transform:(e,t)=>{let o="";e.event&&(o+=`event: ${e.event}
303
+ Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.values(ki).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 Ti,St,vi=w(()=>{"use strict";Ti=require("tiktoken"),St=class{type="tiktoken";name;encoding;constructor(e="cl100k_base"){this.name=`tiktoken-${e}`;try{this.encoding=(0,Ti.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:i}=e;return Array.isArray(r)&&r.forEach(c=>{typeof c.content=="string"?o+=t.encode(c.content).length:Array.isArray(c.content)&&c.content.forEach(l=>{if(l.type==="text")o+=t.encode(l.text).length;else if(l.type==="tool_use")o+=t.encode(JSON.stringify(l.input)).length;else if(l.type==="tool_result"){let a=typeof l.content=="string"?l.content:JSON.stringify(l.content);o+=t.encode(a).length}})}),typeof s=="string"?o+=t.encode(s).length:Array.isArray(s)&&s.forEach(c=>{c.type==="text"&&(typeof c.text=="string"?o+=t.encode(c.text).length:Array.isArray(c.text)&&c.text.forEach(l=>{o+=t.encode(l||"").length}))}),i&&i.forEach(c=>{c.description&&(o+=t.encode(c.name+c.description).length),c.input_schema&&(o+=t.encode(JSON.stringify(c.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 Rt,Ci,nt,wt,xi,Qn,Si=w(()=>{"use strict";Rt=require("path"),Ci=require("os"),nt=require("fs"),wt=require("fs"),xi=require("@huggingface/tokenizers"),Qn=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,Rt.join)((0,Ci.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,Rt.join)(this.cacheDir,this.safeModelName);return{modelDir:e,tokenizerJson:(0,Rt.join)(e,"tokenizer.json"),tokenizerConfig:(0,Rt.join)(e,"tokenizer_config.json")}}ensureDir(e){(0,nt.existsSync)(e)||(0,nt.mkdirSync)(e,{recursive:!0})}async loadFromCache(){try{let e=this.getCachePaths();if(!(0,nt.existsSync)(e.tokenizerJson)||!(0,nt.existsSync)(e.tokenizerConfig))return null;let[t,o]=await Promise.all([wt.promises.readFile(e.tokenizerJson,"utf-8"),wt.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,i]=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[c,l]=await Promise.all([s.json(),i.ok?i.json():Promise.resolve({})]);return this.ensureDir(e.modelDir),await Promise.all([wt.promises.writeFile(e.tokenizerJson,JSON.stringify(c,null,2)),wt.promises.writeFile(e.tokenizerConfig,JSON.stringify(l,null,2))]),{tokenizerJson:c,tokenizerConfig:l}}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 xi.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 i of o)if(typeof i.content=="string")t.push(i.content);else if(Array.isArray(i.content))for(let c of i.content)c.type==="text"&&c.text?t.push(c.text):c.type==="tool_use"&&c.input?t.push(JSON.stringify(c.input)):c.type==="tool_result"&&t.push(typeof c.content=="string"?c.content:JSON.stringify(c.content))}if(typeof r=="string")t.push(r);else if(Array.isArray(r)){for(let i of r)if(i.type==="text"){if(typeof i.text=="string")t.push(i.text);else if(Array.isArray(i.text))for(let c of i.text)c&&t.push(c)}}if(s)for(let i of s)i.name&&t.push(i.name),i.description&&t.push(i.description),i.input_schema&&t.push(JSON.stringify(i.input_schema));return t.join(" ")}}});var Vn,Ri=w(()=>{"use strict";ce();Vn=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),i={method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal},c=this.options.resolveProxyUrl?.();c&&(i.dispatcher=V(c));let l=await fetch(this.config.url,i);if(clearTimeout(s),!l.ok)throw new Error(`API tokenizer request failed: ${l.status} ${l.statusText}`);let a=await l.json();return this.extractTokenCount(a)}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"?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 Me,Bo=w(()=>{"use strict";vi();Si();Ri();ce();Me=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 St("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 St(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new Qn(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new Vn(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return pe(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 wi(n){if(!n||typeof n!="object"||Yc(n))return null;for(let t of Vc(n)){let o=Qc(t);if(o)return o}return null}function Qc(n){if(!n||typeof n!="object")return null;let e={},t=Yn(n,Bc);if(t!==void 0){let i=Pi(t);e.usedDailyBalance=i,e.limitDaily=100}let o=Yn(n,Wc);if(o!==void 0){let i=Pi(o);e.usedBalance=i,e.totalBalance=100}let r=Yn(n,Gc);if(r!==void 0){let i=Ei(r);i&&(e.resetTime=i)}let s=Yn(n,Kc);if(s!==void 0){let i=Ei(s);i&&(e.resetTime7d=i,e.resetTime||(e.resetTime=i))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function Pi(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function Yn(n,e){for(let t of e){let o=$(n?.[t]);if(o!==void 0)return o}}function Vc(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 i of o)s[i]&&typeof s[i]=="object"&&r(s[i])}};return r(n),e}function Yc(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 Ei(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 Xn(n){let e=nr(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?rl:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?sl:e==="deepseek.com"||e.endsWith(".deepseek.com")?Xc:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?qc:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Zc:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?el:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?tl:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?nl:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?ol:null:null}function il(n){let e=nr(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function al(n,e){let t=er(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let i=s?.codingPlanAppCredentialDTO||s?.appCredential||s,c=String(i?.apiKey||i?.api_key||"").trim();return c&&o.some(l=>l.includes(c)||c.includes(l))})||t[0]}function er(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>er(e)):Object.values(n).flatMap(e=>er(e))}function tr(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function nr(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function $(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 ue,Wo,Go,Ko,Qo,Vo,Bc,Wc,Gc,Kc,Yo,Xo,qo,Zo,Xc,qc,Zc,el,tl,nl,ol,rl,sl,or=w(()=>{"use strict";ce();ue=class{async fetchJson(e,t,o,r,s){let i=s||t.apiKey;if(!i)return null;let c={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${i}`},signal:AbortSignal.timeout(o)};try{r&&(c.dispatcher=V(r));let l=await fetch(e,c);return l.ok?await l.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}},Wo=class extends ue{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),i=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(l=>$(l?.total_balance)!==void 0);if(!i)return null;let c=$(i.total_balance);return c===void 0?null:{totalBalance:c,currency:typeof i.currency=="string"?i.currency:void 0}}},Go=class extends ue{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 i={},c=$(s.limit),l=$(s.limit_remaining),a=$(s.usage),u=$(s.usage_daily);return c!==void 0&&(i.totalBalance=c),l!==void 0&&(i.remainingBalance=l),a!==void 0&&(i.usedBalance=a),u!==void 0&&(i.usedDailyBalance=u),this.hasQuotaData(i)?i:null}},Ko=class extends ue{async queryQuota(e,t,o){let r=il(e.baseUrl),i=(await this.fetchJson(r,e,t,o))?.data;if(!i||typeof i!="object")return null;let c={},l=$(i.totalBalance),a=$(i.balance);return l!==void 0&&(c.totalBalance=l),a!==void 0&&(c.remainingBalance=a),l!==void 0&&a!==void 0&&(c.usedBalance=Math.max(0,l-a)),this.hasQuotaData(c)?c:null}},Qo=class extends ue{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=V(o));let i=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!i.ok)return null;let c=await i.json(),l=Array.isArray(c?.data?.limits)?c.data.limits:[],a=null,u=null,d=null;for(let f of l)f.type==="TOKENS_LIMIT"?f.unit===3?a=f:f.unit===6?u=f:a||(a=f):f.type==="TIME_LIMIT"&&(d=f);let m={};if(a){let f=$(a.currentValue),y=$(a.usage),p=$(a.remaining),g=$(a.percentage);f!==void 0?m.usedDailyBalance=f:g!==void 0&&(m.usedDailyBalance=g,m.limitDaily=100),y!==void 0?m.limitDaily=y:f!==void 0&&p!==void 0&&(m.limitDaily=f+p),a.nextResetTime&&(m.resetTime=new Date(a.nextResetTime).toISOString())}if(u){let f=$(u.currentValue),y=$(u.usage),p=$(u.remaining),g=$(u.percentage);f!==void 0?m.usedBalance=f:g!==void 0&&(m.usedBalance=g,m.totalBalance=100),y!==void 0?m.totalBalance=y:f!==void 0&&p!==void 0&&(m.totalBalance=f+p),u.nextResetTime&&!m.resetTime&&(m.resetTime=new Date(u.nextResetTime).toISOString())}if(d){if(m.usedDailyBalance===void 0){let f=$(d.currentValue);f!==void 0&&(m.usedDailyBalance=f)}if(m.limitDaily===void 0){let f=$(d.usage),y=$(d.currentValue),p=$(d.remaining);f!==void 0?m.limitDaily=f:y!==void 0&&p!==void 0&&(m.limitDaily=y+p)}d.nextResetTime&&!m.resetTime&&(m.resetTime=new Date(d.nextResetTime).toISOString())}return this.hasQuotaData(m)?m:null}catch{return null}}},Vo=class extends ue{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"}}}),i=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=V(o));let c=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:i});if(!c.ok)return null;let a=(await c.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(a)||a.length===0)return null;let u=a[0]?.codingPlanQuotaInfo;if(!u)return null;let d={},m=$(u.per5HourUsedQuota),f=$(u.per5HourTotalQuota);m!==void 0&&(d.usedDailyBalance=m),f!==void 0&&(d.limitDaily=f);let y=$(u.perWeekUsedQuota),p=$(u.perWeekTotalQuota);return y!==void 0&&(d.usedBalance=y),p!==void 0&&(d.totalBalance=p),this.hasQuotaData(d)?d:null}catch{return null}}};Bc=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],Wc=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],Gc=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],Kc=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];Yo=class extends ue{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let i=await this.queryOfficialEndpoint(r,s,t,o);if(i)return i}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",i=tr(e,"cna")||"",c=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":i}}}),l=new URLSearchParams({params:c,region:"cn-beijing",sec_token:t}).toString(),a={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:l,signal:AbortSignal.timeout(o)};try{r&&(a.dispatcher=V(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,a);if(!u.ok)return null;let d=await u.json();return wi(d)}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"}}}),i=new URLSearchParams({params:s,region:"cn-beijing"}).toString(),c={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:i,signal:AbortSignal.timeout(t)};try{o&&(c.dispatcher=V(o));let l=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,c);if(!l.ok)return null;let a=await l.json();return wi(a)}catch{return null}}},Xo=class extends ue{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:(tr(e.quotaToken,"atp-auth-token")||tr(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=V(o));let i=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!i.ok)return null;let c=await i.json();if(c?.succeed===!1||c?.failed===!0)return null;let l=al(c,e.apiKey),a=l?.codingPlanUsageDTO||l?.usage||l;if(!a||typeof a!="object")return null;let u={},d=$(a.rp5hUsage),m=$(a.rp5hLimit);d!==void 0&&(u.usedDailyBalance=d),m!==void 0&&(u.limitDaily=m);let f=$(a.rpwUsage),y=$(a.rpwLimit);return f!==void 0&&(u.usedBalance=f),y!==void 0&&(u.totalBalance=y),u.remainingBalance===void 0&&y!==void 0&&f!==void 0&&(u.remainingBalance=Math.max(0,y-f)),this.hasQuotaData(u)?u:null}catch{return null}}},qo=class extends ue{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=V(o));let i=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!i.ok)return null;let c=await i.json(),l={},a=Array.isArray(c?.limits)?c.limits:[];if(a.length>0&&a[0]?.detail){let d=a[0].detail,m=$(d.limit),f=$(d.remaining),y=d.resetTime;m!==void 0&&f!==void 0&&(l.usedDailyBalance=Math.max(0,m-f),l.limitDaily=m),y&&(l.resetTime=new Date(y).toISOString())}let u=c?.usage;if(u){let d=$(u.limit),m=$(u.remaining),f=$(u.used),y=u.resetTime;d!==void 0&&(l.totalBalance=d,f!==void 0?l.usedBalance=f:m!==void 0&&(l.usedBalance=Math.max(0,d-m),l.remainingBalance=m)),y&&(l.resetTime7d=new Date(y).toISOString(),l.resetTime||(l.resetTime=l.resetTime7d))}return this.hasQuotaData(l)?l:null}catch{return null}}},Zo=class extends ue{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=nr(e.baseUrl)||"api.minimaxi.com",i=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let c=[`https://${i}/v1/token_plan/remains`,`https://${i}/v1/api/openplatform/coding_plan/remains`],l=null;for(let b of c)if(l=await this.fetchJson(b,e,t,o,r.trim()),l)break;if(!l)return null;if(l?.base_resp){let b=l.base_resp.status_code;if(b!==void 0&&b!==0)return null}let a=Array.isArray(l?.model_remains)?l.model_remains:[];if(a.length===0)return null;let u=a[0],d={},m=$(u.current_interval_total_count),f=$(u.current_interval_usage_count),y=$(u.current_interval_remaining_percent),p=$(u.end_time);m!==void 0&&f!==void 0&&m>0?(d.usedDailyBalance=Math.max(0,m-f),d.limitDaily=m):y!==void 0&&(d.limitDaily=100,d.usedDailyBalance=Math.max(0,100-y)),p&&(d.resetTime=new Date(p).toISOString());let g=$(u.current_weekly_total_count),_=$(u.current_weekly_usage_count),k=$(u.current_weekly_remaining_percent),h=$(u.weekly_end_time);return g!==void 0&&_!==void 0&&g>0?(d.usedBalance=Math.max(0,g-_),d.remainingBalance=_,d.totalBalance=g):k!==void 0&&(d.totalBalance=100,d.usedBalance=Math.max(0,100-k),d.remainingBalance=k),h&&!d.resetTime&&(d.resetTime=new Date(h).toISOString()),this.hasQuotaData(d)?d:null}catch{return null}}},Xc=new Wo,qc=new Go,Zc=new Ko,el=new Qo,tl=new Vo,nl=new Yo,ol=new Xo,rl=new qo,sl=new Zo});function Oi(n){return{[cl]:n,[ll]:sn}}function dl(n){return n===!0||n==="true"||n===1||n==="1"}function pl(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 fl(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 ml(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function rr(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o)),s=fl(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let i={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(i.dispatcher=V(t));let c=await fetch(s,i);if(c.headers&&gt(n.name,n.baseUrl,c.headers),c.ok)return{success:!0,headers:c.headers,latencyMs:r()};if(c.status===429)return{success:!1,error:`HTTP 429: ${(await c.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:c.headers,latencyMs:r(),errorKind:"http"};if(c.status>=400&&c.status<500)return{success:!0,headers:c.headers,latencyMs:r()};let l=await c.text().catch(()=>"");return{success:!1,error:`HTTP ${c.status}: ${l.slice(0,100)}`,headers:c.headers,latencyMs:r(),errorKind:"http"}}catch(i){let c=i?.message||i?.toString()||"Unknown probe error",l=i?.name==="TimeoutError"||i?.name==="AbortError"||i?.code===20||i?.code==="ABORT_ERR";return{success:!1,error:c,latencyMs:r(),errorKind:l?"timeout":"network"}}}async function gl(n,e,t,o){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,i=n.baseUrl.includes("/messages")||r.includes("claude");try{let c={"Content-Type":"application/json",...Oi("scheduled-wakeup")};i?(c["x-api-key"]=n.apiKey,c["anthropic-version"]="2023-06-01"):c.Authorization=`Bearer ${n.apiKey}`;let l={method:"POST",headers:c,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&&(l.dispatcher=V(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let a=await fetch(s,l);if(a.ok)return{success:!0};let u=await a.text().catch(()=>"");return{success:!1,error:`HTTP ${a.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(c){return{success:!1,error:c?.message||c?.toString()||"Unknown wake-up error"}}}async function hl(n,e,t,o,r){let s=n.baseUrl,i=n.baseUrl.includes("/messages")||e.includes("claude");try{let c={"Content-Type":"application/json",...Oi("rate-limit-probe")};i?(c["x-api-key"]=n.apiKey,c["anthropic-version"]="2023-06-01"):c.Authorization=`Bearer ${n.apiKey}`;let l={method:"POST",headers:c,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(l.dispatcher=V(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let a=await fetch(s,l);if(a.ok)return{success:!0};let u=await a.text().catch(()=>"");return{success:!1,error:`HTTP ${a.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(c){return{success:!1,error:c?.message||c?.toString()||"Unknown ping error"}}}function sr(n,e,t,o,r){return Te||(Te=new Pt(n,e,t,o,r)),Te}function $e(n,e,t,o,r){let s=sr(n,e,t,o,r);return s.start(),s}function qn(){Te&&Te.stop()}function Et(){Te&&(Te.stop(),Te=null)}var cl,ll,ul,Pt,Te,Zn=w(()=>{"use strict";le();Be();or();Ye();_o();ce();cl="x-claude-code-router-source",ll="x-claude-code-router-version";ul={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};Pt=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s){this.config={...ul,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,i;t.success?i=s?"slow":"healthy":i=t.errorKind==="timeout"?"timeout":"error";let c=this.probeTelemetry.get(e),l={provider:e,latencyMs:t.latencyMs,status:i,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:c?.lastSuccessAt,source:o};return this.probeTelemetry.set(e,l),s&&this.logger?.warn?.(`Slow network detected for provider ${e}: probe took ${t.latencyMs} ms (threshold ${this.config.slowThresholdMs} ms)`),l}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.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.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&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let i=Xn(s.baseUrl),c=Array.isArray(s.models)?s.models:[],l=this.resolveProxyUrl?.(s);if(!i){let a;try{a=new URL(s.baseUrl).hostname}catch{a=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(a?` (host: ${a})`:"")+" \u2014 skipping quota probe")}i&&o.push({provider:s.name,models:c,type:"quota-adapter",promise:i.queryQuota(s,this.config.probeTimeoutMs,l).then(a=>{if(a){dn(s.name,a),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=a.limitDaily!==void 0&&a.usedDailyBalance!==void 0&&a.usedDailyBalance>=a.limitDaily,d=a.totalBalance!==void 0&&a.usedBalance!==void 0&&a.usedBalance>=a.totalBalance;if(u||d){let m=u?`Quota exhausted: 5h limit reached (${a.usedDailyBalance}/${a.limitDaily})`:`Quota exhausted: 7d balance depleted (${a.usedBalance}/${a.totalBalance})`;for(let f of c){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,m)}this.logger?.warn?.(`${m} for ${s.name}, marked as unhealthy`)}else for(let m of c){let f=t.getState(s.name,m);f&&f.status==="open"&&f.lastError?.includes("Quota exhausted")&&(t.recover(s.name,m),this.logger?.info?.(`Quota recovered for ${s.name} (${m}), marked as healthy`))}}})}),ml(s.baseUrl)&&o.push({provider:s.name,models:c,type:"rate-limit-headers",promise:rr(s,this.config.probeTimeoutMs,l).then(a=>{this.recordProbe(s.name,a,"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 i=r[s];if(i.status==="rejected"){let c=o[s];this.logger?.warn?.(`Quota probe failed for ${c.provider} (${c.type}): ${i.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!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=>rr(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],i=o[r],c=Array.isArray(s.models)?s.models:[];if(i.status==="fulfilled"){let l=i.value;if(this.recordProbe(s.name,l,"health"),l.success){let a=0;for(let u of c){let d=e.getState(s.name,u);if(d&&d.status==="open"){let m=d.lastError?.includes("Quota exhausted"),f=d.rateLimitUntil||d.lastError&&(d.lastError.includes("429")||d.lastError.toLowerCase().includes("rate limit")||d.lastError.toLowerCase().includes("rate_limit")||d.lastError.toLowerCase().includes("too many requests")||d.lastError.toLowerCase().includes("\u9650\u6D41"));if(m){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(f||d.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),a++}a>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let a of c)e.recordFailure(s.name,a,l.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${l.error}`)}}else{this.recordProbe(s.name,{success:!1,error:i.reason?.message||String(i.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let l of c)e.recordFailure(s.name,l,i.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${i.reason}`)}}}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[i,...c]=s.split(","),l=c.join(",");if(!i||!l)continue;let a=e.getState(i,l);if(!a||!a.rateLimitUntil)continue;if(Date.now()>=a.rateLimitUntil){e.recover(i,l),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let u=o.find(d=>d?.name===i&&d.enabled!==!1);if(!u){this.logger?.warn?.(`Provider ${i} not found or disabled for rate-limit probe`);continue}try{let d=await hl(u,l,r,this.resolveProxyUrl?.(u),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(i,l);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();a.rateLimitUntil&&a.rateLimitUntil>m?a.rateLimitUntil+=120*1e3:a.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(c=>c?.name&&c.enabled!==!1&&c.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=pl(t),i=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let c of e){let l=c.wakeupTime||i,[a,u]=l.split(":"),d=parseInt(a,10),m=parseInt(u,10);if(isNaN(d)||isNaN(m))continue;let f=o>d||o===d&&r>=m,y=(d*60+m)*6e4-(o*60+r)*6e4,p=y>0&&y<=300*1e3;(f||p)&&!this.hasWakeupFiredToday(c.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${c.name} at ${l}`),gl(c,3e4,this.resolveProxyUrl?.(c),this.logger).then(g=>{g.success?this.logger?.info?.(`Successfully woke up provider ${c.name}`):this.logger?.error?.(`Failed to wake up provider ${c.name}: ${g.error}`)}).catch(g=>{this.logger?.error?.(`Error in wake-up task for ${c.name}: ${g}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?dl(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(c=>c.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 rr(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o)),s=this.recordProbe(o.name,r,"manual"),i=Array.isArray(o.models)?o.models:[];if(r.success)for(let c of i)j().recordSuccess(o.name,c);else for(let c of i)j().recordFailure(o.name,c,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},Te=null});var Ai=w(()=>{"use strict"});var ir,ot,Ii=w(()=>{"use strict";ir=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()}},ot=new ir});var de,ar=w(()=>{"use strict";de=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
304
+ `);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 Ne,cr=w(()=>{"use strict";Ne=class extends TransformStream{constructor(){super({transform:(e,t)=>{let o="";e.event&&(o+=`event: ${e.event}
305
305
  `),e.id&&(o+=`id: ${e.id}
306
306
  `),e.retry&&(o+=`retry: ${e.retry}
307
307
  `),e.data&&(e.data.type==="done"?o+=`data: [DONE]
308
308
  `:o+=`data: ${JSON.stringify(e.data)}
309
309
  `),o+=`
310
- `,t.enqueue(o)}})}}});var Ot,ar=w(()=>{"use strict";Ot=(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 i=await e(s,o);i!==void 0&&o.enqueue(i)}}catch(r){o.error(r)}finally{t.releaseLock()}}})}});var cr=w(()=>{"use strict";sr();ir();ar()});var Ai=w(()=>{"use strict"});var At,lr=w(()=>{"use strict";At=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:i}=t||{},l="";if(r){let c=new Date().toISOString();l+=this.config.colors?`${this.colors.cyan}[${c}]${this.colors.reset} `:`[${c}] `}switch(s&&(l+=this.config.colors?`${this.colors.bright}${s}${this.colors.reset} `:`${s} `),o){case"json":l+=JSON.stringify(e,null,2);break;case"markdown":typeof e=="object"?l+=this.toMarkdown(e):l+=String(e);break;case"text":default:typeof e=="object"?l+=JSON.stringify(e,null,2):l+=String(e);break}return i&&Object.keys(i).length>0&&(l+=`
311
- `+(this.config.colors?`${this.colors.dim}`:""),l+="Metadata: "+JSON.stringify(i,null,2),this.config.colors&&(l+=this.colors.reset)),l}toMarkdown(e,t=0){let o=" ".repeat(t);return Array.isArray(e)?e.map(r=>typeof r=="object"?`${o}-
310
+ `,t.enqueue(o)}})}}});var Ot,lr=w(()=>{"use strict";Ot=(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 i=await e(s,o);i!==void 0&&o.enqueue(i)}}catch(r){o.error(r)}finally{t.releaseLock()}}})}});var ur=w(()=>{"use strict";ar();cr();lr()});var Mi=w(()=>{"use strict"});var At,dr=w(()=>{"use strict";At=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:i}=t||{},c="";if(r){let l=new Date().toISOString();c+=this.config.colors?`${this.colors.cyan}[${l}]${this.colors.reset} `:`[${l}] `}switch(s&&(c+=this.config.colors?`${this.colors.bright}${s}${this.colors.reset} `:`${s} `),o){case"json":c+=JSON.stringify(e,null,2);break;case"markdown":typeof e=="object"?c+=this.toMarkdown(e):c+=String(e);break;case"text":default:typeof e=="object"?c+=JSON.stringify(e,null,2):c+=String(e);break}return i&&Object.keys(i).length>0&&(c+=`
311
+ `+(this.config.colors?`${this.colors.dim}`:""),c+="Metadata: "+JSON.stringify(i,null,2),this.config.colors&&(c+=this.colors.reset)),c}toMarkdown(e,t=0){let o=" ".repeat(t);return Array.isArray(e)?e.map(r=>typeof r=="object"?`${o}-
312
312
  ${this.toMarkdown(r,t+1)}`:`${o}- ${r}`).join(`
313
313
  `):typeof e=="object"&&e!==null?Object.entries(e).map(([r,s])=>typeof s=="object"&&s!==null?`${o}${r}:
314
314
  ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
315
- `):`${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 It,ur=w(()=>{"use strict";It=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:i}=t||{},l={data:e};return r&&(l.timestamp=new Date().toISOString()),s&&(l.prefix=s),i&&Object.keys(i).length>0&&(l.metadata=i),l}async sendRequest(e,t,o,r,s){let i=new AbortController,l=setTimeout(()=>i.abort(),s);try{let c=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:i.signal});if(clearTimeout(l),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c}catch(c){throw clearTimeout(l),c}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,i){let l=null;for(let c=1;c<=i.maxAttempts;c++)try{return await this.sendRequest(e,t,o,r,s)}catch(a){if(l=a,c===i.maxAttempts)break;let u=i.backoffMs*Math.pow(2,c-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${c}/${i.maxAttempts}), retrying in ${u}ms...`,a.message),await this.delay(u)}throw l}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),i=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}`)}}}});var ot,dr,Ii,Mt,pr=w(()=>{"use strict";ot=require("fs"),dr=require("path"),Ii=require("os"),Mt=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,Ii.tmpdir)();this.baseDir=(0,dr.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,ot.existsSync)(this.baseDir)||(0,ot.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r;if(this.config.includeTimestamp){let s=Date.now();r=`${t}-${e}-${s}${o}`}else r=`${t}-${e}${o}`;return(0,dr.join)(this.baseDir,r)}async output(e,t={}){try{let o=t.metadata?.sessionId;if(!o)return!1;let r={...e,timestamp:Date.now(),sessionId:o},s=this.getFilePath(o);return(0,ot.writeFileSync)(s,JSON.stringify(r,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}});var fr,rt,Mi=w(()=>{"use strict";lr();ur();pr();fr=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 At(e.config);case"webhook":return new It(e.config);case"temp-file":return new Mt(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([i,l])=>{try{await l.output(e,o)?r.success.push(i):r.failed.push(i)}catch(c){console.error(`[OutputManager] Handler ${i} failed:`,c),r.failed.push(i)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},i=e.map(async l=>{let c=this.handlers.get(l);if(!c){console.warn(`[OutputManager] Handler ${l} not found`),s.failed.push(l);return}try{await c.output(t,r)?s.success.push(l):s.failed.push(l)}catch(a){console.error(`[OutputManager] Handler ${l} failed:`,a),s.failed.push(l)}});return await Promise.all(i),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,i])=>i.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},rt=new fr});var mr=w(()=>{"use strict";Ai();lr();ur();pr();Mi()});function $i(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,fl);return Math.round(n/o)}function Nt(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function Ni(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()},i={prefix:r,metadata:{sessionId:n.sessionId},...t};for(let l of e)try{await rt.outputToType(l,s,i)}catch(c){console.error(`[TokenSpeedPlugin] Failed to output to ${l}:`,c)}}var Li,$t,gr,fl,Lt,Di=w(()=>{"use strict";Li=X(require("fastify-plugin"),1);cr();mr();yt();$t=new Map,gr=new Map,fl=1,Lt={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,Li.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)rt.registerHandlers(t.outputHandlers);else{let i=[];for(let l of o)l==="console"?i.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):l==="temp-file"?i.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):l==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");i.length>0&&rt.registerHandlers(i)}t.outputOptions&&rt.setDefaultOptions(t.outputOptions);let r=async i=>{let l=n.tokenizerService;if(!l)return n.log?.warn("TokenizerService not available"),null;if(!i.provider||!i.model)return null;let c=i.provider,a=i.model,u=`${c}:${a}`;if(gr.has(u))return gr.get(u);let d=l.getTokenizerConfigForModel(c,a);if(!d)return n.log?.debug(`No tokenizer config for ${c}:${a}, using fallback`),null;try{let g=await l.getTokenizer(d,c);return gr.set(u,g),n.log?.info(`Created tokenizer for ${c}:${a} - ${g.name}`),g}catch(g){return n.log?.warn(`Failed to create tokenizer for ${c}:${a}: ${g.message}`),null}},s=i=>{let l=new URL(`http://127.0.0.1${i}`).pathname;return l.endsWith("/v1/messages")||l.endsWith("/v1/responses")};n.addHook("onRequest",async i=>{s(i.url)&&(i.requestStartTime=performance.now())}),n.addHook("onSend",async(i,l,c)=>{let a=i.requestStartTime;if(!a)return;let u=i.id||Date.now().toString(),d=i.usageSessionId;if(!d)try{d=Ve(i.body?.metadata?.user_id)}catch{}if(!d){let f=i.headers?.["x-request-id"],_=Array.isArray(f)?f[0]:f;d=(typeof _=="string"?_:void 0)||u}let g=await r(i);if(c instanceof ReadableStream){$t.set(u,{requestId:u,sessionId:d,startTime:a,lastTokenTime:a,tokenCount:0,tokensPerSecond:0,stream:!0});let[f,_]=c.tee(),k=async()=>{let h=null,b=async T=>{let x=$t.get(u);if(!x)return;let v=x.firstTokenTime?x.firstTokenTime-x.startTime:0,C=(T?x.lastTokenTime:performance.now())-x.startTime;x.tokensPerSecond=$i(x.tokenCount,C,v),await Ni(x,o,t.outputOptions,T).catch(P=>{n.log?.warn(`Failed to output streaming stats: ${P.message}`)})};try{let x=_.pipeThrough(new TextDecoderStream).pipeThrough(new ue).getReader();for(h=setInterval(async()=>{$t.get(u)&&await b(!1)},1e3);;){let{done:v,value:S}=await x.read();if(v)break;let C=S,P=$t.get(u);if(!P)continue;let R=performance.now(),A=C.event||C.data?.type,O=C.event==="content_block_start"||C.event==="content_block_delta"||C.event==="text_block"||C.event==="content_block"||A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta";!P.firstTokenTime&&O&&(P.firstTokenTime=R,P.timeToFirstToken=Math.round(R-P.startTime));let I="";if(C.event==="content_block_delta"&&C.data?.delta){let L=C.data.delta.type;L==="text_delta"?I=C.data.delta.text||"":L==="input_json_delta"?I=C.data.delta.partial_json||"":L==="thinking_delta"&&(I=C.data.delta.thinking||"")}if((A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta")&&(I=typeof C.data?.delta=="string"?C.data.delta:""),I){let L=g&&g.encodeText?g.encodeText(I).length:Nt(I);P.tokenCount+=L,P.lastTokenTime=R}(C.event==="message_stop"||A==="response.completed"||A==="response.failed")&&(h&&(clearInterval(h),h=null),await b(!0),$t.delete(u))}}catch(T){h&&clearInterval(h),T.name!=="AbortError"&&T.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${T.message}`)}};return i.tokenSpeedCapturePromise=k().catch(h=>{console.log(h),n.log?.warn(`Background stats processing failed: ${h.message}`)}),f}let m=performance.now(),y=0,p=!1;if(c&&typeof c=="string")try{let f=JSON.parse(c);if(typeof f.usage?.output_tokens=="number")y=f.usage.output_tokens,p=!0;else{let _=f.content??f.message?.content;if(_!==void 0)if(p=!0,g)Array.isArray(_)?y=_.reduce((k,h)=>{if(h.type==="text"){let b=h.text||"";return k+(g.encodeText?g.encodeText(b).length:Nt(b))}return k},0):typeof _=="string"&&(y=g.encodeText?g.encodeText(_).length:Nt(_));else{let k=Array.isArray(_)?_.map(h=>h.text).join(""):typeof _=="string"?_:"";y=Nt(k)}}}catch{}if(p){let f=m-a,_={requestId:u,sessionId:d,startTime:a,lastTokenTime:m,tokenCount:y,tokensPerSecond:$i(y,f),stream:!1};await Ni(_,o,t.outputOptions,!0)}return c})})}});var hr=w(()=>{"use strict";Ei();Oi();Di();mr()});function Fi(){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 ne,_r,be,W,yr,Dt,Ft,Zn,se,Ut,$e,ml,eo,to=w(()=>{"use strict";ne=X(require("node:fs/promises"),1),_r=X(require("json5"),1),be=X(require("node:path"),1),W=require("@wengine-ai/claude-code-router-shared"),yr=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(yr);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=yr(o);return e}return n},Dt=async n=>{try{await ne.default.access(n)}catch{await ne.default.mkdir(n,{recursive:!0})}},Ft=async()=>{await Dt(W.HOME_DIR),await Dt(W.PLUGINS_DIR),await Dt(be.default.join(W.HOME_DIR,"logs"))},Zn=async()=>{let n=await ne.default.readFile(W.CONFIG_FILE,"utf-8");return _r.default.parse(n)},se=async()=>{try{let n=await ne.default.readFile(W.CONFIG_FILE,"utf-8");try{let e=_r.default.parse(n);return yr(e)}catch(e){console.error(`Failed to parse config file at ${W.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 Ft();let e=await Ut();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await $e(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 ${W.CONFIG_FILE}`),console.error("Error details:",n.message),process.exit(1)}};Ut=async()=>{Fi();try{if(await ne.default.access(W.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${W.CONFIG_FILE}.${n}.bak`;await ne.default.copyFile(W.CONFIG_FILE,e);try{let t=be.default.dirname(W.CONFIG_FILE),o=be.default.basename(W.CONFIG_FILE),s=(await ne.default.readdir(t)).filter(i=>i.startsWith(o)&&i.endsWith(".bak")).sort().reverse();if(s.length>3)for(let i=3;i<s.length;i++){let l=be.default.join(t,s[i]);await ne.default.unlink(l)}}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},$e=async n=>{Fi(),await Dt(W.HOME_DIR),await ml();let e=`${JSON.stringify(n,null,2)}`;await ne.default.writeFile(W.CONFIG_FILE,e)},ml=async()=>{if(!await ne.default.access(W.CONFIG_FILE).then(()=>!0).catch(()=>!1))return;let e=be.default.join(W.HOME_DIR,"config-history");await Dt(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=be.default.join(e,`config-${t}.json`);await ne.default.copyFile(W.CONFIG_FILE,o);try{let s=(await ne.default.readdir(e)).filter(i=>i.startsWith("config-")&&i.endsWith(".json")).sort().reverse();if(s.length>50)for(let i of s.slice(50))await ne.default.unlink(be.default.join(e,i))}catch(r){console.warn("Failed to prune config-history:",r)}},eo=async()=>{let n=await se();return Object.assign(process.env,n),n}});function gl(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function hl(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:gl(n),cache_creation_input_tokens:hl(n)}}function jt(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 kr=w(()=>{"use strict"});function no(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(br(r,s))}return}if(Array.isArray(n)){for(let o of n)no(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))no(o,e,t)}}function Tr(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 i=Array.isArray(r?.models)?r.models:[];for(let l of i)l&&o.add(br(s,l))}return no(n?.Router,t,o),no(n?.fallback,t,o),o}function st(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Tr(n),r=0;for(let s of t.getAllStates()||[]){let i=s?.provider,l=s?.model;!i||!l||o.has(br(i,l))||(t.recover(i,l),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 Ht(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 yl,br,oo=w(()=>{"use strict";ce();yl="\0",br=(n,e)=>`${n}${yl}${e}`});function _l(n){return/\[1m\]/i.test(n)?1e6:2e5}function kl(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function bl(n,e=n){let t=_l(n),o=kl(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 zt(n){let e=new Map,t=(o,r=o)=>{!o||e.has(o)||e.set(o,bl(o,r))};t("ccr-opus","CCR Opus"),t("ccr-sonnet","CCR Sonnet"),t("ccr-haiku","CCR Haiku"),t("ccr-opus[1m]","CCR Opus 1M"),t("ccr-sonnet[1m]","CCR Sonnet 1M"),t("ccr-haiku[1m]","CCR Haiku 1M");for(let o of n.Providers||n.providers||[])if(!(!o?.name||!Array.isArray(o.models)))for(let r of o.models)typeof r!="string"||!r||(t(r,r),t(`${o.name},${r}`,`${o.name}/${r}`));return Array.from(e.values())}var Cr=w(()=>{"use strict"});function Tl(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var Jt,vr=w(()=>{"use strict";Jt=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||Tl(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let i=n.APIKEY;if(!i){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 l=e.headers.authorization||e.headers["x-api-key"],c=Array.isArray(l)?l[0]:l||"";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 a="";if(c.startsWith("Bearer")?a=c.split(" ")[1]:a=c,a!==i){t.log.warn({url:e.url,gotPrefix:a.slice(0,10),gotSuffix:a.slice(-6),gotLen:a.length,expectedPrefix:i.slice(0,6),expectedSuffix:i.slice(-6),expectedLen:i.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var Er={};Xt(Er,{append:()=>Kt,clear:()=>wr,close:()=>Dl,getOldestRecordTimestamp:()=>Fl,query:()=>Rr,querySummary:()=>Qt,readTokenSpeedStats:()=>Pr});function Rl(){(0,ie.existsSync)(so)||(0,ie.mkdirSync)(so,{recursive:!0})}function Gt(){if(Ce)return Ce;Rl();let n=new Hi.default(Cl);n.pragma("journal_mode = WAL"),n.pragma("synchronous = NORMAL"),n.pragma("busy_timeout = 5000");let e=n.pragma("user_version",{simple:!0})||0;return e<1&&(wl(n),n.pragma("user_version = 1")),e<2&&(n.prepare("PRAGMA table_info(usage_records)").all().some(o=>o.name==="upstream_model")||n.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),n.pragma("user_version = 2")),El(n),Bi(n,!0),Sr=n.prepare(`
315
+ `):`${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 It,pr=w(()=>{"use strict";It=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:i}=t||{},c={data:e};return r&&(c.timestamp=new Date().toISOString()),s&&(c.prefix=s),i&&Object.keys(i).length>0&&(c.metadata=i),c}async sendRequest(e,t,o,r,s){let i=new AbortController,c=setTimeout(()=>i.abort(),s);try{let l=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:i.signal});if(clearTimeout(c),!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);return l}catch(l){throw clearTimeout(c),l}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,i){let c=null;for(let l=1;l<=i.maxAttempts;l++)try{return await this.sendRequest(e,t,o,r,s)}catch(a){if(c=a,l===i.maxAttempts)break;let u=i.backoffMs*Math.pow(2,l-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${l}/${i.maxAttempts}), retrying in ${u}ms...`,a.message),await this.delay(u)}throw c}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),i=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}`)}}}});var rt,fr,$i,Mt,mr=w(()=>{"use strict";rt=require("fs"),fr=require("path"),$i=require("os"),Mt=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let t=(0,$i.tmpdir)();this.baseDir=(0,fr.join)(t,this.config.subdirectory),this.ensureDir()}ensureDir(){try{(0,rt.existsSync)(this.baseDir)||(0,rt.mkdirSync)(this.baseDir,{recursive:!0})}catch{}}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r;if(this.config.includeTimestamp){let s=Date.now();r=`${t}-${e}-${s}${o}`}else r=`${t}-${e}${o}`;return(0,fr.join)(this.baseDir,r)}async output(e,t={}){try{let o=t.metadata?.sessionId;if(!o)return!1;let r={...e,timestamp:Date.now(),sessionId:o},s=this.getFilePath(o);return(0,rt.writeFileSync)(s,JSON.stringify(r,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}});var gr,st,Ni=w(()=>{"use strict";dr();pr();mr();gr=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 At(e.config);case"webhook":return new It(e.config);case"temp-file":return new Mt(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([i,c])=>{try{await c.output(e,o)?r.success.push(i):r.failed.push(i)}catch(l){console.error(`[OutputManager] Handler ${i} failed:`,l),r.failed.push(i)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},i=e.map(async c=>{let l=this.handlers.get(c);if(!l){console.warn(`[OutputManager] Handler ${c} not found`),s.failed.push(c);return}try{await l.output(t,r)?s.success.push(c):s.failed.push(c)}catch(a){console.error(`[OutputManager] Handler ${c} failed:`,a),s.failed.push(c)}});return await Promise.all(i),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,i])=>i.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},st=new gr});var hr=w(()=>{"use strict";Mi();dr();pr();mr();Ni()});function Li(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,yl);return Math.round(n/o)}function Nt(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function Di(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()},i={prefix:r,metadata:{sessionId:n.sessionId},...t};for(let c of e)try{await st.outputToType(c,s,i)}catch(l){console.error(`[TokenSpeedPlugin] Failed to output to ${c}:`,l)}}var Fi,$t,yr,yl,Lt,Ui=w(()=>{"use strict";Fi=X(require("fastify-plugin"),1);ur();hr();Xe();$t=new Map,yr=new Map,yl=1,Lt={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:(0,Fi.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)st.registerHandlers(t.outputHandlers);else{let i=[];for(let c of o)c==="console"?i.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):c==="temp-file"?i.push({type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}):c==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");i.length>0&&st.registerHandlers(i)}t.outputOptions&&st.setDefaultOptions(t.outputOptions);let r=async i=>{let c=n.tokenizerService;if(!c)return n.log?.warn("TokenizerService not available"),null;if(!i.provider||!i.model)return null;let l=i.provider,a=i.model,u=`${l}:${a}`;if(yr.has(u))return yr.get(u);let d=c.getTokenizerConfigForModel(l,a);if(!d)return n.log?.debug(`No tokenizer config for ${l}:${a}, using fallback`),null;try{let m=await c.getTokenizer(d,l);return yr.set(u,m),n.log?.info(`Created tokenizer for ${l}:${a} - ${m.name}`),m}catch(m){return n.log?.warn(`Failed to create tokenizer for ${l}:${a}: ${m.message}`),null}},s=i=>{let c=new URL(`http://127.0.0.1${i}`).pathname;return c.endsWith("/v1/messages")||c.endsWith("/v1/responses")};n.addHook("onRequest",async i=>{s(i.url)&&(i.requestStartTime=performance.now())}),n.addHook("onSend",async(i,c,l)=>{let a=i.requestStartTime;if(!a)return;let u=i.id||Date.now().toString(),d=i.usageSessionId;if(!d)try{d=_e(i.body?.metadata?.user_id)}catch{}if(!d){let g=i.headers?.["x-request-id"],_=Array.isArray(g)?g[0]:g;d=(typeof _=="string"?_:void 0)||u}let m=await r(i);if(l instanceof ReadableStream){$t.set(u,{requestId:u,sessionId:d,startTime:a,lastTokenTime:a,tokenCount:0,tokensPerSecond:0,stream:!0});let[g,_]=l.tee(),k=async()=>{let h=null,b=async T=>{let x=$t.get(u);if(!x)return;let C=x.firstTokenTime?x.firstTokenTime-x.startTime:0,v=(T?x.lastTokenTime:performance.now())-x.startTime;x.tokensPerSecond=Li(x.tokenCount,v,C),await Di(x,o,t.outputOptions,T).catch(E=>{n.log?.warn(`Failed to output streaming stats: ${E.message}`)})};try{let x=_.pipeThrough(new TextDecoderStream).pipeThrough(new de).getReader();for(h=setInterval(async()=>{$t.get(u)&&await b(!1)},1e3);;){let{done:C,value:S}=await x.read();if(C)break;let v=S,E=$t.get(u);if(!E)continue;let R=performance.now(),A=v.event||v.data?.type,O=v.event==="content_block_start"||v.event==="content_block_delta"||v.event==="text_block"||v.event==="content_block"||A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta";!E.firstTokenTime&&O&&(E.firstTokenTime=R,E.timeToFirstToken=Math.round(R-E.startTime));let I="";if(v.event==="content_block_delta"&&v.data?.delta){let L=v.data.delta.type;L==="text_delta"?I=v.data.delta.text||"":L==="input_json_delta"?I=v.data.delta.partial_json||"":L==="thinking_delta"&&(I=v.data.delta.thinking||"")}if((A==="response.output_text.delta"||A==="response.function_call_arguments.delta"||A==="response.reasoning_summary_text.delta")&&(I=typeof v.data?.delta=="string"?v.data.delta:""),I){let L=m&&m.encodeText?m.encodeText(I).length:Nt(I);E.tokenCount+=L,E.lastTokenTime=R}(v.event==="message_stop"||A==="response.completed"||A==="response.failed")&&(h&&(clearInterval(h),h=null),await b(!0),$t.delete(u))}}catch(T){h&&clearInterval(h),T.name!=="AbortError"&&T.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${T.message}`)}};return i.tokenSpeedCapturePromise=k().catch(h=>{console.log(h),n.log?.warn(`Background stats processing failed: ${h.message}`)}),g}let f=performance.now(),y=0,p=!1;if(l&&typeof l=="string")try{let g=JSON.parse(l);if(typeof g.usage?.output_tokens=="number")y=g.usage.output_tokens,p=!0;else{let _=g.content??g.message?.content;if(_!==void 0)if(p=!0,m)Array.isArray(_)?y=_.reduce((k,h)=>{if(h.type==="text"){let b=h.text||"";return k+(m.encodeText?m.encodeText(b).length:Nt(b))}return k},0):typeof _=="string"&&(y=m.encodeText?m.encodeText(_).length:Nt(_));else{let k=Array.isArray(_)?_.map(h=>h.text).join(""):typeof _=="string"?_:"";y=Nt(k)}}}catch{}if(p){let g=f-a,_={requestId:u,sessionId:d,startTime:a,lastTokenTime:f,tokenCount:y,tokensPerSecond:Li(y,g),stream:!1};await Di(_,o,t.outputOptions,!0)}return l})})}});var _r=w(()=>{"use strict";Ai();Ii();Ui();hr()});function ji(){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 oe,br,ve,W,kr,Dt,Ft,eo,ie,Ut,Le,_l,to,no=w(()=>{"use strict";oe=X(require("node:fs/promises"),1),br=X(require("json5"),1),ve=X(require("node:path"),1),W=require("@wengine-ai/claude-code-router-shared"),kr=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(kr);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=kr(o);return e}return n},Dt=async n=>{try{await oe.default.access(n)}catch{await oe.default.mkdir(n,{recursive:!0})}},Ft=async()=>{await Dt(W.HOME_DIR),await Dt(W.PLUGINS_DIR),await Dt(ve.default.join(W.HOME_DIR,"logs"))},eo=async()=>{let n=await oe.default.readFile(W.CONFIG_FILE,"utf-8");return br.default.parse(n)},ie=async()=>{try{let n=await oe.default.readFile(W.CONFIG_FILE,"utf-8");try{let e=br.default.parse(n);return kr(e)}catch(e){console.error(`Failed to parse config file at ${W.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 Ft();let e=await Ut();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await Le(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 ${W.CONFIG_FILE}`),console.error("Error details:",n.message),process.exit(1)}};Ut=async()=>{ji();try{if(await oe.default.access(W.CONFIG_FILE).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${W.CONFIG_FILE}.${n}.bak`;await oe.default.copyFile(W.CONFIG_FILE,e);try{let t=ve.default.dirname(W.CONFIG_FILE),o=ve.default.basename(W.CONFIG_FILE),s=(await oe.default.readdir(t)).filter(i=>i.startsWith(o)&&i.endsWith(".bak")).sort().reverse();if(s.length>3)for(let i=3;i<s.length;i++){let c=ve.default.join(t,s[i]);await oe.default.unlink(c)}}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},Le=async n=>{ji(),await Dt(W.HOME_DIR),await _l();let e=`${JSON.stringify(n,null,2)}`;await oe.default.writeFile(W.CONFIG_FILE,e)},_l=async()=>{if(!await oe.default.access(W.CONFIG_FILE).then(()=>!0).catch(()=>!1))return;let e=ve.default.join(W.HOME_DIR,"config-history");await Dt(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=ve.default.join(e,`config-${t}.json`);await oe.default.copyFile(W.CONFIG_FILE,o);try{let s=(await oe.default.readdir(e)).filter(i=>i.startsWith("config-")&&i.endsWith(".json")).sort().reverse();if(s.length>50)for(let i of s.slice(50))await oe.default.unlink(ve.default.join(e,i))}catch(r){console.warn("Failed to prune config-history:",r)}},to=async()=>{let n=await ie();return Object.assign(process.env,n),n}});function kl(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function bl(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 De(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:kl(n),cache_creation_input_tokens:bl(n)}}function jt(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 Tr=w(()=>{"use strict"});function oo(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(vr(r,s))}return}if(Array.isArray(n)){for(let o of n)oo(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))oo(o,e,t)}}function Cr(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 i=Array.isArray(r?.models)?r.models:[];for(let c of i)c&&o.add(vr(s,c))}return oo(n?.Router,t,o),oo(n?.fallback,t,o),o}function it(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Cr(n),r=0;for(let s of t.getAllStates()||[]){let i=s?.provider,c=s?.model;!i||!c||o.has(vr(i,c))||(t.recover(i,c),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 Ht(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 Tl,vr,ro=w(()=>{"use strict";le();Tl="\0",vr=(n,e)=>`${n}${Tl}${e}`});function vl(n){return/\[1m\]/i.test(n)?1e6:2e5}function Cl(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function xl(n,e=n){let t=vl(n),o=Cl(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 zt(n){let e=new Map,t=(o,r=o)=>{!o||e.has(o)||e.set(o,xl(o,r))};t("ccr-opus","CCR Opus"),t("ccr-sonnet","CCR Sonnet"),t("ccr-haiku","CCR Haiku"),t("ccr-opus[1m]","CCR Opus 1M"),t("ccr-sonnet[1m]","CCR Sonnet 1M"),t("ccr-haiku[1m]","CCR Haiku 1M");for(let o of n.Providers||n.providers||[])if(!(!o?.name||!Array.isArray(o.models)))for(let r of o.models)typeof r!="string"||!r||(t(r,r),t(`${o.name},${r}`,`${o.name}/${r}`));return Array.from(e.values())}var xr=w(()=>{"use strict"});function Sl(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var Jt,Sr=w(()=>{"use strict";Jt=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||Sl(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let i=n.APIKEY;if(!i){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 c=e.headers.authorization||e.headers["x-api-key"],l=Array.isArray(c)?c[0]:c||"";if(!l){t.log.warn({url:e.url,headers:Object.keys(e.headers)},"[AUTH] No auth header"),t.status(401).send("APIKEY is missing");return}let a="";if(l.startsWith("Bearer")?a=l.split(" ")[1]:a=l,a!==i){t.log.warn({url:e.url,gotPrefix:a.slice(0,10),gotSuffix:a.slice(-6),gotLen:a.length,expectedPrefix:i.slice(0,6),expectedSuffix:i.slice(-6),expectedLen:i.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var Ar={};Xt(Ar,{append:()=>Kt,clear:()=>Er,close:()=>Hl,getOldestRecordTimestamp:()=>zl,query:()=>Pr,querySummary:()=>Qt,readTokenSpeedStats:()=>Or});function Ol(){(0,ae.existsSync)(io)||(0,ae.mkdirSync)(io,{recursive:!0})}function Gt(){if(xe)return xe;Ol();let n=new Ji.default(Rl);n.pragma("journal_mode = WAL"),n.pragma("synchronous = NORMAL"),n.pragma("busy_timeout = 5000");let e=n.pragma("user_version",{simple:!0})||0;return e<1&&(Al(n),n.pragma("user_version = 1")),e<2&&(n.prepare("PRAGMA table_info(usage_records)").all().some(o=>o.name==="upstream_model")||n.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),n.pragma("user_version = 2")),Ml(n),Gi(n,!0),wr=n.prepare(`
316
316
  INSERT INTO usage_records (
317
317
  id, timestamp, session_id, provider, original_model, model, upstream_model, model_family,
318
318
  scenario_type, client_type,
@@ -326,7 +326,7 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
326
326
  @cache_read_input_tokens, @cache_creation_input_tokens, @ttft,
327
327
  @tokens_per_second, @duration_ms, @status, @error_message, @response_body
328
328
  )
329
- `),Ce=n,Ce}function wl(n){n.exec(`
329
+ `),xe=n,xe}function Al(n){n.exec(`
330
330
  CREATE TABLE IF NOT EXISTS usage_records (
331
331
  id TEXT PRIMARY KEY,
332
332
  timestamp TEXT NOT NULL,
@@ -363,12 +363,12 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
363
363
  CREATE INDEX IF NOT EXISTS idx_usage_records_scenario_timestamp ON usage_records(scenario_type, timestamp);
364
364
  CREATE INDEX IF NOT EXISTS idx_usage_records_client_timestamp ON usage_records(client_type, timestamp);
365
365
  CREATE INDEX IF NOT EXISTS idx_usage_records_session_timestamp ON usage_records(session_id, timestamp);
366
- `)}function Pl(n,e){return n.prepare("SELECT value FROM usage_meta WHERE key = ?").get(e)?.value}function Bt(n,e,t){n.prepare(`
366
+ `)}function Il(n,e){return n.prepare("SELECT value FROM usage_meta WHERE key = ?").get(e)?.value}function Bt(n,e,t){n.prepare(`
367
367
  INSERT INTO usage_meta (key, value)
368
368
  VALUES (?, ?)
369
369
  ON CONFLICT(key) DO UPDATE SET value = excluded.value
370
- `).run(e,t)}function El(n){if(Pl(n,Ui)||!(0,ie.existsSync)(xr))return;let e=Al(n,"INSERT OR IGNORE"),t=(0,ie.readFileSync)(xr,"utf-8"),o=0,r=0,s=0;n.transaction(()=>{for(let l of t.split(`
371
- `)){let c=l.trim();if(c)try{let a=JSON.parse(c);if(!Ol(a)){r++;continue}e.run(Ji(ao(a))).changes>0?o++:s++}catch{r++}}Bt(n,Ui,new Date().toISOString()),Bt(n,"legacy_usage_jsonl_migrated_path",xr),Bt(n,"legacy_usage_jsonl_imported_count",String(o)),Bt(n,"legacy_usage_jsonl_skipped_count",String(r)),Bt(n,"legacy_usage_jsonl_duplicate_count",String(s))})()}function Ol(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 Al(n,e="INSERT"){return n.prepare(`
370
+ `).run(e,t)}function Ml(n){if(Il(n,Hi)||!(0,ae.existsSync)(Rr))return;let e=Nl(n,"INSERT OR IGNORE"),t=(0,ae.readFileSync)(Rr,"utf-8"),o=0,r=0,s=0;n.transaction(()=>{for(let c of t.split(`
371
+ `)){let l=c.trim();if(l)try{let a=JSON.parse(l);if(!$l(a)){r++;continue}e.run(Wi(co(a))).changes>0?o++:s++}catch{r++}}Bt(n,Hi,new Date().toISOString()),Bt(n,"legacy_usage_jsonl_migrated_path",Rr),Bt(n,"legacy_usage_jsonl_imported_count",String(o)),Bt(n,"legacy_usage_jsonl_skipped_count",String(r)),Bt(n,"legacy_usage_jsonl_duplicate_count",String(s))})()}function $l(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 Nl(n,e="INSERT"){return n.prepare(`
372
372
  ${e} INTO usage_records (
373
373
  id, timestamp, session_id, provider, original_model, model, upstream_model, model_family,
374
374
  scenario_type, client_type,
@@ -382,11 +382,11 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
382
382
  @cache_read_input_tokens, @cache_creation_input_tokens, @ttft,
383
383
  @tokens_per_second, @duration_ms, @status, @error_message, @response_body
384
384
  )
385
- `)}function Il(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,vl);return Math.round(n/r)}function ao(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?Le(n.ttft):null;return{...n,ttft:r,tokensPerSecond:Il(e,o,r)}}function Te(n){return typeof n=="string"?n:n==null?"":String(n)}function ro(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function Wt(n){let e=Number(n);return Number.isFinite(e)?e:0}function zi(n){return n==="success"?"success":"error"}function Ji(n){let e=ao(n);return{id:Te(e.id),timestamp:Te(e.timestamp),session_id:Te(e.sessionId),provider:Te(e.provider),original_model:Te(e.originalModel),model:Te(e.model),upstream_model:ro(e.upstreamModel)??null,model_family:Te(e.modelFamily),scenario_type:Te(e.scenarioType),client_type:ro(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(Wt(e.inputTokens)),output_tokens:Math.trunc(Wt(e.outputTokens)),cache_read_input_tokens:Math.trunc(Wt(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(Wt(e.cacheCreationInputTokens)),ttft:Le(e.ttft),tokens_per_second:Le(e.tokensPerSecond),duration_ms:Math.trunc(Wt(e.durationMs)),status:zi(e.status),error_message:ro(e.errorMessage)??null,response_body:ro(e.responseBody)??null}}function Ml(n){return ao({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:zi(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function $l(){return new Date(Date.now()-xl*24*60*60*1e3).toISOString()}function Bi(n,e=!1){let t=Date.now();!e&&t-ji<Sl||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run($l()),ji=t)}function Wi(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 it(n,e,t,o=""){let r=o?e.sql?`${e.sql} AND ${o}`:`WHERE ${o}`:e.sql,s=n.prepare(`
386
- SELECT ${t} AS key, ${Nl}
385
+ `)}function Ll(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,wl);return Math.round(n/r)}function co(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?Fe(n.ttft):null;return{...n,ttft:r,tokensPerSecond:Ll(e,o,r)}}function Ce(n){return typeof n=="string"?n:n==null?"":String(n)}function so(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function Wt(n){let e=Number(n);return Number.isFinite(e)?e:0}function Bi(n){return n==="success"?"success":"error"}function Wi(n){let e=co(n);return{id:Ce(e.id),timestamp:Ce(e.timestamp),session_id:Ce(e.sessionId),provider:Ce(e.provider),original_model:Ce(e.originalModel),model:Ce(e.model),upstream_model:so(e.upstreamModel)??null,model_family:Ce(e.modelFamily),scenario_type:Ce(e.scenarioType),client_type:so(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(Wt(e.inputTokens)),output_tokens:Math.trunc(Wt(e.outputTokens)),cache_read_input_tokens:Math.trunc(Wt(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(Wt(e.cacheCreationInputTokens)),ttft:Fe(e.ttft),tokens_per_second:Fe(e.tokensPerSecond),duration_ms:Math.trunc(Wt(e.durationMs)),status:Bi(e.status),error_message:so(e.errorMessage)??null,response_body:so(e.responseBody)??null}}function Dl(n){return co({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:Bi(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function Fl(){return new Date(Date.now()-Pl*24*60*60*1e3).toISOString()}function Gi(n,e=!1){let t=Date.now();!e&&t-zi<El||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(Fl()),zi=t)}function Ki(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 at(n,e,t,o=""){let r=o?e.sql?`${e.sql} AND ${o}`:`WHERE ${o}`:e.sql,s=n.prepare(`
386
+ SELECT ${t} AS key, ${Ul}
387
387
  FROM usage_records ${r}
388
388
  GROUP BY key
389
- `).all(...e.params),i={};for(let l of s)l.key!=null&&(i[String(l.key)]={count:l.count,inputTokens:l.inputTokens,outputTokens:l.outputTokens,cacheReadInputTokens:l.cacheReadInputTokens,cacheCreationInputTokens:l.cacheCreationInputTokens});return i}function Gi(n,e){let t=Wi(e),o=n.prepare(`
389
+ `).all(...e.params),i={};for(let c of s)c.key!=null&&(i[String(c.key)]={count:c.count,inputTokens:c.inputTokens,outputTokens:c.outputTokens,cacheReadInputTokens:c.cacheReadInputTokens,cacheCreationInputTokens:c.cacheCreationInputTokens});return i}function Qi(n,e){let t=Ki(e),o=n.prepare(`
390
390
  SELECT
391
391
  COUNT(*) AS totalRequests,
392
392
  COALESCE(SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END), 0) AS successCount,
@@ -397,17 +397,17 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
397
397
  AVG(CASE WHEN status = 'success' AND ttft IS NOT NULL THEN ttft END) AS avgTtft,
398
398
  AVG(CASE WHEN status = 'success' AND tokens_per_second IS NOT NULL THEN tokens_per_second END) AS avgTokensPerSecond
399
399
  FROM usage_records ${t.sql}
400
- `).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:it(n,t,"model"),byProvider:it(n,t,"provider"),byScenario:it(n,t,"scenario_type"),byFamily:it(n,t,"model_family || '/' || scenario_type","model_family IS NOT NULL AND model_family != ''"),byDay:it(n,t,"date(timestamp, 'localtime')"),byClient:it(n,t,"CASE WHEN client_type IS NULL OR client_type = '' THEN 'unknown' ELSE client_type END")}}function Kt(n){let e=Gt(),t=ao(n);Sr.run(Ji(t)),Bi(e)}function Rr(n){let e=Gt(),t=Wi(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),Ll):50,s=(o-1)*r,i=e.prepare(`SELECT COUNT(*) AS count FROM usage_records ${t.sql}`).get(...t.params),l=e.prepare(`SELECT * FROM usage_records ${t.sql} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...t.params,r,s),c=Gi(e,n);return{records:l.map(Ml),summary:c,total:i.count,page:o,pageSize:r}}function Qt(n,e,t){let o=Gt();return Gi(o,{startTime:n,endTime:e,status:t})}function wr(n){let e=Gt();if(!n){e.prepare("DELETE FROM usage_records").run();return}e.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(n)}function Dl(){Ce&&(Ce.pragma("wal_checkpoint(TRUNCATE)"),Ce.close(),Ce=null,Sr=null)}function Le(n){if(n==null)return null;if(typeof n=="number")return n;let e=parseFloat(String(n));return isNaN(e)?null:e}function Pr(n){let e=(0,De.join)((0,io.tmpdir)(),"claude-code-router"),t=(0,De.join)(e,`session-${n}.json`);if((0,ie.existsSync)(t))try{let o=(0,ie.readFileSync)(t,"utf-8"),r=JSON.parse(o);return{ttft:Le(r.timeToFirstToken),tokensPerSecond:Le(r.tokensPerSecond)}}catch{}try{let o=(0,ie.readdirSync)(e),r=new RegExp(`^session-${n}-\\d+\\.json$`),s=o.filter(i=>r.test(i));if(s.length>0){let i=s.sort().reverse(),l=(0,De.join)(e,i[0]);try{let c=(0,ie.readFileSync)(l,"utf-8"),a=JSON.parse(c);return{ttft:Le(a.timeToFirstToken),tokensPerSecond:Le(a.tokensPerSecond)}}catch{return{ttft:null,tokensPerSecond:null}}}}catch{}return{ttft:null,tokensPerSecond:null}}function Fl(n,e,t){return Gt().prepare("SELECT MIN(timestamp) AS timestamp FROM usage_records WHERE provider = ? AND timestamp >= ? AND timestamp <= ?").get(n,e,t)?.timestamp??void 0}var ie,De,io,Hi,so,Cl,xr,vl,xl,Sl,Ui,Ce,Sr,ji,Nl,Ll,Vt=w(()=>{"use strict";ie=require("fs"),De=require("path"),io=require("os"),Hi=X(require("better-sqlite3"),1),so=(0,De.join)((0,io.homedir)(),".claude-code-router","data"),Cl=(0,De.join)(so,"usage.sqlite"),xr=(0,De.join)(so,"usage.jsonl"),vl=1,xl=180,Sl=3600*1e3,Ui="legacy_usage_jsonl_migrated_at",Ce=null,Sr=null,ji=0;Nl=`
400
+ `).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:at(n,t,"model"),byProvider:at(n,t,"provider"),byScenario:at(n,t,"scenario_type"),byFamily:at(n,t,"model_family || '/' || scenario_type","model_family IS NOT NULL AND model_family != ''"),byDay:at(n,t,"date(timestamp, 'localtime')"),byClient:at(n,t,"CASE WHEN client_type IS NULL OR client_type = '' THEN 'unknown' ELSE client_type END")}}function Kt(n){let e=Gt(),t=co(n);wr.run(Wi(t)),Gi(e)}function Pr(n){let e=Gt(),t=Ki(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),jl):50,s=(o-1)*r,i=e.prepare(`SELECT COUNT(*) AS count FROM usage_records ${t.sql}`).get(...t.params),c=e.prepare(`SELECT * FROM usage_records ${t.sql} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...t.params,r,s),l=Qi(e,n);return{records:c.map(Dl),summary:l,total:i.count,page:o,pageSize:r}}function Qt(n,e,t){let o=Gt();return Qi(o,{startTime:n,endTime:e,status:t})}function Er(n){let e=Gt();if(!n){e.prepare("DELETE FROM usage_records").run();return}e.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(n)}function Hl(){xe&&(xe.pragma("wal_checkpoint(TRUNCATE)"),xe.close(),xe=null,wr=null)}function Fe(n){if(n==null)return null;if(typeof n=="number")return n;let e=parseFloat(String(n));return isNaN(e)?null:e}function Or(n){let e=(0,Ue.join)((0,ao.tmpdir)(),"claude-code-router"),t=(0,Ue.join)(e,`session-${n}.json`);if((0,ae.existsSync)(t))try{let o=(0,ae.readFileSync)(t,"utf-8"),r=JSON.parse(o);return{ttft:Fe(r.timeToFirstToken),tokensPerSecond:Fe(r.tokensPerSecond)}}catch{}try{let o=(0,ae.readdirSync)(e),r=new RegExp(`^session-${n}-\\d+\\.json$`),s=o.filter(i=>r.test(i));if(s.length>0){let i=s.sort().reverse(),c=(0,Ue.join)(e,i[0]);try{let l=(0,ae.readFileSync)(c,"utf-8"),a=JSON.parse(l);return{ttft:Fe(a.timeToFirstToken),tokensPerSecond:Fe(a.tokensPerSecond)}}catch{return{ttft:null,tokensPerSecond:null}}}}catch{}return{ttft:null,tokensPerSecond:null}}function zl(n,e,t){return Gt().prepare("SELECT MIN(timestamp) AS timestamp FROM usage_records WHERE provider = ? AND timestamp >= ? AND timestamp <= ?").get(n,e,t)?.timestamp??void 0}var ae,Ue,ao,Ji,io,Rl,Rr,wl,Pl,El,Hi,xe,wr,zi,Ul,jl,Vt=w(()=>{"use strict";ae=require("fs"),Ue=require("path"),ao=require("os"),Ji=X(require("better-sqlite3"),1),io=(0,Ue.join)((0,ao.homedir)(),".claude-code-router","data"),Rl=(0,Ue.join)(io,"usage.sqlite"),Rr=(0,Ue.join)(io,"usage.jsonl"),wl=1,Pl=180,El=3600*1e3,Hi="legacy_usage_jsonl_migrated_at",xe=null,wr=null,zi=0;Ul=`
401
401
  COUNT(*) AS count,
402
402
  COALESCE(SUM(CASE WHEN status = 'success' THEN input_tokens ELSE 0 END), 0) AS inputTokens,
403
403
  COALESCE(SUM(CASE WHEN status = 'success' THEN output_tokens ELSE 0 END), 0) AS outputTokens,
404
404
  COALESCE(SUM(CASE WHEN status = 'success' THEN cache_read_input_tokens ELSE 0 END), 0) AS cacheReadInputTokens,
405
405
  COALESCE(SUM(CASE WHEN status = 'success' THEN cache_creation_input_tokens ELSE 0 END), 0) AS cacheCreationInputTokens
406
- `;Ll=200});async function Xi(){let n=(0,Qi.homedir)(),e=(0,Vi.join)(n,".claude.json");if(!(0,Ki.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,Yi.writeFile)(e,JSON.stringify(o,null,2))}}var Ki,Qi,Vi,Yi,qi=w(()=>{"use strict";Ki=require("fs"),Qi=require("os"),Vi=require("path"),Yi=require("fs/promises")});function ea(n=(0,Or.join)(ta.HOME_DIR,"logs")){try{if(!(0,ve.existsSync)(n))return;let e=Date.now()-jl;for(let t of(0,ve.readdirSync)(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=(0,Or.join)(n,t),r=(0,ve.statSync)(o);r.isFile()&&r.mtime.getTime()<e&&(0,ve.unlinkSync)(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function na(){Zi||(Zi=!0,ea(),setInterval(ea,Hl).unref())}var ve,Or,ta,Ul,jl,Hl,Zi,oa=w(()=>{"use strict";ve=require("fs"),Or=require("path"),ta=require("@wengine-ai/claude-code-router-shared"),Ul=7,jl=Ul*24*60*60*1e3,Hl=1440*60*1e3,Zi=!1});async function ra(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:i={}}=o;switch(r){case"token-speed":nt.registerPlugin(Lt,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}],...i});break;default:console.warn(`Unknown plugin: ${r}`);break}}await nt.enablePlugins(n)}var sa=w(()=>{"use strict";hr()});function zl(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=Qt(t,e),s=Qt(o,e),i=[],l=new Set;for(let c of n||[])c&&c.name&&l.add(c.name);for(let c of Object.keys(r.byProvider||{}))l.add(c);for(let c of Object.keys(s.byProvider||{}))l.add(c);for(let c of l){let a=r.byProvider[c]||{inputTokens:0,outputTokens:0},u=s.byProvider[c]||{inputTokens:0,outputTokens:0},d=(a.inputTokens||0)+(a.outputTokens||0),g=(u.inputTokens||0)+(u.outputTokens||0),m,y,p=(n||[]).find(f=>f&&f.name===c);p&&p.quota&&(m=p.quota.limit5h,y=p.quota.limit7d),i.push({provider:c,used5h:d,used7d:g,limit5h:m,limit7d:y})}return i}async function ua(n,e){let t=n.app;He(),Ke(),t.register(ca.default,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let l=zt(e);return{object:"list",data:l,first_id:l[0]?.id||null,last_id:l[l.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(l,c)=>{let a=decodeURIComponent(l.params.modelId),u=zt(e).find(d=>d.id===a);return u||(c.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${a}`}})}),t.post("/v1/messages/count_tokens",async(l,c)=>{let{messages:a,tools:u,system:d,model:g}=l.body,m=t._server.tokenizerService;if(g&&g.includes(",")&&m)try{let[p,f]=g.split(",");l.log?.info(`Looking up tokenizer for provider: ${p}, model: ${f}`);let _=m.getTokenizerConfigForModel(p,f);_?l.log?.info(`Using tokenizer config: ${JSON.stringify(_)}`):l.log?.warn(`No tokenizer config found for ${p},${f}, using default tiktoken`);let k=await m.countTokens({messages:a,system:d,tools:u},_,p);return{input_tokens:k.tokenCount,tokenizer:k.tokenizerUsed}}catch(p){l.log?.error(`Error using configured tokenizer: ${p.message}`),l.log?.error(p.stack)}else g?g.includes(",")?m||l.log?.warn("TokenizerService not available, using default tiktoken"):l.log?.info(`Model "${g}" does not contain comma, using default tiktoken`):l.log?.info("No model specified, using default tiktoken");return{input_tokens:bt(a,d,u)}}),t.get("/api/config",async(l,c)=>await Zn()),t.get("/api/transformers",async(l,c)=>{let a=t._server.transformerService.getAllTransformers();return{transformers:Array.from(a.entries()).map(([d,g])=>({name:d,endpoint:g.endPoint||null}))}}),t.post("/api/config",async(l,c)=>{let a=l.body,u=zr(a||{});if(u.length>0)return c.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(m=>`${m.key}: ${m.error}`).join("; "),proxyErrors:u};let d=await Ut();d&&console.log(`Backed up existing configuration file to ${d}`),await $e(a);let g;try{g=await(0,E.syncGlobalProjectTakeovers)(a),g.failed.length>0&&t.log?.warn?.({projectTakeoverSync:g},"Config saved but some global project takeovers failed to sync")}catch(m){t.log?.warn?.(`Config saved but global project takeover sync failed: ${m?.message||m}`)}try{let m=t._server;if(m?.configService){m.configService.reload();let y=a?.Providers||a?.providers;if(Array.isArray(y)&&m.configService.set("providers",y),fe&&m.transformerService&&(m.providerService=new fe(m.configService,m.transformerService,t.log)),st(a,t.log),Ie&&Et){try{Et()}catch{}let p={enabled:m.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:m.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:m.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(m.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:m.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:m.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};m.activeProbeService=Ie(()=>m.providerService.getProviders(),p,f=>de(m.configService,f),t.log,f=>m.configService.get(f))}}}catch(m){t.log?.warn?.(`Config saved but runtime reload failed: ${m?.message||m}`)}return{success:!0,message:"Config saved successfully",projectTakeoverSync:g}}),t.get("/api/clients",async(l,c)=>{try{let a=await se();return{clients:(0,E.listClientStatuses)(a)}}catch(a){console.error("Failed to get client integrations:",a),c.status(500).send({error:a.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(l,c)=>{try{let a=l.body,u=Array.isArray(a?.enabled)?a.enabled:[],d=await se(),g=(0,E.applyClientSelection)(d,u);return await $e(g.config),g}catch(a){console.error("Failed to apply client integrations:",a),c.status(500).send({error:a.message||"Failed to apply client integrations"})}});async function o(l,c,a){try{let{id:u}=l.params;if(!(0,E.isClientId)(u)){c.status(404).send({error:`Unknown client: ${u}`});return}let d=await se(),g=a==="enable"?(0,E.enableClient)(d,u):a==="restore"?(0,E.restoreClient)(d,u):(0,E.disableClient)(d,u);return await $e(d),{success:g.success,result:g,results:[g],clients:(0,E.listClientStatuses)(d),config:d}}catch(u){console.error(`Failed to ${a} client integration:`,u),c.status(500).send({error:u.message||`Failed to ${a} client integration`})}}t.post("/api/clients/:id/enable",async(l,c)=>o(l,c,"enable")),t.post("/api/clients/:id/disable",async(l,c)=>o(l,c,"disable")),t.post("/api/clients/:id/restore",async(l,c)=>o(l,c,"restore")),t.get("/api/projects",async(l,c)=>{try{let a=await(0,E.listProjectConfigs)();return{projects:await Promise.all(a.map(async d=>{let g=await(0,E.getProjectTakeoverClients)(d.path);return{...d,ccrTakeoverClients:g,ccrTakeover:g.length>0}}))}}catch(a){console.error("Failed to list project configs:",a),c.status(500).send({error:a.message||"Failed to list project configs"})}}),t.post("/api/projects",async(l,c)=>{try{let{path:a}=l.body||{};if(!a||typeof a!="string"||!(0,Y.isAbsolute)(a)){c.status(400).send({error:"A valid absolute project path is required"});return}let u=(0,Y.normalize)(a).replace(/[\\/]+$/,"")||a;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 se();await(0,E.setProjectTakeover)(u,["claudeCode"],m)}catch(m){console.error("Failed to auto-enable ccr takeover for new project:",m)}let g=await(0,E.getProjectTakeoverClients)(u);return{id:(0,E.getClaudeProjectId)(u),path:u,configPath:(0,E.getProjectConfigPath)(u),Router:{},ccrTakeoverClients:g,ccrTakeover:g.length>0}}catch(a){console.error("Failed to add project config:",a),c.status(500).send({error:a.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(l,c)=>{try{let{id:a}=l.params,{Router:u}=l.body||{};if(!u||typeof u!="object"){c.status(400).send({error:"Router must be an object"});return}let d=await(0,E.readProjectConfigById)(a);if(!d){c.status(404).send({error:"Project config not found"});return}await(0,E.writeProjectConfig)(d.path,{Router:u});let g=await se();Object.keys(u).length===0?await(0,E.refreshProjectTakeovers)(d.path,g):await(0,E.refreshCcrProjectTakeover)(d.path,g,u);let m=await(0,E.getProjectTakeoverClients)(d.path);return{id:a,path:d.path,configPath:d.configPath,Router:u,ccrTakeoverClients:m,ccrTakeover:m.length>0}}catch(a){console.error("Failed to update project config:",a),c.status(500).send({error:a.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(l,c)=>{try{let{id:a}=l.params,u=l.body||{},d;if(Array.isArray(u.clients))d=u.clients.filter(E.isProjectTakeoverClient);else if(typeof u.enabled=="boolean")d=u.enabled?["claudeCode"]:[];else{c.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let g=await(0,E.readProjectConfigById)(a);if(!g){c.status(404).send({error:"Project config not found"});return}let m=await se(),y=await(0,E.setProjectTakeover)(g.path,d,m);return{id:a,path:g.path,ccrTakeoverClients:y,ccrTakeover:y.length>0}}catch(a){console.error("Failed to update ccr takeover status:",a),c.status(500).send({error:a.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(l,c)=>{try{let{id:a}=l.params,u=await(0,E.readProjectConfigById)(a);if(!u){c.status(404).send({error:"Project config not found"});return}try{let d=await se();await(0,E.setProjectTakeover)(u.path,[],d)}catch(d){console.error("Failed to remove ccr takeover while deleting project:",d)}return await(0,E.deleteProjectConfig)(u.path),{success:!0}}catch(a){console.error("Failed to delete project config:",a),c.status(500).send({error:a.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:(0,Y.dirname)((0,ia.fileURLToPath)(void 0)),s=(0,H.existsSync)((0,Y.join)(r,"index.html"))?r:(0,H.existsSync)((0,Y.join)(r,"..","index.html"))?(0,Y.join)(r,".."):(0,Y.join)(r,"..","dist");t.register(aa.default,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(l,c)=>c.redirect("/ui/")),t.get("/api/logs/files",async(l,c)=>{try{let a=(0,Y.join)((0,co.homedir)(),".claude-code-router","logs"),u=[];if((0,H.existsSync)(a)){let d=(0,H.readdirSync)(a);for(let g of d)if(g.endsWith(".log")){let m=(0,Y.join)(a,g),y=(0,H.statSync)(m);u.push({name:g,path:m,size:y.size,lastModified:y.mtime.toISOString()})}u.sort((g,m)=>new Date(m.lastModified).getTime()-new Date(g.lastModified).getTime())}return u}catch(a){console.error("Failed to get log files:",a),c.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(l,c)=>{try{let a=l.query.file,u;return a?u=a:u=(0,Y.join)((0,co.homedir)(),".claude-code-router","logs","app.log"),(0,H.existsSync)(u)?(0,H.readFileSync)(u,"utf8").split(`
407
- `).filter(m=>m.trim()):[]}catch(a){console.error("Failed to get logs:",a),c.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(l,c)=>{try{let a=l.query.file,u;return a?u=a:u=(0,Y.join)((0,co.homedir)(),".claude-code-router","logs","app.log"),(0,H.existsSync)(u)&&(0,H.writeFileSync)(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(a){console.error("Failed to clear logs:",a),c.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:dt()})),t.put("/api/debug-log",async l=>{let{enabled:c}=l.body;return tn(c),{enabled:dt()}}),t.get("/api/usage",async(l,c)=>{try{let a=l.query;return Rr({startTime:a.startDate,endTime:a.endDate,model:a.model,provider:a.provider,scenario:a.scenario,clientType:a.clientType,sessionId:a.sessionId,status:a.status,page:a.page?parseInt(a.page,10):void 0,pageSize:a.pageSize?parseInt(a.pageSize,10):void 0})}catch(a){console.error("Failed to query usage:",a),c.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(l,c)=>{try{let a=l.query;return Qt(a.startDate,a.endDate,a.status)}catch(a){console.error("Failed to query usage summary:",a),c.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(l,c)=>{try{let a=l.query;return wr(a.beforeDate),{success:!0,message:a.beforeDate?"Usage data cleared before "+a.beforeDate:"All usage data cleared"}}catch(a){console.error("Failed to clear usage:",a),c.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(l,c)=>{try{let u=j().getAllStates(),g=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:g,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to get provider health:",a),c.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(l,c)=>{try{let{providerName:a}=l.body;if(!a)return c.status(400),{error:"providerName is required"};let d=t._server?.activeProbeService;if(!d?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let g=await d.probeProviderManually(a);return g.success&&Ht(a,l.log),{provider:a,success:g.success,latencyMs:g.latencyMs,status:g.status,isSlow:g.isSlow,errorKind:g.errorKind??null,error:g.error,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to probe provider:",a),c.status(500).send({error:a.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(l,c)=>{try{let a=t._server,u=a?.activeProbeService;if(!u?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let d=(a?.providerService?.getProviders?.()||[]).filter(m=>m?.name&&m.enabled!==!1),g=await Promise.all(d.map(async m=>{let y=await u.probeProviderManually(m.name);return y.success&&Ht(m.name,l?.log),{provider:m.name,success:y.success,latencyMs:y.latencyMs,status:y.status,isSlow:y.isSlow,errorKind:y.errorKind??null,error:y.error}}));return{results:g,successCount:g.filter(m=>m.success).length,total:g.length,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to probe all providers:",a),c.status(500).send({error:a.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(l,c)=>{try{let u=(await se()).Providers||[],d=zl(u),g=new Map(d.map(p=>[p.provider,p])),m=ln();for(let p of d){let f=m.find(_=>_.provider===p.provider);f&&f.limit!=null&&(p.limit5h=f.limit,p.used5h=f.limit-(f.remaining??0),f.reset&&(p.reset5h=new Date(f.reset*1e3).toISOString()))}let y=pn();for(let p of y){let f=g.get(p.provider);f||(f={provider:p.provider,used5h:0,used7d:0},d.push(f),g.set(p.provider,f)),typeof p.totalBalance=="number"?(f.limit7d=p.totalBalance,f.type7d=p.currency?"balance":"rateLimit",p.currency&&(f.currency=p.currency),typeof p.usedBalance=="number"?f.used7d=p.usedBalance:typeof p.remainingBalance=="number"?f.used7d=Math.max(0,p.totalBalance-p.remainingBalance):(f.used7d=0,f.limit7d=p.totalBalance)):typeof p.usedBalance=="number"&&(f.used7d=p.usedBalance),typeof p.usedDailyBalance=="number"&&(f.used5h=p.usedDailyBalance,f.type5h="rateLimit"),typeof p.limitDaily=="number"&&(f.limit5h=p.limitDaily,f.type5h="rateLimit"),typeof p.resetTime=="string"&&(p.limitDaily!==void 0?f.reset5h=p.resetTime:f.reset7d=p.resetTime),typeof p.resetTime7d=="string"&&(f.reset7d=p.resetTime7d)}return{quotas:d,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to compute provider quota:",a),c.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(l,c)=>{try{let a=(0,Y.join)(E.HOME_DIR,"presets");if(!(0,H.existsSync)(a))return{presets:[]};let d=(0,H.readdirSync)(a,{withFileTypes:!0}).filter(m=>m.isDirectory()&&!m.name.startsWith(".")).map(m=>m.name),g=[];for(let m of d){let y=(0,Y.join)(a,m);try{let p=(0,Y.join)(y,"manifest.json"),f=(0,H.readFileSync)(p,"utf-8"),_=JSON.parse(f),{Providers:k,Router:h,PORT:b,HOST:T,API_TIMEOUT_MS:x,PROXY_URL:v,PROXY_GLOBAL_ENABLED:S,LOG:C,LOG_LEVEL:P,StatusLine:R,NON_INTERACTIVE_MODE:A,...O}=_;g.push({id:m,name:O.name||m,version:O.version||"1.0.0",description:O.description,author:O.author,homepage:O.homepage,repository:O.repository,license:O.license,keywords:O.keywords,ccrVersion:O.ccrVersion,source:O.source,sourceType:O.sourceType,checksum:O.checksum,installed:!0})}catch(p){console.error(`Failed to read preset ${m}:`,p)}}return{presets:g}}catch(a){console.error("Failed to get presets:",a),c.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(l,c)=>{try{let{name:a}=l.params,u=(0,E.getPresetDir)(a);if(!(0,H.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}let d=await(0,E.readManifestFromDir)(u);return{...(0,E.manifestToPresetFile)(d),config:(0,E.loadConfigFromManifest)(d,u),userValues:d.userValues||{}}}catch(a){console.error("Failed to get preset:",a),c.status(500).send({error:a.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(l,c)=>{try{let{name:a}=l.params,{secrets:u}=l.body,d=(0,E.getPresetDir)(a);if(!(0,H.existsSync)(d)){c.status(404).send({error:"Preset not found"});return}let m={...await(0,E.readManifestFromDir)(d)};return u&&Object.keys(u).length>0&&(m.userValues={...m.userValues,...u}),await(0,E.saveManifest)(a,m),{success:!0,message:"Preset applied successfully"}}catch(a){console.error("Failed to apply preset:",a),c.status(500).send({error:a.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(l,c)=>{try{let{name:a}=l.params,u=(0,E.getPresetDir)(a);if(!(0,H.existsSync)(u)){c.status(404).send({error:"Preset not found"});return}return(0,H.rmSync)(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(a){console.error("Failed to delete preset:",a),c.status(500).send({error:a.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(l,c)=>{try{return{presets:await(0,E.getMarketPresets)()}}catch(a){console.error("Failed to get market presets:",a),c.status(500).send({error:a.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(l,c)=>{try{let{presetName:a}=l.body;if(!a){c.status(400).send({error:"Preset name is required"});return}let u=await(0,E.findMarketPresetByName)(a);if(!u){c.status(400).send({error:"Preset not found in marketplace",message:`Preset '${a}' 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 '${a}' does not have repository information`});return}let d=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!d){c.status(400).send({error:"Invalid GitHub repository URL"});return}let[,g,m]=d,y=u.name||a;if(await(0,E.isPresetInstalled)(y)){c.status(409).send({error:"Preset already installed",message:`Preset '${y}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:y});return}let p=`https://github.com/${g}/${m}/archive/refs/heads/main.zip`,f=await(0,E.downloadPresetToTemp)(p),_=await i(f);if(await(0,E.isPresetInstalled)(y)){(0,H.unlinkSync)(f),c.status(409).send({error:"Preset already installed",message:`Preset '${y}' was installed while downloading. Please try again.`,presetName:y});return}let k=(0,E.getPresetDir)(y);await(0,E.extractPreset)(f,k);let h=await(0,E.readManifestFromDir)(k);return h.repository=u.repo,u.url&&(h.source=u.url),await(0,E.saveManifest)(y,h),(0,H.unlinkSync)(f),{success:!0,presetName:y,preset:{..._.metadata,installed:!0}}}catch(a){console.error("Failed to install preset from GitHub:",a),c.status(500).send({error:a.message||"Failed to install preset from GitHub"})}});async function i(l){let c=new la.default(l),a=c.getEntry("manifest.json");if(a||(a=c.getEntries().find(g=>g.entryName.includes("manifest.json"))||null),!a)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(a.getData().toString("utf-8"));return(0,E.manifestToPresetFile)(u)}return n}var Y,ia,aa,H,co,E,ca,la,da=w(()=>{"use strict";Ze();ze();Qe();bn();qn();ae();pt();ce();oo();to();Y=require("path"),ia=require("url"),aa=X(require("@fastify/static"),1),H=require("fs"),co=require("os"),E=require("@wengine-ai/claude-code-router-shared"),ca=X(require("@fastify/multipart"),1),la=X(require("adm-zip"),1);Vt();Cr()});function Jl(n,e){let t=n?.Router,{family:o}=Tt(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function pa(n){return n?.Router?.image}function Bl(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 Wl(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 Ar,lo,Ir,fa,ma=w(()=>{"use strict";Ze();Ar=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}},lo=new Ar;Ir=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=Jl(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!Bl(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&Lo(e.body.model)?!1:(Wl(e.body.messages),s&&!!pa(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(l=>{let c=lo.getImage(`${t.req.id}_Image#${l}`);c&&o.push({type:"image",source:c})});else{let l=lo.getImage(`${t.req.id}_Image#${e.imageId}`);l&&o.push({type:"image",source:l})}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 l=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(...l)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let i=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:pa(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
406
+ `;jl=200});async function Zi(){let n=(0,Yi.homedir)(),e=(0,Xi.join)(n,".claude.json");if(!(0,Vi.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,qi.writeFile)(e,JSON.stringify(o,null,2))}}var Vi,Yi,Xi,qi,ea=w(()=>{"use strict";Vi=require("fs"),Yi=require("os"),Xi=require("path"),qi=require("fs/promises")});function na(n=(0,Ir.join)(oa.HOME_DIR,"logs")){try{if(!(0,Se.existsSync)(n))return;let e=Date.now()-Bl;for(let t of(0,Se.readdirSync)(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=(0,Ir.join)(n,t),r=(0,Se.statSync)(o);r.isFile()&&r.mtime.getTime()<e&&(0,Se.unlinkSync)(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function ra(){ta||(ta=!0,na(),setInterval(na,Wl).unref())}var Se,Ir,oa,Jl,Bl,Wl,ta,sa=w(()=>{"use strict";Se=require("fs"),Ir=require("path"),oa=require("@wengine-ai/claude-code-router-shared"),Jl=7,Bl=Jl*24*60*60*1e3,Wl=1440*60*1e3,ta=!1});async function ia(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:i={}}=o;switch(r){case"token-speed":ot.registerPlugin(Lt,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:{subdirectory:"claude-code-router",extension:"json",includeTimestamp:!0,prefix:"session"}}],...i});break;default:console.warn(`Unknown plugin: ${r}`);break}}await ot.enablePlugins(n)}var aa=w(()=>{"use strict";_r()});function ca(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 Gl(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=Qt(t,e),s=Qt(o,e),i=[],c=new Set;for(let l of n||[])l&&l.name&&c.add(l.name);for(let l of Object.keys(r.byProvider||{}))c.add(l);for(let l of Object.keys(s.byProvider||{}))c.add(l);for(let l of c){let a=r.byProvider[l]||{inputTokens:0,outputTokens:0},u=s.byProvider[l]||{inputTokens:0,outputTokens:0},d=(a.inputTokens||0)+(a.outputTokens||0),m=(u.inputTokens||0)+(u.outputTokens||0),f,y,p=(n||[]).find(g=>g&&g.name===l);p&&p.quota&&(f=p.quota.limit5h,y=p.quota.limit7d),i.push({provider:l,used5h:d,used7d:m,limit5h:f,limit7d:y})}return i}async function fa(n,e){let t=n.app;Je(),Ve(),t.register(da.default,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let c=zt(e);return{object:"list",data:c,first_id:c[0]?.id||null,last_id:c[c.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(c,l)=>{let a=decodeURIComponent(c.params.modelId),u=zt(e).find(d=>d.id===a);return u||(l.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${a}`}})}),t.post("/v1/messages/count_tokens",async(c,l)=>{let{messages:a,tools:u,system:d,model:m}=c.body,f=t._server.tokenizerService;if(m&&m.includes(",")&&f)try{let[p,g]=m.split(",");c.log?.info(`Looking up tokenizer for provider: ${p}, model: ${g}`);let _=f.getTokenizerConfigForModel(p,g);_?c.log?.info(`Using tokenizer config: ${JSON.stringify(_)}`):c.log?.warn(`No tokenizer config found for ${p},${g}, using default tiktoken`);let k=await f.countTokens({messages:a,system:d,tools:u},_,p);return{input_tokens:k.tokenCount,tokenizer:k.tokenizerUsed}}catch(p){c.log?.error(`Error using configured tokenizer: ${p.message}`),c.log?.error(p.stack)}else m?m.includes(",")?f||c.log?.warn("TokenizerService not available, using default tiktoken"):c.log?.info(`Model "${m}" does not contain comma, using default tiktoken`):c.log?.info("No model specified, using default tiktoken");return{input_tokens:bt(a,d,u)}}),t.get("/api/config",async(c,l)=>await eo()),t.get("/api/transformers",async(c,l)=>{let a=t._server.transformerService.getAllTransformers();return{transformers:Array.from(a.entries()).map(([d,m])=>({name:d,endpoint:m.endPoint||null}))}}),t.post("/api/config",async(c,l)=>{let a=c.body,u=Br(a||{});if(u.length>0)return l.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(f=>`${f.key}: ${f.error}`).join("; "),proxyErrors:u};let d=await Ut();d&&console.log(`Backed up existing configuration file to ${d}`),await Le(a);let m;try{m=await(0,P.syncGlobalProjectTakeovers)(a),m.failed.length>0&&t.log?.warn?.({projectTakeoverSync:m},"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}`)}try{let f=t._server;if(f?.configService){f.configService.reload();let y=a?.Providers||a?.providers;if(Array.isArray(y)&&f.configService.set("providers",y),fe&&f.transformerService&&(f.providerService=new fe(f.configService,f.transformerService,t.log)),it(a,t.log),$e&&Et){try{Et()}catch{}let p={enabled:f.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:f.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:f.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(f.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:f.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:f.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};f.activeProbeService=$e(()=>f.providerService.getProviders(),p,g=>pe(f.configService,g),t.log,g=>f.configService.get(g))}}}catch(f){t.log?.warn?.(`Config saved but runtime reload failed: ${f?.message||f}`)}return{success:!0,message:"Config saved successfully",projectTakeoverSync:m}}),t.get("/api/clients",async(c,l)=>{try{let a=await ie();return{clients:(0,P.listClientStatuses)(a)}}catch(a){console.error("Failed to get client integrations:",a),l.status(500).send({error:a.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(c,l)=>{try{let a=c.body,u=Array.isArray(a?.enabled)?a.enabled:[],d=await ie(),m=(0,P.applyClientSelection)(d,u);await Le(m.config);let f=await(0,P.syncGlobalProjectTakeovers)(m.config),y=ca(t,f,"clients/apply");return{...m,success:m.success&&y,projectTakeoverSync:f}}catch(a){console.error("Failed to apply client integrations:",a),l.status(500).send({error:a.message||"Failed to apply client integrations"})}});async function o(c,l,a){try{let{id:u}=c.params;if(!(0,P.isClientId)(u)){l.status(404).send({error:`Unknown client: ${u}`});return}let d=await ie(),m=a==="enable"?(0,P.enableClient)(d,u):a==="restore"?(0,P.restoreClient)(d,u):(0,P.disableClient)(d,u);await Le(d);let f=await(0,P.syncGlobalProjectTakeovers)(d),y=ca(t,f,`clients/${u}/${a}`);return{success:m.success&&y,result:m,results:[m],clients:(0,P.listClientStatuses)(d),config:d,projectTakeoverSync:f}}catch(u){console.error(`Failed to ${a} client integration:`,u),l.status(500).send({error:u.message||`Failed to ${a} client integration`})}}t.post("/api/clients/:id/enable",async(c,l)=>o(c,l,"enable")),t.post("/api/clients/:id/disable",async(c,l)=>o(c,l,"disable")),t.post("/api/clients/:id/restore",async(c,l)=>o(c,l,"restore")),t.get("/api/projects",async(c,l)=>{try{let a=await(0,P.listProjectConfigs)();return{projects:await Promise.all(a.map(async d=>{let m=await(0,P.getProjectTakeoverClients)(d.path);return{...d,ccrTakeoverClients:m,ccrTakeover:m.length>0}}))}}catch(a){console.error("Failed to list project configs:",a),l.status(500).send({error:a.message||"Failed to list project configs"})}}),t.post("/api/projects",async(c,l)=>{try{let{path:a}=c.body||{};if(!a||typeof a!="string"||!(0,Y.isAbsolute)(a)){l.status(400).send({error:"A valid absolute project path is required"});return}let u=(0,Y.normalize)(a).replace(/[\\/]+$/,"")||a;if(await(0,P.readProjectConfig)(u)){l.status(409).send({error:"Project is already configured"});return}await(0,P.writeProjectConfig)(u,{Router:{}});try{let f=await ie();await(0,P.setProjectTakeover)(u,["claudeCode"],f)}catch(f){console.error("Failed to auto-enable ccr takeover for new project:",f)}let m=await(0,P.getProjectTakeoverClients)(u);return{id:(0,P.getClaudeProjectId)(u),path:u,configPath:(0,P.getProjectConfigPath)(u),Router:{},ccrTakeoverClients:m,ccrTakeover:m.length>0}}catch(a){console.error("Failed to add project config:",a),l.status(500).send({error:a.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(c,l)=>{try{let{id:a}=c.params,{Router:u}=c.body||{};if(!u||typeof u!="object"){l.status(400).send({error:"Router must be an object"});return}let d=await(0,P.readProjectConfigById)(a);if(!d){l.status(404).send({error:"Project config not found"});return}await(0,P.writeProjectConfig)(d.path,{Router:u});let m=await ie();Object.keys(u).length===0?await(0,P.refreshProjectTakeovers)(d.path,m):(await(0,P.refreshCcrProjectTakeover)(d.path,m,u),await(0,P.refreshPiProjectTakeover)(d.path,m,u));let f=await(0,P.getProjectTakeoverClients)(d.path);return{id:a,path:d.path,configPath:d.configPath,Router:u,ccrTakeoverClients:f,ccrTakeover:f.length>0}}catch(a){console.error("Failed to update project config:",a),l.status(500).send({error:a.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(c,l)=>{try{let{id:a}=c.params,u=c.body||{},d;if(Array.isArray(u.clients))d=u.clients.filter(P.isProjectTakeoverClient);else if(typeof u.enabled=="boolean")d=u.enabled?["claudeCode"]:[];else{l.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let m=await(0,P.readProjectConfigById)(a);if(!m){l.status(404).send({error:"Project config not found"});return}let f=await ie(),y=await(0,P.setProjectTakeover)(m.path,d,f);return{id:a,path:m.path,ccrTakeoverClients:y,ccrTakeover:y.length>0}}catch(a){console.error("Failed to update ccr takeover status:",a),l.status(500).send({error:a.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(c,l)=>{try{let{id:a}=c.params,u=await(0,P.readProjectConfigById)(a);if(!u){l.status(404).send({error:"Project config not found"});return}try{let d=await ie();await(0,P.setProjectTakeover)(u.path,[],d)}catch(d){console.error("Failed to remove ccr takeover while deleting project:",d)}return await(0,P.deleteProjectConfig)(u.path),{success:!0}}catch(a){console.error("Failed to delete project config:",a),l.status(500).send({error:a.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:(0,Y.dirname)((0,la.fileURLToPath)(void 0)),s=(0,H.existsSync)((0,Y.join)(r,"index.html"))?r:(0,H.existsSync)((0,Y.join)(r,"..","index.html"))?(0,Y.join)(r,".."):(0,Y.join)(r,"..","dist");t.register(ua.default,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(c,l)=>l.redirect("/ui/")),t.get("/api/logs/files",async(c,l)=>{try{let a=(0,Y.join)((0,lo.homedir)(),".claude-code-router","logs"),u=[];if((0,H.existsSync)(a)){let d=(0,H.readdirSync)(a);for(let m of d)if(m.endsWith(".log")){let f=(0,Y.join)(a,m),y=(0,H.statSync)(f);u.push({name:m,path:f,size:y.size,lastModified:y.mtime.toISOString()})}u.sort((m,f)=>new Date(f.lastModified).getTime()-new Date(m.lastModified).getTime())}return u}catch(a){console.error("Failed to get log files:",a),l.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(c,l)=>{try{let a=c.query.file,u;return a?u=a:u=(0,Y.join)((0,lo.homedir)(),".claude-code-router","logs","app.log"),(0,H.existsSync)(u)?(0,H.readFileSync)(u,"utf8").split(`
407
+ `).filter(f=>f.trim()):[]}catch(a){console.error("Failed to get logs:",a),l.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(c,l)=>{try{let a=c.query.file,u;return a?u=a:u=(0,Y.join)((0,lo.homedir)(),".claude-code-router","logs","app.log"),(0,H.existsSync)(u)&&(0,H.writeFileSync)(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(a){console.error("Failed to clear logs:",a),l.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:pt()})),t.put("/api/debug-log",async c=>{let{enabled:l}=c.body;return tn(l),{enabled:pt()}}),t.get("/api/usage",async(c,l)=>{try{let a=c.query;return Pr({startTime:a.startDate,endTime:a.endDate,model:a.model,provider:a.provider,scenario:a.scenario,clientType:a.clientType,sessionId:a.sessionId,status:a.status,page:a.page?parseInt(a.page,10):void 0,pageSize:a.pageSize?parseInt(a.pageSize,10):void 0})}catch(a){console.error("Failed to query usage:",a),l.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(c,l)=>{try{let a=c.query;return Qt(a.startDate,a.endDate,a.status)}catch(a){console.error("Failed to query usage summary:",a),l.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(c,l)=>{try{let a=c.query;return Er(a.beforeDate),{success:!0,message:a.beforeDate?"Usage data cleared before "+a.beforeDate:"All usage data cleared"}}catch(a){console.error("Failed to clear usage:",a),l.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(c,l)=>{try{let u=j().getAllStates(),m=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:m,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to get provider health:",a),l.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(c,l)=>{try{let{providerName:a}=c.body;if(!a)return l.status(400),{error:"providerName is required"};let d=t._server?.activeProbeService;if(!d?.probeProviderManually)return l.status(503),{error:"Active probe service is not available"};let m=await d.probeProviderManually(a);return m.success&&Ht(a,c.log),{provider:a,success:m.success,latencyMs:m.latencyMs,status:m.status,isSlow:m.isSlow,errorKind:m.errorKind??null,error:m.error,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to probe provider:",a),l.status(500).send({error:a.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(c,l)=>{try{let a=t._server,u=a?.activeProbeService;if(!u?.probeProviderManually)return l.status(503),{error:"Active probe service is not available"};let d=(a?.providerService?.getProviders?.()||[]).filter(f=>f?.name&&f.enabled!==!1),m=await Promise.all(d.map(async f=>{let y=await u.probeProviderManually(f.name);return y.success&&Ht(f.name,c?.log),{provider:f.name,success:y.success,latencyMs:y.latencyMs,status:y.status,isSlow:y.isSlow,errorKind:y.errorKind??null,error:y.error}}));return{results:m,successCount:m.filter(f=>f.success).length,total:m.length,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to probe all providers:",a),l.status(500).send({error:a.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(c,l)=>{try{let u=(await ie()).Providers||[],d=Gl(u),m=new Map(d.map(p=>[p.provider,p])),f=ln();for(let p of d){let g=f.find(_=>_.provider===p.provider);g&&g.limit!=null&&(p.limit5h=g.limit,p.used5h=g.limit-(g.remaining??0),g.reset&&(p.reset5h=new Date(g.reset*1e3).toISOString()))}let y=pn();for(let p of y){let g=m.get(p.provider);g||(g={provider:p.provider,used5h:0,used7d:0},d.push(g),m.set(p.provider,g)),typeof p.totalBalance=="number"?(g.limit7d=p.totalBalance,g.type7d=p.currency?"balance":"rateLimit",p.currency&&(g.currency=p.currency),typeof p.usedBalance=="number"?g.used7d=p.usedBalance:typeof p.remainingBalance=="number"?g.used7d=Math.max(0,p.totalBalance-p.remainingBalance):(g.used7d=0,g.limit7d=p.totalBalance)):typeof p.usedBalance=="number"&&(g.used7d=p.usedBalance),typeof p.usedDailyBalance=="number"&&(g.used5h=p.usedDailyBalance,g.type5h="rateLimit"),typeof p.limitDaily=="number"&&(g.limit5h=p.limitDaily,g.type5h="rateLimit"),typeof p.resetTime=="string"&&(p.limitDaily!==void 0?g.reset5h=p.resetTime:g.reset7d=p.resetTime),typeof p.resetTime7d=="string"&&(g.reset7d=p.resetTime7d)}return{quotas:d,timestamp:new Date().toISOString()}}catch(a){console.error("Failed to compute provider quota:",a),l.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(c,l)=>{try{let a=(0,Y.join)(P.HOME_DIR,"presets");if(!(0,H.existsSync)(a))return{presets:[]};let d=(0,H.readdirSync)(a,{withFileTypes:!0}).filter(f=>f.isDirectory()&&!f.name.startsWith(".")).map(f=>f.name),m=[];for(let f of d){let y=(0,Y.join)(a,f);try{let p=(0,Y.join)(y,"manifest.json"),g=(0,H.readFileSync)(p,"utf-8"),_=JSON.parse(g),{Providers:k,Router:h,PORT:b,HOST:T,API_TIMEOUT_MS:x,PROXY_URL:C,PROXY_GLOBAL_ENABLED:S,LOG:v,LOG_LEVEL:E,StatusLine:R,NON_INTERACTIVE_MODE:A,...O}=_;m.push({id:f,name:O.name||f,version:O.version||"1.0.0",description:O.description,author:O.author,homepage:O.homepage,repository:O.repository,license:O.license,keywords:O.keywords,ccrVersion:O.ccrVersion,source:O.source,sourceType:O.sourceType,checksum:O.checksum,installed:!0})}catch(p){console.error(`Failed to read preset ${f}:`,p)}}return{presets:m}}catch(a){console.error("Failed to get presets:",a),l.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(c,l)=>{try{let{name:a}=c.params,u=(0,P.getPresetDir)(a);if(!(0,H.existsSync)(u)){l.status(404).send({error:"Preset not found"});return}let d=await(0,P.readManifestFromDir)(u);return{...(0,P.manifestToPresetFile)(d),config:(0,P.loadConfigFromManifest)(d,u),userValues:d.userValues||{}}}catch(a){console.error("Failed to get preset:",a),l.status(500).send({error:a.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(c,l)=>{try{let{name:a}=c.params,{secrets:u}=c.body,d=(0,P.getPresetDir)(a);if(!(0,H.existsSync)(d)){l.status(404).send({error:"Preset not found"});return}let f={...await(0,P.readManifestFromDir)(d)};return u&&Object.keys(u).length>0&&(f.userValues={...f.userValues,...u}),await(0,P.saveManifest)(a,f),{success:!0,message:"Preset applied successfully"}}catch(a){console.error("Failed to apply preset:",a),l.status(500).send({error:a.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(c,l)=>{try{let{name:a}=c.params,u=(0,P.getPresetDir)(a);if(!(0,H.existsSync)(u)){l.status(404).send({error:"Preset not found"});return}return(0,H.rmSync)(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(a){console.error("Failed to delete preset:",a),l.status(500).send({error:a.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(c,l)=>{try{return{presets:await(0,P.getMarketPresets)()}}catch(a){console.error("Failed to get market presets:",a),l.status(500).send({error:a.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(c,l)=>{try{let{presetName:a}=c.body;if(!a){l.status(400).send({error:"Preset name is required"});return}let u=await(0,P.findMarketPresetByName)(a);if(!u){l.status(400).send({error:"Preset not found in marketplace",message:`Preset '${a}' is not available in the official marketplace. Please check the available presets.`});return}if(!u.repo){l.status(400).send({error:"Invalid preset data",message:`Preset '${a}' does not have repository information`});return}let d=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!d){l.status(400).send({error:"Invalid GitHub repository URL"});return}let[,m,f]=d,y=u.name||a;if(await(0,P.isPresetInstalled)(y)){l.status(409).send({error:"Preset already installed",message:`Preset '${y}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:y});return}let p=`https://github.com/${m}/${f}/archive/refs/heads/main.zip`,g=await(0,P.downloadPresetToTemp)(p),_=await i(g);if(await(0,P.isPresetInstalled)(y)){(0,H.unlinkSync)(g),l.status(409).send({error:"Preset already installed",message:`Preset '${y}' was installed while downloading. Please try again.`,presetName:y});return}let k=(0,P.getPresetDir)(y);await(0,P.extractPreset)(g,k);let h=await(0,P.readManifestFromDir)(k);return h.repository=u.repo,u.url&&(h.source=u.url),await(0,P.saveManifest)(y,h),(0,H.unlinkSync)(g),{success:!0,presetName:y,preset:{..._.metadata,installed:!0}}}catch(a){console.error("Failed to install preset from GitHub:",a),l.status(500).send({error:a.message||"Failed to install preset from GitHub"})}});async function i(c){let l=new pa.default(c),a=l.getEntry("manifest.json");if(a||(a=l.getEntries().find(m=>m.entryName.includes("manifest.json"))||null),!a)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(a.getData().toString("utf-8"));return(0,P.manifestToPresetFile)(u)}return n}var Y,la,ua,H,lo,P,da,pa,ma=w(()=>{"use strict";et();Be();Ye();Tn();Zn();ce();ft();le();ro();no();Y=require("path"),la=require("url"),ua=X(require("@fastify/static"),1),H=require("fs"),lo=require("os"),P=require("@wengine-ai/claude-code-router-shared"),da=X(require("@fastify/multipart"),1),pa=X(require("adm-zip"),1);Vt();xr()});function Kl(n,e){let t=n?.Router,{family:o}=Tt(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function ga(n){return n?.Router?.image}function Ql(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 Vl(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 Mr,uo,$r,ha,ya=w(()=>{"use strict";et();Mr=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}},uo=new Mr;$r=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=Kl(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!Ql(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&Do(e.body.model)?!1:(Vl(e.body.messages),s&&!!ga(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(c=>{let l=uo.getImage(`${t.req.id}_Image#${c}`);l&&o.push({type:"image",source:l})});else{let c=uo.getImage(`${t.req.id}_Image#${e.imageId}`);c&&o.push({type:"image",source:c})}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 c=s.content.filter(l=>l.type==="text"&&!l.text.includes("This is an image, if you need to view or analyze it, you need to extract the imageId"));o.push(...c)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let i=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:ga(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
408
408
  When an image placeholder is provided, your role is to parse the image content only within the scope of the user\u2019s instructions.
409
409
  Do not ignore or deviate from the task.
410
- 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(l=>l.json()).catch(l=>null);return!i||!i.content?"analyzeImage Error":i.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.
410
+ 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(c=>c.json()).catch(c=>null);return!i||!i.content?"analyzeImage Error":i.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.
411
411
  If the user requests you to view, analyze, or extract information from an image, you **must** call the \`analyzeImage\` tool.
412
412
 
413
413
  When invoking this tool, you must pass the correct \`imageId\` extracted from the prior conversation.
@@ -417,5 +417,5 @@ If multiple images exist, select the **most relevant imageId** based on the user
417
417
 
418
418
  Do not attempt to describe or analyze the image directly yourself.
419
419
  Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
420
- 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(i=>i.type==="image"||Array.isArray(i.content)&&i.content.some(l=>l.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(i=>{if(i.type==="image")lo.storeImage(`${e.id}_Image#${r}`,i.source),i.type="text",delete i.source,i.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(i.type==="text"&&i.text.includes("[Image #"))i.text=i.text.replace(/\[Image #\d+\]/g,"");else if(i.type==="tool_result"&&Array.isArray(i.content)&&i.content.some(l=>l.type==="image")){let l=[],c=i.content.filter(u=>u.type!=="image"?!0:(lo.storeImage(`${e.id}_Image#${r}`,u.source),l.push(`[Image #${r}]`),r++,!1)),a=`${l.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;i.content=c.length>0?[{type:"text",text:a},...c]:a}})})}},fa=new Ir});var Mr,ga,uo,ha=w(()=>{"use strict";ma();Mr=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}},ga=new Mr;ga.registerAgent(fa);uo=ga});function Gl(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 ba(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&_e(n,e)}function Nr(n){return n.usageSessionId||n.id}function po(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${Nr(n)}`}function at(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 Kl(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 Ql(n,e,t){if(await new Promise((r,s)=>{let i=l=>l?s(l):r();Jt(t)(n,e,i).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")){ba(n,t);let r=po(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=ee.get(r))}}async function Vl(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of uo.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 Ta(n){return{authClient:(e,t)=>Ql(e,t,n),agent:(e,t)=>Vl(e,t,n)}}function Ca(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=$r.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,i)=>{let l=c=>c?i(c):s();Jt(e)(t,o,l).then(()=>s(),i)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",ya.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let i=t.pathname?.endsWith("/v1/messages"),l=t.pathname?.endsWith("/v1/responses");if(i||l){ba(t,e);let c=Nr(t),a=po(t);if(r instanceof ReadableStream){if(i&&t.agents){let y=new AbortController,p=r.pipeThrough(new ue),f,_=-1,k="",h="",b="",T=[],x=[];return s(null,Ot(p,async(v,S)=>{try{if(v.event==="content_block_start"&&v?.data?.content_block?.name){let C=t.agents.find(P=>uo.getAgent(P)?.tools.get(v.data.content_block.name));if(C){f=uo.getAgent(C),_=v.data.index,k=v.data.content_block.name,b=v.data.content_block.id;return}}if(_>-1&&v.data.index===_&&v.data?.delta?.type==="input_json_delta"){h+=v.data?.delta?.partial_json;return}if(_>-1&&v.data.index===_&&v.data?.type==="content_block_stop"){try{let C=ka.default.parse(h);x.push({type:"tool_use",id:b,name:k,input:C});let P=await f?.tools.get(k)?.handler(C,{req:t,config:e});T.push({tool_use_id:b,type:"tool_result",content:P}),f=void 0,_=-1,k="",h="",b=""}catch(C){console.log(C)}return}if(v.event==="message_delta"&&T.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:T});let C=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(!C.ok)return;let R=C.body.pipeThrough(new ue).getReader();for(;;)try{let{value:A,done:O}=await R.read();if(O)break;let I=A;if(["message_start","message_stop"].includes(I.event))continue;if(!S.desiredSize)break;S.enqueue(I)}catch(A){if(A.name==="AbortError"||A.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw A}return}return v}catch(C){if(console.error("Unexpected error in stream processing:",C),C.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw C}}).pipeThrough(new Me))}let[d,g]=r.tee(),m=async y=>{let f=y.pipeThrough(new TextDecoderStream).pipeThrough(new ue).getReader();try{for(;;){let{done:_,value:k}=await f.read();if(_)break;let h=k.event,b=k.data;if(h==="message_start"&&b?.message?.model&&(t.upstreamModel=b.message.model),h==="response.completed"&&b?.response?.model&&(t.upstreamModel=b.response.model),b?.usage){let T=ee.get(a)||{},x=Ne(b.usage),v=jt(T,x,h==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:h,provider:t.provider,model:at(t),usageSessionId:c,capturedUsage:x,mergedUsage:v}),(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(a,v)}if(b?.response?.usage){let T=Ne(b.response.usage),x=ee.get(a)||{},v=jt(x,T,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:h,provider:t.provider,model:at(t),usageSessionId:c,capturedUsage:T,mergedUsage:v}),ee.put(a,v)}}}catch(_){_.name==="AbortError"||_.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",_)}finally{f.releaseLock()}};return t.usageCapturePromise=m(g),s(null,d)}let u=Kl(r);if(u?.usage&&ee.put(a,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(ya.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("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{t.usageCapturePromise&&await t.usageCapturePromise,t.tokenSpeedCapturePromise&&await t.tokenSpeedCapturePromise;let r=Nr(t),s=o.statusCode>=400,i=s?void 0:ee.get(po(t)),l=Pr(r),c=j(),a,u,d=t.sseError,g=d&&(d.type||d.code||d.message),m=i?.output_tokens&&i.output_tokens>0,y=s||g&&!m;if(y){a=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,g&&(a=a||JSON.stringify(d),u=JSON.stringify(d)),u=u||t.errorResponseBody;let h=at(t);Gl(o.statusCode,a)?c.markRateLimited(t.provider||"",h,120,a):c.recordFailure(t.provider||"",h,a)}else{let h=at(t);c.recordSuccess(t.provider||"",h)}let p=i?.cache_read_input_tokens??0,_=i?.input_tokens||0||t.tokenCount||0;!p&&t.tokenCount&&i?.input_tokens&&i.input_tokens<t.tokenCount&&(p=t.tokenCount-i.input_tokens,p&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:i.input_tokens,impliedCache:p}));let k=y?0:i?.output_tokens||0;!y&&t.body?.stream&&_===0&&k===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:at(t),usageSessionId:r,tokenCount:t.tokenCount,cachedUsage:i,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),Kt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:r,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:at(t),upstreamModel:t.upstreamModel,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||Pe(t),stream:t.body?.stream??!1,inputTokens:_,outputTokens:k,cacheReadInputTokens:p,cacheCreationInputTokens:i?.cache_creation_input_tokens||0,ttft:y||!t.body?.stream?null:l.ttft,tokensPerSecond:y?null:l.tokensPerSecond,durationMs:t.requestStartTime?Math.round($r.performance.now()-t.requestStartTime):0,status:y?"error":"success",errorMessage:a,responseBody:u}),t.clientContext?.usageScope!=="session"&&ee.delete(po(t))}catch(r){console.error("Usage tracking error:",r)}})}var _a,$r,ka,ya,va=w(()=>{"use strict";_a=require("node:events"),$r=require("node:perf_hooks"),ka=X(require("json5"),1);Ye();un();ce();sr();ir();ar();Vt();kr();ha();vr();kn();ya=new _a.EventEmitter});var wa={};Xt(wa,{createCcrServer:()=>Yl});async function Yl(n={}){await Xi(),await Ft();let e=await eo(),t=e.Providers||e.providers||[],o=t&&t.length>0,r=e.HOST||"127.0.0.1";o?(r=e.HOST,e.APIKEY||(r="127.0.0.1")):(r="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let s=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):s,l=p=>(p>9?"":"0")+p,c=(p,f)=>{let _;p?typeof p=="number"?_=new Date(p):_=p:_=new Date;let k=_.getFullYear()+""+l(_.getMonth()+1),h=l(_.getDate()),b=l(_.getHours()),T=l(_.getMinutes());return`./logs/ccr-${k}${h}${b}${T}${l(_.getSeconds())}${f?`_${f}`:""}.log`},a;n.logger!==void 0?a=n.logger:(na(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),a={level:e.LOG_LEVEL||"error",stream:(0,Ra.createStream)(c,{path:ct.HOME_DIR,interval:"1d",size:"50M",compress:!1})}):a=!1);let u=await(0,ct.listPresets)(),d=new Lr({jsonPath:ct.CONFIG_FILE,initialConfig:{providers:e.Providers||e.providers,HOST:r,PORT:i,LOG_FILE:(0,Sa.join)((0,xa.homedir)(),".claude-code-router","claude-code-router.log")},logger:a});await d.ready(),await ua(d,e),d.recordUsage=p=>{try{let f=p.req?p.req.clientType||Pe(p.req):"unknown";Kt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:p.sessionId||"",provider:p.provider||"",originalModel:p.originalModel||"",model:p.model||"",modelFamily:p.modelFamily||"",scenarioType:p.scenarioType||"default",clientType:f,stream:p.stream??!1,inputTokens:p.inputTokens||0,outputTokens:0,cacheReadInputTokens:p.cacheReadInputTokens||0,cacheCreationInputTokens:p.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:p.errorMessage,responseBody:void 0})}catch(f){console.error("Fallback usage tracking error:",f)}},Ca(d,e),d.ccrPreHandlerCallbacks=Ta(e),(await Promise.allSettled(u.map(async p=>await d.registerNamespace(`/preset/${p.name}`,p.config)))).forEach((p,f)=>{if(p.status==="rejected"){let _=u[f],k=p.reason instanceof Error?p.reason.message:String(p.reason);d.app?.log?.error?.(`Failed to register preset "${_?.name}": ${k}`)}}),await ra(d,e),st(e,d.app?.log);let m=p=>{d.app.log.error({err:p},"Uncaught exception")},y=(p,f)=>{d.app.log.error({reason:p,promise:f},"Unhandled rejection")};return process.on("uncaughtException",m),process.on("unhandledRejection",y),d.app.addHook("onClose",async()=>{process.off("uncaughtException",m),process.off("unhandledRejection",y)}),d}var xa,Sa,Ra,ct,Pa=w(()=>{"use strict";xa=require("os"),Sa=require("path");Ea();Ra=require("rotating-file-stream"),ct=require("@wengine-ai/claude-code-router-shared");qi();to();oa();sa();da();va();oo();Vt();Ye()});var Zl={};Xt(Zl,{ActiveProbeService:()=>Pt,ConfigService:()=>Se,ProjectRoutingError:()=>pe,ProviderHealthStore:()=>ft,ProviderService:()=>fe,SSEParserTransform:()=>ue,SSESerializerTransform:()=>Me,TokenizerService:()=>Ae,TransformerService:()=>Oe,apiKeyAuth:()=>Jt,applyClientAdapter:()=>_e,backupConfigFile:()=>Ut,builtinClientAdapterRegistry:()=>Io,calculateTokenCount:()=>bt,clearClientAdapterCaches:()=>ys,clearProviderHealth:()=>Ht,closeProxyDispatchers:()=>Zt,collectReachableModelKeys:()=>Tr,createCcrServer:()=>Ia,default:()=>Lr,detectClientType:()=>Pe,diagnoseResolutionFailure:()=>No,extractSessionIdFromUserId:()=>Ve,getActiveProbeService:()=>or,getAllQuotaResults:()=>pn,getAllRateLimitInfo:()=>ln,getClientAdapter:()=>$o,getConfiguredProxyUrl:()=>lt,getHealthStore:()=>j,getProxyDispatcher:()=>V,getQuotaAdapter:()=>Yn,getQuotaResult:()=>ht,getRateLimitInfo:()=>ls,getRuntimeDebugLog:()=>dt,getServer:()=>ql,initConfig:()=>eo,initDir:()=>Ft,initProviderHealthPersistence:()=>cn,initQuotaStorePersistence:()=>Ke,initRateLimitPersistence:()=>He,isClientType:()=>Mo,isGlobalProxyEnabled:()=>fo,listAnthropicCompatibleModels:()=>zt,mergeUsageCapture:()=>jt,normalizeSessionId:()=>we,normalizeUsagePayload:()=>Ne,pluginManager:()=>nt,readConfigFile:()=>se,readConfigFileRaw:()=>Zn,reconcileHealthStore:()=>st,resetActiveProbeService:()=>Et,resolveProviderProxyUrl:()=>de,rewriteStream:()=>Ot,router:()=>Ct,searchProjectBySession:()=>Do,sessionUsageCache:()=>ee,setRuntimeDebugLog:()=>tn,startActiveProbe:()=>Ie,stopActiveProbe:()=>Xn,storeQuotaResult:()=>dn,tokenSpeedPlugin:()=>Lt,usageStore:()=>Er,writeConfigFile:()=>$e});module.exports=Ur(Zl);function Xl(n={}){let e=(0,Oa.default)({bodyLimit:52428800,...n});return e.setErrorHandler(Wr),e.register(Aa.default),e}async function Ia(n={}){return(await Promise.resolve().then(()=>(Pa(),wa))).createCcrServer(n)}var Oa,Aa,Dr,Lr,ql,Ea=w(()=>{Oa=X(require("fastify"),1),Aa=X(require("@fastify/cors"),1);go();en();kn();bn();Ho();zo();Ze();un();qn();ce();ze();Qe();ae();Ye();kn();yt();Ye();Ze();go();bn();Ho();zo();hr();cr();ce();ze();tr();Qe();ce();qn();pt();ae();to();kr();oo();Cr();vr();Vt();Dr=class{app;configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:i,useEnvironmentVariables:l,...c}=e;this.app=Xl({...c,logger:c.logger??!0}),this.app._server=this;let a={initialConfig:t};o!==void 0&&(a.jsonPath=o),r!==void 0&&(a.envPath=r),s!==void 0&&(a.useEnvFile=s),i!==void 0&&(a.useJsonFile=i),l!==void 0&&(a.useEnvironmentVariables=l),this.configService=new Se(a),this.transformerService=new Oe(this.configService,this.app.log),this.tokenizerService=new Ae(this.configService,this.app.log),this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.providerService=new fe(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,i=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new Se({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Oe(o,this.app.log),i=new Ae(o,this.app.log),await Promise.all([r.initialize(),i.initialize()]),s=new fe(o,r,this.app.log)}let l=async c=>{c.decorate("configService",o),c.decorate("transformerService",r),c.decorate("providerService",s),c.decorate("tokenizerService",i),c.decorate("recordUsage",this.recordUsage||(()=>{})),c.addHook("preHandler",async(a,u)=>{let d=new URL(`http://127.0.0.1${a.url}`);a.pathname=d.pathname;let g=d.pathname.endsWith("/v1/messages"),m=d.pathname.endsWith("/v1/responses");if(!g&&!m||!a.body||typeof a.body!="object")return;let y=a.ccrHookOrder||=[];if(y.push("request-normalize"),m&&a.body.input&&!a.body.messages&&vt(a.body),a.body.stream===void 0&&(a.body.stream=!1),a.log.info({data:a.body,type:"request body"}),y.push("adapter"),!a.originalModel&&a.body.model&&(a.originalModel=a.body.model),_e(a,o.getAll()),y.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(a,u),u.sent))&&(y.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(a,u),u.sent)))){y.push("router"),a.body?.model&&await Ct(a,u,{configService:o,tokenizerService:i}),a.usageCacheKey&&ee.put(a.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),y.push("provider-model-normalize");try{let p=a.body;if(!p||!p.model)return u.code(400).send({error:"Missing model in request body"});let f=p.model.split(","),_=p.model;if(f.length>1){let[k,...h]=f;_=h.join(","),p.model=_,a.provider=k}a.model=_}catch(p){return a.log.error({error:p},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await As(c)};e==="/"?(await this.app.register(l),this.mainNamespaceRegistered=!0):await this.app.register(l,{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{Xn()}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 Zt()})}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{He()}catch{}try{Ke()}catch{}try{cn()}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=Ie(()=>this.providerService.getProviders(),t,o=>de(this.configService,o),this.app.log,o=>this.configService.get(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)}}},Lr=Dr;ql=Ia});Ea();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});
420
+ 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(i=>i.type==="image"||Array.isArray(i.content)&&i.content.some(c=>c.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(i=>{if(i.type==="image")uo.storeImage(`${e.id}_Image#${r}`,i.source),i.type="text",delete i.source,i.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(i.type==="text"&&i.text.includes("[Image #"))i.text=i.text.replace(/\[Image #\d+\]/g,"");else if(i.type==="tool_result"&&Array.isArray(i.content)&&i.content.some(c=>c.type==="image")){let c=[],l=i.content.filter(u=>u.type!=="image"?!0:(uo.storeImage(`${e.id}_Image#${r}`,u.source),c.push(`[Image #${r}]`),r++,!1)),a=`${c.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;i.content=l.length>0?[{type:"text",text:a},...l]:a}})})}},ha=new $r});var Nr,_a,po,ka=w(()=>{"use strict";ya();Nr=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}},_a=new Nr;_a.registerAgent(ha);po=_a});function Yl(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 Ca(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&ke(n,e)}function Dr(n){return n.usageSessionId||n.id}function fo(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${Dr(n)}`}function ct(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 Xl(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?De(e.usage):e.response?.usage?De(e.response.usage):void 0,o=e.model||e.response?.model;if(!(!t&&!o))return{usage:t,model:o}}async function ql(n,e,t){if(await new Promise((r,s)=>{let i=c=>c?s(c):r();Jt(t)(n,e,i).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")){Ca(n,t);let r=fo(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=ee.get(r))}}async function Zl(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of po.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 xa(n){return{authClient:(e,t)=>ql(e,t,n),agent:(e,t)=>Zl(e,t,n)}}function Sa(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=Lr.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,i)=>{let c=l=>l?i(l):s();Jt(e)(t,o,c).then(()=>s(),i)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",ba.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let i=t.pathname?.endsWith("/v1/messages"),c=t.pathname?.endsWith("/v1/responses");if(i||c){Ca(t,e);let l=Dr(t),a=fo(t);if(r instanceof ReadableStream){if(i&&t.agents){let y=new AbortController,p=r.pipeThrough(new de),g,_=-1,k="",h="",b="",T=[],x=[];return s(null,Ot(p,async(C,S)=>{try{if(C.event==="content_block_start"&&C?.data?.content_block?.name){let v=t.agents.find(E=>po.getAgent(E)?.tools.get(C.data.content_block.name));if(v){g=po.getAgent(v),_=C.data.index,k=C.data.content_block.name,b=C.data.content_block.id;return}}if(_>-1&&C.data.index===_&&C.data?.delta?.type==="input_json_delta"){h+=C.data?.delta?.partial_json;return}if(_>-1&&C.data.index===_&&C.data?.type==="content_block_stop"){try{let v=va.default.parse(h);x.push({type:"tool_use",id:b,name:k,input:v});let E=await g?.tools.get(k)?.handler(v,{req:t,config:e});T.push({tool_use_id:b,type:"tool_result",content:E}),g=void 0,_=-1,k="",h="",b=""}catch(v){console.log(v)}return}if(C.event==="message_delta"&&T.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:T});let v=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(!v.ok)return;let R=v.body.pipeThrough(new de).getReader();for(;;)try{let{value:A,done:O}=await R.read();if(O)break;let I=A;if(["message_start","message_stop"].includes(I.event))continue;if(!S.desiredSize)break;S.enqueue(I)}catch(A){if(A.name==="AbortError"||A.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();break}throw A}return}return C}catch(v){if(console.error("Unexpected error in stream processing:",v),v.code==="ERR_STREAM_PREMATURE_CLOSE"){y.abort();return}throw v}}).pipeThrough(new Ne))}let[d,m]=r.tee(),f=async y=>{let g=y.pipeThrough(new TextDecoderStream).pipeThrough(new de).getReader();try{for(;;){let{done:_,value:k}=await g.read();if(_)break;let h=k.event,b=k.data;if(h==="message_start"&&b?.message?.model&&(t.upstreamModel=b.message.model),h==="response.completed"&&b?.response?.model&&(t.upstreamModel=b.response.model),b?.usage){let T=ee.get(a)||{},x=De(b.usage),C=jt(T,x,h==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:h,provider:t.provider,model:ct(t),usageSessionId:l,capturedUsage:x,mergedUsage:C}),(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(a,C)}if(b?.response?.usage){let T=De(b.response.usage),x=ee.get(a)||{},C=jt(x,T,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:h,provider:t.provider,model:ct(t),usageSessionId:l,capturedUsage:T,mergedUsage:C}),ee.put(a,C)}}}catch(_){_.name==="AbortError"||_.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",_)}finally{g.releaseLock()}};return t.usageCapturePromise=f(m),s(null,d)}let u=Xl(r);if(u?.usage&&ee.put(a,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(ba.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("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{t.usageCapturePromise&&await t.usageCapturePromise,t.tokenSpeedCapturePromise&&await t.tokenSpeedCapturePromise;let r=Dr(t),s=o.statusCode>=400,i=s?void 0:ee.get(fo(t)),c=Or(r),l=j(),a,u,d=t.sseError,m=d&&(d.type||d.code||d.message),f=i?.output_tokens&&i.output_tokens>0,y=s||m&&!f;if(y){a=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,m&&(a=a||JSON.stringify(d),u=JSON.stringify(d)),u=u||t.errorResponseBody;let h=ct(t);Yl(o.statusCode,a)?l.markRateLimited(t.provider||"",h,120,a):l.recordFailure(t.provider||"",h,a)}else{let h=ct(t);l.recordSuccess(t.provider||"",h)}let p=i?.cache_read_input_tokens??0,_=i?.input_tokens||0||t.tokenCount||0;!p&&t.tokenCount&&i?.input_tokens&&i.input_tokens<t.tokenCount&&(p=t.tokenCount-i.input_tokens,p&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:i.input_tokens,impliedCache:p}));let k=y?0:i?.output_tokens||0;!y&&t.body?.stream&&_===0&&k===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:ct(t),usageSessionId:r,tokenCount:t.tokenCount,cachedUsage:i,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),Kt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:r,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:ct(t),upstreamModel:t.upstreamModel,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||Oe(t),stream:t.body?.stream??!1,inputTokens:_,outputTokens:k,cacheReadInputTokens:p,cacheCreationInputTokens:i?.cache_creation_input_tokens||0,ttft:y||!t.body?.stream?null:c.ttft,tokensPerSecond:y?null:c.tokensPerSecond,durationMs:t.requestStartTime?Math.round(Lr.performance.now()-t.requestStartTime):0,status:y?"error":"success",errorMessage:a,responseBody:u}),t.clientContext?.usageScope!=="session"&&ee.delete(fo(t))}catch(r){console.error("Usage tracking error:",r)}})}var Ta,Lr,va,ba,Ra=w(()=>{"use strict";Ta=require("node:events"),Lr=require("node:perf_hooks"),va=X(require("json5"),1);qe();un();le();ar();cr();lr();Vt();Tr();ka();Sr();bn();ba=new Ta.EventEmitter});var Oa={};Xt(Oa,{createCcrServer:()=>eu});async function eu(n={}){await Zi(),await Ft();let e=await to(),t=e.Providers||e.providers||[],o=t&&t.length>0,r=e.HOST||"127.0.0.1";o?(r=e.HOST,e.APIKEY||(r="127.0.0.1")):(r="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let s=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):s,c=p=>(p>9?"":"0")+p,l=(p,g)=>{let _;p?typeof p=="number"?_=new Date(p):_=p:_=new Date;let k=_.getFullYear()+""+c(_.getMonth()+1),h=c(_.getDate()),b=c(_.getHours()),T=c(_.getMinutes());return`./logs/ccr-${k}${h}${b}${T}${c(_.getSeconds())}${g?`_${g}`:""}.log`},a;n.logger!==void 0?a=n.logger:(ra(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),a={level:e.LOG_LEVEL||"error",stream:(0,Ea.createStream)(l,{path:lt.HOME_DIR,interval:"1d",size:"50M",compress:!1})}):a=!1);let u=await(0,lt.listPresets)(),d=new Fr({jsonPath:lt.CONFIG_FILE,initialConfig:{providers:e.Providers||e.providers,HOST:r,PORT:i,LOG_FILE:(0,Pa.join)((0,wa.homedir)(),".claude-code-router","claude-code-router.log")},logger:a});await d.ready(),await fa(d,e),d.recordUsage=p=>{try{let g=p.req?p.req.clientType||Oe(p.req):"unknown";Kt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:p.sessionId||"",provider:p.provider||"",originalModel:p.originalModel||"",model:p.model||"",modelFamily:p.modelFamily||"",scenarioType:p.scenarioType||"default",clientType:g,stream:p.stream??!1,inputTokens:p.inputTokens||0,outputTokens:0,cacheReadInputTokens:p.cacheReadInputTokens||0,cacheCreationInputTokens:p.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:p.errorMessage,responseBody:void 0})}catch(g){console.error("Fallback usage tracking error:",g)}},Sa(d,e),d.ccrPreHandlerCallbacks=xa(e),(await Promise.allSettled(u.map(async p=>await d.registerNamespace(`/preset/${p.name}`,p.config)))).forEach((p,g)=>{if(p.status==="rejected"){let _=u[g],k=p.reason instanceof Error?p.reason.message:String(p.reason);d.app?.log?.error?.(`Failed to register preset "${_?.name}": ${k}`)}}),await ia(d,e),it(e,d.app?.log);let f=p=>{d.app.log.error({err:p},"Uncaught exception")},y=(p,g)=>{d.app.log.error({reason:p,promise:g},"Unhandled rejection")};return process.on("uncaughtException",f),process.on("unhandledRejection",y),d.app.addHook("onClose",async()=>{process.off("uncaughtException",f),process.off("unhandledRejection",y)}),d}var wa,Pa,Ea,lt,Aa=w(()=>{"use strict";wa=require("os"),Pa=require("path");Ia();Ea=require("rotating-file-stream"),lt=require("@wengine-ai/claude-code-router-shared");ea();no();sa();aa();ma();Ra();ro();Vt();qe()});var ou={};Xt(ou,{ActiveProbeService:()=>Pt,ConfigService:()=>we,ProjectRoutingError:()=>ne,ProviderHealthStore:()=>mt,ProviderService:()=>fe,SSEParserTransform:()=>de,SSESerializerTransform:()=>Ne,TokenizerService:()=>Me,TransformerService:()=>Ie,apiKeyAuth:()=>Jt,applyClientAdapter:()=>ke,backupConfigFile:()=>Ut,builtinClientAdapterRegistry:()=>Mo,calculateTokenCount:()=>bt,clearClientAdapterCaches:()=>bs,clearProviderHealth:()=>Ht,closeProxyDispatchers:()=>Zt,collectReachableModelKeys:()=>Cr,createCcrServer:()=>Na,default:()=>Fr,detectClientType:()=>Oe,diagnoseResolutionFailure:()=>Lo,extractSessionIdFromUserId:()=>_e,getActiveProbeService:()=>sr,getAllQuotaResults:()=>pn,getAllRateLimitInfo:()=>ln,getClientAdapter:()=>No,getConfiguredProxyUrl:()=>ut,getHealthStore:()=>j,getProxyDispatcher:()=>V,getQuotaAdapter:()=>Xn,getQuotaResult:()=>yt,getRateLimitInfo:()=>ds,getRuntimeDebugLog:()=>pt,getServer:()=>nu,initConfig:()=>to,initDir:()=>Ft,initProviderHealthPersistence:()=>cn,initQuotaStorePersistence:()=>Ve,initRateLimitPersistence:()=>Je,isClientType:()=>$o,isGlobalProxyEnabled:()=>mo,listAnthropicCompatibleModels:()=>zt,mergeUsageCapture:()=>jt,normalizeSessionId:()=>Ee,normalizeUsagePayload:()=>De,pluginManager:()=>ot,readConfigFile:()=>ie,readConfigFileRaw:()=>eo,reconcileHealthStore:()=>it,resetActiveProbeService:()=>Et,resolveProviderProxyUrl:()=>pe,rewriteStream:()=>Ot,router:()=>vt,searchProjectBySession:()=>Fo,sessionUsageCache:()=>ee,setRuntimeDebugLog:()=>tn,startActiveProbe:()=>$e,stopActiveProbe:()=>qn,storeQuotaResult:()=>dn,tokenSpeedPlugin:()=>Lt,usageStore:()=>Ar,writeConfigFile:()=>Le});module.exports=Hr(ou);function tu(n={}){let e=(0,Ma.default)({bodyLimit:52428800,...n});return e.setErrorHandler(Kr),e.register($a.default),e}async function Na(n={}){return(await Promise.resolve().then(()=>(Aa(),Oa))).createCcrServer(n)}var Ma,$a,Ur,Fr,nu,Ia=w(()=>{Ma=X(require("fastify"),1),$a=X(require("@fastify/cors"),1);ho();en();bn();Tn();Jo();Bo();et();un();Zn();le();Be();Ye();ce();qe();bn();Xe();qe();et();ho();Tn();Jo();Bo();_r();ur();le();Be();or();Ye();le();Zn();ft();ce();no();Tr();ro();xr();Sr();Vt();Ur=class{app;configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:i,useEnvironmentVariables:c,...l}=e;this.app=tu({...l,logger:l.logger??!0}),this.app._server=this;let a={initialConfig:t};o!==void 0&&(a.jsonPath=o),r!==void 0&&(a.envPath=r),s!==void 0&&(a.useEnvFile=s),i!==void 0&&(a.useJsonFile=i),c!==void 0&&(a.useEnvironmentVariables=c),this.configService=new we(a),this.transformerService=new Ie(this.configService,this.app.log),this.tokenizerService=new Me(this.configService,this.app.log),this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.providerService=new fe(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,i=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new we({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Ie(o,this.app.log),i=new Me(o,this.app.log),await Promise.all([r.initialize(),i.initialize()]),s=new fe(o,r,this.app.log)}let c=async l=>{l.decorate("configService",o),l.decorate("transformerService",r),l.decorate("providerService",s),l.decorate("tokenizerService",i),l.decorate("recordUsage",this.recordUsage||(()=>{})),l.addHook("preHandler",async(a,u)=>{let d=new URL(`http://127.0.0.1${a.url}`);a.pathname=d.pathname;let m=d.pathname.endsWith("/v1/messages"),f=d.pathname.endsWith("/v1/responses");if(!m&&!f||!a.body||typeof a.body!="object")return;let y=a.ccrHookOrder||=[];if(y.push("request-normalize"),f&&a.body.input&&!a.body.messages&&Ct(a.body),a.body.stream===void 0&&(a.body.stream=!1),a.log.info({data:a.body,type:"request body"}),y.push("adapter"),!a.originalModel&&a.body.model&&(a.originalModel=a.body.model),ke(a,o.getAll()),y.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(a,u),u.sent))&&(y.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(a,u),u.sent)))){y.push("router"),a.body?.model&&await vt(a,u,{configService:o,tokenizerService:i}),a.usageCacheKey&&ee.put(a.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),y.push("provider-model-normalize");try{let p=a.body;if(!p||!p.model)return u.code(400).send({error:"Missing model in request body"});let g=p.model.split(","),_=p.model;if(g.length>1){let[k,...h]=g;_=h.join(","),p.model=_,a.provider=k}a.model=_}catch(p){return a.log.error({error:p},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await $s(l)};e==="/"?(await this.app.register(c),this.mainNamespaceRegistered=!0):await this.app.register(c,{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{qn()}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 Zt()})}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{Je()}catch{}try{Ve()}catch{}try{cn()}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=$e(()=>this.providerService.getProviders(),t,o=>pe(this.configService,o),this.app.log,o=>this.configService.get(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)}}},Fr=Ur;nu=Na});Ia();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});
421
421
  //# sourceMappingURL=server.cjs.map