@kianwoon/modelweaver 0.3.14 → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import{a as Z}from"./chunk-OMWFRIHF.js";import{d as ee}from"./chunk-ZF23JS2D.js";import{b as te,e as ne,g as B,k as re}from"./chunk-SCUI4R77.js";import{serve as ve}from"@hono/node-server";import{readFileSync as nt}from"fs";import{Hono as He}from"hono";var $=new Map;function oe(){$.clear()}function ke(t,e){for(let[r,n]of e)for(let d of n)if(t.includes(d))return r;return null}function Re(t,e){return e.get(t)||[]}function se(t,e,r,n){let d=$.get(t);if(d)return $.delete(t),$.set(t,d),{requestId:e,model:t,tier:d.tier,providerChain:d.providerChain,startTime:Date.now(),rawBody:n};let c,i,o=r.modelRouting.get(t);if(o&&o.length>0)c="(modelRouting)",i=o;else{let u=ke(t,r.tierPatterns);if(!u)return null;c=u,i=Re(c,r.routing)}if($.size>=200){let u=$.keys().next().value;u!==void 0&&$.delete(u)}return $.set(t,{tier:c,providerChain:i}),{requestId:e,model:t,tier:c,providerChain:i,startTime:Date.now(),rawBody:n}}import{request as Ee}from"undici";import{PassThrough as Ie}from"stream";import pe from"fs";import me from"path";import Pe from"os";var U=class{samples=new Map;maxSize;MAX_PROVIDERS=50;constructor(e=20){this.maxSize=e}record(e,r){if(this.samples.size>=this.MAX_PROVIDERS&&!this.samples.has(e)){let d=this.samples.keys().next().value;d!==void 0&&this.samples.delete(d)}let n=this.samples.get(e);n||(n=[],this.samples.set(e,n)),n.push({ttfbMs:r,timestamp:Date.now()}),n.length>this.maxSize&&n.splice(0,n.length-this.maxSize)}getCV(e){let r=this.samples.get(e);if(!r||r.length<3)return 0;let n=r.map(i=>i.ttfbMs),d=n.reduce((i,o)=>i+o,0)/n.length;if(d===0)return 0;let c=n.reduce((i,o)=>i+(o-d)**2,0)/n.length;return Math.sqrt(c)/d}getStats(e){let r=this.samples.get(e);if(!r||r.length===0)return{count:0,mean:0,cv:0};let n=r.map(c=>c.ttfbMs),d=n.reduce((c,i)=>c+i,0)/n.length;return{count:n.length,mean:Math.round(d),cv:Math.round(this.getCV(e)*100)/100}}clear(e){this.samples.delete(e)}prune(e){let r=new Set(e);for(let n of this.samples.keys())r.has(n)||this.samples.delete(n)}},H=class{counts=new Map;increment(e){let r=(this.counts.get(e)??0)+1;return this.counts.set(e,r),r}decrement(e){let r=Math.max(0,(this.counts.get(e)??0)-1);return this.counts.set(e,r),r}get(e){return this.counts.get(e)??0}},N=new U,L=new H;function ie(t){let e=N.getCV(t.name),r=L.get(t.name),n=t.concurrentLimit??1,d=Math.max(1,n-r),c=Math.max(1,Math.floor(e*2+.5));return Math.min(c,d)}import{WebSocketServer as Se}from"ws";var Te=3e4,_e=2,ue=64*1024,Ce=500,Me=500,xe=1e4,ae=new WeakMap,z=null,le=0,ce=0;function de(t){let e=Date.now();e-ce>=xe&&(console.warn(`[ws] Backpressure: dropping ${t} events (total dropped stream events: ${le})`),ce=e)}function J(t,e){let r=new Se({server:t,path:"/ws"});z=r,r.on("connection",n=>{let c={type:"summary",data:e.getSummary()};n.send(JSON.stringify(c));let i,o=0,u=()=>n.readyState===n.OPEN,m=e.onRecord(f=>{if(u()){if(n.bufferedAmount>ue){a(),de("metrics");return}setImmediate(()=>{if(!u())return;let g={type:"request",data:f};n.send(JSON.stringify(g))}),a()}});function a(){i||(i=setTimeout(()=>{if(i=void 0,!u())return;let f={type:"summary",data:e.getSummary()};n.send(JSON.stringify(f))},Ce))}let s=setInterval(()=>{if(!u()){clearInterval(s);return}if(o>=_e){l(),n.terminate();return}n.ping(),o++},Te);n.on("pong",()=>{o=0});let p=!1,l=()=>{p||(p=!0,clearInterval(s),i&&clearTimeout(i),m())};n.on("close",l),n.on("error",l)})}function P(t){if(!z)return;let e=JSON.stringify({type:"stream",data:t}),r=t.state==="streaming",n=t.state==="complete"||t.state==="error",d=Date.now();for(let c of z.clients)if(c.readyState===c.OPEN){if(r){let i=ae.get(c)??0;if(d-i<Me)continue;ae.set(c,d)}if(c.bufferedAmount>ue){if(n){let i=()=>{c.readyState===c.OPEN&&c.send(e)};c.once("drain",i),setTimeout(()=>{c.removeListener("drain",i),c.readyState===c.OPEN&&c.send(e)},5e3).unref();continue}le++,de("stream");continue}setImmediate(()=>{c.readyState===c.OPEN&&c.send(e)})}}var Ae=new Set(["anthropic-version","anthropic-beta","content-type","accept"]),Oe=/\/+/g,qe=/^https?:\/\/[^/]+/,F=/"model"\s*:\s*"([^"]*)"/,j=/"max_tokens"\s*:\s*(\d+)/,q=new TextEncoder,$e=3e3;function Ne(t){return t===429||t>=500}var Le=["context window","context_limit","token limit","prompt is too long","max tokens","input too large","too many tokens"];function Be(t,e){if(t!==400)return!1;let r=e.toLowerCase();return Le.some(n=>r.includes(n))}function De(t,e){if(!Be(t,e))return null;console.warn("[context-compact] Upstream context window limit detected");try{let n=me.join(Pe.homedir(),".claude","state");pe.mkdirSync(n,{recursive:!0}),pe.writeFileSync(me.join(n,"context-compact-needed"),Date.now().toString())}catch{}let r=JSON.stringify({type:"error",error:{type:"invalid_request_error",message:"Context window limit reached. Run /compact to reduce conversation size, then retry."}});return new Response(r,{status:400,headers:{"content-type":"application/json"}})}function je(t,e){let r="",n=t,d=t.indexOf("/",t.indexOf("//")+2);d!==-1&&(n=t.substring(0,d),r=t.substring(d));let c="",i=e,o=e.indexOf("?");o!==-1&&(i=e.substring(0,o),c=e.substring(o));let u;return r.endsWith("/v1")&&i.startsWith("/v1")?u=r+i.substring(3):u=r+i,u=u.replace(Oe,"/"),n+u+c}function We(t,e,r){let n=new Headers;for(let c of Ae){let i=t.get(c);i&&n.set(c,i)}e.authType==="bearer"?n.set("Authorization",`Bearer ${e.apiKey}`):n.set("x-api-key",e.apiKey),n.set("x-request-id",r);let d=e._cachedHost;if(d)n.set("host",d);else try{let c=new URL(e.baseUrl);n.set("host",c.host)}catch{}return n}function he(t){let e=t.messages;if(!Array.isArray(e))return;let r=new Set,n=new Set;for(let u=0;u<e.length;u++){let m=e[u];if(Array.isArray(m.content))for(let a of m.content)a.type==="tool_use"&&a.id?r.add(String(a.id)):a.type==="tool_result"&&a.tool_use_id&&n.add(String(a.tool_use_id))}let d=new Set,c=new Set;for(let u of r)n.has(u)||d.add(u);for(let u of n)r.has(u)||c.add(u);if(d.size===0&&c.size===0)return;let i=!1,o=e.map(u=>{if(!Array.isArray(u.content))return u;let m=u.content.filter(a=>!(a.type==="tool_use"&&d.has(String(a.id))||a.type==="tool_result"&&c.has(String(a.tool_use_id))));return m.length<u.content.length?(i=!0,{...u,content:m}):u});i&&(t.messages=o)}function Ue(t,e,r,n,d){if(d){let w=structuredClone(n);if(e.model&&(w.model=e.model),he(w),r.modelLimits){let{maxOutputTokens:_}=r.modelLimits,y=typeof w.max_tokens=="number"?w.max_tokens:_;(w.max_tokens===void 0||y>_)&&(w.max_tokens=Math.min(y,_))}return JSON.stringify(w)}let c=!!(e.model&&n.model!==e.model),i=!1,o=!1,u=0;if(r.modelLimits){u=r.modelLimits.maxOutputTokens;let w=j.exec(t);w?i=parseInt(w[1],10)>u:typeof n.max_tokens!="number"&&(o=!0)}if(!c&&!i&&!o)return t;if(o){let w={...n};return e.model&&(w.model=e.model),w.max_tokens=u,JSON.stringify(w)}let m=[];c&&m.push(F.source),i&&m.push(j.source);let a=new RegExp(m.join("|"),"g"),s=c?`"model":"${e.model}"`:null,p=i?`"max_tokens":${u}`:null,l=n.model,f=!1;return t.replace(a,w=>s&&F.test(w)?(F.lastIndex=0,!f&&l&&(console.warn(`Routing override: ${l} -> ${e.model} via ${r.name}`),f=!0),s):p&&j.test(w)?(j.lastIndex=0,p):w)}async function fe(t,e,r,n,d,c=0){let i=n.url.replace(qe,"");e.model&&(r.actualModel=e.model);let o=je(t.baseUrl,i),u;if((n.headers.get("content-type")||"").includes("application/json"))try{let h=r.parsedBody??JSON.parse(r.rawBody),b=!1;e.model&&h.model!==e.model&&(b=!0);let k=c>0;if(k&&(b=!0),t.modelLimits){let{maxOutputTokens:R}=t.modelLimits,C=typeof h.max_tokens=="number"?h.max_tokens:R;(h.max_tokens===void 0||C>R)&&(b=!0)}if(b)if(c===0&&!k)u=Ue(r.rawBody,e,t,h,!1);else{let R=structuredClone(h);if(e.model){let C=R.model;R.model=e.model,C&&C!==e.model&&console.warn(`Routing override: ${C} -> ${e.model} via ${t.name}`)}if(k&&he(R),t.modelLimits){let{maxOutputTokens:C}=t.modelLimits,M=typeof R.max_tokens=="number"?R.max_tokens:C;(R.max_tokens===void 0||M>C)&&(R.max_tokens=Math.min(M,C))}u=JSON.stringify(R)}else u=r.rawBody}catch{u=r.rawBody}else u=r.rawBody;let a=We(n.headers,t,r.requestId);a.set("content-length",Buffer.byteLength(u,"utf-8").toString());let s=new AbortController,p=setTimeout(()=>s.abort(),t.timeout),l=t.ttfbTimeout??15e3,f=!1,g=null,w=new Promise((h,b)=>{g=setTimeout(()=>{f=!0,s.abort(),b(new Error(`TTFB timeout after ${l}ms`))},l)}),_,y;if(d){if(d.aborted){clearTimeout(p),g&&clearTimeout(g);let b=JSON.stringify({type:"error",error:{type:"overloaded_error",message:`Provider "${t.name}" cancelled by race winner`}});return new Response(b,{status:502,headers:{"content-type":"application/json","content-length":q.encode(b).byteLength.toString()}})}let h=()=>{clearTimeout(p),g&&clearTimeout(g),setImmediate(()=>{if(y&&!y.destroyed)try{y.destroy()}catch{}})};d.addEventListener("abort",h,{once:!0}),_=()=>d.removeEventListener("abort",h)}try{let h=await Promise.race([Ee(o,{method:"POST",headers:a,body:u,signal:s.signal,dispatcher:t._agent}),w]);if(g&&clearTimeout(g),y=h.body,h.statusCode>=400){clearTimeout(p);let A=await h.body.text();return new Response(A,{status:h.statusCode,statusText:h.statusText,headers:h.headers})}let b=t.stallTimeout??3e4,k=new Ie,R=`Body stalled: no data after ${b}ms`,C=setTimeout(()=>{P({requestId:r.requestId,model:String(r.actualModel??e.model??""),tier:"",state:"error",message:R,timestamp:Date.now()}),k.destroy(new Error(R));try{y?.destroy(new Error(R))}catch{}},b);k.on("data",()=>{clearTimeout(C),C=setTimeout(()=>{P({requestId:r.requestId,model:String(r.actualModel??e.model??""),tier:"",state:"error",message:R,timestamp:Date.now()}),k.destroy(new Error(R));try{y?.destroy(new Error(R))}catch{}},b)}),k.on("end",()=>{clearTimeout(C)}),k.on("error",()=>{clearTimeout(C)}),h.body.pipe(k);let M=new Response(k,{status:h.statusCode,headers:h.headers});return clearTimeout(p),M}catch(h){clearTimeout(p),g&&clearTimeout(g);let b=f?`Provider "${t.name}" timed out waiting for first byte after ${l}ms`:h instanceof DOMException&&h.name==="AbortError"?`Provider "${t.name}" timed out after ${t.timeout}ms`:`Provider "${t.name}" connection failed: ${h.message}`,k=JSON.stringify({type:"error",error:{type:"overloaded_error",message:b}});return new Response(k,{status:502,headers:{"content-type":"application/json","content-length":q.encode(k).byteLength.toString()}})}finally{_?.()}}async function ge(t,e,r,n,d,c,i){let o=ie(t);if(o<=1){L.increment(t.name);let l=Date.now();try{let f=await fe(t,e,r,n,d,c);return N.record(t.name,Date.now()-l),f}finally{L.decrement(t.name)}}i?.warn("Hedging request",{requestId:r.requestId,provider:t.name,count:o,cv:Math.round(N.getCV(t.name)*100)/100,inFlight:L.get(t.name),maxConcurrent:t.concurrentLimit});let u=Date.now(),m=[];for(let l=0;l<o;l++)L.increment(t.name),m.push(fe(t,e,r,n,d,c).finally(()=>L.decrement(t.name)));let a=m.map((l,f)=>l.then(g=>({response:g,hedgeIndex:f}))),s=new Set,p=[];try{for(;s.size<a.length;){let l=a.filter((g,w)=>!s.has(w));if(l.length===0)break;let f=await Promise.race(l);if(s.add(f.hedgeIndex),t._circuitBreaker&&t._circuitBreaker.recordResult(f.response.status),f.response.status>=200&&f.response.status<300){N.record(t.name,Date.now()-u);for(let g=0;g<a.length;g++)s.has(g)||(t._circuitBreaker&&t._circuitBreaker.recordResult(502),a[g].then(w=>{try{w.response.body?.cancel()}catch{}}));for(let g of p)try{g.body?.cancel()}catch{}return f.response}p.push(f.response)}for(let l of p)try{l.body?.cancel()}catch{}return p[0]??new Response(JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${t.name}" all hedged requests failed`}}),{status:502,headers:{"content-type":"application/json"}})}catch{for(let l of p)try{l.body?.cancel()}catch{}return p[0]??new Response(JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${t.name}" hedging failed`}}),{status:502,headers:{"content-type":"application/json"}})}}async function ye(t,e,r,n,d,c){if(e.length<=1){let s=e[0],p=t.get(s.provider);if(!p){let f=JSON.stringify({type:"error",error:{type:"api_error",message:`Unknown provider: ${s.provider}`}});return new Response(f,{status:502,headers:{"content-type":"application/json","content-length":q.encode(f).byteLength.toString()}})}if(p._circuitBreaker&&!p._circuitBreaker.canProceed().allowed){c?.warn("Provider skipped by circuit breaker",{requestId:r.requestId,provider:s.provider});let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${s.provider}" skipped by circuit breaker`}});return new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}})}return d?.(s.provider,0),await ge(p,s,r,n,void 0,0,c)}let i=new AbortController,o=new Set,u=[];async function m(s){let p=e[s],l=t.get(p.provider);if(!l){let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Unknown provider: ${p.provider}`}});return{response:new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}}),index:s}}let f;if(l._circuitBreaker){let g=l._circuitBreaker.canProceed();if(!g.allowed){c?.warn("Provider skipped by circuit breaker",{requestId:r.requestId,provider:p.provider});let w=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${p.provider}" skipped by circuit breaker`}});return{response:new Response(w,{status:502,headers:{"content-type":"application/json","content-length":q.encode(w).byteLength.toString()}}),index:s}}f=g.probeId}d?.(p.provider,s);try{return{response:await ge(l,p,r,n,i.signal,s,c),index:s}}catch{l._circuitBreaker&&l._circuitBreaker.recordResult(502,f);let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${p.provider}" failed`}});return{response:new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}}),index:s}}}let a=[];for(let s=0;s<e.length;s++)s===0?a.push(m(0)):a.push(new Promise(p=>{setTimeout(()=>{if(i.signal.aborted){let l=JSON.stringify({type:"error",error:{type:"api_error",message:"Cancelled by race winner"}});p({response:new Response(l,{status:502,headers:{"content-type":"application/json"}}),index:s});return}m(s).then(p)},$e)}));try{for(;o.size<a.length;){let p=a.filter((f,g)=>!o.has(g));if(p.length===0)break;let l=await Promise.race(p);if(o.add(l.index),l.response.status>=200&&l.response.status<300){i.abort();for(let f of u)try{f.response.body?.cancel()}catch{}return l.response}if(!Ne(l.response.status)){if(i.abort(),l.response.status===400&&l.response.body)try{let f=await l.response.text(),g=De(l.response.status,f);return g||new Response(f,{status:l.response.status,statusText:l.response.statusText,headers:l.response.headers})}catch{return l.response}return l.response}u.push(l)}if(i.abort(),u.length>0)return u[0].response;let s=JSON.stringify({type:"error",error:{type:"overloaded_error",message:"All providers failed"}});return new Response(s,{status:502,headers:{"content-type":"application/json","content-length":q.encode(s).byteLength.toString()}})}catch{i.abort();let s=JSON.stringify({type:"error",error:{type:"overloaded_error",message:"All providers failed"}});return new Response(s,{status:502,headers:{"content-type":"application/json","content-length":q.encode(s).byteLength.toString()}})}}import{randomUUID as ze}from"crypto";import{gzip as Je}from"zlib";import{promisify as Fe}from"util";var Ge=Fe(Je),G={"claude-opus-4-6":2e5,"claude-sonnet-4-6":2e5,"claude-haiku-4-5-20251001":2e5,"claude-3-5-sonnet":2e5,"claude-3-5-haiku":2e5,"glm-4.7":128e3,"glm-5-turbo":128e3};function K(t){if(G[t])return G[t];for(let[e,r]of Object.entries(G))if(t.startsWith(e))return r;return 0}function X(t,e,r){let n=r+t+e;return n<=0?0:Math.round(t/n*1e3)/10}function V(t,e,r,n,d){if(d<=0)return 0;let c=t+e+r+n;return Math.round(c/d*1e3)/10}function Q(t,e,r){return new Response(JSON.stringify({type:"error",error:{type:t,message:e}}),{status:502,headers:{"content-type":"application/json","x-request-id":r}})}function Ke(t){let e=t.message?.usage??t.usage;if(!e)return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0};let r=e.input_tokens??e.prompt_tokens??0,n=e.output_tokens??e.completion_tokens??0,d=e.cache_read_input_tokens??0,c=e.cache_creation_input_tokens??0;return{inputTokens:r,outputTokens:n,cacheReadTokens:d,cacheCreationTokens:c}}function Xe(t,e,r,n,d,c){let i=new TextDecoder,o={input:0,output:0,cacheRead:0,cacheCreation:0},u="",m="",a=4096,s=0,p=0,l=0,f=0,g="",w=null,_=250,y=0,h=!0,b="",k=100,R=S=>{for(let E of S.split(`
2
+ import{a as Z}from"./chunk-OMWFRIHF.js";import{d as ee}from"./chunk-ZF23JS2D.js";import{b as te,e as ne,g as B,k as re}from"./chunk-SCUI4R77.js";import{createAdaptorServer as ve}from"@hono/node-server";import{readFileSync as nt}from"fs";import{Hono as He}from"hono";var $=new Map;function oe(){$.clear()}function ke(t,e){for(let[r,n]of e)for(let d of n)if(t.includes(d))return r;return null}function Se(t,e){return e.get(t)||[]}function se(t,e,r,n){let d=$.get(t);if(d)return $.delete(t),$.set(t,d),{requestId:e,model:t,tier:d.tier,providerChain:d.providerChain,startTime:Date.now(),rawBody:n};let u,a,o=r.modelRouting.get(t);if(o&&o.length>0)u="(modelRouting)",a=o;else{let c=ke(t,r.tierPatterns);if(!c)return null;u=c,a=Se(u,r.routing)}if($.size>=200){let c=$.keys().next().value;c!==void 0&&$.delete(c)}return $.set(t,{tier:u,providerChain:a}),{requestId:e,model:t,tier:u,providerChain:a,startTime:Date.now(),rawBody:n}}import{request as Ee}from"undici";import{PassThrough as Ie}from"stream";import pe from"fs";import me from"path";import Pe from"os";var U=class{samples=new Map;maxSize;MAX_PROVIDERS=50;constructor(e=20){this.maxSize=e}record(e,r){if(this.samples.size>=this.MAX_PROVIDERS&&!this.samples.has(e)){let d=this.samples.keys().next().value;d!==void 0&&this.samples.delete(d)}let n=this.samples.get(e);n||(n=[],this.samples.set(e,n)),n.push({ttfbMs:r,timestamp:Date.now()}),n.length>this.maxSize&&n.splice(0,n.length-this.maxSize)}getCV(e){let r=this.samples.get(e);if(!r||r.length<3)return 0;let n=r.map(a=>a.ttfbMs),d=n.reduce((a,o)=>a+o,0)/n.length;if(d===0)return 0;let u=n.reduce((a,o)=>a+(o-d)**2,0)/n.length;return Math.sqrt(u)/d}getStats(e){let r=this.samples.get(e);if(!r||r.length===0)return{count:0,mean:0,cv:0};let n=r.map(u=>u.ttfbMs),d=n.reduce((u,a)=>u+a,0)/n.length;return{count:n.length,mean:Math.round(d),cv:Math.round(this.getCV(e)*100)/100}}clear(e){this.samples.delete(e)}prune(e){let r=new Set(e);for(let n of this.samples.keys())r.has(n)||this.samples.delete(n)}},H=class{counts=new Map;increment(e){let r=(this.counts.get(e)??0)+1;return this.counts.set(e,r),r}decrement(e){let r=Math.max(0,(this.counts.get(e)??0)-1);return this.counts.set(e,r),r}get(e){return this.counts.get(e)??0}},N=new U,L=new H;function ie(t){let e=N.getCV(t.name),r=L.get(t.name),n=t.concurrentLimit??1,d=Math.max(1,n-r),u=Math.max(1,Math.floor(e*2+.5));return Math.min(u,d)}import{WebSocketServer as Re}from"ws";var Te=3e4,_e=2,ue=64*1024,Ce=500,Me=500,xe=1e4,ae=new WeakMap,J=null,le=0,ce=0;function de(t){let e=Date.now();e-ce>=xe&&(console.warn(`[ws] Backpressure: dropping ${t} events (total dropped stream events: ${le})`),ce=e)}function z(t,e){let r=new Re({server:t,path:"/ws"});J=r,r.on("connection",n=>{let u={type:"summary",data:e.getSummary()};n.send(JSON.stringify(u));let a,o=0,c=()=>n.readyState===n.OPEN,m=e.onRecord(f=>{if(c()){if(n.bufferedAmount>ue){i(),de("metrics");return}setImmediate(()=>{if(!c())return;let g={type:"request",data:f};n.send(JSON.stringify(g))}),i()}});function i(){a||(a=setTimeout(()=>{if(a=void 0,!c())return;let f={type:"summary",data:e.getSummary()};n.send(JSON.stringify(f))},Ce))}let s=setInterval(()=>{if(!c()){clearInterval(s);return}if(o>=_e){l(),n.terminate();return}n.ping(),o++},Te);n.on("pong",()=>{o=0});let p=!1,l=()=>{p||(p=!0,clearInterval(s),a&&clearTimeout(a),m())};n.on("close",l),n.on("error",l)})}function P(t){if(!J)return;let e=JSON.stringify({type:"stream",data:t}),r=t.state==="streaming",n=t.state==="complete"||t.state==="error",d=Date.now();for(let u of J.clients)if(u.readyState===u.OPEN){if(r){let a=ae.get(u)??0;if(d-a<Me)continue;ae.set(u,d)}if(u.bufferedAmount>ue){if(n){let a=()=>{u.readyState===u.OPEN&&u.send(e)};u.once("drain",a),setTimeout(()=>{u.removeListener("drain",a),u.readyState===u.OPEN&&u.send(e)},5e3).unref();continue}le++,de("stream");continue}setImmediate(()=>{u.readyState===u.OPEN&&u.send(e)})}}var Ae=new Set(["anthropic-version","anthropic-beta","content-type","accept"]),Oe=/\/+/g,qe=/^https?:\/\/[^/]+/,F=/"model"\s*:\s*"([^"]*)"/,j=/"max_tokens"\s*:\s*(\d+)/,q=new TextEncoder,$e=3e3;function Ne(t){return t===429||t>=500}var Le=["context window","context_limit","token limit","prompt is too long","max tokens","input too large","too many tokens"];function Be(t,e){if(t!==400)return!1;let r=e.toLowerCase();return Le.some(n=>r.includes(n))}function De(t,e){if(!Be(t,e))return null;console.warn("[context-compact] Upstream context window limit detected");try{let n=me.join(Pe.homedir(),".claude","state");pe.mkdirSync(n,{recursive:!0}),pe.writeFileSync(me.join(n,"context-compact-needed"),Date.now().toString())}catch{}let r=JSON.stringify({type:"error",error:{type:"invalid_request_error",message:"Context window limit reached. Run /compact to reduce conversation size, then retry."}});return new Response(r,{status:400,headers:{"content-type":"application/json"}})}function je(t,e){let r="",n=t,d=t.indexOf("/",t.indexOf("//")+2);d!==-1&&(n=t.substring(0,d),r=t.substring(d));let u="",a=e,o=e.indexOf("?");o!==-1&&(a=e.substring(0,o),u=e.substring(o));let c;return r.endsWith("/v1")&&a.startsWith("/v1")?c=r+a.substring(3):c=r+a,c=c.replace(Oe,"/"),n+c+u}function We(t,e,r){let n=new Headers;for(let u of Ae){let a=t.get(u);a&&n.set(u,a)}e.authType==="bearer"?n.set("Authorization",`Bearer ${e.apiKey}`):n.set("x-api-key",e.apiKey),n.set("x-request-id",r);let d=e._cachedHost;if(d)n.set("host",d);else try{let u=new URL(e.baseUrl);n.set("host",u.host)}catch{}return n}function he(t){let e=t.messages;if(!Array.isArray(e))return;let r=new Set,n=new Set;for(let c=0;c<e.length;c++){let m=e[c];if(Array.isArray(m.content))for(let i of m.content)i.type==="tool_use"&&i.id?r.add(String(i.id)):i.type==="tool_result"&&i.tool_use_id&&n.add(String(i.tool_use_id))}let d=new Set,u=new Set;for(let c of r)n.has(c)||d.add(c);for(let c of n)r.has(c)||u.add(c);if(d.size===0&&u.size===0)return;let a=!1,o=e.map(c=>{if(!Array.isArray(c.content))return c;let m=c.content.filter(i=>!(i.type==="tool_use"&&d.has(String(i.id))||i.type==="tool_result"&&u.has(String(i.tool_use_id))));return m.length<c.content.length?(a=!0,{...c,content:m}):c});a&&(t.messages=o)}function Ue(t,e,r,n,d){if(d){let w=structuredClone(n);if(e.model&&(w.model=e.model),he(w),r.modelLimits){let{maxOutputTokens:M}=r.modelLimits,h=typeof w.max_tokens=="number"?w.max_tokens:M;(w.max_tokens===void 0||h>M)&&(w.max_tokens=Math.min(h,M))}return JSON.stringify(w)}let u=!!(e.model&&n.model!==e.model),a=!1,o=!1,c=0;if(r.modelLimits){c=r.modelLimits.maxOutputTokens;let w=j.exec(t);w?a=parseInt(w[1],10)>c:typeof n.max_tokens!="number"&&(o=!0)}if(!u&&!a&&!o)return t;if(o){let w={...n};return e.model&&(w.model=e.model),w.max_tokens=c,JSON.stringify(w)}let m=[];u&&m.push(F.source),a&&m.push(j.source);let i=new RegExp(m.join("|"),"g"),s=u?`"model":"${e.model}"`:null,p=a?`"max_tokens":${c}`:null,l=n.model,f=!1;return t.replace(i,w=>s&&F.test(w)?(F.lastIndex=0,!f&&l&&(console.warn(`Routing override: ${l} -> ${e.model} via ${r.name}`),f=!0),s):p&&j.test(w)?(j.lastIndex=0,p):w)}async function fe(t,e,r,n,d,u=0){let a=n.url.replace(qe,"");e.model&&(r.actualModel=e.model);let o=je(t.baseUrl,a),c;if((n.headers.get("content-type")||"").includes("application/json"))try{let y=r.parsedBody??JSON.parse(r.rawBody),b=!1;e.model&&y.model!==e.model&&(b=!0);let k=u>0;if(k&&(b=!0),t.modelLimits){let{maxOutputTokens:S}=t.modelLimits,C=typeof y.max_tokens=="number"?y.max_tokens:S;(y.max_tokens===void 0||C>S)&&(b=!0)}if(b)if(u===0&&!k)c=Ue(r.rawBody,e,t,y,!1);else{let S=structuredClone(y);if(e.model){let C=S.model;S.model=e.model,C&&C!==e.model&&console.warn(`Routing override: ${C} -> ${e.model} via ${t.name}`)}if(k&&he(S),t.modelLimits){let{maxOutputTokens:C}=t.modelLimits,R=typeof S.max_tokens=="number"?S.max_tokens:C;(S.max_tokens===void 0||R>C)&&(S.max_tokens=Math.min(R,C))}c=JSON.stringify(S)}else c=r.rawBody}catch{c=r.rawBody}else c=r.rawBody;let i=We(n.headers,t,r.requestId);i.set("content-length",Buffer.byteLength(c,"utf-8").toString());let s=new AbortController,p=setTimeout(()=>s.abort(),t.timeout),l=t.ttfbTimeout??15e3,f=!1,g=null,w=new Promise((y,b)=>{g=setTimeout(()=>{f=!0,s.abort(),b(new Error(`TTFB timeout after ${l}ms`))},l)}),M,h;if(d){if(d.aborted){clearTimeout(p),g&&clearTimeout(g);let b=JSON.stringify({type:"error",error:{type:"overloaded_error",message:`Provider "${t.name}" cancelled by race winner`}});return new Response(b,{status:502,headers:{"content-type":"application/json","content-length":q.encode(b).byteLength.toString()}})}let y=()=>{clearTimeout(p),g&&clearTimeout(g),setImmediate(()=>{if(h&&!h.destroyed&&!h.readableEnded)try{h.destroy().catch?.(()=>{})}catch{}})};d.addEventListener("abort",y,{once:!0}),M=()=>d.removeEventListener("abort",y)}try{let y=await Promise.race([Ee(o,{method:"POST",headers:i,body:c,signal:s.signal,dispatcher:t._agent}),w]);if(g&&clearTimeout(g),h=y.body,h.on("error",()=>{clearTimeout(C)}),y.statusCode>=400){clearTimeout(p);let A=await y.body.text();return new Response(A,{status:y.statusCode,statusText:y.statusText,headers:y.headers})}let b=t.stallTimeout??3e4,k=new Ie,S=`Body stalled: no data after ${b}ms`,C=setTimeout(()=>{P({requestId:r.requestId,model:String(r.actualModel??e.model??""),tier:"",state:"error",message:S,timestamp:Date.now()});try{(h?.destroy(new Error(S))).catch?.(()=>{})}catch{}k.destroy(new Error(S))},b);k.on("data",()=>{clearTimeout(C),C=setTimeout(()=>{P({requestId:r.requestId,model:String(r.actualModel??e.model??""),tier:"",state:"error",message:S,timestamp:Date.now()});try{(h?.destroy(new Error(S))).catch?.(()=>{})}catch{}k.destroy(new Error(S))},b)}),k.on("end",()=>{clearTimeout(C)}),k.on("error",()=>{clearTimeout(C)}),y.body.pipe(k);let R=new Response(k,{status:y.statusCode,headers:y.headers});return clearTimeout(p),R}catch(y){clearTimeout(p),g&&clearTimeout(g);let b=f?`Provider "${t.name}" timed out waiting for first byte after ${l}ms`:y instanceof DOMException&&y.name==="AbortError"?`Provider "${t.name}" timed out after ${t.timeout}ms`:`Provider "${t.name}" connection failed: ${y.message}`,k=JSON.stringify({type:"error",error:{type:"overloaded_error",message:b}});return new Response(k,{status:502,headers:{"content-type":"application/json","content-length":q.encode(k).byteLength.toString()}})}finally{M?.()}}async function ge(t,e,r,n,d,u,a){let o=ie(t);if(o<=1){L.increment(t.name);let l=Date.now();try{let f=await fe(t,e,r,n,d,u);return N.record(t.name,Date.now()-l),f}finally{L.decrement(t.name)}}a?.warn("Hedging request",{requestId:r.requestId,provider:t.name,count:o,cv:Math.round(N.getCV(t.name)*100)/100,inFlight:L.get(t.name),maxConcurrent:t.concurrentLimit});let c=Date.now(),m=[];for(let l=0;l<o;l++)L.increment(t.name),m.push(fe(t,e,r,n,d,u).finally(()=>L.decrement(t.name)));let i=m.map((l,f)=>l.then(g=>({response:g,hedgeIndex:f}))),s=new Set,p=[];try{for(;s.size<i.length;){let l=i.filter((g,w)=>!s.has(w));if(l.length===0)break;let f=await Promise.race(l);if(s.add(f.hedgeIndex),t._circuitBreaker&&t._circuitBreaker.recordResult(f.response.status),f.response.status>=200&&f.response.status<300){N.record(t.name,Date.now()-c);for(let g=0;g<i.length;g++)s.has(g)||(t._circuitBreaker&&t._circuitBreaker.recordResult(502),i[g].then(w=>{try{w.response.body?.cancel()}catch{}}));for(let g of p)try{g.body?.cancel()}catch{}return f.response}p.push(f.response)}for(let l of p)try{l.body?.cancel()}catch{}return p[0]??new Response(JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${t.name}" all hedged requests failed`}}),{status:502,headers:{"content-type":"application/json"}})}catch{for(let l of p)try{l.body?.cancel()}catch{}return p[0]??new Response(JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${t.name}" hedging failed`}}),{status:502,headers:{"content-type":"application/json"}})}}async function ye(t,e,r,n,d,u){if(e.length<=1){let s=e[0],p=t.get(s.provider);if(!p){let f=JSON.stringify({type:"error",error:{type:"api_error",message:`Unknown provider: ${s.provider}`}});return new Response(f,{status:502,headers:{"content-type":"application/json","content-length":q.encode(f).byteLength.toString()}})}if(p._circuitBreaker&&!p._circuitBreaker.canProceed().allowed){u?.warn("Provider skipped by circuit breaker",{requestId:r.requestId,provider:s.provider});let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${s.provider}" skipped by circuit breaker`}});return new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}})}return d?.(s.provider,0),await ge(p,s,r,n,void 0,0,u)}let a=new AbortController,o=new Set,c=[];async function m(s){let p=e[s],l=t.get(p.provider);if(!l){let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Unknown provider: ${p.provider}`}});return{response:new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}}),index:s}}let f;if(l._circuitBreaker){let g=l._circuitBreaker.canProceed();if(!g.allowed){u?.warn("Provider skipped by circuit breaker",{requestId:r.requestId,provider:p.provider});let w=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${p.provider}" skipped by circuit breaker`}});return{response:new Response(w,{status:502,headers:{"content-type":"application/json","content-length":q.encode(w).byteLength.toString()}}),index:s}}f=g.probeId}d?.(p.provider,s);try{return{response:await ge(l,p,r,n,a.signal,s,u),index:s}}catch{l._circuitBreaker&&l._circuitBreaker.recordResult(502,f);let g=JSON.stringify({type:"error",error:{type:"api_error",message:`Provider "${p.provider}" failed`}});return{response:new Response(g,{status:502,headers:{"content-type":"application/json","content-length":q.encode(g).byteLength.toString()}}),index:s}}}let i=[];for(let s=0;s<e.length;s++)s===0?i.push(m(0)):i.push(new Promise(p=>{setTimeout(()=>{if(a.signal.aborted){let l=JSON.stringify({type:"error",error:{type:"api_error",message:"Cancelled by race winner"}});p({response:new Response(l,{status:502,headers:{"content-type":"application/json"}}),index:s});return}m(s).then(p)},$e)}));try{for(;o.size<i.length;){let p=i.filter((f,g)=>!o.has(g));if(p.length===0)break;let l=await Promise.race(p);if(o.add(l.index),l.response.status>=200&&l.response.status<300){a.abort();for(let f of c)try{f.response.body?.cancel()}catch{}return l.response}if(!Ne(l.response.status)){if(a.abort(),l.response.status===400&&l.response.body)try{let f=await l.response.text(),g=De(l.response.status,f);return g||new Response(f,{status:l.response.status,statusText:l.response.statusText,headers:l.response.headers})}catch{return l.response}return l.response}c.push(l)}if(a.abort(),c.length>0)return c[0].response;let s=JSON.stringify({type:"error",error:{type:"overloaded_error",message:"All providers failed"}});return new Response(s,{status:502,headers:{"content-type":"application/json","content-length":q.encode(s).byteLength.toString()}})}catch{a.abort();let s=JSON.stringify({type:"error",error:{type:"overloaded_error",message:"All providers failed"}});return new Response(s,{status:502,headers:{"content-type":"application/json","content-length":q.encode(s).byteLength.toString()}})}}import{randomUUID as Je}from"crypto";import{gzip as ze}from"zlib";import{promisify as Fe}from"util";var Ge=Fe(ze),G={"claude-opus-4-6":2e5,"claude-sonnet-4-6":2e5,"claude-haiku-4-5-20251001":2e5,"claude-3-5-sonnet":2e5,"claude-3-5-haiku":2e5,"glm-4.7":128e3,"glm-5-turbo":128e3};function K(t){if(G[t])return G[t];for(let[e,r]of Object.entries(G))if(t.startsWith(e))return r;return 0}function X(t,e,r){let n=r+t+e;return n<=0?0:Math.round(t/n*1e3)/10}function V(t,e,r,n,d){if(d<=0)return 0;let u=t+e+r+n;return Math.round(u/d*1e3)/10}function Q(t,e,r){return new Response(JSON.stringify({type:"error",error:{type:t,message:e}}),{status:502,headers:{"content-type":"application/json","x-request-id":r}})}function Ke(t){let e=t.message?.usage??t.usage;if(!e)return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0};let r=e.input_tokens??e.prompt_tokens??0,n=e.output_tokens??e.completion_tokens??0,d=e.cache_read_input_tokens??0,u=e.cache_creation_input_tokens??0;return{inputTokens:r,outputTokens:n,cacheReadTokens:d,cacheCreationTokens:u}}function Xe(t,e,r,n,d,u){let a=new TextDecoder,o={input:0,output:0,cacheRead:0,cacheCreation:0},c="",m="",i=4096,s=0,p=0,l=0,f=0,g="",w=null,M=250,h=0,y=!0,b="",k=100,S=T=>{for(let E of T.split(`
3
3
 
