diff --git a/docs/advanced/resilience.mdx b/docs/advanced/resilience.mdx index fd4a10ac3..61551254e 100644 --- a/docs/advanced/resilience.mdx +++ b/docs/advanced/resilience.mdx @@ -189,16 +189,23 @@ Model discovery is re-checked: ## What happens while a provider is down -When a provider's refresh fails, its previously discovered models are kept -and marked stale, and the dashboard shows the provider as Degraded -("previous inventory is still available"): - -- **Direct requests** to its models still resolve and are sent to the - provider, so callers get an honest `502`/`503` (and manual failover rules - can fire) instead of a misleading "model not found". +When a provider's refresh fails, its previously discovered models are marked +stale, and the dashboard shows the provider as Offline: + +- **Model listings** (`GET /v1/models` and the dashboard model list) hide the + provider's models until it recovers, so clients are not offered models that + cannot currently be served. +- **Direct requests** to its models (`provider/model`) still resolve and are + sent to the provider, so callers get an honest `502`/`503` (and manual + failover rules can fire) instead of a misleading "model not found". - **Virtual-model redirects** skip the provider's targets, so a load-balanced redirect keeps working through its healthy targets. +Exception: when **every** provider is failing at once (for example, a +control-plane-only outage where model discovery is unreachable but inference +still works), the previous inventory is kept as-is and stays listed — hiding +everything would only turn provider errors into "model not found". + The fast recheck loop re-probes the provider every `PROVIDER_RECHECK_INTERVAL` seconds, updating "Last checked" and restoring normal routing typically within a minute of the provider coming back. A diff --git a/docs/providers/overview.mdx b/docs/providers/overview.mdx index 7c776240f..684c3b3ae 100644 --- a/docs/providers/overview.mdx +++ b/docs/providers/overview.mdx @@ -255,9 +255,10 @@ classification reason and the most recent error. | `Healthy` | Model discovery succeeded and recent traffic (if any) looks fine | | `Starting` | Configured and awaiting first model discovery | | `Configured` | Configured but no models exposed yet | -| `Degraded` | The latest refresh failed (previous inventory still serves), **or** a specific model's recent requests keep failing | +| `Degraded` | A specific model's recent requests keep failing, **or** every provider is failing at once and the previous inventory still serves | | `Recovering` | The circuit breaker is half-open and probing whether the provider recovered | | `Circuit Open` | The circuit breaker is open; traffic to the provider is paused | +| `Offline` | The latest refresh or availability check failed; the provider's models are hidden from the model list until it recovers | | `Unhealthy` | Model discovery failed and no models are available | Expand a card (the arrow strip at the bottom, or the section-wide diff --git a/internal/admin/dashboard/static/dist/assets/index-nIAZ31DK.js b/internal/admin/dashboard/static/dist/assets/index-Bdgi3WYu.js similarity index 97% rename from internal/admin/dashboard/static/dist/assets/index-nIAZ31DK.js rename to internal/admin/dashboard/static/dist/assets/index-Bdgi3WYu.js index e2e84f3ea..cf0760793 100644 --- a/internal/admin/dashboard/static/dist/assets/index-nIAZ31DK.js +++ b/internal/admin/dashboard/static/dist/assets/index-Bdgi3WYu.js @@ -9,7 +9,7 @@ `)}function O4(e){let t=e&&e.request_health;return t&&typeof t==`object`?t:null}function k4(e){let t=O4(e);return t?String(t.circuit_state||``).trim():``}function zPe(e){let t=k4(e);return t?t.charAt(0).toUpperCase()+t.slice(1):``}function BPe(e){let t=k4(e);return t===`open`?`is-unhealthy`:t===`half-open`?`is-degraded`:`is-healthy`}function VPe(e){let t=O4(e);if(!t)return``;let n=Number(t.requests||0),r=Number(t.errors||0),i=Math.round(Number(t.window_seconds||0)/60),a=i>0?`last `+i+` min`:`recent`;return String(n)+` request`+(n===1?``:`s`)+` · `+String(r)+` error`+(r===1?``:`s`)+` (`+a+`)`}function A4(e){let t=O4(e);return t&&Array.isArray(t.models)?t.models:[]}function HPe(e){return e?String(Number(e.errors||0))+`/`+String(Number(e.requests||0))+` failed`:``}function UPe(e){let t=e&&e.last_error;return!t||!t.message?``:(t.status_code?`HTTP `+String(t.status_code)+`: `:``)+t.message}function j4(){return{name:``,slug:``,url:``,transport:`http`,description:``,enabled:!0,headers:[],allowed_tools:``,disallowed_tools:``,user_paths:``,tool_timeout_seconds:``}}function M4(){return{server:``,status:``,instructions:``,tools:[],prompts:[],resources:[],templates:[]}}function N4(e){return String(e&&(e.slug||e.name)||``).trim()}function P4(e){return String(e&&e.status||``).trim()||`connecting`}function WPe(e){let t={connected:gTe,degraded:yTe,connecting:STe,disabled:TTe},n=P4(e);return t[n]?.()||n}function F4(e){switch(P4(e)){case`connected`:return`status-success`;case`degraded`:return String(e&&e.last_error||``).trim()?`status-error`:`status-warning`;case`connecting`:return`status-neutral`;default:return`status-unknown`}}function GPe(e,t){let n=P4(e),r=String(e&&e.last_error||``).trim();return r&&n!==`connected`?r:n===`connected`&&e&&e.connected_at?FV({date:(typeof t==`function`?t:String)(e.connected_at)}):``}function I4(e){return String(e&&e.transport||``)===`stdio`?RV():String(e&&e.url||``).trim()||`—`}function KPe(e){return VV({prompts:Number(e&&e.prompt_count||0),resources:Number(e&&e.resource_count||0)})}function L4(e){let t=String(e||``).normalize(`NFKD`).toLowerCase(),n=t.replace(/[\u0300-\u036f]/g,``).replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,64).replace(/-+$/g,``);if(n)return n;let r=2166136261;for(let e of t)r=Math.imul((r^e.codePointAt(0))>>>0,16777619)>>>0;return`mcp-`+r.toString(16).padStart(8,`0`)}function qPe(e){return String(e||``).split(` `).map(e=>e.trim()).filter(e=>e)}function JPe(e){return!e||typeof e!=`object`||Array.isArray(e)?[]:Object.keys(e).sort().map(t=>({name:t,value:String(e[t]||``)}))}function YPe(e){let t={};return(Array.isArray(e)?e:[]).forEach(e=>{let n=String(e&&e.name||``).trim();n&&(t[n]=String(e&&e.value||``))}),t}function XPe(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.slug,e.url,e.transport,e.description,e.status].some(e=>String(e||``).toLowerCase().includes(r)))}function ZPe(e){return{name:String(e.name||``).trim(),slug:N4(e),url:String(e.url||``).trim(),transport:e.transport===`sse`?`sse`:`http`,description:String(e.description||``).trim(),enabled:e.enabled!==!1,headers:JPe(e.headers),allowed_tools:(Array.isArray(e.allowed_tools)?e.allowed_tools:[]).join(`, `),disallowed_tools:(Array.isArray(e.disallowed_tools)?e.disallowed_tools:[]).join(`, `),user_paths:(Array.isArray(e.user_paths)?e.user_paths:[]).join(` -`),tool_timeout_seconds:e.tool_timeout_seconds?String(e.tool_timeout_seconds):``}}function QPe(e,t,n){let r=String(e.name||``).trim(),i=String(e.slug||L4(r)).trim().toLowerCase(),a=String(e.url||``).trim(),o=e.transport===`sse`?`sse`:`http`;if(!r)return{error:WV()};if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(i))return{error:qV()};if(t===`create`&&(n||[]).some(e=>N4(e)===i))return{error:XV({slug:i})};if(!a)return{error:$V()};let s,c=String(e.tool_timeout_seconds||``).trim();if(c!==``){let e=Number(c);if(!Number.isSafeInteger(e)||e<0)return{error:nH()};s=e}return{payload:{name:r,slug:i,url:a,transport:o,headers:YPe(e.headers),description:String(e.description||``).trim(),enabled:!!e.enabled,allowed_tools:iZ(e.allowed_tools),disallowed_tools:iZ(e.disallowed_tools),user_paths:qPe(e.user_paths),tool_timeout_seconds:s}}}function $Pe(e,t){let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{},r=e=>(Array.isArray(e)?e:[]).filter(e=>e&&typeof e==`object`);return{server:String(n.server||e||``).trim(),status:String(n.status||``).trim(),instructions:String(n.instructions||``).trim(),tools:r(n.tools),prompts:r(n.prompts),resources:r(n.resources),templates:r(n.templates)}}function eFe(e,t){return String(e&&e.server||``)+`_`+String(t||``)}function R4(e){let t=e||M4(),n=(e,t)=>{let n=String(e||``).trim(),r=String(t||``).trim();return n&&r?n+` — `+r:r||n},r=e=>n=>({key:e+`:`+String(n.name||``),name:String(n.name||``),aggregated:eFe(t,n.name),description:String(n.description||``).trim()});return[{key:`tools`,title:aH(),items:(t.tools||[]).map(r(`tool`))},{key:`prompts`,title:cH(),items:(t.prompts||[]).map(r(`prompt`))},{key:`resources`,title:dH(),items:(t.resources||[]).map(e=>({key:`resource:`+String(e.uri||``),name:String(e.uri||``),aggregated:``,description:n(e.name,e.description)}))},{key:`templates`,title:mH(),items:(t.templates||[]).map(e=>({key:`template:`+String(e.uri_template||``),name:String(e.uri_template||``),aggregated:``,description:n(e.name,e.description)}))}].filter(e=>e.items.length>0)}function tFe(e){return R4(e).length===0}function z4(e){return(e||[]).length}function B4(e){return(e||[]).filter(e=>P4(e)===`connected`).length}function V4(e){return(e||[]).filter(e=>e&&e.enabled!==!1&&P4(e)===`degraded`).length}function nFe(e,t){return!!e&&z4(t)>0}function rFe(e){return String(B4(e))+`/`+String(z4(e))}function iFe(e){return V4(e)>0?`is-degraded`:`is-healthy`}function aFe(e){let t=V4(e);if(t>0)return Su({count:t});let n=z4(e),r=B4(e);return n>0&&r===n?yc():Tu({connected:r,total:n})}function H4(){return{interval:`day`,buckets:[],summary:{requests:0},provider_latency:[]}}function oFe(e){let t=e&&typeof e==`object`?e:{};return{interval:t.interval===`hour`?`hour`:`day`,buckets:Array.isArray(t.buckets)?t.buckets:[],summary:t.summary&&typeof t.summary==`object`?t.summary:{requests:0},provider_latency:Array.isArray(t.provider_latency)?t.provider_latency:[]}}function sFe(e){return Number(e&&e.summary&&e.summary.requests||0)>0}function cFe(e){return(e&&Array.isArray(e.provider_latency)?e.provider_latency:[]).length>0}function lFe(e){let t=e&&e.summary?e.summary.success_rate:null;return t==null?`—`:(Math.round(Number(t)*1e3)/10).toFixed(1)+`%`}function U4(e,t){return Number(e&&e.summary&&e.summary[t]||0)}function W4(e){let t=Number(e);return Number.isFinite(t)?t>=6e4?(t/6e4).toFixed(1)+` min`:t>=1e3?(t/1e3).toFixed(2)+` s`:Math.round(t)+` ms`:`-`}function uFe(e){let t=e&&e.summary?e.summary.avg_duration_ms:null;return t==null?`—`:W4(Number(t))}function G4(e,t){try{let n={},r=q();return new Intl.DateTimeFormat(r,{timeZone:t,year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,hourCycle:`h23`}).formatToParts(e).forEach(e=>{n[e.type]=e.value}),{year:n.year,month:n.month,day:n.day,hour:Number(n.hour),shortDate:new Intl.DateTimeFormat(r,{timeZone:t,month:`short`,day:`numeric`}).format(e),fullDate:new Intl.DateTimeFormat(r,{timeZone:t,year:`numeric`,month:`short`,day:`numeric`}).format(e)}}catch{let t=new Intl.DateTimeFormat(q(),{month:`short`}).format(e);return{year:String(e.getFullYear()),month:t,day:String(e.getDate()),hour:e.getHours(),shortDate:t+` `+e.getDate(),fullDate:t+` `+e.getDate()+`, `+e.getFullYear()}}}function K4(e,t,n){let r=new Date(e.start);if(Number.isNaN(r.getTime()))return String(e.start||``);let i=G4(r,n),a=i.shortDate;return t!==`hour`||i.hour===0?a:String(i.hour).padStart(2,`0`)+`:00`}function q4(e,t,n,r){let i=new Date(e.start);return Number.isNaN(i.getTime())?String(e.start||``):t===`hour`?r(e.start):G4(i,n).fullDate}function dFe(e){return{ok:e(`var(--success)`),clientError:e(`var(--warning)`),serverError:e(`var(--danger)`),other:e(`color-mix(in srgb, var(--text-muted) 55%, transparent)`)}}function fFe(e,t,n={}){let r=n.interval===`hour`?`hour`:`day`,i=n.zone,a=n.resolve||(e=>e),o=n.formatTimestamp||(e=>String(e)),s=t.map(e=>K4(e,r,i)),c=dFe(a),l=a(`var(--bg-surface)`),u=e=>Number(e)||0,d=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderColor:l,borderWidth:1,borderSkipped:!1,borderRadius:2,maxBarThickness:28}),f=[d(`2xx`,t.map(e=>u(e.status_2xx)),c.ok),d(`4xx`,t.map(e=>u(e.status_4xx)),c.clientError),d(`5xx`,t.map(e=>u(e.status_5xx)),c.serverError)];return t.some(e=>u(e.status_other)>0)&&f.push(d(Uu(),t.map(e=>u(e.status_other)),c.other)),{type:`bar`,data:{labels:s,datasets:f},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Z2(e,{title:e=>e.length?q4(t[e[0].dataIndex],r,i,o):``,label:e=>e.dataset.label+`: `+xZ(e.parsed.y),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),su({total:xZ(t)})}})},scales:{x:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:X2(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),precision:0,callback:e=>uZ(e)}}}}}}function J4(e=YNe()){let t={};return function(n){return n in t||(t[n]=e[Object.keys(t).length%e.length]),t[n]}}function pFe(e,t,n,r={}){let i=r.interval===`hour`?`hour`:`day`,a=r.zone,o=r.formatTimestamp||(e=>String(e)),s=r.providerColor||J4();return{type:`line`,data:{labels:t.map(e=>K4(e,i,a)),datasets:n.map(e=>({label:e.provider,data:(e.avg_duration_ms||[]).map(e=>e==null?null:Number(e)),borderColor:s(e.provider),backgroundColor:s(e.provider),fill:!1,tension:.3,borderWidth:2,pointRadius:0,pointHoverRadius:4,spanGaps:i===`hour`&&2}))},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Z2(e,{title:e=>e.length?q4(t[e[0].dataIndex],i,a,o):``,label:e=>{let t=(n[e.datasetIndex]&&n[e.datasetIndex].requests||[])[e.dataIndex],r=Number(t)||0;return e.dataset.label+`: `+W4(e.parsed.y)+(r>0?` (`+r.toLocaleString()+` req)`:``)}})},scales:{x:{grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),callback:e=>W4(e)}}}}}}var mFe=class{#e=A(Xt(C4()));get status(){return I(this.#e)}set status(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return I(this.#t)}set loading(e){j(this.#t,e,!0)}#n=A(!1);get loadedOnce(){return I(this.#n)}set loadedOnce(e){j(this.#n,e,!0)}#r=A(!1);get detailsExpanded(){return I(this.#r)}set detailsExpanded(e){j(this.#r,e,!0)}#i=A(Xt({}));get cardOverrides(){return I(this.#i)}set cardOverrides(e){j(this.#i,e,!0)}#a=null;#o=null;#s=!1;initPreferences(){if(this.#s)return;this.#s=!0;let e=wPe(Ui());this.detailsExpanded=e.detailsExpanded,this.cardOverrides=e.cardOverrides}cardExpanded(e){return EPe(this.cardOverrides,this.detailsExpanded,e)}toggleCard(e){let t=e&&e.name?String(e.name):``;if(!t)return;let n={...this.cardOverrides};n[t]=!this.cardExpanded(e),this.cardOverrides=n,w4(Ui(),this.cardOverrides)}toggleDetails(){this.detailsExpanded=!this.detailsExpanded,this.cardOverrides={},TPe(Ui(),this.detailsExpanded),w4(Ui(),this.cardOverrides)}detailsToggleLabel(){return this.detailsExpanded?us():ss()}async fetch(){this.initPreferences(),this.#a&&this.#a.abort();let e=new AbortController;this.#a=e,this.loading=!0;try{let t=await WX(`/admin/providers/status`,{label:`provider status`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.status=C4(),this.#l();return}let n=t.data&&typeof t.data==`object`?t.data:C4();n.summary||=C4().summary,Array.isArray(n.providers)||(n.providers=[]),this.status=n,this.#c()}catch(e){if(KX(e))return;console.error(`Failed to fetch provider status:`,e),this.status=C4(),this.#l()}finally{this.#a===e&&(this.#a=null,this.loading=!1,this.loadedOnce=!0)}}#c(){this.#l(),MPe(this.status.providers)&&(this.#o=setTimeout(()=>{this.#o=null,this.fetch()},xPe))}#l(){this.#o&&=(clearTimeout(this.#o),null)}stopPolling(){this.#l()}},hFe=class{#e=A(Xt(H4()));get stats(){return I(this.#e)}set stats(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return I(this.#t)}set loading(e){j(this.#t,e,!0)}#n=0;async fetch(){let e=++this.#n;this.loading=!0;try{let t=await WX(`/admin/audit/stats?`+TZ.queryStr(),{label:`audit stats`});if(t.stale||e!==this.#n)return;if(!t.ok){this.stats=H4();return}this.stats=oFe(t.data)}catch(t){if(console.error(`Failed to fetch audit stats:`,t),e!==this.#n)return;this.stats=H4()}finally{e===this.#n&&(this.loading=!1)}}},gFe=class{#e=A(Xt([]));get servers(){return I(this.#e)}set servers(e){j(this.#e,e,!0)}#t=A(!1);get available(){return I(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return I(this.#n)}set loading(e){j(this.#n,e,!0)}async fetch(){if(await qX.ensureLoaded(),!qX.mcpVisible()){this.available=!1,this.servers=[];return}this.loading=!0;try{let e=await WX(`/admin/mcp-servers`,{label:`mcp servers`});if(e.stale)return;if(e.status===503||e.status===404){this.available=!1,this.servers=[];return}if(this.available=!0,!e.ok){this.servers=[];return}this.servers=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch MCP servers:`,e),this.servers=[]}finally{this.loading=!1}}},_Fe=class{#e=A(Xt([]));get data(){return I(this.#e)}set data(e){j(this.#e,e,!0)}#t=A(`tokens`);get mode(){return I(this.#t)}set mode(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return I(this.#n)}set loading(e){j(this.#n,e,!0)}#r=null;async fetch(){this.#r&&this.#r.abort();let e=new AbortController;this.#r=e,this.loading=!0;try{let t=await WX(`/admin/usage/daily?days=365&interval=daily`,{label:`calendar`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.data=[];return}this.data=Array.isArray(t.data)?t.data:[]}catch(e){if(KX(e))return;console.error(`Failed to fetch calendar data:`,e),this.data=[]}finally{this.#r===e&&(this.#r=null,this.loading=!1)}}},Y4=new mFe,X4=new hFe,Z4=new gFe,Q4=new _Fe,$4=(e,t=f,n=f,r=f,i=f,a=f)=>{var o=yFe(),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=M(l),d=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},p=e=>{var t=vFe(),a=N(t),o=M(a),s=M(o,!0);E(o),He(),E(a);var c=P(a,4),l=M(c),u=M(l,!0);E(l),He(),E(c);var d=P(c,4),f=M(d,!0);E(d),F((e,t,n,r,i,o)=>{W(a,`title`,e),B(s,t),W(c,`title`,n),B(u,r),W(d,`title`,i),B(f,o)},[()=>dZ(Fpe(),n()),()=>uZ(n()),()=>dZ(Rpe(),r()),()=>uZ(r()),()=>dZ(Gpe(),i()),()=>uZ(i())]),z(e,t)};V(u,e=>{a()?e(d):e(p,-1)}),E(l),E(o),F(()=>B(c,t())),z(e,o)},e3=(e,t=f,n=f,r=f,i=f,a=f,o=f)=>{var s=SFe(),c=M(s),l=M(c,!0);E(c);var u=P(c,2),d=M(u,!0);E(u);var p=P(u,2),m=e=>{var t=bFe(),n=M(t,!0);E(t),F(()=>{W(t,`aria-label`,o().title),W(t,`title`,o().title),B(n,a())}),L(`click`,t,function(...e){o().onclick?.apply(this,e)}),z(e,t)},h=e=>{var t=xFe(),n=M(t,!0);E(t),F(()=>B(n,a())),z(e,t)};V(p,e=>{o()?e(m):e(h,-1)}),E(s),F(()=>{U(s,1,`card provider-status-flag ${t()??``} ${n()??``}`,`svelte-6tr9cf`),B(l,r()),B(d,i())}),z(e,s)},vFe=R(` i + o = `,1),yFe=R(`
`),bFe=R(``),xFe=R(` `),SFe=R(`
`),CFe=R(`
`),wFe=R(`
`),TFe=R(``),EFe=R(`
`);function DFe(e,t){D(t,!0);let n=k(()=>AZ.summary),r=k(()=>AZ.cacheOverview),i=k(()=>AZ.cacheAnalyticsEnabled()),a=k(()=>Y4.status.summary),o=k(()=>AZ.loading),s=k(()=>AZ.cacheLoading),c=k(()=>I(o)||I(i)&&I(s));function l(){let e=document.getElementById(`provider-status-section`);e&&(e.scrollIntoView({behavior:`smooth`,block:`start`}),e.focus({preventScroll:!0}))}var u=EFe(),d=M(u);{let e=k(()=>Jo()),t=k(()=>lPe(I(n)));$4(d,()=>I(e),()=>I(n).total_input_tokens,()=>I(n).total_output_tokens,()=>I(t),()=>I(o))}var f=P(d,2),p=M(f),m=M(p,!0);E(p);var h=P(p,2),g=M(h),_=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},v=e=>{var t=Or();F(e=>B(t,e),[()=>oZ(m4(I(n),I(r),I(i)))]),z(e,t)};V(g,e=>{I(c)?e(_):e(v,-1)}),E(h),E(f);var y=P(f,2),b=e=>{var t=CFe(),n=M(t),i=M(n,!0);E(n);var a=P(n,2),o=M(a),c=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},l=e=>{var t=Or();F(e=>B(t,e),[()=>oZ(I(r).summary.total_hits)]),z(e,t)};V(o,e=>{I(s)?e(c):e(l,-1)}),E(a),E(t),F(e=>B(i,e),[()=>Qo()]),z(e,t)};V(y,e=>{I(i)&&e(b)});var x=P(y,2),S=M(x),C=M(S,!0);E(S);var w=P(S,2),T=M(w),ee=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},te=e=>{var t=Or();F(e=>B(t,e),[()=>sZ(I(n).total_cost)]),z(e,t)};V(T,e=>{I(o)?e(ee):e(te,-1)}),E(w),E(x);var ne=P(x,2),re=e=>{{let t=k(()=>eme()),n=k(()=>dPe(I(r)));$4(e,()=>I(t),()=>I(r).summary.total_input_tokens,()=>I(r).summary.total_output_tokens,()=>I(n),()=>I(s))}};V(ne,e=>{I(i)&&e(re)});var ie=P(ne,2),ae=M(ie),oe=M(ae,!0);E(ae);var se=P(ae,2),ce=e=>{var t=wFe(),n=M(t);{let e=k(()=>bo());f4(n,{size:18,get label(){return I(e)}})}E(t),z(e,t)},le=e=>{var t=TFe(),r=M(t);K2(r,{build:()=>bPe(y4(I(n)),Q2(`var(--token-prompt)`),Q2(`var(--bg-surface-hover)`))});var i=P(r,2),a=M(i,!0);E(i),E(t),F((e,n)=>{W(t,`aria-label`,e),B(a,n)},[()=>lme({rate:b4(I(n))}),()=>b4(I(n))]),z(e,t)};V(se,e=>{I(o)?e(ce):e(le,-1)}),E(ie);var ue=P(ie,2),de=e=>{{let t=k(()=>DPe(I(a))),n=k(()=>fme()),r=k(()=>kPe(I(a))),i=k(()=>jPe(I(a))),o=k(()=>APe(I(a))?{title:hme(),onclick:l}:null);e3(e,()=>`provider-status-overview-card`,()=>I(t),()=>I(n),()=>I(r),()=>I(i),()=>I(o))}};V(ue,e=>{I(a).total>0&&e(de)});var fe=P(ue,2),pe=e=>{{let t=k(()=>iFe(Z4.servers)),n=k(()=>po()),r=k(()=>rFe(Z4.servers)),i=k(()=>aFe(Z4.servers)),a=k(()=>({title:vme(),onclick:()=>bX.navigate(`mcp-servers`)}));e3(e,()=>`mcp-servers-flag`,()=>I(t),()=>I(n),()=>I(r),()=>I(i),()=>I(a))}},me=k(()=>nFe(Z4.available,Z4.servers));V(fe,e=>{I(me)&&e(pe)}),E(u),F((e,t,n,r,i)=>{B(m,e),W(h,`title`,t),B(C,n),W(ie,`title`,r),B(oe,i)},[()=>Zo(),()=>uPe(I(n),I(r),I(i)),()=>$o(),()=>ome(),()=>rme()]),z(e,u),O()}Sr([`click`]);var OFe=R(` `),kFe=R(`
`),AFe=R(` `),jFe=R(`
`),MFe=R(`

