omnigateway 0.15.2 → 0.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/bin/omni.js +1 -1
  2. package/gateway.js +1 -1
  3. package/package.json +1 -1
  4. package/public/assets/{Chip-C3dIFd8s.js → Chip-B2iXmJJC.js} +1 -1
  5. package/public/assets/CopyValue-CWSTp4v8.js +27 -0
  6. package/public/assets/{Field-EvdVyEqx.js → Field-CUEEy19T.js} +5 -28
  7. package/public/assets/{Rack-DMrfn4-H.js → Rack-1lijWt5h.js} +32 -32
  8. package/public/assets/RequestTable-uRTmuPwB.js +93 -0
  9. package/public/assets/Select-C0c13SKD.js +141 -0
  10. package/public/assets/{SummaryDeck-DHsYYpYO.js → SummaryDeck-DnQnRmQ8.js} +1 -1
  11. package/public/assets/Toggle-BvVa_jla.js +39 -0
  12. package/public/assets/{TokenBreakdown-Bf0zsKcd.js → TokenBreakdown-B8cSaOOr.js} +2 -2
  13. package/public/assets/_app.accounts-DmJhe6QV.js +70 -0
  14. package/public/assets/_app.console-DQlcBpSu.js +24 -0
  15. package/public/assets/{_app.database-BCwEMrEA.js → _app.database-DoDu8HOG.js} +1 -1
  16. package/public/assets/{_app.index-DW6wain4.js → _app.index-BEeD4XSS.js} +2 -2
  17. package/public/assets/_app.keys-MXvgkBUB.js +120 -0
  18. package/public/assets/{_app.logs-CRC5qDK3.js → _app.logs-CjUjeVHg.js} +3 -3
  19. package/public/assets/_app.models-mNIL-1oS.js +148 -0
  20. package/public/assets/{_app.plugins._pluginId-CD9KXknf.js → _app.plugins._pluginId-CsJXQg6X.js} +1 -1
  21. package/public/assets/_app.settings-CYMwWA8D.js +88 -0
  22. package/public/assets/{_app.usage-BR6a92zI.js → _app.usage-Dd33vB8x.js} +3 -3
  23. package/public/assets/chevron-right-ocqzquMZ.js +1 -0
  24. package/public/assets/client-KUNw8ZtZ.js +48 -0
  25. package/public/assets/{index-6rZSWe9j.js → index-B9izdV6t.js} +3 -3
  26. package/public/assets/{login-NuwPF5SS.js → login-DrbTJF6e.js} +1 -1
  27. package/public/assets/plus-D_lvSfDL.js +1 -0
  28. package/public/assets/{rotate-ccw-Dionx_MW.js → rotate-ccw-CwTftDdz.js} +1 -1
  29. package/public/assets/{trash-Bsi60qJc.js → trash-CmuxOGpN.js} +1 -1
  30. package/public/index.html +2 -2
  31. package/public/assets/CopyValue-DG88CWpN.js +0 -27
  32. package/public/assets/RequestTable-CtuuMOT2.js +0 -93
  33. package/public/assets/Toggle-BTie3NY8.js +0 -39
  34. package/public/assets/_app.accounts-xCJhRd32.js +0 -70
  35. package/public/assets/_app.console-DS37cfIu.js +0 -24
  36. package/public/assets/_app.keys-CCU2NB3-.js +0 -120
  37. package/public/assets/_app.models-B4brzRdK.js +0 -148
  38. package/public/assets/_app.settings-NJSb_L2B.js +0 -88
  39. package/public/assets/chevron-down-3tlYNJqZ.js +0 -1
  40. package/public/assets/chevron-right-kvaJRnfj.js +0 -1
  41. package/public/assets/client-B9t0CsmA.js +0 -46
  42. package/public/assets/dist-B8iuo_hI.js +0 -1
  43. package/public/assets/plus-CVqm87L-.js +0 -1