4
4
  `)){if(!E)continue;let x=E.split(`
5
- `).find(T=>T.startsWith("data:"));if(x)try{let T=JSON.parse(x.slice(5));if(x.includes('"usage"')){let v=Ke(T);v.inputTokens>o.input&&(o.input=v.inputTokens),v.outputTokens>o.output&&(o.output=v.outputTokens),v.cacheReadTokens>o.cacheRead&&(o.cacheRead=v.cacheReadTokens),v.cacheCreationTokens>o.cacheCreation&&(o.cacheCreation=v.cacheCreationTokens)}let I=T.delta;I&&typeof I.text=="string"&&(b+=I.text,b.length>k&&(b=b.slice(-k)));let O=T.choices;if(O?.[0]){let v=O[0].delta;v&&typeof v.content=="string"&&(b+=v.content,b.length>k&&(b=b.slice(-k)))}}catch{}}},C=S=>{if(!S.includes('"usage"')){let v=[...S.matchAll(/"text"\s*:\s*"((?:[^"\\]|\\.)*)"/g)];if(v.length>0){let D=v[v.length-1][1].replace(/\\n/g,`
6
- `).replace(/\\"/g,'"').replace(/\\\\/g,"\\");b+=D,b.length>k&&(b=b.slice(-k))}return}let E=[...S.matchAll(/"(?:input_tokens|prompt_tokens)"\s*:\s*(\d+)/g)],x=[...S.matchAll(/"cache_read_input_tokens"\s*:\s*(\d+)/g)],T=[...S.matchAll(/"cache_creation_input_tokens"\s*:\s*(\d+)/g)],I=[...S.matchAll(/"(?:output_tokens|completion_tokens)"\s*:\s*(\d+)/g)];if(E.length>0){let v=parseInt(E[E.length-1][1],10);v>s&&(s=v)}if(x.length>0){let v=parseInt(x[x.length-1][1],10);v>p&&(p=v)}if(T.length>0){let v=parseInt(T[T.length-1][1],10);v>l&&(l=v)}if(I.length>0){let v=parseInt(I[I.length-1][1],10);v>f&&(f=v)}let O=[...S.matchAll(/"text"\s*:\s*"((?:[^"\\]|\\.)*)"/g)];if(O.length>0){let v=O[O.length-1][1].replace(/\\n/g,`
7
- `).replace(/\\"/g,'"').replace(/\\\\/g,"\\");b+=v,b.length>k&&(b=b.slice(-k))}},M=(S,E,x=0,T=0)=>{try{let I=Date.now()-t.startTime,O=I/1e3,v=O>0?E/O:0;n.recordRequest({requestId:t.requestId,model:t.model,actualModel:t.actualModel||t.model,tier:t.tier,provider:e,targetProvider:r,status:d,inputTokens:S,outputTokens:E,latencyMs:I,tokensPerSec:Math.round(v*10)/10,timestamp:Date.now(),fallbackMode:t.fallbackMode,cacheReadTokens:x,cacheCreationTokens:T});let D=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"complete",status:d,latencyMs:Date.now()-t.startTime,inputTokens:S,outputTokens:E,tokensPerSec:Math.round(v*10)/10,timestamp:Date.now(),cacheReadTokens:x,cacheCreationTokens:T,cacheHitRate:X(x,T,S),contextPercent:V(S,x,T,E,D),contextWindowSize:D||void 0})})}catch{}},A=(S,E)=>{if(w===null&&(w=c.includes("text/event-stream")||S.startsWith("event:")),w){u+=S;let x=u.split(`
8
- `);u=x.pop();for(let I of x)I===""?m&&(R(m),m=""):m+=(m?`
9
- `:"")+I;E&&m.trim()&&R(m);let T=Date.now();if(h||T-y>=_){y=T,h=!1;let I=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"streaming",outputTokens:o.output,timestamp:T,preview:b,cacheHitRate:X(o.cacheRead,o.cacheCreation,o.input),contextPercent:V(o.input,o.cacheRead,o.cacheCreation,o.output,I),contextWindowSize:I||void 0})})}E&&M(o.input,o.output,o.cacheRead,o.cacheCreation)}else{g+=S,g.length>a&&(g=g.slice(-a)),C(g);let x=Date.now();if(h||x-y>=_){y=x,h=!1;let T=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"streaming",outputTokens:f,timestamp:x,preview:b,cacheHitRate:X(p,l,s),contextPercent:V(s,p,l,f,T),contextWindowSize:T||void 0})})}E&&M(s,f,p,l)}};return new TransformStream({transform(S,E){E.enqueue(S),A(i.decode(S,{stream:!0}),!1)},flush(){A("",!0)}})}function we(t){let e=t._cachedOrigin,r=t.poolSize??10;return`${e??"unknown"}:${r}`}function Y(t,e,r){let n=t,d=Z(e),c=new He;return c.onError((i,o)=>(console.error(`[server] Unhandled error: ${i.message}`),o.json({type:"error",error:{type:"api_error",message:"Internal proxy error"}},{status:500,headers:{"content-type":"application/json"}}))),c.use("/api/*",async(i,o)=>{i.header("Access-Control-Allow-Origin","*"),await o()}),c.options("/api/*",i=>(i.header("Access-Control-Allow-Origin","*"),i.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),i.header("Access-Control-Allow-Headers","Content-Type, Authorization, anthropic-version, x-api-key"),i.body("",200))),c.post("/v1/messages",async i=>{let o=ze(),u,m;try{m=await i.req.text(),u=JSON.parse(m)}catch{return Q("invalid_request_error","Invalid JSON body",o)}let a=u.model;if(!a)return Q("invalid_request_error","Missing 'model' field in request body",o);let s=se(a,o,n,m);if(s&&(s.parsedBody=u),!s){d.info("No tier match",{requestId:o,model:a});let y=n.modelRouting.size>0?` Configured model routes: ${[...n.modelRouting.keys()].join(", ")}.`:"";return Q("invalid_request_error",`No route matches model "${a}". Configured tiers: ${[...n.tierPatterns.keys()].join(", ")}.${y}`,o)}d.info("Routing request",{requestId:o,model:a,tier:s.tier,providers:s.providerChain.map(y=>y.provider)}),P({requestId:o,model:a,tier:s.tier,state:"start",provider:s.providerChain[0]?.provider??"unknown",timestamp:Date.now()});let p="unknown",l;try{if(l=await ye(n.providers,s.providerChain,s,i.req.raw,(y,h)=>{d.info("Attempting provider",{requestId:o,provider:y,index:h,tier:s.tier}),p||(p=y)},d),l.status<400){let y=17;l.headers.forEach((h,b)=>{y+=b.length+h.length+4}),y+=2,setImmediate(()=>{P({requestId:o,model:a,tier:s.tier,state:"ttfb",status:l.status,headerSize:y,timestamp:Date.now()})})}}catch(y){let h=y instanceof Error?y.message:String(y);return d.error("Forward failed",{requestId:o,error:h}),setImmediate(()=>{P({requestId:o,model:a,tier:s.tier,state:"error",status:502,message:h,timestamp:Date.now()})}),i.json({type:"error",error:{type:"api_error",message:"Upstream request failed: "+h}},502)}l.status>=400&&setImmediate(()=>{P({requestId:o,model:a,tier:s.tier,state:"error",status:l.status,message:`HTTP ${l.status}`,timestamp:Date.now()})});let f=l.body;if(l.body&&l.status>=200&&l.status<300&&r){let y=s.providerChain.length>0?s.providerChain[0].provider:p,h=Xe(s,p,y,r,l.status,l.headers.get("content-type")||"");f=l.body.pipeThrough(h)}let g=new Headers(l.headers);g.set("x-request-id",o);let w=new Response(f,{status:l.status,statusText:l.statusText,headers:g}),_=Date.now()-s.startTime;return d.info("Request completed",{requestId:o,model:a,tier:s.tier,status:w.status,latencyMs:_}),w}),c.get("/api/metrics/summary",async i=>{if(!r)return i.json({error:"Metrics not enabled"},503);let o=r.getSummary(),u=JSON.stringify(o);if((i.req.header("accept-encoding")||"").includes("gzip")&&u.length>=1024){let a=await Ge(Buffer.from(u));return new Response(a,{status:200,headers:{"content-type":"application/json","content-encoding":"gzip",vary:"accept-encoding"}})}return i.json(o)}),c.get("/api/circuit-breaker",i=>{let o={};for(let[u,m]of n.providers){let a=m._circuitBreaker;if(a){let s=a.getStatus();o[u]={state:s.state,failures:s.failures,lastFailure:s.lastFailure?new Date(s.lastFailure).toISOString():null}}}return i.json(o)}),{app:c,getConfig:()=>n,setConfig:i=>{let o=new Map;for(let m of n.providers.values())m._agent&&o.set(we(m),m._agent);let u=new Set;for(let m of i.providers.values()){let a=we(m),s=o.get(a);s&&(m._agent=s,u.add(a))}for(let[m,a]of o)u.has(m)||a.close();n=i,oe()}}}var W=class{buffer;maxSize;head=0;count=0;subscribers;createdAt;_totalInputTokens=0;_totalOutputTokens=0;_totalTokensPerSec=0;_totalCacheReadTokens=0;_totalCacheCreationTokens=0;_modelMap=new Map;_providerMap=new Map;constructor(e=1e3){this.buffer=new Array(e).fill(null),this.maxSize=e,this.subscribers=new Set,this.createdAt=Date.now()}recordRequest(e){let r=this.head%this.maxSize,n=this.count>=this.maxSize?this.buffer[r]:null;if(n!==null){this._totalInputTokens-=n.inputTokens??0,this._totalOutputTokens-=n.outputTokens??0,this._totalTokensPerSec-=n.tokensPerSec??0,this._totalCacheReadTokens-=n.cacheReadTokens??0,this._totalCacheCreationTokens-=n.cacheCreationTokens??0;let o=n.model,u=this._modelMap.get(o);u&&(u.count--,u.count<=0&&this._modelMap.delete(o));let m=n.targetProvider??n.provider,a=this._providerMap.get(m)??0;a<=1?this._providerMap.delete(m):this._providerMap.set(m,a-1)}this._totalInputTokens+=e.inputTokens??0,this._totalOutputTokens+=e.outputTokens??0,this._totalTokensPerSec+=e.tokensPerSec??0,this._totalCacheReadTokens+=e.cacheReadTokens??0,this._totalCacheCreationTokens+=e.cacheCreationTokens??0;let d=e.model,c=this._modelMap.get(d);c?(c.count++,e.timestamp>c.lastSeen&&(c.lastSeen=e.timestamp),c.actualModel=e.actualModel):this._modelMap.set(d,{actualModel:e.actualModel,count:1,lastSeen:e.timestamp});let i=e.targetProvider??e.provider;this._providerMap.set(i,(this._providerMap.get(i)??0)+1),this.buffer[r]=e,this.head++,this.count<this.maxSize&&this.count++;for(let o of this.subscribers)try{o(e)}catch{}}getSummary(){let e=this.getRecentRequests(),r=[...this._modelMap.entries()].map(([i,{actualModel:o,count:u,lastSeen:m}])=>({model:i,actualModel:o,count:u,lastSeen:m})).sort((i,o)=>o.count-i.count),n=[...this._providerMap.entries()].map(([i,o])=>({provider:i,count:o})).sort((i,o)=>o.count-i.count),d=0,c=0;for(let i of e){let o=(i.inputTokens??0)+(i.cacheReadTokens??0)+(i.cacheCreationTokens??0);o>0&&(i.cacheReadTokens??0)>0&&(d+=i.cacheReadTokens/o*100,c++)}return{totalRequests:this.count,totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,avgTokensPerSec:this.count>0?Math.round(this._totalTokensPerSec/this.count*10)/10:0,totalCacheReadTokens:this._totalCacheReadTokens,totalCacheCreationTokens:this._totalCacheCreationTokens,avgCacheHitRate:c>0?Math.round(d/c*10)/10:0,activeModels:r,providerDistribution:n,recentRequests:e,uptimeSeconds:Math.floor((Date.now()-this.createdAt)/1e3)}}onRecord(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}getRecentRequests(){if(this.count===0)return[];let e=Math.min(this.count,50),r=[];for(let n=0;n<e;n++){let d=((this.head-1-n)%this.maxSize+this.maxSize)%this.maxSize,c=this.buffer[d];c!==null&&r.push(c)}return r.reverse(),r}};import{spawn as Ve}from"child_process";import{existsSync as Qe,unlinkSync as Ye}from"fs";import{dirname as Ze,join as et}from"path";import{fileURLToPath as tt}from"url";async function be(t){let e=te();Qe(e)&&Ye(e),await ne(process.pid);let r=process.argv[1]||et(Ze(tt(import.meta.url)),"index.js");process.on("uncaughtException",f=>{console.error(`[monitor] Uncaught exception: ${f.message}`)}),process.on("unhandledRejection",f=>{console.error(`[monitor] Unhandled rejection: ${f}`)});let n=10,d=1e3,c=3e4,i=6e4,o=0,u=null,m=null,a=!1,s=!1,p=null;async function l(){let f=await import("net");if(await new Promise(_=>{let y=f.createServer();y.once("error",()=>_(!0)),y.once("listening",()=>{y.close(()=>_(!1))}),y.listen(t.port??3456)})){console.error(`[monitor] Port ${t.port??3456} already in use, skipping worker spawn`);return}let w=[r,"--daemon"];t.config&&w.push("--config",t.config),t.port&&w.push("--port",String(t.port)),t.verbose&&w.push("--verbose"),p=Ve(process.execPath,w,{detached:!0,stdio:"ignore",env:{...process.env}}),u&&clearTimeout(u),u=setTimeout(()=>{o>0&&console.error(`[monitor] Worker stable for ${i}ms, resetting restart counter`),o=0,u=null},i),p.on("exit",async _=>{p=null,u&&(clearTimeout(u),u=null),await re(),_===0&&!s&&(await B(),process.exit(0)),s=!1,a&&(console.error("[monitor] Worker exited during shutdown, monitor exiting"),await B(),process.exit(0));let y=o;y>=n&&(console.error(`[monitor] Max restart attempts exhausted (${n}), monitor exiting`),await B(),process.exit(1));let h=Math.min(d*2**y,c);o++,console.error(`[monitor] Worker died (code ${_}), restarting in ${h}ms (attempt ${o}/${n})`),m=setTimeout(l,h)})}process.on("SIGTERM",()=>{if(a=!0,m&&(clearTimeout(m),m=null),u&&(clearTimeout(u),u=null),p){try{p.kill("SIGTERM")}catch{}setTimeout(()=>{console.error("[monitor] Child did not exit within 5 s, forcing exit"),process.exit(0)},5e3)}else B().then(()=>process.exit(0))}),process.on("SIGINT",()=>{if(a=!0,m&&(clearTimeout(m),m=null),u&&(clearTimeout(u),u=null),p){try{p.kill("SIGTERM")}catch{}setTimeout(()=>{console.error("[monitor] Child did not exit within 5 s, forcing exit"),process.exit(0)},5e3)}else B().then(()=>process.exit(0))}),process.on("SIGHUP",()=>{if(console.log("[monitor] Received reload signal, restarting worker..."),s=!0,m&&(clearTimeout(m),m=null),p)try{p.kill("SIGTERM")}catch{}o=0}),l()}var rt=JSON.parse(nt(new URL("../package.json",import.meta.url),"utf-8")).version;function ot(t){let e={verbose:!1,help:!1,daemon:!1,monitor:!1,gui:!1};for(let r=2;r<t.length;r++)switch(t[r]){case"-p":case"--port":let n=t[++r];(!n||isNaN(parseInt(n,10)))&&(console.error("Error: -p/--port requires a number"),process.exit(1)),e.port=parseInt(n,10);break;case"-c":case"--config":let d=t[++r];d||(console.error("Error: -c/--config requires a path"),process.exit(1)),e.config=d;break;case"-v":case"--verbose":e.verbose=!0;break;case"-h":case"--help":e.help=!0;break;case"--daemon":e.daemon=!0;break;case"--monitor":e.monitor=!0;break}return e}function st(){console.log(`
5
+ `).find(_=>_.startsWith("data:"));if(x)try{let _=JSON.parse(x.slice(5));if(x.includes('"usage"')){let v=Ke(_);v.inputTokens>o.input&&(o.input=v.inputTokens),v.outputTokens>o.output&&(o.output=v.outputTokens),v.cacheReadTokens>o.cacheRead&&(o.cacheRead=v.cacheReadTokens),v.cacheCreationTokens>o.cacheCreation&&(o.cacheCreation=v.cacheCreationTokens)}let I=_.delta;I&&typeof I.text=="string"&&(b+=I.text,b.length>k&&(b=b.slice(-k)));let O=_.choices;if(O?.[0]){let v=O[0].delta;v&&typeof v.content=="string"&&(b+=v.content,b.length>k&&(b=b.slice(-k)))}}catch{}}},C=T=>{if(!T.includes('"usage"')){let v=[...T.matchAll(/"text"\s*:\s*"((?:[^"\\]|\\.)*)"/g)];if(v.length>0){let D=v[v.length-1][1].replace(/\\n/g,`
6
+ `).replace(/\\"/g,'"').replace(/\\\\/g,"\\");b+=D,b.length>k&&(b=b.slice(-k))}return}let E=[...T.matchAll(/"(?:input_tokens|prompt_tokens)"\s*:\s*(\d+)/g)],x=[...T.matchAll(/"cache_read_input_tokens"\s*:\s*(\d+)/g)],_=[...T.matchAll(/"cache_creation_input_tokens"\s*:\s*(\d+)/g)],I=[...T.matchAll(/"(?:output_tokens|completion_tokens)"\s*:\s*(\d+)/g)];if(E.length>0){let v=parseInt(E[E.length-1][1],10);v>s&&(s=v)}if(x.length>0){let v=parseInt(x[x.length-1][1],10);v>p&&(p=v)}if(_.length>0){let v=parseInt(_[_.length-1][1],10);v>l&&(l=v)}if(I.length>0){let v=parseInt(I[I.length-1][1],10);v>f&&(f=v)}let O=[...T.matchAll(/"text"\s*:\s*"((?:[^"\\]|\\.)*)"/g)];if(O.length>0){let v=O[O.length-1][1].replace(/\\n/g,`
7
+ `).replace(/\\"/g,'"').replace(/\\\\/g,"\\");b+=v,b.length>k&&(b=b.slice(-k))}},R=(T,E,x=0,_=0)=>{try{let I=Date.now()-t.startTime,O=I/1e3,v=O>0?E/O:0;n.recordRequest({requestId:t.requestId,model:t.model,actualModel:t.actualModel||t.model,tier:t.tier,provider:e,targetProvider:r,status:d,inputTokens:T,outputTokens:E,latencyMs:I,tokensPerSec:Math.round(v*10)/10,timestamp:Date.now(),fallbackMode:t.fallbackMode,cacheReadTokens:x,cacheCreationTokens:_});let D=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"complete",status:d,latencyMs:Date.now()-t.startTime,inputTokens:T,outputTokens:E,tokensPerSec:Math.round(v*10)/10,timestamp:Date.now(),cacheReadTokens:x,cacheCreationTokens:_,cacheHitRate:X(x,_,T),contextPercent:V(T,x,_,E,D),contextWindowSize:D||void 0})})}catch{}},A=(T,E)=>{if(w===null&&(w=u.includes("text/event-stream")||T.startsWith("event:")),w){c+=T;let x=c.split(`
8
+ `);c=x.pop();for(let I of x)I===""?m&&(S(m),m=""):m+=(m?`
9
+ `:"")+I;E&&m.trim()&&S(m);let _=Date.now();if(y||_-h>=M){h=_,y=!1;let I=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"streaming",outputTokens:o.output,timestamp:_,preview:b,cacheHitRate:X(o.cacheRead,o.cacheCreation,o.input),contextPercent:V(o.input,o.cacheRead,o.cacheCreation,o.output,I),contextWindowSize:I||void 0})})}E&&R(o.input,o.output,o.cacheRead,o.cacheCreation)}else{g+=T,g.length>i&&(g=g.slice(-i)),C(g);let x=Date.now();if(y||x-h>=M){h=x,y=!1;let _=K(t.actualModel||t.model);setImmediate(()=>{P({requestId:t.requestId,model:t.model,tier:t.tier,state:"streaming",outputTokens:f,timestamp:x,preview:b,cacheHitRate:X(p,l,s),contextPercent:V(s,p,l,f,_),contextWindowSize:_||void 0})})}E&&R(s,f,p,l)}};return new TransformStream({transform(T,E){E.enqueue(T),A(a.decode(T,{stream:!0}),!1)},flush(){A("",!0)}})}function we(t){let e=t._cachedOrigin,r=t.poolSize??10;return`${e??"unknown"}:${r}`}function Y(t,e,r){let n=t,d=Z(e),u=new He;return u.onError((a,o)=>(console.error(`[server] Unhandled error: ${a.message}`),o.json({type:"error",error:{type:"api_error",message:"Internal proxy error"}},{status:500,headers:{"content-type":"application/json"}}))),u.use("/api/*",async(a,o)=>{a.header("Access-Control-Allow-Origin","*"),await o()}),u.options("/api/*",a=>(a.header("Access-Control-Allow-Origin","*"),a.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),a.header("Access-Control-Allow-Headers","Content-Type, Authorization, anthropic-version, x-api-key"),a.body("",200))),u.post("/v1/messages",async a=>{let o=Je(),c,m;try{m=await a.req.text(),c=JSON.parse(m)}catch{return Q("invalid_request_error","Invalid JSON body",o)}let i=c.model;if(!i)return Q("invalid_request_error","Missing 'model' field in request body",o);let s=se(i,o,n,m);if(s&&(s.parsedBody=c),!s){d.info("No tier match",{requestId:o,model:i});let h=n.modelRouting.size>0?` Configured model routes: ${[...n.modelRouting.keys()].join(", ")}.`:"";return Q("invalid_request_error",`No route matches model "${i}". Configured tiers: ${[...n.tierPatterns.keys()].join(", ")}.${h}`,o)}d.info("Routing request",{requestId:o,model:i,tier:s.tier,providers:s.providerChain.map(h=>h.provider)}),P({requestId:o,model:i,tier:s.tier,state:"start",provider:s.providerChain[0]?.provider??"unknown",timestamp:Date.now()});let p="unknown",l;try{if(l=await ye(n.providers,s.providerChain,s,a.req.raw,(h,y)=>{d.info("Attempting provider",{requestId:o,provider:h,index:y,tier:s.tier}),p||(p=h)},d),l.status<400){let h=17;l.headers.forEach((y,b)=>{h+=b.length+y.length+4}),h+=2,setImmediate(()=>{P({requestId:o,model:i,tier:s.tier,state:"ttfb",status:l.status,headerSize:h,timestamp:Date.now()})})}}catch(h){let y=h instanceof Error?h.message:String(h);return d.error("Forward failed",{requestId:o,error:y}),setImmediate(()=>{P({requestId:o,model:i,tier:s.tier,state:"error",status:502,message:y,timestamp:Date.now()})}),a.json({type:"error",error:{type:"api_error",message:"Upstream request failed: "+y}},502)}l.status>=400&&setImmediate(()=>{P({requestId:o,model:i,tier:s.tier,state:"error",status:l.status,message:`HTTP ${l.status}`,timestamp:Date.now()})});let f=l.body;if(l.body&&l.status>=200&&l.status<300&&r){let h=s.providerChain.length>0?s.providerChain[0].provider:p,y=Xe(s,p,h,r,l.status,l.headers.get("content-type")||"");f=l.body.pipeThrough(y)}let g=new Headers(l.headers);g.set("x-request-id",o);let w=new Response(f,{status:l.status,statusText:l.statusText,headers:g}),M=Date.now()-s.startTime;return d.info("Request completed",{requestId:o,model:i,tier:s.tier,status:w.status,latencyMs:M}),w}),u.get("/api/metrics/summary",async a=>{if(!r)return a.json({error:"Metrics not enabled"},503);let o=r.getSummary(),c=JSON.stringify(o);if((a.req.header("accept-encoding")||"").includes("gzip")&&c.length>=1024){let i=await Ge(Buffer.from(c));return new Response(i,{status:200,headers:{"content-type":"application/json","content-encoding":"gzip",vary:"accept-encoding"}})}return a.json(o)}),u.get("/api/circuit-breaker",a=>{let o={};for(let[c,m]of n.providers){let i=m._circuitBreaker;if(i){let s=i.getStatus();o[c]={state:s.state,failures:s.failures,lastFailure:s.lastFailure?new Date(s.lastFailure).toISOString():null}}}return a.json(o)}),{app:u,getConfig:()=>n,setConfig:a=>{let o=new Map;for(let m of n.providers.values())m._agent&&o.set(we(m),m._agent);let c=new Set;for(let m of a.providers.values()){let i=we(m),s=o.get(i);s&&(m._agent=s,c.add(i))}for(let[m,i]of o)c.has(m)||i.close();n=a,oe()}}}var W=class{buffer;maxSize;head=0;count=0;subscribers;createdAt;_totalInputTokens=0;_totalOutputTokens=0;_totalTokensPerSec=0;_totalCacheReadTokens=0;_totalCacheCreationTokens=0;_modelMap=new Map;_providerMap=new Map;constructor(e=1e3){this.buffer=new Array(e).fill(null),this.maxSize=e,this.subscribers=new Set,this.createdAt=Date.now()}recordRequest(e){let r=this.head%this.maxSize,n=this.count>=this.maxSize?this.buffer[r]:null;if(n!==null){this._totalInputTokens-=n.inputTokens??0,this._totalOutputTokens-=n.outputTokens??0,this._totalTokensPerSec-=n.tokensPerSec??0,this._totalCacheReadTokens-=n.cacheReadTokens??0,this._totalCacheCreationTokens-=n.cacheCreationTokens??0;let o=n.model,c=this._modelMap.get(o);c&&(c.count--,c.count<=0&&this._modelMap.delete(o));let m=n.targetProvider??n.provider,i=this._providerMap.get(m)??0;i<=1?this._providerMap.delete(m):this._providerMap.set(m,i-1)}this._totalInputTokens+=e.inputTokens??0,this._totalOutputTokens+=e.outputTokens??0,this._totalTokensPerSec+=e.tokensPerSec??0,this._totalCacheReadTokens+=e.cacheReadTokens??0,this._totalCacheCreationTokens+=e.cacheCreationTokens??0;let d=e.model,u=this._modelMap.get(d);u?(u.count++,e.timestamp>u.lastSeen&&(u.lastSeen=e.timestamp),u.actualModel=e.actualModel):this._modelMap.set(d,{actualModel:e.actualModel,count:1,lastSeen:e.timestamp});let a=e.targetProvider??e.provider;this._providerMap.set(a,(this._providerMap.get(a)??0)+1),this.buffer[r]=e,this.head++,this.count<this.maxSize&&this.count++;for(let o of this.subscribers)try{o(e)}catch{}}getSummary(){let e=this.getRecentRequests(),r=[...this._modelMap.entries()].map(([a,{actualModel:o,count:c,lastSeen:m}])=>({model:a,actualModel:o,count:c,lastSeen:m})).sort((a,o)=>o.count-a.count),n=[...this._providerMap.entries()].map(([a,o])=>({provider:a,count:o})).sort((a,o)=>o.count-a.count),d=0,u=0;for(let a of e){let o=(a.inputTokens??0)+(a.cacheReadTokens??0)+(a.cacheCreationTokens??0);o>0&&(a.cacheReadTokens??0)>0&&(d+=a.cacheReadTokens/o*100,u++)}return{totalRequests:this.count,totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,avgTokensPerSec:this.count>0?Math.round(this._totalTokensPerSec/this.count*10)/10:0,totalCacheReadTokens:this._totalCacheReadTokens,totalCacheCreationTokens:this._totalCacheCreationTokens,avgCacheHitRate:u>0?Math.round(d/u*10)/10:0,activeModels:r,providerDistribution:n,recentRequests:e,uptimeSeconds:Math.floor((Date.now()-this.createdAt)/1e3)}}onRecord(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}getRecentRequests(){if(this.count===0)return[];let e=Math.min(this.count,50),r=[];for(let n=0;n<e;n++){let d=((this.head-1-n)%this.maxSize+this.maxSize)%this.maxSize,u=this.buffer[d];u!==null&&r.push(u)}return r.reverse(),r}};import{spawn as Ve}from"child_process";import{existsSync as Qe,unlinkSync as Ye}from"fs";import{dirname as Ze,join as et}from"path";import{fileURLToPath as tt}from"url";async function be(t){let e=te();Qe(e)&&Ye(e),await ne(process.pid);let r=process.argv[1]||et(Ze(tt(import.meta.url)),"index.js");process.on("uncaughtException",f=>{console.error(`[monitor] Uncaught exception: ${f.message}`)}),process.on("unhandledRejection",f=>{console.error(`[monitor] Unhandled rejection: ${f}`)});let n=10,d=1e3,u=3e4,a=6e4,o=0,c=null,m=null,i=!1,s=!1,p=null;async function l(){let f=await import("net");if(await new Promise(M=>{let h=f.createServer();h.once("error",()=>M(!0)),h.once("listening",()=>{h.close(()=>M(!1))}),h.listen(t.port??3456)})){console.error(`[monitor] Port ${t.port??3456} already in use, skipping worker spawn`);return}let w=[r,"--daemon"];t.config&&w.push("--config",t.config),t.port&&w.push("--port",String(t.port)),t.verbose&&w.push("--verbose"),p=Ve(process.execPath,w,{detached:!0,stdio:"ignore",env:{...process.env}}),c&&clearTimeout(c),c=setTimeout(()=>{o>0&&console.error(`[monitor] Worker stable for ${a}ms, resetting restart counter`),o=0,c=null},a),p.on("exit",async M=>{p=null,c&&(clearTimeout(c),c=null),await re(),M===0&&!s&&(await B(),process.exit(0)),s=!1,i&&(console.error("[monitor] Worker exited during shutdown, monitor exiting"),await B(),process.exit(0));let h=o;h>=n&&(console.error(`[monitor] Max restart attempts exhausted (${n}), monitor exiting`),await B(),process.exit(1));let y=Math.min(d*2**h,u);o++,console.error(`[monitor] Worker died (code ${M}), restarting in ${y}ms (attempt ${o}/${n})`),m=setTimeout(l,y)})}process.on("SIGTERM",()=>{if(i=!0,m&&(clearTimeout(m),m=null),c&&(clearTimeout(c),c=null),p){try{p.kill("SIGTERM")}catch{}setTimeout(()=>{console.error("[monitor] Child did not exit within 5 s, forcing exit"),process.exit(0)},5e3)}else B().then(()=>process.exit(0))}),process.on("SIGINT",()=>{if(i=!0,m&&(clearTimeout(m),m=null),c&&(clearTimeout(c),c=null),p){try{p.kill("SIGTERM")}catch{}setTimeout(()=>{console.error("[monitor] Child did not exit within 5 s, forcing exit"),process.exit(0)},5e3)}else B().then(()=>process.exit(0))}),process.on("SIGHUP",()=>{if(console.log("[monitor] Received reload signal, restarting worker..."),s=!0,m&&(clearTimeout(m),m=null),p)try{p.kill("SIGTERM")}catch{}o=0}),l()}var rt=JSON.parse(nt(new URL("../package.json",import.meta.url),"utf-8")).version;function ot(t){let e={verbose:!1,help:!1,daemon:!1,monitor:!1,gui:!1};for(let r=2;r<t.length;r++)switch(t[r]){case"-p":case"--port":let n=t[++r];(!n||isNaN(parseInt(n,10)))&&(console.error("Error: -p/--port requires a number"),process.exit(1)),e.port=parseInt(n,10);break;case"-c":case"--config":let d=t[++r];d||(console.error("Error: -c/--config requires a path"),process.exit(1)),e.config=d;break;case"-v":case"--verbose":e.verbose=!0;break;case"-h":case"--help":e.help=!0;break;case"--daemon":e.daemon=!0;break;case"--monitor":e.monitor=!0;break}return e}function st(){console.log(`
10
10
  ModelWeaver \u2014 Multi-provider model orchestration proxy for Claude Code