`);function NFe(e,t){D(t,!0);let n=k(()=>AZ.cacheAnalyticsEnabled()),r=k(()=>g4(AZ.summary,AZ.cacheOverview,I(n))),i=k(()=>mPe(AZ.summary,AZ.cacheOverview,I(n))),a=k(()=>pPe(AZ.summary,AZ.cacheOverview,I(n))),o=k(()=>!I(a)&&(AZ.loading||AZ.cacheLoading));var s=MFe(),c=M(s),l=M(c),u=M(l,!0);E(l);var d=P(l,2),f=M(d,!0);E(d),E(c);var p=P(c,2);let m;var h=M(p);H(h,17,()=>I(i),e=>e.key,(e,t)=>{var n=kFe(),r=M(n),i=e=>{var n=OFe(),r=M(n);E(n),F(()=>B(r,`${I(t).pct??``}%`)),z(e,n)};V(r,e=>{I(t).pct>=8&&e(i)}),E(n),F(e=>{mi(n,`width: ${I(t).pct??``}%; background: var(${I(t).colorVar??``})`),W(n,`title`,e)},[()=>_4(I(t))]),z(e,n)});var g=P(h,2),_=e=>{{let t=k(()=>bo());f4(e,{size:16,get label(){return I(t)}})}},v=e=>{var t=AFe(),n=M(t,!0);E(t),F(e=>B(n,e),[()=>Tc()]),z(e,t)};V(g,e=>{I(o)?e(_):I(a)||e(v,1)}),E(p);var y=P(p,2);H(y,21,()=>I(r),e=>e.key,(e,t)=>{var n=jFe(),r=M(n),i=P(r,2),a=M(i,!0);E(i);var o=P(i,2),s=M(o);E(o);var c=P(o,2),l=M(c,!0);E(c),E(n),F((e,i)=>{W(n,`title`,e),mi(r,`background: var(${I(t).colorVar??``})`),B(a,I(t).label),B(s,`${I(t).pct??``}%`),B(l,i)},[()=>_4(I(t)),()=>oZ(I(t).tokens)]),z(e,n)}),E(y),E(s),F((e,t,n)=>{B(u,e),B(f,t),m=U(p,1,`cache-meter-bar svelte-1yzecxj`,null,m,{"is-empty":!I(a)}),W(p,`role`,I(o)?void 0:`img`),W(p,`aria-label`,n)},[()=>Jo(),()=>Sc(),()=>I(o)?void 0:hPe(I(i))]),z(e,s),O()}var PFe=Dr(` `),FFe=Dr(``);function t3(e,t){let n=G(t,`label`,3,`No data`);var r=FFe(),i=P(M(r),9),a=e=>{var t=PFe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)};V(i,e=>{n()&&e(a)}),E(r),F(()=>{W(r,`role`,n()?`img`:void 0),W(r,`aria-label`,n()||void 0),W(r,`aria-hidden`,n()?void 0:`true`)}),z(e,r)}var n3=R(`
`),IFe=R(`