package/bin/omni.js CHANGED
@@ -1740,7 +1740,7 @@ ${j([{header:"CREDENTIAL"},{header:"MODEL"},{header:"REASON"}],s.excluded.map((d
1740
1740
 
1741
1741
  ${u}${c}`})}};var vv={fiveHour:0,daily:1,weekly:2},Dl={fiveHour:"5h",daily:"24h",weekly:"7d"};function Ul(e,t){return vv[e.windowType]-vv[t.windowType]}var Tv=(e,t)=>`${e}|${t}`,js=(e,t)=>e.get(Tv(t.credentialId,t.windowType));async function Ml(e,t,n){let r=await Wn(e),o=Wr(n,{now:t(),pollIntervalMs:r.quotaPollIntervalMs});return new Map(o.map((i)=>[Tv(i.credentialId,i.windowType),i]))}function $l(e,t,n){let r=sy(e,t);if(r!=="empty")return{kind:r};return{kind:r,inMs:(t?.exhaustsAt??n)-n}}function Rv(e){if(e.kind==="empty")return`~${io(e.inMs)}`;return e.kind==="ok"?"ok":""}var Jt="\u2014";function uN(e,t){let n=t?.ratePerHour??null;if(n===null)return Jt;return e.limit===null||e.limit<=0?`${n.toFixed(1)}/h`:`${(n/e.limit*100).toFixed(1)}%/h`}var Sv={usage:"quota",summary:"Show provider quota use, burn rate, and when each window runs out",async run(e,{ctx:t,writer:n}){let r=await t.store(),o=t.now(),{credentials:i}=await jr(r,{now:t.now}),s=i.flatMap((d)=>d.quota),a=await Ml(r,t.now,s),u=t.json?await al({store:r,now:t.now},{}):{samples:[],gatewayRates:[]},c={credentials:i.map((d)=>({id:d.id,provider:d.provider,label:d.label,windows:d.quota})),burn:[...a.values()],samples:u.samples,gatewayRates:u.gatewayRates};R(t,n,c,()=>{if(i.length===0)return"no credentials; add one with: omni connect <provider>";let d=i.flatMap((p)=>{let l=`${Ie(t,p.provider)}:${p.label}`,m=[...p.quota].sort(Ul);if(m.length===0){let g=S(t,"dim","unknown");return[[l,Jt,g,Jt,g,Jt]]}return m.map((g)=>{let h=$l(g,js(a,g),o),f=h.kind==="empty"?`empty ~${io(h.inMs)}`:h.kind==="ok"?"ok":S(t,"dim",h.kind);return[l,Dl[g.windowType],`${g.used}/${g.limit??Jt}`,uN(g,js(a,g)),f,g.resetsAt===null?Jt:io(g.resetsAt-o)]})});return j([{header:"ACCOUNT"},{header:"WINDOW"},{header:"USED",align:"right"},{header:"RATE",align:"right"},{header:"ESTIMATE"},{header:"RESETS",align:"right"}],d)})}},cN={refreshed:"refreshed",coalesced:"refreshed by a concurrent probe",noData:"provider reported nothing",cooldown:"cooling down after a rate limit",unsupported:"no usage endpoint",disabled:"disabled",failed:"failed"};function dN(e){return e.kind==="failed"||e.kind==="cooldown"}var xv={usage:"quota refresh <id> | --all",summary:"Read provider quota now, for one account or for every account",options:{all:{type:"boolean"}},async run(e,{ctx:t,writer:n}){let r=e.values.all===!0,o=e.positionals[0];if(r===(o!==void 0))throw new I("give an account id or --all, not both");let i=await t.store(),s=await Qe(i),a=o===void 0?s:s.filter((l)=>l.id===o),u=await Fl(t,a);X(t,n,o===void 0?"refreshing every account\u2026":`refreshing ${o}\u2026`);let c=await u.refresh(o===void 0?{kind:"all"}:{kind:"one",credentialId:o}),d=new Map(s.map((l)=>[l.id,l.label]));R(t,n,c,()=>{let l=c.outcomes.map((f)=>[`${d.get(f.credentialId)??f.credentialId}`,cN[f.kind],f.kind==="refreshed"||f.kind==="coalesced"?`${f.windows} window${f.windows===1?"":"s"}`:f.kind==="failed"?f.code:Jt]),m=c.outcomes.filter((f)=>f.kind==="refreshed"||f.kind==="coalesced").length,g=c.outcomes.filter((f)=>f.kind==="failed").length,h=c.outcomes.length-m-g;return[j([{header:"ACCOUNT"},{header:"OUTCOME"},{header:"DETAIL",align:"right"}],l),"",`refreshed ${m}; failed ${g}; skipped ${h}`].join(`
1742
1742
  `)});let p=c.outcomes.filter(dN);if(p.length>0)throw new O(p.length===c.outcomes.length?"quota refresh did not run":`quota refresh did not run for ${p.length} of ${c.outcomes.length} accounts`)}};async function Fl(e,t){let n=await e.store(),r=t.every((i)=>Object.hasOwn(M,i.provider))?bt:(await jn(e.root.root)).providers,o=Dn();return fl({store:n,coord:Mt({now:e.now}),providers:r,http:o,refresh:Qr({store:n,providers:r,http:o,now:e.now}),now:e.now})}var Av={usage:"quota resets <id>",summary:"List an account's banked quota resets (Codex, Claude)",async run(e,{ctx:t,writer:n}){let r=U(e,0,"credential id"),o=(await Qe(await t.store())).filter((s)=>s.id===r),i=await(await Fl(t,o)).resetCredits(r);R(t,n,i,()=>[j([{header:"CREDIT"},{header:"STATUS"},{header:"TITLE"},{header:"EXPIRES"}],i.credits.map((s)=>[s.id,s.status,s.title??Jt,oe(s.expiresAt)])),"",`${i.available} available`].join(`
1743
- `))}},Ov={usage:"quota reset <id> [--credit CREDIT_ID]",summary:"Spend one banked quota reset on an account (irreversible)",options:{credit:{type:"string"}},async run(e,{ctx:t,writer:n,prompt:r}){let o=U(e,0,"credential id"),i=A(e.values,"credit"),s=(await Qe(await t.store())).filter((p)=>p.id===o),a=s[0]?.label??o,u=await Fl(t,s),c=s[0]?.provider;if(c===void 0)throw new O("no such credential");if(!u.hasResets(c))throw new O("this account's provider has no quota resets");if(!await r.confirm(`spend one banked quota reset on "${a}" (${o})?`))throw new O("cancelled");let d=await u.redeemReset({credentialId:o,...i===void 0?{}:{creditId:i}});R(t,n,d,()=>`${a}: reset ${d.creditId} redeemed`+(d.windowsReset===null?"":`, ${d.windowsReset} window(s) reset`)+(d.quotaRefreshed?"; quota re-read":"; quota re-read failed, next poll will update it"))}};import{existsSync as kn}from"fs";import{closeSync as lN,existsSync as pN,openSync as mN}from"fs";import{join as Bl}from"path";var fN=async(e)=>{let t=Bun.spawn([...e],{stdout:"pipe",stderr:"pipe"}),[n,r,o]=await Promise.all([new Response(t.stdout).text(),new Response(t.stderr).text(),t.exited]);return{code:o,stdout:n,stderr:r}},gN=({argv:e,cwd:t,env:n,logFile:r})=>{let o=mN(r,"a");try{let i=Bun.spawn([...e],{cwd:t,env:n,stdin:"ignore",stdout:o,stderr:o});return i.unref(),i.pid}finally{lN(o)}};async function Cv(e){return Bun.spawn([...e.argv],{cwd:e.cwd,env:e.env,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}var hN=1000;async function yN(e){try{return(await fetch(new URL("/health",e),{signal:AbortSignal.timeout(hN)})).ok}catch{return!1}}function _N(e){try{return process.kill(e,0),!0}catch{return!1}}function Ks(e,t=import.meta.dir){return[Bl(e,"apps","gateway","src","index.ts"),Bl(t,"..","gateway.js"),Bl(t,"gateway.js")].find((r)=>pN(r))??null}function Pv(e){let t=e.env.OMNI_LOG_FILE?.trim();return{root:e.root,stateDir:SE(e.env),scope:e.scope,unitPath:RE(e.scope),...t===void 0||t.length===0?{}:{logFile:t},run:fN,spawn:gN,probe:yN,alive:_N,kill:(n,r)=>{process.kill(n,r)},sleep:(n)=>Bun.sleep(n),now:e.now}}var oo="0.15.2";function zl(e){let t=Ks(e);if(t===null)throw new O(`no gateway to run: ${e} is not an OmniGateway checkout, and no bundled server was found beside this CLI`);return[process.execPath,t]}var Iv={usage:"start [--foreground]",summary:"Start the gateway and wait until it is serving",options:{system:{type:"boolean"},foreground:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r,foreground:o}){let i=r(),s=t.config().baseUrl;if(L(e.values,"foreground")){let u=await o({argv:zl(i.root),cwd:i.root,env:t.env});if(u!==0)throw new O(`gateway exited with code ${u}`,3);return}X(t,n,`starting gateway at ${s}\u2026`);let a=await xl(i,{argv:zl(i.root),env:t.env,baseUrl:s});if(R(t,n,a,()=>{let u=a.supervisor==="systemd"?"systemd":`pid ${a.pid}`;if(!a.healthy){let c=a.supervisor==="systemd"?"journalctl -u omnigateway.service":Gn(i);return`${Z(t,!1,"started but /health never answered")} (${u}); see ${c}`}return`${Z(t,!0,"running")} (${u}) at ${s}`}),!a.healthy)throw new O("gateway did not become healthy",3)}},Lv={usage:"stop",summary:"Stop the gateway",async run(e,{ctx:t,writer:n,service:r}){let o=await Al(r());R(t,n,o,()=>o.stopped?"stopped":"nothing to stop: the gateway is not running")}},Nv={usage:"restart",summary:"Stop the gateway, then start it again",async run(e,{ctx:t,writer:n,service:r}){let o=r();await Al(o);let i=await xl(o,{argv:zl(o.root),env:t.env,baseUrl:t.config().baseUrl});if(R(t,n,i,()=>i.healthy?"restarted":Z(t,!1,"restarted but /health never answered")),!i.healthy)throw new O("gateway did not become healthy",3)}},Dv={usage:"service install [--system] [--enable] [--force]",summary:"Write a systemd unit for this installation",options:{system:{type:"boolean"},enable:{type:"boolean"},force:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r}){let o=r(),i=Ks(o.root);if(i===null)throw new O(`no gateway to run for ${o.root}`);let s=await xE(o,{bun:process.execPath,entrypoint:i,enable:L(e.values,"enable"),force:L(e.values,"force")});R(t,n,s,()=>q([["unit",s.path],["scope",o.scope],["daemon-reload",s.reloaded?"ok":"failed"],["enabled at boot",s.enabled?"yes":"no"]]))}},Uv={usage:"service uninstall [--system]",summary:"Disable and remove the systemd unit",options:{system:{type:"boolean"}},async run(e,{ctx:t,writer:n,prompt:r,service:o}){let i=o();if(!await r.confirm(`remove the ${i.scope} systemd unit for ${i.root}?`))throw new O("cancelled");let s=await AE(i);R(t,n,s,()=>s.removed?`removed ${s.path}`:`no unit at ${s.path}`)}};async function wN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{let t=await(await e.store()).usage.auditRollup();return t.ok?`ok (${t.buckets} hourly buckets)`:`${t.mismatched} of ${t.buckets} hourly buckets disagree with request_logs`}catch{return null}}async function bN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{return await Yd(to(),e.root.root,await e.store())}catch{return null}}async function kN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{let t=await e.store(),n=await t.credentials.list();return(await t.config.listModels()).flatMap((r)=>r.targets.filter((o)=>o.credentialId!==void 0&&Pn(o,n)===void 0).map((o)=>`${r.id}/${o.model} \u2192 ${o.credentialId}`))}catch{return null}}async function EN(e,t){if(e.configError!==null||!kn(e.databasePath))return null;try{return(await(await e.store()).config.listModels()).flatMap((r)=>r.targets.filter((o)=>!El(o.provider,t)).map((o)=>`${r.id}/${o.model} \u2192 ${o.provider}`))}catch{return null}}async function vN(e,t){if(e.configError!==null||!kn(e.databasePath))return null;try{return(await(await e.store()).credentials.list()).filter((r)=>!El(r.provider,t)).map((r)=>`${r.label} \u2192 ${r.provider}`)}catch{return null}}async function TN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{return await Sd(await e.store(),M)}catch{return null}}function RN(e,t,n){if(t===null)return S(e,"dim","not checked");let{keysWithPolicy:r,model:o,problem:i}=t;if(r===0)return S(e,"dim","no key carries one");let s=`${r} key${r===1?"":"s"}`;if(i==="unconfigured")return S(e,"yellow",`${s} carry a policy and no classifier is set (guardrailModel); their requests are refused`);if(i==="unresolved")return n.length>0?S(e,"yellow",`${s} carry a policy; classifier "${o}" is not a built-in model (plugin providers not checked)`):S(e,"yellow",`${s} carry a policy and classifier "${o}" does not resolve; their requests are refused`);return Z(e,!0,`${s}, judged by ${o}`)}var Mv={usage:"doctor",summary:"Check what this CLI resolved, and whether it can do anything with it",options:{system:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r}){let o=r(),i=t.env.OMNI_ENCRYPTION_KEY,s=wn(o),a=await bn(o),u=await wN(t),c=Gt(to(),o.root),d=await bN(t),p=await kN(t),l=await EN(t,c),m=await vN(t,c),g=await TN(t),h={version:oo,root:o.root,rootSource:t.root.source,envFile:t.root.envFile,databasePath:t.databasePath,databaseExists:kn(t.databasePath),encryptionKey:typeof i==="string"?`present (${i.length} chars)`:"missing",configError:t.configError,gatewayEntrypoint:Ks(o.root),usageRollup:u,unitInstalled:s,supervisor:a.supervisor,running:a.running,consoleSource:no(o).source,pluginsDir:Ce(o.root),plugins:c,orphanPluginTables:d,danglingPins:p,missingProviders:l,danglingCredentials:m,guardrail:g,warnings:t.warnings};R(t,n,h,()=>{let f=(y,_)=>Z(t,y,_);return`omni ${oo}
1743
+ `))}},Ov={usage:"quota reset <id> [--credit CREDIT_ID]",summary:"Spend one banked quota reset on an account (irreversible)",options:{credit:{type:"string"}},async run(e,{ctx:t,writer:n,prompt:r}){let o=U(e,0,"credential id"),i=A(e.values,"credit"),s=(await Qe(await t.store())).filter((p)=>p.id===o),a=s[0]?.label??o,u=await Fl(t,s),c=s[0]?.provider;if(c===void 0)throw new O("no such credential");if(!u.hasResets(c))throw new O("this account's provider has no quota resets");if(!await r.confirm(`spend one banked quota reset on "${a}" (${o})?`))throw new O("cancelled");let d=await u.redeemReset({credentialId:o,...i===void 0?{}:{creditId:i}});R(t,n,d,()=>`${a}: reset ${d.creditId} redeemed`+(d.windowsReset===null?"":`, ${d.windowsReset} window(s) reset`)+(d.quotaRefreshed?"; quota re-read":"; quota re-read failed, next poll will update it"))}};import{existsSync as kn}from"fs";import{closeSync as lN,existsSync as pN,openSync as mN}from"fs";import{join as Bl}from"path";var fN=async(e)=>{let t=Bun.spawn([...e],{stdout:"pipe",stderr:"pipe"}),[n,r,o]=await Promise.all([new Response(t.stdout).text(),new Response(t.stderr).text(),t.exited]);return{code:o,stdout:n,stderr:r}},gN=({argv:e,cwd:t,env:n,logFile:r})=>{let o=mN(r,"a");try{let i=Bun.spawn([...e],{cwd:t,env:n,stdin:"ignore",stdout:o,stderr:o});return i.unref(),i.pid}finally{lN(o)}};async function Cv(e){return Bun.spawn([...e.argv],{cwd:e.cwd,env:e.env,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}var hN=1000;async function yN(e){try{return(await fetch(new URL("/health",e),{signal:AbortSignal.timeout(hN)})).ok}catch{return!1}}function _N(e){try{return process.kill(e,0),!0}catch{return!1}}function Ks(e,t=import.meta.dir){return[Bl(e,"apps","gateway","src","index.ts"),Bl(t,"..","gateway.js"),Bl(t,"gateway.js")].find((r)=>pN(r))??null}function Pv(e){let t=e.env.OMNI_LOG_FILE?.trim();return{root:e.root,stateDir:SE(e.env),scope:e.scope,unitPath:RE(e.scope),...t===void 0||t.length===0?{}:{logFile:t},run:fN,spawn:gN,probe:yN,alive:_N,kill:(n,r)=>{process.kill(n,r)},sleep:(n)=>Bun.sleep(n),now:e.now}}var oo="0.15.3";function zl(e){let t=Ks(e);if(t===null)throw new O(`no gateway to run: ${e} is not an OmniGateway checkout, and no bundled server was found beside this CLI`);return[process.execPath,t]}var Iv={usage:"start [--foreground]",summary:"Start the gateway and wait until it is serving",options:{system:{type:"boolean"},foreground:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r,foreground:o}){let i=r(),s=t.config().baseUrl;if(L(e.values,"foreground")){let u=await o({argv:zl(i.root),cwd:i.root,env:t.env});if(u!==0)throw new O(`gateway exited with code ${u}`,3);return}X(t,n,`starting gateway at ${s}\u2026`);let a=await xl(i,{argv:zl(i.root),env:t.env,baseUrl:s});if(R(t,n,a,()=>{let u=a.supervisor==="systemd"?"systemd":`pid ${a.pid}`;if(!a.healthy){let c=a.supervisor==="systemd"?"journalctl -u omnigateway.service":Gn(i);return`${Z(t,!1,"started but /health never answered")} (${u}); see ${c}`}return`${Z(t,!0,"running")} (${u}) at ${s}`}),!a.healthy)throw new O("gateway did not become healthy",3)}},Lv={usage:"stop",summary:"Stop the gateway",async run(e,{ctx:t,writer:n,service:r}){let o=await Al(r());R(t,n,o,()=>o.stopped?"stopped":"nothing to stop: the gateway is not running")}},Nv={usage:"restart",summary:"Stop the gateway, then start it again",async run(e,{ctx:t,writer:n,service:r}){let o=r();await Al(o);let i=await xl(o,{argv:zl(o.root),env:t.env,baseUrl:t.config().baseUrl});if(R(t,n,i,()=>i.healthy?"restarted":Z(t,!1,"restarted but /health never answered")),!i.healthy)throw new O("gateway did not become healthy",3)}},Dv={usage:"service install [--system] [--enable] [--force]",summary:"Write a systemd unit for this installation",options:{system:{type:"boolean"},enable:{type:"boolean"},force:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r}){let o=r(),i=Ks(o.root);if(i===null)throw new O(`no gateway to run for ${o.root}`);let s=await xE(o,{bun:process.execPath,entrypoint:i,enable:L(e.values,"enable"),force:L(e.values,"force")});R(t,n,s,()=>q([["unit",s.path],["scope",o.scope],["daemon-reload",s.reloaded?"ok":"failed"],["enabled at boot",s.enabled?"yes":"no"]]))}},Uv={usage:"service uninstall [--system]",summary:"Disable and remove the systemd unit",options:{system:{type:"boolean"}},async run(e,{ctx:t,writer:n,prompt:r,service:o}){let i=o();if(!await r.confirm(`remove the ${i.scope} systemd unit for ${i.root}?`))throw new O("cancelled");let s=await AE(i);R(t,n,s,()=>s.removed?`removed ${s.path}`:`no unit at ${s.path}`)}};async function wN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{let t=await(await e.store()).usage.auditRollup();return t.ok?`ok (${t.buckets} hourly buckets)`:`${t.mismatched} of ${t.buckets} hourly buckets disagree with request_logs`}catch{return null}}async function bN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{return await Yd(to(),e.root.root,await e.store())}catch{return null}}async function kN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{let t=await e.store(),n=await t.credentials.list();return(await t.config.listModels()).flatMap((r)=>r.targets.filter((o)=>o.credentialId!==void 0&&Pn(o,n)===void 0).map((o)=>`${r.id}/${o.model} \u2192 ${o.credentialId}`))}catch{return null}}async function EN(e,t){if(e.configError!==null||!kn(e.databasePath))return null;try{return(await(await e.store()).config.listModels()).flatMap((r)=>r.targets.filter((o)=>!El(o.provider,t)).map((o)=>`${r.id}/${o.model} \u2192 ${o.provider}`))}catch{return null}}async function vN(e,t){if(e.configError!==null||!kn(e.databasePath))return null;try{return(await(await e.store()).credentials.list()).filter((r)=>!El(r.provider,t)).map((r)=>`${r.label} \u2192 ${r.provider}`)}catch{return null}}async function TN(e){if(e.configError!==null||!kn(e.databasePath))return null;try{return await Sd(await e.store(),M)}catch{return null}}function RN(e,t,n){if(t===null)return S(e,"dim","not checked");let{keysWithPolicy:r,model:o,problem:i}=t;if(r===0)return S(e,"dim","no key carries one");let s=`${r} key${r===1?"":"s"}`;if(i==="unconfigured")return S(e,"yellow",`${s} carry a policy and no classifier is set (guardrailModel); their requests are refused`);if(i==="unresolved")return n.length>0?S(e,"yellow",`${s} carry a policy; classifier "${o}" is not a built-in model (plugin providers not checked)`):S(e,"yellow",`${s} carry a policy and classifier "${o}" does not resolve; their requests are refused`);return Z(e,!0,`${s}, judged by ${o}`)}var Mv={usage:"doctor",summary:"Check what this CLI resolved, and whether it can do anything with it",options:{system:{type:"boolean"}},async run(e,{ctx:t,writer:n,service:r}){let o=r(),i=t.env.OMNI_ENCRYPTION_KEY,s=wn(o),a=await bn(o),u=await wN(t),c=Gt(to(),o.root),d=await bN(t),p=await kN(t),l=await EN(t,c),m=await vN(t,c),g=await TN(t),h={version:oo,root:o.root,rootSource:t.root.source,envFile:t.root.envFile,databasePath:t.databasePath,databaseExists:kn(t.databasePath),encryptionKey:typeof i==="string"?`present (${i.length} chars)`:"missing",configError:t.configError,gatewayEntrypoint:Ks(o.root),usageRollup:u,unitInstalled:s,supervisor:a.supervisor,running:a.running,consoleSource:no(o).source,pluginsDir:Ce(o.root),plugins:c,orphanPluginTables:d,danglingPins:p,missingProviders:l,danglingCredentials:m,guardrail:g,warnings:t.warnings};R(t,n,h,()=>{let f=(y,_)=>Z(t,y,_);return`omni ${oo}
1744
1744
  ${q([["root",`${h.root} ${S(t,"dim",`(from ${h.rootSource})`)}`],["env file",h.envFile??S(t,"dim","none")],["database",`${h.databasePath} ${f(h.databaseExists,h.databaseExists?"exists":"missing")}`],["encryption key",h.encryptionKey],["config",h.configError===null?f(!0,"ok"):f(!1,h.configError)],["entrypoint",h.gatewayEntrypoint??f(!1,"not found")],["usage rollup",h.usageRollup===null?S(t,"dim","not checked"):f(h.usageRollup.startsWith("ok"),h.usageRollup)],["systemd unit",s?o.scope:S(t,"dim","none")],["gateway",f(a.running,a.running?"running":"stopped")],["console log",Ws(h.consoleSource)],...c.length===0?[["plugins",S(t,"dim","none")]]:hE(t,c).map((y,_)=>[_===0?"plugins":"",y]),["orphan plugin tables",d===null?S(t,"dim","not checked"):d.length===0?f(!0,"none"):S(t,"yellow",`${d.length}: ${d.join(", ")}`)],["dangling pins",p===null?S(t,"dim","not checked"):p.length===0?f(!0,"none"):S(t,"yellow",`${p.length}: ${p.join(", ")}`)],["missing providers",l===null?S(t,"dim","not checked"):l.length===0?f(!0,"none"):S(t,"yellow",`${l.length}: ${l.join(", ")}`)],["stranded credentials",m===null?S(t,"dim","not checked"):m.length===0?f(!0,"none"):S(t,"yellow",`${m.length}: ${m.join(", ")}`)],["usage policies",RN(t,g,c)],...h.warnings.map((y)=>["ignored",S(t,"yellow",y)])])}`})}};function SN(e){let t=[];for(let[n,r]of Object.entries(e)){if(r!==null&&typeof r==="object"){for(let[o,i]of Object.entries(r))t.push([`${n}.${o}`,String(i)]);continue}t.push([n,String(r)])}return t}var $v={usage:"settings get",summary:"Show routing and retention settings",async run(e,{ctx:t,writer:n}){let r=await Wn(await t.store());R(t,n,{settings:r},()=>q(SN(r)))}};function Gs(e,t){return Object.hasOwn(e,t)}function xN(e,t,n){if(!Gs(e,t))return;let r=e[t];if(n===void 0)return r;if(r===null||typeof r!=="object")return;if(!Gs(r,n))return;return r[n]}function AN(e,t){let n=t.trim().length===0?Number.NaN:Number(t);if(!Number.isFinite(n))throw new I(`${e} must be a number, got "${t}"`);return n}function ON(e,t){let n=t.trim().toLowerCase();if(n==="true")return!0;if(n==="false")return!1;throw new I(`${e} must be true or false, got "${t}"`)}function Fv(e,t){let n=t.trim();if(n.length===0)throw new I(`${e} must not be blank`);return n}function CN(e,t){return t.trim()==="null"?null:Fv(e,t)}function PN(e){return Gs(ye,e)&&ye[e]===null}var Bv={usage:"settings set <path> <value>",summary:"Change one setting, e.g. weights.cost 0.4, rtkEnabled true, or guardrailModel null",async run(e,{ctx:t,writer:n}){let r=U(e,0,"setting path"),o=U(e,1,"value"),i=await t.store(),s=await Wn(i),[a,u]=r.split(".");if(a===void 0||!Gs(s,a))throw new I(`no setting "${r}"`);if(u!==void 0&&a!=="weights")throw new I(`"${a}" has no sub-settings`);let c=xN(s,a,u),d=u===void 0&&PN(a)?CN(r,o):typeof c==="boolean"?ON(r,o):typeof c==="string"?Fv(r,o):AN(r,o),p=u===void 0?{...s,[a]:d}:{...s,weights:{...s.weights,[u]:d}},l=await gl(i,p);R(t,n,{settings:l},()=>`${r} = ${d}`)}};import{join as ql}from"path";var zv={dir:{type:"string"},key:{type:"string"},"dry-run":{type:"boolean"}};async function qv(e,t){let{descriptors:n,failures:r}=await Xt(e.root.root);for(let i of r)X(e,t,S(e,"yellow",`plugin ${i.id}: ${i.reason}`));let o=await yl(await e.store(),n);if(o.length===0)throw new O("no virtual models configured; add one with `omni models put`");return{models:o,failures:r}}function Hv(e){if(e.configError!==null)throw new O(e.configError);return e.config().baseUrl}function Wv(e,t,n,r,o,i,s=[]){if(!r)for(let a of n)i(a.path,a.contents);if(R(e,t,{files:n,pluginFailures:s},()=>r?n.map((a)=>`--- ${a.path}
1745
1745
  ${a.contents}`).join(`
1746
1746
  `):n.map((a)=>a.path).join(`
package/gateway.js CHANGED
@@ -2233,7 +2233,7 @@ ${t.data}`;return}function hte(e){switch(e.type){case"text":return{type:"text",t
2233
2233
  data: ${m}`),l.enqueue(s.encode(`event: ${f}
2234
2234
  data: ${m}
2235
2235
 
2236
- `))}catch(p){l.error(p),await c(!1,p)}},async cancel(){await e.return(void 0),await r.return(void 0),await c(!0)}});return new Response(d,{headers:{...nne,...o}})}async function sne(e,t){if(e.bodyLoggingAllowed!==!0)return null;if(t.bodyLoggingOptOut)return null;let{settings:n}=await e.snapshots.get(e.now());if(!n.bodyLoggingEnabled)return null;return e1({captureStreamChunks:n.bodyLoggingCaptureStreamChunks})}async function Gk(e,t,n,r){let o=e.requestId(),i=e.now(),s=e.telemetry?.startRequest(o,i,r.headers.get("traceparent"),n,e.rand())??null,a=null,c="",u=null,d=null,l,p=null,f=!1,m=null,g=!1,h={},y=()=>rne(n,m===null?h:one(h),i),b=(E,x,_)=>{t.debit(E,x,_)};try{let E;try{E=await eh(e.store,th(r.headers),i,e.logger)}catch(K){if(K instanceof T&&K.code==="AUTH")e.logger.warn("authentication rejected",{requestId:o,surface:n,reason:"invalid credentials"});throw K}a=E.id;let x=await sne(e,E);if(d=x,x!==null)l=async(K)=>{if(await x.settle(),p?.truncated===!0)x.client.truncated=!0;await e.store.bodies.put({schemaVersion:gp,requestId:o,at:i,client:x.client,attempts:x.attempts(),error:K.errorCode===null?null:{code:K.errorCode,status:K.status}})};let _=await r.json();if(x!==null)x.client.request=_;let w=n==="anthropic"?zk(_,r.headers):n==="responses"?_U(_,r.headers):hU(_,r.headers),S=()=>({requestId:o,created:Math.floor(e.now()/1000),customToolNames:bU(_)});if(E.modelAllowlist!==null&&!E.modelAllowlist.includes(w.model))throw new T("AUTH",`model "${ke(w.model)}" is not allowed for this API key`);c=w.model;try{let K=await t.admit(E.id,E.limits,c,o);m=K.release,h=K.headroom}catch(K){if(K instanceof Gg)h=K.headroom;if(K instanceof T&&K.code==="RATE_LIMIT")e.logger.warn("rate limit rejected",{requestId:o,surface:n,apiKeyId:E.id,model:c,code:K.code,retryAfterMs:K.retryAfterMs});throw K}let I=!1,F=()=>sh(w,{...e,...x===null?{}:{http:x.wrap(e.http)},trace:s,async onRoute(K){if(I){await ih(e.store,o,K,e.logger,e.broadcaster);return}I=!0;let Z=rh({id:o,at:i,requestedModel:c,resolvedProvider:K.provider,resolvedModel:K.model,credentialId:K.credentialId});await oh(e.store,Z,a,e.logger,e.broadcaster)}},r.signal,o),N=E.guardrailPolicy,v=N===null?await F():nU({judge:()=>tU({...e,cache:e.guardrailCache},{apiKeyId:E.id,policy:N,request:w,signal:r.signal,debit:(K,Z,ce)=>{t.recordOverride(K,E.limits,Z),b(K,Z,ce)},parentRequestId:o}),dispatch:F,signal:r.signal,requestId:o,startedAt:i,requestedModel:c,now:e.now,logger:e.logger,surface:n});u=v;let H=async(K=!1,Z)=>{let ce=v.log(),Se=K||r.signal.aborted;if(x!==null&&Se)x.client.truncated=!0;if(Se&&ce.status===0)ce.status=499,ce.errorCode="interrupted",ce.durationMs=e.now()-i;else if(!Se&&Z!==void 0){let V=Ol(Z);if(ce.status===0)ce.status=Ot[V.code],ce.errorCode=V.code,ce.durationMs=e.now()-i;ja(e.logger,o,ce,V,n)}f=!0,await vl(e.store,ce,a,e.logger,l,b,e.emit,e.broadcaster,e.telemetry,s)};if(w.stream){let K=n==="anthropic"?_M(v.events,o):n==="responses"?CM(v.events,S()):TM(v.events,o,Math.floor(e.now()/1000)),Z;if(x!==null){let V=JM();p=V,x.client.response=V.frames,Z=V.write}let Se=ine(K,async(V=!1,re)=>{m?.(),await H(V,re)},ene(n,e.keepaliveMs),v.events,y(),Z);return g=!0,Se}let R=[];for await(let K of v.events)R.push(K);let P=R.find((K)=>K.type==="error"),L=P!==void 0?Wk(n,P.code,P.message):n==="anthropic"?wM(tc(R),o):n==="responses"?OM(tc(R),S()):SM(tc(R),o,Math.floor(e.now()/1000));if(x!==null)x.client.response=L;return await H(),Vk(L,P===void 0?200:Ot[P.code],y())}catch(E){let x=Ol(E),_=r.signal.aborted&&E===r.signal.reason,w=u?.log()??Ba(o,i,{requestedModel:c,status:0});w.status=_?499:Ot[x.code],w.errorCode=_?"interrupted":x.code,w.durationMs=e.now()-i;let S=Wk(n,x.code,x.message);if(d!==null&&_)d.client.truncated=!0;if(d!==null&&!f)d.client.response=S;if(!f)await vl(e.store,w,a,e.logger,l,b,e.emit,e.broadcaster,e.telemetry,s);if(!_)ja(e.logger,o,w,x,n);return Vk(S,Ot[x.code],{...y(),...kU(x)})}finally{if(!g)m?.()}}function EU(e){let t=e.logger??ee,n=e.coord??nn(),r=e.rateLimiter??new El({store:e.store,now:e.now,logger:t,coord:n}),o={...e,logger:t,coord:n,snapshots:e.snapshots??Vg(e.store,t),loadRegistry:e.loadRegistry??Wg(n),keepaliveMs:e.keepaliveMs??Yte,guardrailCache:new Fk};return new Vt().post("/v1/messages",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"anthropic",i))).post("/v1/responses",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"responses",i))).post("/v1/chat/completions",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"openai",i))).get("/v1/models",async({request:i})=>{try{let s=await eh(e.store,th(i.headers),e.now(),t),a=await o.snapshots.get(e.now()),c=[...a.models.values()],u=s.modelAllowlist===null?c:c.filter((d)=>s.modelAllowlist?.includes(d.id));return Response.json(wU(u,a.credentials))}catch(s){let a=Ol(s);return t.error("model listing failed",{status:Ot[a.code],code:a.code,reason:a.message}),Kk("anthropic",a.code,a.message)}}).post("/v1/messages/count_tokens",async({request:i})=>{try{let s=await eh(e.store,th(i.headers),e.now(),t),a=await i.json(),c=zk(a,i.headers);if(s.modelAllowlist!==null&&!s.modelAllowlist.includes(c.model))throw new T("AUTH",`model "${ke(c.model)}" is not allowed for this API key`);await r.consume(s.id,s.limits,c.model,e.requestId());let{settings:u}=await o.snapshots.get(e.now()),d=Jg(c,{mode:u.ponytailMode}).request;return Response.json({input_tokens:$s(d)})}catch(s){let a=Ol(s);return t.warn("token count failed",{status:Ot[a.code],code:a.code,reason:a.message}),Kk("anthropic",a.code,a.message,kU(a))}}).onError(({error:i})=>{let s=Ol(i);return t.error("unhandled proxy route error",{status:Ot[s.code],code:s.code,reason:s.message}),Kk("anthropic",s.code,s.message)})}var ane=(e,t)=>{let n=setTimeout(e,t);return()=>clearTimeout(n)};function Pl(e){let t=e.now??Date.now,n=e.schedule??ane,r=new Map,o=new Map,i=(c)=>e.floors[c]??e.defaultFloorMs,s=(c,u)=>{r.set(c,t()),e.sink(c,u)},a=(c)=>{let u=o.get(c);if(u===void 0)return;o.delete(c),s(c,u.payload)};return{emit(c,u){let d=i(c),l=r.get(c),p=l===void 0?Number.POSITIVE_INFINITY:t()-l,f=o.get(c);if(f!==void 0){f.payload=u;return}if(p>=d){s(c,u);return}let m=n(()=>a(c),d-p);o.set(c,{payload:u,cancel:m})},flush(){for(let[c,u]of[...o])u.cancel(),o.delete(c),s(c,u.payload)},stop(){for(let c of o.values())c.cancel();o.clear(),r.clear()}}}var cne={"res:usage":1000,"res:logs":1000,"res:quota":5000,"res:credentials":5000},une=1000,_u="res:*",uh="broadcast",dne="coord:reconnected";function dh(e){let t=e.floors??cne,n=e.defaultFloorMs??une,r=!0,o=new Map,i=(l)=>{e.coord.pubsub.publish(uh,JSON.stringify(l))},s=Pl({floors:t,defaultFloorMs:n,now:e.now,...e.schedule===void 0?{}:{schedule:e.schedule},sink:(l,p)=>i({kind:"res",topic:l,payload:p})}),a=Pl({floors:t,defaultFloorMs:n,now:e.now,...e.schedule===void 0?{}:{schedule:e.schedule},sink:(l,p)=>e.registry.publish(l,{type:"event",topic:l,...p===void 0?{}:{payload:p}})}),c=e.coord.pubsub.subscribe(uh,(l,p)=>{let f=qS(p),m=JSON.parse(f?.payload??p);switch(m.kind){case"res":if(m.topic===_u)e.registry.publish(_u,{type:"event",topic:_u});else a.emit(m.topic,m.payload);return;case"stream":{if(f===null)return;e.ring.push(m.topic,m.payload,f.seq),e.registry.publish(m.topic,{type:"event",topic:m.topic,seq:f.seq,payload:m.payload});return}case"channel":e.registry.publish(m.topic,{type:"event",topic:m.topic,payload:m.payload});return;case"declare":o.set(m.topic,m.nodeId);return;case"hello":if(m.nodeId===e.nodeId)return;for(let[g,h]of o)if(h===e.nodeId)i({kind:"declare",topic:g,nodeId:e.nodeId});return}}),u=()=>i({kind:"hello",nodeId:e.nodeId});u();let d=e.coord.pubsub.subscribe(dne,u);return{invalidate(l,p){s.emit(l,p===void 0?void 0:{keys:p})},invalidateAll(){i({kind:"res",topic:_u})},declareStream(l){o.set(l,e.nodeId),i({kind:"declare",topic:l,nodeId:e.nodeId})},declared(l){return o.has(l)},stream(l,p){e.coord.pubsub.publishSequenced(uh,JSON.stringify({kind:"stream",topic:l,payload:p}),`seq:${l}`)},channel(l,p){if(!r)return!1;let f;try{f=JSON.stringify({kind:"channel",topic:l,payload:p})}catch{return!1}return e.coord.pubsub.publish(uh,f),!0},resetStream(l){e.ring.reset(l)},stop(){r=!1,s.stop(),a.stop(),c(),d()}}}function wu(e){if(e.startsWith("res:")&&e.length>4)return"res";if(e.startsWith("stream:")&&e.length>7)return"stream";if(e.startsWith("plugin:")){let t=e.slice(7),n=t.indexOf(":");return n>0&&n<t.length-1?"plugin":null}return null}var lne=128;function pne(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function RU(e){if(!pne(e))return null;let{id:t,type:n,topic:r}=e;if(t!==void 0&&typeof t!=="string")return null;if(typeof r!=="string"||r.length===0||r.length>lne)return null;if(wu(r)===null)return null;let o=t===void 0?{topic:r}:{id:t,topic:r};if(n==="unsubscribe")return{...o,type:"unsubscribe"};if(n==="send")return"payload"in e?{...o,type:"send",payload:e.payload}:{...o,type:"send"};if(n==="subscribe"){let{sinceSeq:i}=e;if(i===void 0)return{...o,type:"subscribe"};if(typeof i!=="number"||!Number.isInteger(i)||i<0)return null;return{...o,type:"subscribe",sinceSeq:i}}return null}var fne=new Set(["res:usage","res:logs"]);function mne(e,t,n){let r=wu(n);if(r===null)return!1;if(r==="plugin"){if(!e.opened(n))return!1;if(t.kind==="admin")return!0;if(t.kind==="machine")return n.startsWith(`plugin:${t.pluginId}:`);return!1}if(t.kind==="admin")return!0;if(t.kind==="viewer")return r==="res"||r==="stream";if(t.kind==="client")return fne.has(n);return!1}function TU(e){let t=e.logger??ee,n=e.connectionId??(()=>`ws_${crypto.randomUUID()}`),r=new WeakMap,o=new WeakMap,i=(s,a)=>{s.send(JSON.stringify(a))};return new Vt().onError(rr).ws("/api/stream",{beforeHandle:async({request:s})=>{if(r.has(s))return;let a=s.headers.get("authorization"),c=Ts(s,Jr);if(a!==null&&c!==null)throw new T("AUTH","present one credential, not two");if(c===null)throw new T("AUTH","a session is required");let u=await e.admin.verify(c);if(u===null)throw new T("AUTH","a session is required");r.set(s,{principal:u,revalidate:async()=>await e.admin.verify(c)!==null})},open(s){let a=r.get(s.data.request);if(a===void 0){s.close(1011,"unauthenticated");return}let c=n();o.set(s.raw,c),e.registry.add(c,s.raw,a),e.registry.subscribe(c,_u)},message(s,a){let c=o.get(s.raw);if(c===void 0)return;let u=RU(a);if(u===null){i(s,{type:"error",message:"malformed frame"});return}let d=e.registry.principal(c);if(d===null)return;let l=u.id===void 0?{}:{id:u.id};if(!mne(e.channels,d,u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"not permitted"});return}if(u.type==="unsubscribe"){if(wu(u.topic)==="plugin"&&e.registry.has(c,u.topic))e.channels.closed(c,[u.topic]);e.registry.unsubscribe(c,u.topic),i(s,{...l,type:"ack",topic:u.topic});return}if(u.type==="send"){if(wu(u.topic)!=="plugin"){i(s,{...l,type:"error",topic:u.topic,message:"topic is read-only"});return}if(!e.channels.deliver(u.topic,c,u.payload)){i(s,{...l,type:"error",topic:u.topic,message:"subscribe before sending"});return}i(s,{...l,type:"ack",topic:u.topic});return}if(wu(u.topic)==="stream"&&!e.broadcaster.declared(u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"no source"});return}if(!e.registry.subscribe(c,u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"too many topics"});return}if(i(s,{...l,type:"ack",topic:u.topic}),u.sinceSeq!==void 0){let p=e.ring.since(u.topic,u.sinceSeq);if(p.kind==="gap")i(s,{type:"gap",topic:u.topic,seq:p.seq});else for(let f of p.frames)i(s,{type:"event",topic:u.topic,seq:f.seq,payload:f.payload})}},pong(s){let a=o.get(s.raw);if(a!==void 0)e.registry.pong(a)},drain(s){let a=o.get(s.raw);if(a!==void 0)e.registry.drain(a)},close(s){let a=o.get(s.raw);if(a===void 0)return;e.channels.closed(a,e.registry.topics(a)),e.registry.remove(a),o.delete(s.raw),t.debug("stream closed")}}).get("/api/stream",({set:s})=>(s.status=426,{error:{code:"BAD_REQUEST",message:"websocket upgrade required"}}))}var SU=/^[a-z0-9][a-z0-9:._-]{0,63}$/,gne=500,hne=(e)=>{let t=setTimeout(e,0);return t.unref?.(),()=>clearTimeout(t)};function lh(e){let t=e.logger??ee,n=e.scheduler??hne,r=e.now??Date.now,o=e.burst??gne,i=new Map,s=0,a=0,c=0,u=!0,d,l=new Map,p=new Map,f=new Map,m=()=>{if(d!==void 0||!u)return;d=n(g)},g=()=>{if(d=void 0,!u)return;for(let[x,_]of p)t.warn("plugin channel broadcast dropped",{plugin:x,count:_});p.clear();for(let[x,_]of f)t.warn("plugin channel payload could not be serialised",{plugin:x,count:_});f.clear();for(let[x,_]of l)t.warn("plugin channel handler failed",{plugin:x,count:_});l.clear()},h=(x)=>{s++,l.set(x,(l.get(x)??0)+1),m()},y=(x)=>{let _=r(),w=Number.isFinite(_)?Math.max(0,_-x.refilledAt):0;if(x.tokens=Math.min(o,x.tokens+w*o/1000),x.refilledAt=_,x.tokens<1)return a++,p.set(x.pluginId,(p.get(x.pluginId)??0)+1),m(),!1;return x.tokens-=1,!0},b=(x,_)=>e.sockets.has(x,_),E=(x,_)=>{if(!SU.test(_))throw Error(`channel name must match ${String(SU)}, got ${_}`);let w=`plugin:${x}:${_}`,S=i.get(w);if(S!==void 0)return S.facade;let I={pluginId:x,topic:w,tokens:o,refilledAt:r(),onMessage:[],onClose:[],facade:{onMessage:()=>{},send:()=>{},broadcast:()=>{},onClose:()=>{}}};return I.facade={onMessage(F){I.onMessage.push(F)},onClose(F){I.onClose.push(F)},send(F,N){if(!u)return;if(!b(F,w))return;e.sockets.sendTo(F,{type:"event",topic:w,payload:N})},broadcast(F){if(!u)return;if(!y(I))return;if(e.fanout(I.topic,F))return;c++,f.set(I.pluginId,(f.get(I.pluginId)??0)+1),m()}},i.set(w,I),I.facade};return{for(x){return{open:(_)=>E(x,_)}},opened(x){return i.has(x)},deliver(x,_,w){if(!u)return!1;let S=i.get(x);if(S===void 0)return!1;if(!b(_,x))return!1;for(let I of S.onMessage)try{I({connectionId:_,payload:w})}catch{h(S.pluginId)}return!0},closed(x,_){if(!u)return;for(let w of _){let S=i.get(w);if(S===void 0)continue;for(let I of S.onClose)try{I(x)}catch{h(S.pluginId)}}},stats(){return{channels:i.size,handlerErrors:s,broadcastDrops:a,broadcastUnencodable:c}},stop(){u=!1,i.clear(),d?.(),d=void 0,l.clear(),p.clear(),f.clear()}}}var AU="console:read",vU="console:answer:",yne=3000;function IU(e){let t=e.timeoutMs??yne,n=e.coord.pubsub.subscribe(AU,(r,o)=>{let i=JSON.parse(o);if(i.nodeId!==e.nodeId)return;(e.local===void 0?Promise.resolve({source:"none",lines:[]}):e.local(i.query)).then((s)=>e.coord.pubsub.publish(vU+i.id,JSON.stringify(s)))});return{async read(r,o){if(r===e.nodeId)return e.local===void 0?{source:"none",lines:[]}:e.local(o);let i=crypto.randomUUID();return new Promise((s,a)=>{let c=()=>{},u=setTimeout(()=>{c(),a(new T("TIMEOUT","that gateway process did not answer"))},t);c=e.coord.pubsub.subscribe(vU+i,(d,l)=>{clearTimeout(u),c(),s(JSON.parse(l))}),e.coord.pubsub.publish(AU,JSON.stringify({id:i,nodeId:r,query:o}))})},stop:n}}var bne=1000,_ne=256,wne=524288,xne=20000,kne=60000,Ene=60000,Rne=4401;function ph(e={}){let t=e.logger??ee,n=e.onDetach,r=e.now??Date.now,o=e.schedule??((w,S)=>{let I=setTimeout(w,S);return I.unref?.(),()=>clearTimeout(I)}),i=e.queueCapacity??bne,s=e.heartbeatMs??xne,a=e.pongDeadlineMs??kne,c=e.checkStaleMs??Ene,u=new Map,d=new Map,l=0,p=!0,f,m=0,g=(w)=>{while(w.queue.length>0){if((w.socket.getBufferedAmount?.()??0)>=wne)return;let S=w.queue[0];if(S===void 0)break;let I;try{I=w.socket.send(S)}catch{return}if(I===0)return;w.queue.shift()}},h=(w)=>{try{return JSON.stringify(w)}catch{return null}},y=(w,S)=>{if(w.queue.length>=i)w.queue.shift(),l++,m++;w.queue.push(S),g(w)},b=(w)=>{for(let S of w.topics){let I=d.get(S);if(I===void 0)continue;if(I.delete(w.id),I.size===0)d.delete(S)}u.delete(w.id)},E=(w,S,I)=>{n?.(w.id,[...w.topics]),b(w);try{w.socket.close(S,I)}catch{}},x=()=>{if(f=void 0,!p)return;let w=r();for(let S of[...u.values()]){if(w-S.lastPongAt>a){E(S,1001,"pong deadline");continue}try{S.socket.ping?.()}catch{E(S,1001,"ping failed");continue}if(S.checking){if(w-S.checkingSince<c)continue;S.generation+=1,S.checking=!1}S.checking=!0,S.checkingSince=w;let I=S.generation;S.credential.revalidate().then((F)=>{if(S.generation!==I)return;if(S.checking=!1,!F&&u.has(S.id))E(S,Rne,"session expired")}).catch(()=>{if(S.generation!==I)return;S.checking=!1})}if(m>0)t.warn("stream queue overflowed",{count:m}),m=0;_()},_=()=>{if(!p||f!==void 0)return;f=o(x,s)};return _(),{add(w,S,I){if(!p){S.close(1001,"shutting down");return}u.set(w,{id:w,socket:S,credential:I,topics:new Set,queue:[],lastPongAt:r(),checking:!1,checkingSince:0,generation:0})},remove(w){let S=u.get(w);if(S!==void 0)b(S)},subscribe(w,S){let I=u.get(w);if(I===void 0)return!1;if(I.topics.size>=_ne&&!I.topics.has(S))return!1;I.topics.add(S);let F=d.get(S)??new Set;return F.add(w),d.set(S,F),!0},unsubscribe(w,S){let I=u.get(w);if(I===void 0)return;I.topics.delete(S);let F=d.get(S);if(F===void 0)return;if(F.delete(w),F.size===0)d.delete(S)},topics(w){return[...u.get(w)?.topics??[]]},has(w,S){return u.get(w)?.topics.has(S)??!1},principal(w){return u.get(w)?.credential.principal??null},pong(w){let S=u.get(w);if(S!==void 0)S.lastPongAt=r()},drain(w){let S=u.get(w);if(S!==void 0)g(S)},publish(w,S){let I=d.get(w);if(I===void 0)return;let F=h(S);if(F===null)return;for(let N of I){let v=u.get(N);if(v!==void 0)y(v,F)}},sendTo(w,S){let I=u.get(w);if(I===void 0)return;let F=h(S);if(F!==null)y(I,F)},closeAll(w,S){for(let I of[...u.values()])E(I,w,S);d.clear()},stats(){let w=0;for(let S of u.values())w+=S.queue.length;return{connections:u.size,dropped:l,queued:w}},stop(){p=!1,f?.(),f=void 0}}}function Tne(e){try{return JSON.stringify(e)?.length??0}catch{return 0}}var Sne={frames:500,bytes:2097152};function fh(e=Sne){let t=new Map,n=(r)=>{let o=t.get(r);if(o!==void 0)return o;let i={entries:[],bytes:0,seq:0};return t.set(r,i),i};return{push(r,o,i){let s=n(r);if(i!==void 0&&i<=s.seq)return s.seq;s.seq=i??s.seq+1;let a=Tne(o);s.entries.push({seq:s.seq,payload:o,bytes:a}),s.bytes+=a;while(s.entries.length>e.frames||s.bytes>e.bytes&&s.entries.length>1){let c=s.entries.shift();if(c===void 0)break;s.bytes-=c.bytes}return s.seq},since(r,o){let i=t.get(r);if(i===void 0)return o===0?{kind:"frames",frames:[]}:{kind:"gap",seq:0};if(o>i.seq)return{kind:"gap",seq:i.seq};if(o===i.seq)return{kind:"frames",frames:[]};let s=i.entries[0];if(s===void 0)return{kind:"gap",seq:i.seq};if(s.seq>o+1)return{kind:"gap",seq:i.seq};return{kind:"frames",frames:i.entries.filter((a)=>a.seq>o).map(({seq:a,payload:c})=>({seq:a,payload:c}))}},head(r){return t.get(r)?.seq??0},reset(r){let o=t.get(r);if(o===void 0)return;o.entries=[],o.bytes=0},drop(r){t.delete(r)}}}var Nl="0.15.2";var Xk=43200000,PU="the gateway is briefly quiesced for database maintenance",Ine={"/v1/chat/completions":(e)=>Xg("OVERLOADED",e),"/v1/responses":(e)=>Yg("OVERLOADED",e)};function Cne(e){let t=Ine[e],n=t===void 0?Zg("OVERLOADED",PU):t(PU);return new Response(JSON.stringify(n),{status:Ot.OVERLOADED,headers:{"content-type":"application/json","retry-after":"5"}})}function One(e){return e==="/v1"||e.startsWith("/v1/")}function Pne(){let e=()=>{throw new T("INTERNAL","this process has no lifecycle control installed")};return{env:process.env,version:Nl,fileExists:(t)=>vne(t),run:async()=>e(),stop:e}}function NU(e){let t=e.now??(()=>Date.now()),n=e.coord??nn(),r=e.nodeId??crypto.randomUUID(),o=e.logger??ee,i=e.rand??Math.random,s=e.http??Lf({logger:o,now:t,...e.telemetry===void 0?{}:{onResponseHead:e.telemetry.httpHead}}),a=e.adapters??cc,c=e.requestId??(()=>`req_${crypto.randomUUID()}`),u=e.loadRegistry??Wg(n),d=e.telemetry,l=e.rateLimiter??new El({store:e.store,now:t,logger:o,coord:n,...d===void 0?{}:{onRejected:d.rateLimit}}),p=Vg(e.store,o),f="routing";e.store.routing.subscribe((v)=>{n.pubsub.publish("routing",JSON.stringify({from:r,change:v}))}),n.pubsub.subscribe("routing",(v,H)=>{let R=JSON.parse(H);if(R.from!==r)p.applyRemote(R.change)});let m=zp(e.store,{now:t,sessionTtlMs:Xk,coord:n}),g=e.refresh??vd({store:e.store,providers:Lr,http:s,now:t,logger:o,coord:n}),h=e.staticDir?Zk(e.staticDir):void 0,y;if(h)try{y=CU(h)}catch{}let b=e.latch??BM(),E,x=e.registry??ph({logger:o,now:t,onDetach:(v,H)=>E?.closed(v,H)}),_=e.ring??fh(),w=e.broadcaster??dh({registry:x,ring:_,coord:n,nodeId:r,now:t}),S=e.channels??lh({sockets:x,fanout:(v,H)=>w.channel(v,H),now:t,logger:o});E=S;let I=e.console,F=IU({coord:n,nodeId:r,local:I===void 0?void 0:(v)=>qs(I.deps,I.source,v)}),N=new WeakMap;return new Vt().onRequest(({request:v})=>{let H=new URL(v.url).pathname;if(!One(H))return;let R=b.enter();if(R===null)return Cne(H);N.set(v,R)}).onAfterResponse(({request:v})=>{N.get(v)?.(),N.delete(v)}).get("/health",()=>({ok:!0,mode:e.mode??"single",nodeId:r,coord:e.coordHealthy?.()===!1?"fallback":"ok"})).use(e.metricsToken===void 0||d===void 0?new Vt:new Vt().get("/metrics",({request:v})=>{let H=v.headers.get("authorization"),R=`Bearer ${e.metricsToken}`,P=Buffer.from(H??""),L=Buffer.from(R);if(P.length!==L.length||!Ane(P,L))return new Response(null,{status:401});let K=e.coordHealthy?.()===!1;return new Response(d.scrape(u.localCounts?.()??new Map,x.stats(),K,e.coordFaults?.()??0),{headers:{"content-type":"text/plain; version=0.0.4; charset=utf-8"}})})).use(EU({store:e.store,snapshots:p,adapters:a,http:s,now:t,rand:i,refresh:g,requestId:c,rateLimiter:l,logger:o,coord:n,loadRegistry:u,bodyLoggingAllowed:e.bodyLoggingAllowed===!0,...e.emit===void 0?{}:{emit:e.emit},...d===void 0?{}:{telemetry:d},broadcaster:w})).use(zM({store:e.store,admin:m,baseUrl:e.baseUrl,bodyLoggingAllowed:e.bodyLoggingAllowed===!0,...e.dayOffsetMinutes===void 0?{}:{dayOffsetMinutes:e.dayOffsetMinutes},now:t,sessionTtlMs:Xk,logger:o,broadcaster:w,nodeId:r,consoleFleet:F,...e.quota===void 0?{}:{quota:e.quota},...e.console===void 0?{}:{console:e.console}})).use(qM({store:e.store,admin:m,sessionTtlMs:Xk,baseUrl:e.baseUrl,...e.dayOffsetMinutes===void 0?{}:{dayOffsetMinutes:e.dayOffsetMinutes},now:t,logger:o})).use(GM({store:e.store,...e.mode===void 0?{}:{mode:e.mode},...e.reapplyPluginSchema===void 0?{}:{reapplyPluginSchema:e.reapplyPluginSchema},admin:m,latch:b,snapshots:p,broadcaster:w,fs:e.databaseFs??Sd(),now:t,logger:o,lifecycle:e.lifecycle??Pne()})).use(HM({store:e.store,admin:m,providers:Lr,http:s,now:t,logger:o,coord:n})).use($M({admin:m,plugins:e.plugins??[],logger:o})).use(FM({admin:m,plugins:e.pluginUi??[],logger:o})).use(TU({admin:m,registry:x,broadcaster:w,ring:_,channels:S,logger:o})).get("/*",({path:v,request:H,set:R})=>{let P=new URL(H.url).pathname,L=()=>(R.status=404,{error:{code:"NOT_FOUND",message:`no route for ${v}`}});if(!y||/%2f|%5c/i.test(P))return L();let K;try{K=decodeURIComponent(P)}catch{return L()}if(["/api","/v1"].some((Q)=>K===Q||K.startsWith(`${Q}/`)))return L();let Se=Zk(y,`.${K==="/"?"/index.html":K}`);if(Se!==y&&!Se.startsWith(`${y}${OU}`))return L();let V;try{V=CU(Se)}catch{}if(V&&V!==y&&!V.startsWith(`${y}${OU}`))return L();let re=V?Bun.file(V):void 0;if(re&&re.size>0&&V){let Q=K.startsWith("/assets/")?"public, max-age=31536000, immutable":"no-cache";return new Response(re,{headers:{"cache-control":Q,"content-type":V.endsWith(".html")?"text/html":re.type}})}let Ne=H.headers.get("accept")?.includes("text/html")??!1;if(K.startsWith("/assets/")||!Ne)return L();let Je=Zk(y,"index.html"),at=Bun.file(Je);if(at.size===0)return L();return new Response(at,{headers:{"cache-control":"no-cache","content-type":"text/html"}})})}var{RedisClient:LU}=globalThis.Bun;var Qk="omni:",mh=`${Qk}pubsub`,Nne=50,Lne=30000,DU=2000,Dne=1000,$ne="coord:reconnected",MU=`
2236
+ `))}catch(p){l.error(p),await c(!1,p)}},async cancel(){await e.return(void 0),await r.return(void 0),await c(!0)}});return new Response(d,{headers:{...nne,...o}})}async function sne(e,t){if(e.bodyLoggingAllowed!==!0)return null;if(t.bodyLoggingOptOut)return null;let{settings:n}=await e.snapshots.get(e.now());if(!n.bodyLoggingEnabled)return null;return e1({captureStreamChunks:n.bodyLoggingCaptureStreamChunks})}async function Gk(e,t,n,r){let o=e.requestId(),i=e.now(),s=e.telemetry?.startRequest(o,i,r.headers.get("traceparent"),n,e.rand())??null,a=null,c="",u=null,d=null,l,p=null,f=!1,m=null,g=!1,h={},y=()=>rne(n,m===null?h:one(h),i),b=(E,x,_)=>{t.debit(E,x,_)};try{let E;try{E=await eh(e.store,th(r.headers),i,e.logger)}catch(K){if(K instanceof T&&K.code==="AUTH")e.logger.warn("authentication rejected",{requestId:o,surface:n,reason:"invalid credentials"});throw K}a=E.id;let x=await sne(e,E);if(d=x,x!==null)l=async(K)=>{if(await x.settle(),p?.truncated===!0)x.client.truncated=!0;await e.store.bodies.put({schemaVersion:gp,requestId:o,at:i,client:x.client,attempts:x.attempts(),error:K.errorCode===null?null:{code:K.errorCode,status:K.status}})};let _=await r.json();if(x!==null)x.client.request=_;let w=n==="anthropic"?zk(_,r.headers):n==="responses"?_U(_,r.headers):hU(_,r.headers),S=()=>({requestId:o,created:Math.floor(e.now()/1000),customToolNames:bU(_)});if(E.modelAllowlist!==null&&!E.modelAllowlist.includes(w.model))throw new T("AUTH",`model "${ke(w.model)}" is not allowed for this API key`);c=w.model;try{let K=await t.admit(E.id,E.limits,c,o);m=K.release,h=K.headroom}catch(K){if(K instanceof Gg)h=K.headroom;if(K instanceof T&&K.code==="RATE_LIMIT")e.logger.warn("rate limit rejected",{requestId:o,surface:n,apiKeyId:E.id,model:c,code:K.code,retryAfterMs:K.retryAfterMs});throw K}let I=!1,F=()=>sh(w,{...e,...x===null?{}:{http:x.wrap(e.http)},trace:s,async onRoute(K){if(I){await ih(e.store,o,K,e.logger,e.broadcaster);return}I=!0;let Z=rh({id:o,at:i,requestedModel:c,resolvedProvider:K.provider,resolvedModel:K.model,credentialId:K.credentialId});await oh(e.store,Z,a,e.logger,e.broadcaster)}},r.signal,o),N=E.guardrailPolicy,v=N===null?await F():nU({judge:()=>tU({...e,cache:e.guardrailCache},{apiKeyId:E.id,policy:N,request:w,signal:r.signal,debit:(K,Z,ce)=>{t.recordOverride(K,E.limits,Z),b(K,Z,ce)},parentRequestId:o}),dispatch:F,signal:r.signal,requestId:o,startedAt:i,requestedModel:c,now:e.now,logger:e.logger,surface:n});u=v;let H=async(K=!1,Z)=>{let ce=v.log(),Se=K||r.signal.aborted;if(x!==null&&Se)x.client.truncated=!0;if(Se&&ce.status===0)ce.status=499,ce.errorCode="interrupted",ce.durationMs=e.now()-i;else if(!Se&&Z!==void 0){let V=Ol(Z);if(ce.status===0)ce.status=Ot[V.code],ce.errorCode=V.code,ce.durationMs=e.now()-i;ja(e.logger,o,ce,V,n)}f=!0,await vl(e.store,ce,a,e.logger,l,b,e.emit,e.broadcaster,e.telemetry,s)};if(w.stream){let K=n==="anthropic"?_M(v.events,o):n==="responses"?CM(v.events,S()):TM(v.events,o,Math.floor(e.now()/1000)),Z;if(x!==null){let V=JM();p=V,x.client.response=V.frames,Z=V.write}let Se=ine(K,async(V=!1,re)=>{m?.(),await H(V,re)},ene(n,e.keepaliveMs),v.events,y(),Z);return g=!0,Se}let R=[];for await(let K of v.events)R.push(K);let P=R.find((K)=>K.type==="error"),L=P!==void 0?Wk(n,P.code,P.message):n==="anthropic"?wM(tc(R),o):n==="responses"?OM(tc(R),S()):SM(tc(R),o,Math.floor(e.now()/1000));if(x!==null)x.client.response=L;return await H(),Vk(L,P===void 0?200:Ot[P.code],y())}catch(E){let x=Ol(E),_=r.signal.aborted&&E===r.signal.reason,w=u?.log()??Ba(o,i,{requestedModel:c,status:0});w.status=_?499:Ot[x.code],w.errorCode=_?"interrupted":x.code,w.durationMs=e.now()-i;let S=Wk(n,x.code,x.message);if(d!==null&&_)d.client.truncated=!0;if(d!==null&&!f)d.client.response=S;if(!f)await vl(e.store,w,a,e.logger,l,b,e.emit,e.broadcaster,e.telemetry,s);if(!_)ja(e.logger,o,w,x,n);return Vk(S,Ot[x.code],{...y(),...kU(x)})}finally{if(!g)m?.()}}function EU(e){let t=e.logger??ee,n=e.coord??nn(),r=e.rateLimiter??new El({store:e.store,now:e.now,logger:t,coord:n}),o={...e,logger:t,coord:n,snapshots:e.snapshots??Vg(e.store,t),loadRegistry:e.loadRegistry??Wg(n),keepaliveMs:e.keepaliveMs??Yte,guardrailCache:new Fk};return new Vt().post("/v1/messages",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"anthropic",i))).post("/v1/responses",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"responses",i))).post("/v1/chat/completions",({request:i,server:s})=>(s?.timeout(i,0),Gk(o,r,"openai",i))).get("/v1/models",async({request:i})=>{try{let s=await eh(e.store,th(i.headers),e.now(),t),a=await o.snapshots.get(e.now()),c=[...a.models.values()],u=s.modelAllowlist===null?c:c.filter((d)=>s.modelAllowlist?.includes(d.id));return Response.json(wU(u,a.credentials))}catch(s){let a=Ol(s);return t.error("model listing failed",{status:Ot[a.code],code:a.code,reason:a.message}),Kk("anthropic",a.code,a.message)}}).post("/v1/messages/count_tokens",async({request:i})=>{try{let s=await eh(e.store,th(i.headers),e.now(),t),a=await i.json(),c=zk(a,i.headers);if(s.modelAllowlist!==null&&!s.modelAllowlist.includes(c.model))throw new T("AUTH",`model "${ke(c.model)}" is not allowed for this API key`);await r.consume(s.id,s.limits,c.model,e.requestId());let{settings:u}=await o.snapshots.get(e.now()),d=Jg(c,{mode:u.ponytailMode}).request;return Response.json({input_tokens:$s(d)})}catch(s){let a=Ol(s);return t.warn("token count failed",{status:Ot[a.code],code:a.code,reason:a.message}),Kk("anthropic",a.code,a.message,kU(a))}}).onError(({error:i})=>{let s=Ol(i);return t.error("unhandled proxy route error",{status:Ot[s.code],code:s.code,reason:s.message}),Kk("anthropic",s.code,s.message)})}var ane=(e,t)=>{let n=setTimeout(e,t);return()=>clearTimeout(n)};function Pl(e){let t=e.now??Date.now,n=e.schedule??ane,r=new Map,o=new Map,i=(c)=>e.floors[c]??e.defaultFloorMs,s=(c,u)=>{r.set(c,t()),e.sink(c,u)},a=(c)=>{let u=o.get(c);if(u===void 0)return;o.delete(c),s(c,u.payload)};return{emit(c,u){let d=i(c),l=r.get(c),p=l===void 0?Number.POSITIVE_INFINITY:t()-l,f=o.get(c);if(f!==void 0){f.payload=u;return}if(p>=d){s(c,u);return}let m=n(()=>a(c),d-p);o.set(c,{payload:u,cancel:m})},flush(){for(let[c,u]of[...o])u.cancel(),o.delete(c),s(c,u.payload)},stop(){for(let c of o.values())c.cancel();o.clear(),r.clear()}}}var cne={"res:usage":1000,"res:logs":1000,"res:quota":5000,"res:credentials":5000},une=1000,_u="res:*",uh="broadcast",dne="coord:reconnected";function dh(e){let t=e.floors??cne,n=e.defaultFloorMs??une,r=!0,o=new Map,i=(l)=>{e.coord.pubsub.publish(uh,JSON.stringify(l))},s=Pl({floors:t,defaultFloorMs:n,now:e.now,...e.schedule===void 0?{}:{schedule:e.schedule},sink:(l,p)=>i({kind:"res",topic:l,payload:p})}),a=Pl({floors:t,defaultFloorMs:n,now:e.now,...e.schedule===void 0?{}:{schedule:e.schedule},sink:(l,p)=>e.registry.publish(l,{type:"event",topic:l,...p===void 0?{}:{payload:p}})}),c=e.coord.pubsub.subscribe(uh,(l,p)=>{let f=qS(p),m=JSON.parse(f?.payload??p);switch(m.kind){case"res":if(m.topic===_u)e.registry.publish(_u,{type:"event",topic:_u});else a.emit(m.topic,m.payload);return;case"stream":{if(f===null)return;e.ring.push(m.topic,m.payload,f.seq),e.registry.publish(m.topic,{type:"event",topic:m.topic,seq:f.seq,payload:m.payload});return}case"channel":e.registry.publish(m.topic,{type:"event",topic:m.topic,payload:m.payload});return;case"declare":o.set(m.topic,m.nodeId);return;case"hello":if(m.nodeId===e.nodeId)return;for(let[g,h]of o)if(h===e.nodeId)i({kind:"declare",topic:g,nodeId:e.nodeId});return}}),u=()=>i({kind:"hello",nodeId:e.nodeId});u();let d=e.coord.pubsub.subscribe(dne,u);return{invalidate(l,p){s.emit(l,p===void 0?void 0:{keys:p})},invalidateAll(){i({kind:"res",topic:_u})},declareStream(l){o.set(l,e.nodeId),i({kind:"declare",topic:l,nodeId:e.nodeId})},declared(l){return o.has(l)},stream(l,p){e.coord.pubsub.publishSequenced(uh,JSON.stringify({kind:"stream",topic:l,payload:p}),`seq:${l}`)},channel(l,p){if(!r)return!1;let f;try{f=JSON.stringify({kind:"channel",topic:l,payload:p})}catch{return!1}return e.coord.pubsub.publish(uh,f),!0},resetStream(l){e.ring.reset(l)},stop(){r=!1,s.stop(),a.stop(),c(),d()}}}function wu(e){if(e.startsWith("res:")&&e.length>4)return"res";if(e.startsWith("stream:")&&e.length>7)return"stream";if(e.startsWith("plugin:")){let t=e.slice(7),n=t.indexOf(":");return n>0&&n<t.length-1?"plugin":null}return null}var lne=128;function pne(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function RU(e){if(!pne(e))return null;let{id:t,type:n,topic:r}=e;if(t!==void 0&&typeof t!=="string")return null;if(typeof r!=="string"||r.length===0||r.length>lne)return null;if(wu(r)===null)return null;let o=t===void 0?{topic:r}:{id:t,topic:r};if(n==="unsubscribe")return{...o,type:"unsubscribe"};if(n==="send")return"payload"in e?{...o,type:"send",payload:e.payload}:{...o,type:"send"};if(n==="subscribe"){let{sinceSeq:i}=e;if(i===void 0)return{...o,type:"subscribe"};if(typeof i!=="number"||!Number.isInteger(i)||i<0)return null;return{...o,type:"subscribe",sinceSeq:i}}return null}var fne=new Set(["res:usage","res:logs"]);function mne(e,t,n){let r=wu(n);if(r===null)return!1;if(r==="plugin"){if(!e.opened(n))return!1;if(t.kind==="admin")return!0;if(t.kind==="machine")return n.startsWith(`plugin:${t.pluginId}:`);return!1}if(t.kind==="admin")return!0;if(t.kind==="viewer")return r==="res"||r==="stream";if(t.kind==="client")return fne.has(n);return!1}function TU(e){let t=e.logger??ee,n=e.connectionId??(()=>`ws_${crypto.randomUUID()}`),r=new WeakMap,o=new WeakMap,i=(s,a)=>{s.send(JSON.stringify(a))};return new Vt().onError(rr).ws("/api/stream",{beforeHandle:async({request:s})=>{if(r.has(s))return;let a=s.headers.get("authorization"),c=Ts(s,Jr);if(a!==null&&c!==null)throw new T("AUTH","present one credential, not two");if(c===null)throw new T("AUTH","a session is required");let u=await e.admin.verify(c);if(u===null)throw new T("AUTH","a session is required");r.set(s,{principal:u,revalidate:async()=>await e.admin.verify(c)!==null})},open(s){let a=r.get(s.data.request);if(a===void 0){s.close(1011,"unauthenticated");return}let c=n();o.set(s.raw,c),e.registry.add(c,s.raw,a),e.registry.subscribe(c,_u)},message(s,a){let c=o.get(s.raw);if(c===void 0)return;let u=RU(a);if(u===null){i(s,{type:"error",message:"malformed frame"});return}let d=e.registry.principal(c);if(d===null)return;let l=u.id===void 0?{}:{id:u.id};if(!mne(e.channels,d,u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"not permitted"});return}if(u.type==="unsubscribe"){if(wu(u.topic)==="plugin"&&e.registry.has(c,u.topic))e.channels.closed(c,[u.topic]);e.registry.unsubscribe(c,u.topic),i(s,{...l,type:"ack",topic:u.topic});return}if(u.type==="send"){if(wu(u.topic)!=="plugin"){i(s,{...l,type:"error",topic:u.topic,message:"topic is read-only"});return}if(!e.channels.deliver(u.topic,c,u.payload)){i(s,{...l,type:"error",topic:u.topic,message:"subscribe before sending"});return}i(s,{...l,type:"ack",topic:u.topic});return}if(wu(u.topic)==="stream"&&!e.broadcaster.declared(u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"no source"});return}if(!e.registry.subscribe(c,u.topic)){i(s,{...l,type:"error",topic:u.topic,message:"too many topics"});return}if(i(s,{...l,type:"ack",topic:u.topic}),u.sinceSeq!==void 0){let p=e.ring.since(u.topic,u.sinceSeq);if(p.kind==="gap")i(s,{type:"gap",topic:u.topic,seq:p.seq});else for(let f of p.frames)i(s,{type:"event",topic:u.topic,seq:f.seq,payload:f.payload})}},pong(s){let a=o.get(s.raw);if(a!==void 0)e.registry.pong(a)},drain(s){let a=o.get(s.raw);if(a!==void 0)e.registry.drain(a)},close(s){let a=o.get(s.raw);if(a===void 0)return;e.channels.closed(a,e.registry.topics(a)),e.registry.remove(a),o.delete(s.raw),t.debug("stream closed")}}).get("/api/stream",({set:s})=>(s.status=426,{error:{code:"BAD_REQUEST",message:"websocket upgrade required"}}))}var SU=/^[a-z0-9][a-z0-9:._-]{0,63}$/,gne=500,hne=(e)=>{let t=setTimeout(e,0);return t.unref?.(),()=>clearTimeout(t)};function lh(e){let t=e.logger??ee,n=e.scheduler??hne,r=e.now??Date.now,o=e.burst??gne,i=new Map,s=0,a=0,c=0,u=!0,d,l=new Map,p=new Map,f=new Map,m=()=>{if(d!==void 0||!u)return;d=n(g)},g=()=>{if(d=void 0,!u)return;for(let[x,_]of p)t.warn("plugin channel broadcast dropped",{plugin:x,count:_});p.clear();for(let[x,_]of f)t.warn("plugin channel payload could not be serialised",{plugin:x,count:_});f.clear();for(let[x,_]of l)t.warn("plugin channel handler failed",{plugin:x,count:_});l.clear()},h=(x)=>{s++,l.set(x,(l.get(x)??0)+1),m()},y=(x)=>{let _=r(),w=Number.isFinite(_)?Math.max(0,_-x.refilledAt):0;if(x.tokens=Math.min(o,x.tokens+w*o/1000),x.refilledAt=_,x.tokens<1)return a++,p.set(x.pluginId,(p.get(x.pluginId)??0)+1),m(),!1;return x.tokens-=1,!0},b=(x,_)=>e.sockets.has(x,_),E=(x,_)=>{if(!SU.test(_))throw Error(`channel name must match ${String(SU)}, got ${_}`);let w=`plugin:${x}:${_}`,S=i.get(w);if(S!==void 0)return S.facade;let I={pluginId:x,topic:w,tokens:o,refilledAt:r(),onMessage:[],onClose:[],facade:{onMessage:()=>{},send:()=>{},broadcast:()=>{},onClose:()=>{}}};return I.facade={onMessage(F){I.onMessage.push(F)},onClose(F){I.onClose.push(F)},send(F,N){if(!u)return;if(!b(F,w))return;e.sockets.sendTo(F,{type:"event",topic:w,payload:N})},broadcast(F){if(!u)return;if(!y(I))return;if(e.fanout(I.topic,F))return;c++,f.set(I.pluginId,(f.get(I.pluginId)??0)+1),m()}},i.set(w,I),I.facade};return{for(x){return{open:(_)=>E(x,_)}},opened(x){return i.has(x)},deliver(x,_,w){if(!u)return!1;let S=i.get(x);if(S===void 0)return!1;if(!b(_,x))return!1;for(let I of S.onMessage)try{I({connectionId:_,payload:w})}catch{h(S.pluginId)}return!0},closed(x,_){if(!u)return;for(let w of _){let S=i.get(w);if(S===void 0)continue;for(let I of S.onClose)try{I(x)}catch{h(S.pluginId)}}},stats(){return{channels:i.size,handlerErrors:s,broadcastDrops:a,broadcastUnencodable:c}},stop(){u=!1,i.clear(),d?.(),d=void 0,l.clear(),p.clear(),f.clear()}}}var AU="console:read",vU="console:answer:",yne=3000;function IU(e){let t=e.timeoutMs??yne,n=e.coord.pubsub.subscribe(AU,(r,o)=>{let i=JSON.parse(o);if(i.nodeId!==e.nodeId)return;(e.local===void 0?Promise.resolve({source:"none",lines:[]}):e.local(i.query)).then((s)=>e.coord.pubsub.publish(vU+i.id,JSON.stringify(s)))});return{async read(r,o){if(r===e.nodeId)return e.local===void 0?{source:"none",lines:[]}:e.local(o);let i=crypto.randomUUID();return new Promise((s,a)=>{let c=()=>{},u=setTimeout(()=>{c(),a(new T("TIMEOUT","that gateway process did not answer"))},t);c=e.coord.pubsub.subscribe(vU+i,(d,l)=>{clearTimeout(u),c(),s(JSON.parse(l))}),e.coord.pubsub.publish(AU,JSON.stringify({id:i,nodeId:r,query:o}))})},stop:n}}var bne=1000,_ne=256,wne=524288,xne=20000,kne=60000,Ene=60000,Rne=4401;function ph(e={}){let t=e.logger??ee,n=e.onDetach,r=e.now??Date.now,o=e.schedule??((w,S)=>{let I=setTimeout(w,S);return I.unref?.(),()=>clearTimeout(I)}),i=e.queueCapacity??bne,s=e.heartbeatMs??xne,a=e.pongDeadlineMs??kne,c=e.checkStaleMs??Ene,u=new Map,d=new Map,l=0,p=!0,f,m=0,g=(w)=>{while(w.queue.length>0){if((w.socket.getBufferedAmount?.()??0)>=wne)return;let S=w.queue[0];if(S===void 0)break;let I;try{I=w.socket.send(S)}catch{return}if(I===0)return;w.queue.shift()}},h=(w)=>{try{return JSON.stringify(w)}catch{return null}},y=(w,S)=>{if(w.queue.length>=i)w.queue.shift(),l++,m++;w.queue.push(S),g(w)},b=(w)=>{for(let S of w.topics){let I=d.get(S);if(I===void 0)continue;if(I.delete(w.id),I.size===0)d.delete(S)}u.delete(w.id)},E=(w,S,I)=>{n?.(w.id,[...w.topics]),b(w);try{w.socket.close(S,I)}catch{}},x=()=>{if(f=void 0,!p)return;let w=r();for(let S of[...u.values()]){if(w-S.lastPongAt>a){E(S,1001,"pong deadline");continue}try{S.socket.ping?.()}catch{E(S,1001,"ping failed");continue}if(S.checking){if(w-S.checkingSince<c)continue;S.generation+=1,S.checking=!1}S.checking=!0,S.checkingSince=w;let I=S.generation;S.credential.revalidate().then((F)=>{if(S.generation!==I)return;if(S.checking=!1,!F&&u.has(S.id))E(S,Rne,"session expired")}).catch(()=>{if(S.generation!==I)return;S.checking=!1})}if(m>0)t.warn("stream queue overflowed",{count:m}),m=0;_()},_=()=>{if(!p||f!==void 0)return;f=o(x,s)};return _(),{add(w,S,I){if(!p){S.close(1001,"shutting down");return}u.set(w,{id:w,socket:S,credential:I,topics:new Set,queue:[],lastPongAt:r(),checking:!1,checkingSince:0,generation:0})},remove(w){let S=u.get(w);if(S!==void 0)b(S)},subscribe(w,S){let I=u.get(w);if(I===void 0)return!1;if(I.topics.size>=_ne&&!I.topics.has(S))return!1;I.topics.add(S);let F=d.get(S)??new Set;return F.add(w),d.set(S,F),!0},unsubscribe(w,S){let I=u.get(w);if(I===void 0)return;I.topics.delete(S);let F=d.get(S);if(F===void 0)return;if(F.delete(w),F.size===0)d.delete(S)},topics(w){return[...u.get(w)?.topics??[]]},has(w,S){return u.get(w)?.topics.has(S)??!1},principal(w){return u.get(w)?.credential.principal??null},pong(w){let S=u.get(w);if(S!==void 0)S.lastPongAt=r()},drain(w){let S=u.get(w);if(S!==void 0)g(S)},publish(w,S){let I=d.get(w);if(I===void 0)return;let F=h(S);if(F===null)return;for(let N of I){let v=u.get(N);if(v!==void 0)y(v,F)}},sendTo(w,S){let I=u.get(w);if(I===void 0)return;let F=h(S);if(F!==null)y(I,F)},closeAll(w,S){for(let I of[...u.values()])E(I,w,S);d.clear()},stats(){let w=0;for(let S of u.values())w+=S.queue.length;return{connections:u.size,dropped:l,queued:w}},stop(){p=!1,f?.(),f=void 0}}}function Tne(e){try{return JSON.stringify(e)?.length??0}catch{return 0}}var Sne={frames:500,bytes:2097152};function fh(e=Sne){let t=new Map,n=(r)=>{let o=t.get(r);if(o!==void 0)return o;let i={entries:[],bytes:0,seq:0};return t.set(r,i),i};return{push(r,o,i){let s=n(r);if(i!==void 0&&i<=s.seq)return s.seq;s.seq=i??s.seq+1;let a=Tne(o);s.entries.push({seq:s.seq,payload:o,bytes:a}),s.bytes+=a;while(s.entries.length>e.frames||s.bytes>e.bytes&&s.entries.length>1){let c=s.entries.shift();if(c===void 0)break;s.bytes-=c.bytes}return s.seq},since(r,o){let i=t.get(r);if(i===void 0)return o===0?{kind:"frames",frames:[]}:{kind:"gap",seq:0};if(o>i.seq)return{kind:"gap",seq:i.seq};if(o===i.seq)return{kind:"frames",frames:[]};let s=i.entries[0];if(s===void 0)return{kind:"gap",seq:i.seq};if(s.seq>o+1)return{kind:"gap",seq:i.seq};return{kind:"frames",frames:i.entries.filter((a)=>a.seq>o).map(({seq:a,payload:c})=>({seq:a,payload:c}))}},head(r){return t.get(r)?.seq??0},reset(r){let o=t.get(r);if(o===void 0)return;o.entries=[],o.bytes=0},drop(r){t.delete(r)}}}var Nl="0.15.3";var Xk=43200000,PU="the gateway is briefly quiesced for database maintenance",Ine={"/v1/chat/completions":(e)=>Xg("OVERLOADED",e),"/v1/responses":(e)=>Yg("OVERLOADED",e)};function Cne(e){let t=Ine[e],n=t===void 0?Zg("OVERLOADED",PU):t(PU);return new Response(JSON.stringify(n),{status:Ot.OVERLOADED,headers:{"content-type":"application/json","retry-after":"5"}})}function One(e){return e==="/v1"||e.startsWith("/v1/")}function Pne(){let e=()=>{throw new T("INTERNAL","this process has no lifecycle control installed")};return{env:process.env,version:Nl,fileExists:(t)=>vne(t),run:async()=>e(),stop:e}}function NU(e){let t=e.now??(()=>Date.now()),n=e.coord??nn(),r=e.nodeId??crypto.randomUUID(),o=e.logger??ee,i=e.rand??Math.random,s=e.http??Lf({logger:o,now:t,...e.telemetry===void 0?{}:{onResponseHead:e.telemetry.httpHead}}),a=e.adapters??cc,c=e.requestId??(()=>`req_${crypto.randomUUID()}`),u=e.loadRegistry??Wg(n),d=e.telemetry,l=e.rateLimiter??new El({store:e.store,now:t,logger:o,coord:n,...d===void 0?{}:{onRejected:d.rateLimit}}),p=Vg(e.store,o),f="routing";e.store.routing.subscribe((v)=>{n.pubsub.publish("routing",JSON.stringify({from:r,change:v}))}),n.pubsub.subscribe("routing",(v,H)=>{let R=JSON.parse(H);if(R.from!==r)p.applyRemote(R.change)});let m=zp(e.store,{now:t,sessionTtlMs:Xk,coord:n}),g=e.refresh??vd({store:e.store,providers:Lr,http:s,now:t,logger:o,coord:n}),h=e.staticDir?Zk(e.staticDir):void 0,y;if(h)try{y=CU(h)}catch{}let b=e.latch??BM(),E,x=e.registry??ph({logger:o,now:t,onDetach:(v,H)=>E?.closed(v,H)}),_=e.ring??fh(),w=e.broadcaster??dh({registry:x,ring:_,coord:n,nodeId:r,now:t}),S=e.channels??lh({sockets:x,fanout:(v,H)=>w.channel(v,H),now:t,logger:o});E=S;let I=e.console,F=IU({coord:n,nodeId:r,local:I===void 0?void 0:(v)=>qs(I.deps,I.source,v)}),N=new WeakMap;return new Vt().onRequest(({request:v})=>{let H=new URL(v.url).pathname;if(!One(H))return;let R=b.enter();if(R===null)return Cne(H);N.set(v,R)}).onAfterResponse(({request:v})=>{N.get(v)?.(),N.delete(v)}).get("/health",()=>({ok:!0,mode:e.mode??"single",nodeId:r,coord:e.coordHealthy?.()===!1?"fallback":"ok"})).use(e.metricsToken===void 0||d===void 0?new Vt:new Vt().get("/metrics",({request:v})=>{let H=v.headers.get("authorization"),R=`Bearer ${e.metricsToken}`,P=Buffer.from(H??""),L=Buffer.from(R);if(P.length!==L.length||!Ane(P,L))return new Response(null,{status:401});let K=e.coordHealthy?.()===!1;return new Response(d.scrape(u.localCounts?.()??new Map,x.stats(),K,e.coordFaults?.()??0),{headers:{"content-type":"text/plain; version=0.0.4; charset=utf-8"}})})).use(EU({store:e.store,snapshots:p,adapters:a,http:s,now:t,rand:i,refresh:g,requestId:c,rateLimiter:l,logger:o,coord:n,loadRegistry:u,bodyLoggingAllowed:e.bodyLoggingAllowed===!0,...e.emit===void 0?{}:{emit:e.emit},...d===void 0?{}:{telemetry:d},broadcaster:w})).use(zM({store:e.store,admin:m,baseUrl:e.baseUrl,bodyLoggingAllowed:e.bodyLoggingAllowed===!0,...e.dayOffsetMinutes===void 0?{}:{dayOffsetMinutes:e.dayOffsetMinutes},now:t,sessionTtlMs:Xk,logger:o,broadcaster:w,nodeId:r,consoleFleet:F,...e.quota===void 0?{}:{quota:e.quota},...e.console===void 0?{}:{console:e.console}})).use(qM({store:e.store,admin:m,sessionTtlMs:Xk,baseUrl:e.baseUrl,...e.dayOffsetMinutes===void 0?{}:{dayOffsetMinutes:e.dayOffsetMinutes},now:t,logger:o})).use(GM({store:e.store,...e.mode===void 0?{}:{mode:e.mode},...e.reapplyPluginSchema===void 0?{}:{reapplyPluginSchema:e.reapplyPluginSchema},admin:m,latch:b,snapshots:p,broadcaster:w,fs:e.databaseFs??Sd(),now:t,logger:o,lifecycle:e.lifecycle??Pne()})).use(HM({store:e.store,admin:m,providers:Lr,http:s,now:t,logger:o,coord:n})).use($M({admin:m,plugins:e.plugins??[],logger:o})).use(FM({admin:m,plugins:e.pluginUi??[],logger:o})).use(TU({admin:m,registry:x,broadcaster:w,ring:_,channels:S,logger:o})).get("/*",({path:v,request:H,set:R})=>{let P=new URL(H.url).pathname,L=()=>(R.status=404,{error:{code:"NOT_FOUND",message:`no route for ${v}`}});if(!y||/%2f|%5c/i.test(P))return L();let K;try{K=decodeURIComponent(P)}catch{return L()}if(["/api","/v1"].some((Q)=>K===Q||K.startsWith(`${Q}/`)))return L();let Se=Zk(y,`.${K==="/"?"/index.html":K}`);if(Se!==y&&!Se.startsWith(`${y}${OU}`))return L();let V;try{V=CU(Se)}catch{}if(V&&V!==y&&!V.startsWith(`${y}${OU}`))return L();let re=V?Bun.file(V):void 0;if(re&&re.size>0&&V){let Q=K.startsWith("/assets/")?"public, max-age=31536000, immutable":"no-cache";return new Response(re,{headers:{"cache-control":Q,"content-type":V.endsWith(".html")?"text/html":re.type}})}let Ne=H.headers.get("accept")?.includes("text/html")??!1;if(K.startsWith("/assets/")||!Ne)return L();let Je=Zk(y,"index.html"),at=Bun.file(Je);if(at.size===0)return L();return new Response(at,{headers:{"cache-control":"no-cache","content-type":"text/html"}})})}var{RedisClient:LU}=globalThis.Bun;var Qk="omni:",mh=`${Qk}pubsub`,Nne=50,Lne=30000,DU=2000,Dne=1000,$ne="coord:reconnected",MU=`
2237
2237
  redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', tonumber(ARGV[1]) - tonumber(ARGV[2]))
2238
2238
  local used = redis.call('ZCARD', KEYS[1])
2239
2239
  local oldest = redis.call('ZRANGE', KEYS[1], 0, 0, 'WITHSCORES')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnigateway",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "Self-hosted AI gateway with Anthropic- and OpenAI-compatible APIs, an admin console, and a CLI",
5
5
  "license": "MIT",
6
6
  "author": "Harismawan <mail@harismawan.com>",
@@ -1,4 +1,4 @@
1
- import{w as e}from"./Rack-DMrfn4-H.js";import{jsx as t}from"react/jsx-runtime";import n from"styled-components";var r={neutral:{fg:`var(--ink-dim)`,bg:`transparent`},ok:{fg:`var(--ok)`,bg:`var(--ok-wash)`},warn:{fg:`var(--warn)`,bg:`var(--warn-wash)`},down:{fg:`var(--down)`,bg:`var(--down-wash)`},accent:{fg:`var(--accent)`,bg:`var(--accent-wash)`}},i=n.span`
1
+ import{T as e}from"./Rack-1lijWt5h.js";import{jsx as t}from"react/jsx-runtime";import n from"styled-components";var r={neutral:{fg:`var(--ink-dim)`,bg:`transparent`},ok:{fg:`var(--ok)`,bg:`var(--ok-wash)`},warn:{fg:`var(--warn)`,bg:`var(--warn-wash)`},down:{fg:`var(--down)`,bg:`var(--down-wash)`},accent:{fg:`var(--accent)`,bg:`var(--accent-wash)`}},i=n.span`
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  line-height: 1;
@@ -0,0 +1,27 @@
1
+ import{A as e,T as t}from"./Panel-CsovmtxF.js";import{j as n}from"./Rack-1lijWt5h.js";import{l as r}from"./Select-C0c13SKD.js";import{useCallback as i,useEffect as a,useRef as o,useState as s}from"react";import{jsx as c,jsxs as l}from"react/jsx-runtime";import u from"styled-components";var d={name:`copy`,size:24,node:[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]};d.node;var f=n(d);function p(e){if(e===null||typeof getSelection!=`function`)return!1;let t=getSelection();if(t===null)return!1;try{let n=document.createRange();return n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n),!0}catch{return!1}}async function m(e,t){if(typeof navigator<`u`&&navigator.clipboard!==void 0)try{return await navigator.clipboard.writeText(e),`copied`}catch{}let n=p(t??null);if(n&&typeof document.execCommand==`function`)try{if(document.execCommand(`copy`))return`copied`}catch{}return n?`selected`:`failed`}var h=u.div`
2
+ display: flex;
3
+ align-items: stretch;
4
+ gap: 0;
5
+ border: 1px solid ${({theme:e})=>e.color.ruleStrong};
6
+ border-radius: ${({theme:e})=>e.radius.control};
7
+ background: ${({theme:e})=>e.color.panelSunk};
8
+ overflow: hidden;
9
+ `,g=u.code`
10
+ flex: 1;
11
+ min-width: 0;
12
+ padding: 7px 8px;
13
+ font-family: ${({theme:e})=>e.font.mono};
14
+ font-size: 12px;
15
+ word-break: break-all;
16
+ user-select: all;
17
+ `,_=u(e)`
18
+ border: 0;
19
+ border-left: 1px solid ${({theme:e})=>e.color.ruleStrong};
20
+ border-radius: 0;
21
+ height: auto;
22
+ width: 32px;
23
+ flex: none;
24
+ `,v=u.p`
25
+ font-size: 11px;
26
+ color: ${({theme:e})=>e.color.warn};
27
+ `,y={selected:`Your browser would not copy it. The value is selected — copy it with your keyboard.`,failed:`Your browser would not copy it. Select the value and copy it by hand.`};function b({value:e,label:n}){let[u,d]=s(null),p=o(null);a(()=>{if(u!==`copied`)return;let e=setTimeout(()=>d(null),1600);return()=>clearTimeout(e)},[u]);let b=i(()=>{m(e,p.current).then(d)},[e]),x=u===`copied`,S=u===null?void 0:y[u];return l(t,{$gap:1,children:[l(h,{children:[c(g,{ref:p,children:e}),c(_,{type:`button`,$variant:`ghost`,onClick:b,"aria-label":x?`Copied`:n,title:x?`Copied`:n,children:c(x?r:f,{})})]}),S===void 0?null:c(v,{role:`status`,children:S})]})}export{b as t};
@@ -43,41 +43,18 @@ import{y as e}from"./Panel-CsovmtxF.js";import{useId as t}from"react";import{jsx
43
43
  &:disabled {
44
44
  opacity: 0.5;
45
45
  }
46
- `,c=i.select`
47
- ${a}
48
- appearance: none;
49
- height: 30px;
50
- padding: 0 26px 0 8px;
51
- background-color: ${({theme:e})=>e.color.panelSunk};
52
- background-image:
53
- linear-gradient(45deg, transparent 50%, ${({theme:e})=>e.color.inkDim} 50%),
54
- linear-gradient(135deg, ${({theme:e})=>e.color.inkDim} 50%, transparent 50%);
55
- background-position:
56
- calc(100% - 15px) 50%,
57
- calc(100% - 10px) 50%;
58
- background-size: 5px 5px;
59
- background-repeat: no-repeat;
60
- border: 1px solid ${({theme:e})=>e.color.ruleStrong};
61
- color: ${({theme:e})=>e.color.ink};
62
- font-family: ${({theme:e})=>e.font.mono};
63
- font-size: 12px;
64
- cursor: pointer;
65
-
66
- &:hover:not(:disabled) {
67
- border-color: ${({theme:e})=>e.color.accent};
68
- }
69
- `,l=i.div`
46
+ `,c=i.div`
70
47
  display: flex;
71
48
  flex-direction: column;
72
49
  gap: 4px;
73
50
  min-width: 0;
74
- `,u=i.p`
51
+ `,l=i.p`
75
52
  font-size: 11px;
76
53
  color: ${({theme:e})=>e.color.inkDim};
77
- `,d=i.p`
54
+ `,u=i.p`
78
55
  font-size: 11px;
79
56
  color: ${({theme:e})=>e.color.down};
80
- `;function f({label:i,hint:a,problem:o,children:s}){let c=t(),f=o===void 0?a===void 0?void 0:`${c}-hint`:`${c}-problem`;return r(l,{children:[n(e,{as:`label`,htmlFor:c,children:i}),s({id:c,"aria-describedby":f}),o===void 0?a===void 0?null:n(u,{id:`${c}-hint`,children:a}):n(d,{id:`${c}-problem`,children:o})]})}var p=i(o).attrs({type:`number`,inputMode:`decimal`})`
57
+ `;function d({label:i,hint:a,problem:o,children:s}){let d=t(),f=o===void 0?a===void 0?void 0:`${d}-hint`:`${d}-problem`;return r(c,{children:[n(e,{as:`label`,htmlFor:d,children:i}),s({id:d,"aria-describedby":f}),o===void 0?a===void 0?null:n(l,{id:`${d}-hint`,children:a}):n(u,{id:`${d}-problem`,children:o})]})}var f=i(o).attrs({type:`number`,inputMode:`decimal`})`
81
58
  text-align: right;
82
59
  padding-right: 6px;
83
- `;export{s as a,c as i,o as n,p as r,f as t};
60
+ `;export{s as i,o as n,f as r,d as t};