11
11
 
12
12
  Usage: modelweaver [command] [options]
@@ -31,8 +31,8 @@ Options:
31
31
  Config locations (first found wins):
32
32
  ./modelweaver.yaml
33
33
  ~/.modelweaver/config.yaml
34
- `)}async function it(){let t=ot(process.argv);try{let a=await import("dotenv"),{existsSync:s}=await import("fs"),{join:p}=await import("path"),l=process.env.HOME||process.env.USERPROFILE||"",f=[p(process.cwd(),".env"),p(l,".modelweaver",".env"),p(l,".env")];for(let g of f)if(s(g)){a.config({path:g});break}}catch{}if(process.argv[2]==="init"){let a=process.argv.includes("--quick")||process.argv.includes("-q"),{runInit:s}=await import("./init-VLTKSOZN.js");await s({quick:a}),process.exit(0)}if(process.argv[2]==="start"){let{startDaemon:a}=await import("./daemon-27GXX25D.js"),s=await a(t.config,t.port,t.verbose);console.log(` ${s.message}`),console.log(` Log file: ${s.logPath}`),process.exit(s.success?0:1)}if(process.argv[2]==="stop"){let{stopDaemon:a}=await import("./daemon-27GXX25D.js"),s=await a();console.log(` ${s.message}`),process.exit(s.success?0:1)}if(process.argv[2]==="status"){let{statusDaemon:a}=await import("./daemon-27GXX25D.js"),s=await a();console.log(` ${s.message}`);try{let{getService:p}=await import("./service-6EQTZJEG.js"),f=(await p()).isInstalled();console.log(f?" Service: installed":' Service: not installed (run "modelweaver install" to enable auto-start)')}catch(p){console.log(` Service: ${p instanceof Error?p.message:String(p)}`)}process.exit(0)}if(process.argv[2]==="remove"){let{removeDaemon:a}=await import("./daemon-27GXX25D.js"),s=await a();console.log(` ${s.message}`),process.exit(s.success?0:1)}if(process.argv[2]==="install"){try{let{getService:a}=await import("./service-6EQTZJEG.js");await(await a()).install()}catch(a){console.error(` Error: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}process.exit(0)}if(process.argv[2]==="uninstall"){try{let{getService:a}=await import("./service-6EQTZJEG.js");(await a()).uninstall()}catch(a){console.error(` Error: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}process.exit(0)}if(process.argv[2]==="gui"){let{launchGui:a}=await import("./gui-launcher-ZVOVTD6C.js");await a(),process.exit(0)}if(process.argv[2]==="reload"){let{reloadDaemon:a}=await import("./daemon-27GXX25D.js");await a(t.port),process.exit(0)}t.help&&(st(),process.exit(0));let e,r;try{let a=await ee(t.config);e=a.config,r=a.configPath}catch(a){console.error(`Config error: ${a.message}`),process.exit(1)}let n=t.port||e.server.port,d=e.server.host,c=t.verbose?"debug":"info",i=new W;if(t.monitor){await be(t);return}if(t.daemon){let{removeWorkerPidFile:a,writeWorkerPidFile:s,createDebouncedReload:p,getLogPath:l}=await import("./daemon-27GXX25D.js"),{reloadConfig:f}=await import("./config-P34YQCFG.js"),{createWriteStream:g,watch:w}=await import("fs"),{createLogger:_}=await import("./logger-UA2A2DVX.js"),y=_(c);process.on("uncaughtException",M=>{y.error("Uncaught exception (daemon survived)",{error:M.message,stack:M.stack})}),process.on("unhandledRejection",M=>{y.error("Unhandled rejection (daemon survived)",{reason:String(M)})}),await s(process.pid);let h=g(l(),{flags:"a"});h.on("error",()=>{}),process.stdout.write=h.write.bind(h),process.stderr.write=h.write.bind(h);let b=Y(e,c,i),k=null;if(r){let M=p(async()=>{try{let A=await f(r);b.setConfig(A),N.prune([...A.providers.keys()]),y.info("Config reloaded",{path:r})}catch(A){y.error("Config reload failed \u2014 keeping old config",{error:A.message})}},300);try{k=w(r,()=>{M.reload()}),k.on("error",()=>{k&&(k.close(),k=null)})}catch{}}process.on("SIGUSR1",async()=>{try{let M=await f(r);b.setConfig(M),N.prune([...M.providers.keys()]),y.info("Config reloaded (SIGUSR1)",{path:r})}catch(M){y.error("Config reload failed (SIGUSR1)",{error:M.message})}});let R=ve({fetch:b.app.fetch,hostname:d,port:n});J(R,i);let C=async()=>{k&&(k.close(),k=null),await a(),h.end(),process.exit(0)};process.on("SIGTERM",C),process.on("SIGINT",C);return}let o=Y(e,c,i);console.log(`
34
+ `)}async function it(){let t=ot(process.argv);try{let i=await import("dotenv"),{existsSync:s}=await import("fs"),{join:p}=await import("path"),l=process.env.HOME||process.env.USERPROFILE||"",f=[p(process.cwd(),".env"),p(l,".modelweaver",".env"),p(l,".env")];for(let g of f)if(s(g)){i.config({path:g});break}}catch{}if(process.argv[2]==="init"){let i=process.argv.includes("--quick")||process.argv.includes("-q"),{runInit:s}=await import("./init-2GWQ546N.js");await s({quick:i}),process.exit(0)}if(process.argv[2]==="start"){let{startDaemon:i}=await import("./daemon-27GXX25D.js"),s=await i(t.config,t.port,t.verbose);console.log(` ${s.message}`),console.log(` Log file: ${s.logPath}`),process.exit(s.success?0:1)}if(process.argv[2]==="stop"){let{stopDaemon:i}=await import("./daemon-27GXX25D.js"),s=await i();console.log(` ${s.message}`),process.exit(s.success?0:1)}if(process.argv[2]==="status"){let{statusDaemon:i}=await import("./daemon-27GXX25D.js"),s=await i();console.log(` ${s.message}`);try{let{getService:p}=await import("./service-6EQTZJEG.js"),f=(await p()).isInstalled();console.log(f?" Service: installed":' Service: not installed (run "modelweaver install" to enable auto-start)')}catch(p){console.log(` Service: ${p instanceof Error?p.message:String(p)}`)}process.exit(0)}if(process.argv[2]==="remove"){let{removeDaemon:i}=await import("./daemon-27GXX25D.js"),s=await i();console.log(` ${s.message}`),process.exit(s.success?0:1)}if(process.argv[2]==="install"){try{let{getService:i}=await import("./service-6EQTZJEG.js");await(await i()).install()}catch(i){console.error(` Error: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}process.exit(0)}if(process.argv[2]==="uninstall"){try{let{getService:i}=await import("./service-6EQTZJEG.js");(await i()).uninstall()}catch(i){console.error(` Error: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}process.exit(0)}if(process.argv[2]==="gui"){let{launchGui:i}=await import("./gui-launcher-ZVOVTD6C.js");await i(),process.exit(0)}if(process.argv[2]==="reload"){let{reloadDaemon:i}=await import("./daemon-27GXX25D.js");await i(t.port),process.exit(0)}t.help&&(st(),process.exit(0));let e,r;try{let i=await ee(t.config);e=i.config,r=i.configPath}catch(i){console.error(`Config error: ${i.message}`),process.exit(1)}let n=t.port||e.server.port,d=e.server.host,u=t.verbose?"debug":"info",a=new W;if(t.monitor){await be(t);return}if(t.daemon){let{removeWorkerPidFile:i,writeWorkerPidFile:s,createDebouncedReload:p,getLogPath:l}=await import("./daemon-27GXX25D.js"),{reloadConfig:f}=await import("./config-P34YQCFG.js"),{createWriteStream:g,watch:w}=await import("fs"),{createLogger:M}=await import("./logger-UA2A2DVX.js"),h=M(u);process.on("uncaughtException",R=>{h.error("Uncaught exception (daemon survived)",{error:R.message,stack:R.stack})}),process.on("unhandledRejection",R=>{h.error("Unhandled rejection (daemon survived)",{reason:String(R)})}),await s(process.pid);let y=g(l(),{flags:"a"});y.on("error",()=>{}),process.stdout.write=y.write.bind(y),process.stderr.write=y.write.bind(y);let b=Y(e,u,a),k=null;if(r){let R=p(async()=>{try{let A=await f(r);b.setConfig(A),N.prune([...A.providers.keys()]),h.info("Config reloaded",{path:r})}catch(A){h.error("Config reload failed \u2014 keeping old config",{error:A.message})}},300);try{k=w(r,()=>{R.reload()}),k.on("error",()=>{k&&(k.close(),k=null)})}catch{}}process.on("SIGUSR1",async()=>{try{let R=await f(r);b.setConfig(R),N.prune([...R.providers.keys()]),h.info("Config reloaded (SIGUSR1)",{path:r})}catch(R){h.error("Config reload failed (SIGUSR1)",{error:R.message})}});let S=ve({fetch:b.app.fetch,hostname:d,port:n});S.on("error",R=>{R.code==="EADDRINUSE"&&(h.error(`Port ${n} already in use, exiting for monitor restart`,{port:n}),process.exit(1))}),S.listen(n,d),z(S,a);let C=async()=>{k&&(k.close(),k=null),await i(),y.end(),process.exit(0)};process.on("SIGTERM",C),process.on("SIGINT",C);return}let o=Y(e,u,a);console.log(`
35
35
  ModelWeaver v${rt}`),console.log(` Listening: http://${d}:${n}`),console.log(` Config: ${r}
36
- `),console.log(" Routes:");for(let[a,s]of e.routing){let p=s.map((l,f)=>`${l.provider}${f===0?" (primary)":" (fallback)"}`).join(", ");console.log(` ${a.padEnd(8)} \u2192 ${p}`)}if(console.log(),e.modelRouting.size>0){console.log(" Model Routes:");for(let[a,s]of e.modelRouting){let p=s.map((l,f)=>`${l.provider}${f===0?" (primary)":" (fallback)"}`).join(", ");console.log(` ${a.padEnd(20)} \u2192 ${p}`)}console.log()}let u=ve({fetch:o.app.fetch,hostname:d,port:n});J(u,i);let m=()=>{console.log(`
36
+ `),console.log(" Routes:");for(let[i,s]of e.routing){let p=s.map((l,f)=>`${l.provider}${f===0?" (primary)":" (fallback)"}`).join(", ");console.log(` ${i.padEnd(8)} \u2192 ${p}`)}if(console.log(),e.modelRouting.size>0){console.log(" Model Routes:");for(let[i,s]of e.modelRouting){let p=s.map((l,f)=>`${l.provider}${f===0?" (primary)":" (fallback)"}`).join(", ");console.log(` ${i.padEnd(20)} \u2192 ${p}`)}console.log()}let c=ve({fetch:o.app.fetch,hostname:d,port:n});c.on("error",i=>{i.code==="EADDRINUSE"&&(console.error(`Port ${n} already in use, exiting for monitor restart`),process.exit(1))}),c.listen(n,d),z(c,a);let m=()=>{console.log(`
37
37
  Shutting down...`),process.exit(0)};process.on("SIGTERM",m),process.on("SIGINT",m)}it();
38
38
  //# sourceMappingURL=index.js.map