`);function LFe(e,t){D(t,!0);let n=[{value:`daily`,label:zee},{value:`weekly`,label:Hee},{value:`monthly`,label:Gee},{value:`yearly`,label:Jee}];function r(e){TZ.interval=e,t.onintervalchange?.()}function i(){let e=AZ.daily;if(e.length===0)return null;let t=TZ.rangeStart(),n=TZ.rangeEnd(),r=_Pe(v4(e,TZ.interval,t,n),v4(Array.isArray(AZ.cacheOverview.daily)?AZ.cacheOverview.daily:[],TZ.interval,t,n));return yPe(Y2(),r,{cacheEnabled:AZ.cacheAnalyticsEnabled(),resolve:Q2})}var a=IFe(),o=M(a),s=M(o),c=M(s,!0);E(s);var l=P(s,2);{let e=k(()=>Iee()),t=k(()=>n.map(e=>({value:e.value,label:e.label()})));q2(l,{get ariaLabel(){return I(e)},get options(){return I(t)},get value(){return TZ.interval},onchange:r})}E(o);var u=P(o,2),d=M(u);K2(d,{build:i});var f=P(d,2),p=e=>{var t=n3(),n=M(t);{let e=k(()=>bo());f4(n,{size:24,get label(){return I(e)}})}E(t),z(e,t)},m=e=>{var t=n3();t3(M(t),{}),E(t),z(e,t)};V(f,e=>{AZ.daily.length===0&&AZ.loading?e(p):AZ.daily.length===0&&!J.authError&&e(m,1)}),E(u),E(a),F(e=>B(c,e),[()=>TZ.chartTitle()]),z(e,a),O()}var r3=10,RFe=.7;function zFe(e,t){if(e<=0||t<=0)return 0;let n=(e/t)**+RFe,r=Math.ceil(n*r3);return r<1?1:r>r3?r3:r}function BFe(){let e=[];for(let t=0;t<=r3;t++)e.push(t);return e}function VFe(e,t,n){let r={};(e||[]).forEach(e=>{r[e.date]=e});let i=OX(AX(n,-364)),a=i.getUTCDay();i.setUTCDate(i.getUTCDate()-a);let o=[];for(let e=new Date(i);kX(e)<=n;e.setUTCDate(e.getUTCDate()+1)){let n=kX(e),i=r[n],a=0;i&&(a=t===`costs`?i.total_cost==null?0:i.total_cost:i.total_tokens||0),o.push({dateStr:n,value:a,level:0,empty:!1})}let s=0;for(let e=0;es&&(s=o[e].value);for(let e=0;e0){for(;l.length<7;)l.push({dateStr:``,value:0,level:0,empty:!0});c.push(l)}return c}function HFe(e){let t=OX(AX(e,-364)),n=t.getUTCDay();t.setUTCDate(t.getUTCDate()-n);let r=new Intl.DateTimeFormat(q(),{month:`short`,timeZone:`UTC`}),i=[],a={},o=0;for(let n=new Date(t);kX(n)<=e;n.setUTCDate(n.getUTCDate()+7),o++){let t=null;if(o===0)t=new Date(n);else for(let r=0;r<7;r++){let i=new Date(n);if(i.setUTCDate(n.getUTCDate()+r),kX(i)>e)break;if(i.getUTCDate()===1){t=i;break}}if(!t)continue;let s=t.getUTCFullYear()+`-`+t.getUTCMonth();a[s]||(i.push({label:r.format(t),col:o,key:s}),a[s]=!0)}for(let e=0;e `),qFe=R(`
`),JFe=R(`
`),YFe=R(`
`),XFe=R(`
`),ZFe=R(`

`,1);function QFe(e,t){D(t,!0);let n=A(Xt({show:!1,x:0,y:0,text:``})),r=k(()=>zX.currentDateKey()),i=k(()=>VFe(Q4.data,Q4.mode,I(r))),a=k(()=>HFe(I(r)));function o(e,t){t.empty||j(n,{show:!0,x:e.clientX,y:e.clientY,text:GFe(t,Q4.mode)},!0)}function s(){j(n,{show:!1,x:0,y:0,text:``},!0)}var c=ZFe(),l=N(c),u=M(l),d=M(u),f=M(d,!0);E(d);var p=P(d,2),m=e=>{{let t=k(()=>Qc());f4(e,{size:14,get label(){return I(t)}})}};V(p,e=>{Q4.loading&&Q4.data.length===0&&e(m)});var h=P(p,2);{let e=k(()=>tl()),t=k(()=>[{value:`tokens`,label:Jo()},{value:`costs`,label:il()}]);q2(h,{get ariaLabel(){return I(e)},get options(){return I(t)},get value(){return Q4.mode},onchange:e=>Q4.mode=e})}E(u);var g=P(u,2),_=M(g),v=P(M(_),2),y=M(v,!0);E(v);var b=P(v,4),x=M(b,!0);E(b);var S=P(b,4),C=M(S,!0);E(S),He(2),E(_);var w=P(_,2),T=M(w);H(T,21,()=>I(a),e=>e.key,(e,t)=>{var n=KFe(),r=M(n,!0);E(n),F(()=>{mi(n,`grid-column: ${I(t).col+1} / span ${I(t).span??``}`),B(r,I(t).label)}),z(e,n)}),E(T);var ee=P(T,2);H(ee,21,()=>I(i),Ir,(e,t,n)=>{var r=JFe();H(r,23,()=>I(t),(e,t)=>n+`-`+t,(e,t)=>{var n=qFe();F(()=>U(n,1,li([`contribution-calendar-cell`,I(t).empty?`empty`:`level-${I(t).level}`]),`svelte-3hfxuq`)),xr(`mouseenter`,n,e=>o(e,I(t))),xr(`mouseleave`,n,s),z(e,n)}),E(r),z(e,r)}),E(ee),E(w),E(g);var te=P(g,2),ne=M(te),re=M(ne),ie=M(re,!0);E(re),E(ne);var ae=P(ne,2),oe=M(ae),se=M(oe,!0);E(oe);var ce=P(oe,2);H(ce,16,BFe,e=>e,(e,t)=>{var n=YFe();F(()=>U(n,1,`contribution-calendar-cell level-${t??``}`,`svelte-3hfxuq`)),z(e,n)});var le=P(ce,2),ue=M(le,!0);E(le),E(ae),E(te),E(l);var de=P(l,2),fe=e=>{var t=XFe(),r=M(t,!0);E(t),F(()=>{mi(t,`left: ${I(n).x??``}px; top: ${I(n).y-40}px`),B(r,I(n).text)}),z(e,t)};V(de,e=>{I(n).show&&e(fe)}),F((e,t,n,r,i,a,o)=>{B(f,e),B(y,t),B(x,n),B(C,r),B(ie,i),B(se,a),B(ue,o)},[()=>Yc(),()=>sl(),()=>ul(),()=>pl(),()=>UFe(Q4.data,Q4.mode),()=>gl(),()=>yl()]),z(e,c),O()}var $Fe=R(``),eIe=R(`

`),tIe=R(`
`);function i3(e,t){D(t,!0);let n=G(t,`label`,3,`help`),r=G(t,`text`,3,``),i=G(t,`open`,15,!1),a=G(t,`external`,3,!1),o=k(()=>!!r()||!!t.help||a());var s=tIe(),c=M(s),l=M(c);Kr(l,()=>t.title??f);var u=P(l,2),d=e=>{var r=$Fe();let a;F(()=>{a=U(r,1,`inline-help-toggle svelte-y40or3`,null,a,{"is-open":i()}),W(r,`aria-label`,(i()?`Hide `:`Show `)+n()),W(r,`aria-expanded`,i()),W(r,`aria-controls`,t.copyId)}),L(`click`,r,()=>i(!i())),z(e,r)};V(u,e=>{I(o)&&e(d)}),Kr(P(u,2),()=>t.extra??f),E(c);var p=P(c,2),m=e=>{var n=eIe(),i=M(n),a=e=>{var n=kr();Kr(N(n),()=>t.help),z(e,n)},o=e=>{var t=Or();F(()=>B(t,r())),z(e,t)};V(i,e=>{t.help?e(a):e(o,-1)}),E(n),F(()=>W(n,`id`,t.copyId)),z(e,n)};V(p,e=>{i()&&I(o)&&!a()&&e(m)}),E(s),z(e,s),O()}Sr([`click`]);var nIe=R(`
`);function a3(e,t){let n=G(t,`label`,3,`Loading...`),r=G(t,`class`,3,``);var i=nIe(),a=P(M(i),2),o=M(a,!0);E(a),E(i),F(()=>{U(i,1,li([`loading-state`,r()]),`svelte-hzxv1d`),B(o,n())}),z(e,i)}var rIe=R(`

`),iIe=R(`
`),aIe=R(`

2xx 4xx 5xx
`,1),oIe=R(`
`);function sIe(e,t){D(t,!0);let n=J4(),r=k(()=>X4.stats);function i(){return{interval:I(r).interval,zone:zX.effectiveTimezone(),resolve:Q2,formatTimestamp:e=>zX.formatTimestamp(e)}}var a=kr(),o=N(a),s=e=>{var t=aIe(),a=N(t),o=M(a),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=M(l),d=M(u),f=M(d,!0);E(d);var p=P(d,2),m=M(p,!0);E(p),E(u);var h=P(u,2),g=P(M(h),4),_=M(g,!0);E(g),E(h);var v=P(h,2),y=P(M(v),4),b=M(y,!0);E(y),E(v);var x=P(v,2),S=P(M(x),4),C=M(S,!0);E(S),E(x),E(l),E(o);var w=P(o,2);K2(M(w),{build:()=>fFe(Y2(),I(r).buckets,i())}),E(w),E(a);var T=P(a,2),ee=e=>{var t=iIe(),a=M(t),o=M(a);{let e=e=>{var t=rIe(),n=M(t,!0);E(t),F(e=>B(n,e),[()=>Nme()]),z(e,t)},t=k(()=>Ime()),n=k(()=>zme());i3(o,{copyId:`audit-latency-help-copy`,get label(){return I(t)},get text(){return I(n)},title:e,$$slots:{title:!0}})}var s=P(o,2),c=M(s),l=M(c),u=M(l,!0);E(l);var d=P(l,2),f=M(d,!0);E(d),E(c),E(s),E(a);var p=P(a,2);K2(M(p),{build:()=>pFe(Y2(),I(r).buckets,I(r).provider_latency,{...i(),providerColor:n})}),E(p),E(t),F((e,t,n)=>{W(c,`title`,e),B(u,t),B(f,n)},[()=>Hme(),()=>Gme(),()=>uFe(I(r))]),z(e,t)},te=k(()=>cFe(I(r)));V(T,e=>{I(te)&&e(ee)}),F((e,t,n,r,i,a,o,s)=>{B(c,e),W(l,`aria-label`,t),W(u,`title`,n),B(f,r),B(m,i),B(_,a),B(b,o),B(C,s)},[()=>xme(),()=>wme(),()=>Dme(),()=>Ame(),()=>lFe(I(r)),()=>oZ(U4(I(r),`status_2xx`)),()=>oZ(U4(I(r),`status_4xx`)),()=>oZ(U4(I(r),`status_5xx`))]),z(e,t)},c=k(()=>sFe(I(r))),l=e=>{var t=oIe(),n=M(t);{let e=k(()=>ts());a3(n,{get label(){return I(e)}})}E(t),z(e,t)};V(o,e=>{I(c)?e(s):X4.loading&&e(l,1)}),z(e,a),O()}var o3=(e,t=f,n=f,r)=>{let i=yt(()=>h(r?.(),!1));var a=uIe(),o=M(a),s=M(o,!0);E(o);var c=P(o,2),l=e=>{var t=cIe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)},u=e=>{var t=lIe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)};V(c,e=>{I(i)?e(l):e(u,-1)}),E(a),F(()=>B(s,t())),z(e,a)},cIe=R(` `),lIe=R(` `),uIe=R(`
`),dIe=R(`

`),fIe=R(`
`),pIe=R(`
`),mIe=R(`
`),hIe=R(`
`),gIe=R(`

`);function _Ie(e,t){D(t,!0);let n=k(()=>BPe(t.provider)),r=k(()=>[[Ps(),t.provider.config?.base_url],[Ls(),t.provider.config?.api_version]].filter(([,e])=>!!e));var i=gIe();let a;var o=M(i),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=e=>{var n=dIe(),r=M(n,!0);E(n),F(()=>B(r,t.provider.last_error)),z(e,n)};V(l,e=>{t.provider.last_error&&e(u)});var d=P(l,2),f=e=>{var r=hIe(),i=M(r);{let e=k(()=>Bs()),n=k(()=>VPe(t.provider));o3(i,()=>I(e),()=>I(n))}var a=P(i,2),o=e=>{var r=fIe(),i=M(r),a=M(i,!0);E(i);var o=P(i,2),s=M(o),c=M(s,!0);E(s),E(o),E(r),F((e,t)=>{B(a,e),U(s,1,li([`provider-status-health-state`,I(n)]),`svelte-6y9wjv`),B(c,t)},[()=>Us(),()=>zPe(t.provider)]),z(e,r)},s=k(()=>k4(t.provider));V(a,e=>{I(s)&&e(o)});var c=P(a,2),l=e=>{var n=mIe(),r=M(n),i=M(r,!0);E(r);var a=P(r,2);H(a,21,()=>A4(t.provider),e=>e.model,(e,t)=>{var n=pIe();let r;var i=M(n),a=M(i,!0);E(i);var o=P(i,2),s=M(o,!0);E(o),E(n),F((e,i)=>{r=U(n,1,`provider-status-health-model svelte-6y9wjv`,null,r,{"is-flagged":I(t).flagged}),W(n,`title`,e),B(a,I(t).model),B(s,i)},[()=>UPe(I(t)),()=>HPe(I(t))]),z(e,n)}),E(a),E(n),F(e=>B(i,e),[()=>Ks()]),z(e,n)},u=k(()=>A4(t.provider).length>0);V(c,e=>{I(u)&&e(l)}),E(r),z(e,r)},p=k(()=>O4(t.provider));V(d,e=>{I(p)&&e(f)});var m=P(d,2),h=M(m);H(h,17,()=>I(r),([e,t])=>e,(e,t)=>{var n=k(()=>g(I(t),2));o3(e,()=>I(n)[0],()=>I(n)[1],()=>!0)});var _=P(h,2);{let e=k(()=>Ys()),n=k(()=>LPe(t.provider));o3(_,()=>I(e),()=>I(n))}var v=P(_,2);{let e=k(()=>Qs()),n=k(()=>FPe(t.provider));o3(v,()=>I(e),()=>I(n))}var y=P(v,2);{let e=k(()=>tc()),n=k(()=>IPe(t.provider));o3(y,()=>I(e),()=>I(n))}E(m),E(o),E(i),F(()=>{a=U(i,1,`provider-status-details svelte-6y9wjv`,null,a,{"is-expanded":t.expanded,"is-collapsed":!t.expanded}),W(i,`aria-hidden`,!t.expanded),B(c,t.provider.status_reason)}),z(e,i),O()}var vIe=R(` `),yIe=R(``),bIe=R(`

`);function xIe(e,t){D(t,!0);let n=k(()=>Y4.cardExpanded(t.provider)),r=e=>zX.formatTimestamp(e);var i=bIe(),a=M(i),o=M(a),s=M(o),c=M(s),l=M(c,!0);E(c);var u=P(c,2),d=e=>{var n=vIe(),r=M(n);E(n),F(e=>B(r,`(${e??``})`),[()=>E4(t.provider)]),z(e,n)},f=k(()=>E4(t.provider));V(u,e=>{I(f)&&e(d)});var p=P(u,2),m=e=>{var n=yIe();F((e,t,r)=>{W(n,`href`,e),W(n,`aria-label`,t),W(n,`title`,r)},[()=>D4(t.provider),()=>ps({provider:E4(t.provider)||t.provider.name}),()=>ps({provider:E4(t.provider)||t.provider.name})]),z(e,n)},h=k(()=>D4(t.provider));V(p,e=>{I(h)&&e(m)}),E(s),E(o);var g=P(o,2),_=M(g,!0);E(g),E(a);var v=P(a,2),y=M(v),b=M(y),x=M(b,!0);E(b);var S=P(b,2),C=M(S,!0);E(S),E(y);var w=P(y,2),T=M(w),ee=M(T,!0);E(T);var te=P(T,2),ne=M(te,!0);E(te),E(w),E(v);var re=P(v,2);_Ie(re,{get provider(){return t.provider},get expanded(){return I(n)}});var ie=P(re,2);let ae;K(M(ie),{get icon(){return JY},class:`provider-status-card-toggle-icon`}),E(ie),E(i),F((e,r,i,a,o,s,c,u,d)=>{B(l,t.provider.name),U(g,1,`provider-status-pill ${e??``}`,`svelte-nopjmh`),W(g,`title`,r),B(_,t.provider.status_label),B(x,i),B(C,a),B(ee,o),W(te,`title`,s),B(ne,c),ae=U(ie,1,`provider-status-card-toggle svelte-nopjmh`,null,ae,{"is-expanded":I(n)}),W(ie,`aria-expanded`,I(n)),W(ie,`aria-label`,u),W(ie,`title`,d)},[()=>OPe(t.provider.status),()=>RPe(t.provider),()=>gs(),()=>oZ(t.provider.runtime?.discovered_model_count),()=>ys(),()=>PPe(t.provider,r),()=>NPe(t.provider,r),()=>I(n)?Ts({provider:t.provider.name}):Ss({provider:t.provider.name}),()=>I(n)?js():Os()]),L(`click`,ie,()=>Y4.toggleCard(t.provider)),z(e,i),O()}Sr([`click`]);var SIe=R(`

`),CIe=R(`
`);function wIe(e,t){D(t,!0);let n=k(()=>Y4.status.providers);var r=kr(),i=N(r),a=e=>{var t=SIe(),r=M(t),i=M(r),a=M(i),o=M(a,!0);E(a),E(i);var s=P(i,2),c=M(s),l=M(c,!0);E(c);var u=P(c,2);let d;E(s),E(r);var f=P(r,2);H(f,21,()=>I(n),e=>e.name,(e,t)=>{xIe(e,{get provider(){return I(t)}})}),E(f),E(t),F((e,t,n)=>{B(o,e),W(s,`aria-checked`,Y4.detailsExpanded),W(s,`title`,t),B(l,n),d=U(u,1,`provider-status-toggle-track svelte-1kx3uw4`,null,d,{"is-active":Y4.detailsExpanded})},[()=>Jme(),()=>Y4.detailsToggleLabel(),()=>Y4.detailsToggleLabel()]),L(`click`,s,()=>Y4.toggleDetails()),z(e,t)},o=e=>{var t=CIe(),n=M(t);{let e=k(()=>is());f4(n,{size:18,get label(){return I(e)}})}E(t),z(e,t)};V(i,e=>{I(n).length>0?e(a):Y4.loading&&!Y4.loadedOnce&&e(o,1)}),z(e,r),O()}Sr([`click`]);var TIe=R(`
`);function s3(e,t){D(t,!0);function n(){AZ.fetchUsage(),AZ.fetchCacheOverview(``),X4.fetch(),Y4.fetch(),Z4.fetch(),Q4.fetch()}function r(){AZ.fetchUsage(),AZ.fetchCacheOverview(``),X4.fetch()}function i(){r(),Q4.fetch()}hn(()=>{if(J.refreshTick,bX.page===`overview`)return sr(()=>{n(),d4.start()}),()=>{d4.stop(),Y4.stopPolling()}});var a=TIe(),o=M(a);sPe(o,{});var s=P(o,2),c=M(s),l=M(c,!0);E(c),E(s);var u=P(s,2);MZ(M(u),{onchange:i}),E(u);var d=P(u,2);DZ(d,{});var f=P(d,2);DFe(f,{});var p=P(f,2);NFe(p,{});var m=P(p,2);LFe(m,{onintervalchange:r});var h=P(m,2);QFe(h,{});var g=P(h,2);sIe(g,{}),wIe(P(g,2),{}),E(a),F(e=>B(l,e),[()=>yo()]),z(e,a),O()}var EIe=`/admin/live/logs?types=audit,usage`;function c3(e,t,n){return!!t&&String(e&&e.id||``).trim()===t||!!n&&String(e&&e.request_id||``).trim()===n}function DIe(e){switch(e){case`date_range`:return Mce();case`filters`:return Fce();case`pagination`:return Rce();default:return``}}function OIe(e){let t=EIe,n=Number(e||0);return Number.isFinite(n)&&n>0&&(t+=`&cursor=`+encodeURIComponent(String(n))),t}function kIe(){return{async consumeLiveLogsBody(e){await t4(e,e=>this.applyLiveLogEvent(e))},applyLiveLogEvent(e){if(!e||typeof e!=`object`)return;let t=Number(e.seq||0);Number.isFinite(t)&&t>this.liveLogsLastSeq&&(this.liveLogsLastSeq=t);let n=String(e.type||``).trim();if(n!==`heartbeat`){if(n===`reset`){this.reloadLiveLogSources();return}if(n===`audit.removed`){this.removeLiveAuditEntry(e.data);return}if(n.indexOf(`audit.`)===0){this.mergeLiveAuditEntry(e.data||{},n);return}n.indexOf(`usage.`)===0&&(this.mergeLiveUsageEntry(e.data||{},n),typeof this.noteLiveTokenUsage==`function`&&this.noteLiveTokenUsage(n))}},reloadLiveLogSources(){typeof this.fetchUsage==`function`&&this.fetchUsage(),this.page===`audit-logs`&&typeof this.fetchAuditLog==`function`&&this.fetchAuditLog(!0)},auditLivePauseReason(){return!this.auditLog||this.auditLog.offset!==0?`pagination`:this.auditSearch||this.auditMethod||this.auditStatusCode||this.auditStream?`filters`:!this.followsToday&&(this.customStartDate||this.customEndDate)?`date_range`:null},auditLiveInsertAllowed(){return!this.auditLivePauseReason()},usageLiveInsertAllowed(){return this.usageLog&&this.usageLog.offset===0&&!this.usageLogSearch&&!this.usageFilterModel&&!this.usageFilterProvider&&!this.usageFilterLabel&&!this.usageFilterUserPath&&!this.usageFilterSession},mergeLiveAuditEntry(e,t){if(!e||typeof e!=`object`)return;let n=String(e.id||e.request_id||``).trim();if(!n)return;let r=String(e.request_id||``).trim(),i=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],a=i.findIndex(e=>c3(e,n,r)),o=a>=0&&i[a]||{},s=t===`audit.detail`,c=s?{...e,_detail_loaded:!0,_response_partial:!1,bodies_omitted:!1}:this.liveAuditPatch(o,e,t);if(a>=0){let e=this.mergeLiveAuditPatch(o,c);return i.splice(a,1,e),this.auditLog.entries=[...i],this.regroupLiveAuditHead(e),s||this.fetchExpandedAuditDetailIfReady(e),this.cacheMergedAuditRecord(e,t),e}let l=this.mergeLiveAuditChild(e,c);if(l)return s||this.fetchExpandedAuditDetailIfReady(l),this.cacheMergedAuditRecord(l,t),l;if(!this.auditLiveInsertAllowed()){this.cacheMergedAuditRecord(c,t);return}if(!s&&this.auditGroupSessions){let e=this.foldLiveAuditIntoThread(c);if(e)return this.fetchExpandedAuditDetailIfReady(e),this.cacheMergedAuditRecord(e,t),e}this.auditLog.entries=[this.mergeLiveAuditUsagePatch(c),...i].slice(0,this.auditLog.limit||25),this.auditLog.total=Number(this.auditLog.total||0)+1;let u=this.auditLog.entries[0];return s||this.fetchExpandedAuditDetailIfReady(u),this.cacheMergedAuditRecord(u,t),u},liveAuditPatch(e,t,n){let r=this.liveAuditStateAfter(e._live_state,n),i=this.liveAuditEventFlushed(e._live_state)||this.liveAuditEventFlushed(r),a={...t,_live:!0,_live_state:r,_audit_flushed:i,_live_pending:!i};return n===`audit.stream`?a._response_partial=!0:this.liveAuditStateSettled(n)&&(a._response_partial=!1),a},mergeLiveAuditChild(e,t){let n=this.auditThreadChildren;if(!n||typeof n!=`object`)return null;let r=String(e.id||``).trim(),i=String(e.request_id||``).trim(),a=Object.keys(n);for(let e=0;ec3(e,r,i));if(c<0)continue;let l=this.mergeLiveAuditPatch(s[c]||{},t),u=[...s];return u.splice(c,1,l),this.auditThreadChildren={...n,[a[e]]:{...o,entries:u}},l}return null},regroupLiveAuditHead(e){if(!this.auditGroupSessions)return null;let t=String(e&&e.session_id||``).trim();if(!t)return null;let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=String(e.id||``).trim(),i=n.findIndex(e=>String(e.id||``).trim()===r);if(i<0)return null;let a=n.findIndex((e,n)=>n!==i&&String(e.session_id||``).trim()===t);if(a<0)return null;let o=n[a],s=Date.parse(o&&o.timestamp),c=Date.parse(e&&e.timestamp),l=Number.isFinite(s)&&Number.isFinite(c)&&s>c,u=l?o:e,d=l?e:o,f={...u,session_count:Math.max(1,Number(o.session_count||1))+Math.max(1,Number(e.session_count||1))},p=n.filter((e,t)=>t!==i&&t!==a);return p.unshift(f),this.auditLog.entries=p,this.auditLog.total=Math.max(0,Number(this.auditLog.total||0)-1),this.prependLiveAuditThreadChild(t,d),f},foldLiveAuditIntoThread(e){let t=String(e&&e.session_id||``).trim();if(!t)return null;let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=n.findIndex(e=>String(e.session_id||``).trim()===t);if(r<0)return null;let i=n[r],a=Number(i.session_count),o=this.mergeLiveAuditUsagePatch({...e,session_count:(Number.isFinite(a)&&a>0?a:1)+1}),s=[...n];return s.splice(r,1),s.unshift(o),this.auditLog.entries=s,this.prependLiveAuditThreadChild(t,i),o},prependLiveAuditThreadChild(e,t){let n=this.auditThreadChildren||{},r=n[e],i={...t};delete i.session_count;let a=r&&Array.isArray(r.entries)?{...r,entries:[i,...r.entries],total:Number(r.total||r.entries.length)+1}:{loading:!1,loaded:!1,entries:[i],total:1};this.auditThreadChildren={...n,[e]:a}},removeLiveAuditThreadChild(e,t){let n=this.auditThreadChildren;!n||typeof n!=`object`||Object.keys(n).forEach(r=>{let i=n[r],a=i&&Array.isArray(i.entries)?i.entries:[],o=a.filter(n=>!c3(n,e,t)),s=a.length-o.length;s!==0&&(this.auditThreadChildren={...this.auditThreadChildren,[r]:{...i,entries:o,total:Math.max(0,Number(i.total||a.length)-s)}},this.decrementLiveAuditThreadCount(r,s))})},decrementLiveAuditThreadCount(e,t){let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=n.findIndex(t=>String(t.session_id||``).trim()===e);if(r<0)return;let i=n[r],a=[...n];a.splice(r,1,{...i,session_count:Math.max(1,Number(i.session_count||1)-t)}),this.auditLog.entries=a},mergeLiveAuditPatch(e,t){let n={...e,...t};return t.data===void 0&&e.data!==void 0?n.data=e.data:e.data&&t.data&&typeof e.data==`object`&&typeof t.data==`object`&&!Array.isArray(e.data)&&!Array.isArray(t.data)&&(n.data={...e.data,...t.data}),this.mergeLiveAuditUsagePatch(n)},mergeLiveAuditUsagePatch(e){let t=this.liveUsageEntryForAudit(e);if(!t)return e;let n=this.auditEntryWithLiveUsage(e,t);return this.removeSkippedLiveUsage(t),n},liveUsageEntryForAudit(e){let t=String(e&&e.request_id||``).trim();return t&&((this.usageLog&&Array.isArray(this.usageLog.entries)?this.usageLog.entries:[]).find(e=>String(e&&e.request_id||``).trim()===t)||this.skippedLiveUsageByRequestId&&this.skippedLiveUsageByRequestId[t])||null},cacheMergedAuditRecord(e,t){return e&&typeof this.cacheAuditRecord==`function`?this.cacheAuditRecord(e,t):e},fetchExpandedAuditDetailIfReady(e){!e||!this.isAuditEntryExpanded||!this.isAuditEntryExpanded(e)||String(e._live_state||``).trim()!==`audit.flushed`&&!e._audit_flushed||typeof this.fetchAuditEntryDetail==`function`&&this.fetchAuditEntryDetail(e)},liveAuditStateRank(e){switch(String(e||``).trim()){case`audit.started`:return 10;case`audit.updated`:case`audit.stream`:return 20;case`audit.completed`:return 30;case`audit.failed`:case`audit.flushed`:case`audit.detail`:return 40;default:return 0}},liveAuditStateAfter(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return this.liveAuditStateRank(n)>this.liveAuditStateRank(r)?n:r},liveAuditStateSettled(e){return this.liveAuditStateRank(e)>=this.liveAuditStateRank(`audit.completed`)},liveAuditEventFlushed(e){let t=String(e||``).trim();return t===`audit.failed`||t===`audit.flushed`||t===`audit.detail`},removeLiveAuditEntry(e){if(!e||!this.auditLog||!Array.isArray(this.auditLog.entries))return;let t=String(e.id||``).trim(),n=String(e.request_id||``).trim();if(!t&&!n)return;let r=this.auditLog.entries,i=[],a=0,o=0,s=!1;r.forEach(e=>{if(!c3(e,t,n)){i.push(e);return}a++;let r=String(e.session_id||``).trim(),c=Math.max(1,Number(e.session_count||1));if(!this.auditGroupSessions||!r||c<=1)return;o++;let l=this.auditThreadChildren&&this.auditThreadChildren[r],u=l&&Array.isArray(l.entries)?l.entries.filter(e=>!c3(e,t,n)):[];if(u.length===0){s=!0;return}let d={...u[0],session_id:r,session_count:c-1};i.push(d),this.auditThreadChildren={...this.auditThreadChildren,[r]:{...l,entries:u.slice(1),total:Math.max(0,Number(l.total||c)-1)}}}),a>0&&(this.auditLog.entries=i,this.auditLog.total=Math.max(0,Number(this.auditLog.total||0)-a+o)),this.removeLiveAuditThreadChild(t,n),s&&typeof this.fetchAuditLog==`function`&&this.fetchAuditLog(!0)},mergeLiveUsageEntry(e,t){if(!e||typeof e!=`object`)return;e={...e,_live_state:t||e._live_state||`usage.completed`};let n=String(e.id||``).trim();if(!n)return;let r=this.usageLog&&Array.isArray(this.usageLog.entries)?this.usageLog.entries:[],i=r.findIndex(e=>String(e.id||``).trim()===n);if(i>=0){let t=r[i]||{},n=this.mergeLiveUsagePatch(t,e);if(this.applyLiveUsageToAudit(n),this.liveUsageShouldSkip(n)){r.splice(i,1),this.usageLog.entries=[...r],this.usageLog.total=Math.max(0,Number(this.usageLog.total||0)-1),this.storeSkippedLiveUsage(n);return}r.splice(i,1,n),this.usageLog.entries=[...r],this.removeSkippedLiveUsage(n);return}let a=this.mergeLiveUsagePatch(this.liveUsageSeedForEntry(e),e);if(this.applyLiveUsageToAudit(a),this.liveUsageShouldSkip(a)){this.storeSkippedLiveUsage(a);return}this.removeSkippedLiveUsage(a),this.usageLog.entries=[a,...r].slice(0,this.usageLog.limit||50),this.usageLog.total=Number(this.usageLog.total||0)+1},mergeLiveUsagePatch(e,t){e=e&&typeof e==`object`?e:{};let n=this.liveUsageStateAfter(e._live_state,t&&t._live_state),r=this.liveUsageEventFlushed(e)||this.liveUsageEventFlushed({...t,_live_state:n});return{...e,...t,_live:!0,_live_state:n||`usage.completed`,_live_pending:!r,_usage_flushed:r}},liveUsageShouldSkip(e){return!!(this.usageLogHideCached&&this.liveUsageEntryCached(e))||!this.usageLiveInsertAllowed()},liveUsageSeedForEntry(e){return this.skippedLiveUsageForEntry(e)||this.auditLiveUsageForEntry(e)},skippedLiveUsageForEntry(e){let t=String(e&&e.request_id||``).trim();return t&&this.skippedLiveUsageByRequestId?this.skippedLiveUsageByRequestId[t]:null},auditLiveUsageForEntry(e){let t=String(e&&e.request_id||``).trim();if(!t||!this.auditLog||!Array.isArray(this.auditLog.entries))return null;let n=this.auditLog.entries.find(e=>String(e&&e.request_id||``).trim()===t),r=n&&n.usage&&typeof n.usage==`object`&&!Array.isArray(n.usage)?n.usage:null;return r?{id:e&&e.id,request_id:t,entries:r.entries,input_tokens:r.input_tokens,uncached_input_tokens:r.uncached_input_tokens,cached_input_tokens:r.cached_input_tokens,cache_write_input_tokens:r.cache_write_input_tokens,output_tokens:r.output_tokens,total_tokens:r.total_tokens,cached_input_ratio:r.cached_input_ratio,estimated_cached_characters:r.estimated_cached_characters,_live_state:n._usage_live_state,_live_pending:n._usage_live_pending,_usage_flushed:n._usage_flushed}:null},storeSkippedLiveUsage(e){let t=String(e&&e.request_id||``).trim();t&&((!this.skippedLiveUsageByRequestId||typeof this.skippedLiveUsageByRequestId!=`object`||Array.isArray(this.skippedLiveUsageByRequestId))&&(this.skippedLiveUsageByRequestId={}),this.skippedLiveUsageByRequestId[t]=e)},removeSkippedLiveUsage(e){let t=String(e&&e.request_id||``).trim();t&&this.skippedLiveUsageByRequestId&&delete this.skippedLiveUsageByRequestId[t]},liveUsageEntryCached(e){let t=String(e&&e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`||!!(e&&e.cache_hit)},liveUsageEventFlushed(e){let t=String(e&&e._live_state||``).trim();return!!(e&&e._usage_flushed)||t===`usage.failed`||t===`usage.flushed`},liveUsageStateRank(e){switch(String(e||``).trim()){case`usage.completed`:return 10;case`usage.failed`:case`usage.flushed`:return 20;default:return 0}},liveUsageStateAfter(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return this.liveUsageStateRank(n)>this.liveUsageStateRank(r)?n:r},applyLiveUsageToAudit(e){let t=String(e&&e.request_id||``).trim();if(!t||!this.auditLog||!Array.isArray(this.auditLog.entries))return;let n=this.auditLog.entries.findIndex(e=>String(e.request_id||``).trim()===t);if(n>=0){let t=this.auditLog.entries[n];this.auditLog.entries.splice(n,1,this.auditEntryWithLiveUsage(t,e)),this.auditLog.entries=[...this.auditLog.entries]}let r=this.auditThreadChildren;if(!r||typeof r!=`object`)return;let i=r,a=!1;Object.keys(r).forEach(n=>{let r=i[n],o=r&&Array.isArray(r.entries)?r.entries:[],s=o.findIndex(e=>String(e.request_id||``).trim()===t);if(s<0)return;let c=[...o];c.splice(s,1,this.auditEntryWithLiveUsage(o[s],e)),i={...i,[n]:{...r,entries:c}},a=!0}),a&&(this.auditThreadChildren=i)},auditEntryWithLiveUsage(e,t){let n=this.liveUsageStateAfter(e._usage_live_state,t._live_state||`usage.completed`),r=this.liveUsageEventFlushed({_live_state:n,_usage_flushed:e._usage_flushed||t._usage_flushed});return{...e,usage:this.liveUsageSummary(t,e.usage),_usage_live_state:n||`usage.completed`,_usage_live_pending:!r,_usage_flushed:r}},liveUsageSummary(e,t){let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{},r=this.liveNumber(e.input_tokens,this.liveNumber(n.input_tokens,0)),i=this.liveNumber(e.output_tokens,this.liveNumber(n.output_tokens,0)),a=this.liveNumber(e.uncached_input_tokens,this.liveNumber(n.uncached_input_tokens,0)),o=this.liveNumber(e.cached_input_tokens,this.liveNumber(n.cached_input_tokens,0)),s=this.liveNumber(e.cache_write_input_tokens,this.liveNumber(n.cache_write_input_tokens,0));r>0&&a+o+s===0&&(a=r);let c=a+o+s||r,l=c+i||this.liveNumber(e.total_tokens,this.liveNumber(n.total_tokens,0)),u=this.liveNumber(e.cached_input_ratio,this.liveNumber(n.cached_input_ratio,c>0?o/c:0));return{entries:Math.max(1,this.liveNumber(e.entries,this.liveNumber(n.entries,1))),input_tokens:c,uncached_input_tokens:a,cached_input_tokens:o,cache_write_input_tokens:s,output_tokens:i,total_tokens:l,cached_input_ratio:u,estimated_cached_characters:this.liveNumber(e.estimated_cached_characters,this.liveNumber(n.estimated_cached_characters,o*4))}},liveNumber(e,t){let n=Number(e);return Number.isFinite(n)?n:t},auditEntryShouldFetchDetail(e){return!e||e._detail_loading||e._detail_loaded||this.auditEntryLiveDetailPending(e)?!1:this.auditEntryNeedsPersistedLiveDetail(e)||e.bodies_omitted?!0:!this.auditEntryHasDetailData(e)},auditEntryLiveDetailPending(e){if(!e||!e._live)return!1;let t=String(e._live_state||``).trim();return t===`audit.failed`||!e._audit_flushed&&t!==`audit.flushed`&&t!==`audit.detail`},auditEntryNeedsPersistedLiveDetail(e){return!!(e&&e._live&&!e._detail_loaded)},auditEntryHasDetailData(e){let t=e&&e.data;return!t||typeof t!=`object`?!1:t.request_headers!==void 0||t.response_headers!==void 0||t.request_body!==void 0||t.response_body!==void 0||t.request_body_too_big_to_handle!==void 0||t.response_body_too_big_to_handle!==void 0||t.user_agent!==void 0||t.api_key_hash!==void 0||t.temperature!==void 0||t.max_tokens!==void 0||t.error_message!==void 0||t.error_code!==void 0},clearAuditDetailLoading(e){if(!e)return;let t=String(e.id||``).trim(),n=String(e.request_id||``).trim(),r=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],i=r.find(e=>t&&String(e.id||``).trim()===t?!0:!!(n&&String(e.request_id||``).trim()===n)),a=i||e;a._detail_loading=!1,i&&(this.auditLog.entries=[...r])}}}var l3={"audit.started":10,"audit.updated":20,"audit.stream":20,"audit.completed":30,"audit.failed":40,"audit.flushed":40,"audit.detail":40},AIe=new Set(Object.keys(l3));function u3(e){return String(e&&(e.id||e.request_id)||``).trim()}function jIe(e,t){let n=e&&typeof e==`object`?e:{},r=t&&typeof t==`object`?t:{},i={...n,...r};if(r.data==null&&n.data!=null)i.data=n.data;else if(d3(n.data)&&d3(r.data)){i.data={...n.data,...r.data};let e=PIe(n.data.request_revisions,r.data.request_revisions);e&&(i.data.request_revisions=e)}let a=String(n._live_state||``).trim(),o=String(r._live_state||``).trim();return(l3[a]||0)>(l3[o]||0)&&(i._live_state=a),n._audit_flushed&&(i._audit_flushed=!0),i._audit_flushed&&(i._live_pending=!1),n._detail_loaded&&!r._detail_loaded&&(i._detail_loaded=!0,i.bodies_omitted=!1),i.bodies_omitted&&d3(i.data)&&(i.data.request_body!==void 0||i.data.response_body!==void 0)&&(i.bodies_omitted=!1),i}function MIe(e,t){let n=Number(t||0);return(Array.isArray(e)?e:[]).filter(e=>Number(e&&e.version||0)>n)}function NIe(e){return AIe.has(String(e&&e.eventType||``).trim())}function PIe(e,t){return!Array.isArray(e)||!Array.isArray(t)?null:t.map(t=>{let n=Number(t&&t.seq||0),r=e.find(e=>Number(e&&e.seq||0)===n);if(!r)return t;let i={...t};return(i.body==null||i.body===``)&&r.body!=null&&(i.body=r.body),i.detail==null&&r.detail!=null&&(i.detail=r.detail),i})}function d3(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}var f3=200,p3=class{#e=A(Xt({entries:[],total:0,limit:25,offset:0}));get auditLog(){return I(this.#e)}set auditLog(e){j(this.#e,e,!0)}#t=A(Xt({entries:[],total:0,limit:50,offset:0}));get usageLog(){return I(this.#t)}set usageLog(e){j(this.#t,e,!0)}#n=A(Xt({}));get auditRecords(){return I(this.#n)}set auditRecords(e){j(this.#n,e,!0)}#r=A(Xt([]));get auditRecordChanges(){return I(this.#r)}set auditRecordChanges(e){j(this.#r,e,!0)}auditRecordVersion=0;auditRecordPins=new Set;#i=A(``);get auditSearch(){return I(this.#i)}set auditSearch(e){j(this.#i,e,!0)}#a=A(``);get auditMethod(){return I(this.#a)}set auditMethod(e){j(this.#a,e,!0)}#o=A(``);get auditStatusCode(){return I(this.#o)}set auditStatusCode(e){j(this.#o,e,!0)}#s=A(``);get auditStream(){return I(this.#s)}set auditStream(e){j(this.#s,e,!0)}#c=A(Wi(`gomodel_audit_group_sessions`,`true`)!==`false`);get auditGroupSessions(){return I(this.#c)}set auditGroupSessions(e){j(this.#c,e,!0)}#l=A(Xt({}));get auditThreadChildren(){return I(this.#l)}set auditThreadChildren(e){j(this.#l,e,!0)}#u=A(``);get usageLogSearch(){return I(this.#u)}set usageLogSearch(e){j(this.#u,e,!0)}#d=A(``);get usageFilterModel(){return I(this.#d)}set usageFilterModel(e){j(this.#d,e,!0)}#f=A(``);get usageFilterProvider(){return I(this.#f)}set usageFilterProvider(e){j(this.#f,e,!0)}#p=A(``);get usageFilterLabel(){return I(this.#p)}set usageFilterLabel(e){j(this.#p,e,!0)}#m=A(``);get usageFilterUserPath(){return I(this.#m)}set usageFilterUserPath(e){j(this.#m,e,!0)}#h=A(``);get usageFilterSession(){return I(this.#h)}set usageFilterSession(e){j(this.#h,e,!0)}#g=A(!1);get usageLogHideCached(){return I(this.#g)}set usageLogHideCached(e){j(this.#g,e,!0)}#_=A(!1);get liveLogsStreaming(){return I(this.#_)}set liveLogsStreaming(e){j(this.#_,e,!0)}liveLogsLastSeq=0;liveLogsReconnectAttempts=0;liveLogsReconnectTimer=null;liveLogsController=null;skippedLiveUsageByRequestId=null;fetchUsage=null;fetchAuditLog=null;isAuditEntryExpanded=null;noteLiveTokenUsage=null;upsertAuditRecord(e,t=``){let n=u3(e);if(!n)return e;let r=jIe(this.auditRecords[n],e);return this.auditRecords={...this.auditRecords,[n]:r},this.pruneAuditRecords(),this.auditRecordVersion++,this.auditRecordChanges=[...this.auditRecordChanges,{version:this.auditRecordVersion,key:n,eventType:t}].slice(-512),r}upsertAuditRecords(e,t=``){return(Array.isArray(e)?e:[]).map(e=>this.upsertAuditRecord(e,t))}auditRecord(e){let t=typeof e==`string`?String(e).trim():u3(e);return t&&this.auditRecords[t]||null}cacheAuditRecord(e,t){return this.upsertAuditRecord(e,t)}pinAuditRecords(e){this.auditRecordPins=new Set((Array.isArray(e)?e:[]).map(String))}pruneAuditRecords(){let e=Object.keys(this.auditRecords);if(e.length<=f3)return;let t={...this.auditRecords},n=e.length-f3;for(let r of e){if(n<=0)break;this.auditRecordPins.has(r)||(delete t[r],n--)}this.auditRecords=t}get page(){return bX.page}get customStartDate(){return TZ.customStartDate}get customEndDate(){return TZ.customEndDate}get followsToday(){return TZ.followsToday}liveLogsEnabled(){return qX.liveLogsVisible()}async startLiveLogs(){typeof fetch!=`function`||typeof ReadableStream>`u`||(await qX.ensureLoaded(),this.liveLogsEnabled()&&(this.stopLiveLogs(),this.liveLogsController=typeof AbortController==`function`?new AbortController:null,this.readLiveLogsStream(this.liveLogsController)))}stopLiveLogs(){this.liveLogsStreaming=!1,this.liveLogsReconnectTimer&&=(clearTimeout(this.liveLogsReconnectTimer),null),this.liveLogsController&&typeof this.liveLogsController.abort==`function`&&this.liveLogsController.abort(),this.liveLogsController=null}ensureLiveLogs(){this.liveLogsController||this.liveLogsReconnectTimer||this.startLiveLogs()}async readLiveLogsStream(e){let t={};e&&(t.signal=e.signal);let n=OIe(this.liveLogsLastSeq),r=J.generation;try{let i=await HX(n,t);if(i.status===401){if(J.handleUnauthorized(r),r{this.liveLogsReconnectTimer=null,this.startLiveLogs()},t)}async fetchAuditEntryDetail(e){if(!this.auditEntryShouldFetchDetail(e))return;let t=String(e.id||``).trim();if(!t)return;e._detail_loading=!0;let n=e;try{let e=await WX(`/admin/audit/detail?log_id=`+encodeURIComponent(t),{label:`audit detail`});if(e.stale||!e.ok)return;n=this.mergeLiveAuditEntry(e.data,`audit.detail`)||n}catch(e){console.error(`Failed to fetch audit detail:`,e)}finally{this.clearAuditDetailLoading(n)}}};Object.assign(p3.prototype,kIe());var m3=new p3;if(typeof window<`u`){let e=!1;window.addEventListener(`pagehide`,()=>{e=!!m3.liveLogsController,m3.stopLiveLogs()}),window.addEventListener(`pageshow`,t=>{t.persisted&&e&&m3.ensureLiveLogs()})}var h3=null;_n(()=>{hn(()=>{let e=J.refreshTick;if(h3===null){h3=e;return}e!==h3&&(h3=e,sr(()=>{m3.stopLiveLogs(),m3.startLiveLogs()}))})});function g3(){return{total_requests:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,uncached_input_tokens:0,cached_input_tokens:0,cache_write_input_tokens:0,total_input_cost:null,total_output_cost:null,total_cost:null,rewrite_tokens_saved:0,rewrite_cost_saved:null}}function FIe(){return{entries:[],total:0,limit:50,offset:0}}function _3(){return{entries:[],total:0,limit:50,offset:0}}function IIe(e){let t=String(e||``).trim();return t.length<=26?t||`-`:t.slice(0,15)+`…`+t.slice(-8)}function LIe(e,t){let n=[[`model`,e&&e.model],[`provider`,e&&e.provider],[`label`,e&&e.label],[`user_path`,e&&e.user_path],[`session_id`,e&&e.session_id]],r=``;for(let[e,i]of n)!i||e===t||(r+=`&`+e+`=`+encodeURIComponent(i));return r}function RIe({limit:e,offset:t,hideCached:n,search:r}){let i=`&limit=`+e+`&offset=`+t;return i+=`&cache_mode=`+(n?`uncached`:`all`),r&&(i+=`&search=`+encodeURIComponent(r)),i}function zIe({limit:e,offset:t}){return`&limit=`+e+`&offset=`+t}function v3(e,t){let n=new Set(e||[]);return t&&n.add(t),[...n].sort()}function BIe(e,t){let n=Number(t&&t.total_requests||0)-Number(e&&e.total_requests||0);return Number.isFinite(n)&&n>0?n:0}function VIe(e,t,n){let r=n?e:t,i=Number(r&&r.total_requests||0);return Number.isFinite(i)?i:0}function HIe(e,t,n){let r=BIe(e,t);return r<=0?``:n?Tae({count:oZ(r)}):Oae({provider:oZ(Number(e&&e.total_requests||0)),cache:oZ(r)})}function UIe(e){let t=e||{};return t.total_input_cost===null||t.total_input_cost===void 0?``:jae({input:sZ(t.total_input_cost),output:sZ(t.total_output_cost)})}function y3(e){let t=Number(e&&e.rewrite_tokens_saved||0);return Number.isFinite(t)&&t>0?t:0}function WIe(e){return y3(e)>0}function b3(e){let t=e||{};return t.rewrite_cost_saved===void 0?null:t.rewrite_cost_saved}function GIe(){return Pae()}function KIe(e,t){return t===`costs`?sZ(b3(e)):uZ(y3(e))}function qIe(e,t){let n=t===`costs`,r=n?Number(b3(e)):y3(e);if(!Number.isFinite(r)||r<=0)return null;let i=e&&(n?e.total_cost:e.total_input_tokens);if(i==null)return null;let a=Number(i);return!Number.isFinite(a)||a<0?null:r/(a+r)*100}function x3(e,t){let n=qIe(e,t);return n===null?``:Lae({percent:n<.1?`<0.1`:n.toFixed(1)})}function JIe(e,t){let n=y3(e);if(n<=0)return``;let r=[Bae({count:oZ(n)}),GIe(),Uae()],i=b3(e);i!=null&&(r.push(Kae({cost:sZ(i)})),r.push(Yae()));let a=x3(e,t);return a&&r.push(Qae({percent:a,mode:t===`costs`?toe():ioe()})),r.join(` +`),tool_timeout_seconds:e.tool_timeout_seconds?String(e.tool_timeout_seconds):``}}function QPe(e,t,n){let r=String(e.name||``).trim(),i=String(e.slug||L4(r)).trim().toLowerCase(),a=String(e.url||``).trim(),o=e.transport===`sse`?`sse`:`http`;if(!r)return{error:WV()};if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(i))return{error:qV()};if(t===`create`&&(n||[]).some(e=>N4(e)===i))return{error:XV({slug:i})};if(!a)return{error:$V()};let s,c=String(e.tool_timeout_seconds||``).trim();if(c!==``){let e=Number(c);if(!Number.isSafeInteger(e)||e<0)return{error:nH()};s=e}return{payload:{name:r,slug:i,url:a,transport:o,headers:YPe(e.headers),description:String(e.description||``).trim(),enabled:!!e.enabled,allowed_tools:iZ(e.allowed_tools),disallowed_tools:iZ(e.disallowed_tools),user_paths:qPe(e.user_paths),tool_timeout_seconds:s}}}function $Pe(e,t){let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{},r=e=>(Array.isArray(e)?e:[]).filter(e=>e&&typeof e==`object`);return{server:String(n.server||e||``).trim(),status:String(n.status||``).trim(),instructions:String(n.instructions||``).trim(),tools:r(n.tools),prompts:r(n.prompts),resources:r(n.resources),templates:r(n.templates)}}function eFe(e,t){return String(e&&e.server||``)+`_`+String(t||``)}function R4(e){let t=e||M4(),n=(e,t)=>{let n=String(e||``).trim(),r=String(t||``).trim();return n&&r?n+` — `+r:r||n},r=e=>n=>({key:e+`:`+String(n.name||``),name:String(n.name||``),aggregated:eFe(t,n.name),description:String(n.description||``).trim()});return[{key:`tools`,title:aH(),items:(t.tools||[]).map(r(`tool`))},{key:`prompts`,title:cH(),items:(t.prompts||[]).map(r(`prompt`))},{key:`resources`,title:dH(),items:(t.resources||[]).map(e=>({key:`resource:`+String(e.uri||``),name:String(e.uri||``),aggregated:``,description:n(e.name,e.description)}))},{key:`templates`,title:mH(),items:(t.templates||[]).map(e=>({key:`template:`+String(e.uri_template||``),name:String(e.uri_template||``),aggregated:``,description:n(e.name,e.description)}))}].filter(e=>e.items.length>0)}function tFe(e){return R4(e).length===0}function z4(e){return(e||[]).length}function B4(e){return(e||[]).filter(e=>P4(e)===`connected`).length}function V4(e){return(e||[]).filter(e=>e&&e.enabled!==!1&&P4(e)===`degraded`).length}function nFe(e,t){return!!e&&z4(t)>0}function rFe(e){return String(B4(e))+`/`+String(z4(e))}function iFe(e){return V4(e)>0?`is-degraded`:`is-healthy`}function aFe(e){let t=V4(e);if(t>0)return Su({count:t});let n=z4(e),r=B4(e);return n>0&&r===n?yc():Tu({connected:r,total:n})}function H4(){return{interval:`day`,buckets:[],summary:{requests:0},provider_latency:[]}}function oFe(e){let t=e&&typeof e==`object`?e:{};return{interval:t.interval===`hour`?`hour`:`day`,buckets:Array.isArray(t.buckets)?t.buckets:[],summary:t.summary&&typeof t.summary==`object`?t.summary:{requests:0},provider_latency:Array.isArray(t.provider_latency)?t.provider_latency:[]}}function sFe(e){return Number(e&&e.summary&&e.summary.requests||0)>0}function cFe(e){return(e&&Array.isArray(e.provider_latency)?e.provider_latency:[]).length>0}function lFe(e){let t=e&&e.summary?e.summary.success_rate:null;return t==null?`—`:(Math.round(Number(t)*1e3)/10).toFixed(1)+`%`}function U4(e,t){return Number(e&&e.summary&&e.summary[t]||0)}function W4(e){let t=Number(e);return Number.isFinite(t)?t>=6e4?(t/6e4).toFixed(1)+` min`:t>=1e3?(t/1e3).toFixed(2)+` s`:Math.round(t)+` ms`:`-`}function uFe(e){let t=e&&e.summary?e.summary.avg_duration_ms:null;return t==null?`—`:W4(Number(t))}function G4(e,t){try{let n={},r=q();return new Intl.DateTimeFormat(r,{timeZone:t,year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,hourCycle:`h23`}).formatToParts(e).forEach(e=>{n[e.type]=e.value}),{year:n.year,month:n.month,day:n.day,hour:Number(n.hour),shortDate:new Intl.DateTimeFormat(r,{timeZone:t,month:`short`,day:`numeric`}).format(e),fullDate:new Intl.DateTimeFormat(r,{timeZone:t,year:`numeric`,month:`short`,day:`numeric`}).format(e)}}catch{let t=new Intl.DateTimeFormat(q(),{month:`short`}).format(e);return{year:String(e.getFullYear()),month:t,day:String(e.getDate()),hour:e.getHours(),shortDate:t+` `+e.getDate(),fullDate:t+` `+e.getDate()+`, `+e.getFullYear()}}}function K4(e,t,n){let r=new Date(e.start);if(Number.isNaN(r.getTime()))return String(e.start||``);let i=G4(r,n),a=i.shortDate;return t!==`hour`||i.hour===0?a:String(i.hour).padStart(2,`0`)+`:00`}function q4(e,t,n,r){let i=new Date(e.start);return Number.isNaN(i.getTime())?String(e.start||``):t===`hour`?r(e.start):G4(i,n).fullDate}function dFe(e){return{ok:e(`var(--success)`),clientError:e(`var(--warning)`),serverError:e(`var(--danger)`),other:e(`color-mix(in srgb, var(--text-muted) 55%, transparent)`)}}function fFe(e,t,n={}){let r=n.interval===`hour`?`hour`:`day`,i=n.zone,a=n.resolve||(e=>e),o=n.formatTimestamp||(e=>String(e)),s=t.map(e=>K4(e,r,i)),c=dFe(a),l=a(`var(--bg-surface)`),u=e=>Number(e)||0,d=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderColor:l,borderWidth:1,borderSkipped:!1,borderRadius:2,maxBarThickness:28}),f=[d(`2xx`,t.map(e=>u(e.status_2xx)),c.ok),d(`4xx`,t.map(e=>u(e.status_4xx)),c.clientError),d(`5xx`,t.map(e=>u(e.status_5xx)),c.serverError)];return t.some(e=>u(e.status_other)>0)&&f.push(d(Uu(),t.map(e=>u(e.status_other)),c.other)),{type:`bar`,data:{labels:s,datasets:f},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Z2(e,{title:e=>e.length?q4(t[e[0].dataIndex],r,i,o):``,label:e=>e.dataset.label+`: `+xZ(e.parsed.y),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),su({total:xZ(t)})}})},scales:{x:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:X2(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),precision:0,callback:e=>uZ(e)}}}}}}function J4(e=YNe()){let t={};return function(n){return n in t||(t[n]=e[Object.keys(t).length%e.length]),t[n]}}function pFe(e,t,n,r={}){let i=r.interval===`hour`?`hour`:`day`,a=r.zone,o=r.formatTimestamp||(e=>String(e)),s=r.providerColor||J4();return{type:`line`,data:{labels:t.map(e=>K4(e,i,a)),datasets:n.map(e=>({label:e.provider,data:(e.avg_duration_ms||[]).map(e=>e==null?null:Number(e)),borderColor:s(e.provider),backgroundColor:s(e.provider),fill:!1,tension:.3,borderWidth:2,pointRadius:0,pointHoverRadius:4,spanGaps:i===`hour`&&2}))},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Z2(e,{title:e=>e.length?q4(t[e[0].dataIndex],i,a,o):``,label:e=>{let t=(n[e.datasetIndex]&&n[e.datasetIndex].requests||[])[e.dataIndex],r=Number(t)||0;return e.dataset.label+`: `+W4(e.parsed.y)+(r>0?` (`+r.toLocaleString()+` req)`:``)}})},scales:{x:{grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:X2(),callback:e=>W4(e)}}}}}}var mFe=class{#e=A(Xt(C4()));get status(){return I(this.#e)}set status(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return I(this.#t)}set loading(e){j(this.#t,e,!0)}#n=A(!1);get loadedOnce(){return I(this.#n)}set loadedOnce(e){j(this.#n,e,!0)}#r=A(!1);get detailsExpanded(){return I(this.#r)}set detailsExpanded(e){j(this.#r,e,!0)}#i=A(Xt({}));get cardOverrides(){return I(this.#i)}set cardOverrides(e){j(this.#i,e,!0)}#a=null;#o=null;#s=!1;initPreferences(){if(this.#s)return;this.#s=!0;let e=wPe(Ui());this.detailsExpanded=e.detailsExpanded,this.cardOverrides=e.cardOverrides}cardExpanded(e){return EPe(this.cardOverrides,this.detailsExpanded,e)}toggleCard(e){let t=e&&e.name?String(e.name):``;if(!t)return;let n={...this.cardOverrides};n[t]=!this.cardExpanded(e),this.cardOverrides=n,w4(Ui(),this.cardOverrides)}toggleDetails(){this.detailsExpanded=!this.detailsExpanded,this.cardOverrides={},TPe(Ui(),this.detailsExpanded),w4(Ui(),this.cardOverrides)}detailsToggleLabel(){return this.detailsExpanded?us():ss()}async fetch(){this.initPreferences(),this.#a&&this.#a.abort();let e=new AbortController;this.#a=e,this.loading=!0;try{let t=await WX(`/admin/providers/status`,{label:`provider status`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.status=C4(),this.#l();return}let n=t.data&&typeof t.data==`object`?t.data:C4();n.summary||=C4().summary,Array.isArray(n.providers)||(n.providers=[]),this.status=n,this.#c()}catch(e){if(KX(e))return;console.error(`Failed to fetch provider status:`,e),this.status=C4(),this.#l()}finally{this.#a===e&&(this.#a=null,this.loading=!1,this.loadedOnce=!0)}}#c(){this.#l(),MPe(this.status.providers)&&(this.#o=setTimeout(()=>{this.#o=null,this.fetch()},xPe))}#l(){this.#o&&=(clearTimeout(this.#o),null)}stopPolling(){this.#l()}},hFe=class{#e=A(Xt(H4()));get stats(){return I(this.#e)}set stats(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return I(this.#t)}set loading(e){j(this.#t,e,!0)}#n=0;async fetch(){let e=++this.#n;this.loading=!0;try{let t=await WX(`/admin/audit/stats?`+TZ.queryStr(),{label:`audit stats`});if(t.stale||e!==this.#n)return;if(!t.ok){this.stats=H4();return}this.stats=oFe(t.data)}catch(t){if(console.error(`Failed to fetch audit stats:`,t),e!==this.#n)return;this.stats=H4()}finally{e===this.#n&&(this.loading=!1)}}},gFe=class{#e=A(Xt([]));get servers(){return I(this.#e)}set servers(e){j(this.#e,e,!0)}#t=A(!1);get available(){return I(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return I(this.#n)}set loading(e){j(this.#n,e,!0)}async fetch(){if(await qX.ensureLoaded(),!qX.mcpVisible()){this.available=!1,this.servers=[];return}this.loading=!0;try{let e=await WX(`/admin/mcp-servers`,{label:`mcp servers`});if(e.stale)return;if(e.status===503||e.status===404){this.available=!1,this.servers=[];return}if(this.available=!0,!e.ok){this.servers=[];return}this.servers=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch MCP servers:`,e),this.servers=[]}finally{this.loading=!1}}},_Fe=class{#e=A(Xt([]));get data(){return I(this.#e)}set data(e){j(this.#e,e,!0)}#t=A(`tokens`);get mode(){return I(this.#t)}set mode(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return I(this.#n)}set loading(e){j(this.#n,e,!0)}#r=null;async fetch(){this.#r&&this.#r.abort();let e=new AbortController;this.#r=e,this.loading=!0;try{let t=await WX(`/admin/usage/daily?days=365&interval=daily`,{label:`calendar`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.data=[];return}this.data=Array.isArray(t.data)?t.data:[]}catch(e){if(KX(e))return;console.error(`Failed to fetch calendar data:`,e),this.data=[]}finally{this.#r===e&&(this.#r=null,this.loading=!1)}}},Y4=new mFe,X4=new hFe,Z4=new gFe,Q4=new _Fe,$4=(e,t=f,n=f,r=f,i=f,a=f)=>{var o=yFe(),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=M(l),d=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},p=e=>{var t=vFe(),a=N(t),o=M(a),s=M(o,!0);E(o),He(),E(a);var c=P(a,4),l=M(c),u=M(l,!0);E(l),He(),E(c);var d=P(c,4),f=M(d,!0);E(d),F((e,t,n,r,i,o)=>{W(a,`title`,e),B(s,t),W(c,`title`,n),B(u,r),W(d,`title`,i),B(f,o)},[()=>dZ(Fpe(),n()),()=>uZ(n()),()=>dZ(Rpe(),r()),()=>uZ(r()),()=>dZ(Gpe(),i()),()=>uZ(i())]),z(e,t)};V(u,e=>{a()?e(d):e(p,-1)}),E(l),E(o),F(()=>B(c,t())),z(e,o)},e3=(e,t=f,n=f,r=f,i=f,a=f,o=f)=>{var s=SFe(),c=M(s),l=M(c,!0);E(c);var u=P(c,2),d=M(u,!0);E(u);var p=P(u,2),m=e=>{var t=bFe(),n=M(t,!0);E(t),F(()=>{W(t,`aria-label`,o().title),W(t,`title`,o().title),B(n,a())}),L(`click`,t,function(...e){o().onclick?.apply(this,e)}),z(e,t)},h=e=>{var t=xFe(),n=M(t,!0);E(t),F(()=>B(n,a())),z(e,t)};V(p,e=>{o()?e(m):e(h,-1)}),E(s),F(()=>{U(s,1,`card provider-status-flag ${t()??``} ${n()??``}`,`svelte-6tr9cf`),B(l,r()),B(d,i())}),z(e,s)},vFe=R(` i + o = `,1),yFe=R(`
`),bFe=R(``),xFe=R(` `),SFe=R(`
`),CFe=R(`
`),wFe=R(`
`),TFe=R(``),EFe=R(`
`);function DFe(e,t){D(t,!0);let n=k(()=>AZ.summary),r=k(()=>AZ.cacheOverview),i=k(()=>AZ.cacheAnalyticsEnabled()),a=k(()=>Y4.status.summary),o=k(()=>AZ.loading),s=k(()=>AZ.cacheLoading),c=k(()=>I(o)||I(i)&&I(s));function l(){let e=document.getElementById(`provider-status-section`);e&&(e.scrollIntoView({behavior:`smooth`,block:`start`}),e.focus({preventScroll:!0}))}var u=EFe(),d=M(u);{let e=k(()=>Jo()),t=k(()=>lPe(I(n)));$4(d,()=>I(e),()=>I(n).total_input_tokens,()=>I(n).total_output_tokens,()=>I(t),()=>I(o))}var f=P(d,2),p=M(f),m=M(p,!0);E(p);var h=P(p,2),g=M(h),_=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},v=e=>{var t=Or();F(e=>B(t,e),[()=>oZ(m4(I(n),I(r),I(i)))]),z(e,t)};V(g,e=>{I(c)?e(_):e(v,-1)}),E(h),E(f);var y=P(f,2),b=e=>{var t=CFe(),n=M(t),i=M(n,!0);E(n);var a=P(n,2),o=M(a),c=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},l=e=>{var t=Or();F(e=>B(t,e),[()=>oZ(I(r).summary.total_hits)]),z(e,t)};V(o,e=>{I(s)?e(c):e(l,-1)}),E(a),E(t),F(e=>B(i,e),[()=>Qo()]),z(e,t)};V(y,e=>{I(i)&&e(b)});var x=P(y,2),S=M(x),C=M(S,!0);E(S);var w=P(S,2),T=M(w),ee=e=>{{let t=k(()=>bo());f4(e,{size:18,get label(){return I(t)}})}},te=e=>{var t=Or();F(e=>B(t,e),[()=>sZ(I(n).total_cost)]),z(e,t)};V(T,e=>{I(o)?e(ee):e(te,-1)}),E(w),E(x);var ne=P(x,2),re=e=>{{let t=k(()=>eme()),n=k(()=>dPe(I(r)));$4(e,()=>I(t),()=>I(r).summary.total_input_tokens,()=>I(r).summary.total_output_tokens,()=>I(n),()=>I(s))}};V(ne,e=>{I(i)&&e(re)});var ie=P(ne,2),ae=M(ie),oe=M(ae,!0);E(ae);var se=P(ae,2),ce=e=>{var t=wFe(),n=M(t);{let e=k(()=>bo());f4(n,{size:18,get label(){return I(e)}})}E(t),z(e,t)},le=e=>{var t=TFe(),r=M(t);K2(r,{build:()=>bPe(y4(I(n)),Q2(`var(--token-prompt)`),Q2(`var(--bg-surface-hover)`))});var i=P(r,2),a=M(i,!0);E(i),E(t),F((e,n)=>{W(t,`aria-label`,e),B(a,n)},[()=>lme({rate:b4(I(n))}),()=>b4(I(n))]),z(e,t)};V(se,e=>{I(o)?e(ce):e(le,-1)}),E(ie);var ue=P(ie,2),de=e=>{{let t=k(()=>DPe(I(a))),n=k(()=>fme()),r=k(()=>kPe(I(a))),i=k(()=>jPe(I(a))),o=k(()=>APe(I(a))?{title:hme(),onclick:l}:null);e3(e,()=>`provider-status-overview-card`,()=>I(t),()=>I(n),()=>I(r),()=>I(i),()=>I(o))}};V(ue,e=>{I(a).total>0&&e(de)});var fe=P(ue,2),pe=e=>{{let t=k(()=>iFe(Z4.servers)),n=k(()=>po()),r=k(()=>rFe(Z4.servers)),i=k(()=>aFe(Z4.servers)),a=k(()=>({title:vme(),onclick:()=>bX.navigate(`mcp-servers`)}));e3(e,()=>`mcp-servers-flag`,()=>I(t),()=>I(n),()=>I(r),()=>I(i),()=>I(a))}},me=k(()=>nFe(Z4.available,Z4.servers));V(fe,e=>{I(me)&&e(pe)}),E(u),F((e,t,n,r,i)=>{B(m,e),W(h,`title`,t),B(C,n),W(ie,`title`,r),B(oe,i)},[()=>Zo(),()=>uPe(I(n),I(r),I(i)),()=>$o(),()=>ome(),()=>rme()]),z(e,u),O()}Sr([`click`]);var OFe=R(` `),kFe=R(`
`),AFe=R(` `),jFe=R(`
`),MFe=R(`

`);function NFe(e,t){D(t,!0);let n=k(()=>AZ.cacheAnalyticsEnabled()),r=k(()=>g4(AZ.summary,AZ.cacheOverview,I(n))),i=k(()=>mPe(AZ.summary,AZ.cacheOverview,I(n))),a=k(()=>pPe(AZ.summary,AZ.cacheOverview,I(n))),o=k(()=>!I(a)&&(AZ.loading||AZ.cacheLoading));var s=MFe(),c=M(s),l=M(c),u=M(l,!0);E(l);var d=P(l,2),f=M(d,!0);E(d),E(c);var p=P(c,2);let m;var h=M(p);H(h,17,()=>I(i),e=>e.key,(e,t)=>{var n=kFe(),r=M(n),i=e=>{var n=OFe(),r=M(n);E(n),F(()=>B(r,`${I(t).pct??``}%`)),z(e,n)};V(r,e=>{I(t).pct>=8&&e(i)}),E(n),F(e=>{mi(n,`width: ${I(t).pct??``}%; background: var(${I(t).colorVar??``})`),W(n,`title`,e)},[()=>_4(I(t))]),z(e,n)});var g=P(h,2),_=e=>{{let t=k(()=>bo());f4(e,{size:16,get label(){return I(t)}})}},v=e=>{var t=AFe(),n=M(t,!0);E(t),F(e=>B(n,e),[()=>Tc()]),z(e,t)};V(g,e=>{I(o)?e(_):I(a)||e(v,1)}),E(p);var y=P(p,2);H(y,21,()=>I(r),e=>e.key,(e,t)=>{var n=jFe(),r=M(n),i=P(r,2),a=M(i,!0);E(i);var o=P(i,2),s=M(o);E(o);var c=P(o,2),l=M(c,!0);E(c),E(n),F((e,i)=>{W(n,`title`,e),mi(r,`background: var(${I(t).colorVar??``})`),B(a,I(t).label),B(s,`${I(t).pct??``}%`),B(l,i)},[()=>_4(I(t)),()=>oZ(I(t).tokens)]),z(e,n)}),E(y),E(s),F((e,t,n)=>{B(u,e),B(f,t),m=U(p,1,`cache-meter-bar svelte-1yzecxj`,null,m,{"is-empty":!I(a)}),W(p,`role`,I(o)?void 0:`img`),W(p,`aria-label`,n)},[()=>Jo(),()=>Sc(),()=>I(o)?void 0:hPe(I(i))]),z(e,s),O()}var PFe=Dr(` `),FFe=Dr(``);function t3(e,t){let n=G(t,`label`,3,`No data`);var r=FFe(),i=P(M(r),9),a=e=>{var t=PFe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)};V(i,e=>{n()&&e(a)}),E(r),F(()=>{W(r,`role`,n()?`img`:void 0),W(r,`aria-label`,n()||void 0),W(r,`aria-hidden`,n()?void 0:`true`)}),z(e,r)}var n3=R(`
`),IFe=R(`

`);function LFe(e,t){D(t,!0);let n=[{value:`daily`,label:zee},{value:`weekly`,label:Hee},{value:`monthly`,label:Gee},{value:`yearly`,label:Jee}];function r(e){TZ.interval=e,t.onintervalchange?.()}function i(){let e=AZ.daily;if(e.length===0)return null;let t=TZ.rangeStart(),n=TZ.rangeEnd(),r=_Pe(v4(e,TZ.interval,t,n),v4(Array.isArray(AZ.cacheOverview.daily)?AZ.cacheOverview.daily:[],TZ.interval,t,n));return yPe(Y2(),r,{cacheEnabled:AZ.cacheAnalyticsEnabled(),resolve:Q2})}var a=IFe(),o=M(a),s=M(o),c=M(s,!0);E(s);var l=P(s,2);{let e=k(()=>Iee()),t=k(()=>n.map(e=>({value:e.value,label:e.label()})));q2(l,{get ariaLabel(){return I(e)},get options(){return I(t)},get value(){return TZ.interval},onchange:r})}E(o);var u=P(o,2),d=M(u);K2(d,{build:i});var f=P(d,2),p=e=>{var t=n3(),n=M(t);{let e=k(()=>bo());f4(n,{size:24,get label(){return I(e)}})}E(t),z(e,t)},m=e=>{var t=n3();t3(M(t),{}),E(t),z(e,t)};V(f,e=>{AZ.daily.length===0&&AZ.loading?e(p):AZ.daily.length===0&&!J.authError&&e(m,1)}),E(u),E(a),F(e=>B(c,e),[()=>TZ.chartTitle()]),z(e,a),O()}var r3=10,RFe=.7;function zFe(e,t){if(e<=0||t<=0)return 0;let n=(e/t)**+RFe,r=Math.ceil(n*r3);return r<1?1:r>r3?r3:r}function BFe(){let e=[];for(let t=0;t<=r3;t++)e.push(t);return e}function VFe(e,t,n){let r={};(e||[]).forEach(e=>{r[e.date]=e});let i=OX(AX(n,-364)),a=i.getUTCDay();i.setUTCDate(i.getUTCDate()-a);let o=[];for(let e=new Date(i);kX(e)<=n;e.setUTCDate(e.getUTCDate()+1)){let n=kX(e),i=r[n],a=0;i&&(a=t===`costs`?i.total_cost==null?0:i.total_cost:i.total_tokens||0),o.push({dateStr:n,value:a,level:0,empty:!1})}let s=0;for(let e=0;es&&(s=o[e].value);for(let e=0;e0){for(;l.length<7;)l.push({dateStr:``,value:0,level:0,empty:!0});c.push(l)}return c}function HFe(e){let t=OX(AX(e,-364)),n=t.getUTCDay();t.setUTCDate(t.getUTCDate()-n);let r=new Intl.DateTimeFormat(q(),{month:`short`,timeZone:`UTC`}),i=[],a={},o=0;for(let n=new Date(t);kX(n)<=e;n.setUTCDate(n.getUTCDate()+7),o++){let t=null;if(o===0)t=new Date(n);else for(let r=0;r<7;r++){let i=new Date(n);if(i.setUTCDate(n.getUTCDate()+r),kX(i)>e)break;if(i.getUTCDate()===1){t=i;break}}if(!t)continue;let s=t.getUTCFullYear()+`-`+t.getUTCMonth();a[s]||(i.push({label:r.format(t),col:o,key:s}),a[s]=!0)}for(let e=0;e `),qFe=R(`
`),JFe=R(`
`),YFe=R(`
`),XFe=R(`
`),ZFe=R(`

`,1);function QFe(e,t){D(t,!0);let n=A(Xt({show:!1,x:0,y:0,text:``})),r=k(()=>zX.currentDateKey()),i=k(()=>VFe(Q4.data,Q4.mode,I(r))),a=k(()=>HFe(I(r)));function o(e,t){t.empty||j(n,{show:!0,x:e.clientX,y:e.clientY,text:GFe(t,Q4.mode)},!0)}function s(){j(n,{show:!1,x:0,y:0,text:``},!0)}var c=ZFe(),l=N(c),u=M(l),d=M(u),f=M(d,!0);E(d);var p=P(d,2),m=e=>{{let t=k(()=>Qc());f4(e,{size:14,get label(){return I(t)}})}};V(p,e=>{Q4.loading&&Q4.data.length===0&&e(m)});var h=P(p,2);{let e=k(()=>tl()),t=k(()=>[{value:`tokens`,label:Jo()},{value:`costs`,label:il()}]);q2(h,{get ariaLabel(){return I(e)},get options(){return I(t)},get value(){return Q4.mode},onchange:e=>Q4.mode=e})}E(u);var g=P(u,2),_=M(g),v=P(M(_),2),y=M(v,!0);E(v);var b=P(v,4),x=M(b,!0);E(b);var S=P(b,4),C=M(S,!0);E(S),He(2),E(_);var w=P(_,2),T=M(w);H(T,21,()=>I(a),e=>e.key,(e,t)=>{var n=KFe(),r=M(n,!0);E(n),F(()=>{mi(n,`grid-column: ${I(t).col+1} / span ${I(t).span??``}`),B(r,I(t).label)}),z(e,n)}),E(T);var ee=P(T,2);H(ee,21,()=>I(i),Ir,(e,t,n)=>{var r=JFe();H(r,23,()=>I(t),(e,t)=>n+`-`+t,(e,t)=>{var n=qFe();F(()=>U(n,1,li([`contribution-calendar-cell`,I(t).empty?`empty`:`level-${I(t).level}`]),`svelte-3hfxuq`)),xr(`mouseenter`,n,e=>o(e,I(t))),xr(`mouseleave`,n,s),z(e,n)}),E(r),z(e,r)}),E(ee),E(w),E(g);var te=P(g,2),ne=M(te),re=M(ne),ie=M(re,!0);E(re),E(ne);var ae=P(ne,2),oe=M(ae),se=M(oe,!0);E(oe);var ce=P(oe,2);H(ce,16,BFe,e=>e,(e,t)=>{var n=YFe();F(()=>U(n,1,`contribution-calendar-cell level-${t??``}`,`svelte-3hfxuq`)),z(e,n)});var le=P(ce,2),ue=M(le,!0);E(le),E(ae),E(te),E(l);var de=P(l,2),fe=e=>{var t=XFe(),r=M(t,!0);E(t),F(()=>{mi(t,`left: ${I(n).x??``}px; top: ${I(n).y-40}px`),B(r,I(n).text)}),z(e,t)};V(de,e=>{I(n).show&&e(fe)}),F((e,t,n,r,i,a,o)=>{B(f,e),B(y,t),B(x,n),B(C,r),B(ie,i),B(se,a),B(ue,o)},[()=>Yc(),()=>sl(),()=>ul(),()=>pl(),()=>UFe(Q4.data,Q4.mode),()=>gl(),()=>yl()]),z(e,c),O()}var $Fe=R(``),eIe=R(`

`),tIe=R(`
`);function i3(e,t){D(t,!0);let n=G(t,`label`,3,`help`),r=G(t,`text`,3,``),i=G(t,`open`,15,!1),a=G(t,`external`,3,!1),o=k(()=>!!r()||!!t.help||a());var s=tIe(),c=M(s),l=M(c);Kr(l,()=>t.title??f);var u=P(l,2),d=e=>{var r=$Fe();let a;F(()=>{a=U(r,1,`inline-help-toggle svelte-y40or3`,null,a,{"is-open":i()}),W(r,`aria-label`,(i()?`Hide `:`Show `)+n()),W(r,`aria-expanded`,i()),W(r,`aria-controls`,t.copyId)}),L(`click`,r,()=>i(!i())),z(e,r)};V(u,e=>{I(o)&&e(d)}),Kr(P(u,2),()=>t.extra??f),E(c);var p=P(c,2),m=e=>{var n=eIe(),i=M(n),a=e=>{var n=kr();Kr(N(n),()=>t.help),z(e,n)},o=e=>{var t=Or();F(()=>B(t,r())),z(e,t)};V(i,e=>{t.help?e(a):e(o,-1)}),E(n),F(()=>W(n,`id`,t.copyId)),z(e,n)};V(p,e=>{i()&&I(o)&&!a()&&e(m)}),E(s),z(e,s),O()}Sr([`click`]);var nIe=R(`
`);function a3(e,t){let n=G(t,`label`,3,`Loading...`),r=G(t,`class`,3,``);var i=nIe(),a=P(M(i),2),o=M(a,!0);E(a),E(i),F(()=>{U(i,1,li([`loading-state`,r()]),`svelte-hzxv1d`),B(o,n())}),z(e,i)}var rIe=R(`

`),iIe=R(`
`),aIe=R(`

2xx 4xx 5xx
`,1),oIe=R(`
`);function sIe(e,t){D(t,!0);let n=J4(),r=k(()=>X4.stats);function i(){return{interval:I(r).interval,zone:zX.effectiveTimezone(),resolve:Q2,formatTimestamp:e=>zX.formatTimestamp(e)}}var a=kr(),o=N(a),s=e=>{var t=aIe(),a=N(t),o=M(a),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=M(l),d=M(u),f=M(d,!0);E(d);var p=P(d,2),m=M(p,!0);E(p),E(u);var h=P(u,2),g=P(M(h),4),_=M(g,!0);E(g),E(h);var v=P(h,2),y=P(M(v),4),b=M(y,!0);E(y),E(v);var x=P(v,2),S=P(M(x),4),C=M(S,!0);E(S),E(x),E(l),E(o);var w=P(o,2);K2(M(w),{build:()=>fFe(Y2(),I(r).buckets,i())}),E(w),E(a);var T=P(a,2),ee=e=>{var t=iIe(),a=M(t),o=M(a);{let e=e=>{var t=rIe(),n=M(t,!0);E(t),F(e=>B(n,e),[()=>Nme()]),z(e,t)},t=k(()=>Ime()),n=k(()=>zme());i3(o,{copyId:`audit-latency-help-copy`,get label(){return I(t)},get text(){return I(n)},title:e,$$slots:{title:!0}})}var s=P(o,2),c=M(s),l=M(c),u=M(l,!0);E(l);var d=P(l,2),f=M(d,!0);E(d),E(c),E(s),E(a);var p=P(a,2);K2(M(p),{build:()=>pFe(Y2(),I(r).buckets,I(r).provider_latency,{...i(),providerColor:n})}),E(p),E(t),F((e,t,n)=>{W(c,`title`,e),B(u,t),B(f,n)},[()=>Hme(),()=>Gme(),()=>uFe(I(r))]),z(e,t)},te=k(()=>cFe(I(r)));V(T,e=>{I(te)&&e(ee)}),F((e,t,n,r,i,a,o,s)=>{B(c,e),W(l,`aria-label`,t),W(u,`title`,n),B(f,r),B(m,i),B(_,a),B(b,o),B(C,s)},[()=>xme(),()=>wme(),()=>Dme(),()=>Ame(),()=>lFe(I(r)),()=>oZ(U4(I(r),`status_2xx`)),()=>oZ(U4(I(r),`status_4xx`)),()=>oZ(U4(I(r),`status_5xx`))]),z(e,t)},c=k(()=>sFe(I(r))),l=e=>{var t=oIe(),n=M(t);{let e=k(()=>ts());a3(n,{get label(){return I(e)}})}E(t),z(e,t)};V(o,e=>{I(c)?e(s):X4.loading&&e(l,1)}),z(e,a),O()}var o3=(e,t=f,n=f,r)=>{let i=yt(()=>h(r?.(),!1));var a=uIe(),o=M(a),s=M(o,!0);E(o);var c=P(o,2),l=e=>{var t=cIe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)},u=e=>{var t=lIe(),r=M(t,!0);E(t),F(()=>B(r,n())),z(e,t)};V(c,e=>{I(i)?e(l):e(u,-1)}),E(a),F(()=>B(s,t())),z(e,a)},cIe=R(` `),lIe=R(` `),uIe=R(`
`),dIe=R(`

`),fIe=R(`
`),pIe=R(`
`),mIe=R(`
`),hIe=R(`
`),gIe=R(`

`);function _Ie(e,t){D(t,!0);let n=k(()=>BPe(t.provider)),r=k(()=>[[Ps(),t.provider.config?.base_url],[Ls(),t.provider.config?.api_version]].filter(([,e])=>!!e));var i=gIe();let a;var o=M(i),s=M(o),c=M(s,!0);E(s);var l=P(s,2),u=e=>{var n=dIe(),r=M(n,!0);E(n),F(()=>B(r,t.provider.last_error)),z(e,n)};V(l,e=>{t.provider.last_error&&e(u)});var d=P(l,2),f=e=>{var r=hIe(),i=M(r);{let e=k(()=>Bs()),n=k(()=>VPe(t.provider));o3(i,()=>I(e),()=>I(n))}var a=P(i,2),o=e=>{var r=fIe(),i=M(r),a=M(i,!0);E(i);var o=P(i,2),s=M(o),c=M(s,!0);E(s),E(o),E(r),F((e,t)=>{B(a,e),U(s,1,li([`provider-status-health-state`,I(n)]),`svelte-6y9wjv`),B(c,t)},[()=>Us(),()=>zPe(t.provider)]),z(e,r)},s=k(()=>k4(t.provider));V(a,e=>{I(s)&&e(o)});var c=P(a,2),l=e=>{var n=mIe(),r=M(n),i=M(r,!0);E(r);var a=P(r,2);H(a,21,()=>A4(t.provider),e=>e.model,(e,t)=>{var n=pIe();let r;var i=M(n),a=M(i,!0);E(i);var o=P(i,2),s=M(o,!0);E(o),E(n),F((e,i)=>{r=U(n,1,`provider-status-health-model svelte-6y9wjv`,null,r,{"is-flagged":I(t).flagged}),W(n,`title`,e),B(a,I(t).model),B(s,i)},[()=>UPe(I(t)),()=>HPe(I(t))]),z(e,n)}),E(a),E(n),F(e=>B(i,e),[()=>Ks()]),z(e,n)},u=k(()=>A4(t.provider).length>0);V(c,e=>{I(u)&&e(l)}),E(r),z(e,r)},p=k(()=>O4(t.provider));V(d,e=>{I(p)&&e(f)});var m=P(d,2),h=M(m);H(h,17,()=>I(r),([e,t])=>e,(e,t)=>{var n=k(()=>g(I(t),2));o3(e,()=>I(n)[0],()=>I(n)[1],()=>!0)});var _=P(h,2);{let e=k(()=>Ys()),n=k(()=>LPe(t.provider));o3(_,()=>I(e),()=>I(n))}var v=P(_,2);{let e=k(()=>Qs()),n=k(()=>FPe(t.provider));o3(v,()=>I(e),()=>I(n))}var y=P(v,2);{let e=k(()=>tc()),n=k(()=>IPe(t.provider));o3(y,()=>I(e),()=>I(n))}E(m),E(o),E(i),F(()=>{a=U(i,1,`provider-status-details svelte-6y9wjv`,null,a,{"is-expanded":t.expanded,"is-collapsed":!t.expanded}),W(i,`aria-hidden`,!t.expanded),B(c,t.provider.status_reason)}),z(e,i),O()}var vIe=R(` `),yIe=R(``),bIe=R(`

`);function xIe(e,t){D(t,!0);let n=k(()=>Y4.cardExpanded(t.provider)),r=e=>zX.formatTimestamp(e);var i=bIe(),a=M(i),o=M(a),s=M(o),c=M(s),l=M(c,!0);E(c);var u=P(c,2),d=e=>{var n=vIe(),r=M(n);E(n),F(e=>B(r,`(${e??``})`),[()=>E4(t.provider)]),z(e,n)},f=k(()=>E4(t.provider));V(u,e=>{I(f)&&e(d)});var p=P(u,2),m=e=>{var n=yIe();F((e,t,r)=>{W(n,`href`,e),W(n,`aria-label`,t),W(n,`title`,r)},[()=>D4(t.provider),()=>ps({provider:E4(t.provider)||t.provider.name}),()=>ps({provider:E4(t.provider)||t.provider.name})]),z(e,n)},h=k(()=>D4(t.provider));V(p,e=>{I(h)&&e(m)}),E(s),E(o);var g=P(o,2),_=M(g,!0);E(g),E(a);var v=P(a,2),y=M(v),b=M(y),x=M(b,!0);E(b);var S=P(b,2),C=M(S,!0);E(S),E(y);var w=P(y,2),T=M(w),ee=M(T,!0);E(T);var te=P(T,2),ne=M(te,!0);E(te),E(w),E(v);var re=P(v,2);_Ie(re,{get provider(){return t.provider},get expanded(){return I(n)}});var ie=P(re,2);let ae;K(M(ie),{get icon(){return JY},class:`provider-status-card-toggle-icon`}),E(ie),E(i),F((e,r,i,a,o,s,c,u,d)=>{B(l,t.provider.name),U(g,1,`provider-status-pill ${e??``}`,`svelte-nopjmh`),W(g,`title`,r),B(_,t.provider.status_label),B(x,i),B(C,a),B(ee,o),W(te,`title`,s),B(ne,c),ae=U(ie,1,`provider-status-card-toggle svelte-nopjmh`,null,ae,{"is-expanded":I(n)}),W(ie,`aria-expanded`,I(n)),W(ie,`aria-label`,u),W(ie,`title`,d)},[()=>OPe(t.provider.status),()=>RPe(t.provider),()=>gs(),()=>oZ(t.provider.runtime?.inventory_stale?0:t.provider.runtime?.discovered_model_count),()=>ys(),()=>PPe(t.provider,r),()=>NPe(t.provider,r),()=>I(n)?Ts({provider:t.provider.name}):Ss({provider:t.provider.name}),()=>I(n)?js():Os()]),L(`click`,ie,()=>Y4.toggleCard(t.provider)),z(e,i),O()}Sr([`click`]);var SIe=R(`

`),CIe=R(`
`);function wIe(e,t){D(t,!0);let n=k(()=>Y4.status.providers);var r=kr(),i=N(r),a=e=>{var t=SIe(),r=M(t),i=M(r),a=M(i),o=M(a,!0);E(a),E(i);var s=P(i,2),c=M(s),l=M(c,!0);E(c);var u=P(c,2);let d;E(s),E(r);var f=P(r,2);H(f,21,()=>I(n),e=>e.name,(e,t)=>{xIe(e,{get provider(){return I(t)}})}),E(f),E(t),F((e,t,n)=>{B(o,e),W(s,`aria-checked`,Y4.detailsExpanded),W(s,`title`,t),B(l,n),d=U(u,1,`provider-status-toggle-track svelte-1kx3uw4`,null,d,{"is-active":Y4.detailsExpanded})},[()=>Jme(),()=>Y4.detailsToggleLabel(),()=>Y4.detailsToggleLabel()]),L(`click`,s,()=>Y4.toggleDetails()),z(e,t)},o=e=>{var t=CIe(),n=M(t);{let e=k(()=>is());f4(n,{size:18,get label(){return I(e)}})}E(t),z(e,t)};V(i,e=>{I(n).length>0?e(a):Y4.loading&&!Y4.loadedOnce&&e(o,1)}),z(e,r),O()}Sr([`click`]);var TIe=R(`
`);function s3(e,t){D(t,!0);function n(){AZ.fetchUsage(),AZ.fetchCacheOverview(``),X4.fetch(),Y4.fetch(),Z4.fetch(),Q4.fetch()}function r(){AZ.fetchUsage(),AZ.fetchCacheOverview(``),X4.fetch()}function i(){r(),Q4.fetch()}hn(()=>{if(J.refreshTick,bX.page===`overview`)return sr(()=>{n(),d4.start()}),()=>{d4.stop(),Y4.stopPolling()}});var a=TIe(),o=M(a);sPe(o,{});var s=P(o,2),c=M(s),l=M(c,!0);E(c),E(s);var u=P(s,2);MZ(M(u),{onchange:i}),E(u);var d=P(u,2);DZ(d,{});var f=P(d,2);DFe(f,{});var p=P(f,2);NFe(p,{});var m=P(p,2);LFe(m,{onintervalchange:r});var h=P(m,2);QFe(h,{});var g=P(h,2);sIe(g,{}),wIe(P(g,2),{}),E(a),F(e=>B(l,e),[()=>yo()]),z(e,a),O()}var EIe=`/admin/live/logs?types=audit,usage`;function c3(e,t,n){return!!t&&String(e&&e.id||``).trim()===t||!!n&&String(e&&e.request_id||``).trim()===n}function DIe(e){switch(e){case`date_range`:return Mce();case`filters`:return Fce();case`pagination`:return Rce();default:return``}}function OIe(e){let t=EIe,n=Number(e||0);return Number.isFinite(n)&&n>0&&(t+=`&cursor=`+encodeURIComponent(String(n))),t}function kIe(){return{async consumeLiveLogsBody(e){await t4(e,e=>this.applyLiveLogEvent(e))},applyLiveLogEvent(e){if(!e||typeof e!=`object`)return;let t=Number(e.seq||0);Number.isFinite(t)&&t>this.liveLogsLastSeq&&(this.liveLogsLastSeq=t);let n=String(e.type||``).trim();if(n!==`heartbeat`){if(n===`reset`){this.reloadLiveLogSources();return}if(n===`audit.removed`){this.removeLiveAuditEntry(e.data);return}if(n.indexOf(`audit.`)===0){this.mergeLiveAuditEntry(e.data||{},n);return}n.indexOf(`usage.`)===0&&(this.mergeLiveUsageEntry(e.data||{},n),typeof this.noteLiveTokenUsage==`function`&&this.noteLiveTokenUsage(n))}},reloadLiveLogSources(){typeof this.fetchUsage==`function`&&this.fetchUsage(),this.page===`audit-logs`&&typeof this.fetchAuditLog==`function`&&this.fetchAuditLog(!0)},auditLivePauseReason(){return!this.auditLog||this.auditLog.offset!==0?`pagination`:this.auditSearch||this.auditMethod||this.auditStatusCode||this.auditStream?`filters`:!this.followsToday&&(this.customStartDate||this.customEndDate)?`date_range`:null},auditLiveInsertAllowed(){return!this.auditLivePauseReason()},usageLiveInsertAllowed(){return this.usageLog&&this.usageLog.offset===0&&!this.usageLogSearch&&!this.usageFilterModel&&!this.usageFilterProvider&&!this.usageFilterLabel&&!this.usageFilterUserPath&&!this.usageFilterSession},mergeLiveAuditEntry(e,t){if(!e||typeof e!=`object`)return;let n=String(e.id||e.request_id||``).trim();if(!n)return;let r=String(e.request_id||``).trim(),i=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],a=i.findIndex(e=>c3(e,n,r)),o=a>=0&&i[a]||{},s=t===`audit.detail`,c=s?{...e,_detail_loaded:!0,_response_partial:!1,bodies_omitted:!1}:this.liveAuditPatch(o,e,t);if(a>=0){let e=this.mergeLiveAuditPatch(o,c);return i.splice(a,1,e),this.auditLog.entries=[...i],this.regroupLiveAuditHead(e),s||this.fetchExpandedAuditDetailIfReady(e),this.cacheMergedAuditRecord(e,t),e}let l=this.mergeLiveAuditChild(e,c);if(l)return s||this.fetchExpandedAuditDetailIfReady(l),this.cacheMergedAuditRecord(l,t),l;if(!this.auditLiveInsertAllowed()){this.cacheMergedAuditRecord(c,t);return}if(!s&&this.auditGroupSessions){let e=this.foldLiveAuditIntoThread(c);if(e)return this.fetchExpandedAuditDetailIfReady(e),this.cacheMergedAuditRecord(e,t),e}this.auditLog.entries=[this.mergeLiveAuditUsagePatch(c),...i].slice(0,this.auditLog.limit||25),this.auditLog.total=Number(this.auditLog.total||0)+1;let u=this.auditLog.entries[0];return s||this.fetchExpandedAuditDetailIfReady(u),this.cacheMergedAuditRecord(u,t),u},liveAuditPatch(e,t,n){let r=this.liveAuditStateAfter(e._live_state,n),i=this.liveAuditEventFlushed(e._live_state)||this.liveAuditEventFlushed(r),a={...t,_live:!0,_live_state:r,_audit_flushed:i,_live_pending:!i};return n===`audit.stream`?a._response_partial=!0:this.liveAuditStateSettled(n)&&(a._response_partial=!1),a},mergeLiveAuditChild(e,t){let n=this.auditThreadChildren;if(!n||typeof n!=`object`)return null;let r=String(e.id||``).trim(),i=String(e.request_id||``).trim(),a=Object.keys(n);for(let e=0;ec3(e,r,i));if(c<0)continue;let l=this.mergeLiveAuditPatch(s[c]||{},t),u=[...s];return u.splice(c,1,l),this.auditThreadChildren={...n,[a[e]]:{...o,entries:u}},l}return null},regroupLiveAuditHead(e){if(!this.auditGroupSessions)return null;let t=String(e&&e.session_id||``).trim();if(!t)return null;let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=String(e.id||``).trim(),i=n.findIndex(e=>String(e.id||``).trim()===r);if(i<0)return null;let a=n.findIndex((e,n)=>n!==i&&String(e.session_id||``).trim()===t);if(a<0)return null;let o=n[a],s=Date.parse(o&&o.timestamp),c=Date.parse(e&&e.timestamp),l=Number.isFinite(s)&&Number.isFinite(c)&&s>c,u=l?o:e,d=l?e:o,f={...u,session_count:Math.max(1,Number(o.session_count||1))+Math.max(1,Number(e.session_count||1))},p=n.filter((e,t)=>t!==i&&t!==a);return p.unshift(f),this.auditLog.entries=p,this.auditLog.total=Math.max(0,Number(this.auditLog.total||0)-1),this.prependLiveAuditThreadChild(t,d),f},foldLiveAuditIntoThread(e){let t=String(e&&e.session_id||``).trim();if(!t)return null;let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=n.findIndex(e=>String(e.session_id||``).trim()===t);if(r<0)return null;let i=n[r],a=Number(i.session_count),o=this.mergeLiveAuditUsagePatch({...e,session_count:(Number.isFinite(a)&&a>0?a:1)+1}),s=[...n];return s.splice(r,1),s.unshift(o),this.auditLog.entries=s,this.prependLiveAuditThreadChild(t,i),o},prependLiveAuditThreadChild(e,t){let n=this.auditThreadChildren||{},r=n[e],i={...t};delete i.session_count;let a=r&&Array.isArray(r.entries)?{...r,entries:[i,...r.entries],total:Number(r.total||r.entries.length)+1}:{loading:!1,loaded:!1,entries:[i],total:1};this.auditThreadChildren={...n,[e]:a}},removeLiveAuditThreadChild(e,t){let n=this.auditThreadChildren;!n||typeof n!=`object`||Object.keys(n).forEach(r=>{let i=n[r],a=i&&Array.isArray(i.entries)?i.entries:[],o=a.filter(n=>!c3(n,e,t)),s=a.length-o.length;s!==0&&(this.auditThreadChildren={...this.auditThreadChildren,[r]:{...i,entries:o,total:Math.max(0,Number(i.total||a.length)-s)}},this.decrementLiveAuditThreadCount(r,s))})},decrementLiveAuditThreadCount(e,t){let n=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],r=n.findIndex(t=>String(t.session_id||``).trim()===e);if(r<0)return;let i=n[r],a=[...n];a.splice(r,1,{...i,session_count:Math.max(1,Number(i.session_count||1)-t)}),this.auditLog.entries=a},mergeLiveAuditPatch(e,t){let n={...e,...t};return t.data===void 0&&e.data!==void 0?n.data=e.data:e.data&&t.data&&typeof e.data==`object`&&typeof t.data==`object`&&!Array.isArray(e.data)&&!Array.isArray(t.data)&&(n.data={...e.data,...t.data}),this.mergeLiveAuditUsagePatch(n)},mergeLiveAuditUsagePatch(e){let t=this.liveUsageEntryForAudit(e);if(!t)return e;let n=this.auditEntryWithLiveUsage(e,t);return this.removeSkippedLiveUsage(t),n},liveUsageEntryForAudit(e){let t=String(e&&e.request_id||``).trim();return t&&((this.usageLog&&Array.isArray(this.usageLog.entries)?this.usageLog.entries:[]).find(e=>String(e&&e.request_id||``).trim()===t)||this.skippedLiveUsageByRequestId&&this.skippedLiveUsageByRequestId[t])||null},cacheMergedAuditRecord(e,t){return e&&typeof this.cacheAuditRecord==`function`?this.cacheAuditRecord(e,t):e},fetchExpandedAuditDetailIfReady(e){!e||!this.isAuditEntryExpanded||!this.isAuditEntryExpanded(e)||String(e._live_state||``).trim()!==`audit.flushed`&&!e._audit_flushed||typeof this.fetchAuditEntryDetail==`function`&&this.fetchAuditEntryDetail(e)},liveAuditStateRank(e){switch(String(e||``).trim()){case`audit.started`:return 10;case`audit.updated`:case`audit.stream`:return 20;case`audit.completed`:return 30;case`audit.failed`:case`audit.flushed`:case`audit.detail`:return 40;default:return 0}},liveAuditStateAfter(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return this.liveAuditStateRank(n)>this.liveAuditStateRank(r)?n:r},liveAuditStateSettled(e){return this.liveAuditStateRank(e)>=this.liveAuditStateRank(`audit.completed`)},liveAuditEventFlushed(e){let t=String(e||``).trim();return t===`audit.failed`||t===`audit.flushed`||t===`audit.detail`},removeLiveAuditEntry(e){if(!e||!this.auditLog||!Array.isArray(this.auditLog.entries))return;let t=String(e.id||``).trim(),n=String(e.request_id||``).trim();if(!t&&!n)return;let r=this.auditLog.entries,i=[],a=0,o=0,s=!1;r.forEach(e=>{if(!c3(e,t,n)){i.push(e);return}a++;let r=String(e.session_id||``).trim(),c=Math.max(1,Number(e.session_count||1));if(!this.auditGroupSessions||!r||c<=1)return;o++;let l=this.auditThreadChildren&&this.auditThreadChildren[r],u=l&&Array.isArray(l.entries)?l.entries.filter(e=>!c3(e,t,n)):[];if(u.length===0){s=!0;return}let d={...u[0],session_id:r,session_count:c-1};i.push(d),this.auditThreadChildren={...this.auditThreadChildren,[r]:{...l,entries:u.slice(1),total:Math.max(0,Number(l.total||c)-1)}}}),a>0&&(this.auditLog.entries=i,this.auditLog.total=Math.max(0,Number(this.auditLog.total||0)-a+o)),this.removeLiveAuditThreadChild(t,n),s&&typeof this.fetchAuditLog==`function`&&this.fetchAuditLog(!0)},mergeLiveUsageEntry(e,t){if(!e||typeof e!=`object`)return;e={...e,_live_state:t||e._live_state||`usage.completed`};let n=String(e.id||``).trim();if(!n)return;let r=this.usageLog&&Array.isArray(this.usageLog.entries)?this.usageLog.entries:[],i=r.findIndex(e=>String(e.id||``).trim()===n);if(i>=0){let t=r[i]||{},n=this.mergeLiveUsagePatch(t,e);if(this.applyLiveUsageToAudit(n),this.liveUsageShouldSkip(n)){r.splice(i,1),this.usageLog.entries=[...r],this.usageLog.total=Math.max(0,Number(this.usageLog.total||0)-1),this.storeSkippedLiveUsage(n);return}r.splice(i,1,n),this.usageLog.entries=[...r],this.removeSkippedLiveUsage(n);return}let a=this.mergeLiveUsagePatch(this.liveUsageSeedForEntry(e),e);if(this.applyLiveUsageToAudit(a),this.liveUsageShouldSkip(a)){this.storeSkippedLiveUsage(a);return}this.removeSkippedLiveUsage(a),this.usageLog.entries=[a,...r].slice(0,this.usageLog.limit||50),this.usageLog.total=Number(this.usageLog.total||0)+1},mergeLiveUsagePatch(e,t){e=e&&typeof e==`object`?e:{};let n=this.liveUsageStateAfter(e._live_state,t&&t._live_state),r=this.liveUsageEventFlushed(e)||this.liveUsageEventFlushed({...t,_live_state:n});return{...e,...t,_live:!0,_live_state:n||`usage.completed`,_live_pending:!r,_usage_flushed:r}},liveUsageShouldSkip(e){return!!(this.usageLogHideCached&&this.liveUsageEntryCached(e))||!this.usageLiveInsertAllowed()},liveUsageSeedForEntry(e){return this.skippedLiveUsageForEntry(e)||this.auditLiveUsageForEntry(e)},skippedLiveUsageForEntry(e){let t=String(e&&e.request_id||``).trim();return t&&this.skippedLiveUsageByRequestId?this.skippedLiveUsageByRequestId[t]:null},auditLiveUsageForEntry(e){let t=String(e&&e.request_id||``).trim();if(!t||!this.auditLog||!Array.isArray(this.auditLog.entries))return null;let n=this.auditLog.entries.find(e=>String(e&&e.request_id||``).trim()===t),r=n&&n.usage&&typeof n.usage==`object`&&!Array.isArray(n.usage)?n.usage:null;return r?{id:e&&e.id,request_id:t,entries:r.entries,input_tokens:r.input_tokens,uncached_input_tokens:r.uncached_input_tokens,cached_input_tokens:r.cached_input_tokens,cache_write_input_tokens:r.cache_write_input_tokens,output_tokens:r.output_tokens,total_tokens:r.total_tokens,cached_input_ratio:r.cached_input_ratio,estimated_cached_characters:r.estimated_cached_characters,_live_state:n._usage_live_state,_live_pending:n._usage_live_pending,_usage_flushed:n._usage_flushed}:null},storeSkippedLiveUsage(e){let t=String(e&&e.request_id||``).trim();t&&((!this.skippedLiveUsageByRequestId||typeof this.skippedLiveUsageByRequestId!=`object`||Array.isArray(this.skippedLiveUsageByRequestId))&&(this.skippedLiveUsageByRequestId={}),this.skippedLiveUsageByRequestId[t]=e)},removeSkippedLiveUsage(e){let t=String(e&&e.request_id||``).trim();t&&this.skippedLiveUsageByRequestId&&delete this.skippedLiveUsageByRequestId[t]},liveUsageEntryCached(e){let t=String(e&&e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`||!!(e&&e.cache_hit)},liveUsageEventFlushed(e){let t=String(e&&e._live_state||``).trim();return!!(e&&e._usage_flushed)||t===`usage.failed`||t===`usage.flushed`},liveUsageStateRank(e){switch(String(e||``).trim()){case`usage.completed`:return 10;case`usage.failed`:case`usage.flushed`:return 20;default:return 0}},liveUsageStateAfter(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return this.liveUsageStateRank(n)>this.liveUsageStateRank(r)?n:r},applyLiveUsageToAudit(e){let t=String(e&&e.request_id||``).trim();if(!t||!this.auditLog||!Array.isArray(this.auditLog.entries))return;let n=this.auditLog.entries.findIndex(e=>String(e.request_id||``).trim()===t);if(n>=0){let t=this.auditLog.entries[n];this.auditLog.entries.splice(n,1,this.auditEntryWithLiveUsage(t,e)),this.auditLog.entries=[...this.auditLog.entries]}let r=this.auditThreadChildren;if(!r||typeof r!=`object`)return;let i=r,a=!1;Object.keys(r).forEach(n=>{let r=i[n],o=r&&Array.isArray(r.entries)?r.entries:[],s=o.findIndex(e=>String(e.request_id||``).trim()===t);if(s<0)return;let c=[...o];c.splice(s,1,this.auditEntryWithLiveUsage(o[s],e)),i={...i,[n]:{...r,entries:c}},a=!0}),a&&(this.auditThreadChildren=i)},auditEntryWithLiveUsage(e,t){let n=this.liveUsageStateAfter(e._usage_live_state,t._live_state||`usage.completed`),r=this.liveUsageEventFlushed({_live_state:n,_usage_flushed:e._usage_flushed||t._usage_flushed});return{...e,usage:this.liveUsageSummary(t,e.usage),_usage_live_state:n||`usage.completed`,_usage_live_pending:!r,_usage_flushed:r}},liveUsageSummary(e,t){let n=t&&typeof t==`object`&&!Array.isArray(t)?t:{},r=this.liveNumber(e.input_tokens,this.liveNumber(n.input_tokens,0)),i=this.liveNumber(e.output_tokens,this.liveNumber(n.output_tokens,0)),a=this.liveNumber(e.uncached_input_tokens,this.liveNumber(n.uncached_input_tokens,0)),o=this.liveNumber(e.cached_input_tokens,this.liveNumber(n.cached_input_tokens,0)),s=this.liveNumber(e.cache_write_input_tokens,this.liveNumber(n.cache_write_input_tokens,0));r>0&&a+o+s===0&&(a=r);let c=a+o+s||r,l=c+i||this.liveNumber(e.total_tokens,this.liveNumber(n.total_tokens,0)),u=this.liveNumber(e.cached_input_ratio,this.liveNumber(n.cached_input_ratio,c>0?o/c:0));return{entries:Math.max(1,this.liveNumber(e.entries,this.liveNumber(n.entries,1))),input_tokens:c,uncached_input_tokens:a,cached_input_tokens:o,cache_write_input_tokens:s,output_tokens:i,total_tokens:l,cached_input_ratio:u,estimated_cached_characters:this.liveNumber(e.estimated_cached_characters,this.liveNumber(n.estimated_cached_characters,o*4))}},liveNumber(e,t){let n=Number(e);return Number.isFinite(n)?n:t},auditEntryShouldFetchDetail(e){return!e||e._detail_loading||e._detail_loaded||this.auditEntryLiveDetailPending(e)?!1:this.auditEntryNeedsPersistedLiveDetail(e)||e.bodies_omitted?!0:!this.auditEntryHasDetailData(e)},auditEntryLiveDetailPending(e){if(!e||!e._live)return!1;let t=String(e._live_state||``).trim();return t===`audit.failed`||!e._audit_flushed&&t!==`audit.flushed`&&t!==`audit.detail`},auditEntryNeedsPersistedLiveDetail(e){return!!(e&&e._live&&!e._detail_loaded)},auditEntryHasDetailData(e){let t=e&&e.data;return!t||typeof t!=`object`?!1:t.request_headers!==void 0||t.response_headers!==void 0||t.request_body!==void 0||t.response_body!==void 0||t.request_body_too_big_to_handle!==void 0||t.response_body_too_big_to_handle!==void 0||t.user_agent!==void 0||t.api_key_hash!==void 0||t.temperature!==void 0||t.max_tokens!==void 0||t.error_message!==void 0||t.error_code!==void 0},clearAuditDetailLoading(e){if(!e)return;let t=String(e.id||``).trim(),n=String(e.request_id||``).trim(),r=this.auditLog&&Array.isArray(this.auditLog.entries)?this.auditLog.entries:[],i=r.find(e=>t&&String(e.id||``).trim()===t?!0:!!(n&&String(e.request_id||``).trim()===n)),a=i||e;a._detail_loading=!1,i&&(this.auditLog.entries=[...r])}}}var l3={"audit.started":10,"audit.updated":20,"audit.stream":20,"audit.completed":30,"audit.failed":40,"audit.flushed":40,"audit.detail":40},AIe=new Set(Object.keys(l3));function u3(e){return String(e&&(e.id||e.request_id)||``).trim()}function jIe(e,t){let n=e&&typeof e==`object`?e:{},r=t&&typeof t==`object`?t:{},i={...n,...r};if(r.data==null&&n.data!=null)i.data=n.data;else if(d3(n.data)&&d3(r.data)){i.data={...n.data,...r.data};let e=PIe(n.data.request_revisions,r.data.request_revisions);e&&(i.data.request_revisions=e)}let a=String(n._live_state||``).trim(),o=String(r._live_state||``).trim();return(l3[a]||0)>(l3[o]||0)&&(i._live_state=a),n._audit_flushed&&(i._audit_flushed=!0),i._audit_flushed&&(i._live_pending=!1),n._detail_loaded&&!r._detail_loaded&&(i._detail_loaded=!0,i.bodies_omitted=!1),i.bodies_omitted&&d3(i.data)&&(i.data.request_body!==void 0||i.data.response_body!==void 0)&&(i.bodies_omitted=!1),i}function MIe(e,t){let n=Number(t||0);return(Array.isArray(e)?e:[]).filter(e=>Number(e&&e.version||0)>n)}function NIe(e){return AIe.has(String(e&&e.eventType||``).trim())}function PIe(e,t){return!Array.isArray(e)||!Array.isArray(t)?null:t.map(t=>{let n=Number(t&&t.seq||0),r=e.find(e=>Number(e&&e.seq||0)===n);if(!r)return t;let i={...t};return(i.body==null||i.body===``)&&r.body!=null&&(i.body=r.body),i.detail==null&&r.detail!=null&&(i.detail=r.detail),i})}function d3(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}var f3=200,p3=class{#e=A(Xt({entries:[],total:0,limit:25,offset:0}));get auditLog(){return I(this.#e)}set auditLog(e){j(this.#e,e,!0)}#t=A(Xt({entries:[],total:0,limit:50,offset:0}));get usageLog(){return I(this.#t)}set usageLog(e){j(this.#t,e,!0)}#n=A(Xt({}));get auditRecords(){return I(this.#n)}set auditRecords(e){j(this.#n,e,!0)}#r=A(Xt([]));get auditRecordChanges(){return I(this.#r)}set auditRecordChanges(e){j(this.#r,e,!0)}auditRecordVersion=0;auditRecordPins=new Set;#i=A(``);get auditSearch(){return I(this.#i)}set auditSearch(e){j(this.#i,e,!0)}#a=A(``);get auditMethod(){return I(this.#a)}set auditMethod(e){j(this.#a,e,!0)}#o=A(``);get auditStatusCode(){return I(this.#o)}set auditStatusCode(e){j(this.#o,e,!0)}#s=A(``);get auditStream(){return I(this.#s)}set auditStream(e){j(this.#s,e,!0)}#c=A(Wi(`gomodel_audit_group_sessions`,`true`)!==`false`);get auditGroupSessions(){return I(this.#c)}set auditGroupSessions(e){j(this.#c,e,!0)}#l=A(Xt({}));get auditThreadChildren(){return I(this.#l)}set auditThreadChildren(e){j(this.#l,e,!0)}#u=A(``);get usageLogSearch(){return I(this.#u)}set usageLogSearch(e){j(this.#u,e,!0)}#d=A(``);get usageFilterModel(){return I(this.#d)}set usageFilterModel(e){j(this.#d,e,!0)}#f=A(``);get usageFilterProvider(){return I(this.#f)}set usageFilterProvider(e){j(this.#f,e,!0)}#p=A(``);get usageFilterLabel(){return I(this.#p)}set usageFilterLabel(e){j(this.#p,e,!0)}#m=A(``);get usageFilterUserPath(){return I(this.#m)}set usageFilterUserPath(e){j(this.#m,e,!0)}#h=A(``);get usageFilterSession(){return I(this.#h)}set usageFilterSession(e){j(this.#h,e,!0)}#g=A(!1);get usageLogHideCached(){return I(this.#g)}set usageLogHideCached(e){j(this.#g,e,!0)}#_=A(!1);get liveLogsStreaming(){return I(this.#_)}set liveLogsStreaming(e){j(this.#_,e,!0)}liveLogsLastSeq=0;liveLogsReconnectAttempts=0;liveLogsReconnectTimer=null;liveLogsController=null;skippedLiveUsageByRequestId=null;fetchUsage=null;fetchAuditLog=null;isAuditEntryExpanded=null;noteLiveTokenUsage=null;upsertAuditRecord(e,t=``){let n=u3(e);if(!n)return e;let r=jIe(this.auditRecords[n],e);return this.auditRecords={...this.auditRecords,[n]:r},this.pruneAuditRecords(),this.auditRecordVersion++,this.auditRecordChanges=[...this.auditRecordChanges,{version:this.auditRecordVersion,key:n,eventType:t}].slice(-512),r}upsertAuditRecords(e,t=``){return(Array.isArray(e)?e:[]).map(e=>this.upsertAuditRecord(e,t))}auditRecord(e){let t=typeof e==`string`?String(e).trim():u3(e);return t&&this.auditRecords[t]||null}cacheAuditRecord(e,t){return this.upsertAuditRecord(e,t)}pinAuditRecords(e){this.auditRecordPins=new Set((Array.isArray(e)?e:[]).map(String))}pruneAuditRecords(){let e=Object.keys(this.auditRecords);if(e.length<=f3)return;let t={...this.auditRecords},n=e.length-f3;for(let r of e){if(n<=0)break;this.auditRecordPins.has(r)||(delete t[r],n--)}this.auditRecords=t}get page(){return bX.page}get customStartDate(){return TZ.customStartDate}get customEndDate(){return TZ.customEndDate}get followsToday(){return TZ.followsToday}liveLogsEnabled(){return qX.liveLogsVisible()}async startLiveLogs(){typeof fetch!=`function`||typeof ReadableStream>`u`||(await qX.ensureLoaded(),this.liveLogsEnabled()&&(this.stopLiveLogs(),this.liveLogsController=typeof AbortController==`function`?new AbortController:null,this.readLiveLogsStream(this.liveLogsController)))}stopLiveLogs(){this.liveLogsStreaming=!1,this.liveLogsReconnectTimer&&=(clearTimeout(this.liveLogsReconnectTimer),null),this.liveLogsController&&typeof this.liveLogsController.abort==`function`&&this.liveLogsController.abort(),this.liveLogsController=null}ensureLiveLogs(){this.liveLogsController||this.liveLogsReconnectTimer||this.startLiveLogs()}async readLiveLogsStream(e){let t={};e&&(t.signal=e.signal);let n=OIe(this.liveLogsLastSeq),r=J.generation;try{let i=await HX(n,t);if(i.status===401){if(J.handleUnauthorized(r),r{this.liveLogsReconnectTimer=null,this.startLiveLogs()},t)}async fetchAuditEntryDetail(e){if(!this.auditEntryShouldFetchDetail(e))return;let t=String(e.id||``).trim();if(!t)return;e._detail_loading=!0;let n=e;try{let e=await WX(`/admin/audit/detail?log_id=`+encodeURIComponent(t),{label:`audit detail`});if(e.stale||!e.ok)return;n=this.mergeLiveAuditEntry(e.data,`audit.detail`)||n}catch(e){console.error(`Failed to fetch audit detail:`,e)}finally{this.clearAuditDetailLoading(n)}}};Object.assign(p3.prototype,kIe());var m3=new p3;if(typeof window<`u`){let e=!1;window.addEventListener(`pagehide`,()=>{e=!!m3.liveLogsController,m3.stopLiveLogs()}),window.addEventListener(`pageshow`,t=>{t.persisted&&e&&m3.ensureLiveLogs()})}var h3=null;_n(()=>{hn(()=>{let e=J.refreshTick;if(h3===null){h3=e;return}e!==h3&&(h3=e,sr(()=>{m3.stopLiveLogs(),m3.startLiveLogs()}))})});function g3(){return{total_requests:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,uncached_input_tokens:0,cached_input_tokens:0,cache_write_input_tokens:0,total_input_cost:null,total_output_cost:null,total_cost:null,rewrite_tokens_saved:0,rewrite_cost_saved:null}}function FIe(){return{entries:[],total:0,limit:50,offset:0}}function _3(){return{entries:[],total:0,limit:50,offset:0}}function IIe(e){let t=String(e||``).trim();return t.length<=26?t||`-`:t.slice(0,15)+`…`+t.slice(-8)}function LIe(e,t){let n=[[`model`,e&&e.model],[`provider`,e&&e.provider],[`label`,e&&e.label],[`user_path`,e&&e.user_path],[`session_id`,e&&e.session_id]],r=``;for(let[e,i]of n)!i||e===t||(r+=`&`+e+`=`+encodeURIComponent(i));return r}function RIe({limit:e,offset:t,hideCached:n,search:r}){let i=`&limit=`+e+`&offset=`+t;return i+=`&cache_mode=`+(n?`uncached`:`all`),r&&(i+=`&search=`+encodeURIComponent(r)),i}function zIe({limit:e,offset:t}){return`&limit=`+e+`&offset=`+t}function v3(e,t){let n=new Set(e||[]);return t&&n.add(t),[...n].sort()}function BIe(e,t){let n=Number(t&&t.total_requests||0)-Number(e&&e.total_requests||0);return Number.isFinite(n)&&n>0?n:0}function VIe(e,t,n){let r=n?e:t,i=Number(r&&r.total_requests||0);return Number.isFinite(i)?i:0}function HIe(e,t,n){let r=BIe(e,t);return r<=0?``:n?Tae({count:oZ(r)}):Oae({provider:oZ(Number(e&&e.total_requests||0)),cache:oZ(r)})}function UIe(e){let t=e||{};return t.total_input_cost===null||t.total_input_cost===void 0?``:jae({input:sZ(t.total_input_cost),output:sZ(t.total_output_cost)})}function y3(e){let t=Number(e&&e.rewrite_tokens_saved||0);return Number.isFinite(t)&&t>0?t:0}function WIe(e){return y3(e)>0}function b3(e){let t=e||{};return t.rewrite_cost_saved===void 0?null:t.rewrite_cost_saved}function GIe(){return Pae()}function KIe(e,t){return t===`costs`?sZ(b3(e)):uZ(y3(e))}function qIe(e,t){let n=t===`costs`,r=n?Number(b3(e)):y3(e);if(!Number.isFinite(r)||r<=0)return null;let i=e&&(n?e.total_cost:e.total_input_tokens);if(i==null)return null;let a=Number(i);return!Number.isFinite(a)||a<0?null:r/(a+r)*100}function x3(e,t){let n=qIe(e,t);return n===null?``:Lae({percent:n<.1?`<0.1`:n.toFixed(1)})}function JIe(e,t){let n=y3(e);if(n<=0)return``;let r=[Bae({count:oZ(n)}),GIe(),Uae()],i=b3(e);i!=null&&(r.push(Kae({cost:sZ(i)})),r.push(Yae()));let a=x3(e,t);return a&&r.push(Qae({percent:a,mode:t===`costs`?toe():ioe()})),r.join(` `)}function S3(e){return String(e&&e.cost_source||``).trim()}function C3(e){let t=S3(e);return t===`openrouter_credits`||t===`xai_cost_in_usd_ticks`}function w3(e){switch(S3(e)){case`openrouter_credits`:return soe();case`xai_cost_in_usd_ticks`:return uoe();default:return``}}function T3(e){return String(e&&e.cache_type||``).trim().toLowerCase()}function E3(e){let t=T3(e);return t===`exact`||t===`semantic`}function YIe(e){let t=T3(e);return t===`exact`?poe():t===`semantic`?goe():`-`}function D3(e,t){let n=t?String(t):``;if(!E3(e))return n;let r=yoe();return n?r+` `+n:r}function XIe(e){let t=Number(e&&e.cached_input_ratio);return!Number.isFinite(t)||t<=0?0:Math.min(1,t)}function O3(e){return Number(e&&e.cached_input_tokens||0)>0}function ZIe(e){return O3(e)?(XIe(e)*100).toFixed(1)+`%`:``}function QIe(e){if(!O3(e))return``;let t=Number(e.cached_input_tokens||0),n=Number(e.uncached_input_tokens||0),r=Number(e.cache_write_input_tokens||0),i=t+n+r,a=[Soe({cached:oZ(t),total:oZ(i)})];return r>0&&a.push(Toe({count:oZ(r)})),a.join(` `)}function k3(e){let t=[];if(w3(e)&&(t.push(w3(e)),t.push(``)),t.push(Ooe({cost:sZ(e.input_cost)})),t.push(joe({cost:sZ(e.output_cost)})),e.raw_data){t.push(``);for(let[n,r]of Object.entries(e.raw_data)){let e=n.replace(/_/g,` `).replace(/\b\w/g,e=>e.toUpperCase()),i=r&&typeof r==`object`?JSON.stringify(r):oZ(r);t.push(e+`: `+i)}}return t.join(` diff --git a/internal/admin/dashboard/static/dist/index.html b/internal/admin/dashboard/static/dist/index.html index d893bf45b..b249e6af1 100644 --- a/internal/admin/dashboard/static/dist/index.html +++ b/internal/admin/dashboard/static/dist/index.html @@ -7,7 +7,7 @@ GoModel Dashboard - + diff --git a/internal/admin/handler_providers.go b/internal/admin/handler_providers.go index acf405ead..b58f3aa34 100644 --- a/internal/admin/handler_providers.go +++ b/internal/admin/handler_providers.go @@ -236,19 +236,20 @@ func classifyProviderStatus(cfg providers.SanitizedProviderConfig, runtime provi } switch { + case runtime.InventoryStale && runtime.DiscoveredModelCount > 0: + // The latest refresh or availability probe failed: load balancing + // skips the provider and its models are no longer advertised. Only + // provider-qualified direct requests still reach it. + return "unhealthy", "Offline", "latest check failed; models are hidden from the model list until the provider recovers", lastError case runtime.DiscoveredModelCount > 0 && modelFetchError == "": - if runtime.InventoryStale { - // An availability probe failed without a model fetch running, so - // the inventory was retired from load balancing while the fetch - // error stayed empty. Surfacing "healthy" here would contradict - // the routing behavior. - return "degraded", "Degraded", "latest availability probe failed; previous inventory is still available", lastError - } if usingCachedModels { return "degraded", "Starting", "serving cached model inventory while live refresh finishes", lastError } return "healthy", "Healthy", "configured and model discovery succeeded", lastError case modelFetchError != "" && runtime.DiscoveredModelCount > 0: + // Refresh failed but the inventory was deliberately kept fresh (no + // healthy alternative exists, e.g. a total sweep failure), so models + // are still advertised and routable. return "degraded", "Degraded", "latest model refresh failed; previous inventory is still available", lastError case modelFetchError != "": return "unhealthy", "Unhealthy", "model discovery failed and no provider models are currently available", lastError diff --git a/internal/admin/handler_providers_test.go b/internal/admin/handler_providers_test.go index ad6ba6e46..57335e413 100644 --- a/internal/admin/handler_providers_test.go +++ b/internal/admin/handler_providers_test.go @@ -37,8 +37,8 @@ func TestClassifyProviderStatus_HealthyForAllowlistInventory(t *testing.T) { // A provider retired from load balancing by a failed availability probe has a // clean model-fetch record but must not be reported healthy: the routing layer -// is actively skipping it. -func TestClassifyProviderStatus_StaleInventoryIsDegraded(t *testing.T) { +// is actively skipping it and its models are hidden from the model list. +func TestClassifyProviderStatus_StaleInventoryIsUnhealthy(t *testing.T) { now := time.Now().UTC() cfg := providers.SanitizedProviderConfig{Name: "openai", Type: "openai"} runtime := providers.ProviderRuntimeSnapshot{ @@ -55,11 +55,11 @@ func TestClassifyProviderStatus_StaleInventoryIsDegraded(t *testing.T) { } status, label, reason, lastError := classifyProviderStatus(cfg, runtime) - if status != "degraded" { - t.Fatalf("status = %q, want degraded", status) + if status != "unhealthy" { + t.Fatalf("status = %q, want unhealthy", status) } - if label != "Degraded" { - t.Fatalf("label = %q, want Degraded", label) + if label != "Offline" { + t.Fatalf("label = %q, want Offline", label) } if reason == "" { t.Fatal("reason empty, want stale-inventory explanation") diff --git a/internal/providers/registry.go b/internal/providers/registry.go index ecf11b4de..48215ea0a 100644 --- a/internal/providers/registry.go +++ b/internal/providers/registry.go @@ -444,7 +444,19 @@ func (r *ModelRegistry) ModelAvailable(model string) bool { return false } -// ListModels returns all models in the registry, sorted by model ID for consistent ordering. +// providerAdvertisedLocked reports whether providerName's models belong in +// model listings. A provider whose latest refresh or availability probe +// failed (inventoryStale) keeps its carried-forward inventory resolvable for +// direct requests, but offline providers must not advertise models in +// GET /v1/models, the dashboard, or failover candidate selection. +// Caller must hold r.mu. +func (r *ModelRegistry) providerAdvertisedLocked(providerName string) bool { + return !r.providerRuntime[providerName].inventoryStale +} + +// ListModels returns all advertised models in the registry, sorted by model ID +// for consistent ordering. Models whose owning provider's inventory is stale +// are excluded (see providerAdvertisedLocked). // The sorted slice is cached and rebuilt only when the underlying models change. // Returns a defensive copy so callers cannot mutate the internal cache. func (r *ModelRegistry) ListModels() []core.Model { @@ -464,6 +476,9 @@ func (r *ModelRegistry) ListModels() []core.Model { models := make([]core.Model, 0, len(r.models)) for _, info := range r.models { + if !r.providerAdvertisedLocked(info.ProviderName) { + continue + } models = append(models, info.Model) } sort.Slice(models, func(i, j int) bool { return models[i].ID < models[j].ID }) @@ -475,7 +490,7 @@ func (r *ModelRegistry) ListModels() []core.Model { // ListPublicModels returns all provider-backed models as public selectors in // providerName/modelID form, sorted by public model ID. Models the owning // provider cannot actually serve (audio-only models on providers without audio -// support) are not advertised. +// support) and models from providers with stale inventory are not advertised. func (r *ModelRegistry) ListPublicModels() []core.Model { r.mu.RLock() defer r.mu.RUnlock() @@ -487,6 +502,9 @@ func (r *ModelRegistry) ListPublicModels() []core.Model { result := make([]core.Model, 0, total) for providerName, models := range r.modelsByProvider { + if !r.providerAdvertisedLocked(providerName) { + continue + } for modelID, info := range models { if !providerCanServeModel(info) { continue @@ -788,6 +806,9 @@ func (r *ModelRegistry) ListModelsWithProvider() []ModelWithProvider { result := make([]ModelWithProvider, 0, total) for providerName, providerModels := range r.modelsByProvider { + if !r.providerAdvertisedLocked(providerName) { + continue + } for modelID, info := range providerModels { publicProviderName := providerName if info.ProviderName != "" { @@ -850,7 +871,10 @@ func (r *ModelRegistry) ListModelsWithProviderByCategory(category core.ModelCate } result := make([]ModelWithProvider, 0) - for _, providerModels := range r.modelsByProvider { + for providerName, providerModels := range r.modelsByProvider { + if !r.providerAdvertisedLocked(providerName) { + continue + } for modelID, info := range providerModels { if info.Model.Metadata == nil || !hasCategory(info.Model.Metadata.Categories, category) { continue @@ -905,7 +929,10 @@ func (r *ModelRegistry) GetCategoryCounts() []CategoryCount { counts := make(map[core.ModelCategory]int) total := 0 - for _, providerModels := range r.modelsByProvider { + for providerName, providerModels := range r.modelsByProvider { + if !r.providerAdvertisedLocked(providerName) { + continue + } for _, info := range providerModels { total++ if info.Model.Metadata != nil { diff --git a/internal/providers/registry_cache.go b/internal/providers/registry_cache.go index 930434686..b12f29696 100644 --- a/internal/providers/registry_cache.go +++ b/internal/providers/registry_cache.go @@ -156,6 +156,13 @@ func (r *ModelRegistry) SaveToCache(ctx context.Context) error { cacheBackend := r.cache modelsByProvider := make(map[string]map[string]*ModelInfo, len(r.modelsByProvider)) for providerName, models := range r.modelsByProvider { + // A stale inventory was carried forward from before the provider went + // offline; persisting it would resurrect the offline provider's models + // on every restart. The provider re-enters the cache once a refresh + // succeeds again. + if r.providerRuntime[providerName].inventoryStale { + continue + } modelsByProvider[providerName] = make(map[string]*ModelInfo, len(models)) maps.Copy(modelsByProvider[providerName], models) } diff --git a/internal/providers/registry_cache_test.go b/internal/providers/registry_cache_test.go index 4b183d68f..dcdef6b40 100644 --- a/internal/providers/registry_cache_test.go +++ b/internal/providers/registry_cache_test.go @@ -3,6 +3,7 @@ package providers import ( "context" "encoding/json" + "errors" "os" "path/filepath" "testing" @@ -832,3 +833,56 @@ func TestRegisterProviderWithType(t *testing.T) { t.Errorf("expected 1 provider, got %d", registry.ProviderCount()) } } + +// SaveToCache must not persist a stale (carried-forward) inventory: an +// offline provider's models would otherwise resurrect from the cache on every +// restart and stay advertised forever (issue #705). +func TestSaveToCache_SkipsStaleProviderInventory(t *testing.T) { + tmpDir := t.TempDir() + cacheFile := filepath.Join(tmpDir, "models.json") + + registry, _, beta := registerTwoProviderRegistry(t) + registry.SetCache(modelcache.NewLocalCache(cacheFile)) + + beta.err = errors.New("connection refused") + if err := registry.Initialize(context.Background()); err != nil { + t.Fatalf("refresh Initialize() error = %v", err) + } + if err := registry.SaveToCache(context.Background()); err != nil { + t.Fatalf("SaveToCache() error = %v", err) + } + + data, err := os.ReadFile(cacheFile) + if err != nil { + t.Fatalf("failed to read cache file: %v", err) + } + var modelCache modelcache.ModelCache + if err := json.Unmarshal(data, &modelCache); err != nil { + t.Fatalf("failed to unmarshal cache: %v", err) + } + if _, ok := modelCache.Providers["beta"]; ok { + t.Error("stale provider beta persisted to cache, want skipped") + } + if _, ok := modelCache.Providers["alpha"]; !ok { + t.Error("healthy provider alpha missing from cache") + } + + // After recovery the provider re-enters the cache. + beta.err = nil + if err := registry.Initialize(context.Background()); err != nil { + t.Fatalf("recovery Initialize() error = %v", err) + } + if err := registry.SaveToCache(context.Background()); err != nil { + t.Fatalf("SaveToCache() after recovery error = %v", err) + } + data, err = os.ReadFile(cacheFile) + if err != nil { + t.Fatalf("failed to re-read cache file: %v", err) + } + if err := json.Unmarshal(data, &modelCache); err != nil { + t.Fatalf("failed to unmarshal refreshed cache: %v", err) + } + if _, ok := modelCache.Providers["beta"]; !ok { + t.Error("recovered provider beta missing from cache, want persisted again") + } +} diff --git a/internal/providers/registry_test.go b/internal/providers/registry_test.go index e885776e6..c4ba01d00 100644 --- a/internal/providers/registry_test.go +++ b/internal/providers/registry_test.go @@ -1191,6 +1191,93 @@ func TestInitialize_StaleProviderLosesBareModelIDToHealthyDuplicate(t *testing.T } } +// A provider that goes offline must disappear from every model listing +// (GET /v1/models, dashboard model list, category counts) while its +// carried-forward inventory stays resolvable for direct requests, and it must +// reappear once the provider recovers (issue #705). +func TestStaleProviderModelsAreNotAdvertised(t *testing.T) { + registry, _, beta := registerTwoProviderRegistry(t) + + listedIDs := func(t *testing.T) map[string]bool { + t.Helper() + ids := make(map[string]bool) + for _, model := range registry.ListPublicModels() { + ids["public:"+model.ID] = true + } + for _, entry := range registry.ListModelsWithProvider() { + ids["provider:"+entry.Selector] = true + } + for _, model := range registry.ListModels() { + ids["bare:"+model.ID] = true + } + return ids + } + + categorySelectors := func(t *testing.T) map[string]bool { + t.Helper() + selectors := make(map[string]bool) + for _, entry := range registry.ListModelsWithProviderByCategory(core.CategoryEmbedding) { + selectors[entry.Selector] = true + } + return selectors + } + + before := listedIDs(t) + for _, key := range []string{"public:beta/beta-model", "provider:beta/beta-model", "bare:beta-model"} { + if !before[key] { + t.Fatalf("%s missing from listings while beta is healthy", key) + } + } + if !categorySelectors(t)["beta/beta-model"] { + t.Fatal("beta/beta-model missing from embedding category while beta is healthy") + } + + beta.err = errors.New("connection refused") + if err := registry.Initialize(context.Background()); err != nil { + t.Fatalf("refresh Initialize() error = %v", err) + } + + after := listedIDs(t) + for _, key := range []string{"public:beta/beta-model", "provider:beta/beta-model", "bare:beta-model"} { + if after[key] { + t.Errorf("%s still advertised after beta went offline, want hidden", key) + } + } + for _, key := range []string{"public:alpha/alpha-model", "provider:alpha/alpha-model", "bare:alpha-model"} { + if !after[key] { + t.Errorf("%s missing from listings, want healthy provider unaffected", key) + } + } + for _, counts := range registry.GetCategoryCounts() { + if counts.Category == core.CategoryAll && counts.Count != 1 { + t.Errorf("GetCategoryCounts()[all] = %d with beta offline, want 1", counts.Count) + } + } + afterCategory := categorySelectors(t) + if afterCategory["beta/beta-model"] { + t.Error("beta/beta-model still in embedding category after beta went offline, want hidden") + } + if !afterCategory["alpha/alpha-model"] { + t.Error("alpha/alpha-model missing from embedding category, want healthy provider unaffected") + } + // Direct requests must still resolve the carried inventory (honest 502 at + // the provider instead of "model not found"). + if !registry.Supports("beta/beta-model") { + t.Error("Supports(beta/beta-model) = false, want carried inventory still resolvable") + } + + beta.err = nil + if err := registry.Initialize(context.Background()); err != nil { + t.Fatalf("recovery Initialize() error = %v", err) + } + recovered := listedIDs(t) + for _, key := range []string{"public:beta/beta-model", "provider:beta/beta-model", "bare:beta-model"} { + if !recovered[key] { + t.Errorf("%s missing from listings after recovery, want advertised again", key) + } + } +} + // The fast recheck loop re-probes only providers whose latest refresh failed, // so a recovered provider is picked up within the recheck interval instead of // waiting for the next full refresh. @@ -1245,7 +1332,13 @@ func registerTwoProviderRegistry(t *testing.T) (*ModelRegistry, *registryMockPro singleModel := func(owner string) *core.ModelsResponse { return &core.ModelsResponse{ Object: "list", - Data: []core.Model{{ID: owner + "-model", Object: "model", OwnedBy: owner}}, + Data: []core.Model{{ + ID: owner + "-model", Object: "model", OwnedBy: owner, + Metadata: &core.ModelMetadata{ + Modes: []string{"embedding"}, + Categories: []core.ModelCategory{core.CategoryEmbedding}, + }, + }}, } } alpha := ®istryMockProvider{name: "alpha", modelsResponse: singleModel("alpha")} diff --git a/web/dashboard/src/pages/overview/ProviderStatusCard.svelte b/web/dashboard/src/pages/overview/ProviderStatusCard.svelte index c4b124b08..0a119f1b4 100644 --- a/web/dashboard/src/pages/overview/ProviderStatusCard.svelte +++ b/web/dashboard/src/pages/overview/ProviderStatusCard.svelte @@ -63,8 +63,10 @@
{m.overview_models_available()} + {formatNumber(provider.runtime?.discovered_model_count)} + >{formatNumber(provider.runtime?.inventory_stale ? 0 : provider.runtime?.discovered_model_count)}
{m.overview_last_checked()}