From b9cf5b87eae4bd02677c28b807772fb8a40d0bbe Mon Sep 17 00:00:00 2001 From: "Jakub A. W" Date: Tue, 11 Aug 2026 13:01:33 +0200 Subject: [PATCH 1/4] feat(models): add configurable inference slowdown --- .env.template | 3 +- config/config.example.yaml | 1 + config/virtualmodels.go | 4 + docs/features/virtual-models.mdx | 26 ++- docs/openapi.json | 12 ++ .../static/dist/assets/index-BoW-V4GJ.js | 69 +++++++ .../static/dist/assets/index-D05Km9Si.js | 68 ------- .../admin/dashboard/static/dist/index.html | 2 +- internal/admin/handler_virtualmodels.go | 5 +- internal/admin/handler_virtualmodels_test.go | 38 ++++ internal/core/request_model_resolution.go | 3 + internal/gateway/inference_execute.go | 40 +++- internal/gateway/interfaces.go | 6 + internal/gateway/request_model_resolution.go | 8 +- .../gateway/request_model_resolution_test.go | 40 ++++ internal/gateway/slowdown.go | 67 +++++++ internal/gateway/slowdown_test.go | 29 +++ internal/server/audio_service.go | 21 +- internal/server/model_slowdown.go | 35 ++++ internal/streaming/slowdown_stream.go | 187 ++++++++++++++++++ internal/streaming/slowdown_stream_test.go | 75 +++++++ internal/virtualmodels/config.go | 1 + internal/virtualmodels/config_overlay_test.go | 4 +- internal/virtualmodels/service.go | 19 +- internal/virtualmodels/slowdown.go | 36 ++++ internal/virtualmodels/slowdown_test.go | 130 ++++++++++++ internal/virtualmodels/store_mongodb.go | 3 + internal/virtualmodels/store_sql.go | 11 +- internal/virtualmodels/store_test.go | 8 + internal/virtualmodels/types.go | 32 +-- internal/virtualmodels/validation.go | 31 +++ .../src/pages/models/ModelRow.svelte | 16 +- .../pages/models/VirtualModelEditor.svelte | 19 ++ .../src/pages/models/virtualModels.svelte.js | 11 ++ .../src/pages/models/virtualModelsLogic.js | 37 +++- .../tests/models-virtual-models.test.js | 56 ++++++ 36 files changed, 1037 insertions(+), 116 deletions(-) create mode 100644 internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js delete mode 100644 internal/admin/dashboard/static/dist/assets/index-D05Km9Si.js create mode 100644 internal/gateway/slowdown.go create mode 100644 internal/gateway/slowdown_test.go create mode 100644 internal/server/model_slowdown.go create mode 100644 internal/streaming/slowdown_stream.go create mode 100644 internal/streaming/slowdown_stream_test.go create mode 100644 internal/virtualmodels/slowdown.go create mode 100644 internal/virtualmodels/slowdown_test.go diff --git a/.env.template b/.env.template index dab9620da..03e01be03 100644 --- a/.env.template +++ b/.env.template @@ -202,7 +202,8 @@ # and is read-only in the dashboard. The same entries can be declared under # `virtual_models:` in config.yaml. Each entry: source, target (single) or # targets[] (load balanced), strategy (round_robin | cost), user_paths, -# description, enabled. A target has model and optional provider + weight. +# slowdown (extra-time factor, 0.1-10), description, enabled. A target has model +# and optional provider + weight. # VIRTUAL_MODELS=[{"source":"smart","strategy":"round_robin","targets":[{"model":"openai/gpt-4o","weight":2},{"model":"anthropic/claude-sonnet-4-6"}]}] # Failover & Workflow Configuration diff --git a/config/config.example.yaml b/config/config.example.yaml index b3bee386e..669a59dcf 100644 --- a/config/config.example.yaml +++ b/config/config.example.yaml @@ -61,6 +61,7 @@ models: # virtual_models: # - source: regular # a plain alias # target: anthropic/claude-sonnet-4-6 +# slowdown: 0.5 # add 50% of measured inference time (range: 0.1-10) # - source: smart # weighted round-robin load balancer # strategy: round_robin # round_robin (default) | cost | adaptive (uses a routing extension when registered; otherwise falls back to round_robin) # targets: diff --git a/config/virtualmodels.go b/config/virtualmodels.go index bcce5db2c..c36f94aa3 100644 --- a/config/virtualmodels.go +++ b/config/virtualmodels.go @@ -40,6 +40,10 @@ type VirtualModelConfig struct { // Description is an optional human-readable note. Description string `yaml:"description,omitempty" json:"description,omitempty"` + // Slowdown is an optional extra-time factor. For example, 0.5 adds 50% of + // measured inference time. Zero disables slowdown. + Slowdown float64 `yaml:"slowdown,omitempty" json:"slowdown,omitempty"` + // Enabled toggles the entry. It defaults to true when omitted. Enabled *bool `yaml:"enabled,omitempty" json:"enabled,omitempty"` } diff --git a/docs/features/virtual-models.mdx b/docs/features/virtual-models.mdx index b7210b6f6..4f475baad 100644 --- a/docs/features/virtual-models.mdx +++ b/docs/features/virtual-models.mdx @@ -30,11 +30,30 @@ policy on the **Source** selector. GoModel does not persist empty, ineffective access policies, whether saved from the dashboard or through the admin API. If a saved policy has no target, user -paths, or description and its enabled state matches the inherited/default +paths, description, or slowdown and its enabled state matches the inherited/default access state, GoModel removes the stored row. It retains an otherwise empty policy when that row still overrides a disabled default or an inherited user-path restriction. +## Add artificial model latency + +Set **Slowdown** on a concrete model or redirect to add a fraction of measured +inference time. The accepted range is `0.1` to `10`; for example, `0.5` adds +50%, so a response that takes 2 seconds upstream is returned after about 3 +seconds. Leaving the field empty disables slowdown. Delays honor request +cancellation. + +For Chat Completions and Responses API SSE streams, GoModel drains the upstream +in the background and releases each read chunk on the scaled timeline. This +preserves the provider's relative chunk timing while delayed chunks accumulate +in memory. A large factor on a long or high-volume stream can therefore use +substantial memory. Realtime WebSocket sessions are not slowed. + +When an alias and its concrete target both have a slowdown, the alias value +wins. An alias without its own value inherits the selected target model's +slowdown. This also applies to load-balanced virtual models after a target is +selected. + The rest of this page covers redirects. ## Use stable names @@ -117,6 +136,7 @@ virtual_models: # A plain alias. - source: regular target: anthropic/claude-sonnet-4-6 + slowdown: 0.5 # A weighted round-robin load balancer. - source: smart @@ -143,8 +163,8 @@ VIRTUAL_MODELS=[{"source":"smart","strategy":"cost","targets":[{"model":"openai/ Each entry accepts `source`, a single `target` (shorthand) or a `targets` list, `strategy` (`round_robin` or `cost`), `session_affinity` (default `true`; see -[Session Keeping](/features/session-keeping)), `user_paths`, `description`, and -`enabled`. +[Session Keeping](/features/session-keeping)), `user_paths`, `description`, +`slowdown` (an extra-time factor from `0.1` to `10`), and `enabled`. Leave the targets empty to declare an access policy on the `source` selector. An invalid declaration (unknown strategy, missing or self-referential target, or a target `provider` that matches no configured provider — a typo) fails startup diff --git a/docs/openapi.json b/docs/openapi.json index a97d6988f..6ca8bb391 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -11052,6 +11052,10 @@ "description": "SessionAffinity keeps a detected session on the target that served it\nbefore. Omitted means enabled; false restores stateless balancing.", "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", + "type": "number" + }, "source": { "type": "string" }, @@ -14391,6 +14395,10 @@ "session_affinity": { "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", + "type": "number" + }, "source": { "type": "string" }, @@ -14443,6 +14451,10 @@ "description": "SessionAffinity keeps requests of one detected session on the target that\nserved it before, while that target stays available. Tri-state: nil means\nenabled (the default); explicit false restores stateless balancing.", "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", + "type": "number" + }, "source": { "type": "string" }, diff --git a/internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js b/internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js new file mode 100644 index 000000000..f0789ebc6 --- /dev/null +++ b/internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js @@ -0,0 +1,69 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible;function d(e){return typeof e==`function`}var f=()=>{};function p(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function h(e,t,n=!1){return e===void 0?n?t():t:e}function g(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var _=1<<24,v=1024,y=2048,b=4096,x=8192,S=16384,C=32768,w=1<<25,T=65536,E=1<<19,ee=1<<20,te=1<<25,ne=65536,re=1<<21,ie=1<<22,ae=1<<23,oe=Symbol(`$state`),se=Symbol(`legacy props`),ce=Symbol(``),le=Symbol(`attributes`),ue=Symbol(`class`),de=Symbol(`style`),fe=Symbol(`text`),pe=Symbol(`form reset`),me=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},he=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function ge(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function _e(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function ve(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function ye(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function be(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function xe(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Se(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Ce(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function we(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Te(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ee(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var De={},Oe=Symbol(`uninitialized`),ke=`http://www.w3.org/1999/xhtml`,Ae=`http://www.w3.org/2000/svg`,je=`http://www.w3.org/1998/Math/MathML`;function Me(){console.warn(`https://svelte.dev/e/derived_inert`)}function Ne(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Pe(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function Fe(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var Ie=!1;function Le(e){Ie=e}var Re;function ze(e){if(e===null)throw Ne(),De;return Re=e}function Be(){return ze(vn(Re))}function D(e){if(Ie){if(vn(Re)!==null)throw Ne(),De;Re=e}}function Ve(e=1){if(Ie){for(var t=e,n=Re;t--;)n=vn(n);Re=n}}function He(e=!0){for(var t=0,n=Re;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=vn(n);e&&n.remove(),n=i}}function Ue(e){if(!e||e.nodeType!==8)throw Ne(),De;return e.data}function We(e){return e===this.v}function Ge(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Ke(e){return!Ge(e,this.v)}var qe=null;function Je(e){qe=e}function O(e,t=!1,n){qe={p:qe,i:!1,c:null,e:null,s:e,x:null,r:nr,l:null}}function k(e){var t=qe,n=t.e;if(n!==null){t.e=null;for(var r of n)kn(r)}return e!==void 0&&(t.x=e),t.i=!0,qe=t.p,e??{}}function Ye(){return!0}var Xe=[];function Ze(){var e=Xe;Xe=[],p(e)}function Qe(e){if(Xe.length===0&&!Lt){var t=Xe;queueMicrotask(()=>{t===Xe&&Ze()})}Xe.push(e)}function $e(){for(;Xe.length>0;)Ze()}function et(e){var t=nr;if(t===null)return $n.f|=ae,e;if(!(t.f&32768)&&!(t.f&4))throw e;tt(e,t)}function tt(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}var nt=~(y|b|v);function rt(e,t){e.f=e.f&nt|t}function it(e){e.f&512||e.deps===null?rt(e,v):rt(e,b)}function at(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=ne,at(t.deps))}function ot(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),at(e.deps),rt(e,v)}var st=!1;function ct(e){var t=st;try{return st=!1,[e(),st]}finally{st=t}}function lt(e,t){if(t){let t=document.body;e.autofocus=!0,Qe(()=>{document.activeElement===t&&e.focus()})}}function ut(e){Ie&&_n(e)!==null&&yn(e)}var dt=!1;function ft(){dt||(dt=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[pe]?.()})},{capture:!0}))}function pt(e){var t=$n,n=nr;tr(null),rr(null);try{return e()}finally{tr(t),rr(n)}}function mt(e,t,n,r=n){e.addEventListener(t,()=>pt(n));let i=e[pe];i?e[pe]=()=>{i(),r(!0)}:e[pe]=()=>r(!0),ft()}function ht(e){let t=0,n=nn(0),r;return()=>{En()&&(R(n),Pn(()=>(t===0&&(r=wr(()=>e(()=>sn(n)))),t+=1,()=>{Qe(()=>{--t,t===0&&(r?.(),r=void 0,sn(n))})})))}}var gt=T|E;function _t(e,t,n,r){new vt(e,t,n,r)}var vt=class{parent;is_pending=!1;transform_error;#e;#t=Ie?Re:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=ht(()=>(this.#m=nn(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=nr;t.b=this,t.f|=128,n(e)},this.parent=nr.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=Fn(()=>{if(Ie){let e=this.#t;Be();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},gt),Ie&&(this.#e=Re)}#g(){try{this.#a=Ln(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=Ln(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=Ln(()=>e(this.#e)),Qe(()=>{var e=this.#c=document.createDocumentFragment(),t=gn();e.append(t),this.#a=this.#x(()=>Ln(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,Wn(this.#o,()=>{this.#o=null}),this.#b(Nt))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=Ln(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Jn(this.#a,e);let t=this.#n.pending;this.#o=Ln(()=>t(this.#e))}else this.#b(Nt)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){ot(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=nr,n=$n,r=qe;rr(this.#i),tr(this.#i),Je(this.#i.ctx);try{return Ut.ensure(),e()}catch(e){return et(e),null}finally{rr(t),tr(n),Je(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&Wn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,Qe(()=>{this.#d=!1,this.#m&&an(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),R(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;Nt?.is_fork?(this.#a&&Nt.skip_effect(this.#a),this.#o&&Nt.skip_effect(this.#o),this.#s&&Nt.skip_effect(this.#s),Nt.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(Vn(this.#a),null),this.#o&&=(Vn(this.#o),null),this.#s&&=(Vn(this.#s),null),Ie&&(ze(this.#t),Ve(),ze(He()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Fe();return}r=!0,i&&Ee(),this.#s!==null&&Wn(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){tt(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return Ln(()=>{var t=nr;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return tt(e,this.#i.parent),null}}))};Qe(()=>{var t;try{t=this.transform_error(e)}catch(e){tt(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>tt(e,this.#i&&this.#i.parent)):o(t)})}};function yt(e,t,n,r){let i=Ye()?Ct:Et;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=nr,c=bt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){tt(e,s)}xt()}}var d=St();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>Tt(e))).then(u).catch(e=>tt(e,s)).finally(d)}l?l.then(()=>{c(),f(),xt()}):f()}function bt(){var e=nr,t=$n,n=qe,r=Nt;return function(i=!0){rr(e),tr(t),Je(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function xt(e=!0){rr(null),tr(null),Je(null),e&&Nt?.deactivate()}function St(){var e=nr,t=e.b,n=Nt,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function Ct(e){var t=2|y;return nr!==null&&(nr.f|=E),{ctx:qe,deps:null,effects:null,equals:We,f:t,fn:e,reactions:null,rv:0,v:Oe,wv:0,parent:nr,ac:null}}var wt=Symbol(`obsolete`);function Tt(e,t,n){let r=nr;r===null&&ge();var i=void 0,a=nn(Oe),o=!$n,s=new Set;return Nn(()=>{var t=nr,n=m();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==me&&n.reject(e)}).finally(xt)}catch(e){n.reject(e),xt()}var c=Nt;if(o){if(t.f&32768)var l=St();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(wt);else for(let e of s.values())e.reject(wt);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==wt&&(c.activate(),t?(a.f|=ae,an(a,t)):(a.f&8388608&&(a.f^=ae),an(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),Dn(()=>{for(let e of s)e.reject(wt)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function A(e){let t=Ct(e);return ar(t),t}function Et(e){let t=Ct(e);return t.equals=Ke,t}function Dt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(me),t.ac=null}),t.fn!==null&&(t.teardown=f),yr(t,0),zn(t))}function jt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&br(t)}var Mt=null,Nt=null,Pt=null,Ft=null,It=null,Lt=!1,Rt=!1,zt=null,Bt=null,Vt=0,Ht=1,Ut=class e{id=Ht++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){Mt===null?Mt=this:(Mt.#n=this,this.#t=Mt),Mt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)rt(r,y),t(r);for(r of n.m)rt(r,b),t(r)}this.#p.add(e)}#g(){this.#e=!0,Vt++>1e3&&(this.#x(),Gt());for(let e of this.#u)this.#d.delete(e),rt(e,y),this.schedule(e);for(let e of this.#d)rt(e,b),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=zt=[],r=[],i=Bt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw Qt(e),this.#h()||this.discard(),t}if(Nt=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(zt=null,Bt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)Zt(e,t);i.length>0&&Nt.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),Pt=this,qt(r),qt(n),Pt=null,this.#s?.resolve();var s=Nt;if(this.#a===0&&(this.#c.length===0||s!==null)&&this.#x(),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=v;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=v:i&4?t.push(r):hr(r)&&(i&16&&this.#d.add(r),br(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),rt(i,y),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#x(),Nt=this,this.#g()}#b(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=m()).promise}static ensure(){if(Nt===null){let t=Nt=new e;!Rt&&!Lt&&Qe(()=>{t.#e||t.flush()})}return Nt}apply(){Ft=null}schedule(e){if(It=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}for(var t=e;t.parent!==null;){t=t.parent;var n=t.f;if(zt!==null&&t===nr&&($n===null||!($n.f&2)))return;if(n&96){if(!(n&1024))return;t.f^=v}}this.#c.push(t)}#x(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?Mt=e:t.#t=e,this.linked=!1}}};function Wt(e){var t=Lt;Lt=!0;try{var n;for(e&&(Nt!==null&&!Nt.is_fork&&Nt.flush(),n=e());;){if($e(),Nt===null)return n;Nt.flush()}}finally{Lt=t}}function Gt(){try{xe()}catch(e){tt(e,It)}}var Kt=null;function qt(e){var t=e.length;if(t!==0){for(var n=0;n0)){en.clear();for(let e of Kt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Kt.has(n)&&(Kt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||br(n)}}Kt.clear()}}Kt=null}}function Jt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Jt(i,t,n,r):e&4194320&&!(e&2048)&&Yt(i,t,r)&&(rt(i,y),Xt(i))}}function Yt(e,t,r){let i=r.get(e);if(i!==void 0)return i;if(e.deps!==null)for(let i of e.deps){if(n.call(t,i))return!0;if(i.f&2&&Yt(i,t,r))return r.set(i,!0),!0}return r.set(e,!1),!1}function Xt(e){Nt.schedule(e)}function Zt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),rt(e,v);for(var n=e.first;n!==null;)Zt(n,t),n=n.next}}function Qt(e){rt(e,v);for(var t=e.first;t!==null;)Qt(t),t=t.next}var $t=new Set,en=new Map,tn=!1;function nn(e,t){return{f:0,v:e,reactions:null,equals:We,rv:0,wv:0}}function j(e,t){let n=nn(e,t);return ar(n),n}function rn(e,t=!1,n=!0){let r=nn(e);return t||(r.equals=Ke),r}function M(e,t,n=!1){return $n!==null&&(!er||$n.f&131072)&&Ye()&&$n.f&4325394&&(ir===null||!ir.has(e))&&Te(),an(e,n?N(t):t,Bt)}function an(e,t,n=null){if(!e.equals(t)){en.set(e,Zn?t:e.v);var r=Ut.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&Ot(t),Ft===null&&it(t)}e.wv=mr(),cn(e,y,n),Ye()&&nr!==null&&nr.f&1024&&!(nr.f&96)&&(cr===null?lr([e]):cr.push(e)),!r.is_fork&&$t.size>0&&!tn&&on()}return t}function on(){tn=!1;for(let e of $t){e.f&1024&&rt(e,b);let t;try{t=hr(e)}catch{t=!0}t&&br(e)}$t.clear()}function sn(e){M(e,e.v+1)}function cn(e,t,n){var r=e.reactions;if(r!==null)for(var i=Ye(),a=r.length,o=0;o{if(fr===d)return e();var t=$n,n=fr;tr(null),pr(d);var r=e();return tr(t),pr(n),r};return i&&r.set(`length`,j(t.length,u)),new Proxy(t,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&Ce();var i=r.get(t);return i===void 0?f(()=>{var e=j(n.value,u);return r.set(t,e),e}):M(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>j(Oe,u));r.set(t,e),sn(o)}}else M(n,Oe),sn(o);return!0},get(e,n,i){if(n===oe)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>j(N(s?e[n]:Oe),u)),r.set(n,o)),o!==void 0){var c=R(o);return c===Oe?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=R(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==Oe)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===oe)return!0;var n=r.get(t),i=n!==void 0&&n.v!==Oe||Reflect.has(e,t);return(n!==void 0||nr!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>j(i?N(e[t]):Oe,u)),r.set(t,n)),R(n)===Oe)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;dj(Oe,u)),r.set(d+``,p)):M(p,Oe)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>j(void 0,u)),M(c,N(n)),r.set(t,c));else{l=c.v!==Oe;var m=f(()=>N(n));M(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&M(g,_+1)}sn(o)}return!0},ownKeys(e){R(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==Oe});for(var[n,i]of r)i.v!==Oe&&!(n in e)&&t.push(n);return t},setPrototypeOf(){we()}})}function ln(e){try{if(typeof e==`object`&&e&&oe in e)return e[oe]}catch{}return e}function un(e,t){return Object.is(ln(e),ln(t))}var dn,fn,pn,mn;function hn(){if(dn===void 0){dn=window,fn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;pn=a(t,`firstChild`).get,mn=a(t,`nextSibling`).get,u(e)&&(e[ue]=void 0,e[le]=null,e[de]=void 0,e.__e=void 0),u(n)&&(n[fe]=void 0)}}function gn(e=``){return document.createTextNode(e)}function _n(e){return pn.call(e)}function vn(e){return mn.call(e)}function P(e,t){if(!Ie)return _n(e);var n=_n(Re);if(n===null)n=Re.appendChild(gn());else if(t&&n.nodeType!==3){var r=gn();return n?.before(r),ze(r),r}return t&&Sn(n),ze(n),n}function F(e,t=!1){if(!Ie){var n=_n(e);return n instanceof Comment&&n.data===``?vn(n):n}if(t){if(Re?.nodeType!==3){var r=gn();return Re?.before(r),ze(r),r}Sn(Re)}return Re}function I(e,t=1,n=!1){let r=Ie?Re:e;for(var i;t--;)i=r,r=vn(r);if(!Ie)return r;if(n){if(r?.nodeType!==3){var a=gn();return r===null?i?.after(a):r.before(a),ze(a),a}Sn(r)}return ze(r),r}function yn(e){e.textContent=``}function bn(){return!1}function xn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function Sn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Cn(e){nr===null&&($n===null&&be(e),ye()),Zn&&ve(e)}function wn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function Tn(e,t){var n=nr;n!==null&&n.f&8192&&(e|=x);var r={ctx:qe,deps:null,nodes:null,f:e|y|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};Nt?.register_created_effect(r);var i=r;if(e&4)zt===null?Ut.ensure().schedule(r):zt.push(r);else if(t!==null){try{br(r)}catch(e){throw Vn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=T))}if(i!==null&&(i.parent=n,n!==null&&wn(i,n),$n!==null&&$n.f&2&&!(e&64))){var a=$n;(a.effects??=[]).push(i)}return r}function En(){return $n!==null&&!er}function Dn(e){let t=Tn(8,null);return rt(t,v),t.teardown=e,t}function On(e){Cn(`$effect`);var t=nr.f;if(!$n&&t&32&&qe!==null&&!qe.i){var n=qe;(n.e??=[]).push(e)}else return kn(e)}function kn(e){return Tn(4|ee,e)}function An(e){Ut.ensure();let t=Tn(64|E,e);return()=>{Vn(t)}}function jn(e){Ut.ensure();let t=Tn(64|E,e);return(e={})=>new Promise(n=>{e.outro?Wn(t,()=>{Vn(t),n(void 0)}):(Vn(t),n(void 0))})}function Mn(e){return Tn(4,e)}function Nn(e){return Tn(ie|E,e)}function Pn(e,t=0){return Tn(8|t,e)}function L(e,t=[],n=[],r=[]){yt(r,t,n,t=>{Tn(8,()=>{e(...t.map(R))})})}function Fn(e,t=0){return Tn(16|t,e)}function In(e,t=0){return Tn(_|t,e)}function Ln(e){return Tn(32|E,e)}function Rn(e){var t=e.teardown;if(t!==null){let e=Zn,n=$n;Qn(!0),tr(null);try{t.call(null)}finally{Qn(e),tr(n)}}}function zn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&pt(()=>{e.abort(me)});var r=n.next;n.f&64?n.parent=null:Vn(n,t),n=r}}function Bn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||Vn(t),t=n}}function Vn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Hn(e.nodes.start,e.nodes.end),n=!0),e.f|=w,zn(e,t&&!n),yr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();Rn(e),e.f^=w,e.f|=S;var i=e.parent;i!==null&&i.first!==null&&Un(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Hn(e,t){for(;e!==null;){var n=e===t?null:vn(e);e.remove(),e=n}}function Un(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Wn(e,t,n=!0){var r=[];Gn(e,r,!0);var i=()=>{n&&Vn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Gn(e,t,n){if(!(e.f&8192)){e.f^=x;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Gn(i,t,o?n:!1)}i=a}}}function Kn(e){qn(e,!0)}function qn(e,t){if(e.f&8192){e.f^=x,e.f&1024||(rt(e,y),Ut.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;qn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Jn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:vn(n);t.append(n),n=i}}var Yn=null,Xn=!1,Zn=!1;function Qn(e){Zn=e}var $n=null,er=!1;function tr(e){$n=e}var nr=null;function rr(e){nr=e}var ir=null;function ar(e){$n!==null&&(ir??=new Set).add(e)}var or=null,sr=0,cr=null;function lr(e){cr=e}var ur=1,dr=0,fr=dr;function pr(e){fr=e}function mr(){return++ur}function hr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~ne),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&Ft===null&&rt(e,v)}return!1}function gr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(ir!==null&&ir.has(e)))for(var i=0;i{e.ac.abort(me)}),e.ac=null);try{e.f|=re;var u=e.fn,d=u();e.f|=C;var f=e.deps,p=Nt?.is_fork;if(or!==null){var m;if(p||yr(e,sr),f!==null&&sr>0)for(f.length=sr+or.length,m=0;m{s.ac.abort(me),s.ac=null,rt(s,y)}),At(s),yr(s,0)}}function yr(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?Qe(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function zr(e,t,n,r,i){var a={capture:r,passive:i},o=Rr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&Dn(()=>{t.removeEventListener(e,o,a)})}function z(e,t,n){(t[Fr]??={})[e]=n}function Br(e){for(var t=0;t{throw e});throw p}}finally{e[Fr]=t,delete e.currentTarget,tr(d),rr(f)}}}var Ur=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function Wr(e){return Ur?.createHTML(e)??e}function Gr(e){var t=xn(`template`);return t.innerHTML=Wr(e.replaceAll(``,``)),t.content}function Kr(e,t){var n=nr;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function B(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(Ie)return Kr(Re,null),Re;i===void 0&&(i=Gr(a?e:``+e),n||(i=_n(i)));var t=r||fn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=_n(t),s=t.lastChild;Kr(o,s)}else Kr(t,t);return t}}function qr(e,t,n=`svg`){var r=!e.startsWith(``),i=(t&1)!=0,a=`<${n}>${r?e:``+e}`,o;return()=>{if(Ie)return Kr(Re,null),Re;if(!o){var e=_n(Gr(a));if(i)for(o=document.createDocumentFragment();_n(e);)o.appendChild(_n(e));else o=_n(e)}var t=o.cloneNode(!0);if(i){var n=_n(t),r=t.lastChild;Kr(n,r)}else Kr(t,t);return t}}function Jr(e,t){return qr(e,t,`svg`)}function Yr(e=``){if(!Ie){var t=gn(e+``);return Kr(t,t),t}var n=Re;return n.nodeType===3?Sn(n):(n.before(n=gn()),ze(n)),Kr(n,n),n}function Xr(){if(Ie)return Kr(Re,null),Re;var e=document.createDocumentFragment(),t=document.createComment(``),n=gn();return e.append(t,n),Kr(t,n),e}function V(e,t){if(Ie){var n=nr;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=Re),Be();return}e!==null&&e.before(t)}var Zr=!0;function Qr(e){Zr=e}function H(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[fe]??=e.nodeValue)&&(e[fe]=n,e.nodeValue=`${n}`)}function $r(e,t){return ti(e,t)}var ei=new Map;function ti(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){hn();var l=void 0,u=jn(()=>{var u=n??t.appendChild(gn());_t(u,{pending:()=>{}},t=>{O({});var n=qe;if(o&&(n.c=o),a&&(i.$$events=a),Ie&&Kr(t,null),Zr=s,l=e(t,i)||{},Zr=!0,Ie&&(nr.nodes.end=Re,Re===null||Re.nodeType!==8||Re.data!==`]`))throw Ne(),De;k()},c);var d=new Set,f=e=>{for(var n=0;n{for(var e of d)for(let n of[t,document]){var r=ei.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,Hr),r.delete(e),r.size===0&&ei.delete(n)):r.set(e,i)}Lr.delete(f),u!==n&&u.parentNode?.removeChild(u)}});return ni.set(l,u),l}var ni=new WeakMap,ri=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)Kn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(Kn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(Vn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Jn(r,t),t.append(gn()),this.#n.set(e,{effect:r,fragment:t})}else Vn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Wn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(Vn(n.effect),this.#n.delete(e))};ensure(e,t){var n=Nt,r=bn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=gn();i.append(a),this.#n.set(e,{effect:Ln(()=>t(a)),fragment:i})}else this.#t.set(e,Ln(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else Ie&&(this.anchor=Re),this.#a(n)}};function U(e,t,n=!1){var r;Ie&&(r=Re,Be());var i=new ri(e),a=n?T:0;function o(e,t){if(Ie){var n=Ue(r);if(e!==parseInt(n.substring(1))){var a=He();ze(a),i.anchor=a,Le(!1),i.ensure(e,t),Le(!0);return}}i.ensure(e,t)}Fn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function ii(e,t){return t}function ai(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;oi(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null;if(l){var u=n,d=u.parentNode;yn(d),d.append(u),e.items.clear()}oi(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function oi(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,li(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=te,di(d,null,c)):Kn(d):Wn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:Fn(()=>{p=R(f);var e=p.length;let t=!1;Ie&&Ue(c)===`[!`!=(e===0)&&(c=He(),ze(c),Le(!1),t=!0);for(var r=new Set,u=Nt,v=bn(),y=0;ys(c)):(d=Ln(()=>s(si??=gn())),d.f|=te)),e>r.size&&_e(``,``,``),Ie&&e>0&&ze(He()),!h)if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);t&&Le(!0),R(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,Ie&&(c=Re)}function ci(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function li(e,t,n,i,a){var o=(i&8)!=0,s=t.length,c=e.items,l=ci(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var E=i&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function ui(e,t,n,r,i,a,o,s){var c=o&1?o&16?nn(n):rn(n,!1,!1):null,l=o&2?nn(i):null;return{v:c,i:l,e:Ln(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function di(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=vn(r);if(a.before(r),r===i)return;r=o}}function fi(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function pi(e,t,n=!1,r=!1,i=!1,a=!1){var o=e,s=``;if(n){var c=e;Ie&&(o=ze(_n(c)))}L(()=>{var e=nr;if(s===(s=t()??``)){Ie&&Be();return}if(n&&!Ie){e.nodes=null,c.innerHTML=s,s!==``&&Kr(_n(c),c.lastChild);return}if(e.nodes!==null&&(Hn(e.nodes.start,e.nodes.end),e.nodes=null),s!==``){if(Ie){for(var a=Re.data,l=Be(),u=l;l!==null&&(l.nodeType!==8||l.data!==``);)u=l,l=vn(l);if(l===null)throw Ne(),De;Kr(Re,u),o=ze(l);return}var d=xn(r?`svg`:i?`math`:`template`,r?Ae:i?je:void 0);d.innerHTML=s;var f=r||i?d:d.content;if(Kr(_n(f),f.lastChild),r||i)for(;_n(f);)o.before(_n(f));else o.before(f)}})}function mi(e,t,...n){var r=new ri(e);Fn(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},T)}function hi(e,t,n){var r;Ie&&(r=Re,Be());var i=new ri(e);Fn(()=>{var e=t()??null;if(Ie&&Ue(r)===`[`!=(e!==null)){var a=He();ze(a),i.anchor=a,Le(!1),i.ensure(e,e&&(t=>n(t,e))),Le(!0);return}i.ensure(e,e&&(t=>n(t,e)))},T)}var gi=()=>performance.now(),_i={tick:e=>requestAnimationFrame(e),now:()=>gi(),tasks:new Set};function vi(){let e=_i.now();_i.tasks.forEach(t=>{t.c(e)||(_i.tasks.delete(t),t.f())}),_i.tasks.size!==0&&_i.tick(vi)}function yi(e){let t;return _i.tasks.size===0&&_i.tick(vi),{promise:new Promise(n=>{_i.tasks.add(t={c:e,f:n})}),abort(){_i.tasks.delete(t)}}}function bi(e,t){pt(()=>{e.dispatchEvent(new CustomEvent(t))})}function xi(e){if(e===`float`)return`cssFloat`;if(e===`offset`)return`cssOffset`;if(e.startsWith(`--`))return e;let t=e.split(`-`);return t.length===1?t[0]:t[0]+t.slice(1).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)}function Si(e){let t={},n=e.split(`;`);for(let e of n){let[n,r]=e.split(`:`);if(!n||r===void 0)break;let i=xi(n.trim());t[i]=r.trim()}return t}var Ci=e=>e,wi=null;function Ti(e){wi=e}function Ei(e,t,n){var r=(wi??nr).nodes,i,a,o,s=null;r.a??={element:e,measure(){i=this.element.getBoundingClientRect()},apply(){if(o?.abort(),a=this.element.getBoundingClientRect(),i.left!==a.left||i.right!==a.right||i.top!==a.top||i.bottom!==a.bottom){let e=t()(this.element,{from:i,to:a},n?.());o=Oi(this.element,e,void 0,1,()=>{},()=>{o?.abort(),o=void 0})}},fix(){if(!e.getAnimations().length){var{position:t,width:n,height:r}=getComputedStyle(e);if(t!==`absolute`&&t!==`fixed`){var a=e.style;s={position:a.position,width:a.width,height:a.height,transform:a.transform},a.position=`absolute`,a.width=n,a.height=r;var o=e.getBoundingClientRect();if(i.left!==o.left||i.top!==o.top){var c=`translate(${i.left-o.left}px, ${i.top-o.top}px)`;a.transform=a.transform?`${a.transform} ${c}`:c}}}},unfix(){if(s){var t=e.style;t.position=s.position,t.width=s.width,t.height=s.height,t.transform=s.transform}}},r.a.element=e}function Di(e,t,n,r){var i=(e&1)!=0,a=(e&2)!=0,o=i&&a,s=(e&4)!=0,c=o?`both`:i?`in`:`out`,l,u=t.inert,d=t.style.overflow,f,p;function m(){return pt(()=>l??=n()(t,r?.()??{},{direction:c}))}var h={is_global:s,in(){if(t.inert=u,!i){p?.abort(),p?.reset?.();return}a||f?.abort(),f=Oi(t,m(),p,1,()=>{bi(t,`introstart`)},()=>{bi(t,`introend`),f?.abort(),f=l=void 0,t.style.overflow=d})},out(e){if(!a){e?.(),l=void 0;return}t.inert=!0,p=Oi(t,m(),f,0,()=>{bi(t,`outrostart`)},()=>{bi(t,`outroend`),e?.()})},stop:()=>{f?.abort(),p?.abort()}},g=nr;if((g.nodes.t??=[]).push(h),i&&Zr){var _=s;if(!_){for(var v=g.parent;v&&v.f&65536;)for(;(v=v.parent)&&!(v.f&16););_=!v||(v.f&32768)!=0}_&&Mn(()=>{wr(()=>h.in())})}}function Oi(e,t,n,r,i,a){var o=r===1;if(d(t)){var s,c=!1;return Qe(()=>{c||(s=Oi(e,t({direction:o?`in`:`out`}),n,r,i,a))}),{abort:()=>{c=!0,s?.abort()},deactivate:()=>s.deactivate(),reset:()=>s.reset(),t:()=>s.t()}}if(n?.deactivate(),!t?.duration&&!t?.delay)return i(),a(),{abort:f,deactivate:f,reset:f,t:()=>r};let{delay:l=0,css:u,tick:p,easing:m=Ci}=t;var h=[];if(o&&n===void 0&&(p&&p(0,1),u)){var g=Si(u(0,1));h.push(g,g)}var _=()=>1-r,v=e.animate(h,{duration:l,fill:`forwards`});return v.onfinish=()=>{v.cancel(),i();var o=n?.t()??1-r;n?.abort();var s=r-o,c=t.duration*Math.abs(s),l=[];if(c>0){var d=!1;if(u)for(var f=Math.ceil(c/(1e3/60)),h=0;h<=f;h+=1){var g=o+s*m(h/f),y=Si(u(g,1-g));l.push(y),d||=y.overflow===`hidden`}d&&(e.style.overflow=`hidden`),_=()=>{var e=v.currentTime;return o+s*m(e/c)},p&&yi(()=>{if(v.playState!==`running`)return!1;var e=_();return p(e,1-e),!0})}v=e.animate(l,{duration:c,fill:`forwards`}),v.onfinish=()=>{_=()=>r,p?.(r,1-r),a()}},{abort:()=>{v&&(v.cancel(),v.effect=null,v.onfinish=f)},deactivate:()=>{a=f},reset:()=>{r===0&&p?.(1,0)},t:()=>_()}}function ki(e,t,n,r,i,a){let o=Ie;Ie&&Be();var s=null;Ie&&Re.nodeType===1&&(s=Re,Be());var c=Ie?Re:e,l=nr,u=new ri(c,!1);Fn(()=>{let e=t()||null;var a=i?i():n||e===`svg`?Ae:void 0;if(e===null){u.ensure(null,null),Qr(!0);return}return u.ensure(e,t=>{if(e){if(s=Ie?s:xn(e,a),Kr(s,s),r){var n=null;Ie&&Pr(e)&&s.append(n=document.createComment(``));var i=Ie?_n(s):s.appendChild(gn());Ie&&(i===null?Le(!1):ze(i)),Ti(l),r(s,i),n?.remove(),Ti(null)}nr.nodes.end=s,t.before(s)}Ie&&ze(t)}),Qr(!0),()=>{e&&Qr(!1)}},T),Dn(()=>{Qr(!0)}),o&&(Le(!0),ze(c))}function Ai(e,t){var n=void 0,r;In(()=>{n!==(n=t())&&(r&&=(Vn(r),null),n&&(r=Ln(()=>{Mn(()=>n(e))})))})}function ji(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||Pi.includes(r[o-1]))&&(s===r.length||Pi.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Ii(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function Li(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function Ri(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(Li)),i&&c.push(...Object.keys(i).map(Li));var l=0,u=-1;let t=e.length;for(var d=0;d{Vi(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),Dn(()=>{t.disconnect()})}function Ui(e,t,n=t){var r=new WeakSet,i=!0;mt(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),Wi);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&Wi(o)}n(a),e.__value=a,Nt!==null&&r.add(Nt)}),Mn(()=>{var a=t();if(e===document.activeElement){var o=Nt;if(r.has(o))return}if(Vi(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=Wi(s),n(a))}e.__value=a,i=!1}),Hi(e)}function Wi(e){return`__value`in e?e.__value:e.value}var Gi=Symbol(`class`),Ki=Symbol(`style`),qi=Symbol(`is custom element`),Ji=Symbol(`is html`),Yi=he?`link`:`LINK`,Xi=he?`input`:`INPUT`,Zi=he?`option`:`OPTION`,Qi=he?`select`:`SELECT`,$i=he?`progress`:`PROGRESS`;function ea(e){if(Ie){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;K(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;K(e,`checked`,null),e.checked=r}}};e[pe]=n,Qe(n),ft()}}function ta(e,t){var n=oa(e);n.value===(n.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==$i)||(e.value=t??``)}function na(e,t){var n=oa(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function ra(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function K(e,t,n,r){var i=oa(e);Ie&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Yi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[ce]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&ca(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function ia(e,t,n,r,i=!1,a=!1){if(Ie&&i&&e.nodeName===Xi){var o=e;(o.type===`checkbox`?`defaultChecked`:`defaultValue`)in n||ea(o)}var s=oa(e),c=s[qi],l=!s[Ji];let u=Ie&&c;u&&Le(!1);var d=t||{},f=e.nodeName===Zi;for(var p in t)p in n||(n[p]=null);n.class?n.class=Ni(n.class):(r||n[Gi])&&(n.class=null),n[Ki]&&(n.style??=null);var m=ca(e);if(e.nodeName===Xi&&`type`in n&&(`value`in n||`__value`in n)){var h=n.type;(h!==d.type||h===void 0&&e.hasAttribute(`type`))&&(d.type=h,K(e,`type`,h,a))}for(let i in n){let o=n[i];if(f&&i===`value`&&o==null){e.value=e.__value=``,d[i]=o;continue}if(i===`class`){G(e,e.namespaceURI===`http://www.w3.org/1999/xhtml`,o,r,t?.[Gi],n[Gi]),d[i]=o,d[Gi]=n[Gi];continue}if(i===`style`){Bi(e,o,t?.[Ki],n[Ki]),d[i]=o,d[Ki]=n[Ki];continue}var g=d[i];if(!(o===g&&!(o===void 0&&e.hasAttribute(i)))){d[i]=o;var _=i[0]+i[1];if(_!==`$$`)if(_===`on`){let t={},n=`$$`+i,r=i.slice(2);var v=Dr(r);if(Tr(r)&&(r=r.slice(0,-7),t.capture=!0),!v&&g){if(o!=null)continue;e.removeEventListener(r,d[n],t),d[n]=null}if(v)z(r,e,o),Br([r]);else if(o!=null){function a(e){d[i].call(this,e)}d[n]=Rr(r,e,a,t)}}else if(i===`style`)K(e,i,o);else if(i===`autofocus`)lt(e,!!o);else if(!c&&(i===`__value`||i===`value`&&o!=null))e.value=e.__value=o;else if(i===`selected`&&f)ra(e,o);else{var y=i;l||(y=Ar(y));var b=y===`defaultValue`||y===`defaultChecked`;if(o==null&&!c&&!b)if(s[i]=null,y===`value`||y===`checked`){let n=e,r=t===void 0;if(y===`value`){let e=n.defaultValue;n.removeAttribute(y),n.defaultValue=e,n.value=n.__value=r?e:null}else{let e=n.defaultChecked;n.removeAttribute(y),n.defaultChecked=e,n.checked=r?e:!1}}else e.removeAttribute(i);else b||m.includes(y)&&(c||typeof o!=`string`)?(e[y]=o,y in s&&(s[y]=Oe)):typeof o!=`function`&&K(e,y,o,a)}}}return u&&Le(!0),d}function aa(e,t,n=[],r=[],i=[],a,o=!1,s=!1){yt(i,n,r,n=>{var r=void 0,i={},c=e.nodeName===Qi,l=!1;if(In(()=>{var u=t(...n.map(R)),d=ia(e,r,u,a,o,s);l&&c&&`value`in u&&Vi(e,u.value);for(let e of Object.getOwnPropertySymbols(i))u[e]||Vn(i[e]);for(let t of Object.getOwnPropertySymbols(u)){var f=u[t];t.description===`@attach`&&(!r||f!==r[t])&&(i[t]&&Vn(i[t]),i[t]=Ln(()=>Ai(e,()=>f))),d[t]=f}r=d}),c){var u=e;Mn(()=>{Vi(u,r.value,!0),Hi(u)})}l=!0})}function oa(e){return e[le]??={[qi]:e.nodeName.includes(`-`),[Ji]:e.namespaceURI===ke}}var sa=new Map;function ca(e){var t=e.getAttribute(`is`)||e.nodeName,n=sa.get(t);if(n)return n;sa.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.push(s);i=l(i)}return n}function la(e,t,n=t){var r=new WeakSet;mt(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=da(e)?fa(a):a,n(a),Nt!==null&&r.add(Nt),await xr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(Ie&&e.defaultValue!==e.value||wr(t)==null&&e.value)&&(n(da(e)?fa(e.value):e.value),Nt!==null&&r.add(Nt)),Pn(()=>{var n=t();if(e===document.activeElement){var i=Nt;if(r.has(i))return}da(e)&&n===fa(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function ua(e,t,n=t){mt(e,`change`,t=>{n(t?e.defaultChecked:e.checked)}),(Ie&&e.defaultChecked!==e.checked||wr(t)==null)&&n(e.checked),Pn(()=>{e.checked=!!t()})}function da(e){var t=e.type;return t===`number`||t===`range`}function fa(e){return e===``?null:+e}function pa(e,t){return e===t||e?.[oe]===t}function ma(e={},t,n,r){var i=qe.r,a=nr;return Mn(()=>{var o,s;return Pn(()=>{o=s,s=r?.()||[],wr(()=>{pa(n(...s),e)||(t(e,...s),o&&pa(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&pa(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}var ha={get(e,t){if(!e.exclude.has(t))return e.props[t]},set(e,t){return!1},getOwnPropertyDescriptor(e,t){if(!e.exclude.has(t)&&t in e.props)return{enumerable:!0,configurable:!0,value:e.props[t]}},has(e,t){return!e.exclude.has(t)&&t in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(t=>!e.exclude.has(t))}};function ga(e,t,n){return new Proxy({props:e,exclude:t},ha)}function q(e,t,n,r){var i=!0,o=(n&8)!=0,s=(n&16)!=0,c=r,l=!0,u=void 0,d=()=>s&&i?(u??=Ct(r),R(u)):(l&&(l=!1,c=s?wr(r):r),c);let f;if(o){var p=oe in e||se in e;f=a(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;o?[m,h]=ct(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Se(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?Ct:Et)(()=>(v=!1,g()));o&&R(y);var b=nr;return(function(e,t){if(arguments.length>0){let n=t?R(y):i&&o?N(e):e;return M(y,n),v=!0,c!==void 0&&(c=n),e}return Zn&&v||b.f&16384?y.v:R(y)})}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var _a=new Set([`$$slots`,`$$events`,`$$legacy`,`icon`,`class`]),va=Jr(``);function J(e,t){let n=q(t,`icon`,19,()=>[]),r=q(t,`class`,3,``),i=ga(t,_a);var a=va();aa(a,()=>({xmlns:`http://www.w3.org/2000/svg`,width:`24`,height:`24`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,class:r(),"aria-hidden":`true`,focusable:`false`,...i}));{let e=(t,n=f)=>{var r=Xr();W(F(r),17,n,ii,(t,n)=>{var r=A(()=>g(R(n),3));let i=()=>R(r)[0],a=()=>R(r)[1],o=()=>R(r)[2];var s=Xr();ki(F(s),i,!0,(t,n)=>{aa(t,()=>({xmlns:`http://www.w3.org/2000/svg`,...a()}));var r=Xr(),i=F(r),s=t=>{e(t,o)},c=A(()=>Array.isArray(o()));U(i,e=>{R(c)&&e(s)}),V(n,r)}),V(t,s)}),V(t,r)};e(P(a),n),D(a)}V(e,a)}var ya=Jr(``);function ba(e){V(e,ya())}function xa(){try{return typeof localStorage>`u`?null:localStorage}catch{return null}}function Sa(e,t=null){let n=xa();if(!n)return t;try{return n.getItem(e)??t}catch{return t}}function Ca(e,t){let n=xa();if(n)try{n.setItem(e,String(t))}catch{}}function wa(e){let t=Number(e);return Number.isFinite(t)?Math.min(240,Math.max(60,Math.round(t))):240}function Ta(e,t,n){return wa(Number(e)+Number(n)-Number(t))}var Ea=new class{#e=j(`system`);get theme(){return R(this.#e)}set theme(e){M(this.#e,e,!0)}#t=j(0);get tick(){return R(this.#t)}set tick(e){M(this.#t,e,!0)}init(){this.theme=Sa(`gomodel_theme`,`system`),this.apply(),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{this.theme===`system`&&this.tick++})}set(e){this.theme=e,Ca(`gomodel_theme`,e),this.apply(),this.tick++}toggle(){let e=[`light`,`system`,`dark`];this.set(e[(e.indexOf(this.theme)+1)%e.length])}apply(){let e=document.documentElement;this.theme===`system`?e.removeAttribute(`data-theme`):e.setAttribute(`data-theme`,this.theme)}},Da=new class{#e=j(N(240));get width(){return R(this.#e)}set width(e){M(this.#e,e,!0)}get collapsed(){return this.width===60}init(){let e=Sa(`gomodel_sidebar_width`),t=Sa(`gomodel_sidebar_collapsed`)===`true`;this.setWidth(e??(t?60:240))}toggle(){this.setWidth(this.collapsed?240:60,!0)}setWidth(e,t=!1){this.width=wa(e),typeof document<`u`&&document.documentElement.style.setProperty(`--sidebar-width`,`${this.width}px`),t&&(Ca(`gomodel_sidebar_width`,this.width),Ca(`gomodel_sidebar_collapsed`,this.collapsed))}},Oa=new class{#e=j(N([]));get stack(){return R(this.#e)}set stack(e){M(this.#e,e,!0)}#t=1;opened(){let e=this.#t++;return this.stack=[...this.stack,e],e}closed(e){this.stack=this.stack.filter(t=>t!==e)}isTop(e){return this.stack.length>0&&this.stack[this.stack.length-1]===e}get openCount(){return this.stack.length}get anyOpen(){return this.stack.length>0}},ka=[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`}]],Aa=[[`path`,{d:`M12 5v14`}],[`path`,{d:`m19 12-7 7-7-7`}]],ja=[[`path`,{d:`m12 19-7-7 7-7`}],[`path`,{d:`M19 12H5`}]],Ma=[[`path`,{d:`M5 12h14`}],[`path`,{d:`m12 5 7 7-7 7`}]],Na=[[`path`,{d:`m5 12 7-7 7 7`}],[`path`,{d:`M12 19V5`}]],Pa=[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`}],[`path`,{d:`M12 22V12`}]],Fa=[[`rect`,{width:`16`,height:`20`,x:`4`,y:`2`,rx:`2`}],[`line`,{x1:`8`,x2:`16`,y1:`6`,y2:`6`}],[`line`,{x1:`16`,x2:`16`,y1:`14`,y2:`18`}],[`path`,{d:`M16 10h.01`}],[`path`,{d:`M12 10h.01`}],[`path`,{d:`M8 10h.01`}],[`path`,{d:`M12 14h.01`}],[`path`,{d:`M8 14h.01`}],[`path`,{d:`M12 18h.01`}],[`path`,{d:`M8 18h.01`}]],Ia=[[`path`,{d:`M8 2v4`}],[`path`,{d:`M16 2v4`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`}],[`path`,{d:`M3 10h18`}],[`path`,{d:`M8 14h.01`}],[`path`,{d:`M12 14h.01`}],[`path`,{d:`M16 14h.01`}],[`path`,{d:`M8 18h.01`}],[`path`,{d:`M12 18h.01`}],[`path`,{d:`M16 18h.01`}]],La=[[`path`,{d:`M8 2v4`}],[`path`,{d:`M16 2v4`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`}],[`path`,{d:`M3 10h18`}]],Ra=[[`path`,{d:`M13 17V9`}],[`path`,{d:`M18 17V5`}],[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`}],[`path`,{d:`M8 17v-3`}]],za=[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`}],[`path`,{d:`M18 17V9`}],[`path`,{d:`M13 17V5`}],[`path`,{d:`M8 17v-3`}]],Ba=[[`path`,{d:`M20 6 9 17l-5-5`}]],Va=[[`path`,{d:`m6 9 6 6 6-6`}]],Ha=[[`path`,{d:`m15 18-6-6 6-6`}]],Ua=[[`path`,{d:`m9 18 6-6-6-6`}]],Wa=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`}],[`path`,{d:`m9 11 3 3L22 4`}]],Ga=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`m9 12 2 2 4-4`}]],Ka=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8`}],[`path`,{d:`M12 18V6`}]],qa=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M12 6v6l4 2`}]],Ja=[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`}]],Ya=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 15 21.84`}],[`path`,{d:`M21 5V8`}],[`path`,{d:`M21 12L18 17H22L19 22`}],[`path`,{d:`M3 12A9 3 0 0 0 14.59 14.87`}]],Xa=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`}]],Za=[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`}],[`path`,{d:`M10 9H8`}],[`path`,{d:`M16 13H8`}],[`path`,{d:`M16 17H8`}]],Qa=[[`path`,{d:`m12 14 4-4`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`}]],$a=[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`}],[`path`,{d:`M3 3v5h5`}],[`path`,{d:`M12 7v5l4 2`}]],eo=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M12 16v-4`}],[`path`,{d:`M12 8h.01`}]],to=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],no=[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`}]],ro=[[`path`,{d:`M3 5h.01`}],[`path`,{d:`M3 12h.01`}],[`path`,{d:`M3 19h.01`}],[`path`,{d:`M8 5h13`}],[`path`,{d:`M8 12h13`}],[`path`,{d:`M8 19h13`}]],io=[[`circle`,{cx:`12`,cy:`16`,r:`1`}],[`rect`,{x:`3`,y:`10`,width:`18`,height:`12`,rx:`2`}],[`path`,{d:`M7 10V7a5 5 0 0 1 10 0v3`}]],ao=[[`path`,{d:`m16 17 5-5-5-5`}],[`path`,{d:`M21 12H9`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`}]],oo=[[`path`,{d:`M15 3h6v6`}],[`path`,{d:`m21 3-7 7`}],[`path`,{d:`m3 21 7-7`}],[`path`,{d:`M9 21H3v-6`}]],so=[[`path`,{d:`m14 10 7-7`}],[`path`,{d:`M20 10h-6V4`}],[`path`,{d:`m3 21 7-7`}],[`path`,{d:`M4 14h6v6`}]],co=[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`}]],lo=[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`}]],uo=[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`}],[`path`,{d:`m15 5 4 4`}]],fo=[[`path`,{d:`M12 22v-5`}],[`path`,{d:`M15 8V2`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`}],[`path`,{d:`M9 8V2`}]],po=[[`path`,{d:`M5 12h14`}],[`path`,{d:`M12 5v14`}]],mo=[[`path`,{d:`M12 2v10`}],[`path`,{d:`M18.4 6.6a9 9 0 1 1-12.77.04`}]],ho=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`}],[`path`,{d:`M21 3v5h-5`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`}],[`path`,{d:`M8 16H3v5`}]],go=[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`}],[`path`,{d:`M3 3v5h5`}]],_o=[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`}]],vo=[[`path`,{d:`m21 21-4.34-4.34`}],[`circle`,{cx:`11`,cy:`11`,r:`8`}]],yo=[[`path`,{d:`m10.852 14.772-.383.923`}],[`path`,{d:`M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923`}],[`path`,{d:`m13.148 9.228.383-.923`}],[`path`,{d:`m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544`}],[`path`,{d:`m14.772 10.852.923-.383`}],[`path`,{d:`m14.772 13.148.923.383`}],[`path`,{d:`M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5`}],[`path`,{d:`M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5`}],[`path`,{d:`M6 18h.01`}],[`path`,{d:`M6 6h.01`}],[`path`,{d:`m9.228 10.852-.923-.383`}],[`path`,{d:`m9.228 13.148-.923.383`}]],bo=[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`}]],xo=[[`path`,{d:`M14 17H5`}],[`path`,{d:`M19 7h-9`}],[`circle`,{cx:`17`,cy:`17`,r:`3`}],[`circle`,{cx:`7`,cy:`7`,r:`3`}]],So=[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}]],Co=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}],[`path`,{d:`m9 12 2 2 4-4`}]],wo=[[`path`,{d:`m2 2 20 20`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`}]],To=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}]],Eo=[[`path`,{d:`m18 14 4 4-4 4`}],[`path`,{d:`m18 2 4 4-4 4`}],[`path`,{d:`M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22`}],[`path`,{d:`M2 6h1.972a4 4 0 0 1 3.6 2.2`}],[`path`,{d:`M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45`}]],Do=[[`circle`,{cx:`12`,cy:`12`,r:`4`}],[`path`,{d:`M12 2v2`}],[`path`,{d:`M12 20v2`}],[`path`,{d:`m4.93 4.93 1.41 1.41`}],[`path`,{d:`m17.66 17.66 1.41 1.41`}],[`path`,{d:`M2 12h2`}],[`path`,{d:`M20 12h2`}],[`path`,{d:`m6.34 17.66-1.41 1.41`}],[`path`,{d:`m19.07 4.93-1.41 1.41`}]],Oo=[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],ko=[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`}],[`circle`,{cx:`12`,cy:`14`,r:`8`}]],Ao=[[`path`,{d:`M10 11v6`}],[`path`,{d:`M14 11v6`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`}],[`path`,{d:`M3 6h18`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`}]],jo=[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`}],[`path`,{d:`M12 9v4`}],[`path`,{d:`M12 17h.01`}]],Mo=[[`circle`,{cx:`12`,cy:`8`,r:`5`}],[`path`,{d:`M20 21a8 8 0 0 0-16 0`}]],No=[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`}],[`circle`,{cx:`12`,cy:`7`,r:`4`}]],Po=[[`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`}],[`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`}]],Fo=[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`}],[`path`,{d:`m14 7 3 3`}],[`path`,{d:`M5 6v4`}],[`path`,{d:`M19 14v4`}],[`path`,{d:`M10 2v2`}],[`path`,{d:`M7 8H3`}],[`path`,{d:`M21 16h-4`}],[`path`,{d:`M11 3H9`}]],Io=[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`}]],Lo=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]],Ro=B(``),zo=B(`
`,1);function Bo(e,t){O(t,!0);let n=q(t,`compact`,3,!1),r=[{value:`light`,icon:Do,label:`Light theme`},{value:`system`,icon:co,label:`System theme`},{value:`dark`,icon:lo,label:`Dark theme`}],i=A(()=>r.find(e=>e.value===Ea.theme)||r[1]),a=A(()=>`Change theme (currently `+R(i).label+`)`);var o=zo(),s=F(o);let c;W(s,21,()=>r,e=>e.value,(e,t)=>{var n=Ro();let r;J(P(n),{get icon(){return R(t).icon},class:`theme-icon`}),D(n),L(()=>{r=G(n,1,`theme-btn svelte-1keql7b`,null,r,{active:Ea.theme===R(t).value}),K(n,`aria-pressed`,Ea.theme===R(t).value),K(n,`title`,R(t).label),K(n,`aria-label`,R(t).label)}),z(`click`,n,()=>Ea.set(R(t).value)),V(e,n)}),D(s);var l=I(s,2);let u;J(P(l),{get icon(){return R(i).icon},class:`theme-icon`}),D(l),L(()=>{c=G(s,1,`theme-toggle svelte-1keql7b`,null,c,{"is-compact":n()}),u=G(l,1,`theme-toggle-mobile svelte-1keql7b`,null,u,{"is-compact":n()}),K(l,`title`,R(a)),K(l,`aria-label`,R(a))}),z(`click`,l,()=>Ea.toggle()),V(e,o),k()}Br([`click`]);function Vo(){return typeof window>`u`?`/`:window.GOMODEL_BASE_PATH||`/`}function Ho(e){let t=Vo();return!e||e.charAt(0)!==`/`||e.indexOf(`//`)===0||t===`/`||e===t||e.indexOf(t+`/`)===0?e:t+e}function Uo(e){let t=Vo();return t===`/`||!e?e:e===t?`/`:e.indexOf(t+`/`)===0?e.slice(t.length)||`/`:e}function Wo(){return typeof window>`u`?``:window.GOMODEL_VERSION||``}function Go(){return typeof window>`u`?!1:window.GOMODEL_DEMO_MODE===!0}var Ko=[`overview`,`usage`,`budgets`,`rate-limits`,`models`,`workflows`,`audit-logs`,`guardrails`,`mcp-servers`,`providers-config`,`auth-keys`,`settings`];function qo(e){return e.startsWith(`/admin/static/`)?`/`+e.slice(14).replace(/^\/+/,``):e}function Jo(e){let t=qo(Uo(e)).replace(/\/$/,``).replace(`/admin/dashboard`,``).replace(/^\//,``).split(`/`),n=t[0];n===`audit`&&(n=`audit-logs`);let r=t[1]||null;return n===`settings`&&r===`guardrails`?{page:`guardrails`,sub:null}:(n=Ko.includes(n)?n:`overview`,{page:n,sub:r})}var Yo=new class{#e=j(`overview`);get page(){return R(this.#e)}set page(e){M(this.#e,e,!0)}#t=j(null);get sub(){return R(this.#t)}set sub(e){M(this.#t,e,!0)}init(){let{page:e,sub:t}=Jo(window.location.pathname);this.page=e,this.sub=t,window.addEventListener(`popstate`,()=>{let{page:e,sub:t}=Jo(window.location.pathname);this.page=e,this.sub=t})}navigate(e,t=null){let n=t?`/`+t:``;history.pushState(null,``,Ho(`/admin/dashboard/`+e+n)),this.page=e,this.sub=t}},Xo=`X-GoModel-Auth-Login`,Zo=`X-GoModel-Auth-Logout`,Qo=`X-GoModel-Auth-User`;function $o(e){let t=String(e||``).trim();return!t.startsWith(`/`)||t.startsWith(`//`)||t.includes(`\\`)?``:t}function es(e,t=globalThis.location){let n=$o(e),r=$o(t?.pathname);if(!n||!r)return n;let i=String(t?.search||``),a=r+(i.startsWith(`?`)?i:``),o=n.indexOf(`#`),s=o<0?n:n.slice(0,o),c=o<0?``:n.slice(o);return`${s}${s.includes(`?`)?`&`:`?`}return_to=${encodeURIComponent(a)}${c}`}function ts(e){let t=e?.headers;if(!t||typeof t.has!=`function`)return null;let n={};return t.has(Xo)&&(n.loginURL=$o(t.get(Xo))),t.has(Zo)&&(n.logoutURL=$o(t.get(Zo))),t.has(Qo)&&(n.user=String(t.get(Qo)||``).trim().slice(0,256)),n}var ns=`gomodel_api_key`;function rs(e){let t=String(e||``).trim();if(/^Bearer\s*$/i.test(t))return``;let n=t.match(/^Bearer\s+(.+)$/i);return n?n[1].trim():t}var Y=new class{#e=j(``);get apiKey(){return R(this.#e)}set apiKey(e){M(this.#e,e,!0)}#t=j(!1);get needsAuth(){return R(this.#t)}set needsAuth(e){M(this.#t,e,!0)}#n=j(!1);get authError(){return R(this.#n)}set authError(e){M(this.#n,e,!0)}#r=j(``);get authErrorMessage(){return R(this.#r)}set authErrorMessage(e){M(this.#r,e,!0)}#i=j(!1);get dialogOpen(){return R(this.#i)}set dialogOpen(e){M(this.#i,e,!0)}#a=j(``);get externalLoginURL(){return R(this.#a)}set externalLoginURL(e){M(this.#a,e,!0)}#o=j(``);get externalLogoutURL(){return R(this.#o)}set externalLogoutURL(e){M(this.#o,e,!0)}#s=j(``);get externalUser(){return R(this.#s)}set externalUser(e){M(this.#s,e,!0)}#c=j(0);get generation(){return R(this.#c)}set generation(e){M(this.#c,e,!0)}#l=j(0);get refreshTick(){return R(this.#l)}set refreshTick(e){M(this.#l,e,!0)}init(){try{this.apiKey=rs(localStorage.getItem(ns)||``)}catch{this.apiKey=``}}hasApiKey(){return rs(this.apiKey)!==``}save(){this.apiKey=rs(this.apiKey);try{localStorage.setItem(ns,this.apiKey)}catch{}}selectExternalAuthentication(){this.apiKey=``;try{localStorage.removeItem(ns)}catch{}this.generation++,this.authError=!1,this.authErrorMessage=``,this.needsAuth=!0}openDialog(){this.dialogOpen=!0}closeDialog(){this.dialogOpen=!1}submit(){let e=rs(this.apiKey);return e?(this.apiKey=e,this.save(),this.generation++,this.authError=!1,this.authErrorMessage=``,this.needsAuth=!1,this.closeDialog(),this.refresh(),!0):(this.apiKey=``,this.authError=!0,this.authErrorMessage=``,this.needsAuth=!0,this.openDialog(),!1)}refresh(){this.refreshTick++}observeResponse(e){let t=ts(e);t&&(Object.hasOwn(t,`loginURL`)&&(this.externalLoginURL=t.loginURL),Object.hasOwn(t,`logoutURL`)&&(this.externalLogoutURL=t.logoutURL),Object.hasOwn(t,`user`)&&(this.externalUser=t.user))}handleUnauthorized(e,t=``){return typeof e==`number`&&e{r[e.type]=e.value}),r.year+`-`+r.month+`-`+r.day}formatTimestampInTimeZone(e,t){if(e==null)return`-`;let n=new Date(e);if(Number.isNaN(n.getTime()))return`-`;let r=ms(`en-CA`,{timeZone:hs(t)?t:us,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hourCycle:`h23`}).formatToParts(n),i={};return r.forEach(e=>{i[e.type]=e.value}),i.year+`-`+i.month+`-`+i.day+` `+i.hour+`:`+i.minute+`:`+i.second}formatTimestamp(e){return this.formatTimestampInTimeZone(e,this.effectiveTimezone())}currentDateKey(e){return this.dateKeyInTimeZone(e||new Date,this.effectiveTimezone())}dateKeyToDate(e){return as(e)}dateToDateKey(e){return os(e)}addDaysToDateKey(e,t){return ss(e,t)}todayDate(){return this.dateKeyToDate(this.currentDateKey())}startOfMonthDate(e){let t=e instanceof Date?e:this.todayDate();return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),1))}timeZoneOffsetLabel(e,t){let n=hs(e)?e:us;try{let e=ms(`en-US`,{timeZone:n,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`,timeZoneName:`longOffset`}).formatToParts(t||new Date).find(e=>e.type===`timeZoneName`);if(!e||!e.value)return`UTC+00:00`;let r=e.value.replace(`GMT`,`UTC`);return r===`UTC`?`UTC+00:00`:r}catch{return`UTC+00:00`}}timeZoneOffsetMinutes(e,t){let n=/^UTC([+-])(\d{2}):(\d{2})$/.exec(this.timeZoneOffsetLabel(e,t));if(!n)return 0;let r=Number(n[2])*60+Number(n[3]);return n[1]===`-`?-r:r}timeZoneOptionLabel(e,t){return e+` (`+this.timeZoneOffsetLabel(e,t)+`)`}detectedTimeZoneLabel(){return this.timeZoneOptionLabel(this.detectedTimezone)}effectiveTimeZoneLabel(){return this.timeZoneOptionLabel(this.effectiveTimezone())}ensureOptions(){if(this.optionsLoaded)return;let e=new Date,t=[];try{typeof Intl.supportedValuesOf==`function`&&(t=Intl.supportedValuesOf(`timeZone`))}catch{t=[]}[us,this.detectedTimezone,this.override].forEach(e=>{e&&t.indexOf(e)===-1&&hs(e)&&t.push(e)}),t=t.filter(e=>hs(e)),t.sort((t,n)=>{let r=this.timeZoneOffsetMinutes(t,e)-this.timeZoneOffsetMinutes(n,e);return r===0?t.localeCompare(n):r}),this.options=t.map(t=>({value:t,label:this.timeZoneOptionLabel(t,e)})),this.optionsLoaded=!0}saveOverride(){let e=xa();if(e)if(this.override&&hs(this.override))try{e.setItem(ds,this.override)}catch{}else{try{e.removeItem(ds)}catch{}this.override=``}this.optionsLoaded=!1,this.ensureOptions()}clearOverride(){let e=xa();if(e)try{e.removeItem(ds)}catch{}this.override=``}calendarTimeZoneText(){let e=this.override?`manual override`:`auto-detected`;return`Activity grouped by `+this.effectiveTimeZoneLabel()+` (`+e+`)`}};function ys(e,t){let n=e&&typeof e==`object`&&e.error&&e.error.message;return(typeof n==`string`?n.trim():``)||t}function bs(e,t){let n=e&&e.data;if(n&&typeof n==`object`){let e=[n.message,n.error,n.error&&typeof n.error==`object`?n.error.message:null];for(let t of e)if(typeof t==`string`&&t.trim())return t.trim()}return t}function xs(){let e={"Content-Type":`application/json`},t=rs(Y.apiKey);return t&&(e.Authorization=`Bearer `+t),e[`X-GoModel-Timezone`]=vs.effectiveTimezone(),e}function Ss(e,t={}){return fetch(Ho(e),{...t,headers:{...xs(),...t.headers||{}}})}async function Cs(e,t,{label:n=e,parse:r=!0}={}){let i=Y.generation,a=await Ss(e,t),o=ie.trim()).filter(Boolean);return e.length>0?e:Os}cacheVisible(){if(this.flag(`CACHE_ENABLED`)!==``)return this.booleanFlag(`CACHE_ENABLED`,!1);let e=this.flag(`REDIS_URL`),t=this.flag(`SEMANTIC_CACHE_ENABLED`);return e===``&&t===``||this.booleanFlag(`REDIS_URL`,!1)||this.booleanFlag(`SEMANTIC_CACHE_ENABLED`,!1)}auditVisible(){return this.booleanFlag(`LOGGING_ENABLED`,!0)}usageVisible(){return this.booleanFlag(`USAGE_ENABLED`,!0)}budgetsVisible(){return this.booleanFlag(`BUDGETS_ENABLED`,!0)}rateLimitsVisible(){return this.booleanFlag(`RATE_LIMITS_ENABLED`,!0)}guardrailsVisible(){return this.booleanFlag(`GUARDRAILS_ENABLED`,!0)}mcpVisible(){return this.booleanFlag(`MCP_ENABLED`,!0)}liveLogsVisible(){return this.booleanFlag(`DASHBOARD_LIVE_LOGS_ENABLED`,!0)}fetch(){return this.#n||=this.#r().finally(()=>{this.#n=null}),this.#n}async ensureLoaded(){if(this.#n){await this.#n;return}this.loaded||await this.fetch()}async#r(){let e=typeof AbortController==`function`?new AbortController:null,t=e?setTimeout(()=>e.abort(),1e4):null;try{let t=await ws(`/admin/runtime/config`,{label:`dashboard config`,signal:e?e.signal:void 0});if(t.stale)return;if(!t.ok){this.config={},this.loaded=!1;return}let n=t.data,r={};for(let e of Ds)n&&typeof n==`object`&&!Array.isArray(n)&&n[e]!==void 0&&n[e]!==null&&(r[e]=String(n[e]).trim());this.config=r,this.loaded=!0}catch(e){console.error(`Failed to fetch dashboard config:`,e),this.config={},this.loaded=!1}finally{t!==null&&clearTimeout(t)}}},As=[{page:`overview`,label:`Overview`,icon:no},{page:`providers-config`,label:`Providers`,icon:yo},{page:`models`,label:`Models`,icon:Pa},{page:`audit-logs`,label:`Audit Logs`,icon:$a},{page:`usage`,label:`Usage`,icon:za},{page:`budgets`,label:`Budgets`,icon:Po,visible:()=>ks.budgetsVisible()},{page:`rate-limits`,label:`Rate Limits`,icon:Qa,visible:()=>ks.rateLimitsVisible()},{page:`auth-keys`,label:`API Keys`,icon:to},{page:`workflows`,label:`Workflows`,icon:Io},{page:`guardrails`,label:`Guardrails (experimental)`,icon:Co,visible:()=>ks.guardrailsVisible()},{page:`mcp-servers`,label:`MCP Servers`,icon:fo,visible:()=>ks.mcpVisible()},{page:`settings`,label:`Settings`,icon:So}],js=B(` `),Ms=B(`
`),Ns=B(``),Ps=B(`
`),Fs=B(` `,1);function Is(e,t){O(t,!0);let n=A(()=>As.filter(e=>!e.visible||e.visible())),r=j(null),i=0,a=0,o=!1;function s(e){e.button===0&&(e.preventDefault(),M(r,e.pointerId,!0),i=e.clientX,a=Da.width,o=!1,e.currentTarget.setPointerCapture(e.pointerId),document.body.classList.add(`sidebar-resizing`))}function c(e){e.pointerId===R(r)&&(!o&&Math.abs(e.clientX-i)<=4||(o=!0,Da.setWidth(Ta(a,i,e.clientX))))}function l(e){R(r)===null||e.pointerId!==void 0&&e.pointerId!==R(r)||(M(r,null),document.body.classList.remove(`sidebar-resizing`),Da.setWidth(Da.width,!0))}function u(){if(o){o=!1;return}Da.toggle()}function d(e){let t;if(e.key===`ArrowLeft`)t=Da.width-12;else if(e.key===`ArrowRight`)t=Da.width+12;else if(e.key===`Home`)t=60;else if(e.key===`End`)t=240;else if(e.key===`Enter`||e.key===` `){e.preventDefault(),Da.toggle();return}else return;e.preventDefault(),Da.setWidth(t,!0)}var f=Fs(),p=F(f);let m;var h=P(p),g=P(h);ba(P(g),{}),D(g),Ve(4),D(h);var _=I(h,2);W(_,21,()=>R(n),e=>e.page,(e,t)=>{var n=js();let r;var i=P(n);J(i,{get icon(){return R(t).icon},class:`nav-icon`});var a=I(i,2),o=P(a,!0);D(a),D(n),L(e=>{K(n,`href`,e),r=G(n,1,`nav-item svelte-1nwtzae`,null,r,{active:Yo.page===R(t).page}),K(n,`title`,R(t).label),H(o,R(t).label)},[()=>Ho(`/admin/dashboard/`+R(t).page)]),z(`click`,n,e=>{e.preventDefault(),Yo.navigate(R(t).page)}),V(e,n)}),D(_);var v=I(_,2),y=P(v);Bo(y,{get compact(){return Da.collapsed}});var b=I(y,2),x=e=>{var t=Ns(),n=P(t),r=e=>{var t=Ms(),n=P(t);J(n,{get icon(){return Mo},class:`api-key-open-icon`});var r=I(n,2),i=P(r,!0);D(r),D(t),L(()=>{K(t,`title`,Y.externalUser),H(i,Y.externalUser)}),V(e,t)};U(n,e=>{Y.externalUser&&e(r)});var i=I(n,2);J(P(i),{get icon(){return ao},class:`api-key-open-icon`}),Ve(2),D(i),D(t),L(e=>K(i,`href`,e),[()=>Ho(Y.externalLogoutURL)]),V(e,t)};U(b,e=>{Y.externalLogoutURL&&e(x)});var S=I(b,2),C=e=>{var t=Ps(),n=P(t),r=P(n);J(r,{get icon(){return io},class:`api-key-open-icon`});var i=I(r,2),a=P(i,!0);D(i),D(n),D(t),L(()=>{K(n,`aria-label`,Y.needsAuth?`Enter API key`:`Change API key`),H(a,Y.needsAuth?`Enter API key`:`Change API key`)}),z(`click`,n,()=>Y.openDialog()),V(e,t)},w=A(()=>Y.needsAuth||Y.hasApiKey());U(S,e=>{R(w)&&e(C)}),D(v),D(p);var T=I(p,2);L(()=>{m=G(p,1,`sidebar svelte-1nwtzae`,null,m,{"sidebar-collapsed":Da.collapsed,"sidebar-resizing":R(r)!==null}),K(T,`aria-valuemin`,60),K(T,`aria-valuemax`,240),K(T,`aria-valuenow`,Da.width)}),z(`pointerdown`,T,s),z(`pointermove`,T,c),z(`pointerup`,T,l),zr(`pointercancel`,T,l),zr(`lostpointercapture`,T,l),z(`keydown`,T,d),z(`click`,T,u),V(e,f),k()}Br([`click`,`pointerdown`,`pointermove`,`pointerup`,`keydown`]);var Ls=B(``);function Rs(e,t){O(t,!0);let n=q(t,`label`,3,`Close`),r=q(t,`class`,3,``),i=q(t,`iconClass`,3,`table-icon-svg`),a=q(t,`disabled`,3,!1),o=q(t,`el`,15,null);var s=Ls();J(P(s),{get icon(){return Lo},get class(){return i()}}),D(s),ma(s,e=>o(e),()=>o()),L(()=>{G(s,1,Ni([`dialog-close-btn`,r()]),`svelte-11l1bb5`),K(s,`aria-label`,n()),s.disabled=a()}),z(`click`,s,function(...e){t.onclick?.apply(this,e)}),V(e,s),k()}Br([`click`]);function zs(e){return t=>{let n=n=>{t.contains(n.target)||e()},r=t=>{t.key===`Escape`&&e()};return document.addEventListener(`click`,n,!0),window.addEventListener(`keydown`,r),()=>{document.removeEventListener(`click`,n,!0),window.removeEventListener(`keydown`,r)}}}function Bs(e=`[data-modal-autofocus]`){return t=>{let n=t.querySelector(e);n&&typeof n.focus==`function`&&n.focus()}}var Vs=B(`
`,1);function Hs(e,t){O(t,!0);let n=q(t,`open`,3,!1),r=q(t,`variant`,3,`editor`),i=q(t,`closeOnBackdrop`,3,!0),a=A(()=>r()===`auth`?`auth-dialog-backdrop`:`editor-modal-backdrop`),o=A(()=>r()===`auth`?`auth-dialog-shell`:`editor-modal-shell`);On(()=>{if(!n())return;let e=wr(()=>Oa.opened()),r=n=>{n.key===`Escape`&&Oa.isTop(e)&&t.onclose?.()};return window.addEventListener(`keydown`,r),()=>{Oa.closed(e),window.removeEventListener(`keydown`,r)}});function s(e){i()&&e.target===e.currentTarget&&t.onclose?.()}var c=Xr(),l=F(c),u=e=>{var n=Vs(),r=F(n),i=I(r,2);mi(P(i),()=>t.children??f),D(i),Ai(i,Bs),L(()=>{G(r,1,Ni(R(a)),`svelte-17e0w4c`),G(i,1,Ni(R(o)),`svelte-17e0w4c`)}),z(`click`,i,s),V(e,n)};U(l,e=>{n()&&e(u)}),V(e,c),k()}Br([`click`]);var Us=B(`
or use an API key
`,1),Ws=B(``),Gs=B(``);function Ks(e,t){O(t,!0),Hs(e,{get open(){return Y.dialogOpen},variant:`auth`,onclose:()=>Y.closeDialog(),children:(e,t)=>{var n=Gs(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a),D(i),Rs(I(i,2),{label:`Close authentication dialog`,onclick:()=>Y.closeDialog(),class:`auth-dialog-close`,iconClass:``}),D(r);var s=I(r,2),c=P(s),l=e=>{var t=Us(),n=F(t);J(P(n),{get icon(){return to}}),Ve(2),D(n),Ve(2),L(e=>K(n,`href`,e),[()=>es(Ho(Y.externalLoginURL))]),z(`click`,n,()=>Y.selectExternalAuthentication()),V(e,t)};U(c,e=>{Y.externalLoginURL&&e(l)});var u=I(c,2),d=P(u);J(d,{get icon(){return io},class:`auth-dialog-input-icon`});var f=I(d,2);ea(f),D(u);var p=I(u,2),m=e=>{var t=Ws(),n=P(t,!0);D(t),L(()=>H(n,Y.authErrorMessage||`Enter a valid API key to continue.`)),V(e,t)};U(p,e=>{Y.authError&&e(m)});var h=I(p,4),g=P(h),_=P(g);J(_,{get icon(){return Ba},class:`auth-dialog-submit-icon`});var v=I(_,2),y=P(v,!0);D(v),D(g),D(h),D(s),D(n),L(()=>{H(o,Y.needsAuth?`Dashboard locked`:`Change API key`),H(y,Y.needsAuth?`Unlock dashboard`:`Save API key`)}),zr(`submit`,s,e=>{e.preventDefault(),Y.submit()}),la(f,()=>Y.apiKey,e=>Y.apiKey=e),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`]);function qs(){return{open:!1,title:``,titleId:`typedConfirmationDialogTitle`,inputId:`typed-confirmation-input`,message:``,requiredText:``,value:``,confirmLabel:`Confirm`,icon:jo,dialogClass:``,loading:!1,onConfirm:null,onClose:null}}var Js=new class{#e=j(N(qs()));get state(){return R(this.#e)}set state(e){M(this.#e,e,!0)}#t=j(``);get error(){return R(this.#t)}set error(e){M(this.#t,e,!0)}open(e){this.error=``,this.state={...qs(),open:!0,...e||{}}}close(){let e=this.state;typeof e.onClose==`function`&&e.onClose(),this.state=qs(),this.error=``}ready(){return String(this.state.value||``).trim().toLowerCase()===String(this.state.requiredText||``).trim().toLowerCase()}inputLabel(){return`Type `+String(this.state.requiredText||``).trim()+` to confirm`}async submit(){if(!this.ready()){this.error=this.inputLabel()+`.`;return}if(typeof this.state.onConfirm==`function`){this.state.loading=!0;try{await this.state.onConfirm()}finally{this.state.loading=!1}}}},Ys=B(`

`),Xs=B(``),Zs=B(`

`);function Qs(e,t){O(t,!0);let n=A(()=>Js.state);Hs(e,{get open(){return R(n).open},variant:`auth`,onclose:()=>Js.close(),children:(e,t)=>{var r=Zs(),i=P(r),a=P(i),o=P(a,!0);D(a),Rs(I(a,2),{label:`Close confirmation dialog`,onclick:()=>Js.close(),class:`auth-dialog-close`,iconClass:``}),D(i);var s=I(i,2),c=P(s),l=e=>{var t=Ys(),r=P(t,!0);D(t),L(()=>H(r,R(n).message)),V(e,t)};U(c,e=>{R(n).message&&e(l)});var u=I(c,2),d=P(u),f=P(d,!0);D(d);var p=I(d,2);ea(p),D(u);var m=I(u,2),h=e=>{var t=Xs(),n=P(t,!0);D(t),L(()=>H(n,Js.error)),V(e,t)};U(m,e=>{Js.error&&e(h)});var g=I(m,2),_=P(g),v=I(_,2),y=P(v);J(y,{get icon(){return R(n).icon},class:`form-action-icon`});var b=I(y,2),x=P(b,!0);D(b),D(v),D(g),D(s),D(r),L((e,t)=>{G(r,1,`auth-dialog ${R(n).dialogClass??``}`),K(r,`aria-labelledby`,R(n).titleId),K(a,`id`,R(n).titleId),H(o,R(n).title),K(d,`for`,R(n).inputId),H(f,e),K(p,`id`,R(n).inputId),v.disabled=t,H(x,R(n).confirmLabel)},[()=>Js.inputLabel(),()=>R(n).loading||!Js.ready()]),zr(`submit`,s,e=>{e.preventDefault(),Js.submit()}),la(p,()=>Js.state.value,e=>Js.state.value=e),z(`click`,_,()=>Js.close()),V(e,r)},$$slots:{default:!0}}),k()}Br([`click`]);var $s=e=>e;function ec(e){let t=e-1;return t*t*t+1}function tc(e){let t=typeof e==`string`&&e.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return t?[parseFloat(t[1]),t[2]||`px`]:[e,`px`]}function nc(e,{delay:t=0,duration:n=400,easing:r=$s}={}){let i=+getComputedStyle(e).opacity;return{delay:t,duration:n,easing:r,css:e=>`opacity: ${e*i}`}}function rc(e,{delay:t=0,duration:n=400,easing:r=ec,x:i=0,y:a=0,opacity:o=0}={}){let s=getComputedStyle(e),c=+s.opacity,l=s.transform===`none`?``:s.transform,u=c*(1-o),[d,f]=tc(i),[p,m]=tc(a);return{delay:t,duration:n,easing:r,css:(e,t)=>` + transform: ${l} translate(${(1-e)*d}${f}, ${(1-e)*p}${m}); + opacity: ${c-u*t}`}}function ic(e,{delay:t=0,duration:n=400,easing:r=ec,axis:i=`y`}={}){let a=getComputedStyle(e),o=+a.opacity,s=i===`y`?`height`:`width`,c=parseFloat(a[s]),l=i===`y`?[`top`,`bottom`]:[`left`,`right`],u=l.map(e=>`${e[0].toUpperCase()}${e.slice(1)}`),d=parseFloat(a[`padding${u[0]}`]),f=parseFloat(a[`padding${u[1]}`]),p=parseFloat(a[`margin${u[0]}`]),m=parseFloat(a[`margin${u[1]}`]),h=parseFloat(a[`border${u[0]}Width`]),g=parseFloat(a[`border${u[1]}Width`]);return{delay:t,duration:n,easing:r,css:e=>`overflow: hidden;opacity: ${Math.min(e*20,1)*o};${s}: ${e*c}px;padding-${l[0]}: ${e*d}px;padding-${l[1]}: ${e*f}px;margin-${l[0]}: ${e*p}px;margin-${l[1]}: ${e*m}px;border-${l[0]}-width: ${e*h}px;border-${l[1]}-width: ${e*g}px;min-${s}: 0`}}function ac(e){return--e*e*(2.70158*e+1.70158)+1}function oc(e){let t=e-1;return t*t*t+1}var sc=5e3,cc=8e3,lc=new class{#e=j(N([]));get toasts(){return R(this.#e)}set toasts(e){M(this.#e,e,!0)}#t=0;#n=new Map;success(e){this.#r(`success`,e,sc)}error(e){this.#r(`error`,e,cc)}dismiss(e){let t=this.#n.get(e);t&&(clearTimeout(t),this.#n.delete(e)),this.toasts=this.toasts.filter(t=>t.id!==e)}#r(e,t,n){let r=String(t||``).trim();if(!r)return;let i=this.toasts.find(t=>t.kind===e&&t.text===r);i&&this.dismiss(i.id);let a=++this.#t;this.toasts=[...this.toasts,{id:a,kind:e,text:r}],this.#n.set(a,setTimeout(()=>this.dismiss(a),n))}},uc=B(`
`),dc=B(`
`);function fc(e,t){O(t,!0);var n=dc();W(n,21,()=>lc.toasts,e=>e.id,(e,t)=>{var n=uc();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i,2);D(n),L(()=>{r=G(n,1,`flash-toast svelte-1i257xg`,null,r,{"flash-toast-success":R(t).kind===`success`,"flash-toast-error":R(t).kind===`error`}),K(n,`role`,R(t).kind===`error`?`alert`:`status`),K(n,`aria-live`,R(t).kind===`error`?`assertive`:`polite`),H(a,R(t).text)}),z(`click`,o,()=>lc.dismiss(R(t).id)),Di(1,n,()=>rc,()=>({y:-24,duration:360,easing:ac})),Di(2,n,()=>nc,()=>({duration:150})),V(e,n)}),D(n),V(e,n),k()}Br([`click`]);var pc=B(``);function mc(e,t){O(t,!0);var n=Xr(),r=F(n),i=e=>{V(e,pc())},a=A(()=>Go());U(r,e=>{R(a)&&e(i)}),V(e,n),k()}function hc(e){return String(e||``).split(`,`).map(e=>e.trim()).filter(e=>e)}function gc(e){if(e==null||e===``)return`Not captured`;if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))try{return JSON.stringify(JSON.parse(t),null,2)}catch{return e}return e}try{return JSON.stringify(e,null,2)}catch{return String(e)}}function _c(e){return e==null||e===void 0?`-`:e.toLocaleString()}function vc(e){if(e==null)return`---`;let t=Number(e);return Number.isFinite(t)?t>0&&t<1e-4?`<$0.0001`:`$`+t.toFixed(4).replace(/(\.\d{2}\d*?)0+$/,`$1`):`---`}function yc(e){return e==null||e===void 0?`—`:`$`+e.toFixed(2)}function bc(e){return e==null||e===void 0?`—`:e<.01?`$`+e.toFixed(6):`$`+e.toFixed(4)}function xc(e){if(e==null||e===``)return`-`;let t=Number(e);if(!Number.isFinite(t))return`-`;let n=Math.abs(t),r=[{threshold:1e9,suffix:`B`},{threshold:1e6,suffix:`M`},{threshold:1e3,suffix:`K`}];for(let e=0;e=i.threshold){let n=t/i.threshold;return Math.abs(Number(n.toFixed(1)))>=1e3&&e>0&&(i=r[e-1],n=t/i.threshold),n.toFixed(1).replace(/\.0$/,``)+i.suffix}}return String(t)}function Sc(e,t){let n=t==null||t===``?NaN:Number(t),r=Number.isFinite(n)?_c(n):`-`;return String(e||`Tokens`)+`: `+r}function Cc(e){return e?typeof e==`string`?e:e.getUTCFullYear()+`-`+String(e.getUTCMonth()+1).padStart(2,`0`)+`-`+String(e.getUTCDate()).padStart(2,`0`):``}function wc(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:t.getUTCFullYear()+`-`+String(t.getUTCMonth()+1).padStart(2,`0`)+`-`+String(t.getUTCDate()).padStart(2,`0`)}function Tc(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:t.getUTCFullYear()+`-`+String(t.getUTCMonth()+1).padStart(2,`0`)+`-`+String(t.getUTCDate()).padStart(2,`0`)+` `+String(t.getUTCHours()).padStart(2,`0`)+`:`+String(t.getUTCMinutes()).padStart(2,`0`)+`:`+String(t.getUTCSeconds()).padStart(2,`0`)+` UTC`}function Ec(e){return String(e&&e.provider||``).trim()}function Dc(e){return String(e&&e.provider_name||``).trim()||Ec(e)}function Oc(e,t){let n=String(t||``).trim();if(!n)return`-`;let r=Dc(e);return!r||n===r||n.startsWith(r+`/`)?n:r+`/`+n}function kc(e){return Oc(e,e&&e.model)}function Ac(e){return Oc(e,e&&e.resolved_model)}function jc(e){let t=String(e&&(e.requested_model||e.model)||``).trim();if(!e)return t;let n=String(e.data&&e.data.failover&&e.data.failover.target_model||``).trim();if(n&&n!==t)return t+` ⮕ `+n;if(e.alias_used&&e.resolved_model){let n=Ac(e);if(n&&n!==`-`&&n!==t)return t+` ⮕ `+n}return t}var Mc=`gomodel_date_range`,Nc=1;function Pc(e){return/^[1-9]\d*$/.test(String(e??``))}var Fc=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function Ic({selectedPreset:e,startKey:t,endKey:n,followsToday:r}){return e&&Pc(e)?{v:Nc,mode:`preset`,days:String(e)}:e?null:cs(t)&&cs(n)?{v:Nc,mode:`custom`,start:t,end:n,follow:r===!0}:null}function Lc(e){let t=e;if(typeof e==`string`)try{t=JSON.parse(e)}catch{return null}return!t||typeof t!=`object`?null:t.mode===`preset`?Pc(t.days)?{mode:`preset`,days:String(t.days)}:null:t.mode===`custom`&&cs(t.start)&&cs(t.end)&&t.start<=t.end?{mode:`custom`,start:t.start,end:t.end,follow:t.follow===!0}:null}function Rc(e,t,n){let r=ls(e,t);return r<1||!cs(n)?{start:e,end:t}:{start:ss(n,-(r-1)),end:n}}function zc(e,t){if(e===t)return`Today`;let[n,r,i]=e.split(`-`);return Fc[Number(r)-1]+` `+Number(i)+`, `+n}function Bc({selectedPreset:e,startKey:t,endKey:n,followsToday:r,todayKey:i}){if(e)return`Last `+e+` days`;if(!cs(t)||!cs(n))return``;let a=ls(t,n);return r||n===i?a===1?`Today`:`Last `+a+` days`:a===1?`1 day`:a+` days`}function Vc({selectedPreset:e,startKey:t,endKey:n,todayKey:r}){if(e)return`Last `+e+` days`;let i=e=>zc(e,r);return cs(t)&&cs(n)?t===n?i(t):i(t)+` – `+i(n):cs(t)?i(t)+` – ...`:`Last 30 days`}var Hc=6e4,Uc=new class{#e=j(N(`30`));get days(){return R(this.#e)}set days(e){M(this.#e,e,!0)}#t=j(N(`30`));get selectedPreset(){return R(this.#t)}set selectedPreset(e){M(this.#t,e,!0)}#n=j(null);get customStartDate(){return R(this.#n)}set customStartDate(e){M(this.#n,e,!0)}#r=j(null);get customEndDate(){return R(this.#r)}set customEndDate(e){M(this.#r,e,!0)}#i=j(!1);get followsToday(){return R(this.#i)}set followsToday(e){M(this.#i,e,!0)}#a=j(`daily`);get interval(){return R(this.#a)}set interval(e){M(this.#a,e,!0)}#o=j(0);get syncTick(){return R(this.#o)}set syncTick(e){M(this.#o,e,!0)}init(){this.restore(),this.syncToToday(),typeof setInterval==`function`&&setInterval(()=>this.syncToToday(),Hc)}queryStr(){return this.customStartDate&&this.customEndDate?`start_date=`+Cc(this.customStartDate)+`&end_date=`+Cc(this.customEndDate):`days=`+this.days}selectPreset(e){this.selectedPreset=e,this.customStartDate=null,this.customEndDate=null,this.followsToday=!1,this.days=e,this.persist()}selectStart(e){this.selectedPreset=null,this.customStartDate=e,this.customEndDate&&this.customEndDatet.category===e);return t?t.count:0}get filteredModels(){if(!this.filter)return this.models;let e=this.filter.toLowerCase();return this.models.filter(t=>(t.model?.id??``).toLowerCase().includes(e)||(t.provider_name??``).toLowerCase().includes(e)||(t.provider_type??``).toLowerCase().includes(e)||(t.selector??``).toLowerCase().includes(e)||(t.model?.owned_by??``).toLowerCase().includes(e)||(t.model?.metadata?.modes??[]).join(`,`).toLowerCase().includes(e)||(t.model?.metadata?.categories??[]).join(`,`).toLowerCase().includes(e))}},Gc=B(``);function Kc(e,t){O(t,!0);var n=Xr(),r=F(n),i=e=>{var t=Gc(),n=I(P(t),2);D(t),z(`click`,n,()=>Y.openDialog()),V(e,t)};U(r,e=>{Y.authError&&e(i)}),V(e,n),k()}Br([`click`]);function qc(){return{total_requests:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,total_input_cost:null,total_output_cost:null,total_cost:null}}function Jc(){return{summary:{total_hits:0,exact_hits:0,semantic_hits:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,total_saved_cost:null},daily:[]}}var Yc=new class{#e=j(N(qc()));get summary(){return R(this.#e)}set summary(e){M(this.#e,e,!0)}#t=j(N([]));get daily(){return R(this.#t)}set daily(e){M(this.#t,e,!0)}#n=j(N(Jc()));get cacheOverview(){return R(this.#n)}set cacheOverview(e){M(this.#n,e,!0)}#r=j(!1);get loading(){return R(this.#r)}set loading(e){M(this.#r,e,!0)}#i=null;#a=null;cacheAnalyticsEnabled(){return ks.cacheVisible()}async fetchUsage(){this.#i&&this.#i.abort();let e=new AbortController;this.#i=e,this.loading=!0;try{let t=Uc.queryStr()+`&interval=`+Uc.interval,[n,r]=await Promise.all([ws(`/admin/usage/summary?`+t,{label:`usage summary`,signal:e.signal}),ws(`/admin/usage/daily?`+t,{label:`usage daily`,signal:e.signal})]);if(n.stale||r.stale||e.signal.aborted)return;if(!n.ok||!r.ok){this.summary=qc(),this.daily=[],this.cacheOverview=Jc();return}this.summary=n.data||qc(),this.daily=Array.isArray(r.data)?r.data:[]}catch(e){if(Es(e))return;console.error(`Failed to fetch usage:`,e),this.summary=qc(),this.daily=[]}finally{this.#i===e&&(this.#i=null,this.loading=!1)}}async fetchCacheOverview(e=``){if(await ks.ensureLoaded(),!this.cacheAnalyticsEnabled()){this.cacheOverview=Jc();return}this.#a&&this.#a.abort();let t=new AbortController;this.#a=t;try{let n=await ws(`/admin/cache/overview?`+(Uc.queryStr()+`&interval=`+Uc.interval+e),{label:`cache overview`,signal:t.signal});if(n.stale||t.signal.aborted)return;if(!n.ok){this.cacheOverview=Jc();return}let r=n.data&&typeof n.data==`object`?n.data:Jc();r.summary||=Jc().summary,Array.isArray(r.daily)||(r.daily=[]),this.cacheOverview=r}catch(e){if(Es(e))return;console.error(`Failed to fetch cache overview:`,e),this.cacheOverview=Jc()}finally{this.#a===t&&(this.#a=null)}}},Xc=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`];function Zc(e,t){let n=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+t,1));return Xc[n.getUTCMonth()]+` `+n.getUTCFullYear()}function Qc(e,t,n){let r=e.getUTCFullYear(),i=e.getUTCMonth()+t,a=new Date(Date.UTC(r,i,1)),o=new Date(Date.UTC(r,i+1,0)),s=(a.getUTCDay()+6)%7,c=[],l=new Date(Date.UTC(r,i,0));for(let e=s-1;e>=0;e--){let t=l.getUTCDate()-e,a=new Date(Date.UTC(r,i-1,t));c.push({day:t,date:a,current:!1,key:`p-`+n(a)})}for(let e=1;e<=o.getUTCDate();e++){let t=new Date(Date.UTC(r,i,e));c.push({day:e,date:t,current:!0,key:`c-`+n(t)})}let u=42-c.length;for(let e=1;e<=u;e++){let t=new Date(Date.UTC(r,i+1,e));c.push({day:e,date:t,current:!1,key:`n-`+n(t)})}return c}function $c(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+t,1));return n&&r.getTime()>n.getTime()?e:r}function el(e,t){return e.getUTCFullYear()===t.getUTCFullYear()&&e.getUTCMonth()===t.getUTCMonth()}var tl=B(``),nl=B(``),rl=B(``),il=B(`
MoTuWeThFrSaSu
`);function al(e,t){O(t,!0);let n=q(t,`offset`,3,0),r=A(()=>Qc(t.calendarMonth,n(),e=>vs.dateToDateKey(e))),i=A(()=>el(t.calendarMonth,vs.todayDate())),a=e=>vs.dateToDateKey(e.date),o=e=>a(e)>vs.currentDateKey(),s=e=>e.current&&a(e)===vs.currentDateKey();function c(e,t){let n=t===`start`?Uc.rangeStart():Uc.rangeEnd();return e.current&&!!n&&a(e)===vs.dateToDateKey(n)}function l(e){let t=Uc.rangeStart(),n=Uc.rangeEnd();return!e.current||!t||!n?!1:a(e)>=vs.dateToDateKey(t)&&a(e)<=vs.dateToDateKey(n)}var u=il(),d=P(u),f=P(d);let p;var m=I(f,2),h=P(m,!0);D(m);var g=I(m,2),_=e=>{V(e,tl())},v=e=>{var n=nl();L(()=>n.disabled=R(i)),z(`click`,n,function(...e){t.onnext?.apply(this,e)}),V(e,n)};U(g,e=>{n()===-1?e(_):e(v,-1)}),D(d);var y=I(d,4);W(y,21,()=>R(r),e=>e.key,(e,n)=>{var r=rl(),i=P(r,!0);D(r),L((e,t)=>{G(r,1,e,`svelte-g7ga4u`),r.disabled=t,H(i,R(n).day)},[()=>Ni([`dp-day`,{"other-month":!R(n).current,today:s(R(n)),"range-start":c(R(n),`start`),"range-end":c(R(n),`end`),"in-range":l(R(n)),disabled:o(R(n))}]),()=>o(R(n))||!R(n).current]),z(`click`,r,()=>t.onselect?.(R(n))),V(e,r)}),D(y),D(u),L(e=>{p=G(f,1,`dp-nav-btn svelte-g7ga4u`,null,p,{"dp-nav-prev-mobile":n()!==-1}),H(h,e)},[()=>Zc(t.calendarMonth,n())]),z(`click`,f,function(...e){t.onprev?.apply(this,e)}),V(e,u),k()}Br([`click`]);var ol=B(``),sl=B(`
`),cl=Jr(``),ll=Jr(``),ul=B(`
`),dl=B(`
`);function fl(e,t){O(t,!0);let n=[`3`,`7`,`14`,`30`,`90`],r=j(!1),i=j(`start`),a=j(N(new Date)),o=j(N({show:!1,x:0,y:0}));function s(){M(r,!R(r)),R(r)&&(Uc.syncToToday(),M(a,vs.startOfMonthDate(Uc.customEndDate||vs.todayDate()),!0),M(i,`start`))}function c(){M(r,!1),M(o,{show:!1,x:0,y:0},!0)}let l=Uc.syncTick;On(()=>{let e=Uc.syncTick;e!==l&&(l=e,t.onchange?.())});function u(e){Uc.selectPreset(e),M(i,`start`),t.onchange?.(),c()}let d=()=>M(a,$c(R(a),-1),!0),f=()=>M(a,$c(R(a),1,vs.startOfMonthDate(vs.todayDate())),!0);function p(e){let n=new Date(e.date);if(R(i)===`start`){Uc.selectStart(n),M(i,`end`),t.onchange?.();return}Uc.selectEnd(n),M(i,`start`),t.onchange?.(),c()}var m=dl(),h=P(m),g=I(P(h),2),_=P(g,!0);D(g);var v=I(g,2);let y;D(h);var b=I(h,2),x=e=>{var t=sl(),r=P(t);W(r,20,()=>n,e=>e,(e,t)=>{var n=ol();let r;var i=P(n);D(n),L(()=>{r=G(n,1,`preset-btn svelte-ax7ma4`,null,r,{active:Uc.selectedPreset===t}),H(i,`Last ${t??``} days`)}),z(`click`,n,()=>u(t)),V(e,n)}),D(r);var i=I(r,2);W(i,20,()=>[-1,0],e=>e,(e,t)=>{al(e,{get calendarMonth(){return R(a)},get offset(){return t},onprev:d,onnext:f,onselect:p})}),D(i),D(t),z(`mousemove`,i,e=>M(o,{show:!0,x:e.clientX,y:e.clientY},!0)),zr(`mouseleave`,i,()=>M(o,{show:!1,x:0,y:0},!0)),V(e,t)};U(b,e=>{R(r)&&e(x)});var S=I(b,2),C=e=>{var t=ul(),n=P(t),r=e=>{V(e,cl())},a=e=>{V(e,ll())};U(n,e=>{R(i)===`start`?e(r):e(a,-1)});var s=I(n,2),c=P(s,!0);D(s),D(t),L(()=>{Bi(t,`left:${R(o).x??``}px;top:${R(o).y??``}px`),H(c,R(i)===`end`?`Select end date`:`Select start date`)}),V(e,t)};U(S,e=>{R(o).show&&e(C)}),D(m),Ai(m,()=>R(r)?zs(c):void 0),L((e,t)=>{K(h,`title`,e),H(_,t),y=G(v,0,`date-picker-chevron svelte-ax7ma4`,null,y,{open:R(r)})},[()=>Uc.dateRangeSpanLabel(),()=>Uc.dateRangeLabel()]),z(`click`,h,s),V(e,m),k()}Br([`click`,`mousemove`]);function pl(e){return e+.5|0}var ml=(e,t,n)=>Math.max(Math.min(e,n),t);function hl(e){return ml(pl(e*2.55),0,255)}function gl(e){return ml(pl(e*255),0,255)}function _l(e){return ml(pl(e/2.55)/100,0,1)}function vl(e){return ml(pl(e*100),0,100)}var yl={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},bl=[...`0123456789ABCDEF`],xl=e=>bl[e&15],Sl=e=>bl[(e&240)>>4]+bl[e&15],Cl=e=>(e&240)>>4==(e&15),wl=e=>Cl(e.r)&&Cl(e.g)&&Cl(e.b)&&Cl(e.a);function Tl(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&yl[e[1]]*17,g:255&yl[e[2]]*17,b:255&yl[e[3]]*17,a:t===5?yl[e[4]]*17:255}:(t===7||t===9)&&(n={r:yl[e[1]]<<4|yl[e[2]],g:yl[e[3]]<<4|yl[e[4]],b:yl[e[5]]<<4|yl[e[6]],a:t===9?yl[e[7]]<<4|yl[e[8]]:255})),n}var El=(e,t)=>e<255?t(e):``;function Dl(e){var t=wl(e)?xl:Sl;return e?`#`+t(e.r)+t(e.g)+t(e.b)+El(e.a,t):void 0}var Ol=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function kl(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Al(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function jl(e,t,n){let r=kl(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function Ml(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=Ml(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function Pl(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(gl)}function Fl(e,t,n){return Pl(kl,e,t,n)}function Il(e,t,n){return Pl(jl,e,t,n)}function Ll(e,t,n){return Pl(Al,e,t,n)}function Rl(e){return(e%360+360)%360}function zl(e){let t=Ol.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?hl(+t[5]):gl(+t[5]));let i=Rl(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?Il(i,a,o):t[1]===`hsv`?Ll(i,a,o):Fl(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function Bl(e,t){var n=Nl(e);n[0]=Rl(n[0]+t),n=Fl(n),e.r=n[0],e.g=n[1],e.b=n[2]}function Vl(e){if(!e)return;let t=Nl(e),n=t[0],r=vl(t[1]),i=vl(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${_l(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var Hl={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},Ul={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function Wl(){let e={},t=Object.keys(Ul),n=Object.keys(Hl),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var Gl;function Kl(e){Gl||(Gl=Wl(),Gl.transparent=[0,0,0,0]);let t=Gl[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ql=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Jl(e){let t=ql.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?hl(e):ml(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?hl(r):ml(r,0,255)),i=255&(t[4]?hl(i):ml(i,0,255)),a=255&(t[6]?hl(a):ml(a,0,255)),{r,g:i,b:a,a:n}}}function Yl(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${_l(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var Xl=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,Zl=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function Ql(e,t,n){let r=Zl(_l(e.r)),i=Zl(_l(e.g)),a=Zl(_l(e.b));return{r:gl(Xl(r+n*(Zl(_l(t.r))-r))),g:gl(Xl(i+n*(Zl(_l(t.g))-i))),b:gl(Xl(a+n*(Zl(_l(t.b))-a))),a:e.a+n*(t.a-e.a)}}function $l(e,t,n){if(e){let r=Nl(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=Fl(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function eu(e,t){return e&&Object.assign(t||{},e)}function tu(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=gl(e[3]))):(t=eu(e,{r:0,g:0,b:0,a:1}),t.a=gl(t.a)),t}function nu(e){return e.charAt(0)===`r`?Jl(e):zl(e)}var ru=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=tu(t):n===`string`&&(r=Tl(t)||Kl(t)||nu(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=eu(this._rgb);return e&&(e.a=_l(e.a)),e}set rgb(e){this._rgb=tu(e)}rgbString(){return this._valid?Yl(this._rgb):void 0}hexString(){return this._valid?Dl(this._rgb):void 0}hslString(){return this._valid?Vl(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=Ql(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=gl(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=pl(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return $l(this._rgb,2,e),this}darken(e){return $l(this._rgb,2,-e),this}saturate(e){return $l(this._rgb,1,e),this}desaturate(e){return $l(this._rgb,1,-e),this}rotate(e){return Bl(this._rgb,e),this}};function iu(){}var au=(()=>{let e=0;return()=>e++})();function ou(e){return e==null}function su(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function cu(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function lu(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function uu(e,t){return lu(e)?e:t}function du(e,t){return e===void 0?t:e}var fu=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,pu=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function mu(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function hu(e,t,n,r){let i,a,o;if(su(e))if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function wu(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function Tu(e){let t=wu(e);return e=>{for(let n of t){if(n===``)break;e&&=e[n]}return e}}function Eu(e,t){return(Cu[t]||(Cu[t]=Tu(t)))(e)}function Du(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ou=e=>e!==void 0,ku=e=>typeof e==`function`,Au=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function ju(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var Mu=Math.PI,Nu=2*Mu,Pu=Nu+Mu,Fu=1/0,Iu=Mu/180,Lu=Mu/2,Ru=Mu/4,zu=Mu*2/3,Bu=Math.log10,Vu=Math.sign;function Hu(e,t,n){return Math.abs(e-t)e-t).pop(),t}function Gu(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function Ku(e){return!Gu(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function qu(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function Ju(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function od(e,t,n){n||=(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var sd=(e,t,n,r)=>od(e,n,r?r=>{let i=e[r][t];return ie[r][t]od(e,n,r=>e[r][t]>=n);function ld(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+Du(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})})}function fd(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(ud.forEach(t=>{delete e[t]}),delete e._chartjs)}function pd(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var md=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function hd(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,md.call(window,()=>{r=!1,e.apply(t,n)}))}}function gd(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var _d=e=>e===`start`?`left`:e===`end`?`right`:`center`,vd=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2,yd=(e,t,n,r)=>e===(r?`left`:`right`)?n:e===`center`?(t+n)/2:t;function bd(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(sd(c,u,d).lo,n?r:sd(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!ou(e[s.axis]));i-=Math.max(0,e)}i=rd(i,0,r-1)}if(m){let e=Math.max(sd(c,o.axis,f,!0).hi+1,n?0:sd(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!ou(e[s.axis]));e+=Math.max(0,t)}a=rd(e,i,r)-i}else a=r-i}return{start:i,count:a}}function xd(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var Sd=e=>e===0||e===1,Cd=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*Nu/n)),wd=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*Nu/n)+1,Td={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Lu)+1,easeOutSine:e=>Math.sin(e*Lu),easeInOutSine:e=>-.5*(Math.cos(Mu*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>Sd(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Sd(e)?e:Cd(e,.075,.3),easeOutElastic:e=>Sd(e)?e:wd(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return Sd(e)?e:e<.5?.5*Cd(e*2,t,n):.5+.5*wd(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Td.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Td.easeInBounce(e*2)*.5:Td.easeOutBounce(e*2-1)*.5+.5};function Ed(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Dd(e){return Ed(e)?e:new ru(e)}function Od(e){return Ed(e)?e:new ru(e).saturate(.5).darken(.1).hexString()}var kd=[`x`,`y`,`borderWidth`,`radius`,`tension`],Ad=[`color`,`borderColor`,`backgroundColor`];function jd(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Ad},numbers:{type:`number`,properties:kd}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Md(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Nd=new Map;function Pd(e,t){t||={};let n=e+JSON.stringify(t),r=Nd.get(n);return r||(r=new Intl.NumberFormat(e,t),Nd.set(n,r)),r}function Fd(e,t,n){return Pd(t,n).format(e)}var Id={values(e){return su(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Ld(e,n)}let o=Bu(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Fd(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(Bu(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Id.numeric.call(this,e,t,n):``}};function Ld(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Rd={formatters:Id};function zd(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Rd.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var Bd=Object.create(null),Vd=Object.create(null);function Hd(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Od(t.backgroundColor),this.hoverBorderColor=(e,t)=>Od(t.borderColor),this.hoverColor=(e,t)=>Od(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Ud(this,e,t)}get(e){return Hd(this,e)}describe(e,t){return Ud(Vd,e,t)}override(e,t){return Ud(Bd,e,t)}route(e,t,n,r){let i=Hd(this,e),a=Hd(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return cu(e)?Object.assign({},t,e):du(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[jd,Md,zd]);function Gd(e){return!e||ou(e.size)||ou(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function Kd(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function qd(e,t,n,r){r||={};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function Qd(e,t,n){return n||=.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,rf(e,a),c=0;c+e||0;function pf(e,t){let n={},r=cu(t),i=r?Object.keys(t):t,a=cu(e)?r?n=>du(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=ff(a(e));return n}function mf(e){return pf(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function hf(e){return pf(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function gf(e){let t=mf(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function _f(e,t){e||={},t||=Wd.font;let n=du(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=du(e.style,t.style);r&&!(``+r).match(uf)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:du(e.family,t.family),lineHeight:df(du(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:du(e.weight,t.weight),string:``};return i.string=Gd(i),i}function vf(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function bf(e,t){return Object.assign(Object.create(e),t)}function xf(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Lf(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>xf([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return Ef(n,r,()=>If(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Rf(e).includes(t)},ownKeys(e){return Rf(e)},set(e,t,n){let r=e._storage||=i();return e[t]=r[t]=n,delete e._keys,!0}})}function Sf(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:Cf(e,r),setContext:t=>Sf(e,t,n,r),override:i=>Sf(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return Ef(e,t,()=>Df(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function Cf(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:ku(n)?n:()=>n,isIndexable:ku(r)?r:()=>r}}var wf=(e,t)=>e?e+Du(t):t,Tf=(e,t)=>cu(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Ef(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Df(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return ku(s)&&o.isScriptable(t)&&(s=Of(t,s,e,n)),su(s)&&s.length&&(s=kf(t,s,e,o.isIndexable)),Tf(t,s)&&(s=Sf(s,i,a&&a[t],o)),s}function Of(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),Tf(e,c)&&(c=Nf(i._scopes,i,e,c)),c}function kf(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(cu(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Nf(r,i,e,c);t.push(Sf(n,a,o&&o[e],s))}}return t}function Af(e,t,n){return ku(e)?e(t,n):e}var jf=(e,t)=>e===!0?t:typeof e==`string`?Eu(t,e):void 0;function Mf(e,t,n,r,i){for(let a of t){let t=jf(n,a);if(t){e.add(t);let a=Af(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Nf(e,t,n,r){let i=t._rootScopes,a=Af(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=Pf(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=Pf(s,o,a,c,r),c===null)?!1:xf(Array.from(s),[``],i,a,()=>Ff(t,n,r))}function Pf(e,t,n,r,i){for(;n;)n=Mf(e,t,n,r,i);return n}function Ff(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return su(i)&&cu(n)?n:i||{}}function If(e,t,n,r){let i;for(let a of t)if(i=Lf(wf(a,e),n),i!==void 0)return Tf(e,i)?Nf(n,r,e,i):i}function Lf(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Rf(e){let t=e._keys;return t||=e._keys=zf(e._scopes),t}function zf(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function Bf(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function Wf(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=$u(a,i),c=$u(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Gf(e,t,n){let r=e.length,i,a,o,s,c,l=Hf(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)qf(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function tp(e,t){return ep(e).getPropertyValue(t)}var np=[`top`,`right`,`bottom`,`left`];function rp(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=np[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var ip=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function ap(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(ip(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function op(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=ep(n),a=i.boxSizing===`border-box`,o=rp(i,`padding`),s=rp(i,`border`,`width`),{x:c,y:l,box:u}=ap(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function sp(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&Qf(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=ep(a),s=rp(o,`border`,`width`),c=rp(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=$f(o.maxWidth,a,`clientWidth`),i=$f(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Fu,maxHeight:i||Fu}}var cp=e=>Math.round(e*10)/10;function lp(e,t,n,r){let i=ep(e),a=rp(i,`margin`),o=$f(i.maxWidth,e,`clientWidth`)||Fu,s=$f(i.maxHeight,e,`clientHeight`)||Fu,c=sp(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=rp(i,`border`,`width`),t=rp(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=cp(Math.min(l,o,c.maxWidth)),u=cp(Math.min(u,s,c.maxHeight)),l&&!u&&(u=cp(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=cp(Math.floor(u*r))),{width:l,height:u}}function up(e,t,n){let r=t||1,i=cp(e.height*r),a=cp(e.width*r);e.height=cp(e.height),e.width=cp(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var dp=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};Zf()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function fp(e,t){let n=tp(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function pp(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function mp(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function hp(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=pp(e,i,n),s=pp(i,a,n),c=pp(a,t,n);return pp(pp(o,s,n),pp(s,c,n),n)}var gp=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},_p=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function vp(e,t,n){return e?gp(t,n):_p()}function yp(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function bp(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function xp(e){return e===`angle`?{between:nd,compare:ed,normalize:td}:{between:ad,compare:(e,t)=>e-t,normalize:e=>e}}function Sp({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Cp(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=xp(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Sp({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Sp({start:g,end:d,loop:f,count:o,style:p})),m}function Tp(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function Dp(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Op(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Ep(n,i,a,r);return r===!0?kp(e,[{start:o,end:s,loop:a}],n,t):kp(e,Dp(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||=(this._running=!0,md.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){!t||!t.length||this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Lp=`transparent`,Rp={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Dd(e||Lp),i=r.valid&&Dd(t||Lp);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},zp=class{constructor(e,t,n,r){let i=t[n];r=vf([e.to,r,i,e.from]);let a=vf([e.from,i,r]);this._active=!0,this._fn=e.fn||Rp[e.type||typeof a],this._easing=Td[e.easing]||Td.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=vf([e.to,t,r,e.from]),this._from=vf([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;if(this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)}wait(){let e=this._promises||=[];return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!cu(i))return;let a={};for(let e of t)a[e]=i[e];(su(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Hp(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Vp(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||={},a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u)if(d&&u.active()){u.update(d,l,o);continue}else u.cancel();if(!d||!d.duration){e[c]=l;continue}i[c]=u=new zp(d,e,c,l),r.push(u)}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Ip.add(this._chart,n),!0}};function Vp(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function em(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||={},{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=Xp(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function nm(e,t){return bf(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function rm(e,t,n){return bf(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function im(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t||=e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var am=e=>e===`reset`||e===`none`,om=(e,t)=>t?e:Object.assign({},e),sm=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Kp(n,!0),values:null},cm=class{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Yp(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&im(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=du(n.xAxisID,tm(e,`x`)),a=t.yAxisID=du(n.yAxisID,tm(e,`y`)),o=t.rAxisID=du(n.rAxisID,tm(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&fd(this._data,this),e._stacked&&im(e)}_dataCheck(){let e=this.getDataset(),t=e.data||=[],n=this._data;if(cu(t)){let e=this._cachedMeta;this._data=Jp(t,e)}else if(n!==t){if(n){fd(n,this);let e=this._cachedMeta;im(e),e._parsed=[]}t&&Object.isExtensible(t)&&dd(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=Yp(t.vScale,t),t.stack!==n.stack&&(r=!0,im(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(em(this,t._parsed),t._stacked=Yp(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=su(r[e])?this.parseArrayData(n,r,e,t):cu(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(om(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Bp(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||=Object.assign({},e)}includeOptions(e,t){return!t||am(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){am(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!am(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function um(e){let t=e.iScale,n=lm(t,e.type),r=t._length,i,a,o,s,c=()=>{o===32767||o===-32768||(Ou(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function mm(e,t,n,r){return su(e)?pm(e,t,n,r):t[n.axis]=n.parse(e,r),t}function hm(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):Vu(e)}function vm(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(ou(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[du(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;dnd(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>nd(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(Lu,u,f),_=m(Mu,l,d),v=m(Mu+Lu,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Dm=class extends cm{static id=`doughnut`;static defaults={datasetElementType:!1,dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:`number`,properties:[`circumference`,`endAngle`,`innerRadius`,`outerRadius`,`startAngle`,`x`,`y`,`offset`,`borderWidth`,`spacing`]}},cutout:`50%`,rotation:0,circumference:360,radius:`100%`,spacing:0,indexAxis:`r`};static descriptors={_scriptable:e=>e!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(cu(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Eu(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*Nu:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Fd(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;r0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=ou(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},km=class extends cm{static id=`polarArea`;static defaults={dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Fd(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return Bf.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*Mu,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?Yu(this.resolveDataElementOptions(e,t).angle||n):0}},Am=Object.freeze({__proto__:null,BarController:wm,BubbleController:Tm,DoughnutController:Dm,LineController:Om,PieController:class extends Dm{static id=`pie`;static defaults={cutout:0,rotation:0,circumference:360,radius:`100%`}},PolarAreaController:km,RadarController:class extends cm{static id=`radar`;static defaults={datasetElementType:`line`,dataElementType:`point`,indexAxis:`r`,showLine:!0,elements:{line:{fill:`start`}}};static overrides={aspectRatio:1,scales:{r:{type:`radialLinear`}}};getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return Bf.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}}});function jm(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Mm={_date:class e{static override(t){Object.assign(e.prototype,t)}options;constructor(e){this.options=e||{}}init(){}formats(){return jm()}parse(){return jm()}format(){return jm()}add(){return jm()}diff(){return jm()}startOf(){return jm()}endOf(){return jm()}}};function Nm(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?cd:sd;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!ou(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!ou(e[t.axis]));r.hi+=Math.max(0,o)}return r}else if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Pm(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s||=e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Vm={evaluateInteractionItems:Pm,modes:{index(e,t,n,r){let i=op(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Im(e,i,a,r,o):zm(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=op(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Im(e,i,a,r,o):zm(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Wm(e,t){return e.filter(e=>Hm.indexOf(e.pos)===-1&&e.box.axis===t)}function Gm(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Km(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=Gm(Um(t,`left`),!0),i=Gm(Um(t,`right`)),a=Gm(Um(t,`top`),!0),o=Gm(Um(t,`bottom`)),s=Wm(t,`x`),c=Wm(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Um(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function Xm(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function Zm(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Qm(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!cu(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&Zm(o,a.getPadding());let s=Math.max(0,t.outerWidth-Xm(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-Xm(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function $m(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function eh(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function th(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);Zm(f,gf(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=Jm(c.concat(l),d);th(s.fullSize,p,d,m),th(c,p,d,m),th(l,p,d,m)&&th(c,p,d,m),$m(p),rh(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,rh(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},hu(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},ah=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n||=e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},oh=class extends ah{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},sh=`$chartjs`,ch={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},lh=e=>e===null||e===``;function uh(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[sh]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,lh(i)){let t=fp(e,`width`);t!==void 0&&(e.width=t)}if(lh(r))if(e.style.height===``)e.height=e.width/(t||2);else{let t=fp(e,`height`);t!==void 0&&(e.height=t)}return e}var dh=dp?{passive:!0}:!1;function fh(e,t,n){e&&e.addEventListener(t,n,dh)}function ph(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,dh)}function mh(e,t){let n=ch[e.type]||e.type,{x:r,y:i}=op(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function hh(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function gh(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=hh(n.addedNodes,r),t&&=!hh(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function _h(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=hh(n.removedNodes,r),t&&=!hh(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var vh=new Map,yh=0;function bh(){let e=window.devicePixelRatio;e!==yh&&(yh=e,vh.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function xh(e,t){vh.size||window.addEventListener(`resize`,bh),vh.set(e,t)}function Sh(e){vh.delete(e),vh.size||window.removeEventListener(`resize`,bh)}function Ch(e,t,n){let r=e.canvas,i=r&&Qf(r);if(!i)return;let a=hd((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;n===0&&r===0||a(n,r)});return o.observe(i),xh(e,a),o}function wh(e,t,n){n&&n.disconnect(),t===`resize`&&Sh(e)}function Th(e,t,n){let r=e.canvas,i=hd(t=>{e.ctx!==null&&n(mh(t,e))},e);return fh(r,t,i),i}var Eh=class extends ah{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(uh(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[sh])return!1;let n=t[sh].initial;[`height`,`width`].forEach(e=>{let r=n[e];ou(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[sh],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||={};r[t]=({attach:gh,detach:_h,resize:Ch}[t]||Th)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||={},r=n[t];r&&(({attach:wh,detach:wh,resize:wh}[t]||ph)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return lp(e,t,n,r)}isAttached(e){let t=e&&Qf(e);return!!(t&&t.isConnected)}};function Dh(e){return!Zf()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?oh:Eh}var Oh=class{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return Ku(this.x)&&Ku(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};function kh(e,t){let n=e.options.ticks,r=Ah(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Mh(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Nh(t,l,a,o/i),l;let u=jh(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Ph(t,l,u,ou(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Mh(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,Lh=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,Rh=(e,t)=>Math.min(t||e,e);function zh(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Vh(e,t){hu(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:uu(t,uu(n,t)),max:uu(n,uu(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||=this._computeLabelItems(e)}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){mu(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||=(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=yf(this,i,r),!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=rd(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-Hh(e.grid)-t.padding-Uh(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=Xu(Math.min(Math.asin(rd((l.highest.height+6)/o,-1,1)),Math.asin(rd(s/c,-1,1))-Math.asin(rd(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){mu(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){mu(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Uh(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=Hh(i)+a):(e.height=this.maxHeight,e.width=Hh(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=Yu(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){mu(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return id(this._alignToPixels?Jd(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=Hh(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return Jd(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,ee;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,ee=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,ee=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(cu(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,ee=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(cu(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let te=du(r.ticks.maxTicksLimit,l),ne=Math.max(1,Math.ceil(l/te));for(_=0;_0&&(a-=r/2);break}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:ee,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:te,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-Yu(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||=this._computeGridLineItems(e),i,a,o=(e,t,r)=>{!r.width||!r.color||(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);Wd.route(a,i,c,s)})}function Qh(e){return`id`in e&&`defaults`in e}var $h=new class{constructor(){this.controllers=new Yh(cm,`datasets`,!0),this.elements=new Yh(Oh,`elements`),this.plugins=new Yh(Object,`plugins`),this.scales=new Yh(Jh,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):hu(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=Du(e);mu(n[`before`+r],[],n),t[e](n),mu(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function tg(e){let t={},n=[],r=Object.keys($h.plugins.items);for(let e=0;e1&&cg(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function dg(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function fg(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return dg(e,`x`,n[0])||dg(e,`y`,n[0])}return{}}function pg(e,t){let n=Bd[e.type]||{scales:{}},r=t.scales||{},i=ag(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!cu(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=ug(t,o,fg(t,e),Wd.scales[o.type]),c=sg(s,i),l=n.scales||{};a[t]=xu(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||ag(i,t),s=(Bd[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=og(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),xu(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];xu(t,[Wd.scales[t.type],Wd.scale])}),a}function mg(e){let t=e.options||={};t.plugins=du(t.plugins,{}),t.scales=pg(e,t)}function hg(e){return e||={},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function gg(e){return e||={},e.data=hg(e.data),mg(e),e}var _g=new Map,vg=new Set;function yg(e,t){let n=_g.get(e);return n||(n=t(),_g.set(e,n),vg.add(n)),n}var bg=(e,t,n)=>{let r=Eu(t,n);r!==void 0&&e.add(r)},xg=class{constructor(e){this._config=gg(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=hg(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),mg(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return yg(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return yg(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return yg(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return yg(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>bg(s,e,t))),t.forEach(e=>bg(s,r,e)),t.forEach(e=>bg(s,Bd[i]||{},e)),t.forEach(e=>bg(s,Wd,e)),t.forEach(e=>bg(s,Vd,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),vg.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,Bd[t]||{},Wd.datasets[t]||{},{type:t},Wd,Vd]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Sg(this._resolverCache,e,r),s=a;if(wg(a,t)){i.$shared=!1,n=ku(n)?n():n;let t=this.createResolver(e,n,o);s=Sf(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Sg(this._resolverCache,e,n);return cu(t)?Sf(i,t,void 0,r):i}};function Sg(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:xf(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var Cg=e=>cu(e)&&Object.getOwnPropertyNames(e).some(t=>ku(e[t]));function wg(e,t){let{isScriptable:n,isIndexable:r}=Cf(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(ku(o)||Cg(o))||a&&su(o))return!0}return!1}var Tg=`4.5.1`,Eg=[`top`,`bottom`,`left`,`right`,`chartArea`];function Dg(e,t){return e===`top`||e===`bottom`||Eg.indexOf(e)===-1&&t===`x`}function Og(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function kg(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),mu(n&&n.onComplete,[e],t)}function Ag(e){let t=e.chart,n=t.options.animation;mu(n&&n.onProgress,[e],t)}function jg(e){return Zf()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Mg={},Ng=e=>{let t=jg(e);return Object.values(Mg).filter(e=>e.canvas===t).pop()};function Pg(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Fg(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Ig=class{static defaults=Wd;static instances=Mg;static overrides=Bd;static registry=$h;static version=Tg;static getChart=Ng;static register(...e){$h.add(...e),Lg()}static unregister(...e){$h.remove(...e),Lg()}constructor(e,t){let n=this.config=new xg(t),r=jg(e),i=Ng(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Dh(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;if(this.id=au(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new eg,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=gd(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Mg[this.id]=this,!o||!s){console.error(`Failed to create chart: can't acquire context from the given item`);return}Ip.listen(this,`complete`,kg),Ip.listen(this,`progress`,Ag),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return ou(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return $h}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():up(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return Yd(this.canvas,this.ctx),this}stop(){return Ip.stop(this),this}resize(e,t){Ip.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,up(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),mu(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){hu(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=ug(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),hu(i,t=>{let i=t.options,a=i.id,o=ug(a,i),s=du(i.type,t.dtype);(i.position===void 0||Dg(i.position,o)!==Dg(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new($h.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),hu(r,(e,t)=>{e||delete n[t]}),hu(n,e=>{ih.configure(this,e,e.options),ih.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Og(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){hu(this.scales,e=>{ih.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!Au(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Pg(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;ih.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],hu(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=Fp(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&$d(t,r),e.controller.draw(),r&&ef(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return Qd(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Vm.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||=bf(null,{chart:this,type:`chart`})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Ou(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Ip.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};hu(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||={};let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){hu(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},hu(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});gu(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=ju(e),c=Fg(e,this._lastEvent,n,s);n&&(this._lastEvent=null,mu(i.onHover,[e,o,this],this),s&&mu(i.onClick,[e,o,this],this));let l=!gu(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};function Lg(){return hu(Ig.instances,e=>e._plugins.invalidate())}function Rg(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,td(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,td(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*td(r-n));if(u===`round`)e.arc(i,a,t,n-Mu/2,r+Mu/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+Mu/2)+i,c=-o*Math.sin(n+Mu/2)+a,l=o*Math.cos(r+Mu/2)+i,u=o*Math.sin(r+Mu/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function zg(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+Lu,r-Lu),e.closePath(),e.clip()}function Bg(e){return pf(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function Vg(e,t,n,r){let i=Bg(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return rd(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:rd(i.innerStart,0,o),innerEnd:rd(i.innerEnd,0,o)}}function Hg(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Ug(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/Mu)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=Vg(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,E=f+b,ee=f+x,te=g+b/E,ne=_-x/ee;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=Hg(C,T,o,s);e.arc(t.x,t.y,y,T,_+Lu)}let n=Hg(ee,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=Hg(ee,ne,o,s);e.arc(t.x,t.y,x,_+Lu,ne+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=Hg(E,te,o,s);e.arc(t.x,t.y,b,te+Math.PI,g-Lu)}let i=Hg(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=Hg(S,w,o,s);e.arc(t.x,t.y,v,g-Lu,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function Wg(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){Ug(e,t,n,r,c,i);for(let t=0;t=Mu&&p===0&&u!==`miter`&&Rg(e,t,h),a||(Ug(e,t,n,r,h,i),e.stroke())}var Kg=class extends Oh{static id=`arc`;static defaults={borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1};static defaultRoutes={backgroundColor:`backgroundColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=Qu(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=du(l,o-a),f=nd(r,a,o)&&a!==o,p=d>=Nu||f,m=ad(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>Nu?Math.floor(n/Nu):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(Mu,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Wg(e,this,s,i,a),Gg(e,this,s,i,a),e.restore()}};function qg(e,t,n=t){e.lineCap=du(n.borderCapStyle,t.borderCapStyle),e.setLineDash(du(n.borderDash,t.borderDash)),e.lineDashOffset=du(n.borderDashOffset,t.borderDashOffset),e.lineJoin=du(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=du(n.borderWidth,t.borderWidth),e.strokeStyle=du(n.borderColor,t.borderColor)}function Jg(e,t,n){e.lineTo(n.x,n.y)}function Yg(e){return e.stepped?tf:e.tension||e.cubicInterpolationMode===`monotone`?nf:Jg}function Xg(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function $g(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?Qg:Zg}function e_(e){return e.stepped?mp:e.tension||e.cubicInterpolationMode===`monotone`?hp:pp}function t_(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),qg(e,t.options),e.stroke(i)}function n_(e,t,n,r){let{segments:i,options:a}=t,o=$g(t);for(let s of i)qg(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var r_=typeof Path2D==`function`;function i_(e,t,n,r){r_&&!t.options.segment?t_(e,t,n,r):n_(e,t,n,r)}var a_=class extends Oh{static id=`line`;static defaults={borderCapStyle:`butt`,borderDash:[],borderDashOffset:0,borderJoinStyle:`miter`,borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:`default`,fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:`backgroundColor`,borderColor:`borderColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`&&e!==`fill`};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;Xf(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||=Op(this,this.options.segment)}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=Tp(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=e_(n),c,l;for(c=0,l=a.length;ce.replace(`rgb(`,`rgba(`).replace(`)`,`, 0.5)`));function b_(e){return v_[e%v_.length]}function x_(e){return y_[e%y_.length]}function S_(e,t){return e.borderColor=b_(t),e.backgroundColor=x_(t),++t}function C_(e,t){return e.backgroundColor=e.data.map(()=>b_(t++)),t}function w_(e,t){return e.backgroundColor=e.data.map(()=>x_(t++)),t}function T_(e){let t=0;return(n,r)=>{let i=e.getDatasetMeta(r).controller;i instanceof Dm?t=C_(n,t):i instanceof km?t=w_(n,t):i&&(t=S_(n,t))}}function E_(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}function D_(e){return e&&(e.borderColor||e.backgroundColor)}function O_(){return Wd.borderColor!==`rgba(0,0,0,0.1)`||Wd.backgroundColor!==`rgba(0,0,0,0.1)`}var k_={id:`colors`,defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,n){if(!n.enabled)return;let{data:{datasets:r},options:i}=e.config,{elements:a}=i,o=E_(r)||D_(i)||a&&E_(a)||O_();if(!n.forceOverride&&o)return;let s=T_(e);r.forEach(s)}};function A_(e,t,n,r,i){let a=i.samples||r;if(a>=n)return e.slice(t,t+n);let o=[],s=(n-2)/(a-2),c=0,l=t+n-1,u=t,d,f,p,m,h;for(o[c++]=e[u],d=0;dp&&(p=m,f=e[a],h=a);o[c++]=f,u=h}return o[c++]=e[l],o}function j_(e,t,n,r){let i=0,a=0,o,s,c,l,u,d,f,p,m,h,g=[],_=t+n-1,v=e[t].x,y=e[_].x-v;for(o=t;oh&&(h=l,f=o),i=(a*i+s.x)/++a;else{let n=o-1;if(!ou(d)&&!ou(f)){let t=Math.min(d,f),r=Math.max(d,f);t!==p&&t!==n&&g.push({...e[t],x:i}),r!==p&&r!==n&&g.push({...e[r],x:i})}o>0&&n!==p&&g.push(e[n]),g.push(s),u=t,a=0,m=h=l,d=f=p=o}}return g}function M_(e){if(e._decimated){let t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function N_(e){e.data.datasets.forEach(e=>{M_(e)})}function P_(e,t){let n=t.length,r=0,i,{iScale:a}=e,{min:o,max:s,minDefined:c,maxDefined:l}=a.getUserBounds();return c&&(r=rd(sd(t,a.axis,o).lo,0,n-1)),i=l?rd(sd(t,a.axis,s).hi+1,r,n)-r:n-r,{start:r,count:i}}var F_={id:`decimation`,defaults:{algorithm:`min-max`,enabled:!1},beforeElementsUpdate:(e,t,n)=>{if(!n.enabled){N_(e);return}let r=e.width;e.data.datasets.forEach((t,i)=>{let{_data:a,indexAxis:o}=t,s=e.getDatasetMeta(i),c=a||t.data;if(vf([o,e.options.indexAxis])===`y`||!s.controller.supportsDecimation)return;let l=e.scales[s.xAxisID];if(l.type!==`linear`&&l.type!==`time`||e.options.parsing)return;let{start:u,count:d}=P_(s,c);if(d<=(n.threshold||4*r)){M_(t);return}ou(a)&&(t._data=c,delete t.data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(e){this._data=e}}));let f;switch(n.algorithm){case`lttb`:f=A_(c,u,d,r,n);break;case`min-max`:f=j_(c,u,d,r);break;default:throw Error(`Unsupported decimation algorithm '${n.algorithm}'`)}t._decimated=f})},destroy(e){N_(e)}};function I_(e,t,n){let r=e.segments,i=e.points,a=t.points,o=[];for(let e of r){let{start:r,end:s}=e;s=z_(r,s,i);let c=L_(n,i[r],i[s],e.loop);if(!t.segments){o.push({source:e,target:c,start:i[r],end:i[s]});continue}let l=Tp(t,c);for(let t of l){let r=L_(n,a[t.start],a[t.end],t.loop),s=wp(e,i,r);for(let e of s)o.push({source:e,target:t,start:{[n]:B_(c,r,`start`,Math.max)},end:{[n]:B_(c,r,`end`,Math.min)}})}}return o}function L_(e,t,n,r){if(r)return;let i=t[e],a=n[e];return e===`angle`&&(i=td(i),a=td(a)),{property:e,start:i,end:a}}function R_(e,t){let{x:n=null,y:r=null}=e||{},i=t.points,a=[];return t.segments.forEach(({start:e,end:t})=>{t=z_(e,t,i);let o=i[e],s=i[t];r===null?n!==null&&(a.push({x:n,y:o.y}),a.push({x:n,y:s.y})):(a.push({x:o.x,y:r}),a.push({x:s.x,y:r}))}),a}function z_(e,t,n){for(;t>e;t--){let e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function B_(e,t,n,r){return e&&t?r(e[n],t[n]):e?e[n]:t?t[n]:0}function V_(e,t){let n=[],r=!1;return su(e)?(r=!0,n=e):n=R_(e,t),n.length?new a_({points:n,options:{tension:0},_loop:r,_fullLoop:r}):null}function H_(e){return e&&e.fill!==!1}function U_(e,t,n){let r=e[t].fill,i=[t],a;if(!n)return r;for(;r!==!1&&i.indexOf(r)===-1;){if(!lu(r))return r;if(a=e[r],!a)return!1;if(a.visible)return r;i.push(r),r=a.fill}return!1}function W_(e,t,n){let r=J_(e);if(cu(r))return!isNaN(r.value)&&r;let i=parseFloat(r);return lu(i)&&Math.floor(i)===i?G_(r[0],t,i,n):[`origin`,`start`,`end`,`stack`,`shape`].indexOf(r)>=0&&r}function G_(e,t,n,r){return(e===`-`||e===`+`)&&(n=t+n),n===t||n<0||n>=r?!1:n}function K_(e,t){let n=null;return e===`start`?n=t.bottom:e===`end`?n=t.top:cu(e)?n=t.getPixelForValue(e.value):t.getBasePixel&&(n=t.getBasePixel()),n}function q_(e,t,n){let r;return r=e===`start`?n:e===`end`?t.options.reverse?t.min:t.max:cu(e)?e.value:t.getBaseValue(),r}function J_(e){let t=e.options,n=t.fill,r=du(n&&n.target,n);return r===void 0&&(r=!!t.backgroundColor),r===!1||r===null?!1:r===!0?`origin`:r}function Y_(e){let{scale:t,index:n,line:r}=e,i=[],a=r.segments,o=r.points,s=X_(t,n);s.push(V_({x:null,y:t.bottom},r));for(let e=0;e=0;--t){let n=i[t].$filler;n&&(n.line.updateControlPoints(a,n.axis),r&&n.fill&&av(e.ctx,n,a))}},beforeDatasetsDraw(e,t,n){if(n.drawTime!==`beforeDatasetsDraw`)return;let r=e.getSortedVisibleDatasetMetas();for(let t=r.length-1;t>=0;--t){let n=r[t].$filler;H_(n)&&av(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){let r=t.meta.$filler;!H_(r)||n.drawTime!==`beforeDatasetDraw`||av(e.ctx,r,e.chartArea)},defaults:{propagate:!0,drawTime:`beforeDatasetDraw`}},pv=(e,t)=>{let{boxHeight:n=t,boxWidth:r=t}=e;return e.usePointStyle&&(n=Math.min(n,t),r=e.pointStyleWidth||Math.min(r,t)),{boxWidth:r,boxHeight:n,itemHeight:Math.max(t,n)}},mv=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index,hv=class extends Oh{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let e=this.options.labels||{},t=mu(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){let{options:e,ctx:t}=this;if(!e.display){this.width=this.height=0;return}let n=e.labels,r=_f(n.font),i=r.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=pv(n,i),c,l;t.font=r.string,this.isHorizontal()?(c=this.maxWidth,l=this._fitRows(a,i,o,s)+10):(l=this.maxHeight,c=this._fitCols(a,r,o,s)+10),this.width=Math.min(c,e.maxWidth||this.maxWidth),this.height=Math.min(l,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,r){let{ctx:i,maxWidth:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.lineWidths=[0],l=r+o,u=e;i.textAlign=`left`,i.textBaseline=`middle`;let d=-1,f=-l;return this.legendItems.forEach((e,p)=>{let m=n+t/2+i.measureText(e.text).width;(p===0||c[c.length-1]+m+2*o>a)&&(u+=l,c[c.length-(p>0?0:1)]=0,f+=l,d++),s[p]={left:0,top:f,row:d,width:m,height:r},c[c.length-1]+=m+o}),u}_fitCols(e,t,n,r){let{ctx:i,maxHeight:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.columnSizes=[],l=a-e,u=o,d=0,f=0,p=0,m=0;return this.legendItems.forEach((e,a)=>{let{itemWidth:h,itemHeight:g}=gv(n,t,i,e,r);a>0&&f+g+2*o>l&&(u+=d+o,c.push({width:d,height:f}),p+=d+o,m++,d=f=0),s[a]={left:p,top:f,col:m,width:h,height:g},d=Math.max(d,h),f+=g+o}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:r},rtl:i}}=this,a=vp(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=vd(n,this.left+r,this.right-this.lineWidths[i]);for(let s of t)i!==s.row&&(i=s.row,o=vd(n,this.left+r,this.right-this.lineWidths[i])),s.top+=this.top+e+r,s.left=a.leftForLtr(a.x(o),s.width),o+=s.width+r}else{let i=0,o=vd(n,this.top+e+r,this.bottom-this.columnSizes[i].height);for(let s of t)s.col!==i&&(i=s.col,o=vd(n,this.top+e+r,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+r,s.left=a.leftForLtr(a.x(s.left),s.width),o+=s.height+r}}isHorizontal(){return this.options.position===`top`||this.options.position===`bottom`}draw(){if(this.options.display){let e=this.ctx;$d(e,this),this._draw(),ef(e)}}_draw(){let{options:e,columnSizes:t,lineWidths:n,ctx:r}=this,{align:i,labels:a}=e,o=Wd.color,s=vp(e.rtl,this.left,this.width),c=_f(a.font),{padding:l}=a,u=c.size,d=u/2,f;this.drawTitle(),r.textAlign=s.textAlign(`left`),r.textBaseline=`middle`,r.lineWidth=.5,r.font=c.string;let{boxWidth:p,boxHeight:m,itemHeight:h}=pv(a,u),g=function(e,t,n){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;r.save();let i=du(n.lineWidth,1);if(r.fillStyle=du(n.fillStyle,o),r.lineCap=du(n.lineCap,`butt`),r.lineDashOffset=du(n.lineDashOffset,0),r.lineJoin=du(n.lineJoin,`miter`),r.lineWidth=i,r.strokeStyle=du(n.strokeStyle,o),r.setLineDash(du(n.lineDash,[])),a.usePointStyle){let o={radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},c=s.xPlus(e,p/2),l=t+d;Zd(r,o,c,l,a.pointStyleWidth&&p)}else{let a=t+Math.max((u-m)/2,0),o=s.leftForLtr(e,p),c=hf(n.borderRadius);r.beginPath(),Object.values(c).some(e=>e!==0)?cf(r,{x:o,y:a,w:p,h:m,radius:c}):r.rect(o,a,p,m),r.fill(),i!==0&&r.stroke()}r.restore()},_=function(e,t,n){sf(r,n.text,e,t+h/2,c,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();f=v?{x:vd(i,this.left+l,this.right-n[0]),y:this.top+l+y,line:0}:{x:this.left+l,y:vd(i,this.top+y+l,this.bottom-t[0].height),line:0},yp(this.ctx,e.textDirection);let b=h+l;this.legendItems.forEach((o,u)=>{r.strokeStyle=o.fontColor,r.fillStyle=o.fontColor;let m=r.measureText(o.text).width,h=s.textAlign(o.textAlign||=a.textAlign),x=p+d+m,S=f.x,C=f.y;s.setWidth(this.width),v?u>0&&S+x+l>this.right&&(C=f.y+=b,f.line++,S=f.x=vd(i,this.left+l,this.right-n[f.line])):u>0&&C+b>this.bottom&&(S=f.x=S+t[f.line].width+l,f.line++,C=f.y=vd(i,this.top+y+l,this.bottom-t[f.line].height));let w=s.x(S);if(g(w,C,o),S=yd(h,S+p+d,v?S+x:this.right,e.rtl),_(s.x(S),C,o),v)f.x+=x+l;else if(typeof o.text!=`string`){let e=c.lineHeight;f.y+=yv(o,e)+l}else f.y+=b}),bp(this.ctx,e.textDirection)}drawTitle(){let e=this.options,t=e.title,n=_f(t.font),r=gf(t.padding);if(!t.display)return;let i=vp(e.rtl,this.left,this.width),a=this.ctx,o=t.position,s=n.size/2,c=r.top+s,l,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),l=this.top+c,u=vd(e.align,u,this.right-d);else{let t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);l=c+vd(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}let f=vd(o,u,u+d);a.textAlign=i.textAlign(_d(o)),a.textBaseline=`middle`,a.strokeStyle=t.color,a.fillStyle=t.color,a.font=n.string,sf(a,t.text,f,l,n)}_computeTitleHeight(){let e=this.options.title,t=_f(e.font),n=gf(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,r,i;if(ad(e,this.left,this.right)&&ad(t,this.top,this.bottom)){for(i=this.legendHitBoxes,n=0;ne.length>t.length?e:t)),t+n.size/2+r.measureText(i).width}function vv(e,t,n){let r=e;return typeof t.text!=`string`&&(r=yv(t,n)),r}function yv(e,t){return t*(e.text?e.text.length:0)}function bv(e,t){return!!((e===`mousemove`||e===`mouseout`)&&(t.onHover||t.onLeave)||t.onClick&&(e===`click`||e===`mouseup`))}var xv={id:`legend`,_element:hv,start(e,t,n){let r=e.legend=new hv({ctx:e.ctx,options:n,chart:e});ih.configure(e,r,n),ih.addBox(e,r)},stop(e){ih.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,n){let r=e.legend;ih.configure(e,r,n),r.options=n},afterUpdate(e){let t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:`top`,align:`center`,fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,n){let r=t.datasetIndex,i=n.chart;i.isDatasetVisible(r)?(i.hide(r),t.hidden=!0):(i.show(r),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){let t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:r,textAlign:i,color:a,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{let c=e.controller.getStyle(n?0:void 0),l=gf(c.borderWidth);return{text:t[e.index].label,fillStyle:c.backgroundColor,fontColor:a,hidden:!e.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:c.borderColor,pointStyle:r||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:o&&(s||c.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:`center`,text:``}},descriptors:{_scriptable:e=>!e.startsWith(`on`),labels:{_scriptable:e=>![`generateLabels`,`filter`,`sort`].includes(e)}}},Sv=class extends Oh{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){let n=this.options;if(this.left=0,this.top=0,!n.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=e,this.height=this.bottom=t;let r=su(n.text)?n.text.length:1;this._padding=gf(n.padding);let i=r*_f(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=i:this.width=i}isHorizontal(){let e=this.options.position;return e===`top`||e===`bottom`}_drawArgs(e){let{top:t,left:n,bottom:r,right:i,options:a}=this,o=a.align,s=0,c,l,u;return this.isHorizontal()?(l=vd(o,n,i),u=t+e,c=i-n):(a.position===`left`?(l=n+e,u=vd(o,r,t),s=Mu*-.5):(l=i-e,u=vd(o,t,r),s=Mu*.5),c=r-t),{titleX:l,titleY:u,maxWidth:c,rotation:s}}draw(){let e=this.ctx,t=this.options;if(!t.display)return;let n=_f(t.font),r=n.lineHeight/2+this._padding.top,{titleX:i,titleY:a,maxWidth:o,rotation:s}=this._drawArgs(r);sf(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:_d(t.align),textBaseline:`middle`,translation:[i,a]})}};function Cv(e,t){let n=new Sv({ctx:e.ctx,options:t,chart:e});ih.configure(e,n,t),ih.addBox(e,n),e.titleBlock=n}var wv={id:`title`,_element:Sv,start(e,t,n){Cv(e,n)},stop(e){let t=e.titleBlock;ih.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){let r=e.titleBlock;ih.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`bold`},fullSize:!0,padding:10,position:`top`,text:``,weight:2e3},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},Tv=new WeakMap,Ev={id:`subtitle`,start(e,t,n){let r=new Sv({ctx:e.ctx,options:n,chart:e});ih.configure(e,r,n),ih.addBox(e,r),Tv.set(e,r)},stop(e){ih.removeBox(e,Tv.get(e)),Tv.delete(e)},beforeUpdate(e,t,n){let r=Tv.get(e);ih.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`normal`},fullSize:!0,padding:0,position:`top`,text:``,weight:1500},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},Dv={average(e){if(!e.length)return!1;let t,n,r=new Set,i=0,a=0;for(t=0,n=e.length;te+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a-1?e.split(` +`):e}function Av(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function jv(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=_f(t.bodyFont),l=_f(t.titleFont),u=_f(t.footerFont),d=a.length,f=i.length,p=r.length,m=gf(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,hu(e.title,y),n.font=c.string,hu(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,hu(r,e=>{hu(e.before,y),hu(e.lines,y),hu(e.after,y)}),v=0,n.font=u.string,hu(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function Mv(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function Nv(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function Pv(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),Nv(l,e,t,n)&&(l=`center`),l}function Fv(e,t,n){let r=n.yAlign||t.yAlign||Mv(e,n);return{xAlign:n.xAlign||t.xAlign||Pv(e,t,n,r),yAlign:r}}function Iv(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function Lv(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:t===`bottom`?r-=i+n:r-=i/2,r}function Rv(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=hf(o),m=Iv(t,s),h=Lv(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:rd(m,0,r.width-t.width),y:rd(h,0,r.height-t.height)}}function zv(e,t,n){let r=gf(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Bv(e){return Ov([],kv(e))}function Vv(e,t,n){return bf(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function Hv(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Uv={beforeTitle:iu,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=Hv(n,e);Ov(t.before,kv(Wv(i,`beforeLabel`,this,e))),Ov(t.lines,Wv(i,`label`,this,e)),Ov(t.after,kv(Wv(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Bv(Wv(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=Wv(n,`beforeFooter`,this,e),i=Wv(n,`footer`,this,e),a=Wv(n,`afterFooter`,this,e),o=[];return o=Ov(o,kv(r)),o=Ov(o,kv(i)),o=Ov(o,kv(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),hu(o,t=>{let n=Hv(e.callbacks,t);r.push(Wv(n,`labelColor`,this,t)),i.push(Wv(n,`labelPointStyle`,this,t)),a.push(Wv(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=Dv[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=jv(this,n),o=Object.assign({},e,t),s=Fv(this.chart,n,o),c=Rv(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=hf(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=vp(n.rtl,this.x,this.width);for(e.x=zv(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=_f(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,cf(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),cf(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=_f(n.bodyFont),d=u.lineHeight,f=0,p=vp(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=zv(this,h,n),t.fillStyle=n.bodyColor,hu(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=Dv[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=jv(this,e),o=Object.assign({},n,this._size),s=Fv(t,e,o),c=Rv(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=gf(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),yp(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),bp(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!gu(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!gu(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=Dv[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}},Kv=Object.freeze({__proto__:null,Colors:k_,Decimation:F_,Filler:fv,Legend:xv,SubTitle:Ev,Title:wv,Tooltip:{id:`tooltip`,_element:Gv,positioners:Dv,afterInit(e,t,n){n&&(e.tooltip=new Gv({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Uv},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]}}),qv=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function Jv(e,t,n,r){let i=e.indexOf(t);return i===-1?qv(e,t,n,r):i===e.lastIndexOf(t)?i:n}var Yv=(e,t)=>e===null?null:rd(Math.round(e),0,t);function Xv(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};function Qv(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!ou(a),_=!ou(o),v=!ou(c),y=(h-m)/(u+1),b=Uu((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=Uu(w*b/p/f)*f),ou(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&qu((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=Hu(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(Zu(b),Zu(S));x=10**(ou(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&Hu(n[n.length-1].value,o,$v(o,y,e))?n[n.length-1].value=o:n.push({value:o}):(!_||C===o)&&n.push({value:C}),n}function $v(e,t,{horizontal:n,minRotation:r}){let i=Yu(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var ey=class extends Jh{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return ou(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=Vu(r),t=Vu(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e||=11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=Qv({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&Ju(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Fd(e,this.chart.options.locale,this.options.ticks.format)}},ty=class extends ey{static id=`linear`;static defaults={ticks:{callback:Rd.formatters.numeric}};determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=lu(e)?e:0,this.max=lu(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=Yu(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}},ny=e=>Math.floor(Bu(e)),ry=(e,t)=>10**(ny(e)+t);function iy(e){return e/10**ny(e)==1}function ay(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function oy(e,t){let n=ny(t-e);for(;ay(e,t,n)>10;)n++;for(;ay(e,t,n)<10;)n--;return Math.min(n,ny(e))}function sy(e,{min:t,max:n}){t=uu(e.min,t);let r=[],i=ny(t),a=oy(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=uu(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=uu(e.max,f);return r.push({value:p,major:iy(p),significand:d}),r}var cy=class extends Jh{static id=`logarithmic`;static defaults={ticks:{callback:Rd.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=ey.prototype.parse.apply(this,[e,t]);if(n===0){this._zero=!0;return}return lu(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=lu(e)?Math.max(0,e):null,this.max=lu(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!lu(this._userMin)&&(this.min=e===ry(this.min,0)?ry(this.min,-1):ry(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(ry(n,-1)),a(ry(r,1)))),n<=0&&i(ry(r,-1)),r<=0&&a(ry(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=sy({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&Ju(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Fd(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=Bu(e),this._valueRange=Bu(this.max)-Bu(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(Bu(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};function ly(e){let t=e.ticks;if(t.display&&e.display){let e=gf(t.backdropPadding);return du(t.font&&t.font.size,Wd.font.size)+e.height}return 0}function uy(e,t,n){return n=su(n)?n:[n],{w:qd(e,t.string,n),h:n.length*t.lineHeight}}function dy(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function fy(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?Mu/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function my(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(Xu(td(c.angle+Lu))),u=yy(c.y,s.h,l),d=_y(l),f=vy(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function hy(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(Qd({x:n,y:r},t)||Qd({x:n,y:a},t)||Qd({x:i,y:r},t)||Qd({x:i,y:a},t))}function gy(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:ly(a)/2,additionalAngle:o?Mu/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function by(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!ou(s)){let n=hf(t.borderRadius),c=gf(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),cf(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function xy(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));by(n,a,t);let o=_f(a.font),{x:s,y:c,textAlign:l}=t;sf(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function Sy(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,Nu);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=mu(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?fy(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=Nu/(this._pointLabels.length||1),n=this.options.startAngle||0;return td(e*t+Yu(n))}getDistanceFromCenterForValue(e){if(ou(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(ou(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);Cy(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;!a||!i||(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=_f(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=gf(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}sf(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}},Ey={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Dy=Object.keys(Ey);function Oy(e,t){return e-t}function ky(e,t){if(ou(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),lu(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(Ku(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function Ay(e,t,n,r){let i=Dy.length;for(let a=Dy.indexOf(e);a=Dy.indexOf(n);a--){let n=Dy[a];if(Ey[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return Dy[n?Dy.indexOf(n):0]}function My(e){for(let t=Dy.indexOf(e)+1,n=Dy.length;t=t?n[r]:n[i];e[a]=!0}}function Py(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Fy(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=rd(t,0,a),n=rd(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||Ay(i.minUnit,t,n,this._getLabelCapacity(t)),o=du(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=Ku(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return mu(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=sd(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=sd(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var Ry=class extends Iy{static id=`timeseries`;static defaults=Iy.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Ly(t,this.min),this._tableRange=Ly(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Ly(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Ly(this._table,n*this._tableRange+this._minPos,!0)}},zy=[Am,__,Kv,Object.freeze({__proto__:null,CategoryScale:Zv,LinearScale:ty,LogarithmicScale:cy,RadialLinearScale:Ty,TimeScale:Iy,TimeSeriesScale:Ry})];Ig.register(...zy);var By=Ig,Vy=B(``);function Hy(e,t){O(t,!0);let n=q(t,`class`,3,``),r=q(t,`ariaLabel`,3,``);function i(e){if(Ea.tick,typeof t.build!=`function`)return;let n=t.build();if(!n)return;let r=new By(e.getContext(`2d`),n);return()=>r.destroy()}var a=Vy();Ai(a,()=>i),L(()=>{G(a,1,Ni(n())),K(a,`aria-label`,r())}),V(e,a),k()}var Uy=B(``),Wy=B(`
`);function Gy(e,t){O(t,!0);let n=q(t,`options`,19,()=>[]),r=q(t,`ariaLabel`,3,``),i=q(t,`class`,3,``);var a=Wy();W(a,21,n,e=>e.value,(e,n)=>{var r=Uy();let i;var a=P(r,!0);D(r),L(()=>{i=G(r,1,`segmented-btn svelte-92fh5i`,null,i,{active:t.value===R(n).value}),K(r,`aria-pressed`,t.value===R(n).value),H(a,R(n).label)}),z(`click`,r,()=>t.onchange?.(R(n).value)),V(e,r)}),D(a),L(()=>{G(a,1,Ni([`segmented-control`,i()]),`svelte-92fh5i`),K(a,`aria-label`,r())}),V(e,a),k()}Br([`click`]);function Ky(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function qy(){return{grid:Ky(`--chart-grid`),text:Ky(`--chart-text`),dayMarker:Ky(`--chart-day-marker`),tooltipBg:Ky(`--chart-tooltip-bg`),tooltipBorder:Ky(`--chart-tooltip-border`),tooltipText:Ky(`--chart-tooltip-text`)}}function Jy(){return{size:11,family:`'SF Mono', Menlo, Consolas, monospace`}}function Yy(e,t){return{backgroundColor:e.tooltipBg,borderColor:e.tooltipBorder,borderWidth:1,titleColor:e.tooltipText,bodyColor:e.tooltipText,callbacks:t}}function Xy(e){if(typeof document>`u`||!document.body)return e;let t=document.createElement(`span`);t.style.display=`none`,t.style.color=e,document.body.appendChild(t);let n=getComputedStyle(t).color;return document.body.removeChild(t),n||e}var Zy=[`#c2845a`,`#7a9e7e`,`#d4a574`,`#b8a98e`,`#8b9e6b`,`#7d8a97`,`#c47a5a`,`#6b8e6b`,`#a09486`,`#9b7ea4`,`#c49a6c`];function Qy(){return[...Zy]}function $y(e){let t=5381,n=String(e||``);for(let e=0;exc(e)}}var ab={seconds:{apiName:`second`,windowLabel:`Last 60 seconds`,refreshMs:2e3},minutes:{apiName:`minute`,windowLabel:`Last 60 minutes`,refreshMs:5e3},hours:{apiName:`hour`,windowLabel:`Last 24 hours`,refreshMs:2e4},days:{apiName:`day`,windowLabel:`Last 30 days`,refreshMs:6e4}},ob=[{value:`seconds`,label:`Seconds`},{value:`minutes`,label:`Minutes`},{value:`hours`,label:`Hours`},{value:`days`,label:`Days`}];function sb(){return{input:0,output:0,prompt:0,local:0}}function cb(e){return String(e).padStart(2,`0`)}function lb(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function ub(e,t){if(!Number.isFinite(t))return``;let n=new Date(t);switch(e){case`seconds`:return cb(n.getHours())+`:`+cb(n.getMinutes())+`:`+cb(n.getSeconds());case`minutes`:return cb(n.getHours())+`:`+cb(n.getMinutes());case`hours`:return cb(n.getHours())+`:00`;default:return cb(n.getMonth()+1)+`-`+cb(n.getDate())}}function db(e,t){let n=[],r=[],i={input:[],output:[],prompt:[],local:[]},a=sb();for(let o of e||[]){let e=Date.parse(o&&o.start),s=lb(o&&o.input_tokens),c=lb(o&&o.output_tokens),l=lb(o&&o.prompt_cached_tokens),u=lb(o&&o.locally_cached_tokens);n.push(ub(t,e)),r.push(Number.isFinite(e)?e:null),i.input.push(s),i.output.push(c),i.prompt.push(l),i.local.push(u),a.input+=s,a.output+=c,a.prompt+=l,a.local+=u}return{labels:n,stamps:r,cols:i,totals:a}}function fb(e){let t=e||sb();return t.input+t.output+t.prompt+t.local>0}function pb(e,t){return xc(Math.max(0,Math.round(e&&e[t]||0)))}function mb(e){return(ab[e]||ab.minutes).windowLabel}function hb(e,t){return`Live token throughput, `+mb(t).toLowerCase()+`. Input `+pb(e,`input`)+`, output `+pb(e,`output`)+`, prompt cached `+pb(e,`prompt`)+`, locally cached `+pb(e,`local`)+` tokens.`}function gb(e,t,n,r){let i=e=>xc(Math.max(0,Math.round(e))),a=n.stamps,o=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderWidth:0,borderRadius:0,categoryPercentage:1,barPercentage:1,stack:`tokens`});return{type:`bar`,plugins:[{id:`liveTokensDayMarks`,afterDatasetsDraw:t=>{if(r===`days`)return;let n=t.getDatasetMeta(0),i=t.chartArea;if(!n||!n.data||!i)return;let o=t.ctx;o.save(),o.font=`10px 'SF Mono', Menlo, Consolas, monospace`;let s=null;for(let t=0;t{if(!e.length)return``;let t=a[e[0].dataIndex];if(!t)return e[0].label;let n=new Date(t);return r===`days`?n.toLocaleDateString():n.toLocaleString()},label:e=>e.dataset.label+`: `+i(e.parsed.y),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+i(t)}})}}}}var _b=900,vb=new class{#e=j(`minutes`);get granularity(){return R(this.#e)}set granularity(e){M(this.#e,e,!0)}#t=j(N([]));get buckets(){return R(this.#t)}set buckets(e){M(this.#t,e,!0)}#n=j(!1);get active(){return R(this.#n)}set active(e){M(this.#n,e,!0)}#r=null;#i=null;#a=null;#o=0;#s=null;#c=!1;start(){this.stop(),this.active=!0,this.fetch(),this.#l(),this.#u()}stop(){this.active=!1,this.#r&&=(clearInterval(this.#r),null),this.#i&&=(clearTimeout(this.#i),null),this.#a&&=(clearTimeout(this.#a),null),this.#o=0,this.#s&&=(this.#s.abort(),null),this.buckets=[]}setGranularity(e){!ab[e]||e===this.granularity||(this.granularity=e,this.buckets=[],this.#l(),this.fetch())}#l(){this.#r&&=(clearInterval(this.#r),null);let e=ab[this.granularity]||ab.minutes;this.#r=setInterval(()=>{this.active&&this.fetch()},e.refreshMs)}noteUsageEvent(e){!this.active||e!==`usage.flushed`||(this.#i||=setTimeout(()=>{this.#i=null,this.fetch()},_b))}async fetch(){if(!this.active||this.#c)return;this.#c=!0;let e=this.granularity;try{let t=await ws(`/admin/usage/throughput?granularity=`+(ab[e]||ab.minutes).apiName,{label:`token throughput`});if(t.stale||!t.ok||this.granularity!==e)return;this.buckets=t.data&&Array.isArray(t.data.buckets)?t.data.buckets:[]}catch(e){if(Es(e))return;console.error(`Failed to fetch token throughput:`,e)}finally{this.#c=!1,this.active&&this.granularity!==e&&this.fetch()}}async#u(){await ks.ensureLoaded(),this.active&&ks.liveLogsVisible()&&(typeof ReadableStream>`u`||(this.#s&&this.#s.abort(),this.#s=new AbortController,this.#d(this.#s)))}async#d(e){let t=()=>{e.signal.aborted||this.#s!==e||this.#p()};try{let n=await Ss(`/admin/live/logs?types=usage`,{signal:e.signal});if(!n.ok||!n.body||typeof n.body.getReader!=`function`){t();return}this.#o=0,await tb(n.body.getReader(),e=>this.#f(e)),t()}catch(n){if(Es(n)||e.signal.aborted)return;console.error(`Live usage stream failed:`,n),t()}}#f(e){if(!e||typeof e!=`object`)return;let t=String(e.type||``).trim();t.indexOf(`usage.`)===0&&this.noteUsageEvent(t)}#p(){if(!this.active||this.#a)return;let{attempt:e,delay:t}=rb(this.#o);this.#o=e,this.#a=setTimeout(()=>{this.#a=null,this.#u()},t)}},yb=B(`
`),bb=B(`
Waiting for live requests…
`),xb=B(`

Live Token Throughput

`);function Sb(e,t){O(t,!0);let n=A(()=>db(vb.buckets,vb.granularity)),r=A(()=>R(n).totals);function i(){return{input:Xy(`var(--token-input)`),output:Xy(`var(--token-output)`),prompt:Xy(`var(--token-prompt)`),local:Xy(`var(--token-local)`)}}let a=[{metric:`input`,label:`Input Tokens`,colorVar:`--token-input`},{metric:`output`,label:`Output Tokens`,colorVar:`--token-output`},{metric:`prompt`,label:`Prompt (Input) Cached`,colorVar:`--token-prompt`},{metric:`local`,label:`Locally Cached`,colorVar:`--token-local`}];var o=xb(),s=P(o),c=P(s),l=I(P(c),2),u=P(l);let d;var f=I(u,2),p=P(f,!0);D(f),D(l),D(c),Gy(I(c,2),{ariaLabel:`Live token throughput granularity`,get options(){return ob},get value(){return vb.granularity},onchange:e=>vb.setGranularity(e)}),D(s);var m=I(s,2);W(m,21,()=>a,e=>e.metric,(e,t)=>{var n=yb(),i=P(n),a=I(i,2),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(n),L(e=>{Bi(i,`background: var(${R(t).colorVar??``})`),H(o,R(t).label),H(c,e)},[()=>pb(R(r),R(t).metric)]),V(e,n)}),D(m);var h=I(m,2),g=P(h);{let e=A(()=>hb(R(r),vb.granularity));Hy(g,{get ariaLabel(){return R(e)},build:()=>gb(qy(),i(),R(n),vb.granularity)})}var _=I(g,2),v=e=>{V(e,bb())},y=A(()=>!fb(R(r)));U(_,e=>{R(y)&&e(v)}),D(h),D(o),L(e=>{d=G(u,1,`live-dot`,null,d,{"is-streaming":vb.active}),H(p,e)},[()=>mb(vb.granularity)]),V(e,o),k()}function Cb(e){let t=e||{};if(t.total_tokens!==null&&t.total_tokens!==void 0){let e=Number(t.total_tokens);if(Number.isFinite(e))return e}let n=Number(t.total_input_tokens||0),r=Number(t.total_output_tokens||0);return(Number.isFinite(n)?n:0)+(Number.isFinite(r)?r:0)}function wb(e,t){if(!t)return 0;let n=e&&e.summary?e.summary:{},r=Number(n.total_hits||0);return Number.isFinite(r)&&r>0?r:0}function Tb(e,t,n){let r=Number(e&&e.total_requests||0);return(Number.isFinite(r)?r:0)+wb(t,n)}function Eb(e,t,n){let r=wb(t,n);return r<=0?``:_c(Tb(e,t,n)-r)+` to providers + `+_c(r)+` from cache`}function Db(e){let t=e&&e.summary?e.summary:{},n=Number(t.total_input_tokens||0),r=Number(t.total_output_tokens||0);return(Number.isFinite(n)?n:0)+(Number.isFinite(r)?r:0)}function Ob(e,t,n){let r=e=>{let t=Number(e||0);return Number.isFinite(t)&&t>0?t:0},i=e||{},a=r(i.uncached_input_tokens),o=r(i.cached_input_tokens),s=r(i.cache_write_input_tokens),c=t&&t.summary?t.summary:{},l=n?r(c.total_input_tokens):0;return[{key:`uncached`,label:`Regular`,tokens:a+s,colorVar:`--cache-meter-uncached`,note:s>0?`Includes `+_c(s)+` cache-write tokens`:``},{key:`prompt`,label:`Prompt cached`,tokens:o,colorVar:`--cache-meter-prompt`,note:`Provider prompt-cache reads`},{key:`local`,label:`Locally cached`,tokens:l,colorVar:`--cache-meter-local`,note:`Served from GoModel response cache`}]}function kb(e,t,n){return Ob(e,t,n).reduce((e,t)=>e+t.tokens,0)}function Ab(e,t,n){return kb(e,t,n)>0}function jb(e,t,n){let r=Ob(e,t,n),i=r.reduce((e,t)=>e+t.tokens,0);if(i<=0)return r.map(e=>Object.assign({},e,{pct:0}));let a=r.map(e=>{let t=e.tokens/i*100,n=Math.floor(t);return Object.assign({},e,{pct:n,remainder:t-n})}),o=100-a.reduce((e,t)=>e+t.pct,0);return a.map((e,t)=>({index:t,remainder:e.remainder,tokens:e.tokens})).filter(e=>e.tokens>0).sort((e,t)=>t.remainder-e.remainder).forEach(e=>{o>0&&(a[e.index].pct+=1,--o)}),a}function Mb(e,t,n){return jb(e,t,n).filter(e=>e.tokens>0)}function Nb(e){let t=[e.label+`: `+_c(e.tokens)+` input tokens (`+e.pct+`%)`];return e.note&&t.push(e.note),t.join(` +`)}function Pb(e){let t=(e||[]).map(e=>e.label+` `+e.pct+`%`);return`Cache breakdown of input tokens — `+(t.length?t.join(`, `):`no data`)}function Fb(e){return e.getUTCFullYear()+`-`+String(e.getUTCMonth()+1).padStart(2,`0`)+`-`+String(e.getUTCDate()).padStart(2,`0`)}function Ib(e,t,n,r){if(t!==`daily`||!n||!r)return e;let i={};(e||[]).forEach(e=>{i[e.date]=e});let a=[];for(let e=new Date(n);e<=r;e.setUTCDate(e.getUTCDate()+1)){let t=Fb(e);a.push(i[t]||{date:t,input_tokens:0,output_tokens:0,total_tokens:0,requests:0,input_cost:null,output_cost:null,total_cost:null})}return a}function Lb(e,t){let n=e=>Number(e)||0,r=e.map(e=>e.date),i=e.map(e=>n(e.uncached_input_tokens)+n(e.cache_write_input_tokens)+n(e.cached_input_tokens)>0?n(e.uncached_input_tokens)+n(e.cache_write_input_tokens):n(e.input_tokens)),a=e.map(e=>n(e.output_tokens)),o=e.map(e=>n(e.cached_input_tokens)),s={};return(t||[]).forEach(e=>{s[e.date]=e}),{labels:r,inputPaid:i,output:a,prompt:o,local:r.map(e=>{let t=s[e];return t?n(t.input_tokens)+n(t.output_tokens):0})}}function Rb(e){let t=e||{},n=Math.max(0,Number(t.uncached_input_tokens)||0),r=Math.max(0,Number(t.cached_input_tokens)||0),i=Math.max(0,Number(t.cache_write_input_tokens)||0),a=n+r+i;return a>0?r/a*100:0}function zb(e){let t=e||{};return(Number(t.uncached_input_tokens)||0)+(Number(t.cached_input_tokens)||0)+(Number(t.cache_write_input_tokens)||0)>0}function Bb(e){return zb(e)?Math.round(Rb(e))+`%`:`—`}function Vb(e,t,n={}){let r=!!n.cacheEnabled,i=n.resolve||(e=>e),a=(e,t)=>i(`color-mix(in srgb, `+e+` `+t+`%, transparent)`),o=(e,t,n,r)=>Object.assign({label:e,data:t,borderColor:n,backgroundColor:n,fill:!1,tension:.3,borderWidth:2,pointRadius:0,pointHoverRadius:4},r||{}),s=[o(`Input Tokens`,t.inputPaid,i(`var(--token-input)`),{fill:`origin`}),o(`Output Tokens`,t.output,i(`var(--token-output)`),{fill:`-1`}),o(`Prompt (Input) Cached`,t.prompt,i(`var(--token-prompt)`),{fill:`-1`,borderDash:[6,4]})];return r&&s.push(o(`Locally Cached`,t.local,a(`var(--info)`,35),{fill:`-1`,borderDash:[2,3]})),{type:`line`,data:{labels:t.labels,datasets:s},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Yy(e,{label:e=>e.dataset.label+`: `+e.parsed.y.toLocaleString(),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+t.toLocaleString()}})},scales:{x:{stacked:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:10}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:ib(e)}}}}}function Hb(e,t,n){let r=Math.max(0,Math.min(100,e));return{type:`doughnut`,data:{datasets:[{data:[r,100-r],backgroundColor:[t,n],borderWidth:0,spacing:0}]},options:{rotation:-90,circumference:180,cutout:`84%`,responsive:!0,maintainAspectRatio:!1,animation:{duration:0},layout:{padding:1},events:[],plugins:{legend:{display:!1},tooltip:{enabled:!1}}}}}var Ub=`gomodel_provider_status_details_expanded`,Wb=`gomodel_provider_card_expanded_overrides`,Gb=3e3,Kb=`https://gomodel.enterpilot.io/docs/providers/`,qb={anthropic:`anthropic`,azure:`azure`,bailian:`bailian`,bedrock:`bedrock`,"bedrock-mantle":`bedrock-mantle`,cohere:`cohere`,deepseek:`deepseek`,elevenlabs:`elevenlabs`,gemini:`gemini`,llmd:`llmd`,opencode_go:`opencode-go`,oracle:`oracle`,sglang:`sglang`,vertex:`vertex`,vllm:`vllm`,xiaomi:`xiaomi`};function Jb(){return{summary:{total:0,healthy:0,degraded:0,unhealthy:0,overall_status:`degraded`},providers:[]}}function Yb(e){let t={detailsExpanded:!1,cardOverrides:{}};try{if(e){let n=e.getItem(Ub);n===`true`||n===`false`?t.detailsExpanded=n===`true`:e.setItem(Ub,`false`);let r=JSON.parse(e.getItem(Wb)||`{}`);r&&typeof r==`object`&&!Array.isArray(r)&&(t.cardOverrides=r)}}catch{}return t}function Xb(e,t){if(e)try{e.setItem(Ub,t?`true`:`false`)}catch{}}function Zb(e,t){if(e)try{e.setItem(Wb,JSON.stringify(t))}catch{}}function Qb(e,t,n){let r=n&&n.name?String(n.name):``;return r&&Object.prototype.hasOwnProperty.call(e,r)?e[r]===!0:t}function $b(e){return`is-`+(String(e&&e.overall_status||`degraded`).trim()||`degraded`)}function ex(e){return`is-`+(String(e||`degraded`).trim()||`degraded`)}function tx(e){let t=e||{};return String(t.healthy||0)+`/`+String(t.total||0)}function nx(e){let t=e||{},n=Number(t.total||0),r=Number(t.healthy||0);return n>0&&rString(e&&e.status_label||``).trim().toLowerCase()===`starting`)}function ax(e){if(!e||!e.runtime)return``;let t=e.runtime.last_model_fetch_at||``,n=e.runtime.last_availability_check_at||``;return t?n&&Date.parse(n)>Date.parse(t)?n:t:n}function ox(e,t){let n=ax(e);if(!n||typeof t!=`function`)return`-`;let r=t(n);if(!r||r===`-`)return`-`;let i=String(r).split(` `);return i.length>1?i.slice(1).join(` `):r}function sx(e,t){let n=ax(e);return n?typeof t==`function`?t(n):String(n):``}function cx(e){if(!e)return``;let t=String(e.name||``).trim(),n=String(e.type||e.config&&e.config.type||``).trim();return!n||n===t?``:n}function lx(e){let t=String(e&&(e.type||e.config&&e.config.type)||``).trim().toLowerCase(),n=t?qb[t]:``;return n?Kb+n+`?utm_source=gomodel_dashboard`:``}function ux(e){let t=e&&e.config&&e.config.resilience?e.config.resilience.retry:null;return t?String(t.max_retries)+` retries, `+t.initial_backoff+` initial, `+t.max_backoff+` max, factor `+t.backoff_factor+`, jitter `+t.jitter_factor:`-`}function dx(e){let t=e&&e.config&&e.config.resilience?e.config.resilience.circuit_breaker:null;return t?String(t.failure_threshold)+` fail, `+String(t.success_threshold)+` success, `+t.timeout+` timeout`:`-`}function fx(e){let t=e&&e.config&&Array.isArray(e.config.models)?e.config.models.filter(Boolean):[];return t.length===0?`Automatic`:t.join(`, `)}function px(e){if(!e)return``;let t=[];return e.status_reason&&t.push(String(e.status_reason)),e.last_error&&t.push(`Last error: `+String(e.last_error)),t.join(` + +`)}function mx(e){let t=e&&e.request_health;return t&&typeof t==`object`?t:null}function hx(e){let t=mx(e);return t?String(t.circuit_state||``).trim():``}function gx(e){let t=hx(e);return t?t.charAt(0).toUpperCase()+t.slice(1):``}function _x(e){let t=hx(e);return t===`open`?`is-unhealthy`:t===`half-open`?`is-degraded`:`is-healthy`}function vx(e){let t=mx(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 yx(e){let t=mx(e);return t&&Array.isArray(t.models)?t.models:[]}function bx(e){return e?String(Number(e.errors||0))+`/`+String(Number(e.requests||0))+` failed`:``}function xx(e){let t=e&&e.last_error;return!t||!t.message?``:(t.status_code?`HTTP `+String(t.status_code)+`: `:``)+t.message}function Sx(){return{name:``,slug:``,url:``,transport:`http`,description:``,enabled:!0,headers:[],allowed_tools:``,disallowed_tools:``,user_paths:``,tool_timeout_seconds:``}}function Cx(){return{server:``,status:``,instructions:``,tools:[],prompts:[],resources:[],templates:[]}}function wx(e){return String(e&&(e.slug||e.name)||``).trim()}function Tx(e){return String(e&&e.status||``).trim()||`connecting`}function Ex(e){switch(Tx(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 Dx(e,t){let n=Tx(e),r=String(e&&e.last_error||``).trim();return r&&n!==`connected`?r:n===`connected`&&e&&e.connected_at?`Connected since `+(typeof t==`function`?t:String)(e.connected_at):``}function Ox(e){return String(e&&e.transport||``)===`stdio`?`local command`:String(e&&e.url||``).trim()||`—`}function kx(e){let t=Number(e&&e.prompt_count||0),n=Number(e&&e.resource_count||0);return t+` prompts · `+n+` resources`}function Ax(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 jx(e){return String(e||``).split(` +`).map(e=>e.trim()).filter(e=>e)}function Mx(e){return!e||typeof e!=`object`||Array.isArray(e)?[]:Object.keys(e).sort().map(t=>({name:t,value:String(e[t]||``)}))}function Nx(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 Px(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 Fx(e){return{name:String(e.name||``).trim(),slug:wx(e),url:String(e.url||``).trim(),transport:e.transport===`sse`?`sse`:`http`,description:String(e.description||``).trim(),enabled:e.enabled!==!1,headers:Mx(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 Ix(e,t,n){let r=String(e.name||``).trim(),i=String(e.slug||Ax(r)).trim().toLowerCase(),a=String(e.url||``).trim(),o=e.transport===`sse`?`sse`:`http`;if(!r)return{error:`Name is required.`};if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(i))return{error:`Slug must use 1–64 lowercase ASCII letters, numbers, hyphens, or underscores.`};if(t===`create`&&(n||[]).some(e=>wx(e)===i))return{error:`Slug "`+i+`" is already in use.`};if(!a)return{error:`URL is required.`};let s,c=String(e.tool_timeout_seconds||``).trim();if(c!==``){let e=Number(c);if(!Number.isSafeInteger(e)||e<0)return{error:`Tool timeout must be a non-negative whole number of seconds.`};s=e}return{payload:{name:r,slug:i,url:a,transport:o,headers:Nx(e.headers),description:String(e.description||``).trim(),enabled:!!e.enabled,allowed_tools:hc(e.allowed_tools),disallowed_tools:hc(e.disallowed_tools),user_paths:jx(e.user_paths),tool_timeout_seconds:s}}}function Lx(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 Rx(e,t){return String(e&&e.server||``)+`_`+String(t||``)}function zx(e){let t=e||Cx(),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:Rx(t,n.name),description:String(n.description||``).trim()});return[{key:`tools`,title:`Tools`,items:(t.tools||[]).map(r(`tool`))},{key:`prompts`,title:`Prompts`,items:(t.prompts||[]).map(r(`prompt`))},{key:`resources`,title:`Resources`,items:(t.resources||[]).map(e=>({key:`resource:`+String(e.uri||``),name:String(e.uri||``),aggregated:``,description:n(e.name,e.description)}))},{key:`templates`,title:`Resource templates`,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 Bx(e){return zx(e).length===0}function Vx(e){return(e||[]).length}function Hx(e){return(e||[]).filter(e=>Tx(e)===`connected`).length}function Ux(e){return(e||[]).filter(e=>e&&e.enabled!==!1&&Tx(e)===`degraded`).length}function Wx(e,t){return!!e&&Vx(t)>0}function Gx(e){return String(Hx(e))+`/`+String(Vx(e))}function Kx(e){return Ux(e)>0?`is-degraded`:`is-healthy`}function qx(e){let t=Ux(e);if(t>0)return String(t)+` server`+(t===1?``:`s`)+` need`+(t===1?`s`:``)+` attention`;let n=Vx(e),r=Hx(e);return n>0&&r===n?`All MCP servers connected`:String(r)+` of `+String(n)+` server`+(n===1?``:`s`)+` connected`}function Jx(){return{interval:`day`,buckets:[],summary:{requests:0},provider_latency:[]}}function Yx(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 Xx(e){return Number(e&&e.summary&&e.summary.requests||0)>0}function Zx(e){return(e&&Array.isArray(e.provider_latency)?e.provider_latency:[]).length>0}function Qx(e){let t=e&&e.summary?e.summary.success_rate:null;return t==null?`—`:(Math.round(Number(t)*1e3)/10).toFixed(1)+`%`}function $x(e,t){return Number(e&&e.summary&&e.summary[t]||0)}function eS(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 tS(e){let t=e&&e.summary?e.summary.avg_duration_ms:null;return t==null?`—`:eS(Number(t))}function nS(e,t){try{let n={};return new Intl.DateTimeFormat(`en-US`,{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)}}catch{return{year:String(e.getFullYear()),month:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][e.getMonth()],day:String(e.getDate()),hour:e.getHours()}}}function rS(e,t,n){let r=new Date(e.start);if(Number.isNaN(r.getTime()))return String(e.start||``);let i=nS(r,n),a=i.month+` `+i.day;return t!==`hour`||i.hour===0?a:String(i.hour).padStart(2,`0`)+`:00`}function iS(e,t,n,r){let i=new Date(e.start);if(Number.isNaN(i.getTime()))return String(e.start||``);if(t===`hour`)return r(e.start);let a=nS(i,n);return a.month+` `+a.day+`, `+a.year}function aS(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 oS(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=>rS(e,r,i)),c=aS(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(`Other`,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:Yy(e,{title:e=>e.length?iS(t[e[0].dataIndex],r,i,o):``,label:e=>e.dataset.label+`: `+e.parsed.y.toLocaleString(),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+t.toLocaleString()}})},scales:{x:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),precision:0,callback:e=>xc(e)}}}}}}function sS(e=Qy()){let t={};return function(n){return n in t||(t[n]=e[Object.keys(t).length%e.length]),t[n]}}function cS(e,t,n,r={}){let i=r.interval===`hour`?`hour`:`day`,a=r.zone,o=r.formatTimestamp||(e=>String(e)),s=r.providerColor||sS();return{type:`line`,data:{labels:t.map(e=>rS(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:Yy(e,{title:e=>e.length?iS(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+`: `+eS(e.parsed.y)+(r>0?` (`+r.toLocaleString()+` req)`:``)}})},scales:{x:{grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),callback:e=>eS(e)}}}}}}var lS=class{#e=j(N(Jb()));get status(){return R(this.#e)}set status(e){M(this.#e,e,!0)}#t=j(!1);get loading(){return R(this.#t)}set loading(e){M(this.#t,e,!0)}#n=j(!1);get loadedOnce(){return R(this.#n)}set loadedOnce(e){M(this.#n,e,!0)}#r=j(!1);get detailsExpanded(){return R(this.#r)}set detailsExpanded(e){M(this.#r,e,!0)}#i=j(N({}));get cardOverrides(){return R(this.#i)}set cardOverrides(e){M(this.#i,e,!0)}#a=null;#o=null;#s=!1;initPreferences(){if(this.#s)return;this.#s=!0;let e=Yb(xa());this.detailsExpanded=e.detailsExpanded,this.cardOverrides=e.cardOverrides}cardExpanded(e){return Qb(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,Zb(xa(),this.cardOverrides)}toggleDetails(){this.detailsExpanded=!this.detailsExpanded,this.cardOverrides={},Xb(xa(),this.detailsExpanded),Zb(xa(),this.cardOverrides)}detailsToggleLabel(){return this.detailsExpanded?`Show Details`:`Hide Details`}async fetch(){this.initPreferences(),this.#a&&this.#a.abort();let e=new AbortController;this.#a=e,this.loading=!0;try{let t=await ws(`/admin/providers/status`,{label:`provider status`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.status=Jb(),this.#l();return}let n=t.data&&typeof t.data==`object`?t.data:Jb();n.summary||=Jb().summary,Array.isArray(n.providers)||(n.providers=[]),this.status=n,this.#c()}catch(e){if(Es(e))return;console.error(`Failed to fetch provider status:`,e),this.status=Jb(),this.#l()}finally{this.#a===e&&(this.#a=null,this.loading=!1,this.loadedOnce=!0)}}#c(){this.#l(),ix(this.status.providers)&&(this.#o=setTimeout(()=>{this.#o=null,this.fetch()},Gb))}#l(){this.#o&&=(clearTimeout(this.#o),null)}stopPolling(){this.#l()}},uS=class{#e=j(N(Jx()));get stats(){return R(this.#e)}set stats(e){M(this.#e,e,!0)}#t=j(!1);get loading(){return R(this.#t)}set loading(e){M(this.#t,e,!0)}#n=0;async fetch(){let e=++this.#n;this.loading=!0;try{let t=await ws(`/admin/audit/stats?`+Uc.queryStr(),{label:`audit stats`});if(t.stale||e!==this.#n)return;if(!t.ok){this.stats=Jx();return}this.stats=Yx(t.data)}catch(t){if(console.error(`Failed to fetch audit stats:`,t),e!==this.#n)return;this.stats=Jx()}finally{e===this.#n&&(this.loading=!1)}}},dS=class{#e=j(N([]));get servers(){return R(this.#e)}set servers(e){M(this.#e,e,!0)}#t=j(!1);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}async fetch(){if(await ks.ensureLoaded(),!ks.mcpVisible()){this.available=!1,this.servers=[];return}this.loading=!0;try{let e=await ws(`/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}}},fS=class{#e=j(N([]));get data(){return R(this.#e)}set data(e){M(this.#e,e,!0)}#t=j(`tokens`);get mode(){return R(this.#t)}set mode(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(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 ws(`/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(Es(e))return;console.error(`Failed to fetch calendar data:`,e),this.data=[]}finally{this.#r===e&&(this.#r=null,this.loading=!1)}}},pS=new lS,mS=new uS,hS=new dS,gS=new fS,_S=(e,t=f,n=f,r=f,i=f)=>{var a=yS(),o=P(a),s=P(o,!0);D(o);var c=I(o,2),l=P(c),u=P(l),d=P(u,!0);D(u),Ve(),D(l);var p=I(l,4),m=P(p),h=P(m,!0);D(m),Ve(),D(p);var g=I(p,4),_=P(g,!0);D(g),D(c),D(a),L((e,n,r,i,a,o)=>{H(s,t()),K(l,`title`,e),H(d,n),K(p,`title`,r),H(h,i),K(g,`title`,a),H(_,o)},[()=>Sc(`Input tokens`,n()),()=>xc(n()),()=>Sc(`Output tokens`,r()),()=>xc(r()),()=>Sc(`Total tokens`,i()),()=>xc(i())]),V(e,a)},vS=(e,t=f,n=f,r=f,i=f,a=f,o=f)=>{var s=SS(),c=P(s),l=P(c,!0);D(c);var u=I(c,2),d=P(u,!0);D(u);var p=I(u,2),m=e=>{var t=bS(),n=P(t,!0);D(t),L(()=>{K(t,`aria-label`,o().title),K(t,`title`,o().title),H(n,a())}),z(`click`,t,function(...e){o().onclick?.apply(this,e)}),V(e,t)},h=e=>{var t=xS(),n=P(t,!0);D(t),L(()=>H(n,a())),V(e,t)};U(p,e=>{o()?e(m):e(h,-1)}),D(s),L(()=>{G(s,1,`card provider-status-flag ${t()??``} ${n()??``}`,`svelte-6tr9cf`),H(l,r()),H(d,i())}),V(e,s)},yS=B(`
i + o =
`),bS=B(``),xS=B(` `),SS=B(`
`),CS=B(`
Cache Hits
`),wS=B(`
Total Requests
Estimated Cost
Prompt Cache Rate
`);function TS(e,t){O(t,!0);let n=A(()=>Yc.summary),r=A(()=>Yc.cacheOverview),i=A(()=>Yc.cacheAnalyticsEnabled()),a=A(()=>pS.status.summary);function o(){let e=document.getElementById(`provider-status-section`);e&&(e.scrollIntoView({behavior:`smooth`,block:`start`}),e.focus({preventScroll:!0}))}var s=wS(),c=P(s);{let e=A(()=>Cb(R(n)));_S(c,()=>`Tokens`,()=>R(n).total_input_tokens,()=>R(n).total_output_tokens,()=>R(e))}var l=I(c,2),u=I(P(l),2),d=P(u,!0);D(u),D(l);var f=I(l,2),p=e=>{var t=CS(),n=I(P(t),2),i=P(n,!0);D(n),D(t),L(e=>H(i,e),[()=>_c(R(r).summary.total_hits)]),V(e,t)};U(f,e=>{R(i)&&e(p)});var m=I(f,2),h=I(P(m),2),g=P(h,!0);D(h),D(m);var _=I(m,2),v=e=>{{let t=A(()=>Db(R(r)));_S(e,()=>`Local Cache`,()=>R(r).summary.total_input_tokens,()=>R(r).summary.total_output_tokens,()=>R(t))}};U(_,e=>{R(i)&&e(v)});var y=I(_,2),b=I(P(y),2),x=P(b);Hy(x,{build:()=>Hb(Rb(R(n)),Xy(`var(--token-prompt)`),Xy(`var(--bg-surface-hover)`))});var S=I(x,2),C=P(S,!0);D(S),D(b),D(y);var w=I(y,2),T=e=>{{let t=A(()=>$b(R(a))),n=A(()=>tx(R(a))),r=A(()=>rx(R(a))),i=A(()=>nx(R(a))?{title:`View providers overview`,onclick:o}:null);vS(e,()=>`provider-status-overview-card`,()=>R(t),()=>`Provider Status`,()=>R(n),()=>R(r),()=>R(i))}};U(w,e=>{R(a).total>0&&e(T)});var E=I(w,2),ee=e=>{{let t=A(()=>Kx(hS.servers)),n=A(()=>Gx(hS.servers)),r=A(()=>qx(hS.servers));vS(e,()=>`mcp-servers-flag`,()=>R(t),()=>`MCP Servers`,()=>R(n),()=>R(r),()=>({title:`View MCP servers`,onclick:()=>Yo.navigate(`mcp-servers`)}))}},te=A(()=>Wx(hS.available,hS.servers));U(E,e=>{R(te)&&e(ee)}),D(s),L((e,t,n,r,i)=>{K(u,`title`,e),H(d,t),H(g,n),K(b,`aria-label`,r),H(C,i)},[()=>Eb(R(n),R(r),R(i)),()=>_c(Tb(R(n),R(r),R(i))),()=>vc(R(n).total_cost),()=>`Prompt cache rate `+Bb(R(n)),()=>Bb(R(n))]),V(e,s),k()}Br([`click`]);var ES=B(` `),DS=B(`
`),OS=B(`No usage in the selected period yet`),kS=B(`
`),AS=B(`

Tokens

Share of input tokens over the selected period
`);function jS(e,t){O(t,!0);let n=A(()=>Yc.cacheAnalyticsEnabled()),r=A(()=>jb(Yc.summary,Yc.cacheOverview,R(n))),i=A(()=>Mb(Yc.summary,Yc.cacheOverview,R(n))),a=A(()=>Ab(Yc.summary,Yc.cacheOverview,R(n)));var o=AS(),s=I(P(o),2);let c;var l=P(s);W(l,17,()=>R(i),e=>e.key,(e,t)=>{var n=DS(),r=P(n),i=e=>{var n=ES(),r=P(n);D(n),L(()=>H(r,`${R(t).pct??``}%`)),V(e,n)};U(r,e=>{R(t).pct>=8&&e(i)}),D(n),L(e=>{Bi(n,`width: ${R(t).pct??``}%; background: var(${R(t).colorVar??``})`),K(n,`title`,e)},[()=>Nb(R(t))]),V(e,n)});var u=I(l,2),d=e=>{V(e,OS())};U(u,e=>{R(a)||e(d)}),D(s);var f=I(s,2);W(f,21,()=>R(r),e=>e.key,(e,t)=>{var n=kS(),r=P(n),i=I(r,2),a=P(i,!0);D(i);var o=I(i,2),s=P(o);D(o);var c=I(o,2),l=P(c,!0);D(c),D(n),L((e,i)=>{K(n,`title`,e),Bi(r,`background: var(${R(t).colorVar??``})`),H(a,R(t).label),H(s,`${R(t).pct??``}%`),H(l,i)},[()=>Nb(R(t)),()=>_c(R(t).tokens)]),V(e,n)}),D(f),D(o),L(e=>{c=G(s,1,`cache-meter-bar svelte-1yzecxj`,null,c,{"is-empty":!R(a)}),K(s,`aria-label`,e)},[()=>Pb(R(i))]),V(e,o),k()}var MS=B(``);function NS(e,t){let n=q(t,`size`,3,16),r=q(t,`label`,3,`Loading`),i=q(t,`class`,3,``);var a=MS();L(()=>{G(a,1,Ni([`spinner`,i()]),`svelte-b54l9o`),Bi(a,`--spinner-size: ${n()??``}px`),K(a,`aria-label`,r())}),V(e,a)}var PS=Jr(` `),FS=Jr(``);function IS(e,t){let n=q(t,`label`,3,`No data`);var r=FS(),i=I(P(r),9),a=e=>{var t=PS(),r=P(t,!0);D(t),L(()=>H(r,n())),V(e,t)};U(i,e=>{n()&&e(a)}),D(r),L(()=>{K(r,`role`,n()?`img`:void 0),K(r,`aria-label`,n()||void 0),K(r,`aria-hidden`,n()?void 0:`true`)}),V(e,r)}var LS=B(`
`),RS=B(`

`);function zS(e,t){O(t,!0);let n=[`daily`,`weekly`,`monthly`,`yearly`];function r(e){Uc.interval=e,t.onintervalchange?.()}function i(){let e=Yc.daily;if(e.length===0)return null;let t=Uc.rangeStart(),n=Uc.rangeEnd(),r=Lb(Ib(e,Uc.interval,t,n),Ib(Array.isArray(Yc.cacheOverview.daily)?Yc.cacheOverview.daily:[],Uc.interval,t,n));return Vb(qy(),r,{cacheEnabled:Yc.cacheAnalyticsEnabled(),resolve:Xy})}var a=RS(),o=P(a),s=P(o),c=P(s,!0);D(s);var l=I(s,2);{let e=A(()=>n.map(e=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})));Gy(l,{ariaLabel:`Usage chart interval`,get options(){return R(e)},get value(){return Uc.interval},onchange:r})}D(o);var u=I(o,2),d=P(u);Hy(d,{build:i});var f=I(d,2),p=e=>{var t=LS();NS(P(t),{size:24,label:`Loading usage`}),D(t),V(e,t)},m=e=>{var t=LS();IS(P(t),{}),D(t),V(e,t)};U(f,e=>{Yc.daily.length===0&&Yc.loading?e(p):Yc.daily.length===0&&!Y.authError&&e(m,1)}),D(u),D(a),L(e=>H(c,e),[()=>Uc.chartTitle()]),V(e,a),k()}var BS=10,VS=.7;function HS(e,t){if(e<=0||t<=0)return 0;let n=(e/t)**+VS,r=Math.ceil(n*BS);return r<1?1:r>BS?BS:r}function US(){let e=[];for(let t=0;t<=BS;t++)e.push(t);return e}function WS(e,t,n){let r={};(e||[]).forEach(e=>{r[e.date]=e});let i=as(ss(n,-364)),a=i.getUTCDay();i.setUTCDate(i.getUTCDate()-a);let o=[];for(let e=new Date(i);os(e)<=n;e.setUTCDate(e.getUTCDate()+1)){let n=os(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 GS(e){let t=as(ss(e,-364)),n=t.getUTCDay();t.setUTCDate(t.getUTCDate()-n);let r=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],i=[],a={},o=0;for(let n=new Date(t);os(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),os(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[t.getUTCMonth()],col:o,key:s}),a[s]=!0)}for(let e=0;e `),YS=B(`
`),XS=B(`
`),ZS=B(`
`),QS=B(`
`),$S=B(`

Activity

Mon Wed Fri
`,1);function eC(e,t){O(t,!0);let n=j(N({show:!1,x:0,y:0,text:``})),r=A(()=>vs.currentDateKey()),i=A(()=>WS(gS.data,gS.mode,R(r))),a=A(()=>GS(R(r)));function o(e,t){t.empty||M(n,{show:!0,x:e.clientX,y:e.clientY,text:qS(t,gS.mode)},!0)}function s(){M(n,{show:!1,x:0,y:0,text:``},!0)}var c=$S(),l=F(c),u=P(l),d=I(P(u),2),f=e=>{NS(e,{size:14,label:`Loading activity`})};U(d,e=>{gS.loading&&gS.data.length===0&&e(f)}),Gy(I(d,2),{ariaLabel:`Activity calendar mode`,options:[{value:`tokens`,label:`Tokens`},{value:`costs`,label:`Costs`}],get value(){return gS.mode},onchange:e=>gS.mode=e}),D(u);var p=I(u,2),m=I(P(p),2),h=P(m);W(h,21,()=>R(a),e=>e.key,(e,t)=>{var n=JS(),r=P(n,!0);D(n),L(()=>{Bi(n,`grid-column: ${R(t).col+1} / span ${R(t).span??``}`),H(r,R(t).label)}),V(e,n)}),D(h);var g=I(h,2);W(g,21,()=>R(i),ii,(e,t,n)=>{var r=XS();W(r,23,()=>R(t),(e,t)=>n+`-`+t,(e,t)=>{var n=YS();L(()=>G(n,1,Ni([`contribution-calendar-cell`,R(t).empty?`empty`:`level-${R(t).level}`]),`svelte-3hfxuq`)),zr(`mouseenter`,n,e=>o(e,R(t))),zr(`mouseleave`,n,s),V(e,n)}),D(r),V(e,r)}),D(g),D(m),D(p);var _=I(p,2),v=P(_),y=P(v),b=P(y,!0);D(y),D(v);var x=I(v,2);W(I(P(x),2),16,US,e=>e,(e,t)=>{var n=ZS();L(()=>G(n,1,`contribution-calendar-cell level-${t??``}`,`svelte-3hfxuq`)),V(e,n)}),Ve(2),D(x),D(_),D(l);var S=I(l,2),C=e=>{var t=QS(),r=P(t,!0);D(t),L(()=>{Bi(t,`left: ${R(n).x??``}px; top: ${R(n).y-40}px`),H(r,R(n).text)}),V(e,t)};U(S,e=>{R(n).show&&e(C)}),L(e=>H(b,e),[()=>KS(gS.data,gS.mode)]),V(e,c),k()}var tC=B(``),nC=B(`

`),rC=B(`
`);function iC(e,t){O(t,!0);let n=q(t,`label`,3,`help`),r=q(t,`text`,3,``),i=q(t,`open`,15,!1),a=q(t,`external`,3,!1),o=A(()=>!!r()||!!t.help||a());var s=rC(),c=P(s),l=P(c);mi(l,()=>t.title??f);var u=I(l,2),d=e=>{var r=tC();let a;L(()=>{a=G(r,1,`inline-help-toggle svelte-y40or3`,null,a,{"is-open":i()}),K(r,`aria-label`,(i()?`Hide `:`Show `)+n()),K(r,`aria-expanded`,i()),K(r,`aria-controls`,t.copyId)}),z(`click`,r,()=>i(!i())),V(e,r)};U(u,e=>{R(o)&&e(d)}),mi(I(u,2),()=>t.extra??f),D(c);var p=I(c,2),m=e=>{var n=nC(),i=P(n),a=e=>{var n=Xr();mi(F(n),()=>t.help),V(e,n)},o=e=>{var t=Yr();L(()=>H(t,r())),V(e,t)};U(i,e=>{t.help?e(a):e(o,-1)}),D(n),L(()=>K(n,`id`,t.copyId)),V(e,n)};U(p,e=>{i()&&R(o)&&!a()&&e(m)}),D(s),V(e,s),k()}Br([`click`]);var aC=B(`

Provider Latency

`),oC=B(`
Avg
`),sC=B(`

Requests by Status

Success 2xx 4xx 5xx
`,1);function cC(e,t){O(t,!0);let n=sS(),r=A(()=>mS.stats);function i(){return{interval:R(r).interval,zone:vs.effectiveTimezone(),resolve:Xy,formatTimestamp:e=>vs.formatTimestamp(e)}}var a=Xr(),o=F(a),s=e=>{var t=sC(),a=F(t),o=P(a),s=I(P(o),2),c=P(s),l=I(P(c),2),u=P(l,!0);D(l),D(c);var d=I(c,2),f=I(P(d),4),p=P(f,!0);D(f),D(d);var m=I(d,2),h=I(P(m),4),g=P(h,!0);D(h),D(m);var _=I(m,2),v=I(P(_),4),y=P(v,!0);D(v),D(_),D(s),D(o);var b=I(o,2);Hy(P(b),{build:()=>oS(qy(),R(r).buckets,i())}),D(b),D(a);var x=I(a,2),S=e=>{var t=oC(),a=P(t),o=P(a);iC(o,{copyId:`audit-latency-help-copy`,label:`provider latency help`,text:`Average duration of successful requests as measured at the gateway, per provider. Local cache hits and failed requests are excluded; streamed responses count until the stream completes.`,title:e=>{V(e,aC())},$$slots:{title:!0}});var s=I(o,2),c=P(s),l=I(P(c),2),u=P(l,!0);D(l),D(c),D(s),D(a);var d=I(a,2);Hy(P(d),{build:()=>cS(qy(),R(r).buckets,R(r).provider_latency,{...i(),providerColor:n})}),D(d),D(t),L(e=>H(u,e),[()=>tS(R(r))]),V(e,t)},C=A(()=>Zx(R(r)));U(x,e=>{R(C)&&e(S)}),L((e,t,n,r)=>{H(u,e),H(p,t),H(g,n),H(y,r)},[()=>Qx(R(r)),()=>_c($x(R(r),`status_2xx`)),()=>_c($x(R(r),`status_4xx`)),()=>_c($x(R(r),`status_5xx`))]),V(e,t)},c=A(()=>Xx(R(r)));U(o,e=>{R(c)&&e(s)}),V(e,a),k()}var lC=(e,t=f,n=f,r)=>{let i=Et(()=>h(r?.(),!1));var a=fC(),o=P(a),s=P(o,!0);D(o);var c=I(o,2),l=e=>{var t=uC(),r=P(t,!0);D(t),L(()=>H(r,n())),V(e,t)},u=e=>{var t=dC(),r=P(t,!0);D(t),L(()=>H(r,n())),V(e,t)};U(c,e=>{R(i)?e(l):e(u,-1)}),D(a),L(()=>H(s,t())),V(e,a)},uC=B(` `),dC=B(` `),fC=B(`
`),pC=B(`

`),mC=B(`
Breaker State
`),hC=B(`
`),gC=B(`
Models (Recent Traffic)
`),_C=B(`
`),vC=B(`

`);function yC(e,t){O(t,!0);let n=A(()=>_x(t.provider)),r=A(()=>[[`Base URL`,t.provider.config?.base_url],[`API Version`,t.provider.config?.api_version]].filter(([,e])=>!!e));var i=vC();let a;var o=P(i),s=P(o),c=P(s,!0);D(s);var l=I(s,2),u=e=>{var n=pC(),r=P(n,!0);D(n),L(()=>H(r,t.provider.last_error)),V(e,n)};U(l,e=>{t.provider.last_error&&e(u)});var d=I(l,2),f=e=>{var r=_C(),i=P(r);{let e=A(()=>vx(t.provider));lC(i,()=>`Recent Requests`,()=>R(e))}var a=I(i,2),o=e=>{var r=mC(),i=I(P(r),2),a=P(i),o=P(a,!0);D(a),D(i),D(r),L(e=>{G(a,1,Ni([`provider-status-health-state`,R(n)]),`svelte-6y9wjv`),H(o,e)},[()=>gx(t.provider)]),V(e,r)},s=A(()=>hx(t.provider));U(a,e=>{R(s)&&e(o)});var c=I(a,2),l=e=>{var n=gC(),r=I(P(n),2);W(r,21,()=>yx(t.provider),e=>e.model,(e,t)=>{var n=hC();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i,2),s=P(o,!0);D(o),D(n),L((e,i)=>{r=G(n,1,`provider-status-health-model svelte-6y9wjv`,null,r,{"is-flagged":R(t).flagged}),K(n,`title`,e),H(a,R(t).model),H(s,i)},[()=>xx(R(t)),()=>bx(R(t))]),V(e,n)}),D(r),D(n),V(e,n)},u=A(()=>yx(t.provider).length>0);U(c,e=>{R(u)&&e(l)}),D(r),V(e,r)},p=A(()=>mx(t.provider));U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=P(m);W(h,17,()=>R(r),([e,t])=>e,(e,t)=>{var n=A(()=>g(R(t),2));lC(e,()=>R(n)[0],()=>R(n)[1],()=>!0)});var _=I(h,2);{let e=A(()=>fx(t.provider));lC(_,()=>`Configured Models`,()=>R(e))}var v=I(_,2);{let e=A(()=>ux(t.provider));lC(v,()=>`Retry`,()=>R(e))}var y=I(v,2);{let e=A(()=>dx(t.provider));lC(y,()=>`Circuit Breaker`,()=>R(e))}D(m),D(o),D(i),L(()=>{a=G(i,1,`provider-status-details svelte-6y9wjv`,null,a,{"is-expanded":t.expanded,"is-collapsed":!t.expanded}),K(i,`aria-hidden`,!t.expanded),H(c,t.provider.status_reason)}),V(e,i),k()}var bC=B(` `),xC=B(``),SC=B(`

Models Available
Last Checked
`);function CC(e,t){O(t,!0);let n=A(()=>pS.cardExpanded(t.provider)),r=e=>vs.formatTimestamp(e);var i=SC(),a=P(i),o=P(a),s=P(o),c=P(s),l=P(c,!0);D(c);var u=I(c,2),d=e=>{var n=bC(),r=P(n);D(n),L(e=>H(r,`(${e??``})`),[()=>cx(t.provider)]),V(e,n)},f=A(()=>cx(t.provider));U(u,e=>{R(f)&&e(d)});var p=I(u,2),m=e=>{var n=xC();L((e,t,r)=>{K(n,`href`,e),K(n,`aria-label`,t),K(n,`title`,r)},[()=>lx(t.provider),()=>`View `+(cx(t.provider)||t.provider.name)+` provider docs`,()=>`View `+(cx(t.provider)||t.provider.name)+` provider docs`]),V(e,n)},h=A(()=>lx(t.provider));U(p,e=>{R(h)&&e(m)}),D(s),D(o);var g=I(o,2),_=P(g,!0);D(g),D(a);var v=I(a,2),y=P(v),b=I(P(y),2),x=P(b,!0);D(b),D(y);var S=I(y,2),C=I(P(S),2),w=P(C,!0);D(C),D(S),D(v);var T=I(v,2);yC(T,{get provider(){return t.provider},get expanded(){return R(n)}});var E=I(T,2);let ee;J(P(E),{get icon(){return Va},class:`provider-status-card-toggle-icon`}),D(E),D(i),L((e,r,i,a,o)=>{H(l,t.provider.name),G(g,1,`provider-status-pill ${e??``}`,`svelte-nopjmh`),K(g,`title`,r),H(_,t.provider.status_label),H(x,i),K(C,`title`,a),H(w,o),ee=G(E,1,`provider-status-card-toggle svelte-nopjmh`,null,ee,{"is-expanded":R(n)}),K(E,`aria-expanded`,R(n)),K(E,`aria-label`,(R(n)?`Collapse `:`Expand `)+t.provider.name+` details`),K(E,`title`,R(n)?`Collapse details`:`Expand details`)},[()=>ex(t.provider.status),()=>px(t.provider),()=>_c(t.provider.runtime?.discovered_model_count),()=>sx(t.provider,r),()=>ox(t.provider,r)]),z(`click`,E,()=>pS.toggleCard(t.provider)),V(e,i),k()}Br([`click`]);var wC=B(`

Providers Overview

`),TC=B(`
`);function EC(e,t){O(t,!0);let n=A(()=>pS.status.providers);var r=Xr(),i=F(r),a=e=>{var t=wC(),r=P(t),i=I(P(r),2),a=P(i),o=P(a,!0);D(a);var s=I(a,2);let c;D(i),D(r);var l=I(r,2);W(l,21,()=>R(n),e=>e.name,(e,t)=>{CC(e,{get provider(){return R(t)}})}),D(l),D(t),L((e,t)=>{K(i,`aria-checked`,pS.detailsExpanded),K(i,`title`,e),H(o,t),c=G(s,1,`provider-status-toggle-track svelte-1kx3uw4`,null,c,{"is-active":pS.detailsExpanded})},[()=>pS.detailsToggleLabel(),()=>pS.detailsToggleLabel()]),z(`click`,i,()=>pS.toggleDetails()),V(e,t)},o=e=>{var t=TC();NS(P(t),{size:18,label:`Loading provider status`}),D(t),V(e,t)};U(i,e=>{R(n).length>0?e(a):pS.loading&&!pS.loadedOnce&&e(o,1)}),V(e,r),k()}Br([`click`]);var DC=B(`
`);function OC(e,t){O(t,!0);function n(){Yc.fetchUsage(),Yc.fetchCacheOverview(``),mS.fetch(),pS.fetch(),hS.fetch(),gS.fetch()}function r(){Yc.fetchUsage(),Yc.fetchCacheOverview(``),mS.fetch()}function i(){r(),gS.fetch()}On(()=>{if(Y.refreshTick,Yo.page===`overview`)return wr(()=>{n(),vb.start()}),()=>{vb.stop(),pS.stopPolling()}});var a=DC(),o=P(a);Sb(o,{});var s=I(o,4);fl(P(s),{onchange:i}),D(s);var c=I(s,2);Kc(c,{});var l=I(c,2);TS(l,{});var u=I(l,2);jS(u,{});var d=I(u,2);zS(d,{onintervalchange:r});var f=I(d,2);eC(f,{});var p=I(f,2);cC(p,{}),EC(I(p,2),{}),D(a),V(e,a),k()}var kC=`/admin/live/logs?types=audit,usage`;function AC(e,t,n){return!!t&&String(e&&e.id||``).trim()===t||!!n&&String(e&&e.request_id||``).trim()===n}function jC(e){switch(e){case`date_range`:return`Live paused — the selected date range does not include today. Set it to today to resume.`;case`filters`:return`Live paused while filters are active. Clear them to resume.`;case`pagination`:return`Live paused on later pages. Go to the first page to resume.`;default:return``}}function MC(e){let t=kC,n=Number(e||0);return Number.isFinite(n)&&n>0&&(t+=`&cursor=`+encodeURIComponent(String(n))),t}function NC(){return{async consumeLiveLogsBody(e){await tb(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},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=>AC(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;eAC(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=>!AC(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(!AC(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=>!AC(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 PC={"audit.started":10,"audit.updated":20,"audit.stream":20,"audit.completed":30,"audit.failed":40,"audit.flushed":40,"audit.detail":40},FC=new Set(Object.keys(PC));function IC(e){return String(e&&(e.id||e.request_id)||``).trim()}function LC(e,t){let n=e&&typeof e==`object`?e:{},r=t&&typeof t==`object`?t:{},i={...n,...r};r.data==null&&n.data!=null?i.data=n.data:BC(n.data)&&BC(r.data)&&(i.data={...n.data,...r.data});let a=String(n._live_state||``).trim(),o=String(r._live_state||``).trim();return(PC[a]||0)>(PC[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&&BC(i.data)&&(i.data.request_body!==void 0||i.data.response_body!==void 0)&&(i.bodies_omitted=!1),i}function RC(e,t){let n=Number(t||0);return(Array.isArray(e)?e:[]).filter(e=>Number(e&&e.version||0)>n)}function zC(e){return FC.has(String(e&&e.eventType||``).trim())}function BC(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}var VC=200,HC=class{#e=j(N({entries:[],total:0,limit:25,offset:0}));get auditLog(){return R(this.#e)}set auditLog(e){M(this.#e,e,!0)}#t=j(N({entries:[],total:0,limit:50,offset:0}));get usageLog(){return R(this.#t)}set usageLog(e){M(this.#t,e,!0)}#n=j(N({}));get auditRecords(){return R(this.#n)}set auditRecords(e){M(this.#n,e,!0)}#r=j(N([]));get auditRecordChanges(){return R(this.#r)}set auditRecordChanges(e){M(this.#r,e,!0)}auditRecordVersion=0;auditRecordPins=new Set;#i=j(``);get auditSearch(){return R(this.#i)}set auditSearch(e){M(this.#i,e,!0)}#a=j(``);get auditMethod(){return R(this.#a)}set auditMethod(e){M(this.#a,e,!0)}#o=j(``);get auditStatusCode(){return R(this.#o)}set auditStatusCode(e){M(this.#o,e,!0)}#s=j(``);get auditStream(){return R(this.#s)}set auditStream(e){M(this.#s,e,!0)}#c=j(Sa(`gomodel_audit_group_sessions`,`true`)!==`false`);get auditGroupSessions(){return R(this.#c)}set auditGroupSessions(e){M(this.#c,e,!0)}#l=j(N({}));get auditThreadChildren(){return R(this.#l)}set auditThreadChildren(e){M(this.#l,e,!0)}#u=j(``);get usageLogSearch(){return R(this.#u)}set usageLogSearch(e){M(this.#u,e,!0)}#d=j(``);get usageFilterModel(){return R(this.#d)}set usageFilterModel(e){M(this.#d,e,!0)}#f=j(``);get usageFilterProvider(){return R(this.#f)}set usageFilterProvider(e){M(this.#f,e,!0)}#p=j(``);get usageFilterLabel(){return R(this.#p)}set usageFilterLabel(e){M(this.#p,e,!0)}#m=j(``);get usageFilterUserPath(){return R(this.#m)}set usageFilterUserPath(e){M(this.#m,e,!0)}#h=j(!1);get usageLogHideCached(){return R(this.#h)}set usageLogHideCached(e){M(this.#h,e,!0)}#g=j(!1);get liveLogsStreaming(){return R(this.#g)}set liveLogsStreaming(e){M(this.#g,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=IC(e);if(!n)return e;let r=LC(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():IC(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<=VC)return;let t={...this.auditRecords},n=e.length-VC;for(let r of e){if(n<=0)break;this.auditRecordPins.has(r)||(delete t[r],n--)}this.auditRecords=t}get page(){return Yo.page}get customStartDate(){return Uc.customStartDate}get customEndDate(){return Uc.customEndDate}get followsToday(){return Uc.followsToday}liveLogsEnabled(){return ks.liveLogsVisible()}async startLiveLogs(){typeof fetch!=`function`||typeof ReadableStream>`u`||(await ks.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=MC(this.liveLogsLastSeq),r=Y.generation;try{let i=await Ss(n,t);if(i.status===401){if(Y.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 ws(`/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(HC.prototype,NC());var UC=new HC;if(typeof window<`u`){let e=!1;window.addEventListener(`pagehide`,()=>{e=!!UC.liveLogsController,UC.stopLiveLogs()}),window.addEventListener(`pageshow`,t=>{t.persisted&&e&&UC.ensureLiveLogs()})}var WC=null;An(()=>{On(()=>{let e=Y.refreshTick;if(WC===null){WC=e;return}e!==WC&&(WC=e,wr(()=>{UC.stopLiveLogs(),UC.startLiveLogs()}))})});function GC(){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 KC(){return{entries:[],total:0,limit:50,offset:0}}function qC(e,t){let n=[[`model`,e&&e.model],[`provider`,e&&e.provider],[`label`,e&&e.label],[`user_path`,e&&e.user_path]],r=``;for(let[e,i]of n)!i||e===t||(r+=`&`+e+`=`+encodeURIComponent(i));return r}function JC({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 YC(e,t){let n=new Set(e||[]);return t&&n.add(t),[...n].sort()}function XC(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 ZC(e,t,n){let r=n?e:t,i=Number(r&&r.total_requests||0);return Number.isFinite(i)?i:0}function QC(e,t,n){let r=XC(e,t);return r<=0?``:n?_c(r)+` cached requests hidden`:_c(Number(e&&e.total_requests||0))+` to providers + `+_c(r)+` from cache`}function $C(e){let t=e||{};return t.total_input_cost===null||t.total_input_cost===void 0?``:vc(t.total_input_cost)+` input + `+vc(t.total_output_cost)+` output`}function ew(e){let t=Number(e&&e.rewrite_tokens_saved||0);return Number.isFinite(t)&&t>0?t:0}function tw(e){return ew(e)>0}function nw(e){let t=e||{};return t.rewrite_cost_saved===void 0?null:t.rewrite_cost_saved}function rw(){return`Estimated at 4 net characters removed per token`}function iw(e,t){return t===`costs`?vc(nw(e)):xc(ew(e))}function aw(e,t){let n=t===`costs`,r=n?Number(nw(e)):ew(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 ow(e,t){let n=aw(e,t);return n===null?``:(n<.1?`<0.1`:n.toFixed(1))+`% less`}function sw(e,t){let n=ew(e);if(n<=0)return``;let r=[_c(n)+` estimated prompt token-transmissions removed across provider requests`,rw(),`Savings are summed per provider request; resent conversation history is counted again`],i=nw(e);i!=null&&(r.push(vc(i)+` estimated gross input cost avoided`),r.push(`Prompt-cache changes caused by rewriting are not included`));let a=ow(e,t);return a&&r.push(a+` than the same traffic without rewriting (`+(t===`costs`?`cost`:`tokens`)+`)`),r.join(` +`)}function cw(e){return String(e&&e.cost_source||``).trim()}function lw(e){let t=cw(e);return t===`openrouter_credits`||t===`xai_cost_in_usd_ticks`}function uw(e){switch(cw(e)){case`openrouter_credits`:return`Costs from OpenRouter USD-based credits.`;case`xai_cost_in_usd_ticks`:return`Costs from xAI usage.cost_in_usd_ticks.`;default:return``}}function dw(e){return String(e&&e.cache_type||``).trim().toLowerCase()}function fw(e){let t=dw(e);return t===`exact`||t===`semantic`}function pw(e){let t=dw(e);return t===`exact`?`Exact`:t===`semantic`?`Semantic`:`-`}function mw(e,t){let n=t?String(t):``;return fw(e)?n?`Saved by cache — not charged +`+n:`Saved by cache — not charged`:n}function hw(e){let t=Number(e&&e.cached_input_ratio);return!Number.isFinite(t)||t<=0?0:Math.min(1,t)}function gw(e){return Number(e&&e.cached_input_tokens||0)>0}function _w(e){return gw(e)?(hw(e)*100).toFixed(1)+`%`:``}function vw(e){if(!gw(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=[_c(t)+` cached / `+_c(i)+` input tokens`];return r>0&&a.push(_c(r)+` cache write`),a.join(` +`)}function yw(e){let t=[];if(uw(e)&&(t.push(uw(e)),t.push(``)),t.push(`Input: `+vc(e.input_cost)),t.push(`Output: `+vc(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):_c(r);t.push(e+`: `+i)}}return t.join(` +`)}function bw(e){return Array.isArray(e&&e.labels)?e.labels:[]}function xw(e,t,n){return(e||[]).length>0||t?!0:(n||[]).some(e=>bw(e).length>0)}function Sw(e){return e&&typeof e.total_tokens==`number`?e.total_tokens:(e&&e.input_tokens||0)+(e&&e.output_tokens||0)}function Cw(e,t){return t?e.total_cost||0:Sw(e)}function ww(e,t){return[...e||[]].sort((e,n)=>t?(n.total_cost||0)-(e.total_cost||0):Cw(n,t)-Cw(e,t))}function Tw(e){let t=Array.isArray(e)?e:[];if(t.length===0)return!1;if(t.length!==1)return!0;let n=String(t[0]&&t[0].user_path||``).trim();return n!==``&&n!==`/`}function Ew(e){return(e||`chart`)===`chart`||e===`stacked`}function Dw(e,t,n){let r=ww(e,n),i=e=>Number(e)||0,a=e=>n?Math.min(i(e.cached_input_cost),i(e.input_cost)):i(e.cached_input_tokens),o=e=>n?i(e.input_cost)-a(e):i(e.uncached_input_tokens)+i(e.cached_input_tokens)+i(e.cache_write_input_tokens)>0?i(e.uncached_input_tokens)+i(e.cache_write_input_tokens):i(e.input_tokens),s=e=>i(n?e.output_cost:e.output_tokens),c=e=>n?0:i(e.local_cached_input_tokens),l=e=>n?0:i(e.local_cached_output_tokens),u=r.slice(0,10),d=r.slice(10),f=u.map(t),p=u.map(o),m=u.map(s),h=u.map(a),g=u.map(c),_=u.map(l);if(d.length>0){f.push(`Other`);let e=e=>d.reduce((t,n)=>t+e(n),0);p.push(e(o)),m.push(e(s)),h.push(e(a)),g.push(e(c)),_.push(e(l))}return{labels:f,inputs:p,outputs:m,prompts:h,localIns:g,localOuts:_}}function Ow(e){return Math.max(200,e*32+72)}var kw=new class{#e=j(`tokens`);get usageMode(){return R(this.#e)}set usageMode(e){M(this.#e,e,!0)}get usageFilterModel(){return UC.usageFilterModel}set usageFilterModel(e){UC.usageFilterModel=e}get usageFilterProvider(){return UC.usageFilterProvider}set usageFilterProvider(e){UC.usageFilterProvider=e}get usageFilterLabel(){return UC.usageFilterLabel}set usageFilterLabel(e){UC.usageFilterLabel=e}get usageFilterUserPath(){return UC.usageFilterUserPath}set usageFilterUserPath(e){UC.usageFilterUserPath=e}#t=j(N({models:[],providers:[],labels:[]}));get usageFacetOptions(){return R(this.#t)}set usageFacetOptions(e){M(this.#t,e,!0)}#n=j(N(GC()));get usageSummary(){return R(this.#n)}set usageSummary(e){M(this.#n,e,!0)}#r=j(N(GC()));get usageSummaryAll(){return R(this.#r)}set usageSummaryAll(e){M(this.#r,e,!0)}#i=j(N([]));get modelUsage(){return R(this.#i)}set modelUsage(e){M(this.#i,e,!0)}#a=j(N([]));get userPathUsage(){return R(this.#a)}set userPathUsage(e){M(this.#a,e,!0)}#o=j(N([]));get labelUsage(){return R(this.#o)}set labelUsage(e){M(this.#o,e,!0)}get usageLog(){return UC.usageLog}set usageLog(e){UC.usageLog=e}get usageLogSearch(){return UC.usageLogSearch}set usageLogSearch(e){UC.usageLogSearch=e}get usageLogHideCached(){return UC.usageLogHideCached}set usageLogHideCached(e){UC.usageLogHideCached=e}#s=j(`chart`);get modelUsageView(){return R(this.#s)}set modelUsageView(e){M(this.#s,e,!0)}#c=j(`chart`);get userPathUsageView(){return R(this.#c)}set userPathUsageView(e){M(this.#c,e,!0)}#l=j(`chart`);get labelUsageView(){return R(this.#l)}set labelUsageView(e){M(this.#l,e,!0)}#u=j(!1);get summaryLoading(){return R(this.#u)}set summaryLoading(e){M(this.#u,e,!0)}#d=j(!1);get modelUsageLoading(){return R(this.#d)}set modelUsageLoading(e){M(this.#d,e,!0)}#f=j(!1);get userPathUsageLoading(){return R(this.#f)}set userPathUsageLoading(e){M(this.#f,e,!0)}#p=j(!1);get labelUsageLoading(){return R(this.#p)}set labelUsageLoading(e){M(this.#p,e,!0)}#m=j(!1);get usageLogLoading(){return R(this.#m)}set usageLogLoading(e){M(this.#m,e,!0)}#h={};#g(e){this.#h[e]&&this.#h[e].abort();let t=new AbortController;return this.#h[e]=t,t}#_(e,t){this.#h[e]===t&&(this.#h[e]=null)}filterQueryStr(e){return qC({model:this.usageFilterModel,provider:this.usageFilterProvider,label:this.usageFilterLabel,user_path:this.usageFilterUserPath},e)}onUsageFilterChanged(){this.fetchUsagePage()}toggleUsageLabelFilter(e){this.usageFilterLabel=this.usageFilterLabel===e?``:e,this.onUsageFilterChanged()}usageLabelChipTitle(e){return this.usageFilterLabel===e?`Clear label filter`:`Filter usage by "`+e+`"`}toggleUsageMode(e){this.usageMode=e,Yo.navigate(`usage`,e===`costs`?`costs`:null)}toggleUsageChartView(e,t){e===`model`&&(this.modelUsageView=t),e===`userPath`&&(this.userPathUsageView=t),e===`label`&&(this.labelUsageView=t)}usageFilterModelOptions(){return YC(this.usageFacetOptions.models,this.usageFilterModel)}usageFilterProviderOptions(){return YC(this.usageFacetOptions.providers,this.usageFilterProvider)}usageFilterLabelOptions(){return YC(this.usageFacetOptions.labels,this.usageFilterLabel)}async fetchUsagePage(){await ks.ensureLoaded();let e=[this.fetchUsagePageSummary(),this.fetchUsageFacetOptions(),this.fetchModelUsage(),this.fetchUserPathUsage(),this.fetchLabelUsage(),this.fetchUsageLog(!0)];Yc.cacheAnalyticsEnabled()&&e.push(Yc.fetchCacheOverview(this.filterQueryStr())),await Promise.all(e)}async fetchUsagePageSummary(){let e=this.#g(`summary`);this.summaryLoading=!0;try{let t=Uc.queryStr()+this.filterQueryStr(),[n,r]=await Promise.all([ws(`/admin/usage/summary?`+t+`&cache_mode=uncached`,{label:`usage page summary`,signal:e.signal}),ws(`/admin/usage/summary?`+t+`&cache_mode=all`,{label:`usage page summary (all)`,signal:e.signal})]);if(n.stale||r.stale||e.signal.aborted)return;if(!n.ok||!r.ok){this.usageSummary=GC(),this.usageSummaryAll=GC();return}this.usageSummary=n.data&&typeof n.data==`object`?n.data:GC(),this.usageSummaryAll=r.data&&typeof r.data==`object`?r.data:GC()}catch(e){if(Es(e))return;console.error(`Failed to fetch usage page summary:`,e),this.usageSummary=GC(),this.usageSummaryAll=GC()}finally{this.#_(`summary`,e),this.#h.summary===null&&(this.summaryLoading=!1)}}async fetchUsageFacetOptions(){let e=this.#g(`facets`);try{let t=async(t,n)=>{let r=await ws(t+`?`+Uc.queryStr()+this.filterQueryStr(n),{label:`usage facet options`,signal:e.signal});return r.stale?null:r.ok&&Array.isArray(r.data)?r.data:[]},n=t(`/admin/usage/models`,`model`),r=!this.usageFilterModel&&!this.usageFilterProvider,[i,a,o]=await Promise.all([n,r?n:t(`/admin/usage/models`,`provider`),t(`/admin/usage/labels`,`label`)]);if(e.signal.aborted||i===null||a===null||o===null)return;this.usageFacetOptions={models:i.map(e=>e&&e.model).filter(Boolean),providers:a.map(e=>Dc(e)).filter(Boolean),labels:o.map(e=>e&&e.label).filter(Boolean)}}catch(e){if(Es(e))return;console.error(`Failed to fetch usage facet options:`,e),this.usageFacetOptions={models:[],providers:[],labels:[]}}finally{this.#_(`facets`,e)}}async#v(e,t,n,r,i){let a=this.#g(e);i(!0);try{let e=await ws(t+`?`+Uc.queryStr()+this.filterQueryStr(),{label:n,signal:a.signal});if(e.stale||a.signal.aborted)return;if(!e.ok){r([]);return}r(Array.isArray(e.data)?e.data:[])}catch(e){if(Es(e))return;console.error(`Failed to fetch `+n+`:`,e),r([])}finally{this.#_(e,a),this.#h[e]===null&&i(!1)}}fetchModelUsage(){return this.#v(`modelUsage`,`/admin/usage/models`,`usage models`,e=>this.modelUsage=e,e=>this.modelUsageLoading=e)}fetchUserPathUsage(){return this.#v(`userPathUsage`,`/admin/usage/user-paths`,`usage user paths`,e=>this.userPathUsage=e,e=>this.userPathUsageLoading=e)}fetchLabelUsage(){return this.#v(`labelUsage`,`/admin/usage/labels`,`usage labels`,e=>this.labelUsage=e,e=>this.labelUsageLoading=e)}async fetchUsageLog(e){let t=this.#g(`usageLog`);this.usageLogLoading=!0;try{e&&(this.usageLog.offset=0);let n=Uc.queryStr()+this.filterQueryStr();n+=JC({limit:this.usageLog.limit,offset:this.usageLog.offset,hideCached:this.usageLogHideCached,search:this.usageLogSearch});let r=await ws(`/admin/usage/log?`+n,{label:`usage log`,signal:t.signal});if(r.stale||t.signal.aborted)return;if(!r.ok){this.usageLog=KC();return}let i=r.data&&typeof r.data==`object`?r.data:KC();i.entries||=[],this.usageLog=i}catch(e){if(Es(e))return;console.error(`Failed to fetch usage log:`,e),this.usageLog=KC()}finally{this.#_(`usageLog`,t),this.#h.usageLog===null&&(this.usageLogLoading=!1)}}usageLogNextPage(){this.usageLog.offset+this.usageLog.limit0&&(this.usageLog.offset=Math.max(0,this.usageLog.offset-this.usageLog.limit),this.fetchUsageLog(!1))}};UC.fetchUsage=()=>{Yo.page===`usage`&&kw.fetchUsagePage()};var Aw=B(`
`);function jw(e,t){O(t,!0);let n=q(t,`value`,15,``),r=q(t,`placeholder`,3,``),i=q(t,`label`,3,``),a=q(t,`id`,3,void 0),o=q(t,`oninput`,3,void 0),s=q(t,`class`,3,``);var c=Aw(),l=P(c);J(l,{get icon(){return vo},class:`filter-input-icon`});var u=I(l,2);ea(u),D(c),L(()=>{G(c,1,Ni([`filter-input-wrap`,s()]),`svelte-30xz1k`),K(u,`id`,a()),K(u,`placeholder`,r()),K(u,`aria-label`,i())}),z(`input`,u,function(...e){o()?.apply(this,e)}),la(u,n),V(e,c),k()}Br([`input`]);function Mw(e,t=300){let n=null,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>{n=null,e(...r)},t)};return r.cancel=()=>{clearTimeout(n),n=null},r}var Nw=B(``),Pw=B(``),Fw=B(`
`);function Iw(e,t){O(t,!0);let n=Mw(()=>kw.onUsageFilterChanged());On(()=>n.cancel);var r=Fw(),i=P(r),a=P(i);a.value=a.__value=``,W(I(a),16,()=>kw.usageFilterModelOptions(),e=>e,(e,t)=>{var n=Nw(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(i);var o=I(i,2),s=P(o);s.value=s.__value=``,W(I(s),16,()=>kw.usageFilterProviderOptions(),e=>e,(e,t)=>{var n=Nw(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(o);var c=I(o,2),l=e=>{var t=Pw(),n=P(t);n.value=n.__value=``,W(I(n),16,()=>kw.usageFilterLabelOptions(),e=>e,(e,t)=>{var n=Nw(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(t),z(`change`,t,()=>kw.onUsageFilterChanged()),Ui(t,()=>kw.usageFilterLabel,e=>kw.usageFilterLabel=e),V(e,t)},u=A(()=>kw.usageFilterLabelOptions().length>0);U(c,e=>{R(u)&&e(l)}),jw(I(c,2),{class:`usage-page-filters-user-path`,placeholder:`User path /team/alpha`,label:`Filter by user path`,get oninput(){return n},get value(){return kw.usageFilterUserPath},set value(e){kw.usageFilterUserPath=e}}),D(r),z(`change`,i,()=>kw.onUsageFilterChanged()),Ui(i,()=>kw.usageFilterModel,e=>kw.usageFilterModel=e),z(`change`,o,()=>kw.onUsageFilterChanged()),Ui(o,()=>kw.usageFilterProvider,e=>kw.usageFilterProvider=e),V(e,r),k()}Br([`change`]);var Lw=B(`
Cache Saved
Cache Hits
`,1);function Rw(e,t){O(t,!0);var n=Xr(),r=F(n),i=e=>{var t=Lw(),n=F(t),r=I(P(n),2),i=P(r,!0);D(r),D(n);var a=I(n,2),o=I(P(a),2),s=P(o,!0);D(o),D(a),L((e,t)=>{H(i,e),H(s,t)},[()=>vc(Yc.cacheOverview.summary.total_saved_cost),()=>_c(Yc.cacheOverview.summary.total_hits)]),V(e,t)},a=A(()=>Yc.cacheAnalyticsEnabled());U(r,e=>{R(a)&&e(i)}),V(e,n),k()}var zw=B(` `),Bw=B(`
Pro Saved
`),Vw=B(`
Total Requests
Estimated Cost
`);function Hw(e,t){O(t,!0);let n=A(()=>tw(kw.usageSummary)),r=A(()=>iw(kw.usageSummary,kw.usageMode)),i=A(()=>ow(kw.usageSummary,kw.usageMode));var a=Vw(),o=P(a),s=I(P(o),2),c=P(s),l=e=>{NS(e,{size:18,label:`Loading usage summary`})},u=e=>{var t=Yr();L(e=>H(t,e),[()=>_c(ZC(kw.usageSummary,kw.usageSummaryAll,kw.usageLogHideCached))]),V(e,t)};U(c,e=>{kw.summaryLoading?e(l):e(u,-1)}),D(s),D(o);var d=I(o,2),f=I(P(d),2),p=P(f),m=e=>{NS(e,{size:18,label:`Loading usage summary`})},h=e=>{var t=Yr();L(e=>H(t,e),[()=>vc(kw.usageSummary.total_cost)]),V(e,t)};U(p,e=>{kw.summaryLoading?e(m):e(h,-1)}),D(f),D(d);var g=I(d,2),_=e=>{var t=Bw(),n=I(P(t),2),a=P(n),o=P(a,!0);D(a);var s=I(a,2),c=e=>{var t=zw(),n=P(t,!0);D(t),L(()=>H(n,R(i))),V(e,t)};U(s,e=>{R(i)&&e(c)}),D(n),D(t),L(e=>{K(n,`title`,e),H(o,R(r))},[()=>sw(kw.usageSummary,kw.usageMode)]),V(e,t)};U(g,e=>{R(n)&&e(_)}),Rw(I(g,2),{}),D(a),L((e,t)=>{K(s,`title`,e),K(f,`title`,t)},[()=>QC(kw.usageSummary,kw.usageSummaryAll,kw.usageLogHideCached),()=>$C(kw.usageSummary)]),V(e,a),k()}function Uw(e,t,n,r){let{stacked:i=!1,costs:a=!1,resolve:o=e=>e}=r||{},s=e=>a?`$`+Math.abs(e).toFixed(2):xc(Math.abs(e)),c=e=>a?`$`+Math.abs(e).toFixed(4):Math.abs(e).toLocaleString(),l=e=>e.map(e=>i?Math.abs(e):-Math.abs(e)),u=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderColor:`transparent`,borderWidth:0,borderRadius:4,maxBarThickness:22}),d=e=>(e||[]).some(e=>Math.abs(e)>0),f=[u(a?`Input Cost`:`Input Tokens`,l(n.inputs),o(`var(--token-input)`)),u(a?`Output Cost`:`Output Tokens`,n.outputs,o(`var(--token-output)`))];return d(n.prompts)&&f.push(u(a?`Prompt Cached Cost`:`Prompt Cached`,l(n.prompts),o(`var(--token-prompt)`))),!a&&d(n.localIns)&&f.push(u(`Locally Cached (Input)`,l(n.localIns),o(`var(--token-local)`))),!a&&d(n.localOuts)&&f.push(u(`Locally Cached (Output)`,n.localOuts,o(`var(--token-local)`))),{type:`bar`,data:{labels:t,datasets:f},options:{indexAxis:`y`,responsive:!0,maintainAspectRatio:!1,animation:{duration:0},layout:{padding:{top:8}},scales:{x:{stacked:!0,beginAtZero:!0,grid:i?{color:e.grid}:{color:t=>t.tick&&t.tick.value===0?e.text:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),callback:e=>s(e)}},y:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:Jy(),autoSkip:!1}}},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Yy(e,{label:e=>e.dataset.label+`: `+c(e.parsed.x),footer:e=>{let t=0;return e.forEach(e=>{t+=Math.abs(Number(e.parsed.x))||0}),`Total: `+c(t)}})}}}}var Ww=B(`
`),Gw=B(`

`),Kw=B(`

`,1),qw=B(`
`),Jw=B(`Model Provider`,1),Yw=B(`User Path`),Xw=B(`Label Requests`,1),Zw=B(` `,1),Qw=B(` `),$w=B(` `,1),eT=B(` `),tT=B(`
Input TokensOutput TokensPrompt CachedLocal CachedTotal TokensInput CostOutput CostTotal Cost
`),nT=B(`
`),rT=B(`
`);function iT(e,t){O(t,!0);let n=e=>{var n=Ww(),r=P(n);let a;var o=I(r,2);let s;var l=I(o,2);let u;D(n),L(()=>{K(n,`aria-label`,R(i).group),a=G(r,1,`chart-view-btn svelte-1kee4g8`,null,a,{active:R(c)===`chart`}),K(r,`aria-pressed`,R(c)===`chart`),K(r,`aria-label`,`Show ${R(i).noun??``} chart`),s=G(o,1,`chart-view-btn svelte-1kee4g8`,null,s,{active:R(c)===`stacked`}),K(o,`aria-pressed`,R(c)===`stacked`),K(o,`aria-label`,`Show ${R(i).noun??``} stacked chart`),u=G(l,1,`chart-view-btn svelte-1kee4g8`,null,u,{active:R(c)===`table`}),K(l,`aria-pressed`,R(c)===`table`),K(l,`aria-label`,`Show ${R(i).noun??``} table`)}),z(`click`,r,()=>kw.toggleUsageChartView(t.kind,`chart`)),z(`click`,o,()=>kw.toggleUsageChartView(t.kind,`stacked`)),z(`click`,l,()=>kw.toggleUsageChartView(t.kind,`table`)),V(e,n)},r={model:{group:`Model usage view`,noun:`model usage`,tokensTitle:`Token Usage by Model`,costsTitle:`Cost by Model`},userPath:{group:`User path usage view`,noun:`user path usage`,tokensTitle:`Usage by User Path`,costsTitle:`Cost by User Path`},label:{group:`Label usage view`,noun:`label usage`,tokensTitle:`Usage by Label`,costsTitle:`Cost by Label`}},i=A(()=>r[t.kind]),a=A(()=>t.kind===`model`?e=>kc(e):t.kind===`userPath`?e=>e.user_path||`/`:e=>e.label);function o(e){return t.kind===`model`?(e.provider_name||e.provider||`-`)+`/`+e.model:t.kind===`userPath`?e.user_path||`/`:e.label}let s=A(()=>t.kind===`model`?kw.modelUsage:t.kind===`userPath`?kw.userPathUsage:kw.labelUsage),c=A(()=>t.kind===`model`?kw.modelUsageView:t.kind===`userPath`?kw.userPathUsageView:kw.labelUsageView),l=A(()=>t.kind===`model`?kw.modelUsageLoading:t.kind===`userPath`?kw.userPathUsageLoading:kw.labelUsageLoading),u=A(()=>kw.usageMode===`costs`),d=A(()=>t.kind===`userPath`?Tw(R(s)):R(s).length>0),f=A(()=>R(u)?R(i).costsTitle:R(i).tokensTitle),p=A(()=>Dw(R(s),R(a),R(u))),m=A(()=>ww(R(s),R(u)));function h(){return Ew(R(c))?Uw(qy(),R(p).labels,R(p),{stacked:R(c)===`stacked`,costs:R(u),resolve:Xy}):null}var g=Xr(),_=F(g),v=e=>{var r=nT(),a=P(r),s=P(a),u=e=>{iC(e,{copyId:`label-usage-help-copy`,label:`label usage help`,text:`One request can have multiple labels. Such a request counts once under each of its labels, so label rows can overlap and add up to more than the period totals.`,title:e=>{var t=Gw(),n=P(t,!0);D(t),L(()=>H(n,R(f))),V(e,t)},extra:e=>{var t=Xr(),n=F(t),r=e=>{NS(e,{size:14,get label(){return`Loading ${R(i).noun??``}`}})};U(n,e=>{R(l)&&e(r)}),V(e,t)},$$slots:{title:!0,extra:!0}})},d=e=>{var t=Kw(),n=F(t),r=P(n,!0);D(n);var a=I(n,2),o=e=>{NS(e,{size:14,get label(){return`Loading ${R(i).noun??``}`}})};U(a,e=>{R(l)&&e(o)}),L(()=>H(r,R(f))),V(e,t)};U(s,e=>{t.kind===`label`?e(u):e(d,-1)});var g=I(s,2);n(g),D(a);var _=I(a,2),v=e=>{var t=qw();let n;Hy(P(t),{build:h}),D(t),L(e=>n=Bi(t,``,n,e),[()=>({height:`${Ow(R(p).labels.length)??``}px`})]),V(e,t)},y=A(()=>Ew(R(c))),b=e=>{var n=tT(),r=P(n),i=P(r),a=P(i),s=P(a),c=e=>{var t=Jw();Ve(2),V(e,t)},l=e=>{V(e,Yw())},u=e=>{var t=Xw();Ve(2),V(e,t)};U(s,e=>{t.kind===`model`?e(c):t.kind===`userPath`?e(l,1):e(u,-1)}),Ve(8),D(a),D(i);var d=I(i);W(d,21,()=>R(m),e=>o(e),(e,n)=>{var r=eT(),i=P(r),a=e=>{var t=Zw(),r=F(t),i=P(r,!0);D(r);var a=I(r,2),o=P(a),s=P(o,!0);D(o),D(a),L(e=>{H(i,R(n).model||`-`),H(s,e)},[()=>Dc(R(n))||`-`]),V(e,t)},o=e=>{var t=Qw(),r=P(t,!0);D(t),L(()=>H(r,R(n).user_path||`/`)),V(e,t)},s=e=>{var t=$w(),r=F(t),i=P(r);let a;var o=P(i,!0);D(i),D(r);var s=I(r,2),c=P(s,!0);D(s),L((e,t,r)=>{a=G(i,1,`usage-label-chip`,null,a,{active:kw.usageFilterLabel===R(n).label}),Bi(i,`--label-color: ${e??``}`),K(i,`title`,t),H(o,R(n).label),H(c,r)},[()=>$y(R(n).label),()=>kw.usageLabelChipTitle(R(n).label),()=>_c(R(n).requests)]),z(`click`,i,()=>kw.toggleUsageLabelFilter(R(n).label)),V(e,t)};U(i,e=>{t.kind===`model`?e(a):t.kind===`userPath`?e(o,1):e(s,-1)});var c=I(i),l=P(c,!0);D(c);var u=I(c),d=P(u,!0);D(u);var f=I(u),p=P(f,!0);D(f);var m=I(f),h=P(m,!0);D(m);var g=I(m),_=P(g,!0);D(g);var v=I(g),y=P(v,!0);D(v);var b=I(v),x=P(b,!0);D(b);var S=I(b),C=P(S,!0);D(S),D(r),L((e,t,n,r,i,a,o,s,c,u,g)=>{H(l,e),H(d,t),K(f,`title`,n),H(p,r),K(m,`title`,`${i??``} input + ${a??``} output`),H(h,o),H(_,s),H(y,c),H(x,u),H(C,g)},[()=>_c(R(n).input_tokens),()=>_c(R(n).output_tokens),()=>R(n).cached_input_cost==null?``:`~`+vc(R(n).cached_input_cost)+` at current cached-input pricing`,()=>_c(R(n).cached_input_tokens||0),()=>_c(R(n).local_cached_input_tokens||0),()=>_c(R(n).local_cached_output_tokens||0),()=>_c((R(n).local_cached_input_tokens||0)+(R(n).local_cached_output_tokens||0)),()=>_c(Sw(R(n))),()=>vc(R(n).input_cost),()=>vc(R(n).output_cost),()=>vc(R(n).total_cost)]),V(e,r)}),D(d),D(r),D(n),V(e,n)};U(_,e=>{R(y)?e(v):e(b,-1)}),D(r),V(e,r)},y=e=>{var t=rT();NS(P(t),{size:20,get label(){return`Loading ${R(i).noun??``}`}}),D(t),V(e,t)};U(_,e=>{R(d)?e(v):R(l)&&e(y,1)}),V(e,g),k()}Br([`click`]);var aT=B(``);function oT(e,t){O(t,!0);let n=q(t,`total`,3,0),r=q(t,`offset`,3,0),i=q(t,`limit`,3,25);var a=Xr(),o=F(a),s=e=>{var a=aT(),o=P(a),s=P(o);D(o);var c=I(o,2),l=P(c),u=I(l,2);D(c),D(a),L(e=>{H(s,`Showing ${r()+1}-${e??``} of ${n()??``}`),l.disabled=r()===0,u.disabled=r()+i()>=n()},[()=>Math.min(r()+i(),n())]),z(`click`,l,()=>t.onprev?.()),z(`click`,u,()=>t.onnext?.()),V(e,a)};U(o,e=>{n()>0&&e(s)}),V(e,a),k()}Br([`click`]);var sT=(e,t=f)=>{var n=Xr(),r=F(n),i=e=>{var n=lT();W(n,20,()=>bw(t()),e=>e,(e,t)=>{var n=cT();let r;var i=P(n,!0);D(n),L((e,a)=>{r=G(n,1,`usage-label-chip`,null,r,{active:kw.usageFilterLabel===t}),Bi(n,`--label-color: ${e??``}`),K(n,`title`,a),H(i,t)},[()=>$y(t),()=>kw.usageLabelChipTitle(t)]),z(`click`,n,()=>kw.toggleUsageLabelFilter(t)),V(e,n)}),D(n),V(e,n)},a=A(()=>bw(t()).length>0),o=e=>{V(e,uT())};U(r,e=>{R(a)?e(i):e(o,-1)}),V(e,n)},cT=B(``),lT=B(`
`),uT=B(`-`),dT=B(`Labels`),fT=B(`Cost`),pT=B(``),mT=B(` `),hT=B(``),gT=B(` `),_T=B(` `),vT=B(`
TimestampProviderModelUser PathCacheProvider Cache
`),yT=B(`
`),bT=B(`
`),xT=B(`

Request Log

`);function ST(e,t){O(t,!0);let n=A(()=>kw.usageMode===`costs`),r=A(()=>xw(kw.labelUsage,kw.usageFilterLabel,kw.usageLog.entries)),i=Mw(()=>kw.fetchUsageLog(!0));On(()=>i.cancel);var a=xT(),o=I(P(a),2),s=P(o);jw(P(s),{placeholder:`Search by request ID, model, provider...`,label:`Search by request ID, model, provider`,get oninput(){return i},get value(){return kw.usageLogSearch},set value(e){kw.usageLogSearch=e}}),D(s);var c=I(s,2),l=P(c),u=P(l);ea(u),Ve(2),D(l),D(c),D(o);var d=I(o,2),f=e=>{var t=vT(),i=P(t),a=P(i),o=P(a),s=I(P(o),4),c=e=>{V(e,dT())};U(s,e=>{R(r)&&e(c)});var l=I(s,3),u=P(l,!0);D(l);var d=I(l),f=P(d,!0);D(d);var p=I(d),m=P(p,!0);D(p);var h=I(p),g=e=>{V(e,fT())};U(h,e=>{R(n)||e(g)}),D(o),D(a);var _=I(a);W(_,21,()=>kw.usageLog.entries,e=>e.id,(e,t)=>{var i=_T();let a;var o=P(i),s=P(o,!0);D(o);var c=I(o),l=P(c),u=P(l,!0);D(l),D(c);var d=I(c),f=P(d,!0);D(d);var p=I(d),m=P(p,!0);D(p);var h=I(p),g=e=>{var n=pT();sT(P(n),()=>R(t)),D(n),V(e,n)};U(h,e=>{R(r)&&e(g)});var _=I(h),v=P(_,!0);D(_);var y=I(_),b=P(y),x=e=>{var n=mT(),r=P(n,!0);D(n),L(e=>H(r,e),[()=>_w(R(t))]),V(e,n)},S=A(()=>gw(R(t))),C=e=>{V(e,uT())};U(b,e=>{R(S)?e(x):e(C,-1)}),D(y);var w=I(y),T=P(w,!0);D(w);var E=I(w),ee=P(E,!0);D(E);var te=I(E),ne=P(te),re=P(ne,!0);D(ne);var ie=I(ne,2),ae=e=>{{let n=A(()=>uw(R(t)));J(e,{get icon(){return Ka},class:`cost-source-icon`,get title(){return R(n)}})}},oe=A(()=>R(n)&&lw(R(t)));U(ie,e=>{R(oe)&&e(ae)});var se=I(ie,2),ce=e=>{J(e,{get icon(){return Ya},class:`cache-savings-icon`})},le=A(()=>R(n)&&fw(R(t)));U(se,e=>{R(le)&&e(ce)});var ue=I(se,2),de=e=>{var n=hT();L(()=>K(n,`title`,R(t).costs_calculation_caveat)),V(e,n)};U(ue,e=>{R(n)&&R(t).costs_calculation_caveat&&e(de)}),D(te);var fe=I(te),pe=e=>{var n=gT(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=e=>{{let n=A(()=>uw(R(t)));J(e,{get icon(){return Ka},class:`cost-source-icon`,get title(){return R(n)}})}},s=A(()=>lw(R(t)));U(a,e=>{R(s)&&e(o)});var c=I(a,2),l=e=>{J(e,{get icon(){return Ya},class:`cache-savings-icon`})},u=A(()=>fw(R(t)));U(c,e=>{R(u)&&e(l)});var d=I(c,2),f=e=>{var n=hT();L(()=>K(n,`title`,R(t).costs_calculation_caveat)),V(e,n)};U(d,e=>{R(t).costs_calculation_caveat&&e(f)}),D(n),L((e,t)=>{K(n,`title`,e),H(i,t)},[()=>mw(R(t),yw(R(t))),()=>vc(R(t).total_cost)]),V(e,n)};U(fe,e=>{R(n)||e(pe)}),D(i),L((e,n,r,c,l,d,p,h,g,_,b,x,S)=>{a=G(i,1,`svelte-hg4ill`,null,a,e),K(o,`title`,n),H(s,r),H(u,c),H(f,R(t).model),H(m,R(t).user_path||`-`),H(v,l),K(y,`title`,d),K(w,`title`,p),H(T,h),K(E,`title`,g),H(ee,_),K(te,`title`,b),K(ne,`title`,x),H(re,S)},[()=>({"usage-log-row-cached":fw(R(t))}),()=>Tc(R(t).timestamp),()=>vs.formatTimestamp(R(t).timestamp),()=>Dc(R(t))||`-`,()=>pw(R(t)),()=>vw(R(t)),()=>R(n)?_c(R(t).input_tokens)+` tokens`:``,()=>R(n)?vc(R(t).input_cost):_c(R(t).input_tokens),()=>R(n)?_c(R(t).output_tokens)+` tokens`:``,()=>R(n)?vc(R(t).output_cost):_c(R(t).output_tokens),()=>R(n)?mw(R(t),``):``,()=>R(n)?mw(R(t),_c(R(t).total_tokens)+` tokens +`+yw(R(t))):``,()=>R(n)?vc(R(t).total_cost):_c(R(t).total_tokens)]),V(e,i)}),D(_),D(i),D(t),L(()=>{H(u,R(n)?`Input Cost`:`Input`),H(f,R(n)?`Output Cost`:`Output`),H(m,R(n)?`Total Cost`:`Total`)}),V(e,t)},p=e=>{var t=yT();NS(P(t),{size:20,label:`Loading request log`}),D(t),V(e,t)},m=e=>{var t=bT();IS(P(t),{}),D(t),V(e,t)};U(d,e=>{kw.usageLog.entries.length>0?e(f):kw.usageLogLoading?e(p,1):e(m,-1)}),oT(I(d,2),{get total(){return kw.usageLog.total},get offset(){return kw.usageLog.offset},get limit(){return kw.usageLog.limit},onprev:()=>kw.usageLogPrevPage(),onnext:()=>kw.usageLogNextPage()}),D(a),z(`change`,u,()=>kw.fetchUsageLog(!0)),ua(u,()=>kw.usageLogHideCached,e=>kw.usageLogHideCached=e),V(e,a),k()}Br([`click`,`change`]);var CT=B(`
`);function wT(e,t){O(t,!0);let n=`usage`;On(()=>{Y.refreshTick,Yo.page===n&&(kw.fetchUsagePage(),UC.ensureLiveLogs())}),On(()=>{Yo.page===n&&(kw.usageMode=Yo.sub===`costs`?`costs`:`tokens`)});var r=CT(),i=I(P(r),2),a=P(i);Gy(a,{ariaLabel:`Usage mode`,options:[{value:`tokens`,label:`Tokens`},{value:`costs`,label:`Costs`}],get value(){return kw.usageMode},onchange:e=>kw.toggleUsageMode(e)}),fl(I(a,2),{onchange:()=>kw.fetchUsagePage()}),D(i);var o=I(i,2);Iw(o,{});var s=I(o,2);Hw(s,{});var c=I(s,2),l=P(c);iT(l,{kind:`model`});var u=I(l,2);iT(u,{kind:`userPath`}),iT(I(u,2),{kind:`label`}),D(c),ST(I(c,2),{}),D(r),V(e,r),k()}var TT=B(`
`);function ET(e,t){let n=q(t,`label`,3,`Loading...`),r=q(t,`class`,3,``);var i=TT(),a=I(P(i),2),o=P(a,!0);D(a),D(i),L(()=>{G(i,1,Ni([`loading-state`,r()]),`svelte-hzxv1d`),H(o,n())}),V(e,i)}var DT=B(``);function OT(e,t){let n=q(t,`label`,3,``),r=q(t,`class`,3,``),i=q(t,`disabled`,3,!1);var a=DT();mi(P(a),()=>t.children??f),D(a),L(()=>{G(a,1,Ni([`table-action-btn`,r()])),K(a,`aria-label`,n()),K(a,`title`,n()),a.disabled=i()}),z(`click`,a,function(...e){t.onclick?.apply(this,e)}),V(e,a)}Br([`click`]);async function kT(e,{label:t,errorFallback:n=`Unable to load ${t}.`,unavailableStatuses:r=[503],normalize:i=e=>Array.isArray(e)?e:[],options:a}){let o;try{o=await ws(e,{...a||{},label:t})}catch(e){return Es(e)||console.error(`Failed to fetch ${t}:`,e),{status:`error`,items:[],error:n,result:null}}return o.stale?{status:`stale`,items:[],error:``,result:o}:r.includes(o.status)?{status:`unavailable`,items:[],error:``,result:o}:o.ok?{status:`ok`,items:i(o.data),error:``,result:o}:{status:`error`,items:[],error:o.status===401?``:ys(o.data,n),result:o}}async function AT(e,t,n,{label:r,errorFallback:i=`Unable to ${r}.`,unavailableStatuses:a=[503],unavailableMessage:o=`This feature is unavailable on the gateway.`,options:s}){let c;try{c=await Ts(e,t,n,{...s||{},label:r})}catch(e){return Es(e)||console.error(`Failed to ${r}:`,e),{status:`error`,error:i,result:null}}return c.stale?{status:`stale`,error:``,result:c}:a.includes(c.status)?{status:`unavailable`,error:o,result:c}:c.ok?{status:`ok`,error:``,result:c}:{status:`error`,error:c.status===401?`Authentication required.`:ys(c.data,i),result:c}}function jT(){return{scope:`user_path`,subject:`/`,period:`daily`,period_seconds:86400,amount:``,source:`manual`}}function MT(e){let t={user_path:{label:`User path`,chip:`user path`,fieldLabel:`User Path`,placeholder:`/team/alpha`},label:{label:`Label`,chip:`label`,fieldLabel:`Label`,placeholder:`Mobile-App-iOS`}};return t[e]||t.user_path}function NT(){return[`user_path`,`label`].map(e=>({value:e,label:MT(e).label}))}function PT(e){return String(e&&e.scope||``).trim()||`user_path`}function FT(e){return String(e&&e.subject||``).trim()||String(e&&e.user_path||``)}function IT(e){return MT(PT(e)).chip}function LT(e){return PT(e)===`label`?`budget-label`:`budget-user-path`}function RT(e){return MT(String(e&&e.scope||``)).fieldLabel}function zT(e){return MT(String(e&&e.scope||``)).placeholder}function BT(e){e.subject=String(e&&e.scope||``)===`user_path`?`/`:``}function VT(){return[{value:`hourly`,label:`Hourly`},{value:`daily`,label:`Daily`},{value:`weekly`,label:`Weekly`},{value:`monthly`,label:`Monthly`},{value:`custom`,label:`Custom seconds`}]}function HT(e){switch(String(e||``).trim().toLowerCase()){case`hourly`:return 3600;case`daily`:return 86400;case`weekly`:return 604800;case`monthly`:return 2592e3;default:return 0}}function UT(e){switch(Number(e||0)){case 3600:return`hourly`;case 86400:return`daily`;case 604800:return`weekly`;case 2592e3:return`monthly`;default:return`custom`}}function WT(e){return PT(e)+`:`+FT(e)+`:`+String(e&&e.period_seconds||``)}function GT(e,t){if(!t||!Array.isArray(e))return null;let n=WT(t);return e.find(e=>WT(e)===n)||null}function KT(e){let t=String(e||``).trim();if(!t)return`User path is required.`;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function qT(e){if(KT(e))return``;let t=String(e||``).trim(),n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function JT(e){return`/`+String(e||``).trimStart().replace(/^\/+/,``)}function YT(e){return Array.isArray(e)?e:e&&Array.isArray(e.budgets)?e.budgets:[]}function XT(e){let t=Number(e&&e.period_seconds||0);return[FT(e),IT(e),pE(e),UT(t),t?String(t)+`s`:``,t?String(t)+` seconds`:``].join(` `).toLowerCase()}var ZT={user_path:0,label:1};function QT(e,t){let n=Array.isArray(e)?e.slice():[],r=String(t||`subject`);return n.sort((e,t)=>{let n=(ZT[PT(e)]||0)-(ZT[PT(t)]||0),i=FT(e).localeCompare(FT(t)),a=Number(t&&t.period_seconds||0)-Number(e&&e.period_seconds||0);return r===`period`?a||n||i:n||i||a}),n}function $T(e,t,n){let r=Array.isArray(e)?e:[],i=String(t||``).trim().toLowerCase();return QT(i?r.filter(e=>XT(e).includes(i)):r.slice(),n)}function eE(e){let t=e||{},n=PT(t),r=String(t.subject||``).trim();if(n===`user_path`){let e=KT(r);if(e)return{payload:null,error:e}}else if(!r)return{payload:null,error:`Label is required.`};let i=Number(t.amount);if(!Number.isFinite(i)||i<=0)return{payload:null,error:`Amount must be greater than 0.`};let a=String(t.period||``).trim(),o=HT(a);return a===`custom`&&(o=Number(t.period_seconds)),!Number.isFinite(o)||o<=0?{payload:null,error:`Period seconds must be greater than 0.`}:{payload:{scope:n,subject:n===`user_path`?qT(r):r,period_seconds:Math.trunc(o),amount:i,source:String(t.source||`manual`).trim()||`manual`},error:``}}function tE(e){return{scope:PT(e),subject:FT(e),budget_key:{period_seconds:e.period_seconds},amount:e.amount}}function nE(e){return{scope:PT(e),subject:FT(e),budget_key:{period_seconds:e.period_seconds}}}function rE(e){return{scope:PT(e),subject:FT(e),period_seconds:e.period_seconds}}function iE(e){return vc(e)}function aE(e,t){let n=e||{},r=t||{};return`A budget for "`+((FT(n)||FT(r))+` `+pE({period_seconds:n.period_seconds||r.period_seconds,period_label:r.period_label}))+`" already exists. Saving will override the current `+iE(r.amount)+` limit with `+iE(n.amount)+`.`}function oE(e){let t=Number(e);return!Number.isFinite(t)||t<0?0:t}function sE(e,t){let n=oE(e);return Math.round((t?Math.min(n,1):n)*1e3)/10}function cE(e){return oE(e&&e.usage_ratio)}function lE(e){return sE(cE(e),!0)}function uE(e){return sE(e&&e.period_ratio,!0)}function dE(e){return sE(cE(e),!1).toFixed(1).replace(/\.0$/,``)+`%`}function fE(e){return uE(e).toFixed(1).replace(/\.0$/,``)+`%`}function pE(e){let t=Number(e&&e.period_seconds||0);switch(t){case 3600:return`Hourly`;case 86400:return`Daily`;case 604800:return`Weekly`;case 2592e3:return`Monthly`;default:{let n=String(e&&e.period_label||``).trim();return n?`Custom `+n:`Custom `+String(t||``)+`s`}}}function mE(e){switch(Number(e&&e.period_seconds||0)){case 3600:return`budget-period-label-hourly`;case 86400:return`budget-period-label-daily`;case 604800:return`budget-period-label-weekly`;case 2592e3:return`budget-period-label-monthly`;default:return`budget-period-label-custom`}}function hE(e){return mE(e).replace(`budget-period-label-`,`budget-bar-fill-period-`)}function gE(e){return mE(e).replace(`budget-period-label-`,`budget-bar-track-period-`)}function _E(e){switch(Number(e&&e.period_seconds||0)){case 3600:return qa;case 86400:return Do;case 604800:return Ia;case 2592e3:return La;default:return xo}}function vE(e){let t=Math.max(0,Math.trunc(Number(e||0)));return t+` `+(t===1?`second`:`seconds`)}function yE(e){let t=Number(e&&e.period_seconds||0);switch(t){case 3600:return`1 hour`;case 86400:return`1 day`;case 604800:return`1 week`;case 2592e3:return`1 month`;default:return vE(t)}}function bE(e){return String(e&&e.source||``).trim()||`manual`}function xE(e){let t=bE(e).toLowerCase();return t===`manual`?`Created from the dashboard.`:t===`config`?`Loaded from configuration.`:`Budget source: `+t}function SE(e){let t=Number(e&&e.remaining);return Number.isFinite(t)?t<0?vc(Math.abs(t))+` over`:vc(t)+` remaining`:``}var X=new class{#e=j(N([]));get budgets(){return R(this.#e)}set budgets(e){M(this.#e,e,!0)}#t=j(!0);get budgetsAvailable(){return R(this.#t)}set budgetsAvailable(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get filter(){return R(this.#r)}set filter(e){M(this.#r,e,!0)}#i=j(`subject`);get sortBy(){return R(this.#i)}set sortBy(e){M(this.#i,e,!0)}#a=j(``);get error(){return R(this.#a)}set error(e){M(this.#a,e,!0)}#o=j(!1);get formOpen(){return R(this.#o)}set formOpen(e){M(this.#o,e,!0)}#s=j(!1);get formSubmitting(){return R(this.#s)}set formSubmitting(e){M(this.#s,e,!0)}#c=j(``);get formError(){return R(this.#c)}set formError(e){M(this.#c,e,!0)}#l=j(!1);get editing(){return R(this.#l)}set editing(e){M(this.#l,e,!0)}#u=j(N(jT()));get form(){return R(this.#u)}set form(e){M(this.#u,e,!0)}#d=j(!1);get overrideDialogOpen(){return R(this.#d)}set overrideDialogOpen(e){M(this.#d,e,!0)}#f=j(null);get overridePendingPayload(){return R(this.#f)}set overridePendingPayload(e){M(this.#f,e,!0)}#p=j(null);get overrideExistingBudget(){return R(this.#p)}set overrideExistingBudget(e){M(this.#p,e,!0)}#m=j(``);get resettingKey(){return R(this.#m)}set resettingKey(e){M(this.#m,e,!0)}#h=j(``);get deletingKey(){return R(this.#h)}set deletingKey(e){M(this.#h,e,!0)}#g=j(!1);get resetAllLoading(){return R(this.#g)}set resetAllLoading(e){M(this.#g,e,!0)}#_=null;managementEnabled(){return ks.budgetsVisible()}filteredBudgets(){return $T(this.budgets,this.filter,this.sortBy)}async fetchBudgetsPage(){if(await ks.ensureLoaded(),!this.managementEnabled()){this.budgets=[],this.budgetsAvailable=!1,this.error=``;return}return this.#_||=this.fetchBudgets().finally(()=>{this.#_=null}),this.#_}async fetchBudgets(){this.loading=!0,this.error=``;let e=await kT(`/admin/budgets`,{label:`budgets`,errorFallback:`Unable to load budgets.`,normalize:YT});if(this.loading=!1,e.status!==`stale`){if(e.status===`unavailable`){this.budgetsAvailable=!1,this.budgets=[];return}if(!e.result){this.budgets=[],this.error=e.error;return}if(this.budgetsAvailable=!0,e.status===`error`){this.error=e.error;return}this.budgets=e.items}}openForm(e){if(this.editing=!!e,this.formError=``,e){let t=Number(e.period_seconds||0);this.form={scope:PT(e),subject:FT(e),period:UT(t),period_seconds:t,amount:String(e.amount||``),source:String(e.source||`manual`)}}else this.form=jT();this.formOpen=!0}syncPeriodSeconds(){let e=HT(String(this.form.period||``).trim());e>0&&(this.form.period_seconds=e)}setFormSubject(e){this.form.subject=this.form.scope===`label`?String(e??``):JT(e)}syncScope(){BT(this.form)}closeForm(){this.closeOverrideDialog(),this.formOpen=!1,this.formSubmitting=!1,this.formError=``,this.editing=!1,this.form=jT()}async submitForm(){if(this.formSubmitting)return;let{payload:e,error:t}=eE(this.form);if(!e){this.formError=t;return}if(!this.editing){let t=GT(this.budgets,e);if(t){this.openOverrideDialog(t,e);return}}await this.saveBudgetPayload(e)}async saveBudgetPayload(e){if(this.formSubmitting||!e)return;this.formSubmitting=!0,this.formError=``;let t=await AT(`/admin/budgets`,`PUT`,tE(e),{label:`save budget`,errorFallback:`Unable to save budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.formSubmitting=!1,t.status!==`stale`){if(t.status===`unavailable`){this.budgetsAvailable=!1,this.formError=t.error;return}if(t.status===`error`){this.formError=t.error;return}this.closeForm(),lc.success(`Budget saved.`),this.fetchBudgets()}}openOverrideDialog(e,t){this.overrideExistingBudget=e||null,this.overridePendingPayload=t||null,this.overrideDialogOpen=!0}closeOverrideDialog(){this.overrideDialogOpen=!1,this.overridePendingPayload=null,this.overrideExistingBudget=null}async confirmOverride(){if(!this.overridePendingPayload){this.closeOverrideDialog();return}let e=this.overridePendingPayload;this.closeOverrideDialog(),await this.saveBudgetPayload(e)}async resetBudget(e){if(!e)return;let t=WT(e);if(this.resettingKey===t)return;let n=FT(e)+` `+pE(e);if(!confirm(`Reset budget "`+n+`"?`))return;this.resettingKey=t;let r=await AT(`/admin/budgets/reset-one`,`POST`,rE(e),{label:`reset budget`,errorFallback:`Unable to reset budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.resettingKey=``,r.status!==`stale`){if(r.status===`unavailable`){this.budgetsAvailable=!1,lc.error(r.error);return}if(r.status===`error`){lc.error(r.error);return}lc.success(`Budget reset.`),this.fetchBudgets()}}async deleteBudget(e){if(!e)return;let t=WT(e);if(this.deletingKey===t)return;let n=FT(e)+` `+pE(e);if(!confirm(`Delete budget "`+n+`"? This cannot be undone.`))return;this.deletingKey=t;let r=await AT(`/admin/budgets`,`DELETE`,nE(e),{label:`delete budget`,errorFallback:`Unable to delete budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.deletingKey=``,r.status!==`stale`){if(r.status===`unavailable`){this.budgetsAvailable=!1,lc.error(r.error);return}if(r.status===`error`){lc.error(r.error);return}this.budgets=YT(r.result.data),lc.success(`Budget deleted.`)}}openResetDialog(){Js.open({title:`Reset Budgets`,titleId:`budgetResetDialogTitle`,inputId:`budget-reset-confirmation`,requiredText:`reset`,confirmLabel:`Reset All Budgets`,icon:go,dialogClass:`budget-reset-dialog`,onConfirm:()=>this.resetAllBudgets()})}async resetAllBudgets(){if(this.resetAllLoading)return;this.resetAllLoading=!0;let e=await AT(`/admin/budgets/reset`,`POST`,{confirmation:`reset`},{label:`reset budgets`,errorFallback:`Unable to reset budgets.`,unavailableStatuses:[]});if(this.resetAllLoading=!1,e.status!==`stale`){if(e.status!==`ok`){Js.error=e.error;return}Js.close(),lc.success(`Budgets reset.`),Yo.page===`budgets`&&this.fetchBudgets()}}},CE=B(` Edit`,1),wE=B(` `,1),TE=B(`
Usage
Period
`),EE=B(`
`);function DE(e,t){O(t,!0);let n=q(t,`budgets`,19,()=>[]);function r(e){if(!e)return``;let t=vs.formatTimestamp(e);return!t||t===`-`?``:t+` `+vs.effectiveTimeZoneLabel()}var i=EE();W(i,21,n,e=>WT(e),(e,t)=>{var n=TE(),i=P(n),a=P(i),o=P(a),s=P(o),c=e=>{J(e,{get icon(){return Oo},class:`budget-scope-icon`})},l=A(()=>PT(R(t))===`label`);U(s,e=>{R(l)&&e(c)});var u=I(s);D(o);var d=I(o,2),f=P(d),p=P(f);{let e=A(()=>_E(R(t)));J(p,{get icon(){return R(e)},class:`budget-period-icon`})}var m=I(p,2),h=P(m,!0);D(m),D(f),D(d);var g=I(d,2),_=P(g),v=P(_),y=P(v,!0);D(v),D(_);var b=I(_,2),x=P(b);OT(x,{label:`Edit budget`,class:`budget-action-btn`,onclick:()=>X.openForm(R(t)),children:(e,t)=>{var n=CE();J(F(n),{get icon(){return uo},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}});var S=I(x,2);{let e=A(()=>X.resettingKey===WT(R(t))?`Resetting budget`:`Reset budget`),n=A(()=>X.resettingKey===WT(R(t)));OT(S,{get label(){return R(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>X.resetBudget(R(t)),get disabled(){return R(n)},children:(e,n)=>{var r=wE(),i=F(r);J(i,{get icon(){return go},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>X.resettingKey===WT(R(t))?`Resetting`:`Reset`]),V(e,r)},$$slots:{default:!0}})}var C=I(S,2);{let e=A(()=>X.deletingKey===WT(R(t))?`Deleting budget`:`Delete budget`),n=A(()=>X.deletingKey===WT(R(t)));OT(C,{get label(){return R(e)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>X.deleteBudget(R(t)),get disabled(){return R(n)},children:(e,n)=>{var r=wE(),i=F(r);J(i,{get icon(){return Ao},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>X.deletingKey===WT(R(t))?`Deleting`:`Delete`]),V(e,r)},$$slots:{default:!0}})}D(b),D(g),D(a);var w=I(a,2),T=P(w),E=P(T),ee=I(P(E),2),te=P(ee,!0);D(ee),D(E);var ne=I(E,2),re=P(ne);let ie;var ae=I(re,2),oe=P(ae),se=P(oe,!0);D(oe);var ce=I(oe,2),le=P(ce,!0);D(ce),D(ae);var ue=I(ae,2),de=P(ue),fe=P(de,!0);D(de);var pe=I(de,2),me=P(pe,!0);D(pe),D(ue),D(ne),D(T);var he=I(T,2),ge=P(he),_e=I(P(ge),2),ve=P(_e,!0);D(_e),D(ge);var ye=I(ge,2),be=P(ye),xe=I(be,2),Se=P(xe),Ce=P(Se,!0);D(Se);var we=I(Se,2),Te=P(we,!0);D(we);var Ee=I(we,2),De=P(Ee,!0);D(Ee),D(xe);var Oe=I(xe,2),ke=P(Oe),Ae=P(ke,!0);D(ke);var je=I(ke,2),Me=P(je,!0);D(je);var Ne=I(je,2),Pe=P(Ne,!0);D(Ne),D(Oe),D(ye),D(he),D(w),D(i),D(n),L((e,t,n,r,i,a,s,c,l,d,p,m,g,_,b,x,S,C,w,T,E,ee,ae,oe,ce,ue,de,pe,he,ge)=>{G(o,1,`budget-scope-value ${e??``}`,`svelte-1jm56wo`),Bi(o,t),K(o,`title`,n),H(u,` ${r??``}`),G(f,1,`budget-period-label ${i??``}`,`svelte-1jm56wo`),H(h,a),K(v,`title`,s),H(y,c),H(te,l),K(ne,`aria-valuenow`,d),K(ne,`aria-label`,p),Bi(ne,`--budget-progress: ${m??``}%`),ie=G(re,1,`budget-bar-fill budget-bar-fill-usage`,null,ie,g),H(se,_),H(le,b),H(fe,x),H(me,S),H(ve,C),G(ye,1,`budget-bar-track ${w??``}`,`svelte-1jm56wo`),K(ye,`aria-valuenow`,T),Bi(ye,`--budget-progress: ${E??``}%`),G(be,1,`budget-bar-fill budget-bar-fill-period ${ee??``}`,`svelte-1jm56wo`),K(Se,`title`,ae),H(Ce,oe),H(Te,ce),K(Ee,`title`,ue),H(De,de),H(Ae,pe),H(Me,he),H(Pe,ge)},[()=>LT(R(t)),()=>PT(R(t))===`label`?`--label-color: `+$y(FT(R(t))):void 0,()=>IT(R(t))+`: `+FT(R(t)),()=>FT(R(t)),()=>mE(R(t)),()=>pE(R(t)),()=>xE(R(t)),()=>bE(R(t)),()=>dE(R(t)),()=>lE(R(t)),()=>`Budget usage: `+vc(R(t).spent)+` of `+vc(R(t).amount)+`, `+SE(R(t)),()=>lE(R(t)),()=>({"budget-bar-fill-danger":cE(R(t))>=1}),()=>vc(R(t).spent)+` of `+vc(R(t).amount),()=>SE(R(t)),()=>vc(R(t).spent)+` of `+vc(R(t).amount),()=>SE(R(t)),()=>fE(R(t)),()=>gE(R(t)),()=>uE(R(t)),()=>uE(R(t)),()=>hE(R(t)),()=>r(R(t).period_start),()=>vs.formatTimestamp(R(t).period_start),()=>yE(R(t)),()=>r(R(t).period_end),()=>vs.formatTimestamp(R(t).period_end),()=>vs.formatTimestamp(R(t).period_start),()=>yE(R(t)),()=>vs.formatTimestamp(R(t).period_end)]),V(e,n)}),D(i),V(e,i),k()}var OE=B(`

`,1),kE=B(``),AE=B(``),jE=B(`
`);function ME(e,t){O(t,!0);let n=q(t,`open`,3,!1),r=q(t,`title`,3,``),i=q(t,`ariaLabel`,3,``),a=q(t,`error`,3,``),o=q(t,`submitting`,3,!1),s=q(t,`submitDisabled`,3,!1),c=q(t,`submitLabel`,3,`Save`),l=q(t,`submittingLabel`,3,`Saving...`),u=q(t,`submitIcon`,3,_o),d=q(t,`cancel`,3,!0),p=q(t,`dialogClass`,3,``),m=q(t,`novalidate`,3,!1),h=q(t,`canClose`,3,()=>!0);function g(){Y.dialogOpen||h()()&&t.onclose?.()}Hs(e,{get open(){return n()},variant:`editor`,onclose:g,children:(e,n)=>{var h=jE(),g=P(h),_=P(g),v=P(_),y=P(v),b=e=>{var n=Xr();mi(F(n),()=>t.header),V(e,n)},x=e=>{var n=OE(),i=F(n),a=P(i,!0);D(i);var o=I(i,2),s=e=>{var n=Xr();mi(F(n),()=>t.headerHint),V(e,n)};U(o,e=>{t.headerHint&&e(s)}),L(()=>H(a,r())),V(e,n)};U(y,e=>{t.header?e(b):e(x,-1)}),D(v);var S=I(v,2);{let e=A(()=>`Close `+(i()||r()).toLowerCase());Rs(S,{get label(){return R(e)},onclick:()=>t.onclose?.()})}D(_);var C=I(_,2);mi(C,()=>t.children??f);var w=I(C,2),T=e=>{var t=kE(),n=P(t,!0);D(t),L(()=>H(n,a())),V(e,t)};U(w,e=>{a()&&e(T)});var E=I(w,2),ee=P(E),te=e=>{var n=AE();z(`click`,n,()=>t.onclose?.()),V(e,n)};U(ee,e=>{d()&&e(te)});var ne=I(ee,2),re=e=>{var n=Xr();mi(F(n),()=>t.extraActions),V(e,n)};U(ne,e=>{t.extraActions&&e(re)});var ie=I(ne,2),ae=P(ie);J(ae,{get icon(){return u()},class:`form-action-icon`});var oe=I(ae,2),se=P(oe,!0);D(oe),D(ie),D(E),D(g),D(h),L(()=>{G(h,1,Ni([`model-editor`,p()])),K(h,`aria-label`,i()||r()),g.noValidate=m(),ie.disabled=o()||s(),H(se,o()?l():c())}),zr(`submit`,g,e=>{e.preventDefault(),t.onsubmit?.()}),V(e,h)},$$slots:{default:!0}}),k()}Br([`click`]);var NE=B(`
`);function PE(e,t){let n=q(t,`label`,3,``);var r=NE(),i=P(r),a=P(i,!0);D(i),mi(I(i,2),()=>t.children??f),D(r),L(()=>{K(i,`for`,t.id),H(a,n())}),V(e,r)}var FE=B(``),IE=B(``),LE=B(``),RE=B(``),zE=B(``),BE=B(``),VE=B(`

Editing a budget updates its limit only. Use Reset to start a new + budget period.

`),HE=B(`
`,1),UE=B(``),WE=B(` `,1);function GE(e,t){O(t,!0);function n(e){X.setFormSubject(e.target.value),e.target.value=X.form.subject}var r=WE(),i=F(r);{let e=A(()=>X.editing?`Edit Budget`:`Create Budget`);ME(i,{get open(){return X.formOpen},get title(){return R(e)},ariaLabel:`Budget editor`,get error(){return X.formError},get submitting(){return X.formSubmitting},submitLabel:`Save Budget`,dialogClass:`budget-editor`,canClose:()=>!X.overrideDialogOpen,onclose:()=>X.closeForm(),onsubmit:()=>X.submitForm(),children:(e,t)=>{var r=HE(),i=F(r),a=P(i);PE(a,{id:`budget-scope`,label:`Scope`,children:(e,t)=>{var n=IE();W(n,21,NT,e=>e.value,(e,t)=>{var n=FE(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),L(()=>n.disabled=X.editing),z(`change`,n,()=>X.syncScope()),Ui(n,()=>X.form.scope,e=>X.form.scope=e),V(e,n)},$$slots:{default:!0}});var o=I(a,2);{let e=A(()=>RT(X.form));PE(o,{id:`budget-subject`,get label(){return R(e)},children:(e,t)=>{var r=LE();ea(r),L(e=>{K(r,`placeholder`,e),ta(r,X.form.subject),r.disabled=X.editing,K(r,`data-modal-autofocus`,!X.editing||void 0)},[()=>zT(X.form)]),z(`input`,r,n),V(e,r)},$$slots:{default:!0}})}var s=I(o,2);PE(s,{id:`budget-period`,label:`Period`,children:(e,t)=>{var n=RE();W(n,21,VT,e=>e.value,(e,t)=>{var n=FE(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),L(()=>n.disabled=X.editing),z(`change`,n,()=>X.syncPeriodSeconds()),Ui(n,()=>X.form.period,e=>X.form.period=e),V(e,n)},$$slots:{default:!0}});var c=I(s,2),l=e=>{PE(e,{id:`budget-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=zE();ea(n),L(()=>n.disabled=X.editing),la(n,()=>X.form.period_seconds,e=>X.form.period_seconds=e),V(e,n)},$$slots:{default:!0}})};U(c,e=>{X.form.period===`custom`&&e(l)}),PE(I(c,2),{id:`budget-amount`,label:`Amount`,children:(e,t)=>{var n=BE();ea(n),L(()=>K(n,`data-modal-autofocus`,X.editing||void 0)),la(n,()=>X.form.amount,e=>X.form.amount=e),V(e,n)},$$slots:{default:!0}}),D(i);var u=I(i,2),d=e=>{V(e,VE())};U(u,e=>{X.editing&&e(d)}),V(e,r)},$$slots:{default:!0}})}Hs(I(i,2),{get open(){return X.overrideDialogOpen},variant:`auth`,onclose:()=>X.closeOverrideDialog(),children:(e,t)=>{var n=UE(),r=P(n);Rs(I(P(r),2),{label:`Close budget override dialog`,onclick:()=>X.closeOverrideDialog(),class:`auth-dialog-close`,iconClass:``}),D(r);var i=I(r,2),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=I(c,2),u=P(l);J(u,{get icon(){return _o},class:`form-action-icon`});var d=I(u,2),f=P(d,!0);D(d),D(l),D(s),D(i),D(n),L(e=>{H(o,e),l.disabled=X.formSubmitting,H(f,X.formSubmitting?`Saving...`:`Override Budget`)},[()=>aE(X.overridePendingPayload,X.overrideExistingBudget)]),zr(`submit`,i,e=>{e.preventDefault(),X.confirmOverride()}),z(`click`,c,()=>X.closeOverrideDialog()),V(e,n)},$$slots:{default:!0}}),V(e,r),k()}Br([`change`,`input`,`click`]);var KE=B(`

Budgets

`),qE=B(``),JE=B(`
Budget management is unavailable.
`),YE=B(``),XE=B(`
`),ZE=B(`

No budgets configured yet.

`),QE=B(`

No budgets match your filter.

`),$E=B(`
`);function eD(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`budgets`&&X.fetchBudgetsPage()});let n=A(()=>X.filteredBudgets());var r=$E(),i=P(r),a=P(i);iC(P(a),{copyId:`budgets-help-copy`,label:`budgets help`,title:e=>{V(e,KE())},help:e=>{Ve(),V(e,Yr(`Budgets are evaluated from tracked usage cost records for each user + path subtree. Enforcement runs only when Budget is enabled for the + active workflow.`))},$$slots:{title:!0,help:!0}}),D(a);var o=I(a,2),s=P(o),c=e=>{var t=qE();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=X.formSubmitting),z(`click`,t,()=>X.openForm()),V(e,t)},l=A(()=>X.managementEnabled()&&X.budgetsAvailable&&!Y.authError);U(s,e=>{R(l)&&e(c)}),D(o),D(i);var u=I(i,2);Kc(u,{});var d=I(u,2),f=e=>{V(e,JE())},p=A(()=>(!X.managementEnabled()||!X.budgetsAvailable)&&!Y.authError);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{var t=YE(),n=P(t,!0);D(t),L(()=>H(n,X.error)),V(e,t)};U(m,e=>{X.error&&!Y.authError&&e(h)});var g=I(m,2),_=e=>{ET(e,{label:`Loading budgets...`})};U(g,e=>{X.loading&&!Y.authError&&e(_)});var v=I(g,2),y=e=>{var t=XE(),n=P(t);jw(P(n),{id:`budget-filter`,placeholder:`Filter by user path, label, or period...`,label:`Filter budgets by user path or period`,get value(){return X.filter},set value(e){X.filter=e}}),D(n);var r=I(n,2),i=I(P(r),2),a=P(i);a.value=a.__value=`subject`;var o=I(a);o.value=o.__value=`period`,D(i),D(r),D(t),Ui(i,()=>X.sortBy,e=>X.sortBy=e),V(e,t)};U(v,e=>{(X.budgets.length>0||X.filter)&&X.budgetsAvailable&&!Y.authError&&!X.formOpen&&e(y)});var b=I(v,2);GE(b,{});var x=I(b,2),S=e=>{DE(e,{get budgets(){return R(n)}})};U(x,e=>{R(n).length>0&&X.budgetsAvailable&&!Y.authError&&e(S)});var C=I(x,2),w=e=>{V(e,ZE())},T=A(()=>X.budgets.length===0&&!X.filter&&!X.loading&&!Y.authError&&!X.error&&X.budgetsAvailable&&X.managementEnabled());U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{V(e,QE())},te=A(()=>X.budgets.length>0&&R(n).length===0&&X.filter&&!X.loading&&!Y.authError&&!X.error&&X.budgetsAvailable&&X.managementEnabled());U(E,e=>{R(te)&&e(ee)}),D(r),V(e,r),k()}Br([`click`]);function tD(){return{scope:`user_path`,subject:`/`,period:`minute`,period_seconds:60,max_requests:``,max_tokens:``,source:`manual`}}function nD(e){let t={user_path:{label:`User path`,chip:`user path`,fieldLabel:`User Path`,placeholder:`/team/alpha`},provider:{label:`Provider`,chip:`provider`,fieldLabel:`Provider Name`,placeholder:`openai`},model:{label:`Model`,chip:`model`,fieldLabel:`Model`,placeholder:`openai/gpt-4o`}};return t[e]||t.user_path}function rD(){return[`user_path`,`provider`,`model`].map(e=>({value:e,label:nD(e).label}))}function iD(e){return String(e&&e.scope||``).trim()||`user_path`}function aD(e){return String(e&&e.subject||``).trim()||String(e&&e.user_path||``)}function oD(e){return nD(iD(e)).chip}function sD(e){return nD(String(e&&e.scope||``)).fieldLabel}function cD(e){return nD(String(e&&e.scope||``)).placeholder}function lD(e){e.subject=String(e&&e.scope||``)===`user_path`?`/`:``}function uD(){return[{value:`minute`,label:`Per minute`},{value:`hour`,label:`Per hour`},{value:`day`,label:`Per day`},{value:`concurrent`,label:`Concurrent (in-flight)`},{value:`custom`,label:`Custom seconds`}]}function dD(e){switch(String(e||``).trim().toLowerCase()){case`minute`:return 60;case`hour`:return 3600;case`day`:return 86400;case`concurrent`:return 0;default:return-1}}function fD(e){switch(Number(e||0)){case 60:return`minute`;case 3600:return`hour`;case 86400:return`day`;case 0:return`concurrent`;default:return`custom`}}function pD(e){let t=String(e&&e.period||``).trim(),n=dD(t);n>=0&&(e.period_seconds=n),t===`concurrent`&&(e.max_tokens=``)}function mD(e){return iD(e)+`:`+aD(e)+`:`+String(e&&e.period_seconds||`0`)}function hD(e){return Number(e&&e.period_seconds||0)===0}function gD(e){return String(e&&e.period_label||``).trim()||fD(Number(e&&e.period_seconds||0))}function _D(e){return String(e&&e.source||``)===`config`?`config`:`manual`}function vD(e){return String(e&&e.source||``)===`config`}function yD(e){let t=Number(e);return Number.isFinite(t)?t.toLocaleString():`0`}function bD(e,t){let n=Number(e),r=Number(t);if(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)return 0;let i=Math.round(n/r*100);return Math.min(Math.max(i,0),100)}function xD(e,t){let n=String(t||``).trim().toLowerCase(),r=Array.isArray(e)?e.slice():[],i={user_path:0,provider:1,model:2};return r.sort((e,t)=>{let n=(i[iD(e)]||0)-(i[iD(t)]||0);if(n!==0)return n;let r=aD(e).localeCompare(aD(t));return r===0?Number(e.period_seconds||0)-Number(t.period_seconds||0):r}),n?r.filter(e=>{let t=aD(e).toLowerCase(),r=oD(e).toLowerCase(),i=gD(e).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)}):r}function SD(e){return!e||!Array.isArray(e.rate_limits)?[]:e.rate_limits}function CD(e,t,n){let r=String(t||``).trim();return r=e===`provider`||e===`model`?r.toLowerCase():`/`+r.split(`/`).map(e=>e.trim()).filter(Boolean).join(`/`),e+`:`+r+`:`+Number(n||0)}function wD(e,t){return e?CD(t.scope,t.subject,t.limit_key.period_seconds)!==CD(e.scope,e.subject,e.period_seconds):!1}function TD(e){let t=e||{},n=String(t.scope||`user_path`),r=String(t.subject||``).trim();if(n!==`user_path`&&!r)return{error:sD(t)+` is required.`};let i=String(t.period||``)===`concurrent`,a=t.period_seconds;if(a===``||a==null)return{error:`Period seconds is required.`};let o=Number(a);if(!Number.isInteger(o)||o<0||o===0&&!i)return{error:`Period seconds must be a positive integer (0 only for the concurrent period).`};let s=String(t.max_requests===void 0||t.max_requests===null?``:t.max_requests).trim(),c=String(t.max_tokens===void 0||t.max_tokens===null?``:t.max_tokens).trim();if(!s&&!c)return{error:`Set max requests, max tokens, or both.`};if(i&&c)return{error:`Token limits are not valid for the concurrent period.`};let l={scope:n,subject:r||`/`,limit_key:{period_seconds:o}};if(s){let e=Number(s);if(!Number.isInteger(e)||e<=0)return{error:`Max requests must be a positive integer.`};l.max_requests=e}if(c){let e=Number(c);if(!Number.isInteger(e)||e<=0)return{error:`Max tokens must be a positive integer.`};l.max_tokens=e}return{payload:l}}function ED(e,t,n){if(iD(e)!==`model`)return!1;let r=String(aD(e)).toLowerCase(),i=String(n||``).trim().toLowerCase();if(!i)return!1;if(r===i)return!0;let a=String(t||``).trim().toLowerCase();return a?r===a+`/`+i||i.startsWith(a+`/`)&&r===i.slice(a.length+1):!1}function DD(e,t){return iD(e)===`provider`&&String(aD(e)).toLowerCase()===String(t||``).trim().toLowerCase()}function OD(e){let t=e||{},n=String(t.model||``),r=String(t.provider||``);return!r||n.toLowerCase().startsWith(r+`/`)?n:r+`/`+n}function kD(e,t){let n=e||{},r=Array.isArray(t)?t:[],i=[];return n.kind===`model`&&i.push({key:`model`,title:`Model limits`,scope:`model`,subject:OD(n),hint:``,items:r.filter(e=>ED(e,n.provider,n.model))}),i.push({key:`provider`,title:`Provider limits (`+n.provider+`)`,scope:`provider`,subject:n.provider,hint:n.kind===`model`?`Shared by every model routed to this provider.`:``,items:r.filter(e=>DD(e,n.provider))}),i.push({key:`global`,title:`Global limits`,scope:`user_path`,subject:`/`,hint:`Root user-path rules throttle all traffic. Narrower user-path rules also apply, per consumer.`,items:r.filter(e=>iD(e)===`user_path`&&aD(e)===`/`)}),i}function AD(e){return hD(e)?bD(e.in_flight,e.max_requests):Math.max(bD(e.requests_used,e.max_requests),bD(e.tokens_used,e.max_tokens))}function jD(e){return`--rate-limit-pressure: `+AD(e)+`%`}function MD(e){let t=AD(e);return t>=100?`rate-limit-pressure-row rate-limit-pressure-full`:t>=75?`rate-limit-pressure-row rate-limit-pressure-high`:`rate-limit-pressure-row`}function ND(e){return(Array.isArray(e)?e:[]).some(e=>iD(e)===`user_path`&&aD(e)===`/`)}function PD(e,t,n){let r=Array.isArray(e)?e:[];return r.some(e=>ED(e,t,n))?`table-action-btn-active`:r.some(e=>DD(e,t))||ND(r)?`rate-limit-gauge-inherited`:``}function FD(e,t){let n=Array.isArray(e)?e:[];return n.some(e=>DD(e,t))?`table-action-btn-active`:ND(n)?`rate-limit-gauge-inherited`:``}function ID(e,t){let n=`Rate limits for `+e;return t===`table-action-btn-active`?n+` (direct limits configured)`:t?n+` (inherited limits apply)`:n}function LD(e){if(hD(e))return yD(e.in_flight)+` of `+yD(e.max_requests)+` in flight`;let t=[];return e.max_requests!==null&&e.max_requests!==void 0&&t.push(yD(e.requests_used)+`/`+yD(e.max_requests)+` req`),e.max_tokens!==null&&e.max_tokens!==void 0&&t.push(yD(e.tokens_used)+`/`+yD(e.max_tokens)+` tok`),t.join(` · `)}var Z=new class{#e=j(N([]));get rateLimits(){return R(this.#e)}set rateLimits(e){M(this.#e,e,!0)}#t=j(!0);get rateLimitsAvailable(){return R(this.#t)}set rateLimitsAvailable(e){M(this.#t,e,!0)}#n=j(!1);get rateLimitsLoading(){return R(this.#n)}set rateLimitsLoading(e){M(this.#n,e,!0)}rateLimitFetchPromise=null;#r=j(``);get rateLimitFilter(){return R(this.#r)}set rateLimitFilter(e){M(this.#r,e,!0)}#i=j(``);get rateLimitError(){return R(this.#i)}set rateLimitError(e){M(this.#i,e,!0)}#a=j(!1);get rateLimitFormOpen(){return R(this.#a)}set rateLimitFormOpen(e){M(this.#a,e,!0)}#o=j(!1);get rateLimitFormSubmitting(){return R(this.#o)}set rateLimitFormSubmitting(e){M(this.#o,e,!0)}#s=j(``);get rateLimitFormError(){return R(this.#s)}set rateLimitFormError(e){M(this.#s,e,!0)}#c=j(!1);get rateLimitEditing(){return R(this.#c)}set rateLimitEditing(e){M(this.#c,e,!0)}rateLimitEditingOriginal=null;rateLimitFormReturnToInspector=!1;#l=j(``);get rateLimitResettingKey(){return R(this.#l)}set rateLimitResettingKey(e){M(this.#l,e,!0)}#u=j(``);get rateLimitDeletingKey(){return R(this.#u)}set rateLimitDeletingKey(e){M(this.#u,e,!0)}#d=j(!1);get rateLimitInspectorOpen(){return R(this.#d)}set rateLimitInspectorOpen(e){M(this.#d,e,!0)}#f=j(N({kind:``,provider:``,model:``,title:``}));get rateLimitInspector(){return R(this.#f)}set rateLimitInspector(e){M(this.#f,e,!0)}#p=j(N(tD()));get rateLimitForm(){return R(this.#p)}set rateLimitForm(e){M(this.#p,e,!0)}rateLimitsEnabled(){return ks.rateLimitsVisible()}defaultRateLimitForm(){return tD()}rateLimitScopeMeta(e){return nD(e)}rateLimitScopeOptions(){return rD()}rateLimitScope(e){return iD(e)}rateLimitSubject(e){return aD(e)}rateLimitScopeLabel(e){return oD(e)}rateLimitSubjectFieldLabel(){return sD(this.rateLimitForm)}rateLimitSubjectPlaceholder(){return cD(this.rateLimitForm)}syncRateLimitScope(){lD(this.rateLimitForm)}rateLimitPeriodOptions(){return uD()}rateLimitPeriodSeconds(e){return dD(e)}rateLimitPeriodFromSeconds(e){return fD(e)}syncRateLimitPeriodSeconds(){pD(this.rateLimitForm)}rateLimitKey(e){return mD(e)}rateLimitIsConcurrent(e){return hD(e)}rateLimitPeriodLabel(e){return gD(e)}rateLimitSourceLabel(e){return _D(e)}rateLimitIsReadOnly(e){return vD(e)}formatRateLimitNumber(e){return yD(e)}rateLimitUsagePercent(e,t){return bD(e,t)}filteredRateLimits(){return xD(this.rateLimits,this.rateLimitFilter)}normalizeRateLimitListPayload(e){return SD(e)}async fetchRateLimitsPage(){if(await ks.ensureLoaded(),!this.rateLimitsEnabled()){this.rateLimits=[],this.rateLimitsAvailable=!1,this.rateLimitError=``;return}return this.rateLimitFetchPromise||=this.fetchRateLimits().finally(()=>{this.rateLimitFetchPromise=null}),this.rateLimitFetchPromise}async fetchRateLimits(){this.rateLimitsLoading=!0,this.rateLimitError=``;let e=await kT(`/admin/rate-limits`,{label:`rate limits`,errorFallback:`Unable to load rate limits.`,normalize:SD});if(this.rateLimitsLoading=!1,e.status!==`stale`){if(e.status===`unavailable`){this.rateLimitsAvailable=!1,this.rateLimits=[];return}if(!e.result){this.rateLimits=[],this.rateLimitError=e.error;return}if(this.rateLimitsAvailable=!0,e.status===`error`){this.rateLimitError=e.error;return}this.rateLimits=e.items}}openRateLimitForm(e){if(this.rateLimitEditing=!!e,this.rateLimitFormError=``,e){let t=Number(e.period_seconds||0);this.rateLimitEditingOriginal={scope:iD(e),subject:aD(e),period_seconds:t},this.rateLimitForm={scope:iD(e),subject:aD(e),period:fD(t),period_seconds:t,max_requests:e.max_requests===null||e.max_requests===void 0?``:String(e.max_requests),max_tokens:e.max_tokens===null||e.max_tokens===void 0?``:String(e.max_tokens),source:String(e.source||`manual`)}}else this.rateLimitEditingOriginal=null,this.rateLimitForm=tD();this.rateLimitFormOpen=!0}closeRateLimitForm(){this.rateLimitFormOpen=!1,this.rateLimitFormSubmitting=!1,this.rateLimitFormError=``,this.rateLimitEditing=!1,this.rateLimitEditingOriginal=null,this.rateLimitForm=tD(),this.rateLimitFormReturnToInspector&&(this.rateLimitFormReturnToInspector=!1,this.rateLimitInspectorOpen=!0)}rateLimitNormalizedIdentity(e,t,n){return CD(e,t,n)}rateLimitIdentityMoved(e){return wD(this.rateLimitEditingOriginal,e)}setRateLimitFormSubject(e){this.rateLimitForm.subject=String(e||``)}rateLimitFormPayload(){return TD(this.rateLimitForm)}async submitRateLimitForm(){if(this.rateLimitFormSubmitting)return;let{payload:e,error:t}=this.rateLimitFormPayload();if(t){this.rateLimitFormError=t;return}let n=this.rateLimitIdentityMoved(e),r=this.rateLimitEditingOriginal;this.rateLimitFormSubmitting=!0,this.rateLimitFormError=``;try{let t=await AT(`/admin/rate-limits`,`PUT`,e,{label:`save rate limit`,errorFallback:`Unable to save rate limit.`,unavailableStatuses:[]});if(t.status===`stale`)return;if(t.status!==`ok`){this.rateLimitFormError=t.error;return}if(this.rateLimits=SD(t.result.data),n&&!await this.deleteMovedRateLimitOriginal(r))return;this.closeRateLimitForm(),lc.success(n?`Rate limit moved; live counters restarted.`:`Rate limit saved.`)}finally{this.rateLimitFormSubmitting=!1}}async deleteMovedRateLimitOriginal(e){let t=await AT(`/admin/rate-limits`,`DELETE`,{scope:e.scope,subject:e.subject,limit_key:{period_seconds:Number(e.period_seconds||0)}},{label:`remove the moved rate limit`,errorFallback:`The new rule was saved, but the previous one could not be removed. Delete it manually.`,unavailableStatuses:[]});return t.status===`stale`?!1:t.status===`ok`?(this.rateLimits=SD(t.result.data),!0):(this.rateLimitFormError=t.error,!1)}async deleteRateLimit(e){let t=mD(e);if(this.rateLimitDeletingKey===t)return;this.rateLimitDeletingKey=t;let n=await AT(`/admin/rate-limits`,`DELETE`,{scope:iD(e),subject:aD(e),limit_key:{period_seconds:Number(e.period_seconds||0)}},{label:`delete rate limit`,errorFallback:`Unable to delete rate limit.`,unavailableStatuses:[]});if(this.rateLimitDeletingKey=``,n.status!==`stale`){if(n.status!==`ok`){lc.error(n.error);return}this.rateLimits=SD(n.result.data),lc.success(`Rate limit deleted.`)}}async resetRateLimit(e){let t=mD(e);if(this.rateLimitResettingKey===t)return;this.rateLimitResettingKey=t;let n=await AT(`/admin/rate-limits/reset-one`,`POST`,{scope:iD(e),subject:aD(e),period_seconds:Number(e.period_seconds||0)},{label:`reset rate limit`,errorFallback:`Unable to reset rate limit.`,unavailableStatuses:[]});if(this.rateLimitResettingKey=``,n.status!==`stale`){if(n.status!==`ok`){lc.error(n.error);return}this.rateLimits=SD(n.result.data),lc.success(`Rate limit counters reset.`)}}rateLimitInspectorModelID(e){return String(e&&e.model&&e.model.id||``).trim()}openRateLimitInspectorForModel(e){let t=this.rateLimitInspectorModelID(e),n=String(e&&e.provider_name||``).trim().toLowerCase();this.rateLimitInspector={kind:`model`,provider:n,model:t,title:String(e&&e.display_name||t)},this.showRateLimitInspector()}openRateLimitInspectorForProvider(e){let t=String(e&&e.provider_name||``).trim().toLowerCase();this.rateLimitInspector={kind:`provider`,provider:t,model:``,title:String(e&&e.display_name||t)},this.showRateLimitInspector()}showRateLimitInspector(){this.rateLimitInspectorOpen=!0,this.fetchRateLimitsPage()}closeRateLimitInspector(){this.rateLimitInspectorOpen=!1}rateLimitRuleMatchesModel(e,t,n){return ED(e,t,n)}rateLimitRuleMatchesProvider(e,t){return DD(e,t)}rateLimitInspectorQualifiedModel(){return OD(this.rateLimitInspector)}rateLimitInspectorSections(){return kD(this.rateLimitInspector,this.rateLimits)}rateLimitPressurePercent(e){return AD(e)}rateLimitPressureStyle(e){return jD(e)}rateLimitPressureClass(e){return MD(e)}rateLimitGaugeCache={rules:null,states:{}};rateLimitGaugeMemo(e,t){this.rateLimitGaugeCache.rules!==this.rateLimits&&(this.rateLimitGaugeCache={rules:this.rateLimits,states:{}});let n=this.rateLimitGaugeCache.states;return e in n||(n[e]=t()),n[e]}rateLimitGaugeClassForModel(e){let t=this.rateLimitInspectorModelID(e),n=String(e&&e.provider_name||``).trim().toLowerCase(),r=this.rateLimits;return this.rateLimitGaugeMemo(`model:`+n+`/`+t,()=>PD(r,n,t))}rateLimitGaugeClassForProvider(e){let t=String(e&&e.provider_name||``).trim().toLowerCase(),n=this.rateLimits;return this.rateLimitGaugeMemo(`provider:`+t,()=>FD(n,t))}hasGlobalRateLimits(){let e=this.rateLimits;return this.rateLimitGaugeMemo(`global`,()=>ND(e))}rateLimitGaugeTitle(e,t){return ID(e,t)}rateLimitInspectorSummary(e){return LD(e)}openRateLimitFormFromInspector(e,t,n){this.rateLimitInspectorOpen=!1,this.rateLimitFormReturnToInspector=!0,this.openRateLimitForm(n||void 0),n||(this.rateLimitForm.scope=e,this.rateLimitForm.subject=t)}},RD=B(``),zD=B(``),BD=B(``),VD=B(``),HD=B(``),UD=B(``),WD=B(``),GD=B(`

Scope, subject, and period identify the rule: changing any of them + moves the rule to a new key and restarts its live counters.

`),KD=B(`

A user path rule limits the whole subtree; provider and model rules cap + all traffic routed there and make load balancing skip the target while + it is saturated. One shared counter per rule. Leave a field empty to + skip that limit. Token limits require usage tracking.

`,1);function qD(e,t){O(t,!0);{let t=A(()=>Z.rateLimitEditing?`Edit Rate Limit`:`Create Rate Limit`);ME(e,{get open(){return Z.rateLimitFormOpen},get title(){return R(t)},ariaLabel:`Rate limit editor`,get error(){return Z.rateLimitFormError},get submitting(){return Z.rateLimitFormSubmitting},submitLabel:`Save Rate Limit`,dialogClass:`budget-editor`,novalidate:!0,onclose:()=>Z.closeRateLimitForm(),onsubmit:()=>Z.submitRateLimitForm(),children:(e,t)=>{var n=KD(),r=F(n),i=P(r);PE(i,{id:`rate-limit-scope`,label:`Scope`,children:(e,t)=>{var n=zD();W(n,21,()=>Z.rateLimitScopeOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitScope()),Ui(n,()=>Z.rateLimitForm.scope,e=>Z.rateLimitForm.scope=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2);{let e=A(()=>Z.rateLimitSubjectFieldLabel());PE(a,{id:`rate-limit-subject`,get label(){return R(e)},children:(e,t)=>{var n=BD();ea(n),L(e=>{K(n,`placeholder`,e),K(n,`data-modal-autofocus`,!Z.rateLimitEditing||void 0),ta(n,Z.rateLimitForm.subject)},[()=>Z.rateLimitSubjectPlaceholder()]),z(`input`,n,e=>Z.setRateLimitFormSubject(e.currentTarget.value)),V(e,n)},$$slots:{default:!0}})}var o=I(a,2);PE(o,{id:`rate-limit-period`,label:`Period`,children:(e,t)=>{var n=VD();W(n,21,()=>Z.rateLimitPeriodOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitPeriodSeconds()),Ui(n,()=>Z.rateLimitForm.period,e=>Z.rateLimitForm.period=e),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=e=>{PE(e,{id:`rate-limit-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=HD();ea(n),la(n,()=>Z.rateLimitForm.period_seconds,e=>Z.rateLimitForm.period_seconds=e),V(e,n)},$$slots:{default:!0}})};U(s,e=>{Z.rateLimitForm.period===`custom`&&e(c)});var l=I(s,2);{let e=A(()=>Z.rateLimitForm.period===`concurrent`?`Max In-Flight Requests`:`Max Requests`);PE(l,{id:`rate-limit-max-requests`,get label(){return R(e)},children:(e,t)=>{var n=UD();ea(n),L(()=>K(n,`data-modal-autofocus`,Z.rateLimitEditing?!0:void 0)),la(n,()=>Z.rateLimitForm.max_requests,e=>Z.rateLimitForm.max_requests=e),V(e,n)},$$slots:{default:!0}})}var u=I(l,2),d=e=>{PE(e,{id:`rate-limit-max-tokens`,label:`Max Tokens`,children:(e,t)=>{var n=WD();ea(n),la(n,()=>Z.rateLimitForm.max_tokens,e=>Z.rateLimitForm.max_tokens=e),V(e,n)},$$slots:{default:!0}})};U(u,e=>{Z.rateLimitForm.period!==`concurrent`&&e(d)}),D(r);var f=I(r,4),p=e=>{V(e,GD())};U(f,e=>{Z.rateLimitEditing&&e(p)}),V(e,n)},$$slots:{default:!0}})}k()}Br([`change`,`input`]);var JD=B(` `),YD=B(` Edit`,1),XD=B(` `,1),ZD=B(`
In-flight
`),QD=B(`
Requests
`),$D=B(`
Tokens
`),eO=B(`
`),tO=B(`
`);function nO(e,t){O(t,!0);var n=tO();W(n,21,()=>t.rules,e=>Z.rateLimitKey(e),(e,t)=>{var n=eO(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=e=>{var n=JD(),r=P(n);{let e=A(()=>Z.rateLimitScope(R(t))===`provider`?bo:Pa);J(r,{get icon(){return R(e)},class:`budget-period-icon`})}var i=I(r,2),a=P(i,!0);D(i),D(n),L((e,t)=>{K(n,`title`,e),H(a,t)},[()=>`Rule scope: `+Z.rateLimitScopeLabel(R(t)),()=>Z.rateLimitScopeLabel(R(t))]),V(e,n)},u=A(()=>Z.rateLimitScope(R(t))!==`user_path`);U(c,e=>{R(u)&&e(l)});var d=I(c,2),f=P(d);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?ka:ko);J(f,{get icon(){return R(e)},class:`budget-period-icon`})}var p=I(f,2),m=P(p,!0);D(p),D(d),D(s);var h=I(s,2),g=P(h),_=P(g),v=P(_,!0);D(_),D(g);var y=I(g,2),b=P(y),x=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitForm(R(t)),children:(e,t)=>{var n=YD();J(F(n),{get icon(){return uo},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},S=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(b,e=>{R(S)&&e(x)});var C=I(b,2);{let e=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting counters`:`Reset counters`),n=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t)));OT(C,{get label(){return R(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>Z.resetRateLimit(R(t)),get disabled(){return R(n)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return go},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting`:`Reset`]),V(e,r)},$$slots:{default:!0}})}var w=I(C,2),T=e=>{{let n=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting rate limit`:`Delete rate limit`),r=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t)));OT(e,{get label(){return R(n)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>Z.deleteRateLimit(R(t)),get disabled(){return R(r)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return Ao},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting`:`Delete`]),V(e,r)},$$slots:{default:!0}})}},E=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(w,e=>{R(E)&&e(T)}),D(y),D(h),D(i);var ee=I(i,2),te=P(ee),ne=e=>{var n=ZD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u),D(l),D(o),D(n),L((e,t,n,r,i,l)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l)},[()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests),()=>`In-flight requests: `+Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` in flight`]),V(e,n)},re=A(()=>Z.rateLimitIsConcurrent(R(t)));U(te,e=>{R(re)&&e(ne)});var ie=I(te,2),ae=e=>{var n=QD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests),()=>`Requests used: `+Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` requests`,()=>Z.formatRateLimitNumber(R(t).requests_remaining)+` left`]),V(e,n)},oe=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_requests);U(ie,e=>{R(oe)&&e(ae)});var se=I(ie,2),ce=e=>{var n=$D(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens),()=>`Tokens used: `+Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)>=100}),()=>Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens)+` tokens`,()=>Z.formatRateLimitNumber(R(t).tokens_remaining)+` left`]),V(e,n)},le=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_tokens);U(se,e=>{R(le)&&e(ce)}),D(ee),D(r),D(n),L((e,t,n,r,i)=>{K(a,`title`,e),H(o,t),H(m,n),K(_,`title`,r),H(v,i)},[()=>Z.rateLimitScopeLabel(R(t))+`: `+Z.rateLimitSubject(R(t)),()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n),k()}var rO=B(`

Rate Limits

`),iO=B(``),aO=B(`
Rate limit management is unavailable.
`),oO=B(``),sO=B(`
`),cO=B(`

No rate limits configured yet.

`),lO=B(`

No rate limits match your filter.

`),uO=B(`
`);function dO(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`rate-limits`&&Z.fetchRateLimitsPage()});let n=A(()=>Z.filteredRateLimits());var r=uO(),i=P(r),a=P(i);iC(P(a),{copyId:`rate-limits-help-copy`,label:`rate limits help`,text:`Rate limits cap requests, tokens, and in-flight concurrency for a user path subtree, a provider, or a model. Consumer (user path) breaches return 429 with Retry-After and x-ratelimit-* headers; saturated providers and models are skipped by load balancing and failover while capacity exists elsewhere. Counters are per gateway instance and reset on restart; token limits need usage tracking.`,title:e=>{V(e,rO())},$$slots:{title:!0}}),D(a);var o=I(a,2),s=P(o),c=e=>{var t=iO();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=Z.rateLimitFormSubmitting),z(`click`,t,()=>Z.openRateLimitForm()),V(e,t)},l=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitsAvailable&&!Y.authError);U(s,e=>{R(l)&&e(c)}),D(o),D(i);var u=I(i,2);Kc(u,{});var d=I(u,2),f=e=>{V(e,aO())},p=A(()=>(!Z.rateLimitsEnabled()||!Z.rateLimitsAvailable)&&!Y.authError);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{var t=oO(),n=P(t,!0);D(t),L(()=>H(n,Z.rateLimitError)),V(e,t)};U(m,e=>{Z.rateLimitError&&!Y.authError&&e(h)});var g=I(m,2),_=e=>{ET(e,{label:`Loading rate limits...`})};U(g,e=>{Z.rateLimitsLoading&&!Y.authError&&e(_)});var v=I(g,2),y=e=>{var t=sO(),n=P(t);jw(P(n),{id:`rate-limit-filter`,placeholder:`Filter by subject, scope, or period...`,label:`Filter rate limits by subject, scope, or period`,get value(){return Z.rateLimitFilter},set value(e){Z.rateLimitFilter=e}}),D(n),D(t),V(e,t)};U(v,e=>{(Z.rateLimits.length>0||Z.rateLimitFilter)&&Z.rateLimitsAvailable&&!Y.authError&&!Z.rateLimitFormOpen&&e(y)});var b=I(v,2);qD(b,{});var x=I(b,2),S=e=>{nO(e,{get rules(){return R(n)}})};U(x,e=>{R(n).length>0&&Z.rateLimitsAvailable&&!Y.authError&&e(S)});var C=I(x,2),w=e=>{V(e,cO())},T=A(()=>Z.rateLimits.length===0&&!Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{V(e,lO())},te=A(()=>Z.rateLimits.length>0&&R(n).length===0&&Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(E,e=>{R(te)&&e(ee)}),D(r),V(e,r),k()}Br([`click`]);function fO(e){return String(e||``).trim().toLowerCase()}function pO(e){if(!e)return``;let t=String(e.selector||``).trim();if(t)return t;if(!e.model||!e.model.id)return``;let n=String(e.model.id||``).trim(),r=String(e.provider_name||``).trim();if(r)return r+`/`+n;let i=String(e.provider_type||``).trim();return!i||n.includes(`/`)?n:i+`/`+n}function mO(e,t,n,r){let i=new Set,a=String(e||``).trim().toLowerCase(),o=String(t||``).trim().toLowerCase(),s=String(n||``).trim().toLowerCase(),c=String(r||``).trim().toLowerCase();if(c&&i.add(c),!a)return i;i.add(a),s&&i.add(s+`/`+a),o&&!a.includes(`/`)&&i.add(o+`/`+a);let l=a.split(`/`);return l.length===2&&l[1]&&i.add(l[1]),i}function hO(e){return mO(e&&e.model?e.model.id:``,e?e.provider_type:``,e?e.provider_name:``,e?e.selector:``)}function gO(e){let t=new Set,n=String(e.resolved_model||``).trim().toLowerCase(),r=String(e.target_model||``).trim().toLowerCase(),i=String(e.target_provider||``).trim().toLowerCase();if(n){t.add(n);let e=n.split(`/`);e.length===2&&e[1]&&t.add(e[1])}if(r){t.add(r);let e=r.split(`/`);e.length===2&&e[1]&&t.add(e[1])}return r&&i&&t.add(i+`/`+r),t}function _O(e){if(!e)return``;let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n||n===t||n.startsWith(t+`/`)?n:t+`/`+n}function vO(e){if(e===``||e==null)return null;let t=Number(e);return!Number.isFinite(t)||t<=0?null:t}function yO(e,t){let n={model:e},r=vO(t);return r!==null&&(n.weight=r),n}function bO(e){let t=Array.isArray(e)?e:[],n=[];for(let e of t){let t=String(e&&e.model||``).trim();t&&n.push(yO(t,e&&e.weight))}return n}function xO(e){switch(String(e||``).toLowerCase()){case`cost`:return`lowest cost`;case`round_robin`:case``:return`round robin`;default:return e}}var SO={round_robin:`Round-robin (rotate across targets; honors weights)`,cost:`Lowest cost (cheapest target per request)`,adaptive:`Adaptive (target chosen by the registered routing extension)`};function CO(e,t){let n=Array.isArray(e)?[...e]:[],r=String(t||``).trim().toLowerCase();return r&&!n.includes(r)&&n.push(r),n.map(e=>({value:e,label:SO[e]||e}))}function wO(e){let t=Array.isArray(e.targets)?e.targets:[],n=t.length>0?t[0]:{},r=t.map(e=>{let t={provider:e.provider||``,model:e.model||``};return e.weight&&(t.weight=e.weight),t});return{name:e.source,target_provider:n.provider||``,target_model:n.model||``,targets:r,strategy:e.strategy||``,session_affinity:e.session_affinity!==!1,description:e.description||``,slowdown:Number(e.slowdown||0),enabled:e.enabled!==!1,managed:!!e.managed,valid:!!e.valid,resolved_model:e.resolved_model||``,provider_type:e.provider_type||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[]}}function TO(e){let t=Array.isArray(e)?e:[],n=[],r=[];for(let e of t)!e||typeof e!=`object`||(e.kind===`redirect`?n.push(wO(e)):e.kind===`policy`&&r.push({selector:e.source,provider_name:e.provider_name||``,model:e.model||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[],description:e.description||``,slowdown:Number(e.slowdown||0),enabled:e.enabled!==!1,managed:!!e.managed,scope_kind:e.scope_kind||``}));return{aliases:n,policies:r}}function EO(e){if(!e)return`—`;let t=Array.isArray(e.targets)?e.targets:[];return t.length>1?t.length+` targets · `+xO(e.strategy):e.resolved_model?e.resolved_model:e.target_provider?e.target_provider+`/`+e.target_model:e.target_model||`—`}function DO(e){return e?e.enabled===!1?`is-disabled`:e.valid?`is-valid`:`is-invalid`:`is-invalid`}function OO(e){return e?e.enabled===!1?`Disabled`:e.valid?`Active`:`Invalid`:`Invalid`}function kO(e){return Array.isArray(e)&&e.length>0&&e.indexOf(`/`)===-1}function AO(e,t){return!t||!e?``:e.effective_enabled===!1?`is-disabled`:kO(e.user_paths)?`is-restricted`:`is-enabled`}function jO(e){if(!e)return``;let t=[];e.effective_enabled===!1&&t.push(e.default_enabled===!1?`Disabled by default`:`Disabled`);let n=Array.isArray(e.user_paths)?e.user_paths:[];return n.length>0&&t.push(`Allowed for `+n.join(`, `)),t.join(` · `)}function MO({models:e,aliases:t,virtualModelsAvailable:n,activeCategory:r}){let i=Array.isArray(e)?e:[],a=Array.isArray(t)?t:[],o=new Map;if(n)for(let e of a){let t=fO(e&&e.name);!t||e.enabled===!1||!e.valid||o.set(t,e)}let s=new Map,c=i.map(e=>{let t=pO(e),n=null;for(let t of hO(e))s.has(t)||s.set(t,e),!n&&o.has(t)&&(n=o.get(t));let r=e&&e.access?e.access:null;return{key:`model:`+t,display_name:t,secondary_name:``,provider_name:e.provider_name||``,provider_type:e.provider_type||``,model:e.model,selector:e.selector||``,is_alias:!1,alias:null,access:r,masking_alias:n,has_virtual_model:!!(n||r&&r.override),alias_state_class:``,alias_state_text:``}});if(!n)return c;for(let e of a){let t=s.get(fO(e&&e.name));if(e&&e.enabled!==!1&&e.valid&&t)continue;let n=null;for(let t of gO(e))if(n=s.get(t)||null,n)break;!n&&r&&r!==`all`||c.push({key:`alias:`+e.name,display_name:e.name,secondary_name:EO(e),provider_name:n&&n.provider_name||``,provider_type:n?n.provider_type||e.provider_type||``:e.provider_type||``,model:n?n.model:{id:e.name,object:`model`},selector:``,is_alias:!0,alias:e,access:null,masking_alias:null,source_model_exists:!!t,has_virtual_model:!0,alias_state_class:DO(e),alias_state_text:OO(e)})}return c.sort((e,t)=>e.is_alias===t.is_alias?String(e.display_name||``).localeCompare(String(t.display_name||``)):e.is_alias?-1:1)}function NO(e,t){if(!t)return e;let n=String(t).toLowerCase();return e.filter(e=>[e.display_name,e.secondary_name,e.provider_name,e.provider_type,e.model&&e.model.owned_by,e.alias&&e.alias.description,e.alias&&e.alias_state_text,e.model&&e.model.metadata&&e.model.metadata.modes?e.model.metadata.modes.join(`,`):``,e.model&&e.model.metadata&&e.model.metadata.categories?e.model.metadata.categories.join(`,`):``].some(e=>String(e||``).toLowerCase().includes(n)))}function PO(e,t){return String(e||``).trim()||String(t||``).trim()||`Unassigned`}function FO(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return!r||r===n?``:r}function IO(e){let t=String(e||``).trim();return t?t+`/`:``}function LO(e){let t=Array.isArray(e)?e:[],n=t.filter(e=>e&&!e.is_alias).length,r=t.filter(e=>e&&e.is_alias).length,i=[];return n>0&&i.push(n+(n===1?` model`:` models`)),r>0&&i.push(r+(r===1?` alias`:` aliases`)),i.join(` · `)}function RO(e,t,n){let r=String(t||``).trim(),i=String(n||``).trim();for(let t of Array.isArray(e)?e:[]){let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim();if(!(r&&e!==r)&&!(!r&&i&&n!==i)&&t&&t.access)return t.access.default_enabled!==!1}return!0}function zO(e){for(let t of Array.isArray(e)?e:[])if(t&&t.access)return t.access.default_enabled!==!1;return!0}function BO(e,t){let n=String(t||``).trim();if(!n)return null;for(let t of Array.isArray(e)?e:[])if(String(t&&t.selector||``).trim()===n)return t;return null}function VO(e,t,n,r){let i=IO(t),a=r&&r.get(`/`)||null,o=i&&r&&r.get(i)||null,s=RO(e,t,n),c=o||a,l=c&&Array.isArray(c.user_paths)?Array.from(new Set(c.user_paths)).sort():[];return{selector:i,default_enabled:s,effective_enabled:c?c.enabled!==!1:s,user_paths:l,override:o}}function HO(e,t,n){if(!Array.isArray(e)||e.length===0)return[];let r=new Map;for(let e of Array.isArray(n)?n:[]){let t=String(e&&e.selector||``).trim();t&&r.set(t,e)}let i=[],a=new Map;for(let t of e){if(t&&t.is_alias){i.push(t);continue}let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim(),r=`provider-group:`+(e||n||`unassigned`);a.has(r)||a.set(r,{key:r,provider_name:e,provider_type:n,display_name:PO(e,n),type_label:FO(e,n),rows:[]});let o=a.get(r);!o.provider_name&&e&&(o.provider_name=e),!o.provider_type&&n&&(o.provider_type=n),o.display_name=PO(o.provider_name,o.provider_type),o.type_label=FO(o.provider_name,o.provider_type),o.rows.push(t)}let o=Array.from(a.values()).map(e=>{let n=VO(t,e.provider_name,e.provider_type,r);return{...e,access:n,access_summary:jO(n),item_count_label:LO(e.rows)}}).sort((e,t)=>String(e.display_name||``).localeCompare(String(t.display_name||``)));return i.length>0&&o.unshift({key:`virtual-model-group`,is_virtual_models:!0,provider_name:``,provider_type:``,display_name:`Virtual models`,type_label:``,rows:i,access:{selector:``},access_summary:``,item_count_label:LO(i)}),o}function UO(e,t){let n=BO(t,`/`),r=zO(e),i=n&&Array.isArray(n.user_paths)?n.user_paths:[];return{key:`scope-global`,is_alias:!1,display_name:`all providers and models`,access:{selector:`/`,default_enabled:r,effective_enabled:n?n.enabled!==!1:r,user_paths:i,override:n}}}function WO(e){return e?String(e.access&&e.access.selector||``).trim()||String(e.override_selector||``).trim()||pO(e):``}function GO(e){if(!e)return[];let t=[];return e.is_alias?t.push(`alias-row`,DO(e.alias)):e.has_virtual_model&&t.push(`alias-row`,`is-valid`),!e.is_alias&&e.masking_alias&&t.push(`masked-model-row`),!e.is_alias&&e.access&&e.access.effective_enabled===!1&&t.push(`model-access-disabled-row`),t}function KO(e){return!!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)}function qO(e){return!!(e&&!e.is_alias&&e.masking_alias&&e.masking_alias.name&&!e.masking_alias.managed)}function JO(e){return e&&e.is_alias&&e.alias&&e.alias.name?`alias-row-`+String(e.alias.name).replace(/[^a-zA-Z0-9_-]+/g,`-`):``}function YO(e){return e?e.is_alias?!!(e.alias&&e.alias.managed):!!(e.access&&e.access.override&&e.access.override.managed||e.masking_alias&&e.masking_alias.managed):!1}function XO(e){return!!(e&&e.override)}function ZO(e){return e?`table-action-btn-active`:``}function QO(e,t){let n=`Edit `+String(e||`model access`);return t?n+` (virtual model exists)`:n}function $O(){return{source:``,target_model:``,target_weight:1,targets:[],strategy:`round_robin`,session_affinity:!0,user_paths:``,description:``,slowdown:``,enabled:!0}}function ek(e){return String(e&&e.target_model||``).trim()!==``}function tk(e){return String(e&&e.target_model||``).trim()?!0:bO(e&&e.targets).length>0}function nk(e){if(tk(e))return!0;let t=String(e&&e.source||``).trim();return!!t&&t!==`/`&&!t.endsWith(`/`)}function rk(e){return!!e&&Array.isArray(e.targets)&&e.targets.length>0}function ik(e){return rk(e)&&String(e&&e.strategy||``).toLowerCase()!==`cost`}function ak(e){let t=Array.isArray(e.targets)?e.targets:[];if(t.length>0){let n=t.shift();e.target_model=n.model||``,e.target_weight=n.weight||1;return}e.target_model=``,e.target_weight=1}function ok(e){let t=Array.isArray(e&&e.targets)?e.targets:[];return t.length>0?{primaryModel:_O(t[0]),primaryWeight:t[0].weight||1,extraTargets:t.slice(1).map(e=>({model:_O(e),weight:e.weight||1}))}:{primaryModel:e&&e.target_provider?e.target_provider+`/`+e.target_model:e&&e.target_model||``,primaryWeight:1,extraTargets:[]}}function sk(e){return String(e||``).split(/\r?\n|,/).map(e=>String(e||``).trim()).filter(Boolean)}function ck(e,t,n){let r=String(e&&e.source||``).trim(),i=String(e&&e.target_model||``).trim(),a=bO(e&&e.targets),o=tk(e),s=String(t||``).trim(),c=n===`edit`&&!!s&&r!==s,l={source:r,user_paths:sk(e&&e.user_paths),description:String(e&&e.description||``).trim(),enabled:!!(e&&e.enabled)},u=Number(e&&e.slowdown||0);if(Number.isFinite(u)&&u!==0&&(l.slowdown=u),c&&(l.old_source=s),o){let t=[];if(i&&t.push(yO(i,e.target_weight)),t.push(...a),t.length>1){let n=e.strategy||`round_robin`;l.targets=n===`cost`?t.map(e=>({model:e.model})):t,l.strategy=n,e&&e.session_affinity===!1&&(l.session_affinity=!1)}else l.target_model=t[0].model}return{payload:l,source:r,isRedirect:o,isRename:c}}function lk(e){let t={source:e.name,description:String(e.description||``).trim(),user_paths:Array.isArray(e.user_paths)?e.user_paths:[],enabled:e.enabled===!1},n=Number(e.slowdown||0);n>0&&(t.slowdown=n);let r=Array.isArray(e.targets)?e.targets:[];return r.length>1?(t.strategy=e.strategy||`round_robin`,e.session_affinity===!1&&(t.session_affinity=!1),t.targets=t.strategy===`cost`?r.map(e=>({model:_O(e)})):r.map(e=>yO(_O(e),e.weight))):r.length===1?t.target_model=_O(r[0]):t.target_model=e.target_provider?e.target_provider+`/`+e.target_model:e.target_model,t}function uk(e,t,n){let r=n||{},i=r.effective_enabled===!1,a=t&&Array.isArray(t.user_paths)?t.user_paths:[],o=String(t&&t.description||``).trim(),s=Number(t&&t.slowdown||0),c={};o&&(c.description=o),s>0&&(c.slowdown=s);let l=`PUT`,u;return i===!1?u={source:e,enabled:!1,user_paths:a,...c}:t&&a.length===0&&!o&&s===0&&r.default_enabled!==!1?(l=`DELETE`,u={source:e}):u={source:e,enabled:!0,user_paths:a,...c},{method:l,payload:u,desired:i}}function dk(e,t,n){let r=Math.max(1,Number(t||75)),i=Math.min(n,e+r);return{limit:i,rendering:iMO({models:Wc.models,aliases:this.aliases,virtualModelsAvailable:this.virtualModelsAvailable,activeCategory:Wc.activeCategory}));get displayModels(){return R(this.#T)}set displayModels(e){M(this.#T,e)}#E=A(()=>HO(this.displayModels,Wc.models,this.modelOverrideViews));get displayModelGroups(){return R(this.#E)}set displayModelGroups(e){M(this.#E,e)}#D=A(()=>NO(this.displayModels,Wc.filter));get filteredDisplayModels(){return R(this.#D)}set filteredDisplayModels(e){M(this.#D,e)}#O=A(()=>{let e=this.filteredDisplayModels,t=Math.max(0,Math.min(Number(this.modelRenderLimit||0),e.length));return!Wc.filter&&t>=this.displayModels.length?this.displayModelGroups:HO(e.slice(0,t),Wc.models,this.modelOverrideViews)});get filteredDisplayModelGroups(){return R(this.#O)}set filteredDisplayModelGroups(e){M(this.#O,e)}#k=A(()=>UO(Wc.models,this.modelOverrideViews));get globalScopeRow(){return R(this.#k)}set globalScopeRow(e){M(this.#k,e)}modelsBusy(){return!!(Wc.loading||this.modelsRendering)}modelLoadingText(){if(Wc.loading)return this.displayModels.length>0?`Refreshing models...`:`Loading models...`;let e=this.filteredDisplayModels.length;return`Rendering models... `+Math.min(Number(this.modelRenderLimit||0),e)+` / `+e}restartModelRendering(e){let t=++this.#a,n=fk(this.modelRenderBatchSize,e);this.modelRenderLimit=n.limit,this.modelsRendering=n.rendering,n.rendering&&this.#A(t)}stopModelRendering(){this.#a++,this.modelsRendering=!1}#A(e){let t=()=>{if(e!==this.#a)return;let t=dk(this.modelRenderLimit,this.modelRenderBatchSize,this.filteredDisplayModels.length);this.modelRenderLimit=t.limit,this.modelsRendering=t.rendering,t.rendering&&this.#A(e)};typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>setTimeout(t,0)):setTimeout(t,0)}async fetchVirtualModels(){this.aliasLoading=!0,this.aliasError=``;try{let e=await ws(`/admin/virtual-models`,{label:`virtual models`});if(e.status===503){this.virtualModelsAvailable=!1,this.aliases=[],this.modelOverrideViews=[];return}if(e.stale)return;if(this.virtualModelsAvailable=!0,!e.ok){this.aliases=[],this.modelOverrideViews=[];return}let{aliases:t,policies:n}=TO(e.data);this.aliases=t,this.modelOverrideViews=n}catch(e){console.error(`Failed to fetch virtual models:`,e),this.aliases=[],this.modelOverrideViews=[],this.aliasError=`Unable to load virtual models.`}finally{this.aliasLoading=!1}}qualifiedModelName(e){return pO(e)}findModelOverrideView(e){return BO(this.modelOverrideViews,e)}hasGlobalModelOverride(){return!!this.findModelOverrideView(`/`)}findExistingAliasByName(e){let t=fO(e);if(!t)return null;for(let e of this.aliases)if(fO(e&&e.name)===t)return e;return null}findConcreteModelByName(e){let t=fO(e);if(!t)return null;for(let e of Wc.models)if(hO(e).has(t))return e;return null}rowToggleEnabled(e){return e?e.is_alias?e.alias&&e.alias.enabled!==!1:!!(e.access&&e.access.effective_enabled!==!1):!1}rowToggleLabel(e){return this.rowTogglingKey&&this.rowTogglingKey===e.key?`Updating...`:this.rowToggleRestricted(e)?`Restricted`:this.rowToggleEnabled(e)?`Enabled`:`Disabled`}rowToggleRestricted(e){return!!e&&!e.is_alias&&AO(e.access,this.virtualModelsAvailable)===`is-restricted`}rowToggleAriaLabel(e){if(!e)return``;let t=this.rowToggleEnabled(e)?`Disable `:`Enable `,n;return n=e.is_alias?`alias `+String(e.alias&&e.alias.name||``):String(e.display_name||e.access&&e.access.selector||`model`),t+n.trim()}async toggleRowEnabled(e){if(this.virtualModelsAvailable&&!(!e||this.rowTogglingKey===e.key)){if(YO(e)){lc.success(`This virtual model is managed by configuration and is read-only.`);return}if(e.is_alias){await this.toggleAliasRow(e);return}await this.toggleModelRow(e)}}async toggleAliasRow(e){let t=e.alias;if(!t||!t.name)return;this.rowTogglingKey=e.key;let n=lk(t);try{let e=await Ts(`/admin/virtual-models`,`PUT`,n,{label:`alias state`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update alias state.`));return}lc.success(n.enabled?`Alias enabled.`:`Alias disabled.`),this.fetchVirtualModels()}catch(e){console.error(`Failed to toggle alias state:`,e),lc.error(`Failed to update alias state.`)}finally{this.rowTogglingKey=``}}async toggleModelRow(e){let t=WO(e);if(!t)return;let{method:n,payload:r,desired:i}=uk(t,this.findModelOverrideView(t),e.access||{});this.rowTogglingKey=e.key;try{let e=await Ts(`/admin/virtual-models`,n,r,{label:`model access`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(n===`DELETE`&&e.status===404)){if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update model access.`));return}}lc.success(i?`Model enabled.`:`Model disabled.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to toggle model access:`,e),lc.error(`Failed to update model access.`)}finally{this.rowTogglingKey=``}}async removeAliasRow(e){if(!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)||this.rowDeletingKey)return;let t=String(e.alias.name||``).trim();t&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the virtual model alias "`+t+`"?`,method:`DELETE`,payload:{source:t},operation:`virtual model`,failureMessage:`Failed to remove virtual model.`,notice:`Virtual model removed.`,ignoreNotFound:!0})}async removeRedirectRow(e){let t=e&&e.masking_alias;if(!(e&&!e.is_alias&&t&&t.name&&!t.managed)||this.rowDeletingKey)return;let n=String(t.name||``).trim();n&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the redirect for "`+n+`"? Other virtual model settings will be preserved.`,method:`PUT`,payload:{source:n,user_paths:Array.isArray(t.user_paths)?t.user_paths:[],description:String(t.description||``).trim(),enabled:t.enabled!==!1,...Number(t.slowdown||0)>0?{slowdown:Number(t.slowdown)}:{}},operation:`virtual model redirect`,failureMessage:`Failed to remove redirect.`,notice:`Redirect removed. Other virtual model settings were preserved.`})}async mutateVirtualModelRow(e){if(!this.rowDeletingKey&&window.confirm(e.confirmMessage)){this.rowDeletingKey=e.rowKey;try{let t=await Ts(`/admin/virtual-models`,e.method,e.payload,{label:e.operation});if(t.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(e.ignoreNotFound&&t.status===404)){if(t.stale)return;if(!t.ok){lc.error(t.status===401?`Authentication required.`:bs(t,e.failureMessage));return}}this.virtualModelsAvailable=!0,lc.success(e.notice),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(t){console.error(e.failureMessage,t),lc.error(e.failureMessage)}finally{this.rowDeletingKey=``}}}addVmTarget(){Array.isArray(this.vmForm.targets)||(this.vmForm.targets=[]),this.vmForm.targets.push({model:``,weight:1})}removeVmTarget(e){Array.isArray(this.vmForm.targets)&&this.vmForm.targets.splice(e,1)}removePrimaryTarget(){ak(this.vmForm)}vmFormHasPrimaryTarget(){return ek(this.vmForm)}vmFormShowStrategy(){return rk(this.vmForm)}vmStrategyOptions(){return CO(ks.virtualModelStrategies(),this.vmForm.strategy)}vmFormShowWeights(){return ik(this.vmForm)}vmFormSupportsSlowdown(){return nk(this.vmForm)}vmFormToggleRestricted(){return!!(this.vmForm&&this.vmForm.enabled)&&kO(sk(this.vmForm.user_paths))}vmFormToggleLabel(){return!this.vmForm||!this.vmForm.enabled?`Disabled`:this.vmFormToggleRestricted()?`Restricted`:`Enabled`}resetVirtualModelForm(){this.vmFormError=``,this.vmFormHelpOpen=!1,this.vmFormUserPathsHelpOpen=!1,this.vmSubmitting=!1,this.vmDeleting=!1,this.vmFormHasExisting=!1,this.vmFormDefaultEnabled=!0,this.vmFormEffectiveEnabled=!0,this.vmFormDisplayName=``,this.vmFormSourceLocked=!1,this.vmFormOriginalSource=``,this.vmFormManaged=!1,this.vmForm=$O()}closeVirtualModelForm(){this.vmFormOpen=!1,this.resetVirtualModelForm()}openVirtualModelCreate(e){this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`create`,this.vmFormSourceLocked=!1,this.vmFormDisplayName=`New virtual model`,e&&e.model&&e.model.id&&(this.vmForm.target_model=pO(e))}openVirtualModelEditAlias(e){if(!e)return;this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!1,this.vmFormHasExisting=!0,this.vmFormManaged=!!e.managed,this.vmFormOriginalSource=e.name||``,this.vmFormDisplayName=e.name||``,this.vmFormDefaultEnabled=zO(Wc.models),this.vmFormEffectiveEnabled=e.enabled!==!1;let{primaryModel:t,primaryWeight:n,extraTargets:r}=ok(e);this.vmForm={source:e.name||``,target_model:t,target_weight:n,targets:r,strategy:e.strategy||`round_robin`,session_affinity:e.session_affinity!==!1,user_paths:(Array.isArray(e.user_paths)?e.user_paths:[]).join(` +`),description:e.description||``,slowdown:e.slowdown||``,enabled:e.enabled!==!1}}openVirtualModelEditModel(e){if(!e||e.is_alias)return;let t=e.access||{},n=t.override||null,r=n&&Array.isArray(n.user_paths)?n.user_paths:Array.isArray(t.user_paths)?t.user_paths:[],i=WO(e);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!n,this.vmFormOriginalSource=i;let a=n?n.enabled!==!1:t.effective_enabled!==!1;this.vmFormDefaultEnabled=t.default_enabled!==!1,this.vmFormEffectiveEnabled=a,this.vmFormManaged=!!(n&&n.managed),this.vmFormDisplayName=e.access_display_name||e.display_name||i||``,this.vmForm={source:i,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:r.join(` +`),description:n&&n.description?n.description:``,slowdown:n&&n.slowdown?n.slowdown:``,enabled:a}}openGlobalModelOverrideEdit(){let e=this.findModelOverrideView(`/`),t=e&&Array.isArray(e.user_paths)?e.user_paths:[],n=zO(Wc.models);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!e,this.vmFormOriginalSource=`/`,this.vmFormDefaultEnabled=n,this.vmFormEffectiveEnabled=e?e.enabled!==!1:n,this.vmFormManaged=!!(e&&e.managed),this.vmFormDisplayName=`All providers and models`,this.vmForm={source:`/`,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:t.join(` +`),description:e&&e.description?e.description:``,slowdown:e&&e.slowdown?e.slowdown:``,enabled:e?e.enabled!==!1:n}}openProviderOverrideEdit(e){!e||!e.access||!e.access.selector||this.openVirtualModelEditModel({display_name:e.display_name,access_display_name:`All models in `+e.display_name,provider_name:e.provider_name,provider_type:e.provider_type,access:e.access,override_selector:e.access.selector,is_alias:!1})}async submitVirtualModelForm(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be edited here.`;return}let{payload:e,source:t,isRedirect:n,isRename:r}=ck(this.vmForm,this.vmFormOriginalSource,this.vmFormMode);if(!t){this.vmFormError=`Source is required.`;return}if(this.vmFormError=``,this.vmFormMode!==`edit`){let e=this.findExistingAliasByName(t),r=e?null:this.findModelOverrideView(t);if(e||r){let n=e?`A virtual model named "`+e.name+`" already exists. Saving will update that virtual model. Continue?`:`An access policy for "`+t+`" already exists. Saving will update that virtual model. Continue?`;if(!window.confirm(n)){this.vmFormError=`Choose a different source or edit the existing virtual model.`;return}}else if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Creating this alias will mask that model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}else if(r){let e=(this.aliases||[]).find(e=>e&&e.name===t)||null,r=e?null:this.findModelOverrideView(t);if(e||r){this.vmFormError=`A virtual model for "`+t+`" already exists. Choose a different source.`;return}if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Renaming to that name will mask the model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}this.vmSubmitting=!0;try{let t=await Ts(`/admin/virtual-models`,`PUT`,e,{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to save virtual model.`);return}let r=!n&&t.status===204;this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(n?`Alias saved.`:r?`Model access reset to inherited/default.`:`Model access saved.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to save virtual model:`,e),this.vmFormError=`Failed to save virtual model.`}finally{this.vmSubmitting=!1}}async deleteVirtualModel(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be removed here.`;return}let e=String(this.vmForm.source||this.vmFormOriginalSource||``).trim();if(!(!e||!this.vmFormHasExisting)&&window.confirm(`Remove the virtual model for "`+e+`"? This reverts to inherited/default behavior.`)){this.vmDeleting=!0,this.vmFormError=``;try{let t=await Ts(`/admin/virtual-models`,`DELETE`,{source:e},{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to remove virtual model.`);return}}this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(`Virtual model removed.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to delete virtual model:`,e),this.vmFormError=`Failed to remove virtual model.`}finally{this.vmDeleting=!1}}}},mk=[{value:`input_per_mtok`,label:`Input $/MTok`,group:`Tokens`},{value:`output_per_mtok`,label:`Output $/MTok`,group:`Tokens`},{value:`cached_input_per_mtok`,label:`Cached input $/MTok`,group:`Tokens`},{value:`cache_write_per_mtok`,label:`Cache write $/MTok`,group:`Tokens`},{value:`reasoning_output_per_mtok`,label:`Reasoning output $/MTok`,group:`Tokens`},{value:`batch_input_per_mtok`,label:`Batch input $/MTok`,group:`Batch`},{value:`batch_output_per_mtok`,label:`Batch output $/MTok`,group:`Batch`},{value:`audio_input_per_mtok`,label:`Audio input $/MTok`,group:`Audio`},{value:`audio_output_per_mtok`,label:`Audio output $/MTok`,group:`Audio`},{value:`per_image`,label:`$/Image`,group:`Image`},{value:`input_per_image`,label:`Input $/Image`,group:`Image`},{value:`per_second_input`,label:`Input $/Second`,group:`Audio/Video`},{value:`per_second_output`,label:`Output $/Second`,group:`Video`},{value:`per_character_input`,label:`$/Character`,group:`Audio`},{value:`per_page`,label:`$/Page`,group:`Utility`},{value:`per_request`,label:`$/Request`,group:`Utility`}];function hk(e){let t=mk.find(t=>t.value===e);return t?t.label:String(e||``).replace(/_/g,` `)}function gk(e){return e&&typeof e==`object`?JSON.parse(JSON.stringify(e)):{}}function _k(e,t){let n=gk(e),r=t&&t.pricing?t.pricing:t;if(!r||typeof r!=`object`)return n;for(let e of mk)r[e.value]!==null&&r[e.value]!==void 0&&(n[e.value]=Number(r[e.value]));return Array.isArray(r.tiers)&&r.tiers.length>0&&(n.tiers=gk(r.tiers)),n}function vk(e){switch(String(e||``).trim()){case`config_yaml`:return`config.yaml`;case`model_registry`:return`Model registry`;default:return e?String(e):`Unknown`}}function yk(e){let t=e&&e.pricing?e.pricing:{},n=e&&e.pricing_sources&&typeof e.pricing_sources==`object`?e.pricing_sources:{},r={};for(let e of mk)t[e.value]!==null&&t[e.value]!==void 0&&(r[e.value]=vk(n[e.value]||`model_registry`));return r}function bk(e){let t=String(e&&e.selector||``).trim();return t?`Dashboard/API override (`+t+`)`:`Dashboard/API override`}function xk(e){let t=String(e||``).trim();return t?t+`/`:``}function Sk(e){return String(e&&e.model&&e.model.id||``).trim()}function Ck(e){let t=String(e&&e.provider_name||``).trim(),n=Sk(e);return t&&n?t+`/`+n:n}function wk(e){return Sk(e)}function Tk(e){let t=new Map;for(let n of Array.isArray(e)?e:[]){let e=String(n&&n.selector||``).trim();e&&t.set(e,n)}return t}function Ek(e,t){let n=String(t||``).trim();return n&&Tk(e).get(n)||null}function Dk(e,t,n){let r=Tk(e),i=Ck(t),a=wk(t),o=xk(t&&t.provider_name),s=String(n||``).trim();for(let e of[i,a,o,`/`]){if(!e||e===s)continue;let t=r.get(e);if(t)return t}return null}function Ok(e,t,n){let r=e&&e.model&&e.model.metadata?e.model.metadata:null,i=gk(r&&r.pricing),a=yk(r),o=Dk(t,e,n),s=o&&o.pricing?o.pricing:null;if(s){let e=bk(o);for(let t of mk)s[t.value]!==null&&s[t.value]!==void 0&&(i[t.value]=Number(s[t.value]),a[t.value]=e);Array.isArray(s.tiers)&&s.tiers.length>0&&(i.tiers=gk(s.tiers),a.tiers=e)}return{pricing:i,sources:a}}function kk(e,t){let n=e&&e.pricing?e.pricing:{},r=[];for(let e of mk)n[e.value]!==null&&n[e.value]!==void 0&&r.push({id:t(),field:e.value,value:String(n[e.value])});return r}function Ak(e,t){let n=new Set;for(let r of Array.isArray(e)?e:[]){if(t&&r.id===t)continue;let e=String(r.field||``).trim();e&&n.add(e)}return n}function jk(e,t){let n=Ak(e,t&&t.id);return mk.filter(e=>e.value===(t&&t.field)||!n.has(e.value))}function Mk(e,t){let n={},r=new Set;for(let t of Array.isArray(e)?e:[]){let e=String(t.field||``).trim();if(!e)return{error:`Choose a price type for every row.`};if(r.has(e))return{error:`Each price type can only be used once.`};r.add(e);let i=String(t.value||``).trim();if(i===``)return{error:`Enter a value for `+hk(e)+`.`};let a=Number(i);if(!Number.isFinite(a)||a<0)return{error:`Pricing values must be numbers greater than or equal to 0.`};n[e]=a}let i=Array.isArray(t)?t:[];return i.length>0&&(n.tiers=gk(i)),Object.keys(n).length===0?{error:`Add at least one pricing field before saving.`}:{pricing:n}}function Nk(e,t,n){let r=e||{},i=t||{},a=n||{},o=_k(r,a);return mk.map(e=>{let t=a[e.value]!==null&&a[e.value]!==void 0,n=r[e.value]!==null&&r[e.value]!==void 0;return{field:e.value,label:e.label,value:o[e.value],source:t?`Form/API value`:n?i[e.value]||`Model registry`:`Unset`}}).filter(e=>e.source!==`Unset`||e.value!==void 0)}var Pk=new class{#e=j(!0);get modelPricingOverridesAvailable(){return R(this.#e)}set modelPricingOverridesAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get modelPricingOverrideViews(){return R(this.#t)}set modelPricingOverrideViews(e){M(this.#t,e,!0)}#n=j(``);get modelPricingOverrideError(){return R(this.#n)}set modelPricingOverrideError(e){M(this.#n,e,!0)}#r=j(!1);get modelPricingOverrideFormOpen(){return R(this.#r)}set modelPricingOverrideFormOpen(e){M(this.#r,e,!0)}#i=j(!1);get modelPricingOverrideSubmitting(){return R(this.#i)}set modelPricingOverrideSubmitting(e){M(this.#i,e,!0)}#a=j(!1);get modelPricingOverrideFormHasExistingOverride(){return R(this.#a)}set modelPricingOverrideFormHasExistingOverride(e){M(this.#a,e,!0)}#o=j(``);get modelPricingOverrideFormDisplayName(){return R(this.#o)}set modelPricingOverrideFormDisplayName(e){M(this.#o,e,!0)}#s=j(``);get modelPricingOverrideFormScope(){return R(this.#s)}set modelPricingOverrideFormScope(e){M(this.#s,e,!0)}#c=j(N([]));get modelPricingOverrideFormScopeOptions(){return R(this.#c)}set modelPricingOverrideFormScopeOptions(e){M(this.#c,e,!0)}#l=j(null);get modelPricingOverrideFormRow(){return R(this.#l)}set modelPricingOverrideFormRow(e){M(this.#l,e,!0)}#u=j(null);get modelPricingOverrideFormBasePricing(){return R(this.#u)}set modelPricingOverrideFormBasePricing(e){M(this.#u,e,!0)}#d=j(null);get modelPricingOverrideFormBasePricingSources(){return R(this.#d)}set modelPricingOverrideFormBasePricingSources(e){M(this.#d,e,!0)}#f=j(N([]));get modelPricingOverrideFormPreservedTiers(){return R(this.#f)}set modelPricingOverrideFormPreservedTiers(e){M(this.#f,e,!0)}#p=j(N([]));get modelPricingOverrideRows(){return R(this.#p)}set modelPricingOverrideRows(e){M(this.#p,e,!0)}#m=j(N({selector:``}));get modelPricingOverrideForm(){return R(this.#m)}set modelPricingOverrideForm(e){M(this.#m,e,!0)}_modelPricingOverrideRowID=0;pricingFieldOptions(){return mk}pricingFieldLabel(e){return hk(e)}async fetchModelPricingOverrides(){this.modelPricingOverrideError=``;try{let e=await ws(`/admin/model-pricing-overrides`,{label:`model pricing overrides`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideViews=[];return}if(e.stale)return;if(this.modelPricingOverridesAvailable=!0,!e.ok){this.modelPricingOverrideViews=[];return}this.modelPricingOverrideViews=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch model pricing overrides:`,e),this.modelPricingOverrideViews=[],this.modelPricingOverrideError=`Unable to load model pricing overrides.`}}findModelPricingOverrideView(e){return Ek(this.modelPricingOverrideViews,e)}hasGlobalPricingOverride(){return!!this.findModelPricingOverrideView(`/`)}hasProviderPricingOverride(e){return!!this.findModelPricingOverrideView(xk(e&&e.provider_name))}hasModelPricingOverride(e){return!!this.findModelPricingOverrideView(Ck(e))}modelPricingButtonClass(e){return e?`table-action-btn-active`:``}modelPricingButtonLabel(e,t){let n=`Edit `+String(e||`model pricing`);return t?n+` (override exists)`:n}modelRowPricing(e){return Ok(e,this.modelPricingOverrideViews).pricing}openGlobalPricingOverrideEdit(){this.openModelPricingOverrideForm({displayName:`All providers and models`,selector:`/`,scope:`global`,scopeOptions:[{value:`global`,label:`All providers and models`,selector:`/`}],row:null})}openProviderPricingOverrideEdit(e){let t=xk(e&&e.provider_name);t&&this.openModelPricingOverrideForm({displayName:`All models in `+(e.display_name||e.provider_name||t),selector:t,scope:`provider`,scopeOptions:[{value:`provider`,label:`Provider`,selector:t}],row:null})}openModelPricingOverrideEdit(e){if(!e||e.is_alias)return;let t=Ck(e),n=wk(e),r=[{value:`exact`,label:`This provider and model`,selector:t}];n&&n!==t&&r.push({value:`model`,label:`This model across providers`,selector:n}),this.openModelPricingOverrideForm({displayName:e.display_name||t,selector:t,scope:`exact`,scopeOptions:r,row:e})}openModelPricingOverrideForm(e){let t=e||{};this.modelPricingOverrideFormOpen=!0,this.modelPricingOverrideError=``,this.modelPricingOverrideFormDisplayName=t.displayName||t.selector||`Pricing`,this.modelPricingOverrideFormScope=t.scope||``,this.modelPricingOverrideFormScopeOptions=Array.isArray(t.scopeOptions)?t.scopeOptions:[],this.modelPricingOverrideFormRow=t.row||null,this.modelPricingOverrideForm={selector:t.selector||``},this.loadModelPricingOverrideFormSelector(t.selector||``)}loadModelPricingOverrideFormSelector(e){e=String(e||``).trim();let t=this.findModelPricingOverrideView(e);this.modelPricingOverrideFormHasExistingOverride=!!t,this.modelPricingOverrideRows=kk(t,()=>this.nextModelPricingOverrideRowID()),this.modelPricingOverrideFormPreservedTiers=t&&t.pricing&&Array.isArray(t.pricing.tiers)?gk(t.pricing.tiers):[],this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow();let n=this.modelPricingOverrideFormRow,r=n?Ok(n,this.modelPricingOverrideViews,e):{pricing:{},sources:{}};this.modelPricingOverrideFormBasePricing=r.pricing,this.modelPricingOverrideFormBasePricingSources=r.sources}setModelPricingOverrideScope(e){this.modelPricingOverrideFormScope=e;let t=this.modelPricingOverrideFormScopeOptions.find(t=>t.value===e);t&&(this.modelPricingOverrideForm.selector=t.selector,this.loadModelPricingOverrideFormSelector(t.selector))}nextModelPricingOverrideRowID(){return this._modelPricingOverrideRowID=(this._modelPricingOverrideRowID||0)+1,`pricing-row-`+this._modelPricingOverrideRowID}availablePricingFieldOptions(e){return jk(this.modelPricingOverrideRows,e)}addModelPricingOverrideRow(){let e=Ak(this.modelPricingOverrideRows),t=mk.find(t=>!e.has(t.value))||mk[0];t&&this.modelPricingOverrideRows.push({id:this.nextModelPricingOverrideRowID(),field:t.value,value:``})}removeModelPricingOverrideRow(e){this.modelPricingOverrideRows=this.modelPricingOverrideRows.filter(t=>t.id!==e.id),this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow()}modelPricingOverridePayload(){return Mk(this.modelPricingOverrideRows,this.modelPricingOverrideFormPreservedTiers)}modelPricingOverrideDraftPricing(){let e=this.modelPricingOverridePayload();return e&&e.pricing?e.pricing:{}}modelPricingEffectivePreviewRows(){return Nk(this.modelPricingOverrideFormBasePricing,this.modelPricingOverrideFormBasePricingSources,this.modelPricingOverrideDraftPricing())}closeModelPricingOverrideForm(){this.modelPricingOverrideFormOpen=!1,this.modelPricingOverrideSubmitting=!1,this.modelPricingOverrideError=``,this.modelPricingOverrideFormHasExistingOverride=!1,this.modelPricingOverrideFormDisplayName=``,this.modelPricingOverrideFormScope=``,this.modelPricingOverrideFormScopeOptions=[],this.modelPricingOverrideFormRow=null,this.modelPricingOverrideFormBasePricing=null,this.modelPricingOverrideFormBasePricingSources=null,this.modelPricingOverrideFormPreservedTiers=[],this.modelPricingOverrideRows=[],this.modelPricingOverrideForm={selector:``}}async submitModelPricingOverrideForm(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!e){this.modelPricingOverrideError=`Model pricing selector is required.`;return}let t=this.modelPricingOverridePayload();if(t.error){this.modelPricingOverrideError=t.error;return}let n={selector:e,...t};this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let e=await Ts(`/admin/model-pricing-overrides`,`PUT`,n,{label:`model pricing override`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(e.stale)return;if(!e.ok){this.modelPricingOverrideError=e.status===401?`Authentication required.`:bs(e,`Failed to save model pricing.`);return}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing saved.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to save model pricing override:`,e),this.modelPricingOverrideError=`Failed to save model pricing.`}finally{this.modelPricingOverrideSubmitting=!1}}async deleteModelPricingOverride(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!(!e||!this.modelPricingOverrideFormHasExistingOverride)&&window.confirm(`Remove the model pricing override for "`+e+`"?`)){this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let t=await Ts(`/admin/model-pricing-overrides`,`DELETE`,{selector:e},{label:`model pricing override`});if(t.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.modelPricingOverrideError=t.status===401?`Authentication required.`:bs(t,`Failed to remove model pricing override.`);return}}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing override removed.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to delete model pricing override:`,e),this.modelPricingOverrideError=`Failed to remove model pricing override.`}finally{this.modelPricingOverrideSubmitting=!1}}}},Fk=B(``);function Ik(e,t){O(t,!0);var n=Fk();let r;var i=I(P(n),2),a=P(i,!0);D(i),D(n),L((e,i,o)=>{r=G(n,1,`alias-toggle`,null,r,e),n.disabled=pk.rowTogglingKey===t.row.key||!pk.virtualModelsAvailable,K(n,`aria-label`,i),H(a,o)},[()=>({enabled:pk.rowToggleEnabled(t.row),restricted:pk.rowToggleRestricted(t.row)}),()=>pk.rowToggleAriaLabel(t.row),()=>pk.rowToggleLabel(t.row)]),z(`click`,n,()=>pk.toggleRowEnabled(t.row)),V(e,n),k()}Br([`click`]);var Lk=B(`
`);function Rk(e,t){O(t,!0);var n=Lk(),r=P(n),i=e=>{Ik(e,{get row(){return pk.globalScopeRow}})};U(r,e=>{pk.virtualModelsAvailable&&e(i)});var a=I(r,2),o=e=>{{let t=A(()=>Pk.modelPricingButtonLabel(`global model pricing`,Pk.hasGlobalPricingOverride())),n=A(()=>Pk.modelPricingButtonClass(Pk.hasGlobalPricingOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>Pk.openGlobalPricingOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(a,e=>{Pk.modelPricingOverridesAvailable&&e(o)});var s=I(a,2),c=e=>{{let t=A(()=>QO(`global model access`,pk.hasGlobalModelOverride())),n=A(()=>ZO(pk.hasGlobalModelOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>pk.openGlobalModelOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n),k()}function zk(e){return String(e&&(e.primary_model||e.source)||``).trim()}function Bk(e){return Array.isArray(e&&e.fallback_models)?e.fallback_models:Array.isArray(e&&e.targets)?e.targets:[]}function Vk(e){return Array.isArray(e)?e.map(e=>({...e,source:zk(e),targets:Bk(e)})):[]}function Hk(e){let t=Bk(e);return t.length===0?`-`:t.join(`, `)}function Uk(e){return e&&e.enabled===!1?`Off`:e&&e.managed?`Config`:`On`}function Wk(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>zk(e)===n)||null}function Gk(e,t){if(!t||t.is_alias)return!1;let n=Wk(e,pO(t));return!!(n&&n.enabled!==!1&&Bk(n).length>0)}function Kk(e,t){return Gk(e,t)?`table-action-btn-failover-active`:``}function qk(e,t){let n=`Edit failover for `+(t&&t.display_name?t.display_name:`model`);return Gk(e,t)?n+` (active)`:n}function Jk(e){let t=[e&&e.target_model];return(Array.isArray(e&&e.targets)?e.targets:[]).forEach(e=>t.push(e&&e.model)),t.map(e=>String(e||``).trim()).filter(Boolean)}function Yk(e){let t=Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(Boolean):[];return{target_model:t[0]||``,targets:t.slice(1).map(e=>({model:e}))}}function Xk(e){return{primary_model:String(e&&e.source||``).trim(),fallback_models:Jk(e),enabled:!(e&&e.enabled===!1)}}function Zk(e){return zk(e)}function Qk(e){let t={};return(Array.isArray(e)?e:[]).forEach(e=>{let n=Zk(e);n&&(t[n]=!0)}),t}function $k(e,t){let n=Zk(t);return!!(n&&e&&e[n])}function eA(e,t){return(Array.isArray(e)?e:[]).filter(e=>$k(t,e))}function tA(e,t){let n=Array.isArray(e)?e:[];return n.length>0&&eA(n,t).length===n.length}function nA(e){return[zk(e),Bk(e).join(` `)].join(` `).toLowerCase()}function rA(e,t){let n=Array.isArray(e)?e:[],r=String(t||``).trim().toLowerCase();return r?n.filter(e=>nA(e).includes(r)):n}function iA(e){return{primary_model:zk(e),fallback_models:Bk(e).map(e=>String(e||``).trim()).filter(Boolean),enabled:!!(e&&e.enabled!==!1)}}function aA(){return{source:``,target_model:``,targets:[],enabled:!0}}var Q=new class{#e=j(!0);get failoverAvailable(){return R(this.#e)}set failoverAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get failoverRules(){return R(this.#t)}set failoverRules(e){M(this.#t,e,!0)}#n=j(!1);get failoverLoading(){return R(this.#n)}set failoverLoading(e){M(this.#n,e,!0)}#r=j(!1);get failoverSaving(){return R(this.#r)}set failoverSaving(e){M(this.#r,e,!0)}#i=j(!1);get failoverGenerating(){return R(this.#i)}set failoverGenerating(e){M(this.#i,e,!0)}#a=j(``);get failoverError(){return R(this.#a)}set failoverError(e){M(this.#a,e,!0)}#o=j(N([]));get failoverGeneratedRules(){return R(this.#o)}set failoverGeneratedRules(e){M(this.#o,e,!0)}#s=j(!1);get failoverDraftsOpen(){return R(this.#s)}set failoverDraftsOpen(e){M(this.#s,e,!0)}#c=j(N({}));get failoverDraftSelections(){return R(this.#c)}set failoverDraftSelections(e){M(this.#c,e,!0)}#l=j(``);get failoverDraftFilter(){return R(this.#l)}set failoverDraftFilter(e){M(this.#l,e,!0)}#u=j(!1);get failoverDraftSaving(){return R(this.#u)}set failoverDraftSaving(e){M(this.#u,e,!0)}#d=j(!1);get failoverFormOpen(){return R(this.#d)}set failoverFormOpen(e){M(this.#d,e,!0)}#f=j(`create`);get failoverFormMode(){return R(this.#f)}set failoverFormMode(e){M(this.#f,e,!0)}#p=j(!1);get failoverFormManaged(){return R(this.#p)}set failoverFormManaged(e){M(this.#p,e,!0)}#m=j(N(aA()));get failoverForm(){return R(this.#m)}set failoverForm(e){M(this.#m,e,!0)}failoverEnabled(){return ks.booleanFlag(`FAILOVER_ENABLED`,!0)}async fetchFailoverRules(){if(!this.failoverEnabled()){this.failoverAvailable=!1,this.failoverRules=[],this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,this.failoverError=``,this.failoverLoading=!1;return}this.failoverLoading=!0,this.failoverError=``;try{let e=await ws(`/admin/failover`,{label:`failover mappings`});if(e.status===503){this.failoverAvailable=!1,this.failoverRules=[];return}if(e.stale)return;if(this.failoverAvailable=!0,!e.ok){this.failoverRules=[];return}this.failoverRules=Vk(e.data)}catch(e){console.error(`Failed to fetch failover mappings:`,e),this.failoverRules=[],this.failoverError=`Unable to load failover mappings.`}finally{this.failoverLoading=!1}}resetFailoverForm(){this.failoverFormMode=`create`,this.failoverFormManaged=!1,this.failoverForm=aA()}openFailoverCreate(){this.resetFailoverForm(),this.failoverFormOpen=!0,this.focusFailoverEditor()}openFailoverEdit(e){if(!e)return;this.resetFailoverForm(),this.failoverFormMode=`edit`,this.failoverFormOpen=!0,this.failoverFormManaged=!!e.managed;let t=this.failoverPrimaryModel(e),n=this.failoverTargets(e);this.failoverForm={source:t,target_model:n[0]||``,targets:n.slice(1).map(e=>({model:e})),enabled:e.enabled!==!1},this.focusFailoverEditor()}openFailoverForModel(e){if(!e||e.is_alias)return;let t=this.qualifiedModelName(e),n=this.failoverRules.find(e=>this.failoverPrimaryModel(e)===t);if(n){this.openFailoverEdit(n);return}this.resetFailoverForm(),this.failoverFormMode=`create`,this.failoverFormOpen=!0,this.failoverForm.source=t,this.focusFailoverEditor()}closeFailoverForm(){this.failoverFormOpen=!1}closeFailoverDraftsModal(){this.failoverDraftSaving||(this.failoverDraftsOpen=!1)}failoverFormTargets(){return Jk(this.failoverForm)}setFailoverFormTargets(e){let t=Yk(e);this.failoverForm.target_model=t.target_model,this.failoverForm.targets=t.targets}addFailoverTarget(){Array.isArray(this.failoverForm.targets)||(this.failoverForm.targets=[]),this.failoverForm.targets.push({model:``}),this.focusFailoverEditor()}removeFailoverTarget(e){if(!Array.isArray(this.failoverForm.targets)){this.failoverForm.targets=[];return}this.failoverForm.targets.splice(e,1)}removePrimaryFailoverTarget(){let e=Array.isArray(this.failoverForm.targets)?this.failoverForm.targets:[];if(e.length>0){let t=e.shift();this.failoverForm.target_model=t&&t.model?t.model:``,this.failoverForm.targets=e;return}this.failoverForm.target_model=``}failoverRulePayload(){return Xk(this.failoverForm)}async submitFailoverForm(){if(this.failoverSaving||this.failoverGenerating||this.failoverFormManaged)return;let e=this.failoverRulePayload();if(!e.primary_model){this.failoverError=`Primary model is required.`;return}if(e.enabled&&e.fallback_models.length===0){this.failoverError=`Add at least one failover target.`;return}this.failoverSaving=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to save failover mapping.`;return}lc.success(`Failover mapping saved.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to save failover mapping:`,e),this.failoverError=`Failed to save failover mapping.`}finally{this.failoverSaving=!1}}async deleteFailoverRule(e){let t=String(e&&this.failoverPrimaryModel(e)||this.failoverForm.source||``).trim();if(!(!t||this.failoverSaving||this.failoverGenerating)&&confirm(`Remove failover mapping for "`+t+`"?`)){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover`,`DELETE`,{primary_model:t},{label:`failover mapping`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mapping.`;return}lc.success(`Failover mapping removed.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to remove failover mapping:`,e),this.failoverError=`Failed to remove failover mapping.`}finally{this.failoverSaving=!1}}}async generateFailoverForForm(){if(this.failoverGenerating||this.failoverSaving||this.failoverFormManaged)return;let e=String(this.failoverForm.source||``).trim();if(!e){this.failoverError=`Primary model is required.`;return}this.failoverGenerating=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover/generate`,`POST`,{primary_model:e},{label:`failover generation`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to generate failover mapping.`;return}let n=Vk(t.data),r=n.find(t=>this.failoverPrimaryModel(t)===e)||n[0]||null,i=this.failoverTargets(r);if(i.length===0){this.failoverError=`No failover suggestions were generated for this model.`;return}this.setFailoverFormTargets(i),lc.success(`Generated `+i.length+` fallback model`+(i.length===1?`.`:`s.`)),this.focusFailoverEditor()}catch(e){console.error(`Failed to generate failover mapping:`,e),this.failoverError=`Failed to generate failover mapping.`}finally{this.failoverGenerating=!1}}openFailoverResetDialog(){Js.open({title:`Remove failover models`,titleId:`failoverResetDialogTitle`,inputId:`failover-reset-confirmation`,message:`Remove every dashboard-managed failover mapping. Configuration-managed mappings remain active.`,requiredText:`remove`,confirmLabel:`Remove Failover`,icon:Ao,dialogClass:`budget-reset-dialog`,onConfirm:async()=>{await this.resetFailoverRules(),this.failoverError&&(Js.error=this.failoverError)}})}async resetFailoverRules(){if(!this.failoverSaving){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover/reset`,`POST`,void 0,{label:`failover removal`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mappings.`;return}this.failoverRules=Vk(e.data),this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,lc.success(`Dashboard-managed failover mappings removed.`),Js.close()}catch(e){console.error(`Failed to remove failover mappings:`,e),this.failoverError=`Failed to remove failover mappings.`}finally{this.failoverSaving=!1}}}async generateFailoverRules(){if(!(this.failoverGenerating||this.failoverDraftSaving)){this.failoverGenerating=!0,this.failoverError=``,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!0;try{let e=await Ts(`/admin/failover/generate`,`POST`,void 0,{label:`failover generation`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to generate failover mappings.`;return}this.failoverGeneratedRules=Vk(e.data),this.selectAllFailoverDrafts(this.failoverGeneratedRules)}catch(e){console.error(`Failed to generate failover mappings:`,e),this.failoverError=`Failed to generate failover mappings.`}finally{this.failoverGenerating=!1}}}failoverDraftKey(e){return Zk(e)}selectAllFailoverDrafts(e){this.failoverDraftSelections=Qk(e)}failoverDraftSelected(e){return $k(this.failoverDraftSelections,e)}setFailoverDraftSelected(e,t){let n=this.failoverDraftKey(e);n&&(this.failoverDraftSelections={...this.failoverDraftSelections,[n]:!!t})}selectedFailoverDrafts(){return eA(this.failoverGeneratedRules,this.failoverDraftSelections)}selectedFailoverDraftCount(){return this.selectedFailoverDrafts().length}failoverDraftCountLabel(){return this.selectedFailoverDraftCount()+` / `+this.failoverGeneratedRules.length+` selected`}allFailoverDraftsSelected(){return tA(this.failoverGeneratedRules,this.failoverDraftSelections)}toggleAllFailoverDrafts(){if(!(this.failoverDraftSaving||this.failoverGenerating||this.failoverGeneratedRules.length===0)){if(this.allFailoverDraftsSelected()){this.failoverDraftSelections={};return}this.selectAllFailoverDrafts(this.failoverGeneratedRules)}}failoverDraftSearchText(e){return nA(e)}filteredFailoverDrafts(){return rA(this.failoverGeneratedRules,this.failoverDraftFilter)}failoverDraftPayload(e){return iA(e)}async saveSelectedFailoverDrafts(){if(this.failoverDraftSaving||this.failoverGenerating)return;let e=this.selectedFailoverDrafts();if(e.length===0){this.failoverError=`Select at least one failover draft.`;return}this.failoverDraftSaving=!0,this.failoverError=``;try{for(let t of e){let e=this.failoverDraftPayload(t);if(!e.primary_model||e.fallback_models.length===0){this.failoverError=`Generated failover draft is missing model data.`;return}let n=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(n.stale)return;if(!n.ok){this.failoverError=`Failed to save failover mapping.`;return}}lc.success(`Saved `+e.length+` failover mapping`+(e.length===1?`.`:`s.`)),this.failoverDraftsOpen=!1,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.fetchFailoverRules()}catch(e){console.error(`Failed to save generated failover mappings:`,e),this.failoverError=`Failed to save failover mappings.`}finally{this.failoverDraftSaving=!1}}focusFailoverEditor(){setTimeout(()=>{let e=document.querySelector(`[data-failover-editor]`),t=e&&e.querySelector?e.querySelector(`[data-modal-autofocus], input:not([disabled]), textarea:not([disabled]), button:not([disabled])`):null;t&&typeof t.focus==`function`&&t.focus({preventScroll:!0})},0)}failoverTargetLabel(e){return Hk(e)}failoverPrimaryModel(e){return zk(e)}failoverTargets(e){return Bk(e)}findFailoverMapping(e){return Wk(this.failoverRules,e)}hasActiveFailoverMapping(e){return Gk(this.failoverRules,e)}failoverButtonClass(e){return Kk(this.failoverRules,e)}failoverButtonLabel(e){return qk(this.failoverRules,e)}normalizeFailoverRules(e){return Vk(e)}failoverRuleStatus(e){return Uk(e)}qualifiedModelName(e){return pO(e)}},oA=B(``),sA=B(``),cA=B(`Config`),lA=B(`
Targets
`),uA=B(``),dA=B(`
Redirects to
`),fA=B(`
Slowdown
`),pA=B(` `),mA=B(`
`),hA=B(`
`),gA=B(`
`);function _A(e,t){O(t,!0);let n=A(()=>Pk.modelRowPricing(t.row)),r=A(()=>Number(t.row.is_alias?t.row.alias&&t.row.alias.slowdown:t.row.masking_alias&&t.row.masking_alias.slowdown||t.row.access&&t.row.access.override&&t.row.access.override.slowdown||0));var i=gA(),a=P(i),o=P(a),s=P(o),c=P(s),l=P(c,!0);D(c);var u=I(c,2),d=e=>{V(e,oA())};U(u,e=>{t.row.is_alias&&e(d)});var f=I(u,2),p=e=>{V(e,sA())};U(f,e=>{!t.row.is_alias&&t.row.masking_alias&&e(p)});var m=I(f,2),h=e=>{V(e,cA())},g=A(()=>YO(t.row));U(m,e=>{R(g)&&e(h)}),D(s);var _=I(s,2),v=e=>{var n=lA(),r=I(P(n)),i=P(r,!0);D(r),D(n),L(()=>H(i,t.row.secondary_name)),V(e,n)};U(_,e=>{t.row.is_alias&&e(v)});var y=I(_,2),b=e=>{var n=dA(),r=I(P(n)),i=P(r,!0);D(r);var a=I(r,2),o=e=>{var n=uA();L(e=>{K(n,`aria-label`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),K(n,`title`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),n.disabled=e},[()=>!!pk.rowDeletingKey]),z(`click`,n,()=>pk.removeRedirectRow(t.row)),V(e,n)},s=A(()=>pk.virtualModelsAvailable&&qO(t.row));U(a,e=>{R(s)&&e(o)}),D(n),L(e=>H(i,e),[()=>EO(t.row.masking_alias)]),V(e,n)};U(y,e=>{!t.row.is_alias&&t.row.masking_alias&&e(b)});var x=I(y,2),S=e=>{var t=fA(),n=I(P(t)),i=P(n);D(n),D(t),L(()=>H(i,`+${R(r)??``}× inference time`)),V(e,t)};U(x,e=>{R(r)>0&&e(S)}),D(o),D(a);var C=I(a);W(C,17,()=>t.columns,ii,(e,r)=>{var i=pA(),a=P(i,!0);D(i),L(e=>{G(i,1,Ni(R(r).class),`svelte-1iynym`),H(a,e)},[()=>R(r).value(t.row,R(n))]),V(e,i)});var w=I(C),T=P(w),E=e=>{var n=mA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>pk.rowDeletingKey===t.row.key?`Removing alias `+t.row.alias.name:`Remove alias `+t.row.alias.name),r=A(()=>!!pk.rowDeletingKey);OT(e,{get label(){return R(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>pk.removeAliasRow(t.row),get disabled(){return R(r)},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})}},o=A(()=>pk.virtualModelsAvailable&&KO(t.row));U(i,e=>{R(o)&&e(a)});var s=I(i,2),c=e=>{{let n=A(()=>`Edit alias `+t.row.alias.name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n)},ee=e=>{var n=hA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`model pricing for `+t.row.display_name,Pk.hasModelPricingOverride(t.row))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasModelPricingOverride(t.row)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openModelPricingOverrideEdit(t.row),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(i,e=>{Pk.modelPricingOverridesAvailable&&e(a)});var o=I(i,2),s=e=>{{let n=A(()=>Q.failoverButtonLabel(t.row)),r=A(()=>Q.failoverButtonClass(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Q.openFailoverForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Eo},class:`table-icon-svg`})},$$slots:{default:!0}})}},c=A(()=>Q.failoverAvailable&&Q.failoverEnabled());U(o,e=>{R(c)&&e(s)});var l=I(o,2),u=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(t.row.display_name,Z.rateLimitGaugeClassForModel(t.row))),r=A(()=>Z.rateLimitGaugeClassForModel(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},d=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitInspectorModelID(t.row));U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{{let n=A(()=>`Edit redirect for `+t.row.display_name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.masking_alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(f,e=>{pk.virtualModelsAvailable&&t.row.masking_alias&&t.row.masking_alias.name&&e(p)});var m=I(f,2),h=e=>{{let n=A(()=>QO(`model settings for `+t.row.display_name,XO(t.row.access))),r=A(()=>ZO(XO(t.row.access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openVirtualModelEditModel(t.row),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(m,e=>{pk.virtualModelsAvailable&&!t.row.masking_alias&&e(h)}),D(n),V(e,n)};U(T,e=>{t.row.is_alias?e(E):e(ee,-1)}),D(w),D(i),L((e,n)=>{K(i,`id`,e),G(i,1,n,`svelte-1iynym`),H(l,t.row.display_name)},[()=>JO(t.row)||void 0,()=>Ni(GO(t.row))]),V(e,i),k()}Br([`click`]);var vA={headerLines:[`Modes`],value:e=>(e.model?.metadata?.modes??[]).join(`, `)||`-`};function yA(e,t){return{headerLines:e,class:`col-price`,value:t}}var bA=yA([`Input / Output ($/MTok)`],(e,t)=>yc(t?.input_per_mtok)+` / `+yc(t?.output_per_mtok)),xA={all:[bA],text_generation:[vA,bA,yA([`Cached $/MTok`],(e,t)=>yc(t?.cached_input_per_mtok))],embedding:[yA([`Input`,`$/MTok`],(e,t)=>yc(t?.input_per_mtok))],image:[yA([`$/Image`],(e,t)=>bc(t?.per_image))],audio:[yA([`$/Second`],(e,t)=>bc(t?.per_second_input)),yA([`$/Character`],(e,t)=>bc(t?.per_character_input))],video:[yA([`$/Second (In)`],(e,t)=>bc(t?.per_second_input)),yA([`$/Second (Out)`],(e,t)=>bc(t?.per_second_output))],utility:[yA([`$/Page`],(e,t)=>bc(t?.per_page)),yA([`$/Request`],(e,t)=>bc(t?.per_request))]};function SA(e){return xA[e]||xA.all}function CA(e){return SA(e).length+2}var wA=B(`
`),TA=B(` `,1),EA=B(``),DA=B(` `),OA=B(` `),kA=B(`
`),AA=B(`
`),jA=B(`
Model
`);function MA(e,t){O(t,!0);let n=A(()=>Wc.activeCategory||`all`),r=A(()=>SA(R(n))),i=A(()=>CA(R(n)));var a=jA(),o=P(a),s=P(o),c=P(s),l=I(P(c));W(l,17,()=>R(r),ii,(e,t)=>{var n=EA();W(n,21,()=>R(t).headerLines,ii,(e,t,n)=>{var r=TA(),i=F(r),a=e=>{V(e,wA())};U(i,e=>{n>0&&e(a)});var o=I(i,1,!0);L(()=>H(o,R(t))),V(e,r)}),D(n),L(()=>G(n,1,Ni(R(t).class),`svelte-1911hy6`)),V(e,n)});var u=I(l);Rk(P(u),{}),D(u),D(c),D(s),W(I(s),17,()=>pk.filteredDisplayModelGroups,e=>e.key,(e,t)=>{var n=AA(),a=P(n),o=P(a),s=P(o),c=P(s),l=P(c),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=e=>{var n=DA(),r=P(n,!0);D(n),L(()=>H(r,`(`+R(t).type_label+`)`)),V(e,n)};U(f,e=>{R(t).type_label&&e(p)});var m=I(f,2),h=e=>{var n=OA(),r=P(n,!0);D(n),L(()=>H(r,R(t).item_count_label)),V(e,n)};U(m,e=>{R(t).item_count_label&&e(h)}),D(l);var g=I(l,2),_=e=>{var n=kA(),r=P(n,!0);D(n),L(()=>H(r,R(t).access_summary)),V(e,n)};U(g,e=>{R(t).access_summary&&e(_)}),D(c);var v=I(c,2),y=P(v),b=e=>{Ik(e,{get row(){return R(t)}})};U(y,e=>{R(t).access.selector&&e(b)});var x=I(y,2),S=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`provider pricing for `+R(t).display_name,Pk.hasProviderPricingOverride(R(t)))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasProviderPricingOverride(R(t))));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openProviderPricingOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(x,e=>{Pk.modelPricingOverridesAvailable&&R(t).provider_name&&e(S)});var C=I(x,2),w=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(`provider `+R(t).display_name,Z.rateLimitGaugeClassForProvider(R(t)))),r=A(()=>Z.rateLimitGaugeClassForProvider(R(t)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForProvider(R(t)),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},T=A(()=>Z.rateLimitsEnabled()&&R(t).provider_name);U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{{let n=A(()=>QO(`provider access for `+R(t).display_name,XO(R(t).access))),r=A(()=>ZO(XO(R(t).access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openProviderOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(E,e=>{pk.virtualModelsAvailable&&R(t).access.selector&&e(ee)}),D(v),D(s),D(o),D(a),W(I(a),17,()=>R(t).rows,e=>e.key,(e,t)=>{_A(e,{get row(){return R(t)},get columns(){return R(r)}})}),D(n),L(()=>{K(o,`colspan`,R(i)),H(d,R(t).display_name)}),V(e,n)}),D(o),D(a),V(e,a),k()}var NA=B(``);function PA(e,t){let n=q(t,`enabled`,3,!1),r=q(t,`label`,3,``),i=q(t,`disabled`,3,!1),a=q(t,`restricted`,3,!1);var o=NA();let s;var c=I(P(o),2),l=P(c,!0);D(c),D(o),L(()=>{s=G(o,1,`alias-toggle`,null,s,{enabled:n(),restricted:a()}),o.disabled=i(),K(o,`aria-label`,(n()?`Disable `:`Enable `)+r()),H(l,t.text??(n()?`Enabled`:`Disabled`))}),z(`click`,o,function(...e){t.onclick?.apply(this,e)}),V(e,o)}Br([`click`]);var FA=B(``),IA=B(`
`);function LA(e,t){O(t,!0);let n=q(t,`model`,15,``),r=q(t,`weight`,15),i=q(t,`id`,3,void 0),a=q(t,`placeholder`,3,`openai/gpt-4o`),o=q(t,`showRemove`,3,!0);var s=IA(),c=P(s);ea(c);var l=I(c,2),u=e=>{var t=FA();ea(t),L(()=>t.disabled=pk.vmFormManaged),la(t,r),V(e,t)},d=A(()=>pk.vmFormShowWeights());U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{OT(e,{label:`Remove target`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,get onclick(){return t.onremove},get disabled(){return pk.vmFormManaged},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})};U(f,e=>{o()&&e(p)}),D(s),L(()=>{K(c,`id`,i()),K(c,`placeholder`,a()),c.disabled=pk.vmFormManaged}),la(c,n),V(e,s),k()}var RA=B(`

`),zA=B(`adaptive lets the registered routing extension pick the target per + request.`,1),BA=B(`Add one target to make this a redirect/alias, or two or more to load + balance across them, then pick a strategy: round_robin rotates across targets + (weight biases the share) and cost always routes to the cheapest available + target. Leave Targets empty to make it only an access policy on the Source selector. The selector uses / for all providers and + models, for one provider, or for one model. user_paths is + matched against the effective request user_path: the managed API key user_path when present, otherwise the configured user path request header.`,1),VA=B(``),HA=B(`

This virtual model is defined in configuration (config.yaml / VIRTUAL_MODELS) and is read-only here. Edit your configuration to change it.

`),UA=B(``),WA=B(``),GA=B(``),KA=B(`
`,1),qA=B(``),JA=B(`Use / to allow every user path. Use a team path to restrict to that + subtree, or an unused path to make the selector unavailable.`,1),YA=B(``),XA=B(` Adds a fraction of measured inference time: 0.5 adds 50%. Streaming chunks are buffered + and released on the slowed timeline. Leave empty to disable; accepted values are 0.1–10.`,1),ZA=B(` `),QA=B(`
Targets
`,1);function $A(e,t){O(t,!0);let n=pk;On(()=>{n.vmFormOpen&&ks.ensureLoaded()});{let t=e=>{iC(e,{copyId:`virtual-model-help-copy`,label:`virtual model help`,get open(){return n.vmFormHelpOpen},set open(e){n.vmFormHelpOpen=e},title:e=>{var t=RA(),r=P(t,!0);D(t),L(()=>H(r,n.vmFormDisplayName||n.vmForm.source||`Virtual model`)),V(e,t)},help:e=>{Ve();var t=BA(),n=I(F(t),7),r=e=>{var t=zA();Ve(),V(e,t)},i=A(()=>ks.virtualModelStrategies().includes(`adaptive`));U(n,e=>{R(i)&&e(r)});var a=I(n,8);a.textContent=`{provider_name}/`;var o=I(a,2);o.textContent=`{provider_name}/{model}`,Ve(7),V(e,t)},$$slots:{title:!0,help:!0}})},r=e=>{var t=Xr(),r=F(t),i=e=>{var t=VA();L(()=>t.disabled=n.vmDeleting||n.vmSubmitting),z(`click`,t,()=>n.deleteVirtualModel()),V(e,t)};U(r,e=>{n.vmFormHasExisting&&!n.vmFormManaged&&e(i)}),V(e,t)},i=A(()=>n.vmDeleting||n.vmFormManaged),a=A(()=>n.vmFormMode===`edit`?`Save`:`Create`),o=A(()=>n.vmFormMode===`edit`?_o:po);ME(e,{get open(){return n.vmFormOpen},ariaLabel:`Virtual model editor`,get error(){return n.vmFormError},get submitting(){return n.vmSubmitting},get submitDisabled(){return R(i)},get submitLabel(){return R(a)},get submitIcon(){return R(o)},onclose:()=>n.closeVirtualModelForm(),onsubmit:()=>n.submitVirtualModelForm(),header:t,extraActions:r,children:(e,t)=>{var r=QA(),i=F(r),a=e=>{V(e,HA())};U(i,e=>{n.vmFormManaged&&e(a)});var o=I(i,2);PE(o,{id:`virtual-model-source`,label:`Source`,children:(e,t)=>{var r=UA();ea(r),L(()=>r.disabled=n.vmFormSourceLocked||n.vmFormManaged),la(r,()=>n.vmForm.source,e=>n.vmForm.source=e),V(e,r)},$$slots:{default:!0}});var s=I(o,2);W(s,21,()=>Wc.models,e=>pO(e),(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(R(t)),()=>pO(R(t))]),V(e,n)}),D(s);var c=I(s,2),l=I(P(c),2);{let e=A(()=>n.vmFormHasPrimaryTarget());LA(l,{id:`virtual-model-target`,get showRemove(){return R(e)},onremove:()=>n.removePrimaryTarget(),get model(){return n.vmForm.target_model},set model(e){n.vmForm.target_model=e},get weight(){return n.vmForm.target_weight},set weight(e){n.vmForm.target_weight=e}})}var u=I(l,2);W(u,17,()=>n.vmForm.targets,ii,(e,t,r)=>{LA(e,{placeholder:`groq/llama`,onremove:()=>n.removeVmTarget(r),get model(){return R(t).model},set model(e){R(t).model=e},get weight(){return R(t).weight},set weight(e){R(t).weight=e}})});var d=I(u,2),f=P(d);J(P(f),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(f),D(d),D(c);var p=I(c,2),m=e=>{var t=KA(),r=F(t);PE(r,{id:`virtual-model-strategy`,label:`Load-balancing strategy`,children:(e,t)=>{var r=GA();W(r,21,()=>n.vmStrategyOptions(),e=>e.value,(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),L(()=>r.disabled=n.vmFormManaged),Ui(r,()=>n.vmForm.strategy,e=>n.vmForm.strategy=e),V(e,r)},$$slots:{default:!0}});var i=I(r,2),a=P(i),o=P(a);ea(o),Ve(2),D(a),D(i),L(()=>o.disabled=n.vmFormManaged),ua(o,()=>n.vmForm.session_affinity,e=>n.vmForm.session_affinity=e),V(e,t)},h=A(()=>n.vmFormShowStrategy());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=P(g);iC(_,{copyId:`virtual-model-user-paths-help`,label:`user paths help`,get open(){return n.vmFormUserPathsHelpOpen},set open(e){n.vmFormUserPathsHelpOpen=e},title:e=>{V(e,qA())},help:e=>{Ve();var t=JA();Ve(2),V(e,t)},$$slots:{title:!0,help:!0}});var v=I(_,2);ut(v),K(v,`placeholder`,`/ +/team/alpha +/non-existing`),D(g);var y=I(g,2);PE(y,{id:`virtual-model-description`,label:`Description`,children:(e,t)=>{var r=YA();ut(r),L(()=>r.disabled=n.vmFormManaged),la(r,()=>n.vmForm.description,e=>n.vmForm.description=e),V(e,r)},$$slots:{default:!0}});var b=I(y,2),x=e=>{PE(e,{id:`virtual-model-slowdown`,label:`Slowdown (extra inference time)`,children:(e,t)=>{var r=XA(),i=F(r);ea(i),Ve(2),L(()=>i.disabled=n.vmFormManaged),la(i,()=>n.vmForm.slowdown,e=>n.vmForm.slowdown=e),V(e,r)},$$slots:{default:!0}})},S=A(()=>n.vmFormSupportsSlowdown());U(b,e=>{R(S)&&e(x)});var C=I(b,2),w=P(C),T=e=>{var t=ZA(),r=P(t,!0);D(t),L(()=>H(r,`Default enabled: `+(n.vmFormDefaultEnabled?`yes`:`no`)+` · Effective now: `+(n.vmFormEffectiveEnabled?`yes`:`no`))),V(e,t)};U(w,e=>{n.vmFormMode===`edit`&&e(T)});var E=I(w,2),ee=P(E);{let e=A(()=>n.vmFormToggleRestricted()),t=A(()=>n.vmFormToggleLabel());PA(ee,{get enabled(){return n.vmForm.enabled},get restricted(){return R(e)},label:`virtual model`,get disabled(){return n.vmFormManaged},get text(){return R(t)},onclick:()=>{n.vmFormManaged||(n.vmForm.enabled=!n.vmForm.enabled)}})}D(E),D(C),L(()=>{f.disabled=n.vmFormManaged,v.disabled=n.vmFormManaged}),z(`click`,f,()=>n.addVmTarget()),la(v,()=>n.vmForm.user_paths,e=>n.vmForm.user_paths=e),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var ej=B(`

Pricing override

`,1),tj=B(``),nj=B(``),rj=B(``),ij=B(``),aj=B(`
`),oj=B(`
Tiered pricing exists for this override and will be preserved. Tier editing can be added + without a database migration.
`),sj=B(`
No pricing fields set.
`),cj=B(`
`),lj=B(`

Currency is USD. Saved fields override model registry and config.yaml pricing for this + selector; unset fields continue to inherit.

Price Type USD Source
`,1);function uj(e,t){O(t,!0);let n=Pk;ME(e,{get open(){return n.modelPricingOverrideFormOpen},ariaLabel:`Model pricing editor`,dialogClass:`model-pricing-editor`,get error(){return n.modelPricingOverrideError},get submitting(){return n.modelPricingOverrideSubmitting},submitLabel:`Save Pricing`,onclose:()=>n.closeModelPricingOverrideForm(),onsubmit:()=>n.submitModelPricingOverrideForm(),header:e=>{var t=ej(),r=I(F(t),2),i=P(r,!0);D(r),L(()=>H(i,n.modelPricingOverrideFormDisplayName||n.modelPricingOverrideForm.selector||`Pricing`)),V(e,t)},extraActions:e=>{var t=Xr(),r=F(t),i=e=>{var t=tj();L(()=>t.disabled=n.modelPricingOverrideSubmitting),z(`click`,t,()=>n.deleteModelPricingOverride()),V(e,t)};U(r,e=>{n.modelPricingOverrideFormHasExistingOverride&&e(i)}),V(e,t)},children:(e,t)=>{var r=lj(),i=F(r),a=P(i);PE(a,{id:`model-pricing-override-selector`,label:`Selector`,children:(e,t)=>{var r=nj();ea(r),la(r,()=>n.modelPricingOverrideForm.selector,e=>n.modelPricingOverrideForm.selector=e),V(e,r)},$$slots:{default:!0}});var o=I(a,2),s=e=>{PE(e,{id:`model-pricing-override-scope`,label:`Scope`,children:(e,t)=>{var r=ij();W(r,21,()=>n.modelPricingOverrideFormScopeOptions,e=>e.value,(e,t)=>{var n=rj(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),z(`change`,r,()=>n.setModelPricingOverrideScope(n.modelPricingOverrideFormScope)),Ui(r,()=>n.modelPricingOverrideFormScope,e=>n.modelPricingOverrideFormScope=e),V(e,r)},$$slots:{default:!0}})};U(o,e=>{n.modelPricingOverrideFormScopeOptions.length>1&&e(s)}),D(i);var c=I(i,4);W(c,21,()=>n.modelPricingOverrideRows,e=>e.id,(e,t,r)=>{var i=aj(),a=P(i),o=P(a),s=I(o,2);W(s,21,()=>n.availablePricingFieldOptions(R(t)),e=>e.value,(e,t)=>{var n=rj(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).group+` - `+R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(s),D(a);var c=I(a,2),l=P(c),u=I(l,2);ea(u),D(c);var d=I(c,2);{let e=A(()=>`Remove `+n.pricingFieldLabel(R(t).field));OT(d,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn pricing-override-remove-row`,onclick:()=>n.removeModelPricingOverrideRow(R(t)),children:(e,t)=>{J(e,{get icon(){return Lo},class:`table-icon-svg`})},$$slots:{default:!0}})}D(i),L(()=>{K(o,`for`,`pricing-type-`+R(t).id),K(s,`id`,`pricing-type-`+R(t).id),K(l,`for`,`pricing-value-`+R(t).id),K(u,`id`,`pricing-value-`+R(t).id)}),Ui(s,()=>R(t).field,e=>R(t).field=e),la(u,()=>R(t).value,e=>R(t).value=e),V(e,i)}),D(c);var l=I(c,2),u=P(l);J(P(u),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(u),D(l);var d=I(l,2),f=e=>{V(e,oj())};U(d,e=>{n.modelPricingOverrideFormPreservedTiers.length>0&&e(f)});var p=I(d,2),m=I(P(p),2),h=e=>{V(e,sj())},g=A(()=>n.modelPricingEffectivePreviewRows().length===0);U(m,e=>{R(g)&&e(h)}),W(I(m,2),17,()=>n.modelPricingEffectivePreviewRows(),e=>e.field,(e,t)=>{var n=cj(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(n),L(e=>{H(i,R(t).label),H(o,e),H(c,R(t).source)},[()=>R(t).value===null||R(t).value===void 0?`-`:bc(Number(R(t).value))]),V(e,n)}),D(p),z(`click`,u,()=>n.addModelPricingOverrideRow()),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}}),k()}Br([`click`,`change`]);var dj=B(`

Failover mapping

`,1),fj=B(``),pj=B(`

This failover mapping is defined in configuration and is read-only here.

`),mj=B(``),hj=B(`
`),gj=B(`
`,1),_j=B(`
`);function vj(e,t){O(t,!0);{let t=e=>{var t=dj(),n=I(F(t),2),r=P(n,!0);D(n),L(()=>H(r,Q.failoverForm.source||`Failover`)),V(e,t)},n=e=>{var t=Xr(),n=F(t),r=e=>{var t=fj();L(()=>t.disabled=Q.failoverSaving||Q.failoverGenerating),z(`click`,t,()=>Q.deleteFailoverRule()),V(e,t)};U(n,e=>{Q.failoverFormMode===`edit`&&!Q.failoverFormManaged&&e(r)}),V(e,t)},r=A(()=>Q.failoverGenerating||Q.failoverFormManaged);ME(e,{get open(){return Q.failoverFormOpen},ariaLabel:`Failover editor`,get error(){return Q.failoverError},get submitting(){return Q.failoverSaving},get submitDisabled(){return R(r)},submitLabel:`Save`,onclose:()=>Q.closeFailoverForm(),onsubmit:()=>Q.submitFailoverForm(),header:t,extraActions:n,children:(e,t)=>{var n=_j(),r=P(n),i=e=>{V(e,pj())};U(r,e=>{Q.failoverFormManaged&&e(i)});var a=I(r,2);W(a,21,()=>Wc.models,ii,(e,t)=>{var n=mj(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(R(t)),()=>pO(R(t))]),V(e,n)}),D(a);var o=I(a,2);PE(o,{id:`failover-target`,label:`Fallback models`,children:(e,t)=>{var n=gj(),r=F(n),i=P(r),a=P(i);ea(a);var o=I(a,2),s=e=>{OT(e,{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removePrimaryFailoverTarget(),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})};U(o,e=>{Q.failoverForm.target_model&&e(s)}),D(i),W(I(i,2),17,()=>Q.failoverForm.targets,ii,(e,t,n)=>{var r=hj(),i=P(r);ea(i),OT(I(i,2),{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removeFailoverTarget(n),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}}),D(r),L(()=>i.disabled=Q.failoverFormManaged),la(i,()=>R(t).model,e=>R(t).model=e),V(e,r)}),D(r);var c=I(r,2),l=P(c);J(P(l),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(l);var u=I(l,2),d=P(u);J(d,{get icon(){return Fo},class:`form-action-icon`});var f=I(d,2),p=P(f,!0);D(f),D(u),D(c),L(e=>{a.disabled=Q.failoverFormManaged,l.disabled=Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving,u.disabled=e,H(p,Q.failoverGenerating?`Generating...`:`Generate automatically`)},[()=>Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving||!Q.failoverEnabled()]),la(a,()=>Q.failoverForm.target_model,e=>Q.failoverForm.target_model=e),z(`click`,l,()=>Q.addFailoverTarget()),z(`click`,u,()=>Q.generateFailoverForForm()),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=P(s);PA(P(c),{get enabled(){return Q.failoverForm.enabled},label:`failover mapping`,get disabled(){return Q.failoverFormManaged},onclick:()=>{Q.failoverFormManaged||(Q.failoverForm.enabled=!Q.failoverForm.enabled)}}),D(c),D(s),D(n),V(e,n)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var yj=B(` `),bj=B(`
`),xj=B(``),Sj=B(`
`),Cj=B(`

No failover suggestions were generated.

`),wj=B(`

No failover drafts match the filter.

`),Tj=B(``),Ej=B(``);function Dj(e,t){O(t,!0),Hs(e,{get open(){return Q.failoverDraftsOpen},variant:`editor`,onclose:()=>Q.closeFailoverDraftsModal(),children:(e,t)=>{var n=Ej(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=yj(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>Q.failoverDraftCountLabel()]),V(e,t)};U(a,e=>{Q.failoverGeneratedRules.length>0&&e(o)}),Rs(I(a,2),{label:`Close failover drafts`,onclick:()=>Q.closeFailoverDraftsModal(),get disabled(){return Q.failoverDraftSaving}}),D(i),D(r);var s=I(r,2),c=e=>{ET(e,{label:`Generating failover drafts...`,class:`failover-drafts-loading`})};U(s,e=>{Q.failoverGenerating&&e(c)});var l=I(s,2),u=e=>{var t=bj(),n=P(t);jw(n,{placeholder:`Filter failover drafts...`,label:`Filter failover drafts`,get value(){return Q.failoverDraftFilter},set value(e){Q.failoverDraftFilter=e}});var r=I(n,2),i=P(r);J(i,{get icon(){return Ba},class:`form-action-icon`});var a=I(i,2),o=P(a,!0);D(a),D(r),D(t),L(e=>{r.disabled=Q.failoverDraftSaving,H(o,e)},[()=>Q.allFailoverDraftsSelected()?`Deselect all`:`Select all`]),z(`click`,r,()=>Q.toggleAllFailoverDrafts()),V(e,t)};U(l,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&e(u)});var d=I(l,2),f=e=>{var t=Sj();W(t,21,()=>Q.filteredFailoverDrafts(),e=>`failover-draft:`+Q.failoverPrimaryModel(e),(e,t)=>{var n=xj(),r=P(n);ea(r);var i=I(r,2),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(i),D(n),L((e,t,n,i)=>{na(r,e),r.disabled=Q.failoverDraftSaving,K(r,`aria-label`,t),H(o,n),H(c,i)},[()=>Q.failoverDraftSelected(R(t)),()=>`Select failover draft for `+Q.failoverPrimaryModel(R(t)),()=>Q.failoverPrimaryModel(R(t)),()=>Q.failoverTargetLabel(R(t))]),z(`change`,r,e=>Q.setFailoverDraftSelected(R(t),e.currentTarget.checked)),V(e,n)}),D(t),V(e,t)},p=A(()=>!Q.failoverGenerating&&Q.filteredFailoverDrafts().length>0);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{V(e,Cj())};U(m,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length===0&&!Q.failoverError&&e(h)});var g=I(m,2),_=e=>{V(e,wj())},v=A(()=>!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&Q.filteredFailoverDrafts().length===0);U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=Tj(),n=P(t,!0);D(t),L(()=>H(n,Q.failoverError)),V(e,t)};U(y,e=>{Q.failoverError&&e(b)});var x=I(y,2),S=P(x),C=I(S,2),w=P(C);J(w,{get icon(){return _o},class:`form-action-icon`});var T=I(w,2),E=P(T,!0);D(T),D(C),D(x),D(n),L(e=>{S.disabled=Q.failoverDraftSaving,C.disabled=e,H(E,Q.failoverDraftSaving?`Saving...`:`Save selected`)},[()=>Q.failoverGenerating||Q.failoverDraftSaving||Q.selectedFailoverDraftCount()===0]),z(`click`,S,()=>Q.closeFailoverDraftsModal()),z(`click`,C,()=>Q.saveSelectedFailoverDrafts()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`,`change`]);var Oj=B(`
Rate limit management is unavailable.
`),kj=B(` Add`,1),Aj=B(`

`),jj=B(`

No rules.

`),Mj=B(` Edit`,1),Nj=B(`
`),Pj=B(`
`),Fj=B(`

`),Ij=B(``),Lj=B(``);function Rj(e,t){O(t,!0);function n(){Y.dialogOpen||Z.closeRateLimitInspector()}Hs(e,{get open(){return Z.rateLimitInspectorOpen},variant:`editor`,onclose:n,children:(e,t)=>{var n=Lj(),r=P(n),i=P(r),a=I(P(i),2),o=P(a),s=P(o,!0);D(o),D(a),D(i),Rs(I(i,2),{label:`Close rate limits inspector`,onclick:()=>Z.closeRateLimitInspector()}),D(r);var c=I(r,2),l=e=>{ET(e,{label:`Loading rate limits...`})},u=e=>{V(e,Oj())},d=e=>{var t=Xr();W(F(t),17,()=>Z.rateLimitInspectorSections(),e=>e.key,(e,t)=>{var n=Fj(),r=P(n),i=P(r),a=P(i,!0);D(i);var o=I(i,2);{let e=A(()=>`Add `+R(t).title.toLowerCase());OT(o,{get label(){return R(e)},class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(R(t).scope,R(t).subject),children:(e,t)=>{var n=kj();J(F(n),{get icon(){return po},class:`table-icon-svg`}),Ve(2),V(e,n)},$$slots:{default:!0}})}D(r);var s=I(r,2),c=e=>{var n=Aj(),r=P(n,!0);D(n),L(()=>H(r,R(t).hint)),V(e,n)};U(s,e=>{R(t).hint&&e(c)});var l=I(s,2),u=e=>{V(e,jj())},d=e=>{var n=Pj();W(n,21,()=>R(t).items,e=>Z.rateLimitKey(e),(e,t)=>{var n=Nj(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=P(c);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?ka:ko);J(l,{get icon(){return R(e)},class:`budget-period-icon`})}var u=I(l,2),d=P(u,!0);D(u),D(c),D(s);var f=I(s,2),p=P(f),m=P(p),h=P(m,!0);D(m);var g=I(m,2),_=P(g,!0);D(g),D(p);var v=I(p,2),y=P(v),b=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(null,null,R(t)),children:(e,t)=>{var n=Mj();J(F(n),{get icon(){return uo},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},x=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(y,e=>{R(x)&&e(b)}),D(v),D(f),D(i),D(r),D(n),L((e,t,r,i,a,s,c,l)=>{G(n,1,`budget-row ${e??``}`),Bi(n,t),K(n,`title`,r),H(o,i),H(d,a),H(h,s),K(g,`title`,c),H(_,l)},[()=>Z.rateLimitPressureClass(R(t)),()=>Z.rateLimitPressureStyle(R(t)),()=>Z.rateLimitPressurePercent(R(t))+`% of the most constrained cap used`,()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitInspectorSummary(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n)};U(l,e=>{R(t).items.length===0?e(u):e(d,-1)}),D(n),L(()=>H(a,R(t).title)),V(e,n)}),V(e,t)};U(c,e=>{Z.rateLimitsLoading?e(l):Z.rateLimitsAvailable?e(d,-1):e(u,1)});var f=I(c,2),p=P(f),m=I(p,2),h=e=>{var t=Ij();z(`click`,t,()=>{Z.closeRateLimitInspector(),Yo.navigate(`rate-limits`)}),V(e,t)},g=A(()=>Z.rateLimitsEnabled());U(m,e=>{R(g)&&e(h)}),D(f),D(n),L(()=>H(s,Z.rateLimitInspector.title)),z(`click`,p,()=>Z.closeRateLimitInspector()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`]);var zj=B(`
models
`),Bj=B(`
Virtual models feature is unavailable.
`),Vj=B(`
`),Hj=B(``),Uj=B(`
`),Wj=B(``),Gj=B(`
`),Kj=B(`

No models registered.

`),qj=B(`

No models in this category.

`),Jj=B(`

No models match your filter.

`),Yj=B(`
`);function Xj(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`models`&&(pk.fetchVirtualModels(),Pk.fetchModelPricingOverrides(),Q.fetchFailoverRules(),Z.fetchRateLimitsPage())}),On(()=>{let e=pk.filteredDisplayModels.length;return wr(()=>pk.restartModelRendering(e)),()=>pk.stopModelRendering()});let n=A(()=>Y.needsAuth);var r=Yj(),i=P(r),a=I(P(i),2),o=e=>{var t=zj(),n=P(t),r=P(n,!0);D(n),Ve(),D(t),L(()=>H(r,Wc.filter?pk.filteredDisplayModels.length+` / `+pk.displayModels.length:pk.displayModels.length)),V(e,t)};U(a,e=>{pk.displayModels.length>0&&e(o)}),D(i);var s=I(i,2);Kc(s,{});var c=I(s,2),l=e=>{V(e,Bj())};U(c,e=>{!pk.virtualModelsAvailable&&!R(n)&&e(l)});var u=I(c,2),d=e=>{var t=Vj(),n=P(t,!0);D(t),L(()=>H(n,pk.aliasError)),V(e,t)};U(u,e=>{pk.aliasError&&!R(n)&&e(d)});var f=I(u,2),p=e=>{var t=Vj(),n=P(t,!0);D(t),L(()=>H(n,Pk.modelPricingOverrideError)),V(e,t)};U(f,e=>{Pk.modelPricingOverrideError&&!R(n)&&!Pk.modelPricingOverrideFormOpen&&e(p)});var m=I(f,2),h=e=>{var t=Uj();W(t,21,()=>Wc.categories,e=>e.category,(e,t)=>{var n=Hj();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i,2),s=P(o,!0);D(o),D(n),L(()=>{r=G(n,1,`category-tab svelte-scpjps`,null,r,{active:Wc.activeCategory===R(t).category}),H(a,R(t).display_name),H(s,R(t).count)}),z(`click`,n,()=>Wc.selectCategory(R(t).category)),V(e,n)}),D(t),V(e,t)};U(m,e=>{Wc.categories.length>0&&e(h)});var g=I(m,2),_=e=>{var t=Gj(),n=P(t);jw(P(n),{placeholder:`Filter by provider, provider/model, alias, or owner...`,label:`Filter models by provider, provider/model, alias, or owner`,get value(){return Wc.filter},set value(e){Wc.filter=e}}),D(n);var r=I(n,2),i=P(r),a=e=>{var t=Wj();J(P(t),{get icon(){return po},class:`alias-create-icon`}),Ve(2),D(t),z(`click`,t,()=>pk.openVirtualModelCreate()),V(e,t)};U(i,e=>{pk.virtualModelsAvailable&&e(a)}),D(r),D(t),V(e,t)};U(g,e=>{(pk.displayModels.length>0||Wc.filter||pk.virtualModelsAvailable)&&e(_)});var v=I(g,2),y=e=>{{let t=A(()=>pk.modelLoadingText());ET(e,{get label(){return R(t)},class:`models-loading-state`})}},b=A(()=>pk.modelsBusy()&&!R(n));U(v,e=>{R(b)&&e(y)});var x=I(v,2);$A(x,{});var S=I(x,2);uj(S,{});var C=I(S,2),w=e=>{MA(e,{})};U(C,e=>{(pk.displayModels.length>0||Wc.filter)&&e(w)});var T=I(C,2),E=e=>{V(e,Kj())};U(T,e=>{pk.displayModels.length===0&&!Wc.loading&&!R(n)&&!Wc.filter&&(Wc.activeCategory===`all`||!Wc.activeCategory)&&e(E)});var ee=I(T,2),te=e=>{V(e,qj())};U(ee,e=>{pk.displayModels.length===0&&!Wc.loading&&!R(n)&&!Wc.filter&&Wc.activeCategory&&Wc.activeCategory!==`all`&&e(te)});var ne=I(ee,2),re=e=>{V(e,Jj())};U(ne,e=>{pk.displayModels.length>0&&pk.filteredDisplayModels.length===0&&Wc.filter&&e(re)});var ie=I(ne,2);Rj(ie,{});var ae=I(ie,2);qD(ae,{});var oe=I(ae,2);vj(oe,{}),Dj(I(oe,2),{}),D(r),V(e,r),k()}Br([`click`]);var Zj=`draft-workflow-preview`;function Qj(){return{scope_provider:``,scope_model:``,scope_user_path:``,name:``,description:``,features:{cache:!0,audit:!0,usage:!0,budget:!0,guardrails:!1,failover:!0},guardrails:[]}}function $j(){return{scope_provider:``,scope_model:``,scope_user_path:``}}function eM(e){return{ref:``,step:Number.isFinite(e)?e:10}}function tM(e){let t=e==null?``:String(e).trim();if(t===``)return NaN;let n=Number(t);return Number.isFinite(n)?n:NaN}function nM(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))return n;let r=t.charAt(0).toUpperCase()+t.slice(1);for(let n of[t,r])if(Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==null&&e[n]!==void 0)return e[n];return n}function rM(e,t){return!e||typeof e!=`object`||Array.isArray(e)?!1:[t,t.charAt(0).toUpperCase()+t.slice(1)].some(t=>Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==null&&e[t]!==void 0)}function iM(e){return{cache:!!nM(e,`cache`,!1),audit:!!nM(e,`audit`,!1),usage:!!nM(e,`usage`,!1),budget:nM(e,`budget`,!0)!==!1,guardrails:!!nM(e,`guardrails`,!1),failover:nM(e,`failover`,!0)!==!1}}function aM(e,t){let n=iM(e),r=t||{},i=n.usage&&!!r.usage;return{cache:n.cache&&!!r.cache,audit:n.audit&&!!r.audit,usage:i,budget:i&&n.budget&&!!r.budget,guardrails:n.guardrails&&!!r.guardrails,failover:n.failover&&!!r.failover}}function oM(e,t){let n=e&&e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:e&&e.features?e.features:{};return{...aM((e&&e.effective_features&&typeof e.effective_features==`object`&&!Array.isArray(e.effective_features)?e.effective_features:null)||n,t),failover:iM(n).failover}}function sM(e,t){return oM(e,t).failover?`On`:`Off`}function cM(e){return(Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:Array.isArray(e&&e.guardrails)?e.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:tM(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0)}function lM(e,t){return oM(e,t).guardrails&&Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[]}function uM(e){return String(e&&(e.scope_provider_name||e.scope_provider)||``).trim()}function dM(e){return String(e&&(e.provider_name||e.provider_type)||``).trim()}function fM(e,t){let n=new Set,r=String(t&&t.scope_provider||``).trim();return r&&n.add(r),(Array.isArray(e)?e:[]).forEach(e=>{let t=dM(e);t&&n.add(t)}),[...n].sort()}function pM(e,t,n){let r=String(t||``).trim(),i=new Set,a=String(n&&n.scope_provider||``).trim(),o=String(n&&n.scope_model||``).trim();return r&&r===a&&o&&i.add(o),(Array.isArray(e)?e:[]).forEach(e=>{if(r&&dM(e)!==r)return;let t=String(e&&e.model&&e.model.id||``).trim();t&&i.add(t)}),[...i].sort()}function mM(e){let t=String(e&&e.scope_type||``).trim();return t===`provider_model`?`Provider Name + Model`:t===`provider_model_path`?`Provider Name + Model + Path`:t===`provider_path`?`Provider Name + Path`:t===`path`?`Path`:t===`provider`?`Provider Name`:`Global`}function hM(e){return String(e&&e.scope_display||`global`).trim()||`global`}function gM(e){let t=String(e&&e.name||``).trim();if(t)return t;let n=hM(e);return n===`global`?`All models`:n}function _M(e){let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function vM(e){if(_M(e))return``;let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function yM(e){let t=e||Qj(),n=String(t.scope_provider||``).trim(),r=vM(t.scope_user_path);return{scope_provider:n,scope_model:n?String(t.scope_model||``).trim():``,scope_user_path:r}}function bM(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=vM(e&&e.scope_user_path);return!t&&!r?`global`:!t&&r?`path`:!n&&!r?`provider`:!n&&r?`provider_path`:r?`provider_model_path`:`provider_model`}function xM(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=vM(e&&e.scope_user_path),i=bM({scope_provider:t,scope_model:n,scope_user_path:r});return i===`global`?`global`:i===`path`?r:i===`provider`?t:i===`provider_path`?t+` @ `+r:i===`provider_model_path`?t+`/`+n+` @ `+r:t+`/`+n}function SM(e,t){let n=t||$j(),r=uM(e&&e.scope),i=r?String(e&&e.scope&&e.scope.scope_model||``).trim():``,a=vM(e&&e.scope&&e.scope.scope_user_path);return r===String(n.scope_provider||``).trim()&&i===String(n.scope_model||``).trim()&&a===vM(n.scope_user_path)}function CM(e,t,n){let r=yM(t);return!(r.scope_provider!==``||r.scope_model!==``||r.scope_user_path!==``)&&!n?null:(Array.isArray(e)?e:[]).find(e=>SM(e,r))||null}function wM(e){return String(e&&e.scope_type||``).trim()!==`global`}function TM(e){let t=String(e||``).trim();return t?t.length<=14?t:t.slice(0,12)+`…`:`—`}function EM(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.description,e.scope_display,e.scope_type,uM(e&&e.scope),e.scope&&e.scope.scope_model,e.scope&&e.scope.scope_user_path,e.workflow_hash,...Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>e.ref):[]].some(e=>String(e||``).toLowerCase().includes(r)))}function DM(e,t){let n=e||Qj(),r=yM(n),i=iM(n.features||{}),a=aM(i,t);a.failover=i.failover;let o=!!a.guardrails,s=o?cM(n):[];return{id:Zj,scope_type:bM(r),scope_display:xM(r),scope:{scope_provider_name:r.scope_provider,scope_model:r.scope_model,...r.scope_user_path?{scope_user_path:r.scope_user_path}:{}},name:String(n.name||``).trim(),description:String(n.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!a.cache,audit:!!a.audit,usage:!!a.usage,budget:!!a.budget,guardrails:o,failover:!!a.failover},guardrails:s}}}function OM({form:e,caps:t,workflows:n=[],formHydrated:r=!1,hydratedScope:i=null}){let a=e||Qj(),o=String(a.scope_provider||``).trim(),s=o?String(a.scope_model||``).trim():``,c=vM(a.scope_user_path),l=iM(a.features||{}),u=aM(l,t),d=CM(n,a,r),f=d&&d.workflow_payload&&d.workflow_payload.features,p=rM(f,`failover`),m=p?nM(f,`failover`,!0)!==!1:null,h=i||$j(),g=String(h.scope_provider||``).trim()===o&&String(h.scope_model||``).trim()===s&&vM(h.scope_user_path)===vM(c),_=!!(t&&t.failover),v=_||!!r&&g&&Object.prototype.hasOwnProperty.call(l,`failover`)||!r&&!!d&&p,y=u.guardrails?(Array.isArray(a.guardrails)?a.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:tM(e&&e.step)})):[],b={scope_provider_name:o,scope_model:s,...c?{scope_user_path:c}:{},name:String(a.name||``).trim(),description:String(a.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!u.cache,audit:!!u.audit,usage:!!u.usage,budget:!!u.budget,guardrails:!!u.guardrails},guardrails:y}};return v&&(b.workflow_payload.features.failover=!_&&!r&&d&&p?m:!!l.failover),b}function kM(e,{models:t=[],hydratedScope:n=null}={}){let r=n||$j(),i=String(r.scope_provider||``).trim(),a=String(r.scope_model||``).trim(),o=String(e&&(e.scope_provider_name||e.scope_provider)||``).trim(),s=String(e&&e.scope_model||``).trim();if(o&&!fM(t,r).includes(o)&&o!==i)return`Choose a registered provider name.`;if(s&&!o)return`Model selection requires a provider name.`;if(s){let e=pM(t,o,r),n=o===i&&s===a;if(!e.includes(s)&&!n)return`Choose a registered model for the selected provider name.`}let c=_M(e.scope_user_path);if(c)return c;let l=e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:{},u=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[];if(!l.guardrails)return``;let d=new Set;for(let e of u){if(!e.ref)return`Each guardrail step needs a guardrail ref.`;if(!Number.isInteger(e.step)||e.step<0)return`Each guardrail step must use a non-negative integer step number.`;if(d.has(e.ref))return`Each guardrail ref may appear only once in a workflow.`;d.add(e.ref)}return``}var AM=new class{#e=j(N([]));get workflows(){return R(this.#e)}set workflows(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get formOpen(){return R(this.#a)}set formOpen(e){M(this.#a,e,!0)}#o=j(!1);get submitting(){return R(this.#o)}set submitting(e){M(this.#o,e,!0)}#s=j(``);get deactivatingID(){return R(this.#s)}set deactivatingID(e){M(this.#s,e,!0)}#c=j(``);get formError(){return R(this.#c)}set formError(e){M(this.#c,e,!0)}#l=j(!1);get formHydrated(){return R(this.#l)}set formHydrated(e){M(this.#l,e,!0)}#u=j(N($j()));get hydratedScope(){return R(this.#u)}set hydratedScope(e){M(this.#u,e,!0)}#d=j(N([]));get guardrailRefs(){return R(this.#d)}set guardrailRefs(e){M(this.#d,e,!0)}#f=j(N(Qj()));get form(){return R(this.#f)}set form(e){M(this.#f,e,!0)}#p=null;failoverVisible(){return ks.booleanFlag(`FAILOVER_ENABLED`,!0)}featureCaps(){return{cache:ks.cacheVisible(),audit:ks.auditVisible(),usage:ks.usageVisible(),budget:ks.budgetsVisible(),guardrails:ks.guardrailsVisible(),failover:this.failoverVisible()}}get filteredWorkflows(){return EM(this.workflows,this.filter)}providerOptions(){return fM(Wc.models,this.hydratedScope)}modelOptions(e){return pM(Wc.models,e,this.hydratedScope)}activeScopeMatch(){return CM(this.workflows,this.form,this.formHydrated)}submitMode(){return this.activeScopeMatch()?`save`:`create`}submitLabel(){return this.submitMode()===`save`?`Save`:`Create`}submittingLabel(){return this.submitMode()===`save`?`Saving...`:`Creating...`}preview(){return DM(this.form,this.featureCaps())}openCreate(e){if(this.formOpen=!0,this.submitting=!1,this.formError=``,!e){this.formHydrated=!1,this.hydratedScope=$j(),this.form=Qj();return}this.formHydrated=!0,this.hydratedScope={scope_provider:uM(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``).trim(),scope_user_path:String(e.scope&&e.scope.scope_user_path||``).trim()};let t=e.workflow_payload&&e.workflow_payload.features?iM(e.workflow_payload.features):oM(e,this.featureCaps()),n=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>({ref:String(e&&e.ref||``).trim(),step:tM(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0):cM(e);this.form={scope_provider:uM(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``),scope_user_path:String(e.scope&&e.scope.scope_user_path||``),name:String(e.name||``),description:String(e.description||``),features:{cache:!!t.cache,audit:!!t.audit,usage:!!t.usage,budget:!!t.budget,guardrails:!!t.guardrails,failover:!!t.failover},guardrails:n.map(e=>({ref:String(e&&e.ref||``),step:Number.isFinite(e&&e.step)?e.step:10}))}}closeForm(){this.formOpen=!1,this.submitting=!1,this.formError=``,this.formHydrated=!1,this.hydratedScope=$j(),this.form=Qj()}setProvider(e){if(this.form.scope_provider=String(e||``).trim(),!this.form.scope_provider){this.form.scope_model=``;return}this.modelOptions(this.form.scope_provider).includes(String(this.form.scope_model||``).trim())||(this.form.scope_model=``)}addGuardrailStep(){let e=(Array.isArray(this.form.guardrails)?this.form.guardrails:[]).reduce((e,t)=>{let n=Number(t&&t.step);return Number.isFinite(n)?Math.max(e,n):e},0)+10;this.form.guardrails.push(eM(e))}removeGuardrailStep(e){Array.isArray(this.form.guardrails)&&this.form.guardrails.splice(e,1)}buildRequest(){return OM({form:this.form,caps:this.featureCaps(),workflows:this.workflows,formHydrated:this.formHydrated,hydratedScope:this.hydratedScope})}async fetchWorkflows(){this.#p&&this.#p.abort();let e=new AbortController;this.#p=e,this.loading=!0,this.error=``;let t=setTimeout(()=>e.abort(),1e4),n=await kT(`/admin/workflows`,{label:`workflows`,options:{signal:e.signal}});if(clearTimeout(t),this.#p===e&&(this.#p=null,this.loading=!1,n.status!==`stale`)){if(n.status===`unavailable`){this.available=!1,this.workflows=[];return}if(n.result&&(this.available=!0),n.status===`error`){this.workflows=[],this.error=e.signal.aborted?`Loading workflows timed out.`:n.error;return}this.workflows=n.items}}async fetchGuardrailRefs(){let e=await kT(`/admin/workflows/guardrails`,{label:`workflow guardrails`});e.status!==`stale`&&(this.guardrailRefs=e.items)}async fetchPage(){await Promise.all([ks.ensureLoaded(),this.fetchWorkflows(),this.fetchGuardrailRefs()])}async submitForm(){if(this.submitting)return;this.formError=``;let e=this.buildRequest(),t=kM(e,{models:Wc.models,hydratedScope:this.hydratedScope});if(t){this.formError=t;return}this.submitting=!0;try{let t=await AT(`/admin/workflows`,`POST`,e,{label:`create workflow`,unavailableStatuses:[]});if(t.status===`stale`||t.result&&t.result.status===401)return;if(t.status===`error`){this.formError=t.error;return}lc.success(`Workflow created and activated.`),this.closeForm(),this.fetchPage()}finally{this.submitting=!1}}async deactivate(e){let t=String(e&&e.id||``).trim();if(!t||this.deactivatingID||!wM(e))return;let n=gM(e);if(confirm(`Deactivate workflow "`+n+`"? Requests will fall back to the next active workflow for this scope.`)){this.deactivatingID=t;try{let e=await AT(`/admin/workflows/`+encodeURIComponent(t)+`/deactivate`,`POST`,void 0,{label:`deactivate workflow`,unavailableStatuses:[]});if(e.status===`stale`||e.result&&e.result.status===401)return;if(e.status===`error`){lc.error(e.error);return}lc.success(`Workflow deactivated.`),this.fetchPage()}finally{this.deactivatingID=``}}}};function jM(e){let t=String(e??``),n=typeof navigator<`u`?navigator.clipboard:null;if(n&&typeof n.writeText==`function`)return n.writeText(t);let r=typeof document<`u`?document:null;if(!r||!r.body||typeof r.execCommand!=`function`)return Promise.reject(Error(`Clipboard API unavailable`));let i=r.createElement(`textarea`);i.value=t,i.setAttribute(`readonly`,``),i.style.position=`fixed`,i.style.top=`0`,i.style.left=`0`,i.style.opacity=`0`;try{if(r.body.appendChild(i),i.focus(),i.select(),i.setSelectionRange(0,i.value.length),!r.execCommand(`copy`))throw Error(`execCommand copy returned false`)}finally{i.parentNode&&i.parentNode.removeChild(i)}return Promise.resolve()}function MM({resetDelayMs:e=2e3,logPrefix:t}={}){let n=N({copied:!1,error:!1}),r=null;function i(){r!==null&&clearTimeout(r),r=null}function a(){i(),r=setTimeout(()=>{n.copied=!1,n.error=!1,r=null},e)}return{get copied(){return n.copied},get error(){return n.error},reset(){i(),n.copied=!1,n.error=!1},async copy(e,r){if(!(e==null||e===``)){i(),n.copied=!1,n.error=!1;try{await jM(typeof r==`function`?r(e):String(e)),n.copied=!0,n.error=!1}catch(e){console.error(t||`Failed to copy text:`,e),n.copied=!1,n.error=!0}a()}}}}var NM=B(``);function PM(e,t){O(t,!0);let n=q(t,`workflowID`,3,``),r=MM({logPrefix:`Failed to copy workflow ID:`});On(()=>{n(),r.reset()});let i=A(()=>r.error?`Unable to copy workflow ID`:r.copied?`Workflow ID copied`:`Copy workflow ID`),a=A(()=>n()?R(i)+` `+n():R(i));async function o(e){e.preventDefault(),n()&&await r.copy(n())}var s=NM();let c;var l=I(P(s),4),u=P(l,!0);D(l);var d=I(l,2);J(P(d),{get icon(){return Ja}}),D(d),D(s),L(()=>{c=G(s,1,`workflow-pipeline-meta mono svelte-1viff7o`,null,c,{"workflow-pipeline-meta-copied":r.copied,"workflow-pipeline-meta-error":r.error}),K(s,`title`,R(i)),K(s,`aria-label`,R(a)),H(u,n())}),z(`click`,s,o),V(e,s),k()}Br([`click`]);var FM=(e,t)=>{let n=()=>(t?.()).icon,r=()=>(t?.()).label,i=Et(()=>h((t?.()).variant,`workflow-node-feature`)),a=()=>(t?.()).state,o=()=>(t?.()).sub,s=()=>(t?.()).badge;var c=zM(),l=P(c),u=e=>{var t=IM();let r;J(P(t),{get icon(){return n()}}),D(t),L(()=>r=G(t,1,`workflow-node-icon svelte-nbptrg`,null,r,{"workflow-node-icon-endpoint":R(i)===`workflow-node-endpoint`})),V(e,t)};U(l,e=>{n()&&e(u)});var d=I(l,2),f=P(d,!0);D(d);var p=I(d,2),m=e=>{var t=LM(),n=P(t,!0);D(t),L(()=>H(n,s())),V(e,t)};U(p,e=>{s()&&e(m)});var g=I(p,2),_=e=>{var t=RM(),n=P(t,!0);D(t),L(()=>H(n,o())),V(e,t)};U(g,e=>{o()&&e(_)}),D(c),L(()=>{G(c,1,Ni([`workflow-node`,R(i),a()]),`svelte-nbptrg`),H(f,r())}),V(e,c)},IM=B(`
`),LM=B(` `),RM=B(` `),zM=B(`
`),BM=B(`
`,1),VM=B(`
`,1),HM=B(`
`),UM=B(`
Async
`),WM=B(`
`);function GM(e,t){O(t,!0);let n=q(t,`chart`,19,()=>({}));var r=WM();let i;var a=P(r),o=e=>{PM(e,{get workflowID(){return n().workflowID}})};U(a,e=>{n().workflowID&&e(o)});var s=I(a,2),c=P(s);FM(c,()=>({icon:No,label:`Client`,variant:`workflow-node-endpoint`}));var l=I(c,4);FM(l,()=>({icon:Xa,label:`Auth`,state:n().authNodeClass,sub:n().authNodeSublabel}));var u=I(l,2),d=e=>{var t=BM(),r=F(t);FM(I(r,2),()=>({icon:Xa,label:`Cache`,state:n().cacheNodeClass,badge:n().cacheStatusLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().cacheConnClass]),`svelte-nbptrg`)),V(e,t)};U(u,e=>{n().showCache&&e(d)});var f=I(u,2),p=e=>{var t=VM();FM(I(F(t),2),()=>({icon:Po,label:`Budget`,state:n().budgetNodeClass,badge:n().budgetStatusLabel})),V(e,t)};U(f,e=>{n().showBudget&&e(p)});var m=I(f,2),h=e=>{var t=VM();FM(I(F(t),2),()=>({icon:To,label:`Guardrails`,sub:n().guardrailLabel})),V(e,t)};U(m,e=>{n().showGuardrails&&e(h)});var g=I(m,2),_=I(g,2);FM(_,()=>({label:n().aiLabel,variant:`workflow-node-ai`,state:n().aiNodeClass,sub:n().aiSublabel}));var v=I(_,2),y=e=>{var t=BM(),r=F(t);FM(I(r,2),()=>({icon:oo,label:`Failover`,state:n().failoverNodeClass,badge:n().failoverStatusLabel,sub:n().failoverTargetLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().failoverConnClass]),`svelte-nbptrg`)),V(e,t)};U(v,e=>{n().showFailover&&e(y)});var b=I(v,2);FM(I(b,2),()=>({icon:Wa,label:`Response`,variant:`workflow-node-endpoint`,state:n().responseNodeClass,sub:n().responseNodeSublabel})),D(s);var x=I(s,2),S=e=>{var t=UM(),r=P(t),i=P(r),a=e=>{FM(e,()=>({icon:Ra,label:`Usage`,variant:`workflow-node-feature workflow-node-async`,state:n().usageNodeClass}))};U(i,e=>{n().showUsage&&e(a)});var o=I(i,2),s=e=>{V(e,HM())};U(o,e=>{n().showUsage&&n().showAudit&&e(s)});var c=I(o,2),l=e=>{FM(e,()=>({icon:Za,label:`Audit Log`,variant:`workflow-node-feature workflow-node-async`,state:n().auditNodeClass}))};U(c,e=>{n().showAudit&&e(l)}),D(r),Ve(4),D(t),V(e,t)};U(x,e=>{n().showAsync&&e(S)}),D(r),L(()=>{i=G(r,1,`workflow-pipeline svelte-nbptrg`,null,i,{"workflow-pipeline-has-meta":n().workflowID}),G(g,1,Ni([`workflow-conn`,n().aiConnClass]),`svelte-nbptrg`),G(b,1,Ni([`workflow-conn`,n().responseConnClass]),`svelte-nbptrg`)}),V(e,r),k()}function KM(e){let t=cM(e).length;return t===0?``:t===1?`1 step`:t+` steps`}function qM(e,t){return t&&t.provider?t.provider:uM(e&&e.scope)||`AI`}function JM(e,t){return t&&t.model?t.model:e&&e.scope&&e.scope.scope_model||null}function YM(e,t){let n=String(e&&e.id||``).trim();if(n&&n!==`draft-workflow-preview`)return n;let r=String(t&&t.workflow_version_id||``).trim();return r&&r!==`draft-workflow-preview`?r:null}function XM(e){let t=e&&e.data&&e.data.workflow_features;return!t||typeof t!=`object`||Array.isArray(t)?null:iM(t)}function ZM(e){let t=e&&e.data&&e.data.failover;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=String(t.target_model||t.targetModel||``).trim()||null;return n?{targetModel:n}:null}function QM(e,t=0){if(t>4||e==null)return``;if(typeof e==`string`){let n=e.trim();if(!n||n[0]!==`{`&&n[0]!==`[`)return``;try{return QM(JSON.parse(n),t+1)}catch{return``}}if(Array.isArray(e)){for(let n of e){let e=QM(n,t+1);if(e)return e}return``}return typeof e==`object`?String(e.code||``).trim()||(e.error===void 0?``:QM(e.error,t+1)):``}function $M(e){let t=e&&e.data&&typeof e.data==`object`&&!Array.isArray(e.data)?e.data:{};return String(t.error_code||t.errorCode||``).trim()||QM(t.response_body)}function eN(e){let t=String(e||``).trim();if(!t)return null;let n=t.indexOf(`/`);return n<=0||n>=t.length-1?null:{provider:t.slice(0,n),model:t.slice(n+1)}}function tN(e,t){let n=String(e&&(e.requested_model||e.model)||``).trim(),r=ZM(e);if(!(r&&r.targetModel))return{provider:String(e&&e.provider||``).trim()||null,model:n||null};let i=eN(n);if(i)return i;let a=uM(t&&t.scope),o=a?String(t&&t.scope&&t.scope.scope_model||``).trim():``;return a||o?{provider:a||null,model:o||n||null}:{provider:null,model:n||null}}function nN(e,t){if(!e)return null;let n=(()=>{let t=String(e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`?t:null})(),r=(()=>{if(e.status_code===void 0||e.status_code===null)return null;let t=String(e.status_code).trim();if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null})(),i=n?!0:e.cache_hit!==void 0&&e.cache_hit!==null&&!!e.cache_hit,a=ZM(e),o=tN(e,t),s=Number.isFinite(r)&&r>=200&&r<300,c=String(e.error_type||``).trim().toLowerCase()===`authentication_error`,l=String(e.auth_method||``).trim().toLowerCase()||null,u=$M(e).toLowerCase()===`budget_exceeded`;return{cacheHit:i,cacheType:n||null,failoverTarget:a&&a.targetModel?a.targetModel:null,provider:o.provider,model:o.model,statusCode:r,responseSuccess:s,aiSuccess:s&&!i,authError:c,authMethod:l,budgetExceeded:u}}function rN(e){return!!(e&&e.cacheHit)}function iN(e){return!!(e&&e.failoverTarget)}function aN(e){return!!(e&&e.budgetExceeded)}function oN(e,t){return t?`workflow-node-current`:e&&e.cacheHit?`workflow-node-success`:``}function sN(e){return e&&e.cacheHit?`workflow-conn-hit`:``}function cN(e){return!e||!e.cacheHit?null:e.cacheType===`semantic`?`Hit (Semantic)`:`Hit (Exact)`}function lN(e,t,n,r){return e?aN(t)?`workflow-node-error`:r?`workflow-node-current`:n?`workflow-node-success`:``:``}function uN(e){return aN(e)?`Exceeded`:null}function dN(e){return e&&e.cacheHit?`workflow-node-skipped`:e&&e.failoverTarget?`workflow-node-success`:``}function fN(e){return e&&e.cacheHit?`workflow-conn-dim`:e&&e.failoverTarget?`workflow-conn-hit`:``}function pN(e){return e&&e.failoverTarget?`Redirected`:null}function mN(e){return e&&e.failoverTarget?e.failoverTarget:null}function hN(e){return e&&e.cacheHit?`workflow-conn-dim`:``}function gN(e,t){return e?e.cacheHit?`workflow-node-skipped`:t?`workflow-node-current`:e.aiSuccess?`workflow-node-success`:``:``}function _N(e,t){if(!e)return``;let n=e.statusCode;return!Number.isFinite(n)&&t?`workflow-node-current`:Number.isFinite(n)?n>=500?`workflow-node-error`:n>=400?`workflow-node-warning`:n>=300?`workflow-node-neutral`:n>=200?`workflow-node-success`:``:``}function vN(e){return!e||!Number.isFinite(e.statusCode)?null:String(e.statusCode)}function yN(e,t){return e?e.authError?`workflow-node-error`:t?`workflow-node-current`:e.authMethod===`api_key`||e.authMethod===`master_key`?`workflow-node-success`:``:``}function bN(e){return!e||!e.authMethod?null:e.authMethod}function xN(e,t,n){return e?n?`workflow-node-current`:t?`workflow-node-success`:``:``}function SN(e,t){if(!e||!e._live)return!!t;let n=String(e._live_state||``).trim();return!!e._audit_flushed||n===`audit.flushed`||n===`audit.detail`}function CN(e,t){if(!e)return!!t;let n=e.usage||{},r=Number(n.entries||0)>0;if(!e._live)return r;let i=String(e._usage_live_state||``).trim();return e._usage_flushed||i===`usage.flushed`?!0:!e._usage_live_pending&&r&&!e._live_pending}function wN(e){return!!(e&&e._live&&e._usage_live_pending&&!e._usage_flushed)}function TN(e,t){return!e||!e._live||SN(e,!1)?!1:String(e._live_state||``).trim()===`audit.completed`||!!(t&&Number.isFinite(t.statusCode))}function EN(e,t,n){return!e||!e._live?``:wN(e)?`usage`:TN(e,t)?`audit`:SN(e,!1)&&!e._live_pending?``:t&&t.cacheHit?`cache`:t&&(t.provider||t.model)?`ai`:n&&n.budget&&(e.workflow_version_id||e.requested_model)?`budget`:t&&t.authMethod?``:`auth`}function DN(e,t,n,r){let i=n||{},a=i.features&&typeof i.features==`object`&&!Array.isArray(i.features)?iM(i.features):oM(e,r),o=!!i.forceAudit,s=!!i.highlightAsyncPresent,c=!!a.budget||aN(t),l=!!a.guardrails,u=!!a.usage,d=o||!!a.audit,f=!!i.forceAsync||!!(u||d),p=!!a.failover||iN(t),m=YM(e,i.entry),h=EN(i.entry,t,a),g=wN(i.entry),_=TN(i.entry,t),v=SN(i.entry,s),y=CN(i.entry,s);return{showBudget:c,budgetNodeClass:lN(c,t,s,h===`budget`),budgetStatusLabel:uN(t),showGuardrails:l,guardrailLabel:l?KM(e):``,showCache:!!i.forceCache||!!a.cache||rN(t),cacheNodeClass:oN(t,h===`cache`),cacheConnClass:sN(t),cacheStatusLabel:cN(t),showFailover:p,failoverNodeClass:p?dN(t):``,failoverConnClass:p?fN(t):``,failoverStatusLabel:p?pN(t):null,failoverTargetLabel:p?mN(t):null,aiLabel:qM(e,t),aiSublabel:JM(e,t),aiConnClass:hN(t),aiNodeClass:gN(t,h===`ai`),responseConnClass:hN(t),responseNodeClass:_N(t,h===`response`),responseNodeSublabel:vN(t),authNodeClass:yN(t,h===`auth`),authNodeSublabel:bN(t),usageNodeClass:xN(u,y,g),auditNodeClass:xN(d,v,_),showAsync:f,showUsage:u,showAudit:d,workflowID:m}}function ON(e,t){return DN(e,null,{forceCache:!1},t)}function kN(e,t,n){return DN(t,nN(e,t),{entry:e,features:XM(e)||(t?oM(t,n):{cache:!1,audit:!1,usage:!1,budget:!1,guardrails:!1,failover:!1}),forceAudit:!0,forceAsync:!0,highlightAsyncPresent:!0},n)}var AN=B(`

`),jN=B(`

`),MN=B(`
`),NN=B(`
`),PN=B(`

No guardrails configured for this workflow.

`),FN=B(`

Guardrails

`),IN=B(``),LN=B(`

`);function RN(e,t){O(t,!0);let n=q(t,`preview`,3,!1),r=A(()=>AM.featureCaps()),i=A(()=>gM(t.workflow)),a=A(()=>lM(t.workflow,R(r))),o=A(()=>ON(t.workflow,R(r))),s=A(()=>n()?`draft-workflow-preview-guardrail-`:t.workflow.id+`-guardrail-`);var c=LN();let l;var u=P(c),d=P(u),f=P(d),p=P(f,!0);D(f);var m=I(f,2),h=P(m,!0);D(m),D(d);var g=I(d,2),_=P(g),v=P(_,!0);D(_),D(g),D(u);var y=I(u,2),b=e=>{var n=AN(),r=P(n,!0);D(n),L(()=>H(r,t.workflow.description)),V(e,n)};U(y,e=>{t.workflow.description&&e(b)});var x=I(y,2),S=e=>{var n=jN(),i=P(n);D(n),L(e=>H(i,`Failover: ${e??``}`),[()=>sM(t.workflow,R(r))]),V(e,n)},C=A(()=>AM.failoverVisible());U(x,e=>{R(C)&&e(S)});var w=I(x,2);GM(w,{get chart(){return R(o)}});var T=I(w,2),E=e=>{var t=FN(),n=P(t),r=I(P(n),2),i=P(r,!0);D(r),D(n);var o=I(n,2),c=e=>{var t=NN();W(t,23,()=>R(a),(e,t)=>R(s)+t,(e,t)=>{var n=MN(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a);D(a),D(n),L(()=>{H(i,R(t).ref),H(o,`step ${R(t).step??``}`)}),V(e,n)}),D(t),V(e,t)},l=e=>{V(e,PN())};U(o,e=>{R(a).length>0?e(c):e(l,-1)}),D(t),L(()=>H(i,R(a).length?R(a).length+` steps`:`None`)),V(e,t)},ee=A(()=>ks.guardrailsVisible());U(T,e=>{R(ee)&&e(E)});var te=I(T,2),ne=e=>{var n=IN(),r=P(n),a=P(r),o=P(a,!0);D(a);var s=I(a,2);{let e=A(()=>`Edit workflow `+R(i));OT(s,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>AM.openCreate(t.workflow),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}D(r);var c=I(r,2),l=P(c),u=P(l);D(l);var d=I(l,2),f=P(d);D(d);var p=I(d,2),m=P(p);D(p),D(c),D(n),L((e,n,r,s)=>{a.disabled=e,K(a,`aria-label`,`Deactivate workflow `+R(i)),K(a,`title`,n),H(o,AM.deactivatingID===t.workflow.id?`Deactivating...`:`Deactivate`),H(u,`version: v${t.workflow.version??``}`),H(f,`created: ${r??``}`),H(m,`hash: ${s??``}`)},[()=>AM.deactivatingID===t.workflow.id||!wM(t.workflow),()=>wM(t.workflow)?`Deactivate active workflow`:`The global workflow cannot be deactivated.`,()=>vs.formatTimestamp(t.workflow.created_at),()=>TM(t.workflow.workflow_hash)]),z(`click`,a,()=>AM.deactivate(t.workflow)),V(e,n)};U(te,e=>{n()||e(ne)}),D(c),L((e,t)=>{l=G(c,1,`workflow-card svelte-1fo9fvq`,null,l,{"workflow-preview-card":n()}),H(p,e),H(h,R(i)),H(v,t)},[()=>mM(t.workflow),()=>hM(t.workflow)]),V(e,c),k()}Br([`click`]);var zN=B(`

`),BN=B(``),VN=B(``),HN=B(``),UN=B(``),WN=B(``),GN=B(``),KN=B(``),qN=B(``),JN=B(``),YN=B(``),XN=B(``),ZN=B(``),QN=B(`
No named guardrails are currently registered on this deployment. You can still draft a workflow, but guardrail-backed creation may be rejected.
`),$N=B(`
`),eP=B(`
`),tP=B(`

No guardrail steps configured yet.

`),nP=B(`

Guardrail Steps

Guardrails in the same numeric step run together. Later steps wait for earlier ones to finish.

`),rP=B(`

Leave provider name empty to target all providers and models. Select a provider name without a model to target all models for that configured provider.

Add a path to scope the workflow to that subtree. Leading slashes are optional and will be normalized; you can enter "team/alpha" or "/team/alpha". Matching checks the deepest user path first, then falls back toward the root.

If you leave the name empty, the workflow will display as the matched provider/model scope or “All models”.

Preview

Live
`,1);function iP(e,t){O(t,!0);{let t=e=>{iC(e,{copyId:`workflow-help-copy`,label:`workflow help`,text:`Create immutable version. Submitting activates it for the selected scope.`,title:e=>{var t=zN(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>AM.submitMode()===`save`?`Edit Workflow`:`Create Workflow`]),V(e,t)},$$slots:{title:!0}})},n=A(()=>AM.submitLabel()),r=A(()=>AM.submittingLabel()),i=A(()=>AM.submitMode()===`create`?po:_o);ME(e,{get open(){return AM.formOpen},ariaLabel:`Workflow editor`,get error(){return AM.formError},get submitting(){return AM.submitting},get submitLabel(){return R(n)},get submittingLabel(){return R(r)},get submitIcon(){return R(i)},dialogClass:`workflow-editor`,onclose:()=>AM.closeForm(),onsubmit:()=>AM.submitForm(),header:t,children:(e,t)=>{var n=rP(),r=F(n),i=P(r);PE(i,{id:`workflow-scope-provider`,label:`Provider Name`,children:(e,t)=>{var n=VN(),r=P(n);r.value=r.__value=``,W(I(r),16,()=>AM.providerOptions(),e=>e,(e,t)=>{var n=BN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(n),z(`change`,n,e=>AM.setProvider(e.currentTarget.value)),Ui(n,()=>AM.form.scope_provider,e=>AM.form.scope_provider=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2),o=e=>{PE(e,{id:`workflow-scope-model`,label:`Model`,children:(e,t)=>{var n=HN(),r=P(n);r.value=r.__value=``,W(I(r),17,()=>AM.modelOptions(AM.form.scope_provider),e=>AM.form.scope_provider+`-`+e,(e,t)=>{var n=BN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t)),i!==(i=R(t))&&(n.value=(n.__value=R(t))??``)}),V(e,n)}),D(n),Ui(n,()=>AM.form.scope_model,e=>AM.form.scope_model=e),V(e,n)},$$slots:{default:!0}})};U(a,e=>{AM.form.scope_provider&&e(o)});var s=I(a,2);PE(s,{id:`workflow-name`,label:`Name`,children:(e,t)=>{var n=UN();ea(n),la(n,()=>AM.form.name,e=>AM.form.name=e),V(e,n)},$$slots:{default:!0}}),PE(I(s,2),{id:`workflow-user-path`,label:`User Path`,children:(e,t)=>{var n=WN();ea(n),la(n,()=>AM.form.scope_user_path,e=>AM.form.scope_user_path=e),V(e,n)},$$slots:{default:!0}}),D(r);var c=I(r,8);PE(c,{id:`workflow-description`,label:`Description`,children:(e,t)=>{var n=GN();ut(n),la(n,()=>AM.form.description,e=>AM.form.description=e),V(e,n)},$$slots:{default:!0}});var l=I(c,2),u=P(l),d=e=>{var t=KN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.cache,e=>AM.form.features.cache=e),V(e,t)},f=A(()=>ks.cacheVisible());U(u,e=>{R(f)&&e(d)});var p=I(u,2),m=e=>{var t=qN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.audit,e=>AM.form.features.audit=e),V(e,t)},h=A(()=>ks.auditVisible());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=e=>{var t=JN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.usage,e=>AM.form.features.usage=e),V(e,t)},v=A(()=>ks.usageVisible());U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=YN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.budget,e=>AM.form.features.budget=e),V(e,t)},x=A(()=>ks.budgetsVisible());U(y,e=>{R(x)&&e(b)});var S=I(y,2),C=e=>{var t=XN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.guardrails,e=>AM.form.features.guardrails=e),V(e,t)},w=A(()=>ks.guardrailsVisible());U(S,e=>{R(w)&&e(C)});var T=I(S,2),E=e=>{var t=ZN(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>AM.form.features.failover,e=>AM.form.features.failover=e),V(e,t)},ee=A(()=>AM.failoverVisible());U(T,e=>{R(ee)&&e(E)}),D(l);var te=I(l,2),ne=I(P(te),2);{let e=A(()=>AM.preview());RN(ne,{get workflow(){return R(e)},preview:!0})}D(te);var re=I(te,2),ie=e=>{var t=nP(),n=P(t),r=I(P(n),2);D(n);var i=I(n,2),a=e=>{var t=QN(),n=I(P(t),2);D(t),z(`click`,n,()=>Yo.navigate(`guardrails`)),V(e,t)};U(i,e=>{AM.guardrailRefs.length===0&&e(a)});var o=I(i,2),s=e=>{var t=eP();W(t,21,()=>AM.form.guardrails,ii,(e,t,n)=>{var r=$N(),i=P(r),a=P(i);K(a,`for`,`workflow-guardrail-ref-`+n);var o=I(a,2);ea(o),K(o,`id`,`workflow-guardrail-ref-`+n),K(o,`aria-label`,`Guardrail reference `+(n+1)),D(i);var s=I(i,2),c=P(s);K(c,`for`,`workflow-guardrail-step-`+n);var l=I(c,2);ea(l),K(l,`id`,`workflow-guardrail-step-`+n),K(l,`aria-label`,`Guardrail step `+(n+1)),D(s);var u=I(s,2);D(r),la(o,()=>R(t).ref,e=>R(t).ref=e),la(l,()=>R(t).step,e=>R(t).step=e),z(`click`,u,()=>AM.removeGuardrailStep(n)),V(e,r)}),D(t),V(e,t)},c=e=>{V(e,tP())};U(o,e=>{AM.form.guardrails.length>0?e(s):e(c,-1)}),D(t),z(`click`,r,()=>AM.addGuardrailStep()),V(e,t)},ae=A(()=>AM.form.features.guardrails&&ks.guardrailsVisible());U(re,e=>{R(ae)&&e(ie)}),V(e,n)},$$slots:{header:!0,default:!0}})}k()}Br([`change`,`click`]);var aP=B(`

Loading workflows...

`),oP=B(`
`),sP=B(`

No active workflows found.

`),cP=B(`

No workflows match your filter.

`),lP=B(`
`);function uP(e,t){O(t,!0);var n=lP(),r=P(n),i=e=>{var t=aP();NS(P(t),{size:16,label:`Loading workflows`}),Ve(),D(t),V(e,t)};U(r,e=>{AM.loading&&!Y.authError&&e(i)});var a=I(r,2),o=e=>{var t=oP();W(t,21,()=>AM.filteredWorkflows,e=>e.id,(e,t)=>{RN(e,{get workflow(){return R(t)}})}),D(t),V(e,t)};U(a,e=>{AM.filteredWorkflows.length>0&&e(o)});var s=I(a,2),c=e=>{V(e,sP())};U(s,e=>{AM.workflows.length===0&&!AM.loading&&!Y.authError&&AM.available&&e(c)});var l=I(s,2),u=e=>{V(e,cP())};U(l,e=>{AM.workflows.length>0&&AM.filteredWorkflows.length===0&&!AM.loading&&e(u)}),D(n),V(e,n),k()}var dP=B(``),fP=B(`
Workflows feature is unavailable.
`),pP=B(`
`),mP=B(`
`),hP=B(``),gP=B(`
`);function _P(e,t){O(t,!0),On(()=>{Y.refreshTick,AM.fetchPage()});var n=gP(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=dP();J(P(t),{get icon(){return po},class:`form-action-icon`,"aria-hidden":`true`}),Ve(2),D(t),z(`click`,t,()=>AM.openCreate()),V(e,t)};U(a,e=>{AM.available&&e(o)}),D(i),D(r);var s=I(r,2),c=e=>{V(e,fP())};U(s,e=>{!AM.available&&!Y.authError&&e(c)});var l=I(s,2),u=e=>{var t=pP(),n=P(t,!0);D(t),L(()=>H(n,AM.error)),V(e,t)};U(l,e=>{AM.error&&!Y.authError&&e(u)});var d=I(l,2),f=e=>{var t=mP(),n=P(t);jw(P(n),{placeholder:`Filter by scope, name, hash, or guardrail...`,label:`Filter workflows by scope, name, hash, or guardrail`,get value(){return AM.filter},set value(e){AM.filter=e}}),D(n);var r=I(n,2),i=P(r),a=P(i,!0);D(i),D(r),D(t),L(()=>H(a,AM.filteredWorkflows.length+` active scopes`)),V(e,t)};U(d,e=>{AM.available&&e(f)});var p=I(d,2);iP(p,{});var m=I(p,2);uP(m,{});var h=I(m,2);W(h,20,()=>AM.guardrailRefs,e=>e,(e,t)=>{var n=hP(),r={};L(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(h),D(n),V(e,n),k()}Br([`click`]);function vP(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=oc}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=yP(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function yP(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var bP=null;function xP(){return bP===null&&(bP=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`)),!!(bP&&bP.matches)}function SP(e){return xP()?0:e}function CP(e,t){return!t||!t.live?{duration:0}:ic(e,{duration:SP(150)})}var wP=new class{#e=j(N({}));get workflowVersionsByID(){return R(this.#e)}set workflowVersionsByID(e){M(this.#e,e,!0)}workflowVersionRequests={};workflowFeatureCaps(){return{cache:ks.cacheVisible(),audit:ks.auditVisible(),usage:ks.usageVisible(),budget:ks.budgetsVisible(),guardrails:ks.guardrailsVisible(),failover:ks.booleanFlag(`FAILOVER_ENABLED`,!0)}}cacheWorkflowVersion(e){let t=String(e&&e.id||``).trim();return t?(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:e},e):null}cacheMissingWorkflowVersion(e){let t=String(e||``).trim();t&&(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:null})}workflowVersionCacheHas(e){return Object.prototype.hasOwnProperty.call(this.workflowVersionsByID||{},String(e||``).trim())}workflowVersionByID(e){let t=String(e||``).trim();return t&&this.workflowVersionCacheHas(t)?this.workflowVersionsByID[t]:null}async fetchWorkflowVersion(e){let t=String(e||``).trim();if(!t)return null;if(this.workflowVersionCacheHas(t))return this.workflowVersionsByID[t];if(this.workflowVersionRequests[t])return this.workflowVersionRequests[t];let n=(async()=>{let e=typeof AbortController==`function`?new AbortController:null,n=e?setTimeout(()=>e.abort(),1e4):null;try{let n=await ws(`/admin/workflows/`+encodeURIComponent(t),{label:`workflow`,signal:e?e.signal:void 0});if(n.stale)return null;if(n.status===404)return this.cacheMissingWorkflowVersion(t),null;if(!n.ok)return null;let r=n.data;return!r||typeof r!=`object`||Array.isArray(r)?(this.cacheMissingWorkflowVersion(t),null):this.cacheWorkflowVersion(r)}catch(e){return e&&e.name===`AbortError`||console.error(`Failed to fetch workflow version:`,e),null}finally{n!==null&&clearTimeout(n),delete this.workflowVersionRequests[t]}})();return this.workflowVersionRequests[t]=n,n}async prefetchAuditWorkflows(e){let t=[...new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.workflow_version_id||``).trim()).filter(Boolean))];t.length!==0&&await Promise.all(t.map(e=>this.fetchWorkflowVersion(e)))}auditEntryWorkflow(e){let t=String(e&&e.workflow_version_id||``).trim();return t?this.workflowVersionByID(t):null}},TP=6;function EP(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function DP(e,t=0,n=null){let r=String(e||``).trim();if(!r)return``;if(t>TP)return r;let i=EP(r);return i==null?r:OP(i,t+1,n)||n&&n(i)||r}function OP(e,t=0,n=null,r=null){if(e==null||t>TP)return``;if(typeof e==`string`){let i=EP(e.trim());return i==null?``:OP(i,t+1,n,r)}if(typeof e!=`object`)return``;let i=r||new Set;if(i.has(e))return``;if(i.add(e),Array.isArray(e)){for(let r=0;r=400||jP(t&&t.response_body)}function NP(e){let t=e&&e.data?e.data:null;return t?kP(t.error_message)||(MP(e,t)?OP(t.response_body,0):``):``}function PP(e){if(e==null||String(e).trim()===``)return null;let t=Number(e);return!Number.isInteger(t)||t<0?null:t}function FP(e){let t=PP(e);return t===null?``:t===0?`Audit logs are retained indefinitely.`:t===1?`Audit logs are retained for 1 day.`:`Audit logs are retained for `+t+` days.`}function IP(e){let t=PP(e);return t===null?``:t===0?`Audit logs are retained `:`Audit logs are retained for `}function LP(e){let t=PP(e);return t===null?``:t===0?`indefinitely`:t===1?`1 day`:t+` days`}function RP({dateQuery:e,limit:t,offset:n,search:r,method:i,statusCode:a,stream:o}){let s=e;return s+=`&limit=`+t+`&offset=`+n,r&&(s+=`&search=`+encodeURIComponent(r)),i&&(s+=`&method=`+encodeURIComponent(i)),a&&(s+=`&status_code=`+encodeURIComponent(a)),o&&(s+=`&stream=`+encodeURIComponent(o)),s}function zP({sessionId:e,limit:t}){return`session_id=`+encodeURIComponent(e)+`&limit=`+(t||100)+`&offset=0`}function BP(e){return String(e&&e.session_id||``).trim()}function VP(e){let t=Number(e&&e.session_count);return Number.isFinite(t)&&t>1?t:1}function HP(e){return!!BP(e)&&VP(e)>1}function UP(e){return{entries:(Array.isArray(e&&e.sessions)?e.sessions:[]).filter(e=>e&&e.latest).map(e=>({...e.latest,session_id:BP(e.latest)||String(e.session_id||``).trim(),session_count:Number(e.count||1)})),total:Number(e&&e.total||0),limit:Number(e&&e.limit||25),offset:Number(e&&e.offset||0)}}function WP(e,t,n){let r=new Set((Array.isArray(n)?n:[]).flatMap(e=>JP(e))),i=(Array.isArray(t)?t:[]).filter(e=>!JP(e).some(e=>r.has(e))),a=new Set([...r,...i.flatMap(e=>JP(e))]),o=(e&&Array.isArray(e.entries)?e.entries:[]).filter(e=>e&&e._live&&!JP(e).some(e=>a.has(e)));return{entries:[...o,...i],preservedCount:o.length}}function GP(e,t){let n=e||{};if(!t)return n;if(n[t]){let e={...n};return delete e[t],e}return{...n,[t]:!0}}function KP(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>BP(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=n[e];return}a=!0}),a?i:n}function qP(e){return String(e&&e.id||``).trim()}function JP(e){if(!e)return[];let t=[],n=String(e.id||``).trim(),r=String(e.request_id||``).trim();return n&&t.push(`id:`+n),r&&t.push(`request:`+r),t}function YP(e){return!!(e&&e._live&&e._live_pending&&!e._audit_flushed)}function XP(e){let t=e&&e.customStartDate,n=e&&e.customEndDate;if(!t&&!n)return!0;let r=new Date;if(t){let e=new Date(t);if(e.setHours(0,0,0,0),Number.isFinite(e.getTime())&&re)return!1}return!0}function ZP(e,t){return e&&Number(e.offset||0)===0&&!(t&&t.search)&&!(t&&t.method)&&!(t&&t.statusCode)&&!(t&&t.stream)&&XP(t)}function QP(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!ZP(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>YP(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>JP(e))),s=[];return a.forEach(e=>{let t=JP(e);t.length!==0&&(t.some(e=>o.has(e))||(t.forEach(e=>o.add(e)),s.push(e)))}),s.length===0?r:(r.entries=[...s,...i].slice(0,r.limit||25),r.total=Number(r.total||0)+s.length,r)}function $P(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!ZP(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>YP(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>JP(e))),s=new Map;i.forEach((e,t)=>{let n=BP(e);n&&!s.has(n)&&s.set(n,t)});let c=[],l=i;return a.forEach(e=>{let t=JP(e);if(t.length===0||t.some(e=>o.has(e)))return;let n=BP(e);if(n&&s.has(n)){let r=s.get(n);l===i&&(l=[...i]),l[r]={...e,session_count:Math.max(VP(l[r]),VP(e))},t.forEach(e=>o.add(e));return}t.forEach(e=>o.add(e)),c.push(e)}),r.entries=[...c,...l].slice(0,r.limit||25),r.total=Number(r.total||0)+c.length,r}function eF(e,t){let n=qP(t),r=e||{};return n?r[n]?{}:{[n]:!0}:r}function tF(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>qP(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=!0;return}a=!0}),a?i:n}function nF(e){if(e==null)return`-`;let t=Number(e);return Number.isFinite(t)?t<=0?`pending`:t<1e6?Math.round(t/1e3)+` µs`:t<1e9?(t/1e6).toFixed(2)+` ms`:(t/1e9).toFixed(2)+` s`:`-`}function rF(e){if(e==null||e===``)return`status-unknown`;let t=Number(e);return Number.isFinite(t)?t>=500?`status-error`:t>=400?`status-warning`:t>=300?`status-neutral`:`status-success`:`status-unknown`}function iF(e){if(!e||!e._live||!e._live_pending)return!1;let t=String(e._live_state||``).trim();if(t===`audit.completed`||t===`audit.flushed`||t===`audit.detail`)return!1;if(e._response_partial)return!0;if(e.status_code!==null&&e.status_code!==void 0&&e.status_code!==``||Number(e.duration_ns||0)>0||e.error_type||e.error_message)return!1;let n=e.data||{};return!(n.response_headers||n.response_body||n.error_message)}function aF(e){let t=e&&e.data&&e.data.failover;return!t||typeof t!=`object`||Array.isArray(t)?null:String(t.target_model||t.targetModel||``).trim()||null}function oF(e){return(e&&e.data&&Array.isArray(e.data.attempts)?e.data.attempts:[]).map((e,t)=>({...e,seq:Number(e&&e.seq||t+1)})).sort((e,t)=>e.seq-t.seq)}function sF(e){let t=oF(e);return t.length>1||t.some(e=>!(e&&e.success))}function cF(e){if(!e)return`-`;let t=e.status_code||e.status;return t?String(t):e.success?`ok`:`error`}function lF(e){return String(e&&e.kind||``).trim()||`attempt`}function uF(e){if(!e)return`-`;let t=String(e.provider_name||``).trim(),n=String(e.provider_type||e.provider||``).trim();return t&&n&&t!==n?t+` (`+n+`)`:t||n||`-`}function dF(e){return String(e&&e.model||``).trim()||`-`}function fF(e){let t=oF(e);return t.length>1||t.some(e=>!(e&&e.success))?t:[]}function pF(e){return oF(e).length+`×`}function mF(e){let t=oF(e),n=t.filter(e=>!(e&&e.success)).length,r=t.length===1?`attempt`:`attempts`,i=t.length+` provider `+r;return n>0?i+` · `+n+` failed`:i}function hF(e){if(!e)return``;let t=[`#`+Number(e.seq||0)],n=lF(e);n&&n!==`attempt`&&t.push(n),t.push(cF(e));let r=uF(e);r&&r!==`-`&&t.push(r);let i=dF(e);return i&&i!==`-`&&t.push(i),t.push(e.success?`succeeded`:`failed`),t.join(` · `)}function gF(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t&&t.response_body!=null?t.response_body:null}return t.response_body!=null&&t.response_body!==``?t.response_body:null}function _F(e){if(!e||e.success)return``;let t=String(e.error_message||``).trim(),n=String(e.error_code||``).trim(),r=String(e.error_type||``).trim();return t&&n?n+`: `+t:t||n||r||`Provider attempt failed`}function vF(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t?t.response_headers:null}return t.response_headers||null}function yF(e){let t=Number(e&&e.status_code);return Number.isFinite(t)&&t>0?t:null}function bF(e,t){let n=!!(t&&t.success),r=e&&e.data?e.data:null,i=gF(e,t),a=vF(e,t),o=_F(t),s=i!=null&&i!==``,c=lF(t),l=oF(e).length<=1;return{title:`Response`,direction:`response`,seq:l?0:Number(t&&t.seq||0),kind:l||c===`attempt`?``:c,statusCode:l?null:yF(t),layout:`split`,entry:e,copyHeaders:a,copyBody:i,showErrorMessage:!!o,errorMessage:o,showHeaders:!!a,headers:a,showBody:s,body:i,showEmpty:!o&&!s&&!a,emptyMessage:`No response was captured for this attempt.`,showTooLarge:!!(n&&r&&r.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function xF(e){return e&&e.data&&Array.isArray(e.data.request_revisions)?e.data.request_revisions:[]}function SF(e){return xF(e).filter(e=>!(e&&e.no_change))}function CF(e){return xF(e).filter(e=>e&&e.no_change).map(e=>{let t=String(e.rewriter||`rewriter`);return{id:`step-`+Number(e.seq||0),rewriter:t,label:t+`: no change`,title:t+` ran and forwarded the request unchanged`}})}function wF(e){let t=Number(e&&e.bytes_before),n=Number(e&&e.bytes_after);if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n>=t)return``;let r=(1-n/t)*100;return`-`+(r>=10?String(Math.round(r)):r.toFixed(1))+`%`}function TF(e,t){let n=t&&t.body,r=n!=null&&n!==``,i=SF(e).length<=1,a={rewriter:t&&t.rewriter||``,bytes:Number(t&&t.bytes_before||0)+` → `+Number(t&&t.bytes_after||0)};return t&&t.detail!=null&&(a.detail=t.detail),{title:`Rewritten`,direction:`request`,seq:i?0:Number(t&&t.seq||0),kind:t&&t.rewriter?String(t.rewriter):``,savingsLabel:wF(t),layout:`split`,entry:e,copyHeaders:a,copyBody:n,showErrorMessage:!1,errorMessage:null,showHeaders:!0,headers:a,headersTitle:`What changed`,showBody:r,body:n,showEmpty:!1,emptyMessage:``,showTooLarge:!r,tooLargeMessage:`Rewritten body not captured (body logging disabled or body too large).`}}function EF(e){let t=e&&e.usage;return!t||typeof t!=`object`?null:t}function DF(e){let t=EF(e);return Number(t&&t.cached_input_tokens||0)>0}function OF(e){let t=EF(e),n=Number(t&&t.input_tokens||0),r=Number(t&&t.cached_input_tokens||0);return!Number.isFinite(n)||n<=0||!Number.isFinite(r)||r<=0?0:Math.max(0,Math.min(100,r/n*100))}function kF(e){let t=EF(e);if(!t)return``;let n=Number(t.input_tokens||0),r=Number(t.cached_input_tokens||0);return n<=0?_c(r)+` cached`:OF(e).toFixed(1)+`% cached`}function AF(e){return DF(e)?kF(e):``}function jF(e,t){let n=EF(e);if(!n||!e||!e.data||!e.data.request_body)return null;let r=Number(n.estimated_cached_characters||0);if(!Number.isFinite(r)||r<=0||typeof t!=`function`)return null;let i=t(e.data.request_body);return!Array.isArray(i)||i.length===0?null:{characters:r,segments:i}}function MF(e,t){let n=e&&e.data?e.data:null,r=!n||!n.request_headers&&!n.request_body,i=r&&iF(e);return{title:`Request`,direction:`request`,layout:`split`,entry:e,copyHeaders:n&&n.request_headers,copyBody:n&&n.request_body,showErrorMessage:!1,errorMessage:null,showHeaders:!!(n&&n.request_headers),headers:n&&n.request_headers,showBody:!!(n&&n.request_body),body:n&&n.request_body,bodyCacheRatioLabel:AF(e),promptCacheHighlight:jF(e,t),noChangeSteps:CF(e),showEmpty:r&&!i,emptyMessage:`Request details were not captured.`,showPending:i,pendingMessage:`Waiting for request data…`,showTooLarge:!!(n&&n.request_body_too_big_to_handle),tooLargeMessage:`Request body was too large to capture.`}}function NF(e){let t=e&&e.data?e.data:null,n=NP(e),r=!t||!n&&!t.response_headers&&!t.response_body,i=r&&iF(e);return{title:`Response`,direction:`response`,layout:`split`,entry:e,copyHeaders:t&&t.response_headers,copyBody:t&&t.response_body,showErrorMessage:!!n,errorMessage:n,showHeaders:!!(t&&t.response_headers),headers:t&&t.response_headers,showBody:!!(t&&t.response_body),body:t&&t.response_body,streaming:!!(e&&e._response_partial&&t&&t.response_body)&&iF(e),showEmpty:r&&!i,emptyMessage:`Response details were not captured.`,showPending:i,pendingMessage:`Response in progress…`,showTooLarge:!!(t&&t.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function PF(e,t){let n=[{id:`request`,pane:MF(e,t)}];return SF(e).forEach(t=>{n.push({id:`revision-`+Number(t&&t.seq||0),pane:TF(e,t)})}),sF(e)?oF(e).forEach(t=>{n.push({id:`response-`+Number(t&&t.seq||0),pane:bF(e,t)})}):n.push({id:`response`,pane:NF(e)}),n}function FF(e){if(!sF(e))return`response`;let t=oF(e),n=null;return t.forEach(e=>{e&&e.success&&(n=e)}),n||=t[t.length-1],n?`response-`+Number(n.seq||0):`request`}function IF(e,t,n){return e&&(Array.isArray(n)?n:PF(t)).some(t=>t.id===e)?e:FF(t)}function LF(e,t,n){if(!t||!t.length)return null;let r=t.indexOf(n);r<0&&(r=0);let i;switch(e){case`ArrowRight`:case`ArrowDown`:i=(r+1)%t.length;break;case`ArrowLeft`:case`ArrowUp`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return null}return t[i]}var RF=100;function zF(){return{entries:[],total:0,limit:25,offset:0}}var BF=new class{#e=j(N({}));get auditExpandedEntries(){return R(this.#e)}set auditExpandedEntries(e){M(this.#e,e,!0)}#t=j(N({}));get auditExpandedThreads(){return R(this.#t)}set auditExpandedThreads(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}auditFetchToken=0;get auditLog(){return UC.auditLog}set auditLog(e){UC.auditLog=e}get auditSearch(){return UC.auditSearch}set auditSearch(e){UC.auditSearch=e}get auditMethod(){return UC.auditMethod}set auditMethod(e){UC.auditMethod=e}get auditStatusCode(){return UC.auditStatusCode}set auditStatusCode(e){UC.auditStatusCode=e}get auditStream(){return UC.auditStream}set auditStream(e){UC.auditStream=e}get auditGroupSessions(){return UC.auditGroupSessions}liveFilters(){return{search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream,customStartDate:Uc.customStartDate,customEndDate:Uc.customEndDate}}toggleAuditGroupSessions(){UC.auditGroupSessions=!UC.auditGroupSessions,Ca(`gomodel_audit_group_sessions`,UC.auditGroupSessions),this.auditExpandedThreads={},UC.auditThreadChildren={},this.fetchAuditLog(!0)}async fetchAuditLog(e){let t=++this.auditFetchToken;this.loading=!0;try{e&&(this.auditLog.offset=0);let n=this.auditGroupSessions,r=RP({dateQuery:Uc.queryStr(),limit:this.auditLog.limit,offset:this.auditLog.offset,search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream}),i=await ws((n?`/admin/audit/sessions?`:`/admin/audit/log?`)+r,{label:`audit log`});if(i.stale||t!==this.auditFetchToken)return;if(!i.ok){this.auditLog=zF();return}let a=n?UP(i.data):i.data,o=(n?$P:QP)(a,this.auditLog&&this.auditLog.entries,this.liveFilters());Array.isArray(o.entries)||(o.entries=[]),o.entries=UC.upsertAuditRecords(o.entries,`audit.list`),this.auditLog=o,this.auditExpandedThreads=KP(this.auditExpandedThreads,o.entries),UC.auditThreadChildren=KP(UC.auditThreadChildren,o.entries);let s=[...o.entries,...this.loadedThreadChildren()];this.auditExpandedEntries=tF(this.auditExpandedEntries,s);try{await wP.prefetchAuditWorkflows(s)}catch(e){console.error(`Failed to prefetch audit workflows:`,e)}}catch(e){if(console.error(`Failed to fetch audit log:`,e),t!==this.auditFetchToken)return;this.auditLog=zF()}finally{t===this.auditFetchToken&&(this.loading=!1)}}loadedThreadChildren(){let e=UC.auditThreadChildren||{};return Object.keys(e).flatMap(t=>Array.isArray(e[t]&&e[t].entries)?e[t].entries:[])}isThreadExpanded(e){return!!(e&&this.auditExpandedThreads[e])}threadChildren(e){return e&&UC.auditThreadChildren[e]||null}async toggleThread(e){let t=BP(e);if(!t)return;let n=!this.isThreadExpanded(t);this.auditExpandedThreads=GP(this.auditExpandedThreads,t);let r=UC.auditThreadChildren[t];n&&!(r&&(r.loaded||r.loading))&&await this.fetchThreadEntries(e)}async fetchThreadEntries(e){let t=BP(e);if(!t)return;let n=UC.auditThreadChildren[t];UC.auditThreadChildren={...UC.auditThreadChildren,[t]:{loading:!0,loaded:!1,entries:n&&Array.isArray(n.entries)?n.entries:[],total:Number(n&&n.total||0)}};let r=()=>{let e={...UC.auditThreadChildren},n=e[t],r=n&&Array.isArray(n.entries)?n.entries:[];r.length>0?e[t]={loading:!1,loaded:!1,entries:r,total:r.length}:(delete e[t],this.auditExpandedThreads[t]&&(this.auditExpandedThreads=GP(this.auditExpandedThreads,t))),UC.auditThreadChildren=e};try{let n=await ws(`/admin/audit/log?`+zP({sessionId:t,limit:RF}),{label:`audit session`});if(n.stale){r();return}if(!n.ok)throw Error(`audit session fetch failed`);let i=UC.auditThreadChildren[t],a=this.auditLog.entries.find(e=>BP(e)===t),o=WP(i,n.data.entries,a?[a]:[e]);o.entries=UC.upsertAuditRecords(o.entries,`audit.thread`),UC.auditThreadChildren={...UC.auditThreadChildren,[t]:{loading:!1,loaded:!0,entries:o.entries,total:Number(n.data.total||0)+o.preservedCount}}}catch(e){console.error(`Failed to fetch audit session entries:`,e),r()}}clearAuditFilters(){this.auditSearch=``,this.auditMethod=``,this.auditStatusCode=``,this.auditStream=``,this.fetchAuditLog(!0)}auditLogNextPage(){this.auditLog.offset+this.auditLog.limit0&&(this.auditLog.offset=Math.max(0,this.auditLog.offset-this.auditLog.limit),this.fetchAuditLog(!1))}isAuditEntryExpanded(e){let t=qP(e);return t?!!(this.auditExpandedEntries&&this.auditExpandedEntries[t]):!1}toggleAuditEntryExpanded(e){this.auditExpandedEntries=eF(this.auditExpandedEntries,e);let t=this.isAuditEntryExpanded(e);return t&&typeof UC.fetchAuditEntryDetail==`function`&&UC.fetchAuditEntryDetail(e),t}expandAuditEntry(e){this.isAuditEntryExpanded(e)||this.toggleAuditEntryExpanded(e)}};UC.fetchAuditLog=e=>BF.fetchAuditLog(e),UC.isAuditEntryExpanded=e=>BF.isAuditEntryExpanded(e);var VF=B(`
`);function HF(e,t){O(t,!0);let n=Mw(()=>BF.fetchAuditLog(!0));On(()=>n.cancel);var r=VF(),i=P(r);jw(P(i),{id:`audit-filter-search`,placeholder:`Search by request ID, model, provider, path, user path, or error...`,label:`Search by request ID, model, provider, path, user path, or error`,get oninput(){return n},get value(){return BF.auditSearch},set value(e){BF.auditSearch=e}}),D(i);var a=I(i,2),o=P(a),s=P(o);s.value=s.__value=``;var c=I(s);c.value=c.__value=`GET`;var l=I(c);l.value=l.__value=`POST`;var u=I(l);u.value=u.__value=`PUT`;var d=I(u);d.value=d.__value=`PATCH`;var f=I(d);f.value=f.__value=`DELETE`,D(o);var p=I(o,2),m=P(p);m.value=m.__value=``;var h=I(m);h.value=h.__value=`200`;var g=I(h);g.value=g.__value=`201`;var _=I(g);_.value=_.__value=`400`;var v=I(_);v.value=v.__value=`401`;var y=I(v);y.value=y.__value=`403`;var b=I(y);b.value=b.__value=`404`;var x=I(b);x.value=x.__value=`429`;var S=I(x);S.value=S.__value=`500`;var C=I(S);C.value=C.__value=`502`;var w=I(C);w.value=w.__value=`503`;var T=I(w);T.value=T.__value=`504`,D(p);var E=I(p,2),ee=P(E);ee.value=ee.__value=``;var te=I(ee);te.value=te.__value=`true`;var ne=I(te);ne.value=ne.__value=`false`,D(E);var re=I(E,2);J(P(re),{get icon(){return Lo},class:`table-icon-svg`}),Ve(2),D(re),D(a),D(r),z(`change`,o,()=>BF.fetchAuditLog(!0)),Ui(o,()=>BF.auditMethod,e=>BF.auditMethod=e),z(`change`,p,()=>BF.fetchAuditLog(!0)),Ui(p,()=>BF.auditStatusCode,e=>BF.auditStatusCode=e),z(`change`,E,()=>BF.fetchAuditLog(!0)),Ui(E,()=>BF.auditStream,e=>BF.auditStream=e),z(`click`,re,()=>BF.clearAuditFilters()),V(e,r),k()}Br([`change`,`click`]);var UF=B(`Live stream connecting…`),WF=B(` `),GF=B(`Live`),KF=B(` `);function qF(e,t){O(t,!0);let n=A(()=>UC.auditLivePauseReason()),r=A(()=>UC.liveLogsStreaming&&!R(n));var i=Xr(),a=F(i),o=e=>{var t=KF(),i=P(t);let a;var o=I(i,2),s=e=>{V(e,UF())},c=e=>{var t=WF(),r=P(t,!0);D(t),L(e=>H(r,e),[()=>jC(R(n))]),V(e,t)},l=e=>{V(e,GF())};U(o,e=>{UC.liveLogsStreaming?R(n)?e(c,1):e(l,-1):e(s)}),D(t),L(()=>a=G(i,1,`live-dot svelte-tve6yv`,null,a,{"is-streaming":R(r)})),V(e,t)},s=A(()=>ks.liveLogsVisible());U(a,e=>{R(s)&&e(o)}),V(e,i),k()}var JF=B(` `),YF=B(``);function XF(e,t){O(t,!0);let n=A(()=>[{key:`provider`,text:Dc(t.entry)||`-`},{key:`model`,text:t.entry.requested_model||t.entry.model||`-`,mono:!0},{key:`user_path`,text:t.entry.user_path,mono:!0},{key:`request_id`,text:`request_id: `+(t.entry.request_id||`-`),mono:!0},{key:`ip`,text:t.entry.client_ip&&`ip: `+t.entry.client_ip,mono:!0},{key:`auth_key_id`,text:t.entry.auth_key_id&&`auth_key_id: `+t.entry.auth_key_id,mono:!0},{key:`alias`,text:t.entry.alias_used&&`alias`,class:`audit-alias-badge`},{key:`resolved`,text:t.entry.alias_used&&t.entry.resolved_model&&`resolved: `+Ac(t.entry),mono:!0},{key:`failover`,text:aF(t.entry)&&`failover: `+aF(t.entry),mono:!0},{key:`stream`,text:t.entry.stream&&`stream`},{key:`error_type`,text:t.entry.error_type}].filter(e=>!!e.text));var r=YF(),i=I(P(r),2);W(i,21,()=>R(n),e=>e.key,(e,t)=>{var n=JF(),r=P(n,!0);D(n),L(()=>{G(n,1,Ni([`provider-badge`,R(t).class,{mono:R(t).mono}]),`svelte-hyopt0`),H(r,R(t).text)}),V(e,n)}),D(i),D(r),V(e,r),k()}var ZF=B(``),QF=B(` `);function $F(e,t){O(t,!0);let n=A(()=>fF(t.entry)),r=A(()=>R(n).length>0?mF(t.entry):``),i=A(()=>R(n).length>0?pF(t.entry):``);var a=Xr(),o=F(a),s=e=>{var a=QF(),o=P(a);W(o,21,()=>R(n),e=>t.entry.id+`-pip-`+e.seq,(e,t)=>{var n=ZF();let r;L(e=>{r=G(n,1,`audit-attempt-pip svelte-1eu22xn`,null,r,{"audit-attempt-success":!!(R(t)&&R(t).success),"audit-attempt-error":!(R(t)&&R(t).success)}),K(n,`title`,e)},[()=>hF(R(t))]),V(e,n)}),D(o);var s=I(o,2),c=P(s,!0);D(s),D(a),L(()=>{K(a,`title`,R(r)),K(a,`aria-label`,R(r)),H(c,R(i))}),V(e,a)};U(o,e=>{R(n).length>0&&e(s)}),V(e,a),k()}var eI=new Set([`instructions`,`messages`,`input`,`previous_response_id`,`choices`,`output`]);function tI(e){if(!e||typeof e!=`object`)return``;let t=String(e.type||``).toLowerCase();if(t===`image`||t===`image_url`||t===`input_image`||t===`output_image`)return`[Image]`;if(t===`audio`||t===`input_audio`||t===`output_audio`)return`[Audio]`;if(t===`file`||t===`input_file`||t===`output_file`){let t=String(e.filename||e.name||``).trim();return t?`[File: `+t+`]`:`[File]`}return typeof e.refusal==`string`?e.refusal:``}function nI(e){if(e==null)return``;if(typeof e==`string`)return e.trim();if(Array.isArray(e))return e.map(e=>typeof e==`string`?e:!e||typeof e!=`object`?``:typeof e.text==`string`?e.text:typeof e.output_text==`string`?e.output_text:tI(e)).filter(Boolean).join(` +`).trim();if(typeof e==`object`){if(typeof e.text==`string`)return e.text.trim();try{return JSON.stringify(e,null,2)}catch{return``}}return String(e).trim()}function rI(e){return!e||typeof e!=`object`?``:nI(e.content)||(typeof e.refusal==`string`?e.refusal.trim():``)}function iI(e){if(e==null)return[];if(typeof e==`string`)return e?[e]:[];if(Array.isArray(e))return e.flatMap(e=>typeof e==`string`?e?[e]:[]:!e||typeof e!=`object`?[]:typeof e.text==`string`?e.text?[e.text]:[]:typeof e.output_text==`string`&&e.output_text?[e.output_text]:[]);if(typeof e==`object`)return typeof e.text==`string`&&e.text?[e.text]:[];let t=String(e);return t?[t]:[]}function aI(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(aI);if(typeof e==`object`)return Object.entries(e).flatMap(([e,t])=>[e,...aI(t)]);let t=String(e);return t?[t]:[]}function oI(e){return nL(e).flatMap(e=>[...e.name?[String(e.name)]:[],...aI(e.arguments)])}function sI(e){return Array.isArray(e)?e.flatMap(e=>e&&typeof e==`object`&&e.type===`tool_use`?oI([e]):iI(e)):iI(e)}function cI(e){let t=e&&e.usage?e.usage.estimated_cached_characters:null;if(t==null)return null;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):0}function lI(e,t){if(!e)return null;let n=(Array.isArray(t)?t:[]).reduce((e,t)=>e+String(t||``).length,0),r=Math.min(String(e).length,n);return r>0?{total:r}:null}function uI(e){let t=e&&e.arguments!==void 0?e.arguments:``,n=``;if(typeof t==`string`)n=t;else try{n=JSON.stringify(t)}catch{n=String(t)}return(String(e&&e.name||``)+`(`+n+`)`).length}function dI(e){return{characters:(Array.isArray(e)?e:[]).map(uI)}}function fI(e,t){let n=Math.max(0,Number(t||0));return e.map(e=>{if(!e||e.role===`error`)return e;let t=Math.max(0,Number(e._promptTextCharacters||0)),r=Math.min(n,t);n-=r;let i=0;(Array.isArray(e._toolPromptCharacters)?e._toolPromptCharacters:[]).forEach(e=>{let t=Math.max(0,Number(e||0)),r=Math.min(n,t);n-=r,i+=r});let a=t+(e._toolPromptCharacters||[]).reduce((e,t)=>e+Math.max(0,Number(t||0)),0);return{...e,promptCacheRatio:a>0?(r+i)/a:0}})}function pI(e){if(e==null)return[];if(typeof e==`string`){let t=e.trim();return t?[{role:`user`,text:t}]:[]}if(!Array.isArray(e)){let t=nI(e);return t?[{role:`user`,text:t}]:[]}return e.map(e=>{if(!e||typeof e!=`object`)return null;let t=String(e.role||`user`).toLowerCase(),n=nI(e.content);return n?{role:t,text:n}:null}).filter(Boolean)}function mI(e){return rI(e)}function hI(e){if(!e||typeof e!=`object`)return[];let t=[];return t.push(...iI(e.instructions)),Array.isArray(e.messages)&&e.messages.forEach(e=>{!e||typeof e!=`object`||(t.push(...sI(e.content)),t.push(...oI(e.tool_calls)))}),typeof e.input==`string`?t.push(e.input):Array.isArray(e.input)?e.input.forEach(e=>{if(!(!e||typeof e!=`object`)){if(e.type===`function_call`||e.type===`tool_use`){t.push(...oI([e]));return}t.push(...sI(e.content)),typeof e.text==`string`&&t.push(e.text)}}):e.input&&typeof e.input==`object`&&(t.push(...iI(e.input.content)),typeof e.input.text==`string`&&t.push(e.input.text)),t.map(e=>String(e||``)).filter(e=>e.length>0)}var gI=e=>nI(e);function _I(e){if(!e||!e.data)return``;let t=OP(e.data.response_body,0,gI);if(t)return t;let n=e.data.error_message;if(n==null)return``;if(typeof n==`string`){let e=n.trim();return e?OP(EP(e),0,gI)||e:``}return OP(n,0,gI)||nI(n)}function vI(e){return Array.isArray(e)?e.some(e=>!e||typeof e!=`object`?!1:e.type===`message`||e.role===`assistant`||e.role===`user`||e.role===`system`?!0:Array.isArray(e.content)?e.content.some(e=>!e||typeof e!=`object`?!1:typeof e.text==`string`||e.type===`output_text`||e.type===`input_text`):!1):!1}function yI(e){if(!e)return!1;let t=String(e).toLowerCase();return t===`/v1/embeddings`||t===`/v1/embeddings/`||t.startsWith(`/v1/embeddings?`)||t.startsWith(`/v1/embeddings/`)}function bI(e){return e?!!SI(e):!1}function xI(e){let t=String(e||``).trim().split(`?`)[0].replace(/\/+$/,``).toLowerCase();return t.startsWith(`/v1/`)?t.slice(3):t}function SI(e){switch(xI(e)){case`/chat/completions`:return`chat`;case`/responses`:return`responses`;case`/messages`:return`messages`;default:return``}}function CI(e){if(!e||typeof e!=`object`)return null;try{return JSON.parse(JSON.stringify(e))}catch{return null}}function wI(e,t){if(!t||typeof t!=`object`)return;let n=e[e.length-1];try{if(n&&JSON.stringify(n)===JSON.stringify(t))return}catch{}e.push(t)}function TI(e){let t=SI(e&&e.path),n=e&&e.data&&e.data.request_body;return!t||!n||typeof n!=`object`?!1:t!==`responses`||(e.data&&e.data.response_body&&typeof e.data.response_body.id==`string`?e.data.response_body.id.trim():``)!==``||lL(n)!==``}function EI(e,t){let n=String(t||``).trim(),r=SI(e&&e.path),i=CI(e&&e.data&&e.data.request_body);if(!n||!r||!i)return null;let a=e&&e.data?e.data.response_body:null;if(r===`responses`){let e=a&&typeof a.id==`string`?a.id.trim():``,t=lL(i);return!e&&!t?null:(i.input=n,e&&!t?i.previous_response_id=e:delete i.previous_response_id,i)}let o=Array.isArray(i.messages)?i.messages:[];if(r===`chat`){let e=a&&Array.isArray(a.choices)?a.choices[0]:null;e&&e.message&&wI(o,CI(e.message)),o.push({role:`user`,content:n})}else a&&a.content!==void 0&&wI(o,{role:String(a.role||`assistant`),content:CI(a.content)||a.content}),o.push({role:`user`,content:n});return i.messages=o,i}var DI=new Set(`authorization.proxy-authorization.cookie.content-type.content-length.host.accept.connection.accept-encoding.content-encoding.transfer-encoding.user-agent.date.expect.upgrade.via.te.trailer.keep-alive.origin.referer.forwarded.x-real-ip.traceparent.tracestate.x-request-id.idempotency-key.x-idempotency-key.x-gomodel-timezone.x-gomodel-interaction-parent`.split(`.`));function OI(e,t,n=``){let r=e&&e.data&&e.data.request_headers,i={};return r&&typeof r==`object`&&Object.keys(r).forEach(e=>{let t=String(e).toLowerCase(),n=String(r[e]==null?``:r[e]);!e||!n||n===`[REDACTED]`||DI.has(t)||t.startsWith(`sec-`)||t.startsWith(`cf-`)||t.startsWith(`x-forwarded-`)||(i[e]=n)}),i[`X-GoModel-Interaction-Parent`]=String(t||e&&e.id||``).trim(),String(n||``).trim()&&(i[`X-Request-ID`]=String(n).trim()),i}function kI(e,t){let n=String(t||``).trim();return!n||!Array.isArray(e)?null:e.find(e=>String(e&&e.request_id||``).trim()===n)||null}function AI(e,t,n,r,i){let a=Array.isArray(e)?e:[],o=String(i&&i.id||``).trim(),s=String(i&&i.request_id||``).trim(),c=String(i&&i.session_id||``).trim(),l=String(r||``).trim(),u=jI(i),d=a.some(e=>o&&String(e&&e.id||``).trim()===o||s&&String(e&&e.request_id||``).trim()===s),f=!!l&&s===l,p=!!n&&c===String(n).trim(),m=!!u&&(u===String(t||``).trim()||a.some(e=>String(e&&e.id||``).trim()===u)),h=d||f||!l&&(p||m);return{accepted:h,submittedChild:f,followUpRequestID:h&&f&&o?``:l}}function jI(e){let t=e&&e.data&&e.data.request_headers;if(!t||typeof t!=`object`)return``;let n=Object.keys(t).find(e=>e.toLowerCase()===`x-gomodel-interaction-parent`);return n?String(t[n]||``).trim():``}function MI(e,t){return!Array.isArray(e)||!t?null:e.find(e=>String(e&&e.id||``)===String(t))||null}function NI(e){return!Array.isArray(e)||e.length===0?null:e.reduce((e,t)=>e?uL(t,e)>=0?t:e:t,null)}function PI(e,t){let n=new Set(Array.isArray(t)?t.map(String):[]);return NI((Array.isArray(e)?e:[]).filter(e=>{let t=String(e&&e.id||``);return n.has(t)&&e&&e.data&&e.data.request_body!=null}))}function FI(e,t){let n=NI(e);return!!n&&String(n.id||``)===String(t||``)}function II(e,t,n){return String(e||``).trim()===`audit.flushed`&&String(t||``).trim()!==``&&String(t||``).trim()===String(n||``).trim()}function LI(e,t){let n=Array.isArray(e)?e.filter(Boolean).map(String):[];return(Array.isArray(t)?t:[]).forEach(e=>{let t=String(e&&(e.id||e.request_id)||``).trim();t&&!n.includes(t)&&n.push(t)}),n}function RI(e){if(e&&e.conversation_payload)return!0;let t=e&&e.data?e.data.request_body:null,n=e&&e.data?e.data.response_body:null,r=t&&(Array.isArray(t.messages)||t.input!==void 0||typeof t.instructions==`string`||typeof t.previous_response_id==`string`),i=n&&(Array.isArray(n.choices)||vI(n.output));return!!(r||i)}function zI(e){return!e||yI(e.path)?!1:bI(e.path)||RI(e)}function BI(e){let t=0,n=!1,r=!1,i=String(e||``);for(let e=0;e0&&a+1`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function WI(e){return!!(e&&typeof e==`object`&&e.__audio__===!0)}function GI(e){let t=Number(e||0);if(!Number.isFinite(t)||t<=0)return`0 B`;let n=[`B`,`KB`,`MB`,`GB`],r=0,i=t;for(;i>=1024&&r`
`+UI(t)+``+UI(qI(e[t]))+`
`);return t.length?``:``}function YI(e){let t=KI(e.content_type),n=UI(t+` · `+GI(e.bytes)),r=JI(e.meta);if(e.stored&&e.encoding===`base64`&&e.data){let i=String(e.data).replace(/[^A-Za-z0-9+/=]/g,``);return`
`+n+`
`+r+`
`}let i=e.too_large?`Audio too large to store.`:`Audio not logged. Set LOGGING_LOG_AUDIO_BODIES=true to capture playable audio.`;return`
`+n+`
`+UI(i)+`
`+r+`
`}function XI(e){try{return JSON.stringify(String(e)).slice(1,-1)}catch{return``}}function ZI(e){if(!e||typeof e!=`object`)return null;let t=Number(e.characters||0);if(!Number.isFinite(t)||t<=0)return null;let n=Array.isArray(e.segments)?e.segments.map(e=>String(e||``)).filter(Boolean):[];return n.length===0?null:{remaining:Math.floor(t),segments:n,segmentIndex:0}}function QI(e,t){if(!t||t.remaining<=0||t.segmentIndex>=t.segments.length)return UI(e);let n=``,r=0,i=0;for(;t.remaining>0&&t.segmentIndex`+UI(l)+``,r=s+l.length,i=s+o.length,t.remaining-=c,c>=a.length){t.segmentIndex++;continue}break}return n?n+UI(e.slice(r)):UI(e)}function $I(e,t,n){let r=n&&typeof n.formatJSON==`function`?n.formatJSON:e=>String(e),i=n&&typeof n.canShowConversation==`function`?n.canShowConversation:()=>!1,a=ZI(n&&n.promptCacheHighlight),o=r(t);if(!o||o===`Not captured`)return UI(o);if(!i(e))return o.split(` +`).map(e=>QI(e,a)).join(` +`);let s=o.split(` +`),c=[],l=0;for(;lQI(e,a)).join(` +`);c.push(``+o+``),l=r+1;continue}c.push(QI(e,a)),l++}return c.join(` +`)}function eL(e){let t=String(e||``).toLowerCase();return t===`system`||t===`developer`?{role:`system`,label:`System Prompt`,className:`role-system`}:t===`assistant`?{role:`assistant`,label:`Agent`,className:`role-assistant`}:t===`error`?{role:`error`,label:`Error`,className:`role-error`}:t===`function_call`?{role:`function_call`,label:`Function Call`,className:`role-function-call`}:t===`function_result`?{role:`function_result`,label:`Function Result`,className:`role-function-result`}:{role:`user`,label:`User`,className:`role-user`}}function tL(e,t,{timestamp:n,entryID:r,isAnchor:i,isAfterAnchor:a,index:o,toolCalls:s,functionName:c,functionCallID:l,promptCache:u,toolPromptCache:d}){let f=eL(e),p=u&&Number.isFinite(Number(u.total))?Math.max(0,Number(u.total)):u===null?0:String(t||``).length,m=d&&Array.isArray(d.characters)?d.characters:dI(s).characters;return{uid:r+`-`+o,entryID:r,timestamp:n,text:t,role:f.role,roleLabel:f.label,roleClass:f.className,isAnchor:i,isAfterAnchor:a,toolCalls:Array.isArray(s)&&s.length>0?s:null,functionName:c||``,functionCallID:l||``,promptCacheRatio:0,_promptTextCharacters:p,_toolPromptCharacters:m}}function nL(e){return Array.isArray(e)?e.map(e=>{if(!e)return null;let t=e.function||e,n=``;return t.arguments===void 0?e.arguments===void 0?t.input===void 0?e.input!==void 0&&(n=e.input):n=t.input:n=e.arguments:n=t.arguments,{name:t.name||e.name||``,arguments:n,id:e.call_id||e.id||``}}).filter(Boolean):[]}function rL(e){return Array.isArray(e)?nL(e.filter(e=>e&&typeof e==`object`&&e.type===`tool_use`)):[]}function iL(e){return Array.isArray(e)?e.filter(e=>e&&typeof e==`object`&&e.type===`tool_result`).map(e=>({id:e.tool_use_id||e.call_id||``,text:nI(e.content)})):[]}function aL(e,t,n){!t||!n||[t.call_id,t.id].forEach(t=>{t&&(e[t]=n)})}function oL(e,t,n){if(t&&Array.isArray(t.messages)&&t.messages.forEach(t=>{t&&[...Array.isArray(t.tool_calls)?t.tool_calls:[],...Array.isArray(t.content)?t.content.filter(e=>e&&e.type===`tool_use`):[]].forEach(t=>{t&&aL(e,t,(t.function||t).name||t.name||``)})}),t&&Array.isArray(t.input)&&t.input.forEach(t=>{!t||typeof t!=`object`||t.type!==`function_call`&&t.type!==`tool_use`||aL(e,t,t.name||``)}),n&&Array.isArray(n.choices)){let t=n.choices[0];t&&t.message&&Array.isArray(t.message.tool_calls)&&t.message.tool_calls.forEach(t=>{t&&aL(e,t,(t.function||t).name||t.name||``)})}n&&Array.isArray(n.output)&&n.output.forEach(t=>{!t||t.type!==`function_call`&&t.type!==`tool_use`||aL(e,t,t.name||``)}),n&&Array.isArray(n.content)&&n.content.forEach(t=>{!t||t.type!==`tool_use`||aL(e,t,t.name||``)})}function sL(e){return Array.isArray(e)?`[`+e.map(sL).join(`,`)+`]`:e&&typeof e==`object`?`{`+Object.keys(e).sort().map(t=>JSON.stringify(t)+`:`+sL(e[t])).join(`,`)+`}`:JSON.stringify(e)}function cL(e){if(!e||typeof e!=`object`)return null;let t=[];if(e.system!==void 0&&t.push({system:e.system}),e.instructions!==void 0&&t.push({instructions:e.instructions}),Array.isArray(e.messages))t.push(...e.messages);else if(Array.isArray(e.input)&&e.previous_response_id==null&&e.conversation==null)t.push(...e.input);else return null;return t.map(sL)}function lL(e){let t=e&&e.conversation;return typeof t==`string`?t.trim():t&&typeof t.id==`string`?t.id.trim():``}function uL(e,t){let n=new Date(e&&e.timestamp).getTime(),r=new Date(t&&t.timestamp).getTime();if(Number.isFinite(n)&&Number.isFinite(r)&&n!==r)return n-r;let i=String(e&&e.timestamp||``).localeCompare(String(t&&t.timestamp||``));if(i!==0)return i;let a=String(e&&e.id||``),o=String(t&&t.id||``);return ao)}function dL(e,t){if(!Array.isArray(e)||e.length===0)return{messages:[],entryIDs:[]};let n=[...e].sort(uL),r={};n.forEach(e=>{let t=e.data&&e.data.request_body?e.data.request_body:null,n=e.data&&e.data.response_body?e.data.response_body:null;oL(r,t,n)});let i=[],a=new Set,o=new Set,s=new Set,c=[],l=null,u=0,d=n.findIndex(e=>e.id===t),f=e=>JSON.stringify({role:e.role,text:e.text,toolCalls:e.toolCalls,functionName:e.functionName,functionCallID:e.functionCallID});return n.forEach((e,n)=>{let p=e.id===t,m=d>=0&&n>d,h=e.timestamp,g=e.data&&e.data.request_body?e.data.request_body:null,_=e.data&&e.data.response_body?e.data.response_body:null,v=i.length,y=(e,t)=>lI(e,t),b=e=>dI(e),x=(t,n,{toolCalls:r,functionName:i,functionCallID:a,promptCache:o,toolPromptCache:s}={})=>tL(t,n,{timestamp:h,entryID:e.id,isAnchor:p,isAfterAnchor:m,index:++u,toolCalls:r,functionName:i,functionCallID:a,promptCache:o,toolPromptCache:s});if(g&&g.system!==void 0){let e=nI(g.system);e&&i.push(x(`system`,e,{promptCache:y(e,iI(g.system))}))}if(g&&g.instructions!==void 0){let e=nI(g.instructions);e&&i.push(x(`system`,e,{promptCache:y(e,iI(g.instructions))}))}g&&Array.isArray(g.messages)&&g.messages.forEach(e=>{if(!e)return;let t=(e.role||`user`).toLowerCase();if(t===`tool`){let t=nI(e.content),n=e.name||r[e.tool_call_id]||``;t&&i.push(x(`function_result`,t,{functionName:n,functionCallID:e.tool_call_id||``,promptCache:y(t,iI(e.content))}));return}if(t===`assistant`){let n=rI(e),r=[...nL(e.tool_calls),...rL(e.content)];if(n||r.length>0){let a=y(n,iI(e.content));i.push(x(t,n,{toolCalls:r,promptCache:a,toolPromptCache:b(r)}))}return}iL(e.content).forEach(e=>{e.text&&i.push(x(`function_result`,e.text,{functionName:r[e.id]||``,functionCallID:e.id,promptCache:y(e.text,[e.text])}))});let n=rI(e);n&&i.push(x(t,n,{promptCache:y(n,iI(e.content))}))}),g&&g.input!==void 0&&(Array.isArray(g.input)?g.input.forEach(e=>{if(!(!e||typeof e!=`object`)){if(e.type===`function_call_output`||e.type===`tool_result`){let t=e.type===`tool_result`,n=t?e.content:e.output,a=t?e.tool_use_id||e.call_id||``:e.call_id||``,o=typeof n==`string`?n:nI(n);o&&i.push(x(`function_result`,o,{functionName:r[a]||e.name||``,functionCallID:a,promptCache:y(o,t?iI(e.content):[o])}))}else if(e.type===`function_call`||e.type===`tool_use`){let t=nL([e]);i.push(x(`function_call`,``,{toolCalls:t,toolPromptCache:b(t)}))}else if(e.role){let t=String(e.role).toLowerCase(),n=nI(e.content);n&&i.push(x(t,n,{promptCache:y(n,iI(e.content))}))}}}):pI(g.input).forEach(e=>{if(!e.text)return;let t=[];typeof g.input==`string`?t=[g.input]:g.input&&typeof g.input==`object`&&(t=iI(g.input.content),typeof g.input.text==`string`&&t.push(g.input.text)),i.push(x(e.role,e.text,{promptCache:y(e.text,t)}))}));let S=i.splice(v),C=S.map(f),w=cL(g),T=w!==null,E=jI(e),ee=!!E&&a.has(E),te=String(g&&g.previous_response_id||``).trim(),ne=lL(g),re=ee||!!te&&o.has(te)||!!ne&&s.has(ne);if(m){let e=T&&l&&l.length>0&&l.every((e,t)=>w[t]===e);if(T&&!e&&!ee||!T&&!re)return}p&&T&&(l=[...w]);let ie=String(e.id||``).trim();p&&(a.clear(),o.clear(),s.clear()),ie&&(p||m)&&a.add(ie),ne&&s.add(ne);let ae=0;for(;ae0;){let t=c.slice(-e),n=C.slice(0,e);if(t.every((e,t)=>e===n[t]))break;e--}i.push(...S.slice(e)),c.push(...C.slice(e))}let oe=cI(e);if(g&&oe!==null&&i.splice(0,i.length,...fI(i,oe)),_&&Array.isArray(_.choices)){let e=_.choices[0];if(e&&e.message){let t=(e.message.role||`assistant`).toLowerCase(),n=rI(e.message),r=nL(e.message.tool_calls);if(n||r.length>0){let e=x(t,n,{toolCalls:r});i.push(e),c.push(f(e))}}}if(_&&Array.isArray(_.output)&&_.output.forEach(e=>{if(!e)return;if(e.type===`function_call`||e.type===`tool_use`){let t=x(`function_call`,``,{toolCalls:nL([e])});i.push(t),c.push(f(t));return}let t=(e.role||`assistant`).toLowerCase(),n=mI(e);if(n){let e=x(t,n);i.push(e),c.push(f(e))}}),_&&_.content!==void 0&&!Array.isArray(_.choices)&&!Array.isArray(_.output)){let e=String(_.role||`assistant`).toLowerCase(),t=nI(_.content),n=rL(_.content);if(t||n.length>0){let r=x(e,t,{toolCalls:n});i.push(r),c.push(f(r))}}let se=_I(e);se&&i.push(x(`error`,se));let ce=String(_&&_.id||``).trim();ce&&o.add(ce)}),{messages:i,entryIDs:[...a]}}function fL(e){return e.role===`function_call`?(e.toolCalls||[]).map(function(e){return e.name+`(`+mL(e)+`)`}).join(` + +`):e.text||``}function pL(e){return e?[String(e.text||``),Array.isArray(e.toolCalls)&&e.toolCalls.length>0?fL({role:`function_call`,toolCalls:e.toolCalls}):``].filter(Boolean).join(` + +`):``}function mL(e){let t=e&&e.arguments!==void 0?e.arguments:``;if(typeof t!=`string`)try{return JSON.stringify(t,null,2)}catch{return String(t)}try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}var hL=600*1e3,gL=15*1e3,_L=250,vL=class{#e=j(!1);get conversationOpen(){return R(this.#e)}set conversationOpen(e){M(this.#e,e,!0)}#t=j(!1);get conversationLoading(){return R(this.#t)}set conversationLoading(e){M(this.#t,e,!0)}#n=j(``);get conversationError(){return R(this.#n)}set conversationError(e){M(this.#n,e,!0)}#r=j(``);get conversationAnchorID(){return R(this.#r)}set conversationAnchorID(e){M(this.#r,e,!0)}#i=j(N([]));get conversationEntryIDs(){return R(this.#i)}set conversationEntryIDs(e){M(this.#i,e,!0)}#a=j(``);get conversationSessionID(){return R(this.#a)}set conversationSessionID(e){M(this.#a,e,!0)}#o=j(!1);get conversationTruncated(){return R(this.#o)}set conversationTruncated(e){M(this.#o,e,!0)}#s=j(!1);get conversationFollowLatest(){return R(this.#s)}set conversationFollowLatest(e){M(this.#s,e,!0)}#c=j(``);get conversationOpenedFromID(){return R(this.#c)}set conversationOpenedFromID(e){M(this.#c,e,!0)}#l=j(``);get followUpText(){return R(this.#l)}set followUpText(e){M(this.#l,e,!0)}#u=j(!1);get followUpSending(){return R(this.#u)}set followUpSending(e){M(this.#u,e,!0)}#d=j(``);get followUpError(){return R(this.#d)}set followUpError(e){M(this.#d,e,!0)}followUpRequestID=``;followUpAbort=null;conversationRequestToken=0;conversationReturnFocusEl=null;bodyPointerStart=null;#f=j(null);get conversationDialogEl(){return R(this.#f)}set conversationDialogEl(e){M(this.#f,e,!0)}#p=j(null);get conversationCloseBtnEl(){return R(this.#p)}set conversationCloseBtnEl(e){M(this.#p,e,!0)}#m=j(null);get conversationThreadEl(){return R(this.#m)}set conversationThreadEl(e){M(this.#m,e,!0)}get conversationEntries(){return(this.conversationEntryIDs||[]).map(e=>UC.auditRecord(e)).filter(Boolean)}#h=A(()=>dL(this.conversationEntries,this.conversationAnchorID));get conversationView(){return R(this.#h)}set conversationView(e){M(this.#h,e)}get conversationMessages(){return this.conversationView.messages}get conversationBranchEntryIDs(){return this.conversationView.entryIDs}_setConversationEntryIDs(e){this.conversationEntryIDs=[...new Set((Array.isArray(e)?e:[]).filter(Boolean))],UC.pinAuditRecords(this.conversationEntryIDs)}canShowConversation(e){return zI(e)}startBodyInteraction(e){this.bodyPointerStart={x:e.clientX,y:e.clientY}}_isBodyDrag(e){if(!this.bodyPointerStart)return!1;let t=Math.abs(e.clientX-this.bodyPointerStart.x),n=Math.abs(e.clientY-this.bodyPointerStart.y);return t>4||n>4}_hasActiveSelection(){let e=window.getSelection?window.getSelection():null;return!e||e.isCollapsed?!1:String(e.toString()||``).trim().length>0}handleBodyConversationClick(e,t){let n=this._isBodyDrag(e);if(this.bodyPointerStart=null,n||this._hasActiveSelection()||!this.canShowConversation(t))return;let r=e.target&&e.target.closest?e.target.closest(`[data-conversation-trigger="1"]`):null;r&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,r))}handleErrorConversationClick(e,t){let n=this._isBodyDrag(e);this.bodyPointerStart=null,!n&&(this._hasActiveSelection()||this.canShowConversation(t)&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,e.currentTarget)))}formatJSON(e){return gc(e)}renderBodyWithConversationHighlights(e,t,n){return $I(e,t,{formatJSON:e=>this.formatJSON(e),canShowConversation:e=>this.canShowConversation(e),promptCacheHighlight:n&&n.promptCacheHighlight})}async openConversation(e,t){if(!e||!e.id||!this.canShowConversation(e))return;let n=document.activeElement instanceof HTMLElement?document.activeElement:null;t instanceof HTMLElement?this.conversationReturnFocusEl=t:n&&n!==document.body&&(this.conversationReturnFocusEl=n);let r=++this.conversationRequestToken;if(this.conversationOpen=!0,this.conversationError=``,this.conversationAnchorID=e.id,this.conversationOpenedFromID=e.id,this.conversationSessionID=String(e.session_id||``).trim(),this._setConversationEntryIDs([]),this.conversationTruncated=!1,this.conversationFollowLatest=!1,this.followUpText=``,this.followUpError=``,this.followUpRequestID=``,requestAnimationFrame(()=>this._focusConversationDrawer()),this._conversationEntryLivePending(e)){this.conversationFollowLatest=!0,this.conversationLoading=!1,this._addConversationRecord(UC.upsertAuditRecord(e,`conversation.live`));return}this.conversationLoading=!0,await this.fetchConversation(e.id,r,!0,!0)}_conversationEntryLivePending(e){return typeof UC.auditEntryLiveDetailPending==`function`&&UC.auditEntryLiveDetailPending(e)}_applyConversationView(){let e=this.conversationEntries,t=dL(e,this.conversationAnchorID);if(this.conversationFollowLatest){let n=PI(e,t.entryIDs);n&&n.id&&String(n.id)!==this.conversationAnchorID&&(this.conversationAnchorID=String(n.id))}}handleAuditRecordChange(e,t){if(!this.conversationOpen||!e)return;let n=String(e.id||``).trim(),r=AI(this.conversationEntries,this.conversationAnchorID,this.conversationSessionID,this.followUpRequestID,e);if(r.accepted&&(this.followUpRequestID=r.followUpRequestID,n&&r.submittedChild&&(this.conversationAnchorID=n,this.conversationFollowLatest=!0),this._addConversationRecord(e),II(String(t||e._live_state||``).trim(),n,this.conversationAnchorID))){this.conversationMessages.length===0&&(this.conversationLoading=!0);let e=++this.conversationRequestToken;this.fetchConversation(n,e,!1)}}_addConversationRecord(e){let t=IC(e);t&&!this.conversationEntryIDs.includes(t)&&this._setConversationEntryIDs([...this.conversationEntryIDs,t]),!this.conversationSessionID&&e.session_id&&(this.conversationSessionID=String(e.session_id).trim()),this._applyConversationView(),this.conversationFollowLatest&&this._scheduleLatestScroll()}conversationLiveWaiting(){if(!this.conversationOpen)return!1;let e=new Set(this.conversationBranchEntryIDs||[]);return(this.conversationEntries||[]).some(t=>e.has(String(t&&t.id||``))&&t._live&&(typeof UC.liveAuditStateSettled!=`function`||!UC.liveAuditStateSettled(t._live_state)))}conversationLiveStatusText(){return(this.conversationMessages||[]).length>0?`Model is responding…`:`Waiting for request data…`}closeConversation(){this.followUpAbort&&this.followUpAbort.abort(),this.conversationOpen=!1,this.conversationRequestToken++,this.conversationSessionID=``,this._setConversationEntryIDs([]),this.conversationFollowLatest=!1,this.conversationOpenedFromID=``,this.followUpRequestID=``,this.followUpSending=!1;let e=this.conversationReturnFocusEl;this.conversationReturnFocusEl=null,e&&typeof e.focus==`function`&&document.contains(e)&&requestAnimationFrame(()=>e.focus())}_focusConversationDrawer(){if(!this.conversationOpen)return;let e=this.conversationCloseBtnEl;if(e&&typeof e.focus==`function`){e.focus();return}let t=this.conversationDialogEl;t&&typeof t.focus==`function`&&t.focus()}async fetchConversation(e,t,n=!0,r=!1){try{let i=await ws(`/admin/audit/conversation?`+(`log_id=`+encodeURIComponent(e)+`&limit=120`),{label:`audit conversation`});if(t!==this.conversationRequestToken||i.stale)return;if(!i.ok){this.conversationError=`Unable to load interactions.`;return}let a=i.data||{},o=a.anchor_id||e,s=Array.isArray(a.entries)?a.entries:[],c=UC.upsertAuditRecords(s,`conversation.hydrated`),l=LI(this.conversationEntryIDs,c);l.length>this.conversationEntryIDs.length&&this._setConversationEntryIDs(l),r&&(this.conversationFollowLatest=FI(c,o)),this.conversationAnchorID=o;let u=this.conversationEntries.find(e=>e.id===this.conversationAnchorID);u&&u.session_id&&(this.conversationSessionID=String(u.session_id).trim()),this.conversationTruncated=!!a.truncated,this._applyConversationView(),this.conversationFollowLatest?this._scheduleLatestScroll():n&&this._scheduleAnchorScroll()}catch(e){if(t!==this.conversationRequestToken)return;console.error(`Failed to fetch audit conversation:`,e),this.conversationError=`Failed to load interactions.`}finally{t===this.conversationRequestToken&&(this.conversationLoading=!1)}}selectedConversationEntry(){return MI(this.conversationEntries,this.conversationAnchorID)}followUpKind(){let e=this.selectedConversationEntry();return TI(e)?SI(e.path):``}canSendFollowUp(){return!!this.followUpKind()&&!!String(this.followUpText||``).trim()&&!this.followUpSending&&!this.conversationLiveWaiting()}async sendFollowUp(){if(!this.canSendFollowUp())return;let e=this.selectedConversationEntry(),t=EI(e,this.followUpText);if(!e||!t)return;let n=this.conversationAnchorID,r=bL(),i=new AbortController,a=!1,o=setTimeout(()=>{a=!0,i.abort()},hL);this.followUpSending=!0,this.followUpError=``,this.followUpRequestID=r,this.followUpAbort=i;try{let a=OI(e,n,r),o=await Ss(e.path,{method:`POST`,headers:a,body:JSON.stringify(t),signal:i.signal}),s=String(o.headers.get(`X-Request-ID`)||``).trim();if(s&&this.followUpRequestID&&(this.followUpRequestID=s),!o.ok){let e=`Unable to send message.`;try{let t=await o.json();e=t&&t.error&&t.error.message||e}catch{}this.followUpError=e,(this.followUpRequestID===r||this.followUpRequestID===s)&&(this.followUpRequestID=``);return}if(this.followUpText=``,await yL(o),!UC.liveLogsStreaming&&this.conversationOpen){let e=++this.conversationRequestToken;await this._selectPersistedFollowUp(n,this.followUpRequestID,e,i.signal)}}catch(e){Es(e)||i.signal.aborted?a&&this.conversationOpen&&(this.followUpError=`The request timed out.`):(console.error(`Failed to send interaction follow-up:`,e),this.followUpError=`Failed to send message.`)}finally{clearTimeout(o),this.followUpAbort===i&&(this.followUpAbort=null,this.followUpSending=!1)}}async _selectPersistedFollowUp(e,t,n,r){let i=Date.now()+gL;for(;this.conversationOpen&&n===this.conversationRequestToken&&Date.now(){let e=this.conversationThreadEl;if(!e)return;let t=e.querySelectorAll(`[data-conversation-anchor="true"]`),n=t[t.length-1];n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({block:`center`})})}_scheduleLatestScroll(){requestAnimationFrame(()=>{let e=this.conversationThreadEl;if(!e)return;let t=e.lastElementChild;t&&typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`end`})})}};async function yL(e){let t=e&&e.body&&typeof e.body.getReader==`function`?e.body.getReader():null;if(!t){await e.text();return}for(;!(await t.read()).done;);}function bL(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID==`function`?globalThis.crypto.randomUUID():`dashboard-`+Date.now().toString(36)+`-`+Math.random().toString(36).slice(2)}function xL(e,t){return new Promise((n,r)=>{let i,a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};if(i=setTimeout(()=>{t&&t.removeEventListener(`abort`,a),n()},e),t){if(t.aborted){a();return}t.addEventListener(`abort`,a,{once:!0})}})}var SL=new vL,CL=0;An(()=>{On(()=>{let e=RC(UC.auditRecordChanges,CL);e.length!==0&&(CL=Number(e[e.length-1].version||0),wr(()=>{e.forEach(e=>{if(!zC(e))return;let t=UC.auditRecord(e.key);SL.handleAuditRecordChange(t,e.eventType)})}))})});var wL=B(``),TL=B(` `),EL=B(` `),DL=B(``),OL=B(`
`);function kL(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`expanded`,3,!1),i=q(t,`onactivate`,3,null),a=q(t,`hidePath`,3,!1),o=A(()=>vs.formatTimestamp(t.entry.timestamp)),s=A(()=>R(o)===`-`?R(o):R(o).slice(R(o).lastIndexOf(` `)+1)),c=A(()=>SL.conversationOpen&&String(SL.conversationAnchorID||``)===String(t.entry.id||``));function l(e){e.preventDefault(),i()&&i()()}function u(e){e.stopPropagation(),e.preventDefault(),n().ontoggle()}function d(e){if(e.stopPropagation(),e.preventDefault(),R(c)){SL.closeConversation();return}SL.openConversation(t.entry,e.currentTarget)}var f=OL();let p;var m=P(f),h=P(m),g=e=>{var t=wL(),r=P(t);{let e=A(()=>n().expanded?Va:Ua);J(r,{get icon(){return R(e)},class:`audit-thread-expander-svg`})}var i=I(r,2),a=P(i,!0);D(i),D(t),L(()=>{K(t,`aria-expanded`,n().expanded),K(t,`title`,`Session with `+n().count+` requests`),K(t,`aria-label`,`Session with `+n().count+` requests, `+(n().expanded?`collapse`:`expand`)),H(a,n().count)}),z(`click`,t,u),V(e,t)};U(h,e=>{n()&&e(g)});var _=I(h,2),v=P(_),y=P(v,!0);D(v);var b=I(v,2),x=P(b,!0);D(b),D(_);var S=I(_,2),C=e=>{var n=TL(),r=P(n,!0);D(n),L(e=>H(r,e),[()=>jc(t.entry)]),V(e,n)};U(S,e=>{(t.entry.requested_model||t.entry.model)&&e(C)});var w=I(S,2),T=e=>{var n=EL(),r=P(n,!0);D(n),L(()=>H(r,t.entry.path||`-`)),V(e,n)};U(w,e=>{a()||e(T)}),D(m);var E=I(m,2),ee=P(E);$F(ee,{get entry(){return t.entry}});var te=I(ee,2),ne=P(te),re=P(ne,!0);D(ne);var ie=I(ne,2),ae=P(ie,!0);D(ie),D(te);var oe=I(te,2),se=P(oe,!0);D(oe);var ce=I(oe,2),le=e=>{var t=DL();let n;var r=P(t);{let e=A(()=>R(c)?Ha:Ua);J(r,{get icon(){return R(e)},class:`audit-conversation-trigger-svg`})}D(t),L(()=>{n=G(t,1,`audit-conversation-trigger svelte-17mysgz`,null,n,{"audit-conversation-trigger-active":R(c)}),K(t,`title`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-label`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-pressed`,R(c))}),z(`click`,t,d),V(e,t)},ue=A(()=>SL.canShowConversation(t.entry));U(ce,e=>{R(ue)&&e(le)}),D(E),D(f),L((e,n,i,a)=>{p=G(f,1,`audit-entry-summary svelte-17mysgz`,null,p,e),K(f,`aria-expanded`,r()),G(_,1,`audit-status-badge audit-request-badge ${n??``}`,`svelte-17mysgz`),K(_,`title`,`Status `+(t.entry.status_code||`-`)+` · `+(t.entry.method||`-`)),K(_,`aria-label`,(t.entry.status_code||`-`)+` `+(t.entry.method||`-`)),H(y,t.entry.status_code||`-`),H(x,t.entry.method||`-`),K(te,`title`,i),K(te,`aria-label`,R(o)),H(re,R(o)),H(ae,R(s)),H(se,a)},[()=>({"audit-entry-summary-live-in-progress":iF(t.entry),"audit-entry-summary-has-interactions":SL.canShowConversation(t.entry)}),()=>rF(t.entry.status_code),()=>Tc(t.entry.timestamp),()=>nF(t.entry.duration_ns)]),z(`click`,f,l),V(e,f),k()}Br([`click`]);var AL=B(``);function jL(e,t){O(t,!0);let n=q(t,`label`,3,`Copy`),r=q(t,`copiedLabel`,3,`Copied`),i=q(t,`errorLabel`,3,``),a=q(t,`class`,3,`btn`),o=A(()=>t.state.error&&i()?i():t.state.copied?r():n());var s=AL();let c;var l=P(s),u=e=>{J(e,{get icon(){return Ga},width:`14`,height:`14`,"stroke-width":`2.5`})},d=e=>{J(e,{get icon(){return Ja},width:`14`,height:`14`})};U(l,e=>{t.state.copied?e(u):e(d,-1)});var f=I(l,2),p=P(f,!0);D(f),D(s),L(()=>{c=G(s,1,Ni([`copy-feedback-btn`,a()]),null,c,{"copy-feedback-btn-copied":t.state.copied}),H(p,R(o))}),z(`click`,s,e=>{e.preventDefault(),t.onclick?.(e)}),V(e,s),k()}Br([`click`]);var ML=B(`
Error Message
 
`),NL=B(`
 
`),PL=B(` `),FL=B(` streaming`),IL=B(`
Body
`),LL=B(`

`),RL=B(`

`),zL=B(`

`),BL=B(`
`);function VL(e,t){O(t,!0);let n=MM({logPrefix:`Failed to copy audit payload:`}),r=MM({logPrefix:`Failed to copy audit payload:`}),i=A(()=>t.pane&&t.pane.showHeaders?gc(t.pane.headers):``),a=A(()=>!t.pane||!t.pane.showBody?``:WI(t.pane.body)?YI(t.pane.body):SL.renderBodyWithConversationHighlights(t.pane.entry,t.pane.body,{promptCacheHighlight:t.pane.promptCacheHighlight})),o=A(()=>!!(t.pane&&SL.canShowConversation(t.pane.entry)));function s(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),SL.handleErrorConversationClick(e,t.pane.entry))}var c=BL();let l;var u=P(c),d=e=>{var n=ML(),r=I(P(n),2);let i;var a=P(r,!0);D(r),D(n),L(()=>{i=G(r,1,`audit-json audit-pane-error-message svelte-1h5puht`,null,i,{"audit-pane-clickable-preview":R(o)}),K(r,`role`,R(o)?`button`:null),K(r,`tabindex`,R(o)?0:null),H(a,t.pane.errorMessage)}),z(`mousedown`,r,e=>SL.startBodyInteraction(e)),z(`keydown`,r,s),z(`click`,r,e=>SL.handleErrorConversationClick(e,t.pane.entry)),V(e,n)};U(u,e=>{t.pane.showErrorMessage&&e(d)});var f=I(u,2),p=e=>{var n=NL(),a=P(n),o=P(a),s=P(o,!0);D(o),jL(I(o,2),{get state(){return r},label:`Copy Headers`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>r.copy(t.pane.copyHeaders,gc)}),D(a);var c=I(a,2),l=P(c,!0);D(c),D(n),L(()=>{H(s,t.pane.headersTitle||`Headers`),H(l,R(i))}),V(e,n)};U(f,e=>{t.pane.showHeaders&&e(p)});var m=I(f,2),h=e=>{var r=IL(),i=P(r),o=P(i),s=I(P(o),2),c=e=>{var n=PL(),r=P(n,!0);D(n),L(()=>H(r,t.pane.bodyCacheRatioLabel)),V(e,n)};U(s,e=>{t.pane.bodyCacheRatioLabel&&e(c)});var l=I(s,2),u=e=>{V(e,FL())};U(l,e=>{t.pane.streaming&&e(u)}),D(o),jL(I(o,2),{get state(){return n},label:`Copy Body`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>n.copy(t.pane.copyBody,gc)}),D(i);var d=I(i,2);pi(d,()=>R(a),!0),D(d),D(r),z(`mousedown`,d,e=>SL.startBodyInteraction(e)),z(`click`,d,e=>SL.handleBodyConversationClick(e,t.pane.entry)),V(e,r)};U(m,e=>{t.pane.showBody&&e(h)});var g=I(m,2),_=e=>{var n=LL(),r=P(n,!0);D(n),L(()=>H(r,t.pane.emptyMessage)),V(e,n)};U(g,e=>{t.pane.showEmpty&&e(_)});var v=I(g,2),y=e=>{var n=RL(),r=I(P(n),2),i=P(r,!0);D(r),D(n),L(()=>H(i,t.pane.pendingMessage)),V(e,n)};U(v,e=>{t.pane.showPending&&e(y)});var b=I(v,2),x=e=>{var n=zL(),r=P(n,!0);D(n),L(()=>H(r,t.pane.tooLargeMessage)),V(e,n)};U(b,e=>{t.pane.showTooLarge&&e(x)}),D(c),L(()=>l=G(c,1,`audit-pane svelte-1h5puht`,null,l,{"audit-pane-split":t.pane&&t.pane.layout===`split`,"audit-pane-split-single":t.pane&&t.pane.layout===`split`&&!(t.pane.showHeaders&&t.pane.showBody)})),V(e,c),k()}Br([`mousedown`,`keydown`,`click`]);var HL=B(` `),UL=B(` `),WL=B(` `),GL=B(` `),KL=B(``),qL=B(`
`),JL=B(`
`);function YL(e,t){O(t,!0);let n=q(t,`panes`,19,()=>[]),r=j(null),i=A(()=>IF(R(r),t.entry,n())),a=e=>`audit-tab-`+t.entry.id+`-`+e,o=e=>`audit-tabpanel-`+t.entry.id+`-`+e;function s(e,t){let i=n().map(e=>e.id),a=LF(e.key,i,t);a!=null&&(e.preventDefault(),((e.currentTarget?.closest?.(`.audit-pane-tablist`))?.querySelectorAll(`.audit-pane-tab`)[i.indexOf(a)])?.focus?.(),M(r,a,!0))}var c=JL(),l=P(c);W(l,21,n,e=>e.id,(e,t)=>{var n=KL();let c;var l=P(n),u=P(l),d=e=>{J(e,{get icon(){return Ma}})},f=e=>{J(e,{get icon(){return ja}})};U(u,e=>{R(t).pane.direction===`request`?e(d):R(t).pane.direction===`response`&&e(f,1)}),D(l);var p=I(l,2),m=P(p,!0);D(p);var h=I(p,2),g=e=>{var n=HL(),r=P(n);D(n),L(()=>H(r,`#${R(t).pane.seq??``}`)),V(e,n)};U(h,e=>{R(t).pane.seq&&e(g)});var _=I(h,2),v=e=>{var n=UL(),r=P(n,!0);D(n),L(()=>{G(n,1,`provider-badge audit-pane-kind audit-pane-kind-${R(t).pane.kind??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.kind)}),V(e,n)};U(_,e=>{R(t).pane.kind&&e(v)});var y=I(_,2);W(y,17,()=>R(t).pane.noChangeSteps||[],e=>e.id,(e,t)=>{var n=WL(),r=P(n,!0);D(n),L(()=>{K(n,`title`,R(t).title),H(r,R(t).label)}),V(e,n)});var b=I(y,2),x=e=>{var n=GL(),r=P(n,!0);D(n),L(()=>H(r,R(t).pane.savingsLabel)),V(e,n)};U(b,e=>{R(t).pane.savingsLabel&&e(x)});var S=I(b,2),C=e=>{var n=UL(),r=P(n,!0);D(n),L(e=>{G(n,1,`audit-status-badge ${e??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.statusCode)},[()=>rF(R(t).pane.statusCode)]),V(e,n)};U(S,e=>{R(t).pane.statusCode&&e(C)}),D(n),L((e,r)=>{c=G(n,1,`audit-pane-tab svelte-1bc5vi5`,null,c,{"audit-pane-tab-active":R(i)===R(t).id}),K(n,`aria-selected`,R(i)===R(t).id),K(n,`id`,e),K(n,`aria-controls`,r),K(n,`tabindex`,R(i)===R(t).id?0:-1),G(l,1,Ni([`audit-pane-icon`,R(t).pane.direction&&`audit-pane-icon-${R(t).pane.direction}`]),`svelte-1bc5vi5`),H(m,R(t).pane.title)},[()=>a(R(t).id),()=>o(R(t).id)]),z(`keydown`,n,e=>s(e,R(t).id)),z(`click`,n,()=>M(r,R(t).id,!0)),V(e,n)}),D(l),W(I(l,2),17,n,e=>e.id,(e,t)=>{var n=qL();let r;VL(P(n),{get pane(){return R(t).pane}}),D(n),L((e,a)=>{K(n,`id`,e),K(n,`aria-labelledby`,a),r=Bi(n,``,r,{display:R(i)===R(t).id?null:`none`})},[()=>o(R(t).id),()=>a(R(t).id)]),V(e,n)}),D(c),V(e,c),k()}Br([`keydown`,`click`]);var XL=B(`
`),ZL=B(`
`);function QL(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`hidePath`,3,!1),i=A(()=>BF.isAuditEntryExpanded(t.entry)),a=A(()=>SL.conversationOpen&&String(SL.conversationAnchorID||``)===String(t.entry.id||``)),o=A(()=>R(i)?PF(t.entry,hI):[]),s=A(()=>R(i)?kN(t.entry,wP.auditEntryWorkflow(t.entry),wP.workflowFeatureCaps()):null);function c(){BF.toggleAuditEntryExpanded(t.entry)}var l=ZL();let u;var d=P(l);kL(d,{get entry(){return t.entry},get thread(){return n()},get expanded(){return R(i)},get hidePath(){return r()},onactivate:c});var f=I(d,2),p=e=>{var n=XL(),r=P(n),i=e=>{GM(e,{get chart(){return R(s)}})};U(r,e=>{R(s)&&e(i)});var a=I(r,2);YL(a,{get entry(){return t.entry},get panes(){return R(o)}}),XF(I(a,2),{get entry(){return t.entry}}),D(n),Di(3,n,()=>rc,()=>({y:-6,duration:SP(150)})),V(e,n)};U(f,e=>{R(i)&&e(p)}),D(l),L(()=>u=G(l,1,`audit-entry svelte-cmjgwr`,null,u,{"audit-entry-interactions-open":R(a)})),V(e,l),k()}var $L=B(`
`),eR=B(`
`),tR=B(`

`),nR=B(`
`),rR=B(`
`);function iR(e,t){O(t,!0);let n=A(()=>BP(t.entry)),r=A(()=>BF.isThreadExpanded(R(n))),i=A(()=>BF.threadChildren(R(n))),a=A(()=>R(i)&&!R(i).loading&&Number(R(i).total||0)>R(i).entries.length+1);var o=Xr(),s=F(o),c=e=>{QL(e,{get entry(){return t.entry}})},l=A(()=>!HP(t.entry)),u=e=>{var n=rR(),o=P(n);{let e=A(()=>({count:VP(t.entry),expanded:R(r),ontoggle:()=>BF.toggleThread(t.entry)}));QL(o,{get entry(){return t.entry},get thread(){return R(e)}})}var s=I(o,2),c=e=>{var n=nR(),r=P(n),o=e=>{var t=$L();NS(P(t),{size:14,label:`Loading session requests`}),D(t),V(e,t)};U(r,e=>{R(i)&&R(i).loading&&e(o)});var s=I(r,2);W(s,17,()=>R(i)&&R(i).entries||[],e=>e.id,(e,n)=>{var r=eR(),i=P(r);{let e=A(()=>R(n).path===t.entry.path);QL(i,{get entry(){return R(n)},get hidePath(){return R(e)}})}D(r),V(e,r)});var c=I(s,2),l=e=>{var t=tR(),n=P(t);D(t),L(()=>H(n,`Showing the latest ${R(i).entries.length+1} of ${R(i).total??``} + requests in this session.`)),V(e,t)};U(c,e=>{R(a)&&e(l)}),D(n),Di(3,n,()=>ic,()=>({duration:SP(150)})),V(e,n)};U(s,e=>{R(r)&&e(c)}),D(n),V(e,n)};U(s,e=>{R(l)?e(c):e(u,-1)}),V(e,o),k()}var aR=B(`

.

`),oR=B(`
Audit logging is off. Live entries are temporary and disappear after + refresh. Set LOGGING_ENABLED=true to persist them.
`),sR=B(`

`),cR=B(`
`),lR=B(`
`),uR=B(`
`),dR=B(`
`),fR=B(`
`);function pR(e,t){O(t,!0);let n=A(()=>ks.config&&ks.config.LOGGING_RETENTION_DAYS);On(()=>{if(Y.refreshTick,Yo.page===`audit-logs`)return wr(()=>r())});function r(){let e=!1;return(async()=>{try{await ks.ensureLoaded()}finally{await BF.fetchAuditLog(!0),!e&&ks.liveLogsVisible()&&UC.ensureLiveLogs()}})(),()=>{e=!0,UC.stopLiveLogs()}}var i=fR(),a=P(i),o=P(a),s=I(P(o),2),c=e=>{iC(e,{copyId:`audit-retention-help-copy`,label:`retention help`,text:`If you want to change the retention period, set LOGGING_RETENTION_DAYS (env var) or logging.retention_days (config.yaml) and restart the gateway. Default is 30 days; 0 keeps audit logs forever.`,title:e=>{var t=aR(),r=P(t,!0),i=I(r),a=P(i,!0);D(i),Ve(),D(t),L((e,t)=>{H(r,e),H(a,t)},[()=>IP(R(n)),()=>LP(R(n))]),V(e,t)},$$slots:{title:!0}})},l=A(()=>FP(R(n)));U(s,e=>{R(l)&&e(c)}),D(o),D(a);var u=I(a,2);fl(P(u),{onchange:()=>BF.fetchAuditLog(!0)}),D(u);var d=I(u,2);Kc(d,{});var f=I(d,2),p=e=>{V(e,oR())},m=A(()=>ks.loaded&&!ks.auditVisible()&&!Y.needsAuth);U(f,e=>{R(m)&&e(p)});var h=I(f,2),g=P(h);HF(g,{});var _=I(g,2),v=P(_),y=P(v),b=e=>{var t=sR(),n=P(t);D(t),L(e=>H(n,`Showing ${BF.auditLog.offset+1}-${e??``} of ${BF.auditLog.total??``} + ${BF.auditGroupSessions?`sessions`:`logs`}`),[()=>Math.min(BF.auditLog.offset+BF.auditLog.limit,BF.auditLog.total)]),V(e,t)};U(y,e=>{BF.auditLog.total>0&&e(b)});var x=I(y,2),S=P(x);ea(S),Ve(2),D(x),D(v),qF(I(v,2),{}),D(_);var C=I(_,2),w=e=>{var t=cR();NS(P(t),{size:18,label:`Loading audit logs`}),D(t),V(e,t)},T=e=>{var t=uR();W(t,29,()=>BF.auditLog.entries,e=>e.id,(e,t)=>{var n=lR(),r=P(n),i=e=>{iR(e,{get entry(){return R(t)}})},a=e=>{QL(e,{get entry(){return R(t)}})};U(r,e=>{BF.auditGroupSessions?e(i):e(a,-1)}),D(n),Ei(n,()=>vP,()=>({duration:SP(150)})),Di(1,n,()=>CP,()=>({live:R(t)._live})),V(e,n)}),D(t),V(e,t)};U(C,e=>{BF.loading&&BF.auditLog.entries.length===0?e(w):BF.auditLog.entries.length>0&&e(T,1)});var E=I(C,2),ee=e=>{var t=dR();IS(P(t),{}),D(t),V(e,t)};U(E,e=>{BF.auditLog.entries.length===0&&!BF.loading&&!Y.needsAuth&&e(ee)}),oT(I(E,2),{get total(){return BF.auditLog.total},get offset(){return BF.auditLog.offset},get limit(){return BF.auditLog.limit},onprev:()=>BF.auditLogPrevPage(),onnext:()=>BF.auditLogNextPage()}),D(h),D(i),L(()=>na(S,BF.auditGroupSessions)),z(`change`,S,()=>BF.toggleAuditGroupSessions()),V(e,i),k()}Br([`change`]);function mR(e){try{let t=JSON.parse(JSON.stringify(e||{}));return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function hR(e){return Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(e=>e):e==null?[]:String(e).split(`,`).map(e=>e.trim()).filter(e=>e)}function gR(e,t){let n=String(t||``).trim();return(e||[]).find(e=>String(e&&e.type||``).trim()===n)||null}function _R(e){return Array.isArray(e)&&e.length>0&&String(e[0].type||``).trim()||`system_prompt`}function vR(e,t){let n=String(t||``).trim();return n&&gR(e,n)?n:_R(e)}function yR(e,t){let n=gR(e,t);return!n||!n.defaults?{}:mR(n.defaults)}function bR(e,t,n){return{...yR(e,n),...mR(t)}}function xR(e,t){let n=vR(e,t);return{name:``,type:n,description:``,user_path:``,config:yR(e,n)}}function SR(e,t){if(!t)return e||[];let n=String(t).toLowerCase();return(e||[]).filter(e=>[e.name,e.type,e.user_path,e.description,e.summary].some(e=>String(e||``).toLowerCase().includes(n)))}function CR(e,t){let n=gR(e,t);return n&&n.label?n.label:t||`Unknown`}function wR(e,t){let n=gR(e,t);return Array.isArray(n&&n.fields)?n.fields:[]}function TR(e,t){if(!t||!e)return t&&t.input===`checkboxes`?[]:``;let n=e[t.key];return n==null?t.input===`checkboxes`?[]:``:t.input===`checkboxes`?hR(n):n}function ER(e,t,n){if(!t)return e;let r=mR(e);if(t.input===`number`){let e=String(n||``).trim();if(e===``)delete r[t.key];else{let n=Number(e);r[t.key]=Number.isFinite(n)?n:e}}else t.input===`checkboxes`?r[t.key]=hR(n):r[t.key]=n;return r}function DR(e,t,n){return TR(e,t).includes(String(n||``).trim())}function OR(e,t,n,r){let i=hR(TR(e,t)),a=String(n||``).trim();return a?ER(e,t,r?Array.from(new Set([...i,a])):i.filter(e=>e!==a)):e}function kR(e){return{name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),description:String(e&&e.description||``).trim()||void 0,user_path:String(e&&e.user_path||``).trim()||void 0,config:mR(e&&e.config)}}var AR=new class{#e=j(N([]));get guardrails(){return R(this.#e)}set guardrails(e){M(this.#e,e,!0)}#t=j(N([]));get types(){return R(this.#t)}set types(e){M(this.#t,e,!0)}#n=j(!0);get available(){return R(this.#n)}set available(e){M(this.#n,e,!0)}#r=j(!1);get loading(){return R(this.#r)}set loading(e){M(this.#r,e,!0)}#i=j(!1);get typesLoading(){return R(this.#i)}set typesLoading(e){M(this.#i,e,!0)}#a=j(``);get error(){return R(this.#a)}set error(e){M(this.#a,e,!0)}#o=j(``);get filter(){return R(this.#o)}set filter(e){M(this.#o,e,!0)}#s=j(!1);get formOpen(){return R(this.#s)}set formOpen(e){M(this.#s,e,!0)}#c=j(!1);get formSubmitting(){return R(this.#c)}set formSubmitting(e){M(this.#c,e,!0)}#l=j(``);get deletingName(){return R(this.#l)}set deletingName(e){M(this.#l,e,!0)}#u=j(`create`);get formMode(){return R(this.#u)}set formMode(e){M(this.#u,e,!0)}#d=j(``);get formOriginalName(){return R(this.#d)}set formOriginalName(e){M(this.#d,e,!0)}#f=j(N({name:``,type:``,description:``,user_path:``,config:{}}));get form(){return R(this.#f)}set form(e){M(this.#f,e,!0)}get filtered(){return SR(this.guardrails,this.filter)}typeLabel(e){return CR(this.types,e)}typeFields(e){return wR(this.types,e)}fieldValue(e){return TR(this.form&&this.form.config,e)}setFieldValue(e,t){this.form={...this.form,config:ER(this.form.config,e,t)}}arrayFieldSelected(e,t){return DR(this.form&&this.form.config,e,t)}toggleArrayFieldValue(e,t,n){this.form={...this.form,config:OR(this.form.config,e,t,n)}}openCreate(){this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=xR(this.types,_R(this.types)),this.formOpen=!0}openEdit(e){let t=vR(this.types,e&&e.type);this.formMode=`edit`,this.formOriginalName=String(e&&e.name||``).trim(),this.error=``,this.form={name:this.formOriginalName,type:t,description:String(e&&e.description||``).trim(),user_path:String(e&&e.user_path||``).trim(),config:bR(this.types,e&&e.config,t)},this.formOpen=!0}closeForm(){this.formOpen=!1,this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=xR(this.types,_R(this.types))}changeType(e){let t=vR(this.types,e);this.form={...this.form,type:t,config:yR(this.types,t)}}async fetchTypes(){this.typesLoading=!0;try{let e=await kT(`/admin/guardrails/types`,{label:`guardrail types`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.types=[];return}if(e.result&&(this.available=!0),this.types=e.items,e.status===`error`){this.error=e.error;return}let t=vR(this.types,this.form.type);this.form={...this.form,type:t,config:bR(this.types,this.form.config,t)}}finally{this.typesLoading=!1}}async fetchGuardrails(){this.loading=!0,this.error=``;try{let e=await kT(`/admin/guardrails`,{label:`guardrails`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.guardrails=[];return}e.result&&(this.available=!0),this.guardrails=e.items,this.error=e.error}finally{this.loading=!1}}async fetchPage(){await Promise.all([this.fetchTypes(),this.fetchGuardrails()])}async submitForm(){let e=String(this.form.name||``).trim(),t=String(this.form.type||``).trim();if(!e){this.error=`Name is required.`;return}if(!t){this.error=`Type is required.`;return}this.error=``,this.formSubmitting=!0;let n=kR(this.form);try{let t=await AT(`/admin/guardrails`,`PUT`,n,{label:`save guardrail`,errorFallback:`Failed to save guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error;return}lc.success(`Guardrail "`+e+`" saved.`),this.closeForm(),this.fetchGuardrails()}finally{this.formSubmitting=!1}}async deleteGuardrail(e){let t=String(e&&e.name||``).trim();if(!(!t||this.deletingName)&&window.confirm(`Delete guardrail "`+t+`"? Workflows that still reference it must be updated first.`)){this.deletingName=t;try{let e=await AT(`/admin/guardrails`,`DELETE`,{name:t},{label:`delete guardrail`,errorFallback:`Failed to delete guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,lc.error(e.error);return}if(e.status===`error`){lc.error(e.error);return}lc.success(`Guardrail "`+t+`" deleted.`),this.formOpen&&this.formOriginalName===t&&this.closeForm(),this.fetchGuardrails()}finally{this.deletingName=``}}}},jR=B(`
`),MR=B(`

Loading guardrails...

`),NR=B(`
`),PR=B(`
`),FR=B(`
NameTypeUser PathSummaryActions
`),IR=B(`

No guardrails defined yet.

`),LR=B(`

Instances

Each instance has a reusable name, a type, an optional user path for + future UI visibility scoping, and a JSON-backed config payload for + that type.

`);function RR(e,t){O(t,!0);var n=LR(),r=P(n),i=I(P(r),2);J(P(i),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(i),D(r);var a=I(r,2),o=e=>{var t=jR(),n=P(t);jw(P(n),{id:`guardrail-filter`,placeholder:`Filter by name, type, user path, summary...`,label:`Guardrail filter`,get value(){return AR.filter},set value(e){AR.filter=e}}),D(n),D(t),V(e,t)};U(a,e=>{AR.available&&e(o)});var s=I(a,2),c=e=>{var t=MR();NS(P(t),{size:16,label:`Loading guardrails`}),Ve(),D(t),V(e,t)};U(s,e=>{AR.loading&&AR.filtered.length===0&&e(c)});var l=I(s,2),u=e=>{var t=FR(),n=P(t),r=I(P(n));W(r,21,()=>AR.filtered,e=>e.name,(e,t)=>{var n=PR(),r=P(n),i=P(r,!0);D(r);var a=I(r),o=P(a),s=P(o,!0);D(o),D(a);var c=I(a),l=P(c,!0);D(c);var u=I(c),d=P(u),f=P(d,!0);D(d);var p=I(d,2),m=e=>{var n=NR(),r=P(n,!0);D(n),L(()=>H(r,R(t).description)),V(e,n)};U(p,e=>{R(t).description&&e(m)}),D(u);var h=I(u),g=P(h),_=P(g);{let e=A(()=>`Edit guardrail `+R(t).name);OT(_,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>AR.openEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}var v=I(_,2);{let e=A(()=>(AR.deletingName===R(t).name?`Deleting guardrail `:`Delete guardrail `)+R(t).name),n=A(()=>AR.deletingName===R(t).name);OT(v,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>AR.deleteGuardrail(R(t)),get disabled(){return R(n)},children:(e,t)=>{J(e,{get icon(){return Lo},class:`table-icon-svg`})},$$slots:{default:!0}})}D(g),D(h),D(n),L(e=>{H(i,R(t).name),H(s,e),H(l,R(t).user_path||`—`),H(f,R(t).summary||R(t).description||`No summary yet.`)},[()=>AR.typeLabel(R(t).type)]),V(e,n)}),D(r),D(n),D(t),V(e,t)};U(l,e=>{AR.filtered.length>0&&e(u)});var d=I(l,2),f=e=>{V(e,IR())};U(d,e=>{AR.filtered.length===0&&!AR.loading&&AR.available&&!AR.error&&!Y.authError&&e(f)}),D(n),L(()=>i.disabled=AR.typesLoading||AR.formSubmitting||!AR.available),z(`click`,i,()=>AR.openCreate()),V(e,n),k()}Br([`click`]);var zR=B(`

Workflows reference these names directly, so renames are + intentionally avoided after creation.

`),BR=B(``),VR=B(``),HR=B(``),UR=B(``),WR=B(``),GR=B(``),KR=B(``),qR=B(``),JR=B(``),YR=B(`
`),XR=B(``),ZR=B(` `),QR=B(`
`),$R=B(`
`);function ez(e,t){O(t,!0);let n=A(()=>AR.formMode===`edit`);{let t=e=>{V(e,zR())},r=A(()=>R(n)?`Edit Guardrail`:`Create Guardrail`);ME(e,{get open(){return AR.formOpen},get title(){return R(r)},ariaLabel:`Guardrail editor`,get error(){return AR.error},get submitting(){return AR.formSubmitting},submitLabel:`Save Guardrail`,dialogClass:`settings-guardrails-editor guardrails-editor-wide`,onclose:()=>AR.closeForm(),onsubmit:()=>AR.submitForm(),headerHint:t,children:(e,t)=>{var r=$R(),i=P(r);PE(i,{id:`guardrail-name`,label:`Name`,children:(e,t)=>{var r=BR();ea(r),L(()=>{r.disabled=R(n),K(r,`data-modal-autofocus`,!R(n)||void 0)}),la(r,()=>AR.form.name,e=>AR.form.name=e),V(e,r)},$$slots:{default:!0}});var a=I(i,2);PE(a,{id:`guardrail-type`,label:`Type`,children:(e,t)=>{var r=HR();W(r,21,()=>AR.types,e=>e.type,(e,t)=>{var n=VR(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).type)&&(n.value=(n.__value=R(t).type)??``)}),V(e,n)}),D(r);var i;Hi(r),L(()=>{r.disabled=R(n),i!==(i=AR.form.type)&&(r.value=(r.__value=AR.form.type)??``,Vi(r,AR.form.type))}),z(`change`,r,e=>AR.changeType(e.currentTarget.value)),V(e,r)},$$slots:{default:!0}});var o=I(a,2);PE(o,{id:`guardrail-description`,label:`Description`,children:(e,t)=>{var r=UR();ea(r),L(()=>K(r,`data-modal-autofocus`,R(n)?!0:void 0)),la(r,()=>AR.form.description,e=>AR.form.description=e),V(e,r)},$$slots:{default:!0}});var s=I(o,2),c=P(s);iC(c,{copyId:`guardrail-user-path-help-copy`,label:`guardrail user path help`,text:`Only used for auxiliary rewrite (llm_based_altering) guardrails; ignored for other guardrail types.`,title:e=>{V(e,WR())},$$slots:{title:!0}});var l=I(c,2);ea(l),D(s),W(I(s,2),17,()=>AR.typeFields(AR.form.type),e=>e.key,(e,t)=>{var n=Xr(),r=F(n),i=e=>{var n=YR(),r=P(n);{let e=e=>{var n=GR(),r=P(n,!0);D(n),L(()=>{K(n,`for`,`guardrail-field-`+R(t).key),H(r,R(t).label)}),V(e,n)},n=A(()=>`guardrail-field-help-`+R(t).key),i=A(()=>R(t).label+` help`),a=A(()=>R(t).help||``);iC(r,{get copyId(){return R(n)},get label(){return R(i)},get text(){return R(a)},title:e,$$slots:{title:!0}})}var i=I(r,2),a=e=>{var n=KR();W(n,21,()=>R(t).options||[],e=>e.value,(e,t)=>{var n=VR(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n);var r;Hi(n),L(e=>{K(n,`id`,`guardrail-field-`+R(t).key),K(n,`aria-describedby`,R(t).help?`guardrail-field-help-`+R(t).key:void 0),r!==(r=e)&&(n.value=(n.__value=e)??``,Vi(n,e))},[()=>AR.fieldValue(R(t))]),z(`change`,n,e=>AR.setFieldValue(R(t),e.currentTarget.value)),V(e,n)},o=e=>{var n=qR();ut(n),L(e=>{K(n,`id`,`guardrail-field-`+R(t).key),K(n,`placeholder`,R(t).placeholder||``),ta(n,e),K(n,`aria-describedby`,R(t).help?`guardrail-field-help-`+R(t).key:void 0)},[()=>AR.fieldValue(R(t))]),z(`input`,n,e=>AR.setFieldValue(R(t),e.currentTarget.value)),V(e,n)},s=e=>{var n=JR();ea(n),L(e=>{K(n,`id`,`guardrail-field-`+R(t).key),K(n,`type`,R(t).input||`text`),K(n,`placeholder`,R(t).placeholder||``),ta(n,e),K(n,`aria-describedby`,R(t).help?`guardrail-field-help-`+R(t).key:void 0)},[()=>AR.fieldValue(R(t))]),z(`input`,n,e=>AR.setFieldValue(R(t),e.currentTarget.value)),V(e,n)};U(i,e=>{R(t).input===`select`?e(a):R(t).input===`textarea`?e(o,1):e(s,-1)}),D(n),V(e,n)},a=e=>{var n=QR(),r=P(n),i=P(r,!0);D(r);var a=I(r,2);W(a,21,()=>R(t).options||[],e=>R(t).key+`-`+e.value,(e,n)=>{var r=XR(),i=P(r);ea(i);var a=I(i,2),o=P(a,!0);D(a),D(r),L(e=>{na(i,e),H(o,R(n).label)},[()=>AR.arrayFieldSelected(R(t),R(n).value)]),z(`change`,i,e=>AR.toggleArrayFieldValue(R(t),R(n).value,e.currentTarget.checked)),V(e,r)}),D(a);var o=I(a,2),s=e=>{var n=ZR(),r=P(n,!0);D(n),L(()=>{K(n,`id`,`guardrail-field-help-`+R(t).key),H(r,R(t).help)}),V(e,n)};U(o,e=>{R(t).help&&e(s)}),D(n),L(()=>{K(n,`aria-describedby`,R(t).help?`guardrail-field-help-`+R(t).key:void 0),H(i,R(t).label)}),V(e,n)};U(r,e=>{R(t).input===`checkboxes`?e(a,-1):e(i)}),V(e,n)}),D(r),la(l,()=>AR.form.user_path,e=>AR.form.user_path=e),V(e,r)},$$slots:{headerHint:!0,default:!0}})}k()}Br([`change`,`input`]);var tz=B(`

Guardrails

`),nz=B(`
Runtime guardrail execution is currently off because GUARDRAILS_ENABLED is disabled. You can still manage + definitions here.
`),rz=B(`
Guardrails feature is unavailable.
`),iz=B(`
`),az=B(`

Reusable Policy Objects

Guardrail Library

Store guardrails in the database, keep them hot in memory, and attach + them to workflows by reference.

Instances
Types
`);function oz(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`guardrails`&&(ks.ensureLoaded(),AR.fetchPage())});var n=az(),r=P(n),i=P(r);iC(P(i),{copyId:`guardrails-help-copy`,label:`guardrails help`,text:`Reusable policy objects stored in the database and kept hot in memory for workflow execution.`,title:e=>{V(e,tz())},$$slots:{title:!0}}),D(i),D(r);var a=I(r,2),o=I(P(a),2),s=P(o),c=I(P(s),2),l=P(c,!0);D(c),D(s);var u=I(s,2),d=I(P(u),2),f=P(d,!0);D(d),D(u),D(o),D(a);var p=I(a,2);Kc(p,{});var m=I(p,2),h=e=>{V(e,nz())},g=A(()=>!ks.guardrailsVisible());U(m,e=>{R(g)&&e(h)});var _=I(m,2),v=e=>{V(e,rz())};U(_,e=>{!Y.authError&&!AR.available&&e(v)});var y=I(_,2),b=e=>{var t=iz(),n=P(t,!0);D(t),L(()=>H(n,AR.error)),V(e,t)};U(y,e=>{!Y.authError&&AR.error&&!AR.formOpen&&e(b)});var x=I(y,2);ez(x,{}),RR(I(x,2),{}),D(n),L((e,t)=>{H(l,e),H(f,t)},[()=>_c(AR.guardrails.length),()=>_c(AR.types.length)]),V(e,n),k()}var $=new class{#e=j(N([]));get servers(){return R(this.#e)}set servers(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get formOpen(){return R(this.#a)}set formOpen(e){M(this.#a,e,!0)}#o=j(!1);get formSubmitting(){return R(this.#o)}set formSubmitting(e){M(this.#o,e,!0)}#s=j(`create`);get formMode(){return R(this.#s)}set formMode(e){M(this.#s,e,!0)}#c=j(!1);get slugEdited(){return R(this.#c)}set slugEdited(e){M(this.#c,e,!0)}#l=j(!1);get advancedOpen(){return R(this.#l)}set advancedOpen(e){M(this.#l,e,!0)}#u=j(N(Sx()));get form(){return R(this.#u)}set form(e){M(this.#u,e,!0)}#d=j(``);get deletingName(){return R(this.#d)}set deletingName(e){M(this.#d,e,!0)}#f=j(``);get reconnectingName(){return R(this.#f)}set reconnectingName(e){M(this.#f,e,!0)}#p=j(!1);get catalogOpen(){return R(this.#p)}set catalogOpen(e){M(this.#p,e,!0)}#m=j(!1);get catalogLoading(){return R(this.#m)}set catalogLoading(e){M(this.#m,e,!0)}#h=j(``);get catalogError(){return R(this.#h)}set catalogError(e){M(this.#h,e,!0)}#g=j(N(Cx()));get catalog(){return R(this.#g)}set catalog(e){M(this.#g,e,!0)}#_=A(()=>Px(this.servers,this.filter));get filtered(){return R(this.#_)}set filtered(e){M(this.#_,e)}async fetchServers(){if(await ks.ensureLoaded(),!ks.mcpVisible()){this.available=!1,this.servers=[],this.error=``,this.loading=!1;return}this.loading=!0,this.error=``;try{let e=await kT(`/admin/mcp-servers`,{label:`mcp servers`,errorFallback:`Failed to load MCP servers.`,unavailableStatuses:[503,404]});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.servers=[];return}if(e.status===`error`){e.result&&(this.available=!0),this.servers=[],this.error=e.error;return}this.available=!0,this.servers=e.items}finally{this.loading=!1}}openCreate(){this.formMode=`create`,this.slugEdited=!1,this.advancedOpen=!1,this.error=``,this.form=Sx(),this.formOpen=!0}openEdit(e){!e||e.managed||(this.formMode=`edit`,this.slugEdited=!0,this.advancedOpen=!1,this.error=``,this.form=Fx(e),this.formOpen=!0)}closeForm(){this.formOpen=!1,this.formMode=`create`,this.slugEdited=!1,this.advancedOpen=!1,this.error=``,this.form=Sx()}syncSlugFromName(){this.formMode===`create`&&!this.slugEdited&&(this.form.slug=Ax(this.form.name))}markSlugEdited(){this.formMode===`create`&&(this.slugEdited=!0)}addHeader(){this.form.headers.push({name:``,value:``})}removeHeader(e){this.form.headers.splice(e,1)}async submitForm(){let e=Ix(this.form,this.formMode,this.servers);if(e.error){this.error=e.error;return}this.error=``,this.formSubmitting=!0;try{let t=await AT(`/admin/mcp-servers`,`PUT`,e.payload,{label:`save mcp server`,errorFallback:`Failed to save MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error;return}lc.success(`MCP server "`+e.payload.name+`" saved.`),this.closeForm(),this.fetchServers()}finally{this.formSubmitting=!1}}async deleteServer(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(!(!n||this.deletingName||e&&e.managed)&&confirm(`Delete MCP server "`+t+`"? Clients lose access to its tools immediately.`)){this.deletingName=n;try{let e=await AT(`/admin/mcp-servers/`+encodeURIComponent(n),`DELETE`,void 0,{label:`delete mcp server`,errorFallback:`Failed to delete MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,lc.error(e.error);return}if(e.status===`error`){lc.error(e.error);return}lc.success(`MCP server "`+t+`" deleted.`),this.formOpen&&this.form.slug===n&&this.closeForm(),this.fetchServers()}finally{this.deletingName=``}}}async reconnectServer(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(!(!n||this.reconnectingName)){this.reconnectingName=n;try{let e=await AT(`/admin/mcp-servers/`+encodeURIComponent(n)+`/reconnect`,`POST`,void 0,{label:`reconnect mcp server`,errorFallback:`Failed to reconnect MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,lc.error(e.error);return}if(e.status===`error`){lc.error(e.error);return}let r=e.result.data,i=Tx(r);i===`connected`?lc.success(`MCP server "`+t+`" reconnected.`):i===`disabled`?lc.success(`MCP server "`+t+`" is disabled; no connection was attempted.`):lc.error(`Reconnect attempted, but MCP server "`+t+`" is still `+i+`.`),r&&r.name?this.servers=(this.servers||[]).map(e=>wx(e)===wx(r)?r:e):this.fetchServers()}finally{this.reconnectingName=``}}}async openCatalog(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(n){this.catalogOpen=!0,this.catalogLoading=!0,this.catalogError=``,this.catalog={...Cx(),server:n,status:Tx(e)};try{let e=await ws(`/admin/mcp-servers/`+encodeURIComponent(n)+`/catalog`,{label:`mcp server catalog`});if(e.stale)return;if(e.status===503){this.available=!1,this.catalogError=`MCP server management is unavailable.`;return}if(e.status===404){this.catalogError=`MCP server "`+t+`" was not found.`;return}if(!e.ok){this.catalogError=e.status===401?`Authentication required.`:ys(e.data,`Failed to load MCP server catalog.`);return}this.catalog=Lx(n,e.data)}catch(e){console.error(`Failed to load MCP server catalog:`,e),this.catalogError=`Failed to load MCP server catalog.`}finally{this.catalogLoading=!1}}}closeCatalog(){this.catalogOpen=!1,this.catalogLoading=!1,this.catalogError=``,this.catalog=Cx()}},sz=B(``),cz=B(`

`),lz=B(`
`),uz=B(`

`),dz=B(`
  • `),fz=B(`

      `),pz=B(`

      No tools listed — the server may still be connecting or degraded.

      `),mz=B(` `,1),hz=B(``);function gz(e,t){O(t,!0);let n=A(()=>zx($.catalog));Hs(e,{get open(){return $.catalogOpen},variant:`editor`,onclose:()=>$.closeCatalog(),children:(e,t)=>{var r=hz(),i=P(r),a=P(i),o=I(P(a),2),s=P(o),c=P(s,!0);D(s);var l=I(s,2),u=P(l,!0);D(l),D(o),D(a),Rs(I(a,2),{label:`Close MCP server catalog`,onclick:()=>$.closeCatalog()}),D(i);var d=I(i,2),f=e=>{ET(e,{label:`Loading catalog...`})},p=e=>{var t=sz(),n=P(t,!0);D(t),L(()=>H(n,$.catalogError)),V(e,t)},m=e=>{var t=mz(),r=F(t),i=e=>{var t=cz(),n=P(t,!0);D(t),L(()=>H(n,$.catalog.instructions)),V(e,t)};U(r,e=>{$.catalog.instructions&&e(i)});var a=I(r,2);W(a,17,()=>R(n),e=>e.key,(e,t)=>{var n=fz(),r=P(n),i=P(r,!0);D(r);var a=I(r,2);W(a,21,()=>R(t).items,e=>e.key,(e,t)=>{var n=dz(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=e=>{var n=lz(),r=P(n,!0);D(n),L(()=>{K(n,`title`,`Exposed on the aggregated /mcp endpoint as `+R(t).aggregated),H(r,R(t).aggregated)}),V(e,n)};U(a,e=>{R(t).aggregated&&e(o)});var s=I(a,2),c=e=>{var n=uz(),r=P(n,!0);D(n),L(()=>H(r,R(t).description)),V(e,n)};U(s,e=>{R(t).description&&e(c)}),D(n),L(()=>{K(r,`title`,R(t).aggregated||R(t).name),H(i,R(t).name)}),V(e,n)}),D(a),D(n),L(()=>H(i,R(t).title)),V(e,n)});var o=I(a,2),s=e=>{V(e,pz())},c=A(()=>Bx($.catalog));U(o,e=>{R(c)&&e(s)}),V(e,t)};U(d,e=>{$.catalogLoading?e(f):$.catalogError?e(p,1):e(m,-1)});var h=I(d,2),g=P(h);D(h),D(r),L((e,t)=>{H(c,$.catalog.server),G(l,1,`audit-status-badge ${e??``}`,`svelte-1xqrzco`),H(u,t)},[()=>Ex($.catalog),()=>Tx($.catalog)]),z(`click`,g,()=>$.closeCatalog()),V(e,r)},$$slots:{default:!0}}),k()}Br([`click`]);var _z=B(`

      The display name can change. The slug is the stable client-facing identity.

      `),vz=B(` Human-readable and Unicode-friendly. You can change it later.`,1),yz=B(`Derived from the name. You may edit it before saving.`),bz=B(`Immutable because it is used in URLs, scope headers, and aggregated tool names.`),xz=B(` `,1),Sz=B(` stdio servers are config-only: declare them in config.yaml under mcp.servers.`,1),Cz=B(``),wz=B(`
      `),Tz=B(`
      Headers
      Sent only to the configured server origin. Saved values are shown as ***; leave *** unchanged to keep the stored value.
      Advanced settings Description, access rules, and timeout
      `,1);function Ez(e,t){O(t,!0);{let t=e=>{V(e,_z())},n=A(()=>$.formMode===`edit`?`Edit MCP Server`:`Add MCP Server`);ME(e,{get open(){return $.formOpen},get title(){return R(n)},ariaLabel:`MCP server editor`,get error(){return $.error},get submitting(){return $.formSubmitting},onclose:()=>$.closeForm(),onsubmit:()=>$.submitForm(),headerHint:t,children:(e,t)=>{var n=Tz(),r=F(n);PE(r,{id:`mcp-server-name`,label:`Name`,children:(e,t)=>{var n=vz(),r=F(n);ea(r),Ve(2),z(`input`,r,()=>$.syncSlugFromName()),la(r,()=>$.form.name,e=>$.form.name=e),V(e,n)},$$slots:{default:!0}});var i=I(r,2);PE(i,{id:`mcp-server-slug`,label:`Slug`,children:(e,t)=>{var n=xz(),r=F(n);ea(r);var i=I(r,2),a=e=>{V(e,yz())},o=e=>{V(e,bz())};U(i,e=>{$.formMode===`create`?e(a):e(o,-1)}),L(()=>r.disabled=$.formMode===`edit`),z(`input`,r,()=>$.markSlugEdited()),la(r,()=>$.form.slug,e=>$.form.slug=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2);PE(a,{id:`mcp-server-transport`,label:`Transport`,children:(e,t)=>{var n=Sz(),r=F(n),i=P(r);i.value=i.__value=`http`;var a=I(i);a.value=a.__value=`sse`,D(r),Ve(2),Ui(r,()=>$.form.transport,e=>$.form.transport=e),V(e,n)},$$slots:{default:!0}});var o=I(a,2);PE(o,{id:`mcp-server-url`,label:`URL`,children:(e,t)=>{var n=Cz();ea(n),la(n,()=>$.form.url,e=>$.form.url=e),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=I(P(s),2);W(c,21,()=>$.form.headers,ii,(e,t,n)=>{var r=wz(),i=P(r);ea(i);var a=I(i,2);ea(a),OT(I(a,2),{label:`Remove header`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>$.removeHeader(n),children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}}),D(r),la(i,()=>R(t).name,e=>R(t).name=e),la(a,()=>R(t).value,e=>R(t).value=e),V(e,r)}),D(c);var l=I(c,2),u=P(l);J(P(u),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(u),D(l),Ve(2),D(s);var d=I(s,2),f=P(d);PA(P(f),{get enabled(){return $.form.enabled},label:`MCP server`,onclick:()=>$.form.enabled=!$.form.enabled}),D(f),D(d);var p=I(d,2),m=I(P(p),2),h=P(m),g=I(P(h),2);ea(g),D(h);var _=I(h,2),v=I(P(_),2);ea(v),D(_);var y=I(_,2),b=I(P(y),2);ea(b),D(y);var x=I(y,2),S=I(P(x),2);ut(S),K(S,`placeholder`,`/ +/team/alpha`),D(x);var C=I(x,2),w=I(P(C),2);ea(w),D(C),D(m),D(p),L(()=>p.open=$.advancedOpen),z(`click`,u,()=>$.addHeader()),zr(`toggle`,p,e=>$.advancedOpen=e.currentTarget.open),la(g,()=>$.form.description,e=>$.form.description=e),la(v,()=>$.form.allowed_tools,e=>$.form.allowed_tools=e),la(b,()=>$.form.disallowed_tools,e=>$.form.disallowed_tools=e),la(S,()=>$.form.user_paths,e=>$.form.user_paths=e),la(w,()=>$.form.tool_timeout_seconds,e=>$.form.tool_timeout_seconds=e),V(e,n)},$$slots:{headerHint:!0,default:!0}})}k()}Br([`input`,`click`]);var Dz=B(`Config`),Oz=B(`
      `),kz=B(`
      `),Az=B(`
      NameTransportEndpointStatusToolsEnabledActions
      `);function jz(e,t){O(t,!0);function n(e){return Dx(e,e=>vs.formatTimestamp(e))}var r=Az(),i=P(r),a=I(P(i));W(a,21,()=>$.filtered,e=>wx(e),(e,t)=>{var r=kz(),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=e=>{V(e,Dz())};U(s,e=>{R(t).managed&&e(c)});var l=I(s,2),u=P(l,!0);D(l),D(i);var d=I(i),f=P(d),p=P(f,!0);D(f),D(d);var m=I(d),h=P(m,!0);D(m);var g=I(m),_=P(g),v=P(_,!0);D(_);var y=I(_,2),b=e=>{var n=Oz(),r=P(n,!0);D(n),L(()=>H(r,R(t).last_error)),V(e,n)},x=A(()=>Tx(R(t))===`degraded`&&R(t).last_error);U(y,e=>{R(x)&&e(b)}),D(g);var S=I(g),C=P(S),w=P(C,!0);D(C);var T=I(C,2),E=P(T,!0);D(T),D(S);var ee=I(S),te=P(ee),ne=P(te,!0);D(te),D(ee);var re=I(ee),ie=P(re),ae=P(ie),oe=e=>{{let n=A(()=>`Edit MCP server `+R(t).name);OT(e,{get label(){return R(n)},class:`table-icon-btn`,onclick:()=>$.openEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(ae,e=>{R(t).managed||e(oe)});var se=I(ae,2);{let e=A(()=>`Inspect catalog of MCP server `+R(t).name);OT(se,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>$.openCatalog(R(t)),children:(e,t)=>{J(e,{get icon(){return ro},class:`form-action-icon`})},$$slots:{default:!0}})}var ce=I(se,2);{let e=A(()=>($.reconnectingName===wx(R(t))?`Reconnecting MCP server `:`Reconnect MCP server `)+R(t).name),n=A(()=>$.reconnectingName===wx(R(t)));OT(ce,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>$.reconnectServer(R(t)),get disabled(){return R(n)},children:(e,t)=>{J(e,{get icon(){return ho},class:`form-action-icon`})},$$slots:{default:!0}})}var le=I(ce,2),ue=e=>{{let n=A(()=>($.deletingName===wx(R(t))?`Deleting MCP server `:`Delete MCP server `)+R(t).name),r=A(()=>$.deletingName===wx(R(t)));OT(e,{get label(){return R(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>$.deleteServer(R(t)),get disabled(){return R(r)},children:(e,t)=>{J(e,{get icon(){return Lo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(le,e=>{R(t).managed||e(ue)}),D(ie),D(re),D(r),L((e,n,r,i,a,s,c,l)=>{H(o,R(t).name),H(u,e),H(p,R(t).transport||`http`),K(m,`title`,n),H(h,r),G(_,1,`audit-status-badge ${i??``}`,`svelte-ah8nrt`),K(_,`title`,a),H(v,s),H(w,c),H(E,l),G(te,1,Ni([`auth-key-status-badge`,R(t).enabled?`auth-key-status-active`:`auth-key-status-inactive`])),H(ne,R(t).enabled?`Enabled`:`Disabled`)},[()=>wx(R(t)),()=>Ox(R(t)),()=>Ox(R(t)),()=>Ex(R(t)),()=>n(R(t)),()=>Tx(R(t)),()=>_c(R(t).tool_count||0),()=>kx(R(t))]),V(e,r)}),D(a),D(i),D(r),V(e,r),k()}var Mz=B(`

      MCP Servers

      `),Nz=B(``),Pz=B(`
      MCP server management is unavailable.
      `),Fz=B(``),Iz=B(`
      `),Lz=B(`

      No MCP servers yet. Add one here, or declare servers in config.yaml under mcp.servers.

      `),Rz=B(`

      No MCP servers match your filter.

      `),zz=B(`
      `);function Bz(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`mcp-servers`&&$.fetchServers()});var n=zz(),r=P(n),i=P(r);iC(P(i),{copyId:`mcp-servers-help-copy`,label:`MCP servers help`,text:`Upstream Model Context Protocol servers whose tools, prompts, and resources the gateway exposes to clients. Servers added here connect over HTTP or SSE; stdio servers and rows marked Config are declared in config.yaml under mcp.servers and are read-only in the dashboard. Saved header values are masked in API and dashboard responses.`,title:e=>{V(e,Mz())},$$slots:{title:!0}}),D(i);var a=I(i,2),o=P(a),s=e=>{var t=Nz();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=$.formSubmitting),z(`click`,t,()=>$.openCreate()),V(e,t)};U(o,e=>{$.available&&!Y.authError&&e(s)}),D(a),D(r);var c=I(r,2),l=e=>{V(e,Pz())};U(c,e=>{!$.available&&!Y.authError&&e(l)});var u=I(c,2),d=e=>{var t=Fz(),n=P(t,!0);D(t),L(()=>H(n,$.error)),V(e,t)};U(u,e=>{$.error&&!Y.authError&&!$.formOpen&&e(d)});var f=I(u,2),p=e=>{ET(e,{label:`Loading MCP servers...`})};U(f,e=>{$.loading&&!Y.authError&&e(p)});var m=I(f,2),h=e=>{var t=Iz(),n=P(t);jw(P(n),{id:`mcp-server-filter`,placeholder:`Filter by name, slug, URL, transport, or status...`,label:`Filter MCP servers by name, slug, URL, transport, or status`,get value(){return $.filter},set value(e){$.filter=e}}),D(n),D(t),V(e,t)};U(m,e=>{($.servers.length>0||$.filter)&&$.available&&!Y.authError&&e(h)});var g=I(m,2);Ez(g,{});var _=I(g,2);gz(_,{});var v=I(_,2),y=e=>{jz(e,{})};U(v,e=>{$.filtered.length>0&&$.available&&!Y.authError&&e(y)});var b=I(v,2),x=e=>{V(e,Lz())};U(b,e=>{$.servers.length===0&&!$.filter&&!$.loading&&!Y.authError&&!$.error&&$.available&&e(x)});var S=I(b,2),C=e=>{V(e,Rz())};U(S,e=>{$.servers.length>0&&$.filtered.length===0&&$.filter&&!$.loading&&!Y.authError&&$.available&&e(C)}),D(n),V(e,n),k()}Br([`click`]);var Vz=`api_keys`,Hz=`session_sticky_keys`,Uz=`base_url`,Wz=`service_account_json`,Gz=`models`,Kz={[Vz]:{label:`API Keys`,control:`keys`,hint:`Identified sessions stay on one key by default, improving provider prompt-cache hits. Saved values are shown as ***********; leave the asterisks unchanged to keep the stored key.`},[Hz]:{label:`Session-sticky API keys`,control:`checkbox`,hint:`Keep each identified conversation on one API key to preserve provider prompt-cache affinity. Turn off to rotate keys round-robin on every request.`},[Uz]:{label:`Base URL`,control:`text`},api_version:{label:`API Version`,control:`text`,placeholder:`e.g. 2024-10-01-preview`,hint:`Leave empty for the provider default. Realtime endpoints may need a newer version.`},backend:{label:`Backend`,control:`select`,hint:`Which Google surface to call. Vertex authenticates with Google credentials instead of an API key.`},auth_type:{label:`Auth Type`,control:`select`,hint:`How to obtain Google credentials. Leave on the default to use Application Default Credentials.`},api_mode:{label:`API Mode`,control:`select`,hint:`Which request shape to send upstream.`},vertex_project:{label:`Vertex Project`,control:`text`,placeholder:`my-gcp-project`},vertex_location:{label:`Vertex Location`,control:`text`,placeholder:`us-central1`},service_account_file:{label:`Service Account File`,control:`text`,placeholder:`/path/to/service-account.json`,hint:`Path readable by the gateway process.`},[Wz]:{label:`Service Account JSON`,control:`textarea`,placeholder:`Paste service account JSON`,hint:`Saved values are shown as ***********; leave the asterisks unchanged to keep the stored value, or clear it to remove.`},service_account_json_base64:{label:`Service Account JSON (base64)`,control:`text`,hint:`Saved values are shown as ***********; leave the asterisks unchanged to keep the stored value.`},gcp_scope:{label:`GCP Scope`,control:`text`,placeholder:`https://www.googleapis.com/auth/cloud-platform`},[Gz]:{label:`Models (comma-separated)`,control:`text`,placeholder:`gpt-4o, gpt-4o-mini`,hint:`Leave empty to auto-discover models from the provider's /models endpoint where supported.`}};function qz(e){return Kz[e]||{label:String(e||``).split(`_`).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),control:`text`}}function Jz(){return{name:``,type:``,api_keys:[],session_sticky_keys:!0,base_url:``,api_version:``,backend:``,auth_type:``,api_mode:``,vertex_project:``,vertex_location:``,service_account_file:``,service_account_json:``,service_account_json_base64:``,gcp_scope:``,models:``,enabled:!0}}function Yz(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.type,e.base_url].some(e=>String(e||``).toLowerCase().includes(r)))}function Xz(e,t){let n=(Array.isArray(e)?e:[]).map(e=>String(e&&e.type||``).trim()).filter(Boolean),r=String(t||``).trim();return r&&!n.includes(r)&&n.push(r),n}function Zz(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>String(e&&e.type||``).trim()===n)||null}function Qz(e,t){let n=e&&Array.isArray(e.fields)&&e.fields.length>0?e.fields:Object.keys(Kz).map(e=>({name:e,advanced:e!==Vz})),r=t||e&&e.default_base_url||``,i=[],a=[];for(let e of n){let t=String(e&&e.name||``).trim();if(!t)continue;let n={...qz(t),name:t,required:!!(e&&e.required),options:Array.isArray(e&&e.options)?e.options:[]};t===`base_url`&&r&&(n.placeholder=r,n.hint=`Defaults to `+r),n.options.length>0&&(n.control=`select`),(e&&e.advanced?a:i).push(n)}return{primary:i,advanced:a}}var $z=new Set([`name`,`type`,`enabled`]);function eB(e,t){let n=new Set([...t.primary||[],...t.advanced||[]].map(e=>e.name)),r=Jz(),i={...e};for(let e of Object.keys(r))!$z.has(e)&&!n.has(e)&&(i[e]=r[e]);return i}function tB(e){let t=Array.isArray(e&&e.api_keys)?e.api_keys.length:0;return t>0?t+` key`+(t===1?``:`s`):String(e&&e.service_account_json||``).trim()||String(e&&e.service_account_json_base64||``).trim()||String(e&&e.service_account_file||``).trim()?`service account`:String(e&&e.vertex_project||``).trim()?`ADC`:`keyless`}function nB(e){let t=Array.isArray(e&&e.models)?e.models:[];return t.length===0?`auto-discovered`:t.length+` model`+(t.length===1?``:`s`)}function rB(e){return(Array.isArray(e)?e:[]).map(e=>({value:String(e||``)}))}function iB(e){return(Array.isArray(e)?e:[]).map(e=>String(e&&e.value||``))}function aB(e,t){let n=String(t||``).trim();if(!n)return``;let r=new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.name||``).trim()));if(!r.has(n))return n;let i=1;for(;r.has(n+`-`+i);)i+=1;return n+`-`+i}function oB(e){return{name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),api_keys:rB(e&&e.api_keys),session_sticky_keys:!e||e.session_sticky_keys!==!1,base_url:String(e&&e.base_url||``),api_version:String(e&&e.api_version||``),backend:String(e&&e.backend||``),auth_type:String(e&&e.auth_type||``),api_mode:String(e&&e.api_mode||``),vertex_project:String(e&&e.vertex_project||``),vertex_location:String(e&&e.vertex_location||``),service_account_file:String(e&&e.service_account_file||``),service_account_json:String(e&&e.service_account_json||``),service_account_json_base64:String(e&&e.service_account_json_base64||``),gcp_scope:String(e&&e.gcp_scope||``),models:(Array.isArray(e&&e.models)?e.models:[]).join(`, `),enabled:!e||e.enabled!==!1}}function sB(e){let t=String(e||``).trim();return t.length>=3&&/^\*+$/.test(t)}function cB(e,t,n,r){let i={},a=String(e&&e.name||``).trim();String(e&&e.type||``).trim()||(i.type=`Select a provider type.`),a?a.includes(`/`)?i.name=`Name cannot contain '/' — it separates the provider from the model.`:t===`create`&&(Array.isArray(n)?n:[]).some(e=>String(e&&e.name||``).trim()===a)&&(i.name=`Provider "`+a+`" already exists.`):i.name=`Name is required.`;let{primary:o,advanced:s}=Qz(r);for(let t of[...o,...s]){let n=lB(e,t);n&&(i[t.name]=n)}return i}function lB(e,t){if(t.name===`api_keys`){let n=iB(e&&e.api_keys);return t.required&&!n.some(e=>e.trim())?`At least one API key is required for this provider type.`:n.some(e=>!e.trim())?`Remove the empty row instead of leaving a key blank.`:``}let n=String(e&&e[t.name]||``).trim();if(t.required&&!n)return t.label+` is required for this provider type.`;if(!n)return``;if(t.name===`base_url`&&!n.includes(`://`)&&/[./]/.test(n))return`Include the scheme, e.g. https://`+n;if(t.name===`service_account_json`&&!sB(n))try{JSON.parse(n)}catch{return`Paste the service account JSON file's contents — this is not valid JSON.`}return``}function uB(e,t){let n={name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),enabled:!!(e&&e.enabled)},{primary:r,advanced:i}=Qz(t),a=!!(t&&Array.isArray(t.fields)&&t.fields.length>0),o=new Set;for(let t of[...r,...i])!a&&t.name===`session_sticky_keys`||(o.add(t.name),n[t.name]=dB(e,t.name));for(let t of Object.keys(Kz)){if(o.has(t)||t===`session_sticky_keys`)continue;let r=dB(e,t);(Array.isArray(r)?r.length>0:String(r).trim()!==``)&&(n[t]=r)}return n}function dB(e,t){switch(t){case Vz:return iB(e&&e.api_keys);case Gz:return hc(e&&e.models);case Hz:return!!(e&&e.session_sticky_keys);case Wz:return e&&e.service_account_json||``;default:return String(e&&e[t]||``).trim()}}var fB=new class{#e=j(N([]));get rows(){return R(this.#e)}set rows(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get formOpen(){return R(this.#a)}set formOpen(e){M(this.#a,e,!0)}#o=j(!1);get formSubmitting(){return R(this.#o)}set formSubmitting(e){M(this.#o,e,!0)}#s=j(`create`);get formMode(){return R(this.#s)}set formMode(e){M(this.#s,e,!0)}#c=j(!1);get advancedOpen(){return R(this.#c)}set advancedOpen(e){M(this.#c,e,!0)}#l=j(N(Jz()));get form(){return R(this.#l)}set form(e){M(this.#l,e,!0)}#u=j(N({}));get fieldErrors(){return R(this.#u)}set fieldErrors(e){M(this.#u,e,!0)}#d=j(``);get focusField(){return R(this.#d)}set focusField(e){M(this.#d,e,!0)}#f=j(``);get deletingName(){return R(this.#f)}set deletingName(e){M(this.#f,e,!0)}#p=j(!1);get deleteSubmitting(){return R(this.#p)}set deleteSubmitting(e){M(this.#p,e,!0)}#m=j(N([]));get types(){return R(this.#m)}set types(e){M(this.#m,e,!0)}#h=j(!1);get typesLoaded(){return R(this.#h)}set typesLoaded(e){M(this.#h,e,!0)}#g=null;get filteredRows(){return Yz(this.rows,this.filter)}get schema(){return Zz(this.types,this.form.type)}get formFields(){if(!String(this.form.type||``).trim())return{primary:[],advanced:[]};let e=this.schema;return Qz(e,e&&e.default_base_url)}async fetchTypes(){let e=await kT(`/admin/provider-credentials/types`,{label:`provider credential types`});e.status===`ok`&&(this.types=e.items,this.typesLoaded=!0)}async fetchPage(){this.#g&&this.#g.abort();let e=new AbortController;this.#g=e,this.loading=!0,this.error=``;try{let t=await kT(`/admin/provider-credentials`,{label:`provider credentials`,errorFallback:`Failed to load provider credentials.`,unavailableStatuses:[503,404],options:{signal:e.signal}});if(t.status===`stale`||e.signal.aborted)return;if(t.status===`unavailable`){this.available=!1,this.rows=[];return}if(t.status===`error`){t.result&&(this.available=!0),this.rows=[],this.error=t.error;return}this.available=!0,this.rows=t.items,this.typesLoaded||await this.fetchTypes()}finally{this.#g===e&&(this.#g=null,this.loading=!1)}}#_(e,t){this.formMode=e,this.form=t,this.advancedOpen=!1,this.error=``,this.fieldErrors={},this.focusField=``}openCreate(){this.#_(`create`,Jz()),this.formOpen=!0,this.typesLoaded||this.fetchTypes()}openEdit(e){!e||e.managed||(this.#_(`edit`,oB(e)),this.formOpen=!0,this.typesLoaded||this.fetchTypes())}closeForm(){this.formOpen=!1,this.#_(`create`,Jz())}selectType(){this.fieldErrors={};let e=this.formFields;this.formMode===`create`&&(this.form=eB(this.form,e));let t=e.primary.find(e=>e.name===`api_keys`);t&&t.required&&this.form.api_keys.length===0&&(this.form.api_keys=[{value:``}])}clearFieldError(e){if(this.fieldErrors[e]===void 0)return;let{[e]:t,...n}=this.fieldErrors;this.fieldErrors=n}addApiKeyRow(){this.form.api_keys.push({value:``}),this.clearFieldError(`api_keys`)}removeApiKeyRow(e){this.form.api_keys.splice(e,1),this.clearFieldError(`api_keys`)}#v(e){let t=ys(e,`Failed to save provider credential.`),n=String(e&&e.error&&typeof e.error==`object`&&e.error.param||``).trim();if(n&&this.#y(n)){this.fieldErrors={...this.fieldErrors,[n]:t},this.error=``,this.#b();return}this.error=t}#y(e){if(e===`name`||e===`type`)return!0;let{primary:t,advanced:n}=this.formFields;return[...t,...n].some(t=>t.name===e)}#b(){let e=Object.keys(this.fieldErrors);if(e.length===0)return;let{primary:t,advanced:n}=this.formFields;n.some(t=>e.includes(t.name))&&(this.advancedOpen=!0);let r=[`type`,`name`,...t.map(e=>e.name),...n.map(e=>e.name)];this.focusField=r.find(t=>e.includes(t))||e[0]}#x(){Wc.fetchModels(),Wc.fetchCategories()}async submitForm(){let e=this.schema,t=cB(this.form,this.formMode,this.rows,e);if(Object.keys(t).length>0){this.fieldErrors=t,this.error=``,this.#b();return}let n=uB(this.form,e);this.error=``,this.fieldErrors={},this.formSubmitting=!0;try{let e=await AT(`/admin/provider-credentials`,`PUT`,n,{label:`save provider credential`,errorFallback:`Failed to save provider credential.`,unavailableMessage:`Provider credential management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.error=e.error;return}if(e.status===`error`){e.result&&e.result.status!==401?this.#v(e.result.data):this.error=e.error;return}lc.success(`Provider "`+n.name+`" saved.`),this.closeForm(),this.#x(),this.fetchPage()}finally{this.formSubmitting=!1}}async performDelete(e){this.deleteSubmitting=!0,this.deletingName=e;try{let t=await AT(`/admin/provider-credentials/`+encodeURIComponent(e),`DELETE`,void 0,{label:`delete provider credential`,errorFallback:`Failed to delete provider credential.`,unavailableMessage:`Provider credential management is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,Js.error=t.error;return}if(t.status===`error`){Js.error=t.error;return}lc.success(`Provider "`+e+`" deleted.`),Js.close(),this.formOpen&&this.form.name===e&&this.closeForm(),this.#x(),this.fetchPage()}finally{this.deleteSubmitting=!1,this.deletingName=``}}requestDelete(e){let t=String(e||``).trim();if(!t||this.deleteSubmitting)return;let n=(this.rows||[]).find(e=>String(e&&e.name||``).trim()===t);n&&n.managed||Js.open({title:`Delete Provider`,titleId:`providerCredentialDeleteDialogTitle`,inputId:`provider-credential-delete-confirmation`,message:`Type "`+t+`" to permanently delete this provider credential. Requests routed to it will fail until it is reconfigured.`,requiredText:t,confirmLabel:`Delete Provider`,icon:Ao,dialogClass:`budget-reset-dialog`,onConfirm:()=>this.performDelete(t)})}},pB=B(`Config`),mB=B(` `,1),hB=B(`
      `),gB=B(`
      NameTypeBase URLAuthModelsEnabledUpdatedActions
      `);function _B(e,t){O(t,!0);var n=gB(),r=P(n),i=I(P(r));W(i,21,()=>fB.filteredRows,e=>e.name,(e,t)=>{var n=hB(),r=P(n),i=P(r),a=P(i,!0);D(i);var o=I(i,2),s=e=>{V(e,pB())};U(o,e=>{R(t).managed&&e(s)}),D(r);var c=I(r),l=P(c),u=P(l,!0);D(l),D(c);var d=I(c),f=P(d,!0);D(d);var p=I(d),m=P(p,!0);D(p);var h=I(p),g=P(h,!0);D(h);var _=I(h),v=P(_);let y;var b=P(v,!0);D(v),D(_);var x=I(_),S=P(x,!0);D(x);var C=I(x),w=P(C),T=P(w),E=e=>{var n=mB(),r=F(n);{let e=A(()=>`Edit provider `+R(t).name);OT(r,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>fB.openEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}var i=I(r,2);{let e=A(()=>(fB.deletingName===R(t).name?`Deleting provider `:`Delete provider `)+R(t).name),n=A(()=>fB.deletingName===R(t).name);OT(i,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>fB.requestDelete(R(t).name),get disabled(){return R(n)},children:(e,t)=>{J(e,{get icon(){return Lo},class:`table-icon-svg`})},$$slots:{default:!0}})}V(e,n)};U(T,e=>{R(t).managed||e(E)}),D(w),D(C),D(n),L((e,n,r)=>{H(a,R(t).name),H(u,R(t).type),K(d,`title`,R(t).base_url||``),H(f,R(t).base_url||`—`),H(m,e),H(g,n),y=G(v,1,`auth-key-status-badge`,null,y,{"auth-key-status-active":R(t).enabled,"auth-key-status-inactive":!R(t).enabled}),H(b,R(t).enabled?`Enabled`:`Disabled`),H(S,r)},[()=>tB(R(t)),()=>nB(R(t)),()=>vs.formatTimestamp(R(t).updated_at)]),V(e,n)}),D(i),D(r),D(n),V(e,n),k()}var vB=B(``),yB=B(`
      `),bB=B(`
      `,1),xB=B(``),SB=B(``),CB=B(``),wB=B(``),TB=B(``),EB=B(` `),DB=B(` `),OB=B(`
      `);function kB(e,t){O(t,!0);let n=A(()=>`provider-credential-`+t.field.name),r=A(()=>fB.fieldErrors[t.field.name]||``),i=A(()=>R(r)?R(n)+`-error`:t.field.hint?R(n)+`-hint`:void 0),a=A(()=>{let e=String(fB.form[t.field.name]||``).trim();return!e||t.field.options.includes(e)?t.field.options:[...t.field.options,e]});function o(){fB.clearFieldError(t.field.name)}var s=OB(),c=P(s),l=P(c),u=I(l),d=e=>{V(e,vB())};U(u,e=>{t.field.required&&e(d)}),D(c);var f=I(c,2),p=e=>{var t=bB(),a=F(t);W(a,21,()=>fB.form.api_keys,ii,(e,t,a)=>{var s=yB(),c=P(s);ea(c),K(c,`aria-label`,`API key `+(a+1)),OT(I(c,2),{label:`Remove API key `+(a+1),class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>fB.removeApiKeyRow(a),children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}}),D(s),L(()=>{K(c,`id`,a===0?R(n):R(n)+`-`+a),K(c,`aria-invalid`,R(r)?`true`:void 0),K(c,`aria-describedby`,a===0?R(i):void 0)}),z(`input`,c,o),la(c,()=>R(t).value,e=>R(t).value=e),V(e,s)}),D(a);var s=I(a,2),c=P(s);J(P(c),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(c),D(s),L(()=>K(c,`id`,fB.form.api_keys.length===0?R(n):void 0)),z(`click`,c,()=>fB.addApiKeyRow()),V(e,t)},m=e=>{var s=SB(),c=P(s);c.value=c.__value=``,W(I(c),16,()=>R(a),e=>e,(e,t)=>{var n=xB(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(s),L(()=>{K(s,`id`,R(n)),K(s,`aria-invalid`,R(r)?`true`:void 0),K(s,`aria-describedby`,R(i))}),z(`change`,s,o),Ui(s,()=>fB.form[t.field.name],e=>fB.form[t.field.name]=e),V(e,s)},h=e=>{var a=CB();ea(a),L(()=>{K(a,`id`,R(n)),K(a,`aria-invalid`,R(r)?`true`:void 0),K(a,`aria-describedby`,R(i))}),z(`change`,a,o),ua(a,()=>fB.form[t.field.name],e=>fB.form[t.field.name]=e),V(e,a)},g=e=>{var a=wB();ut(a),L(()=>{K(a,`id`,R(n)),K(a,`placeholder`,t.field.placeholder||``),K(a,`aria-invalid`,R(r)?`true`:void 0),K(a,`aria-describedby`,R(i))}),z(`input`,a,o),la(a,()=>fB.form[t.field.name],e=>fB.form[t.field.name]=e),V(e,a)},_=e=>{var a=TB();ea(a),L(()=>{K(a,`id`,R(n)),K(a,`placeholder`,t.field.placeholder||``),K(a,`aria-invalid`,R(r)?`true`:void 0),K(a,`aria-describedby`,R(i))}),z(`input`,a,o),la(a,()=>fB.form[t.field.name],e=>fB.form[t.field.name]=e),V(e,a)};U(f,e=>{t.field.control===`keys`?e(p):t.field.control===`select`?e(m,1):t.field.control===`checkbox`?e(h,2):t.field.control===`textarea`?e(g,3):e(_,-1)});var v=I(f,2),y=e=>{var t=EB(),i=P(t,!0);D(t),L(()=>{K(t,`id`,R(n)+`-error`),H(i,R(r))}),V(e,t)},b=e=>{var r=DB(),i=P(r,!0);D(r),L(()=>{K(r,`id`,R(n)+`-hint`),H(i,t.field.hint)}),V(e,r)};U(v,e=>{R(r)?e(y):t.field.hint&&e(b,1)}),D(s),L(()=>{K(c,`for`,R(n)),H(l,`${t.field.label??``} `)}),V(e,s),k()}Br([`input`,`click`,`change`]);var AB=B(`

      The name is the stable identity used for routing and cannot change once created.

      `),jB=B(``),MB=B(` `),NB=B(`Determines which fields the gateway uses to build requests.`),PB=B(` `),FB=B(`Suggested from the selected type; used to route requests to this provider instance and editable before saving.`),IB=B(`Immutable once created.`),LB=B(`

      Pick a type to configure its credentials — each provider type asks for different settings.

      `),RB=B(`
      Advanced settings
      `),zB=B(`
      `,1);function BB(e,t){O(t,!0);let n=A(()=>Xz(fB.types,fB.form.type)),r=A(()=>fB.formFields),i=A(()=>fB.fieldErrors.name||``),a=A(()=>fB.fieldErrors.type||``);function o(){fB.selectType(),fB.formMode===`create`&&(fB.form.name=aB(fB.rows,fB.form.type))}On(()=>{let e=fB.focusField;if(!e)return;fB.focusField=``;let t=document.getElementById(`provider-credential-`+e);t&&(t.scrollIntoView({block:`center`}),t.focus({preventScroll:!0}))});{let t=e=>{V(e,AB())},s=A(()=>fB.formMode===`edit`?`Edit Provider`:`Add Provider`);ME(e,{get open(){return fB.formOpen},get title(){return R(s)},ariaLabel:`Provider credential editor`,get error(){return fB.error},get submitting(){return fB.formSubmitting},novalidate:!0,onclose:()=>fB.closeForm(),onsubmit:()=>fB.submitForm(),headerHint:t,children:(e,t)=>{var s=zB(),c=F(s),l=I(P(c),2),u=P(l);u.value=u.__value=``,W(I(u),16,()=>R(n),e=>e,(e,t)=>{var n=jB(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(l);var d=I(l,2),f=e=>{var t=MB(),n=P(t,!0);D(t),L(()=>H(n,R(a))),V(e,t)},p=e=>{V(e,NB())};U(d,e=>{R(a)?e(f):e(p,-1)}),D(c);var m=I(c,2),h=I(P(m),2);ea(h);var g=I(h,2),_=e=>{var t=PB(),n=P(t,!0);D(t),L(()=>H(n,R(i))),V(e,t)},v=e=>{V(e,FB())},y=e=>{V(e,IB())};U(g,e=>{R(i)?e(_):fB.formMode===`create`?e(v,1):e(y,-1)}),D(m);var b=I(m,2),x=e=>{V(e,LB())};U(b,e=>{fB.form.type||e(x)});var S=I(b,2);W(S,17,()=>R(r).primary,e=>e.name,(e,t)=>{kB(e,{get field(){return R(t)}})});var C=I(S,2),w=P(C);PA(P(w),{get enabled(){return fB.form.enabled},label:`provider`,onclick:()=>fB.form.enabled=!fB.form.enabled}),D(w),D(C);var T=I(C,2),E=e=>{var t=RB(),n=P(t),i=P(n),a=I(P(i),2),o=P(a,!0);D(a),D(i),D(n);var s=I(n,2);W(s,21,()=>R(r).advanced,e=>e.name,(e,t)=>{kB(e,{get field(){return R(t)}})}),D(s),D(t),L(e=>{t.open=fB.advancedOpen,H(o,e)},[()=>R(r).advanced.map(e=>e.label).join(`, `)]),zr(`toggle`,t,e=>fB.advancedOpen=e.currentTarget.open),V(e,t)};U(T,e=>{R(r).advanced.length>0&&e(E)}),L(()=>{l.disabled=fB.formMode===`edit`,K(l,`aria-invalid`,R(a)?`true`:void 0),K(l,`aria-describedby`,R(a)?`provider-credential-type-error`:`provider-credential-type-hint`),h.disabled=fB.formMode===`edit`,K(h,`aria-invalid`,R(i)?`true`:void 0),K(h,`aria-describedby`,R(i)?`provider-credential-name-error`:`provider-credential-name-hint`)}),z(`change`,l,o),Ui(l,()=>fB.form.type,e=>fB.form.type=e),z(`input`,h,()=>fB.clearFieldError(`name`)),la(h,()=>fB.form.name,e=>fB.form.name=e),V(e,s)},$$slots:{headerHint:!0,default:!0}})}k()}Br([`change`,`input`]);var VB=B(`

      Providers

      `),HB=B(``),UB=B(`
      Provider credential management is unavailable.
      `),WB=B(``),GB=B(`
      `),KB=B(`

      No dashboard-managed providers yet. Add one here, or declare providers in config.yaml / environment variables.

      `),qB=B(`

      No providers match your filter.

      `),JB=B(`
      `);function YB(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`providers-config`&&fB.fetchPage()});var n=JB(),r=P(n),i=P(r);iC(P(i),{copyId:`providers-config-help-copy`,label:`model providers help`,title:e=>{V(e,VB())},help:e=>{Ve(),V(e,Yr(`Configure LLM provider credentials here instead of setting API keys as + environment variables. Providers declared in config.yaml or env vars + are read-only (Config badge) and cannot be edited or deleted from the + dashboard. Keys are masked after saving.`))},$$slots:{title:!0,help:!0}}),D(i);var a=I(i,2),o=P(a),s=e=>{var t=HB();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=fB.formSubmitting),z(`click`,t,()=>fB.openCreate()),V(e,t)};U(o,e=>{fB.available&&!Y.needsAuth&&e(s)}),D(a),D(r);var c=I(r,2),l=e=>{V(e,UB())};U(c,e=>{!fB.available&&!Y.needsAuth&&e(l)});var u=I(c,2),d=e=>{var t=WB(),n=P(t,!0);D(t),L(()=>H(n,fB.error)),V(e,t)};U(u,e=>{fB.error&&!Y.needsAuth&&!fB.formOpen&&e(d)});var f=I(u,2),p=e=>{ET(e,{label:`Loading providers...`})};U(f,e=>{fB.loading&&!Y.needsAuth&&e(p)});var m=I(f,2),h=e=>{var t=GB(),n=P(t);jw(P(n),{id:`provider-credential-filter`,placeholder:`Filter by name, type, or base URL...`,label:`Filter providers by name, type, or base URL`,get value(){return fB.filter},set value(e){fB.filter=e}}),D(n),D(t),V(e,t)};U(m,e=>{(fB.rows.length>0||fB.filter)&&fB.available&&!Y.needsAuth&&e(h)});var g=I(m,2);BB(g,{});var _=I(g,2),v=e=>{_B(e,{})};U(_,e=>{fB.filteredRows.length>0&&fB.available&&!Y.needsAuth&&e(v)});var y=I(_,2),b=e=>{V(e,KB())};U(y,e=>{fB.rows.length===0&&!fB.filter&&!fB.loading&&!Y.needsAuth&&!fB.error&&fB.available&&e(b)});var x=I(y,2),S=e=>{V(e,qB())};U(x,e=>{fB.rows.length>0&&fB.filteredRows.length===0&&fB.filter&&!fB.loading&&!Y.needsAuth&&fB.available&&e(S)}),D(n),V(e,n),k()}Br([`click`]);function XB(){return{name:``,description:``,user_path:``,labels:``,dashboard_access:!1,expires_at:``}}function ZB(e){let t=[];for(let n of String(e||``).split(`,`)){let e=n.trim();e&&!t.includes(e)&&t.push(e)}return t}function QB(e){let t=String(e||``).trim();if(!t)return``;let n=t.startsWith(`/`)?t:`/`+t;for(let e of n.split(`/`)){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function $B(e){if(QB(e))return``;let t=String(e||``).trim();if(!t)return``;let n=t.startsWith(`/`)?t:`/`+t,r=[];for(let e of n.split(`/`)){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function eV(e){let t=e||{},n=String(t.name||``).trim();if(!n)return{error:`Name is required.`};let r=QB(t.user_path);if(r)return{error:r};let i=$B(t.user_path),a=ZB(t.labels),o={name:n,description:String(t.description||``).trim()||void 0,user_path:i||void 0,labels:a.length?a:void 0,dashboard_access:t.dashboard_access?!0:void 0};return t.expires_at&&(o.expires_at=t.expires_at+`T23:59:59Z`),{payload:o}}function tV(e,t=Date.now()){let n=e&&e.expires_at;if(!n)return!1;let r=Date.parse(n);return Number.isFinite(r)&&r<=t}function nV(e){return e?!!e.deactivated_at||e.enabled===!1:!1}function rV(e,t=Date.now()){return!e||e.active===!1||nV(e)?!1:!tV(e,t)}function iV(e){return[e.name,e.description,e.user_path,e.redacted_value,...e.labels||[]].filter(Boolean).join(` `).toLowerCase()}function aV(e,t={}){let{query:n=``,showInactive:r=!1,now:i=Date.now()}=t,a=String(n||``).trim().toLowerCase();return(Array.isArray(e)?e:[]).filter(e=>!r&&!rV(e,i)?!1:!a||iV(e).includes(a))}function oV(e,t){return nV(e)?2:+!rV(e,t)}function sV(e){let t=e&&e.expires_at;if(!t)return 1/0;let n=Date.parse(t);return Number.isFinite(n)?n:1/0}function cV(e){let t=Date.parse(e&&e.deactivated_at||``);return Number.isFinite(t)?t:-1/0}function lV(e,t=Date.now()){return(Array.isArray(e)?e.slice():[]).sort((e,n)=>{let r=oV(e,t),i=oV(n,t);if(r!==i)return r-i;let[a,o]=r===2?[cV(e),cV(n)]:[sV(e),sV(n)];return a===o?String(e.name||``).localeCompare(String(n.name||``)):a>o?-1:1})}function uV(e,t=Date.now()){return(Array.isArray(e)?e:[]).reduce((e,n)=>e+ +!rV(n,t),0)}function dV(){return{open:!1,id:``,name:``,value:``,submitting:!1,error:``}}var fV=new class{#e=j(N([]));get keys(){return R(this.#e)}set keys(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get showInactive(){return R(this.#a)}set showInactive(e){M(this.#a,e,!0)}#o=A(()=>lV(aV(this.keys,{query:this.filter,showInactive:this.showInactive})));get visibleKeys(){return R(this.#o)}set visibleKeys(e){M(this.#o,e)}#s=A(()=>uV(this.keys));get inactiveCount(){return R(this.#s)}set inactiveCount(e){M(this.#s,e)}#c=j(!1);get formOpen(){return R(this.#c)}set formOpen(e){M(this.#c,e,!0)}#l=j(!1);get formSubmitting(){return R(this.#l)}set formSubmitting(e){M(this.#l,e,!0)}#u=j(``);get issuedValue(){return R(this.#u)}set issuedValue(e){M(this.#u,e,!0)}#d=j(``);get deactivatingID(){return R(this.#d)}set deactivatingID(e){M(this.#d,e,!0)}#f=j(``);get dashboardAccessID(){return R(this.#f)}set dashboardAccessID(e){M(this.#f,e,!0)}#p=j(N(XB()));get form(){return R(this.#p)}set form(e){M(this.#p,e,!0)}#m=j(N(dV()));get labelsEditor(){return R(this.#m)}set labelsEditor(e){M(this.#m,e,!0)}copyState=MM({logPrefix:`Failed to copy auth key:`});async fetchKeys(){this.loading=!0,this.error=``;try{let e=await kT(`/admin/auth-keys`,{label:`auth keys`,errorFallback:`Unable to load API keys.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.keys=[];return}if(e.status===`error`){e.result&&(this.available=!0),this.error=e.error;return}this.available=!0,this.keys=e.items}finally{this.loading=!1}}openForm(){this.formSubmitting||this.formOpen||(this.formOpen=!0,this.error=``,this.issuedValue||(this.copyState.reset(),this.form=XB()))}closeForm(){this.formOpen&&(this.formOpen=!1,this.error=``,this.copyState.reset(),!this.formSubmitting&&!this.issuedValue&&(this.form=XB()))}copyIssuedValue(){return this.copyState.copy(this.issuedValue)}dismissIssuedKey(){this.issuedValue=``,this.copyState.reset(),this.form=XB()}async submitForm(){let e=eV(this.form);if(e.error){this.error=e.error;return}this.error=``,this.formSubmitting=!0;try{let t=await AT(`/admin/auth-keys`,`POST`,e.payload,{label:`create API key`,errorFallback:`Failed to create API key.`,unavailableMessage:`Auth keys feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error,t.result&&t.result.status!==401&&console.error(`Failed to create API key:`,t.result.status,this.error);return}let n=t.result.data||{};this.issuedValue=n.value||``,this.formOpen=!0,this.copyState.reset(),this.form=XB(),this.fetchKeys()}finally{this.formSubmitting=!1}}openLabelsEditor(e){!e||this.labelsEditor.submitting||(this.labelsEditor={open:!0,id:e.id,name:e.name||``,value:(e.labels||[]).join(`, `),submitting:!1,error:``})}closeLabelsEditor(){!this.labelsEditor.open||this.labelsEditor.submitting||(this.labelsEditor=dV())}async submitLabelsEditor(){let e=this.labelsEditor;if(!e.open||e.submitting||!e.id)return;e.submitting=!0,e.error=``;let t={labels:ZB(e.value)};try{let n=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/labels`,`PUT`,t,{label:`update API key labels`,errorFallback:`Failed to update labels.`,unavailableMessage:`Auth keys feature is unavailable.`});if(n.status===`stale`)return;if(n.status===`unavailable`){this.available=!1,e.error=n.error;return}if(n.status===`error`){e.error=n.error,n.result&&n.result.status!==401&&console.error(`Failed to update auth key labels:`,n.result.status,e.error);return}lc.success(`Labels updated for key "`+e.name+`".`),e.submitting=!1,this.closeLabelsEditor(),this.fetchKeys()}finally{e.submitting=!1}}async toggleDashboardAccess(e){if(!e||!e.active||this.dashboardAccessID)return;let t=!e.dashboard_access;this.dashboardAccessID=e.id;try{let n=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/dashboard-access`,`PUT`,{dashboard_access:t},{label:`update API key dashboard access`,errorFallback:`Failed to update dashboard access.`,unavailableMessage:`Auth keys feature is unavailable.`});if(n.status===`stale`)return;if(n.status===`unavailable`){this.available=!1,lc.error(n.error);return}if(n.status===`error`){n.result&&n.result.status!==401&&console.error(`Failed to update auth key dashboard access:`,n.result.status,n.error),lc.error(n.error);return}lc.success(`Dashboard access `+(t?`granted to`:`revoked for`)+` key "`+e.name+`".`),this.fetchKeys()}finally{this.dashboardAccessID=``}}async deactivateKey(e){if(!(!e||!e.active)&&window.confirm(`Deactivate key "`+e.name+`"? This cannot be undone.`)){this.deactivatingID=e.id;try{let t=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/deactivate`,`POST`,void 0,{label:`deactivate API key`,errorFallback:`Failed to deactivate key.`,unavailableMessage:`Auth keys feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,lc.error(t.error);return}if(t.status===`error`){t.result&&t.result.status!==401&&console.error(`Failed to deactivate auth key:`,t.result.status,t.error),lc.error(t.error);return}lc.success(`Key "`+e.name+`" deactivated.`),this.fetchKeys()}finally{this.deactivatingID=``}}}},pV=B(``),mV=B(`

      Store this key securely — it won’t be shown again.

      `),hV=B(``),gV=B(``),_V=B(``),vV=B(``),yV=B(`
      `);function bV(e,t){O(t,!0);{let t=A(()=>fV.issuedValue?``:fV.error),n=A(()=>fV.issuedValue?`Done, I’ve stored it`:`Create API Key`),r=A(()=>fV.issuedValue?Ba:po);ME(e,{get open(){return fV.formOpen},title:`Create API Key`,ariaLabel:`API key editor`,get error(){return R(t)},get submitting(){return fV.formSubmitting},get submitLabel(){return R(n)},submittingLabel:`Creating...`,get submitIcon(){return R(r)},cancel:!1,dialogClass:`auth-key-editor`,onclose:()=>fV.closeForm(),onsubmit:()=>fV.issuedValue?fV.dismissIssuedKey():fV.submitForm(),children:(e,t)=>{var n=Xr(),r=F(n),i=e=>{var t=mV(),n=I(P(t),2),r=P(n),i=P(r,!0);D(r),jL(I(r,2),{get state(){return fV.copyState},onclick:()=>fV.copyIssuedValue()}),D(n);var a=I(n,2),o=e=>{V(e,pV())};U(a,e=>{fV.copyState.error&&e(o)}),D(t),L(()=>H(i,fV.issuedValue)),V(e,t)},a=e=>{var t=yV(),n=P(t),r=P(n),i=I(P(r),2);ea(i),D(r);var a=I(r,2),o=I(P(a),2);ea(o),D(a),D(n);var s=I(n,2),c=P(s);iC(c,{copyId:`auth-key-user-path-help-copy`,label:`API key user path help`,title:e=>{V(e,hV())},help:e=>{Ve(),V(e,Yr(`When set, this key overrides the configured user path request + header for audit logging and downstream request context.`))},$$slots:{title:!0,help:!0}});var l=I(c,2);ea(l),D(s);var u=I(s,2),d=P(u);iC(d,{copyId:`auth-key-labels-help-copy`,label:`API key labels help`,title:e=>{V(e,gV())},help:e=>{Ve(),V(e,Yr(`Every request authenticated with this key gets these labels, in + addition to any labels from tagging headers. Labels show up in + usage analytics, the request log, and audit logs.`))},$$slots:{title:!0,help:!0}});var f=I(d,2);ea(f),D(u);var p=I(u,2),m=P(p);iC(m,{copyId:`auth-key-dashboard-access-help-copy`,label:`API key dashboard access help`,title:e=>{V(e,_V())},help:e=>{Ve(),V(e,Yr(`When off, this key is denied the dashboard and every /admin API + endpoint. Model endpoints and GET /v1/usage stay available to + the key. The master key always has dashboard access.`))},$$slots:{title:!0,help:!0}});var h=I(m,2),g=P(h);ea(g),Ve(2),D(h),D(p),PE(I(p,2),{id:`auth-key-description`,label:`Description (optional)`,children:(e,t)=>{var n=vV();ut(n),la(n,()=>fV.form.description,e=>fV.form.description=e),V(e,n)},$$slots:{default:!0}}),D(t),la(i,()=>fV.form.name,e=>fV.form.name=e),la(o,()=>fV.form.expires_at,e=>fV.form.expires_at=e),la(l,()=>fV.form.user_path,e=>fV.form.user_path=e),la(f,()=>fV.form.labels,e=>fV.form.labels=e),ua(g,()=>fV.form.dashboard_access,e=>fV.form.dashboard_access=e),V(e,t)};U(r,e=>{fV.issuedValue?e(i):e(a,-1)}),V(e,n)},$$slots:{default:!0}})}k()}var xV=B(`

      `),SV=B(`

      Applies to new requests made with this key. Leave empty to remove all labels.

      `,1);function CV(e,t){O(t,!0),ME(e,{get open(){return fV.labelsEditor.open},title:`Edit Labels`,ariaLabel:`API key labels editor`,get error(){return fV.labelsEditor.error},get submitting(){return fV.labelsEditor.submitting},submitLabel:`Save Labels`,cancel:!1,dialogClass:`auth-key-editor`,onclose:()=>fV.closeLabelsEditor(),onsubmit:()=>fV.submitLabelsEditor(),headerHint:e=>{var t=xV(),n=P(t,!0);D(t),L(()=>H(n,fV.labelsEditor.name)),V(e,t)},children:(e,t)=>{PE(e,{id:`auth-key-labels-edit`,label:`Labels (comma-separated)`,children:(e,t)=>{var n=SV(),r=F(n);ea(r),Ve(2),la(r,()=>fV.labelsEditor.value,e=>fV.labelsEditor.value=e),V(e,n)},$$slots:{default:!0}})},$$slots:{headerHint:!0,default:!0}}),k()}var wV=B(` `),TV=B(`
      `),EV=B(``),DV=B(`Expired`),OV=B(` `),kV=B(` `,1),AV=B(`Deactivated`),jV=B(`
      `),MV=B(`
      NameDescriptionUser PathLabelsTokenDashboard Access ExpiresCreated
      `);function NV(e,t){O(t,!0);var n=MV(),r=P(n),i=P(r),a=P(i),o=I(P(a),5),s=P(o);J(I(P(s)),{get icon(){return eo},width:`13`,height:`13`}),D(s),D(o),Ve(3),D(a),D(i);var c=I(i);W(c,21,()=>fV.visibleKeys,e=>e.id,(e,t)=>{var n=jV();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i),s=P(o,!0);D(o);var c=I(o),l=P(c,!0);D(c);var u=I(c),d=P(u),f=e=>{var n=TV();W(n,20,()=>R(t).labels||[],e=>e,(e,t)=>{var n=wV(),r=P(n,!0);D(n),L(e=>{Bi(n,e),H(r,t)},[()=>eb(t)]),V(e,n)}),D(n),V(e,n)},p=e=>{V(e,EV())};U(d,e=>{(R(t).labels||[]).length>0?e(f):e(p,-1)}),D(u);var m=I(u),h=P(m),g=P(h,!0);D(h),D(m);var _=I(m),v=P(_);let y;var b=P(v,!0);D(v),D(_);var x=I(_),S=P(x),C=e=>{var n=OV(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=e=>{V(e,DV())},s=A(()=>tV(R(t)));U(a,e=>{R(s)&&e(o)}),D(n),L(e=>H(i,e),[()=>wc(R(t).expires_at)]),V(e,n)},w=e=>{V(e,Yr(`—`))};U(S,e=>{R(t).expires_at?e(C):e(w,-1)}),D(x);var T=I(x),E=P(T,!0);D(T);var ee=I(T),te=P(ee),ne=P(te),re=e=>{var n=kV(),r=F(n);{let e=A(()=>(R(t).dashboard_access?`Revoke dashboard access for API key `:`Grant dashboard access to API key `)+R(t).name),n=A(()=>!!fV.dashboardAccessID);OT(r,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>fV.toggleDashboardAccess(R(t)),get disabled(){return R(n)},children:(e,n)=>{{let n=A(()=>R(t).dashboard_access?wo:Co);J(e,{get icon(){return R(n)},class:`table-icon-svg`})}},$$slots:{default:!0}})}var i=I(r,2);{let e=A(()=>`Edit labels for API key `+R(t).name);OT(i,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>fV.openLabelsEditor(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}var a=I(i,2);{let e=A(()=>(fV.deactivatingID===R(t).id?`Deactivating API key `:`Deactivate API key `)+R(t).name),n=A(()=>fV.deactivatingID===R(t).id);OT(a,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>fV.deactivateKey(R(t)),get disabled(){return R(n)},children:(e,t)=>{J(e,{get icon(){return mo},class:`table-icon-svg`})},$$slots:{default:!0}})}V(e,n)},ie=e=>{var n=AV();L(e=>K(n,`title`,e),[()=>R(t).deactivated_at?`Deactivated on `+Tc(R(t).deactivated_at):`Deactivated`]),V(e,n)},ae=A(()=>nV(R(t)));U(ne,e=>{R(t).active?e(re):R(ae)&&e(ie,1)}),D(te),D(ee),D(n),L((e,i,o)=>{r=G(n,1,`svelte-nf0ldb`,null,r,e),H(a,R(t).name),H(s,R(t).description||`—`),H(l,R(t).user_path||`—`),H(g,R(t).redacted_value),y=G(v,1,`auth-key-status-badge`,null,y,{"auth-key-status-active":R(t).dashboard_access,"auth-key-status-inactive":!R(t).dashboard_access}),H(b,R(t).dashboard_access?`Allowed`:`Denied`),K(x,`title`,i),H(E,o)},[()=>({"auth-key-row-deactivated":nV(R(t))}),()=>R(t).expires_at?Tc(R(t).expires_at):``,()=>vs.formatTimestamp(R(t).created_at)]),V(e,n)}),D(c),D(r),D(n),V(e,n),k()}var PV=B(``),FV=B(`
      API key management is unavailable.
      `),IV=B(``),LV=B(`

      Managed API keys authenticate requests to the gateway. Deactivation is + permanent — create a new key if access needs to be restored.

      `),RV=B(`
      `),zV=B(`
      `),BV=B(`

      `),VV=B(`

      No API keys yet. Issue a key to get started.

      `),HV=B(`
      `);function UV(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`auth-keys`&&fV.fetchKeys()});var n=HV(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=PV();J(P(t),{get icon(){return po},class:`table-icon-svg`}),Ve(2),D(t),L(()=>t.disabled=fV.formSubmitting),z(`click`,t,()=>{fV.formSubmitting||fV.openForm()}),V(e,t)};U(a,e=>{fV.available&&!Y.authError&&e(o)}),D(i),D(r);var s=I(r,2),c=e=>{V(e,FV())};U(s,e=>{!fV.available&&!Y.authError&&e(c)});var l=I(s,2),u=e=>{var t=IV(),n=P(t,!0);D(t),L(()=>H(n,fV.error)),V(e,t)};U(l,e=>{fV.error&&!Y.authError&&!fV.formOpen&&e(u)});var d=I(l,2),f=e=>{V(e,LV())};U(d,e=>{fV.available&&!Y.authError&&e(f)});var p=I(d,2);bV(p,{});var m=I(p,2);CV(m,{});var h=I(m,2),g=e=>{var t=RV();NS(P(t),{size:18,label:`Loading API keys`}),D(t),V(e,t)};U(h,e=>{fV.loading&&fV.keys.length===0&&e(g)});var _=I(h,2),v=e=>{var t=zV(),n=P(t);jw(P(n),{placeholder:`Filter by name, description, user path, label, or token...`,label:`Filter API keys by name, description, user path, label, or token`,get value(){return fV.filter},set value(e){fV.filter=e}}),D(n);var r=I(n,2),i=P(r),a=P(i);ea(a);var o=I(a,2),s=I(P(o)),c=e=>{var t=Yr();L(()=>H(t,`(${fV.inactiveCount??``})`)),V(e,t)};U(s,e=>{fV.inactiveCount>0&&e(c)}),D(o),D(i),D(r),D(t),ua(a,()=>fV.showInactive,e=>fV.showInactive=e),V(e,t)};U(_,e=>{fV.keys.length>0&&fV.available&&e(v)});var y=I(_,2),b=e=>{NV(e,{})};U(y,e=>{fV.visibleKeys.length>0&&fV.available&&e(b)});var x=I(y,2),S=e=>{var t=BV(),n=P(t);D(t),L(()=>H(n,`No API keys match the current filter.${fV.inactiveCount>0&&!fV.showInactive?` `+fV.inactiveCount+` inactive `+(fV.inactiveCount===1?`key is`:`keys are`)+` hidden.`:``}`)),V(e,t)};U(x,e=>{fV.keys.length>0&&fV.visibleKeys.length===0&&fV.available&&e(S)});var C=I(x,2),w=e=>{V(e,VV())};U(C,e=>{fV.keys.length===0&&!fV.loading&&!Y.authError&&!fV.error&&fV.available&&e(w)}),D(n),V(e,n),k()}Br([`click`]);var WV=B(`

      Timezone

      `),GV=B(``),KV=B(``),qV=B(`
      `,1);function JV(e,t){O(t,!0);function n(){vs.saveOverride(),Y.refresh()}function r(){vs.clearOverride(),Y.refresh()}var i=qV(),a=F(i);iC(P(a),{copyId:`timezone-help-copy`,label:`timezone help`,text:`Day-based analytics, charts, and date filters use your effective timezone. Usage and audit logs keep UTC in the hover title while rendering row timestamps in your effective timezone.`,title:e=>{V(e,WV())},$$slots:{title:!0}}),D(a);var o=I(a,2),s=P(o),c=I(P(s),2),l=P(c),u=P(l);D(l),l.value=l.__value=``,W(I(l),17,()=>vs.options,e=>e.value,(e,t)=>{var n=GV(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(c),D(s),D(o);var d=I(o,2),f=P(d),p=e=>{var t=KV();z(`click`,t,r),V(e,t)};U(f,e=>{vs.override&&e(p)}),D(d),L(e=>H(u,`Automatic (${e??``})`),[()=>vs.detectedTimeZoneLabel()]),zr(`focus`,c,()=>vs.ensureOptions()),z(`change`,c,n),Ui(c,()=>vs.override,e=>vs.override=e),V(e,i),k()}Br([`change`,`click`]);var YV=B(``),XV=B(`

      Failover

      `,1);function ZV(e,t){O(t,!0);let n=A(()=>Q.failoverSaving||Q.failoverGenerating||Q.failoverDraftSaving||!Q.failoverAvailable||!Q.failoverEnabled());var r=XV(),i=F(r),a=I(P(i),2),o=P(a),s=P(o);J(s,{get icon(){return Fo},class:`form-action-icon`});var c=I(s,2),l=P(c,!0);D(c),D(o);var u=I(o,2);J(P(u),{get icon(){return Ao},class:`form-action-icon`}),Ve(2),D(u),D(a),D(i);var d=I(i,2),f=P(d),p=e=>{var t=YV(),n=P(t,!0);D(t),L(()=>H(n,Q.failoverError)),V(e,t)};U(f,e=>{Q.failoverError&&e(p)}),D(d),Dj(I(d,2),{}),L(()=>{o.disabled=R(n),H(l,Q.failoverGenerating?`Generating...`:`Generate failover models automatically`),u.disabled=R(n)}),z(`click`,o,()=>Q.generateFailoverRules()),z(`click`,u,()=>Q.openFailoverResetDialog()),V(e,r),k()}Br([`click`]);function QV(){return{daily_reset_hour:0,daily_reset_minute:0,weekly_reset_weekday:1,weekly_reset_hour:0,weekly_reset_minute:0,monthly_reset_day:1,monthly_reset_hour:0,monthly_reset_minute:0}}function $V(e,t){let n=t||{},r=(e,t)=>{if(e===``)return t;let n=Number(e);return Number.isFinite(n)&&Number.isInteger(n)?Math.trunc(n):t},i=(e,t)=>r(n[e],t),a=(t,n)=>e?r(e[t],n):n;return{daily_reset_hour:a(`daily_reset_hour`,i(`daily_reset_hour`,0)),daily_reset_minute:a(`daily_reset_minute`,i(`daily_reset_minute`,0)),weekly_reset_weekday:a(`weekly_reset_weekday`,i(`weekly_reset_weekday`,1)),weekly_reset_hour:a(`weekly_reset_hour`,i(`weekly_reset_hour`,0)),weekly_reset_minute:a(`weekly_reset_minute`,i(`weekly_reset_minute`,0)),monthly_reset_day:a(`monthly_reset_day`,i(`monthly_reset_day`,1)),monthly_reset_hour:a(`monthly_reset_hour`,i(`monthly_reset_hour`,0)),monthly_reset_minute:a(`monthly_reset_minute`,i(`monthly_reset_minute`,0))}}function eH(){return[{value:0,label:`Sunday`},{value:1,label:`Monday`},{value:2,label:`Tuesday`},{value:3,label:`Wednesday`},{value:4,label:`Thursday`},{value:5,label:`Friday`},{value:6,label:`Saturday`}]}var tH=B(`

      Budget Resets

      `),nH=B(``),rH=B(`

      If the selected day does not exist in a month, the reset runs on + the last day of that month.

      `),iH=B(``),aH=B(``),oH=B(`
      Monthly
      Weekly
      Daily
      `,1);function sH(e,t){O(t,!0);let n=j(N(QV())),r=j(!1),i=j(!1),a=j(``),o=j(!1),s=A(()=>ks.budgetsVisible());async function c(){if(await ks.ensureLoaded(),!ks.budgetsVisible()){M(a,``);return}M(r,!0),M(a,``);try{let e=await ws(`/admin/budgets/settings`,{label:`budget settings`});if(e.stale)return;if(!e.ok){M(a,`Unable to load budget settings.`);return}M(n,$V(e.data,R(n)),!0)}catch(e){console.error(`Failed to fetch budget settings:`,e),M(a,`Unable to load budget settings.`)}finally{M(r,!1)}}async function l(){if(!R(i)){M(i,!0);try{let e=await Ts(`/admin/budgets/settings`,`PUT`,$V(R(n),R(n)),{label:`budget settings`});if(e.stale)return;if(!e.ok){lc.error(`Unable to save budget settings.`);return}M(n,$V(e.data,R(n)),!0),M(a,``),lc.success(`Budget settings saved.`)}catch(e){console.error(`Failed to save budget settings:`,e),lc.error(`Unable to save budget settings.`)}finally{M(i,!1)}}}On(()=>{Y.refreshTick,c()});var u=Xr(),d=F(u),f=e=>{var t=oH(),s=F(t),c=P(s);iC(c,{copyId:`budget-settings-help-copy`,label:`budget help`,text:`Budget reset anchors are stored in the database and evaluated in UTC. Hourly budgets reset at the top of each hour.`,title:e=>{V(e,tH())},$$slots:{title:!0}});var u=I(c,2),d=P(u),f=I(P(d),2),p=P(f);iC(p,{copyId:`budget-monthly-day-help-copy`,label:`day of month help`,external:!0,get open(){return R(o)},set open(e){M(o,e,!0)},title:e=>{V(e,nH())},$$slots:{title:!0}});var m=I(p,2);ea(m),D(f);var h=I(f,2),g=I(P(h),2);ea(g),D(h);var _=I(h,2),v=I(P(_),2);ea(v),D(_);var y=I(_,2),b=P(y),x=e=>{V(e,rH())};U(b,e=>{R(o)&&e(x)}),D(y),D(d);var S=I(d,2),C=I(P(S),2),w=I(P(C),2);W(w,21,eH,e=>e.value,(e,t)=>{var n=iH(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(w),D(C);var T=I(C,2),E=I(P(T),2);ea(E),D(T);var ee=I(T,2),te=I(P(ee),2);ea(te),D(ee),Ve(2),D(S);var ne=I(S,2),re=I(P(ne),4),ie=I(P(re),2);ea(ie),D(re);var ae=I(re,2),oe=I(P(ae),2);ea(oe),D(ae),Ve(2),D(ne),D(u);var se=I(u,2),ce=P(se);J(P(ce),{get icon(){return _o},class:`form-action-icon`}),Ve(2),D(ce);var le=I(ce,2),ue=e=>{NS(e,{size:16,label:`Loading budget settings`})};U(le,e=>{R(r)&&e(ue)}),D(se),D(s);var de=I(s,2),fe=P(de),pe=e=>{var t=aH(),n=P(t,!0);D(t),L(()=>H(n,R(a))),V(e,t)};U(fe,e=>{R(a)&&e(pe)}),D(de),L(()=>{ce.disabled=R(i)||R(r),K(ce,`aria-busy`,R(i)?`true`:`false`)}),la(m,()=>R(n).monthly_reset_day,e=>R(n).monthly_reset_day=e),la(g,()=>R(n).monthly_reset_hour,e=>R(n).monthly_reset_hour=e),la(v,()=>R(n).monthly_reset_minute,e=>R(n).monthly_reset_minute=e),Ui(w,()=>R(n).weekly_reset_weekday,e=>R(n).weekly_reset_weekday=e),la(E,()=>R(n).weekly_reset_hour,e=>R(n).weekly_reset_hour=e),la(te,()=>R(n).weekly_reset_minute,e=>R(n).weekly_reset_minute=e),la(ie,()=>R(n).daily_reset_hour,e=>R(n).daily_reset_hour=e),la(oe,()=>R(n).daily_reset_minute,e=>R(n).daily_reset_minute=e),z(`click`,ce,l),V(e,t)};U(d,e=>{R(s)&&e(f)}),V(e,u),k()}Br([`click`]);var cH=B(`

      Reset All Budgets

      Start new budget periods for every configured budget without changing + the limits.

      `);function lH(e,t){O(t,!0);var n=Xr(),r=F(n),i=e=>{var t=cH(),n=I(P(t),2),r=P(n);J(P(r),{get icon(){return go},class:`form-action-icon`}),Ve(2),D(r),D(n),D(t),L(()=>r.disabled=X.resetAllLoading),z(`click`,r,()=>X.openResetDialog()),V(e,t)},a=A(()=>ks.budgetsVisible());U(r,e=>{R(a)&&e(i)}),V(e,n),k()}Br([`click`]);function uH(){return{header:``,prefix:``,do_not_pass:!1,delimiter:``,managed:!1}}function dH(e){return(e&&Array.isArray(e.headers)?e.headers:[]).map(e=>({header:typeof e.header==`string`?e.header:``,prefix:typeof e.prefix==`string`?e.prefix:``,do_not_pass:e.do_not_pass===!0,delimiter:typeof e.delimiter==`string`&&e.delimiter!==`,`?e.delimiter:``,managed:e.managed===!0}))}function fH(e){return{headers:(Array.isArray(e)?e:[]).filter(e=>!e.managed&&e.header.trim()!==``).map(e=>({header:e.header.trim(),prefix:e.prefix,do_not_pass:e.do_not_pass,delimiter:e.delimiter}))}}function pH(e){return e&&e.error&&e.error.message?e.error.message:``}var mH=B(`

      Tagging based on headers

      `),hH=B(`config`),gH=B(``),_H=B(`
      `),vH=B(`

      No tagging headers configured. Requests are not labelled.

      `),yH=B(``),bH=B(`
      `,1);function xH(e,t){O(t,!0);let n=j(N([])),r=j(!0),i=j(!1),a=j(!1),o=j(``);function s(){R(n).push(uH())}function c(e){let t=R(n)[e];!t||t.managed||R(n).splice(e,1)}async function l(){M(i,!0),M(o,``);try{let e=await ws(`/admin/tagging/settings`,{label:`tagging settings`});if(e.stale)return;if(!e.ok){M(o,`Unable to load tagging settings.`);return}M(n,dH(e.data),!0),M(r,e.data&&e.data.editable!==!1,!0)}catch(e){console.error(`Failed to fetch tagging settings:`,e),M(o,`Unable to load tagging settings.`)}finally{M(i,!1)}}async function u(){if(!(R(a)||!R(r))){M(a,!0);try{let e=await Ts(`/admin/tagging/settings`,`PUT`,fH(R(n)),{label:`tagging settings`});if(e.stale)return;if(!e.ok){lc.error(e.status!==401&&pH(e.data)||`Unable to save tagging settings.`);return}M(n,dH(e.data),!0),M(r,e.data&&e.data.editable!==!1,!0),M(o,``),lc.success(`Tagging settings saved.`)}catch(e){console.error(`Failed to save tagging settings:`,e),lc.error(`Unable to save tagging settings.`)}finally{M(a,!1)}}}On(()=>{Y.refreshTick,l()});var d=bH(),f=F(d),p=P(f);iC(p,{copyId:`tagging-settings-help-copy`,label:`tagging help`,text:`Each request is labelled from the listed headers; labels land in usage tracking and audit logs. A header value can carry several labels split by the delimiter (default: comma). The prefix is trimmed from each label only — the header itself is forwarded unchanged unless 'Do not pass' is checked. Rows marked CONFIG come from config.yaml or TAGGING_HEADER_* env vars and are read-only here.`,title:e=>{V(e,mH())},$$slots:{title:!0}});var m=I(p,2),h=P(m);W(h,17,()=>R(n),ii,(e,t,n)=>{var i=_H(),a=P(i),o=P(a);K(o,`for`,`tagging-header-`+n);var s=I(o,2);ea(s),K(s,`id`,`tagging-header-`+n),D(a);var l=I(a,2),u=P(l);K(u,`for`,`tagging-prefix-`+n);var d=I(u,2);ea(d),K(d,`id`,`tagging-prefix-`+n),D(l);var f=I(l,2),p=P(f);K(p,`for`,`tagging-delimiter-`+n);var m=I(p,2);ea(m),K(m,`id`,`tagging-delimiter-`+n),D(f);var h=I(f,2),g=P(h);ea(g),Ve(2),D(h);var _=I(h,2),v=P(_),y=e=>{V(e,hH())},b=e=>{var i=gH();L(()=>{i.disabled=!R(r),K(i,`aria-label`,`Remove tagging header `+(R(t).header||n+1))}),z(`click`,i,()=>c(n)),V(e,i)};U(v,e=>{R(t).managed?e(y):e(b,-1)}),D(_),D(i),L(()=>{s.disabled=R(t).managed||!R(r),d.disabled=R(t).managed||!R(r),m.disabled=R(t).managed||!R(r),g.disabled=R(t).managed||!R(r)}),la(s,()=>R(t).header,e=>R(t).header=e),la(d,()=>R(t).prefix,e=>R(t).prefix=e),la(m,()=>R(t).delimiter,e=>R(t).delimiter=e),ua(g,()=>R(t).do_not_pass,e=>R(t).do_not_pass=e),V(e,i)});var g=I(h,2),_=e=>{NS(e,{size:16,label:`Loading tagging settings`})};U(g,e=>{R(i)&&e(_)});var v=I(g,2),y=e=>{V(e,vH())};U(v,e=>{!R(i)&&R(n).length===0&&e(y)}),D(m);var b=I(m,2),x=P(b);J(P(x),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(x);var S=I(x,2);J(P(S),{get icon(){return _o},class:`form-action-icon`}),Ve(2),D(S),D(b),D(f);var C=I(f,2),w=P(C),T=e=>{var t=yH(),n=P(t,!0);D(t),L(()=>H(n,R(o))),V(e,t)};U(w,e=>{R(o)&&e(T)}),D(C),L(()=>{x.disabled=!R(r)||R(a)||R(i),S.disabled=!R(r)||R(a)||R(i),K(S,`aria-busy`,R(a)?`true`:`false`)}),z(`click`,x,s),z(`click`,S,u),V(e,d),k()}Br([`click`]);function SH(e){let t=e||{};if(t.selectedPreset)return{days:parseInt(t.selectedPreset,10)||30};let n=t.customStartDate?Cc(t.customStartDate):``,r=t.customEndDate||t.today||null;return{start_date:n,end_date:r?Cc(r):``}}function CH(e,t,n,r){return{...SH(e),user_path:String(t||``).trim(),selector:String(n||``).trim(),confirmation:r}}function wH(e){let t=Number(e&&e.matched||0),n=Number(e&&e.recalculated||0),r=Number(e&&e.without_pricing||0),i=`Pricing recalculated for `+n+` of `+t+` usage record`+(t===1?``:`s`)+`.`;return r>0&&(i+=` `+r+` usage record`+(r===1?` still lacks`:`s still lack`)+` pricing metadata.`),i}var TH=B(`

      Usage Pricing Recalculation

      `),EH=B(`
      `);function DH(e,t){O(t,!0);let n=j(``),r=j(``),i=j(!1),a=A(()=>ks.booleanFlag(`USAGE_PRICING_RECALCULATION_ENABLED`,!1));function o(){if(!R(a)){lc.error(`Usage pricing recalculation is unavailable.`);return}R(i)||Js.open({title:`Recalculate Pricing`,titleId:`pricingRecalculateDialogTitle`,inputId:`pricing-recalculate-confirmation`,requiredText:`recalculate`,confirmLabel:`Recalculate Pricing`,icon:Fa,dialogClass:`pricing-recalculate-dialog`,message:`Stored usage cost fields matching the selected filters will be overwritten.`,onConfirm:()=>s()})}async function s(){if(!R(a)){lc.error(`Usage pricing recalculation is unavailable.`);return}if(!R(i)){M(i,!0);try{let e=await Ts(`/admin/usage/recalculate-pricing`,`POST`,CH({selectedPreset:Uc.selectedPreset,customStartDate:Uc.customStartDate,customEndDate:Uc.customEndDate,today:vs.todayDate()},R(n),R(r),`recalculate`),{label:`pricing recalculation`});if(e.stale)return;if(!e.ok){Js.error=`Unable to recalculate pricing.`;return}Js.close(),lc.success(wH(e.data)),Yc.fetchUsage()}catch(e){console.error(`Failed to recalculate pricing:`,e),Js.error=`Unable to recalculate pricing.`}finally{M(i,!1)}}}var c=Xr(),l=F(c),u=e=>{var t=EH(),s=P(t);iC(s,{copyId:`pricing-recalculate-help-copy`,label:`pricing recalculation help`,text:`Recalculate stored input, output, total, and Pro Saved costs from the current model pricing metadata. This overwrites matching historical cost fields. Filters are applied to the selected date range, user path subtree, and provider/model selector or alias.`,title:e=>{V(e,TH())},$$slots:{title:!0}});var c=I(s,2),l=P(c),u=I(P(l),2);fl(P(u),{}),D(u),D(l);var d=I(l,2),f=I(P(d),2);ea(f),D(d);var p=I(d,2),m=I(P(p),2);ea(m),D(p),D(c);var h=I(c,2),g=P(h);J(P(g),{get icon(){return Fa},class:`form-action-icon`}),Ve(2),D(g),D(h),D(t),L(()=>{g.disabled=R(i)||!R(a),K(g,`aria-busy`,R(i)?`true`:`false`)}),la(f,()=>R(n),e=>M(n,e)),la(m,()=>R(r),e=>M(r,e)),z(`click`,g,o),V(e,t)};U(l,e=>{R(a)&&e(u)}),V(e,c),k()}Br([`click`]);function OH(e){return String(e&&e.status||`ok`).toLowerCase()}function kH(e){if(!e||typeof e!=`object`)return`Runtime refresh completed.`;let t=Number(e.model_count||0),n=Number(e.provider_count||0),r=OH(e);return(r===`ok`?`Runtime refreshed.`:r===`partial`?`Runtime refresh completed with warnings.`:`Runtime refresh failed.`)+` `+t+` model`+(t===1?``:`s`)+` across `+n+` provider`+(n===1?``:`s`)+`.`}function AH(e){return!!e&&OH(e)===`ok`}function jH(e){let t=e&&e.steps;return Array.isArray(t)?t:[]}function MH(e){let t=String(e&&e.name||``).replace(/_/g,` `),n=String(e&&e.status||``).trim(),r=String(e&&(e.error||e.message)||``).trim();return t?r?t+`: `+n+` - `+r:t+`: `+n:r||n||``}var NH=B(`

      Runtime Refresh

      `),PH=B(`
    • `),FH=B(`
        `),IH=B(`
        `,1);function LH(e,t){O(t,!0);let n=j(!1),r=j(null);async function i(){if(!R(n)){M(n,!0),M(r,null);try{let e=await Ts(`/admin/runtime/refresh`,`POST`,void 0,{label:`runtime refresh`});if(e.stale)return;if(!e.ok){lc.error(`Runtime refresh failed.`);return}M(r,e.data&&typeof e.data==`object`?e.data:null,!0),AH(R(r))?lc.success(kH(R(r))):lc.error(kH(R(r))),Y.refresh()}catch(e){console.error(`Failed to refresh runtime:`,e),lc.error(`Runtime refresh failed.`)}finally{M(n,!1)}}}var a=IH(),o=F(a),s=P(o);iC(s,{copyId:`runtime-refresh-help-copy`,label:`runtime refresh help`,text:`Pull the latest model metadata, provider inventory, API keys, aliases, model access rules, guardrails, and workflows.`,title:e=>{V(e,NH())},$$slots:{title:!0}});var c=I(s,2),l=P(c);let u;J(P(l),{get icon(){return ho},class:`settings-refresh-icon`}),Ve(2),D(l),D(c),D(o);var d=I(o,2),f=P(d),p=e=>{var t=FH();W(t,21,()=>jH(R(r)),e=>e.name,(e,t)=>{var n=PH(),r=P(n,!0);D(n),L(e=>{G(n,1,`runtime-refresh-step is-${R(t).status??``}`,`svelte-yeq2mp`),H(r,e)},[()=>MH(R(t))]),V(e,n)}),D(t),V(e,t)},m=A(()=>jH(R(r)).length>0);U(f,e=>{R(m)&&e(p)}),D(d),L(()=>{u=G(l,1,`btn btn-primary btn-with-icon settings-refresh-btn`,null,u,{"is-refreshing":R(n)}),l.disabled=R(n),K(l,`aria-busy`,R(n)?`true`:`false`)}),z(`click`,l,i),V(e,a),k()}Br([`click`]);var RH=B(``),zH=B(`

        `),BH=B(`

        `),VH=B(``),HH=B(`
        `),UH=B(`

        AI Processing

        `);function WH(e,t){O(t,!0);let n=j(N([])),r=j(!1),i=j(``),a=j(``);async function o(){M(r,!0),M(a,``);try{let e=await ws(`/admin/runtime/settings`,{label:`runtime settings`});if(e.stale)return;if(!e.ok){M(a,`Unable to load runtime settings.`);return}M(n,Array.isArray(e.data?.settings)?e.data.settings:[],!0)}catch(e){console.error(`Failed to load runtime settings:`,e),M(a,`Unable to load runtime settings.`)}finally{M(r,!1)}}async function s(e,t,r){if(!(e.locked||R(i))){M(i,e.key,!0);try{let i=await Ts(`/admin/runtime/settings/${encodeURIComponent(e.key)}`,`PUT`,{value:t},{label:`save ${e.label}`});if(i.stale){r.value=e.value;return}if(!i.ok){r.value=e.value,lc.error(`Unable to save ${e.label}.`);return}M(n,R(n).map(t=>t.key===e.key?i.data:t),!0),lc.success(`${e.label} saved.`)}catch(t){r.value=e.value,console.error(`Failed to save runtime setting:`,t),lc.error(`Unable to save ${e.label}.`)}finally{M(i,``)}}}On(()=>{Y.refreshTick,o()});var c=Xr(),l=F(c),u=e=>{var t=UH(),o=P(t),c=I(P(o),2),l=e=>{var t=RH(),n=P(t,!0);D(t),L(()=>H(n,R(a))),V(e,t)};U(c,e=>{R(a)&&e(l)}),D(o);var u=I(o,2);W(u,21,()=>R(n),e=>e.key,(e,t)=>{var n=HH(),r=P(n),a=P(r),o=P(a,!0);D(a);var c=I(a,2),l=e=>{var n=zH(),r=P(n,!0);D(n),L(()=>H(r,R(t).description)),V(e,n)};U(c,e=>{R(t).description&&e(l)});var u=I(c,2),d=e=>{var n=BH(),r=P(n);D(n),L(()=>H(r,`Managed by ${(R(t).managed_by||`environment`)??``}`)),V(e,n)};U(u,e=>{R(t).locked&&e(d)}),D(r);var f=I(r,2);W(f,21,()=>R(t).options||[],e=>e.value,(e,t)=>{var n=VH(),r=P(n,!0);D(n);var i={};L(()=>{K(n,`title`,R(t).description||``),H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(f);var p;Hi(f),D(n),L(()=>{K(a,`for`,`runtime-setting-${R(t).key}`),H(o,R(t).label),K(f,`id`,`runtime-setting-${R(t).key}`),f.disabled=R(t).locked||R(i)!==``,p!==(p=R(t).value)&&(f.value=(f.__value=R(t).value)??``,Vi(f,R(t).value))}),z(`change`,f,e=>s(R(t),e.currentTarget.value,e.currentTarget)),V(e,n)}),D(u),D(t),L(()=>K(u,`aria-busy`,R(r)?`true`:`false`)),V(e,t)};U(l,e=>{(R(n).length>0||R(a))&&e(u)}),V(e,c),k()}Br([`change`]);var GH=B(`
        `);function KH(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`settings`&&(vs.ensureOptions(),ks.ensureLoaded())});var n=GH(),r=I(P(n),2),i=P(r);JV(i,{});var a=I(i,2);ZV(a,{});var o=I(a,2);sH(o,{});var s=I(o,2);lH(s,{});var c=I(s,2);xH(c,{});var l=I(c,2);WH(l,{});var u=I(l,2);DH(u,{}),LH(I(u,2),{}),D(r);var d=I(r,2),f=P(d,!0);D(d),D(n),L(e=>H(f,e),[()=>Wo()]),V(e,n),k()}var qH=B(`
        `),JH=B(`
         
        `),YH=B(`
         
        `),XH=B(`
         
        `),ZH=B(`
        `),QH=B(`
        `,1),$H=B(`
        `);function eU(e,t){O(t,!0);let n=q(t,`showPromptCache`,3,!0),r=MM({logPrefix:`Failed to copy interaction message:`}),i=A(()=>t.msg.role===`function_call`||t.msg.role===`function_result`);function a(e){return(Math.max(0,Math.min(1,Number(e||0)))*100).toFixed(1)+`%`}function o(e){let t=Math.max(0,Math.min(1,Number(e||0)));return t>0?Math.round(t*100)+`% of this visible prompt item is estimated provider-cached`:void 0}function s(e){return e.role===`function_call`?(e.toolCalls||[]).map(e=>e.name+`()`).join(`, `):(e.functionName?e.functionName+`: `:``)+e.text}var c=$H();let l;var u=P(c),d=e=>{var r=JH(),i=P(r),a=P(i),c=P(a,!0);D(a);var l=I(a,2),u=P(l,!0);D(l);var d=I(l,2),f=P(d,!0);D(d),D(i);var p=I(i,2),m=e=>{var n=qH(),r=P(n);D(n),L(()=>H(r,`Call ID: ${t.msg.functionCallID??``}`)),V(e,n)};U(p,e=>{t.msg.functionCallID&&e(m)});var h=I(p,2),g=e=>{var n=Xr();W(F(n),17,()=>t.msg.toolCalls,ii,(e,n)=>{var r=Xr(),i=F(r),a=e=>{var r=qH(),i=P(r);D(r),L(()=>H(i,`Call ID${t.msg.toolCalls.length>1?` (`+R(n).name+`)`:``}: ${R(n).id??``}`)),V(e,r)};U(i,e=>{R(n).id&&e(a)}),V(e,r)}),V(e,n)};U(h,e=>{t.msg.role===`function_call`&&t.msg.toolCalls&&e(g)});var _=I(h,2),v=P(_,!0);D(_),D(r),L((e,n,i,a)=>{K(r,`title`,e),H(c,t.msg.roleLabel),H(u,n),H(f,i),H(v,a)},[()=>n()?o(t.msg.promptCacheRatio):void 0,()=>s(t.msg),()=>vs.formatTimestamp(t.msg.timestamp),()=>fL(t.msg)]),V(e,r)},f=e=>{var r=QH(),i=F(r),a=P(i),s=P(a,!0);D(a);var c=I(a,2),l=P(c,!0);D(c),D(i);var u=I(i,2),d=e=>{var r=YH(),i=P(r,!0);D(r),L(e=>{K(r,`title`,e),H(i,t.msg.text)},[()=>n()?o(t.msg.promptCacheRatio):void 0]),V(e,r)};U(u,e=>{t.msg.text&&e(d)});var f=I(u,2),p=e=>{var n=ZH();W(n,23,()=>t.msg.toolCalls,(e,t)=>e.name+`-`+t,(e,t)=>{var n=XH(),r=P(n),i=P(r),a=P(i,!0);D(i);var o=I(i,2),s=P(o,!0);D(o),D(r);var c=I(r,2),l=e=>{var n=qH(),r=P(n);D(n),L(()=>H(r,`Call ID: ${R(t).id??``}`)),V(e,n)};U(c,e=>{R(t).id&&e(l)});var u=I(c,2),d=P(u,!0);D(u),D(n),L((e,n)=>{H(a,R(t).name+`()`),H(s,e),H(d,n)},[()=>mL(R(t))||`No arguments`,()=>mL(R(t))||`No arguments`]),V(e,n)}),D(n),V(e,n)};U(f,e=>{t.msg.toolCalls&&e(p)}),L((e,n)=>{K(i,`title`,e),H(s,t.msg.roleLabel),H(l,n)},[()=>n()?o(t.msg.promptCacheRatio):void 0,()=>vs.formatTimestamp(t.msg.timestamp)]),V(e,r)};U(u,e=>{R(i)?e(d):e(f,-1)});var p=I(u,2);let m;var h=P(p);{let e=A(()=>r.copied?Ga:Ja);J(h,{get icon(){return R(e)},width:`14`,height:`14`})}D(p),D(c),L(e=>{G(c,1,Ni([R(i)?`chat-function-note`:`chat-message`,t.msg.roleClass,{"is-anchor":t.msg.isAnchor,"is-after-anchor":t.msg.isAfterAnchor}]),`svelte-12s99s5`),K(c,`data-conversation-anchor`,t.msg.isAnchor?`true`:void 0),K(c,`data-entry-id`,t.msg.entryID),l=Bi(c,``,l,e),m=G(p,1,`chat-message-copy svelte-12s99s5`,null,m,{"is-copied":r.copied}),K(p,`aria-label`,r.copied?`Message copied`:`Copy message`),K(p,`title`,r.copied?`Copied`:`Copy message`)},[()=>({"--prompt-cache-fill":a(t.msg.promptCacheRatio),"--prompt-cache-visibility":n()&&t.msg.promptCacheRatio>0?`1`:`0`})]),z(`click`,p,e=>{e.stopPropagation(),r.copy(pL(t.msg))}),V(e,c),k()}Br([`click`]);function tU(e,t=0){let n=Math.max(0,aU(e)-Math.max(0,aU(t))),r=Math.min(320,Math.max(180,Math.floor(n*.58))),i=Math.min(360,Math.max(128,Math.floor(n*.35)));return{min:r,max:Math.max(r,n-i)}}function nU(e,t,n=0){let r=tU(t,n),i=aU(e)||520;return Math.min(r.max,Math.max(r.min,Math.round(i)))}function rU(e,t,n=0){return nU(aU(t)-aU(e),t,n)}function iU(e,t,n,r){if(!Array.isArray(e)||e.length===0)return{index:-1,align:`start`};let i=aU(t),a=0;e.forEach((e,t)=>{aU(e)<=i+1&&(a=t)});let o=Number(r)<0?-1:1,s=Math.min(e.length-1,Math.max(0,a+o)),c=e.length-1,l=aU(e[c])0&&s===c&&l?`end`:`start`}}function aU(e){let t=Number(e);return Number.isFinite(t)?t:0}var oU=B(`
        `),sU=B(`
        `),cU=B(`

        Loading interactions...

        `),lU=B(`

        No interaction data available for this entry.

        `),uU=B(``),dU=B(`
        `,1),fU=B(`

        Showing the newest part of this session and the selected log.

        `),pU=B(`
        `),mU=B(``),hU=B(``),gU=B(``);function _U(e,t){O(t,!0);let n=SL,r=Number(Sa(`gomodel_interactions_panel_width`)),i=`gomodel_interactions_prompt_cache_fill`,a=Number.isFinite(r)&&r>0?r:520,o=j(N(a)),s=j(320),c=j(760),l=j(!1),u=j(!1),d=j(Sa(i,`true`)!==`false`),f=null;function p(e,{fullscreen:t,revealWithoutSlide:n=!1}){let r=SP(180);return t?rc(e,{x:R(o),duration:r,easing:oc}):n?{duration:0}:ic(e,{axis:`x`,duration:r,easing:oc})}async function m(e){if(e===R(l))return;let t=R(l)&&!e;M(u,t,!0),M(l,e,!0),t&&(await xr(),M(u,!1))}function h(){M(d,!R(d)),Ca(i,R(d))}function g(){return(document.querySelector(`.sidebar`)?.getBoundingClientRect().width||0)+(document.querySelector(`.sidebar-toggle`)?.getBoundingClientRect().width||0)}function _(){let e=g(),t=tU(window.innerWidth,e);M(s,t.min,!0),M(c,t.max,!0),M(o,nU(a,window.innerWidth,e),!0)}function v(e){M(o,rU(e,window.innerWidth,g()),!0),a=R(o)}function y(e){e.button===0&&(e.preventDefault(),f=e.pointerId,e.currentTarget.setPointerCapture(e.pointerId),document.body.classList.add(`conversation-panel-resizing`),v(e.clientX))}function b(e){e.pointerId===f&&v(e.clientX)}function x(e){f===null||e.pointerId!==void 0&&e.pointerId!==f||(f=null,document.body.classList.remove(`conversation-panel-resizing`),Ca(`gomodel_interactions_panel_width`,a))}function S(e){e.key!==`ArrowLeft`&&e.key!==`ArrowRight`||(e.preventDefault(),a=R(o)+(e.key===`ArrowLeft`?24:-24),_(),a=R(o),Ca(`gomodel_interactions_panel_width`,a))}function C(e){let t=document.getElementById(`interactions-drawer-content`),r=n.conversationThreadEl;if(!t||!r)return;let i=[...r.querySelectorAll(`[data-conversation-message="true"]`)],a=t.getBoundingClientRect(),o=a.top+14,s=iU(i.map(e=>e.getBoundingClientRect().top),o,a.bottom,e),c=i[s.index];if(!c)return;let l=s.align===`end`?t.scrollHeight:t.scrollTop+c.getBoundingClientRect().top-a.top-14;t.scrollTo({top:l,behavior:SP(1)>0?`smooth`:`auto`})}function w(){return[document.querySelector(`.sidebar`),document.querySelector(`.sidebar-toggle`),document.getElementById(`dashboard-content`)].filter(Boolean)}On(()=>{if(!n.conversationOpen)return;_();let e=document.querySelector(`.sidebar`),t=new ResizeObserver(_);e&&t.observe(e);let r=e=>{e.key===`Escape`&&!Oa.anyOpen&&(R(l)?m(!1):n.closeConversation())};return window.addEventListener(`keydown`,r),window.addEventListener(`resize`,_),()=>{x({}),t.disconnect(),window.removeEventListener(`keydown`,r),window.removeEventListener(`resize`,_)}}),On(()=>{n.conversationOpen||M(l,!1)}),On(()=>{if(!R(l))return;let e=w().map(e=>({element:e,inert:e.inert,ariaHidden:e.getAttribute(`aria-hidden`)}));return e.forEach(({element:e})=>{e.inert=!0,e.setAttribute(`aria-hidden`,`true`)}),()=>{e.forEach(({element:e,inert:t,ariaHidden:n})=>{e.inert=t,n===null?e.removeAttribute(`aria-hidden`):e.setAttribute(`aria-hidden`,n)})}}),On(()=>{Yo.page!==`audit-logs`&&n.conversationOpen&&n.closeConversation()});var T=Xr(),E=F(T),ee=e=>{var t=Xr();W(F(t),16,()=>[R(l)],e=>e,(e,t)=>{var r=gU();let i,a;var l=P(r),f=I(l,2),g=P(f),_=I(P(g),2),v=P(_);let w;D(_),D(g);var T=I(g,2),E=P(T),ee=P(E);{let e=A(()=>t?so:oo);J(ee,{get icon(){return R(e)},class:`table-icon-svg`})}D(E),Rs(I(E,2),{label:`Close interactions`,onclick:()=>n.closeConversation(),get el(){return n.conversationCloseBtnEl},set el(e){n.conversationCloseBtnEl=e}}),D(T),D(f);var te=I(f,2),ne=P(te),re=e=>{var t=oU(),n=P(t);J(P(n),{get icon(){return Na},width:`14`,height:`14`}),D(n);var r=I(n,2);J(P(r),{get icon(){return Aa},width:`14`,height:`14`}),D(r),D(t),z(`click`,n,()=>C(-1)),z(`click`,r,()=>C(1)),V(e,t)};U(ne,e=>{n.conversationMessages.length>1&&e(re)});var ie=I(ne,2),ae=e=>{var t=sU(),r=P(t,!0);D(t),L(()=>H(r,n.conversationError)),V(e,t)};U(ie,e=>{n.conversationError&&e(ae)});var oe=I(ie,2),se=e=>{V(e,cU())};U(oe,e=>{n.conversationLoading&&e(se)});var ce=I(oe,2),le=e=>{V(e,lU())},ue=A(()=>!n.conversationLoading&&!n.followUpSending&&!n.conversationError&&n.conversationMessages.length===0&&!n.conversationLiveWaiting());U(ce,e=>{R(ue)&&e(le)});var de=I(ce,2),fe=e=>{var t=dU(),r=F(t),i=e=>{var t=uU(),n=P(t);let r;Ve(2),D(t),L(()=>{K(t,`aria-checked`,R(d)),K(t,`title`,(R(d)?`Hide`:`Show`)+` estimated provider prompt-cache fill`),r=G(n,1,`conversation-cache-switch svelte-ssrzja`,null,r,{"is-active":R(d)})}),z(`click`,t,h),V(e,t)},a=A(()=>n.conversationMessages.some(e=>Number(e.promptCacheRatio||0)>0));U(r,e=>{R(a)&&e(i)});var o=I(r,2);W(o,21,()=>n.conversationMessages,e=>e.uid,(e,t)=>{eU(e,{get msg(){return R(t)},get showPromptCache(){return R(d)}})}),D(o),ma(o,e=>n.conversationThreadEl=e,()=>n?.conversationThreadEl),V(e,t)};U(de,e=>{n.conversationMessages.length>0&&e(fe)});var pe=I(de,2),me=e=>{V(e,fU())};U(pe,e=>{n.conversationTruncated&&e(me)});var he=I(pe,2),ge=e=>{var t=pU(),r=I(P(t),2),i=P(r,!0);D(r),D(t),L(e=>H(i,e),[()=>n.conversationLiveStatusText()]),V(e,t)},_e=A(()=>n.conversationLiveWaiting());U(he,e=>{R(_e)&&e(ge)}),D(te);var ve=I(te,2),ye=e=>{var t=hU(),r=P(t),i=P(r);ut(i);var a=I(i,2),o=e=>{var t=mU(),r=P(t,!0);D(t),L(()=>H(r,n.followUpError)),V(e,t)};U(a,e=>{n.followUpError&&e(o)});var s=I(a,2),c=P(s),l=P(c,!0);D(c);var u=I(c,2),d=P(u,!0);D(u),D(s),D(r),D(t),L((e,t,r)=>{i.disabled=e,H(l,t),u.disabled=r,H(d,n.followUpSending?`Sending…`:`Send`)},[()=>n.followUpSending||n.conversationLiveWaiting(),()=>n.selectedConversationEntry()?.path||``,()=>!n.canSendFollowUp()]),zr(`submit`,r,e=>{e.preventDefault(),n.sendFollowUp()}),la(i,()=>n.followUpText,e=>n.followUpText=e),V(e,t)},be=A(()=>n.conversationAnchorID&&n.followUpKind());U(ve,e=>{R(be)&&e(ye)}),D(r),ma(r,e=>n.conversationDialogEl=e,()=>n?.conversationDialogEl),L(()=>{i=G(r,1,`conversation-drawer svelte-ssrzja`,null,i,{"conversation-drawer-fullscreen":t}),K(r,`role`,t?`dialog`:void 0),K(r,`aria-modal`,t?`true`:void 0),a=Bi(r,``,a,{"--conversation-panel-width":R(o)+`px`}),K(l,`aria-valuemin`,R(s)),K(l,`aria-valuemax`,R(c)),K(l,`aria-valuenow`,R(o)),K(_,`aria-label`,n.conversationFollowLatest?`Following the latest interaction`:`Viewing a historical interaction`),K(_,`title`,n.conversationFollowLatest?`Following the latest interaction as new events arrive`:`Viewing a historical interaction; live updates are not followed`),w=G(v,1,`live-dot`,null,w,{"is-streaming":n.conversationFollowLatest}),K(E,`aria-label`,t?`Exit fullscreen interactions`:`Show interactions fullscreen`),K(E,`title`,t?`Exit fullscreen`:`Fullscreen`),K(E,`aria-pressed`,t)}),z(`pointerdown`,l,y),z(`pointermove`,l,b),z(`pointerup`,l,x),zr(`pointercancel`,l,x),zr(`lostpointercapture`,l,x),z(`keydown`,l,S),z(`click`,E,()=>m(!t)),Di(7,r,()=>p,()=>({fullscreen:t,revealWithoutSlide:!t&&R(u)})),V(e,r)}),V(e,t)};U(E,e=>{n.conversationOpen&&e(ee)}),V(e,T),k()}Br([`pointerdown`,`pointermove`,`pointerup`,`keydown`,`click`]);var vU=B(`
        `,1);function yU(e,t){O(t,!0);let n={overview:OC,usage:wT,budgets:eD,"rate-limits":dO,models:Xj,workflows:_P,"audit-logs":pR,guardrails:oz,"mcp-servers":Bz,"providers-config":YB,"auth-keys":UV,settings:KH};vs.init(),Uc.init(),Y.init(),Ea.init(),Da.init(),Yo.init(),On(()=>{Y.refreshTick,ks.fetch(),Wc.fetchModels(),Wc.fetchCategories()}),On(()=>{document.body.classList.toggle(`dashboard-modal-open`,Oa.anyOpen)});let r=A(()=>n[Yo.page]||OC);var i=vU(),a=F(i);Is(a,{});var o=I(a,2);let s;var c=P(o);mc(c,{}),hi(I(c,2),()=>R(r),(e,t)=>{t(e,{})}),D(o);var l=I(o,2);_U(l,{});var u=I(l,2);Ks(u,{});var d=I(u,2);Qs(d,{}),fc(I(d,2),{}),L(()=>s=G(o,1,`content`,null,s,{"interactions-open":SL.conversationOpen})),V(e,i),k()}$r(yU,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/internal/admin/dashboard/static/dist/assets/index-D05Km9Si.js b/internal/admin/dashboard/static/dist/assets/index-D05Km9Si.js deleted file mode 100644 index ff9b4635c..000000000 --- a/internal/admin/dashboard/static/dist/assets/index-D05Km9Si.js +++ /dev/null @@ -1,68 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible;function d(e){return typeof e==`function`}var f=()=>{};function p(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function h(e,t,n=!1){return e===void 0?n?t():t:e}function g(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var _=1<<24,v=1024,y=2048,b=4096,x=8192,S=16384,C=32768,w=1<<25,T=65536,ee=1<<19,te=1<<20,ne=1<<25,re=65536,ie=1<<21,ae=1<<22,oe=1<<23,se=Symbol(`$state`),ce=Symbol(`legacy props`),le=Symbol(``),ue=Symbol(`attributes`),de=Symbol(`class`),fe=Symbol(`style`),pe=Symbol(`text`),me=Symbol(`form reset`),he=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ge=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function _e(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function ve(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function ye(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function be(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function xe(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Se(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ce(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function we(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Te(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Ee(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function De(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Oe={},ke=Symbol(`uninitialized`),Ae=`http://www.w3.org/1999/xhtml`,je=`http://www.w3.org/2000/svg`,Me=`http://www.w3.org/1998/Math/MathML`;function Ne(){console.warn(`https://svelte.dev/e/derived_inert`)}function Pe(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Fe(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function Ie(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var Le=!1;function Re(e){Le=e}var ze;function Be(e){if(e===null)throw Pe(),Oe;return ze=e}function Ve(){return Be(yn(ze))}function E(e){if(Le){if(yn(ze)!==null)throw Pe(),Oe;ze=e}}function He(e=1){if(Le){for(var t=e,n=ze;t--;)n=yn(n);ze=n}}function Ue(e=!0){for(var t=0,n=ze;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=yn(n);e&&n.remove(),n=i}}function We(e){if(!e||e.nodeType!==8)throw Pe(),Oe;return e.data}function Ge(e){return e===this.v}function Ke(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function qe(e){return!Ke(e,this.v)}var Je=null;function Ye(e){Je=e}function D(e,t=!1,n){Je={p:Je,i:!1,c:null,e:null,s:e,x:null,r:rr,l:null}}function O(e){var t=Je,n=t.e;if(n!==null){t.e=null;for(var r of n)An(r)}return e!==void 0&&(t.x=e),t.i=!0,Je=t.p,e??{}}function Xe(){return!0}var Ze=[];function Qe(){var e=Ze;Ze=[],p(e)}function $e(e){if(Ze.length===0&&!Rt){var t=Ze;queueMicrotask(()=>{t===Ze&&Qe()})}Ze.push(e)}function et(){for(;Ze.length>0;)Qe()}function tt(e){var t=rr;if(t===null)return er.f|=oe,e;if(!(t.f&32768)&&!(t.f&4))throw e;nt(e,t)}function nt(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}var rt=~(y|b|v);function it(e,t){e.f=e.f&rt|t}function at(e){e.f&512||e.deps===null?it(e,v):it(e,b)}function ot(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=re,ot(t.deps))}function st(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),ot(e.deps),it(e,v)}var ct=!1;function lt(e){var t=ct;try{return ct=!1,[e(),ct]}finally{ct=t}}function ut(e,t){if(t){let t=document.body;e.autofocus=!0,$e(()=>{document.activeElement===t&&e.focus()})}}function dt(e){Le&&vn(e)!==null&&bn(e)}var ft=!1;function pt(){ft||(ft=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[me]?.()})},{capture:!0}))}function mt(e){var t=er,n=rr;nr(null),ir(null);try{return e()}finally{nr(t),ir(n)}}function ht(e,t,n,r=n){e.addEventListener(t,()=>mt(n));let i=e[me];i?e[me]=()=>{i(),r(!0)}:e[me]=()=>r(!0),pt()}function gt(e){let t=0,n=rn(0),r;return()=>{Dn()&&(L(n),Fn(()=>(t===0&&(r=Tr(()=>e(()=>cn(n)))),t+=1,()=>{$e(()=>{--t,t===0&&(r?.(),r=void 0,cn(n))})})))}}var _t=T|ee;function vt(e,t,n,r){new yt(e,t,n,r)}var yt=class{parent;is_pending=!1;transform_error;#e;#t=Le?ze:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=gt(()=>(this.#m=rn(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=rr;t.b=this,t.f|=128,n(e)},this.parent=rr.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=In(()=>{if(Le){let e=this.#t;Ve();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},_t),Le&&(this.#e=ze)}#g(){try{this.#a=Rn(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=Rn(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=Rn(()=>e(this.#e)),$e(()=>{var e=this.#c=document.createDocumentFragment(),t=_n();e.append(t),this.#a=this.#x(()=>Rn(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,Gn(this.#o,()=>{this.#o=null}),this.#b(Pt))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=Rn(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Yn(this.#a,e);let t=this.#n.pending;this.#o=Rn(()=>t(this.#e))}else this.#b(Pt)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){st(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=rr,n=er,r=Je;ir(this.#i),nr(this.#i),Ye(this.#i.ctx);try{return Wt.ensure(),e()}catch(e){return tt(e),null}finally{ir(t),nr(n),Ye(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&Gn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,$e(()=>{this.#d=!1,this.#m&&on(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),L(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;Pt?.is_fork?(this.#a&&Pt.skip_effect(this.#a),this.#o&&Pt.skip_effect(this.#o),this.#s&&Pt.skip_effect(this.#s),Pt.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(Hn(this.#a),null),this.#o&&=(Hn(this.#o),null),this.#s&&=(Hn(this.#s),null),Le&&(Be(this.#t),He(),Be(Ue()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Ie();return}r=!0,i&&De(),this.#s!==null&&Gn(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){nt(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return Rn(()=>{var t=rr;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return nt(e,this.#i.parent),null}}))};$e(()=>{var t;try{t=this.transform_error(e)}catch(e){nt(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>nt(e,this.#i&&this.#i.parent)):o(t)})}};function bt(e,t,n,r){let i=Xe()?wt:Dt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=rr,c=xt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){nt(e,s)}St()}}var d=Ct();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>Et(e))).then(u).catch(e=>nt(e,s)).finally(d)}l?l.then(()=>{c(),f(),St()}):f()}function xt(){var e=rr,t=er,n=Je,r=Pt;return function(i=!0){ir(e),nr(t),Ye(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function St(e=!0){ir(null),nr(null),Ye(null),e&&Pt?.deactivate()}function Ct(){var e=rr,t=e.b,n=Pt,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function wt(e){var t=2|y;return rr!==null&&(rr.f|=ee),{ctx:Je,deps:null,effects:null,equals:Ge,f:t,fn:e,reactions:null,rv:0,v:ke,wv:0,parent:rr,ac:null}}var Tt=Symbol(`obsolete`);function Et(e,t,n){let r=rr;r===null&&_e();var i=void 0,a=rn(ke),o=!er,s=new Set;return Pn(()=>{var t=rr,n=m();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==he&&n.reject(e)}).finally(St)}catch(e){n.reject(e),St()}var c=Pt;if(o){if(t.f&32768)var l=Ct();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(Tt);else for(let e of s.values())e.reject(Tt);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==Tt&&(c.activate(),t?(a.f|=oe,on(a,t)):(a.f&8388608&&(a.f^=oe),on(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),On(()=>{for(let e of s)e.reject(Tt)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function k(e){let t=wt(e);return or(t),t}function Dt(e){let t=wt(e);return t.equals=qe,t}function Ot(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(he),t.ac=null}),t.fn!==null&&(t.teardown=f),br(t,0),Bn(t))}function Mt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&xr(t)}var Nt=null,Pt=null,Ft=null,It=null,Lt=null,Rt=!1,zt=!1,Bt=null,Vt=null,Ht=0,Ut=1,Wt=class e{id=Ut++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){Nt===null?Nt=this:(Nt.#n=this,this.#t=Nt),Nt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)it(r,y),t(r);for(r of n.m)it(r,b),t(r)}this.#p.add(e)}#g(){this.#e=!0,Ht++>1e3&&(this.#x(),Kt());for(let e of this.#u)this.#d.delete(e),it(e,y),this.schedule(e);for(let e of this.#d)it(e,b),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Bt=[],r=[],i=Vt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw $t(e),this.#h()||this.discard(),t}if(Pt=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Bt=null,Vt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)Qt(e,t);i.length>0&&Pt.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),Ft=this,Jt(r),Jt(n),Ft=null,this.#s?.resolve();var s=Pt;if(this.#a===0&&(this.#c.length===0||s!==null)&&this.#x(),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=v;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=v:i&4?t.push(r):gr(r)&&(i&16&&this.#d.add(r),xr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),it(i,y),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#x(),Pt=this,this.#g()}#b(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=m()).promise}static ensure(){if(Pt===null){let t=Pt=new e;!zt&&!Rt&&$e(()=>{t.#e||t.flush()})}return Pt}apply(){It=null}schedule(e){if(Lt=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}for(var t=e;t.parent!==null;){t=t.parent;var n=t.f;if(Bt!==null&&t===rr&&(er===null||!(er.f&2)))return;if(n&96){if(!(n&1024))return;t.f^=v}}this.#c.push(t)}#x(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?Nt=e:t.#t=e,this.linked=!1}}};function Gt(e){var t=Rt;Rt=!0;try{var n;for(e&&(Pt!==null&&!Pt.is_fork&&Pt.flush(),n=e());;){if(et(),Pt===null)return n;Pt.flush()}}finally{Rt=t}}function Kt(){try{Se()}catch(e){nt(e,Lt)}}var qt=null;function Jt(e){var t=e.length;if(t!==0){for(var n=0;n0)){tn.clear();for(let e of qt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)qt.has(n)&&(qt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||xr(n)}}qt.clear()}}qt=null}}function Yt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Yt(i,t,n,r):e&4194320&&!(e&2048)&&Xt(i,t,r)&&(it(i,y),Zt(i))}}function Xt(e,t,r){let i=r.get(e);if(i!==void 0)return i;if(e.deps!==null)for(let i of e.deps){if(n.call(t,i))return!0;if(i.f&2&&Xt(i,t,r))return r.set(i,!0),!0}return r.set(e,!1),!1}function Zt(e){Pt.schedule(e)}function Qt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),it(e,v);for(var n=e.first;n!==null;)Qt(n,t),n=n.next}}function $t(e){it(e,v);for(var t=e.first;t!==null;)$t(t),t=t.next}var en=new Set,tn=new Map,nn=!1;function rn(e,t){return{f:0,v:e,reactions:null,equals:Ge,rv:0,wv:0}}function A(e,t){let n=rn(e,t);return or(n),n}function an(e,t=!1,n=!0){let r=rn(e);return t||(r.equals=qe),r}function j(e,t,n=!1){return er!==null&&(!tr||er.f&131072)&&Xe()&&er.f&4325394&&(ar===null||!ar.has(e))&&Ee(),on(e,n?M(t):t,Vt)}function on(e,t,n=null){if(!e.equals(t)){tn.set(e,Qn?t:e.v);var r=Wt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&kt(t),It===null&&at(t)}e.wv=hr(),ln(e,y,n),Xe()&&rr!==null&&rr.f&1024&&!(rr.f&96)&&(lr===null?ur([e]):lr.push(e)),!r.is_fork&&en.size>0&&!nn&&sn()}return t}function sn(){nn=!1;for(let e of en){e.f&1024&&it(e,b);let t;try{t=gr(e)}catch{t=!0}t&&xr(e)}en.clear()}function cn(e){j(e,e.v+1)}function ln(e,t,n){var r=e.reactions;if(r!==null)for(var i=Xe(),a=r.length,o=0;o{if(pr===d)return e();var t=er,n=pr;nr(null),mr(d);var r=e();return nr(t),mr(n),r};return i&&r.set(`length`,A(t.length,u)),new Proxy(t,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&we();var i=r.get(t);return i===void 0?f(()=>{var e=A(n.value,u);return r.set(t,e),e}):j(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>A(ke,u));r.set(t,e),cn(o)}}else j(n,ke),cn(o);return!0},get(e,n,i){if(n===se)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>A(M(s?e[n]:ke),u)),r.set(n,o)),o!==void 0){var c=L(o);return c===ke?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=L(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==ke)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===se)return!0;var n=r.get(t),i=n!==void 0&&n.v!==ke||Reflect.has(e,t);return(n!==void 0||rr!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>A(i?M(e[t]):ke,u)),r.set(t,n)),L(n)===ke)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;dA(ke,u)),r.set(d+``,p)):j(p,ke)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>A(void 0,u)),j(c,M(n)),r.set(t,c));else{l=c.v!==ke;var m=f(()=>M(n));j(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&j(g,_+1)}cn(o)}return!0},ownKeys(e){L(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==ke});for(var[n,i]of r)i.v!==ke&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Te()}})}function un(e){try{if(typeof e==`object`&&e&&se in e)return e[se]}catch{}return e}function dn(e,t){return Object.is(un(e),un(t))}var fn,pn,mn,hn;function gn(){if(fn===void 0){fn=window,pn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;mn=a(t,`firstChild`).get,hn=a(t,`nextSibling`).get,u(e)&&(e[de]=void 0,e[ue]=null,e[fe]=void 0,e.__e=void 0),u(n)&&(n[pe]=void 0)}}function _n(e=``){return document.createTextNode(e)}function vn(e){return mn.call(e)}function yn(e){return hn.call(e)}function N(e,t){if(!Le)return vn(e);var n=vn(ze);if(n===null)n=ze.appendChild(_n());else if(t&&n.nodeType!==3){var r=_n();return n?.before(r),Be(r),r}return t&&Cn(n),Be(n),n}function P(e,t=!1){if(!Le){var n=vn(e);return n instanceof Comment&&n.data===``?yn(n):n}if(t){if(ze?.nodeType!==3){var r=_n();return ze?.before(r),Be(r),r}Cn(ze)}return ze}function F(e,t=1,n=!1){let r=Le?ze:e;for(var i;t--;)i=r,r=yn(r);if(!Le)return r;if(n){if(r?.nodeType!==3){var a=_n();return r===null?i?.after(a):r.before(a),Be(a),a}Cn(r)}return Be(r),r}function bn(e){e.textContent=``}function xn(){return!1}function Sn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function Cn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function wn(e){rr===null&&(er===null&&xe(e),be()),Qn&&ye(e)}function Tn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function En(e,t){var n=rr;n!==null&&n.f&8192&&(e|=x);var r={ctx:Je,deps:null,nodes:null,f:e|y|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};Pt?.register_created_effect(r);var i=r;if(e&4)Bt===null?Wt.ensure().schedule(r):Bt.push(r);else if(t!==null){try{xr(r)}catch(e){throw Hn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=T))}if(i!==null&&(i.parent=n,n!==null&&Tn(i,n),er!==null&&er.f&2&&!(e&64))){var a=er;(a.effects??=[]).push(i)}return r}function Dn(){return er!==null&&!tr}function On(e){let t=En(8,null);return it(t,v),t.teardown=e,t}function kn(e){wn(`$effect`);var t=rr.f;if(!er&&t&32&&Je!==null&&!Je.i){var n=Je;(n.e??=[]).push(e)}else return An(e)}function An(e){return En(4|te,e)}function jn(e){Wt.ensure();let t=En(64|ee,e);return()=>{Hn(t)}}function Mn(e){Wt.ensure();let t=En(64|ee,e);return(e={})=>new Promise(n=>{e.outro?Gn(t,()=>{Hn(t),n(void 0)}):(Hn(t),n(void 0))})}function Nn(e){return En(4,e)}function Pn(e){return En(ae|ee,e)}function Fn(e,t=0){return En(8|t,e)}function I(e,t=[],n=[],r=[]){bt(r,t,n,t=>{En(8,()=>{e(...t.map(L))})})}function In(e,t=0){return En(16|t,e)}function Ln(e,t=0){return En(_|t,e)}function Rn(e){return En(32|ee,e)}function zn(e){var t=e.teardown;if(t!==null){let e=Qn,n=er;$n(!0),nr(null);try{t.call(null)}finally{$n(e),nr(n)}}}function Bn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&mt(()=>{e.abort(he)});var r=n.next;n.f&64?n.parent=null:Hn(n,t),n=r}}function Vn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||Hn(t),t=n}}function Hn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Un(e.nodes.start,e.nodes.end),n=!0),e.f|=w,Bn(e,t&&!n),br(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();zn(e),e.f^=w,e.f|=S;var i=e.parent;i!==null&&i.first!==null&&Wn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Un(e,t){for(;e!==null;){var n=e===t?null:yn(e);e.remove(),e=n}}function Wn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Gn(e,t,n=!0){var r=[];Kn(e,r,!0);var i=()=>{n&&Hn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Kn(e,t,n){if(!(e.f&8192)){e.f^=x;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Kn(i,t,o?n:!1)}i=a}}}function qn(e){Jn(e,!0)}function Jn(e,t){if(e.f&8192){e.f^=x,e.f&1024||(it(e,y),Wt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;Jn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Yn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:yn(n);t.append(n),n=i}}var Xn=null,Zn=!1,Qn=!1;function $n(e){Qn=e}var er=null,tr=!1;function nr(e){er=e}var rr=null;function ir(e){rr=e}var ar=null;function or(e){er!==null&&(ar??=new Set).add(e)}var sr=null,cr=0,lr=null;function ur(e){lr=e}var dr=1,fr=0,pr=fr;function mr(e){pr=e}function hr(){return++dr}function gr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~re),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&It===null&&it(e,v)}return!1}function _r(e,t,n=!0){var r=e.reactions;if(r!==null&&!(ar!==null&&ar.has(e)))for(var i=0;i{e.ac.abort(he)}),e.ac=null);try{e.f|=ie;var u=e.fn,d=u();e.f|=C;var f=e.deps,p=Pt?.is_fork;if(sr!==null){var m;if(p||br(e,cr),f!==null&&cr>0)for(f.length=cr+sr.length,m=0;m{s.ac.abort(he),s.ac=null,it(s,y)}),jt(s),br(s,0)}}function br(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?$e(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function Br(e,t,n,r,i){var a={capture:r,passive:i},o=zr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&On(()=>{t.removeEventListener(e,o,a)})}function R(e,t,n){(t[Ir]??={})[e]=n}function Vr(e){for(var t=0;t{throw e});throw p}}finally{e[Ir]=t,delete e.currentTarget,nr(d),ir(f)}}}var Wr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function Gr(e){return Wr?.createHTML(e)??e}function Kr(e){var t=Sn(`template`);return t.innerHTML=Gr(e.replaceAll(``,``)),t.content}function qr(e,t){var n=rr;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function z(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(Le)return qr(ze,null),ze;i===void 0&&(i=Kr(a?e:``+e),n||(i=vn(i)));var t=r||pn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=vn(t),s=t.lastChild;qr(o,s)}else qr(t,t);return t}}function Jr(e,t,n=`svg`){var r=!e.startsWith(``),i=(t&1)!=0,a=`<${n}>${r?e:``+e}`,o;return()=>{if(Le)return qr(ze,null),ze;if(!o){var e=vn(Kr(a));if(i)for(o=document.createDocumentFragment();vn(e);)o.appendChild(vn(e));else o=vn(e)}var t=o.cloneNode(!0);if(i){var n=vn(t),r=t.lastChild;qr(n,r)}else qr(t,t);return t}}function Yr(e,t){return Jr(e,t,`svg`)}function Xr(e=``){if(!Le){var t=_n(e+``);return qr(t,t),t}var n=ze;return n.nodeType===3?Cn(n):(n.before(n=_n()),Be(n)),qr(n,n),n}function Zr(){if(Le)return qr(ze,null),ze;var e=document.createDocumentFragment(),t=document.createComment(``),n=_n();return e.append(t,n),qr(t,n),e}function B(e,t){if(Le){var n=rr;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=ze),Ve();return}e!==null&&e.before(t)}var Qr=!0;function $r(e){Qr=e}function V(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[pe]??=e.nodeValue)&&(e[pe]=n,e.nodeValue=`${n}`)}function ei(e,t){return ni(e,t)}var ti=new Map;function ni(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){gn();var l=void 0,u=Mn(()=>{var u=n??t.appendChild(_n());vt(u,{pending:()=>{}},t=>{D({});var n=Je;if(o&&(n.c=o),a&&(i.$$events=a),Le&&qr(t,null),Qr=s,l=e(t,i)||{},Qr=!0,Le&&(rr.nodes.end=ze,ze===null||ze.nodeType!==8||ze.data!==`]`))throw Pe(),Oe;O()},c);var d=new Set,f=e=>{for(var n=0;n{for(var e of d)for(let n of[t,document]){var r=ti.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,Ur),r.delete(e),r.size===0&&ti.delete(n)):r.set(e,i)}Rr.delete(f),u!==n&&u.parentNode?.removeChild(u)}});return ri.set(l,u),l}var ri=new WeakMap,ii=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)qn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(qn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(Hn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Yn(r,t),t.append(_n()),this.#n.set(e,{effect:r,fragment:t})}else Hn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Gn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(Hn(n.effect),this.#n.delete(e))};ensure(e,t){var n=Pt,r=xn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=_n();i.append(a),this.#n.set(e,{effect:Rn(()=>t(a)),fragment:i})}else this.#t.set(e,Rn(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else Le&&(this.anchor=ze),this.#a(n)}};function H(e,t,n=!1){var r;Le&&(r=ze,Ve());var i=new ii(e),a=n?T:0;function o(e,t){if(Le){var n=We(r);if(e!==parseInt(n.substring(1))){var a=Ue();Be(a),i.anchor=a,Re(!1),i.ensure(e,t),Re(!0);return}}i.ensure(e,t)}In(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function ai(e,t){return t}function oi(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;si(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null;if(l){var u=n,d=u.parentNode;bn(d),d.append(u),e.items.clear()}si(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function si(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,ui(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=ne,fi(d,null,c)):qn(d):Gn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:In(()=>{p=L(f);var e=p.length;let t=!1;Le&&We(c)===`[!`!=(e===0)&&(c=Ue(),Be(c),Re(!1),t=!0);for(var r=new Set,u=Pt,v=xn(),y=0;ys(c)):(d=Rn(()=>s(ci??=_n())),d.f|=ne)),e>r.size&&ve(``,``,``),Le&&e>0&&Be(Ue()),!h)if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);t&&Re(!0),L(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,Le&&(c=ze)}function li(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function ui(e,t,n,i,a){var o=(i&8)!=0,s=t.length,c=e.items,l=li(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var ee=i&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function di(e,t,n,r,i,a,o,s){var c=o&1?o&16?rn(n):an(n,!1,!1):null,l=o&2?rn(i):null;return{v:c,i:l,e:Rn(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function fi(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=yn(r);if(a.before(r),r===i)return;r=o}}function pi(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function mi(e,t,n=!1,r=!1,i=!1,a=!1){var o=e,s=``;if(n){var c=e;Le&&(o=Be(vn(c)))}I(()=>{var e=rr;if(s===(s=t()??``)){Le&&Ve();return}if(n&&!Le){e.nodes=null,c.innerHTML=s,s!==``&&qr(vn(c),c.lastChild);return}if(e.nodes!==null&&(Un(e.nodes.start,e.nodes.end),e.nodes=null),s!==``){if(Le){for(var a=ze.data,l=Ve(),u=l;l!==null&&(l.nodeType!==8||l.data!==``);)u=l,l=yn(l);if(l===null)throw Pe(),Oe;qr(ze,u),o=Be(l);return}var d=Sn(r?`svg`:i?`math`:`template`,r?je:i?Me:void 0);d.innerHTML=s;var f=r||i?d:d.content;if(qr(vn(f),f.lastChild),r||i)for(;vn(f);)o.before(vn(f));else o.before(f)}})}function hi(e,t,...n){var r=new ii(e);In(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},T)}function gi(e,t,n){var r;Le&&(r=ze,Ve());var i=new ii(e);In(()=>{var e=t()??null;if(Le&&We(r)===`[`!=(e!==null)){var a=Ue();Be(a),i.anchor=a,Re(!1),i.ensure(e,e&&(t=>n(t,e))),Re(!0);return}i.ensure(e,e&&(t=>n(t,e)))},T)}var _i=()=>performance.now(),vi={tick:e=>requestAnimationFrame(e),now:()=>_i(),tasks:new Set};function yi(){let e=vi.now();vi.tasks.forEach(t=>{t.c(e)||(vi.tasks.delete(t),t.f())}),vi.tasks.size!==0&&vi.tick(yi)}function bi(e){let t;return vi.tasks.size===0&&vi.tick(yi),{promise:new Promise(n=>{vi.tasks.add(t={c:e,f:n})}),abort(){vi.tasks.delete(t)}}}function xi(e,t){mt(()=>{e.dispatchEvent(new CustomEvent(t))})}function Si(e){if(e===`float`)return`cssFloat`;if(e===`offset`)return`cssOffset`;if(e.startsWith(`--`))return e;let t=e.split(`-`);return t.length===1?t[0]:t[0]+t.slice(1).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)}function Ci(e){let t={},n=e.split(`;`);for(let e of n){let[n,r]=e.split(`:`);if(!n||r===void 0)break;let i=Si(n.trim());t[i]=r.trim()}return t}var wi=e=>e,Ti=null;function Ei(e){Ti=e}function Di(e,t,n){var r=(Ti??rr).nodes,i,a,o,s=null;r.a??={element:e,measure(){i=this.element.getBoundingClientRect()},apply(){if(o?.abort(),a=this.element.getBoundingClientRect(),i.left!==a.left||i.right!==a.right||i.top!==a.top||i.bottom!==a.bottom){let e=t()(this.element,{from:i,to:a},n?.());o=ki(this.element,e,void 0,1,()=>{},()=>{o?.abort(),o=void 0})}},fix(){if(!e.getAnimations().length){var{position:t,width:n,height:r}=getComputedStyle(e);if(t!==`absolute`&&t!==`fixed`){var a=e.style;s={position:a.position,width:a.width,height:a.height,transform:a.transform},a.position=`absolute`,a.width=n,a.height=r;var o=e.getBoundingClientRect();if(i.left!==o.left||i.top!==o.top){var c=`translate(${i.left-o.left}px, ${i.top-o.top}px)`;a.transform=a.transform?`${a.transform} ${c}`:c}}}},unfix(){if(s){var t=e.style;t.position=s.position,t.width=s.width,t.height=s.height,t.transform=s.transform}}},r.a.element=e}function Oi(e,t,n,r){var i=(e&1)!=0,a=(e&2)!=0,o=i&&a,s=(e&4)!=0,c=o?`both`:i?`in`:`out`,l,u=t.inert,d=t.style.overflow,f,p;function m(){return mt(()=>l??=n()(t,r?.()??{},{direction:c}))}var h={is_global:s,in(){if(t.inert=u,!i){p?.abort(),p?.reset?.();return}a||f?.abort(),f=ki(t,m(),p,1,()=>{xi(t,`introstart`)},()=>{xi(t,`introend`),f?.abort(),f=l=void 0,t.style.overflow=d})},out(e){if(!a){e?.(),l=void 0;return}t.inert=!0,p=ki(t,m(),f,0,()=>{xi(t,`outrostart`)},()=>{xi(t,`outroend`),e?.()})},stop:()=>{f?.abort(),p?.abort()}},g=rr;if((g.nodes.t??=[]).push(h),i&&Qr){var _=s;if(!_){for(var v=g.parent;v&&v.f&65536;)for(;(v=v.parent)&&!(v.f&16););_=!v||(v.f&32768)!=0}_&&Nn(()=>{Tr(()=>h.in())})}}function ki(e,t,n,r,i,a){var o=r===1;if(d(t)){var s,c=!1;return $e(()=>{c||(s=ki(e,t({direction:o?`in`:`out`}),n,r,i,a))}),{abort:()=>{c=!0,s?.abort()},deactivate:()=>s.deactivate(),reset:()=>s.reset(),t:()=>s.t()}}if(n?.deactivate(),!t?.duration&&!t?.delay)return i(),a(),{abort:f,deactivate:f,reset:f,t:()=>r};let{delay:l=0,css:u,tick:p,easing:m=wi}=t;var h=[];if(o&&n===void 0&&(p&&p(0,1),u)){var g=Ci(u(0,1));h.push(g,g)}var _=()=>1-r,v=e.animate(h,{duration:l,fill:`forwards`});return v.onfinish=()=>{v.cancel(),i();var o=n?.t()??1-r;n?.abort();var s=r-o,c=t.duration*Math.abs(s),l=[];if(c>0){var d=!1;if(u)for(var f=Math.ceil(c/(1e3/60)),h=0;h<=f;h+=1){var g=o+s*m(h/f),y=Ci(u(g,1-g));l.push(y),d||=y.overflow===`hidden`}d&&(e.style.overflow=`hidden`),_=()=>{var e=v.currentTime;return o+s*m(e/c)},p&&bi(()=>{if(v.playState!==`running`)return!1;var e=_();return p(e,1-e),!0})}v=e.animate(l,{duration:c,fill:`forwards`}),v.onfinish=()=>{_=()=>r,p?.(r,1-r),a()}},{abort:()=>{v&&(v.cancel(),v.effect=null,v.onfinish=f)},deactivate:()=>{a=f},reset:()=>{r===0&&p?.(1,0)},t:()=>_()}}function Ai(e,t,n,r,i,a){let o=Le;Le&&Ve();var s=null;Le&&ze.nodeType===1&&(s=ze,Ve());var c=Le?ze:e,l=rr,u=new ii(c,!1);In(()=>{let e=t()||null;var a=i?i():n||e===`svg`?je:void 0;if(e===null){u.ensure(null,null),$r(!0);return}return u.ensure(e,t=>{if(e){if(s=Le?s:Sn(e,a),qr(s,s),r){var n=null;Le&&Fr(e)&&s.append(n=document.createComment(``));var i=Le?vn(s):s.appendChild(_n());Le&&(i===null?Re(!1):Be(i)),Ei(l),r(s,i),n?.remove(),Ei(null)}rr.nodes.end=s,t.before(s)}Le&&Be(t)}),$r(!0),()=>{e&&$r(!1)}},T),On(()=>{$r(!0)}),o&&(Re(!0),Be(c))}function ji(e,t){var n=void 0,r;Ln(()=>{n!==(n=t())&&(r&&=(Hn(r),null),n&&(r=Rn(()=>{Nn(()=>n(e))})))})}function Mi(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||Fi.includes(r[o-1]))&&(s===r.length||Fi.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Li(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function Ri(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function zi(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(Ri)),i&&c.push(...Object.keys(i).map(Ri));var l=0,u=-1;let t=e.length;for(var d=0;d{Hi(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),On(()=>{t.disconnect()})}function Wi(e,t,n=t){var r=new WeakSet,i=!0;ht(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),Gi);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&Gi(o)}n(a),e.__value=a,Pt!==null&&r.add(Pt)}),Nn(()=>{var a=t();if(e===document.activeElement){var o=Pt;if(r.has(o))return}if(Hi(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=Gi(s),n(a))}e.__value=a,i=!1}),Ui(e)}function Gi(e){return`__value`in e?e.__value:e.value}var Ki=Symbol(`class`),qi=Symbol(`style`),Ji=Symbol(`is custom element`),Yi=Symbol(`is html`),Xi=ge?`link`:`LINK`,Zi=ge?`input`:`INPUT`,Qi=ge?`option`:`OPTION`,$i=ge?`select`:`SELECT`,ea=ge?`progress`:`PROGRESS`;function ta(e){if(Le){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;G(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;G(e,`checked`,null),e.checked=r}}};e[me]=n,$e(n),pt()}}function na(e,t){var n=sa(e);n.value===(n.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==ea)||(e.value=t??``)}function ra(e,t){var n=sa(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function ia(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function G(e,t,n,r){var i=sa(e);Le&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Xi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[le]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&la(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function aa(e,t,n,r,i=!1,a=!1){if(Le&&i&&e.nodeName===Zi){var o=e;(o.type===`checkbox`?`defaultChecked`:`defaultValue`)in n||ta(o)}var s=sa(e),c=s[Ji],l=!s[Yi];let u=Le&&c;u&&Re(!1);var d=t||{},f=e.nodeName===Qi;for(var p in t)p in n||(n[p]=null);n.class?n.class=Pi(n.class):(r||n[Ki])&&(n.class=null),n[qi]&&(n.style??=null);var m=la(e);if(e.nodeName===Zi&&`type`in n&&(`value`in n||`__value`in n)){var h=n.type;(h!==d.type||h===void 0&&e.hasAttribute(`type`))&&(d.type=h,G(e,`type`,h,a))}for(let i in n){let o=n[i];if(f&&i===`value`&&o==null){e.value=e.__value=``,d[i]=o;continue}if(i===`class`){W(e,e.namespaceURI===`http://www.w3.org/1999/xhtml`,o,r,t?.[Ki],n[Ki]),d[i]=o,d[Ki]=n[Ki];continue}if(i===`style`){Vi(e,o,t?.[qi],n[qi]),d[i]=o,d[qi]=n[qi];continue}var g=d[i];if(!(o===g&&!(o===void 0&&e.hasAttribute(i)))){d[i]=o;var _=i[0]+i[1];if(_!==`$$`)if(_===`on`){let t={},n=`$$`+i,r=i.slice(2);var v=Or(r);if(Er(r)&&(r=r.slice(0,-7),t.capture=!0),!v&&g){if(o!=null)continue;e.removeEventListener(r,d[n],t),d[n]=null}if(v)R(r,e,o),Vr([r]);else if(o!=null){function a(e){d[i].call(this,e)}d[n]=zr(r,e,a,t)}}else if(i===`style`)G(e,i,o);else if(i===`autofocus`)ut(e,!!o);else if(!c&&(i===`__value`||i===`value`&&o!=null))e.value=e.__value=o;else if(i===`selected`&&f)ia(e,o);else{var y=i;l||(y=jr(y));var b=y===`defaultValue`||y===`defaultChecked`;if(o==null&&!c&&!b)if(s[i]=null,y===`value`||y===`checked`){let n=e,r=t===void 0;if(y===`value`){let e=n.defaultValue;n.removeAttribute(y),n.defaultValue=e,n.value=n.__value=r?e:null}else{let e=n.defaultChecked;n.removeAttribute(y),n.defaultChecked=e,n.checked=r?e:!1}}else e.removeAttribute(i);else b||m.includes(y)&&(c||typeof o!=`string`)?(e[y]=o,y in s&&(s[y]=ke)):typeof o!=`function`&&G(e,y,o,a)}}}return u&&Re(!0),d}function oa(e,t,n=[],r=[],i=[],a,o=!1,s=!1){bt(i,n,r,n=>{var r=void 0,i={},c=e.nodeName===$i,l=!1;if(Ln(()=>{var u=t(...n.map(L)),d=aa(e,r,u,a,o,s);l&&c&&`value`in u&&Hi(e,u.value);for(let e of Object.getOwnPropertySymbols(i))u[e]||Hn(i[e]);for(let t of Object.getOwnPropertySymbols(u)){var f=u[t];t.description===`@attach`&&(!r||f!==r[t])&&(i[t]&&Hn(i[t]),i[t]=Rn(()=>ji(e,()=>f))),d[t]=f}r=d}),c){var u=e;Nn(()=>{Hi(u,r.value,!0),Ui(u)})}l=!0})}function sa(e){return e[ue]??={[Ji]:e.nodeName.includes(`-`),[Yi]:e.namespaceURI===Ae}}var ca=new Map;function la(e){var t=e.getAttribute(`is`)||e.nodeName,n=ca.get(t);if(n)return n;ca.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.push(s);i=l(i)}return n}function ua(e,t,n=t){var r=new WeakSet;ht(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=fa(e)?pa(a):a,n(a),Pt!==null&&r.add(Pt),await Sr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(Le&&e.defaultValue!==e.value||Tr(t)==null&&e.value)&&(n(fa(e)?pa(e.value):e.value),Pt!==null&&r.add(Pt)),Fn(()=>{var n=t();if(e===document.activeElement){var i=Pt;if(r.has(i))return}fa(e)&&n===pa(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function da(e,t,n=t){ht(e,`change`,t=>{n(t?e.defaultChecked:e.checked)}),(Le&&e.defaultChecked!==e.checked||Tr(t)==null)&&n(e.checked),Fn(()=>{e.checked=!!t()})}function fa(e){var t=e.type;return t===`number`||t===`range`}function pa(e){return e===``?null:+e}function ma(e,t){return e===t||e?.[se]===t}function ha(e={},t,n,r){var i=Je.r,a=rr;return Nn(()=>{var o,s;return Fn(()=>{o=s,s=r?.()||[],Tr(()=>{ma(n(...s),e)||(t(e,...s),o&&ma(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&ma(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}var ga={get(e,t){if(!e.exclude.has(t))return e.props[t]},set(e,t){return!1},getOwnPropertyDescriptor(e,t){if(!e.exclude.has(t)&&t in e.props)return{enumerable:!0,configurable:!0,value:e.props[t]}},has(e,t){return!e.exclude.has(t)&&t in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(t=>!e.exclude.has(t))}};function _a(e,t,n){return new Proxy({props:e,exclude:t},ga)}function K(e,t,n,r){var i=!0,o=(n&8)!=0,s=(n&16)!=0,c=r,l=!0,u=void 0,d=()=>s&&i?(u??=wt(r),L(u)):(l&&(l=!1,c=s?Tr(r):r),c);let f;if(o){var p=se in e||ce in e;f=a(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;o?[m,h]=lt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Ce(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?wt:Dt)(()=>(v=!1,g()));o&&L(y);var b=rr;return(function(e,t){if(arguments.length>0){let n=t?L(y):i&&o?M(e):e;return j(y,n),v=!0,c!==void 0&&(c=n),e}return Qn&&v||b.f&16384?y.v:L(y)})}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var va=new Set([`$$slots`,`$$events`,`$$legacy`,`icon`,`class`]),ya=Yr(``);function q(e,t){let n=K(t,`icon`,19,()=>[]),r=K(t,`class`,3,``),i=_a(t,va);var a=ya();oa(a,()=>({xmlns:`http://www.w3.org/2000/svg`,width:`24`,height:`24`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,class:r(),"aria-hidden":`true`,focusable:`false`,...i}));{let e=(t,n=f)=>{var r=Zr();U(P(r),17,n,ai,(t,n)=>{var r=k(()=>g(L(n),3));let i=()=>L(r)[0],a=()=>L(r)[1],o=()=>L(r)[2];var s=Zr();Ai(P(s),i,!0,(t,n)=>{oa(t,()=>({xmlns:`http://www.w3.org/2000/svg`,...a()}));var r=Zr(),i=P(r),s=t=>{e(t,o)},c=k(()=>Array.isArray(o()));H(i,e=>{L(c)&&e(s)}),B(n,r)}),B(t,s)}),B(t,r)};e(N(a),n),E(a)}B(e,a)}var ba=Yr(``);function xa(e){B(e,ba())}function Sa(){try{return typeof localStorage>`u`?null:localStorage}catch{return null}}function Ca(e,t=null){let n=Sa();if(!n)return t;try{return n.getItem(e)??t}catch{return t}}function wa(e,t){let n=Sa();if(n)try{n.setItem(e,String(t))}catch{}}function Ta(e){let t=Number(e);return Number.isFinite(t)?Math.min(240,Math.max(60,Math.round(t))):240}function Ea(e,t,n){return Ta(Number(e)+Number(n)-Number(t))}var Da=new class{#e=A(`system`);get theme(){return L(this.#e)}set theme(e){j(this.#e,e,!0)}#t=A(0);get tick(){return L(this.#t)}set tick(e){j(this.#t,e,!0)}init(){this.theme=Ca(`gomodel_theme`,`system`),this.apply(),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{this.theme===`system`&&this.tick++})}set(e){this.theme=e,wa(`gomodel_theme`,e),this.apply(),this.tick++}toggle(){let e=[`light`,`system`,`dark`];this.set(e[(e.indexOf(this.theme)+1)%e.length])}apply(){let e=document.documentElement;this.theme===`system`?e.removeAttribute(`data-theme`):e.setAttribute(`data-theme`,this.theme)}},Oa=new class{#e=A(M(240));get width(){return L(this.#e)}set width(e){j(this.#e,e,!0)}get collapsed(){return this.width===60}init(){let e=Ca(`gomodel_sidebar_width`),t=Ca(`gomodel_sidebar_collapsed`)===`true`;this.setWidth(e??(t?60:240))}toggle(){this.setWidth(this.collapsed?240:60,!0)}setWidth(e,t=!1){this.width=Ta(e),typeof document<`u`&&document.documentElement.style.setProperty(`--sidebar-width`,`${this.width}px`),t&&(wa(`gomodel_sidebar_width`,this.width),wa(`gomodel_sidebar_collapsed`,this.collapsed))}},ka=new class{#e=A(M([]));get stack(){return L(this.#e)}set stack(e){j(this.#e,e,!0)}#t=1;opened(){let e=this.#t++;return this.stack=[...this.stack,e],e}closed(e){this.stack=this.stack.filter(t=>t!==e)}isTop(e){return this.stack.length>0&&this.stack[this.stack.length-1]===e}get openCount(){return this.stack.length}get anyOpen(){return this.stack.length>0}},Aa=[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`}]],ja=[[`path`,{d:`M12 5v14`}],[`path`,{d:`m19 12-7 7-7-7`}]],Ma=[[`path`,{d:`m12 19-7-7 7-7`}],[`path`,{d:`M19 12H5`}]],Na=[[`path`,{d:`M5 12h14`}],[`path`,{d:`m12 5 7 7-7 7`}]],Pa=[[`path`,{d:`m5 12 7-7 7 7`}],[`path`,{d:`M12 19V5`}]],Fa=[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`}],[`path`,{d:`M12 22V12`}]],Ia=[[`rect`,{width:`16`,height:`20`,x:`4`,y:`2`,rx:`2`}],[`line`,{x1:`8`,x2:`16`,y1:`6`,y2:`6`}],[`line`,{x1:`16`,x2:`16`,y1:`14`,y2:`18`}],[`path`,{d:`M16 10h.01`}],[`path`,{d:`M12 10h.01`}],[`path`,{d:`M8 10h.01`}],[`path`,{d:`M12 14h.01`}],[`path`,{d:`M8 14h.01`}],[`path`,{d:`M12 18h.01`}],[`path`,{d:`M8 18h.01`}]],La=[[`path`,{d:`M8 2v4`}],[`path`,{d:`M16 2v4`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`}],[`path`,{d:`M3 10h18`}],[`path`,{d:`M8 14h.01`}],[`path`,{d:`M12 14h.01`}],[`path`,{d:`M16 14h.01`}],[`path`,{d:`M8 18h.01`}],[`path`,{d:`M12 18h.01`}],[`path`,{d:`M16 18h.01`}]],Ra=[[`path`,{d:`M8 2v4`}],[`path`,{d:`M16 2v4`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`}],[`path`,{d:`M3 10h18`}]],za=[[`path`,{d:`M13 17V9`}],[`path`,{d:`M18 17V5`}],[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`}],[`path`,{d:`M8 17v-3`}]],Ba=[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`}],[`path`,{d:`M18 17V9`}],[`path`,{d:`M13 17V5`}],[`path`,{d:`M8 17v-3`}]],Va=[[`path`,{d:`M20 6 9 17l-5-5`}]],Ha=[[`path`,{d:`m6 9 6 6 6-6`}]],Ua=[[`path`,{d:`m15 18-6-6 6-6`}]],Wa=[[`path`,{d:`m9 18 6-6-6-6`}]],Ga=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`}],[`path`,{d:`m9 11 3 3L22 4`}]],Ka=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`m9 12 2 2 4-4`}]],qa=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8`}],[`path`,{d:`M12 18V6`}]],Ja=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M12 6v6l4 2`}]],Ya=[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`}]],Xa=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 15 21.84`}],[`path`,{d:`M21 5V8`}],[`path`,{d:`M21 12L18 17H22L19 22`}],[`path`,{d:`M3 12A9 3 0 0 0 14.59 14.87`}]],Za=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`}]],Qa=[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`}],[`path`,{d:`M10 9H8`}],[`path`,{d:`M16 13H8`}],[`path`,{d:`M16 17H8`}]],$a=[[`path`,{d:`m12 14 4-4`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`}]],eo=[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`}],[`path`,{d:`M3 3v5h5`}],[`path`,{d:`M12 7v5l4 2`}]],to=[[`circle`,{cx:`12`,cy:`12`,r:`10`}],[`path`,{d:`M12 16v-4`}],[`path`,{d:`M12 8h.01`}]],no=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],ro=[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`}]],io=[[`path`,{d:`M3 5h.01`}],[`path`,{d:`M3 12h.01`}],[`path`,{d:`M3 19h.01`}],[`path`,{d:`M8 5h13`}],[`path`,{d:`M8 12h13`}],[`path`,{d:`M8 19h13`}]],ao=[[`circle`,{cx:`12`,cy:`16`,r:`1`}],[`rect`,{x:`3`,y:`10`,width:`18`,height:`12`,rx:`2`}],[`path`,{d:`M7 10V7a5 5 0 0 1 10 0v3`}]],oo=[[`path`,{d:`m16 17 5-5-5-5`}],[`path`,{d:`M21 12H9`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`}]],so=[[`path`,{d:`M15 3h6v6`}],[`path`,{d:`m21 3-7 7`}],[`path`,{d:`m3 21 7-7`}],[`path`,{d:`M9 21H3v-6`}]],co=[[`path`,{d:`m14 10 7-7`}],[`path`,{d:`M20 10h-6V4`}],[`path`,{d:`m3 21 7-7`}],[`path`,{d:`M4 14h6v6`}]],lo=[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`}]],uo=[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`}]],fo=[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`}],[`path`,{d:`m15 5 4 4`}]],po=[[`path`,{d:`M12 22v-5`}],[`path`,{d:`M15 8V2`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`}],[`path`,{d:`M9 8V2`}]],mo=[[`path`,{d:`M5 12h14`}],[`path`,{d:`M12 5v14`}]],ho=[[`path`,{d:`M12 2v10`}],[`path`,{d:`M18.4 6.6a9 9 0 1 1-12.77.04`}]],go=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`}],[`path`,{d:`M21 3v5h-5`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`}],[`path`,{d:`M8 16H3v5`}]],_o=[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`}],[`path`,{d:`M3 3v5h5`}]],vo=[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`}]],yo=[[`path`,{d:`m21 21-4.34-4.34`}],[`circle`,{cx:`11`,cy:`11`,r:`8`}]],bo=[[`path`,{d:`m10.852 14.772-.383.923`}],[`path`,{d:`M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923`}],[`path`,{d:`m13.148 9.228.383-.923`}],[`path`,{d:`m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544`}],[`path`,{d:`m14.772 10.852.923-.383`}],[`path`,{d:`m14.772 13.148.923.383`}],[`path`,{d:`M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5`}],[`path`,{d:`M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5`}],[`path`,{d:`M6 18h.01`}],[`path`,{d:`M6 6h.01`}],[`path`,{d:`m9.228 10.852-.923-.383`}],[`path`,{d:`m9.228 13.148-.923.383`}]],xo=[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`}]],So=[[`path`,{d:`M14 17H5`}],[`path`,{d:`M19 7h-9`}],[`circle`,{cx:`17`,cy:`17`,r:`3`}],[`circle`,{cx:`7`,cy:`7`,r:`3`}]],Co=[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}]],wo=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}],[`path`,{d:`m9 12 2 2 4-4`}]],To=[[`path`,{d:`m2 2 20 20`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`}]],Eo=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}]],Do=[[`path`,{d:`m18 14 4 4-4 4`}],[`path`,{d:`m18 2 4 4-4 4`}],[`path`,{d:`M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22`}],[`path`,{d:`M2 6h1.972a4 4 0 0 1 3.6 2.2`}],[`path`,{d:`M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45`}]],Oo=[[`circle`,{cx:`12`,cy:`12`,r:`4`}],[`path`,{d:`M12 2v2`}],[`path`,{d:`M12 20v2`}],[`path`,{d:`m4.93 4.93 1.41 1.41`}],[`path`,{d:`m17.66 17.66 1.41 1.41`}],[`path`,{d:`M2 12h2`}],[`path`,{d:`M20 12h2`}],[`path`,{d:`m6.34 17.66-1.41 1.41`}],[`path`,{d:`m19.07 4.93-1.41 1.41`}]],ko=[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],Ao=[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`}],[`circle`,{cx:`12`,cy:`14`,r:`8`}]],jo=[[`path`,{d:`M10 11v6`}],[`path`,{d:`M14 11v6`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`}],[`path`,{d:`M3 6h18`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`}]],Mo=[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`}],[`path`,{d:`M12 9v4`}],[`path`,{d:`M12 17h.01`}]],No=[[`circle`,{cx:`12`,cy:`8`,r:`5`}],[`path`,{d:`M20 21a8 8 0 0 0-16 0`}]],Po=[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`}],[`circle`,{cx:`12`,cy:`7`,r:`4`}]],Fo=[[`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`}],[`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`}]],Io=[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`}],[`path`,{d:`m14 7 3 3`}],[`path`,{d:`M5 6v4`}],[`path`,{d:`M19 14v4`}],[`path`,{d:`M10 2v2`}],[`path`,{d:`M7 8H3`}],[`path`,{d:`M21 16h-4`}],[`path`,{d:`M11 3H9`}]],Lo=[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`}]],Ro=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]],zo=z(``),Bo=z(`
        `,1);function Vo(e,t){D(t,!0);let n=K(t,`compact`,3,!1),r=[{value:`light`,icon:Oo,label:`Light theme`},{value:`system`,icon:lo,label:`System theme`},{value:`dark`,icon:uo,label:`Dark theme`}],i=k(()=>r.find(e=>e.value===Da.theme)||r[1]),a=k(()=>`Change theme (currently `+L(i).label+`)`);var o=Bo(),s=P(o);let c;U(s,21,()=>r,e=>e.value,(e,t)=>{var n=zo();let r;q(N(n),{get icon(){return L(t).icon},class:`theme-icon`}),E(n),I(()=>{r=W(n,1,`theme-btn svelte-1keql7b`,null,r,{active:Da.theme===L(t).value}),G(n,`aria-pressed`,Da.theme===L(t).value),G(n,`title`,L(t).label),G(n,`aria-label`,L(t).label)}),R(`click`,n,()=>Da.set(L(t).value)),B(e,n)}),E(s);var l=F(s,2);let u;q(N(l),{get icon(){return L(i).icon},class:`theme-icon`}),E(l),I(()=>{c=W(s,1,`theme-toggle svelte-1keql7b`,null,c,{"is-compact":n()}),u=W(l,1,`theme-toggle-mobile svelte-1keql7b`,null,u,{"is-compact":n()}),G(l,`title`,L(a)),G(l,`aria-label`,L(a))}),R(`click`,l,()=>Da.toggle()),B(e,o),O()}Vr([`click`]);function Ho(){return typeof window>`u`?`/`:window.GOMODEL_BASE_PATH||`/`}function Uo(e){let t=Ho();return!e||e.charAt(0)!==`/`||e.indexOf(`//`)===0||t===`/`||e===t||e.indexOf(t+`/`)===0?e:t+e}function Wo(e){let t=Ho();return t===`/`||!e?e:e===t?`/`:e.indexOf(t+`/`)===0?e.slice(t.length)||`/`:e}function Go(){return typeof window>`u`?``:window.GOMODEL_VERSION||``}function Ko(){return typeof window>`u`?!1:window.GOMODEL_DEMO_MODE===!0}var qo=[`overview`,`usage`,`budgets`,`rate-limits`,`models`,`workflows`,`audit-logs`,`guardrails`,`mcp-servers`,`providers-config`,`auth-keys`,`settings`];function Jo(e){return e.startsWith(`/admin/static/`)?`/`+e.slice(14).replace(/^\/+/,``):e}function Yo(e){let t=Jo(Wo(e)).replace(/\/$/,``).replace(`/admin/dashboard`,``).replace(/^\//,``).split(`/`),n=t[0];n===`audit`&&(n=`audit-logs`);let r=t[1]||null;return n===`settings`&&r===`guardrails`?{page:`guardrails`,sub:null}:(n=qo.includes(n)?n:`overview`,{page:n,sub:r})}var Xo=new class{#e=A(`overview`);get page(){return L(this.#e)}set page(e){j(this.#e,e,!0)}#t=A(null);get sub(){return L(this.#t)}set sub(e){j(this.#t,e,!0)}init(){let{page:e,sub:t}=Yo(window.location.pathname);this.page=e,this.sub=t,window.addEventListener(`popstate`,()=>{let{page:e,sub:t}=Yo(window.location.pathname);this.page=e,this.sub=t})}navigate(e,t=null){let n=t?`/`+t:``;history.pushState(null,``,Uo(`/admin/dashboard/`+e+n)),this.page=e,this.sub=t}},Zo=`X-GoModel-Auth-Login`,Qo=`X-GoModel-Auth-Logout`,$o=`X-GoModel-Auth-User`;function es(e){let t=String(e||``).trim();return!t.startsWith(`/`)||t.startsWith(`//`)||t.includes(`\\`)?``:t}function ts(e,t=globalThis.location){let n=es(e),r=es(t?.pathname);if(!n||!r)return n;let i=String(t?.search||``),a=r+(i.startsWith(`?`)?i:``),o=n.indexOf(`#`),s=o<0?n:n.slice(0,o),c=o<0?``:n.slice(o);return`${s}${s.includes(`?`)?`&`:`?`}return_to=${encodeURIComponent(a)}${c}`}function ns(e){let t=e?.headers;if(!t||typeof t.has!=`function`)return null;let n={};return t.has(Zo)&&(n.loginURL=es(t.get(Zo))),t.has(Qo)&&(n.logoutURL=es(t.get(Qo))),t.has($o)&&(n.user=String(t.get($o)||``).trim().slice(0,256)),n}var rs=`gomodel_api_key`;function is(e){let t=String(e||``).trim();if(/^Bearer\s*$/i.test(t))return``;let n=t.match(/^Bearer\s+(.+)$/i);return n?n[1].trim():t}var J=new class{#e=A(``);get apiKey(){return L(this.#e)}set apiKey(e){j(this.#e,e,!0)}#t=A(!1);get needsAuth(){return L(this.#t)}set needsAuth(e){j(this.#t,e,!0)}#n=A(!1);get authError(){return L(this.#n)}set authError(e){j(this.#n,e,!0)}#r=A(``);get authErrorMessage(){return L(this.#r)}set authErrorMessage(e){j(this.#r,e,!0)}#i=A(!1);get dialogOpen(){return L(this.#i)}set dialogOpen(e){j(this.#i,e,!0)}#a=A(``);get externalLoginURL(){return L(this.#a)}set externalLoginURL(e){j(this.#a,e,!0)}#o=A(``);get externalLogoutURL(){return L(this.#o)}set externalLogoutURL(e){j(this.#o,e,!0)}#s=A(``);get externalUser(){return L(this.#s)}set externalUser(e){j(this.#s,e,!0)}#c=A(0);get generation(){return L(this.#c)}set generation(e){j(this.#c,e,!0)}#l=A(0);get refreshTick(){return L(this.#l)}set refreshTick(e){j(this.#l,e,!0)}init(){try{this.apiKey=is(localStorage.getItem(rs)||``)}catch{this.apiKey=``}}hasApiKey(){return is(this.apiKey)!==``}save(){this.apiKey=is(this.apiKey);try{localStorage.setItem(rs,this.apiKey)}catch{}}selectExternalAuthentication(){this.apiKey=``;try{localStorage.removeItem(rs)}catch{}this.generation++,this.authError=!1,this.authErrorMessage=``,this.needsAuth=!0}openDialog(){this.dialogOpen=!0}closeDialog(){this.dialogOpen=!1}submit(){let e=is(this.apiKey);return e?(this.apiKey=e,this.save(),this.generation++,this.authError=!1,this.authErrorMessage=``,this.needsAuth=!1,this.closeDialog(),this.refresh(),!0):(this.apiKey=``,this.authError=!0,this.authErrorMessage=``,this.needsAuth=!0,this.openDialog(),!1)}refresh(){this.refreshTick++}observeResponse(e){let t=ns(e);t&&(Object.hasOwn(t,`loginURL`)&&(this.externalLoginURL=t.loginURL),Object.hasOwn(t,`logoutURL`)&&(this.externalLogoutURL=t.logoutURL),Object.hasOwn(t,`user`)&&(this.externalUser=t.user))}handleUnauthorized(e,t=``){return typeof e==`number`&&e{r[e.type]=e.value}),r.year+`-`+r.month+`-`+r.day}formatTimestampInTimeZone(e,t){if(e==null)return`-`;let n=new Date(e);if(Number.isNaN(n.getTime()))return`-`;let r=hs(`en-CA`,{timeZone:gs(t)?t:ds,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hourCycle:`h23`}).formatToParts(n),i={};return r.forEach(e=>{i[e.type]=e.value}),i.year+`-`+i.month+`-`+i.day+` `+i.hour+`:`+i.minute+`:`+i.second}formatTimestamp(e){return this.formatTimestampInTimeZone(e,this.effectiveTimezone())}currentDateKey(e){return this.dateKeyInTimeZone(e||new Date,this.effectiveTimezone())}dateKeyToDate(e){return os(e)}dateToDateKey(e){return ss(e)}addDaysToDateKey(e,t){return cs(e,t)}todayDate(){return this.dateKeyToDate(this.currentDateKey())}startOfMonthDate(e){let t=e instanceof Date?e:this.todayDate();return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),1))}timeZoneOffsetLabel(e,t){let n=gs(e)?e:ds;try{let e=hs(`en-US`,{timeZone:n,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`,timeZoneName:`longOffset`}).formatToParts(t||new Date).find(e=>e.type===`timeZoneName`);if(!e||!e.value)return`UTC+00:00`;let r=e.value.replace(`GMT`,`UTC`);return r===`UTC`?`UTC+00:00`:r}catch{return`UTC+00:00`}}timeZoneOffsetMinutes(e,t){let n=/^UTC([+-])(\d{2}):(\d{2})$/.exec(this.timeZoneOffsetLabel(e,t));if(!n)return 0;let r=Number(n[2])*60+Number(n[3]);return n[1]===`-`?-r:r}timeZoneOptionLabel(e,t){return e+` (`+this.timeZoneOffsetLabel(e,t)+`)`}detectedTimeZoneLabel(){return this.timeZoneOptionLabel(this.detectedTimezone)}effectiveTimeZoneLabel(){return this.timeZoneOptionLabel(this.effectiveTimezone())}ensureOptions(){if(this.optionsLoaded)return;let e=new Date,t=[];try{typeof Intl.supportedValuesOf==`function`&&(t=Intl.supportedValuesOf(`timeZone`))}catch{t=[]}[ds,this.detectedTimezone,this.override].forEach(e=>{e&&t.indexOf(e)===-1&&gs(e)&&t.push(e)}),t=t.filter(e=>gs(e)),t.sort((t,n)=>{let r=this.timeZoneOffsetMinutes(t,e)-this.timeZoneOffsetMinutes(n,e);return r===0?t.localeCompare(n):r}),this.options=t.map(t=>({value:t,label:this.timeZoneOptionLabel(t,e)})),this.optionsLoaded=!0}saveOverride(){let e=Sa();if(e)if(this.override&&gs(this.override))try{e.setItem(fs,this.override)}catch{}else{try{e.removeItem(fs)}catch{}this.override=``}this.optionsLoaded=!1,this.ensureOptions()}clearOverride(){let e=Sa();if(e)try{e.removeItem(fs)}catch{}this.override=``}calendarTimeZoneText(){let e=this.override?`manual override`:`auto-detected`;return`Activity grouped by `+this.effectiveTimeZoneLabel()+` (`+e+`)`}};function bs(e,t){let n=e&&typeof e==`object`&&e.error&&e.error.message;return(typeof n==`string`?n.trim():``)||t}function xs(e,t){let n=e&&e.data;if(n&&typeof n==`object`){let e=[n.message,n.error,n.error&&typeof n.error==`object`?n.error.message:null];for(let t of e)if(typeof t==`string`&&t.trim())return t.trim()}return t}function Ss(){let e={"Content-Type":`application/json`},t=is(J.apiKey);return t&&(e.Authorization=`Bearer `+t),e[`X-GoModel-Timezone`]=ys.effectiveTimezone(),e}function Cs(e,t={}){return fetch(Uo(e),{...t,headers:{...Ss(),...t.headers||{}}})}async function ws(e,t,{label:n=e,parse:r=!0}={}){let i=J.generation,a=await Cs(e,t),o=ie.trim()).filter(Boolean);return e.length>0?e:ks}cacheVisible(){if(this.flag(`CACHE_ENABLED`)!==``)return this.booleanFlag(`CACHE_ENABLED`,!1);let e=this.flag(`REDIS_URL`),t=this.flag(`SEMANTIC_CACHE_ENABLED`);return e===``&&t===``||this.booleanFlag(`REDIS_URL`,!1)||this.booleanFlag(`SEMANTIC_CACHE_ENABLED`,!1)}auditVisible(){return this.booleanFlag(`LOGGING_ENABLED`,!0)}usageVisible(){return this.booleanFlag(`USAGE_ENABLED`,!0)}budgetsVisible(){return this.booleanFlag(`BUDGETS_ENABLED`,!0)}rateLimitsVisible(){return this.booleanFlag(`RATE_LIMITS_ENABLED`,!0)}guardrailsVisible(){return this.booleanFlag(`GUARDRAILS_ENABLED`,!0)}mcpVisible(){return this.booleanFlag(`MCP_ENABLED`,!0)}liveLogsVisible(){return this.booleanFlag(`DASHBOARD_LIVE_LOGS_ENABLED`,!0)}fetch(){return this.#n||=this.#r().finally(()=>{this.#n=null}),this.#n}async ensureLoaded(){if(this.#n){await this.#n;return}this.loaded||await this.fetch()}async#r(){let e=typeof AbortController==`function`?new AbortController:null,t=e?setTimeout(()=>e.abort(),1e4):null;try{let t=await Ts(`/admin/runtime/config`,{label:`dashboard config`,signal:e?e.signal:void 0});if(t.stale)return;if(!t.ok){this.config={},this.loaded=!1;return}let n=t.data,r={};for(let e of Os)n&&typeof n==`object`&&!Array.isArray(n)&&n[e]!==void 0&&n[e]!==null&&(r[e]=String(n[e]).trim());this.config=r,this.loaded=!0}catch(e){console.error(`Failed to fetch dashboard config:`,e),this.config={},this.loaded=!1}finally{t!==null&&clearTimeout(t)}}},js=[{page:`overview`,label:`Overview`,icon:ro},{page:`providers-config`,label:`Providers`,icon:bo},{page:`models`,label:`Models`,icon:Fa},{page:`audit-logs`,label:`Audit Logs`,icon:eo},{page:`usage`,label:`Usage`,icon:Ba},{page:`budgets`,label:`Budgets`,icon:Fo,visible:()=>As.budgetsVisible()},{page:`rate-limits`,label:`Rate Limits`,icon:$a,visible:()=>As.rateLimitsVisible()},{page:`auth-keys`,label:`API Keys`,icon:no},{page:`workflows`,label:`Workflows`,icon:Lo},{page:`guardrails`,label:`Guardrails (experimental)`,icon:wo,visible:()=>As.guardrailsVisible()},{page:`mcp-servers`,label:`MCP Servers`,icon:po,visible:()=>As.mcpVisible()},{page:`settings`,label:`Settings`,icon:Co}],Ms=z(` `),Ns=z(`
        `),Ps=z(``),Fs=z(`
        `),Is=z(` `,1);function Ls(e,t){D(t,!0);let n=k(()=>js.filter(e=>!e.visible||e.visible())),r=A(null),i=0,a=0,o=!1;function s(e){e.button===0&&(e.preventDefault(),j(r,e.pointerId,!0),i=e.clientX,a=Oa.width,o=!1,e.currentTarget.setPointerCapture(e.pointerId),document.body.classList.add(`sidebar-resizing`))}function c(e){e.pointerId===L(r)&&(!o&&Math.abs(e.clientX-i)<=4||(o=!0,Oa.setWidth(Ea(a,i,e.clientX))))}function l(e){L(r)===null||e.pointerId!==void 0&&e.pointerId!==L(r)||(j(r,null),document.body.classList.remove(`sidebar-resizing`),Oa.setWidth(Oa.width,!0))}function u(){if(o){o=!1;return}Oa.toggle()}function d(e){let t;if(e.key===`ArrowLeft`)t=Oa.width-12;else if(e.key===`ArrowRight`)t=Oa.width+12;else if(e.key===`Home`)t=60;else if(e.key===`End`)t=240;else if(e.key===`Enter`||e.key===` `){e.preventDefault(),Oa.toggle();return}else return;e.preventDefault(),Oa.setWidth(t,!0)}var f=Is(),p=P(f);let m;var h=N(p),g=N(h);xa(N(g),{}),E(g),He(4),E(h);var _=F(h,2);U(_,21,()=>L(n),e=>e.page,(e,t)=>{var n=Ms();let r;var i=N(n);q(i,{get icon(){return L(t).icon},class:`nav-icon`});var a=F(i,2),o=N(a,!0);E(a),E(n),I(e=>{G(n,`href`,e),r=W(n,1,`nav-item svelte-1nwtzae`,null,r,{active:Xo.page===L(t).page}),G(n,`title`,L(t).label),V(o,L(t).label)},[()=>Uo(`/admin/dashboard/`+L(t).page)]),R(`click`,n,e=>{e.preventDefault(),Xo.navigate(L(t).page)}),B(e,n)}),E(_);var v=F(_,2),y=N(v);Vo(y,{get compact(){return Oa.collapsed}});var b=F(y,2),x=e=>{var t=Ps(),n=N(t),r=e=>{var t=Ns(),n=N(t);q(n,{get icon(){return No},class:`api-key-open-icon`});var r=F(n,2),i=N(r,!0);E(r),E(t),I(()=>{G(t,`title`,J.externalUser),V(i,J.externalUser)}),B(e,t)};H(n,e=>{J.externalUser&&e(r)});var i=F(n,2);q(N(i),{get icon(){return oo},class:`api-key-open-icon`}),He(2),E(i),E(t),I(e=>G(i,`href`,e),[()=>Uo(J.externalLogoutURL)]),B(e,t)};H(b,e=>{J.externalLogoutURL&&e(x)});var S=F(b,2),C=e=>{var t=Fs(),n=N(t),r=N(n);q(r,{get icon(){return ao},class:`api-key-open-icon`});var i=F(r,2),a=N(i,!0);E(i),E(n),E(t),I(()=>{G(n,`aria-label`,J.needsAuth?`Enter API key`:`Change API key`),V(a,J.needsAuth?`Enter API key`:`Change API key`)}),R(`click`,n,()=>J.openDialog()),B(e,t)},w=k(()=>J.needsAuth||J.hasApiKey());H(S,e=>{L(w)&&e(C)}),E(v),E(p);var T=F(p,2);I(()=>{m=W(p,1,`sidebar svelte-1nwtzae`,null,m,{"sidebar-collapsed":Oa.collapsed,"sidebar-resizing":L(r)!==null}),G(T,`aria-valuemin`,60),G(T,`aria-valuemax`,240),G(T,`aria-valuenow`,Oa.width)}),R(`pointerdown`,T,s),R(`pointermove`,T,c),R(`pointerup`,T,l),Br(`pointercancel`,T,l),Br(`lostpointercapture`,T,l),R(`keydown`,T,d),R(`click`,T,u),B(e,f),O()}Vr([`click`,`pointerdown`,`pointermove`,`pointerup`,`keydown`]);var Rs=z(``);function zs(e,t){D(t,!0);let n=K(t,`label`,3,`Close`),r=K(t,`class`,3,``),i=K(t,`iconClass`,3,`table-icon-svg`),a=K(t,`disabled`,3,!1),o=K(t,`el`,15,null);var s=Rs();q(N(s),{get icon(){return Ro},get class(){return i()}}),E(s),ha(s,e=>o(e),()=>o()),I(()=>{W(s,1,Pi([`dialog-close-btn`,r()]),`svelte-11l1bb5`),G(s,`aria-label`,n()),s.disabled=a()}),R(`click`,s,function(...e){t.onclick?.apply(this,e)}),B(e,s),O()}Vr([`click`]);function Bs(e){return t=>{let n=n=>{t.contains(n.target)||e()},r=t=>{t.key===`Escape`&&e()};return document.addEventListener(`click`,n,!0),window.addEventListener(`keydown`,r),()=>{document.removeEventListener(`click`,n,!0),window.removeEventListener(`keydown`,r)}}}function Vs(e=`[data-modal-autofocus]`){return t=>{let n=t.querySelector(e);n&&typeof n.focus==`function`&&n.focus()}}var Hs=z(`
        `,1);function Us(e,t){D(t,!0);let n=K(t,`open`,3,!1),r=K(t,`variant`,3,`editor`),i=K(t,`closeOnBackdrop`,3,!0),a=k(()=>r()===`auth`?`auth-dialog-backdrop`:`editor-modal-backdrop`),o=k(()=>r()===`auth`?`auth-dialog-shell`:`editor-modal-shell`);kn(()=>{if(!n())return;let e=Tr(()=>ka.opened()),r=n=>{n.key===`Escape`&&ka.isTop(e)&&t.onclose?.()};return window.addEventListener(`keydown`,r),()=>{ka.closed(e),window.removeEventListener(`keydown`,r)}});function s(e){i()&&e.target===e.currentTarget&&t.onclose?.()}var c=Zr(),l=P(c),u=e=>{var n=Hs(),r=P(n),i=F(r,2);hi(N(i),()=>t.children??f),E(i),ji(i,Vs),I(()=>{W(r,1,Pi(L(a)),`svelte-17e0w4c`),W(i,1,Pi(L(o)),`svelte-17e0w4c`)}),R(`click`,i,s),B(e,n)};H(l,e=>{n()&&e(u)}),B(e,c),O()}Vr([`click`]);var Ws=z(`
        or use an API key
        `,1),Gs=z(``),Ks=z(``);function qs(e,t){D(t,!0),Us(e,{get open(){return J.dialogOpen},variant:`auth`,onclose:()=>J.closeDialog(),children:(e,t)=>{var n=Ks(),r=N(n),i=N(r),a=N(i),o=N(a,!0);E(a),E(i),zs(F(i,2),{label:`Close authentication dialog`,onclick:()=>J.closeDialog(),class:`auth-dialog-close`,iconClass:``}),E(r);var s=F(r,2),c=N(s),l=e=>{var t=Ws(),n=P(t);q(N(n),{get icon(){return no}}),He(2),E(n),He(2),I(e=>G(n,`href`,e),[()=>ts(Uo(J.externalLoginURL))]),R(`click`,n,()=>J.selectExternalAuthentication()),B(e,t)};H(c,e=>{J.externalLoginURL&&e(l)});var u=F(c,2),d=N(u);q(d,{get icon(){return ao},class:`auth-dialog-input-icon`});var f=F(d,2);ta(f),E(u);var p=F(u,2),m=e=>{var t=Gs(),n=N(t,!0);E(t),I(()=>V(n,J.authErrorMessage||`Enter a valid API key to continue.`)),B(e,t)};H(p,e=>{J.authError&&e(m)});var h=F(p,4),g=N(h),_=N(g);q(_,{get icon(){return Va},class:`auth-dialog-submit-icon`});var v=F(_,2),y=N(v,!0);E(v),E(g),E(h),E(s),E(n),I(()=>{V(o,J.needsAuth?`Dashboard locked`:`Change API key`),V(y,J.needsAuth?`Unlock dashboard`:`Save API key`)}),Br(`submit`,s,e=>{e.preventDefault(),J.submit()}),ua(f,()=>J.apiKey,e=>J.apiKey=e),B(e,n)},$$slots:{default:!0}}),O()}Vr([`click`]);function Js(){return{open:!1,title:``,titleId:`typedConfirmationDialogTitle`,inputId:`typed-confirmation-input`,message:``,requiredText:``,value:``,confirmLabel:`Confirm`,icon:Mo,dialogClass:``,loading:!1,onConfirm:null,onClose:null}}var Ys=new class{#e=A(M(Js()));get state(){return L(this.#e)}set state(e){j(this.#e,e,!0)}#t=A(``);get error(){return L(this.#t)}set error(e){j(this.#t,e,!0)}open(e){this.error=``,this.state={...Js(),open:!0,...e||{}}}close(){let e=this.state;typeof e.onClose==`function`&&e.onClose(),this.state=Js(),this.error=``}ready(){return String(this.state.value||``).trim().toLowerCase()===String(this.state.requiredText||``).trim().toLowerCase()}inputLabel(){return`Type `+String(this.state.requiredText||``).trim()+` to confirm`}async submit(){if(!this.ready()){this.error=this.inputLabel()+`.`;return}if(typeof this.state.onConfirm==`function`){this.state.loading=!0;try{await this.state.onConfirm()}finally{this.state.loading=!1}}}},Xs=z(`

        `),Zs=z(``),Qs=z(`

        `);function $s(e,t){D(t,!0);let n=k(()=>Ys.state);Us(e,{get open(){return L(n).open},variant:`auth`,onclose:()=>Ys.close(),children:(e,t)=>{var r=Qs(),i=N(r),a=N(i),o=N(a,!0);E(a),zs(F(a,2),{label:`Close confirmation dialog`,onclick:()=>Ys.close(),class:`auth-dialog-close`,iconClass:``}),E(i);var s=F(i,2),c=N(s),l=e=>{var t=Xs(),r=N(t,!0);E(t),I(()=>V(r,L(n).message)),B(e,t)};H(c,e=>{L(n).message&&e(l)});var u=F(c,2),d=N(u),f=N(d,!0);E(d);var p=F(d,2);ta(p),E(u);var m=F(u,2),h=e=>{var t=Zs(),n=N(t,!0);E(t),I(()=>V(n,Ys.error)),B(e,t)};H(m,e=>{Ys.error&&e(h)});var g=F(m,2),_=N(g),v=F(_,2),y=N(v);q(y,{get icon(){return L(n).icon},class:`form-action-icon`});var b=F(y,2),x=N(b,!0);E(b),E(v),E(g),E(s),E(r),I((e,t)=>{W(r,1,`auth-dialog ${L(n).dialogClass??``}`),G(r,`aria-labelledby`,L(n).titleId),G(a,`id`,L(n).titleId),V(o,L(n).title),G(d,`for`,L(n).inputId),V(f,e),G(p,`id`,L(n).inputId),v.disabled=t,V(x,L(n).confirmLabel)},[()=>Ys.inputLabel(),()=>L(n).loading||!Ys.ready()]),Br(`submit`,s,e=>{e.preventDefault(),Ys.submit()}),ua(p,()=>Ys.state.value,e=>Ys.state.value=e),R(`click`,_,()=>Ys.close()),B(e,r)},$$slots:{default:!0}}),O()}Vr([`click`]);var ec=e=>e;function tc(e){let t=e-1;return t*t*t+1}function nc(e){let t=typeof e==`string`&&e.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return t?[parseFloat(t[1]),t[2]||`px`]:[e,`px`]}function rc(e,{delay:t=0,duration:n=400,easing:r=ec}={}){let i=+getComputedStyle(e).opacity;return{delay:t,duration:n,easing:r,css:e=>`opacity: ${e*i}`}}function ic(e,{delay:t=0,duration:n=400,easing:r=tc,x:i=0,y:a=0,opacity:o=0}={}){let s=getComputedStyle(e),c=+s.opacity,l=s.transform===`none`?``:s.transform,u=c*(1-o),[d,f]=nc(i),[p,m]=nc(a);return{delay:t,duration:n,easing:r,css:(e,t)=>` - transform: ${l} translate(${(1-e)*d}${f}, ${(1-e)*p}${m}); - opacity: ${c-u*t}`}}function ac(e,{delay:t=0,duration:n=400,easing:r=tc,axis:i=`y`}={}){let a=getComputedStyle(e),o=+a.opacity,s=i===`y`?`height`:`width`,c=parseFloat(a[s]),l=i===`y`?[`top`,`bottom`]:[`left`,`right`],u=l.map(e=>`${e[0].toUpperCase()}${e.slice(1)}`),d=parseFloat(a[`padding${u[0]}`]),f=parseFloat(a[`padding${u[1]}`]),p=parseFloat(a[`margin${u[0]}`]),m=parseFloat(a[`margin${u[1]}`]),h=parseFloat(a[`border${u[0]}Width`]),g=parseFloat(a[`border${u[1]}Width`]);return{delay:t,duration:n,easing:r,css:e=>`overflow: hidden;opacity: ${Math.min(e*20,1)*o};${s}: ${e*c}px;padding-${l[0]}: ${e*d}px;padding-${l[1]}: ${e*f}px;margin-${l[0]}: ${e*p}px;margin-${l[1]}: ${e*m}px;border-${l[0]}-width: ${e*h}px;border-${l[1]}-width: ${e*g}px;min-${s}: 0`}}function oc(e){return--e*e*(2.70158*e+1.70158)+1}function sc(e){let t=e-1;return t*t*t+1}var cc=5e3,lc=8e3,Y=new class{#e=A(M([]));get toasts(){return L(this.#e)}set toasts(e){j(this.#e,e,!0)}#t=0;#n=new Map;success(e){this.#r(`success`,e,cc)}error(e){this.#r(`error`,e,lc)}dismiss(e){let t=this.#n.get(e);t&&(clearTimeout(t),this.#n.delete(e)),this.toasts=this.toasts.filter(t=>t.id!==e)}#r(e,t,n){let r=String(t||``).trim();if(!r)return;let i=this.toasts.find(t=>t.kind===e&&t.text===r);i&&this.dismiss(i.id);let a=++this.#t;this.toasts=[...this.toasts,{id:a,kind:e,text:r}],this.#n.set(a,setTimeout(()=>this.dismiss(a),n))}},uc=z(`
        `),dc=z(`
        `);function fc(e,t){D(t,!0);var n=dc();U(n,21,()=>Y.toasts,e=>e.id,(e,t)=>{var n=uc();let r;var i=N(n),a=N(i,!0);E(i);var o=F(i,2);E(n),I(()=>{r=W(n,1,`flash-toast svelte-1i257xg`,null,r,{"flash-toast-success":L(t).kind===`success`,"flash-toast-error":L(t).kind===`error`}),G(n,`role`,L(t).kind===`error`?`alert`:`status`),G(n,`aria-live`,L(t).kind===`error`?`assertive`:`polite`),V(a,L(t).text)}),R(`click`,o,()=>Y.dismiss(L(t).id)),Oi(1,n,()=>ic,()=>({y:-24,duration:360,easing:oc})),Oi(2,n,()=>rc,()=>({duration:150})),B(e,n)}),E(n),B(e,n),O()}Vr([`click`]);var pc=z(``);function mc(e,t){D(t,!0);var n=Zr(),r=P(n),i=e=>{B(e,pc())},a=k(()=>Ko());H(r,e=>{L(a)&&e(i)}),B(e,n),O()}function hc(e){return String(e||``).split(`,`).map(e=>e.trim()).filter(e=>e)}function gc(e){if(e==null||e===``)return`Not captured`;if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))try{return JSON.stringify(JSON.parse(t),null,2)}catch{return e}return e}try{return JSON.stringify(e,null,2)}catch{return String(e)}}function _c(e){return e==null||e===void 0?`-`:e.toLocaleString()}function vc(e){if(e==null)return`---`;let t=Number(e);return Number.isFinite(t)?t>0&&t<1e-4?`<$0.0001`:`$`+t.toFixed(4).replace(/(\.\d{2}\d*?)0+$/,`$1`):`---`}function yc(e){return e==null||e===void 0?`—`:`$`+e.toFixed(2)}function bc(e){return e==null||e===void 0?`—`:e<.01?`$`+e.toFixed(6):`$`+e.toFixed(4)}function xc(e){if(e==null||e===``)return`-`;let t=Number(e);if(!Number.isFinite(t))return`-`;let n=Math.abs(t),r=[{threshold:1e9,suffix:`B`},{threshold:1e6,suffix:`M`},{threshold:1e3,suffix:`K`}];for(let e=0;e=i.threshold){let n=t/i.threshold;return Math.abs(Number(n.toFixed(1)))>=1e3&&e>0&&(i=r[e-1],n=t/i.threshold),n.toFixed(1).replace(/\.0$/,``)+i.suffix}}return String(t)}function Sc(e,t){let n=t==null||t===``?NaN:Number(t),r=Number.isFinite(n)?_c(n):`-`;return String(e||`Tokens`)+`: `+r}function Cc(e){return e?typeof e==`string`?e:e.getUTCFullYear()+`-`+String(e.getUTCMonth()+1).padStart(2,`0`)+`-`+String(e.getUTCDate()).padStart(2,`0`):``}function wc(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:t.getUTCFullYear()+`-`+String(t.getUTCMonth()+1).padStart(2,`0`)+`-`+String(t.getUTCDate()).padStart(2,`0`)}function Tc(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:t.getUTCFullYear()+`-`+String(t.getUTCMonth()+1).padStart(2,`0`)+`-`+String(t.getUTCDate()).padStart(2,`0`)+` `+String(t.getUTCHours()).padStart(2,`0`)+`:`+String(t.getUTCMinutes()).padStart(2,`0`)+`:`+String(t.getUTCSeconds()).padStart(2,`0`)+` UTC`}function Ec(e){return String(e&&e.provider||``).trim()}function Dc(e){return String(e&&e.provider_name||``).trim()||Ec(e)}function Oc(e,t){let n=String(t||``).trim();if(!n)return`-`;let r=Dc(e);return!r||n===r||n.startsWith(r+`/`)?n:r+`/`+n}function kc(e){return Oc(e,e&&e.model)}function Ac(e){return Oc(e,e&&e.resolved_model)}function jc(e){let t=String(e&&(e.requested_model||e.model)||``).trim();if(!e)return t;let n=String(e.data&&e.data.failover&&e.data.failover.target_model||``).trim();if(n&&n!==t)return t+` ⮕ `+n;if(e.alias_used&&e.resolved_model){let n=Ac(e);if(n&&n!==`-`&&n!==t)return t+` ⮕ `+n}return t}var Mc=`gomodel_date_range`,Nc=1;function Pc(e){return/^[1-9]\d*$/.test(String(e??``))}var Fc=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function Ic({selectedPreset:e,startKey:t,endKey:n,followsToday:r}){return e&&Pc(e)?{v:Nc,mode:`preset`,days:String(e)}:e?null:ls(t)&&ls(n)?{v:Nc,mode:`custom`,start:t,end:n,follow:r===!0}:null}function Lc(e){let t=e;if(typeof e==`string`)try{t=JSON.parse(e)}catch{return null}return!t||typeof t!=`object`?null:t.mode===`preset`?Pc(t.days)?{mode:`preset`,days:String(t.days)}:null:t.mode===`custom`&&ls(t.start)&&ls(t.end)&&t.start<=t.end?{mode:`custom`,start:t.start,end:t.end,follow:t.follow===!0}:null}function Rc(e,t,n){let r=us(e,t);return r<1||!ls(n)?{start:e,end:t}:{start:cs(n,-(r-1)),end:n}}function zc(e,t){if(e===t)return`Today`;let[n,r,i]=e.split(`-`);return Fc[Number(r)-1]+` `+Number(i)+`, `+n}function Bc({selectedPreset:e,startKey:t,endKey:n,followsToday:r,todayKey:i}){if(e)return`Last `+e+` days`;if(!ls(t)||!ls(n))return``;let a=us(t,n);return r||n===i?a===1?`Today`:`Last `+a+` days`:a===1?`1 day`:a+` days`}function Vc({selectedPreset:e,startKey:t,endKey:n,todayKey:r}){if(e)return`Last `+e+` days`;let i=e=>zc(e,r);return ls(t)&&ls(n)?t===n?i(t):i(t)+` – `+i(n):ls(t)?i(t)+` – ...`:`Last 30 days`}var Hc=6e4,Uc=new class{#e=A(M(`30`));get days(){return L(this.#e)}set days(e){j(this.#e,e,!0)}#t=A(M(`30`));get selectedPreset(){return L(this.#t)}set selectedPreset(e){j(this.#t,e,!0)}#n=A(null);get customStartDate(){return L(this.#n)}set customStartDate(e){j(this.#n,e,!0)}#r=A(null);get customEndDate(){return L(this.#r)}set customEndDate(e){j(this.#r,e,!0)}#i=A(!1);get followsToday(){return L(this.#i)}set followsToday(e){j(this.#i,e,!0)}#a=A(`daily`);get interval(){return L(this.#a)}set interval(e){j(this.#a,e,!0)}#o=A(0);get syncTick(){return L(this.#o)}set syncTick(e){j(this.#o,e,!0)}init(){this.restore(),this.syncToToday(),typeof setInterval==`function`&&setInterval(()=>this.syncToToday(),Hc)}queryStr(){return this.customStartDate&&this.customEndDate?`start_date=`+Cc(this.customStartDate)+`&end_date=`+Cc(this.customEndDate):`days=`+this.days}selectPreset(e){this.selectedPreset=e,this.customStartDate=null,this.customEndDate=null,this.followsToday=!1,this.days=e,this.persist()}selectStart(e){this.selectedPreset=null,this.customStartDate=e,this.customEndDate&&this.customEndDatet.category===e);return t?t.count:0}get filteredModels(){if(!this.filter)return this.models;let e=this.filter.toLowerCase();return this.models.filter(t=>(t.model?.id??``).toLowerCase().includes(e)||(t.provider_name??``).toLowerCase().includes(e)||(t.provider_type??``).toLowerCase().includes(e)||(t.selector??``).toLowerCase().includes(e)||(t.model?.owned_by??``).toLowerCase().includes(e)||(t.model?.metadata?.modes??[]).join(`,`).toLowerCase().includes(e)||(t.model?.metadata?.categories??[]).join(`,`).toLowerCase().includes(e))}},Gc=z(``);function Kc(e,t){D(t,!0);var n=Zr(),r=P(n),i=e=>{var t=Gc(),n=F(N(t),2);E(t),R(`click`,n,()=>J.openDialog()),B(e,t)};H(r,e=>{J.authError&&e(i)}),B(e,n),O()}Vr([`click`]);function qc(){return{total_requests:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,total_input_cost:null,total_output_cost:null,total_cost:null}}function Jc(){return{summary:{total_hits:0,exact_hits:0,semantic_hits:0,total_input_tokens:0,total_output_tokens:0,total_tokens:0,total_saved_cost:null},daily:[]}}var Yc=new class{#e=A(M(qc()));get summary(){return L(this.#e)}set summary(e){j(this.#e,e,!0)}#t=A(M([]));get daily(){return L(this.#t)}set daily(e){j(this.#t,e,!0)}#n=A(M(Jc()));get cacheOverview(){return L(this.#n)}set cacheOverview(e){j(this.#n,e,!0)}#r=A(!1);get loading(){return L(this.#r)}set loading(e){j(this.#r,e,!0)}#i=null;#a=null;cacheAnalyticsEnabled(){return As.cacheVisible()}async fetchUsage(){this.#i&&this.#i.abort();let e=new AbortController;this.#i=e,this.loading=!0;try{let t=Uc.queryStr()+`&interval=`+Uc.interval,[n,r]=await Promise.all([Ts(`/admin/usage/summary?`+t,{label:`usage summary`,signal:e.signal}),Ts(`/admin/usage/daily?`+t,{label:`usage daily`,signal:e.signal})]);if(n.stale||r.stale||e.signal.aborted)return;if(!n.ok||!r.ok){this.summary=qc(),this.daily=[],this.cacheOverview=Jc();return}this.summary=n.data||qc(),this.daily=Array.isArray(r.data)?r.data:[]}catch(e){if(Ds(e))return;console.error(`Failed to fetch usage:`,e),this.summary=qc(),this.daily=[]}finally{this.#i===e&&(this.#i=null,this.loading=!1)}}async fetchCacheOverview(e=``){if(await As.ensureLoaded(),!this.cacheAnalyticsEnabled()){this.cacheOverview=Jc();return}this.#a&&this.#a.abort();let t=new AbortController;this.#a=t;try{let n=await Ts(`/admin/cache/overview?`+(Uc.queryStr()+`&interval=`+Uc.interval+e),{label:`cache overview`,signal:t.signal});if(n.stale||t.signal.aborted)return;if(!n.ok){this.cacheOverview=Jc();return}let r=n.data&&typeof n.data==`object`?n.data:Jc();r.summary||=Jc().summary,Array.isArray(r.daily)||(r.daily=[]),this.cacheOverview=r}catch(e){if(Ds(e))return;console.error(`Failed to fetch cache overview:`,e),this.cacheOverview=Jc()}finally{this.#a===t&&(this.#a=null)}}},Xc=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`];function Zc(e,t){let n=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+t,1));return Xc[n.getUTCMonth()]+` `+n.getUTCFullYear()}function Qc(e,t,n){let r=e.getUTCFullYear(),i=e.getUTCMonth()+t,a=new Date(Date.UTC(r,i,1)),o=new Date(Date.UTC(r,i+1,0)),s=(a.getUTCDay()+6)%7,c=[],l=new Date(Date.UTC(r,i,0));for(let e=s-1;e>=0;e--){let t=l.getUTCDate()-e,a=new Date(Date.UTC(r,i-1,t));c.push({day:t,date:a,current:!1,key:`p-`+n(a)})}for(let e=1;e<=o.getUTCDate();e++){let t=new Date(Date.UTC(r,i,e));c.push({day:e,date:t,current:!0,key:`c-`+n(t)})}let u=42-c.length;for(let e=1;e<=u;e++){let t=new Date(Date.UTC(r,i+1,e));c.push({day:e,date:t,current:!1,key:`n-`+n(t)})}return c}function $c(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+t,1));return n&&r.getTime()>n.getTime()?e:r}function el(e,t){return e.getUTCFullYear()===t.getUTCFullYear()&&e.getUTCMonth()===t.getUTCMonth()}var tl=z(``),nl=z(``),rl=z(``),il=z(`
        MoTuWeThFrSaSu
        `);function al(e,t){D(t,!0);let n=K(t,`offset`,3,0),r=k(()=>Qc(t.calendarMonth,n(),e=>ys.dateToDateKey(e))),i=k(()=>el(t.calendarMonth,ys.todayDate())),a=e=>ys.dateToDateKey(e.date),o=e=>a(e)>ys.currentDateKey(),s=e=>e.current&&a(e)===ys.currentDateKey();function c(e,t){let n=t===`start`?Uc.rangeStart():Uc.rangeEnd();return e.current&&!!n&&a(e)===ys.dateToDateKey(n)}function l(e){let t=Uc.rangeStart(),n=Uc.rangeEnd();return!e.current||!t||!n?!1:a(e)>=ys.dateToDateKey(t)&&a(e)<=ys.dateToDateKey(n)}var u=il(),d=N(u),f=N(d);let p;var m=F(f,2),h=N(m,!0);E(m);var g=F(m,2),_=e=>{B(e,tl())},v=e=>{var n=nl();I(()=>n.disabled=L(i)),R(`click`,n,function(...e){t.onnext?.apply(this,e)}),B(e,n)};H(g,e=>{n()===-1?e(_):e(v,-1)}),E(d);var y=F(d,4);U(y,21,()=>L(r),e=>e.key,(e,n)=>{var r=rl(),i=N(r,!0);E(r),I((e,t)=>{W(r,1,e,`svelte-g7ga4u`),r.disabled=t,V(i,L(n).day)},[()=>Pi([`dp-day`,{"other-month":!L(n).current,today:s(L(n)),"range-start":c(L(n),`start`),"range-end":c(L(n),`end`),"in-range":l(L(n)),disabled:o(L(n))}]),()=>o(L(n))||!L(n).current]),R(`click`,r,()=>t.onselect?.(L(n))),B(e,r)}),E(y),E(u),I(e=>{p=W(f,1,`dp-nav-btn svelte-g7ga4u`,null,p,{"dp-nav-prev-mobile":n()!==-1}),V(h,e)},[()=>Zc(t.calendarMonth,n())]),R(`click`,f,function(...e){t.onprev?.apply(this,e)}),B(e,u),O()}Vr([`click`]);var ol=z(``),sl=z(`
        `),cl=Yr(``),ll=Yr(``),ul=z(`
        `),dl=z(`
        `);function fl(e,t){D(t,!0);let n=[`3`,`7`,`14`,`30`,`90`],r=A(!1),i=A(`start`),a=A(M(new Date)),o=A(M({show:!1,x:0,y:0}));function s(){j(r,!L(r)),L(r)&&(Uc.syncToToday(),j(a,ys.startOfMonthDate(Uc.customEndDate||ys.todayDate()),!0),j(i,`start`))}function c(){j(r,!1),j(o,{show:!1,x:0,y:0},!0)}let l=Uc.syncTick;kn(()=>{let e=Uc.syncTick;e!==l&&(l=e,t.onchange?.())});function u(e){Uc.selectPreset(e),j(i,`start`),t.onchange?.(),c()}let d=()=>j(a,$c(L(a),-1),!0),f=()=>j(a,$c(L(a),1,ys.startOfMonthDate(ys.todayDate())),!0);function p(e){let n=new Date(e.date);if(L(i)===`start`){Uc.selectStart(n),j(i,`end`),t.onchange?.();return}Uc.selectEnd(n),j(i,`start`),t.onchange?.(),c()}var m=dl(),h=N(m),g=F(N(h),2),_=N(g,!0);E(g);var v=F(g,2);let y;E(h);var b=F(h,2),x=e=>{var t=sl(),r=N(t);U(r,20,()=>n,e=>e,(e,t)=>{var n=ol();let r;var i=N(n);E(n),I(()=>{r=W(n,1,`preset-btn svelte-ax7ma4`,null,r,{active:Uc.selectedPreset===t}),V(i,`Last ${t??``} days`)}),R(`click`,n,()=>u(t)),B(e,n)}),E(r);var i=F(r,2);U(i,20,()=>[-1,0],e=>e,(e,t)=>{al(e,{get calendarMonth(){return L(a)},get offset(){return t},onprev:d,onnext:f,onselect:p})}),E(i),E(t),R(`mousemove`,i,e=>j(o,{show:!0,x:e.clientX,y:e.clientY},!0)),Br(`mouseleave`,i,()=>j(o,{show:!1,x:0,y:0},!0)),B(e,t)};H(b,e=>{L(r)&&e(x)});var S=F(b,2),C=e=>{var t=ul(),n=N(t),r=e=>{B(e,cl())},a=e=>{B(e,ll())};H(n,e=>{L(i)===`start`?e(r):e(a,-1)});var s=F(n,2),c=N(s,!0);E(s),E(t),I(()=>{Vi(t,`left:${L(o).x??``}px;top:${L(o).y??``}px`),V(c,L(i)===`end`?`Select end date`:`Select start date`)}),B(e,t)};H(S,e=>{L(o).show&&e(C)}),E(m),ji(m,()=>L(r)?Bs(c):void 0),I((e,t)=>{G(h,`title`,e),V(_,t),y=W(v,0,`date-picker-chevron svelte-ax7ma4`,null,y,{open:L(r)})},[()=>Uc.dateRangeSpanLabel(),()=>Uc.dateRangeLabel()]),R(`click`,h,s),B(e,m),O()}Vr([`click`,`mousemove`]);function pl(e){return e+.5|0}var ml=(e,t,n)=>Math.max(Math.min(e,n),t);function hl(e){return ml(pl(e*2.55),0,255)}function gl(e){return ml(pl(e*255),0,255)}function _l(e){return ml(pl(e/2.55)/100,0,1)}function vl(e){return ml(pl(e*100),0,100)}var yl={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},bl=[...`0123456789ABCDEF`],xl=e=>bl[e&15],Sl=e=>bl[(e&240)>>4]+bl[e&15],Cl=e=>(e&240)>>4==(e&15),wl=e=>Cl(e.r)&&Cl(e.g)&&Cl(e.b)&&Cl(e.a);function Tl(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&yl[e[1]]*17,g:255&yl[e[2]]*17,b:255&yl[e[3]]*17,a:t===5?yl[e[4]]*17:255}:(t===7||t===9)&&(n={r:yl[e[1]]<<4|yl[e[2]],g:yl[e[3]]<<4|yl[e[4]],b:yl[e[5]]<<4|yl[e[6]],a:t===9?yl[e[7]]<<4|yl[e[8]]:255})),n}var El=(e,t)=>e<255?t(e):``;function Dl(e){var t=wl(e)?xl:Sl;return e?`#`+t(e.r)+t(e.g)+t(e.b)+El(e.a,t):void 0}var Ol=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function kl(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Al(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function jl(e,t,n){let r=kl(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function Ml(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=Ml(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function Pl(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(gl)}function Fl(e,t,n){return Pl(kl,e,t,n)}function Il(e,t,n){return Pl(jl,e,t,n)}function Ll(e,t,n){return Pl(Al,e,t,n)}function Rl(e){return(e%360+360)%360}function zl(e){let t=Ol.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?hl(+t[5]):gl(+t[5]));let i=Rl(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?Il(i,a,o):t[1]===`hsv`?Ll(i,a,o):Fl(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function Bl(e,t){var n=Nl(e);n[0]=Rl(n[0]+t),n=Fl(n),e.r=n[0],e.g=n[1],e.b=n[2]}function Vl(e){if(!e)return;let t=Nl(e),n=t[0],r=vl(t[1]),i=vl(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${_l(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var Hl={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},Ul={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function Wl(){let e={},t=Object.keys(Ul),n=Object.keys(Hl),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var Gl;function Kl(e){Gl||(Gl=Wl(),Gl.transparent=[0,0,0,0]);let t=Gl[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ql=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Jl(e){let t=ql.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?hl(e):ml(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?hl(r):ml(r,0,255)),i=255&(t[4]?hl(i):ml(i,0,255)),a=255&(t[6]?hl(a):ml(a,0,255)),{r,g:i,b:a,a:n}}}function Yl(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${_l(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var Xl=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,Zl=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function Ql(e,t,n){let r=Zl(_l(e.r)),i=Zl(_l(e.g)),a=Zl(_l(e.b));return{r:gl(Xl(r+n*(Zl(_l(t.r))-r))),g:gl(Xl(i+n*(Zl(_l(t.g))-i))),b:gl(Xl(a+n*(Zl(_l(t.b))-a))),a:e.a+n*(t.a-e.a)}}function $l(e,t,n){if(e){let r=Nl(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=Fl(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function eu(e,t){return e&&Object.assign(t||{},e)}function tu(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=gl(e[3]))):(t=eu(e,{r:0,g:0,b:0,a:1}),t.a=gl(t.a)),t}function nu(e){return e.charAt(0)===`r`?Jl(e):zl(e)}var ru=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=tu(t):n===`string`&&(r=Tl(t)||Kl(t)||nu(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=eu(this._rgb);return e&&(e.a=_l(e.a)),e}set rgb(e){this._rgb=tu(e)}rgbString(){return this._valid?Yl(this._rgb):void 0}hexString(){return this._valid?Dl(this._rgb):void 0}hslString(){return this._valid?Vl(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=Ql(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=gl(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=pl(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return $l(this._rgb,2,e),this}darken(e){return $l(this._rgb,2,-e),this}saturate(e){return $l(this._rgb,1,e),this}desaturate(e){return $l(this._rgb,1,-e),this}rotate(e){return Bl(this._rgb,e),this}};function iu(){}var au=(()=>{let e=0;return()=>e++})();function ou(e){return e==null}function su(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function cu(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function lu(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function uu(e,t){return lu(e)?e:t}function du(e,t){return e===void 0?t:e}var fu=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,pu=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function mu(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function hu(e,t,n,r){let i,a,o;if(su(e))if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function wu(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function Tu(e){let t=wu(e);return e=>{for(let n of t){if(n===``)break;e&&=e[n]}return e}}function Eu(e,t){return(Cu[t]||(Cu[t]=Tu(t)))(e)}function Du(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ou=e=>e!==void 0,ku=e=>typeof e==`function`,Au=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function ju(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var Mu=Math.PI,Nu=2*Mu,Pu=Nu+Mu,Fu=1/0,Iu=Mu/180,Lu=Mu/2,Ru=Mu/4,zu=Mu*2/3,Bu=Math.log10,Vu=Math.sign;function Hu(e,t,n){return Math.abs(e-t)e-t).pop(),t}function Gu(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function Ku(e){return!Gu(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function qu(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function Ju(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function od(e,t,n){n||=(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var sd=(e,t,n,r)=>od(e,n,r?r=>{let i=e[r][t];return ie[r][t]od(e,n,r=>e[r][t]>=n);function ld(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+Du(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})})}function fd(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(ud.forEach(t=>{delete e[t]}),delete e._chartjs)}function pd(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var md=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function hd(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,md.call(window,()=>{r=!1,e.apply(t,n)}))}}function gd(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var _d=e=>e===`start`?`left`:e===`end`?`right`:`center`,vd=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2,yd=(e,t,n,r)=>e===(r?`left`:`right`)?n:e===`center`?(t+n)/2:t;function bd(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(sd(c,u,d).lo,n?r:sd(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!ou(e[s.axis]));i-=Math.max(0,e)}i=rd(i,0,r-1)}if(m){let e=Math.max(sd(c,o.axis,f,!0).hi+1,n?0:sd(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!ou(e[s.axis]));e+=Math.max(0,t)}a=rd(e,i,r)-i}else a=r-i}return{start:i,count:a}}function xd(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var Sd=e=>e===0||e===1,Cd=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*Nu/n)),wd=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*Nu/n)+1,Td={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Lu)+1,easeOutSine:e=>Math.sin(e*Lu),easeInOutSine:e=>-.5*(Math.cos(Mu*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>Sd(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Sd(e)?e:Cd(e,.075,.3),easeOutElastic:e=>Sd(e)?e:wd(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return Sd(e)?e:e<.5?.5*Cd(e*2,t,n):.5+.5*wd(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Td.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Td.easeInBounce(e*2)*.5:Td.easeOutBounce(e*2-1)*.5+.5};function Ed(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Dd(e){return Ed(e)?e:new ru(e)}function Od(e){return Ed(e)?e:new ru(e).saturate(.5).darken(.1).hexString()}var kd=[`x`,`y`,`borderWidth`,`radius`,`tension`],Ad=[`color`,`borderColor`,`backgroundColor`];function jd(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Ad},numbers:{type:`number`,properties:kd}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Md(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Nd=new Map;function Pd(e,t){t||={};let n=e+JSON.stringify(t),r=Nd.get(n);return r||(r=new Intl.NumberFormat(e,t),Nd.set(n,r)),r}function Fd(e,t,n){return Pd(t,n).format(e)}var Id={values(e){return su(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Ld(e,n)}let o=Bu(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Fd(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(Bu(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Id.numeric.call(this,e,t,n):``}};function Ld(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Rd={formatters:Id};function zd(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Rd.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var Bd=Object.create(null),Vd=Object.create(null);function Hd(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Od(t.backgroundColor),this.hoverBorderColor=(e,t)=>Od(t.borderColor),this.hoverColor=(e,t)=>Od(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Ud(this,e,t)}get(e){return Hd(this,e)}describe(e,t){return Ud(Vd,e,t)}override(e,t){return Ud(Bd,e,t)}route(e,t,n,r){let i=Hd(this,e),a=Hd(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return cu(e)?Object.assign({},t,e):du(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[jd,Md,zd]);function Gd(e){return!e||ou(e.size)||ou(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function Kd(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function qd(e,t,n,r){r||={};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function Qd(e,t,n){return n||=.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,rf(e,a),c=0;c+e||0;function pf(e,t){let n={},r=cu(t),i=r?Object.keys(t):t,a=cu(e)?r?n=>du(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=ff(a(e));return n}function mf(e){return pf(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function hf(e){return pf(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function gf(e){let t=mf(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function _f(e,t){e||={},t||=Wd.font;let n=du(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=du(e.style,t.style);r&&!(``+r).match(uf)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:du(e.family,t.family),lineHeight:df(du(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:du(e.weight,t.weight),string:``};return i.string=Gd(i),i}function vf(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function bf(e,t){return Object.assign(Object.create(e),t)}function xf(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Lf(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>xf([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return Ef(n,r,()=>If(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Rf(e).includes(t)},ownKeys(e){return Rf(e)},set(e,t,n){let r=e._storage||=i();return e[t]=r[t]=n,delete e._keys,!0}})}function Sf(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:Cf(e,r),setContext:t=>Sf(e,t,n,r),override:i=>Sf(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return Ef(e,t,()=>Df(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function Cf(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:ku(n)?n:()=>n,isIndexable:ku(r)?r:()=>r}}var wf=(e,t)=>e?e+Du(t):t,Tf=(e,t)=>cu(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Ef(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Df(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return ku(s)&&o.isScriptable(t)&&(s=Of(t,s,e,n)),su(s)&&s.length&&(s=kf(t,s,e,o.isIndexable)),Tf(t,s)&&(s=Sf(s,i,a&&a[t],o)),s}function Of(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),Tf(e,c)&&(c=Nf(i._scopes,i,e,c)),c}function kf(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(cu(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Nf(r,i,e,c);t.push(Sf(n,a,o&&o[e],s))}}return t}function Af(e,t,n){return ku(e)?e(t,n):e}var jf=(e,t)=>e===!0?t:typeof e==`string`?Eu(t,e):void 0;function Mf(e,t,n,r,i){for(let a of t){let t=jf(n,a);if(t){e.add(t);let a=Af(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Nf(e,t,n,r){let i=t._rootScopes,a=Af(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=Pf(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=Pf(s,o,a,c,r),c===null)?!1:xf(Array.from(s),[``],i,a,()=>Ff(t,n,r))}function Pf(e,t,n,r,i){for(;n;)n=Mf(e,t,n,r,i);return n}function Ff(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return su(i)&&cu(n)?n:i||{}}function If(e,t,n,r){let i;for(let a of t)if(i=Lf(wf(a,e),n),i!==void 0)return Tf(e,i)?Nf(n,r,e,i):i}function Lf(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Rf(e){let t=e._keys;return t||=e._keys=zf(e._scopes),t}function zf(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function Bf(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function Wf(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=$u(a,i),c=$u(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Gf(e,t,n){let r=e.length,i,a,o,s,c,l=Hf(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)qf(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function tp(e,t){return ep(e).getPropertyValue(t)}var np=[`top`,`right`,`bottom`,`left`];function rp(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=np[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var ip=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function ap(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(ip(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function op(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=ep(n),a=i.boxSizing===`border-box`,o=rp(i,`padding`),s=rp(i,`border`,`width`),{x:c,y:l,box:u}=ap(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function sp(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&Qf(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=ep(a),s=rp(o,`border`,`width`),c=rp(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=$f(o.maxWidth,a,`clientWidth`),i=$f(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Fu,maxHeight:i||Fu}}var cp=e=>Math.round(e*10)/10;function lp(e,t,n,r){let i=ep(e),a=rp(i,`margin`),o=$f(i.maxWidth,e,`clientWidth`)||Fu,s=$f(i.maxHeight,e,`clientHeight`)||Fu,c=sp(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=rp(i,`border`,`width`),t=rp(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=cp(Math.min(l,o,c.maxWidth)),u=cp(Math.min(u,s,c.maxHeight)),l&&!u&&(u=cp(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=cp(Math.floor(u*r))),{width:l,height:u}}function up(e,t,n){let r=t||1,i=cp(e.height*r),a=cp(e.width*r);e.height=cp(e.height),e.width=cp(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var dp=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};Zf()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function fp(e,t){let n=tp(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function pp(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function mp(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function hp(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=pp(e,i,n),s=pp(i,a,n),c=pp(a,t,n);return pp(pp(o,s,n),pp(s,c,n),n)}var gp=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},_p=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function vp(e,t,n){return e?gp(t,n):_p()}function yp(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function bp(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function xp(e){return e===`angle`?{between:nd,compare:ed,normalize:td}:{between:ad,compare:(e,t)=>e-t,normalize:e=>e}}function Sp({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Cp(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=xp(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Sp({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Sp({start:g,end:d,loop:f,count:o,style:p})),m}function Tp(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function Dp(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Op(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Ep(n,i,a,r);return r===!0?kp(e,[{start:o,end:s,loop:a}],n,t):kp(e,Dp(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||=(this._running=!0,md.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){!t||!t.length||this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Lp=`transparent`,Rp={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Dd(e||Lp),i=r.valid&&Dd(t||Lp);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},zp=class{constructor(e,t,n,r){let i=t[n];r=vf([e.to,r,i,e.from]);let a=vf([e.from,i,r]);this._active=!0,this._fn=e.fn||Rp[e.type||typeof a],this._easing=Td[e.easing]||Td.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=vf([e.to,t,r,e.from]),this._from=vf([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;if(this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)}wait(){let e=this._promises||=[];return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!cu(i))return;let a={};for(let e of t)a[e]=i[e];(su(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Hp(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Vp(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||={},a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u)if(d&&u.active()){u.update(d,l,o);continue}else u.cancel();if(!d||!d.duration){e[c]=l;continue}i[c]=u=new zp(d,e,c,l),r.push(u)}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Ip.add(this._chart,n),!0}};function Vp(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function em(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||={},{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=Xp(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function nm(e,t){return bf(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function rm(e,t,n){return bf(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function im(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t||=e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var am=e=>e===`reset`||e===`none`,om=(e,t)=>t?e:Object.assign({},e),sm=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Kp(n,!0),values:null},cm=class{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Yp(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&im(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=du(n.xAxisID,tm(e,`x`)),a=t.yAxisID=du(n.yAxisID,tm(e,`y`)),o=t.rAxisID=du(n.rAxisID,tm(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&fd(this._data,this),e._stacked&&im(e)}_dataCheck(){let e=this.getDataset(),t=e.data||=[],n=this._data;if(cu(t)){let e=this._cachedMeta;this._data=Jp(t,e)}else if(n!==t){if(n){fd(n,this);let e=this._cachedMeta;im(e),e._parsed=[]}t&&Object.isExtensible(t)&&dd(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=Yp(t.vScale,t),t.stack!==n.stack&&(r=!0,im(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(em(this,t._parsed),t._stacked=Yp(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=su(r[e])?this.parseArrayData(n,r,e,t):cu(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(om(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Bp(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||=Object.assign({},e)}includeOptions(e,t){return!t||am(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){am(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!am(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function um(e){let t=e.iScale,n=lm(t,e.type),r=t._length,i,a,o,s,c=()=>{o===32767||o===-32768||(Ou(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function mm(e,t,n,r){return su(e)?pm(e,t,n,r):t[n.axis]=n.parse(e,r),t}function hm(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):Vu(e)}function vm(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(ou(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[du(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;dnd(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>nd(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(Lu,u,f),_=m(Mu,l,d),v=m(Mu+Lu,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Dm=class extends cm{static id=`doughnut`;static defaults={datasetElementType:!1,dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:`number`,properties:[`circumference`,`endAngle`,`innerRadius`,`outerRadius`,`startAngle`,`x`,`y`,`offset`,`borderWidth`,`spacing`]}},cutout:`50%`,rotation:0,circumference:360,radius:`100%`,spacing:0,indexAxis:`r`};static descriptors={_scriptable:e=>e!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(cu(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Eu(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*Nu:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Fd(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;r0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=ou(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},km=class extends cm{static id=`polarArea`;static defaults={dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Fd(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return Bf.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*Mu,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?Yu(this.resolveDataElementOptions(e,t).angle||n):0}},Am=Object.freeze({__proto__:null,BarController:wm,BubbleController:Tm,DoughnutController:Dm,LineController:Om,PieController:class extends Dm{static id=`pie`;static defaults={cutout:0,rotation:0,circumference:360,radius:`100%`}},PolarAreaController:km,RadarController:class extends cm{static id=`radar`;static defaults={datasetElementType:`line`,dataElementType:`point`,indexAxis:`r`,showLine:!0,elements:{line:{fill:`start`}}};static overrides={aspectRatio:1,scales:{r:{type:`radialLinear`}}};getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return Bf.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}}});function jm(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Mm={_date:class e{static override(t){Object.assign(e.prototype,t)}options;constructor(e){this.options=e||{}}init(){}formats(){return jm()}parse(){return jm()}format(){return jm()}add(){return jm()}diff(){return jm()}startOf(){return jm()}endOf(){return jm()}}};function Nm(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?cd:sd;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!ou(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!ou(e[t.axis]));r.hi+=Math.max(0,o)}return r}else if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Pm(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s||=e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Vm={evaluateInteractionItems:Pm,modes:{index(e,t,n,r){let i=op(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Im(e,i,a,r,o):zm(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=op(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Im(e,i,a,r,o):zm(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Wm(e,t){return e.filter(e=>Hm.indexOf(e.pos)===-1&&e.box.axis===t)}function Gm(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Km(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=Gm(Um(t,`left`),!0),i=Gm(Um(t,`right`)),a=Gm(Um(t,`top`),!0),o=Gm(Um(t,`bottom`)),s=Wm(t,`x`),c=Wm(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Um(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function Xm(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function Zm(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Qm(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!cu(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&Zm(o,a.getPadding());let s=Math.max(0,t.outerWidth-Xm(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-Xm(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function $m(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function eh(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function th(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);Zm(f,gf(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=Jm(c.concat(l),d);th(s.fullSize,p,d,m),th(c,p,d,m),th(l,p,d,m)&&th(c,p,d,m),$m(p),rh(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,rh(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},hu(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},ah=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n||=e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},oh=class extends ah{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},sh=`$chartjs`,ch={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},lh=e=>e===null||e===``;function uh(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[sh]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,lh(i)){let t=fp(e,`width`);t!==void 0&&(e.width=t)}if(lh(r))if(e.style.height===``)e.height=e.width/(t||2);else{let t=fp(e,`height`);t!==void 0&&(e.height=t)}return e}var dh=dp?{passive:!0}:!1;function fh(e,t,n){e&&e.addEventListener(t,n,dh)}function ph(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,dh)}function mh(e,t){let n=ch[e.type]||e.type,{x:r,y:i}=op(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function hh(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function gh(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=hh(n.addedNodes,r),t&&=!hh(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function _h(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=hh(n.removedNodes,r),t&&=!hh(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var vh=new Map,yh=0;function bh(){let e=window.devicePixelRatio;e!==yh&&(yh=e,vh.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function xh(e,t){vh.size||window.addEventListener(`resize`,bh),vh.set(e,t)}function Sh(e){vh.delete(e),vh.size||window.removeEventListener(`resize`,bh)}function Ch(e,t,n){let r=e.canvas,i=r&&Qf(r);if(!i)return;let a=hd((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;n===0&&r===0||a(n,r)});return o.observe(i),xh(e,a),o}function wh(e,t,n){n&&n.disconnect(),t===`resize`&&Sh(e)}function Th(e,t,n){let r=e.canvas,i=hd(t=>{e.ctx!==null&&n(mh(t,e))},e);return fh(r,t,i),i}var Eh=class extends ah{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(uh(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[sh])return!1;let n=t[sh].initial;[`height`,`width`].forEach(e=>{let r=n[e];ou(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[sh],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||={};r[t]=({attach:gh,detach:_h,resize:Ch}[t]||Th)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||={},r=n[t];r&&(({attach:wh,detach:wh,resize:wh}[t]||ph)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return lp(e,t,n,r)}isAttached(e){let t=e&&Qf(e);return!!(t&&t.isConnected)}};function Dh(e){return!Zf()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?oh:Eh}var Oh=class{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return Ku(this.x)&&Ku(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};function kh(e,t){let n=e.options.ticks,r=Ah(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Mh(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Nh(t,l,a,o/i),l;let u=jh(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Ph(t,l,u,ou(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Mh(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,Lh=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,Rh=(e,t)=>Math.min(t||e,e);function zh(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Vh(e,t){hu(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:uu(t,uu(n,t)),max:uu(n,uu(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||=this._computeLabelItems(e)}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){mu(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||=(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=yf(this,i,r),!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=rd(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-Hh(e.grid)-t.padding-Uh(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=Xu(Math.min(Math.asin(rd((l.highest.height+6)/o,-1,1)),Math.asin(rd(s/c,-1,1))-Math.asin(rd(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){mu(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){mu(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Uh(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=Hh(i)+a):(e.height=this.maxHeight,e.width=Hh(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=Yu(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){mu(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return id(this._alignToPixels?Jd(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=Hh(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return Jd(n,e,p)},g,_,v,y,b,x,S,C,w,T,ee,te;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,te=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,te=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,ee=e.right;else if(a===`right`)g=h(this.left),w=e.left,ee=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(cu(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,te=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(cu(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,ee=e.right}let ne=du(r.ticks.maxTicksLimit,l),re=Math.max(1,Math.ceil(l/ne));for(_=0;_0&&(a-=r/2);break}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:te,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:ne,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-Yu(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||=this._computeGridLineItems(e),i,a,o=(e,t,r)=>{!r.width||!r.color||(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);Wd.route(a,i,c,s)})}function Qh(e){return`id`in e&&`defaults`in e}var $h=new class{constructor(){this.controllers=new Yh(cm,`datasets`,!0),this.elements=new Yh(Oh,`elements`),this.plugins=new Yh(Object,`plugins`),this.scales=new Yh(Jh,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):hu(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=Du(e);mu(n[`before`+r],[],n),t[e](n),mu(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function tg(e){let t={},n=[],r=Object.keys($h.plugins.items);for(let e=0;e1&&cg(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function dg(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function fg(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return dg(e,`x`,n[0])||dg(e,`y`,n[0])}return{}}function pg(e,t){let n=Bd[e.type]||{scales:{}},r=t.scales||{},i=ag(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!cu(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=ug(t,o,fg(t,e),Wd.scales[o.type]),c=sg(s,i),l=n.scales||{};a[t]=xu(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||ag(i,t),s=(Bd[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=og(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),xu(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];xu(t,[Wd.scales[t.type],Wd.scale])}),a}function mg(e){let t=e.options||={};t.plugins=du(t.plugins,{}),t.scales=pg(e,t)}function hg(e){return e||={},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function gg(e){return e||={},e.data=hg(e.data),mg(e),e}var _g=new Map,vg=new Set;function yg(e,t){let n=_g.get(e);return n||(n=t(),_g.set(e,n),vg.add(n)),n}var bg=(e,t,n)=>{let r=Eu(t,n);r!==void 0&&e.add(r)},xg=class{constructor(e){this._config=gg(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=hg(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),mg(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return yg(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return yg(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return yg(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return yg(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>bg(s,e,t))),t.forEach(e=>bg(s,r,e)),t.forEach(e=>bg(s,Bd[i]||{},e)),t.forEach(e=>bg(s,Wd,e)),t.forEach(e=>bg(s,Vd,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),vg.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,Bd[t]||{},Wd.datasets[t]||{},{type:t},Wd,Vd]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Sg(this._resolverCache,e,r),s=a;if(wg(a,t)){i.$shared=!1,n=ku(n)?n():n;let t=this.createResolver(e,n,o);s=Sf(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Sg(this._resolverCache,e,n);return cu(t)?Sf(i,t,void 0,r):i}};function Sg(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:xf(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var Cg=e=>cu(e)&&Object.getOwnPropertyNames(e).some(t=>ku(e[t]));function wg(e,t){let{isScriptable:n,isIndexable:r}=Cf(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(ku(o)||Cg(o))||a&&su(o))return!0}return!1}var Tg=`4.5.1`,Eg=[`top`,`bottom`,`left`,`right`,`chartArea`];function Dg(e,t){return e===`top`||e===`bottom`||Eg.indexOf(e)===-1&&t===`x`}function Og(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function kg(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),mu(n&&n.onComplete,[e],t)}function Ag(e){let t=e.chart,n=t.options.animation;mu(n&&n.onProgress,[e],t)}function jg(e){return Zf()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Mg={},Ng=e=>{let t=jg(e);return Object.values(Mg).filter(e=>e.canvas===t).pop()};function Pg(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Fg(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Ig=class{static defaults=Wd;static instances=Mg;static overrides=Bd;static registry=$h;static version=Tg;static getChart=Ng;static register(...e){$h.add(...e),Lg()}static unregister(...e){$h.remove(...e),Lg()}constructor(e,t){let n=this.config=new xg(t),r=jg(e),i=Ng(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Dh(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;if(this.id=au(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new eg,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=gd(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Mg[this.id]=this,!o||!s){console.error(`Failed to create chart: can't acquire context from the given item`);return}Ip.listen(this,`complete`,kg),Ip.listen(this,`progress`,Ag),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return ou(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return $h}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():up(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return Yd(this.canvas,this.ctx),this}stop(){return Ip.stop(this),this}resize(e,t){Ip.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,up(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),mu(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){hu(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=ug(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),hu(i,t=>{let i=t.options,a=i.id,o=ug(a,i),s=du(i.type,t.dtype);(i.position===void 0||Dg(i.position,o)!==Dg(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new($h.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),hu(r,(e,t)=>{e||delete n[t]}),hu(n,e=>{ih.configure(this,e,e.options),ih.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Og(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){hu(this.scales,e=>{ih.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!Au(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Pg(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;ih.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],hu(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=Fp(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&$d(t,r),e.controller.draw(),r&&ef(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return Qd(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Vm.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||=bf(null,{chart:this,type:`chart`})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Ou(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Ip.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};hu(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||={};let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){hu(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},hu(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});gu(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=ju(e),c=Fg(e,this._lastEvent,n,s);n&&(this._lastEvent=null,mu(i.onHover,[e,o,this],this),s&&mu(i.onClick,[e,o,this],this));let l=!gu(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};function Lg(){return hu(Ig.instances,e=>e._plugins.invalidate())}function Rg(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,td(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,td(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*td(r-n));if(u===`round`)e.arc(i,a,t,n-Mu/2,r+Mu/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+Mu/2)+i,c=-o*Math.sin(n+Mu/2)+a,l=o*Math.cos(r+Mu/2)+i,u=o*Math.sin(r+Mu/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function zg(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+Lu,r-Lu),e.closePath(),e.clip()}function Bg(e){return pf(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function Vg(e,t,n,r){let i=Bg(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return rd(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:rd(i.innerStart,0,o),innerEnd:rd(i.innerEnd,0,o)}}function Hg(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Ug(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/Mu)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=Vg(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,ee=f+b,te=f+x,ne=g+b/ee,re=_-x/te;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=Hg(C,T,o,s);e.arc(t.x,t.y,y,T,_+Lu)}let n=Hg(te,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=Hg(te,re,o,s);e.arc(t.x,t.y,x,_+Lu,re+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=Hg(ee,ne,o,s);e.arc(t.x,t.y,b,ne+Math.PI,g-Lu)}let i=Hg(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=Hg(S,w,o,s);e.arc(t.x,t.y,v,g-Lu,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function Wg(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){Ug(e,t,n,r,c,i);for(let t=0;t=Mu&&p===0&&u!==`miter`&&Rg(e,t,h),a||(Ug(e,t,n,r,h,i),e.stroke())}var Kg=class extends Oh{static id=`arc`;static defaults={borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1};static defaultRoutes={backgroundColor:`backgroundColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=Qu(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=du(l,o-a),f=nd(r,a,o)&&a!==o,p=d>=Nu||f,m=ad(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>Nu?Math.floor(n/Nu):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(Mu,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Wg(e,this,s,i,a),Gg(e,this,s,i,a),e.restore()}};function qg(e,t,n=t){e.lineCap=du(n.borderCapStyle,t.borderCapStyle),e.setLineDash(du(n.borderDash,t.borderDash)),e.lineDashOffset=du(n.borderDashOffset,t.borderDashOffset),e.lineJoin=du(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=du(n.borderWidth,t.borderWidth),e.strokeStyle=du(n.borderColor,t.borderColor)}function Jg(e,t,n){e.lineTo(n.x,n.y)}function Yg(e){return e.stepped?tf:e.tension||e.cubicInterpolationMode===`monotone`?nf:Jg}function Xg(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function $g(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?Qg:Zg}function e_(e){return e.stepped?mp:e.tension||e.cubicInterpolationMode===`monotone`?hp:pp}function t_(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),qg(e,t.options),e.stroke(i)}function n_(e,t,n,r){let{segments:i,options:a}=t,o=$g(t);for(let s of i)qg(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var r_=typeof Path2D==`function`;function i_(e,t,n,r){r_&&!t.options.segment?t_(e,t,n,r):n_(e,t,n,r)}var a_=class extends Oh{static id=`line`;static defaults={borderCapStyle:`butt`,borderDash:[],borderDashOffset:0,borderJoinStyle:`miter`,borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:`default`,fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:`backgroundColor`,borderColor:`borderColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`&&e!==`fill`};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;Xf(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||=Op(this,this.options.segment)}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=Tp(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=e_(n),c,l;for(c=0,l=a.length;ce.replace(`rgb(`,`rgba(`).replace(`)`,`, 0.5)`));function b_(e){return v_[e%v_.length]}function x_(e){return y_[e%y_.length]}function S_(e,t){return e.borderColor=b_(t),e.backgroundColor=x_(t),++t}function C_(e,t){return e.backgroundColor=e.data.map(()=>b_(t++)),t}function w_(e,t){return e.backgroundColor=e.data.map(()=>x_(t++)),t}function T_(e){let t=0;return(n,r)=>{let i=e.getDatasetMeta(r).controller;i instanceof Dm?t=C_(n,t):i instanceof km?t=w_(n,t):i&&(t=S_(n,t))}}function E_(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}function D_(e){return e&&(e.borderColor||e.backgroundColor)}function O_(){return Wd.borderColor!==`rgba(0,0,0,0.1)`||Wd.backgroundColor!==`rgba(0,0,0,0.1)`}var k_={id:`colors`,defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,n){if(!n.enabled)return;let{data:{datasets:r},options:i}=e.config,{elements:a}=i,o=E_(r)||D_(i)||a&&E_(a)||O_();if(!n.forceOverride&&o)return;let s=T_(e);r.forEach(s)}};function A_(e,t,n,r,i){let a=i.samples||r;if(a>=n)return e.slice(t,t+n);let o=[],s=(n-2)/(a-2),c=0,l=t+n-1,u=t,d,f,p,m,h;for(o[c++]=e[u],d=0;dp&&(p=m,f=e[a],h=a);o[c++]=f,u=h}return o[c++]=e[l],o}function j_(e,t,n,r){let i=0,a=0,o,s,c,l,u,d,f,p,m,h,g=[],_=t+n-1,v=e[t].x,y=e[_].x-v;for(o=t;oh&&(h=l,f=o),i=(a*i+s.x)/++a;else{let n=o-1;if(!ou(d)&&!ou(f)){let t=Math.min(d,f),r=Math.max(d,f);t!==p&&t!==n&&g.push({...e[t],x:i}),r!==p&&r!==n&&g.push({...e[r],x:i})}o>0&&n!==p&&g.push(e[n]),g.push(s),u=t,a=0,m=h=l,d=f=p=o}}return g}function M_(e){if(e._decimated){let t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function N_(e){e.data.datasets.forEach(e=>{M_(e)})}function P_(e,t){let n=t.length,r=0,i,{iScale:a}=e,{min:o,max:s,minDefined:c,maxDefined:l}=a.getUserBounds();return c&&(r=rd(sd(t,a.axis,o).lo,0,n-1)),i=l?rd(sd(t,a.axis,s).hi+1,r,n)-r:n-r,{start:r,count:i}}var F_={id:`decimation`,defaults:{algorithm:`min-max`,enabled:!1},beforeElementsUpdate:(e,t,n)=>{if(!n.enabled){N_(e);return}let r=e.width;e.data.datasets.forEach((t,i)=>{let{_data:a,indexAxis:o}=t,s=e.getDatasetMeta(i),c=a||t.data;if(vf([o,e.options.indexAxis])===`y`||!s.controller.supportsDecimation)return;let l=e.scales[s.xAxisID];if(l.type!==`linear`&&l.type!==`time`||e.options.parsing)return;let{start:u,count:d}=P_(s,c);if(d<=(n.threshold||4*r)){M_(t);return}ou(a)&&(t._data=c,delete t.data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(e){this._data=e}}));let f;switch(n.algorithm){case`lttb`:f=A_(c,u,d,r,n);break;case`min-max`:f=j_(c,u,d,r);break;default:throw Error(`Unsupported decimation algorithm '${n.algorithm}'`)}t._decimated=f})},destroy(e){N_(e)}};function I_(e,t,n){let r=e.segments,i=e.points,a=t.points,o=[];for(let e of r){let{start:r,end:s}=e;s=z_(r,s,i);let c=L_(n,i[r],i[s],e.loop);if(!t.segments){o.push({source:e,target:c,start:i[r],end:i[s]});continue}let l=Tp(t,c);for(let t of l){let r=L_(n,a[t.start],a[t.end],t.loop),s=wp(e,i,r);for(let e of s)o.push({source:e,target:t,start:{[n]:B_(c,r,`start`,Math.max)},end:{[n]:B_(c,r,`end`,Math.min)}})}}return o}function L_(e,t,n,r){if(r)return;let i=t[e],a=n[e];return e===`angle`&&(i=td(i),a=td(a)),{property:e,start:i,end:a}}function R_(e,t){let{x:n=null,y:r=null}=e||{},i=t.points,a=[];return t.segments.forEach(({start:e,end:t})=>{t=z_(e,t,i);let o=i[e],s=i[t];r===null?n!==null&&(a.push({x:n,y:o.y}),a.push({x:n,y:s.y})):(a.push({x:o.x,y:r}),a.push({x:s.x,y:r}))}),a}function z_(e,t,n){for(;t>e;t--){let e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function B_(e,t,n,r){return e&&t?r(e[n],t[n]):e?e[n]:t?t[n]:0}function V_(e,t){let n=[],r=!1;return su(e)?(r=!0,n=e):n=R_(e,t),n.length?new a_({points:n,options:{tension:0},_loop:r,_fullLoop:r}):null}function H_(e){return e&&e.fill!==!1}function U_(e,t,n){let r=e[t].fill,i=[t],a;if(!n)return r;for(;r!==!1&&i.indexOf(r)===-1;){if(!lu(r))return r;if(a=e[r],!a)return!1;if(a.visible)return r;i.push(r),r=a.fill}return!1}function W_(e,t,n){let r=J_(e);if(cu(r))return!isNaN(r.value)&&r;let i=parseFloat(r);return lu(i)&&Math.floor(i)===i?G_(r[0],t,i,n):[`origin`,`start`,`end`,`stack`,`shape`].indexOf(r)>=0&&r}function G_(e,t,n,r){return(e===`-`||e===`+`)&&(n=t+n),n===t||n<0||n>=r?!1:n}function K_(e,t){let n=null;return e===`start`?n=t.bottom:e===`end`?n=t.top:cu(e)?n=t.getPixelForValue(e.value):t.getBasePixel&&(n=t.getBasePixel()),n}function q_(e,t,n){let r;return r=e===`start`?n:e===`end`?t.options.reverse?t.min:t.max:cu(e)?e.value:t.getBaseValue(),r}function J_(e){let t=e.options,n=t.fill,r=du(n&&n.target,n);return r===void 0&&(r=!!t.backgroundColor),r===!1||r===null?!1:r===!0?`origin`:r}function Y_(e){let{scale:t,index:n,line:r}=e,i=[],a=r.segments,o=r.points,s=X_(t,n);s.push(V_({x:null,y:t.bottom},r));for(let e=0;e=0;--t){let n=i[t].$filler;n&&(n.line.updateControlPoints(a,n.axis),r&&n.fill&&av(e.ctx,n,a))}},beforeDatasetsDraw(e,t,n){if(n.drawTime!==`beforeDatasetsDraw`)return;let r=e.getSortedVisibleDatasetMetas();for(let t=r.length-1;t>=0;--t){let n=r[t].$filler;H_(n)&&av(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){let r=t.meta.$filler;!H_(r)||n.drawTime!==`beforeDatasetDraw`||av(e.ctx,r,e.chartArea)},defaults:{propagate:!0,drawTime:`beforeDatasetDraw`}},pv=(e,t)=>{let{boxHeight:n=t,boxWidth:r=t}=e;return e.usePointStyle&&(n=Math.min(n,t),r=e.pointStyleWidth||Math.min(r,t)),{boxWidth:r,boxHeight:n,itemHeight:Math.max(t,n)}},mv=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index,hv=class extends Oh{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let e=this.options.labels||{},t=mu(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){let{options:e,ctx:t}=this;if(!e.display){this.width=this.height=0;return}let n=e.labels,r=_f(n.font),i=r.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=pv(n,i),c,l;t.font=r.string,this.isHorizontal()?(c=this.maxWidth,l=this._fitRows(a,i,o,s)+10):(l=this.maxHeight,c=this._fitCols(a,r,o,s)+10),this.width=Math.min(c,e.maxWidth||this.maxWidth),this.height=Math.min(l,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,r){let{ctx:i,maxWidth:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.lineWidths=[0],l=r+o,u=e;i.textAlign=`left`,i.textBaseline=`middle`;let d=-1,f=-l;return this.legendItems.forEach((e,p)=>{let m=n+t/2+i.measureText(e.text).width;(p===0||c[c.length-1]+m+2*o>a)&&(u+=l,c[c.length-(p>0?0:1)]=0,f+=l,d++),s[p]={left:0,top:f,row:d,width:m,height:r},c[c.length-1]+=m+o}),u}_fitCols(e,t,n,r){let{ctx:i,maxHeight:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.columnSizes=[],l=a-e,u=o,d=0,f=0,p=0,m=0;return this.legendItems.forEach((e,a)=>{let{itemWidth:h,itemHeight:g}=gv(n,t,i,e,r);a>0&&f+g+2*o>l&&(u+=d+o,c.push({width:d,height:f}),p+=d+o,m++,d=f=0),s[a]={left:p,top:f,col:m,width:h,height:g},d=Math.max(d,h),f+=g+o}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:r},rtl:i}}=this,a=vp(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=vd(n,this.left+r,this.right-this.lineWidths[i]);for(let s of t)i!==s.row&&(i=s.row,o=vd(n,this.left+r,this.right-this.lineWidths[i])),s.top+=this.top+e+r,s.left=a.leftForLtr(a.x(o),s.width),o+=s.width+r}else{let i=0,o=vd(n,this.top+e+r,this.bottom-this.columnSizes[i].height);for(let s of t)s.col!==i&&(i=s.col,o=vd(n,this.top+e+r,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+r,s.left=a.leftForLtr(a.x(s.left),s.width),o+=s.height+r}}isHorizontal(){return this.options.position===`top`||this.options.position===`bottom`}draw(){if(this.options.display){let e=this.ctx;$d(e,this),this._draw(),ef(e)}}_draw(){let{options:e,columnSizes:t,lineWidths:n,ctx:r}=this,{align:i,labels:a}=e,o=Wd.color,s=vp(e.rtl,this.left,this.width),c=_f(a.font),{padding:l}=a,u=c.size,d=u/2,f;this.drawTitle(),r.textAlign=s.textAlign(`left`),r.textBaseline=`middle`,r.lineWidth=.5,r.font=c.string;let{boxWidth:p,boxHeight:m,itemHeight:h}=pv(a,u),g=function(e,t,n){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;r.save();let i=du(n.lineWidth,1);if(r.fillStyle=du(n.fillStyle,o),r.lineCap=du(n.lineCap,`butt`),r.lineDashOffset=du(n.lineDashOffset,0),r.lineJoin=du(n.lineJoin,`miter`),r.lineWidth=i,r.strokeStyle=du(n.strokeStyle,o),r.setLineDash(du(n.lineDash,[])),a.usePointStyle){let o={radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},c=s.xPlus(e,p/2),l=t+d;Zd(r,o,c,l,a.pointStyleWidth&&p)}else{let a=t+Math.max((u-m)/2,0),o=s.leftForLtr(e,p),c=hf(n.borderRadius);r.beginPath(),Object.values(c).some(e=>e!==0)?cf(r,{x:o,y:a,w:p,h:m,radius:c}):r.rect(o,a,p,m),r.fill(),i!==0&&r.stroke()}r.restore()},_=function(e,t,n){sf(r,n.text,e,t+h/2,c,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();f=v?{x:vd(i,this.left+l,this.right-n[0]),y:this.top+l+y,line:0}:{x:this.left+l,y:vd(i,this.top+y+l,this.bottom-t[0].height),line:0},yp(this.ctx,e.textDirection);let b=h+l;this.legendItems.forEach((o,u)=>{r.strokeStyle=o.fontColor,r.fillStyle=o.fontColor;let m=r.measureText(o.text).width,h=s.textAlign(o.textAlign||=a.textAlign),x=p+d+m,S=f.x,C=f.y;s.setWidth(this.width),v?u>0&&S+x+l>this.right&&(C=f.y+=b,f.line++,S=f.x=vd(i,this.left+l,this.right-n[f.line])):u>0&&C+b>this.bottom&&(S=f.x=S+t[f.line].width+l,f.line++,C=f.y=vd(i,this.top+y+l,this.bottom-t[f.line].height));let w=s.x(S);if(g(w,C,o),S=yd(h,S+p+d,v?S+x:this.right,e.rtl),_(s.x(S),C,o),v)f.x+=x+l;else if(typeof o.text!=`string`){let e=c.lineHeight;f.y+=yv(o,e)+l}else f.y+=b}),bp(this.ctx,e.textDirection)}drawTitle(){let e=this.options,t=e.title,n=_f(t.font),r=gf(t.padding);if(!t.display)return;let i=vp(e.rtl,this.left,this.width),a=this.ctx,o=t.position,s=n.size/2,c=r.top+s,l,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),l=this.top+c,u=vd(e.align,u,this.right-d);else{let t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);l=c+vd(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}let f=vd(o,u,u+d);a.textAlign=i.textAlign(_d(o)),a.textBaseline=`middle`,a.strokeStyle=t.color,a.fillStyle=t.color,a.font=n.string,sf(a,t.text,f,l,n)}_computeTitleHeight(){let e=this.options.title,t=_f(e.font),n=gf(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,r,i;if(ad(e,this.left,this.right)&&ad(t,this.top,this.bottom)){for(i=this.legendHitBoxes,n=0;ne.length>t.length?e:t)),t+n.size/2+r.measureText(i).width}function vv(e,t,n){let r=e;return typeof t.text!=`string`&&(r=yv(t,n)),r}function yv(e,t){return t*(e.text?e.text.length:0)}function bv(e,t){return!!((e===`mousemove`||e===`mouseout`)&&(t.onHover||t.onLeave)||t.onClick&&(e===`click`||e===`mouseup`))}var xv={id:`legend`,_element:hv,start(e,t,n){let r=e.legend=new hv({ctx:e.ctx,options:n,chart:e});ih.configure(e,r,n),ih.addBox(e,r)},stop(e){ih.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,n){let r=e.legend;ih.configure(e,r,n),r.options=n},afterUpdate(e){let t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:`top`,align:`center`,fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,n){let r=t.datasetIndex,i=n.chart;i.isDatasetVisible(r)?(i.hide(r),t.hidden=!0):(i.show(r),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){let t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:r,textAlign:i,color:a,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{let c=e.controller.getStyle(n?0:void 0),l=gf(c.borderWidth);return{text:t[e.index].label,fillStyle:c.backgroundColor,fontColor:a,hidden:!e.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:c.borderColor,pointStyle:r||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:o&&(s||c.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:`center`,text:``}},descriptors:{_scriptable:e=>!e.startsWith(`on`),labels:{_scriptable:e=>![`generateLabels`,`filter`,`sort`].includes(e)}}},Sv=class extends Oh{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){let n=this.options;if(this.left=0,this.top=0,!n.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=e,this.height=this.bottom=t;let r=su(n.text)?n.text.length:1;this._padding=gf(n.padding);let i=r*_f(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=i:this.width=i}isHorizontal(){let e=this.options.position;return e===`top`||e===`bottom`}_drawArgs(e){let{top:t,left:n,bottom:r,right:i,options:a}=this,o=a.align,s=0,c,l,u;return this.isHorizontal()?(l=vd(o,n,i),u=t+e,c=i-n):(a.position===`left`?(l=n+e,u=vd(o,r,t),s=Mu*-.5):(l=i-e,u=vd(o,t,r),s=Mu*.5),c=r-t),{titleX:l,titleY:u,maxWidth:c,rotation:s}}draw(){let e=this.ctx,t=this.options;if(!t.display)return;let n=_f(t.font),r=n.lineHeight/2+this._padding.top,{titleX:i,titleY:a,maxWidth:o,rotation:s}=this._drawArgs(r);sf(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:_d(t.align),textBaseline:`middle`,translation:[i,a]})}};function Cv(e,t){let n=new Sv({ctx:e.ctx,options:t,chart:e});ih.configure(e,n,t),ih.addBox(e,n),e.titleBlock=n}var wv={id:`title`,_element:Sv,start(e,t,n){Cv(e,n)},stop(e){let t=e.titleBlock;ih.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){let r=e.titleBlock;ih.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`bold`},fullSize:!0,padding:10,position:`top`,text:``,weight:2e3},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},Tv=new WeakMap,Ev={id:`subtitle`,start(e,t,n){let r=new Sv({ctx:e.ctx,options:n,chart:e});ih.configure(e,r,n),ih.addBox(e,r),Tv.set(e,r)},stop(e){ih.removeBox(e,Tv.get(e)),Tv.delete(e)},beforeUpdate(e,t,n){let r=Tv.get(e);ih.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`normal`},fullSize:!0,padding:0,position:`top`,text:``,weight:1500},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},Dv={average(e){if(!e.length)return!1;let t,n,r=new Set,i=0,a=0;for(t=0,n=e.length;te+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a-1?e.split(` -`):e}function Av(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function jv(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=_f(t.bodyFont),l=_f(t.titleFont),u=_f(t.footerFont),d=a.length,f=i.length,p=r.length,m=gf(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,hu(e.title,y),n.font=c.string,hu(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,hu(r,e=>{hu(e.before,y),hu(e.lines,y),hu(e.after,y)}),v=0,n.font=u.string,hu(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function Mv(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function Nv(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function Pv(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),Nv(l,e,t,n)&&(l=`center`),l}function Fv(e,t,n){let r=n.yAlign||t.yAlign||Mv(e,n);return{xAlign:n.xAlign||t.xAlign||Pv(e,t,n,r),yAlign:r}}function Iv(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function Lv(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:t===`bottom`?r-=i+n:r-=i/2,r}function Rv(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=hf(o),m=Iv(t,s),h=Lv(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:rd(m,0,r.width-t.width),y:rd(h,0,r.height-t.height)}}function zv(e,t,n){let r=gf(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Bv(e){return Ov([],kv(e))}function Vv(e,t,n){return bf(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function Hv(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Uv={beforeTitle:iu,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=Hv(n,e);Ov(t.before,kv(Wv(i,`beforeLabel`,this,e))),Ov(t.lines,Wv(i,`label`,this,e)),Ov(t.after,kv(Wv(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Bv(Wv(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=Wv(n,`beforeFooter`,this,e),i=Wv(n,`footer`,this,e),a=Wv(n,`afterFooter`,this,e),o=[];return o=Ov(o,kv(r)),o=Ov(o,kv(i)),o=Ov(o,kv(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),hu(o,t=>{let n=Hv(e.callbacks,t);r.push(Wv(n,`labelColor`,this,t)),i.push(Wv(n,`labelPointStyle`,this,t)),a.push(Wv(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=Dv[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=jv(this,n),o=Object.assign({},e,t),s=Fv(this.chart,n,o),c=Rv(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=hf(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=vp(n.rtl,this.x,this.width);for(e.x=zv(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=_f(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,cf(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),cf(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=_f(n.bodyFont),d=u.lineHeight,f=0,p=vp(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=zv(this,h,n),t.fillStyle=n.bodyColor,hu(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=Dv[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=jv(this,e),o=Object.assign({},n,this._size),s=Fv(t,e,o),c=Rv(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=gf(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),yp(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),bp(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!gu(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!gu(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=Dv[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}},Kv=Object.freeze({__proto__:null,Colors:k_,Decimation:F_,Filler:fv,Legend:xv,SubTitle:Ev,Title:wv,Tooltip:{id:`tooltip`,_element:Gv,positioners:Dv,afterInit(e,t,n){n&&(e.tooltip=new Gv({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Uv},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]}}),qv=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function Jv(e,t,n,r){let i=e.indexOf(t);return i===-1?qv(e,t,n,r):i===e.lastIndexOf(t)?i:n}var Yv=(e,t)=>e===null?null:rd(Math.round(e),0,t);function Xv(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};function Qv(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!ou(a),_=!ou(o),v=!ou(c),y=(h-m)/(u+1),b=Uu((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=Uu(w*b/p/f)*f),ou(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&qu((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=Hu(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(Zu(b),Zu(S));x=10**(ou(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let ee=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&Hu(n[n.length-1].value,o,$v(o,y,e))?n[n.length-1].value=o:n.push({value:o}):(!_||C===o)&&n.push({value:C}),n}function $v(e,t,{horizontal:n,minRotation:r}){let i=Yu(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var ey=class extends Jh{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return ou(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=Vu(r),t=Vu(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e||=11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=Qv({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&Ju(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Fd(e,this.chart.options.locale,this.options.ticks.format)}},ty=class extends ey{static id=`linear`;static defaults={ticks:{callback:Rd.formatters.numeric}};determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=lu(e)?e:0,this.max=lu(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=Yu(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}},ny=e=>Math.floor(Bu(e)),ry=(e,t)=>10**(ny(e)+t);function iy(e){return e/10**ny(e)==1}function ay(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function oy(e,t){let n=ny(t-e);for(;ay(e,t,n)>10;)n++;for(;ay(e,t,n)<10;)n--;return Math.min(n,ny(e))}function sy(e,{min:t,max:n}){t=uu(e.min,t);let r=[],i=ny(t),a=oy(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=uu(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=uu(e.max,f);return r.push({value:p,major:iy(p),significand:d}),r}var cy=class extends Jh{static id=`logarithmic`;static defaults={ticks:{callback:Rd.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=ey.prototype.parse.apply(this,[e,t]);if(n===0){this._zero=!0;return}return lu(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=lu(e)?Math.max(0,e):null,this.max=lu(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!lu(this._userMin)&&(this.min=e===ry(this.min,0)?ry(this.min,-1):ry(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(ry(n,-1)),a(ry(r,1)))),n<=0&&i(ry(r,-1)),r<=0&&a(ry(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=sy({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&Ju(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Fd(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=Bu(e),this._valueRange=Bu(this.max)-Bu(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(Bu(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};function ly(e){let t=e.ticks;if(t.display&&e.display){let e=gf(t.backdropPadding);return du(t.font&&t.font.size,Wd.font.size)+e.height}return 0}function uy(e,t,n){return n=su(n)?n:[n],{w:qd(e,t.string,n),h:n.length*t.lineHeight}}function dy(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function fy(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?Mu/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function my(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(Xu(td(c.angle+Lu))),u=yy(c.y,s.h,l),d=_y(l),f=vy(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function hy(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(Qd({x:n,y:r},t)||Qd({x:n,y:a},t)||Qd({x:i,y:r},t)||Qd({x:i,y:a},t))}function gy(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:ly(a)/2,additionalAngle:o?Mu/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function by(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!ou(s)){let n=hf(t.borderRadius),c=gf(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),cf(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function xy(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));by(n,a,t);let o=_f(a.font),{x:s,y:c,textAlign:l}=t;sf(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function Sy(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,Nu);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=mu(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?fy(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=Nu/(this._pointLabels.length||1),n=this.options.startAngle||0;return td(e*t+Yu(n))}getDistanceFromCenterForValue(e){if(ou(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(ou(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);Cy(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;!a||!i||(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=_f(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=gf(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}sf(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}},Ey={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Dy=Object.keys(Ey);function Oy(e,t){return e-t}function ky(e,t){if(ou(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),lu(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(Ku(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function Ay(e,t,n,r){let i=Dy.length;for(let a=Dy.indexOf(e);a=Dy.indexOf(n);a--){let n=Dy[a];if(Ey[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return Dy[n?Dy.indexOf(n):0]}function My(e){for(let t=Dy.indexOf(e)+1,n=Dy.length;t=t?n[r]:n[i];e[a]=!0}}function Py(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Fy(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=rd(t,0,a),n=rd(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||Ay(i.minUnit,t,n,this._getLabelCapacity(t)),o=du(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=Ku(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return mu(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=sd(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=sd(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var Ry=class extends Iy{static id=`timeseries`;static defaults=Iy.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Ly(t,this.min),this._tableRange=Ly(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Ly(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Ly(this._table,n*this._tableRange+this._minPos,!0)}},zy=[Am,__,Kv,Object.freeze({__proto__:null,CategoryScale:Zv,LinearScale:ty,LogarithmicScale:cy,RadialLinearScale:Ty,TimeScale:Iy,TimeSeriesScale:Ry})];Ig.register(...zy);var By=Ig,Vy=z(``);function Hy(e,t){D(t,!0);let n=K(t,`class`,3,``),r=K(t,`ariaLabel`,3,``);function i(e){if(Da.tick,typeof t.build!=`function`)return;let n=t.build();if(!n)return;let r=new By(e.getContext(`2d`),n);return()=>r.destroy()}var a=Vy();ji(a,()=>i),I(()=>{W(a,1,Pi(n())),G(a,`aria-label`,r())}),B(e,a),O()}var Uy=z(``),Wy=z(`
        `);function Gy(e,t){D(t,!0);let n=K(t,`options`,19,()=>[]),r=K(t,`ariaLabel`,3,``),i=K(t,`class`,3,``);var a=Wy();U(a,21,n,e=>e.value,(e,n)=>{var r=Uy();let i;var a=N(r,!0);E(r),I(()=>{i=W(r,1,`segmented-btn svelte-92fh5i`,null,i,{active:t.value===L(n).value}),G(r,`aria-pressed`,t.value===L(n).value),V(a,L(n).label)}),R(`click`,r,()=>t.onchange?.(L(n).value)),B(e,r)}),E(a),I(()=>{W(a,1,Pi([`segmented-control`,i()]),`svelte-92fh5i`),G(a,`aria-label`,r())}),B(e,a),O()}Vr([`click`]);function Ky(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function qy(){return{grid:Ky(`--chart-grid`),text:Ky(`--chart-text`),dayMarker:Ky(`--chart-day-marker`),tooltipBg:Ky(`--chart-tooltip-bg`),tooltipBorder:Ky(`--chart-tooltip-border`),tooltipText:Ky(`--chart-tooltip-text`)}}function Jy(){return{size:11,family:`'SF Mono', Menlo, Consolas, monospace`}}function Yy(e,t){return{backgroundColor:e.tooltipBg,borderColor:e.tooltipBorder,borderWidth:1,titleColor:e.tooltipText,bodyColor:e.tooltipText,callbacks:t}}function Xy(e){if(typeof document>`u`||!document.body)return e;let t=document.createElement(`span`);t.style.display=`none`,t.style.color=e,document.body.appendChild(t);let n=getComputedStyle(t).color;return document.body.removeChild(t),n||e}var Zy=[`#c2845a`,`#7a9e7e`,`#d4a574`,`#b8a98e`,`#8b9e6b`,`#7d8a97`,`#c47a5a`,`#6b8e6b`,`#a09486`,`#9b7ea4`,`#c49a6c`];function Qy(){return[...Zy]}function $y(e){let t=5381,n=String(e||``);for(let e=0;exc(e)}}var ab={seconds:{apiName:`second`,windowLabel:`Last 60 seconds`,refreshMs:2e3},minutes:{apiName:`minute`,windowLabel:`Last 60 minutes`,refreshMs:5e3},hours:{apiName:`hour`,windowLabel:`Last 24 hours`,refreshMs:2e4},days:{apiName:`day`,windowLabel:`Last 30 days`,refreshMs:6e4}},ob=[{value:`seconds`,label:`Seconds`},{value:`minutes`,label:`Minutes`},{value:`hours`,label:`Hours`},{value:`days`,label:`Days`}];function sb(){return{input:0,output:0,prompt:0,local:0}}function cb(e){return String(e).padStart(2,`0`)}function lb(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function ub(e,t){if(!Number.isFinite(t))return``;let n=new Date(t);switch(e){case`seconds`:return cb(n.getHours())+`:`+cb(n.getMinutes())+`:`+cb(n.getSeconds());case`minutes`:return cb(n.getHours())+`:`+cb(n.getMinutes());case`hours`:return cb(n.getHours())+`:00`;default:return cb(n.getMonth()+1)+`-`+cb(n.getDate())}}function db(e,t){let n=[],r=[],i={input:[],output:[],prompt:[],local:[]},a=sb();for(let o of e||[]){let e=Date.parse(o&&o.start),s=lb(o&&o.input_tokens),c=lb(o&&o.output_tokens),l=lb(o&&o.prompt_cached_tokens),u=lb(o&&o.locally_cached_tokens);n.push(ub(t,e)),r.push(Number.isFinite(e)?e:null),i.input.push(s),i.output.push(c),i.prompt.push(l),i.local.push(u),a.input+=s,a.output+=c,a.prompt+=l,a.local+=u}return{labels:n,stamps:r,cols:i,totals:a}}function fb(e){let t=e||sb();return t.input+t.output+t.prompt+t.local>0}function pb(e,t){return xc(Math.max(0,Math.round(e&&e[t]||0)))}function mb(e){return(ab[e]||ab.minutes).windowLabel}function hb(e,t){return`Live token throughput, `+mb(t).toLowerCase()+`. Input `+pb(e,`input`)+`, output `+pb(e,`output`)+`, prompt cached `+pb(e,`prompt`)+`, locally cached `+pb(e,`local`)+` tokens.`}function gb(e,t,n,r){let i=e=>xc(Math.max(0,Math.round(e))),a=n.stamps,o=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderWidth:0,borderRadius:0,categoryPercentage:1,barPercentage:1,stack:`tokens`});return{type:`bar`,plugins:[{id:`liveTokensDayMarks`,afterDatasetsDraw:t=>{if(r===`days`)return;let n=t.getDatasetMeta(0),i=t.chartArea;if(!n||!n.data||!i)return;let o=t.ctx;o.save(),o.font=`10px 'SF Mono', Menlo, Consolas, monospace`;let s=null;for(let t=0;t{if(!e.length)return``;let t=a[e[0].dataIndex];if(!t)return e[0].label;let n=new Date(t);return r===`days`?n.toLocaleDateString():n.toLocaleString()},label:e=>e.dataset.label+`: `+i(e.parsed.y),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+i(t)}})}}}}var _b=900,vb=new class{#e=A(`minutes`);get granularity(){return L(this.#e)}set granularity(e){j(this.#e,e,!0)}#t=A(M([]));get buckets(){return L(this.#t)}set buckets(e){j(this.#t,e,!0)}#n=A(!1);get active(){return L(this.#n)}set active(e){j(this.#n,e,!0)}#r=null;#i=null;#a=null;#o=0;#s=null;#c=!1;start(){this.stop(),this.active=!0,this.fetch(),this.#l(),this.#u()}stop(){this.active=!1,this.#r&&=(clearInterval(this.#r),null),this.#i&&=(clearTimeout(this.#i),null),this.#a&&=(clearTimeout(this.#a),null),this.#o=0,this.#s&&=(this.#s.abort(),null),this.buckets=[]}setGranularity(e){!ab[e]||e===this.granularity||(this.granularity=e,this.buckets=[],this.#l(),this.fetch())}#l(){this.#r&&=(clearInterval(this.#r),null);let e=ab[this.granularity]||ab.minutes;this.#r=setInterval(()=>{this.active&&this.fetch()},e.refreshMs)}noteUsageEvent(e){!this.active||e!==`usage.flushed`||(this.#i||=setTimeout(()=>{this.#i=null,this.fetch()},_b))}async fetch(){if(!this.active||this.#c)return;this.#c=!0;let e=this.granularity;try{let t=await Ts(`/admin/usage/throughput?granularity=`+(ab[e]||ab.minutes).apiName,{label:`token throughput`});if(t.stale||!t.ok||this.granularity!==e)return;this.buckets=t.data&&Array.isArray(t.data.buckets)?t.data.buckets:[]}catch(e){if(Ds(e))return;console.error(`Failed to fetch token throughput:`,e)}finally{this.#c=!1,this.active&&this.granularity!==e&&this.fetch()}}async#u(){await As.ensureLoaded(),this.active&&As.liveLogsVisible()&&(typeof ReadableStream>`u`||(this.#s&&this.#s.abort(),this.#s=new AbortController,this.#d(this.#s)))}async#d(e){let t=()=>{e.signal.aborted||this.#s!==e||this.#p()};try{let n=await Cs(`/admin/live/logs?types=usage`,{signal:e.signal});if(!n.ok||!n.body||typeof n.body.getReader!=`function`){t();return}this.#o=0,await tb(n.body.getReader(),e=>this.#f(e)),t()}catch(n){if(Ds(n)||e.signal.aborted)return;console.error(`Live usage stream failed:`,n),t()}}#f(e){if(!e||typeof e!=`object`)return;let t=String(e.type||``).trim();t.indexOf(`usage.`)===0&&this.noteUsageEvent(t)}#p(){if(!this.active||this.#a)return;let{attempt:e,delay:t}=rb(this.#o);this.#o=e,this.#a=setTimeout(()=>{this.#a=null,this.#u()},t)}},yb=z(`
        `),bb=z(`
        Waiting for live requests…
        `),xb=z(`

        Live Token Throughput

        `);function Sb(e,t){D(t,!0);let n=k(()=>db(vb.buckets,vb.granularity)),r=k(()=>L(n).totals);function i(){return{input:Xy(`var(--token-input)`),output:Xy(`var(--token-output)`),prompt:Xy(`var(--token-prompt)`),local:Xy(`var(--token-local)`)}}let a=[{metric:`input`,label:`Input Tokens`,colorVar:`--token-input`},{metric:`output`,label:`Output Tokens`,colorVar:`--token-output`},{metric:`prompt`,label:`Prompt (Input) Cached`,colorVar:`--token-prompt`},{metric:`local`,label:`Locally Cached`,colorVar:`--token-local`}];var o=xb(),s=N(o),c=N(s),l=F(N(c),2),u=N(l);let d;var f=F(u,2),p=N(f,!0);E(f),E(l),E(c),Gy(F(c,2),{ariaLabel:`Live token throughput granularity`,get options(){return ob},get value(){return vb.granularity},onchange:e=>vb.setGranularity(e)}),E(s);var m=F(s,2);U(m,21,()=>a,e=>e.metric,(e,t)=>{var n=yb(),i=N(n),a=F(i,2),o=N(a,!0);E(a);var s=F(a,2),c=N(s,!0);E(s),E(n),I(e=>{Vi(i,`background: var(${L(t).colorVar??``})`),V(o,L(t).label),V(c,e)},[()=>pb(L(r),L(t).metric)]),B(e,n)}),E(m);var h=F(m,2),g=N(h);{let e=k(()=>hb(L(r),vb.granularity));Hy(g,{get ariaLabel(){return L(e)},build:()=>gb(qy(),i(),L(n),vb.granularity)})}var _=F(g,2),v=e=>{B(e,bb())},y=k(()=>!fb(L(r)));H(_,e=>{L(y)&&e(v)}),E(h),E(o),I(e=>{d=W(u,1,`live-dot`,null,d,{"is-streaming":vb.active}),V(p,e)},[()=>mb(vb.granularity)]),B(e,o),O()}function Cb(e){let t=e||{};if(t.total_tokens!==null&&t.total_tokens!==void 0){let e=Number(t.total_tokens);if(Number.isFinite(e))return e}let n=Number(t.total_input_tokens||0),r=Number(t.total_output_tokens||0);return(Number.isFinite(n)?n:0)+(Number.isFinite(r)?r:0)}function wb(e,t){if(!t)return 0;let n=e&&e.summary?e.summary:{},r=Number(n.total_hits||0);return Number.isFinite(r)&&r>0?r:0}function Tb(e,t,n){let r=Number(e&&e.total_requests||0);return(Number.isFinite(r)?r:0)+wb(t,n)}function Eb(e,t,n){let r=wb(t,n);return r<=0?``:_c(Tb(e,t,n)-r)+` to providers + `+_c(r)+` from cache`}function Db(e){let t=e&&e.summary?e.summary:{},n=Number(t.total_input_tokens||0),r=Number(t.total_output_tokens||0);return(Number.isFinite(n)?n:0)+(Number.isFinite(r)?r:0)}function Ob(e,t,n){let r=e=>{let t=Number(e||0);return Number.isFinite(t)&&t>0?t:0},i=e||{},a=r(i.uncached_input_tokens),o=r(i.cached_input_tokens),s=r(i.cache_write_input_tokens),c=t&&t.summary?t.summary:{},l=n?r(c.total_input_tokens):0;return[{key:`uncached`,label:`Regular`,tokens:a+s,colorVar:`--cache-meter-uncached`,note:s>0?`Includes `+_c(s)+` cache-write tokens`:``},{key:`prompt`,label:`Prompt cached`,tokens:o,colorVar:`--cache-meter-prompt`,note:`Provider prompt-cache reads`},{key:`local`,label:`Locally cached`,tokens:l,colorVar:`--cache-meter-local`,note:`Served from GoModel response cache`}]}function kb(e,t,n){return Ob(e,t,n).reduce((e,t)=>e+t.tokens,0)}function Ab(e,t,n){return kb(e,t,n)>0}function jb(e,t,n){let r=Ob(e,t,n),i=r.reduce((e,t)=>e+t.tokens,0);if(i<=0)return r.map(e=>Object.assign({},e,{pct:0}));let a=r.map(e=>{let t=e.tokens/i*100,n=Math.floor(t);return Object.assign({},e,{pct:n,remainder:t-n})}),o=100-a.reduce((e,t)=>e+t.pct,0);return a.map((e,t)=>({index:t,remainder:e.remainder,tokens:e.tokens})).filter(e=>e.tokens>0).sort((e,t)=>t.remainder-e.remainder).forEach(e=>{o>0&&(a[e.index].pct+=1,--o)}),a}function Mb(e,t,n){return jb(e,t,n).filter(e=>e.tokens>0)}function Nb(e){let t=[e.label+`: `+_c(e.tokens)+` input tokens (`+e.pct+`%)`];return e.note&&t.push(e.note),t.join(` -`)}function Pb(e){let t=(e||[]).map(e=>e.label+` `+e.pct+`%`);return`Cache breakdown of input tokens — `+(t.length?t.join(`, `):`no data`)}function Fb(e){return e.getUTCFullYear()+`-`+String(e.getUTCMonth()+1).padStart(2,`0`)+`-`+String(e.getUTCDate()).padStart(2,`0`)}function Ib(e,t,n,r){if(t!==`daily`||!n||!r)return e;let i={};(e||[]).forEach(e=>{i[e.date]=e});let a=[];for(let e=new Date(n);e<=r;e.setUTCDate(e.getUTCDate()+1)){let t=Fb(e);a.push(i[t]||{date:t,input_tokens:0,output_tokens:0,total_tokens:0,requests:0,input_cost:null,output_cost:null,total_cost:null})}return a}function Lb(e,t){let n=e=>Number(e)||0,r=e.map(e=>e.date),i=e.map(e=>n(e.uncached_input_tokens)+n(e.cache_write_input_tokens)+n(e.cached_input_tokens)>0?n(e.uncached_input_tokens)+n(e.cache_write_input_tokens):n(e.input_tokens)),a=e.map(e=>n(e.output_tokens)),o=e.map(e=>n(e.cached_input_tokens)),s={};return(t||[]).forEach(e=>{s[e.date]=e}),{labels:r,inputPaid:i,output:a,prompt:o,local:r.map(e=>{let t=s[e];return t?n(t.input_tokens)+n(t.output_tokens):0})}}function Rb(e){let t=e||{},n=Math.max(0,Number(t.uncached_input_tokens)||0),r=Math.max(0,Number(t.cached_input_tokens)||0),i=Math.max(0,Number(t.cache_write_input_tokens)||0),a=n+r+i;return a>0?r/a*100:0}function zb(e){let t=e||{};return(Number(t.uncached_input_tokens)||0)+(Number(t.cached_input_tokens)||0)+(Number(t.cache_write_input_tokens)||0)>0}function Bb(e){return zb(e)?Math.round(Rb(e))+`%`:`—`}function Vb(e,t,n={}){let r=!!n.cacheEnabled,i=n.resolve||(e=>e),a=(e,t)=>i(`color-mix(in srgb, `+e+` `+t+`%, transparent)`),o=(e,t,n,r)=>Object.assign({label:e,data:t,borderColor:n,backgroundColor:n,fill:!1,tension:.3,borderWidth:2,pointRadius:0,pointHoverRadius:4},r||{}),s=[o(`Input Tokens`,t.inputPaid,i(`var(--token-input)`),{fill:`origin`}),o(`Output Tokens`,t.output,i(`var(--token-output)`),{fill:`-1`}),o(`Prompt (Input) Cached`,t.prompt,i(`var(--token-prompt)`),{fill:`-1`,borderDash:[6,4]})];return r&&s.push(o(`Locally Cached`,t.local,a(`var(--info)`,35),{fill:`-1`,borderDash:[2,3]})),{type:`line`,data:{labels:t.labels,datasets:s},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Yy(e,{label:e=>e.dataset.label+`: `+e.parsed.y.toLocaleString(),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+t.toLocaleString()}})},scales:{x:{stacked:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:10}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:ib(e)}}}}}function Hb(e,t,n){let r=Math.max(0,Math.min(100,e));return{type:`doughnut`,data:{datasets:[{data:[r,100-r],backgroundColor:[t,n],borderWidth:0,spacing:0}]},options:{rotation:-90,circumference:180,cutout:`84%`,responsive:!0,maintainAspectRatio:!1,animation:{duration:0},layout:{padding:1},events:[],plugins:{legend:{display:!1},tooltip:{enabled:!1}}}}}var Ub=`gomodel_provider_status_details_expanded`,Wb=`gomodel_provider_card_expanded_overrides`,Gb=3e3,Kb=`https://gomodel.enterpilot.io/docs/providers/`,qb={anthropic:`anthropic`,azure:`azure`,bailian:`bailian`,bedrock:`bedrock`,"bedrock-mantle":`bedrock-mantle`,cohere:`cohere`,deepseek:`deepseek`,elevenlabs:`elevenlabs`,gemini:`gemini`,llmd:`llmd`,opencode_go:`opencode-go`,oracle:`oracle`,sglang:`sglang`,vertex:`vertex`,vllm:`vllm`,xiaomi:`xiaomi`};function Jb(){return{summary:{total:0,healthy:0,degraded:0,unhealthy:0,overall_status:`degraded`},providers:[]}}function Yb(e){let t={detailsExpanded:!1,cardOverrides:{}};try{if(e){let n=e.getItem(Ub);n===`true`||n===`false`?t.detailsExpanded=n===`true`:e.setItem(Ub,`false`);let r=JSON.parse(e.getItem(Wb)||`{}`);r&&typeof r==`object`&&!Array.isArray(r)&&(t.cardOverrides=r)}}catch{}return t}function Xb(e,t){if(e)try{e.setItem(Ub,t?`true`:`false`)}catch{}}function Zb(e,t){if(e)try{e.setItem(Wb,JSON.stringify(t))}catch{}}function Qb(e,t,n){let r=n&&n.name?String(n.name):``;return r&&Object.prototype.hasOwnProperty.call(e,r)?e[r]===!0:t}function $b(e){return`is-`+(String(e&&e.overall_status||`degraded`).trim()||`degraded`)}function ex(e){return`is-`+(String(e||`degraded`).trim()||`degraded`)}function tx(e){let t=e||{};return String(t.healthy||0)+`/`+String(t.total||0)}function nx(e){let t=e||{},n=Number(t.total||0),r=Number(t.healthy||0);return n>0&&rString(e&&e.status_label||``).trim().toLowerCase()===`starting`)}function ax(e){if(!e||!e.runtime)return``;let t=e.runtime.last_model_fetch_at||``,n=e.runtime.last_availability_check_at||``;return t?n&&Date.parse(n)>Date.parse(t)?n:t:n}function ox(e,t){let n=ax(e);if(!n||typeof t!=`function`)return`-`;let r=t(n);if(!r||r===`-`)return`-`;let i=String(r).split(` `);return i.length>1?i.slice(1).join(` `):r}function sx(e,t){let n=ax(e);return n?typeof t==`function`?t(n):String(n):``}function cx(e){if(!e)return``;let t=String(e.name||``).trim(),n=String(e.type||e.config&&e.config.type||``).trim();return!n||n===t?``:n}function lx(e){let t=String(e&&(e.type||e.config&&e.config.type)||``).trim().toLowerCase(),n=t?qb[t]:``;return n?Kb+n+`?utm_source=gomodel_dashboard`:``}function ux(e){let t=e&&e.config&&e.config.resilience?e.config.resilience.retry:null;return t?String(t.max_retries)+` retries, `+t.initial_backoff+` initial, `+t.max_backoff+` max, factor `+t.backoff_factor+`, jitter `+t.jitter_factor:`-`}function dx(e){let t=e&&e.config&&e.config.resilience?e.config.resilience.circuit_breaker:null;return t?String(t.failure_threshold)+` fail, `+String(t.success_threshold)+` success, `+t.timeout+` timeout`:`-`}function fx(e){let t=e&&e.config&&Array.isArray(e.config.models)?e.config.models.filter(Boolean):[];return t.length===0?`Automatic`:t.join(`, `)}function px(e){if(!e)return``;let t=[];return e.status_reason&&t.push(String(e.status_reason)),e.last_error&&t.push(`Last error: `+String(e.last_error)),t.join(` - -`)}function mx(e){let t=e&&e.request_health;return t&&typeof t==`object`?t:null}function hx(e){let t=mx(e);return t?String(t.circuit_state||``).trim():``}function gx(e){let t=hx(e);return t?t.charAt(0).toUpperCase()+t.slice(1):``}function _x(e){let t=hx(e);return t===`open`?`is-unhealthy`:t===`half-open`?`is-degraded`:`is-healthy`}function vx(e){let t=mx(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 yx(e){let t=mx(e);return t&&Array.isArray(t.models)?t.models:[]}function bx(e){return e?String(Number(e.errors||0))+`/`+String(Number(e.requests||0))+` failed`:``}function xx(e){let t=e&&e.last_error;return!t||!t.message?``:(t.status_code?`HTTP `+String(t.status_code)+`: `:``)+t.message}function Sx(){return{name:``,slug:``,url:``,transport:`http`,description:``,enabled:!0,headers:[],allowed_tools:``,disallowed_tools:``,user_paths:``,tool_timeout_seconds:``}}function Cx(){return{server:``,status:``,instructions:``,tools:[],prompts:[],resources:[],templates:[]}}function wx(e){return String(e&&(e.slug||e.name)||``).trim()}function Tx(e){return String(e&&e.status||``).trim()||`connecting`}function Ex(e){switch(Tx(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 Dx(e,t){let n=Tx(e),r=String(e&&e.last_error||``).trim();return r&&n!==`connected`?r:n===`connected`&&e&&e.connected_at?`Connected since `+(typeof t==`function`?t:String)(e.connected_at):``}function Ox(e){return String(e&&e.transport||``)===`stdio`?`local command`:String(e&&e.url||``).trim()||`—`}function kx(e){let t=Number(e&&e.prompt_count||0),n=Number(e&&e.resource_count||0);return t+` prompts · `+n+` resources`}function Ax(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 jx(e){return String(e||``).split(` -`).map(e=>e.trim()).filter(e=>e)}function Mx(e){return!e||typeof e!=`object`||Array.isArray(e)?[]:Object.keys(e).sort().map(t=>({name:t,value:String(e[t]||``)}))}function Nx(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 Px(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 Fx(e){return{name:String(e.name||``).trim(),slug:wx(e),url:String(e.url||``).trim(),transport:e.transport===`sse`?`sse`:`http`,description:String(e.description||``).trim(),enabled:e.enabled!==!1,headers:Mx(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 Ix(e,t,n){let r=String(e.name||``).trim(),i=String(e.slug||Ax(r)).trim().toLowerCase(),a=String(e.url||``).trim(),o=e.transport===`sse`?`sse`:`http`;if(!r)return{error:`Name is required.`};if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(i))return{error:`Slug must use 1–64 lowercase ASCII letters, numbers, hyphens, or underscores.`};if(t===`create`&&(n||[]).some(e=>wx(e)===i))return{error:`Slug "`+i+`" is already in use.`};if(!a)return{error:`URL is required.`};let s,c=String(e.tool_timeout_seconds||``).trim();if(c!==``){let e=Number(c);if(!Number.isSafeInteger(e)||e<0)return{error:`Tool timeout must be a non-negative whole number of seconds.`};s=e}return{payload:{name:r,slug:i,url:a,transport:o,headers:Nx(e.headers),description:String(e.description||``).trim(),enabled:!!e.enabled,allowed_tools:hc(e.allowed_tools),disallowed_tools:hc(e.disallowed_tools),user_paths:jx(e.user_paths),tool_timeout_seconds:s}}}function Lx(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 Rx(e,t){return String(e&&e.server||``)+`_`+String(t||``)}function zx(e){let t=e||Cx(),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:Rx(t,n.name),description:String(n.description||``).trim()});return[{key:`tools`,title:`Tools`,items:(t.tools||[]).map(r(`tool`))},{key:`prompts`,title:`Prompts`,items:(t.prompts||[]).map(r(`prompt`))},{key:`resources`,title:`Resources`,items:(t.resources||[]).map(e=>({key:`resource:`+String(e.uri||``),name:String(e.uri||``),aggregated:``,description:n(e.name,e.description)}))},{key:`templates`,title:`Resource templates`,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 Bx(e){return zx(e).length===0}function Vx(e){return(e||[]).length}function Hx(e){return(e||[]).filter(e=>Tx(e)===`connected`).length}function Ux(e){return(e||[]).filter(e=>e&&e.enabled!==!1&&Tx(e)===`degraded`).length}function Wx(e,t){return!!e&&Vx(t)>0}function Gx(e){return String(Hx(e))+`/`+String(Vx(e))}function Kx(e){return Ux(e)>0?`is-degraded`:`is-healthy`}function qx(e){let t=Ux(e);if(t>0)return String(t)+` server`+(t===1?``:`s`)+` need`+(t===1?`s`:``)+` attention`;let n=Vx(e),r=Hx(e);return n>0&&r===n?`All MCP servers connected`:String(r)+` of `+String(n)+` server`+(n===1?``:`s`)+` connected`}function Jx(){return{interval:`day`,buckets:[],summary:{requests:0},provider_latency:[]}}function Yx(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 Xx(e){return Number(e&&e.summary&&e.summary.requests||0)>0}function Zx(e){return(e&&Array.isArray(e.provider_latency)?e.provider_latency:[]).length>0}function Qx(e){let t=e&&e.summary?e.summary.success_rate:null;return t==null?`—`:(Math.round(Number(t)*1e3)/10).toFixed(1)+`%`}function $x(e,t){return Number(e&&e.summary&&e.summary[t]||0)}function eS(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 tS(e){let t=e&&e.summary?e.summary.avg_duration_ms:null;return t==null?`—`:eS(Number(t))}function nS(e,t){try{let n={};return new Intl.DateTimeFormat(`en-US`,{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)}}catch{return{year:String(e.getFullYear()),month:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][e.getMonth()],day:String(e.getDate()),hour:e.getHours()}}}function rS(e,t,n){let r=new Date(e.start);if(Number.isNaN(r.getTime()))return String(e.start||``);let i=nS(r,n),a=i.month+` `+i.day;return t!==`hour`||i.hour===0?a:String(i.hour).padStart(2,`0`)+`:00`}function iS(e,t,n,r){let i=new Date(e.start);if(Number.isNaN(i.getTime()))return String(e.start||``);if(t===`hour`)return r(e.start);let a=nS(i,n);return a.month+` `+a.day+`, `+a.year}function aS(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 oS(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=>rS(e,r,i)),c=aS(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(`Other`,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:Yy(e,{title:e=>e.length?iS(t[e[0].dataIndex],r,i,o):``,label:e=>e.dataset.label+`: `+e.parsed.y.toLocaleString(),footer:e=>{let t=0;return e.forEach(e=>{t+=Number(e.parsed.y)||0}),`Total: `+t.toLocaleString()}})},scales:{x:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{stacked:!0,beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),precision:0,callback:e=>xc(e)}}}}}}function sS(e=Qy()){let t={};return function(n){return n in t||(t[n]=e[Object.keys(t).length%e.length]),t[n]}}function cS(e,t,n,r={}){let i=r.interval===`hour`?`hour`:`day`,a=r.zone,o=r.formatTimestamp||(e=>String(e)),s=r.providerColor||sS();return{type:`line`,data:{labels:t.map(e=>rS(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:Yy(e,{title:e=>e.length?iS(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+`: `+eS(e.parsed.y)+(r>0?` (`+r.toLocaleString()+` req)`:``)}})},scales:{x:{grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),maxRotation:0,autoSkip:!0,maxTicksLimit:12}},y:{beginAtZero:!0,grid:{color:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),callback:e=>eS(e)}}}}}}var lS=class{#e=A(M(Jb()));get status(){return L(this.#e)}set status(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return L(this.#t)}set loading(e){j(this.#t,e,!0)}#n=A(!1);get loadedOnce(){return L(this.#n)}set loadedOnce(e){j(this.#n,e,!0)}#r=A(!1);get detailsExpanded(){return L(this.#r)}set detailsExpanded(e){j(this.#r,e,!0)}#i=A(M({}));get cardOverrides(){return L(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=Yb(Sa());this.detailsExpanded=e.detailsExpanded,this.cardOverrides=e.cardOverrides}cardExpanded(e){return Qb(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,Zb(Sa(),this.cardOverrides)}toggleDetails(){this.detailsExpanded=!this.detailsExpanded,this.cardOverrides={},Xb(Sa(),this.detailsExpanded),Zb(Sa(),this.cardOverrides)}detailsToggleLabel(){return this.detailsExpanded?`Show Details`:`Hide Details`}async fetch(){this.initPreferences(),this.#a&&this.#a.abort();let e=new AbortController;this.#a=e,this.loading=!0;try{let t=await Ts(`/admin/providers/status`,{label:`provider status`,signal:e.signal});if(t.stale||e.signal.aborted)return;if(!t.ok){this.status=Jb(),this.#l();return}let n=t.data&&typeof t.data==`object`?t.data:Jb();n.summary||=Jb().summary,Array.isArray(n.providers)||(n.providers=[]),this.status=n,this.#c()}catch(e){if(Ds(e))return;console.error(`Failed to fetch provider status:`,e),this.status=Jb(),this.#l()}finally{this.#a===e&&(this.#a=null,this.loading=!1,this.loadedOnce=!0)}}#c(){this.#l(),ix(this.status.providers)&&(this.#o=setTimeout(()=>{this.#o=null,this.fetch()},Gb))}#l(){this.#o&&=(clearTimeout(this.#o),null)}stopPolling(){this.#l()}},uS=class{#e=A(M(Jx()));get stats(){return L(this.#e)}set stats(e){j(this.#e,e,!0)}#t=A(!1);get loading(){return L(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 Ts(`/admin/audit/stats?`+Uc.queryStr(),{label:`audit stats`});if(t.stale||e!==this.#n)return;if(!t.ok){this.stats=Jx();return}this.stats=Yx(t.data)}catch(t){if(console.error(`Failed to fetch audit stats:`,t),e!==this.#n)return;this.stats=Jx()}finally{e===this.#n&&(this.loading=!1)}}},dS=class{#e=A(M([]));get servers(){return L(this.#e)}set servers(e){j(this.#e,e,!0)}#t=A(!1);get available(){return L(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}async fetch(){if(await As.ensureLoaded(),!As.mcpVisible()){this.available=!1,this.servers=[];return}this.loading=!0;try{let e=await Ts(`/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}}},fS=class{#e=A(M([]));get data(){return L(this.#e)}set data(e){j(this.#e,e,!0)}#t=A(`tokens`);get mode(){return L(this.#t)}set mode(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(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 Ts(`/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(Ds(e))return;console.error(`Failed to fetch calendar data:`,e),this.data=[]}finally{this.#r===e&&(this.#r=null,this.loading=!1)}}},pS=new lS,mS=new uS,hS=new dS,gS=new fS,_S=(e,t=f,n=f,r=f,i=f)=>{var a=yS(),o=N(a),s=N(o,!0);E(o);var c=F(o,2),l=N(c),u=N(l),d=N(u,!0);E(u),He(),E(l);var p=F(l,4),m=N(p),h=N(m,!0);E(m),He(),E(p);var g=F(p,4),_=N(g,!0);E(g),E(c),E(a),I((e,n,r,i,a,o)=>{V(s,t()),G(l,`title`,e),V(d,n),G(p,`title`,r),V(h,i),G(g,`title`,a),V(_,o)},[()=>Sc(`Input tokens`,n()),()=>xc(n()),()=>Sc(`Output tokens`,r()),()=>xc(r()),()=>Sc(`Total tokens`,i()),()=>xc(i())]),B(e,a)},vS=(e,t=f,n=f,r=f,i=f,a=f,o=f)=>{var s=SS(),c=N(s),l=N(c,!0);E(c);var u=F(c,2),d=N(u,!0);E(u);var p=F(u,2),m=e=>{var t=bS(),n=N(t,!0);E(t),I(()=>{G(t,`aria-label`,o().title),G(t,`title`,o().title),V(n,a())}),R(`click`,t,function(...e){o().onclick?.apply(this,e)}),B(e,t)},h=e=>{var t=xS(),n=N(t,!0);E(t),I(()=>V(n,a())),B(e,t)};H(p,e=>{o()?e(m):e(h,-1)}),E(s),I(()=>{W(s,1,`card provider-status-flag ${t()??``} ${n()??``}`,`svelte-6tr9cf`),V(l,r()),V(d,i())}),B(e,s)},yS=z(`
        i + o =
        `),bS=z(``),xS=z(` `),SS=z(`
        `),CS=z(`
        Cache Hits
        `),wS=z(`
        Total Requests
        Estimated Cost
        Prompt Cache Rate
        `);function TS(e,t){D(t,!0);let n=k(()=>Yc.summary),r=k(()=>Yc.cacheOverview),i=k(()=>Yc.cacheAnalyticsEnabled()),a=k(()=>pS.status.summary);function o(){let e=document.getElementById(`provider-status-section`);e&&(e.scrollIntoView({behavior:`smooth`,block:`start`}),e.focus({preventScroll:!0}))}var s=wS(),c=N(s);{let e=k(()=>Cb(L(n)));_S(c,()=>`Tokens`,()=>L(n).total_input_tokens,()=>L(n).total_output_tokens,()=>L(e))}var l=F(c,2),u=F(N(l),2),d=N(u,!0);E(u),E(l);var f=F(l,2),p=e=>{var t=CS(),n=F(N(t),2),i=N(n,!0);E(n),E(t),I(e=>V(i,e),[()=>_c(L(r).summary.total_hits)]),B(e,t)};H(f,e=>{L(i)&&e(p)});var m=F(f,2),h=F(N(m),2),g=N(h,!0);E(h),E(m);var _=F(m,2),v=e=>{{let t=k(()=>Db(L(r)));_S(e,()=>`Local Cache`,()=>L(r).summary.total_input_tokens,()=>L(r).summary.total_output_tokens,()=>L(t))}};H(_,e=>{L(i)&&e(v)});var y=F(_,2),b=F(N(y),2),x=N(b);Hy(x,{build:()=>Hb(Rb(L(n)),Xy(`var(--token-prompt)`),Xy(`var(--bg-surface-hover)`))});var S=F(x,2),C=N(S,!0);E(S),E(b),E(y);var w=F(y,2),T=e=>{{let t=k(()=>$b(L(a))),n=k(()=>tx(L(a))),r=k(()=>rx(L(a))),i=k(()=>nx(L(a))?{title:`View providers overview`,onclick:o}:null);vS(e,()=>`provider-status-overview-card`,()=>L(t),()=>`Provider Status`,()=>L(n),()=>L(r),()=>L(i))}};H(w,e=>{L(a).total>0&&e(T)});var ee=F(w,2),te=e=>{{let t=k(()=>Kx(hS.servers)),n=k(()=>Gx(hS.servers)),r=k(()=>qx(hS.servers));vS(e,()=>`mcp-servers-flag`,()=>L(t),()=>`MCP Servers`,()=>L(n),()=>L(r),()=>({title:`View MCP servers`,onclick:()=>Xo.navigate(`mcp-servers`)}))}},ne=k(()=>Wx(hS.available,hS.servers));H(ee,e=>{L(ne)&&e(te)}),E(s),I((e,t,n,r,i)=>{G(u,`title`,e),V(d,t),V(g,n),G(b,`aria-label`,r),V(C,i)},[()=>Eb(L(n),L(r),L(i)),()=>_c(Tb(L(n),L(r),L(i))),()=>vc(L(n).total_cost),()=>`Prompt cache rate `+Bb(L(n)),()=>Bb(L(n))]),B(e,s),O()}Vr([`click`]);var ES=z(` `),DS=z(`
        `),OS=z(`No usage in the selected period yet`),kS=z(`
        `),AS=z(`

        Tokens

        Share of input tokens over the selected period
        `);function jS(e,t){D(t,!0);let n=k(()=>Yc.cacheAnalyticsEnabled()),r=k(()=>jb(Yc.summary,Yc.cacheOverview,L(n))),i=k(()=>Mb(Yc.summary,Yc.cacheOverview,L(n))),a=k(()=>Ab(Yc.summary,Yc.cacheOverview,L(n)));var o=AS(),s=F(N(o),2);let c;var l=N(s);U(l,17,()=>L(i),e=>e.key,(e,t)=>{var n=DS(),r=N(n),i=e=>{var n=ES(),r=N(n);E(n),I(()=>V(r,`${L(t).pct??``}%`)),B(e,n)};H(r,e=>{L(t).pct>=8&&e(i)}),E(n),I(e=>{Vi(n,`width: ${L(t).pct??``}%; background: var(${L(t).colorVar??``})`),G(n,`title`,e)},[()=>Nb(L(t))]),B(e,n)});var u=F(l,2),d=e=>{B(e,OS())};H(u,e=>{L(a)||e(d)}),E(s);var f=F(s,2);U(f,21,()=>L(r),e=>e.key,(e,t)=>{var n=kS(),r=N(n),i=F(r,2),a=N(i,!0);E(i);var o=F(i,2),s=N(o);E(o);var c=F(o,2),l=N(c,!0);E(c),E(n),I((e,i)=>{G(n,`title`,e),Vi(r,`background: var(${L(t).colorVar??``})`),V(a,L(t).label),V(s,`${L(t).pct??``}%`),V(l,i)},[()=>Nb(L(t)),()=>_c(L(t).tokens)]),B(e,n)}),E(f),E(o),I(e=>{c=W(s,1,`cache-meter-bar svelte-1yzecxj`,null,c,{"is-empty":!L(a)}),G(s,`aria-label`,e)},[()=>Pb(L(i))]),B(e,o),O()}var MS=z(``);function NS(e,t){let n=K(t,`size`,3,16),r=K(t,`label`,3,`Loading`),i=K(t,`class`,3,``);var a=MS();I(()=>{W(a,1,Pi([`spinner`,i()]),`svelte-b54l9o`),Vi(a,`--spinner-size: ${n()??``}px`),G(a,`aria-label`,r())}),B(e,a)}var PS=Yr(` `),FS=Yr(``);function IS(e,t){let n=K(t,`label`,3,`No data`);var r=FS(),i=F(N(r),9),a=e=>{var t=PS(),r=N(t,!0);E(t),I(()=>V(r,n())),B(e,t)};H(i,e=>{n()&&e(a)}),E(r),I(()=>{G(r,`role`,n()?`img`:void 0),G(r,`aria-label`,n()||void 0),G(r,`aria-hidden`,n()?void 0:`true`)}),B(e,r)}var LS=z(`
        `),RS=z(`

        `);function zS(e,t){D(t,!0);let n=[`daily`,`weekly`,`monthly`,`yearly`];function r(e){Uc.interval=e,t.onintervalchange?.()}function i(){let e=Yc.daily;if(e.length===0)return null;let t=Uc.rangeStart(),n=Uc.rangeEnd(),r=Lb(Ib(e,Uc.interval,t,n),Ib(Array.isArray(Yc.cacheOverview.daily)?Yc.cacheOverview.daily:[],Uc.interval,t,n));return Vb(qy(),r,{cacheEnabled:Yc.cacheAnalyticsEnabled(),resolve:Xy})}var a=RS(),o=N(a),s=N(o),c=N(s,!0);E(s);var l=F(s,2);{let e=k(()=>n.map(e=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})));Gy(l,{ariaLabel:`Usage chart interval`,get options(){return L(e)},get value(){return Uc.interval},onchange:r})}E(o);var u=F(o,2),d=N(u);Hy(d,{build:i});var f=F(d,2),p=e=>{var t=LS();NS(N(t),{size:24,label:`Loading usage`}),E(t),B(e,t)},m=e=>{var t=LS();IS(N(t),{}),E(t),B(e,t)};H(f,e=>{Yc.daily.length===0&&Yc.loading?e(p):Yc.daily.length===0&&!J.authError&&e(m,1)}),E(u),E(a),I(e=>V(c,e),[()=>Uc.chartTitle()]),B(e,a),O()}var BS=10,VS=.7;function HS(e,t){if(e<=0||t<=0)return 0;let n=(e/t)**+VS,r=Math.ceil(n*BS);return r<1?1:r>BS?BS:r}function US(){let e=[];for(let t=0;t<=BS;t++)e.push(t);return e}function WS(e,t,n){let r={};(e||[]).forEach(e=>{r[e.date]=e});let i=os(cs(n,-364)),a=i.getUTCDay();i.setUTCDate(i.getUTCDate()-a);let o=[];for(let e=new Date(i);ss(e)<=n;e.setUTCDate(e.getUTCDate()+1)){let n=ss(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 GS(e){let t=os(cs(e,-364)),n=t.getUTCDay();t.setUTCDate(t.getUTCDate()-n);let r=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],i=[],a={},o=0;for(let n=new Date(t);ss(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),ss(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[t.getUTCMonth()],col:o,key:s}),a[s]=!0)}for(let e=0;e `),YS=z(`
        `),XS=z(`
        `),ZS=z(`
        `),QS=z(`
        `),$S=z(`

        Activity

        Mon Wed Fri
        `,1);function eC(e,t){D(t,!0);let n=A(M({show:!1,x:0,y:0,text:``})),r=k(()=>ys.currentDateKey()),i=k(()=>WS(gS.data,gS.mode,L(r))),a=k(()=>GS(L(r)));function o(e,t){t.empty||j(n,{show:!0,x:e.clientX,y:e.clientY,text:qS(t,gS.mode)},!0)}function s(){j(n,{show:!1,x:0,y:0,text:``},!0)}var c=$S(),l=P(c),u=N(l),d=F(N(u),2),f=e=>{NS(e,{size:14,label:`Loading activity`})};H(d,e=>{gS.loading&&gS.data.length===0&&e(f)}),Gy(F(d,2),{ariaLabel:`Activity calendar mode`,options:[{value:`tokens`,label:`Tokens`},{value:`costs`,label:`Costs`}],get value(){return gS.mode},onchange:e=>gS.mode=e}),E(u);var p=F(u,2),m=F(N(p),2),h=N(m);U(h,21,()=>L(a),e=>e.key,(e,t)=>{var n=JS(),r=N(n,!0);E(n),I(()=>{Vi(n,`grid-column: ${L(t).col+1} / span ${L(t).span??``}`),V(r,L(t).label)}),B(e,n)}),E(h);var g=F(h,2);U(g,21,()=>L(i),ai,(e,t,n)=>{var r=XS();U(r,23,()=>L(t),(e,t)=>n+`-`+t,(e,t)=>{var n=YS();I(()=>W(n,1,Pi([`contribution-calendar-cell`,L(t).empty?`empty`:`level-${L(t).level}`]),`svelte-3hfxuq`)),Br(`mouseenter`,n,e=>o(e,L(t))),Br(`mouseleave`,n,s),B(e,n)}),E(r),B(e,r)}),E(g),E(m),E(p);var _=F(p,2),v=N(_),y=N(v),b=N(y,!0);E(y),E(v);var x=F(v,2);U(F(N(x),2),16,US,e=>e,(e,t)=>{var n=ZS();I(()=>W(n,1,`contribution-calendar-cell level-${t??``}`,`svelte-3hfxuq`)),B(e,n)}),He(2),E(x),E(_),E(l);var S=F(l,2),C=e=>{var t=QS(),r=N(t,!0);E(t),I(()=>{Vi(t,`left: ${L(n).x??``}px; top: ${L(n).y-40}px`),V(r,L(n).text)}),B(e,t)};H(S,e=>{L(n).show&&e(C)}),I(e=>V(b,e),[()=>KS(gS.data,gS.mode)]),B(e,c),O()}var tC=z(``),nC=z(`

        `),rC=z(`
        `);function iC(e,t){D(t,!0);let n=K(t,`label`,3,`help`),r=K(t,`text`,3,``),i=K(t,`open`,15,!1),a=K(t,`external`,3,!1),o=k(()=>!!r()||!!t.help||a());var s=rC(),c=N(s),l=N(c);hi(l,()=>t.title??f);var u=F(l,2),d=e=>{var r=tC();let a;I(()=>{a=W(r,1,`inline-help-toggle svelte-y40or3`,null,a,{"is-open":i()}),G(r,`aria-label`,(i()?`Hide `:`Show `)+n()),G(r,`aria-expanded`,i()),G(r,`aria-controls`,t.copyId)}),R(`click`,r,()=>i(!i())),B(e,r)};H(u,e=>{L(o)&&e(d)}),hi(F(u,2),()=>t.extra??f),E(c);var p=F(c,2),m=e=>{var n=nC(),i=N(n),a=e=>{var n=Zr();hi(P(n),()=>t.help),B(e,n)},o=e=>{var t=Xr();I(()=>V(t,r())),B(e,t)};H(i,e=>{t.help?e(a):e(o,-1)}),E(n),I(()=>G(n,`id`,t.copyId)),B(e,n)};H(p,e=>{i()&&L(o)&&!a()&&e(m)}),E(s),B(e,s),O()}Vr([`click`]);var aC=z(`

        Provider Latency

        `),oC=z(`
        Avg
        `),sC=z(`

        Requests by Status

        Success 2xx 4xx 5xx
        `,1);function cC(e,t){D(t,!0);let n=sS(),r=k(()=>mS.stats);function i(){return{interval:L(r).interval,zone:ys.effectiveTimezone(),resolve:Xy,formatTimestamp:e=>ys.formatTimestamp(e)}}var a=Zr(),o=P(a),s=e=>{var t=sC(),a=P(t),o=N(a),s=F(N(o),2),c=N(s),l=F(N(c),2),u=N(l,!0);E(l),E(c);var d=F(c,2),f=F(N(d),4),p=N(f,!0);E(f),E(d);var m=F(d,2),h=F(N(m),4),g=N(h,!0);E(h),E(m);var _=F(m,2),v=F(N(_),4),y=N(v,!0);E(v),E(_),E(s),E(o);var b=F(o,2);Hy(N(b),{build:()=>oS(qy(),L(r).buckets,i())}),E(b),E(a);var x=F(a,2),S=e=>{var t=oC(),a=N(t),o=N(a);iC(o,{copyId:`audit-latency-help-copy`,label:`provider latency help`,text:`Average duration of successful requests as measured at the gateway, per provider. Local cache hits and failed requests are excluded; streamed responses count until the stream completes.`,title:e=>{B(e,aC())},$$slots:{title:!0}});var s=F(o,2),c=N(s),l=F(N(c),2),u=N(l,!0);E(l),E(c),E(s),E(a);var d=F(a,2);Hy(N(d),{build:()=>cS(qy(),L(r).buckets,L(r).provider_latency,{...i(),providerColor:n})}),E(d),E(t),I(e=>V(u,e),[()=>tS(L(r))]),B(e,t)},C=k(()=>Zx(L(r)));H(x,e=>{L(C)&&e(S)}),I((e,t,n,r)=>{V(u,e),V(p,t),V(g,n),V(y,r)},[()=>Qx(L(r)),()=>_c($x(L(r),`status_2xx`)),()=>_c($x(L(r),`status_4xx`)),()=>_c($x(L(r),`status_5xx`))]),B(e,t)},c=k(()=>Xx(L(r)));H(o,e=>{L(c)&&e(s)}),B(e,a),O()}var lC=(e,t=f,n=f,r)=>{let i=Dt(()=>h(r?.(),!1));var a=fC(),o=N(a),s=N(o,!0);E(o);var c=F(o,2),l=e=>{var t=uC(),r=N(t,!0);E(t),I(()=>V(r,n())),B(e,t)},u=e=>{var t=dC(),r=N(t,!0);E(t),I(()=>V(r,n())),B(e,t)};H(c,e=>{L(i)?e(l):e(u,-1)}),E(a),I(()=>V(s,t())),B(e,a)},uC=z(` `),dC=z(` `),fC=z(`
        `),pC=z(`

        `),mC=z(`
        Breaker State
        `),hC=z(`
        `),gC=z(`
        Models (Recent Traffic)
        `),_C=z(`
        `),vC=z(`

        `);function yC(e,t){D(t,!0);let n=k(()=>_x(t.provider)),r=k(()=>[[`Base URL`,t.provider.config?.base_url],[`API Version`,t.provider.config?.api_version]].filter(([,e])=>!!e));var i=vC();let a;var o=N(i),s=N(o),c=N(s,!0);E(s);var l=F(s,2),u=e=>{var n=pC(),r=N(n,!0);E(n),I(()=>V(r,t.provider.last_error)),B(e,n)};H(l,e=>{t.provider.last_error&&e(u)});var d=F(l,2),f=e=>{var r=_C(),i=N(r);{let e=k(()=>vx(t.provider));lC(i,()=>`Recent Requests`,()=>L(e))}var a=F(i,2),o=e=>{var r=mC(),i=F(N(r),2),a=N(i),o=N(a,!0);E(a),E(i),E(r),I(e=>{W(a,1,Pi([`provider-status-health-state`,L(n)]),`svelte-6y9wjv`),V(o,e)},[()=>gx(t.provider)]),B(e,r)},s=k(()=>hx(t.provider));H(a,e=>{L(s)&&e(o)});var c=F(a,2),l=e=>{var n=gC(),r=F(N(n),2);U(r,21,()=>yx(t.provider),e=>e.model,(e,t)=>{var n=hC();let r;var i=N(n),a=N(i,!0);E(i);var o=F(i,2),s=N(o,!0);E(o),E(n),I((e,i)=>{r=W(n,1,`provider-status-health-model svelte-6y9wjv`,null,r,{"is-flagged":L(t).flagged}),G(n,`title`,e),V(a,L(t).model),V(s,i)},[()=>xx(L(t)),()=>bx(L(t))]),B(e,n)}),E(r),E(n),B(e,n)},u=k(()=>yx(t.provider).length>0);H(c,e=>{L(u)&&e(l)}),E(r),B(e,r)},p=k(()=>mx(t.provider));H(d,e=>{L(p)&&e(f)});var m=F(d,2),h=N(m);U(h,17,()=>L(r),([e,t])=>e,(e,t)=>{var n=k(()=>g(L(t),2));lC(e,()=>L(n)[0],()=>L(n)[1],()=>!0)});var _=F(h,2);{let e=k(()=>fx(t.provider));lC(_,()=>`Configured Models`,()=>L(e))}var v=F(_,2);{let e=k(()=>ux(t.provider));lC(v,()=>`Retry`,()=>L(e))}var y=F(v,2);{let e=k(()=>dx(t.provider));lC(y,()=>`Circuit Breaker`,()=>L(e))}E(m),E(o),E(i),I(()=>{a=W(i,1,`provider-status-details svelte-6y9wjv`,null,a,{"is-expanded":t.expanded,"is-collapsed":!t.expanded}),G(i,`aria-hidden`,!t.expanded),V(c,t.provider.status_reason)}),B(e,i),O()}var bC=z(` `),xC=z(``),SC=z(`

        Models Available
        Last Checked
        `);function CC(e,t){D(t,!0);let n=k(()=>pS.cardExpanded(t.provider)),r=e=>ys.formatTimestamp(e);var i=SC(),a=N(i),o=N(a),s=N(o),c=N(s),l=N(c,!0);E(c);var u=F(c,2),d=e=>{var n=bC(),r=N(n);E(n),I(e=>V(r,`(${e??``})`),[()=>cx(t.provider)]),B(e,n)},f=k(()=>cx(t.provider));H(u,e=>{L(f)&&e(d)});var p=F(u,2),m=e=>{var n=xC();I((e,t,r)=>{G(n,`href`,e),G(n,`aria-label`,t),G(n,`title`,r)},[()=>lx(t.provider),()=>`View `+(cx(t.provider)||t.provider.name)+` provider docs`,()=>`View `+(cx(t.provider)||t.provider.name)+` provider docs`]),B(e,n)},h=k(()=>lx(t.provider));H(p,e=>{L(h)&&e(m)}),E(s),E(o);var g=F(o,2),_=N(g,!0);E(g),E(a);var v=F(a,2),y=N(v),b=F(N(y),2),x=N(b,!0);E(b),E(y);var S=F(y,2),C=F(N(S),2),w=N(C,!0);E(C),E(S),E(v);var T=F(v,2);yC(T,{get provider(){return t.provider},get expanded(){return L(n)}});var ee=F(T,2);let te;q(N(ee),{get icon(){return Ha},class:`provider-status-card-toggle-icon`}),E(ee),E(i),I((e,r,i,a,o)=>{V(l,t.provider.name),W(g,1,`provider-status-pill ${e??``}`,`svelte-nopjmh`),G(g,`title`,r),V(_,t.provider.status_label),V(x,i),G(C,`title`,a),V(w,o),te=W(ee,1,`provider-status-card-toggle svelte-nopjmh`,null,te,{"is-expanded":L(n)}),G(ee,`aria-expanded`,L(n)),G(ee,`aria-label`,(L(n)?`Collapse `:`Expand `)+t.provider.name+` details`),G(ee,`title`,L(n)?`Collapse details`:`Expand details`)},[()=>ex(t.provider.status),()=>px(t.provider),()=>_c(t.provider.runtime?.discovered_model_count),()=>sx(t.provider,r),()=>ox(t.provider,r)]),R(`click`,ee,()=>pS.toggleCard(t.provider)),B(e,i),O()}Vr([`click`]);var wC=z(`

        Providers Overview

        `),TC=z(`
        `);function EC(e,t){D(t,!0);let n=k(()=>pS.status.providers);var r=Zr(),i=P(r),a=e=>{var t=wC(),r=N(t),i=F(N(r),2),a=N(i),o=N(a,!0);E(a);var s=F(a,2);let c;E(i),E(r);var l=F(r,2);U(l,21,()=>L(n),e=>e.name,(e,t)=>{CC(e,{get provider(){return L(t)}})}),E(l),E(t),I((e,t)=>{G(i,`aria-checked`,pS.detailsExpanded),G(i,`title`,e),V(o,t),c=W(s,1,`provider-status-toggle-track svelte-1kx3uw4`,null,c,{"is-active":pS.detailsExpanded})},[()=>pS.detailsToggleLabel(),()=>pS.detailsToggleLabel()]),R(`click`,i,()=>pS.toggleDetails()),B(e,t)},o=e=>{var t=TC();NS(N(t),{size:18,label:`Loading provider status`}),E(t),B(e,t)};H(i,e=>{L(n).length>0?e(a):pS.loading&&!pS.loadedOnce&&e(o,1)}),B(e,r),O()}Vr([`click`]);var DC=z(`
        `);function OC(e,t){D(t,!0);function n(){Yc.fetchUsage(),Yc.fetchCacheOverview(``),mS.fetch(),pS.fetch(),hS.fetch(),gS.fetch()}function r(){Yc.fetchUsage(),Yc.fetchCacheOverview(``),mS.fetch()}function i(){r(),gS.fetch()}kn(()=>{if(J.refreshTick,Xo.page===`overview`)return Tr(()=>{n(),vb.start()}),()=>{vb.stop(),pS.stopPolling()}});var a=DC(),o=N(a);Sb(o,{});var s=F(o,4);fl(N(s),{onchange:i}),E(s);var c=F(s,2);Kc(c,{});var l=F(c,2);TS(l,{});var u=F(l,2);jS(u,{});var d=F(u,2);zS(d,{onintervalchange:r});var f=F(d,2);eC(f,{});var p=F(f,2);cC(p,{}),EC(F(p,2),{}),E(a),B(e,a),O()}var kC=`/admin/live/logs?types=audit,usage`;function AC(e,t,n){return!!t&&String(e&&e.id||``).trim()===t||!!n&&String(e&&e.request_id||``).trim()===n}function jC(e){switch(e){case`date_range`:return`Live paused — the selected date range does not include today. Set it to today to resume.`;case`filters`:return`Live paused while filters are active. Clear them to resume.`;case`pagination`:return`Live paused on later pages. Go to the first page to resume.`;default:return``}}function MC(e){let t=kC,n=Number(e||0);return Number.isFinite(n)&&n>0&&(t+=`&cursor=`+encodeURIComponent(String(n))),t}function NC(){return{async consumeLiveLogsBody(e){await tb(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},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=>AC(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;eAC(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=>!AC(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(!AC(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=>!AC(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 PC={"audit.started":10,"audit.updated":20,"audit.stream":20,"audit.completed":30,"audit.failed":40,"audit.flushed":40,"audit.detail":40},FC=new Set(Object.keys(PC));function IC(e){return String(e&&(e.id||e.request_id)||``).trim()}function LC(e,t){let n=e&&typeof e==`object`?e:{},r=t&&typeof t==`object`?t:{},i={...n,...r};r.data==null&&n.data!=null?i.data=n.data:BC(n.data)&&BC(r.data)&&(i.data={...n.data,...r.data});let a=String(n._live_state||``).trim(),o=String(r._live_state||``).trim();return(PC[a]||0)>(PC[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&&BC(i.data)&&(i.data.request_body!==void 0||i.data.response_body!==void 0)&&(i.bodies_omitted=!1),i}function RC(e,t){let n=Number(t||0);return(Array.isArray(e)?e:[]).filter(e=>Number(e&&e.version||0)>n)}function zC(e){return FC.has(String(e&&e.eventType||``).trim())}function BC(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}var VC=200,HC=class{#e=A(M({entries:[],total:0,limit:25,offset:0}));get auditLog(){return L(this.#e)}set auditLog(e){j(this.#e,e,!0)}#t=A(M({entries:[],total:0,limit:50,offset:0}));get usageLog(){return L(this.#t)}set usageLog(e){j(this.#t,e,!0)}#n=A(M({}));get auditRecords(){return L(this.#n)}set auditRecords(e){j(this.#n,e,!0)}#r=A(M([]));get auditRecordChanges(){return L(this.#r)}set auditRecordChanges(e){j(this.#r,e,!0)}auditRecordVersion=0;auditRecordPins=new Set;#i=A(``);get auditSearch(){return L(this.#i)}set auditSearch(e){j(this.#i,e,!0)}#a=A(``);get auditMethod(){return L(this.#a)}set auditMethod(e){j(this.#a,e,!0)}#o=A(``);get auditStatusCode(){return L(this.#o)}set auditStatusCode(e){j(this.#o,e,!0)}#s=A(``);get auditStream(){return L(this.#s)}set auditStream(e){j(this.#s,e,!0)}#c=A(Ca(`gomodel_audit_group_sessions`,`true`)!==`false`);get auditGroupSessions(){return L(this.#c)}set auditGroupSessions(e){j(this.#c,e,!0)}#l=A(M({}));get auditThreadChildren(){return L(this.#l)}set auditThreadChildren(e){j(this.#l,e,!0)}#u=A(``);get usageLogSearch(){return L(this.#u)}set usageLogSearch(e){j(this.#u,e,!0)}#d=A(``);get usageFilterModel(){return L(this.#d)}set usageFilterModel(e){j(this.#d,e,!0)}#f=A(``);get usageFilterProvider(){return L(this.#f)}set usageFilterProvider(e){j(this.#f,e,!0)}#p=A(``);get usageFilterLabel(){return L(this.#p)}set usageFilterLabel(e){j(this.#p,e,!0)}#m=A(``);get usageFilterUserPath(){return L(this.#m)}set usageFilterUserPath(e){j(this.#m,e,!0)}#h=A(!1);get usageLogHideCached(){return L(this.#h)}set usageLogHideCached(e){j(this.#h,e,!0)}#g=A(!1);get liveLogsStreaming(){return L(this.#g)}set liveLogsStreaming(e){j(this.#g,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=IC(e);if(!n)return e;let r=LC(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():IC(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<=VC)return;let t={...this.auditRecords},n=e.length-VC;for(let r of e){if(n<=0)break;this.auditRecordPins.has(r)||(delete t[r],n--)}this.auditRecords=t}get page(){return Xo.page}get customStartDate(){return Uc.customStartDate}get customEndDate(){return Uc.customEndDate}get followsToday(){return Uc.followsToday}liveLogsEnabled(){return As.liveLogsVisible()}async startLiveLogs(){typeof fetch!=`function`||typeof ReadableStream>`u`||(await As.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=MC(this.liveLogsLastSeq),r=J.generation;try{let i=await Cs(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 Ts(`/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(HC.prototype,NC());var UC=new HC;if(typeof window<`u`){let e=!1;window.addEventListener(`pagehide`,()=>{e=!!UC.liveLogsController,UC.stopLiveLogs()}),window.addEventListener(`pageshow`,t=>{t.persisted&&e&&UC.ensureLiveLogs()})}var WC=null;jn(()=>{kn(()=>{let e=J.refreshTick;if(WC===null){WC=e;return}e!==WC&&(WC=e,Tr(()=>{UC.stopLiveLogs(),UC.startLiveLogs()}))})});function GC(){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 KC(){return{entries:[],total:0,limit:50,offset:0}}function qC(e,t){let n=[[`model`,e&&e.model],[`provider`,e&&e.provider],[`label`,e&&e.label],[`user_path`,e&&e.user_path]],r=``;for(let[e,i]of n)!i||e===t||(r+=`&`+e+`=`+encodeURIComponent(i));return r}function JC({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 YC(e,t){let n=new Set(e||[]);return t&&n.add(t),[...n].sort()}function XC(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 ZC(e,t,n){let r=n?e:t,i=Number(r&&r.total_requests||0);return Number.isFinite(i)?i:0}function QC(e,t,n){let r=XC(e,t);return r<=0?``:n?_c(r)+` cached requests hidden`:_c(Number(e&&e.total_requests||0))+` to providers + `+_c(r)+` from cache`}function $C(e){let t=e||{};return t.total_input_cost===null||t.total_input_cost===void 0?``:vc(t.total_input_cost)+` input + `+vc(t.total_output_cost)+` output`}function ew(e){let t=Number(e&&e.rewrite_tokens_saved||0);return Number.isFinite(t)&&t>0?t:0}function tw(e){return ew(e)>0}function nw(e){let t=e||{};return t.rewrite_cost_saved===void 0?null:t.rewrite_cost_saved}function rw(){return`Estimated at 4 net characters removed per token`}function iw(e,t){return t===`costs`?vc(nw(e)):xc(ew(e))}function aw(e,t){let n=t===`costs`,r=n?Number(nw(e)):ew(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 ow(e,t){let n=aw(e,t);return n===null?``:(n<.1?`<0.1`:n.toFixed(1))+`% less`}function sw(e,t){let n=ew(e);if(n<=0)return``;let r=[_c(n)+` estimated prompt token-transmissions removed across provider requests`,rw(),`Savings are summed per provider request; resent conversation history is counted again`],i=nw(e);i!=null&&(r.push(vc(i)+` estimated gross input cost avoided`),r.push(`Prompt-cache changes caused by rewriting are not included`));let a=ow(e,t);return a&&r.push(a+` than the same traffic without rewriting (`+(t===`costs`?`cost`:`tokens`)+`)`),r.join(` -`)}function cw(e){return String(e&&e.cost_source||``).trim()}function lw(e){let t=cw(e);return t===`openrouter_credits`||t===`xai_cost_in_usd_ticks`}function uw(e){switch(cw(e)){case`openrouter_credits`:return`Costs from OpenRouter USD-based credits.`;case`xai_cost_in_usd_ticks`:return`Costs from xAI usage.cost_in_usd_ticks.`;default:return``}}function dw(e){return String(e&&e.cache_type||``).trim().toLowerCase()}function fw(e){let t=dw(e);return t===`exact`||t===`semantic`}function pw(e){let t=dw(e);return t===`exact`?`Exact`:t===`semantic`?`Semantic`:`-`}function mw(e,t){let n=t?String(t):``;return fw(e)?n?`Saved by cache — not charged -`+n:`Saved by cache — not charged`:n}function hw(e){let t=Number(e&&e.cached_input_ratio);return!Number.isFinite(t)||t<=0?0:Math.min(1,t)}function gw(e){return Number(e&&e.cached_input_tokens||0)>0}function _w(e){return gw(e)?(hw(e)*100).toFixed(1)+`%`:``}function vw(e){if(!gw(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=[_c(t)+` cached / `+_c(i)+` input tokens`];return r>0&&a.push(_c(r)+` cache write`),a.join(` -`)}function yw(e){let t=[];if(uw(e)&&(t.push(uw(e)),t.push(``)),t.push(`Input: `+vc(e.input_cost)),t.push(`Output: `+vc(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):_c(r);t.push(e+`: `+i)}}return t.join(` -`)}function bw(e){return Array.isArray(e&&e.labels)?e.labels:[]}function xw(e,t,n){return(e||[]).length>0||t?!0:(n||[]).some(e=>bw(e).length>0)}function Sw(e){return e&&typeof e.total_tokens==`number`?e.total_tokens:(e&&e.input_tokens||0)+(e&&e.output_tokens||0)}function Cw(e,t){return t?e.total_cost||0:Sw(e)}function ww(e,t){return[...e||[]].sort((e,n)=>t?(n.total_cost||0)-(e.total_cost||0):Cw(n,t)-Cw(e,t))}function Tw(e){let t=Array.isArray(e)?e:[];if(t.length===0)return!1;if(t.length!==1)return!0;let n=String(t[0]&&t[0].user_path||``).trim();return n!==``&&n!==`/`}function Ew(e){return(e||`chart`)===`chart`||e===`stacked`}function Dw(e,t,n){let r=ww(e,n),i=e=>Number(e)||0,a=e=>n?Math.min(i(e.cached_input_cost),i(e.input_cost)):i(e.cached_input_tokens),o=e=>n?i(e.input_cost)-a(e):i(e.uncached_input_tokens)+i(e.cached_input_tokens)+i(e.cache_write_input_tokens)>0?i(e.uncached_input_tokens)+i(e.cache_write_input_tokens):i(e.input_tokens),s=e=>i(n?e.output_cost:e.output_tokens),c=e=>n?0:i(e.local_cached_input_tokens),l=e=>n?0:i(e.local_cached_output_tokens),u=r.slice(0,10),d=r.slice(10),f=u.map(t),p=u.map(o),m=u.map(s),h=u.map(a),g=u.map(c),_=u.map(l);if(d.length>0){f.push(`Other`);let e=e=>d.reduce((t,n)=>t+e(n),0);p.push(e(o)),m.push(e(s)),h.push(e(a)),g.push(e(c)),_.push(e(l))}return{labels:f,inputs:p,outputs:m,prompts:h,localIns:g,localOuts:_}}function Ow(e){return Math.max(200,e*32+72)}var kw=new class{#e=A(`tokens`);get usageMode(){return L(this.#e)}set usageMode(e){j(this.#e,e,!0)}get usageFilterModel(){return UC.usageFilterModel}set usageFilterModel(e){UC.usageFilterModel=e}get usageFilterProvider(){return UC.usageFilterProvider}set usageFilterProvider(e){UC.usageFilterProvider=e}get usageFilterLabel(){return UC.usageFilterLabel}set usageFilterLabel(e){UC.usageFilterLabel=e}get usageFilterUserPath(){return UC.usageFilterUserPath}set usageFilterUserPath(e){UC.usageFilterUserPath=e}#t=A(M({models:[],providers:[],labels:[]}));get usageFacetOptions(){return L(this.#t)}set usageFacetOptions(e){j(this.#t,e,!0)}#n=A(M(GC()));get usageSummary(){return L(this.#n)}set usageSummary(e){j(this.#n,e,!0)}#r=A(M(GC()));get usageSummaryAll(){return L(this.#r)}set usageSummaryAll(e){j(this.#r,e,!0)}#i=A(M([]));get modelUsage(){return L(this.#i)}set modelUsage(e){j(this.#i,e,!0)}#a=A(M([]));get userPathUsage(){return L(this.#a)}set userPathUsage(e){j(this.#a,e,!0)}#o=A(M([]));get labelUsage(){return L(this.#o)}set labelUsage(e){j(this.#o,e,!0)}get usageLog(){return UC.usageLog}set usageLog(e){UC.usageLog=e}get usageLogSearch(){return UC.usageLogSearch}set usageLogSearch(e){UC.usageLogSearch=e}get usageLogHideCached(){return UC.usageLogHideCached}set usageLogHideCached(e){UC.usageLogHideCached=e}#s=A(`chart`);get modelUsageView(){return L(this.#s)}set modelUsageView(e){j(this.#s,e,!0)}#c=A(`chart`);get userPathUsageView(){return L(this.#c)}set userPathUsageView(e){j(this.#c,e,!0)}#l=A(`chart`);get labelUsageView(){return L(this.#l)}set labelUsageView(e){j(this.#l,e,!0)}#u=A(!1);get summaryLoading(){return L(this.#u)}set summaryLoading(e){j(this.#u,e,!0)}#d=A(!1);get modelUsageLoading(){return L(this.#d)}set modelUsageLoading(e){j(this.#d,e,!0)}#f=A(!1);get userPathUsageLoading(){return L(this.#f)}set userPathUsageLoading(e){j(this.#f,e,!0)}#p=A(!1);get labelUsageLoading(){return L(this.#p)}set labelUsageLoading(e){j(this.#p,e,!0)}#m=A(!1);get usageLogLoading(){return L(this.#m)}set usageLogLoading(e){j(this.#m,e,!0)}#h={};#g(e){this.#h[e]&&this.#h[e].abort();let t=new AbortController;return this.#h[e]=t,t}#_(e,t){this.#h[e]===t&&(this.#h[e]=null)}filterQueryStr(e){return qC({model:this.usageFilterModel,provider:this.usageFilterProvider,label:this.usageFilterLabel,user_path:this.usageFilterUserPath},e)}onUsageFilterChanged(){this.fetchUsagePage()}toggleUsageLabelFilter(e){this.usageFilterLabel=this.usageFilterLabel===e?``:e,this.onUsageFilterChanged()}usageLabelChipTitle(e){return this.usageFilterLabel===e?`Clear label filter`:`Filter usage by "`+e+`"`}toggleUsageMode(e){this.usageMode=e,Xo.navigate(`usage`,e===`costs`?`costs`:null)}toggleUsageChartView(e,t){e===`model`&&(this.modelUsageView=t),e===`userPath`&&(this.userPathUsageView=t),e===`label`&&(this.labelUsageView=t)}usageFilterModelOptions(){return YC(this.usageFacetOptions.models,this.usageFilterModel)}usageFilterProviderOptions(){return YC(this.usageFacetOptions.providers,this.usageFilterProvider)}usageFilterLabelOptions(){return YC(this.usageFacetOptions.labels,this.usageFilterLabel)}async fetchUsagePage(){await As.ensureLoaded();let e=[this.fetchUsagePageSummary(),this.fetchUsageFacetOptions(),this.fetchModelUsage(),this.fetchUserPathUsage(),this.fetchLabelUsage(),this.fetchUsageLog(!0)];Yc.cacheAnalyticsEnabled()&&e.push(Yc.fetchCacheOverview(this.filterQueryStr())),await Promise.all(e)}async fetchUsagePageSummary(){let e=this.#g(`summary`);this.summaryLoading=!0;try{let t=Uc.queryStr()+this.filterQueryStr(),[n,r]=await Promise.all([Ts(`/admin/usage/summary?`+t+`&cache_mode=uncached`,{label:`usage page summary`,signal:e.signal}),Ts(`/admin/usage/summary?`+t+`&cache_mode=all`,{label:`usage page summary (all)`,signal:e.signal})]);if(n.stale||r.stale||e.signal.aborted)return;if(!n.ok||!r.ok){this.usageSummary=GC(),this.usageSummaryAll=GC();return}this.usageSummary=n.data&&typeof n.data==`object`?n.data:GC(),this.usageSummaryAll=r.data&&typeof r.data==`object`?r.data:GC()}catch(e){if(Ds(e))return;console.error(`Failed to fetch usage page summary:`,e),this.usageSummary=GC(),this.usageSummaryAll=GC()}finally{this.#_(`summary`,e),this.#h.summary===null&&(this.summaryLoading=!1)}}async fetchUsageFacetOptions(){let e=this.#g(`facets`);try{let t=async(t,n)=>{let r=await Ts(t+`?`+Uc.queryStr()+this.filterQueryStr(n),{label:`usage facet options`,signal:e.signal});return r.stale?null:r.ok&&Array.isArray(r.data)?r.data:[]},n=t(`/admin/usage/models`,`model`),r=!this.usageFilterModel&&!this.usageFilterProvider,[i,a,o]=await Promise.all([n,r?n:t(`/admin/usage/models`,`provider`),t(`/admin/usage/labels`,`label`)]);if(e.signal.aborted||i===null||a===null||o===null)return;this.usageFacetOptions={models:i.map(e=>e&&e.model).filter(Boolean),providers:a.map(e=>Dc(e)).filter(Boolean),labels:o.map(e=>e&&e.label).filter(Boolean)}}catch(e){if(Ds(e))return;console.error(`Failed to fetch usage facet options:`,e),this.usageFacetOptions={models:[],providers:[],labels:[]}}finally{this.#_(`facets`,e)}}async#v(e,t,n,r,i){let a=this.#g(e);i(!0);try{let e=await Ts(t+`?`+Uc.queryStr()+this.filterQueryStr(),{label:n,signal:a.signal});if(e.stale||a.signal.aborted)return;if(!e.ok){r([]);return}r(Array.isArray(e.data)?e.data:[])}catch(e){if(Ds(e))return;console.error(`Failed to fetch `+n+`:`,e),r([])}finally{this.#_(e,a),this.#h[e]===null&&i(!1)}}fetchModelUsage(){return this.#v(`modelUsage`,`/admin/usage/models`,`usage models`,e=>this.modelUsage=e,e=>this.modelUsageLoading=e)}fetchUserPathUsage(){return this.#v(`userPathUsage`,`/admin/usage/user-paths`,`usage user paths`,e=>this.userPathUsage=e,e=>this.userPathUsageLoading=e)}fetchLabelUsage(){return this.#v(`labelUsage`,`/admin/usage/labels`,`usage labels`,e=>this.labelUsage=e,e=>this.labelUsageLoading=e)}async fetchUsageLog(e){let t=this.#g(`usageLog`);this.usageLogLoading=!0;try{e&&(this.usageLog.offset=0);let n=Uc.queryStr()+this.filterQueryStr();n+=JC({limit:this.usageLog.limit,offset:this.usageLog.offset,hideCached:this.usageLogHideCached,search:this.usageLogSearch});let r=await Ts(`/admin/usage/log?`+n,{label:`usage log`,signal:t.signal});if(r.stale||t.signal.aborted)return;if(!r.ok){this.usageLog=KC();return}let i=r.data&&typeof r.data==`object`?r.data:KC();i.entries||=[],this.usageLog=i}catch(e){if(Ds(e))return;console.error(`Failed to fetch usage log:`,e),this.usageLog=KC()}finally{this.#_(`usageLog`,t),this.#h.usageLog===null&&(this.usageLogLoading=!1)}}usageLogNextPage(){this.usageLog.offset+this.usageLog.limit0&&(this.usageLog.offset=Math.max(0,this.usageLog.offset-this.usageLog.limit),this.fetchUsageLog(!1))}};UC.fetchUsage=()=>{Xo.page===`usage`&&kw.fetchUsagePage()};var Aw=z(`
        `);function jw(e,t){D(t,!0);let n=K(t,`value`,15,``),r=K(t,`placeholder`,3,``),i=K(t,`label`,3,``),a=K(t,`id`,3,void 0),o=K(t,`oninput`,3,void 0),s=K(t,`class`,3,``);var c=Aw(),l=N(c);q(l,{get icon(){return yo},class:`filter-input-icon`});var u=F(l,2);ta(u),E(c),I(()=>{W(c,1,Pi([`filter-input-wrap`,s()]),`svelte-30xz1k`),G(u,`id`,a()),G(u,`placeholder`,r()),G(u,`aria-label`,i())}),R(`input`,u,function(...e){o()?.apply(this,e)}),ua(u,n),B(e,c),O()}Vr([`input`]);function Mw(e,t=300){let n=null,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>{n=null,e(...r)},t)};return r.cancel=()=>{clearTimeout(n),n=null},r}var Nw=z(``),Pw=z(``),Fw=z(`
        `);function Iw(e,t){D(t,!0);let n=Mw(()=>kw.onUsageFilterChanged());kn(()=>n.cancel);var r=Fw(),i=N(r),a=N(i);a.value=a.__value=``,U(F(a),16,()=>kw.usageFilterModelOptions(),e=>e,(e,t)=>{var n=Nw(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(i);var o=F(i,2),s=N(o);s.value=s.__value=``,U(F(s),16,()=>kw.usageFilterProviderOptions(),e=>e,(e,t)=>{var n=Nw(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(o);var c=F(o,2),l=e=>{var t=Pw(),n=N(t);n.value=n.__value=``,U(F(n),16,()=>kw.usageFilterLabelOptions(),e=>e,(e,t)=>{var n=Nw(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(t),R(`change`,t,()=>kw.onUsageFilterChanged()),Wi(t,()=>kw.usageFilterLabel,e=>kw.usageFilterLabel=e),B(e,t)},u=k(()=>kw.usageFilterLabelOptions().length>0);H(c,e=>{L(u)&&e(l)}),jw(F(c,2),{class:`usage-page-filters-user-path`,placeholder:`User path /team/alpha`,label:`Filter by user path`,get oninput(){return n},get value(){return kw.usageFilterUserPath},set value(e){kw.usageFilterUserPath=e}}),E(r),R(`change`,i,()=>kw.onUsageFilterChanged()),Wi(i,()=>kw.usageFilterModel,e=>kw.usageFilterModel=e),R(`change`,o,()=>kw.onUsageFilterChanged()),Wi(o,()=>kw.usageFilterProvider,e=>kw.usageFilterProvider=e),B(e,r),O()}Vr([`change`]);var Lw=z(`
        Cache Saved
        Cache Hits
        `,1);function Rw(e,t){D(t,!0);var n=Zr(),r=P(n),i=e=>{var t=Lw(),n=P(t),r=F(N(n),2),i=N(r,!0);E(r),E(n);var a=F(n,2),o=F(N(a),2),s=N(o,!0);E(o),E(a),I((e,t)=>{V(i,e),V(s,t)},[()=>vc(Yc.cacheOverview.summary.total_saved_cost),()=>_c(Yc.cacheOverview.summary.total_hits)]),B(e,t)},a=k(()=>Yc.cacheAnalyticsEnabled());H(r,e=>{L(a)&&e(i)}),B(e,n),O()}var zw=z(` `),Bw=z(`
        Pro Saved
        `),Vw=z(`
        Total Requests
        Estimated Cost
        `);function Hw(e,t){D(t,!0);let n=k(()=>tw(kw.usageSummary)),r=k(()=>iw(kw.usageSummary,kw.usageMode)),i=k(()=>ow(kw.usageSummary,kw.usageMode));var a=Vw(),o=N(a),s=F(N(o),2),c=N(s),l=e=>{NS(e,{size:18,label:`Loading usage summary`})},u=e=>{var t=Xr();I(e=>V(t,e),[()=>_c(ZC(kw.usageSummary,kw.usageSummaryAll,kw.usageLogHideCached))]),B(e,t)};H(c,e=>{kw.summaryLoading?e(l):e(u,-1)}),E(s),E(o);var d=F(o,2),f=F(N(d),2),p=N(f),m=e=>{NS(e,{size:18,label:`Loading usage summary`})},h=e=>{var t=Xr();I(e=>V(t,e),[()=>vc(kw.usageSummary.total_cost)]),B(e,t)};H(p,e=>{kw.summaryLoading?e(m):e(h,-1)}),E(f),E(d);var g=F(d,2),_=e=>{var t=Bw(),n=F(N(t),2),a=N(n),o=N(a,!0);E(a);var s=F(a,2),c=e=>{var t=zw(),n=N(t,!0);E(t),I(()=>V(n,L(i))),B(e,t)};H(s,e=>{L(i)&&e(c)}),E(n),E(t),I(e=>{G(n,`title`,e),V(o,L(r))},[()=>sw(kw.usageSummary,kw.usageMode)]),B(e,t)};H(g,e=>{L(n)&&e(_)}),Rw(F(g,2),{}),E(a),I((e,t)=>{G(s,`title`,e),G(f,`title`,t)},[()=>QC(kw.usageSummary,kw.usageSummaryAll,kw.usageLogHideCached),()=>$C(kw.usageSummary)]),B(e,a),O()}function Uw(e,t,n,r){let{stacked:i=!1,costs:a=!1,resolve:o=e=>e}=r||{},s=e=>a?`$`+Math.abs(e).toFixed(2):xc(Math.abs(e)),c=e=>a?`$`+Math.abs(e).toFixed(4):Math.abs(e).toLocaleString(),l=e=>e.map(e=>i?Math.abs(e):-Math.abs(e)),u=(e,t,n)=>({label:e,data:t,backgroundColor:n,borderColor:`transparent`,borderWidth:0,borderRadius:4,maxBarThickness:22}),d=e=>(e||[]).some(e=>Math.abs(e)>0),f=[u(a?`Input Cost`:`Input Tokens`,l(n.inputs),o(`var(--token-input)`)),u(a?`Output Cost`:`Output Tokens`,n.outputs,o(`var(--token-output)`))];return d(n.prompts)&&f.push(u(a?`Prompt Cached Cost`:`Prompt Cached`,l(n.prompts),o(`var(--token-prompt)`))),!a&&d(n.localIns)&&f.push(u(`Locally Cached (Input)`,l(n.localIns),o(`var(--token-local)`))),!a&&d(n.localOuts)&&f.push(u(`Locally Cached (Output)`,n.localOuts,o(`var(--token-local)`))),{type:`bar`,data:{labels:t,datasets:f},options:{indexAxis:`y`,responsive:!0,maintainAspectRatio:!1,animation:{duration:0},layout:{padding:{top:8}},scales:{x:{stacked:!0,beginAtZero:!0,grid:i?{color:e.grid}:{color:t=>t.tick&&t.tick.value===0?e.text:e.grid},border:{display:!1},ticks:{color:e.text,font:Jy(),callback:e=>s(e)}},y:{stacked:!0,grid:{display:!1},border:{display:!1},ticks:{color:e.text,font:Jy(),autoSkip:!1}}},plugins:{legend:{labels:{color:e.text,font:{size:12}}},tooltip:Yy(e,{label:e=>e.dataset.label+`: `+c(e.parsed.x),footer:e=>{let t=0;return e.forEach(e=>{t+=Math.abs(Number(e.parsed.x))||0}),`Total: `+c(t)}})}}}}var Ww=z(`
        `),Gw=z(`

        `),Kw=z(`

        `,1),qw=z(`
        `),Jw=z(`Model Provider`,1),Yw=z(`User Path`),Xw=z(`Label Requests`,1),Zw=z(` `,1),Qw=z(` `),$w=z(` `,1),eT=z(` `),tT=z(`
        Input TokensOutput TokensPrompt CachedLocal CachedTotal TokensInput CostOutput CostTotal Cost
        `),nT=z(`
        `),rT=z(`
        `);function iT(e,t){D(t,!0);let n=e=>{var n=Ww(),r=N(n);let a;var o=F(r,2);let s;var l=F(o,2);let u;E(n),I(()=>{G(n,`aria-label`,L(i).group),a=W(r,1,`chart-view-btn svelte-1kee4g8`,null,a,{active:L(c)===`chart`}),G(r,`aria-pressed`,L(c)===`chart`),G(r,`aria-label`,`Show ${L(i).noun??``} chart`),s=W(o,1,`chart-view-btn svelte-1kee4g8`,null,s,{active:L(c)===`stacked`}),G(o,`aria-pressed`,L(c)===`stacked`),G(o,`aria-label`,`Show ${L(i).noun??``} stacked chart`),u=W(l,1,`chart-view-btn svelte-1kee4g8`,null,u,{active:L(c)===`table`}),G(l,`aria-pressed`,L(c)===`table`),G(l,`aria-label`,`Show ${L(i).noun??``} table`)}),R(`click`,r,()=>kw.toggleUsageChartView(t.kind,`chart`)),R(`click`,o,()=>kw.toggleUsageChartView(t.kind,`stacked`)),R(`click`,l,()=>kw.toggleUsageChartView(t.kind,`table`)),B(e,n)},r={model:{group:`Model usage view`,noun:`model usage`,tokensTitle:`Token Usage by Model`,costsTitle:`Cost by Model`},userPath:{group:`User path usage view`,noun:`user path usage`,tokensTitle:`Usage by User Path`,costsTitle:`Cost by User Path`},label:{group:`Label usage view`,noun:`label usage`,tokensTitle:`Usage by Label`,costsTitle:`Cost by Label`}},i=k(()=>r[t.kind]),a=k(()=>t.kind===`model`?e=>kc(e):t.kind===`userPath`?e=>e.user_path||`/`:e=>e.label);function o(e){return t.kind===`model`?(e.provider_name||e.provider||`-`)+`/`+e.model:t.kind===`userPath`?e.user_path||`/`:e.label}let s=k(()=>t.kind===`model`?kw.modelUsage:t.kind===`userPath`?kw.userPathUsage:kw.labelUsage),c=k(()=>t.kind===`model`?kw.modelUsageView:t.kind===`userPath`?kw.userPathUsageView:kw.labelUsageView),l=k(()=>t.kind===`model`?kw.modelUsageLoading:t.kind===`userPath`?kw.userPathUsageLoading:kw.labelUsageLoading),u=k(()=>kw.usageMode===`costs`),d=k(()=>t.kind===`userPath`?Tw(L(s)):L(s).length>0),f=k(()=>L(u)?L(i).costsTitle:L(i).tokensTitle),p=k(()=>Dw(L(s),L(a),L(u))),m=k(()=>ww(L(s),L(u)));function h(){return Ew(L(c))?Uw(qy(),L(p).labels,L(p),{stacked:L(c)===`stacked`,costs:L(u),resolve:Xy}):null}var g=Zr(),_=P(g),v=e=>{var r=nT(),a=N(r),s=N(a),u=e=>{iC(e,{copyId:`label-usage-help-copy`,label:`label usage help`,text:`One request can have multiple labels. Such a request counts once under each of its labels, so label rows can overlap and add up to more than the period totals.`,title:e=>{var t=Gw(),n=N(t,!0);E(t),I(()=>V(n,L(f))),B(e,t)},extra:e=>{var t=Zr(),n=P(t),r=e=>{NS(e,{size:14,get label(){return`Loading ${L(i).noun??``}`}})};H(n,e=>{L(l)&&e(r)}),B(e,t)},$$slots:{title:!0,extra:!0}})},d=e=>{var t=Kw(),n=P(t),r=N(n,!0);E(n);var a=F(n,2),o=e=>{NS(e,{size:14,get label(){return`Loading ${L(i).noun??``}`}})};H(a,e=>{L(l)&&e(o)}),I(()=>V(r,L(f))),B(e,t)};H(s,e=>{t.kind===`label`?e(u):e(d,-1)});var g=F(s,2);n(g),E(a);var _=F(a,2),v=e=>{var t=qw();let n;Hy(N(t),{build:h}),E(t),I(e=>n=Vi(t,``,n,e),[()=>({height:`${Ow(L(p).labels.length)??``}px`})]),B(e,t)},y=k(()=>Ew(L(c))),b=e=>{var n=tT(),r=N(n),i=N(r),a=N(i),s=N(a),c=e=>{var t=Jw();He(2),B(e,t)},l=e=>{B(e,Yw())},u=e=>{var t=Xw();He(2),B(e,t)};H(s,e=>{t.kind===`model`?e(c):t.kind===`userPath`?e(l,1):e(u,-1)}),He(8),E(a),E(i);var d=F(i);U(d,21,()=>L(m),e=>o(e),(e,n)=>{var r=eT(),i=N(r),a=e=>{var t=Zw(),r=P(t),i=N(r,!0);E(r);var a=F(r,2),o=N(a),s=N(o,!0);E(o),E(a),I(e=>{V(i,L(n).model||`-`),V(s,e)},[()=>Dc(L(n))||`-`]),B(e,t)},o=e=>{var t=Qw(),r=N(t,!0);E(t),I(()=>V(r,L(n).user_path||`/`)),B(e,t)},s=e=>{var t=$w(),r=P(t),i=N(r);let a;var o=N(i,!0);E(i),E(r);var s=F(r,2),c=N(s,!0);E(s),I((e,t,r)=>{a=W(i,1,`usage-label-chip`,null,a,{active:kw.usageFilterLabel===L(n).label}),Vi(i,`--label-color: ${e??``}`),G(i,`title`,t),V(o,L(n).label),V(c,r)},[()=>$y(L(n).label),()=>kw.usageLabelChipTitle(L(n).label),()=>_c(L(n).requests)]),R(`click`,i,()=>kw.toggleUsageLabelFilter(L(n).label)),B(e,t)};H(i,e=>{t.kind===`model`?e(a):t.kind===`userPath`?e(o,1):e(s,-1)});var c=F(i),l=N(c,!0);E(c);var u=F(c),d=N(u,!0);E(u);var f=F(u),p=N(f,!0);E(f);var m=F(f),h=N(m,!0);E(m);var g=F(m),_=N(g,!0);E(g);var v=F(g),y=N(v,!0);E(v);var b=F(v),x=N(b,!0);E(b);var S=F(b),C=N(S,!0);E(S),E(r),I((e,t,n,r,i,a,o,s,c,u,g)=>{V(l,e),V(d,t),G(f,`title`,n),V(p,r),G(m,`title`,`${i??``} input + ${a??``} output`),V(h,o),V(_,s),V(y,c),V(x,u),V(C,g)},[()=>_c(L(n).input_tokens),()=>_c(L(n).output_tokens),()=>L(n).cached_input_cost==null?``:`~`+vc(L(n).cached_input_cost)+` at current cached-input pricing`,()=>_c(L(n).cached_input_tokens||0),()=>_c(L(n).local_cached_input_tokens||0),()=>_c(L(n).local_cached_output_tokens||0),()=>_c((L(n).local_cached_input_tokens||0)+(L(n).local_cached_output_tokens||0)),()=>_c(Sw(L(n))),()=>vc(L(n).input_cost),()=>vc(L(n).output_cost),()=>vc(L(n).total_cost)]),B(e,r)}),E(d),E(r),E(n),B(e,n)};H(_,e=>{L(y)?e(v):e(b,-1)}),E(r),B(e,r)},y=e=>{var t=rT();NS(N(t),{size:20,get label(){return`Loading ${L(i).noun??``}`}}),E(t),B(e,t)};H(_,e=>{L(d)?e(v):L(l)&&e(y,1)}),B(e,g),O()}Vr([`click`]);var aT=z(``);function oT(e,t){D(t,!0);let n=K(t,`total`,3,0),r=K(t,`offset`,3,0),i=K(t,`limit`,3,25);var a=Zr(),o=P(a),s=e=>{var a=aT(),o=N(a),s=N(o);E(o);var c=F(o,2),l=N(c),u=F(l,2);E(c),E(a),I(e=>{V(s,`Showing ${r()+1}-${e??``} of ${n()??``}`),l.disabled=r()===0,u.disabled=r()+i()>=n()},[()=>Math.min(r()+i(),n())]),R(`click`,l,()=>t.onprev?.()),R(`click`,u,()=>t.onnext?.()),B(e,a)};H(o,e=>{n()>0&&e(s)}),B(e,a),O()}Vr([`click`]);var sT=(e,t=f)=>{var n=Zr(),r=P(n),i=e=>{var n=lT();U(n,20,()=>bw(t()),e=>e,(e,t)=>{var n=cT();let r;var i=N(n,!0);E(n),I((e,a)=>{r=W(n,1,`usage-label-chip`,null,r,{active:kw.usageFilterLabel===t}),Vi(n,`--label-color: ${e??``}`),G(n,`title`,a),V(i,t)},[()=>$y(t),()=>kw.usageLabelChipTitle(t)]),R(`click`,n,()=>kw.toggleUsageLabelFilter(t)),B(e,n)}),E(n),B(e,n)},a=k(()=>bw(t()).length>0),o=e=>{B(e,uT())};H(r,e=>{L(a)?e(i):e(o,-1)}),B(e,n)},cT=z(``),lT=z(`
        `),uT=z(`-`),dT=z(`Labels`),fT=z(`Cost`),pT=z(``),mT=z(` `),hT=z(``),gT=z(` `),_T=z(` `),vT=z(`
        TimestampProviderModelUser PathCacheProvider Cache
        `),yT=z(`
        `),bT=z(`
        `),xT=z(`

        Request Log

        `);function ST(e,t){D(t,!0);let n=k(()=>kw.usageMode===`costs`),r=k(()=>xw(kw.labelUsage,kw.usageFilterLabel,kw.usageLog.entries)),i=Mw(()=>kw.fetchUsageLog(!0));kn(()=>i.cancel);var a=xT(),o=F(N(a),2),s=N(o);jw(N(s),{placeholder:`Search by request ID, model, provider...`,label:`Search by request ID, model, provider`,get oninput(){return i},get value(){return kw.usageLogSearch},set value(e){kw.usageLogSearch=e}}),E(s);var c=F(s,2),l=N(c),u=N(l);ta(u),He(2),E(l),E(c),E(o);var d=F(o,2),f=e=>{var t=vT(),i=N(t),a=N(i),o=N(a),s=F(N(o),4),c=e=>{B(e,dT())};H(s,e=>{L(r)&&e(c)});var l=F(s,3),u=N(l,!0);E(l);var d=F(l),f=N(d,!0);E(d);var p=F(d),m=N(p,!0);E(p);var h=F(p),g=e=>{B(e,fT())};H(h,e=>{L(n)||e(g)}),E(o),E(a);var _=F(a);U(_,21,()=>kw.usageLog.entries,e=>e.id,(e,t)=>{var i=_T();let a;var o=N(i),s=N(o,!0);E(o);var c=F(o),l=N(c),u=N(l,!0);E(l),E(c);var d=F(c),f=N(d,!0);E(d);var p=F(d),m=N(p,!0);E(p);var h=F(p),g=e=>{var n=pT();sT(N(n),()=>L(t)),E(n),B(e,n)};H(h,e=>{L(r)&&e(g)});var _=F(h),v=N(_,!0);E(_);var y=F(_),b=N(y),x=e=>{var n=mT(),r=N(n,!0);E(n),I(e=>V(r,e),[()=>_w(L(t))]),B(e,n)},S=k(()=>gw(L(t))),C=e=>{B(e,uT())};H(b,e=>{L(S)?e(x):e(C,-1)}),E(y);var w=F(y),T=N(w,!0);E(w);var ee=F(w),te=N(ee,!0);E(ee);var ne=F(ee),re=N(ne),ie=N(re,!0);E(re);var ae=F(re,2),oe=e=>{{let n=k(()=>uw(L(t)));q(e,{get icon(){return qa},class:`cost-source-icon`,get title(){return L(n)}})}},se=k(()=>L(n)&&lw(L(t)));H(ae,e=>{L(se)&&e(oe)});var ce=F(ae,2),le=e=>{q(e,{get icon(){return Xa},class:`cache-savings-icon`})},ue=k(()=>L(n)&&fw(L(t)));H(ce,e=>{L(ue)&&e(le)});var de=F(ce,2),fe=e=>{var n=hT();I(()=>G(n,`title`,L(t).costs_calculation_caveat)),B(e,n)};H(de,e=>{L(n)&&L(t).costs_calculation_caveat&&e(fe)}),E(ne);var pe=F(ne),me=e=>{var n=gT(),r=N(n),i=N(r,!0);E(r);var a=F(r,2),o=e=>{{let n=k(()=>uw(L(t)));q(e,{get icon(){return qa},class:`cost-source-icon`,get title(){return L(n)}})}},s=k(()=>lw(L(t)));H(a,e=>{L(s)&&e(o)});var c=F(a,2),l=e=>{q(e,{get icon(){return Xa},class:`cache-savings-icon`})},u=k(()=>fw(L(t)));H(c,e=>{L(u)&&e(l)});var d=F(c,2),f=e=>{var n=hT();I(()=>G(n,`title`,L(t).costs_calculation_caveat)),B(e,n)};H(d,e=>{L(t).costs_calculation_caveat&&e(f)}),E(n),I((e,t)=>{G(n,`title`,e),V(i,t)},[()=>mw(L(t),yw(L(t))),()=>vc(L(t).total_cost)]),B(e,n)};H(pe,e=>{L(n)||e(me)}),E(i),I((e,n,r,c,l,d,p,h,g,_,b,x,S)=>{a=W(i,1,`svelte-hg4ill`,null,a,e),G(o,`title`,n),V(s,r),V(u,c),V(f,L(t).model),V(m,L(t).user_path||`-`),V(v,l),G(y,`title`,d),G(w,`title`,p),V(T,h),G(ee,`title`,g),V(te,_),G(ne,`title`,b),G(re,`title`,x),V(ie,S)},[()=>({"usage-log-row-cached":fw(L(t))}),()=>Tc(L(t).timestamp),()=>ys.formatTimestamp(L(t).timestamp),()=>Dc(L(t))||`-`,()=>pw(L(t)),()=>vw(L(t)),()=>L(n)?_c(L(t).input_tokens)+` tokens`:``,()=>L(n)?vc(L(t).input_cost):_c(L(t).input_tokens),()=>L(n)?_c(L(t).output_tokens)+` tokens`:``,()=>L(n)?vc(L(t).output_cost):_c(L(t).output_tokens),()=>L(n)?mw(L(t),``):``,()=>L(n)?mw(L(t),_c(L(t).total_tokens)+` tokens -`+yw(L(t))):``,()=>L(n)?vc(L(t).total_cost):_c(L(t).total_tokens)]),B(e,i)}),E(_),E(i),E(t),I(()=>{V(u,L(n)?`Input Cost`:`Input`),V(f,L(n)?`Output Cost`:`Output`),V(m,L(n)?`Total Cost`:`Total`)}),B(e,t)},p=e=>{var t=yT();NS(N(t),{size:20,label:`Loading request log`}),E(t),B(e,t)},m=e=>{var t=bT();IS(N(t),{}),E(t),B(e,t)};H(d,e=>{kw.usageLog.entries.length>0?e(f):kw.usageLogLoading?e(p,1):e(m,-1)}),oT(F(d,2),{get total(){return kw.usageLog.total},get offset(){return kw.usageLog.offset},get limit(){return kw.usageLog.limit},onprev:()=>kw.usageLogPrevPage(),onnext:()=>kw.usageLogNextPage()}),E(a),R(`change`,u,()=>kw.fetchUsageLog(!0)),da(u,()=>kw.usageLogHideCached,e=>kw.usageLogHideCached=e),B(e,a),O()}Vr([`click`,`change`]);var CT=z(`
        `);function wT(e,t){D(t,!0);let n=`usage`;kn(()=>{J.refreshTick,Xo.page===n&&(kw.fetchUsagePage(),UC.ensureLiveLogs())}),kn(()=>{Xo.page===n&&(kw.usageMode=Xo.sub===`costs`?`costs`:`tokens`)});var r=CT(),i=F(N(r),2),a=N(i);Gy(a,{ariaLabel:`Usage mode`,options:[{value:`tokens`,label:`Tokens`},{value:`costs`,label:`Costs`}],get value(){return kw.usageMode},onchange:e=>kw.toggleUsageMode(e)}),fl(F(a,2),{onchange:()=>kw.fetchUsagePage()}),E(i);var o=F(i,2);Iw(o,{});var s=F(o,2);Hw(s,{});var c=F(s,2),l=N(c);iT(l,{kind:`model`});var u=F(l,2);iT(u,{kind:`userPath`}),iT(F(u,2),{kind:`label`}),E(c),ST(F(c,2),{}),E(r),B(e,r),O()}var TT=z(`
        `);function ET(e,t){let n=K(t,`label`,3,`Loading...`),r=K(t,`class`,3,``);var i=TT(),a=F(N(i),2),o=N(a,!0);E(a),E(i),I(()=>{W(i,1,Pi([`loading-state`,r()]),`svelte-hzxv1d`),V(o,n())}),B(e,i)}var DT=z(``);function OT(e,t){let n=K(t,`label`,3,``),r=K(t,`class`,3,``),i=K(t,`disabled`,3,!1);var a=DT();hi(N(a),()=>t.children??f),E(a),I(()=>{W(a,1,Pi([`table-action-btn`,r()])),G(a,`aria-label`,n()),G(a,`title`,n()),a.disabled=i()}),R(`click`,a,function(...e){t.onclick?.apply(this,e)}),B(e,a)}Vr([`click`]);async function kT(e,{label:t,errorFallback:n=`Unable to load ${t}.`,unavailableStatuses:r=[503],normalize:i=e=>Array.isArray(e)?e:[],options:a}){let o;try{o=await Ts(e,{...a||{},label:t})}catch(e){return Ds(e)||console.error(`Failed to fetch ${t}:`,e),{status:`error`,items:[],error:n,result:null}}return o.stale?{status:`stale`,items:[],error:``,result:o}:r.includes(o.status)?{status:`unavailable`,items:[],error:``,result:o}:o.ok?{status:`ok`,items:i(o.data),error:``,result:o}:{status:`error`,items:[],error:o.status===401?``:bs(o.data,n),result:o}}async function AT(e,t,n,{label:r,errorFallback:i=`Unable to ${r}.`,unavailableStatuses:a=[503],unavailableMessage:o=`This feature is unavailable on the gateway.`,options:s}){let c;try{c=await Es(e,t,n,{...s||{},label:r})}catch(e){return Ds(e)||console.error(`Failed to ${r}:`,e),{status:`error`,error:i,result:null}}return c.stale?{status:`stale`,error:``,result:c}:a.includes(c.status)?{status:`unavailable`,error:o,result:c}:c.ok?{status:`ok`,error:``,result:c}:{status:`error`,error:c.status===401?`Authentication required.`:bs(c.data,i),result:c}}function jT(){return{scope:`user_path`,subject:`/`,period:`daily`,period_seconds:86400,amount:``,source:`manual`}}function MT(e){let t={user_path:{label:`User path`,chip:`user path`,fieldLabel:`User Path`,placeholder:`/team/alpha`},label:{label:`Label`,chip:`label`,fieldLabel:`Label`,placeholder:`Mobile-App-iOS`}};return t[e]||t.user_path}function NT(){return[`user_path`,`label`].map(e=>({value:e,label:MT(e).label}))}function PT(e){return String(e&&e.scope||``).trim()||`user_path`}function FT(e){return String(e&&e.subject||``).trim()||String(e&&e.user_path||``)}function IT(e){return MT(PT(e)).chip}function LT(e){return PT(e)===`label`?`budget-label`:`budget-user-path`}function RT(e){return MT(String(e&&e.scope||``)).fieldLabel}function zT(e){return MT(String(e&&e.scope||``)).placeholder}function BT(e){e.subject=String(e&&e.scope||``)===`user_path`?`/`:``}function VT(){return[{value:`hourly`,label:`Hourly`},{value:`daily`,label:`Daily`},{value:`weekly`,label:`Weekly`},{value:`monthly`,label:`Monthly`},{value:`custom`,label:`Custom seconds`}]}function HT(e){switch(String(e||``).trim().toLowerCase()){case`hourly`:return 3600;case`daily`:return 86400;case`weekly`:return 604800;case`monthly`:return 2592e3;default:return 0}}function UT(e){switch(Number(e||0)){case 3600:return`hourly`;case 86400:return`daily`;case 604800:return`weekly`;case 2592e3:return`monthly`;default:return`custom`}}function WT(e){return PT(e)+`:`+FT(e)+`:`+String(e&&e.period_seconds||``)}function GT(e,t){if(!t||!Array.isArray(e))return null;let n=WT(t);return e.find(e=>WT(e)===n)||null}function KT(e){let t=String(e||``).trim();if(!t)return`User path is required.`;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function qT(e){if(KT(e))return``;let t=String(e||``).trim(),n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function JT(e){return`/`+String(e||``).trimStart().replace(/^\/+/,``)}function YT(e){return Array.isArray(e)?e:e&&Array.isArray(e.budgets)?e.budgets:[]}function XT(e){let t=Number(e&&e.period_seconds||0);return[FT(e),IT(e),pE(e),UT(t),t?String(t)+`s`:``,t?String(t)+` seconds`:``].join(` `).toLowerCase()}var ZT={user_path:0,label:1};function QT(e,t){let n=Array.isArray(e)?e.slice():[],r=String(t||`subject`);return n.sort((e,t)=>{let n=(ZT[PT(e)]||0)-(ZT[PT(t)]||0),i=FT(e).localeCompare(FT(t)),a=Number(t&&t.period_seconds||0)-Number(e&&e.period_seconds||0);return r===`period`?a||n||i:n||i||a}),n}function $T(e,t,n){let r=Array.isArray(e)?e:[],i=String(t||``).trim().toLowerCase();return QT(i?r.filter(e=>XT(e).includes(i)):r.slice(),n)}function eE(e){let t=e||{},n=PT(t),r=String(t.subject||``).trim();if(n===`user_path`){let e=KT(r);if(e)return{payload:null,error:e}}else if(!r)return{payload:null,error:`Label is required.`};let i=Number(t.amount);if(!Number.isFinite(i)||i<=0)return{payload:null,error:`Amount must be greater than 0.`};let a=String(t.period||``).trim(),o=HT(a);return a===`custom`&&(o=Number(t.period_seconds)),!Number.isFinite(o)||o<=0?{payload:null,error:`Period seconds must be greater than 0.`}:{payload:{scope:n,subject:n===`user_path`?qT(r):r,period_seconds:Math.trunc(o),amount:i,source:String(t.source||`manual`).trim()||`manual`},error:``}}function tE(e){return{scope:PT(e),subject:FT(e),budget_key:{period_seconds:e.period_seconds},amount:e.amount}}function nE(e){return{scope:PT(e),subject:FT(e),budget_key:{period_seconds:e.period_seconds}}}function rE(e){return{scope:PT(e),subject:FT(e),period_seconds:e.period_seconds}}function iE(e){return vc(e)}function aE(e,t){let n=e||{},r=t||{};return`A budget for "`+((FT(n)||FT(r))+` `+pE({period_seconds:n.period_seconds||r.period_seconds,period_label:r.period_label}))+`" already exists. Saving will override the current `+iE(r.amount)+` limit with `+iE(n.amount)+`.`}function oE(e){let t=Number(e);return!Number.isFinite(t)||t<0?0:t}function sE(e,t){let n=oE(e);return Math.round((t?Math.min(n,1):n)*1e3)/10}function cE(e){return oE(e&&e.usage_ratio)}function lE(e){return sE(cE(e),!0)}function uE(e){return sE(e&&e.period_ratio,!0)}function dE(e){return sE(cE(e),!1).toFixed(1).replace(/\.0$/,``)+`%`}function fE(e){return uE(e).toFixed(1).replace(/\.0$/,``)+`%`}function pE(e){let t=Number(e&&e.period_seconds||0);switch(t){case 3600:return`Hourly`;case 86400:return`Daily`;case 604800:return`Weekly`;case 2592e3:return`Monthly`;default:{let n=String(e&&e.period_label||``).trim();return n?`Custom `+n:`Custom `+String(t||``)+`s`}}}function mE(e){switch(Number(e&&e.period_seconds||0)){case 3600:return`budget-period-label-hourly`;case 86400:return`budget-period-label-daily`;case 604800:return`budget-period-label-weekly`;case 2592e3:return`budget-period-label-monthly`;default:return`budget-period-label-custom`}}function hE(e){return mE(e).replace(`budget-period-label-`,`budget-bar-fill-period-`)}function gE(e){return mE(e).replace(`budget-period-label-`,`budget-bar-track-period-`)}function _E(e){switch(Number(e&&e.period_seconds||0)){case 3600:return Ja;case 86400:return Oo;case 604800:return La;case 2592e3:return Ra;default:return So}}function vE(e){let t=Math.max(0,Math.trunc(Number(e||0)));return t+` `+(t===1?`second`:`seconds`)}function yE(e){let t=Number(e&&e.period_seconds||0);switch(t){case 3600:return`1 hour`;case 86400:return`1 day`;case 604800:return`1 week`;case 2592e3:return`1 month`;default:return vE(t)}}function bE(e){return String(e&&e.source||``).trim()||`manual`}function xE(e){let t=bE(e).toLowerCase();return t===`manual`?`Created from the dashboard.`:t===`config`?`Loaded from configuration.`:`Budget source: `+t}function SE(e){let t=Number(e&&e.remaining);return Number.isFinite(t)?t<0?vc(Math.abs(t))+` over`:vc(t)+` remaining`:``}var X=new class{#e=A(M([]));get budgets(){return L(this.#e)}set budgets(e){j(this.#e,e,!0)}#t=A(!0);get budgetsAvailable(){return L(this.#t)}set budgetsAvailable(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}#r=A(``);get filter(){return L(this.#r)}set filter(e){j(this.#r,e,!0)}#i=A(`subject`);get sortBy(){return L(this.#i)}set sortBy(e){j(this.#i,e,!0)}#a=A(``);get error(){return L(this.#a)}set error(e){j(this.#a,e,!0)}#o=A(!1);get formOpen(){return L(this.#o)}set formOpen(e){j(this.#o,e,!0)}#s=A(!1);get formSubmitting(){return L(this.#s)}set formSubmitting(e){j(this.#s,e,!0)}#c=A(``);get formError(){return L(this.#c)}set formError(e){j(this.#c,e,!0)}#l=A(!1);get editing(){return L(this.#l)}set editing(e){j(this.#l,e,!0)}#u=A(M(jT()));get form(){return L(this.#u)}set form(e){j(this.#u,e,!0)}#d=A(!1);get overrideDialogOpen(){return L(this.#d)}set overrideDialogOpen(e){j(this.#d,e,!0)}#f=A(null);get overridePendingPayload(){return L(this.#f)}set overridePendingPayload(e){j(this.#f,e,!0)}#p=A(null);get overrideExistingBudget(){return L(this.#p)}set overrideExistingBudget(e){j(this.#p,e,!0)}#m=A(``);get resettingKey(){return L(this.#m)}set resettingKey(e){j(this.#m,e,!0)}#h=A(``);get deletingKey(){return L(this.#h)}set deletingKey(e){j(this.#h,e,!0)}#g=A(!1);get resetAllLoading(){return L(this.#g)}set resetAllLoading(e){j(this.#g,e,!0)}#_=null;managementEnabled(){return As.budgetsVisible()}filteredBudgets(){return $T(this.budgets,this.filter,this.sortBy)}async fetchBudgetsPage(){if(await As.ensureLoaded(),!this.managementEnabled()){this.budgets=[],this.budgetsAvailable=!1,this.error=``;return}return this.#_||=this.fetchBudgets().finally(()=>{this.#_=null}),this.#_}async fetchBudgets(){this.loading=!0,this.error=``;let e=await kT(`/admin/budgets`,{label:`budgets`,errorFallback:`Unable to load budgets.`,normalize:YT});if(this.loading=!1,e.status!==`stale`){if(e.status===`unavailable`){this.budgetsAvailable=!1,this.budgets=[];return}if(!e.result){this.budgets=[],this.error=e.error;return}if(this.budgetsAvailable=!0,e.status===`error`){this.error=e.error;return}this.budgets=e.items}}openForm(e){if(this.editing=!!e,this.formError=``,e){let t=Number(e.period_seconds||0);this.form={scope:PT(e),subject:FT(e),period:UT(t),period_seconds:t,amount:String(e.amount||``),source:String(e.source||`manual`)}}else this.form=jT();this.formOpen=!0}syncPeriodSeconds(){let e=HT(String(this.form.period||``).trim());e>0&&(this.form.period_seconds=e)}setFormSubject(e){this.form.subject=this.form.scope===`label`?String(e??``):JT(e)}syncScope(){BT(this.form)}closeForm(){this.closeOverrideDialog(),this.formOpen=!1,this.formSubmitting=!1,this.formError=``,this.editing=!1,this.form=jT()}async submitForm(){if(this.formSubmitting)return;let{payload:e,error:t}=eE(this.form);if(!e){this.formError=t;return}if(!this.editing){let t=GT(this.budgets,e);if(t){this.openOverrideDialog(t,e);return}}await this.saveBudgetPayload(e)}async saveBudgetPayload(e){if(this.formSubmitting||!e)return;this.formSubmitting=!0,this.formError=``;let t=await AT(`/admin/budgets`,`PUT`,tE(e),{label:`save budget`,errorFallback:`Unable to save budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.formSubmitting=!1,t.status!==`stale`){if(t.status===`unavailable`){this.budgetsAvailable=!1,this.formError=t.error;return}if(t.status===`error`){this.formError=t.error;return}this.closeForm(),Y.success(`Budget saved.`),this.fetchBudgets()}}openOverrideDialog(e,t){this.overrideExistingBudget=e||null,this.overridePendingPayload=t||null,this.overrideDialogOpen=!0}closeOverrideDialog(){this.overrideDialogOpen=!1,this.overridePendingPayload=null,this.overrideExistingBudget=null}async confirmOverride(){if(!this.overridePendingPayload){this.closeOverrideDialog();return}let e=this.overridePendingPayload;this.closeOverrideDialog(),await this.saveBudgetPayload(e)}async resetBudget(e){if(!e)return;let t=WT(e);if(this.resettingKey===t)return;let n=FT(e)+` `+pE(e);if(!confirm(`Reset budget "`+n+`"?`))return;this.resettingKey=t;let r=await AT(`/admin/budgets/reset-one`,`POST`,rE(e),{label:`reset budget`,errorFallback:`Unable to reset budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.resettingKey=``,r.status!==`stale`){if(r.status===`unavailable`){this.budgetsAvailable=!1,Y.error(r.error);return}if(r.status===`error`){Y.error(r.error);return}Y.success(`Budget reset.`),this.fetchBudgets()}}async deleteBudget(e){if(!e)return;let t=WT(e);if(this.deletingKey===t)return;let n=FT(e)+` `+pE(e);if(!confirm(`Delete budget "`+n+`"? This cannot be undone.`))return;this.deletingKey=t;let r=await AT(`/admin/budgets`,`DELETE`,nE(e),{label:`delete budget`,errorFallback:`Unable to delete budget.`,unavailableMessage:`Budget management is unavailable.`});if(this.deletingKey=``,r.status!==`stale`){if(r.status===`unavailable`){this.budgetsAvailable=!1,Y.error(r.error);return}if(r.status===`error`){Y.error(r.error);return}this.budgets=YT(r.result.data),Y.success(`Budget deleted.`)}}openResetDialog(){Ys.open({title:`Reset Budgets`,titleId:`budgetResetDialogTitle`,inputId:`budget-reset-confirmation`,requiredText:`reset`,confirmLabel:`Reset All Budgets`,icon:_o,dialogClass:`budget-reset-dialog`,onConfirm:()=>this.resetAllBudgets()})}async resetAllBudgets(){if(this.resetAllLoading)return;this.resetAllLoading=!0;let e=await AT(`/admin/budgets/reset`,`POST`,{confirmation:`reset`},{label:`reset budgets`,errorFallback:`Unable to reset budgets.`,unavailableStatuses:[]});if(this.resetAllLoading=!1,e.status!==`stale`){if(e.status!==`ok`){Ys.error=e.error;return}Ys.close(),Y.success(`Budgets reset.`),Xo.page===`budgets`&&this.fetchBudgets()}}},CE=z(` Edit`,1),wE=z(` `,1),TE=z(`
        Usage
        Period
        `),EE=z(`
        `);function DE(e,t){D(t,!0);let n=K(t,`budgets`,19,()=>[]);function r(e){if(!e)return``;let t=ys.formatTimestamp(e);return!t||t===`-`?``:t+` `+ys.effectiveTimeZoneLabel()}var i=EE();U(i,21,n,e=>WT(e),(e,t)=>{var n=TE(),i=N(n),a=N(i),o=N(a),s=N(o),c=e=>{q(e,{get icon(){return ko},class:`budget-scope-icon`})},l=k(()=>PT(L(t))===`label`);H(s,e=>{L(l)&&e(c)});var u=F(s);E(o);var d=F(o,2),f=N(d),p=N(f);{let e=k(()=>_E(L(t)));q(p,{get icon(){return L(e)},class:`budget-period-icon`})}var m=F(p,2),h=N(m,!0);E(m),E(f),E(d);var g=F(d,2),_=N(g),v=N(_),y=N(v,!0);E(v),E(_);var b=F(_,2),x=N(b);OT(x,{label:`Edit budget`,class:`budget-action-btn`,onclick:()=>X.openForm(L(t)),children:(e,t)=>{var n=CE();q(P(n),{get icon(){return fo},class:`budget-action-icon`}),He(2),B(e,n)},$$slots:{default:!0}});var S=F(x,2);{let e=k(()=>X.resettingKey===WT(L(t))?`Resetting budget`:`Reset budget`),n=k(()=>X.resettingKey===WT(L(t)));OT(S,{get label(){return L(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>X.resetBudget(L(t)),get disabled(){return L(n)},children:(e,n)=>{var r=wE(),i=P(r);q(i,{get icon(){return _o},class:`budget-action-icon`});var a=F(i,2),o=N(a,!0);E(a),I(e=>V(o,e),[()=>X.resettingKey===WT(L(t))?`Resetting`:`Reset`]),B(e,r)},$$slots:{default:!0}})}var C=F(S,2);{let e=k(()=>X.deletingKey===WT(L(t))?`Deleting budget`:`Delete budget`),n=k(()=>X.deletingKey===WT(L(t)));OT(C,{get label(){return L(e)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>X.deleteBudget(L(t)),get disabled(){return L(n)},children:(e,n)=>{var r=wE(),i=P(r);q(i,{get icon(){return jo},class:`budget-action-icon`});var a=F(i,2),o=N(a,!0);E(a),I(e=>V(o,e),[()=>X.deletingKey===WT(L(t))?`Deleting`:`Delete`]),B(e,r)},$$slots:{default:!0}})}E(b),E(g),E(a);var w=F(a,2),T=N(w),ee=N(T),te=F(N(ee),2),ne=N(te,!0);E(te),E(ee);var re=F(ee,2),ie=N(re);let ae;var oe=F(ie,2),se=N(oe),ce=N(se,!0);E(se);var le=F(se,2),ue=N(le,!0);E(le),E(oe);var de=F(oe,2),fe=N(de),pe=N(fe,!0);E(fe);var me=F(fe,2),he=N(me,!0);E(me),E(de),E(re),E(T);var ge=F(T,2),_e=N(ge),ve=F(N(_e),2),ye=N(ve,!0);E(ve),E(_e);var be=F(_e,2),xe=N(be),Se=F(xe,2),Ce=N(Se),we=N(Ce,!0);E(Ce);var Te=F(Ce,2),Ee=N(Te,!0);E(Te);var De=F(Te,2),Oe=N(De,!0);E(De),E(Se);var ke=F(Se,2),Ae=N(ke),je=N(Ae,!0);E(Ae);var Me=F(Ae,2),Ne=N(Me,!0);E(Me);var Pe=F(Me,2),Fe=N(Pe,!0);E(Pe),E(ke),E(be),E(ge),E(w),E(i),E(n),I((e,t,n,r,i,a,s,c,l,d,p,m,g,_,b,x,S,C,w,T,ee,te,oe,se,le,de,fe,me,ge,_e)=>{W(o,1,`budget-scope-value ${e??``}`,`svelte-1jm56wo`),Vi(o,t),G(o,`title`,n),V(u,` ${r??``}`),W(f,1,`budget-period-label ${i??``}`,`svelte-1jm56wo`),V(h,a),G(v,`title`,s),V(y,c),V(ne,l),G(re,`aria-valuenow`,d),G(re,`aria-label`,p),Vi(re,`--budget-progress: ${m??``}%`),ae=W(ie,1,`budget-bar-fill budget-bar-fill-usage`,null,ae,g),V(ce,_),V(ue,b),V(pe,x),V(he,S),V(ye,C),W(be,1,`budget-bar-track ${w??``}`,`svelte-1jm56wo`),G(be,`aria-valuenow`,T),Vi(be,`--budget-progress: ${ee??``}%`),W(xe,1,`budget-bar-fill budget-bar-fill-period ${te??``}`,`svelte-1jm56wo`),G(Ce,`title`,oe),V(we,se),V(Ee,le),G(De,`title`,de),V(Oe,fe),V(je,me),V(Ne,ge),V(Fe,_e)},[()=>LT(L(t)),()=>PT(L(t))===`label`?`--label-color: `+$y(FT(L(t))):void 0,()=>IT(L(t))+`: `+FT(L(t)),()=>FT(L(t)),()=>mE(L(t)),()=>pE(L(t)),()=>xE(L(t)),()=>bE(L(t)),()=>dE(L(t)),()=>lE(L(t)),()=>`Budget usage: `+vc(L(t).spent)+` of `+vc(L(t).amount)+`, `+SE(L(t)),()=>lE(L(t)),()=>({"budget-bar-fill-danger":cE(L(t))>=1}),()=>vc(L(t).spent)+` of `+vc(L(t).amount),()=>SE(L(t)),()=>vc(L(t).spent)+` of `+vc(L(t).amount),()=>SE(L(t)),()=>fE(L(t)),()=>gE(L(t)),()=>uE(L(t)),()=>uE(L(t)),()=>hE(L(t)),()=>r(L(t).period_start),()=>ys.formatTimestamp(L(t).period_start),()=>yE(L(t)),()=>r(L(t).period_end),()=>ys.formatTimestamp(L(t).period_end),()=>ys.formatTimestamp(L(t).period_start),()=>yE(L(t)),()=>ys.formatTimestamp(L(t).period_end)]),B(e,n)}),E(i),B(e,i),O()}var OE=z(`

        `,1),kE=z(``),AE=z(``),jE=z(`
        `);function ME(e,t){D(t,!0);let n=K(t,`open`,3,!1),r=K(t,`title`,3,``),i=K(t,`ariaLabel`,3,``),a=K(t,`error`,3,``),o=K(t,`submitting`,3,!1),s=K(t,`submitDisabled`,3,!1),c=K(t,`submitLabel`,3,`Save`),l=K(t,`submittingLabel`,3,`Saving...`),u=K(t,`submitIcon`,3,vo),d=K(t,`cancel`,3,!0),p=K(t,`dialogClass`,3,``),m=K(t,`novalidate`,3,!1),h=K(t,`canClose`,3,()=>!0);function g(){J.dialogOpen||h()()&&t.onclose?.()}Us(e,{get open(){return n()},variant:`editor`,onclose:g,children:(e,n)=>{var h=jE(),g=N(h),_=N(g),v=N(_),y=N(v),b=e=>{var n=Zr();hi(P(n),()=>t.header),B(e,n)},x=e=>{var n=OE(),i=P(n),a=N(i,!0);E(i);var o=F(i,2),s=e=>{var n=Zr();hi(P(n),()=>t.headerHint),B(e,n)};H(o,e=>{t.headerHint&&e(s)}),I(()=>V(a,r())),B(e,n)};H(y,e=>{t.header?e(b):e(x,-1)}),E(v);var S=F(v,2);{let e=k(()=>`Close `+(i()||r()).toLowerCase());zs(S,{get label(){return L(e)},onclick:()=>t.onclose?.()})}E(_);var C=F(_,2);hi(C,()=>t.children??f);var w=F(C,2),T=e=>{var t=kE(),n=N(t,!0);E(t),I(()=>V(n,a())),B(e,t)};H(w,e=>{a()&&e(T)});var ee=F(w,2),te=N(ee),ne=e=>{var n=AE();R(`click`,n,()=>t.onclose?.()),B(e,n)};H(te,e=>{d()&&e(ne)});var re=F(te,2),ie=e=>{var n=Zr();hi(P(n),()=>t.extraActions),B(e,n)};H(re,e=>{t.extraActions&&e(ie)});var ae=F(re,2),oe=N(ae);q(oe,{get icon(){return u()},class:`form-action-icon`});var se=F(oe,2),ce=N(se,!0);E(se),E(ae),E(ee),E(g),E(h),I(()=>{W(h,1,Pi([`model-editor`,p()])),G(h,`aria-label`,i()||r()),g.noValidate=m(),ae.disabled=o()||s(),V(ce,o()?l():c())}),Br(`submit`,g,e=>{e.preventDefault(),t.onsubmit?.()}),B(e,h)},$$slots:{default:!0}}),O()}Vr([`click`]);var NE=z(`
        `);function PE(e,t){let n=K(t,`label`,3,``);var r=NE(),i=N(r),a=N(i,!0);E(i),hi(F(i,2),()=>t.children??f),E(r),I(()=>{G(i,`for`,t.id),V(a,n())}),B(e,r)}var FE=z(``),IE=z(``),LE=z(``),RE=z(``),zE=z(``),BE=z(``),VE=z(`

        Editing a budget updates its limit only. Use Reset to start a new - budget period.

        `),HE=z(`
        `,1),UE=z(``),WE=z(` `,1);function GE(e,t){D(t,!0);function n(e){X.setFormSubject(e.target.value),e.target.value=X.form.subject}var r=WE(),i=P(r);{let e=k(()=>X.editing?`Edit Budget`:`Create Budget`);ME(i,{get open(){return X.formOpen},get title(){return L(e)},ariaLabel:`Budget editor`,get error(){return X.formError},get submitting(){return X.formSubmitting},submitLabel:`Save Budget`,dialogClass:`budget-editor`,canClose:()=>!X.overrideDialogOpen,onclose:()=>X.closeForm(),onsubmit:()=>X.submitForm(),children:(e,t)=>{var r=HE(),i=P(r),a=N(i);PE(a,{id:`budget-scope`,label:`Scope`,children:(e,t)=>{var n=IE();U(n,21,NT,e=>e.value,(e,t)=>{var n=FE(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(n),I(()=>n.disabled=X.editing),R(`change`,n,()=>X.syncScope()),Wi(n,()=>X.form.scope,e=>X.form.scope=e),B(e,n)},$$slots:{default:!0}});var o=F(a,2);{let e=k(()=>RT(X.form));PE(o,{id:`budget-subject`,get label(){return L(e)},children:(e,t)=>{var r=LE();ta(r),I(e=>{G(r,`placeholder`,e),na(r,X.form.subject),r.disabled=X.editing,G(r,`data-modal-autofocus`,!X.editing||void 0)},[()=>zT(X.form)]),R(`input`,r,n),B(e,r)},$$slots:{default:!0}})}var s=F(o,2);PE(s,{id:`budget-period`,label:`Period`,children:(e,t)=>{var n=RE();U(n,21,VT,e=>e.value,(e,t)=>{var n=FE(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(n),I(()=>n.disabled=X.editing),R(`change`,n,()=>X.syncPeriodSeconds()),Wi(n,()=>X.form.period,e=>X.form.period=e),B(e,n)},$$slots:{default:!0}});var c=F(s,2),l=e=>{PE(e,{id:`budget-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=zE();ta(n),I(()=>n.disabled=X.editing),ua(n,()=>X.form.period_seconds,e=>X.form.period_seconds=e),B(e,n)},$$slots:{default:!0}})};H(c,e=>{X.form.period===`custom`&&e(l)}),PE(F(c,2),{id:`budget-amount`,label:`Amount`,children:(e,t)=>{var n=BE();ta(n),I(()=>G(n,`data-modal-autofocus`,X.editing||void 0)),ua(n,()=>X.form.amount,e=>X.form.amount=e),B(e,n)},$$slots:{default:!0}}),E(i);var u=F(i,2),d=e=>{B(e,VE())};H(u,e=>{X.editing&&e(d)}),B(e,r)},$$slots:{default:!0}})}Us(F(i,2),{get open(){return X.overrideDialogOpen},variant:`auth`,onclose:()=>X.closeOverrideDialog(),children:(e,t)=>{var n=UE(),r=N(n);zs(F(N(r),2),{label:`Close budget override dialog`,onclick:()=>X.closeOverrideDialog(),class:`auth-dialog-close`,iconClass:``}),E(r);var i=F(r,2),a=N(i),o=N(a,!0);E(a);var s=F(a,2),c=N(s),l=F(c,2),u=N(l);q(u,{get icon(){return vo},class:`form-action-icon`});var d=F(u,2),f=N(d,!0);E(d),E(l),E(s),E(i),E(n),I(e=>{V(o,e),l.disabled=X.formSubmitting,V(f,X.formSubmitting?`Saving...`:`Override Budget`)},[()=>aE(X.overridePendingPayload,X.overrideExistingBudget)]),Br(`submit`,i,e=>{e.preventDefault(),X.confirmOverride()}),R(`click`,c,()=>X.closeOverrideDialog()),B(e,n)},$$slots:{default:!0}}),B(e,r),O()}Vr([`change`,`input`,`click`]);var KE=z(`

        Budgets

        `),qE=z(``),JE=z(`
        Budget management is unavailable.
        `),YE=z(``),XE=z(`
        `),ZE=z(`

        No budgets configured yet.

        `),QE=z(`

        No budgets match your filter.

        `),$E=z(`
        `);function eD(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`budgets`&&X.fetchBudgetsPage()});let n=k(()=>X.filteredBudgets());var r=$E(),i=N(r),a=N(i);iC(N(a),{copyId:`budgets-help-copy`,label:`budgets help`,title:e=>{B(e,KE())},help:e=>{He(),B(e,Xr(`Budgets are evaluated from tracked usage cost records for each user - path subtree. Enforcement runs only when Budget is enabled for the - active workflow.`))},$$slots:{title:!0,help:!0}}),E(a);var o=F(a,2),s=N(o),c=e=>{var t=qE();q(N(t),{get icon(){return mo},class:`form-action-icon`}),He(2),E(t),I(()=>t.disabled=X.formSubmitting),R(`click`,t,()=>X.openForm()),B(e,t)},l=k(()=>X.managementEnabled()&&X.budgetsAvailable&&!J.authError);H(s,e=>{L(l)&&e(c)}),E(o),E(i);var u=F(i,2);Kc(u,{});var d=F(u,2),f=e=>{B(e,JE())},p=k(()=>(!X.managementEnabled()||!X.budgetsAvailable)&&!J.authError);H(d,e=>{L(p)&&e(f)});var m=F(d,2),h=e=>{var t=YE(),n=N(t,!0);E(t),I(()=>V(n,X.error)),B(e,t)};H(m,e=>{X.error&&!J.authError&&e(h)});var g=F(m,2),_=e=>{ET(e,{label:`Loading budgets...`})};H(g,e=>{X.loading&&!J.authError&&e(_)});var v=F(g,2),y=e=>{var t=XE(),n=N(t);jw(N(n),{id:`budget-filter`,placeholder:`Filter by user path, label, or period...`,label:`Filter budgets by user path or period`,get value(){return X.filter},set value(e){X.filter=e}}),E(n);var r=F(n,2),i=F(N(r),2),a=N(i);a.value=a.__value=`subject`;var o=F(a);o.value=o.__value=`period`,E(i),E(r),E(t),Wi(i,()=>X.sortBy,e=>X.sortBy=e),B(e,t)};H(v,e=>{(X.budgets.length>0||X.filter)&&X.budgetsAvailable&&!J.authError&&!X.formOpen&&e(y)});var b=F(v,2);GE(b,{});var x=F(b,2),S=e=>{DE(e,{get budgets(){return L(n)}})};H(x,e=>{L(n).length>0&&X.budgetsAvailable&&!J.authError&&e(S)});var C=F(x,2),w=e=>{B(e,ZE())},T=k(()=>X.budgets.length===0&&!X.filter&&!X.loading&&!J.authError&&!X.error&&X.budgetsAvailable&&X.managementEnabled());H(C,e=>{L(T)&&e(w)});var ee=F(C,2),te=e=>{B(e,QE())},ne=k(()=>X.budgets.length>0&&L(n).length===0&&X.filter&&!X.loading&&!J.authError&&!X.error&&X.budgetsAvailable&&X.managementEnabled());H(ee,e=>{L(ne)&&e(te)}),E(r),B(e,r),O()}Vr([`click`]);function tD(){return{scope:`user_path`,subject:`/`,period:`minute`,period_seconds:60,max_requests:``,max_tokens:``,source:`manual`}}function nD(e){let t={user_path:{label:`User path`,chip:`user path`,fieldLabel:`User Path`,placeholder:`/team/alpha`},provider:{label:`Provider`,chip:`provider`,fieldLabel:`Provider Name`,placeholder:`openai`},model:{label:`Model`,chip:`model`,fieldLabel:`Model`,placeholder:`openai/gpt-4o`}};return t[e]||t.user_path}function rD(){return[`user_path`,`provider`,`model`].map(e=>({value:e,label:nD(e).label}))}function iD(e){return String(e&&e.scope||``).trim()||`user_path`}function aD(e){return String(e&&e.subject||``).trim()||String(e&&e.user_path||``)}function oD(e){return nD(iD(e)).chip}function sD(e){return nD(String(e&&e.scope||``)).fieldLabel}function cD(e){return nD(String(e&&e.scope||``)).placeholder}function lD(e){e.subject=String(e&&e.scope||``)===`user_path`?`/`:``}function uD(){return[{value:`minute`,label:`Per minute`},{value:`hour`,label:`Per hour`},{value:`day`,label:`Per day`},{value:`concurrent`,label:`Concurrent (in-flight)`},{value:`custom`,label:`Custom seconds`}]}function dD(e){switch(String(e||``).trim().toLowerCase()){case`minute`:return 60;case`hour`:return 3600;case`day`:return 86400;case`concurrent`:return 0;default:return-1}}function fD(e){switch(Number(e||0)){case 60:return`minute`;case 3600:return`hour`;case 86400:return`day`;case 0:return`concurrent`;default:return`custom`}}function pD(e){let t=String(e&&e.period||``).trim(),n=dD(t);n>=0&&(e.period_seconds=n),t===`concurrent`&&(e.max_tokens=``)}function mD(e){return iD(e)+`:`+aD(e)+`:`+String(e&&e.period_seconds||`0`)}function hD(e){return Number(e&&e.period_seconds||0)===0}function gD(e){return String(e&&e.period_label||``).trim()||fD(Number(e&&e.period_seconds||0))}function _D(e){return String(e&&e.source||``)===`config`?`config`:`manual`}function vD(e){return String(e&&e.source||``)===`config`}function yD(e){let t=Number(e);return Number.isFinite(t)?t.toLocaleString():`0`}function bD(e,t){let n=Number(e),r=Number(t);if(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)return 0;let i=Math.round(n/r*100);return Math.min(Math.max(i,0),100)}function xD(e,t){let n=String(t||``).trim().toLowerCase(),r=Array.isArray(e)?e.slice():[],i={user_path:0,provider:1,model:2};return r.sort((e,t)=>{let n=(i[iD(e)]||0)-(i[iD(t)]||0);if(n!==0)return n;let r=aD(e).localeCompare(aD(t));return r===0?Number(e.period_seconds||0)-Number(t.period_seconds||0):r}),n?r.filter(e=>{let t=aD(e).toLowerCase(),r=oD(e).toLowerCase(),i=gD(e).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)}):r}function SD(e){return!e||!Array.isArray(e.rate_limits)?[]:e.rate_limits}function CD(e,t,n){let r=String(t||``).trim();return r=e===`provider`||e===`model`?r.toLowerCase():`/`+r.split(`/`).map(e=>e.trim()).filter(Boolean).join(`/`),e+`:`+r+`:`+Number(n||0)}function wD(e,t){return e?CD(t.scope,t.subject,t.limit_key.period_seconds)!==CD(e.scope,e.subject,e.period_seconds):!1}function TD(e){let t=e||{},n=String(t.scope||`user_path`),r=String(t.subject||``).trim();if(n!==`user_path`&&!r)return{error:sD(t)+` is required.`};let i=String(t.period||``)===`concurrent`,a=t.period_seconds;if(a===``||a==null)return{error:`Period seconds is required.`};let o=Number(a);if(!Number.isInteger(o)||o<0||o===0&&!i)return{error:`Period seconds must be a positive integer (0 only for the concurrent period).`};let s=String(t.max_requests===void 0||t.max_requests===null?``:t.max_requests).trim(),c=String(t.max_tokens===void 0||t.max_tokens===null?``:t.max_tokens).trim();if(!s&&!c)return{error:`Set max requests, max tokens, or both.`};if(i&&c)return{error:`Token limits are not valid for the concurrent period.`};let l={scope:n,subject:r||`/`,limit_key:{period_seconds:o}};if(s){let e=Number(s);if(!Number.isInteger(e)||e<=0)return{error:`Max requests must be a positive integer.`};l.max_requests=e}if(c){let e=Number(c);if(!Number.isInteger(e)||e<=0)return{error:`Max tokens must be a positive integer.`};l.max_tokens=e}return{payload:l}}function ED(e,t,n){if(iD(e)!==`model`)return!1;let r=String(aD(e)).toLowerCase(),i=String(n||``).trim().toLowerCase();if(!i)return!1;if(r===i)return!0;let a=String(t||``).trim().toLowerCase();return a?r===a+`/`+i||i.startsWith(a+`/`)&&r===i.slice(a.length+1):!1}function DD(e,t){return iD(e)===`provider`&&String(aD(e)).toLowerCase()===String(t||``).trim().toLowerCase()}function OD(e){let t=e||{},n=String(t.model||``),r=String(t.provider||``);return!r||n.toLowerCase().startsWith(r+`/`)?n:r+`/`+n}function kD(e,t){let n=e||{},r=Array.isArray(t)?t:[],i=[];return n.kind===`model`&&i.push({key:`model`,title:`Model limits`,scope:`model`,subject:OD(n),hint:``,items:r.filter(e=>ED(e,n.provider,n.model))}),i.push({key:`provider`,title:`Provider limits (`+n.provider+`)`,scope:`provider`,subject:n.provider,hint:n.kind===`model`?`Shared by every model routed to this provider.`:``,items:r.filter(e=>DD(e,n.provider))}),i.push({key:`global`,title:`Global limits`,scope:`user_path`,subject:`/`,hint:`Root user-path rules throttle all traffic. Narrower user-path rules also apply, per consumer.`,items:r.filter(e=>iD(e)===`user_path`&&aD(e)===`/`)}),i}function AD(e){return hD(e)?bD(e.in_flight,e.max_requests):Math.max(bD(e.requests_used,e.max_requests),bD(e.tokens_used,e.max_tokens))}function jD(e){return`--rate-limit-pressure: `+AD(e)+`%`}function MD(e){let t=AD(e);return t>=100?`rate-limit-pressure-row rate-limit-pressure-full`:t>=75?`rate-limit-pressure-row rate-limit-pressure-high`:`rate-limit-pressure-row`}function ND(e){return(Array.isArray(e)?e:[]).some(e=>iD(e)===`user_path`&&aD(e)===`/`)}function PD(e,t,n){let r=Array.isArray(e)?e:[];return r.some(e=>ED(e,t,n))?`table-action-btn-active`:r.some(e=>DD(e,t))||ND(r)?`rate-limit-gauge-inherited`:``}function FD(e,t){let n=Array.isArray(e)?e:[];return n.some(e=>DD(e,t))?`table-action-btn-active`:ND(n)?`rate-limit-gauge-inherited`:``}function ID(e,t){let n=`Rate limits for `+e;return t===`table-action-btn-active`?n+` (direct limits configured)`:t?n+` (inherited limits apply)`:n}function LD(e){if(hD(e))return yD(e.in_flight)+` of `+yD(e.max_requests)+` in flight`;let t=[];return e.max_requests!==null&&e.max_requests!==void 0&&t.push(yD(e.requests_used)+`/`+yD(e.max_requests)+` req`),e.max_tokens!==null&&e.max_tokens!==void 0&&t.push(yD(e.tokens_used)+`/`+yD(e.max_tokens)+` tok`),t.join(` · `)}var Z=new class{#e=A(M([]));get rateLimits(){return L(this.#e)}set rateLimits(e){j(this.#e,e,!0)}#t=A(!0);get rateLimitsAvailable(){return L(this.#t)}set rateLimitsAvailable(e){j(this.#t,e,!0)}#n=A(!1);get rateLimitsLoading(){return L(this.#n)}set rateLimitsLoading(e){j(this.#n,e,!0)}rateLimitFetchPromise=null;#r=A(``);get rateLimitFilter(){return L(this.#r)}set rateLimitFilter(e){j(this.#r,e,!0)}#i=A(``);get rateLimitError(){return L(this.#i)}set rateLimitError(e){j(this.#i,e,!0)}#a=A(!1);get rateLimitFormOpen(){return L(this.#a)}set rateLimitFormOpen(e){j(this.#a,e,!0)}#o=A(!1);get rateLimitFormSubmitting(){return L(this.#o)}set rateLimitFormSubmitting(e){j(this.#o,e,!0)}#s=A(``);get rateLimitFormError(){return L(this.#s)}set rateLimitFormError(e){j(this.#s,e,!0)}#c=A(!1);get rateLimitEditing(){return L(this.#c)}set rateLimitEditing(e){j(this.#c,e,!0)}rateLimitEditingOriginal=null;rateLimitFormReturnToInspector=!1;#l=A(``);get rateLimitResettingKey(){return L(this.#l)}set rateLimitResettingKey(e){j(this.#l,e,!0)}#u=A(``);get rateLimitDeletingKey(){return L(this.#u)}set rateLimitDeletingKey(e){j(this.#u,e,!0)}#d=A(!1);get rateLimitInspectorOpen(){return L(this.#d)}set rateLimitInspectorOpen(e){j(this.#d,e,!0)}#f=A(M({kind:``,provider:``,model:``,title:``}));get rateLimitInspector(){return L(this.#f)}set rateLimitInspector(e){j(this.#f,e,!0)}#p=A(M(tD()));get rateLimitForm(){return L(this.#p)}set rateLimitForm(e){j(this.#p,e,!0)}rateLimitsEnabled(){return As.rateLimitsVisible()}defaultRateLimitForm(){return tD()}rateLimitScopeMeta(e){return nD(e)}rateLimitScopeOptions(){return rD()}rateLimitScope(e){return iD(e)}rateLimitSubject(e){return aD(e)}rateLimitScopeLabel(e){return oD(e)}rateLimitSubjectFieldLabel(){return sD(this.rateLimitForm)}rateLimitSubjectPlaceholder(){return cD(this.rateLimitForm)}syncRateLimitScope(){lD(this.rateLimitForm)}rateLimitPeriodOptions(){return uD()}rateLimitPeriodSeconds(e){return dD(e)}rateLimitPeriodFromSeconds(e){return fD(e)}syncRateLimitPeriodSeconds(){pD(this.rateLimitForm)}rateLimitKey(e){return mD(e)}rateLimitIsConcurrent(e){return hD(e)}rateLimitPeriodLabel(e){return gD(e)}rateLimitSourceLabel(e){return _D(e)}rateLimitIsReadOnly(e){return vD(e)}formatRateLimitNumber(e){return yD(e)}rateLimitUsagePercent(e,t){return bD(e,t)}filteredRateLimits(){return xD(this.rateLimits,this.rateLimitFilter)}normalizeRateLimitListPayload(e){return SD(e)}async fetchRateLimitsPage(){if(await As.ensureLoaded(),!this.rateLimitsEnabled()){this.rateLimits=[],this.rateLimitsAvailable=!1,this.rateLimitError=``;return}return this.rateLimitFetchPromise||=this.fetchRateLimits().finally(()=>{this.rateLimitFetchPromise=null}),this.rateLimitFetchPromise}async fetchRateLimits(){this.rateLimitsLoading=!0,this.rateLimitError=``;let e=await kT(`/admin/rate-limits`,{label:`rate limits`,errorFallback:`Unable to load rate limits.`,normalize:SD});if(this.rateLimitsLoading=!1,e.status!==`stale`){if(e.status===`unavailable`){this.rateLimitsAvailable=!1,this.rateLimits=[];return}if(!e.result){this.rateLimits=[],this.rateLimitError=e.error;return}if(this.rateLimitsAvailable=!0,e.status===`error`){this.rateLimitError=e.error;return}this.rateLimits=e.items}}openRateLimitForm(e){if(this.rateLimitEditing=!!e,this.rateLimitFormError=``,e){let t=Number(e.period_seconds||0);this.rateLimitEditingOriginal={scope:iD(e),subject:aD(e),period_seconds:t},this.rateLimitForm={scope:iD(e),subject:aD(e),period:fD(t),period_seconds:t,max_requests:e.max_requests===null||e.max_requests===void 0?``:String(e.max_requests),max_tokens:e.max_tokens===null||e.max_tokens===void 0?``:String(e.max_tokens),source:String(e.source||`manual`)}}else this.rateLimitEditingOriginal=null,this.rateLimitForm=tD();this.rateLimitFormOpen=!0}closeRateLimitForm(){this.rateLimitFormOpen=!1,this.rateLimitFormSubmitting=!1,this.rateLimitFormError=``,this.rateLimitEditing=!1,this.rateLimitEditingOriginal=null,this.rateLimitForm=tD(),this.rateLimitFormReturnToInspector&&(this.rateLimitFormReturnToInspector=!1,this.rateLimitInspectorOpen=!0)}rateLimitNormalizedIdentity(e,t,n){return CD(e,t,n)}rateLimitIdentityMoved(e){return wD(this.rateLimitEditingOriginal,e)}setRateLimitFormSubject(e){this.rateLimitForm.subject=String(e||``)}rateLimitFormPayload(){return TD(this.rateLimitForm)}async submitRateLimitForm(){if(this.rateLimitFormSubmitting)return;let{payload:e,error:t}=this.rateLimitFormPayload();if(t){this.rateLimitFormError=t;return}let n=this.rateLimitIdentityMoved(e),r=this.rateLimitEditingOriginal;this.rateLimitFormSubmitting=!0,this.rateLimitFormError=``;try{let t=await AT(`/admin/rate-limits`,`PUT`,e,{label:`save rate limit`,errorFallback:`Unable to save rate limit.`,unavailableStatuses:[]});if(t.status===`stale`)return;if(t.status!==`ok`){this.rateLimitFormError=t.error;return}if(this.rateLimits=SD(t.result.data),n&&!await this.deleteMovedRateLimitOriginal(r))return;this.closeRateLimitForm(),Y.success(n?`Rate limit moved; live counters restarted.`:`Rate limit saved.`)}finally{this.rateLimitFormSubmitting=!1}}async deleteMovedRateLimitOriginal(e){let t=await AT(`/admin/rate-limits`,`DELETE`,{scope:e.scope,subject:e.subject,limit_key:{period_seconds:Number(e.period_seconds||0)}},{label:`remove the moved rate limit`,errorFallback:`The new rule was saved, but the previous one could not be removed. Delete it manually.`,unavailableStatuses:[]});return t.status===`stale`?!1:t.status===`ok`?(this.rateLimits=SD(t.result.data),!0):(this.rateLimitFormError=t.error,!1)}async deleteRateLimit(e){let t=mD(e);if(this.rateLimitDeletingKey===t)return;this.rateLimitDeletingKey=t;let n=await AT(`/admin/rate-limits`,`DELETE`,{scope:iD(e),subject:aD(e),limit_key:{period_seconds:Number(e.period_seconds||0)}},{label:`delete rate limit`,errorFallback:`Unable to delete rate limit.`,unavailableStatuses:[]});if(this.rateLimitDeletingKey=``,n.status!==`stale`){if(n.status!==`ok`){Y.error(n.error);return}this.rateLimits=SD(n.result.data),Y.success(`Rate limit deleted.`)}}async resetRateLimit(e){let t=mD(e);if(this.rateLimitResettingKey===t)return;this.rateLimitResettingKey=t;let n=await AT(`/admin/rate-limits/reset-one`,`POST`,{scope:iD(e),subject:aD(e),period_seconds:Number(e.period_seconds||0)},{label:`reset rate limit`,errorFallback:`Unable to reset rate limit.`,unavailableStatuses:[]});if(this.rateLimitResettingKey=``,n.status!==`stale`){if(n.status!==`ok`){Y.error(n.error);return}this.rateLimits=SD(n.result.data),Y.success(`Rate limit counters reset.`)}}rateLimitInspectorModelID(e){return String(e&&e.model&&e.model.id||``).trim()}openRateLimitInspectorForModel(e){let t=this.rateLimitInspectorModelID(e),n=String(e&&e.provider_name||``).trim().toLowerCase();this.rateLimitInspector={kind:`model`,provider:n,model:t,title:String(e&&e.display_name||t)},this.showRateLimitInspector()}openRateLimitInspectorForProvider(e){let t=String(e&&e.provider_name||``).trim().toLowerCase();this.rateLimitInspector={kind:`provider`,provider:t,model:``,title:String(e&&e.display_name||t)},this.showRateLimitInspector()}showRateLimitInspector(){this.rateLimitInspectorOpen=!0,this.fetchRateLimitsPage()}closeRateLimitInspector(){this.rateLimitInspectorOpen=!1}rateLimitRuleMatchesModel(e,t,n){return ED(e,t,n)}rateLimitRuleMatchesProvider(e,t){return DD(e,t)}rateLimitInspectorQualifiedModel(){return OD(this.rateLimitInspector)}rateLimitInspectorSections(){return kD(this.rateLimitInspector,this.rateLimits)}rateLimitPressurePercent(e){return AD(e)}rateLimitPressureStyle(e){return jD(e)}rateLimitPressureClass(e){return MD(e)}rateLimitGaugeCache={rules:null,states:{}};rateLimitGaugeMemo(e,t){this.rateLimitGaugeCache.rules!==this.rateLimits&&(this.rateLimitGaugeCache={rules:this.rateLimits,states:{}});let n=this.rateLimitGaugeCache.states;return e in n||(n[e]=t()),n[e]}rateLimitGaugeClassForModel(e){let t=this.rateLimitInspectorModelID(e),n=String(e&&e.provider_name||``).trim().toLowerCase(),r=this.rateLimits;return this.rateLimitGaugeMemo(`model:`+n+`/`+t,()=>PD(r,n,t))}rateLimitGaugeClassForProvider(e){let t=String(e&&e.provider_name||``).trim().toLowerCase(),n=this.rateLimits;return this.rateLimitGaugeMemo(`provider:`+t,()=>FD(n,t))}hasGlobalRateLimits(){let e=this.rateLimits;return this.rateLimitGaugeMemo(`global`,()=>ND(e))}rateLimitGaugeTitle(e,t){return ID(e,t)}rateLimitInspectorSummary(e){return LD(e)}openRateLimitFormFromInspector(e,t,n){this.rateLimitInspectorOpen=!1,this.rateLimitFormReturnToInspector=!0,this.openRateLimitForm(n||void 0),n||(this.rateLimitForm.scope=e,this.rateLimitForm.subject=t)}},RD=z(``),zD=z(``),BD=z(``),VD=z(``),HD=z(``),UD=z(``),WD=z(``),GD=z(`

        Scope, subject, and period identify the rule: changing any of them - moves the rule to a new key and restarts its live counters.

        `),KD=z(`

        A user path rule limits the whole subtree; provider and model rules cap - all traffic routed there and make load balancing skip the target while - it is saturated. One shared counter per rule. Leave a field empty to - skip that limit. Token limits require usage tracking.

        `,1);function qD(e,t){D(t,!0);{let t=k(()=>Z.rateLimitEditing?`Edit Rate Limit`:`Create Rate Limit`);ME(e,{get open(){return Z.rateLimitFormOpen},get title(){return L(t)},ariaLabel:`Rate limit editor`,get error(){return Z.rateLimitFormError},get submitting(){return Z.rateLimitFormSubmitting},submitLabel:`Save Rate Limit`,dialogClass:`budget-editor`,novalidate:!0,onclose:()=>Z.closeRateLimitForm(),onsubmit:()=>Z.submitRateLimitForm(),children:(e,t)=>{var n=KD(),r=P(n),i=N(r);PE(i,{id:`rate-limit-scope`,label:`Scope`,children:(e,t)=>{var n=zD();U(n,21,()=>Z.rateLimitScopeOptions(),e=>e.value,(e,t)=>{var n=RD(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(n),R(`change`,n,()=>Z.syncRateLimitScope()),Wi(n,()=>Z.rateLimitForm.scope,e=>Z.rateLimitForm.scope=e),B(e,n)},$$slots:{default:!0}});var a=F(i,2);{let e=k(()=>Z.rateLimitSubjectFieldLabel());PE(a,{id:`rate-limit-subject`,get label(){return L(e)},children:(e,t)=>{var n=BD();ta(n),I(e=>{G(n,`placeholder`,e),G(n,`data-modal-autofocus`,!Z.rateLimitEditing||void 0),na(n,Z.rateLimitForm.subject)},[()=>Z.rateLimitSubjectPlaceholder()]),R(`input`,n,e=>Z.setRateLimitFormSubject(e.currentTarget.value)),B(e,n)},$$slots:{default:!0}})}var o=F(a,2);PE(o,{id:`rate-limit-period`,label:`Period`,children:(e,t)=>{var n=VD();U(n,21,()=>Z.rateLimitPeriodOptions(),e=>e.value,(e,t)=>{var n=RD(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(n),R(`change`,n,()=>Z.syncRateLimitPeriodSeconds()),Wi(n,()=>Z.rateLimitForm.period,e=>Z.rateLimitForm.period=e),B(e,n)},$$slots:{default:!0}});var s=F(o,2),c=e=>{PE(e,{id:`rate-limit-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=HD();ta(n),ua(n,()=>Z.rateLimitForm.period_seconds,e=>Z.rateLimitForm.period_seconds=e),B(e,n)},$$slots:{default:!0}})};H(s,e=>{Z.rateLimitForm.period===`custom`&&e(c)});var l=F(s,2);{let e=k(()=>Z.rateLimitForm.period===`concurrent`?`Max In-Flight Requests`:`Max Requests`);PE(l,{id:`rate-limit-max-requests`,get label(){return L(e)},children:(e,t)=>{var n=UD();ta(n),I(()=>G(n,`data-modal-autofocus`,Z.rateLimitEditing?!0:void 0)),ua(n,()=>Z.rateLimitForm.max_requests,e=>Z.rateLimitForm.max_requests=e),B(e,n)},$$slots:{default:!0}})}var u=F(l,2),d=e=>{PE(e,{id:`rate-limit-max-tokens`,label:`Max Tokens`,children:(e,t)=>{var n=WD();ta(n),ua(n,()=>Z.rateLimitForm.max_tokens,e=>Z.rateLimitForm.max_tokens=e),B(e,n)},$$slots:{default:!0}})};H(u,e=>{Z.rateLimitForm.period!==`concurrent`&&e(d)}),E(r);var f=F(r,4),p=e=>{B(e,GD())};H(f,e=>{Z.rateLimitEditing&&e(p)}),B(e,n)},$$slots:{default:!0}})}O()}Vr([`change`,`input`]);var JD=z(` `),YD=z(` Edit`,1),XD=z(` `,1),ZD=z(`
        In-flight
        `),QD=z(`
        Requests
        `),$D=z(`
        Tokens
        `),eO=z(`
        `),tO=z(`
        `);function nO(e,t){D(t,!0);var n=tO();U(n,21,()=>t.rules,e=>Z.rateLimitKey(e),(e,t)=>{var n=eO(),r=N(n),i=N(r),a=N(i),o=N(a,!0);E(a);var s=F(a,2),c=N(s),l=e=>{var n=JD(),r=N(n);{let e=k(()=>Z.rateLimitScope(L(t))===`provider`?xo:Fa);q(r,{get icon(){return L(e)},class:`budget-period-icon`})}var i=F(r,2),a=N(i,!0);E(i),E(n),I((e,t)=>{G(n,`title`,e),V(a,t)},[()=>`Rule scope: `+Z.rateLimitScopeLabel(L(t)),()=>Z.rateLimitScopeLabel(L(t))]),B(e,n)},u=k(()=>Z.rateLimitScope(L(t))!==`user_path`);H(c,e=>{L(u)&&e(l)});var d=F(c,2),f=N(d);{let e=k(()=>Z.rateLimitIsConcurrent(L(t))?Aa:Ao);q(f,{get icon(){return L(e)},class:`budget-period-icon`})}var p=F(f,2),m=N(p,!0);E(p),E(d),E(s);var h=F(s,2),g=N(h),_=N(g),v=N(_,!0);E(_),E(g);var y=F(g,2),b=N(y),x=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitForm(L(t)),children:(e,t)=>{var n=YD();q(P(n),{get icon(){return fo},class:`budget-action-icon`}),He(2),B(e,n)},$$slots:{default:!0}})},S=k(()=>!Z.rateLimitIsReadOnly(L(t)));H(b,e=>{L(S)&&e(x)});var C=F(b,2);{let e=k(()=>Z.rateLimitResettingKey===Z.rateLimitKey(L(t))?`Resetting counters`:`Reset counters`),n=k(()=>Z.rateLimitResettingKey===Z.rateLimitKey(L(t)));OT(C,{get label(){return L(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>Z.resetRateLimit(L(t)),get disabled(){return L(n)},children:(e,n)=>{var r=XD(),i=P(r);q(i,{get icon(){return _o},class:`budget-action-icon`});var a=F(i,2),o=N(a,!0);E(a),I(e=>V(o,e),[()=>Z.rateLimitResettingKey===Z.rateLimitKey(L(t))?`Resetting`:`Reset`]),B(e,r)},$$slots:{default:!0}})}var w=F(C,2),T=e=>{{let n=k(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(L(t))?`Deleting rate limit`:`Delete rate limit`),r=k(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(L(t)));OT(e,{get label(){return L(n)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>Z.deleteRateLimit(L(t)),get disabled(){return L(r)},children:(e,n)=>{var r=XD(),i=P(r);q(i,{get icon(){return jo},class:`budget-action-icon`});var a=F(i,2),o=N(a,!0);E(a),I(e=>V(o,e),[()=>Z.rateLimitDeletingKey===Z.rateLimitKey(L(t))?`Deleting`:`Delete`]),B(e,r)},$$slots:{default:!0}})}},ee=k(()=>!Z.rateLimitIsReadOnly(L(t)));H(w,e=>{L(ee)&&e(T)}),E(y),E(h),E(i);var te=F(i,2),ne=N(te),re=e=>{var n=ZD(),r=N(n),i=F(N(r),2),a=N(i,!0);E(i),E(r);var o=F(r,2),s=N(o);let c;var l=F(s,2),u=N(l),d=N(u,!0);E(u),E(l),E(o),E(n),I((e,t,n,r,i,l)=>{V(a,e),G(o,`aria-valuenow`,t),G(o,`aria-label`,n),Vi(o,r),c=W(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),V(d,l)},[()=>Z.rateLimitUsagePercent(L(t).in_flight,L(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(L(t).in_flight,L(t).max_requests),()=>`In-flight requests: `+Z.formatRateLimitNumber(L(t).in_flight)+` of `+Z.formatRateLimitNumber(L(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(L(t).in_flight,L(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(L(t).in_flight,L(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(L(t).in_flight)+` of `+Z.formatRateLimitNumber(L(t).max_requests)+` in flight`]),B(e,n)},ie=k(()=>Z.rateLimitIsConcurrent(L(t)));H(ne,e=>{L(ie)&&e(re)});var ae=F(ne,2),oe=e=>{var n=QD(),r=N(n),i=F(N(r),2),a=N(i,!0);E(i),E(r);var o=F(r,2),s=N(o);let c;var l=F(s,2),u=N(l),d=N(u,!0);E(u);var f=F(u,2),p=N(f,!0);E(f),E(l),E(o),E(n),I((e,t,n,r,i,l,u)=>{V(a,e),G(o,`aria-valuenow`,t),G(o,`aria-label`,n),Vi(o,r),c=W(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),V(d,l),V(p,u)},[()=>Z.rateLimitUsagePercent(L(t).requests_used,L(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(L(t).requests_used,L(t).max_requests),()=>`Requests used: `+Z.formatRateLimitNumber(L(t).requests_used)+` of `+Z.formatRateLimitNumber(L(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(L(t).requests_used,L(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(L(t).requests_used,L(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(L(t).requests_used)+` of `+Z.formatRateLimitNumber(L(t).max_requests)+` requests`,()=>Z.formatRateLimitNumber(L(t).requests_remaining)+` left`]),B(e,n)},se=k(()=>!Z.rateLimitIsConcurrent(L(t))&&L(t).max_requests);H(ae,e=>{L(se)&&e(oe)});var ce=F(ae,2),le=e=>{var n=$D(),r=N(n),i=F(N(r),2),a=N(i,!0);E(i),E(r);var o=F(r,2),s=N(o);let c;var l=F(s,2),u=N(l),d=N(u,!0);E(u);var f=F(u,2),p=N(f,!0);E(f),E(l),E(o),E(n),I((e,t,n,r,i,l,u)=>{V(a,e),G(o,`aria-valuenow`,t),G(o,`aria-label`,n),Vi(o,r),c=W(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),V(d,l),V(p,u)},[()=>Z.rateLimitUsagePercent(L(t).tokens_used,L(t).max_tokens)+`%`,()=>Z.rateLimitUsagePercent(L(t).tokens_used,L(t).max_tokens),()=>`Tokens used: `+Z.formatRateLimitNumber(L(t).tokens_used)+` of `+Z.formatRateLimitNumber(L(t).max_tokens),()=>`--budget-progress: `+Z.rateLimitUsagePercent(L(t).tokens_used,L(t).max_tokens)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(L(t).tokens_used,L(t).max_tokens)>=100}),()=>Z.formatRateLimitNumber(L(t).tokens_used)+` of `+Z.formatRateLimitNumber(L(t).max_tokens)+` tokens`,()=>Z.formatRateLimitNumber(L(t).tokens_remaining)+` left`]),B(e,n)},ue=k(()=>!Z.rateLimitIsConcurrent(L(t))&&L(t).max_tokens);H(ce,e=>{L(ue)&&e(le)}),E(te),E(r),E(n),I((e,t,n,r,i)=>{G(a,`title`,e),V(o,t),V(m,n),G(_,`title`,r),V(v,i)},[()=>Z.rateLimitScopeLabel(L(t))+`: `+Z.rateLimitSubject(L(t)),()=>Z.rateLimitSubject(L(t)),()=>Z.rateLimitPeriodLabel(L(t)),()=>Z.rateLimitIsReadOnly(L(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(L(t))]),B(e,n)}),E(n),B(e,n),O()}var rO=z(`

        Rate Limits

        `),iO=z(``),aO=z(`
        Rate limit management is unavailable.
        `),oO=z(``),sO=z(`
        `),cO=z(`

        No rate limits configured yet.

        `),lO=z(`

        No rate limits match your filter.

        `),uO=z(`
        `);function dO(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`rate-limits`&&Z.fetchRateLimitsPage()});let n=k(()=>Z.filteredRateLimits());var r=uO(),i=N(r),a=N(i);iC(N(a),{copyId:`rate-limits-help-copy`,label:`rate limits help`,text:`Rate limits cap requests, tokens, and in-flight concurrency for a user path subtree, a provider, or a model. Consumer (user path) breaches return 429 with Retry-After and x-ratelimit-* headers; saturated providers and models are skipped by load balancing and failover while capacity exists elsewhere. Counters are per gateway instance and reset on restart; token limits need usage tracking.`,title:e=>{B(e,rO())},$$slots:{title:!0}}),E(a);var o=F(a,2),s=N(o),c=e=>{var t=iO();q(N(t),{get icon(){return mo},class:`form-action-icon`}),He(2),E(t),I(()=>t.disabled=Z.rateLimitFormSubmitting),R(`click`,t,()=>Z.openRateLimitForm()),B(e,t)},l=k(()=>Z.rateLimitsEnabled()&&Z.rateLimitsAvailable&&!J.authError);H(s,e=>{L(l)&&e(c)}),E(o),E(i);var u=F(i,2);Kc(u,{});var d=F(u,2),f=e=>{B(e,aO())},p=k(()=>(!Z.rateLimitsEnabled()||!Z.rateLimitsAvailable)&&!J.authError);H(d,e=>{L(p)&&e(f)});var m=F(d,2),h=e=>{var t=oO(),n=N(t,!0);E(t),I(()=>V(n,Z.rateLimitError)),B(e,t)};H(m,e=>{Z.rateLimitError&&!J.authError&&e(h)});var g=F(m,2),_=e=>{ET(e,{label:`Loading rate limits...`})};H(g,e=>{Z.rateLimitsLoading&&!J.authError&&e(_)});var v=F(g,2),y=e=>{var t=sO(),n=N(t);jw(N(n),{id:`rate-limit-filter`,placeholder:`Filter by subject, scope, or period...`,label:`Filter rate limits by subject, scope, or period`,get value(){return Z.rateLimitFilter},set value(e){Z.rateLimitFilter=e}}),E(n),E(t),B(e,t)};H(v,e=>{(Z.rateLimits.length>0||Z.rateLimitFilter)&&Z.rateLimitsAvailable&&!J.authError&&!Z.rateLimitFormOpen&&e(y)});var b=F(v,2);qD(b,{});var x=F(b,2),S=e=>{nO(e,{get rules(){return L(n)}})};H(x,e=>{L(n).length>0&&Z.rateLimitsAvailable&&!J.authError&&e(S)});var C=F(x,2),w=e=>{B(e,cO())},T=k(()=>Z.rateLimits.length===0&&!Z.rateLimitFilter&&!Z.rateLimitsLoading&&!J.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());H(C,e=>{L(T)&&e(w)});var ee=F(C,2),te=e=>{B(e,lO())},ne=k(()=>Z.rateLimits.length>0&&L(n).length===0&&Z.rateLimitFilter&&!Z.rateLimitsLoading&&!J.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());H(ee,e=>{L(ne)&&e(te)}),E(r),B(e,r),O()}Vr([`click`]);function fO(e){return String(e||``).trim().toLowerCase()}function pO(e){if(!e)return``;let t=String(e.selector||``).trim();if(t)return t;if(!e.model||!e.model.id)return``;let n=String(e.model.id||``).trim(),r=String(e.provider_name||``).trim();if(r)return r+`/`+n;let i=String(e.provider_type||``).trim();return!i||n.includes(`/`)?n:i+`/`+n}function mO(e,t,n,r){let i=new Set,a=String(e||``).trim().toLowerCase(),o=String(t||``).trim().toLowerCase(),s=String(n||``).trim().toLowerCase(),c=String(r||``).trim().toLowerCase();if(c&&i.add(c),!a)return i;i.add(a),s&&i.add(s+`/`+a),o&&!a.includes(`/`)&&i.add(o+`/`+a);let l=a.split(`/`);return l.length===2&&l[1]&&i.add(l[1]),i}function hO(e){return mO(e&&e.model?e.model.id:``,e?e.provider_type:``,e?e.provider_name:``,e?e.selector:``)}function gO(e){let t=new Set,n=String(e.resolved_model||``).trim().toLowerCase(),r=String(e.target_model||``).trim().toLowerCase(),i=String(e.target_provider||``).trim().toLowerCase();if(n){t.add(n);let e=n.split(`/`);e.length===2&&e[1]&&t.add(e[1])}if(r){t.add(r);let e=r.split(`/`);e.length===2&&e[1]&&t.add(e[1])}return r&&i&&t.add(i+`/`+r),t}function _O(e){if(!e)return``;let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n||n===t||n.startsWith(t+`/`)?n:t+`/`+n}function vO(e){if(e===``||e==null)return null;let t=Number(e);return!Number.isFinite(t)||t<=0?null:t}function yO(e,t){let n={model:e},r=vO(t);return r!==null&&(n.weight=r),n}function bO(e){let t=Array.isArray(e)?e:[],n=[];for(let e of t){let t=String(e&&e.model||``).trim();t&&n.push(yO(t,e&&e.weight))}return n}function xO(e){switch(String(e||``).toLowerCase()){case`cost`:return`lowest cost`;case`round_robin`:case``:return`round robin`;default:return e}}var SO={round_robin:`Round-robin (rotate across targets; honors weights)`,cost:`Lowest cost (cheapest target per request)`,adaptive:`Adaptive (target chosen by the registered routing extension)`};function CO(e,t){let n=Array.isArray(e)?[...e]:[],r=String(t||``).trim().toLowerCase();return r&&!n.includes(r)&&n.push(r),n.map(e=>({value:e,label:SO[e]||e}))}function wO(e){let t=Array.isArray(e.targets)?e.targets:[],n=t.length>0?t[0]:{},r=t.map(e=>{let t={provider:e.provider||``,model:e.model||``};return e.weight&&(t.weight=e.weight),t});return{name:e.source,target_provider:n.provider||``,target_model:n.model||``,targets:r,strategy:e.strategy||``,session_affinity:e.session_affinity!==!1,description:e.description||``,enabled:e.enabled!==!1,managed:!!e.managed,valid:!!e.valid,resolved_model:e.resolved_model||``,provider_type:e.provider_type||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[]}}function TO(e){let t=Array.isArray(e)?e:[],n=[],r=[];for(let e of t)!e||typeof e!=`object`||(e.kind===`redirect`?n.push(wO(e)):e.kind===`policy`&&r.push({selector:e.source,provider_name:e.provider_name||``,model:e.model||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[],description:e.description||``,enabled:e.enabled!==!1,managed:!!e.managed,scope_kind:e.scope_kind||``}));return{aliases:n,policies:r}}function EO(e){if(!e)return`—`;let t=Array.isArray(e.targets)?e.targets:[];return t.length>1?t.length+` targets · `+xO(e.strategy):e.resolved_model?e.resolved_model:e.target_provider?e.target_provider+`/`+e.target_model:e.target_model||`—`}function DO(e){return e?e.enabled===!1?`is-disabled`:e.valid?`is-valid`:`is-invalid`:`is-invalid`}function OO(e){return e?e.enabled===!1?`Disabled`:e.valid?`Active`:`Invalid`:`Invalid`}function kO(e){return Array.isArray(e)&&e.length>0&&e.indexOf(`/`)===-1}function AO(e,t){return!t||!e?``:e.effective_enabled===!1?`is-disabled`:kO(e.user_paths)?`is-restricted`:`is-enabled`}function jO(e){if(!e)return``;let t=[];e.effective_enabled===!1&&t.push(e.default_enabled===!1?`Disabled by default`:`Disabled`);let n=Array.isArray(e.user_paths)?e.user_paths:[];return n.length>0&&t.push(`Allowed for `+n.join(`, `)),t.join(` · `)}function MO({models:e,aliases:t,virtualModelsAvailable:n,activeCategory:r}){let i=Array.isArray(e)?e:[],a=Array.isArray(t)?t:[],o=new Map;if(n)for(let e of a){let t=fO(e&&e.name);!t||e.enabled===!1||!e.valid||o.set(t,e)}let s=new Map,c=i.map(e=>{let t=pO(e),n=null;for(let t of hO(e))s.has(t)||s.set(t,e),!n&&o.has(t)&&(n=o.get(t));let r=e&&e.access?e.access:null;return{key:`model:`+t,display_name:t,secondary_name:``,provider_name:e.provider_name||``,provider_type:e.provider_type||``,model:e.model,selector:e.selector||``,is_alias:!1,alias:null,access:r,masking_alias:n,has_virtual_model:!!(n||r&&r.override),alias_state_class:``,alias_state_text:``}});if(!n)return c;for(let e of a){let t=s.get(fO(e&&e.name));if(e&&e.enabled!==!1&&e.valid&&t)continue;let n=null;for(let t of gO(e))if(n=s.get(t)||null,n)break;!n&&r&&r!==`all`||c.push({key:`alias:`+e.name,display_name:e.name,secondary_name:EO(e),provider_name:n&&n.provider_name||``,provider_type:n?n.provider_type||e.provider_type||``:e.provider_type||``,model:n?n.model:{id:e.name,object:`model`},selector:``,is_alias:!0,alias:e,access:null,masking_alias:null,source_model_exists:!!t,has_virtual_model:!0,alias_state_class:DO(e),alias_state_text:OO(e)})}return c.sort((e,t)=>e.is_alias===t.is_alias?String(e.display_name||``).localeCompare(String(t.display_name||``)):e.is_alias?-1:1)}function NO(e,t){if(!t)return e;let n=String(t).toLowerCase();return e.filter(e=>[e.display_name,e.secondary_name,e.provider_name,e.provider_type,e.model&&e.model.owned_by,e.alias&&e.alias.description,e.alias&&e.alias_state_text,e.model&&e.model.metadata&&e.model.metadata.modes?e.model.metadata.modes.join(`,`):``,e.model&&e.model.metadata&&e.model.metadata.categories?e.model.metadata.categories.join(`,`):``].some(e=>String(e||``).toLowerCase().includes(n)))}function PO(e,t){return String(e||``).trim()||String(t||``).trim()||`Unassigned`}function FO(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return!r||r===n?``:r}function IO(e){let t=String(e||``).trim();return t?t+`/`:``}function LO(e){let t=Array.isArray(e)?e:[],n=t.filter(e=>e&&!e.is_alias).length,r=t.filter(e=>e&&e.is_alias).length,i=[];return n>0&&i.push(n+(n===1?` model`:` models`)),r>0&&i.push(r+(r===1?` alias`:` aliases`)),i.join(` · `)}function RO(e,t,n){let r=String(t||``).trim(),i=String(n||``).trim();for(let t of Array.isArray(e)?e:[]){let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim();if(!(r&&e!==r)&&!(!r&&i&&n!==i)&&t&&t.access)return t.access.default_enabled!==!1}return!0}function zO(e){for(let t of Array.isArray(e)?e:[])if(t&&t.access)return t.access.default_enabled!==!1;return!0}function BO(e,t){let n=String(t||``).trim();if(!n)return null;for(let t of Array.isArray(e)?e:[])if(String(t&&t.selector||``).trim()===n)return t;return null}function VO(e,t,n,r){let i=IO(t),a=r&&r.get(`/`)||null,o=i&&r&&r.get(i)||null,s=RO(e,t,n),c=o||a,l=c&&Array.isArray(c.user_paths)?Array.from(new Set(c.user_paths)).sort():[];return{selector:i,default_enabled:s,effective_enabled:c?c.enabled!==!1:s,user_paths:l,override:o}}function HO(e,t,n){if(!Array.isArray(e)||e.length===0)return[];let r=new Map;for(let e of Array.isArray(n)?n:[]){let t=String(e&&e.selector||``).trim();t&&r.set(t,e)}let i=[],a=new Map;for(let t of e){if(t&&t.is_alias){i.push(t);continue}let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim(),r=`provider-group:`+(e||n||`unassigned`);a.has(r)||a.set(r,{key:r,provider_name:e,provider_type:n,display_name:PO(e,n),type_label:FO(e,n),rows:[]});let o=a.get(r);!o.provider_name&&e&&(o.provider_name=e),!o.provider_type&&n&&(o.provider_type=n),o.display_name=PO(o.provider_name,o.provider_type),o.type_label=FO(o.provider_name,o.provider_type),o.rows.push(t)}let o=Array.from(a.values()).map(e=>{let n=VO(t,e.provider_name,e.provider_type,r);return{...e,access:n,access_summary:jO(n),item_count_label:LO(e.rows)}}).sort((e,t)=>String(e.display_name||``).localeCompare(String(t.display_name||``)));return i.length>0&&o.unshift({key:`virtual-model-group`,is_virtual_models:!0,provider_name:``,provider_type:``,display_name:`Virtual models`,type_label:``,rows:i,access:{selector:``},access_summary:``,item_count_label:LO(i)}),o}function UO(e,t){let n=BO(t,`/`),r=zO(e),i=n&&Array.isArray(n.user_paths)?n.user_paths:[];return{key:`scope-global`,is_alias:!1,display_name:`all providers and models`,access:{selector:`/`,default_enabled:r,effective_enabled:n?n.enabled!==!1:r,user_paths:i,override:n}}}function WO(e){return e?String(e.access&&e.access.selector||``).trim()||String(e.override_selector||``).trim()||pO(e):``}function GO(e){if(!e)return[];let t=[];return e.is_alias?t.push(`alias-row`,DO(e.alias)):e.has_virtual_model&&t.push(`alias-row`,`is-valid`),!e.is_alias&&e.masking_alias&&t.push(`masked-model-row`),!e.is_alias&&e.access&&e.access.effective_enabled===!1&&t.push(`model-access-disabled-row`),t}function KO(e){return!!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)}function qO(e){return!!(e&&!e.is_alias&&e.masking_alias&&e.masking_alias.name&&!e.masking_alias.managed)}function JO(e){return e&&e.is_alias&&e.alias&&e.alias.name?`alias-row-`+String(e.alias.name).replace(/[^a-zA-Z0-9_-]+/g,`-`):``}function YO(e){return e?e.is_alias?!!(e.alias&&e.alias.managed):!!(e.access&&e.access.override&&e.access.override.managed||e.masking_alias&&e.masking_alias.managed):!1}function XO(e){return!!(e&&e.override)}function ZO(e){return e?`table-action-btn-active`:``}function QO(e,t){let n=`Edit `+String(e||`model access`);return t?n+` (virtual model exists)`:n}function $O(){return{source:``,target_model:``,target_weight:1,targets:[],strategy:`round_robin`,session_affinity:!0,user_paths:``,description:``,enabled:!0}}function ek(e){return String(e&&e.target_model||``).trim()!==``}function tk(e){return String(e&&e.target_model||``).trim()?!0:bO(e&&e.targets).length>0}function nk(e){return!!e&&Array.isArray(e.targets)&&e.targets.length>0}function rk(e){return nk(e)&&String(e&&e.strategy||``).toLowerCase()!==`cost`}function ik(e){let t=Array.isArray(e.targets)?e.targets:[];if(t.length>0){let n=t.shift();e.target_model=n.model||``,e.target_weight=n.weight||1;return}e.target_model=``,e.target_weight=1}function ak(e){let t=Array.isArray(e&&e.targets)?e.targets:[];return t.length>0?{primaryModel:_O(t[0]),primaryWeight:t[0].weight||1,extraTargets:t.slice(1).map(e=>({model:_O(e),weight:e.weight||1}))}:{primaryModel:e&&e.target_provider?e.target_provider+`/`+e.target_model:e&&e.target_model||``,primaryWeight:1,extraTargets:[]}}function ok(e){return String(e||``).split(/\r?\n|,/).map(e=>String(e||``).trim()).filter(Boolean)}function sk(e,t,n){let r=String(e&&e.source||``).trim(),i=String(e&&e.target_model||``).trim(),a=bO(e&&e.targets),o=tk(e),s=String(t||``).trim(),c=n===`edit`&&!!s&&r!==s,l={source:r,user_paths:ok(e&&e.user_paths),description:String(e&&e.description||``).trim(),enabled:!!(e&&e.enabled)};if(c&&(l.old_source=s),o){let t=[];if(i&&t.push(yO(i,e.target_weight)),t.push(...a),t.length>1){let n=e.strategy||`round_robin`;l.targets=n===`cost`?t.map(e=>({model:e.model})):t,l.strategy=n,e&&e.session_affinity===!1&&(l.session_affinity=!1)}else l.target_model=t[0].model}return{payload:l,source:r,isRedirect:o,isRename:c}}function ck(e){let t={source:e.name,description:String(e.description||``).trim(),user_paths:Array.isArray(e.user_paths)?e.user_paths:[],enabled:e.enabled===!1},n=Array.isArray(e.targets)?e.targets:[];return n.length>1?(t.strategy=e.strategy||`round_robin`,e.session_affinity===!1&&(t.session_affinity=!1),t.targets=t.strategy===`cost`?n.map(e=>({model:_O(e)})):n.map(e=>yO(_O(e),e.weight))):n.length===1?t.target_model=_O(n[0]):t.target_model=e.target_provider?e.target_provider+`/`+e.target_model:e.target_model,t}function lk(e,t,n){let r=n||{},i=r.effective_enabled===!1,a=t&&Array.isArray(t.user_paths)?t.user_paths:[],o=`PUT`,s;return i===!1?s={source:e,enabled:!1,user_paths:a}:t&&a.length===0&&r.default_enabled!==!1?(o=`DELETE`,s={source:e}):s={source:e,enabled:!0,user_paths:a},{method:o,payload:s,desired:i}}function uk(e,t,n){let r=Math.max(1,Number(t||75)),i=Math.min(n,e+r);return{limit:i,rendering:iMO({models:Wc.models,aliases:this.aliases,virtualModelsAvailable:this.virtualModelsAvailable,activeCategory:Wc.activeCategory}));get displayModels(){return L(this.#T)}set displayModels(e){j(this.#T,e)}#E=k(()=>HO(this.displayModels,Wc.models,this.modelOverrideViews));get displayModelGroups(){return L(this.#E)}set displayModelGroups(e){j(this.#E,e)}#D=k(()=>NO(this.displayModels,Wc.filter));get filteredDisplayModels(){return L(this.#D)}set filteredDisplayModels(e){j(this.#D,e)}#O=k(()=>{let e=this.filteredDisplayModels,t=Math.max(0,Math.min(Number(this.modelRenderLimit||0),e.length));return!Wc.filter&&t>=this.displayModels.length?this.displayModelGroups:HO(e.slice(0,t),Wc.models,this.modelOverrideViews)});get filteredDisplayModelGroups(){return L(this.#O)}set filteredDisplayModelGroups(e){j(this.#O,e)}#k=k(()=>UO(Wc.models,this.modelOverrideViews));get globalScopeRow(){return L(this.#k)}set globalScopeRow(e){j(this.#k,e)}modelsBusy(){return!!(Wc.loading||this.modelsRendering)}modelLoadingText(){if(Wc.loading)return this.displayModels.length>0?`Refreshing models...`:`Loading models...`;let e=this.filteredDisplayModels.length;return`Rendering models... `+Math.min(Number(this.modelRenderLimit||0),e)+` / `+e}restartModelRendering(e){let t=++this.#a,n=dk(this.modelRenderBatchSize,e);this.modelRenderLimit=n.limit,this.modelsRendering=n.rendering,n.rendering&&this.#A(t)}stopModelRendering(){this.#a++,this.modelsRendering=!1}#A(e){let t=()=>{if(e!==this.#a)return;let t=uk(this.modelRenderLimit,this.modelRenderBatchSize,this.filteredDisplayModels.length);this.modelRenderLimit=t.limit,this.modelsRendering=t.rendering,t.rendering&&this.#A(e)};typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>setTimeout(t,0)):setTimeout(t,0)}async fetchVirtualModels(){this.aliasLoading=!0,this.aliasError=``;try{let e=await Ts(`/admin/virtual-models`,{label:`virtual models`});if(e.status===503){this.virtualModelsAvailable=!1,this.aliases=[],this.modelOverrideViews=[];return}if(e.stale)return;if(this.virtualModelsAvailable=!0,!e.ok){this.aliases=[],this.modelOverrideViews=[];return}let{aliases:t,policies:n}=TO(e.data);this.aliases=t,this.modelOverrideViews=n}catch(e){console.error(`Failed to fetch virtual models:`,e),this.aliases=[],this.modelOverrideViews=[],this.aliasError=`Unable to load virtual models.`}finally{this.aliasLoading=!1}}qualifiedModelName(e){return pO(e)}findModelOverrideView(e){return BO(this.modelOverrideViews,e)}hasGlobalModelOverride(){return!!this.findModelOverrideView(`/`)}findExistingAliasByName(e){let t=fO(e);if(!t)return null;for(let e of this.aliases)if(fO(e&&e.name)===t)return e;return null}findConcreteModelByName(e){let t=fO(e);if(!t)return null;for(let e of Wc.models)if(hO(e).has(t))return e;return null}rowToggleEnabled(e){return e?e.is_alias?e.alias&&e.alias.enabled!==!1:!!(e.access&&e.access.effective_enabled!==!1):!1}rowToggleLabel(e){return this.rowTogglingKey&&this.rowTogglingKey===e.key?`Updating...`:this.rowToggleRestricted(e)?`Restricted`:this.rowToggleEnabled(e)?`Enabled`:`Disabled`}rowToggleRestricted(e){return!!e&&!e.is_alias&&AO(e.access,this.virtualModelsAvailable)===`is-restricted`}rowToggleAriaLabel(e){if(!e)return``;let t=this.rowToggleEnabled(e)?`Disable `:`Enable `,n;return n=e.is_alias?`alias `+String(e.alias&&e.alias.name||``):String(e.display_name||e.access&&e.access.selector||`model`),t+n.trim()}async toggleRowEnabled(e){if(this.virtualModelsAvailable&&!(!e||this.rowTogglingKey===e.key)){if(YO(e)){Y.success(`This virtual model is managed by configuration and is read-only.`);return}if(e.is_alias){await this.toggleAliasRow(e);return}await this.toggleModelRow(e)}}async toggleAliasRow(e){let t=e.alias;if(!t||!t.name)return;this.rowTogglingKey=e.key;let n=ck(t);try{let e=await Es(`/admin/virtual-models`,`PUT`,n,{label:`alias state`});if(e.status===503){this.virtualModelsAvailable=!1,Y.error(`Virtual models feature is unavailable.`);return}if(e.stale)return;if(!e.ok){Y.error(e.status===401?`Authentication required.`:xs(e,`Failed to update alias state.`));return}Y.success(n.enabled?`Alias enabled.`:`Alias disabled.`),this.fetchVirtualModels()}catch(e){console.error(`Failed to toggle alias state:`,e),Y.error(`Failed to update alias state.`)}finally{this.rowTogglingKey=``}}async toggleModelRow(e){let t=WO(e);if(!t)return;let{method:n,payload:r,desired:i}=lk(t,this.findModelOverrideView(t),e.access||{});this.rowTogglingKey=e.key;try{let e=await Es(`/admin/virtual-models`,n,r,{label:`model access`});if(e.status===503){this.virtualModelsAvailable=!1,Y.error(`Virtual models feature is unavailable.`);return}if(!(n===`DELETE`&&e.status===404)){if(e.stale)return;if(!e.ok){Y.error(e.status===401?`Authentication required.`:xs(e,`Failed to update model access.`));return}}Y.success(i?`Model enabled.`:`Model disabled.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to toggle model access:`,e),Y.error(`Failed to update model access.`)}finally{this.rowTogglingKey=``}}async removeAliasRow(e){if(!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)||this.rowDeletingKey)return;let t=String(e.alias.name||``).trim();t&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the virtual model alias "`+t+`"?`,method:`DELETE`,payload:{source:t},operation:`virtual model`,failureMessage:`Failed to remove virtual model.`,notice:`Virtual model removed.`,ignoreNotFound:!0})}async removeRedirectRow(e){let t=e&&e.masking_alias;if(!(e&&!e.is_alias&&t&&t.name&&!t.managed)||this.rowDeletingKey)return;let n=String(t.name||``).trim();n&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the redirect for "`+n+`"? Other virtual model settings will be preserved.`,method:`PUT`,payload:{source:n,user_paths:Array.isArray(t.user_paths)?t.user_paths:[],description:String(t.description||``).trim(),enabled:t.enabled!==!1},operation:`virtual model redirect`,failureMessage:`Failed to remove redirect.`,notice:`Redirect removed. Other virtual model settings were preserved.`})}async mutateVirtualModelRow(e){if(!this.rowDeletingKey&&window.confirm(e.confirmMessage)){this.rowDeletingKey=e.rowKey;try{let t=await Es(`/admin/virtual-models`,e.method,e.payload,{label:e.operation});if(t.status===503){this.virtualModelsAvailable=!1,Y.error(`Virtual models feature is unavailable.`);return}if(!(e.ignoreNotFound&&t.status===404)){if(t.stale)return;if(!t.ok){Y.error(t.status===401?`Authentication required.`:xs(t,e.failureMessage));return}}this.virtualModelsAvailable=!0,Y.success(e.notice),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(t){console.error(e.failureMessage,t),Y.error(e.failureMessage)}finally{this.rowDeletingKey=``}}}addVmTarget(){Array.isArray(this.vmForm.targets)||(this.vmForm.targets=[]),this.vmForm.targets.push({model:``,weight:1})}removeVmTarget(e){Array.isArray(this.vmForm.targets)&&this.vmForm.targets.splice(e,1)}removePrimaryTarget(){ik(this.vmForm)}vmFormHasPrimaryTarget(){return ek(this.vmForm)}vmFormShowStrategy(){return nk(this.vmForm)}vmStrategyOptions(){return CO(As.virtualModelStrategies(),this.vmForm.strategy)}vmFormShowWeights(){return rk(this.vmForm)}vmFormToggleRestricted(){return!!(this.vmForm&&this.vmForm.enabled)&&kO(ok(this.vmForm.user_paths))}vmFormToggleLabel(){return!this.vmForm||!this.vmForm.enabled?`Disabled`:this.vmFormToggleRestricted()?`Restricted`:`Enabled`}resetVirtualModelForm(){this.vmFormError=``,this.vmFormHelpOpen=!1,this.vmFormUserPathsHelpOpen=!1,this.vmSubmitting=!1,this.vmDeleting=!1,this.vmFormHasExisting=!1,this.vmFormDefaultEnabled=!0,this.vmFormEffectiveEnabled=!0,this.vmFormDisplayName=``,this.vmFormSourceLocked=!1,this.vmFormOriginalSource=``,this.vmFormManaged=!1,this.vmForm=$O()}closeVirtualModelForm(){this.vmFormOpen=!1,this.resetVirtualModelForm()}openVirtualModelCreate(e){this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`create`,this.vmFormSourceLocked=!1,this.vmFormDisplayName=`New virtual model`,e&&e.model&&e.model.id&&(this.vmForm.target_model=pO(e))}openVirtualModelEditAlias(e){if(!e)return;this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!1,this.vmFormHasExisting=!0,this.vmFormManaged=!!e.managed,this.vmFormOriginalSource=e.name||``,this.vmFormDisplayName=e.name||``,this.vmFormDefaultEnabled=zO(Wc.models),this.vmFormEffectiveEnabled=e.enabled!==!1;let{primaryModel:t,primaryWeight:n,extraTargets:r}=ak(e);this.vmForm={source:e.name||``,target_model:t,target_weight:n,targets:r,strategy:e.strategy||`round_robin`,session_affinity:e.session_affinity!==!1,user_paths:(Array.isArray(e.user_paths)?e.user_paths:[]).join(` -`),description:e.description||``,enabled:e.enabled!==!1}}openVirtualModelEditModel(e){if(!e||e.is_alias)return;let t=e.access||{},n=t.override||null,r=n&&Array.isArray(n.user_paths)?n.user_paths:Array.isArray(t.user_paths)?t.user_paths:[],i=WO(e);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!n,this.vmFormOriginalSource=i;let a=n?n.enabled!==!1:t.effective_enabled!==!1;this.vmFormDefaultEnabled=t.default_enabled!==!1,this.vmFormEffectiveEnabled=a,this.vmFormManaged=!!(n&&n.managed),this.vmFormDisplayName=e.access_display_name||e.display_name||i||``,this.vmForm={source:i,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:r.join(` -`),description:n&&n.description?n.description:``,enabled:a}}openGlobalModelOverrideEdit(){let e=this.findModelOverrideView(`/`),t=e&&Array.isArray(e.user_paths)?e.user_paths:[],n=zO(Wc.models);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!e,this.vmFormOriginalSource=`/`,this.vmFormDefaultEnabled=n,this.vmFormEffectiveEnabled=e?e.enabled!==!1:n,this.vmFormManaged=!!(e&&e.managed),this.vmFormDisplayName=`All providers and models`,this.vmForm={source:`/`,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:t.join(` -`),description:e&&e.description?e.description:``,enabled:e?e.enabled!==!1:n}}openProviderOverrideEdit(e){!e||!e.access||!e.access.selector||this.openVirtualModelEditModel({display_name:e.display_name,access_display_name:`All models in `+e.display_name,provider_name:e.provider_name,provider_type:e.provider_type,access:e.access,override_selector:e.access.selector,is_alias:!1})}async submitVirtualModelForm(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be edited here.`;return}let{payload:e,source:t,isRedirect:n,isRename:r}=sk(this.vmForm,this.vmFormOriginalSource,this.vmFormMode);if(!t){this.vmFormError=`Source is required.`;return}if(this.vmFormError=``,this.vmFormMode!==`edit`){let e=this.findExistingAliasByName(t),r=e?null:this.findModelOverrideView(t);if(e||r){let n=e?`A virtual model named "`+e.name+`" already exists. Saving will update that virtual model. Continue?`:`An access policy for "`+t+`" already exists. Saving will update that virtual model. Continue?`;if(!window.confirm(n)){this.vmFormError=`Choose a different source or edit the existing virtual model.`;return}}else if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Creating this alias will mask that model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}else if(r){let e=(this.aliases||[]).find(e=>e&&e.name===t)||null,r=e?null:this.findModelOverrideView(t);if(e||r){this.vmFormError=`A virtual model for "`+t+`" already exists. Choose a different source.`;return}if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Renaming to that name will mask the model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}this.vmSubmitting=!0;try{let t=await Es(`/admin/virtual-models`,`PUT`,e,{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:xs(t,`Failed to save virtual model.`);return}let r=!n&&t.status===204;this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),Y.success(n?`Alias saved.`:r?`Model access reset to inherited/default.`:`Model access saved.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to save virtual model:`,e),this.vmFormError=`Failed to save virtual model.`}finally{this.vmSubmitting=!1}}async deleteVirtualModel(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be removed here.`;return}let e=String(this.vmForm.source||this.vmFormOriginalSource||``).trim();if(!(!e||!this.vmFormHasExisting)&&window.confirm(`Remove the virtual model for "`+e+`"? This reverts to inherited/default behavior.`)){this.vmDeleting=!0,this.vmFormError=``;try{let t=await Es(`/admin/virtual-models`,`DELETE`,{source:e},{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:xs(t,`Failed to remove virtual model.`);return}}this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),Y.success(`Virtual model removed.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to delete virtual model:`,e),this.vmFormError=`Failed to remove virtual model.`}finally{this.vmDeleting=!1}}}},pk=[{value:`input_per_mtok`,label:`Input $/MTok`,group:`Tokens`},{value:`output_per_mtok`,label:`Output $/MTok`,group:`Tokens`},{value:`cached_input_per_mtok`,label:`Cached input $/MTok`,group:`Tokens`},{value:`cache_write_per_mtok`,label:`Cache write $/MTok`,group:`Tokens`},{value:`reasoning_output_per_mtok`,label:`Reasoning output $/MTok`,group:`Tokens`},{value:`batch_input_per_mtok`,label:`Batch input $/MTok`,group:`Batch`},{value:`batch_output_per_mtok`,label:`Batch output $/MTok`,group:`Batch`},{value:`audio_input_per_mtok`,label:`Audio input $/MTok`,group:`Audio`},{value:`audio_output_per_mtok`,label:`Audio output $/MTok`,group:`Audio`},{value:`per_image`,label:`$/Image`,group:`Image`},{value:`input_per_image`,label:`Input $/Image`,group:`Image`},{value:`per_second_input`,label:`Input $/Second`,group:`Audio/Video`},{value:`per_second_output`,label:`Output $/Second`,group:`Video`},{value:`per_character_input`,label:`$/Character`,group:`Audio`},{value:`per_page`,label:`$/Page`,group:`Utility`},{value:`per_request`,label:`$/Request`,group:`Utility`}];function mk(e){let t=pk.find(t=>t.value===e);return t?t.label:String(e||``).replace(/_/g,` `)}function hk(e){return e&&typeof e==`object`?JSON.parse(JSON.stringify(e)):{}}function gk(e,t){let n=hk(e),r=t&&t.pricing?t.pricing:t;if(!r||typeof r!=`object`)return n;for(let e of pk)r[e.value]!==null&&r[e.value]!==void 0&&(n[e.value]=Number(r[e.value]));return Array.isArray(r.tiers)&&r.tiers.length>0&&(n.tiers=hk(r.tiers)),n}function _k(e){switch(String(e||``).trim()){case`config_yaml`:return`config.yaml`;case`model_registry`:return`Model registry`;default:return e?String(e):`Unknown`}}function vk(e){let t=e&&e.pricing?e.pricing:{},n=e&&e.pricing_sources&&typeof e.pricing_sources==`object`?e.pricing_sources:{},r={};for(let e of pk)t[e.value]!==null&&t[e.value]!==void 0&&(r[e.value]=_k(n[e.value]||`model_registry`));return r}function yk(e){let t=String(e&&e.selector||``).trim();return t?`Dashboard/API override (`+t+`)`:`Dashboard/API override`}function bk(e){let t=String(e||``).trim();return t?t+`/`:``}function xk(e){return String(e&&e.model&&e.model.id||``).trim()}function Sk(e){let t=String(e&&e.provider_name||``).trim(),n=xk(e);return t&&n?t+`/`+n:n}function Ck(e){return xk(e)}function wk(e){let t=new Map;for(let n of Array.isArray(e)?e:[]){let e=String(n&&n.selector||``).trim();e&&t.set(e,n)}return t}function Tk(e,t){let n=String(t||``).trim();return n&&wk(e).get(n)||null}function Ek(e,t,n){let r=wk(e),i=Sk(t),a=Ck(t),o=bk(t&&t.provider_name),s=String(n||``).trim();for(let e of[i,a,o,`/`]){if(!e||e===s)continue;let t=r.get(e);if(t)return t}return null}function Dk(e,t,n){let r=e&&e.model&&e.model.metadata?e.model.metadata:null,i=hk(r&&r.pricing),a=vk(r),o=Ek(t,e,n),s=o&&o.pricing?o.pricing:null;if(s){let e=yk(o);for(let t of pk)s[t.value]!==null&&s[t.value]!==void 0&&(i[t.value]=Number(s[t.value]),a[t.value]=e);Array.isArray(s.tiers)&&s.tiers.length>0&&(i.tiers=hk(s.tiers),a.tiers=e)}return{pricing:i,sources:a}}function Ok(e,t){let n=e&&e.pricing?e.pricing:{},r=[];for(let e of pk)n[e.value]!==null&&n[e.value]!==void 0&&r.push({id:t(),field:e.value,value:String(n[e.value])});return r}function kk(e,t){let n=new Set;for(let r of Array.isArray(e)?e:[]){if(t&&r.id===t)continue;let e=String(r.field||``).trim();e&&n.add(e)}return n}function Ak(e,t){let n=kk(e,t&&t.id);return pk.filter(e=>e.value===(t&&t.field)||!n.has(e.value))}function jk(e,t){let n={},r=new Set;for(let t of Array.isArray(e)?e:[]){let e=String(t.field||``).trim();if(!e)return{error:`Choose a price type for every row.`};if(r.has(e))return{error:`Each price type can only be used once.`};r.add(e);let i=String(t.value||``).trim();if(i===``)return{error:`Enter a value for `+mk(e)+`.`};let a=Number(i);if(!Number.isFinite(a)||a<0)return{error:`Pricing values must be numbers greater than or equal to 0.`};n[e]=a}let i=Array.isArray(t)?t:[];return i.length>0&&(n.tiers=hk(i)),Object.keys(n).length===0?{error:`Add at least one pricing field before saving.`}:{pricing:n}}function Mk(e,t,n){let r=e||{},i=t||{},a=n||{},o=gk(r,a);return pk.map(e=>{let t=a[e.value]!==null&&a[e.value]!==void 0,n=r[e.value]!==null&&r[e.value]!==void 0;return{field:e.value,label:e.label,value:o[e.value],source:t?`Form/API value`:n?i[e.value]||`Model registry`:`Unset`}}).filter(e=>e.source!==`Unset`||e.value!==void 0)}var Nk=new class{#e=A(!0);get modelPricingOverridesAvailable(){return L(this.#e)}set modelPricingOverridesAvailable(e){j(this.#e,e,!0)}#t=A(M([]));get modelPricingOverrideViews(){return L(this.#t)}set modelPricingOverrideViews(e){j(this.#t,e,!0)}#n=A(``);get modelPricingOverrideError(){return L(this.#n)}set modelPricingOverrideError(e){j(this.#n,e,!0)}#r=A(!1);get modelPricingOverrideFormOpen(){return L(this.#r)}set modelPricingOverrideFormOpen(e){j(this.#r,e,!0)}#i=A(!1);get modelPricingOverrideSubmitting(){return L(this.#i)}set modelPricingOverrideSubmitting(e){j(this.#i,e,!0)}#a=A(!1);get modelPricingOverrideFormHasExistingOverride(){return L(this.#a)}set modelPricingOverrideFormHasExistingOverride(e){j(this.#a,e,!0)}#o=A(``);get modelPricingOverrideFormDisplayName(){return L(this.#o)}set modelPricingOverrideFormDisplayName(e){j(this.#o,e,!0)}#s=A(``);get modelPricingOverrideFormScope(){return L(this.#s)}set modelPricingOverrideFormScope(e){j(this.#s,e,!0)}#c=A(M([]));get modelPricingOverrideFormScopeOptions(){return L(this.#c)}set modelPricingOverrideFormScopeOptions(e){j(this.#c,e,!0)}#l=A(null);get modelPricingOverrideFormRow(){return L(this.#l)}set modelPricingOverrideFormRow(e){j(this.#l,e,!0)}#u=A(null);get modelPricingOverrideFormBasePricing(){return L(this.#u)}set modelPricingOverrideFormBasePricing(e){j(this.#u,e,!0)}#d=A(null);get modelPricingOverrideFormBasePricingSources(){return L(this.#d)}set modelPricingOverrideFormBasePricingSources(e){j(this.#d,e,!0)}#f=A(M([]));get modelPricingOverrideFormPreservedTiers(){return L(this.#f)}set modelPricingOverrideFormPreservedTiers(e){j(this.#f,e,!0)}#p=A(M([]));get modelPricingOverrideRows(){return L(this.#p)}set modelPricingOverrideRows(e){j(this.#p,e,!0)}#m=A(M({selector:``}));get modelPricingOverrideForm(){return L(this.#m)}set modelPricingOverrideForm(e){j(this.#m,e,!0)}_modelPricingOverrideRowID=0;pricingFieldOptions(){return pk}pricingFieldLabel(e){return mk(e)}async fetchModelPricingOverrides(){this.modelPricingOverrideError=``;try{let e=await Ts(`/admin/model-pricing-overrides`,{label:`model pricing overrides`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideViews=[];return}if(e.stale)return;if(this.modelPricingOverridesAvailable=!0,!e.ok){this.modelPricingOverrideViews=[];return}this.modelPricingOverrideViews=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch model pricing overrides:`,e),this.modelPricingOverrideViews=[],this.modelPricingOverrideError=`Unable to load model pricing overrides.`}}findModelPricingOverrideView(e){return Tk(this.modelPricingOverrideViews,e)}hasGlobalPricingOverride(){return!!this.findModelPricingOverrideView(`/`)}hasProviderPricingOverride(e){return!!this.findModelPricingOverrideView(bk(e&&e.provider_name))}hasModelPricingOverride(e){return!!this.findModelPricingOverrideView(Sk(e))}modelPricingButtonClass(e){return e?`table-action-btn-active`:``}modelPricingButtonLabel(e,t){let n=`Edit `+String(e||`model pricing`);return t?n+` (override exists)`:n}modelRowPricing(e){return Dk(e,this.modelPricingOverrideViews).pricing}openGlobalPricingOverrideEdit(){this.openModelPricingOverrideForm({displayName:`All providers and models`,selector:`/`,scope:`global`,scopeOptions:[{value:`global`,label:`All providers and models`,selector:`/`}],row:null})}openProviderPricingOverrideEdit(e){let t=bk(e&&e.provider_name);t&&this.openModelPricingOverrideForm({displayName:`All models in `+(e.display_name||e.provider_name||t),selector:t,scope:`provider`,scopeOptions:[{value:`provider`,label:`Provider`,selector:t}],row:null})}openModelPricingOverrideEdit(e){if(!e||e.is_alias)return;let t=Sk(e),n=Ck(e),r=[{value:`exact`,label:`This provider and model`,selector:t}];n&&n!==t&&r.push({value:`model`,label:`This model across providers`,selector:n}),this.openModelPricingOverrideForm({displayName:e.display_name||t,selector:t,scope:`exact`,scopeOptions:r,row:e})}openModelPricingOverrideForm(e){let t=e||{};this.modelPricingOverrideFormOpen=!0,this.modelPricingOverrideError=``,this.modelPricingOverrideFormDisplayName=t.displayName||t.selector||`Pricing`,this.modelPricingOverrideFormScope=t.scope||``,this.modelPricingOverrideFormScopeOptions=Array.isArray(t.scopeOptions)?t.scopeOptions:[],this.modelPricingOverrideFormRow=t.row||null,this.modelPricingOverrideForm={selector:t.selector||``},this.loadModelPricingOverrideFormSelector(t.selector||``)}loadModelPricingOverrideFormSelector(e){e=String(e||``).trim();let t=this.findModelPricingOverrideView(e);this.modelPricingOverrideFormHasExistingOverride=!!t,this.modelPricingOverrideRows=Ok(t,()=>this.nextModelPricingOverrideRowID()),this.modelPricingOverrideFormPreservedTiers=t&&t.pricing&&Array.isArray(t.pricing.tiers)?hk(t.pricing.tiers):[],this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow();let n=this.modelPricingOverrideFormRow,r=n?Dk(n,this.modelPricingOverrideViews,e):{pricing:{},sources:{}};this.modelPricingOverrideFormBasePricing=r.pricing,this.modelPricingOverrideFormBasePricingSources=r.sources}setModelPricingOverrideScope(e){this.modelPricingOverrideFormScope=e;let t=this.modelPricingOverrideFormScopeOptions.find(t=>t.value===e);t&&(this.modelPricingOverrideForm.selector=t.selector,this.loadModelPricingOverrideFormSelector(t.selector))}nextModelPricingOverrideRowID(){return this._modelPricingOverrideRowID=(this._modelPricingOverrideRowID||0)+1,`pricing-row-`+this._modelPricingOverrideRowID}availablePricingFieldOptions(e){return Ak(this.modelPricingOverrideRows,e)}addModelPricingOverrideRow(){let e=kk(this.modelPricingOverrideRows),t=pk.find(t=>!e.has(t.value))||pk[0];t&&this.modelPricingOverrideRows.push({id:this.nextModelPricingOverrideRowID(),field:t.value,value:``})}removeModelPricingOverrideRow(e){this.modelPricingOverrideRows=this.modelPricingOverrideRows.filter(t=>t.id!==e.id),this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow()}modelPricingOverridePayload(){return jk(this.modelPricingOverrideRows,this.modelPricingOverrideFormPreservedTiers)}modelPricingOverrideDraftPricing(){let e=this.modelPricingOverridePayload();return e&&e.pricing?e.pricing:{}}modelPricingEffectivePreviewRows(){return Mk(this.modelPricingOverrideFormBasePricing,this.modelPricingOverrideFormBasePricingSources,this.modelPricingOverrideDraftPricing())}closeModelPricingOverrideForm(){this.modelPricingOverrideFormOpen=!1,this.modelPricingOverrideSubmitting=!1,this.modelPricingOverrideError=``,this.modelPricingOverrideFormHasExistingOverride=!1,this.modelPricingOverrideFormDisplayName=``,this.modelPricingOverrideFormScope=``,this.modelPricingOverrideFormScopeOptions=[],this.modelPricingOverrideFormRow=null,this.modelPricingOverrideFormBasePricing=null,this.modelPricingOverrideFormBasePricingSources=null,this.modelPricingOverrideFormPreservedTiers=[],this.modelPricingOverrideRows=[],this.modelPricingOverrideForm={selector:``}}async submitModelPricingOverrideForm(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!e){this.modelPricingOverrideError=`Model pricing selector is required.`;return}let t=this.modelPricingOverridePayload();if(t.error){this.modelPricingOverrideError=t.error;return}let n={selector:e,...t};this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let e=await Es(`/admin/model-pricing-overrides`,`PUT`,n,{label:`model pricing override`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(e.stale)return;if(!e.ok){this.modelPricingOverrideError=e.status===401?`Authentication required.`:xs(e,`Failed to save model pricing.`);return}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),Y.success(`Model pricing saved.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to save model pricing override:`,e),this.modelPricingOverrideError=`Failed to save model pricing.`}finally{this.modelPricingOverrideSubmitting=!1}}async deleteModelPricingOverride(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!(!e||!this.modelPricingOverrideFormHasExistingOverride)&&window.confirm(`Remove the model pricing override for "`+e+`"?`)){this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let t=await Es(`/admin/model-pricing-overrides`,`DELETE`,{selector:e},{label:`model pricing override`});if(t.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.modelPricingOverrideError=t.status===401?`Authentication required.`:xs(t,`Failed to remove model pricing override.`);return}}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),Y.success(`Model pricing override removed.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to delete model pricing override:`,e),this.modelPricingOverrideError=`Failed to remove model pricing override.`}finally{this.modelPricingOverrideSubmitting=!1}}}},Pk=z(``);function Fk(e,t){D(t,!0);var n=Pk();let r;var i=F(N(n),2),a=N(i,!0);E(i),E(n),I((e,i,o)=>{r=W(n,1,`alias-toggle`,null,r,e),n.disabled=fk.rowTogglingKey===t.row.key||!fk.virtualModelsAvailable,G(n,`aria-label`,i),V(a,o)},[()=>({enabled:fk.rowToggleEnabled(t.row),restricted:fk.rowToggleRestricted(t.row)}),()=>fk.rowToggleAriaLabel(t.row),()=>fk.rowToggleLabel(t.row)]),R(`click`,n,()=>fk.toggleRowEnabled(t.row)),B(e,n),O()}Vr([`click`]);var Ik=z(`
        `);function Lk(e,t){D(t,!0);var n=Ik(),r=N(n),i=e=>{Fk(e,{get row(){return fk.globalScopeRow}})};H(r,e=>{fk.virtualModelsAvailable&&e(i)});var a=F(r,2),o=e=>{{let t=k(()=>Nk.modelPricingButtonLabel(`global model pricing`,Nk.hasGlobalPricingOverride())),n=k(()=>Nk.modelPricingButtonClass(Nk.hasGlobalPricingOverride()));OT(e,{get label(){return L(t)},get class(){return`table-icon-btn ${L(n)??``}`},onclick:()=>Nk.openGlobalPricingOverrideEdit(),children:(e,t)=>{q(e,{get icon(){return qa},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(a,e=>{Nk.modelPricingOverridesAvailable&&e(o)});var s=F(a,2),c=e=>{{let t=k(()=>QO(`global model access`,fk.hasGlobalModelOverride())),n=k(()=>ZO(fk.hasGlobalModelOverride()));OT(e,{get label(){return L(t)},get class(){return`table-icon-btn ${L(n)??``}`},onclick:()=>fk.openGlobalModelOverrideEdit(),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(s,e=>{fk.virtualModelsAvailable&&e(c)}),E(n),B(e,n),O()}function Rk(e){return String(e&&(e.primary_model||e.source)||``).trim()}function zk(e){return Array.isArray(e&&e.fallback_models)?e.fallback_models:Array.isArray(e&&e.targets)?e.targets:[]}function Bk(e){return Array.isArray(e)?e.map(e=>({...e,source:Rk(e),targets:zk(e)})):[]}function Vk(e){let t=zk(e);return t.length===0?`-`:t.join(`, `)}function Hk(e){return e&&e.enabled===!1?`Off`:e&&e.managed?`Config`:`On`}function Uk(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>Rk(e)===n)||null}function Wk(e,t){if(!t||t.is_alias)return!1;let n=Uk(e,pO(t));return!!(n&&n.enabled!==!1&&zk(n).length>0)}function Gk(e,t){return Wk(e,t)?`table-action-btn-failover-active`:``}function Kk(e,t){let n=`Edit failover for `+(t&&t.display_name?t.display_name:`model`);return Wk(e,t)?n+` (active)`:n}function qk(e){let t=[e&&e.target_model];return(Array.isArray(e&&e.targets)?e.targets:[]).forEach(e=>t.push(e&&e.model)),t.map(e=>String(e||``).trim()).filter(Boolean)}function Jk(e){let t=Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(Boolean):[];return{target_model:t[0]||``,targets:t.slice(1).map(e=>({model:e}))}}function Yk(e){return{primary_model:String(e&&e.source||``).trim(),fallback_models:qk(e),enabled:!(e&&e.enabled===!1)}}function Xk(e){return Rk(e)}function Zk(e){let t={};return(Array.isArray(e)?e:[]).forEach(e=>{let n=Xk(e);n&&(t[n]=!0)}),t}function Qk(e,t){let n=Xk(t);return!!(n&&e&&e[n])}function $k(e,t){return(Array.isArray(e)?e:[]).filter(e=>Qk(t,e))}function eA(e,t){let n=Array.isArray(e)?e:[];return n.length>0&&$k(n,t).length===n.length}function tA(e){return[Rk(e),zk(e).join(` `)].join(` `).toLowerCase()}function nA(e,t){let n=Array.isArray(e)?e:[],r=String(t||``).trim().toLowerCase();return r?n.filter(e=>tA(e).includes(r)):n}function rA(e){return{primary_model:Rk(e),fallback_models:zk(e).map(e=>String(e||``).trim()).filter(Boolean),enabled:!!(e&&e.enabled!==!1)}}function iA(){return{source:``,target_model:``,targets:[],enabled:!0}}var Q=new class{#e=A(!0);get failoverAvailable(){return L(this.#e)}set failoverAvailable(e){j(this.#e,e,!0)}#t=A(M([]));get failoverRules(){return L(this.#t)}set failoverRules(e){j(this.#t,e,!0)}#n=A(!1);get failoverLoading(){return L(this.#n)}set failoverLoading(e){j(this.#n,e,!0)}#r=A(!1);get failoverSaving(){return L(this.#r)}set failoverSaving(e){j(this.#r,e,!0)}#i=A(!1);get failoverGenerating(){return L(this.#i)}set failoverGenerating(e){j(this.#i,e,!0)}#a=A(``);get failoverError(){return L(this.#a)}set failoverError(e){j(this.#a,e,!0)}#o=A(M([]));get failoverGeneratedRules(){return L(this.#o)}set failoverGeneratedRules(e){j(this.#o,e,!0)}#s=A(!1);get failoverDraftsOpen(){return L(this.#s)}set failoverDraftsOpen(e){j(this.#s,e,!0)}#c=A(M({}));get failoverDraftSelections(){return L(this.#c)}set failoverDraftSelections(e){j(this.#c,e,!0)}#l=A(``);get failoverDraftFilter(){return L(this.#l)}set failoverDraftFilter(e){j(this.#l,e,!0)}#u=A(!1);get failoverDraftSaving(){return L(this.#u)}set failoverDraftSaving(e){j(this.#u,e,!0)}#d=A(!1);get failoverFormOpen(){return L(this.#d)}set failoverFormOpen(e){j(this.#d,e,!0)}#f=A(`create`);get failoverFormMode(){return L(this.#f)}set failoverFormMode(e){j(this.#f,e,!0)}#p=A(!1);get failoverFormManaged(){return L(this.#p)}set failoverFormManaged(e){j(this.#p,e,!0)}#m=A(M(iA()));get failoverForm(){return L(this.#m)}set failoverForm(e){j(this.#m,e,!0)}failoverEnabled(){return As.booleanFlag(`FAILOVER_ENABLED`,!0)}async fetchFailoverRules(){if(!this.failoverEnabled()){this.failoverAvailable=!1,this.failoverRules=[],this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,this.failoverError=``,this.failoverLoading=!1;return}this.failoverLoading=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover`,{label:`failover mappings`});if(e.status===503){this.failoverAvailable=!1,this.failoverRules=[];return}if(e.stale)return;if(this.failoverAvailable=!0,!e.ok){this.failoverRules=[];return}this.failoverRules=Bk(e.data)}catch(e){console.error(`Failed to fetch failover mappings:`,e),this.failoverRules=[],this.failoverError=`Unable to load failover mappings.`}finally{this.failoverLoading=!1}}resetFailoverForm(){this.failoverFormMode=`create`,this.failoverFormManaged=!1,this.failoverForm=iA()}openFailoverCreate(){this.resetFailoverForm(),this.failoverFormOpen=!0,this.focusFailoverEditor()}openFailoverEdit(e){if(!e)return;this.resetFailoverForm(),this.failoverFormMode=`edit`,this.failoverFormOpen=!0,this.failoverFormManaged=!!e.managed;let t=this.failoverPrimaryModel(e),n=this.failoverTargets(e);this.failoverForm={source:t,target_model:n[0]||``,targets:n.slice(1).map(e=>({model:e})),enabled:e.enabled!==!1},this.focusFailoverEditor()}openFailoverForModel(e){if(!e||e.is_alias)return;let t=this.qualifiedModelName(e),n=this.failoverRules.find(e=>this.failoverPrimaryModel(e)===t);if(n){this.openFailoverEdit(n);return}this.resetFailoverForm(),this.failoverFormMode=`create`,this.failoverFormOpen=!0,this.failoverForm.source=t,this.focusFailoverEditor()}closeFailoverForm(){this.failoverFormOpen=!1}closeFailoverDraftsModal(){this.failoverDraftSaving||(this.failoverDraftsOpen=!1)}failoverFormTargets(){return qk(this.failoverForm)}setFailoverFormTargets(e){let t=Jk(e);this.failoverForm.target_model=t.target_model,this.failoverForm.targets=t.targets}addFailoverTarget(){Array.isArray(this.failoverForm.targets)||(this.failoverForm.targets=[]),this.failoverForm.targets.push({model:``}),this.focusFailoverEditor()}removeFailoverTarget(e){if(!Array.isArray(this.failoverForm.targets)){this.failoverForm.targets=[];return}this.failoverForm.targets.splice(e,1)}removePrimaryFailoverTarget(){let e=Array.isArray(this.failoverForm.targets)?this.failoverForm.targets:[];if(e.length>0){let t=e.shift();this.failoverForm.target_model=t&&t.model?t.model:``,this.failoverForm.targets=e;return}this.failoverForm.target_model=``}failoverRulePayload(){return Yk(this.failoverForm)}async submitFailoverForm(){if(this.failoverSaving||this.failoverGenerating||this.failoverFormManaged)return;let e=this.failoverRulePayload();if(!e.primary_model){this.failoverError=`Primary model is required.`;return}if(e.enabled&&e.fallback_models.length===0){this.failoverError=`Add at least one failover target.`;return}this.failoverSaving=!0,this.failoverError=``;try{let t=await Es(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to save failover mapping.`;return}Y.success(`Failover mapping saved.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to save failover mapping:`,e),this.failoverError=`Failed to save failover mapping.`}finally{this.failoverSaving=!1}}async deleteFailoverRule(e){let t=String(e&&this.failoverPrimaryModel(e)||this.failoverForm.source||``).trim();if(!(!t||this.failoverSaving||this.failoverGenerating)&&confirm(`Remove failover mapping for "`+t+`"?`)){this.failoverSaving=!0,this.failoverError=``;try{let e=await Es(`/admin/failover`,`DELETE`,{primary_model:t},{label:`failover mapping`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mapping.`;return}Y.success(`Failover mapping removed.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to remove failover mapping:`,e),this.failoverError=`Failed to remove failover mapping.`}finally{this.failoverSaving=!1}}}async generateFailoverForForm(){if(this.failoverGenerating||this.failoverSaving||this.failoverFormManaged)return;let e=String(this.failoverForm.source||``).trim();if(!e){this.failoverError=`Primary model is required.`;return}this.failoverGenerating=!0,this.failoverError=``;try{let t=await Es(`/admin/failover/generate`,`POST`,{primary_model:e},{label:`failover generation`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to generate failover mapping.`;return}let n=Bk(t.data),r=n.find(t=>this.failoverPrimaryModel(t)===e)||n[0]||null,i=this.failoverTargets(r);if(i.length===0){this.failoverError=`No failover suggestions were generated for this model.`;return}this.setFailoverFormTargets(i),Y.success(`Generated `+i.length+` fallback model`+(i.length===1?`.`:`s.`)),this.focusFailoverEditor()}catch(e){console.error(`Failed to generate failover mapping:`,e),this.failoverError=`Failed to generate failover mapping.`}finally{this.failoverGenerating=!1}}openFailoverResetDialog(){Ys.open({title:`Remove failover models`,titleId:`failoverResetDialogTitle`,inputId:`failover-reset-confirmation`,message:`Remove every dashboard-managed failover mapping. Configuration-managed mappings remain active.`,requiredText:`remove`,confirmLabel:`Remove Failover`,icon:jo,dialogClass:`budget-reset-dialog`,onConfirm:async()=>{await this.resetFailoverRules(),this.failoverError&&(Ys.error=this.failoverError)}})}async resetFailoverRules(){if(!this.failoverSaving){this.failoverSaving=!0,this.failoverError=``;try{let e=await Es(`/admin/failover/reset`,`POST`,void 0,{label:`failover removal`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mappings.`;return}this.failoverRules=Bk(e.data),this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,Y.success(`Dashboard-managed failover mappings removed.`),Ys.close()}catch(e){console.error(`Failed to remove failover mappings:`,e),this.failoverError=`Failed to remove failover mappings.`}finally{this.failoverSaving=!1}}}async generateFailoverRules(){if(!(this.failoverGenerating||this.failoverDraftSaving)){this.failoverGenerating=!0,this.failoverError=``,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!0;try{let e=await Es(`/admin/failover/generate`,`POST`,void 0,{label:`failover generation`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to generate failover mappings.`;return}this.failoverGeneratedRules=Bk(e.data),this.selectAllFailoverDrafts(this.failoverGeneratedRules)}catch(e){console.error(`Failed to generate failover mappings:`,e),this.failoverError=`Failed to generate failover mappings.`}finally{this.failoverGenerating=!1}}}failoverDraftKey(e){return Xk(e)}selectAllFailoverDrafts(e){this.failoverDraftSelections=Zk(e)}failoverDraftSelected(e){return Qk(this.failoverDraftSelections,e)}setFailoverDraftSelected(e,t){let n=this.failoverDraftKey(e);n&&(this.failoverDraftSelections={...this.failoverDraftSelections,[n]:!!t})}selectedFailoverDrafts(){return $k(this.failoverGeneratedRules,this.failoverDraftSelections)}selectedFailoverDraftCount(){return this.selectedFailoverDrafts().length}failoverDraftCountLabel(){return this.selectedFailoverDraftCount()+` / `+this.failoverGeneratedRules.length+` selected`}allFailoverDraftsSelected(){return eA(this.failoverGeneratedRules,this.failoverDraftSelections)}toggleAllFailoverDrafts(){if(!(this.failoverDraftSaving||this.failoverGenerating||this.failoverGeneratedRules.length===0)){if(this.allFailoverDraftsSelected()){this.failoverDraftSelections={};return}this.selectAllFailoverDrafts(this.failoverGeneratedRules)}}failoverDraftSearchText(e){return tA(e)}filteredFailoverDrafts(){return nA(this.failoverGeneratedRules,this.failoverDraftFilter)}failoverDraftPayload(e){return rA(e)}async saveSelectedFailoverDrafts(){if(this.failoverDraftSaving||this.failoverGenerating)return;let e=this.selectedFailoverDrafts();if(e.length===0){this.failoverError=`Select at least one failover draft.`;return}this.failoverDraftSaving=!0,this.failoverError=``;try{for(let t of e){let e=this.failoverDraftPayload(t);if(!e.primary_model||e.fallback_models.length===0){this.failoverError=`Generated failover draft is missing model data.`;return}let n=await Es(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(n.stale)return;if(!n.ok){this.failoverError=`Failed to save failover mapping.`;return}}Y.success(`Saved `+e.length+` failover mapping`+(e.length===1?`.`:`s.`)),this.failoverDraftsOpen=!1,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.fetchFailoverRules()}catch(e){console.error(`Failed to save generated failover mappings:`,e),this.failoverError=`Failed to save failover mappings.`}finally{this.failoverDraftSaving=!1}}focusFailoverEditor(){setTimeout(()=>{let e=document.querySelector(`[data-failover-editor]`),t=e&&e.querySelector?e.querySelector(`[data-modal-autofocus], input:not([disabled]), textarea:not([disabled]), button:not([disabled])`):null;t&&typeof t.focus==`function`&&t.focus({preventScroll:!0})},0)}failoverTargetLabel(e){return Vk(e)}failoverPrimaryModel(e){return Rk(e)}failoverTargets(e){return zk(e)}findFailoverMapping(e){return Uk(this.failoverRules,e)}hasActiveFailoverMapping(e){return Wk(this.failoverRules,e)}failoverButtonClass(e){return Gk(this.failoverRules,e)}failoverButtonLabel(e){return Kk(this.failoverRules,e)}normalizeFailoverRules(e){return Bk(e)}failoverRuleStatus(e){return Hk(e)}qualifiedModelName(e){return pO(e)}},aA=z(``),oA=z(``),sA=z(`Config`),cA=z(`
        Targets
        `),lA=z(``),uA=z(`
        Redirects to
        `),dA=z(` `),fA=z(`
        `),pA=z(`
        `),mA=z(`
        `);function hA(e,t){D(t,!0);let n=k(()=>Nk.modelRowPricing(t.row));var r=mA(),i=N(r),a=N(i),o=N(a),s=N(o),c=N(s,!0);E(s);var l=F(s,2),u=e=>{B(e,aA())};H(l,e=>{t.row.is_alias&&e(u)});var d=F(l,2),f=e=>{B(e,oA())};H(d,e=>{!t.row.is_alias&&t.row.masking_alias&&e(f)});var p=F(d,2),m=e=>{B(e,sA())},h=k(()=>YO(t.row));H(p,e=>{L(h)&&e(m)}),E(o);var g=F(o,2),_=e=>{var n=cA(),r=F(N(n)),i=N(r,!0);E(r),E(n),I(()=>V(i,t.row.secondary_name)),B(e,n)};H(g,e=>{t.row.is_alias&&e(_)});var v=F(g,2),y=e=>{var n=uA(),r=F(N(n)),i=N(r,!0);E(r);var a=F(r,2),o=e=>{var n=lA();I(e=>{G(n,`aria-label`,fk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),G(n,`title`,fk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),n.disabled=e},[()=>!!fk.rowDeletingKey]),R(`click`,n,()=>fk.removeRedirectRow(t.row)),B(e,n)},s=k(()=>fk.virtualModelsAvailable&&qO(t.row));H(a,e=>{L(s)&&e(o)}),E(n),I(e=>V(i,e),[()=>EO(t.row.masking_alias)]),B(e,n)};H(v,e=>{!t.row.is_alias&&t.row.masking_alias&&e(y)}),E(a),E(i);var b=F(i);U(b,17,()=>t.columns,ai,(e,r)=>{var i=dA(),a=N(i,!0);E(i),I(e=>{W(i,1,Pi(L(r).class),`svelte-1iynym`),V(a,e)},[()=>L(r).value(t.row,L(n))]),B(e,i)});var x=F(b),S=N(x),C=e=>{var n=fA(),r=N(n);Fk(r,{get row(){return t.row}});var i=F(r,2),a=e=>{{let n=k(()=>fk.rowDeletingKey===t.row.key?`Removing alias `+t.row.alias.name:`Remove alias `+t.row.alias.name),r=k(()=>!!fk.rowDeletingKey);OT(e,{get label(){return L(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>fk.removeAliasRow(t.row),get disabled(){return L(r)},children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}})}},o=k(()=>fk.virtualModelsAvailable&&KO(t.row));H(i,e=>{L(o)&&e(a)});var s=F(i,2),c=e=>{{let n=k(()=>`Edit alias `+t.row.alias.name);OT(e,{get label(){return L(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>fk.openVirtualModelEditAlias(t.row.alias),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(s,e=>{fk.virtualModelsAvailable&&e(c)}),E(n),B(e,n)},w=e=>{var n=pA(),r=N(n);Fk(r,{get row(){return t.row}});var i=F(r,2),a=e=>{{let n=k(()=>Nk.modelPricingButtonLabel(`model pricing for `+t.row.display_name,Nk.hasModelPricingOverride(t.row))),r=k(()=>Nk.modelPricingButtonClass(Nk.hasModelPricingOverride(t.row)));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>Nk.openModelPricingOverrideEdit(t.row),children:(e,t)=>{q(e,{get icon(){return qa},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(i,e=>{Nk.modelPricingOverridesAvailable&&e(a)});var o=F(i,2),s=e=>{{let n=k(()=>Q.failoverButtonLabel(t.row)),r=k(()=>Q.failoverButtonClass(t.row));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>Q.openFailoverForModel(t.row),children:(e,t)=>{q(e,{get icon(){return Do},class:`table-icon-svg`})},$$slots:{default:!0}})}},c=k(()=>Q.failoverAvailable&&Q.failoverEnabled());H(o,e=>{L(c)&&e(s)});var l=F(o,2),u=e=>{{let n=k(()=>Z.rateLimitGaugeTitle(t.row.display_name,Z.rateLimitGaugeClassForModel(t.row))),r=k(()=>Z.rateLimitGaugeClassForModel(t.row));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>Z.openRateLimitInspectorForModel(t.row),children:(e,t)=>{q(e,{get icon(){return $a},class:`table-icon-svg`})},$$slots:{default:!0}})}},d=k(()=>Z.rateLimitsEnabled()&&Z.rateLimitInspectorModelID(t.row));H(l,e=>{L(d)&&e(u)});var f=F(l,2),p=e=>{{let n=k(()=>`Edit redirect for `+t.row.display_name);OT(e,{get label(){return L(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>fk.openVirtualModelEditAlias(t.row.masking_alias),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(f,e=>{fk.virtualModelsAvailable&&t.row.masking_alias&&t.row.masking_alias.name&&e(p)});var m=F(f,2),h=e=>{{let n=k(()=>QO(`model access for `+t.row.display_name,XO(t.row.access))),r=k(()=>ZO(XO(t.row.access)));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>fk.openVirtualModelEditModel(t.row),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(m,e=>{fk.virtualModelsAvailable&&!t.row.masking_alias&&e(h)}),E(n),B(e,n)};H(S,e=>{t.row.is_alias?e(C):e(w,-1)}),E(x),E(r),I((e,n)=>{G(r,`id`,e),W(r,1,n,`svelte-1iynym`),V(c,t.row.display_name)},[()=>JO(t.row)||void 0,()=>Pi(GO(t.row))]),B(e,r),O()}Vr([`click`]);var gA={headerLines:[`Modes`],value:e=>(e.model?.metadata?.modes??[]).join(`, `)||`-`};function _A(e,t){return{headerLines:e,class:`col-price`,value:t}}var vA=_A([`Input / Output ($/MTok)`],(e,t)=>yc(t?.input_per_mtok)+` / `+yc(t?.output_per_mtok)),yA={all:[vA],text_generation:[gA,vA,_A([`Cached $/MTok`],(e,t)=>yc(t?.cached_input_per_mtok))],embedding:[_A([`Input`,`$/MTok`],(e,t)=>yc(t?.input_per_mtok))],image:[_A([`$/Image`],(e,t)=>bc(t?.per_image))],audio:[_A([`$/Second`],(e,t)=>bc(t?.per_second_input)),_A([`$/Character`],(e,t)=>bc(t?.per_character_input))],video:[_A([`$/Second (In)`],(e,t)=>bc(t?.per_second_input)),_A([`$/Second (Out)`],(e,t)=>bc(t?.per_second_output))],utility:[_A([`$/Page`],(e,t)=>bc(t?.per_page)),_A([`$/Request`],(e,t)=>bc(t?.per_request))]};function bA(e){return yA[e]||yA.all}function xA(e){return bA(e).length+2}var SA=z(`
        `),CA=z(` `,1),wA=z(``),TA=z(` `),EA=z(` `),DA=z(`
        `),OA=z(`
        `),kA=z(`
        Model
        `);function AA(e,t){D(t,!0);let n=k(()=>Wc.activeCategory||`all`),r=k(()=>bA(L(n))),i=k(()=>xA(L(n)));var a=kA(),o=N(a),s=N(o),c=N(s),l=F(N(c));U(l,17,()=>L(r),ai,(e,t)=>{var n=wA();U(n,21,()=>L(t).headerLines,ai,(e,t,n)=>{var r=CA(),i=P(r),a=e=>{B(e,SA())};H(i,e=>{n>0&&e(a)});var o=F(i,1,!0);I(()=>V(o,L(t))),B(e,r)}),E(n),I(()=>W(n,1,Pi(L(t).class),`svelte-1911hy6`)),B(e,n)});var u=F(l);Lk(N(u),{}),E(u),E(c),E(s),U(F(s),17,()=>fk.filteredDisplayModelGroups,e=>e.key,(e,t)=>{var n=OA(),a=N(n),o=N(a),s=N(o),c=N(s),l=N(c),u=N(l),d=N(u,!0);E(u);var f=F(u,2),p=e=>{var n=TA(),r=N(n,!0);E(n),I(()=>V(r,`(`+L(t).type_label+`)`)),B(e,n)};H(f,e=>{L(t).type_label&&e(p)});var m=F(f,2),h=e=>{var n=EA(),r=N(n,!0);E(n),I(()=>V(r,L(t).item_count_label)),B(e,n)};H(m,e=>{L(t).item_count_label&&e(h)}),E(l);var g=F(l,2),_=e=>{var n=DA(),r=N(n,!0);E(n),I(()=>V(r,L(t).access_summary)),B(e,n)};H(g,e=>{L(t).access_summary&&e(_)}),E(c);var v=F(c,2),y=N(v),b=e=>{Fk(e,{get row(){return L(t)}})};H(y,e=>{L(t).access.selector&&e(b)});var x=F(y,2),S=e=>{{let n=k(()=>Nk.modelPricingButtonLabel(`provider pricing for `+L(t).display_name,Nk.hasProviderPricingOverride(L(t)))),r=k(()=>Nk.modelPricingButtonClass(Nk.hasProviderPricingOverride(L(t))));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>Nk.openProviderPricingOverrideEdit(L(t)),children:(e,t)=>{q(e,{get icon(){return qa},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(x,e=>{Nk.modelPricingOverridesAvailable&&L(t).provider_name&&e(S)});var C=F(x,2),w=e=>{{let n=k(()=>Z.rateLimitGaugeTitle(`provider `+L(t).display_name,Z.rateLimitGaugeClassForProvider(L(t)))),r=k(()=>Z.rateLimitGaugeClassForProvider(L(t)));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>Z.openRateLimitInspectorForProvider(L(t)),children:(e,t)=>{q(e,{get icon(){return $a},class:`table-icon-svg`})},$$slots:{default:!0}})}},T=k(()=>Z.rateLimitsEnabled()&&L(t).provider_name);H(C,e=>{L(T)&&e(w)});var ee=F(C,2),te=e=>{{let n=k(()=>QO(`provider access for `+L(t).display_name,XO(L(t).access))),r=k(()=>ZO(XO(L(t).access)));OT(e,{get label(){return L(n)},get class(){return`table-icon-btn ${L(r)??``}`},onclick:()=>fk.openProviderOverrideEdit(L(t)),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(ee,e=>{fk.virtualModelsAvailable&&L(t).access.selector&&e(te)}),E(v),E(s),E(o),E(a),U(F(a),17,()=>L(t).rows,e=>e.key,(e,t)=>{hA(e,{get row(){return L(t)},get columns(){return L(r)}})}),E(n),I(()=>{G(o,`colspan`,L(i)),V(d,L(t).display_name)}),B(e,n)}),E(o),E(a),B(e,a),O()}var jA=z(``);function MA(e,t){let n=K(t,`enabled`,3,!1),r=K(t,`label`,3,``),i=K(t,`disabled`,3,!1),a=K(t,`restricted`,3,!1);var o=jA();let s;var c=F(N(o),2),l=N(c,!0);E(c),E(o),I(()=>{s=W(o,1,`alias-toggle`,null,s,{enabled:n(),restricted:a()}),o.disabled=i(),G(o,`aria-label`,(n()?`Disable `:`Enable `)+r()),V(l,t.text??(n()?`Enabled`:`Disabled`))}),R(`click`,o,function(...e){t.onclick?.apply(this,e)}),B(e,o)}Vr([`click`]);var NA=z(``),PA=z(`
        `);function FA(e,t){D(t,!0);let n=K(t,`model`,15,``),r=K(t,`weight`,15),i=K(t,`id`,3,void 0),a=K(t,`placeholder`,3,`openai/gpt-4o`),o=K(t,`showRemove`,3,!0);var s=PA(),c=N(s);ta(c);var l=F(c,2),u=e=>{var t=NA();ta(t),I(()=>t.disabled=fk.vmFormManaged),ua(t,r),B(e,t)},d=k(()=>fk.vmFormShowWeights());H(l,e=>{L(d)&&e(u)});var f=F(l,2),p=e=>{OT(e,{label:`Remove target`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,get onclick(){return t.onremove},get disabled(){return fk.vmFormManaged},children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}})};H(f,e=>{o()&&e(p)}),E(s),I(()=>{G(c,`id`,i()),G(c,`placeholder`,a()),c.disabled=fk.vmFormManaged}),ua(c,n),B(e,s),O()}var IA=z(`

        `),LA=z(`adaptive lets the registered routing extension pick the target per - request.`,1),RA=z(`Add one target to make this a redirect/alias, or two or more to load - balance across them, then pick a strategy: round_robin rotates across targets - (weight biases the share) and cost always routes to the cheapest available - target. Leave Targets empty to make it only an access policy on the Source selector. The selector uses / for all providers and - models, for one provider, or for one model. user_paths is - matched against the effective request user_path: the managed API key user_path when present, otherwise the configured user path request header.`,1),zA=z(``),BA=z(`

        This virtual model is defined in configuration (config.yaml / VIRTUAL_MODELS) and is read-only here. Edit your configuration to change it.

        `),VA=z(``),HA=z(``),UA=z(``),WA=z(`
        `,1),GA=z(``),KA=z(`Use / to allow every user path. Use a team path to restrict to that - subtree, or an unused path to make the selector unavailable.`,1),qA=z(``),JA=z(` `),YA=z(`
        Targets
        `,1);function XA(e,t){D(t,!0);let n=fk;kn(()=>{n.vmFormOpen&&As.ensureLoaded()});{let t=e=>{iC(e,{copyId:`virtual-model-help-copy`,label:`virtual model help`,get open(){return n.vmFormHelpOpen},set open(e){n.vmFormHelpOpen=e},title:e=>{var t=IA(),r=N(t,!0);E(t),I(()=>V(r,n.vmFormDisplayName||n.vmForm.source||`Virtual model`)),B(e,t)},help:e=>{He();var t=RA(),n=F(P(t),7),r=e=>{var t=LA();He(),B(e,t)},i=k(()=>As.virtualModelStrategies().includes(`adaptive`));H(n,e=>{L(i)&&e(r)});var a=F(n,8);a.textContent=`{provider_name}/`;var o=F(a,2);o.textContent=`{provider_name}/{model}`,He(7),B(e,t)},$$slots:{title:!0,help:!0}})},r=e=>{var t=Zr(),r=P(t),i=e=>{var t=zA();I(()=>t.disabled=n.vmDeleting||n.vmSubmitting),R(`click`,t,()=>n.deleteVirtualModel()),B(e,t)};H(r,e=>{n.vmFormHasExisting&&!n.vmFormManaged&&e(i)}),B(e,t)},i=k(()=>n.vmDeleting||n.vmFormManaged),a=k(()=>n.vmFormMode===`edit`?`Save`:`Create`),o=k(()=>n.vmFormMode===`edit`?vo:mo);ME(e,{get open(){return n.vmFormOpen},ariaLabel:`Virtual model editor`,get error(){return n.vmFormError},get submitting(){return n.vmSubmitting},get submitDisabled(){return L(i)},get submitLabel(){return L(a)},get submitIcon(){return L(o)},onclose:()=>n.closeVirtualModelForm(),onsubmit:()=>n.submitVirtualModelForm(),header:t,extraActions:r,children:(e,t)=>{var r=YA(),i=P(r),a=e=>{B(e,BA())};H(i,e=>{n.vmFormManaged&&e(a)});var o=F(i,2);PE(o,{id:`virtual-model-source`,label:`Source`,children:(e,t)=>{var r=VA();ta(r),I(()=>r.disabled=n.vmFormSourceLocked||n.vmFormManaged),ua(r,()=>n.vmForm.source,e=>n.vmForm.source=e),B(e,r)},$$slots:{default:!0}});var s=F(o,2);U(s,21,()=>Wc.models,e=>pO(e),(e,t)=>{var n=HA(),r=N(n,!0);E(n);var i={};I((e,t)=>{V(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(L(t)),()=>pO(L(t))]),B(e,n)}),E(s);var c=F(s,2),l=F(N(c),2);{let e=k(()=>n.vmFormHasPrimaryTarget());FA(l,{id:`virtual-model-target`,get showRemove(){return L(e)},onremove:()=>n.removePrimaryTarget(),get model(){return n.vmForm.target_model},set model(e){n.vmForm.target_model=e},get weight(){return n.vmForm.target_weight},set weight(e){n.vmForm.target_weight=e}})}var u=F(l,2);U(u,17,()=>n.vmForm.targets,ai,(e,t,r)=>{FA(e,{placeholder:`groq/llama`,onremove:()=>n.removeVmTarget(r),get model(){return L(t).model},set model(e){L(t).model=e},get weight(){return L(t).weight},set weight(e){L(t).weight=e}})});var d=F(u,2),f=N(d);q(N(f),{get icon(){return mo},class:`form-action-icon`}),He(2),E(f),E(d),E(c);var p=F(c,2),m=e=>{var t=WA(),r=P(t);PE(r,{id:`virtual-model-strategy`,label:`Load-balancing strategy`,children:(e,t)=>{var r=UA();U(r,21,()=>n.vmStrategyOptions(),e=>e.value,(e,t)=>{var n=HA(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(r),I(()=>r.disabled=n.vmFormManaged),Wi(r,()=>n.vmForm.strategy,e=>n.vmForm.strategy=e),B(e,r)},$$slots:{default:!0}});var i=F(r,2),a=N(i),o=N(a);ta(o),He(2),E(a),E(i),I(()=>o.disabled=n.vmFormManaged),da(o,()=>n.vmForm.session_affinity,e=>n.vmForm.session_affinity=e),B(e,t)},h=k(()=>n.vmFormShowStrategy());H(p,e=>{L(h)&&e(m)});var g=F(p,2),_=N(g);iC(_,{copyId:`virtual-model-user-paths-help`,label:`user paths help`,get open(){return n.vmFormUserPathsHelpOpen},set open(e){n.vmFormUserPathsHelpOpen=e},title:e=>{B(e,GA())},help:e=>{He();var t=KA();He(2),B(e,t)},$$slots:{title:!0,help:!0}});var v=F(_,2);dt(v),G(v,`placeholder`,`/ -/team/alpha -/non-existing`),E(g);var y=F(g,2);PE(y,{id:`virtual-model-description`,label:`Description`,children:(e,t)=>{var r=qA();dt(r),I(()=>r.disabled=n.vmFormManaged),ua(r,()=>n.vmForm.description,e=>n.vmForm.description=e),B(e,r)},$$slots:{default:!0}});var b=F(y,2),x=N(b),S=e=>{var t=JA(),r=N(t,!0);E(t),I(()=>V(r,`Default enabled: `+(n.vmFormDefaultEnabled?`yes`:`no`)+` · Effective now: `+(n.vmFormEffectiveEnabled?`yes`:`no`))),B(e,t)};H(x,e=>{n.vmFormMode===`edit`&&e(S)});var C=F(x,2),w=N(C);{let e=k(()=>n.vmFormToggleRestricted()),t=k(()=>n.vmFormToggleLabel());MA(w,{get enabled(){return n.vmForm.enabled},get restricted(){return L(e)},label:`virtual model`,get disabled(){return n.vmFormManaged},get text(){return L(t)},onclick:()=>{n.vmFormManaged||(n.vmForm.enabled=!n.vmForm.enabled)}})}E(C),E(b),I(()=>{f.disabled=n.vmFormManaged,v.disabled=n.vmFormManaged}),R(`click`,f,()=>n.addVmTarget()),ua(v,()=>n.vmForm.user_paths,e=>n.vmForm.user_paths=e),B(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}})}O()}Vr([`click`]);var ZA=z(`

        Pricing override

        `,1),QA=z(``),$A=z(``),ej=z(``),tj=z(``),nj=z(`
        `),rj=z(`
        Tiered pricing exists for this override and will be preserved. Tier editing can be added - without a database migration.
        `),ij=z(`
        No pricing fields set.
        `),aj=z(`
        `),oj=z(`

        Currency is USD. Saved fields override model registry and config.yaml pricing for this - selector; unset fields continue to inherit.

        Price Type USD Source
        `,1);function sj(e,t){D(t,!0);let n=Nk;ME(e,{get open(){return n.modelPricingOverrideFormOpen},ariaLabel:`Model pricing editor`,dialogClass:`model-pricing-editor`,get error(){return n.modelPricingOverrideError},get submitting(){return n.modelPricingOverrideSubmitting},submitLabel:`Save Pricing`,onclose:()=>n.closeModelPricingOverrideForm(),onsubmit:()=>n.submitModelPricingOverrideForm(),header:e=>{var t=ZA(),r=F(P(t),2),i=N(r,!0);E(r),I(()=>V(i,n.modelPricingOverrideFormDisplayName||n.modelPricingOverrideForm.selector||`Pricing`)),B(e,t)},extraActions:e=>{var t=Zr(),r=P(t),i=e=>{var t=QA();I(()=>t.disabled=n.modelPricingOverrideSubmitting),R(`click`,t,()=>n.deleteModelPricingOverride()),B(e,t)};H(r,e=>{n.modelPricingOverrideFormHasExistingOverride&&e(i)}),B(e,t)},children:(e,t)=>{var r=oj(),i=P(r),a=N(i);PE(a,{id:`model-pricing-override-selector`,label:`Selector`,children:(e,t)=>{var r=$A();ta(r),ua(r,()=>n.modelPricingOverrideForm.selector,e=>n.modelPricingOverrideForm.selector=e),B(e,r)},$$slots:{default:!0}});var o=F(a,2),s=e=>{PE(e,{id:`model-pricing-override-scope`,label:`Scope`,children:(e,t)=>{var r=tj();U(r,21,()=>n.modelPricingOverrideFormScopeOptions,e=>e.value,(e,t)=>{var n=ej(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(r),R(`change`,r,()=>n.setModelPricingOverrideScope(n.modelPricingOverrideFormScope)),Wi(r,()=>n.modelPricingOverrideFormScope,e=>n.modelPricingOverrideFormScope=e),B(e,r)},$$slots:{default:!0}})};H(o,e=>{n.modelPricingOverrideFormScopeOptions.length>1&&e(s)}),E(i);var c=F(i,4);U(c,21,()=>n.modelPricingOverrideRows,e=>e.id,(e,t,r)=>{var i=nj(),a=N(i),o=N(a),s=F(o,2);U(s,21,()=>n.availablePricingFieldOptions(L(t)),e=>e.value,(e,t)=>{var n=ej(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).group+` - `+L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(s),E(a);var c=F(a,2),l=N(c),u=F(l,2);ta(u),E(c);var d=F(c,2);{let e=k(()=>`Remove `+n.pricingFieldLabel(L(t).field));OT(d,{get label(){return L(e)},class:`table-action-btn-danger table-icon-btn pricing-override-remove-row`,onclick:()=>n.removeModelPricingOverrideRow(L(t)),children:(e,t)=>{q(e,{get icon(){return Ro},class:`table-icon-svg`})},$$slots:{default:!0}})}E(i),I(()=>{G(o,`for`,`pricing-type-`+L(t).id),G(s,`id`,`pricing-type-`+L(t).id),G(l,`for`,`pricing-value-`+L(t).id),G(u,`id`,`pricing-value-`+L(t).id)}),Wi(s,()=>L(t).field,e=>L(t).field=e),ua(u,()=>L(t).value,e=>L(t).value=e),B(e,i)}),E(c);var l=F(c,2),u=N(l);q(N(u),{get icon(){return mo},class:`form-action-icon`}),He(2),E(u),E(l);var d=F(l,2),f=e=>{B(e,rj())};H(d,e=>{n.modelPricingOverrideFormPreservedTiers.length>0&&e(f)});var p=F(d,2),m=F(N(p),2),h=e=>{B(e,ij())},g=k(()=>n.modelPricingEffectivePreviewRows().length===0);H(m,e=>{L(g)&&e(h)}),U(F(m,2),17,()=>n.modelPricingEffectivePreviewRows(),e=>e.field,(e,t)=>{var n=aj(),r=N(n),i=N(r,!0);E(r);var a=F(r,2),o=N(a,!0);E(a);var s=F(a,2),c=N(s,!0);E(s),E(n),I(e=>{V(i,L(t).label),V(o,e),V(c,L(t).source)},[()=>L(t).value===null||L(t).value===void 0?`-`:bc(Number(L(t).value))]),B(e,n)}),E(p),R(`click`,u,()=>n.addModelPricingOverrideRow()),B(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}}),O()}Vr([`click`,`change`]);var cj=z(`

        Failover mapping

        `,1),lj=z(``),uj=z(`

        This failover mapping is defined in configuration and is read-only here.

        `),dj=z(``),fj=z(`
        `),pj=z(`
        `,1),mj=z(`
        `);function hj(e,t){D(t,!0);{let t=e=>{var t=cj(),n=F(P(t),2),r=N(n,!0);E(n),I(()=>V(r,Q.failoverForm.source||`Failover`)),B(e,t)},n=e=>{var t=Zr(),n=P(t),r=e=>{var t=lj();I(()=>t.disabled=Q.failoverSaving||Q.failoverGenerating),R(`click`,t,()=>Q.deleteFailoverRule()),B(e,t)};H(n,e=>{Q.failoverFormMode===`edit`&&!Q.failoverFormManaged&&e(r)}),B(e,t)},r=k(()=>Q.failoverGenerating||Q.failoverFormManaged);ME(e,{get open(){return Q.failoverFormOpen},ariaLabel:`Failover editor`,get error(){return Q.failoverError},get submitting(){return Q.failoverSaving},get submitDisabled(){return L(r)},submitLabel:`Save`,onclose:()=>Q.closeFailoverForm(),onsubmit:()=>Q.submitFailoverForm(),header:t,extraActions:n,children:(e,t)=>{var n=mj(),r=N(n),i=e=>{B(e,uj())};H(r,e=>{Q.failoverFormManaged&&e(i)});var a=F(r,2);U(a,21,()=>Wc.models,ai,(e,t)=>{var n=dj(),r=N(n,!0);E(n);var i={};I((e,t)=>{V(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(L(t)),()=>pO(L(t))]),B(e,n)}),E(a);var o=F(a,2);PE(o,{id:`failover-target`,label:`Fallback models`,children:(e,t)=>{var n=pj(),r=P(n),i=N(r),a=N(i);ta(a);var o=F(a,2),s=e=>{OT(e,{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removePrimaryFailoverTarget(),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}})};H(o,e=>{Q.failoverForm.target_model&&e(s)}),E(i),U(F(i,2),17,()=>Q.failoverForm.targets,ai,(e,t,n)=>{var r=fj(),i=N(r);ta(i),OT(F(i,2),{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removeFailoverTarget(n),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}}),E(r),I(()=>i.disabled=Q.failoverFormManaged),ua(i,()=>L(t).model,e=>L(t).model=e),B(e,r)}),E(r);var c=F(r,2),l=N(c);q(N(l),{get icon(){return mo},class:`form-action-icon`}),He(2),E(l);var u=F(l,2),d=N(u);q(d,{get icon(){return Io},class:`form-action-icon`});var f=F(d,2),p=N(f,!0);E(f),E(u),E(c),I(e=>{a.disabled=Q.failoverFormManaged,l.disabled=Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving,u.disabled=e,V(p,Q.failoverGenerating?`Generating...`:`Generate automatically`)},[()=>Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving||!Q.failoverEnabled()]),ua(a,()=>Q.failoverForm.target_model,e=>Q.failoverForm.target_model=e),R(`click`,l,()=>Q.addFailoverTarget()),R(`click`,u,()=>Q.generateFailoverForForm()),B(e,n)},$$slots:{default:!0}});var s=F(o,2),c=N(s);MA(N(c),{get enabled(){return Q.failoverForm.enabled},label:`failover mapping`,get disabled(){return Q.failoverFormManaged},onclick:()=>{Q.failoverFormManaged||(Q.failoverForm.enabled=!Q.failoverForm.enabled)}}),E(c),E(s),E(n),B(e,n)},$$slots:{header:!0,extraActions:!0,default:!0}})}O()}Vr([`click`]);var gj=z(` `),_j=z(`
        `),vj=z(``),yj=z(`
        `),bj=z(`

        No failover suggestions were generated.

        `),xj=z(`

        No failover drafts match the filter.

        `),Sj=z(``),Cj=z(``);function wj(e,t){D(t,!0),Us(e,{get open(){return Q.failoverDraftsOpen},variant:`editor`,onclose:()=>Q.closeFailoverDraftsModal(),children:(e,t)=>{var n=Cj(),r=N(n),i=F(N(r),2),a=N(i),o=e=>{var t=gj(),n=N(t,!0);E(t),I(e=>V(n,e),[()=>Q.failoverDraftCountLabel()]),B(e,t)};H(a,e=>{Q.failoverGeneratedRules.length>0&&e(o)}),zs(F(a,2),{label:`Close failover drafts`,onclick:()=>Q.closeFailoverDraftsModal(),get disabled(){return Q.failoverDraftSaving}}),E(i),E(r);var s=F(r,2),c=e=>{ET(e,{label:`Generating failover drafts...`,class:`failover-drafts-loading`})};H(s,e=>{Q.failoverGenerating&&e(c)});var l=F(s,2),u=e=>{var t=_j(),n=N(t);jw(n,{placeholder:`Filter failover drafts...`,label:`Filter failover drafts`,get value(){return Q.failoverDraftFilter},set value(e){Q.failoverDraftFilter=e}});var r=F(n,2),i=N(r);q(i,{get icon(){return Va},class:`form-action-icon`});var a=F(i,2),o=N(a,!0);E(a),E(r),E(t),I(e=>{r.disabled=Q.failoverDraftSaving,V(o,e)},[()=>Q.allFailoverDraftsSelected()?`Deselect all`:`Select all`]),R(`click`,r,()=>Q.toggleAllFailoverDrafts()),B(e,t)};H(l,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&e(u)});var d=F(l,2),f=e=>{var t=yj();U(t,21,()=>Q.filteredFailoverDrafts(),e=>`failover-draft:`+Q.failoverPrimaryModel(e),(e,t)=>{var n=vj(),r=N(n);ta(r);var i=F(r,2),a=N(i),o=N(a,!0);E(a);var s=F(a,2),c=N(s,!0);E(s),E(i),E(n),I((e,t,n,i)=>{ra(r,e),r.disabled=Q.failoverDraftSaving,G(r,`aria-label`,t),V(o,n),V(c,i)},[()=>Q.failoverDraftSelected(L(t)),()=>`Select failover draft for `+Q.failoverPrimaryModel(L(t)),()=>Q.failoverPrimaryModel(L(t)),()=>Q.failoverTargetLabel(L(t))]),R(`change`,r,e=>Q.setFailoverDraftSelected(L(t),e.currentTarget.checked)),B(e,n)}),E(t),B(e,t)},p=k(()=>!Q.failoverGenerating&&Q.filteredFailoverDrafts().length>0);H(d,e=>{L(p)&&e(f)});var m=F(d,2),h=e=>{B(e,bj())};H(m,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length===0&&!Q.failoverError&&e(h)});var g=F(m,2),_=e=>{B(e,xj())},v=k(()=>!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&Q.filteredFailoverDrafts().length===0);H(g,e=>{L(v)&&e(_)});var y=F(g,2),b=e=>{var t=Sj(),n=N(t,!0);E(t),I(()=>V(n,Q.failoverError)),B(e,t)};H(y,e=>{Q.failoverError&&e(b)});var x=F(y,2),S=N(x),C=F(S,2),w=N(C);q(w,{get icon(){return vo},class:`form-action-icon`});var T=F(w,2),ee=N(T,!0);E(T),E(C),E(x),E(n),I(e=>{S.disabled=Q.failoverDraftSaving,C.disabled=e,V(ee,Q.failoverDraftSaving?`Saving...`:`Save selected`)},[()=>Q.failoverGenerating||Q.failoverDraftSaving||Q.selectedFailoverDraftCount()===0]),R(`click`,S,()=>Q.closeFailoverDraftsModal()),R(`click`,C,()=>Q.saveSelectedFailoverDrafts()),B(e,n)},$$slots:{default:!0}}),O()}Vr([`click`,`change`]);var Tj=z(`
        Rate limit management is unavailable.
        `),Ej=z(` Add`,1),Dj=z(`

        `),Oj=z(`

        No rules.

        `),kj=z(` Edit`,1),Aj=z(`
        `),jj=z(`
        `),Mj=z(`

        `),Nj=z(``),Pj=z(``);function Fj(e,t){D(t,!0);function n(){J.dialogOpen||Z.closeRateLimitInspector()}Us(e,{get open(){return Z.rateLimitInspectorOpen},variant:`editor`,onclose:n,children:(e,t)=>{var n=Pj(),r=N(n),i=N(r),a=F(N(i),2),o=N(a),s=N(o,!0);E(o),E(a),E(i),zs(F(i,2),{label:`Close rate limits inspector`,onclick:()=>Z.closeRateLimitInspector()}),E(r);var c=F(r,2),l=e=>{ET(e,{label:`Loading rate limits...`})},u=e=>{B(e,Tj())},d=e=>{var t=Zr();U(P(t),17,()=>Z.rateLimitInspectorSections(),e=>e.key,(e,t)=>{var n=Mj(),r=N(n),i=N(r),a=N(i,!0);E(i);var o=F(i,2);{let e=k(()=>`Add `+L(t).title.toLowerCase());OT(o,{get label(){return L(e)},class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(L(t).scope,L(t).subject),children:(e,t)=>{var n=Ej();q(P(n),{get icon(){return mo},class:`table-icon-svg`}),He(2),B(e,n)},$$slots:{default:!0}})}E(r);var s=F(r,2),c=e=>{var n=Dj(),r=N(n,!0);E(n),I(()=>V(r,L(t).hint)),B(e,n)};H(s,e=>{L(t).hint&&e(c)});var l=F(s,2),u=e=>{B(e,Oj())},d=e=>{var n=jj();U(n,21,()=>L(t).items,e=>Z.rateLimitKey(e),(e,t)=>{var n=Aj(),r=N(n),i=N(r),a=N(i),o=N(a,!0);E(a);var s=F(a,2),c=N(s),l=N(c);{let e=k(()=>Z.rateLimitIsConcurrent(L(t))?Aa:Ao);q(l,{get icon(){return L(e)},class:`budget-period-icon`})}var u=F(l,2),d=N(u,!0);E(u),E(c),E(s);var f=F(s,2),p=N(f),m=N(p),h=N(m,!0);E(m);var g=F(m,2),_=N(g,!0);E(g),E(p);var v=F(p,2),y=N(v),b=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(null,null,L(t)),children:(e,t)=>{var n=kj();q(P(n),{get icon(){return fo},class:`budget-action-icon`}),He(2),B(e,n)},$$slots:{default:!0}})},x=k(()=>!Z.rateLimitIsReadOnly(L(t)));H(y,e=>{L(x)&&e(b)}),E(v),E(f),E(i),E(r),E(n),I((e,t,r,i,a,s,c,l)=>{W(n,1,`budget-row ${e??``}`),Vi(n,t),G(n,`title`,r),V(o,i),V(d,a),V(h,s),G(g,`title`,c),V(_,l)},[()=>Z.rateLimitPressureClass(L(t)),()=>Z.rateLimitPressureStyle(L(t)),()=>Z.rateLimitPressurePercent(L(t))+`% of the most constrained cap used`,()=>Z.rateLimitSubject(L(t)),()=>Z.rateLimitPeriodLabel(L(t)),()=>Z.rateLimitInspectorSummary(L(t)),()=>Z.rateLimitIsReadOnly(L(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(L(t))]),B(e,n)}),E(n),B(e,n)};H(l,e=>{L(t).items.length===0?e(u):e(d,-1)}),E(n),I(()=>V(a,L(t).title)),B(e,n)}),B(e,t)};H(c,e=>{Z.rateLimitsLoading?e(l):Z.rateLimitsAvailable?e(d,-1):e(u,1)});var f=F(c,2),p=N(f),m=F(p,2),h=e=>{var t=Nj();R(`click`,t,()=>{Z.closeRateLimitInspector(),Xo.navigate(`rate-limits`)}),B(e,t)},g=k(()=>Z.rateLimitsEnabled());H(m,e=>{L(g)&&e(h)}),E(f),E(n),I(()=>V(s,Z.rateLimitInspector.title)),R(`click`,p,()=>Z.closeRateLimitInspector()),B(e,n)},$$slots:{default:!0}}),O()}Vr([`click`]);var Ij=z(`
        models
        `),Lj=z(`
        Virtual models feature is unavailable.
        `),Rj=z(`
        `),zj=z(``),Bj=z(`
        `),Vj=z(``),Hj=z(`
        `),Uj=z(`

        No models registered.

        `),Wj=z(`

        No models in this category.

        `),Gj=z(`

        No models match your filter.

        `),Kj=z(`
        `);function qj(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`models`&&(fk.fetchVirtualModels(),Nk.fetchModelPricingOverrides(),Q.fetchFailoverRules(),Z.fetchRateLimitsPage())}),kn(()=>{let e=fk.filteredDisplayModels.length;return Tr(()=>fk.restartModelRendering(e)),()=>fk.stopModelRendering()});let n=k(()=>J.needsAuth);var r=Kj(),i=N(r),a=F(N(i),2),o=e=>{var t=Ij(),n=N(t),r=N(n,!0);E(n),He(),E(t),I(()=>V(r,Wc.filter?fk.filteredDisplayModels.length+` / `+fk.displayModels.length:fk.displayModels.length)),B(e,t)};H(a,e=>{fk.displayModels.length>0&&e(o)}),E(i);var s=F(i,2);Kc(s,{});var c=F(s,2),l=e=>{B(e,Lj())};H(c,e=>{!fk.virtualModelsAvailable&&!L(n)&&e(l)});var u=F(c,2),d=e=>{var t=Rj(),n=N(t,!0);E(t),I(()=>V(n,fk.aliasError)),B(e,t)};H(u,e=>{fk.aliasError&&!L(n)&&e(d)});var f=F(u,2),p=e=>{var t=Rj(),n=N(t,!0);E(t),I(()=>V(n,Nk.modelPricingOverrideError)),B(e,t)};H(f,e=>{Nk.modelPricingOverrideError&&!L(n)&&!Nk.modelPricingOverrideFormOpen&&e(p)});var m=F(f,2),h=e=>{var t=Bj();U(t,21,()=>Wc.categories,e=>e.category,(e,t)=>{var n=zj();let r;var i=N(n),a=N(i,!0);E(i);var o=F(i,2),s=N(o,!0);E(o),E(n),I(()=>{r=W(n,1,`category-tab svelte-scpjps`,null,r,{active:Wc.activeCategory===L(t).category}),V(a,L(t).display_name),V(s,L(t).count)}),R(`click`,n,()=>Wc.selectCategory(L(t).category)),B(e,n)}),E(t),B(e,t)};H(m,e=>{Wc.categories.length>0&&e(h)});var g=F(m,2),_=e=>{var t=Hj(),n=N(t);jw(N(n),{placeholder:`Filter by provider, provider/model, alias, or owner...`,label:`Filter models by provider, provider/model, alias, or owner`,get value(){return Wc.filter},set value(e){Wc.filter=e}}),E(n);var r=F(n,2),i=N(r),a=e=>{var t=Vj();q(N(t),{get icon(){return mo},class:`alias-create-icon`}),He(2),E(t),R(`click`,t,()=>fk.openVirtualModelCreate()),B(e,t)};H(i,e=>{fk.virtualModelsAvailable&&e(a)}),E(r),E(t),B(e,t)};H(g,e=>{(fk.displayModels.length>0||Wc.filter||fk.virtualModelsAvailable)&&e(_)});var v=F(g,2),y=e=>{{let t=k(()=>fk.modelLoadingText());ET(e,{get label(){return L(t)},class:`models-loading-state`})}},b=k(()=>fk.modelsBusy()&&!L(n));H(v,e=>{L(b)&&e(y)});var x=F(v,2);XA(x,{});var S=F(x,2);sj(S,{});var C=F(S,2),w=e=>{AA(e,{})};H(C,e=>{(fk.displayModels.length>0||Wc.filter)&&e(w)});var T=F(C,2),ee=e=>{B(e,Uj())};H(T,e=>{fk.displayModels.length===0&&!Wc.loading&&!L(n)&&!Wc.filter&&(Wc.activeCategory===`all`||!Wc.activeCategory)&&e(ee)});var te=F(T,2),ne=e=>{B(e,Wj())};H(te,e=>{fk.displayModels.length===0&&!Wc.loading&&!L(n)&&!Wc.filter&&Wc.activeCategory&&Wc.activeCategory!==`all`&&e(ne)});var re=F(te,2),ie=e=>{B(e,Gj())};H(re,e=>{fk.displayModels.length>0&&fk.filteredDisplayModels.length===0&&Wc.filter&&e(ie)});var ae=F(re,2);Fj(ae,{});var oe=F(ae,2);qD(oe,{});var se=F(oe,2);hj(se,{}),wj(F(se,2),{}),E(r),B(e,r),O()}Vr([`click`]);var Jj=`draft-workflow-preview`;function Yj(){return{scope_provider:``,scope_model:``,scope_user_path:``,name:``,description:``,features:{cache:!0,audit:!0,usage:!0,budget:!0,guardrails:!1,failover:!0},guardrails:[]}}function Xj(){return{scope_provider:``,scope_model:``,scope_user_path:``}}function Zj(e){return{ref:``,step:Number.isFinite(e)?e:10}}function Qj(e){let t=e==null?``:String(e).trim();if(t===``)return NaN;let n=Number(t);return Number.isFinite(n)?n:NaN}function $j(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))return n;let r=t.charAt(0).toUpperCase()+t.slice(1);for(let n of[t,r])if(Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==null&&e[n]!==void 0)return e[n];return n}function eM(e,t){return!e||typeof e!=`object`||Array.isArray(e)?!1:[t,t.charAt(0).toUpperCase()+t.slice(1)].some(t=>Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==null&&e[t]!==void 0)}function tM(e){return{cache:!!$j(e,`cache`,!1),audit:!!$j(e,`audit`,!1),usage:!!$j(e,`usage`,!1),budget:$j(e,`budget`,!0)!==!1,guardrails:!!$j(e,`guardrails`,!1),failover:$j(e,`failover`,!0)!==!1}}function nM(e,t){let n=tM(e),r=t||{},i=n.usage&&!!r.usage;return{cache:n.cache&&!!r.cache,audit:n.audit&&!!r.audit,usage:i,budget:i&&n.budget&&!!r.budget,guardrails:n.guardrails&&!!r.guardrails,failover:n.failover&&!!r.failover}}function rM(e,t){let n=e&&e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:e&&e.features?e.features:{};return{...nM((e&&e.effective_features&&typeof e.effective_features==`object`&&!Array.isArray(e.effective_features)?e.effective_features:null)||n,t),failover:tM(n).failover}}function iM(e,t){return rM(e,t).failover?`On`:`Off`}function aM(e){return(Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:Array.isArray(e&&e.guardrails)?e.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:Qj(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0)}function oM(e,t){return rM(e,t).guardrails&&Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[]}function sM(e){return String(e&&(e.scope_provider_name||e.scope_provider)||``).trim()}function cM(e){return String(e&&(e.provider_name||e.provider_type)||``).trim()}function lM(e,t){let n=new Set,r=String(t&&t.scope_provider||``).trim();return r&&n.add(r),(Array.isArray(e)?e:[]).forEach(e=>{let t=cM(e);t&&n.add(t)}),[...n].sort()}function uM(e,t,n){let r=String(t||``).trim(),i=new Set,a=String(n&&n.scope_provider||``).trim(),o=String(n&&n.scope_model||``).trim();return r&&r===a&&o&&i.add(o),(Array.isArray(e)?e:[]).forEach(e=>{if(r&&cM(e)!==r)return;let t=String(e&&e.model&&e.model.id||``).trim();t&&i.add(t)}),[...i].sort()}function dM(e){let t=String(e&&e.scope_type||``).trim();return t===`provider_model`?`Provider Name + Model`:t===`provider_model_path`?`Provider Name + Model + Path`:t===`provider_path`?`Provider Name + Path`:t===`path`?`Path`:t===`provider`?`Provider Name`:`Global`}function fM(e){return String(e&&e.scope_display||`global`).trim()||`global`}function pM(e){let t=String(e&&e.name||``).trim();if(t)return t;let n=fM(e);return n===`global`?`All models`:n}function mM(e){let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function hM(e){if(mM(e))return``;let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function gM(e){let t=e||Yj(),n=String(t.scope_provider||``).trim(),r=hM(t.scope_user_path);return{scope_provider:n,scope_model:n?String(t.scope_model||``).trim():``,scope_user_path:r}}function _M(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=hM(e&&e.scope_user_path);return!t&&!r?`global`:!t&&r?`path`:!n&&!r?`provider`:!n&&r?`provider_path`:r?`provider_model_path`:`provider_model`}function vM(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=hM(e&&e.scope_user_path),i=_M({scope_provider:t,scope_model:n,scope_user_path:r});return i===`global`?`global`:i===`path`?r:i===`provider`?t:i===`provider_path`?t+` @ `+r:i===`provider_model_path`?t+`/`+n+` @ `+r:t+`/`+n}function yM(e,t){let n=t||Xj(),r=sM(e&&e.scope),i=r?String(e&&e.scope&&e.scope.scope_model||``).trim():``,a=hM(e&&e.scope&&e.scope.scope_user_path);return r===String(n.scope_provider||``).trim()&&i===String(n.scope_model||``).trim()&&a===hM(n.scope_user_path)}function bM(e,t,n){let r=gM(t);return!(r.scope_provider!==``||r.scope_model!==``||r.scope_user_path!==``)&&!n?null:(Array.isArray(e)?e:[]).find(e=>yM(e,r))||null}function xM(e){return String(e&&e.scope_type||``).trim()!==`global`}function SM(e){let t=String(e||``).trim();return t?t.length<=14?t:t.slice(0,12)+`…`:`—`}function CM(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.description,e.scope_display,e.scope_type,sM(e&&e.scope),e.scope&&e.scope.scope_model,e.scope&&e.scope.scope_user_path,e.workflow_hash,...Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>e.ref):[]].some(e=>String(e||``).toLowerCase().includes(r)))}function wM(e,t){let n=e||Yj(),r=gM(n),i=tM(n.features||{}),a=nM(i,t);a.failover=i.failover;let o=!!a.guardrails,s=o?aM(n):[];return{id:Jj,scope_type:_M(r),scope_display:vM(r),scope:{scope_provider_name:r.scope_provider,scope_model:r.scope_model,...r.scope_user_path?{scope_user_path:r.scope_user_path}:{}},name:String(n.name||``).trim(),description:String(n.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!a.cache,audit:!!a.audit,usage:!!a.usage,budget:!!a.budget,guardrails:o,failover:!!a.failover},guardrails:s}}}function TM({form:e,caps:t,workflows:n=[],formHydrated:r=!1,hydratedScope:i=null}){let a=e||Yj(),o=String(a.scope_provider||``).trim(),s=o?String(a.scope_model||``).trim():``,c=hM(a.scope_user_path),l=tM(a.features||{}),u=nM(l,t),d=bM(n,a,r),f=d&&d.workflow_payload&&d.workflow_payload.features,p=eM(f,`failover`),m=p?$j(f,`failover`,!0)!==!1:null,h=i||Xj(),g=String(h.scope_provider||``).trim()===o&&String(h.scope_model||``).trim()===s&&hM(h.scope_user_path)===hM(c),_=!!(t&&t.failover),v=_||!!r&&g&&Object.prototype.hasOwnProperty.call(l,`failover`)||!r&&!!d&&p,y=u.guardrails?(Array.isArray(a.guardrails)?a.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:Qj(e&&e.step)})):[],b={scope_provider_name:o,scope_model:s,...c?{scope_user_path:c}:{},name:String(a.name||``).trim(),description:String(a.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!u.cache,audit:!!u.audit,usage:!!u.usage,budget:!!u.budget,guardrails:!!u.guardrails},guardrails:y}};return v&&(b.workflow_payload.features.failover=!_&&!r&&d&&p?m:!!l.failover),b}function EM(e,{models:t=[],hydratedScope:n=null}={}){let r=n||Xj(),i=String(r.scope_provider||``).trim(),a=String(r.scope_model||``).trim(),o=String(e&&(e.scope_provider_name||e.scope_provider)||``).trim(),s=String(e&&e.scope_model||``).trim();if(o&&!lM(t,r).includes(o)&&o!==i)return`Choose a registered provider name.`;if(s&&!o)return`Model selection requires a provider name.`;if(s){let e=uM(t,o,r),n=o===i&&s===a;if(!e.includes(s)&&!n)return`Choose a registered model for the selected provider name.`}let c=mM(e.scope_user_path);if(c)return c;let l=e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:{},u=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[];if(!l.guardrails)return``;let d=new Set;for(let e of u){if(!e.ref)return`Each guardrail step needs a guardrail ref.`;if(!Number.isInteger(e.step)||e.step<0)return`Each guardrail step must use a non-negative integer step number.`;if(d.has(e.ref))return`Each guardrail ref may appear only once in a workflow.`;d.add(e.ref)}return``}var DM=new class{#e=A(M([]));get workflows(){return L(this.#e)}set workflows(e){j(this.#e,e,!0)}#t=A(!0);get available(){return L(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}#r=A(``);get error(){return L(this.#r)}set error(e){j(this.#r,e,!0)}#i=A(``);get filter(){return L(this.#i)}set filter(e){j(this.#i,e,!0)}#a=A(!1);get formOpen(){return L(this.#a)}set formOpen(e){j(this.#a,e,!0)}#o=A(!1);get submitting(){return L(this.#o)}set submitting(e){j(this.#o,e,!0)}#s=A(``);get deactivatingID(){return L(this.#s)}set deactivatingID(e){j(this.#s,e,!0)}#c=A(``);get formError(){return L(this.#c)}set formError(e){j(this.#c,e,!0)}#l=A(!1);get formHydrated(){return L(this.#l)}set formHydrated(e){j(this.#l,e,!0)}#u=A(M(Xj()));get hydratedScope(){return L(this.#u)}set hydratedScope(e){j(this.#u,e,!0)}#d=A(M([]));get guardrailRefs(){return L(this.#d)}set guardrailRefs(e){j(this.#d,e,!0)}#f=A(M(Yj()));get form(){return L(this.#f)}set form(e){j(this.#f,e,!0)}#p=null;failoverVisible(){return As.booleanFlag(`FAILOVER_ENABLED`,!0)}featureCaps(){return{cache:As.cacheVisible(),audit:As.auditVisible(),usage:As.usageVisible(),budget:As.budgetsVisible(),guardrails:As.guardrailsVisible(),failover:this.failoverVisible()}}get filteredWorkflows(){return CM(this.workflows,this.filter)}providerOptions(){return lM(Wc.models,this.hydratedScope)}modelOptions(e){return uM(Wc.models,e,this.hydratedScope)}activeScopeMatch(){return bM(this.workflows,this.form,this.formHydrated)}submitMode(){return this.activeScopeMatch()?`save`:`create`}submitLabel(){return this.submitMode()===`save`?`Save`:`Create`}submittingLabel(){return this.submitMode()===`save`?`Saving...`:`Creating...`}preview(){return wM(this.form,this.featureCaps())}openCreate(e){if(this.formOpen=!0,this.submitting=!1,this.formError=``,!e){this.formHydrated=!1,this.hydratedScope=Xj(),this.form=Yj();return}this.formHydrated=!0,this.hydratedScope={scope_provider:sM(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``).trim(),scope_user_path:String(e.scope&&e.scope.scope_user_path||``).trim()};let t=e.workflow_payload&&e.workflow_payload.features?tM(e.workflow_payload.features):rM(e,this.featureCaps()),n=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>({ref:String(e&&e.ref||``).trim(),step:Qj(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0):aM(e);this.form={scope_provider:sM(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``),scope_user_path:String(e.scope&&e.scope.scope_user_path||``),name:String(e.name||``),description:String(e.description||``),features:{cache:!!t.cache,audit:!!t.audit,usage:!!t.usage,budget:!!t.budget,guardrails:!!t.guardrails,failover:!!t.failover},guardrails:n.map(e=>({ref:String(e&&e.ref||``),step:Number.isFinite(e&&e.step)?e.step:10}))}}closeForm(){this.formOpen=!1,this.submitting=!1,this.formError=``,this.formHydrated=!1,this.hydratedScope=Xj(),this.form=Yj()}setProvider(e){if(this.form.scope_provider=String(e||``).trim(),!this.form.scope_provider){this.form.scope_model=``;return}this.modelOptions(this.form.scope_provider).includes(String(this.form.scope_model||``).trim())||(this.form.scope_model=``)}addGuardrailStep(){let e=(Array.isArray(this.form.guardrails)?this.form.guardrails:[]).reduce((e,t)=>{let n=Number(t&&t.step);return Number.isFinite(n)?Math.max(e,n):e},0)+10;this.form.guardrails.push(Zj(e))}removeGuardrailStep(e){Array.isArray(this.form.guardrails)&&this.form.guardrails.splice(e,1)}buildRequest(){return TM({form:this.form,caps:this.featureCaps(),workflows:this.workflows,formHydrated:this.formHydrated,hydratedScope:this.hydratedScope})}async fetchWorkflows(){this.#p&&this.#p.abort();let e=new AbortController;this.#p=e,this.loading=!0,this.error=``;let t=setTimeout(()=>e.abort(),1e4),n=await kT(`/admin/workflows`,{label:`workflows`,options:{signal:e.signal}});if(clearTimeout(t),this.#p===e&&(this.#p=null,this.loading=!1,n.status!==`stale`)){if(n.status===`unavailable`){this.available=!1,this.workflows=[];return}if(n.result&&(this.available=!0),n.status===`error`){this.workflows=[],this.error=e.signal.aborted?`Loading workflows timed out.`:n.error;return}this.workflows=n.items}}async fetchGuardrailRefs(){let e=await kT(`/admin/workflows/guardrails`,{label:`workflow guardrails`});e.status!==`stale`&&(this.guardrailRefs=e.items)}async fetchPage(){await Promise.all([As.ensureLoaded(),this.fetchWorkflows(),this.fetchGuardrailRefs()])}async submitForm(){if(this.submitting)return;this.formError=``;let e=this.buildRequest(),t=EM(e,{models:Wc.models,hydratedScope:this.hydratedScope});if(t){this.formError=t;return}this.submitting=!0;try{let t=await AT(`/admin/workflows`,`POST`,e,{label:`create workflow`,unavailableStatuses:[]});if(t.status===`stale`||t.result&&t.result.status===401)return;if(t.status===`error`){this.formError=t.error;return}Y.success(`Workflow created and activated.`),this.closeForm(),this.fetchPage()}finally{this.submitting=!1}}async deactivate(e){let t=String(e&&e.id||``).trim();if(!t||this.deactivatingID||!xM(e))return;let n=pM(e);if(confirm(`Deactivate workflow "`+n+`"? Requests will fall back to the next active workflow for this scope.`)){this.deactivatingID=t;try{let e=await AT(`/admin/workflows/`+encodeURIComponent(t)+`/deactivate`,`POST`,void 0,{label:`deactivate workflow`,unavailableStatuses:[]});if(e.status===`stale`||e.result&&e.result.status===401)return;if(e.status===`error`){Y.error(e.error);return}Y.success(`Workflow deactivated.`),this.fetchPage()}finally{this.deactivatingID=``}}}};function OM(e){let t=String(e??``),n=typeof navigator<`u`?navigator.clipboard:null;if(n&&typeof n.writeText==`function`)return n.writeText(t);let r=typeof document<`u`?document:null;if(!r||!r.body||typeof r.execCommand!=`function`)return Promise.reject(Error(`Clipboard API unavailable`));let i=r.createElement(`textarea`);i.value=t,i.setAttribute(`readonly`,``),i.style.position=`fixed`,i.style.top=`0`,i.style.left=`0`,i.style.opacity=`0`;try{if(r.body.appendChild(i),i.focus(),i.select(),i.setSelectionRange(0,i.value.length),!r.execCommand(`copy`))throw Error(`execCommand copy returned false`)}finally{i.parentNode&&i.parentNode.removeChild(i)}return Promise.resolve()}function kM({resetDelayMs:e=2e3,logPrefix:t}={}){let n=M({copied:!1,error:!1}),r=null;function i(){r!==null&&clearTimeout(r),r=null}function a(){i(),r=setTimeout(()=>{n.copied=!1,n.error=!1,r=null},e)}return{get copied(){return n.copied},get error(){return n.error},reset(){i(),n.copied=!1,n.error=!1},async copy(e,r){if(!(e==null||e===``)){i(),n.copied=!1,n.error=!1;try{await OM(typeof r==`function`?r(e):String(e)),n.copied=!0,n.error=!1}catch(e){console.error(t||`Failed to copy text:`,e),n.copied=!1,n.error=!0}a()}}}}var AM=z(``);function jM(e,t){D(t,!0);let n=K(t,`workflowID`,3,``),r=kM({logPrefix:`Failed to copy workflow ID:`});kn(()=>{n(),r.reset()});let i=k(()=>r.error?`Unable to copy workflow ID`:r.copied?`Workflow ID copied`:`Copy workflow ID`),a=k(()=>n()?L(i)+` `+n():L(i));async function o(e){e.preventDefault(),n()&&await r.copy(n())}var s=AM();let c;var l=F(N(s),4),u=N(l,!0);E(l);var d=F(l,2);q(N(d),{get icon(){return Ya}}),E(d),E(s),I(()=>{c=W(s,1,`workflow-pipeline-meta mono svelte-1viff7o`,null,c,{"workflow-pipeline-meta-copied":r.copied,"workflow-pipeline-meta-error":r.error}),G(s,`title`,L(i)),G(s,`aria-label`,L(a)),V(u,n())}),R(`click`,s,o),B(e,s),O()}Vr([`click`]);var MM=(e,t)=>{let n=()=>(t?.()).icon,r=()=>(t?.()).label,i=Dt(()=>h((t?.()).variant,`workflow-node-feature`)),a=()=>(t?.()).state,o=()=>(t?.()).sub,s=()=>(t?.()).badge;var c=IM(),l=N(c),u=e=>{var t=NM();let r;q(N(t),{get icon(){return n()}}),E(t),I(()=>r=W(t,1,`workflow-node-icon svelte-nbptrg`,null,r,{"workflow-node-icon-endpoint":L(i)===`workflow-node-endpoint`})),B(e,t)};H(l,e=>{n()&&e(u)});var d=F(l,2),f=N(d,!0);E(d);var p=F(d,2),m=e=>{var t=PM(),n=N(t,!0);E(t),I(()=>V(n,s())),B(e,t)};H(p,e=>{s()&&e(m)});var g=F(p,2),_=e=>{var t=FM(),n=N(t,!0);E(t),I(()=>V(n,o())),B(e,t)};H(g,e=>{o()&&e(_)}),E(c),I(()=>{W(c,1,Pi([`workflow-node`,L(i),a()]),`svelte-nbptrg`),V(f,r())}),B(e,c)},NM=z(`
        `),PM=z(` `),FM=z(` `),IM=z(`
        `),LM=z(`
        `,1),RM=z(`
        `,1),zM=z(`
        `),BM=z(`
        Async
        `),VM=z(`
        `);function HM(e,t){D(t,!0);let n=K(t,`chart`,19,()=>({}));var r=VM();let i;var a=N(r),o=e=>{jM(e,{get workflowID(){return n().workflowID}})};H(a,e=>{n().workflowID&&e(o)});var s=F(a,2),c=N(s);MM(c,()=>({icon:Po,label:`Client`,variant:`workflow-node-endpoint`}));var l=F(c,4);MM(l,()=>({icon:Za,label:`Auth`,state:n().authNodeClass,sub:n().authNodeSublabel}));var u=F(l,2),d=e=>{var t=LM(),r=P(t);MM(F(r,2),()=>({icon:Za,label:`Cache`,state:n().cacheNodeClass,badge:n().cacheStatusLabel})),I(()=>W(r,1,Pi([`workflow-conn`,n().cacheConnClass]),`svelte-nbptrg`)),B(e,t)};H(u,e=>{n().showCache&&e(d)});var f=F(u,2),p=e=>{var t=RM();MM(F(P(t),2),()=>({icon:Fo,label:`Budget`,state:n().budgetNodeClass,badge:n().budgetStatusLabel})),B(e,t)};H(f,e=>{n().showBudget&&e(p)});var m=F(f,2),h=e=>{var t=RM();MM(F(P(t),2),()=>({icon:Eo,label:`Guardrails`,sub:n().guardrailLabel})),B(e,t)};H(m,e=>{n().showGuardrails&&e(h)});var g=F(m,2),_=F(g,2);MM(_,()=>({label:n().aiLabel,variant:`workflow-node-ai`,state:n().aiNodeClass,sub:n().aiSublabel}));var v=F(_,2),y=e=>{var t=LM(),r=P(t);MM(F(r,2),()=>({icon:so,label:`Failover`,state:n().failoverNodeClass,badge:n().failoverStatusLabel,sub:n().failoverTargetLabel})),I(()=>W(r,1,Pi([`workflow-conn`,n().failoverConnClass]),`svelte-nbptrg`)),B(e,t)};H(v,e=>{n().showFailover&&e(y)});var b=F(v,2);MM(F(b,2),()=>({icon:Ga,label:`Response`,variant:`workflow-node-endpoint`,state:n().responseNodeClass,sub:n().responseNodeSublabel})),E(s);var x=F(s,2),S=e=>{var t=BM(),r=N(t),i=N(r),a=e=>{MM(e,()=>({icon:za,label:`Usage`,variant:`workflow-node-feature workflow-node-async`,state:n().usageNodeClass}))};H(i,e=>{n().showUsage&&e(a)});var o=F(i,2),s=e=>{B(e,zM())};H(o,e=>{n().showUsage&&n().showAudit&&e(s)});var c=F(o,2),l=e=>{MM(e,()=>({icon:Qa,label:`Audit Log`,variant:`workflow-node-feature workflow-node-async`,state:n().auditNodeClass}))};H(c,e=>{n().showAudit&&e(l)}),E(r),He(4),E(t),B(e,t)};H(x,e=>{n().showAsync&&e(S)}),E(r),I(()=>{i=W(r,1,`workflow-pipeline svelte-nbptrg`,null,i,{"workflow-pipeline-has-meta":n().workflowID}),W(g,1,Pi([`workflow-conn`,n().aiConnClass]),`svelte-nbptrg`),W(b,1,Pi([`workflow-conn`,n().responseConnClass]),`svelte-nbptrg`)}),B(e,r),O()}function UM(e){let t=aM(e).length;return t===0?``:t===1?`1 step`:t+` steps`}function WM(e,t){return t&&t.provider?t.provider:sM(e&&e.scope)||`AI`}function GM(e,t){return t&&t.model?t.model:e&&e.scope&&e.scope.scope_model||null}function KM(e,t){let n=String(e&&e.id||``).trim();if(n&&n!==`draft-workflow-preview`)return n;let r=String(t&&t.workflow_version_id||``).trim();return r&&r!==`draft-workflow-preview`?r:null}function qM(e){let t=e&&e.data&&e.data.workflow_features;return!t||typeof t!=`object`||Array.isArray(t)?null:tM(t)}function JM(e){let t=e&&e.data&&e.data.failover;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=String(t.target_model||t.targetModel||``).trim()||null;return n?{targetModel:n}:null}function YM(e,t=0){if(t>4||e==null)return``;if(typeof e==`string`){let n=e.trim();if(!n||n[0]!==`{`&&n[0]!==`[`)return``;try{return YM(JSON.parse(n),t+1)}catch{return``}}if(Array.isArray(e)){for(let n of e){let e=YM(n,t+1);if(e)return e}return``}return typeof e==`object`?String(e.code||``).trim()||(e.error===void 0?``:YM(e.error,t+1)):``}function XM(e){let t=e&&e.data&&typeof e.data==`object`&&!Array.isArray(e.data)?e.data:{};return String(t.error_code||t.errorCode||``).trim()||YM(t.response_body)}function ZM(e){let t=String(e||``).trim();if(!t)return null;let n=t.indexOf(`/`);return n<=0||n>=t.length-1?null:{provider:t.slice(0,n),model:t.slice(n+1)}}function QM(e,t){let n=String(e&&(e.requested_model||e.model)||``).trim(),r=JM(e);if(!(r&&r.targetModel))return{provider:String(e&&e.provider||``).trim()||null,model:n||null};let i=ZM(n);if(i)return i;let a=sM(t&&t.scope),o=a?String(t&&t.scope&&t.scope.scope_model||``).trim():``;return a||o?{provider:a||null,model:o||n||null}:{provider:null,model:n||null}}function $M(e,t){if(!e)return null;let n=(()=>{let t=String(e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`?t:null})(),r=(()=>{if(e.status_code===void 0||e.status_code===null)return null;let t=String(e.status_code).trim();if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null})(),i=n?!0:e.cache_hit!==void 0&&e.cache_hit!==null&&!!e.cache_hit,a=JM(e),o=QM(e,t),s=Number.isFinite(r)&&r>=200&&r<300,c=String(e.error_type||``).trim().toLowerCase()===`authentication_error`,l=String(e.auth_method||``).trim().toLowerCase()||null,u=XM(e).toLowerCase()===`budget_exceeded`;return{cacheHit:i,cacheType:n||null,failoverTarget:a&&a.targetModel?a.targetModel:null,provider:o.provider,model:o.model,statusCode:r,responseSuccess:s,aiSuccess:s&&!i,authError:c,authMethod:l,budgetExceeded:u}}function eN(e){return!!(e&&e.cacheHit)}function tN(e){return!!(e&&e.failoverTarget)}function nN(e){return!!(e&&e.budgetExceeded)}function rN(e,t){return t?`workflow-node-current`:e&&e.cacheHit?`workflow-node-success`:``}function iN(e){return e&&e.cacheHit?`workflow-conn-hit`:``}function aN(e){return!e||!e.cacheHit?null:e.cacheType===`semantic`?`Hit (Semantic)`:`Hit (Exact)`}function oN(e,t,n,r){return e?nN(t)?`workflow-node-error`:r?`workflow-node-current`:n?`workflow-node-success`:``:``}function sN(e){return nN(e)?`Exceeded`:null}function cN(e){return e&&e.cacheHit?`workflow-node-skipped`:e&&e.failoverTarget?`workflow-node-success`:``}function lN(e){return e&&e.cacheHit?`workflow-conn-dim`:e&&e.failoverTarget?`workflow-conn-hit`:``}function uN(e){return e&&e.failoverTarget?`Redirected`:null}function dN(e){return e&&e.failoverTarget?e.failoverTarget:null}function fN(e){return e&&e.cacheHit?`workflow-conn-dim`:``}function pN(e,t){return e?e.cacheHit?`workflow-node-skipped`:t?`workflow-node-current`:e.aiSuccess?`workflow-node-success`:``:``}function mN(e,t){if(!e)return``;let n=e.statusCode;return!Number.isFinite(n)&&t?`workflow-node-current`:Number.isFinite(n)?n>=500?`workflow-node-error`:n>=400?`workflow-node-warning`:n>=300?`workflow-node-neutral`:n>=200?`workflow-node-success`:``:``}function hN(e){return!e||!Number.isFinite(e.statusCode)?null:String(e.statusCode)}function gN(e,t){return e?e.authError?`workflow-node-error`:t?`workflow-node-current`:e.authMethod===`api_key`||e.authMethod===`master_key`?`workflow-node-success`:``:``}function _N(e){return!e||!e.authMethod?null:e.authMethod}function vN(e,t,n){return e?n?`workflow-node-current`:t?`workflow-node-success`:``:``}function yN(e,t){if(!e||!e._live)return!!t;let n=String(e._live_state||``).trim();return!!e._audit_flushed||n===`audit.flushed`||n===`audit.detail`}function bN(e,t){if(!e)return!!t;let n=e.usage||{},r=Number(n.entries||0)>0;if(!e._live)return r;let i=String(e._usage_live_state||``).trim();return e._usage_flushed||i===`usage.flushed`?!0:!e._usage_live_pending&&r&&!e._live_pending}function xN(e){return!!(e&&e._live&&e._usage_live_pending&&!e._usage_flushed)}function SN(e,t){return!e||!e._live||yN(e,!1)?!1:String(e._live_state||``).trim()===`audit.completed`||!!(t&&Number.isFinite(t.statusCode))}function CN(e,t,n){return!e||!e._live?``:xN(e)?`usage`:SN(e,t)?`audit`:yN(e,!1)&&!e._live_pending?``:t&&t.cacheHit?`cache`:t&&(t.provider||t.model)?`ai`:n&&n.budget&&(e.workflow_version_id||e.requested_model)?`budget`:t&&t.authMethod?``:`auth`}function wN(e,t,n,r){let i=n||{},a=i.features&&typeof i.features==`object`&&!Array.isArray(i.features)?tM(i.features):rM(e,r),o=!!i.forceAudit,s=!!i.highlightAsyncPresent,c=!!a.budget||nN(t),l=!!a.guardrails,u=!!a.usage,d=o||!!a.audit,f=!!i.forceAsync||!!(u||d),p=!!a.failover||tN(t),m=KM(e,i.entry),h=CN(i.entry,t,a),g=xN(i.entry),_=SN(i.entry,t),v=yN(i.entry,s),y=bN(i.entry,s);return{showBudget:c,budgetNodeClass:oN(c,t,s,h===`budget`),budgetStatusLabel:sN(t),showGuardrails:l,guardrailLabel:l?UM(e):``,showCache:!!i.forceCache||!!a.cache||eN(t),cacheNodeClass:rN(t,h===`cache`),cacheConnClass:iN(t),cacheStatusLabel:aN(t),showFailover:p,failoverNodeClass:p?cN(t):``,failoverConnClass:p?lN(t):``,failoverStatusLabel:p?uN(t):null,failoverTargetLabel:p?dN(t):null,aiLabel:WM(e,t),aiSublabel:GM(e,t),aiConnClass:fN(t),aiNodeClass:pN(t,h===`ai`),responseConnClass:fN(t),responseNodeClass:mN(t,h===`response`),responseNodeSublabel:hN(t),authNodeClass:gN(t,h===`auth`),authNodeSublabel:_N(t),usageNodeClass:vN(u,y,g),auditNodeClass:vN(d,v,_),showAsync:f,showUsage:u,showAudit:d,workflowID:m}}function TN(e,t){return wN(e,null,{forceCache:!1},t)}function EN(e,t,n){return wN(t,$M(e,t),{entry:e,features:qM(e)||(t?rM(t,n):{cache:!1,audit:!1,usage:!1,budget:!1,guardrails:!1,failover:!1}),forceAudit:!0,forceAsync:!0,highlightAsyncPresent:!0},n)}var DN=z(`

        `),ON=z(`

        `),kN=z(`
        `),AN=z(`
        `),jN=z(`

        No guardrails configured for this workflow.

        `),MN=z(`

        Guardrails

        `),NN=z(``),PN=z(`

        `);function FN(e,t){D(t,!0);let n=K(t,`preview`,3,!1),r=k(()=>DM.featureCaps()),i=k(()=>pM(t.workflow)),a=k(()=>oM(t.workflow,L(r))),o=k(()=>TN(t.workflow,L(r))),s=k(()=>n()?`draft-workflow-preview-guardrail-`:t.workflow.id+`-guardrail-`);var c=PN();let l;var u=N(c),d=N(u),f=N(d),p=N(f,!0);E(f);var m=F(f,2),h=N(m,!0);E(m),E(d);var g=F(d,2),_=N(g),v=N(_,!0);E(_),E(g),E(u);var y=F(u,2),b=e=>{var n=DN(),r=N(n,!0);E(n),I(()=>V(r,t.workflow.description)),B(e,n)};H(y,e=>{t.workflow.description&&e(b)});var x=F(y,2),S=e=>{var n=ON(),i=N(n);E(n),I(e=>V(i,`Failover: ${e??``}`),[()=>iM(t.workflow,L(r))]),B(e,n)},C=k(()=>DM.failoverVisible());H(x,e=>{L(C)&&e(S)});var w=F(x,2);HM(w,{get chart(){return L(o)}});var T=F(w,2),ee=e=>{var t=MN(),n=N(t),r=F(N(n),2),i=N(r,!0);E(r),E(n);var o=F(n,2),c=e=>{var t=AN();U(t,23,()=>L(a),(e,t)=>L(s)+t,(e,t)=>{var n=kN(),r=N(n),i=N(r,!0);E(r);var a=F(r,2),o=N(a);E(a),E(n),I(()=>{V(i,L(t).ref),V(o,`step ${L(t).step??``}`)}),B(e,n)}),E(t),B(e,t)},l=e=>{B(e,jN())};H(o,e=>{L(a).length>0?e(c):e(l,-1)}),E(t),I(()=>V(i,L(a).length?L(a).length+` steps`:`None`)),B(e,t)},te=k(()=>As.guardrailsVisible());H(T,e=>{L(te)&&e(ee)});var ne=F(T,2),re=e=>{var n=NN(),r=N(n),a=N(r),o=N(a,!0);E(a);var s=F(a,2);{let e=k(()=>`Edit workflow `+L(i));OT(s,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>DM.openCreate(t.workflow),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}E(r);var c=F(r,2),l=N(c),u=N(l);E(l);var d=F(l,2),f=N(d);E(d);var p=F(d,2),m=N(p);E(p),E(c),E(n),I((e,n,r,s)=>{a.disabled=e,G(a,`aria-label`,`Deactivate workflow `+L(i)),G(a,`title`,n),V(o,DM.deactivatingID===t.workflow.id?`Deactivating...`:`Deactivate`),V(u,`version: v${t.workflow.version??``}`),V(f,`created: ${r??``}`),V(m,`hash: ${s??``}`)},[()=>DM.deactivatingID===t.workflow.id||!xM(t.workflow),()=>xM(t.workflow)?`Deactivate active workflow`:`The global workflow cannot be deactivated.`,()=>ys.formatTimestamp(t.workflow.created_at),()=>SM(t.workflow.workflow_hash)]),R(`click`,a,()=>DM.deactivate(t.workflow)),B(e,n)};H(ne,e=>{n()||e(re)}),E(c),I((e,t)=>{l=W(c,1,`workflow-card svelte-1fo9fvq`,null,l,{"workflow-preview-card":n()}),V(p,e),V(h,L(i)),V(v,t)},[()=>dM(t.workflow),()=>fM(t.workflow)]),B(e,c),O()}Vr([`click`]);var IN=z(`

        `),LN=z(``),RN=z(``),zN=z(``),BN=z(``),VN=z(``),HN=z(``),UN=z(``),WN=z(``),GN=z(``),KN=z(``),qN=z(``),JN=z(``),YN=z(`
        No named guardrails are currently registered on this deployment. You can still draft a workflow, but guardrail-backed creation may be rejected.
        `),XN=z(`
        `),ZN=z(`
        `),QN=z(`

        No guardrail steps configured yet.

        `),$N=z(`

        Guardrail Steps

        Guardrails in the same numeric step run together. Later steps wait for earlier ones to finish.

        `),eP=z(`

        Leave provider name empty to target all providers and models. Select a provider name without a model to target all models for that configured provider.

        Add a path to scope the workflow to that subtree. Leading slashes are optional and will be normalized; you can enter "team/alpha" or "/team/alpha". Matching checks the deepest user path first, then falls back toward the root.

        If you leave the name empty, the workflow will display as the matched provider/model scope or “All models”.

        Preview

        Live
        `,1);function tP(e,t){D(t,!0);{let t=e=>{iC(e,{copyId:`workflow-help-copy`,label:`workflow help`,text:`Create immutable version. Submitting activates it for the selected scope.`,title:e=>{var t=IN(),n=N(t,!0);E(t),I(e=>V(n,e),[()=>DM.submitMode()===`save`?`Edit Workflow`:`Create Workflow`]),B(e,t)},$$slots:{title:!0}})},n=k(()=>DM.submitLabel()),r=k(()=>DM.submittingLabel()),i=k(()=>DM.submitMode()===`create`?mo:vo);ME(e,{get open(){return DM.formOpen},ariaLabel:`Workflow editor`,get error(){return DM.formError},get submitting(){return DM.submitting},get submitLabel(){return L(n)},get submittingLabel(){return L(r)},get submitIcon(){return L(i)},dialogClass:`workflow-editor`,onclose:()=>DM.closeForm(),onsubmit:()=>DM.submitForm(),header:t,children:(e,t)=>{var n=eP(),r=P(n),i=N(r);PE(i,{id:`workflow-scope-provider`,label:`Provider Name`,children:(e,t)=>{var n=RN(),r=N(n);r.value=r.__value=``,U(F(r),16,()=>DM.providerOptions(),e=>e,(e,t)=>{var n=LN(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(n),R(`change`,n,e=>DM.setProvider(e.currentTarget.value)),Wi(n,()=>DM.form.scope_provider,e=>DM.form.scope_provider=e),B(e,n)},$$slots:{default:!0}});var a=F(i,2),o=e=>{PE(e,{id:`workflow-scope-model`,label:`Model`,children:(e,t)=>{var n=zN(),r=N(n);r.value=r.__value=``,U(F(r),17,()=>DM.modelOptions(DM.form.scope_provider),e=>DM.form.scope_provider+`-`+e,(e,t)=>{var n=LN(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t)),i!==(i=L(t))&&(n.value=(n.__value=L(t))??``)}),B(e,n)}),E(n),Wi(n,()=>DM.form.scope_model,e=>DM.form.scope_model=e),B(e,n)},$$slots:{default:!0}})};H(a,e=>{DM.form.scope_provider&&e(o)});var s=F(a,2);PE(s,{id:`workflow-name`,label:`Name`,children:(e,t)=>{var n=BN();ta(n),ua(n,()=>DM.form.name,e=>DM.form.name=e),B(e,n)},$$slots:{default:!0}}),PE(F(s,2),{id:`workflow-user-path`,label:`User Path`,children:(e,t)=>{var n=VN();ta(n),ua(n,()=>DM.form.scope_user_path,e=>DM.form.scope_user_path=e),B(e,n)},$$slots:{default:!0}}),E(r);var c=F(r,8);PE(c,{id:`workflow-description`,label:`Description`,children:(e,t)=>{var n=HN();dt(n),ua(n,()=>DM.form.description,e=>DM.form.description=e),B(e,n)},$$slots:{default:!0}});var l=F(c,2),u=N(l),d=e=>{var t=UN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.cache,e=>DM.form.features.cache=e),B(e,t)},f=k(()=>As.cacheVisible());H(u,e=>{L(f)&&e(d)});var p=F(u,2),m=e=>{var t=WN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.audit,e=>DM.form.features.audit=e),B(e,t)},h=k(()=>As.auditVisible());H(p,e=>{L(h)&&e(m)});var g=F(p,2),_=e=>{var t=GN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.usage,e=>DM.form.features.usage=e),B(e,t)},v=k(()=>As.usageVisible());H(g,e=>{L(v)&&e(_)});var y=F(g,2),b=e=>{var t=KN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.budget,e=>DM.form.features.budget=e),B(e,t)},x=k(()=>As.budgetsVisible());H(y,e=>{L(x)&&e(b)});var S=F(y,2),C=e=>{var t=qN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.guardrails,e=>DM.form.features.guardrails=e),B(e,t)},w=k(()=>As.guardrailsVisible());H(S,e=>{L(w)&&e(C)});var T=F(S,2),ee=e=>{var t=JN(),n=N(t);ta(n),He(2),E(t),da(n,()=>DM.form.features.failover,e=>DM.form.features.failover=e),B(e,t)},te=k(()=>DM.failoverVisible());H(T,e=>{L(te)&&e(ee)}),E(l);var ne=F(l,2),re=F(N(ne),2);{let e=k(()=>DM.preview());FN(re,{get workflow(){return L(e)},preview:!0})}E(ne);var ie=F(ne,2),ae=e=>{var t=$N(),n=N(t),r=F(N(n),2);E(n);var i=F(n,2),a=e=>{var t=YN(),n=F(N(t),2);E(t),R(`click`,n,()=>Xo.navigate(`guardrails`)),B(e,t)};H(i,e=>{DM.guardrailRefs.length===0&&e(a)});var o=F(i,2),s=e=>{var t=ZN();U(t,21,()=>DM.form.guardrails,ai,(e,t,n)=>{var r=XN(),i=N(r),a=N(i);G(a,`for`,`workflow-guardrail-ref-`+n);var o=F(a,2);ta(o),G(o,`id`,`workflow-guardrail-ref-`+n),G(o,`aria-label`,`Guardrail reference `+(n+1)),E(i);var s=F(i,2),c=N(s);G(c,`for`,`workflow-guardrail-step-`+n);var l=F(c,2);ta(l),G(l,`id`,`workflow-guardrail-step-`+n),G(l,`aria-label`,`Guardrail step `+(n+1)),E(s);var u=F(s,2);E(r),ua(o,()=>L(t).ref,e=>L(t).ref=e),ua(l,()=>L(t).step,e=>L(t).step=e),R(`click`,u,()=>DM.removeGuardrailStep(n)),B(e,r)}),E(t),B(e,t)},c=e=>{B(e,QN())};H(o,e=>{DM.form.guardrails.length>0?e(s):e(c,-1)}),E(t),R(`click`,r,()=>DM.addGuardrailStep()),B(e,t)},oe=k(()=>DM.form.features.guardrails&&As.guardrailsVisible());H(ie,e=>{L(oe)&&e(ae)}),B(e,n)},$$slots:{header:!0,default:!0}})}O()}Vr([`change`,`click`]);var nP=z(`

        Loading workflows...

        `),rP=z(`
        `),iP=z(`

        No active workflows found.

        `),aP=z(`

        No workflows match your filter.

        `),oP=z(`
        `);function sP(e,t){D(t,!0);var n=oP(),r=N(n),i=e=>{var t=nP();NS(N(t),{size:16,label:`Loading workflows`}),He(),E(t),B(e,t)};H(r,e=>{DM.loading&&!J.authError&&e(i)});var a=F(r,2),o=e=>{var t=rP();U(t,21,()=>DM.filteredWorkflows,e=>e.id,(e,t)=>{FN(e,{get workflow(){return L(t)}})}),E(t),B(e,t)};H(a,e=>{DM.filteredWorkflows.length>0&&e(o)});var s=F(a,2),c=e=>{B(e,iP())};H(s,e=>{DM.workflows.length===0&&!DM.loading&&!J.authError&&DM.available&&e(c)});var l=F(s,2),u=e=>{B(e,aP())};H(l,e=>{DM.workflows.length>0&&DM.filteredWorkflows.length===0&&!DM.loading&&e(u)}),E(n),B(e,n),O()}var cP=z(``),lP=z(`
        Workflows feature is unavailable.
        `),uP=z(`
        `),dP=z(`
        `),fP=z(``),pP=z(`
        `);function mP(e,t){D(t,!0),kn(()=>{J.refreshTick,DM.fetchPage()});var n=pP(),r=N(n),i=F(N(r),2),a=N(i),o=e=>{var t=cP();q(N(t),{get icon(){return mo},class:`form-action-icon`,"aria-hidden":`true`}),He(2),E(t),R(`click`,t,()=>DM.openCreate()),B(e,t)};H(a,e=>{DM.available&&e(o)}),E(i),E(r);var s=F(r,2),c=e=>{B(e,lP())};H(s,e=>{!DM.available&&!J.authError&&e(c)});var l=F(s,2),u=e=>{var t=uP(),n=N(t,!0);E(t),I(()=>V(n,DM.error)),B(e,t)};H(l,e=>{DM.error&&!J.authError&&e(u)});var d=F(l,2),f=e=>{var t=dP(),n=N(t);jw(N(n),{placeholder:`Filter by scope, name, hash, or guardrail...`,label:`Filter workflows by scope, name, hash, or guardrail`,get value(){return DM.filter},set value(e){DM.filter=e}}),E(n);var r=F(n,2),i=N(r),a=N(i,!0);E(i),E(r),E(t),I(()=>V(a,DM.filteredWorkflows.length+` active scopes`)),B(e,t)};H(d,e=>{DM.available&&e(f)});var p=F(d,2);tP(p,{});var m=F(p,2);sP(m,{});var h=F(m,2);U(h,20,()=>DM.guardrailRefs,e=>e,(e,t)=>{var n=fP(),r={};I(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(h),E(n),B(e,n),O()}Vr([`click`]);function hP(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=sc}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=gP(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function gP(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var _P=null;function vP(){return _P===null&&(_P=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`)),!!(_P&&_P.matches)}function yP(e){return vP()?0:e}function bP(e,t){return!t||!t.live?{duration:0}:ac(e,{duration:yP(150)})}var xP=new class{#e=A(M({}));get workflowVersionsByID(){return L(this.#e)}set workflowVersionsByID(e){j(this.#e,e,!0)}workflowVersionRequests={};workflowFeatureCaps(){return{cache:As.cacheVisible(),audit:As.auditVisible(),usage:As.usageVisible(),budget:As.budgetsVisible(),guardrails:As.guardrailsVisible(),failover:As.booleanFlag(`FAILOVER_ENABLED`,!0)}}cacheWorkflowVersion(e){let t=String(e&&e.id||``).trim();return t?(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:e},e):null}cacheMissingWorkflowVersion(e){let t=String(e||``).trim();t&&(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:null})}workflowVersionCacheHas(e){return Object.prototype.hasOwnProperty.call(this.workflowVersionsByID||{},String(e||``).trim())}workflowVersionByID(e){let t=String(e||``).trim();return t&&this.workflowVersionCacheHas(t)?this.workflowVersionsByID[t]:null}async fetchWorkflowVersion(e){let t=String(e||``).trim();if(!t)return null;if(this.workflowVersionCacheHas(t))return this.workflowVersionsByID[t];if(this.workflowVersionRequests[t])return this.workflowVersionRequests[t];let n=(async()=>{let e=typeof AbortController==`function`?new AbortController:null,n=e?setTimeout(()=>e.abort(),1e4):null;try{let n=await Ts(`/admin/workflows/`+encodeURIComponent(t),{label:`workflow`,signal:e?e.signal:void 0});if(n.stale)return null;if(n.status===404)return this.cacheMissingWorkflowVersion(t),null;if(!n.ok)return null;let r=n.data;return!r||typeof r!=`object`||Array.isArray(r)?(this.cacheMissingWorkflowVersion(t),null):this.cacheWorkflowVersion(r)}catch(e){return e&&e.name===`AbortError`||console.error(`Failed to fetch workflow version:`,e),null}finally{n!==null&&clearTimeout(n),delete this.workflowVersionRequests[t]}})();return this.workflowVersionRequests[t]=n,n}async prefetchAuditWorkflows(e){let t=[...new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.workflow_version_id||``).trim()).filter(Boolean))];t.length!==0&&await Promise.all(t.map(e=>this.fetchWorkflowVersion(e)))}auditEntryWorkflow(e){let t=String(e&&e.workflow_version_id||``).trim();return t?this.workflowVersionByID(t):null}},SP=6;function CP(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function wP(e,t=0,n=null){let r=String(e||``).trim();if(!r)return``;if(t>SP)return r;let i=CP(r);return i==null?r:TP(i,t+1,n)||n&&n(i)||r}function TP(e,t=0,n=null,r=null){if(e==null||t>SP)return``;if(typeof e==`string`){let i=CP(e.trim());return i==null?``:TP(i,t+1,n,r)}if(typeof e!=`object`)return``;let i=r||new Set;if(i.has(e))return``;if(i.add(e),Array.isArray(e)){for(let r=0;r=400||OP(t&&t.response_body)}function AP(e){let t=e&&e.data?e.data:null;return t?EP(t.error_message)||(kP(e,t)?TP(t.response_body,0):``):``}function jP(e){if(e==null||String(e).trim()===``)return null;let t=Number(e);return!Number.isInteger(t)||t<0?null:t}function MP(e){let t=jP(e);return t===null?``:t===0?`Audit logs are retained indefinitely.`:t===1?`Audit logs are retained for 1 day.`:`Audit logs are retained for `+t+` days.`}function NP(e){let t=jP(e);return t===null?``:t===0?`Audit logs are retained `:`Audit logs are retained for `}function PP(e){let t=jP(e);return t===null?``:t===0?`indefinitely`:t===1?`1 day`:t+` days`}function FP({dateQuery:e,limit:t,offset:n,search:r,method:i,statusCode:a,stream:o}){let s=e;return s+=`&limit=`+t+`&offset=`+n,r&&(s+=`&search=`+encodeURIComponent(r)),i&&(s+=`&method=`+encodeURIComponent(i)),a&&(s+=`&status_code=`+encodeURIComponent(a)),o&&(s+=`&stream=`+encodeURIComponent(o)),s}function IP({sessionId:e,limit:t}){return`session_id=`+encodeURIComponent(e)+`&limit=`+(t||100)+`&offset=0`}function LP(e){return String(e&&e.session_id||``).trim()}function RP(e){let t=Number(e&&e.session_count);return Number.isFinite(t)&&t>1?t:1}function zP(e){return!!LP(e)&&RP(e)>1}function BP(e){return{entries:(Array.isArray(e&&e.sessions)?e.sessions:[]).filter(e=>e&&e.latest).map(e=>({...e.latest,session_id:LP(e.latest)||String(e.session_id||``).trim(),session_count:Number(e.count||1)})),total:Number(e&&e.total||0),limit:Number(e&&e.limit||25),offset:Number(e&&e.offset||0)}}function VP(e,t,n){let r=new Set((Array.isArray(n)?n:[]).flatMap(e=>GP(e))),i=(Array.isArray(t)?t:[]).filter(e=>!GP(e).some(e=>r.has(e))),a=new Set([...r,...i.flatMap(e=>GP(e))]),o=(e&&Array.isArray(e.entries)?e.entries:[]).filter(e=>e&&e._live&&!GP(e).some(e=>a.has(e)));return{entries:[...o,...i],preservedCount:o.length}}function HP(e,t){let n=e||{};if(!t)return n;if(n[t]){let e={...n};return delete e[t],e}return{...n,[t]:!0}}function UP(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>LP(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=n[e];return}a=!0}),a?i:n}function WP(e){return String(e&&e.id||``).trim()}function GP(e){if(!e)return[];let t=[],n=String(e.id||``).trim(),r=String(e.request_id||``).trim();return n&&t.push(`id:`+n),r&&t.push(`request:`+r),t}function KP(e){return!!(e&&e._live&&e._live_pending&&!e._audit_flushed)}function qP(e){let t=e&&e.customStartDate,n=e&&e.customEndDate;if(!t&&!n)return!0;let r=new Date;if(t){let e=new Date(t);if(e.setHours(0,0,0,0),Number.isFinite(e.getTime())&&re)return!1}return!0}function JP(e,t){return e&&Number(e.offset||0)===0&&!(t&&t.search)&&!(t&&t.method)&&!(t&&t.statusCode)&&!(t&&t.stream)&&qP(t)}function YP(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!JP(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>KP(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>GP(e))),s=[];return a.forEach(e=>{let t=GP(e);t.length!==0&&(t.some(e=>o.has(e))||(t.forEach(e=>o.add(e)),s.push(e)))}),s.length===0?r:(r.entries=[...s,...i].slice(0,r.limit||25),r.total=Number(r.total||0)+s.length,r)}function XP(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!JP(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>KP(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>GP(e))),s=new Map;i.forEach((e,t)=>{let n=LP(e);n&&!s.has(n)&&s.set(n,t)});let c=[],l=i;return a.forEach(e=>{let t=GP(e);if(t.length===0||t.some(e=>o.has(e)))return;let n=LP(e);if(n&&s.has(n)){let r=s.get(n);l===i&&(l=[...i]),l[r]={...e,session_count:Math.max(RP(l[r]),RP(e))},t.forEach(e=>o.add(e));return}t.forEach(e=>o.add(e)),c.push(e)}),r.entries=[...c,...l].slice(0,r.limit||25),r.total=Number(r.total||0)+c.length,r}function ZP(e,t){let n=WP(t),r=e||{};return n?r[n]?{}:{[n]:!0}:r}function QP(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>WP(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=!0;return}a=!0}),a?i:n}function $P(e){if(e==null)return`-`;let t=Number(e);return Number.isFinite(t)?t<=0?`pending`:t<1e6?Math.round(t/1e3)+` µs`:t<1e9?(t/1e6).toFixed(2)+` ms`:(t/1e9).toFixed(2)+` s`:`-`}function eF(e){if(e==null||e===``)return`status-unknown`;let t=Number(e);return Number.isFinite(t)?t>=500?`status-error`:t>=400?`status-warning`:t>=300?`status-neutral`:`status-success`:`status-unknown`}function tF(e){if(!e||!e._live||!e._live_pending)return!1;let t=String(e._live_state||``).trim();if(t===`audit.completed`||t===`audit.flushed`||t===`audit.detail`)return!1;if(e._response_partial)return!0;if(e.status_code!==null&&e.status_code!==void 0&&e.status_code!==``||Number(e.duration_ns||0)>0||e.error_type||e.error_message)return!1;let n=e.data||{};return!(n.response_headers||n.response_body||n.error_message)}function nF(e){let t=e&&e.data&&e.data.failover;return!t||typeof t!=`object`||Array.isArray(t)?null:String(t.target_model||t.targetModel||``).trim()||null}function rF(e){return(e&&e.data&&Array.isArray(e.data.attempts)?e.data.attempts:[]).map((e,t)=>({...e,seq:Number(e&&e.seq||t+1)})).sort((e,t)=>e.seq-t.seq)}function iF(e){let t=rF(e);return t.length>1||t.some(e=>!(e&&e.success))}function aF(e){if(!e)return`-`;let t=e.status_code||e.status;return t?String(t):e.success?`ok`:`error`}function oF(e){return String(e&&e.kind||``).trim()||`attempt`}function sF(e){if(!e)return`-`;let t=String(e.provider_name||``).trim(),n=String(e.provider_type||e.provider||``).trim();return t&&n&&t!==n?t+` (`+n+`)`:t||n||`-`}function cF(e){return String(e&&e.model||``).trim()||`-`}function lF(e){let t=rF(e);return t.length>1||t.some(e=>!(e&&e.success))?t:[]}function uF(e){return rF(e).length+`×`}function dF(e){let t=rF(e),n=t.filter(e=>!(e&&e.success)).length,r=t.length===1?`attempt`:`attempts`,i=t.length+` provider `+r;return n>0?i+` · `+n+` failed`:i}function fF(e){if(!e)return``;let t=[`#`+Number(e.seq||0)],n=oF(e);n&&n!==`attempt`&&t.push(n),t.push(aF(e));let r=sF(e);r&&r!==`-`&&t.push(r);let i=cF(e);return i&&i!==`-`&&t.push(i),t.push(e.success?`succeeded`:`failed`),t.join(` · `)}function pF(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t&&t.response_body!=null?t.response_body:null}return t.response_body!=null&&t.response_body!==``?t.response_body:null}function mF(e){if(!e||e.success)return``;let t=String(e.error_message||``).trim(),n=String(e.error_code||``).trim(),r=String(e.error_type||``).trim();return t&&n?n+`: `+t:t||n||r||`Provider attempt failed`}function hF(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t?t.response_headers:null}return t.response_headers||null}function gF(e){let t=Number(e&&e.status_code);return Number.isFinite(t)&&t>0?t:null}function _F(e,t){let n=!!(t&&t.success),r=e&&e.data?e.data:null,i=pF(e,t),a=hF(e,t),o=mF(t),s=i!=null&&i!==``,c=oF(t),l=rF(e).length<=1;return{title:`Response`,direction:`response`,seq:l?0:Number(t&&t.seq||0),kind:l||c===`attempt`?``:c,statusCode:l?null:gF(t),layout:`split`,entry:e,copyHeaders:a,copyBody:i,showErrorMessage:!!o,errorMessage:o,showHeaders:!!a,headers:a,showBody:s,body:i,showEmpty:!o&&!s&&!a,emptyMessage:`No response was captured for this attempt.`,showTooLarge:!!(n&&r&&r.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function vF(e){return e&&e.data&&Array.isArray(e.data.request_revisions)?e.data.request_revisions:[]}function yF(e){return vF(e).filter(e=>!(e&&e.no_change))}function bF(e){return vF(e).filter(e=>e&&e.no_change).map(e=>{let t=String(e.rewriter||`rewriter`);return{id:`step-`+Number(e.seq||0),rewriter:t,label:t+`: no change`,title:t+` ran and forwarded the request unchanged`}})}function xF(e){let t=Number(e&&e.bytes_before),n=Number(e&&e.bytes_after);if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n>=t)return``;let r=(1-n/t)*100;return`-`+(r>=10?String(Math.round(r)):r.toFixed(1))+`%`}function SF(e,t){let n=t&&t.body,r=n!=null&&n!==``,i=yF(e).length<=1,a={rewriter:t&&t.rewriter||``,bytes:Number(t&&t.bytes_before||0)+` → `+Number(t&&t.bytes_after||0)};return t&&t.detail!=null&&(a.detail=t.detail),{title:`Rewritten`,direction:`request`,seq:i?0:Number(t&&t.seq||0),kind:t&&t.rewriter?String(t.rewriter):``,savingsLabel:xF(t),layout:`split`,entry:e,copyHeaders:a,copyBody:n,showErrorMessage:!1,errorMessage:null,showHeaders:!0,headers:a,headersTitle:`What changed`,showBody:r,body:n,showEmpty:!1,emptyMessage:``,showTooLarge:!r,tooLargeMessage:`Rewritten body not captured (body logging disabled or body too large).`}}function CF(e){let t=e&&e.usage;return!t||typeof t!=`object`?null:t}function wF(e){let t=CF(e);return Number(t&&t.cached_input_tokens||0)>0}function TF(e){let t=CF(e),n=Number(t&&t.input_tokens||0),r=Number(t&&t.cached_input_tokens||0);return!Number.isFinite(n)||n<=0||!Number.isFinite(r)||r<=0?0:Math.max(0,Math.min(100,r/n*100))}function EF(e){let t=CF(e);if(!t)return``;let n=Number(t.input_tokens||0),r=Number(t.cached_input_tokens||0);return n<=0?_c(r)+` cached`:TF(e).toFixed(1)+`% cached`}function DF(e){return wF(e)?EF(e):``}function OF(e,t){let n=CF(e);if(!n||!e||!e.data||!e.data.request_body)return null;let r=Number(n.estimated_cached_characters||0);if(!Number.isFinite(r)||r<=0||typeof t!=`function`)return null;let i=t(e.data.request_body);return!Array.isArray(i)||i.length===0?null:{characters:r,segments:i}}function kF(e,t){let n=e&&e.data?e.data:null,r=!n||!n.request_headers&&!n.request_body,i=r&&tF(e);return{title:`Request`,direction:`request`,layout:`split`,entry:e,copyHeaders:n&&n.request_headers,copyBody:n&&n.request_body,showErrorMessage:!1,errorMessage:null,showHeaders:!!(n&&n.request_headers),headers:n&&n.request_headers,showBody:!!(n&&n.request_body),body:n&&n.request_body,bodyCacheRatioLabel:DF(e),promptCacheHighlight:OF(e,t),noChangeSteps:bF(e),showEmpty:r&&!i,emptyMessage:`Request details were not captured.`,showPending:i,pendingMessage:`Waiting for request data…`,showTooLarge:!!(n&&n.request_body_too_big_to_handle),tooLargeMessage:`Request body was too large to capture.`}}function AF(e){let t=e&&e.data?e.data:null,n=AP(e),r=!t||!n&&!t.response_headers&&!t.response_body,i=r&&tF(e);return{title:`Response`,direction:`response`,layout:`split`,entry:e,copyHeaders:t&&t.response_headers,copyBody:t&&t.response_body,showErrorMessage:!!n,errorMessage:n,showHeaders:!!(t&&t.response_headers),headers:t&&t.response_headers,showBody:!!(t&&t.response_body),body:t&&t.response_body,streaming:!!(e&&e._response_partial&&t&&t.response_body)&&tF(e),showEmpty:r&&!i,emptyMessage:`Response details were not captured.`,showPending:i,pendingMessage:`Response in progress…`,showTooLarge:!!(t&&t.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function jF(e,t){let n=[{id:`request`,pane:kF(e,t)}];return yF(e).forEach(t=>{n.push({id:`revision-`+Number(t&&t.seq||0),pane:SF(e,t)})}),iF(e)?rF(e).forEach(t=>{n.push({id:`response-`+Number(t&&t.seq||0),pane:_F(e,t)})}):n.push({id:`response`,pane:AF(e)}),n}function MF(e){if(!iF(e))return`response`;let t=rF(e),n=null;return t.forEach(e=>{e&&e.success&&(n=e)}),n||=t[t.length-1],n?`response-`+Number(n.seq||0):`request`}function NF(e,t,n){return e&&(Array.isArray(n)?n:jF(t)).some(t=>t.id===e)?e:MF(t)}function PF(e,t,n){if(!t||!t.length)return null;let r=t.indexOf(n);r<0&&(r=0);let i;switch(e){case`ArrowRight`:case`ArrowDown`:i=(r+1)%t.length;break;case`ArrowLeft`:case`ArrowUp`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return null}return t[i]}var FF=100;function IF(){return{entries:[],total:0,limit:25,offset:0}}var LF=new class{#e=A(M({}));get auditExpandedEntries(){return L(this.#e)}set auditExpandedEntries(e){j(this.#e,e,!0)}#t=A(M({}));get auditExpandedThreads(){return L(this.#t)}set auditExpandedThreads(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}auditFetchToken=0;get auditLog(){return UC.auditLog}set auditLog(e){UC.auditLog=e}get auditSearch(){return UC.auditSearch}set auditSearch(e){UC.auditSearch=e}get auditMethod(){return UC.auditMethod}set auditMethod(e){UC.auditMethod=e}get auditStatusCode(){return UC.auditStatusCode}set auditStatusCode(e){UC.auditStatusCode=e}get auditStream(){return UC.auditStream}set auditStream(e){UC.auditStream=e}get auditGroupSessions(){return UC.auditGroupSessions}liveFilters(){return{search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream,customStartDate:Uc.customStartDate,customEndDate:Uc.customEndDate}}toggleAuditGroupSessions(){UC.auditGroupSessions=!UC.auditGroupSessions,wa(`gomodel_audit_group_sessions`,UC.auditGroupSessions),this.auditExpandedThreads={},UC.auditThreadChildren={},this.fetchAuditLog(!0)}async fetchAuditLog(e){let t=++this.auditFetchToken;this.loading=!0;try{e&&(this.auditLog.offset=0);let n=this.auditGroupSessions,r=FP({dateQuery:Uc.queryStr(),limit:this.auditLog.limit,offset:this.auditLog.offset,search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream}),i=await Ts((n?`/admin/audit/sessions?`:`/admin/audit/log?`)+r,{label:`audit log`});if(i.stale||t!==this.auditFetchToken)return;if(!i.ok){this.auditLog=IF();return}let a=n?BP(i.data):i.data,o=(n?XP:YP)(a,this.auditLog&&this.auditLog.entries,this.liveFilters());Array.isArray(o.entries)||(o.entries=[]),o.entries=UC.upsertAuditRecords(o.entries,`audit.list`),this.auditLog=o,this.auditExpandedThreads=UP(this.auditExpandedThreads,o.entries),UC.auditThreadChildren=UP(UC.auditThreadChildren,o.entries);let s=[...o.entries,...this.loadedThreadChildren()];this.auditExpandedEntries=QP(this.auditExpandedEntries,s);try{await xP.prefetchAuditWorkflows(s)}catch(e){console.error(`Failed to prefetch audit workflows:`,e)}}catch(e){if(console.error(`Failed to fetch audit log:`,e),t!==this.auditFetchToken)return;this.auditLog=IF()}finally{t===this.auditFetchToken&&(this.loading=!1)}}loadedThreadChildren(){let e=UC.auditThreadChildren||{};return Object.keys(e).flatMap(t=>Array.isArray(e[t]&&e[t].entries)?e[t].entries:[])}isThreadExpanded(e){return!!(e&&this.auditExpandedThreads[e])}threadChildren(e){return e&&UC.auditThreadChildren[e]||null}async toggleThread(e){let t=LP(e);if(!t)return;let n=!this.isThreadExpanded(t);this.auditExpandedThreads=HP(this.auditExpandedThreads,t);let r=UC.auditThreadChildren[t];n&&!(r&&(r.loaded||r.loading))&&await this.fetchThreadEntries(e)}async fetchThreadEntries(e){let t=LP(e);if(!t)return;let n=UC.auditThreadChildren[t];UC.auditThreadChildren={...UC.auditThreadChildren,[t]:{loading:!0,loaded:!1,entries:n&&Array.isArray(n.entries)?n.entries:[],total:Number(n&&n.total||0)}};let r=()=>{let e={...UC.auditThreadChildren},n=e[t],r=n&&Array.isArray(n.entries)?n.entries:[];r.length>0?e[t]={loading:!1,loaded:!1,entries:r,total:r.length}:(delete e[t],this.auditExpandedThreads[t]&&(this.auditExpandedThreads=HP(this.auditExpandedThreads,t))),UC.auditThreadChildren=e};try{let n=await Ts(`/admin/audit/log?`+IP({sessionId:t,limit:FF}),{label:`audit session`});if(n.stale){r();return}if(!n.ok)throw Error(`audit session fetch failed`);let i=UC.auditThreadChildren[t],a=this.auditLog.entries.find(e=>LP(e)===t),o=VP(i,n.data.entries,a?[a]:[e]);o.entries=UC.upsertAuditRecords(o.entries,`audit.thread`),UC.auditThreadChildren={...UC.auditThreadChildren,[t]:{loading:!1,loaded:!0,entries:o.entries,total:Number(n.data.total||0)+o.preservedCount}}}catch(e){console.error(`Failed to fetch audit session entries:`,e),r()}}clearAuditFilters(){this.auditSearch=``,this.auditMethod=``,this.auditStatusCode=``,this.auditStream=``,this.fetchAuditLog(!0)}auditLogNextPage(){this.auditLog.offset+this.auditLog.limit0&&(this.auditLog.offset=Math.max(0,this.auditLog.offset-this.auditLog.limit),this.fetchAuditLog(!1))}isAuditEntryExpanded(e){let t=WP(e);return t?!!(this.auditExpandedEntries&&this.auditExpandedEntries[t]):!1}toggleAuditEntryExpanded(e){this.auditExpandedEntries=ZP(this.auditExpandedEntries,e);let t=this.isAuditEntryExpanded(e);return t&&typeof UC.fetchAuditEntryDetail==`function`&&UC.fetchAuditEntryDetail(e),t}expandAuditEntry(e){this.isAuditEntryExpanded(e)||this.toggleAuditEntryExpanded(e)}};UC.fetchAuditLog=e=>LF.fetchAuditLog(e),UC.isAuditEntryExpanded=e=>LF.isAuditEntryExpanded(e);var RF=z(`
        `);function zF(e,t){D(t,!0);let n=Mw(()=>LF.fetchAuditLog(!0));kn(()=>n.cancel);var r=RF(),i=N(r);jw(N(i),{id:`audit-filter-search`,placeholder:`Search by request ID, model, provider, path, user path, or error...`,label:`Search by request ID, model, provider, path, user path, or error`,get oninput(){return n},get value(){return LF.auditSearch},set value(e){LF.auditSearch=e}}),E(i);var a=F(i,2),o=N(a),s=N(o);s.value=s.__value=``;var c=F(s);c.value=c.__value=`GET`;var l=F(c);l.value=l.__value=`POST`;var u=F(l);u.value=u.__value=`PUT`;var d=F(u);d.value=d.__value=`PATCH`;var f=F(d);f.value=f.__value=`DELETE`,E(o);var p=F(o,2),m=N(p);m.value=m.__value=``;var h=F(m);h.value=h.__value=`200`;var g=F(h);g.value=g.__value=`201`;var _=F(g);_.value=_.__value=`400`;var v=F(_);v.value=v.__value=`401`;var y=F(v);y.value=y.__value=`403`;var b=F(y);b.value=b.__value=`404`;var x=F(b);x.value=x.__value=`429`;var S=F(x);S.value=S.__value=`500`;var C=F(S);C.value=C.__value=`502`;var w=F(C);w.value=w.__value=`503`;var T=F(w);T.value=T.__value=`504`,E(p);var ee=F(p,2),te=N(ee);te.value=te.__value=``;var ne=F(te);ne.value=ne.__value=`true`;var re=F(ne);re.value=re.__value=`false`,E(ee);var ie=F(ee,2);q(N(ie),{get icon(){return Ro},class:`table-icon-svg`}),He(2),E(ie),E(a),E(r),R(`change`,o,()=>LF.fetchAuditLog(!0)),Wi(o,()=>LF.auditMethod,e=>LF.auditMethod=e),R(`change`,p,()=>LF.fetchAuditLog(!0)),Wi(p,()=>LF.auditStatusCode,e=>LF.auditStatusCode=e),R(`change`,ee,()=>LF.fetchAuditLog(!0)),Wi(ee,()=>LF.auditStream,e=>LF.auditStream=e),R(`click`,ie,()=>LF.clearAuditFilters()),B(e,r),O()}Vr([`change`,`click`]);var BF=z(`Live stream connecting…`),VF=z(` `),HF=z(`Live`),UF=z(` `);function WF(e,t){D(t,!0);let n=k(()=>UC.auditLivePauseReason()),r=k(()=>UC.liveLogsStreaming&&!L(n));var i=Zr(),a=P(i),o=e=>{var t=UF(),i=N(t);let a;var o=F(i,2),s=e=>{B(e,BF())},c=e=>{var t=VF(),r=N(t,!0);E(t),I(e=>V(r,e),[()=>jC(L(n))]),B(e,t)},l=e=>{B(e,HF())};H(o,e=>{UC.liveLogsStreaming?L(n)?e(c,1):e(l,-1):e(s)}),E(t),I(()=>a=W(i,1,`live-dot svelte-tve6yv`,null,a,{"is-streaming":L(r)})),B(e,t)},s=k(()=>As.liveLogsVisible());H(a,e=>{L(s)&&e(o)}),B(e,i),O()}var GF=z(` `),KF=z(``);function qF(e,t){D(t,!0);let n=k(()=>[{key:`provider`,text:Dc(t.entry)||`-`},{key:`model`,text:t.entry.requested_model||t.entry.model||`-`,mono:!0},{key:`user_path`,text:t.entry.user_path,mono:!0},{key:`request_id`,text:`request_id: `+(t.entry.request_id||`-`),mono:!0},{key:`ip`,text:t.entry.client_ip&&`ip: `+t.entry.client_ip,mono:!0},{key:`auth_key_id`,text:t.entry.auth_key_id&&`auth_key_id: `+t.entry.auth_key_id,mono:!0},{key:`alias`,text:t.entry.alias_used&&`alias`,class:`audit-alias-badge`},{key:`resolved`,text:t.entry.alias_used&&t.entry.resolved_model&&`resolved: `+Ac(t.entry),mono:!0},{key:`failover`,text:nF(t.entry)&&`failover: `+nF(t.entry),mono:!0},{key:`stream`,text:t.entry.stream&&`stream`},{key:`error_type`,text:t.entry.error_type}].filter(e=>!!e.text));var r=KF(),i=F(N(r),2);U(i,21,()=>L(n),e=>e.key,(e,t)=>{var n=GF(),r=N(n,!0);E(n),I(()=>{W(n,1,Pi([`provider-badge`,L(t).class,{mono:L(t).mono}]),`svelte-hyopt0`),V(r,L(t).text)}),B(e,n)}),E(i),E(r),B(e,r),O()}var JF=z(``),YF=z(` `);function XF(e,t){D(t,!0);let n=k(()=>lF(t.entry)),r=k(()=>L(n).length>0?dF(t.entry):``),i=k(()=>L(n).length>0?uF(t.entry):``);var a=Zr(),o=P(a),s=e=>{var a=YF(),o=N(a);U(o,21,()=>L(n),e=>t.entry.id+`-pip-`+e.seq,(e,t)=>{var n=JF();let r;I(e=>{r=W(n,1,`audit-attempt-pip svelte-1eu22xn`,null,r,{"audit-attempt-success":!!(L(t)&&L(t).success),"audit-attempt-error":!(L(t)&&L(t).success)}),G(n,`title`,e)},[()=>fF(L(t))]),B(e,n)}),E(o);var s=F(o,2),c=N(s,!0);E(s),E(a),I(()=>{G(a,`title`,L(r)),G(a,`aria-label`,L(r)),V(c,L(i))}),B(e,a)};H(o,e=>{L(n).length>0&&e(s)}),B(e,a),O()}var ZF=new Set([`instructions`,`messages`,`input`,`previous_response_id`,`choices`,`output`]);function QF(e){if(!e||typeof e!=`object`)return``;let t=String(e.type||``).toLowerCase();if(t===`image`||t===`image_url`||t===`input_image`||t===`output_image`)return`[Image]`;if(t===`audio`||t===`input_audio`||t===`output_audio`)return`[Audio]`;if(t===`file`||t===`input_file`||t===`output_file`){let t=String(e.filename||e.name||``).trim();return t?`[File: `+t+`]`:`[File]`}return typeof e.refusal==`string`?e.refusal:``}function $F(e){if(e==null)return``;if(typeof e==`string`)return e.trim();if(Array.isArray(e))return e.map(e=>typeof e==`string`?e:!e||typeof e!=`object`?``:typeof e.text==`string`?e.text:typeof e.output_text==`string`?e.output_text:QF(e)).filter(Boolean).join(` -`).trim();if(typeof e==`object`){if(typeof e.text==`string`)return e.text.trim();try{return JSON.stringify(e,null,2)}catch{return``}}return String(e).trim()}function eI(e){return!e||typeof e!=`object`?``:$F(e.content)||(typeof e.refusal==`string`?e.refusal.trim():``)}function tI(e){if(e==null)return[];if(typeof e==`string`)return e?[e]:[];if(Array.isArray(e))return e.flatMap(e=>typeof e==`string`?e?[e]:[]:!e||typeof e!=`object`?[]:typeof e.text==`string`?e.text?[e.text]:[]:typeof e.output_text==`string`&&e.output_text?[e.output_text]:[]);if(typeof e==`object`)return typeof e.text==`string`&&e.text?[e.text]:[];let t=String(e);return t?[t]:[]}function nI(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(nI);if(typeof e==`object`)return Object.entries(e).flatMap(([e,t])=>[e,...nI(t)]);let t=String(e);return t?[t]:[]}function rI(e){return $I(e).flatMap(e=>[...e.name?[String(e.name)]:[],...nI(e.arguments)])}function iI(e){return Array.isArray(e)?e.flatMap(e=>e&&typeof e==`object`&&e.type===`tool_use`?rI([e]):tI(e)):tI(e)}function aI(e){let t=e&&e.usage?e.usage.estimated_cached_characters:null;if(t==null)return null;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):0}function oI(e,t){if(!e)return null;let n=(Array.isArray(t)?t:[]).reduce((e,t)=>e+String(t||``).length,0),r=Math.min(String(e).length,n);return r>0?{total:r}:null}function sI(e){let t=e&&e.arguments!==void 0?e.arguments:``,n=``;if(typeof t==`string`)n=t;else try{n=JSON.stringify(t)}catch{n=String(t)}return(String(e&&e.name||``)+`(`+n+`)`).length}function cI(e){return{characters:(Array.isArray(e)?e:[]).map(sI)}}function lI(e,t){let n=Math.max(0,Number(t||0));return e.map(e=>{if(!e||e.role===`error`)return e;let t=Math.max(0,Number(e._promptTextCharacters||0)),r=Math.min(n,t);n-=r;let i=0;(Array.isArray(e._toolPromptCharacters)?e._toolPromptCharacters:[]).forEach(e=>{let t=Math.max(0,Number(e||0)),r=Math.min(n,t);n-=r,i+=r});let a=t+(e._toolPromptCharacters||[]).reduce((e,t)=>e+Math.max(0,Number(t||0)),0);return{...e,promptCacheRatio:a>0?(r+i)/a:0}})}function uI(e){if(e==null)return[];if(typeof e==`string`){let t=e.trim();return t?[{role:`user`,text:t}]:[]}if(!Array.isArray(e)){let t=$F(e);return t?[{role:`user`,text:t}]:[]}return e.map(e=>{if(!e||typeof e!=`object`)return null;let t=String(e.role||`user`).toLowerCase(),n=$F(e.content);return n?{role:t,text:n}:null}).filter(Boolean)}function dI(e){return eI(e)}function fI(e){if(!e||typeof e!=`object`)return[];let t=[];return t.push(...tI(e.instructions)),Array.isArray(e.messages)&&e.messages.forEach(e=>{!e||typeof e!=`object`||(t.push(...iI(e.content)),t.push(...rI(e.tool_calls)))}),typeof e.input==`string`?t.push(e.input):Array.isArray(e.input)?e.input.forEach(e=>{if(!(!e||typeof e!=`object`)){if(e.type===`function_call`||e.type===`tool_use`){t.push(...rI([e]));return}t.push(...iI(e.content)),typeof e.text==`string`&&t.push(e.text)}}):e.input&&typeof e.input==`object`&&(t.push(...tI(e.input.content)),typeof e.input.text==`string`&&t.push(e.input.text)),t.map(e=>String(e||``)).filter(e=>e.length>0)}var pI=e=>$F(e);function mI(e){if(!e||!e.data)return``;let t=TP(e.data.response_body,0,pI);if(t)return t;let n=e.data.error_message;if(n==null)return``;if(typeof n==`string`){let e=n.trim();return e?TP(CP(e),0,pI)||e:``}return TP(n,0,pI)||$F(n)}function hI(e){return Array.isArray(e)?e.some(e=>!e||typeof e!=`object`?!1:e.type===`message`||e.role===`assistant`||e.role===`user`||e.role===`system`?!0:Array.isArray(e.content)?e.content.some(e=>!e||typeof e!=`object`?!1:typeof e.text==`string`||e.type===`output_text`||e.type===`input_text`):!1):!1}function gI(e){if(!e)return!1;let t=String(e).toLowerCase();return t===`/v1/embeddings`||t===`/v1/embeddings/`||t.startsWith(`/v1/embeddings?`)||t.startsWith(`/v1/embeddings/`)}function _I(e){return e?!!yI(e):!1}function vI(e){let t=String(e||``).trim().split(`?`)[0].replace(/\/+$/,``).toLowerCase();return t.startsWith(`/v1/`)?t.slice(3):t}function yI(e){switch(vI(e)){case`/chat/completions`:return`chat`;case`/responses`:return`responses`;case`/messages`:return`messages`;default:return``}}function bI(e){if(!e||typeof e!=`object`)return null;try{return JSON.parse(JSON.stringify(e))}catch{return null}}function xI(e,t){if(!t||typeof t!=`object`)return;let n=e[e.length-1];try{if(n&&JSON.stringify(n)===JSON.stringify(t))return}catch{}e.push(t)}function SI(e){let t=yI(e&&e.path),n=e&&e.data&&e.data.request_body;return!t||!n||typeof n!=`object`?!1:t!==`responses`||(e.data&&e.data.response_body&&typeof e.data.response_body.id==`string`?e.data.response_body.id.trim():``)!==``||oL(n)!==``}function CI(e,t){let n=String(t||``).trim(),r=yI(e&&e.path),i=bI(e&&e.data&&e.data.request_body);if(!n||!r||!i)return null;let a=e&&e.data?e.data.response_body:null;if(r===`responses`){let e=a&&typeof a.id==`string`?a.id.trim():``,t=oL(i);return!e&&!t?null:(i.input=n,e&&!t?i.previous_response_id=e:delete i.previous_response_id,i)}let o=Array.isArray(i.messages)?i.messages:[];if(r===`chat`){let e=a&&Array.isArray(a.choices)?a.choices[0]:null;e&&e.message&&xI(o,bI(e.message)),o.push({role:`user`,content:n})}else a&&a.content!==void 0&&xI(o,{role:String(a.role||`assistant`),content:bI(a.content)||a.content}),o.push({role:`user`,content:n});return i.messages=o,i}var wI=new Set(`authorization.proxy-authorization.cookie.content-type.content-length.host.accept.connection.accept-encoding.content-encoding.transfer-encoding.user-agent.date.expect.upgrade.via.te.trailer.keep-alive.origin.referer.forwarded.x-real-ip.traceparent.tracestate.x-request-id.idempotency-key.x-idempotency-key.x-gomodel-timezone.x-gomodel-interaction-parent`.split(`.`));function TI(e,t,n=``){let r=e&&e.data&&e.data.request_headers,i={};return r&&typeof r==`object`&&Object.keys(r).forEach(e=>{let t=String(e).toLowerCase(),n=String(r[e]==null?``:r[e]);!e||!n||n===`[REDACTED]`||wI.has(t)||t.startsWith(`sec-`)||t.startsWith(`cf-`)||t.startsWith(`x-forwarded-`)||(i[e]=n)}),i[`X-GoModel-Interaction-Parent`]=String(t||e&&e.id||``).trim(),String(n||``).trim()&&(i[`X-Request-ID`]=String(n).trim()),i}function EI(e,t){let n=String(t||``).trim();return!n||!Array.isArray(e)?null:e.find(e=>String(e&&e.request_id||``).trim()===n)||null}function DI(e,t,n,r,i){let a=Array.isArray(e)?e:[],o=String(i&&i.id||``).trim(),s=String(i&&i.request_id||``).trim(),c=String(i&&i.session_id||``).trim(),l=String(r||``).trim(),u=OI(i),d=a.some(e=>o&&String(e&&e.id||``).trim()===o||s&&String(e&&e.request_id||``).trim()===s),f=!!l&&s===l,p=!!n&&c===String(n).trim(),m=!!u&&(u===String(t||``).trim()||a.some(e=>String(e&&e.id||``).trim()===u)),h=d||f||!l&&(p||m);return{accepted:h,submittedChild:f,followUpRequestID:h&&f&&o?``:l}}function OI(e){let t=e&&e.data&&e.data.request_headers;if(!t||typeof t!=`object`)return``;let n=Object.keys(t).find(e=>e.toLowerCase()===`x-gomodel-interaction-parent`);return n?String(t[n]||``).trim():``}function kI(e,t){return!Array.isArray(e)||!t?null:e.find(e=>String(e&&e.id||``)===String(t))||null}function AI(e){return!Array.isArray(e)||e.length===0?null:e.reduce((e,t)=>e?sL(t,e)>=0?t:e:t,null)}function jI(e,t){let n=new Set(Array.isArray(t)?t.map(String):[]);return AI((Array.isArray(e)?e:[]).filter(e=>{let t=String(e&&e.id||``);return n.has(t)&&e&&e.data&&e.data.request_body!=null}))}function MI(e,t){let n=AI(e);return!!n&&String(n.id||``)===String(t||``)}function NI(e,t,n){return String(e||``).trim()===`audit.flushed`&&String(t||``).trim()!==``&&String(t||``).trim()===String(n||``).trim()}function PI(e,t){let n=Array.isArray(e)?e.filter(Boolean).map(String):[];return(Array.isArray(t)?t:[]).forEach(e=>{let t=String(e&&(e.id||e.request_id)||``).trim();t&&!n.includes(t)&&n.push(t)}),n}function FI(e){if(e&&e.conversation_payload)return!0;let t=e&&e.data?e.data.request_body:null,n=e&&e.data?e.data.response_body:null,r=t&&(Array.isArray(t.messages)||t.input!==void 0||typeof t.instructions==`string`||typeof t.previous_response_id==`string`),i=n&&(Array.isArray(n.choices)||hI(n.output));return!!(r||i)}function II(e){return!e||gI(e.path)?!1:_I(e.path)||FI(e)}function LI(e){let t=0,n=!1,r=!1,i=String(e||``);for(let e=0;e0&&a+1`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function VI(e){return!!(e&&typeof e==`object`&&e.__audio__===!0)}function HI(e){let t=Number(e||0);if(!Number.isFinite(t)||t<=0)return`0 B`;let n=[`B`,`KB`,`MB`,`GB`],r=0,i=t;for(;i>=1024&&r`
        `+BI(t)+``+BI(WI(e[t]))+`
        `);return t.length?``:``}function KI(e){let t=UI(e.content_type),n=BI(t+` · `+HI(e.bytes)),r=GI(e.meta);if(e.stored&&e.encoding===`base64`&&e.data){let i=String(e.data).replace(/[^A-Za-z0-9+/=]/g,``);return`
        `+n+`
        `+r+`
        `}let i=e.too_large?`Audio too large to store.`:`Audio not logged. Set LOGGING_LOG_AUDIO_BODIES=true to capture playable audio.`;return`
        `+n+`
        `+BI(i)+`
        `+r+`
        `}function qI(e){try{return JSON.stringify(String(e)).slice(1,-1)}catch{return``}}function JI(e){if(!e||typeof e!=`object`)return null;let t=Number(e.characters||0);if(!Number.isFinite(t)||t<=0)return null;let n=Array.isArray(e.segments)?e.segments.map(e=>String(e||``)).filter(Boolean):[];return n.length===0?null:{remaining:Math.floor(t),segments:n,segmentIndex:0}}function YI(e,t){if(!t||t.remaining<=0||t.segmentIndex>=t.segments.length)return BI(e);let n=``,r=0,i=0;for(;t.remaining>0&&t.segmentIndex`+BI(l)+``,r=s+l.length,i=s+o.length,t.remaining-=c,c>=a.length){t.segmentIndex++;continue}break}return n?n+BI(e.slice(r)):BI(e)}function XI(e,t,n){let r=n&&typeof n.formatJSON==`function`?n.formatJSON:e=>String(e),i=n&&typeof n.canShowConversation==`function`?n.canShowConversation:()=>!1,a=JI(n&&n.promptCacheHighlight),o=r(t);if(!o||o===`Not captured`)return BI(o);if(!i(e))return o.split(` -`).map(e=>YI(e,a)).join(` -`);let s=o.split(` -`),c=[],l=0;for(;lYI(e,a)).join(` -`);c.push(``+o+``),l=r+1;continue}c.push(YI(e,a)),l++}return c.join(` -`)}function ZI(e){let t=String(e||``).toLowerCase();return t===`system`||t===`developer`?{role:`system`,label:`System Prompt`,className:`role-system`}:t===`assistant`?{role:`assistant`,label:`Agent`,className:`role-assistant`}:t===`error`?{role:`error`,label:`Error`,className:`role-error`}:t===`function_call`?{role:`function_call`,label:`Function Call`,className:`role-function-call`}:t===`function_result`?{role:`function_result`,label:`Function Result`,className:`role-function-result`}:{role:`user`,label:`User`,className:`role-user`}}function QI(e,t,{timestamp:n,entryID:r,isAnchor:i,isAfterAnchor:a,index:o,toolCalls:s,functionName:c,functionCallID:l,promptCache:u,toolPromptCache:d}){let f=ZI(e),p=u&&Number.isFinite(Number(u.total))?Math.max(0,Number(u.total)):u===null?0:String(t||``).length,m=d&&Array.isArray(d.characters)?d.characters:cI(s).characters;return{uid:r+`-`+o,entryID:r,timestamp:n,text:t,role:f.role,roleLabel:f.label,roleClass:f.className,isAnchor:i,isAfterAnchor:a,toolCalls:Array.isArray(s)&&s.length>0?s:null,functionName:c||``,functionCallID:l||``,promptCacheRatio:0,_promptTextCharacters:p,_toolPromptCharacters:m}}function $I(e){return Array.isArray(e)?e.map(e=>{if(!e)return null;let t=e.function||e,n=``;return t.arguments===void 0?e.arguments===void 0?t.input===void 0?e.input!==void 0&&(n=e.input):n=t.input:n=e.arguments:n=t.arguments,{name:t.name||e.name||``,arguments:n,id:e.call_id||e.id||``}}).filter(Boolean):[]}function eL(e){return Array.isArray(e)?$I(e.filter(e=>e&&typeof e==`object`&&e.type===`tool_use`)):[]}function tL(e){return Array.isArray(e)?e.filter(e=>e&&typeof e==`object`&&e.type===`tool_result`).map(e=>({id:e.tool_use_id||e.call_id||``,text:$F(e.content)})):[]}function nL(e,t,n){!t||!n||[t.call_id,t.id].forEach(t=>{t&&(e[t]=n)})}function rL(e,t,n){if(t&&Array.isArray(t.messages)&&t.messages.forEach(t=>{t&&[...Array.isArray(t.tool_calls)?t.tool_calls:[],...Array.isArray(t.content)?t.content.filter(e=>e&&e.type===`tool_use`):[]].forEach(t=>{t&&nL(e,t,(t.function||t).name||t.name||``)})}),t&&Array.isArray(t.input)&&t.input.forEach(t=>{!t||typeof t!=`object`||t.type!==`function_call`&&t.type!==`tool_use`||nL(e,t,t.name||``)}),n&&Array.isArray(n.choices)){let t=n.choices[0];t&&t.message&&Array.isArray(t.message.tool_calls)&&t.message.tool_calls.forEach(t=>{t&&nL(e,t,(t.function||t).name||t.name||``)})}n&&Array.isArray(n.output)&&n.output.forEach(t=>{!t||t.type!==`function_call`&&t.type!==`tool_use`||nL(e,t,t.name||``)}),n&&Array.isArray(n.content)&&n.content.forEach(t=>{!t||t.type!==`tool_use`||nL(e,t,t.name||``)})}function iL(e){return Array.isArray(e)?`[`+e.map(iL).join(`,`)+`]`:e&&typeof e==`object`?`{`+Object.keys(e).sort().map(t=>JSON.stringify(t)+`:`+iL(e[t])).join(`,`)+`}`:JSON.stringify(e)}function aL(e){if(!e||typeof e!=`object`)return null;let t=[];if(e.system!==void 0&&t.push({system:e.system}),e.instructions!==void 0&&t.push({instructions:e.instructions}),Array.isArray(e.messages))t.push(...e.messages);else if(Array.isArray(e.input)&&e.previous_response_id==null&&e.conversation==null)t.push(...e.input);else return null;return t.map(iL)}function oL(e){let t=e&&e.conversation;return typeof t==`string`?t.trim():t&&typeof t.id==`string`?t.id.trim():``}function sL(e,t){let n=new Date(e&&e.timestamp).getTime(),r=new Date(t&&t.timestamp).getTime();if(Number.isFinite(n)&&Number.isFinite(r)&&n!==r)return n-r;let i=String(e&&e.timestamp||``).localeCompare(String(t&&t.timestamp||``));if(i!==0)return i;let a=String(e&&e.id||``),o=String(t&&t.id||``);return ao)}function cL(e,t){if(!Array.isArray(e)||e.length===0)return{messages:[],entryIDs:[]};let n=[...e].sort(sL),r={};n.forEach(e=>{let t=e.data&&e.data.request_body?e.data.request_body:null,n=e.data&&e.data.response_body?e.data.response_body:null;rL(r,t,n)});let i=[],a=new Set,o=new Set,s=new Set,c=[],l=null,u=0,d=n.findIndex(e=>e.id===t),f=e=>JSON.stringify({role:e.role,text:e.text,toolCalls:e.toolCalls,functionName:e.functionName,functionCallID:e.functionCallID});return n.forEach((e,n)=>{let p=e.id===t,m=d>=0&&n>d,h=e.timestamp,g=e.data&&e.data.request_body?e.data.request_body:null,_=e.data&&e.data.response_body?e.data.response_body:null,v=i.length,y=(e,t)=>oI(e,t),b=e=>cI(e),x=(t,n,{toolCalls:r,functionName:i,functionCallID:a,promptCache:o,toolPromptCache:s}={})=>QI(t,n,{timestamp:h,entryID:e.id,isAnchor:p,isAfterAnchor:m,index:++u,toolCalls:r,functionName:i,functionCallID:a,promptCache:o,toolPromptCache:s});if(g&&g.system!==void 0){let e=$F(g.system);e&&i.push(x(`system`,e,{promptCache:y(e,tI(g.system))}))}if(g&&g.instructions!==void 0){let e=$F(g.instructions);e&&i.push(x(`system`,e,{promptCache:y(e,tI(g.instructions))}))}g&&Array.isArray(g.messages)&&g.messages.forEach(e=>{if(!e)return;let t=(e.role||`user`).toLowerCase();if(t===`tool`){let t=$F(e.content),n=e.name||r[e.tool_call_id]||``;t&&i.push(x(`function_result`,t,{functionName:n,functionCallID:e.tool_call_id||``,promptCache:y(t,tI(e.content))}));return}if(t===`assistant`){let n=eI(e),r=[...$I(e.tool_calls),...eL(e.content)];if(n||r.length>0){let a=y(n,tI(e.content));i.push(x(t,n,{toolCalls:r,promptCache:a,toolPromptCache:b(r)}))}return}tL(e.content).forEach(e=>{e.text&&i.push(x(`function_result`,e.text,{functionName:r[e.id]||``,functionCallID:e.id,promptCache:y(e.text,[e.text])}))});let n=eI(e);n&&i.push(x(t,n,{promptCache:y(n,tI(e.content))}))}),g&&g.input!==void 0&&(Array.isArray(g.input)?g.input.forEach(e=>{if(!(!e||typeof e!=`object`)){if(e.type===`function_call_output`||e.type===`tool_result`){let t=e.type===`tool_result`,n=t?e.content:e.output,a=t?e.tool_use_id||e.call_id||``:e.call_id||``,o=typeof n==`string`?n:$F(n);o&&i.push(x(`function_result`,o,{functionName:r[a]||e.name||``,functionCallID:a,promptCache:y(o,t?tI(e.content):[o])}))}else if(e.type===`function_call`||e.type===`tool_use`){let t=$I([e]);i.push(x(`function_call`,``,{toolCalls:t,toolPromptCache:b(t)}))}else if(e.role){let t=String(e.role).toLowerCase(),n=$F(e.content);n&&i.push(x(t,n,{promptCache:y(n,tI(e.content))}))}}}):uI(g.input).forEach(e=>{if(!e.text)return;let t=[];typeof g.input==`string`?t=[g.input]:g.input&&typeof g.input==`object`&&(t=tI(g.input.content),typeof g.input.text==`string`&&t.push(g.input.text)),i.push(x(e.role,e.text,{promptCache:y(e.text,t)}))}));let S=i.splice(v),C=S.map(f),w=aL(g),T=w!==null,ee=OI(e),te=!!ee&&a.has(ee),ne=String(g&&g.previous_response_id||``).trim(),re=oL(g),ie=te||!!ne&&o.has(ne)||!!re&&s.has(re);if(m){let e=T&&l&&l.length>0&&l.every((e,t)=>w[t]===e);if(T&&!e&&!te||!T&&!ie)return}p&&T&&(l=[...w]);let ae=String(e.id||``).trim();p&&(a.clear(),o.clear(),s.clear()),ae&&(p||m)&&a.add(ae),re&&s.add(re);let oe=0;for(;oe0;){let t=c.slice(-e),n=C.slice(0,e);if(t.every((e,t)=>e===n[t]))break;e--}i.push(...S.slice(e)),c.push(...C.slice(e))}let se=aI(e);if(g&&se!==null&&i.splice(0,i.length,...lI(i,se)),_&&Array.isArray(_.choices)){let e=_.choices[0];if(e&&e.message){let t=(e.message.role||`assistant`).toLowerCase(),n=eI(e.message),r=$I(e.message.tool_calls);if(n||r.length>0){let e=x(t,n,{toolCalls:r});i.push(e),c.push(f(e))}}}if(_&&Array.isArray(_.output)&&_.output.forEach(e=>{if(!e)return;if(e.type===`function_call`||e.type===`tool_use`){let t=x(`function_call`,``,{toolCalls:$I([e])});i.push(t),c.push(f(t));return}let t=(e.role||`assistant`).toLowerCase(),n=dI(e);if(n){let e=x(t,n);i.push(e),c.push(f(e))}}),_&&_.content!==void 0&&!Array.isArray(_.choices)&&!Array.isArray(_.output)){let e=String(_.role||`assistant`).toLowerCase(),t=$F(_.content),n=eL(_.content);if(t||n.length>0){let r=x(e,t,{toolCalls:n});i.push(r),c.push(f(r))}}let ce=mI(e);ce&&i.push(x(`error`,ce));let le=String(_&&_.id||``).trim();le&&o.add(le)}),{messages:i,entryIDs:[...a]}}function lL(e){return e.role===`function_call`?(e.toolCalls||[]).map(function(e){return e.name+`(`+dL(e)+`)`}).join(` - -`):e.text||``}function uL(e){return e?[String(e.text||``),Array.isArray(e.toolCalls)&&e.toolCalls.length>0?lL({role:`function_call`,toolCalls:e.toolCalls}):``].filter(Boolean).join(` - -`):``}function dL(e){let t=e&&e.arguments!==void 0?e.arguments:``;if(typeof t!=`string`)try{return JSON.stringify(t,null,2)}catch{return String(t)}try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}var fL=600*1e3,pL=15*1e3,mL=250,hL=class{#e=A(!1);get conversationOpen(){return L(this.#e)}set conversationOpen(e){j(this.#e,e,!0)}#t=A(!1);get conversationLoading(){return L(this.#t)}set conversationLoading(e){j(this.#t,e,!0)}#n=A(``);get conversationError(){return L(this.#n)}set conversationError(e){j(this.#n,e,!0)}#r=A(``);get conversationAnchorID(){return L(this.#r)}set conversationAnchorID(e){j(this.#r,e,!0)}#i=A(M([]));get conversationEntryIDs(){return L(this.#i)}set conversationEntryIDs(e){j(this.#i,e,!0)}#a=A(``);get conversationSessionID(){return L(this.#a)}set conversationSessionID(e){j(this.#a,e,!0)}#o=A(!1);get conversationTruncated(){return L(this.#o)}set conversationTruncated(e){j(this.#o,e,!0)}#s=A(!1);get conversationFollowLatest(){return L(this.#s)}set conversationFollowLatest(e){j(this.#s,e,!0)}#c=A(``);get conversationOpenedFromID(){return L(this.#c)}set conversationOpenedFromID(e){j(this.#c,e,!0)}#l=A(``);get followUpText(){return L(this.#l)}set followUpText(e){j(this.#l,e,!0)}#u=A(!1);get followUpSending(){return L(this.#u)}set followUpSending(e){j(this.#u,e,!0)}#d=A(``);get followUpError(){return L(this.#d)}set followUpError(e){j(this.#d,e,!0)}followUpRequestID=``;followUpAbort=null;conversationRequestToken=0;conversationReturnFocusEl=null;bodyPointerStart=null;#f=A(null);get conversationDialogEl(){return L(this.#f)}set conversationDialogEl(e){j(this.#f,e,!0)}#p=A(null);get conversationCloseBtnEl(){return L(this.#p)}set conversationCloseBtnEl(e){j(this.#p,e,!0)}#m=A(null);get conversationThreadEl(){return L(this.#m)}set conversationThreadEl(e){j(this.#m,e,!0)}get conversationEntries(){return(this.conversationEntryIDs||[]).map(e=>UC.auditRecord(e)).filter(Boolean)}#h=k(()=>cL(this.conversationEntries,this.conversationAnchorID));get conversationView(){return L(this.#h)}set conversationView(e){j(this.#h,e)}get conversationMessages(){return this.conversationView.messages}get conversationBranchEntryIDs(){return this.conversationView.entryIDs}_setConversationEntryIDs(e){this.conversationEntryIDs=[...new Set((Array.isArray(e)?e:[]).filter(Boolean))],UC.pinAuditRecords(this.conversationEntryIDs)}canShowConversation(e){return II(e)}startBodyInteraction(e){this.bodyPointerStart={x:e.clientX,y:e.clientY}}_isBodyDrag(e){if(!this.bodyPointerStart)return!1;let t=Math.abs(e.clientX-this.bodyPointerStart.x),n=Math.abs(e.clientY-this.bodyPointerStart.y);return t>4||n>4}_hasActiveSelection(){let e=window.getSelection?window.getSelection():null;return!e||e.isCollapsed?!1:String(e.toString()||``).trim().length>0}handleBodyConversationClick(e,t){let n=this._isBodyDrag(e);if(this.bodyPointerStart=null,n||this._hasActiveSelection()||!this.canShowConversation(t))return;let r=e.target&&e.target.closest?e.target.closest(`[data-conversation-trigger="1"]`):null;r&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,r))}handleErrorConversationClick(e,t){let n=this._isBodyDrag(e);this.bodyPointerStart=null,!n&&(this._hasActiveSelection()||this.canShowConversation(t)&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,e.currentTarget)))}formatJSON(e){return gc(e)}renderBodyWithConversationHighlights(e,t,n){return XI(e,t,{formatJSON:e=>this.formatJSON(e),canShowConversation:e=>this.canShowConversation(e),promptCacheHighlight:n&&n.promptCacheHighlight})}async openConversation(e,t){if(!e||!e.id||!this.canShowConversation(e))return;let n=document.activeElement instanceof HTMLElement?document.activeElement:null;t instanceof HTMLElement?this.conversationReturnFocusEl=t:n&&n!==document.body&&(this.conversationReturnFocusEl=n);let r=++this.conversationRequestToken;if(this.conversationOpen=!0,this.conversationError=``,this.conversationAnchorID=e.id,this.conversationOpenedFromID=e.id,this.conversationSessionID=String(e.session_id||``).trim(),this._setConversationEntryIDs([]),this.conversationTruncated=!1,this.conversationFollowLatest=!1,this.followUpText=``,this.followUpError=``,this.followUpRequestID=``,requestAnimationFrame(()=>this._focusConversationDrawer()),this._conversationEntryLivePending(e)){this.conversationFollowLatest=!0,this.conversationLoading=!1,this._addConversationRecord(UC.upsertAuditRecord(e,`conversation.live`));return}this.conversationLoading=!0,await this.fetchConversation(e.id,r,!0,!0)}_conversationEntryLivePending(e){return typeof UC.auditEntryLiveDetailPending==`function`&&UC.auditEntryLiveDetailPending(e)}_applyConversationView(){let e=this.conversationEntries,t=cL(e,this.conversationAnchorID);if(this.conversationFollowLatest){let n=jI(e,t.entryIDs);n&&n.id&&String(n.id)!==this.conversationAnchorID&&(this.conversationAnchorID=String(n.id))}}handleAuditRecordChange(e,t){if(!this.conversationOpen||!e)return;let n=String(e.id||``).trim(),r=DI(this.conversationEntries,this.conversationAnchorID,this.conversationSessionID,this.followUpRequestID,e);if(r.accepted&&(this.followUpRequestID=r.followUpRequestID,n&&r.submittedChild&&(this.conversationAnchorID=n,this.conversationFollowLatest=!0),this._addConversationRecord(e),NI(String(t||e._live_state||``).trim(),n,this.conversationAnchorID))){this.conversationMessages.length===0&&(this.conversationLoading=!0);let e=++this.conversationRequestToken;this.fetchConversation(n,e,!1)}}_addConversationRecord(e){let t=IC(e);t&&!this.conversationEntryIDs.includes(t)&&this._setConversationEntryIDs([...this.conversationEntryIDs,t]),!this.conversationSessionID&&e.session_id&&(this.conversationSessionID=String(e.session_id).trim()),this._applyConversationView(),this.conversationFollowLatest&&this._scheduleLatestScroll()}conversationLiveWaiting(){if(!this.conversationOpen)return!1;let e=new Set(this.conversationBranchEntryIDs||[]);return(this.conversationEntries||[]).some(t=>e.has(String(t&&t.id||``))&&t._live&&(typeof UC.liveAuditStateSettled!=`function`||!UC.liveAuditStateSettled(t._live_state)))}conversationLiveStatusText(){return(this.conversationMessages||[]).length>0?`Model is responding…`:`Waiting for request data…`}closeConversation(){this.followUpAbort&&this.followUpAbort.abort(),this.conversationOpen=!1,this.conversationRequestToken++,this.conversationSessionID=``,this._setConversationEntryIDs([]),this.conversationFollowLatest=!1,this.conversationOpenedFromID=``,this.followUpRequestID=``,this.followUpSending=!1;let e=this.conversationReturnFocusEl;this.conversationReturnFocusEl=null,e&&typeof e.focus==`function`&&document.contains(e)&&requestAnimationFrame(()=>e.focus())}_focusConversationDrawer(){if(!this.conversationOpen)return;let e=this.conversationCloseBtnEl;if(e&&typeof e.focus==`function`){e.focus();return}let t=this.conversationDialogEl;t&&typeof t.focus==`function`&&t.focus()}async fetchConversation(e,t,n=!0,r=!1){try{let i=await Ts(`/admin/audit/conversation?`+(`log_id=`+encodeURIComponent(e)+`&limit=120`),{label:`audit conversation`});if(t!==this.conversationRequestToken||i.stale)return;if(!i.ok){this.conversationError=`Unable to load interactions.`;return}let a=i.data||{},o=a.anchor_id||e,s=Array.isArray(a.entries)?a.entries:[],c=UC.upsertAuditRecords(s,`conversation.hydrated`),l=PI(this.conversationEntryIDs,c);l.length>this.conversationEntryIDs.length&&this._setConversationEntryIDs(l),r&&(this.conversationFollowLatest=MI(c,o)),this.conversationAnchorID=o;let u=this.conversationEntries.find(e=>e.id===this.conversationAnchorID);u&&u.session_id&&(this.conversationSessionID=String(u.session_id).trim()),this.conversationTruncated=!!a.truncated,this._applyConversationView(),this.conversationFollowLatest?this._scheduleLatestScroll():n&&this._scheduleAnchorScroll()}catch(e){if(t!==this.conversationRequestToken)return;console.error(`Failed to fetch audit conversation:`,e),this.conversationError=`Failed to load interactions.`}finally{t===this.conversationRequestToken&&(this.conversationLoading=!1)}}selectedConversationEntry(){return kI(this.conversationEntries,this.conversationAnchorID)}followUpKind(){let e=this.selectedConversationEntry();return SI(e)?yI(e.path):``}canSendFollowUp(){return!!this.followUpKind()&&!!String(this.followUpText||``).trim()&&!this.followUpSending&&!this.conversationLiveWaiting()}async sendFollowUp(){if(!this.canSendFollowUp())return;let e=this.selectedConversationEntry(),t=CI(e,this.followUpText);if(!e||!t)return;let n=this.conversationAnchorID,r=_L(),i=new AbortController,a=!1,o=setTimeout(()=>{a=!0,i.abort()},fL);this.followUpSending=!0,this.followUpError=``,this.followUpRequestID=r,this.followUpAbort=i;try{let a=TI(e,n,r),o=await Cs(e.path,{method:`POST`,headers:a,body:JSON.stringify(t),signal:i.signal}),s=String(o.headers.get(`X-Request-ID`)||``).trim();if(s&&this.followUpRequestID&&(this.followUpRequestID=s),!o.ok){let e=`Unable to send message.`;try{let t=await o.json();e=t&&t.error&&t.error.message||e}catch{}this.followUpError=e,(this.followUpRequestID===r||this.followUpRequestID===s)&&(this.followUpRequestID=``);return}if(this.followUpText=``,await gL(o),!UC.liveLogsStreaming&&this.conversationOpen){let e=++this.conversationRequestToken;await this._selectPersistedFollowUp(n,this.followUpRequestID,e,i.signal)}}catch(e){Ds(e)||i.signal.aborted?a&&this.conversationOpen&&(this.followUpError=`The request timed out.`):(console.error(`Failed to send interaction follow-up:`,e),this.followUpError=`Failed to send message.`)}finally{clearTimeout(o),this.followUpAbort===i&&(this.followUpAbort=null,this.followUpSending=!1)}}async _selectPersistedFollowUp(e,t,n,r){let i=Date.now()+pL;for(;this.conversationOpen&&n===this.conversationRequestToken&&Date.now(){let e=this.conversationThreadEl;if(!e)return;let t=e.querySelectorAll(`[data-conversation-anchor="true"]`),n=t[t.length-1];n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({block:`center`})})}_scheduleLatestScroll(){requestAnimationFrame(()=>{let e=this.conversationThreadEl;if(!e)return;let t=e.lastElementChild;t&&typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`end`})})}};async function gL(e){let t=e&&e.body&&typeof e.body.getReader==`function`?e.body.getReader():null;if(!t){await e.text();return}for(;!(await t.read()).done;);}function _L(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID==`function`?globalThis.crypto.randomUUID():`dashboard-`+Date.now().toString(36)+`-`+Math.random().toString(36).slice(2)}function vL(e,t){return new Promise((n,r)=>{let i,a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};if(i=setTimeout(()=>{t&&t.removeEventListener(`abort`,a),n()},e),t){if(t.aborted){a();return}t.addEventListener(`abort`,a,{once:!0})}})}var yL=new hL,bL=0;jn(()=>{kn(()=>{let e=RC(UC.auditRecordChanges,bL);e.length!==0&&(bL=Number(e[e.length-1].version||0),Tr(()=>{e.forEach(e=>{if(!zC(e))return;let t=UC.auditRecord(e.key);yL.handleAuditRecordChange(t,e.eventType)})}))})});var xL=z(``),SL=z(` `),CL=z(` `),wL=z(``),TL=z(`
        `);function EL(e,t){D(t,!0);let n=K(t,`thread`,3,null),r=K(t,`expanded`,3,!1),i=K(t,`onactivate`,3,null),a=K(t,`hidePath`,3,!1),o=k(()=>ys.formatTimestamp(t.entry.timestamp)),s=k(()=>L(o)===`-`?L(o):L(o).slice(L(o).lastIndexOf(` `)+1)),c=k(()=>yL.conversationOpen&&String(yL.conversationAnchorID||``)===String(t.entry.id||``));function l(e){e.preventDefault(),i()&&i()()}function u(e){e.stopPropagation(),e.preventDefault(),n().ontoggle()}function d(e){if(e.stopPropagation(),e.preventDefault(),L(c)){yL.closeConversation();return}yL.openConversation(t.entry,e.currentTarget)}var f=TL();let p;var m=N(f),h=N(m),g=e=>{var t=xL(),r=N(t);{let e=k(()=>n().expanded?Ha:Wa);q(r,{get icon(){return L(e)},class:`audit-thread-expander-svg`})}var i=F(r,2),a=N(i,!0);E(i),E(t),I(()=>{G(t,`aria-expanded`,n().expanded),G(t,`title`,`Session with `+n().count+` requests`),G(t,`aria-label`,`Session with `+n().count+` requests, `+(n().expanded?`collapse`:`expand`)),V(a,n().count)}),R(`click`,t,u),B(e,t)};H(h,e=>{n()&&e(g)});var _=F(h,2),v=N(_),y=N(v,!0);E(v);var b=F(v,2),x=N(b,!0);E(b),E(_);var S=F(_,2),C=e=>{var n=SL(),r=N(n,!0);E(n),I(e=>V(r,e),[()=>jc(t.entry)]),B(e,n)};H(S,e=>{(t.entry.requested_model||t.entry.model)&&e(C)});var w=F(S,2),T=e=>{var n=CL(),r=N(n,!0);E(n),I(()=>V(r,t.entry.path||`-`)),B(e,n)};H(w,e=>{a()||e(T)}),E(m);var ee=F(m,2),te=N(ee);XF(te,{get entry(){return t.entry}});var ne=F(te,2),re=N(ne),ie=N(re,!0);E(re);var ae=F(re,2),oe=N(ae,!0);E(ae),E(ne);var se=F(ne,2),ce=N(se,!0);E(se);var le=F(se,2),ue=e=>{var t=wL();let n;var r=N(t);{let e=k(()=>L(c)?Ua:Wa);q(r,{get icon(){return L(e)},class:`audit-conversation-trigger-svg`})}E(t),I(()=>{n=W(t,1,`audit-conversation-trigger svelte-17mysgz`,null,n,{"audit-conversation-trigger-active":L(c)}),G(t,`title`,L(c)?`Close interactions`:`Open interactions`),G(t,`aria-label`,L(c)?`Close interactions`:`Open interactions`),G(t,`aria-pressed`,L(c))}),R(`click`,t,d),B(e,t)},de=k(()=>yL.canShowConversation(t.entry));H(le,e=>{L(de)&&e(ue)}),E(ee),E(f),I((e,n,i,a)=>{p=W(f,1,`audit-entry-summary svelte-17mysgz`,null,p,e),G(f,`aria-expanded`,r()),W(_,1,`audit-status-badge audit-request-badge ${n??``}`,`svelte-17mysgz`),G(_,`title`,`Status `+(t.entry.status_code||`-`)+` · `+(t.entry.method||`-`)),G(_,`aria-label`,(t.entry.status_code||`-`)+` `+(t.entry.method||`-`)),V(y,t.entry.status_code||`-`),V(x,t.entry.method||`-`),G(ne,`title`,i),G(ne,`aria-label`,L(o)),V(ie,L(o)),V(oe,L(s)),V(ce,a)},[()=>({"audit-entry-summary-live-in-progress":tF(t.entry),"audit-entry-summary-has-interactions":yL.canShowConversation(t.entry)}),()=>eF(t.entry.status_code),()=>Tc(t.entry.timestamp),()=>$P(t.entry.duration_ns)]),R(`click`,f,l),B(e,f),O()}Vr([`click`]);var DL=z(``);function OL(e,t){D(t,!0);let n=K(t,`label`,3,`Copy`),r=K(t,`copiedLabel`,3,`Copied`),i=K(t,`errorLabel`,3,``),a=K(t,`class`,3,`btn`),o=k(()=>t.state.error&&i()?i():t.state.copied?r():n());var s=DL();let c;var l=N(s),u=e=>{q(e,{get icon(){return Ka},width:`14`,height:`14`,"stroke-width":`2.5`})},d=e=>{q(e,{get icon(){return Ya},width:`14`,height:`14`})};H(l,e=>{t.state.copied?e(u):e(d,-1)});var f=F(l,2),p=N(f,!0);E(f),E(s),I(()=>{c=W(s,1,Pi([`copy-feedback-btn`,a()]),null,c,{"copy-feedback-btn-copied":t.state.copied}),V(p,L(o))}),R(`click`,s,e=>{e.preventDefault(),t.onclick?.(e)}),B(e,s),O()}Vr([`click`]);var kL=z(`
        Error Message
         
        `),AL=z(`
         
        `),jL=z(` `),ML=z(` streaming`),NL=z(`
        Body
        `),PL=z(`

        `),FL=z(`

        `),IL=z(`

        `),LL=z(`
        `);function RL(e,t){D(t,!0);let n=kM({logPrefix:`Failed to copy audit payload:`}),r=kM({logPrefix:`Failed to copy audit payload:`}),i=k(()=>t.pane&&t.pane.showHeaders?gc(t.pane.headers):``),a=k(()=>!t.pane||!t.pane.showBody?``:VI(t.pane.body)?KI(t.pane.body):yL.renderBodyWithConversationHighlights(t.pane.entry,t.pane.body,{promptCacheHighlight:t.pane.promptCacheHighlight})),o=k(()=>!!(t.pane&&yL.canShowConversation(t.pane.entry)));function s(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),yL.handleErrorConversationClick(e,t.pane.entry))}var c=LL();let l;var u=N(c),d=e=>{var n=kL(),r=F(N(n),2);let i;var a=N(r,!0);E(r),E(n),I(()=>{i=W(r,1,`audit-json audit-pane-error-message svelte-1h5puht`,null,i,{"audit-pane-clickable-preview":L(o)}),G(r,`role`,L(o)?`button`:null),G(r,`tabindex`,L(o)?0:null),V(a,t.pane.errorMessage)}),R(`mousedown`,r,e=>yL.startBodyInteraction(e)),R(`keydown`,r,s),R(`click`,r,e=>yL.handleErrorConversationClick(e,t.pane.entry)),B(e,n)};H(u,e=>{t.pane.showErrorMessage&&e(d)});var f=F(u,2),p=e=>{var n=AL(),a=N(n),o=N(a),s=N(o,!0);E(o),OL(F(o,2),{get state(){return r},label:`Copy Headers`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>r.copy(t.pane.copyHeaders,gc)}),E(a);var c=F(a,2),l=N(c,!0);E(c),E(n),I(()=>{V(s,t.pane.headersTitle||`Headers`),V(l,L(i))}),B(e,n)};H(f,e=>{t.pane.showHeaders&&e(p)});var m=F(f,2),h=e=>{var r=NL(),i=N(r),o=N(i),s=F(N(o),2),c=e=>{var n=jL(),r=N(n,!0);E(n),I(()=>V(r,t.pane.bodyCacheRatioLabel)),B(e,n)};H(s,e=>{t.pane.bodyCacheRatioLabel&&e(c)});var l=F(s,2),u=e=>{B(e,ML())};H(l,e=>{t.pane.streaming&&e(u)}),E(o),OL(F(o,2),{get state(){return n},label:`Copy Body`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>n.copy(t.pane.copyBody,gc)}),E(i);var d=F(i,2);mi(d,()=>L(a),!0),E(d),E(r),R(`mousedown`,d,e=>yL.startBodyInteraction(e)),R(`click`,d,e=>yL.handleBodyConversationClick(e,t.pane.entry)),B(e,r)};H(m,e=>{t.pane.showBody&&e(h)});var g=F(m,2),_=e=>{var n=PL(),r=N(n,!0);E(n),I(()=>V(r,t.pane.emptyMessage)),B(e,n)};H(g,e=>{t.pane.showEmpty&&e(_)});var v=F(g,2),y=e=>{var n=FL(),r=F(N(n),2),i=N(r,!0);E(r),E(n),I(()=>V(i,t.pane.pendingMessage)),B(e,n)};H(v,e=>{t.pane.showPending&&e(y)});var b=F(v,2),x=e=>{var n=IL(),r=N(n,!0);E(n),I(()=>V(r,t.pane.tooLargeMessage)),B(e,n)};H(b,e=>{t.pane.showTooLarge&&e(x)}),E(c),I(()=>l=W(c,1,`audit-pane svelte-1h5puht`,null,l,{"audit-pane-split":t.pane&&t.pane.layout===`split`,"audit-pane-split-single":t.pane&&t.pane.layout===`split`&&!(t.pane.showHeaders&&t.pane.showBody)})),B(e,c),O()}Vr([`mousedown`,`keydown`,`click`]);var zL=z(` `),BL=z(` `),VL=z(` `),HL=z(` `),UL=z(``),WL=z(`
        `),GL=z(`
        `);function KL(e,t){D(t,!0);let n=K(t,`panes`,19,()=>[]),r=A(null),i=k(()=>NF(L(r),t.entry,n())),a=e=>`audit-tab-`+t.entry.id+`-`+e,o=e=>`audit-tabpanel-`+t.entry.id+`-`+e;function s(e,t){let i=n().map(e=>e.id),a=PF(e.key,i,t);a!=null&&(e.preventDefault(),((e.currentTarget?.closest?.(`.audit-pane-tablist`))?.querySelectorAll(`.audit-pane-tab`)[i.indexOf(a)])?.focus?.(),j(r,a,!0))}var c=GL(),l=N(c);U(l,21,n,e=>e.id,(e,t)=>{var n=UL();let c;var l=N(n),u=N(l),d=e=>{q(e,{get icon(){return Na}})},f=e=>{q(e,{get icon(){return Ma}})};H(u,e=>{L(t).pane.direction===`request`?e(d):L(t).pane.direction===`response`&&e(f,1)}),E(l);var p=F(l,2),m=N(p,!0);E(p);var h=F(p,2),g=e=>{var n=zL(),r=N(n);E(n),I(()=>V(r,`#${L(t).pane.seq??``}`)),B(e,n)};H(h,e=>{L(t).pane.seq&&e(g)});var _=F(h,2),v=e=>{var n=BL(),r=N(n,!0);E(n),I(()=>{W(n,1,`provider-badge audit-pane-kind audit-pane-kind-${L(t).pane.kind??``}`,`svelte-1bc5vi5`),V(r,L(t).pane.kind)}),B(e,n)};H(_,e=>{L(t).pane.kind&&e(v)});var y=F(_,2);U(y,17,()=>L(t).pane.noChangeSteps||[],e=>e.id,(e,t)=>{var n=VL(),r=N(n,!0);E(n),I(()=>{G(n,`title`,L(t).title),V(r,L(t).label)}),B(e,n)});var b=F(y,2),x=e=>{var n=HL(),r=N(n,!0);E(n),I(()=>V(r,L(t).pane.savingsLabel)),B(e,n)};H(b,e=>{L(t).pane.savingsLabel&&e(x)});var S=F(b,2),C=e=>{var n=BL(),r=N(n,!0);E(n),I(e=>{W(n,1,`audit-status-badge ${e??``}`,`svelte-1bc5vi5`),V(r,L(t).pane.statusCode)},[()=>eF(L(t).pane.statusCode)]),B(e,n)};H(S,e=>{L(t).pane.statusCode&&e(C)}),E(n),I((e,r)=>{c=W(n,1,`audit-pane-tab svelte-1bc5vi5`,null,c,{"audit-pane-tab-active":L(i)===L(t).id}),G(n,`aria-selected`,L(i)===L(t).id),G(n,`id`,e),G(n,`aria-controls`,r),G(n,`tabindex`,L(i)===L(t).id?0:-1),W(l,1,Pi([`audit-pane-icon`,L(t).pane.direction&&`audit-pane-icon-${L(t).pane.direction}`]),`svelte-1bc5vi5`),V(m,L(t).pane.title)},[()=>a(L(t).id),()=>o(L(t).id)]),R(`keydown`,n,e=>s(e,L(t).id)),R(`click`,n,()=>j(r,L(t).id,!0)),B(e,n)}),E(l),U(F(l,2),17,n,e=>e.id,(e,t)=>{var n=WL();let r;RL(N(n),{get pane(){return L(t).pane}}),E(n),I((e,a)=>{G(n,`id`,e),G(n,`aria-labelledby`,a),r=Vi(n,``,r,{display:L(i)===L(t).id?null:`none`})},[()=>o(L(t).id),()=>a(L(t).id)]),B(e,n)}),E(c),B(e,c),O()}Vr([`keydown`,`click`]);var qL=z(`
        `),JL=z(`
        `);function YL(e,t){D(t,!0);let n=K(t,`thread`,3,null),r=K(t,`hidePath`,3,!1),i=k(()=>LF.isAuditEntryExpanded(t.entry)),a=k(()=>yL.conversationOpen&&String(yL.conversationAnchorID||``)===String(t.entry.id||``)),o=k(()=>L(i)?jF(t.entry,fI):[]),s=k(()=>L(i)?EN(t.entry,xP.auditEntryWorkflow(t.entry),xP.workflowFeatureCaps()):null);function c(){LF.toggleAuditEntryExpanded(t.entry)}var l=JL();let u;var d=N(l);EL(d,{get entry(){return t.entry},get thread(){return n()},get expanded(){return L(i)},get hidePath(){return r()},onactivate:c});var f=F(d,2),p=e=>{var n=qL(),r=N(n),i=e=>{HM(e,{get chart(){return L(s)}})};H(r,e=>{L(s)&&e(i)});var a=F(r,2);KL(a,{get entry(){return t.entry},get panes(){return L(o)}}),qF(F(a,2),{get entry(){return t.entry}}),E(n),Oi(3,n,()=>ic,()=>({y:-6,duration:yP(150)})),B(e,n)};H(f,e=>{L(i)&&e(p)}),E(l),I(()=>u=W(l,1,`audit-entry svelte-cmjgwr`,null,u,{"audit-entry-interactions-open":L(a)})),B(e,l),O()}var XL=z(`
        `),ZL=z(`
        `),QL=z(`

        `),$L=z(`
        `),eR=z(`
        `);function tR(e,t){D(t,!0);let n=k(()=>LP(t.entry)),r=k(()=>LF.isThreadExpanded(L(n))),i=k(()=>LF.threadChildren(L(n))),a=k(()=>L(i)&&!L(i).loading&&Number(L(i).total||0)>L(i).entries.length+1);var o=Zr(),s=P(o),c=e=>{YL(e,{get entry(){return t.entry}})},l=k(()=>!zP(t.entry)),u=e=>{var n=eR(),o=N(n);{let e=k(()=>({count:RP(t.entry),expanded:L(r),ontoggle:()=>LF.toggleThread(t.entry)}));YL(o,{get entry(){return t.entry},get thread(){return L(e)}})}var s=F(o,2),c=e=>{var n=$L(),r=N(n),o=e=>{var t=XL();NS(N(t),{size:14,label:`Loading session requests`}),E(t),B(e,t)};H(r,e=>{L(i)&&L(i).loading&&e(o)});var s=F(r,2);U(s,17,()=>L(i)&&L(i).entries||[],e=>e.id,(e,n)=>{var r=ZL(),i=N(r);{let e=k(()=>L(n).path===t.entry.path);YL(i,{get entry(){return L(n)},get hidePath(){return L(e)}})}E(r),B(e,r)});var c=F(s,2),l=e=>{var t=QL(),n=N(t);E(t),I(()=>V(n,`Showing the latest ${L(i).entries.length+1} of ${L(i).total??``} - requests in this session.`)),B(e,t)};H(c,e=>{L(a)&&e(l)}),E(n),Oi(3,n,()=>ac,()=>({duration:yP(150)})),B(e,n)};H(s,e=>{L(r)&&e(c)}),E(n),B(e,n)};H(s,e=>{L(l)?e(c):e(u,-1)}),B(e,o),O()}var nR=z(`

        .

        `),rR=z(`
        Audit logging is off. Live entries are temporary and disappear after - refresh. Set LOGGING_ENABLED=true to persist them.
        `),iR=z(`

        `),aR=z(`
        `),oR=z(`
        `),sR=z(`
        `),cR=z(`
        `),lR=z(`
        `);function uR(e,t){D(t,!0);let n=k(()=>As.config&&As.config.LOGGING_RETENTION_DAYS);kn(()=>{if(J.refreshTick,Xo.page===`audit-logs`)return Tr(()=>r())});function r(){let e=!1;return(async()=>{try{await As.ensureLoaded()}finally{await LF.fetchAuditLog(!0),!e&&As.liveLogsVisible()&&UC.ensureLiveLogs()}})(),()=>{e=!0,UC.stopLiveLogs()}}var i=lR(),a=N(i),o=N(a),s=F(N(o),2),c=e=>{iC(e,{copyId:`audit-retention-help-copy`,label:`retention help`,text:`If you want to change the retention period, set LOGGING_RETENTION_DAYS (env var) or logging.retention_days (config.yaml) and restart the gateway. Default is 30 days; 0 keeps audit logs forever.`,title:e=>{var t=nR(),r=N(t,!0),i=F(r),a=N(i,!0);E(i),He(),E(t),I((e,t)=>{V(r,e),V(a,t)},[()=>NP(L(n)),()=>PP(L(n))]),B(e,t)},$$slots:{title:!0}})},l=k(()=>MP(L(n)));H(s,e=>{L(l)&&e(c)}),E(o),E(a);var u=F(a,2);fl(N(u),{onchange:()=>LF.fetchAuditLog(!0)}),E(u);var d=F(u,2);Kc(d,{});var f=F(d,2),p=e=>{B(e,rR())},m=k(()=>As.loaded&&!As.auditVisible()&&!J.needsAuth);H(f,e=>{L(m)&&e(p)});var h=F(f,2),g=N(h);zF(g,{});var _=F(g,2),v=N(_),y=N(v),b=e=>{var t=iR(),n=N(t);E(t),I(e=>V(n,`Showing ${LF.auditLog.offset+1}-${e??``} of ${LF.auditLog.total??``} - ${LF.auditGroupSessions?`sessions`:`logs`}`),[()=>Math.min(LF.auditLog.offset+LF.auditLog.limit,LF.auditLog.total)]),B(e,t)};H(y,e=>{LF.auditLog.total>0&&e(b)});var x=F(y,2),S=N(x);ta(S),He(2),E(x),E(v),WF(F(v,2),{}),E(_);var C=F(_,2),w=e=>{var t=aR();NS(N(t),{size:18,label:`Loading audit logs`}),E(t),B(e,t)},T=e=>{var t=sR();U(t,29,()=>LF.auditLog.entries,e=>e.id,(e,t)=>{var n=oR(),r=N(n),i=e=>{tR(e,{get entry(){return L(t)}})},a=e=>{YL(e,{get entry(){return L(t)}})};H(r,e=>{LF.auditGroupSessions?e(i):e(a,-1)}),E(n),Di(n,()=>hP,()=>({duration:yP(150)})),Oi(1,n,()=>bP,()=>({live:L(t)._live})),B(e,n)}),E(t),B(e,t)};H(C,e=>{LF.loading&&LF.auditLog.entries.length===0?e(w):LF.auditLog.entries.length>0&&e(T,1)});var ee=F(C,2),te=e=>{var t=cR();IS(N(t),{}),E(t),B(e,t)};H(ee,e=>{LF.auditLog.entries.length===0&&!LF.loading&&!J.needsAuth&&e(te)}),oT(F(ee,2),{get total(){return LF.auditLog.total},get offset(){return LF.auditLog.offset},get limit(){return LF.auditLog.limit},onprev:()=>LF.auditLogPrevPage(),onnext:()=>LF.auditLogNextPage()}),E(h),E(i),I(()=>ra(S,LF.auditGroupSessions)),R(`change`,S,()=>LF.toggleAuditGroupSessions()),B(e,i),O()}Vr([`change`]);function dR(e){try{let t=JSON.parse(JSON.stringify(e||{}));return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function fR(e){return Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(e=>e):e==null?[]:String(e).split(`,`).map(e=>e.trim()).filter(e=>e)}function pR(e,t){let n=String(t||``).trim();return(e||[]).find(e=>String(e&&e.type||``).trim()===n)||null}function mR(e){return Array.isArray(e)&&e.length>0&&String(e[0].type||``).trim()||`system_prompt`}function hR(e,t){let n=String(t||``).trim();return n&&pR(e,n)?n:mR(e)}function gR(e,t){let n=pR(e,t);return!n||!n.defaults?{}:dR(n.defaults)}function _R(e,t,n){return{...gR(e,n),...dR(t)}}function vR(e,t){let n=hR(e,t);return{name:``,type:n,description:``,user_path:``,config:gR(e,n)}}function yR(e,t){if(!t)return e||[];let n=String(t).toLowerCase();return(e||[]).filter(e=>[e.name,e.type,e.user_path,e.description,e.summary].some(e=>String(e||``).toLowerCase().includes(n)))}function bR(e,t){let n=pR(e,t);return n&&n.label?n.label:t||`Unknown`}function xR(e,t){let n=pR(e,t);return Array.isArray(n&&n.fields)?n.fields:[]}function SR(e,t){if(!t||!e)return t&&t.input===`checkboxes`?[]:``;let n=e[t.key];return n==null?t.input===`checkboxes`?[]:``:t.input===`checkboxes`?fR(n):n}function CR(e,t,n){if(!t)return e;let r=dR(e);if(t.input===`number`){let e=String(n||``).trim();if(e===``)delete r[t.key];else{let n=Number(e);r[t.key]=Number.isFinite(n)?n:e}}else t.input===`checkboxes`?r[t.key]=fR(n):r[t.key]=n;return r}function wR(e,t,n){return SR(e,t).includes(String(n||``).trim())}function TR(e,t,n,r){let i=fR(SR(e,t)),a=String(n||``).trim();return a?CR(e,t,r?Array.from(new Set([...i,a])):i.filter(e=>e!==a)):e}function ER(e){return{name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),description:String(e&&e.description||``).trim()||void 0,user_path:String(e&&e.user_path||``).trim()||void 0,config:dR(e&&e.config)}}var DR=new class{#e=A(M([]));get guardrails(){return L(this.#e)}set guardrails(e){j(this.#e,e,!0)}#t=A(M([]));get types(){return L(this.#t)}set types(e){j(this.#t,e,!0)}#n=A(!0);get available(){return L(this.#n)}set available(e){j(this.#n,e,!0)}#r=A(!1);get loading(){return L(this.#r)}set loading(e){j(this.#r,e,!0)}#i=A(!1);get typesLoading(){return L(this.#i)}set typesLoading(e){j(this.#i,e,!0)}#a=A(``);get error(){return L(this.#a)}set error(e){j(this.#a,e,!0)}#o=A(``);get filter(){return L(this.#o)}set filter(e){j(this.#o,e,!0)}#s=A(!1);get formOpen(){return L(this.#s)}set formOpen(e){j(this.#s,e,!0)}#c=A(!1);get formSubmitting(){return L(this.#c)}set formSubmitting(e){j(this.#c,e,!0)}#l=A(``);get deletingName(){return L(this.#l)}set deletingName(e){j(this.#l,e,!0)}#u=A(`create`);get formMode(){return L(this.#u)}set formMode(e){j(this.#u,e,!0)}#d=A(``);get formOriginalName(){return L(this.#d)}set formOriginalName(e){j(this.#d,e,!0)}#f=A(M({name:``,type:``,description:``,user_path:``,config:{}}));get form(){return L(this.#f)}set form(e){j(this.#f,e,!0)}get filtered(){return yR(this.guardrails,this.filter)}typeLabel(e){return bR(this.types,e)}typeFields(e){return xR(this.types,e)}fieldValue(e){return SR(this.form&&this.form.config,e)}setFieldValue(e,t){this.form={...this.form,config:CR(this.form.config,e,t)}}arrayFieldSelected(e,t){return wR(this.form&&this.form.config,e,t)}toggleArrayFieldValue(e,t,n){this.form={...this.form,config:TR(this.form.config,e,t,n)}}openCreate(){this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=vR(this.types,mR(this.types)),this.formOpen=!0}openEdit(e){let t=hR(this.types,e&&e.type);this.formMode=`edit`,this.formOriginalName=String(e&&e.name||``).trim(),this.error=``,this.form={name:this.formOriginalName,type:t,description:String(e&&e.description||``).trim(),user_path:String(e&&e.user_path||``).trim(),config:_R(this.types,e&&e.config,t)},this.formOpen=!0}closeForm(){this.formOpen=!1,this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=vR(this.types,mR(this.types))}changeType(e){let t=hR(this.types,e);this.form={...this.form,type:t,config:gR(this.types,t)}}async fetchTypes(){this.typesLoading=!0;try{let e=await kT(`/admin/guardrails/types`,{label:`guardrail types`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.types=[];return}if(e.result&&(this.available=!0),this.types=e.items,e.status===`error`){this.error=e.error;return}let t=hR(this.types,this.form.type);this.form={...this.form,type:t,config:_R(this.types,this.form.config,t)}}finally{this.typesLoading=!1}}async fetchGuardrails(){this.loading=!0,this.error=``;try{let e=await kT(`/admin/guardrails`,{label:`guardrails`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.guardrails=[];return}e.result&&(this.available=!0),this.guardrails=e.items,this.error=e.error}finally{this.loading=!1}}async fetchPage(){await Promise.all([this.fetchTypes(),this.fetchGuardrails()])}async submitForm(){let e=String(this.form.name||``).trim(),t=String(this.form.type||``).trim();if(!e){this.error=`Name is required.`;return}if(!t){this.error=`Type is required.`;return}this.error=``,this.formSubmitting=!0;let n=ER(this.form);try{let t=await AT(`/admin/guardrails`,`PUT`,n,{label:`save guardrail`,errorFallback:`Failed to save guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error;return}Y.success(`Guardrail "`+e+`" saved.`),this.closeForm(),this.fetchGuardrails()}finally{this.formSubmitting=!1}}async deleteGuardrail(e){let t=String(e&&e.name||``).trim();if(!(!t||this.deletingName)&&window.confirm(`Delete guardrail "`+t+`"? Workflows that still reference it must be updated first.`)){this.deletingName=t;try{let e=await AT(`/admin/guardrails`,`DELETE`,{name:t},{label:`delete guardrail`,errorFallback:`Failed to delete guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,Y.error(e.error);return}if(e.status===`error`){Y.error(e.error);return}Y.success(`Guardrail "`+t+`" deleted.`),this.formOpen&&this.formOriginalName===t&&this.closeForm(),this.fetchGuardrails()}finally{this.deletingName=``}}}},OR=z(`
        `),kR=z(`

        Loading guardrails...

        `),AR=z(`
        `),jR=z(`
        `),MR=z(`
        NameTypeUser PathSummaryActions
        `),NR=z(`

        No guardrails defined yet.

        `),PR=z(`

        Instances

        Each instance has a reusable name, a type, an optional user path for - future UI visibility scoping, and a JSON-backed config payload for - that type.

        `);function FR(e,t){D(t,!0);var n=PR(),r=N(n),i=F(N(r),2);q(N(i),{get icon(){return mo},class:`form-action-icon`}),He(2),E(i),E(r);var a=F(r,2),o=e=>{var t=OR(),n=N(t);jw(N(n),{id:`guardrail-filter`,placeholder:`Filter by name, type, user path, summary...`,label:`Guardrail filter`,get value(){return DR.filter},set value(e){DR.filter=e}}),E(n),E(t),B(e,t)};H(a,e=>{DR.available&&e(o)});var s=F(a,2),c=e=>{var t=kR();NS(N(t),{size:16,label:`Loading guardrails`}),He(),E(t),B(e,t)};H(s,e=>{DR.loading&&DR.filtered.length===0&&e(c)});var l=F(s,2),u=e=>{var t=MR(),n=N(t),r=F(N(n));U(r,21,()=>DR.filtered,e=>e.name,(e,t)=>{var n=jR(),r=N(n),i=N(r,!0);E(r);var a=F(r),o=N(a),s=N(o,!0);E(o),E(a);var c=F(a),l=N(c,!0);E(c);var u=F(c),d=N(u),f=N(d,!0);E(d);var p=F(d,2),m=e=>{var n=AR(),r=N(n,!0);E(n),I(()=>V(r,L(t).description)),B(e,n)};H(p,e=>{L(t).description&&e(m)}),E(u);var h=F(u),g=N(h),_=N(g);{let e=k(()=>`Edit guardrail `+L(t).name);OT(_,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>DR.openEdit(L(t)),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}var v=F(_,2);{let e=k(()=>(DR.deletingName===L(t).name?`Deleting guardrail `:`Delete guardrail `)+L(t).name),n=k(()=>DR.deletingName===L(t).name);OT(v,{get label(){return L(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>DR.deleteGuardrail(L(t)),get disabled(){return L(n)},children:(e,t)=>{q(e,{get icon(){return Ro},class:`table-icon-svg`})},$$slots:{default:!0}})}E(g),E(h),E(n),I(e=>{V(i,L(t).name),V(s,e),V(l,L(t).user_path||`—`),V(f,L(t).summary||L(t).description||`No summary yet.`)},[()=>DR.typeLabel(L(t).type)]),B(e,n)}),E(r),E(n),E(t),B(e,t)};H(l,e=>{DR.filtered.length>0&&e(u)});var d=F(l,2),f=e=>{B(e,NR())};H(d,e=>{DR.filtered.length===0&&!DR.loading&&DR.available&&!DR.error&&!J.authError&&e(f)}),E(n),I(()=>i.disabled=DR.typesLoading||DR.formSubmitting||!DR.available),R(`click`,i,()=>DR.openCreate()),B(e,n),O()}Vr([`click`]);var IR=z(`

        Workflows reference these names directly, so renames are - intentionally avoided after creation.

        `),LR=z(``),RR=z(``),zR=z(``),BR=z(``),VR=z(``),HR=z(``),UR=z(``),WR=z(``),GR=z(``),KR=z(`
        `),qR=z(``),JR=z(` `),YR=z(`
        `),XR=z(`
        `);function ZR(e,t){D(t,!0);let n=k(()=>DR.formMode===`edit`);{let t=e=>{B(e,IR())},r=k(()=>L(n)?`Edit Guardrail`:`Create Guardrail`);ME(e,{get open(){return DR.formOpen},get title(){return L(r)},ariaLabel:`Guardrail editor`,get error(){return DR.error},get submitting(){return DR.formSubmitting},submitLabel:`Save Guardrail`,dialogClass:`settings-guardrails-editor guardrails-editor-wide`,onclose:()=>DR.closeForm(),onsubmit:()=>DR.submitForm(),headerHint:t,children:(e,t)=>{var r=XR(),i=N(r);PE(i,{id:`guardrail-name`,label:`Name`,children:(e,t)=>{var r=LR();ta(r),I(()=>{r.disabled=L(n),G(r,`data-modal-autofocus`,!L(n)||void 0)}),ua(r,()=>DR.form.name,e=>DR.form.name=e),B(e,r)},$$slots:{default:!0}});var a=F(i,2);PE(a,{id:`guardrail-type`,label:`Type`,children:(e,t)=>{var r=zR();U(r,21,()=>DR.types,e=>e.type,(e,t)=>{var n=RR(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).type)&&(n.value=(n.__value=L(t).type)??``)}),B(e,n)}),E(r);var i;Ui(r),I(()=>{r.disabled=L(n),i!==(i=DR.form.type)&&(r.value=(r.__value=DR.form.type)??``,Hi(r,DR.form.type))}),R(`change`,r,e=>DR.changeType(e.currentTarget.value)),B(e,r)},$$slots:{default:!0}});var o=F(a,2);PE(o,{id:`guardrail-description`,label:`Description`,children:(e,t)=>{var r=BR();ta(r),I(()=>G(r,`data-modal-autofocus`,L(n)?!0:void 0)),ua(r,()=>DR.form.description,e=>DR.form.description=e),B(e,r)},$$slots:{default:!0}});var s=F(o,2),c=N(s);iC(c,{copyId:`guardrail-user-path-help-copy`,label:`guardrail user path help`,text:`Only used for auxiliary rewrite (llm_based_altering) guardrails; ignored for other guardrail types.`,title:e=>{B(e,VR())},$$slots:{title:!0}});var l=F(c,2);ta(l),E(s),U(F(s,2),17,()=>DR.typeFields(DR.form.type),e=>e.key,(e,t)=>{var n=Zr(),r=P(n),i=e=>{var n=KR(),r=N(n);{let e=e=>{var n=HR(),r=N(n,!0);E(n),I(()=>{G(n,`for`,`guardrail-field-`+L(t).key),V(r,L(t).label)}),B(e,n)},n=k(()=>`guardrail-field-help-`+L(t).key),i=k(()=>L(t).label+` help`),a=k(()=>L(t).help||``);iC(r,{get copyId(){return L(n)},get label(){return L(i)},get text(){return L(a)},title:e,$$slots:{title:!0}})}var i=F(r,2),a=e=>{var n=UR();U(n,21,()=>L(t).options||[],e=>e.value,(e,t)=>{var n=RR(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(n);var r;Ui(n),I(e=>{G(n,`id`,`guardrail-field-`+L(t).key),G(n,`aria-describedby`,L(t).help?`guardrail-field-help-`+L(t).key:void 0),r!==(r=e)&&(n.value=(n.__value=e)??``,Hi(n,e))},[()=>DR.fieldValue(L(t))]),R(`change`,n,e=>DR.setFieldValue(L(t),e.currentTarget.value)),B(e,n)},o=e=>{var n=WR();dt(n),I(e=>{G(n,`id`,`guardrail-field-`+L(t).key),G(n,`placeholder`,L(t).placeholder||``),na(n,e),G(n,`aria-describedby`,L(t).help?`guardrail-field-help-`+L(t).key:void 0)},[()=>DR.fieldValue(L(t))]),R(`input`,n,e=>DR.setFieldValue(L(t),e.currentTarget.value)),B(e,n)},s=e=>{var n=GR();ta(n),I(e=>{G(n,`id`,`guardrail-field-`+L(t).key),G(n,`type`,L(t).input||`text`),G(n,`placeholder`,L(t).placeholder||``),na(n,e),G(n,`aria-describedby`,L(t).help?`guardrail-field-help-`+L(t).key:void 0)},[()=>DR.fieldValue(L(t))]),R(`input`,n,e=>DR.setFieldValue(L(t),e.currentTarget.value)),B(e,n)};H(i,e=>{L(t).input===`select`?e(a):L(t).input===`textarea`?e(o,1):e(s,-1)}),E(n),B(e,n)},a=e=>{var n=YR(),r=N(n),i=N(r,!0);E(r);var a=F(r,2);U(a,21,()=>L(t).options||[],e=>L(t).key+`-`+e.value,(e,n)=>{var r=qR(),i=N(r);ta(i);var a=F(i,2),o=N(a,!0);E(a),E(r),I(e=>{ra(i,e),V(o,L(n).label)},[()=>DR.arrayFieldSelected(L(t),L(n).value)]),R(`change`,i,e=>DR.toggleArrayFieldValue(L(t),L(n).value,e.currentTarget.checked)),B(e,r)}),E(a);var o=F(a,2),s=e=>{var n=JR(),r=N(n,!0);E(n),I(()=>{G(n,`id`,`guardrail-field-help-`+L(t).key),V(r,L(t).help)}),B(e,n)};H(o,e=>{L(t).help&&e(s)}),E(n),I(()=>{G(n,`aria-describedby`,L(t).help?`guardrail-field-help-`+L(t).key:void 0),V(i,L(t).label)}),B(e,n)};H(r,e=>{L(t).input===`checkboxes`?e(a,-1):e(i)}),B(e,n)}),E(r),ua(l,()=>DR.form.user_path,e=>DR.form.user_path=e),B(e,r)},$$slots:{headerHint:!0,default:!0}})}O()}Vr([`change`,`input`]);var QR=z(`

        Guardrails

        `),$R=z(`
        Runtime guardrail execution is currently off because GUARDRAILS_ENABLED is disabled. You can still manage - definitions here.
        `),ez=z(`
        Guardrails feature is unavailable.
        `),tz=z(`
        `),nz=z(`

        Reusable Policy Objects

        Guardrail Library

        Store guardrails in the database, keep them hot in memory, and attach - them to workflows by reference.

        Instances
        Types
        `);function rz(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`guardrails`&&(As.ensureLoaded(),DR.fetchPage())});var n=nz(),r=N(n),i=N(r);iC(N(i),{copyId:`guardrails-help-copy`,label:`guardrails help`,text:`Reusable policy objects stored in the database and kept hot in memory for workflow execution.`,title:e=>{B(e,QR())},$$slots:{title:!0}}),E(i),E(r);var a=F(r,2),o=F(N(a),2),s=N(o),c=F(N(s),2),l=N(c,!0);E(c),E(s);var u=F(s,2),d=F(N(u),2),f=N(d,!0);E(d),E(u),E(o),E(a);var p=F(a,2);Kc(p,{});var m=F(p,2),h=e=>{B(e,$R())},g=k(()=>!As.guardrailsVisible());H(m,e=>{L(g)&&e(h)});var _=F(m,2),v=e=>{B(e,ez())};H(_,e=>{!J.authError&&!DR.available&&e(v)});var y=F(_,2),b=e=>{var t=tz(),n=N(t,!0);E(t),I(()=>V(n,DR.error)),B(e,t)};H(y,e=>{!J.authError&&DR.error&&!DR.formOpen&&e(b)});var x=F(y,2);ZR(x,{}),FR(F(x,2),{}),E(n),I((e,t)=>{V(l,e),V(f,t)},[()=>_c(DR.guardrails.length),()=>_c(DR.types.length)]),B(e,n),O()}var $=new class{#e=A(M([]));get servers(){return L(this.#e)}set servers(e){j(this.#e,e,!0)}#t=A(!0);get available(){return L(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}#r=A(``);get error(){return L(this.#r)}set error(e){j(this.#r,e,!0)}#i=A(``);get filter(){return L(this.#i)}set filter(e){j(this.#i,e,!0)}#a=A(!1);get formOpen(){return L(this.#a)}set formOpen(e){j(this.#a,e,!0)}#o=A(!1);get formSubmitting(){return L(this.#o)}set formSubmitting(e){j(this.#o,e,!0)}#s=A(`create`);get formMode(){return L(this.#s)}set formMode(e){j(this.#s,e,!0)}#c=A(!1);get slugEdited(){return L(this.#c)}set slugEdited(e){j(this.#c,e,!0)}#l=A(!1);get advancedOpen(){return L(this.#l)}set advancedOpen(e){j(this.#l,e,!0)}#u=A(M(Sx()));get form(){return L(this.#u)}set form(e){j(this.#u,e,!0)}#d=A(``);get deletingName(){return L(this.#d)}set deletingName(e){j(this.#d,e,!0)}#f=A(``);get reconnectingName(){return L(this.#f)}set reconnectingName(e){j(this.#f,e,!0)}#p=A(!1);get catalogOpen(){return L(this.#p)}set catalogOpen(e){j(this.#p,e,!0)}#m=A(!1);get catalogLoading(){return L(this.#m)}set catalogLoading(e){j(this.#m,e,!0)}#h=A(``);get catalogError(){return L(this.#h)}set catalogError(e){j(this.#h,e,!0)}#g=A(M(Cx()));get catalog(){return L(this.#g)}set catalog(e){j(this.#g,e,!0)}#_=k(()=>Px(this.servers,this.filter));get filtered(){return L(this.#_)}set filtered(e){j(this.#_,e)}async fetchServers(){if(await As.ensureLoaded(),!As.mcpVisible()){this.available=!1,this.servers=[],this.error=``,this.loading=!1;return}this.loading=!0,this.error=``;try{let e=await kT(`/admin/mcp-servers`,{label:`mcp servers`,errorFallback:`Failed to load MCP servers.`,unavailableStatuses:[503,404]});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.servers=[];return}if(e.status===`error`){e.result&&(this.available=!0),this.servers=[],this.error=e.error;return}this.available=!0,this.servers=e.items}finally{this.loading=!1}}openCreate(){this.formMode=`create`,this.slugEdited=!1,this.advancedOpen=!1,this.error=``,this.form=Sx(),this.formOpen=!0}openEdit(e){!e||e.managed||(this.formMode=`edit`,this.slugEdited=!0,this.advancedOpen=!1,this.error=``,this.form=Fx(e),this.formOpen=!0)}closeForm(){this.formOpen=!1,this.formMode=`create`,this.slugEdited=!1,this.advancedOpen=!1,this.error=``,this.form=Sx()}syncSlugFromName(){this.formMode===`create`&&!this.slugEdited&&(this.form.slug=Ax(this.form.name))}markSlugEdited(){this.formMode===`create`&&(this.slugEdited=!0)}addHeader(){this.form.headers.push({name:``,value:``})}removeHeader(e){this.form.headers.splice(e,1)}async submitForm(){let e=Ix(this.form,this.formMode,this.servers);if(e.error){this.error=e.error;return}this.error=``,this.formSubmitting=!0;try{let t=await AT(`/admin/mcp-servers`,`PUT`,e.payload,{label:`save mcp server`,errorFallback:`Failed to save MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error;return}Y.success(`MCP server "`+e.payload.name+`" saved.`),this.closeForm(),this.fetchServers()}finally{this.formSubmitting=!1}}async deleteServer(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(!(!n||this.deletingName||e&&e.managed)&&confirm(`Delete MCP server "`+t+`"? Clients lose access to its tools immediately.`)){this.deletingName=n;try{let e=await AT(`/admin/mcp-servers/`+encodeURIComponent(n),`DELETE`,void 0,{label:`delete mcp server`,errorFallback:`Failed to delete MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,Y.error(e.error);return}if(e.status===`error`){Y.error(e.error);return}Y.success(`MCP server "`+t+`" deleted.`),this.formOpen&&this.form.slug===n&&this.closeForm(),this.fetchServers()}finally{this.deletingName=``}}}async reconnectServer(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(!(!n||this.reconnectingName)){this.reconnectingName=n;try{let e=await AT(`/admin/mcp-servers/`+encodeURIComponent(n)+`/reconnect`,`POST`,void 0,{label:`reconnect mcp server`,errorFallback:`Failed to reconnect MCP server.`,unavailableMessage:`MCP server management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,Y.error(e.error);return}if(e.status===`error`){Y.error(e.error);return}let r=e.result.data,i=Tx(r);i===`connected`?Y.success(`MCP server "`+t+`" reconnected.`):i===`disabled`?Y.success(`MCP server "`+t+`" is disabled; no connection was attempted.`):Y.error(`Reconnect attempted, but MCP server "`+t+`" is still `+i+`.`),r&&r.name?this.servers=(this.servers||[]).map(e=>wx(e)===wx(r)?r:e):this.fetchServers()}finally{this.reconnectingName=``}}}async openCatalog(e){let t=String(e&&e.name||``).trim(),n=wx(e);if(n){this.catalogOpen=!0,this.catalogLoading=!0,this.catalogError=``,this.catalog={...Cx(),server:n,status:Tx(e)};try{let e=await Ts(`/admin/mcp-servers/`+encodeURIComponent(n)+`/catalog`,{label:`mcp server catalog`});if(e.stale)return;if(e.status===503){this.available=!1,this.catalogError=`MCP server management is unavailable.`;return}if(e.status===404){this.catalogError=`MCP server "`+t+`" was not found.`;return}if(!e.ok){this.catalogError=e.status===401?`Authentication required.`:bs(e.data,`Failed to load MCP server catalog.`);return}this.catalog=Lx(n,e.data)}catch(e){console.error(`Failed to load MCP server catalog:`,e),this.catalogError=`Failed to load MCP server catalog.`}finally{this.catalogLoading=!1}}}closeCatalog(){this.catalogOpen=!1,this.catalogLoading=!1,this.catalogError=``,this.catalog=Cx()}},iz=z(``),az=z(`

        `),oz=z(`
        `),sz=z(`

        `),cz=z(`
      • `),lz=z(`

          `),uz=z(`

          No tools listed — the server may still be connecting or degraded.

          `),dz=z(` `,1),fz=z(``);function pz(e,t){D(t,!0);let n=k(()=>zx($.catalog));Us(e,{get open(){return $.catalogOpen},variant:`editor`,onclose:()=>$.closeCatalog(),children:(e,t)=>{var r=fz(),i=N(r),a=N(i),o=F(N(a),2),s=N(o),c=N(s,!0);E(s);var l=F(s,2),u=N(l,!0);E(l),E(o),E(a),zs(F(a,2),{label:`Close MCP server catalog`,onclick:()=>$.closeCatalog()}),E(i);var d=F(i,2),f=e=>{ET(e,{label:`Loading catalog...`})},p=e=>{var t=iz(),n=N(t,!0);E(t),I(()=>V(n,$.catalogError)),B(e,t)},m=e=>{var t=dz(),r=P(t),i=e=>{var t=az(),n=N(t,!0);E(t),I(()=>V(n,$.catalog.instructions)),B(e,t)};H(r,e=>{$.catalog.instructions&&e(i)});var a=F(r,2);U(a,17,()=>L(n),e=>e.key,(e,t)=>{var n=lz(),r=N(n),i=N(r,!0);E(r);var a=F(r,2);U(a,21,()=>L(t).items,e=>e.key,(e,t)=>{var n=cz(),r=N(n),i=N(r,!0);E(r);var a=F(r,2),o=e=>{var n=oz(),r=N(n,!0);E(n),I(()=>{G(n,`title`,`Exposed on the aggregated /mcp endpoint as `+L(t).aggregated),V(r,L(t).aggregated)}),B(e,n)};H(a,e=>{L(t).aggregated&&e(o)});var s=F(a,2),c=e=>{var n=sz(),r=N(n,!0);E(n),I(()=>V(r,L(t).description)),B(e,n)};H(s,e=>{L(t).description&&e(c)}),E(n),I(()=>{G(r,`title`,L(t).aggregated||L(t).name),V(i,L(t).name)}),B(e,n)}),E(a),E(n),I(()=>V(i,L(t).title)),B(e,n)});var o=F(a,2),s=e=>{B(e,uz())},c=k(()=>Bx($.catalog));H(o,e=>{L(c)&&e(s)}),B(e,t)};H(d,e=>{$.catalogLoading?e(f):$.catalogError?e(p,1):e(m,-1)});var h=F(d,2),g=N(h);E(h),E(r),I((e,t)=>{V(c,$.catalog.server),W(l,1,`audit-status-badge ${e??``}`,`svelte-1xqrzco`),V(u,t)},[()=>Ex($.catalog),()=>Tx($.catalog)]),R(`click`,g,()=>$.closeCatalog()),B(e,r)},$$slots:{default:!0}}),O()}Vr([`click`]);var mz=z(`

          The display name can change. The slug is the stable client-facing identity.

          `),hz=z(` Human-readable and Unicode-friendly. You can change it later.`,1),gz=z(`Derived from the name. You may edit it before saving.`),_z=z(`Immutable because it is used in URLs, scope headers, and aggregated tool names.`),vz=z(` `,1),yz=z(` stdio servers are config-only: declare them in config.yaml under mcp.servers.`,1),bz=z(``),xz=z(`
          `),Sz=z(`
          Headers
          Sent only to the configured server origin. Saved values are shown as ***; leave *** unchanged to keep the stored value.
          Advanced settings Description, access rules, and timeout
          `,1);function Cz(e,t){D(t,!0);{let t=e=>{B(e,mz())},n=k(()=>$.formMode===`edit`?`Edit MCP Server`:`Add MCP Server`);ME(e,{get open(){return $.formOpen},get title(){return L(n)},ariaLabel:`MCP server editor`,get error(){return $.error},get submitting(){return $.formSubmitting},onclose:()=>$.closeForm(),onsubmit:()=>$.submitForm(),headerHint:t,children:(e,t)=>{var n=Sz(),r=P(n);PE(r,{id:`mcp-server-name`,label:`Name`,children:(e,t)=>{var n=hz(),r=P(n);ta(r),He(2),R(`input`,r,()=>$.syncSlugFromName()),ua(r,()=>$.form.name,e=>$.form.name=e),B(e,n)},$$slots:{default:!0}});var i=F(r,2);PE(i,{id:`mcp-server-slug`,label:`Slug`,children:(e,t)=>{var n=vz(),r=P(n);ta(r);var i=F(r,2),a=e=>{B(e,gz())},o=e=>{B(e,_z())};H(i,e=>{$.formMode===`create`?e(a):e(o,-1)}),I(()=>r.disabled=$.formMode===`edit`),R(`input`,r,()=>$.markSlugEdited()),ua(r,()=>$.form.slug,e=>$.form.slug=e),B(e,n)},$$slots:{default:!0}});var a=F(i,2);PE(a,{id:`mcp-server-transport`,label:`Transport`,children:(e,t)=>{var n=yz(),r=P(n),i=N(r);i.value=i.__value=`http`;var a=F(i);a.value=a.__value=`sse`,E(r),He(2),Wi(r,()=>$.form.transport,e=>$.form.transport=e),B(e,n)},$$slots:{default:!0}});var o=F(a,2);PE(o,{id:`mcp-server-url`,label:`URL`,children:(e,t)=>{var n=bz();ta(n),ua(n,()=>$.form.url,e=>$.form.url=e),B(e,n)},$$slots:{default:!0}});var s=F(o,2),c=F(N(s),2);U(c,21,()=>$.form.headers,ai,(e,t,n)=>{var r=xz(),i=N(r);ta(i);var a=F(i,2);ta(a),OT(F(a,2),{label:`Remove header`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>$.removeHeader(n),children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}}),E(r),ua(i,()=>L(t).name,e=>L(t).name=e),ua(a,()=>L(t).value,e=>L(t).value=e),B(e,r)}),E(c);var l=F(c,2),u=N(l);q(N(u),{get icon(){return mo},class:`form-action-icon`}),He(2),E(u),E(l),He(2),E(s);var d=F(s,2),f=N(d);MA(N(f),{get enabled(){return $.form.enabled},label:`MCP server`,onclick:()=>$.form.enabled=!$.form.enabled}),E(f),E(d);var p=F(d,2),m=F(N(p),2),h=N(m),g=F(N(h),2);ta(g),E(h);var _=F(h,2),v=F(N(_),2);ta(v),E(_);var y=F(_,2),b=F(N(y),2);ta(b),E(y);var x=F(y,2),S=F(N(x),2);dt(S),G(S,`placeholder`,`/ -/team/alpha`),E(x);var C=F(x,2),w=F(N(C),2);ta(w),E(C),E(m),E(p),I(()=>p.open=$.advancedOpen),R(`click`,u,()=>$.addHeader()),Br(`toggle`,p,e=>$.advancedOpen=e.currentTarget.open),ua(g,()=>$.form.description,e=>$.form.description=e),ua(v,()=>$.form.allowed_tools,e=>$.form.allowed_tools=e),ua(b,()=>$.form.disallowed_tools,e=>$.form.disallowed_tools=e),ua(S,()=>$.form.user_paths,e=>$.form.user_paths=e),ua(w,()=>$.form.tool_timeout_seconds,e=>$.form.tool_timeout_seconds=e),B(e,n)},$$slots:{headerHint:!0,default:!0}})}O()}Vr([`input`,`click`]);var wz=z(`Config`),Tz=z(`
          `),Ez=z(`
          `),Dz=z(`
          NameTransportEndpointStatusToolsEnabledActions
          `);function Oz(e,t){D(t,!0);function n(e){return Dx(e,e=>ys.formatTimestamp(e))}var r=Dz(),i=N(r),a=F(N(i));U(a,21,()=>$.filtered,e=>wx(e),(e,t)=>{var r=Ez(),i=N(r),a=N(i),o=N(a,!0);E(a);var s=F(a,2),c=e=>{B(e,wz())};H(s,e=>{L(t).managed&&e(c)});var l=F(s,2),u=N(l,!0);E(l),E(i);var d=F(i),f=N(d),p=N(f,!0);E(f),E(d);var m=F(d),h=N(m,!0);E(m);var g=F(m),_=N(g),v=N(_,!0);E(_);var y=F(_,2),b=e=>{var n=Tz(),r=N(n,!0);E(n),I(()=>V(r,L(t).last_error)),B(e,n)},x=k(()=>Tx(L(t))===`degraded`&&L(t).last_error);H(y,e=>{L(x)&&e(b)}),E(g);var S=F(g),C=N(S),w=N(C,!0);E(C);var T=F(C,2),ee=N(T,!0);E(T),E(S);var te=F(S),ne=N(te),re=N(ne,!0);E(ne),E(te);var ie=F(te),ae=N(ie),oe=N(ae),se=e=>{{let n=k(()=>`Edit MCP server `+L(t).name);OT(e,{get label(){return L(n)},class:`table-icon-btn`,onclick:()=>$.openEdit(L(t)),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(oe,e=>{L(t).managed||e(se)});var ce=F(oe,2);{let e=k(()=>`Inspect catalog of MCP server `+L(t).name);OT(ce,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>$.openCatalog(L(t)),children:(e,t)=>{q(e,{get icon(){return io},class:`form-action-icon`})},$$slots:{default:!0}})}var le=F(ce,2);{let e=k(()=>($.reconnectingName===wx(L(t))?`Reconnecting MCP server `:`Reconnect MCP server `)+L(t).name),n=k(()=>$.reconnectingName===wx(L(t)));OT(le,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>$.reconnectServer(L(t)),get disabled(){return L(n)},children:(e,t)=>{q(e,{get icon(){return go},class:`form-action-icon`})},$$slots:{default:!0}})}var ue=F(le,2),de=e=>{{let n=k(()=>($.deletingName===wx(L(t))?`Deleting MCP server `:`Delete MCP server `)+L(t).name),r=k(()=>$.deletingName===wx(L(t)));OT(e,{get label(){return L(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>$.deleteServer(L(t)),get disabled(){return L(r)},children:(e,t)=>{q(e,{get icon(){return Ro},class:`table-icon-svg`})},$$slots:{default:!0}})}};H(ue,e=>{L(t).managed||e(de)}),E(ae),E(ie),E(r),I((e,n,r,i,a,s,c,l)=>{V(o,L(t).name),V(u,e),V(p,L(t).transport||`http`),G(m,`title`,n),V(h,r),W(_,1,`audit-status-badge ${i??``}`,`svelte-ah8nrt`),G(_,`title`,a),V(v,s),V(w,c),V(ee,l),W(ne,1,Pi([`auth-key-status-badge`,L(t).enabled?`auth-key-status-active`:`auth-key-status-inactive`])),V(re,L(t).enabled?`Enabled`:`Disabled`)},[()=>wx(L(t)),()=>Ox(L(t)),()=>Ox(L(t)),()=>Ex(L(t)),()=>n(L(t)),()=>Tx(L(t)),()=>_c(L(t).tool_count||0),()=>kx(L(t))]),B(e,r)}),E(a),E(i),E(r),B(e,r),O()}var kz=z(`

          MCP Servers

          `),Az=z(``),jz=z(`
          MCP server management is unavailable.
          `),Mz=z(``),Nz=z(`
          `),Pz=z(`

          No MCP servers yet. Add one here, or declare servers in config.yaml under mcp.servers.

          `),Fz=z(`

          No MCP servers match your filter.

          `),Iz=z(`
          `);function Lz(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`mcp-servers`&&$.fetchServers()});var n=Iz(),r=N(n),i=N(r);iC(N(i),{copyId:`mcp-servers-help-copy`,label:`MCP servers help`,text:`Upstream Model Context Protocol servers whose tools, prompts, and resources the gateway exposes to clients. Servers added here connect over HTTP or SSE; stdio servers and rows marked Config are declared in config.yaml under mcp.servers and are read-only in the dashboard. Saved header values are masked in API and dashboard responses.`,title:e=>{B(e,kz())},$$slots:{title:!0}}),E(i);var a=F(i,2),o=N(a),s=e=>{var t=Az();q(N(t),{get icon(){return mo},class:`form-action-icon`}),He(2),E(t),I(()=>t.disabled=$.formSubmitting),R(`click`,t,()=>$.openCreate()),B(e,t)};H(o,e=>{$.available&&!J.authError&&e(s)}),E(a),E(r);var c=F(r,2),l=e=>{B(e,jz())};H(c,e=>{!$.available&&!J.authError&&e(l)});var u=F(c,2),d=e=>{var t=Mz(),n=N(t,!0);E(t),I(()=>V(n,$.error)),B(e,t)};H(u,e=>{$.error&&!J.authError&&!$.formOpen&&e(d)});var f=F(u,2),p=e=>{ET(e,{label:`Loading MCP servers...`})};H(f,e=>{$.loading&&!J.authError&&e(p)});var m=F(f,2),h=e=>{var t=Nz(),n=N(t);jw(N(n),{id:`mcp-server-filter`,placeholder:`Filter by name, slug, URL, transport, or status...`,label:`Filter MCP servers by name, slug, URL, transport, or status`,get value(){return $.filter},set value(e){$.filter=e}}),E(n),E(t),B(e,t)};H(m,e=>{($.servers.length>0||$.filter)&&$.available&&!J.authError&&e(h)});var g=F(m,2);Cz(g,{});var _=F(g,2);pz(_,{});var v=F(_,2),y=e=>{Oz(e,{})};H(v,e=>{$.filtered.length>0&&$.available&&!J.authError&&e(y)});var b=F(v,2),x=e=>{B(e,Pz())};H(b,e=>{$.servers.length===0&&!$.filter&&!$.loading&&!J.authError&&!$.error&&$.available&&e(x)});var S=F(b,2),C=e=>{B(e,Fz())};H(S,e=>{$.servers.length>0&&$.filtered.length===0&&$.filter&&!$.loading&&!J.authError&&$.available&&e(C)}),E(n),B(e,n),O()}Vr([`click`]);var Rz=`api_keys`,zz=`session_sticky_keys`,Bz=`base_url`,Vz=`service_account_json`,Hz=`models`,Uz={[Rz]:{label:`API Keys`,control:`keys`,hint:`Identified sessions stay on one key by default, improving provider prompt-cache hits. Saved values are shown as ***********; leave the asterisks unchanged to keep the stored key.`},[zz]:{label:`Session-sticky API keys`,control:`checkbox`,hint:`Keep each identified conversation on one API key to preserve provider prompt-cache affinity. Turn off to rotate keys round-robin on every request.`},[Bz]:{label:`Base URL`,control:`text`},api_version:{label:`API Version`,control:`text`,placeholder:`e.g. 2024-10-01-preview`,hint:`Leave empty for the provider default. Realtime endpoints may need a newer version.`},backend:{label:`Backend`,control:`select`,hint:`Which Google surface to call. Vertex authenticates with Google credentials instead of an API key.`},auth_type:{label:`Auth Type`,control:`select`,hint:`How to obtain Google credentials. Leave on the default to use Application Default Credentials.`},api_mode:{label:`API Mode`,control:`select`,hint:`Which request shape to send upstream.`},vertex_project:{label:`Vertex Project`,control:`text`,placeholder:`my-gcp-project`},vertex_location:{label:`Vertex Location`,control:`text`,placeholder:`us-central1`},service_account_file:{label:`Service Account File`,control:`text`,placeholder:`/path/to/service-account.json`,hint:`Path readable by the gateway process.`},[Vz]:{label:`Service Account JSON`,control:`textarea`,placeholder:`Paste service account JSON`,hint:`Saved values are shown as ***********; leave the asterisks unchanged to keep the stored value, or clear it to remove.`},service_account_json_base64:{label:`Service Account JSON (base64)`,control:`text`,hint:`Saved values are shown as ***********; leave the asterisks unchanged to keep the stored value.`},gcp_scope:{label:`GCP Scope`,control:`text`,placeholder:`https://www.googleapis.com/auth/cloud-platform`},[Hz]:{label:`Models (comma-separated)`,control:`text`,placeholder:`gpt-4o, gpt-4o-mini`,hint:`Leave empty to auto-discover models from the provider's /models endpoint where supported.`}};function Wz(e){return Uz[e]||{label:String(e||``).split(`_`).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),control:`text`}}function Gz(){return{name:``,type:``,api_keys:[],session_sticky_keys:!0,base_url:``,api_version:``,backend:``,auth_type:``,api_mode:``,vertex_project:``,vertex_location:``,service_account_file:``,service_account_json:``,service_account_json_base64:``,gcp_scope:``,models:``,enabled:!0}}function Kz(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.type,e.base_url].some(e=>String(e||``).toLowerCase().includes(r)))}function qz(e,t){let n=(Array.isArray(e)?e:[]).map(e=>String(e&&e.type||``).trim()).filter(Boolean),r=String(t||``).trim();return r&&!n.includes(r)&&n.push(r),n}function Jz(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>String(e&&e.type||``).trim()===n)||null}function Yz(e,t){let n=e&&Array.isArray(e.fields)&&e.fields.length>0?e.fields:Object.keys(Uz).map(e=>({name:e,advanced:e!==Rz})),r=t||e&&e.default_base_url||``,i=[],a=[];for(let e of n){let t=String(e&&e.name||``).trim();if(!t)continue;let n={...Wz(t),name:t,required:!!(e&&e.required),options:Array.isArray(e&&e.options)?e.options:[]};t===`base_url`&&r&&(n.placeholder=r,n.hint=`Defaults to `+r),n.options.length>0&&(n.control=`select`),(e&&e.advanced?a:i).push(n)}return{primary:i,advanced:a}}var Xz=new Set([`name`,`type`,`enabled`]);function Zz(e,t){let n=new Set([...t.primary||[],...t.advanced||[]].map(e=>e.name)),r=Gz(),i={...e};for(let e of Object.keys(r))!Xz.has(e)&&!n.has(e)&&(i[e]=r[e]);return i}function Qz(e){let t=Array.isArray(e&&e.api_keys)?e.api_keys.length:0;return t>0?t+` key`+(t===1?``:`s`):String(e&&e.service_account_json||``).trim()||String(e&&e.service_account_json_base64||``).trim()||String(e&&e.service_account_file||``).trim()?`service account`:String(e&&e.vertex_project||``).trim()?`ADC`:`keyless`}function $z(e){let t=Array.isArray(e&&e.models)?e.models:[];return t.length===0?`auto-discovered`:t.length+` model`+(t.length===1?``:`s`)}function eB(e){return(Array.isArray(e)?e:[]).map(e=>({value:String(e||``)}))}function tB(e){return(Array.isArray(e)?e:[]).map(e=>String(e&&e.value||``))}function nB(e,t){let n=String(t||``).trim();if(!n)return``;let r=new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.name||``).trim()));if(!r.has(n))return n;let i=1;for(;r.has(n+`-`+i);)i+=1;return n+`-`+i}function rB(e){return{name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),api_keys:eB(e&&e.api_keys),session_sticky_keys:!e||e.session_sticky_keys!==!1,base_url:String(e&&e.base_url||``),api_version:String(e&&e.api_version||``),backend:String(e&&e.backend||``),auth_type:String(e&&e.auth_type||``),api_mode:String(e&&e.api_mode||``),vertex_project:String(e&&e.vertex_project||``),vertex_location:String(e&&e.vertex_location||``),service_account_file:String(e&&e.service_account_file||``),service_account_json:String(e&&e.service_account_json||``),service_account_json_base64:String(e&&e.service_account_json_base64||``),gcp_scope:String(e&&e.gcp_scope||``),models:(Array.isArray(e&&e.models)?e.models:[]).join(`, `),enabled:!e||e.enabled!==!1}}function iB(e){let t=String(e||``).trim();return t.length>=3&&/^\*+$/.test(t)}function aB(e,t,n,r){let i={},a=String(e&&e.name||``).trim();String(e&&e.type||``).trim()||(i.type=`Select a provider type.`),a?a.includes(`/`)?i.name=`Name cannot contain '/' — it separates the provider from the model.`:t===`create`&&(Array.isArray(n)?n:[]).some(e=>String(e&&e.name||``).trim()===a)&&(i.name=`Provider "`+a+`" already exists.`):i.name=`Name is required.`;let{primary:o,advanced:s}=Yz(r);for(let t of[...o,...s]){let n=oB(e,t);n&&(i[t.name]=n)}return i}function oB(e,t){if(t.name===`api_keys`){let n=tB(e&&e.api_keys);return t.required&&!n.some(e=>e.trim())?`At least one API key is required for this provider type.`:n.some(e=>!e.trim())?`Remove the empty row instead of leaving a key blank.`:``}let n=String(e&&e[t.name]||``).trim();if(t.required&&!n)return t.label+` is required for this provider type.`;if(!n)return``;if(t.name===`base_url`&&!n.includes(`://`)&&/[./]/.test(n))return`Include the scheme, e.g. https://`+n;if(t.name===`service_account_json`&&!iB(n))try{JSON.parse(n)}catch{return`Paste the service account JSON file's contents — this is not valid JSON.`}return``}function sB(e,t){let n={name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),enabled:!!(e&&e.enabled)},{primary:r,advanced:i}=Yz(t),a=!!(t&&Array.isArray(t.fields)&&t.fields.length>0),o=new Set;for(let t of[...r,...i])!a&&t.name===`session_sticky_keys`||(o.add(t.name),n[t.name]=cB(e,t.name));for(let t of Object.keys(Uz)){if(o.has(t)||t===`session_sticky_keys`)continue;let r=cB(e,t);(Array.isArray(r)?r.length>0:String(r).trim()!==``)&&(n[t]=r)}return n}function cB(e,t){switch(t){case Rz:return tB(e&&e.api_keys);case Hz:return hc(e&&e.models);case zz:return!!(e&&e.session_sticky_keys);case Vz:return e&&e.service_account_json||``;default:return String(e&&e[t]||``).trim()}}var lB=new class{#e=A(M([]));get rows(){return L(this.#e)}set rows(e){j(this.#e,e,!0)}#t=A(!0);get available(){return L(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}#r=A(``);get error(){return L(this.#r)}set error(e){j(this.#r,e,!0)}#i=A(``);get filter(){return L(this.#i)}set filter(e){j(this.#i,e,!0)}#a=A(!1);get formOpen(){return L(this.#a)}set formOpen(e){j(this.#a,e,!0)}#o=A(!1);get formSubmitting(){return L(this.#o)}set formSubmitting(e){j(this.#o,e,!0)}#s=A(`create`);get formMode(){return L(this.#s)}set formMode(e){j(this.#s,e,!0)}#c=A(!1);get advancedOpen(){return L(this.#c)}set advancedOpen(e){j(this.#c,e,!0)}#l=A(M(Gz()));get form(){return L(this.#l)}set form(e){j(this.#l,e,!0)}#u=A(M({}));get fieldErrors(){return L(this.#u)}set fieldErrors(e){j(this.#u,e,!0)}#d=A(``);get focusField(){return L(this.#d)}set focusField(e){j(this.#d,e,!0)}#f=A(``);get deletingName(){return L(this.#f)}set deletingName(e){j(this.#f,e,!0)}#p=A(!1);get deleteSubmitting(){return L(this.#p)}set deleteSubmitting(e){j(this.#p,e,!0)}#m=A(M([]));get types(){return L(this.#m)}set types(e){j(this.#m,e,!0)}#h=A(!1);get typesLoaded(){return L(this.#h)}set typesLoaded(e){j(this.#h,e,!0)}#g=null;get filteredRows(){return Kz(this.rows,this.filter)}get schema(){return Jz(this.types,this.form.type)}get formFields(){if(!String(this.form.type||``).trim())return{primary:[],advanced:[]};let e=this.schema;return Yz(e,e&&e.default_base_url)}async fetchTypes(){let e=await kT(`/admin/provider-credentials/types`,{label:`provider credential types`});e.status===`ok`&&(this.types=e.items,this.typesLoaded=!0)}async fetchPage(){this.#g&&this.#g.abort();let e=new AbortController;this.#g=e,this.loading=!0,this.error=``;try{let t=await kT(`/admin/provider-credentials`,{label:`provider credentials`,errorFallback:`Failed to load provider credentials.`,unavailableStatuses:[503,404],options:{signal:e.signal}});if(t.status===`stale`||e.signal.aborted)return;if(t.status===`unavailable`){this.available=!1,this.rows=[];return}if(t.status===`error`){t.result&&(this.available=!0),this.rows=[],this.error=t.error;return}this.available=!0,this.rows=t.items,this.typesLoaded||await this.fetchTypes()}finally{this.#g===e&&(this.#g=null,this.loading=!1)}}#_(e,t){this.formMode=e,this.form=t,this.advancedOpen=!1,this.error=``,this.fieldErrors={},this.focusField=``}openCreate(){this.#_(`create`,Gz()),this.formOpen=!0,this.typesLoaded||this.fetchTypes()}openEdit(e){!e||e.managed||(this.#_(`edit`,rB(e)),this.formOpen=!0,this.typesLoaded||this.fetchTypes())}closeForm(){this.formOpen=!1,this.#_(`create`,Gz())}selectType(){this.fieldErrors={};let e=this.formFields;this.formMode===`create`&&(this.form=Zz(this.form,e));let t=e.primary.find(e=>e.name===`api_keys`);t&&t.required&&this.form.api_keys.length===0&&(this.form.api_keys=[{value:``}])}clearFieldError(e){if(this.fieldErrors[e]===void 0)return;let{[e]:t,...n}=this.fieldErrors;this.fieldErrors=n}addApiKeyRow(){this.form.api_keys.push({value:``}),this.clearFieldError(`api_keys`)}removeApiKeyRow(e){this.form.api_keys.splice(e,1),this.clearFieldError(`api_keys`)}#v(e){let t=bs(e,`Failed to save provider credential.`),n=String(e&&e.error&&typeof e.error==`object`&&e.error.param||``).trim();if(n&&this.#y(n)){this.fieldErrors={...this.fieldErrors,[n]:t},this.error=``,this.#b();return}this.error=t}#y(e){if(e===`name`||e===`type`)return!0;let{primary:t,advanced:n}=this.formFields;return[...t,...n].some(t=>t.name===e)}#b(){let e=Object.keys(this.fieldErrors);if(e.length===0)return;let{primary:t,advanced:n}=this.formFields;n.some(t=>e.includes(t.name))&&(this.advancedOpen=!0);let r=[`type`,`name`,...t.map(e=>e.name),...n.map(e=>e.name)];this.focusField=r.find(t=>e.includes(t))||e[0]}#x(){Wc.fetchModels(),Wc.fetchCategories()}async submitForm(){let e=this.schema,t=aB(this.form,this.formMode,this.rows,e);if(Object.keys(t).length>0){this.fieldErrors=t,this.error=``,this.#b();return}let n=sB(this.form,e);this.error=``,this.fieldErrors={},this.formSubmitting=!0;try{let e=await AT(`/admin/provider-credentials`,`PUT`,n,{label:`save provider credential`,errorFallback:`Failed to save provider credential.`,unavailableMessage:`Provider credential management is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.error=e.error;return}if(e.status===`error`){e.result&&e.result.status!==401?this.#v(e.result.data):this.error=e.error;return}Y.success(`Provider "`+n.name+`" saved.`),this.closeForm(),this.#x(),this.fetchPage()}finally{this.formSubmitting=!1}}async performDelete(e){this.deleteSubmitting=!0,this.deletingName=e;try{let t=await AT(`/admin/provider-credentials/`+encodeURIComponent(e),`DELETE`,void 0,{label:`delete provider credential`,errorFallback:`Failed to delete provider credential.`,unavailableMessage:`Provider credential management is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,Ys.error=t.error;return}if(t.status===`error`){Ys.error=t.error;return}Y.success(`Provider "`+e+`" deleted.`),Ys.close(),this.formOpen&&this.form.name===e&&this.closeForm(),this.#x(),this.fetchPage()}finally{this.deleteSubmitting=!1,this.deletingName=``}}requestDelete(e){let t=String(e||``).trim();if(!t||this.deleteSubmitting)return;let n=(this.rows||[]).find(e=>String(e&&e.name||``).trim()===t);n&&n.managed||Ys.open({title:`Delete Provider`,titleId:`providerCredentialDeleteDialogTitle`,inputId:`provider-credential-delete-confirmation`,message:`Type "`+t+`" to permanently delete this provider credential. Requests routed to it will fail until it is reconfigured.`,requiredText:t,confirmLabel:`Delete Provider`,icon:jo,dialogClass:`budget-reset-dialog`,onConfirm:()=>this.performDelete(t)})}},uB=z(`Config`),dB=z(` `,1),fB=z(`
          `),pB=z(`
          NameTypeBase URLAuthModelsEnabledUpdatedActions
          `);function mB(e,t){D(t,!0);var n=pB(),r=N(n),i=F(N(r));U(i,21,()=>lB.filteredRows,e=>e.name,(e,t)=>{var n=fB(),r=N(n),i=N(r),a=N(i,!0);E(i);var o=F(i,2),s=e=>{B(e,uB())};H(o,e=>{L(t).managed&&e(s)}),E(r);var c=F(r),l=N(c),u=N(l,!0);E(l),E(c);var d=F(c),f=N(d,!0);E(d);var p=F(d),m=N(p,!0);E(p);var h=F(p),g=N(h,!0);E(h);var _=F(h),v=N(_);let y;var b=N(v,!0);E(v),E(_);var x=F(_),S=N(x,!0);E(x);var C=F(x),w=N(C),T=N(w),ee=e=>{var n=dB(),r=P(n);{let e=k(()=>`Edit provider `+L(t).name);OT(r,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>lB.openEdit(L(t)),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}var i=F(r,2);{let e=k(()=>(lB.deletingName===L(t).name?`Deleting provider `:`Delete provider `)+L(t).name),n=k(()=>lB.deletingName===L(t).name);OT(i,{get label(){return L(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>lB.requestDelete(L(t).name),get disabled(){return L(n)},children:(e,t)=>{q(e,{get icon(){return Ro},class:`table-icon-svg`})},$$slots:{default:!0}})}B(e,n)};H(T,e=>{L(t).managed||e(ee)}),E(w),E(C),E(n),I((e,n,r)=>{V(a,L(t).name),V(u,L(t).type),G(d,`title`,L(t).base_url||``),V(f,L(t).base_url||`—`),V(m,e),V(g,n),y=W(v,1,`auth-key-status-badge`,null,y,{"auth-key-status-active":L(t).enabled,"auth-key-status-inactive":!L(t).enabled}),V(b,L(t).enabled?`Enabled`:`Disabled`),V(S,r)},[()=>Qz(L(t)),()=>$z(L(t)),()=>ys.formatTimestamp(L(t).updated_at)]),B(e,n)}),E(i),E(r),E(n),B(e,n),O()}var hB=z(``),gB=z(`
          `),_B=z(`
          `,1),vB=z(``),yB=z(``),bB=z(``),xB=z(``),SB=z(``),CB=z(` `),wB=z(` `),TB=z(`
          `);function EB(e,t){D(t,!0);let n=k(()=>`provider-credential-`+t.field.name),r=k(()=>lB.fieldErrors[t.field.name]||``),i=k(()=>L(r)?L(n)+`-error`:t.field.hint?L(n)+`-hint`:void 0),a=k(()=>{let e=String(lB.form[t.field.name]||``).trim();return!e||t.field.options.includes(e)?t.field.options:[...t.field.options,e]});function o(){lB.clearFieldError(t.field.name)}var s=TB(),c=N(s),l=N(c),u=F(l),d=e=>{B(e,hB())};H(u,e=>{t.field.required&&e(d)}),E(c);var f=F(c,2),p=e=>{var t=_B(),a=P(t);U(a,21,()=>lB.form.api_keys,ai,(e,t,a)=>{var s=gB(),c=N(s);ta(c),G(c,`aria-label`,`API key `+(a+1)),OT(F(c,2),{label:`Remove API key `+(a+1),class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>lB.removeApiKeyRow(a),children:(e,t)=>{q(e,{get icon(){return jo},class:`table-icon-svg`})},$$slots:{default:!0}}),E(s),I(()=>{G(c,`id`,a===0?L(n):L(n)+`-`+a),G(c,`aria-invalid`,L(r)?`true`:void 0),G(c,`aria-describedby`,a===0?L(i):void 0)}),R(`input`,c,o),ua(c,()=>L(t).value,e=>L(t).value=e),B(e,s)}),E(a);var s=F(a,2),c=N(s);q(N(c),{get icon(){return mo},class:`form-action-icon`}),He(2),E(c),E(s),I(()=>G(c,`id`,lB.form.api_keys.length===0?L(n):void 0)),R(`click`,c,()=>lB.addApiKeyRow()),B(e,t)},m=e=>{var s=yB(),c=N(s);c.value=c.__value=``,U(F(c),16,()=>L(a),e=>e,(e,t)=>{var n=vB(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(s),I(()=>{G(s,`id`,L(n)),G(s,`aria-invalid`,L(r)?`true`:void 0),G(s,`aria-describedby`,L(i))}),R(`change`,s,o),Wi(s,()=>lB.form[t.field.name],e=>lB.form[t.field.name]=e),B(e,s)},h=e=>{var a=bB();ta(a),I(()=>{G(a,`id`,L(n)),G(a,`aria-invalid`,L(r)?`true`:void 0),G(a,`aria-describedby`,L(i))}),R(`change`,a,o),da(a,()=>lB.form[t.field.name],e=>lB.form[t.field.name]=e),B(e,a)},g=e=>{var a=xB();dt(a),I(()=>{G(a,`id`,L(n)),G(a,`placeholder`,t.field.placeholder||``),G(a,`aria-invalid`,L(r)?`true`:void 0),G(a,`aria-describedby`,L(i))}),R(`input`,a,o),ua(a,()=>lB.form[t.field.name],e=>lB.form[t.field.name]=e),B(e,a)},_=e=>{var a=SB();ta(a),I(()=>{G(a,`id`,L(n)),G(a,`placeholder`,t.field.placeholder||``),G(a,`aria-invalid`,L(r)?`true`:void 0),G(a,`aria-describedby`,L(i))}),R(`input`,a,o),ua(a,()=>lB.form[t.field.name],e=>lB.form[t.field.name]=e),B(e,a)};H(f,e=>{t.field.control===`keys`?e(p):t.field.control===`select`?e(m,1):t.field.control===`checkbox`?e(h,2):t.field.control===`textarea`?e(g,3):e(_,-1)});var v=F(f,2),y=e=>{var t=CB(),i=N(t,!0);E(t),I(()=>{G(t,`id`,L(n)+`-error`),V(i,L(r))}),B(e,t)},b=e=>{var r=wB(),i=N(r,!0);E(r),I(()=>{G(r,`id`,L(n)+`-hint`),V(i,t.field.hint)}),B(e,r)};H(v,e=>{L(r)?e(y):t.field.hint&&e(b,1)}),E(s),I(()=>{G(c,`for`,L(n)),V(l,`${t.field.label??``} `)}),B(e,s),O()}Vr([`input`,`click`,`change`]);var DB=z(`

          The name is the stable identity used for routing and cannot change once created.

          `),OB=z(``),kB=z(` `),AB=z(`Determines which fields the gateway uses to build requests.`),jB=z(` `),MB=z(`Suggested from the selected type; used to route requests to this provider instance and editable before saving.`),NB=z(`Immutable once created.`),PB=z(`

          Pick a type to configure its credentials — each provider type asks for different settings.

          `),FB=z(`
          Advanced settings
          `),IB=z(`
          `,1);function LB(e,t){D(t,!0);let n=k(()=>qz(lB.types,lB.form.type)),r=k(()=>lB.formFields),i=k(()=>lB.fieldErrors.name||``),a=k(()=>lB.fieldErrors.type||``);function o(){lB.selectType(),lB.formMode===`create`&&(lB.form.name=nB(lB.rows,lB.form.type))}kn(()=>{let e=lB.focusField;if(!e)return;lB.focusField=``;let t=document.getElementById(`provider-credential-`+e);t&&(t.scrollIntoView({block:`center`}),t.focus({preventScroll:!0}))});{let t=e=>{B(e,DB())},s=k(()=>lB.formMode===`edit`?`Edit Provider`:`Add Provider`);ME(e,{get open(){return lB.formOpen},get title(){return L(s)},ariaLabel:`Provider credential editor`,get error(){return lB.error},get submitting(){return lB.formSubmitting},novalidate:!0,onclose:()=>lB.closeForm(),onsubmit:()=>lB.submitForm(),headerHint:t,children:(e,t)=>{var s=IB(),c=P(s),l=F(N(c),2),u=N(l);u.value=u.__value=``,U(F(u),16,()=>L(n),e=>e,(e,t)=>{var n=OB(),r=N(n,!0);E(n);var i={};I(()=>{V(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),B(e,n)}),E(l);var d=F(l,2),f=e=>{var t=kB(),n=N(t,!0);E(t),I(()=>V(n,L(a))),B(e,t)},p=e=>{B(e,AB())};H(d,e=>{L(a)?e(f):e(p,-1)}),E(c);var m=F(c,2),h=F(N(m),2);ta(h);var g=F(h,2),_=e=>{var t=jB(),n=N(t,!0);E(t),I(()=>V(n,L(i))),B(e,t)},v=e=>{B(e,MB())},y=e=>{B(e,NB())};H(g,e=>{L(i)?e(_):lB.formMode===`create`?e(v,1):e(y,-1)}),E(m);var b=F(m,2),x=e=>{B(e,PB())};H(b,e=>{lB.form.type||e(x)});var S=F(b,2);U(S,17,()=>L(r).primary,e=>e.name,(e,t)=>{EB(e,{get field(){return L(t)}})});var C=F(S,2),w=N(C);MA(N(w),{get enabled(){return lB.form.enabled},label:`provider`,onclick:()=>lB.form.enabled=!lB.form.enabled}),E(w),E(C);var T=F(C,2),ee=e=>{var t=FB(),n=N(t),i=N(n),a=F(N(i),2),o=N(a,!0);E(a),E(i),E(n);var s=F(n,2);U(s,21,()=>L(r).advanced,e=>e.name,(e,t)=>{EB(e,{get field(){return L(t)}})}),E(s),E(t),I(e=>{t.open=lB.advancedOpen,V(o,e)},[()=>L(r).advanced.map(e=>e.label).join(`, `)]),Br(`toggle`,t,e=>lB.advancedOpen=e.currentTarget.open),B(e,t)};H(T,e=>{L(r).advanced.length>0&&e(ee)}),I(()=>{l.disabled=lB.formMode===`edit`,G(l,`aria-invalid`,L(a)?`true`:void 0),G(l,`aria-describedby`,L(a)?`provider-credential-type-error`:`provider-credential-type-hint`),h.disabled=lB.formMode===`edit`,G(h,`aria-invalid`,L(i)?`true`:void 0),G(h,`aria-describedby`,L(i)?`provider-credential-name-error`:`provider-credential-name-hint`)}),R(`change`,l,o),Wi(l,()=>lB.form.type,e=>lB.form.type=e),R(`input`,h,()=>lB.clearFieldError(`name`)),ua(h,()=>lB.form.name,e=>lB.form.name=e),B(e,s)},$$slots:{headerHint:!0,default:!0}})}O()}Vr([`change`,`input`]);var RB=z(`

          Providers

          `),zB=z(``),BB=z(`
          Provider credential management is unavailable.
          `),VB=z(``),HB=z(`
          `),UB=z(`

          No dashboard-managed providers yet. Add one here, or declare providers in config.yaml / environment variables.

          `),WB=z(`

          No providers match your filter.

          `),GB=z(`
          `);function KB(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`providers-config`&&lB.fetchPage()});var n=GB(),r=N(n),i=N(r);iC(N(i),{copyId:`providers-config-help-copy`,label:`model providers help`,title:e=>{B(e,RB())},help:e=>{He(),B(e,Xr(`Configure LLM provider credentials here instead of setting API keys as - environment variables. Providers declared in config.yaml or env vars - are read-only (Config badge) and cannot be edited or deleted from the - dashboard. Keys are masked after saving.`))},$$slots:{title:!0,help:!0}}),E(i);var a=F(i,2),o=N(a),s=e=>{var t=zB();q(N(t),{get icon(){return mo},class:`form-action-icon`}),He(2),E(t),I(()=>t.disabled=lB.formSubmitting),R(`click`,t,()=>lB.openCreate()),B(e,t)};H(o,e=>{lB.available&&!J.needsAuth&&e(s)}),E(a),E(r);var c=F(r,2),l=e=>{B(e,BB())};H(c,e=>{!lB.available&&!J.needsAuth&&e(l)});var u=F(c,2),d=e=>{var t=VB(),n=N(t,!0);E(t),I(()=>V(n,lB.error)),B(e,t)};H(u,e=>{lB.error&&!J.needsAuth&&!lB.formOpen&&e(d)});var f=F(u,2),p=e=>{ET(e,{label:`Loading providers...`})};H(f,e=>{lB.loading&&!J.needsAuth&&e(p)});var m=F(f,2),h=e=>{var t=HB(),n=N(t);jw(N(n),{id:`provider-credential-filter`,placeholder:`Filter by name, type, or base URL...`,label:`Filter providers by name, type, or base URL`,get value(){return lB.filter},set value(e){lB.filter=e}}),E(n),E(t),B(e,t)};H(m,e=>{(lB.rows.length>0||lB.filter)&&lB.available&&!J.needsAuth&&e(h)});var g=F(m,2);LB(g,{});var _=F(g,2),v=e=>{mB(e,{})};H(_,e=>{lB.filteredRows.length>0&&lB.available&&!J.needsAuth&&e(v)});var y=F(_,2),b=e=>{B(e,UB())};H(y,e=>{lB.rows.length===0&&!lB.filter&&!lB.loading&&!J.needsAuth&&!lB.error&&lB.available&&e(b)});var x=F(y,2),S=e=>{B(e,WB())};H(x,e=>{lB.rows.length>0&&lB.filteredRows.length===0&&lB.filter&&!lB.loading&&!J.needsAuth&&lB.available&&e(S)}),E(n),B(e,n),O()}Vr([`click`]);function qB(){return{name:``,description:``,user_path:``,labels:``,dashboard_access:!1,expires_at:``}}function JB(e){let t=[];for(let n of String(e||``).split(`,`)){let e=n.trim();e&&!t.includes(e)&&t.push(e)}return t}function YB(e){let t=String(e||``).trim();if(!t)return``;let n=t.startsWith(`/`)?t:`/`+t;for(let e of n.split(`/`)){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function XB(e){if(YB(e))return``;let t=String(e||``).trim();if(!t)return``;let n=t.startsWith(`/`)?t:`/`+t,r=[];for(let e of n.split(`/`)){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function ZB(e){let t=e||{},n=String(t.name||``).trim();if(!n)return{error:`Name is required.`};let r=YB(t.user_path);if(r)return{error:r};let i=XB(t.user_path),a=JB(t.labels),o={name:n,description:String(t.description||``).trim()||void 0,user_path:i||void 0,labels:a.length?a:void 0,dashboard_access:t.dashboard_access?!0:void 0};return t.expires_at&&(o.expires_at=t.expires_at+`T23:59:59Z`),{payload:o}}function QB(e,t=Date.now()){let n=e&&e.expires_at;if(!n)return!1;let r=Date.parse(n);return Number.isFinite(r)&&r<=t}function $B(e){return e?!!e.deactivated_at||e.enabled===!1:!1}function eV(e,t=Date.now()){return!e||e.active===!1||$B(e)?!1:!QB(e,t)}function tV(e){return[e.name,e.description,e.user_path,e.redacted_value,...e.labels||[]].filter(Boolean).join(` `).toLowerCase()}function nV(e,t={}){let{query:n=``,showInactive:r=!1,now:i=Date.now()}=t,a=String(n||``).trim().toLowerCase();return(Array.isArray(e)?e:[]).filter(e=>!r&&!eV(e,i)?!1:!a||tV(e).includes(a))}function rV(e,t){return $B(e)?2:+!eV(e,t)}function iV(e){let t=e&&e.expires_at;if(!t)return 1/0;let n=Date.parse(t);return Number.isFinite(n)?n:1/0}function aV(e){let t=Date.parse(e&&e.deactivated_at||``);return Number.isFinite(t)?t:-1/0}function oV(e,t=Date.now()){return(Array.isArray(e)?e.slice():[]).sort((e,n)=>{let r=rV(e,t),i=rV(n,t);if(r!==i)return r-i;let[a,o]=r===2?[aV(e),aV(n)]:[iV(e),iV(n)];return a===o?String(e.name||``).localeCompare(String(n.name||``)):a>o?-1:1})}function sV(e,t=Date.now()){return(Array.isArray(e)?e:[]).reduce((e,n)=>e+ +!eV(n,t),0)}function cV(){return{open:!1,id:``,name:``,value:``,submitting:!1,error:``}}var lV=new class{#e=A(M([]));get keys(){return L(this.#e)}set keys(e){j(this.#e,e,!0)}#t=A(!0);get available(){return L(this.#t)}set available(e){j(this.#t,e,!0)}#n=A(!1);get loading(){return L(this.#n)}set loading(e){j(this.#n,e,!0)}#r=A(``);get error(){return L(this.#r)}set error(e){j(this.#r,e,!0)}#i=A(``);get filter(){return L(this.#i)}set filter(e){j(this.#i,e,!0)}#a=A(!1);get showInactive(){return L(this.#a)}set showInactive(e){j(this.#a,e,!0)}#o=k(()=>oV(nV(this.keys,{query:this.filter,showInactive:this.showInactive})));get visibleKeys(){return L(this.#o)}set visibleKeys(e){j(this.#o,e)}#s=k(()=>sV(this.keys));get inactiveCount(){return L(this.#s)}set inactiveCount(e){j(this.#s,e)}#c=A(!1);get formOpen(){return L(this.#c)}set formOpen(e){j(this.#c,e,!0)}#l=A(!1);get formSubmitting(){return L(this.#l)}set formSubmitting(e){j(this.#l,e,!0)}#u=A(``);get issuedValue(){return L(this.#u)}set issuedValue(e){j(this.#u,e,!0)}#d=A(``);get deactivatingID(){return L(this.#d)}set deactivatingID(e){j(this.#d,e,!0)}#f=A(``);get dashboardAccessID(){return L(this.#f)}set dashboardAccessID(e){j(this.#f,e,!0)}#p=A(M(qB()));get form(){return L(this.#p)}set form(e){j(this.#p,e,!0)}#m=A(M(cV()));get labelsEditor(){return L(this.#m)}set labelsEditor(e){j(this.#m,e,!0)}copyState=kM({logPrefix:`Failed to copy auth key:`});async fetchKeys(){this.loading=!0,this.error=``;try{let e=await kT(`/admin/auth-keys`,{label:`auth keys`,errorFallback:`Unable to load API keys.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.keys=[];return}if(e.status===`error`){e.result&&(this.available=!0),this.error=e.error;return}this.available=!0,this.keys=e.items}finally{this.loading=!1}}openForm(){this.formSubmitting||this.formOpen||(this.formOpen=!0,this.error=``,this.issuedValue||(this.copyState.reset(),this.form=qB()))}closeForm(){this.formOpen&&(this.formOpen=!1,this.error=``,this.copyState.reset(),!this.formSubmitting&&!this.issuedValue&&(this.form=qB()))}copyIssuedValue(){return this.copyState.copy(this.issuedValue)}dismissIssuedKey(){this.issuedValue=``,this.copyState.reset(),this.form=qB()}async submitForm(){let e=ZB(this.form);if(e.error){this.error=e.error;return}this.error=``,this.formSubmitting=!0;try{let t=await AT(`/admin/auth-keys`,`POST`,e.payload,{label:`create API key`,errorFallback:`Failed to create API key.`,unavailableMessage:`Auth keys feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error,t.result&&t.result.status!==401&&console.error(`Failed to create API key:`,t.result.status,this.error);return}let n=t.result.data||{};this.issuedValue=n.value||``,this.formOpen=!0,this.copyState.reset(),this.form=qB(),this.fetchKeys()}finally{this.formSubmitting=!1}}openLabelsEditor(e){!e||this.labelsEditor.submitting||(this.labelsEditor={open:!0,id:e.id,name:e.name||``,value:(e.labels||[]).join(`, `),submitting:!1,error:``})}closeLabelsEditor(){!this.labelsEditor.open||this.labelsEditor.submitting||(this.labelsEditor=cV())}async submitLabelsEditor(){let e=this.labelsEditor;if(!e.open||e.submitting||!e.id)return;e.submitting=!0,e.error=``;let t={labels:JB(e.value)};try{let n=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/labels`,`PUT`,t,{label:`update API key labels`,errorFallback:`Failed to update labels.`,unavailableMessage:`Auth keys feature is unavailable.`});if(n.status===`stale`)return;if(n.status===`unavailable`){this.available=!1,e.error=n.error;return}if(n.status===`error`){e.error=n.error,n.result&&n.result.status!==401&&console.error(`Failed to update auth key labels:`,n.result.status,e.error);return}Y.success(`Labels updated for key "`+e.name+`".`),e.submitting=!1,this.closeLabelsEditor(),this.fetchKeys()}finally{e.submitting=!1}}async toggleDashboardAccess(e){if(!e||!e.active||this.dashboardAccessID)return;let t=!e.dashboard_access;this.dashboardAccessID=e.id;try{let n=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/dashboard-access`,`PUT`,{dashboard_access:t},{label:`update API key dashboard access`,errorFallback:`Failed to update dashboard access.`,unavailableMessage:`Auth keys feature is unavailable.`});if(n.status===`stale`)return;if(n.status===`unavailable`){this.available=!1,Y.error(n.error);return}if(n.status===`error`){n.result&&n.result.status!==401&&console.error(`Failed to update auth key dashboard access:`,n.result.status,n.error),Y.error(n.error);return}Y.success(`Dashboard access `+(t?`granted to`:`revoked for`)+` key "`+e.name+`".`),this.fetchKeys()}finally{this.dashboardAccessID=``}}async deactivateKey(e){if(!(!e||!e.active)&&window.confirm(`Deactivate key "`+e.name+`"? This cannot be undone.`)){this.deactivatingID=e.id;try{let t=await AT(`/admin/auth-keys/`+encodeURIComponent(e.id)+`/deactivate`,`POST`,void 0,{label:`deactivate API key`,errorFallback:`Failed to deactivate key.`,unavailableMessage:`Auth keys feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,Y.error(t.error);return}if(t.status===`error`){t.result&&t.result.status!==401&&console.error(`Failed to deactivate auth key:`,t.result.status,t.error),Y.error(t.error);return}Y.success(`Key "`+e.name+`" deactivated.`),this.fetchKeys()}finally{this.deactivatingID=``}}}},uV=z(``),dV=z(`

          Store this key securely — it won’t be shown again.

          `),fV=z(``),pV=z(``),mV=z(``),hV=z(``),gV=z(`
          `);function _V(e,t){D(t,!0);{let t=k(()=>lV.issuedValue?``:lV.error),n=k(()=>lV.issuedValue?`Done, I’ve stored it`:`Create API Key`),r=k(()=>lV.issuedValue?Va:mo);ME(e,{get open(){return lV.formOpen},title:`Create API Key`,ariaLabel:`API key editor`,get error(){return L(t)},get submitting(){return lV.formSubmitting},get submitLabel(){return L(n)},submittingLabel:`Creating...`,get submitIcon(){return L(r)},cancel:!1,dialogClass:`auth-key-editor`,onclose:()=>lV.closeForm(),onsubmit:()=>lV.issuedValue?lV.dismissIssuedKey():lV.submitForm(),children:(e,t)=>{var n=Zr(),r=P(n),i=e=>{var t=dV(),n=F(N(t),2),r=N(n),i=N(r,!0);E(r),OL(F(r,2),{get state(){return lV.copyState},onclick:()=>lV.copyIssuedValue()}),E(n);var a=F(n,2),o=e=>{B(e,uV())};H(a,e=>{lV.copyState.error&&e(o)}),E(t),I(()=>V(i,lV.issuedValue)),B(e,t)},a=e=>{var t=gV(),n=N(t),r=N(n),i=F(N(r),2);ta(i),E(r);var a=F(r,2),o=F(N(a),2);ta(o),E(a),E(n);var s=F(n,2),c=N(s);iC(c,{copyId:`auth-key-user-path-help-copy`,label:`API key user path help`,title:e=>{B(e,fV())},help:e=>{He(),B(e,Xr(`When set, this key overrides the configured user path request - header for audit logging and downstream request context.`))},$$slots:{title:!0,help:!0}});var l=F(c,2);ta(l),E(s);var u=F(s,2),d=N(u);iC(d,{copyId:`auth-key-labels-help-copy`,label:`API key labels help`,title:e=>{B(e,pV())},help:e=>{He(),B(e,Xr(`Every request authenticated with this key gets these labels, in - addition to any labels from tagging headers. Labels show up in - usage analytics, the request log, and audit logs.`))},$$slots:{title:!0,help:!0}});var f=F(d,2);ta(f),E(u);var p=F(u,2),m=N(p);iC(m,{copyId:`auth-key-dashboard-access-help-copy`,label:`API key dashboard access help`,title:e=>{B(e,mV())},help:e=>{He(),B(e,Xr(`When off, this key is denied the dashboard and every /admin API - endpoint. Model endpoints and GET /v1/usage stay available to - the key. The master key always has dashboard access.`))},$$slots:{title:!0,help:!0}});var h=F(m,2),g=N(h);ta(g),He(2),E(h),E(p),PE(F(p,2),{id:`auth-key-description`,label:`Description (optional)`,children:(e,t)=>{var n=hV();dt(n),ua(n,()=>lV.form.description,e=>lV.form.description=e),B(e,n)},$$slots:{default:!0}}),E(t),ua(i,()=>lV.form.name,e=>lV.form.name=e),ua(o,()=>lV.form.expires_at,e=>lV.form.expires_at=e),ua(l,()=>lV.form.user_path,e=>lV.form.user_path=e),ua(f,()=>lV.form.labels,e=>lV.form.labels=e),da(g,()=>lV.form.dashboard_access,e=>lV.form.dashboard_access=e),B(e,t)};H(r,e=>{lV.issuedValue?e(i):e(a,-1)}),B(e,n)},$$slots:{default:!0}})}O()}var vV=z(`

          `),yV=z(`

          Applies to new requests made with this key. Leave empty to remove all labels.

          `,1);function bV(e,t){D(t,!0),ME(e,{get open(){return lV.labelsEditor.open},title:`Edit Labels`,ariaLabel:`API key labels editor`,get error(){return lV.labelsEditor.error},get submitting(){return lV.labelsEditor.submitting},submitLabel:`Save Labels`,cancel:!1,dialogClass:`auth-key-editor`,onclose:()=>lV.closeLabelsEditor(),onsubmit:()=>lV.submitLabelsEditor(),headerHint:e=>{var t=vV(),n=N(t,!0);E(t),I(()=>V(n,lV.labelsEditor.name)),B(e,t)},children:(e,t)=>{PE(e,{id:`auth-key-labels-edit`,label:`Labels (comma-separated)`,children:(e,t)=>{var n=yV(),r=P(n);ta(r),He(2),ua(r,()=>lV.labelsEditor.value,e=>lV.labelsEditor.value=e),B(e,n)},$$slots:{default:!0}})},$$slots:{headerHint:!0,default:!0}}),O()}var xV=z(` `),SV=z(`
          `),CV=z(``),wV=z(`Expired`),TV=z(` `),EV=z(` `,1),DV=z(`Deactivated`),OV=z(`
          `),kV=z(`
          NameDescriptionUser PathLabelsTokenDashboard Access ExpiresCreated
          `);function AV(e,t){D(t,!0);var n=kV(),r=N(n),i=N(r),a=N(i),o=F(N(a),5),s=N(o);q(F(N(s)),{get icon(){return to},width:`13`,height:`13`}),E(s),E(o),He(3),E(a),E(i);var c=F(i);U(c,21,()=>lV.visibleKeys,e=>e.id,(e,t)=>{var n=OV();let r;var i=N(n),a=N(i,!0);E(i);var o=F(i),s=N(o,!0);E(o);var c=F(o),l=N(c,!0);E(c);var u=F(c),d=N(u),f=e=>{var n=SV();U(n,20,()=>L(t).labels||[],e=>e,(e,t)=>{var n=xV(),r=N(n,!0);E(n),I(e=>{Vi(n,e),V(r,t)},[()=>eb(t)]),B(e,n)}),E(n),B(e,n)},p=e=>{B(e,CV())};H(d,e=>{(L(t).labels||[]).length>0?e(f):e(p,-1)}),E(u);var m=F(u),h=N(m),g=N(h,!0);E(h),E(m);var _=F(m),v=N(_);let y;var b=N(v,!0);E(v),E(_);var x=F(_),S=N(x),C=e=>{var n=TV(),r=N(n),i=N(r,!0);E(r);var a=F(r,2),o=e=>{B(e,wV())},s=k(()=>QB(L(t)));H(a,e=>{L(s)&&e(o)}),E(n),I(e=>V(i,e),[()=>wc(L(t).expires_at)]),B(e,n)},w=e=>{B(e,Xr(`—`))};H(S,e=>{L(t).expires_at?e(C):e(w,-1)}),E(x);var T=F(x),ee=N(T,!0);E(T);var te=F(T),ne=N(te),re=N(ne),ie=e=>{var n=EV(),r=P(n);{let e=k(()=>(L(t).dashboard_access?`Revoke dashboard access for API key `:`Grant dashboard access to API key `)+L(t).name),n=k(()=>!!lV.dashboardAccessID);OT(r,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>lV.toggleDashboardAccess(L(t)),get disabled(){return L(n)},children:(e,n)=>{{let n=k(()=>L(t).dashboard_access?To:wo);q(e,{get icon(){return L(n)},class:`table-icon-svg`})}},$$slots:{default:!0}})}var i=F(r,2);{let e=k(()=>`Edit labels for API key `+L(t).name);OT(i,{get label(){return L(e)},class:`table-icon-btn`,onclick:()=>lV.openLabelsEditor(L(t)),children:(e,t)=>{q(e,{get icon(){return fo},class:`table-icon-svg`})},$$slots:{default:!0}})}var a=F(i,2);{let e=k(()=>(lV.deactivatingID===L(t).id?`Deactivating API key `:`Deactivate API key `)+L(t).name),n=k(()=>lV.deactivatingID===L(t).id);OT(a,{get label(){return L(e)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>lV.deactivateKey(L(t)),get disabled(){return L(n)},children:(e,t)=>{q(e,{get icon(){return ho},class:`table-icon-svg`})},$$slots:{default:!0}})}B(e,n)},ae=e=>{var n=DV();I(e=>G(n,`title`,e),[()=>L(t).deactivated_at?`Deactivated on `+Tc(L(t).deactivated_at):`Deactivated`]),B(e,n)},oe=k(()=>$B(L(t)));H(re,e=>{L(t).active?e(ie):L(oe)&&e(ae,1)}),E(ne),E(te),E(n),I((e,i,o)=>{r=W(n,1,`svelte-nf0ldb`,null,r,e),V(a,L(t).name),V(s,L(t).description||`—`),V(l,L(t).user_path||`—`),V(g,L(t).redacted_value),y=W(v,1,`auth-key-status-badge`,null,y,{"auth-key-status-active":L(t).dashboard_access,"auth-key-status-inactive":!L(t).dashboard_access}),V(b,L(t).dashboard_access?`Allowed`:`Denied`),G(x,`title`,i),V(ee,o)},[()=>({"auth-key-row-deactivated":$B(L(t))}),()=>L(t).expires_at?Tc(L(t).expires_at):``,()=>ys.formatTimestamp(L(t).created_at)]),B(e,n)}),E(c),E(r),E(n),B(e,n),O()}var jV=z(``),MV=z(`
          API key management is unavailable.
          `),NV=z(``),PV=z(`

          Managed API keys authenticate requests to the gateway. Deactivation is - permanent — create a new key if access needs to be restored.

          `),FV=z(`
          `),IV=z(`
          `),LV=z(`

          `),RV=z(`

          No API keys yet. Issue a key to get started.

          `),zV=z(`
          `);function BV(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`auth-keys`&&lV.fetchKeys()});var n=zV(),r=N(n),i=F(N(r),2),a=N(i),o=e=>{var t=jV();q(N(t),{get icon(){return mo},class:`table-icon-svg`}),He(2),E(t),I(()=>t.disabled=lV.formSubmitting),R(`click`,t,()=>{lV.formSubmitting||lV.openForm()}),B(e,t)};H(a,e=>{lV.available&&!J.authError&&e(o)}),E(i),E(r);var s=F(r,2),c=e=>{B(e,MV())};H(s,e=>{!lV.available&&!J.authError&&e(c)});var l=F(s,2),u=e=>{var t=NV(),n=N(t,!0);E(t),I(()=>V(n,lV.error)),B(e,t)};H(l,e=>{lV.error&&!J.authError&&!lV.formOpen&&e(u)});var d=F(l,2),f=e=>{B(e,PV())};H(d,e=>{lV.available&&!J.authError&&e(f)});var p=F(d,2);_V(p,{});var m=F(p,2);bV(m,{});var h=F(m,2),g=e=>{var t=FV();NS(N(t),{size:18,label:`Loading API keys`}),E(t),B(e,t)};H(h,e=>{lV.loading&&lV.keys.length===0&&e(g)});var _=F(h,2),v=e=>{var t=IV(),n=N(t);jw(N(n),{placeholder:`Filter by name, description, user path, label, or token...`,label:`Filter API keys by name, description, user path, label, or token`,get value(){return lV.filter},set value(e){lV.filter=e}}),E(n);var r=F(n,2),i=N(r),a=N(i);ta(a);var o=F(a,2),s=F(N(o)),c=e=>{var t=Xr();I(()=>V(t,`(${lV.inactiveCount??``})`)),B(e,t)};H(s,e=>{lV.inactiveCount>0&&e(c)}),E(o),E(i),E(r),E(t),da(a,()=>lV.showInactive,e=>lV.showInactive=e),B(e,t)};H(_,e=>{lV.keys.length>0&&lV.available&&e(v)});var y=F(_,2),b=e=>{AV(e,{})};H(y,e=>{lV.visibleKeys.length>0&&lV.available&&e(b)});var x=F(y,2),S=e=>{var t=LV(),n=N(t);E(t),I(()=>V(n,`No API keys match the current filter.${lV.inactiveCount>0&&!lV.showInactive?` `+lV.inactiveCount+` inactive `+(lV.inactiveCount===1?`key is`:`keys are`)+` hidden.`:``}`)),B(e,t)};H(x,e=>{lV.keys.length>0&&lV.visibleKeys.length===0&&lV.available&&e(S)});var C=F(x,2),w=e=>{B(e,RV())};H(C,e=>{lV.keys.length===0&&!lV.loading&&!J.authError&&!lV.error&&lV.available&&e(w)}),E(n),B(e,n),O()}Vr([`click`]);var VV=z(`

          Timezone

          `),HV=z(``),UV=z(``),WV=z(`
          `,1);function GV(e,t){D(t,!0);function n(){ys.saveOverride(),J.refresh()}function r(){ys.clearOverride(),J.refresh()}var i=WV(),a=P(i);iC(N(a),{copyId:`timezone-help-copy`,label:`timezone help`,text:`Day-based analytics, charts, and date filters use your effective timezone. Usage and audit logs keep UTC in the hover title while rendering row timestamps in your effective timezone.`,title:e=>{B(e,VV())},$$slots:{title:!0}}),E(a);var o=F(a,2),s=N(o),c=F(N(s),2),l=N(c),u=N(l);E(l),l.value=l.__value=``,U(F(l),17,()=>ys.options,e=>e.value,(e,t)=>{var n=HV(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(c),E(s),E(o);var d=F(o,2),f=N(d),p=e=>{var t=UV();R(`click`,t,r),B(e,t)};H(f,e=>{ys.override&&e(p)}),E(d),I(e=>V(u,`Automatic (${e??``})`),[()=>ys.detectedTimeZoneLabel()]),Br(`focus`,c,()=>ys.ensureOptions()),R(`change`,c,n),Wi(c,()=>ys.override,e=>ys.override=e),B(e,i),O()}Vr([`change`,`click`]);var KV=z(``),qV=z(`

          Failover

          `,1);function JV(e,t){D(t,!0);let n=k(()=>Q.failoverSaving||Q.failoverGenerating||Q.failoverDraftSaving||!Q.failoverAvailable||!Q.failoverEnabled());var r=qV(),i=P(r),a=F(N(i),2),o=N(a),s=N(o);q(s,{get icon(){return Io},class:`form-action-icon`});var c=F(s,2),l=N(c,!0);E(c),E(o);var u=F(o,2);q(N(u),{get icon(){return jo},class:`form-action-icon`}),He(2),E(u),E(a),E(i);var d=F(i,2),f=N(d),p=e=>{var t=KV(),n=N(t,!0);E(t),I(()=>V(n,Q.failoverError)),B(e,t)};H(f,e=>{Q.failoverError&&e(p)}),E(d),wj(F(d,2),{}),I(()=>{o.disabled=L(n),V(l,Q.failoverGenerating?`Generating...`:`Generate failover models automatically`),u.disabled=L(n)}),R(`click`,o,()=>Q.generateFailoverRules()),R(`click`,u,()=>Q.openFailoverResetDialog()),B(e,r),O()}Vr([`click`]);function YV(){return{daily_reset_hour:0,daily_reset_minute:0,weekly_reset_weekday:1,weekly_reset_hour:0,weekly_reset_minute:0,monthly_reset_day:1,monthly_reset_hour:0,monthly_reset_minute:0}}function XV(e,t){let n=t||{},r=(e,t)=>{if(e===``)return t;let n=Number(e);return Number.isFinite(n)&&Number.isInteger(n)?Math.trunc(n):t},i=(e,t)=>r(n[e],t),a=(t,n)=>e?r(e[t],n):n;return{daily_reset_hour:a(`daily_reset_hour`,i(`daily_reset_hour`,0)),daily_reset_minute:a(`daily_reset_minute`,i(`daily_reset_minute`,0)),weekly_reset_weekday:a(`weekly_reset_weekday`,i(`weekly_reset_weekday`,1)),weekly_reset_hour:a(`weekly_reset_hour`,i(`weekly_reset_hour`,0)),weekly_reset_minute:a(`weekly_reset_minute`,i(`weekly_reset_minute`,0)),monthly_reset_day:a(`monthly_reset_day`,i(`monthly_reset_day`,1)),monthly_reset_hour:a(`monthly_reset_hour`,i(`monthly_reset_hour`,0)),monthly_reset_minute:a(`monthly_reset_minute`,i(`monthly_reset_minute`,0))}}function ZV(){return[{value:0,label:`Sunday`},{value:1,label:`Monday`},{value:2,label:`Tuesday`},{value:3,label:`Wednesday`},{value:4,label:`Thursday`},{value:5,label:`Friday`},{value:6,label:`Saturday`}]}var QV=z(`

          Budget Resets

          `),$V=z(``),eH=z(`

          If the selected day does not exist in a month, the reset runs on - the last day of that month.

          `),tH=z(``),nH=z(``),rH=z(`
          Monthly
          Weekly
          Daily
          `,1);function iH(e,t){D(t,!0);let n=A(M(YV())),r=A(!1),i=A(!1),a=A(``),o=A(!1),s=k(()=>As.budgetsVisible());async function c(){if(await As.ensureLoaded(),!As.budgetsVisible()){j(a,``);return}j(r,!0),j(a,``);try{let e=await Ts(`/admin/budgets/settings`,{label:`budget settings`});if(e.stale)return;if(!e.ok){j(a,`Unable to load budget settings.`);return}j(n,XV(e.data,L(n)),!0)}catch(e){console.error(`Failed to fetch budget settings:`,e),j(a,`Unable to load budget settings.`)}finally{j(r,!1)}}async function l(){if(!L(i)){j(i,!0);try{let e=await Es(`/admin/budgets/settings`,`PUT`,XV(L(n),L(n)),{label:`budget settings`});if(e.stale)return;if(!e.ok){Y.error(`Unable to save budget settings.`);return}j(n,XV(e.data,L(n)),!0),j(a,``),Y.success(`Budget settings saved.`)}catch(e){console.error(`Failed to save budget settings:`,e),Y.error(`Unable to save budget settings.`)}finally{j(i,!1)}}}kn(()=>{J.refreshTick,c()});var u=Zr(),d=P(u),f=e=>{var t=rH(),s=P(t),c=N(s);iC(c,{copyId:`budget-settings-help-copy`,label:`budget help`,text:`Budget reset anchors are stored in the database and evaluated in UTC. Hourly budgets reset at the top of each hour.`,title:e=>{B(e,QV())},$$slots:{title:!0}});var u=F(c,2),d=N(u),f=F(N(d),2),p=N(f);iC(p,{copyId:`budget-monthly-day-help-copy`,label:`day of month help`,external:!0,get open(){return L(o)},set open(e){j(o,e,!0)},title:e=>{B(e,$V())},$$slots:{title:!0}});var m=F(p,2);ta(m),E(f);var h=F(f,2),g=F(N(h),2);ta(g),E(h);var _=F(h,2),v=F(N(_),2);ta(v),E(_);var y=F(_,2),b=N(y),x=e=>{B(e,eH())};H(b,e=>{L(o)&&e(x)}),E(y),E(d);var S=F(d,2),C=F(N(S),2),w=F(N(C),2);U(w,21,ZV,e=>e.value,(e,t)=>{var n=tH(),r=N(n,!0);E(n);var i={};I(()=>{V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(w),E(C);var T=F(C,2),ee=F(N(T),2);ta(ee),E(T);var te=F(T,2),ne=F(N(te),2);ta(ne),E(te),He(2),E(S);var re=F(S,2),ie=F(N(re),4),ae=F(N(ie),2);ta(ae),E(ie);var oe=F(ie,2),se=F(N(oe),2);ta(se),E(oe),He(2),E(re),E(u);var ce=F(u,2),le=N(ce);q(N(le),{get icon(){return vo},class:`form-action-icon`}),He(2),E(le);var ue=F(le,2),de=e=>{NS(e,{size:16,label:`Loading budget settings`})};H(ue,e=>{L(r)&&e(de)}),E(ce),E(s);var fe=F(s,2),pe=N(fe),me=e=>{var t=nH(),n=N(t,!0);E(t),I(()=>V(n,L(a))),B(e,t)};H(pe,e=>{L(a)&&e(me)}),E(fe),I(()=>{le.disabled=L(i)||L(r),G(le,`aria-busy`,L(i)?`true`:`false`)}),ua(m,()=>L(n).monthly_reset_day,e=>L(n).monthly_reset_day=e),ua(g,()=>L(n).monthly_reset_hour,e=>L(n).monthly_reset_hour=e),ua(v,()=>L(n).monthly_reset_minute,e=>L(n).monthly_reset_minute=e),Wi(w,()=>L(n).weekly_reset_weekday,e=>L(n).weekly_reset_weekday=e),ua(ee,()=>L(n).weekly_reset_hour,e=>L(n).weekly_reset_hour=e),ua(ne,()=>L(n).weekly_reset_minute,e=>L(n).weekly_reset_minute=e),ua(ae,()=>L(n).daily_reset_hour,e=>L(n).daily_reset_hour=e),ua(se,()=>L(n).daily_reset_minute,e=>L(n).daily_reset_minute=e),R(`click`,le,l),B(e,t)};H(d,e=>{L(s)&&e(f)}),B(e,u),O()}Vr([`click`]);var aH=z(`

          Reset All Budgets

          Start new budget periods for every configured budget without changing - the limits.

          `);function oH(e,t){D(t,!0);var n=Zr(),r=P(n),i=e=>{var t=aH(),n=F(N(t),2),r=N(n);q(N(r),{get icon(){return _o},class:`form-action-icon`}),He(2),E(r),E(n),E(t),I(()=>r.disabled=X.resetAllLoading),R(`click`,r,()=>X.openResetDialog()),B(e,t)},a=k(()=>As.budgetsVisible());H(r,e=>{L(a)&&e(i)}),B(e,n),O()}Vr([`click`]);function sH(){return{header:``,prefix:``,do_not_pass:!1,delimiter:``,managed:!1}}function cH(e){return(e&&Array.isArray(e.headers)?e.headers:[]).map(e=>({header:typeof e.header==`string`?e.header:``,prefix:typeof e.prefix==`string`?e.prefix:``,do_not_pass:e.do_not_pass===!0,delimiter:typeof e.delimiter==`string`&&e.delimiter!==`,`?e.delimiter:``,managed:e.managed===!0}))}function lH(e){return{headers:(Array.isArray(e)?e:[]).filter(e=>!e.managed&&e.header.trim()!==``).map(e=>({header:e.header.trim(),prefix:e.prefix,do_not_pass:e.do_not_pass,delimiter:e.delimiter}))}}function uH(e){return e&&e.error&&e.error.message?e.error.message:``}var dH=z(`

          Tagging based on headers

          `),fH=z(`config`),pH=z(``),mH=z(`
          `),hH=z(`

          No tagging headers configured. Requests are not labelled.

          `),gH=z(``),_H=z(`
          `,1);function vH(e,t){D(t,!0);let n=A(M([])),r=A(!0),i=A(!1),a=A(!1),o=A(``);function s(){L(n).push(sH())}function c(e){let t=L(n)[e];!t||t.managed||L(n).splice(e,1)}async function l(){j(i,!0),j(o,``);try{let e=await Ts(`/admin/tagging/settings`,{label:`tagging settings`});if(e.stale)return;if(!e.ok){j(o,`Unable to load tagging settings.`);return}j(n,cH(e.data),!0),j(r,e.data&&e.data.editable!==!1,!0)}catch(e){console.error(`Failed to fetch tagging settings:`,e),j(o,`Unable to load tagging settings.`)}finally{j(i,!1)}}async function u(){if(!(L(a)||!L(r))){j(a,!0);try{let e=await Es(`/admin/tagging/settings`,`PUT`,lH(L(n)),{label:`tagging settings`});if(e.stale)return;if(!e.ok){Y.error(e.status!==401&&uH(e.data)||`Unable to save tagging settings.`);return}j(n,cH(e.data),!0),j(r,e.data&&e.data.editable!==!1,!0),j(o,``),Y.success(`Tagging settings saved.`)}catch(e){console.error(`Failed to save tagging settings:`,e),Y.error(`Unable to save tagging settings.`)}finally{j(a,!1)}}}kn(()=>{J.refreshTick,l()});var d=_H(),f=P(d),p=N(f);iC(p,{copyId:`tagging-settings-help-copy`,label:`tagging help`,text:`Each request is labelled from the listed headers; labels land in usage tracking and audit logs. A header value can carry several labels split by the delimiter (default: comma). The prefix is trimmed from each label only — the header itself is forwarded unchanged unless 'Do not pass' is checked. Rows marked CONFIG come from config.yaml or TAGGING_HEADER_* env vars and are read-only here.`,title:e=>{B(e,dH())},$$slots:{title:!0}});var m=F(p,2),h=N(m);U(h,17,()=>L(n),ai,(e,t,n)=>{var i=mH(),a=N(i),o=N(a);G(o,`for`,`tagging-header-`+n);var s=F(o,2);ta(s),G(s,`id`,`tagging-header-`+n),E(a);var l=F(a,2),u=N(l);G(u,`for`,`tagging-prefix-`+n);var d=F(u,2);ta(d),G(d,`id`,`tagging-prefix-`+n),E(l);var f=F(l,2),p=N(f);G(p,`for`,`tagging-delimiter-`+n);var m=F(p,2);ta(m),G(m,`id`,`tagging-delimiter-`+n),E(f);var h=F(f,2),g=N(h);ta(g),He(2),E(h);var _=F(h,2),v=N(_),y=e=>{B(e,fH())},b=e=>{var i=pH();I(()=>{i.disabled=!L(r),G(i,`aria-label`,`Remove tagging header `+(L(t).header||n+1))}),R(`click`,i,()=>c(n)),B(e,i)};H(v,e=>{L(t).managed?e(y):e(b,-1)}),E(_),E(i),I(()=>{s.disabled=L(t).managed||!L(r),d.disabled=L(t).managed||!L(r),m.disabled=L(t).managed||!L(r),g.disabled=L(t).managed||!L(r)}),ua(s,()=>L(t).header,e=>L(t).header=e),ua(d,()=>L(t).prefix,e=>L(t).prefix=e),ua(m,()=>L(t).delimiter,e=>L(t).delimiter=e),da(g,()=>L(t).do_not_pass,e=>L(t).do_not_pass=e),B(e,i)});var g=F(h,2),_=e=>{NS(e,{size:16,label:`Loading tagging settings`})};H(g,e=>{L(i)&&e(_)});var v=F(g,2),y=e=>{B(e,hH())};H(v,e=>{!L(i)&&L(n).length===0&&e(y)}),E(m);var b=F(m,2),x=N(b);q(N(x),{get icon(){return mo},class:`form-action-icon`}),He(2),E(x);var S=F(x,2);q(N(S),{get icon(){return vo},class:`form-action-icon`}),He(2),E(S),E(b),E(f);var C=F(f,2),w=N(C),T=e=>{var t=gH(),n=N(t,!0);E(t),I(()=>V(n,L(o))),B(e,t)};H(w,e=>{L(o)&&e(T)}),E(C),I(()=>{x.disabled=!L(r)||L(a)||L(i),S.disabled=!L(r)||L(a)||L(i),G(S,`aria-busy`,L(a)?`true`:`false`)}),R(`click`,x,s),R(`click`,S,u),B(e,d),O()}Vr([`click`]);function yH(e){let t=e||{};if(t.selectedPreset)return{days:parseInt(t.selectedPreset,10)||30};let n=t.customStartDate?Cc(t.customStartDate):``,r=t.customEndDate||t.today||null;return{start_date:n,end_date:r?Cc(r):``}}function bH(e,t,n,r){return{...yH(e),user_path:String(t||``).trim(),selector:String(n||``).trim(),confirmation:r}}function xH(e){let t=Number(e&&e.matched||0),n=Number(e&&e.recalculated||0),r=Number(e&&e.without_pricing||0),i=`Pricing recalculated for `+n+` of `+t+` usage record`+(t===1?``:`s`)+`.`;return r>0&&(i+=` `+r+` usage record`+(r===1?` still lacks`:`s still lack`)+` pricing metadata.`),i}var SH=z(`

          Usage Pricing Recalculation

          `),CH=z(`
          `);function wH(e,t){D(t,!0);let n=A(``),r=A(``),i=A(!1),a=k(()=>As.booleanFlag(`USAGE_PRICING_RECALCULATION_ENABLED`,!1));function o(){if(!L(a)){Y.error(`Usage pricing recalculation is unavailable.`);return}L(i)||Ys.open({title:`Recalculate Pricing`,titleId:`pricingRecalculateDialogTitle`,inputId:`pricing-recalculate-confirmation`,requiredText:`recalculate`,confirmLabel:`Recalculate Pricing`,icon:Ia,dialogClass:`pricing-recalculate-dialog`,message:`Stored usage cost fields matching the selected filters will be overwritten.`,onConfirm:()=>s()})}async function s(){if(!L(a)){Y.error(`Usage pricing recalculation is unavailable.`);return}if(!L(i)){j(i,!0);try{let e=await Es(`/admin/usage/recalculate-pricing`,`POST`,bH({selectedPreset:Uc.selectedPreset,customStartDate:Uc.customStartDate,customEndDate:Uc.customEndDate,today:ys.todayDate()},L(n),L(r),`recalculate`),{label:`pricing recalculation`});if(e.stale)return;if(!e.ok){Ys.error=`Unable to recalculate pricing.`;return}Ys.close(),Y.success(xH(e.data)),Yc.fetchUsage()}catch(e){console.error(`Failed to recalculate pricing:`,e),Ys.error=`Unable to recalculate pricing.`}finally{j(i,!1)}}}var c=Zr(),l=P(c),u=e=>{var t=CH(),s=N(t);iC(s,{copyId:`pricing-recalculate-help-copy`,label:`pricing recalculation help`,text:`Recalculate stored input, output, total, and Pro Saved costs from the current model pricing metadata. This overwrites matching historical cost fields. Filters are applied to the selected date range, user path subtree, and provider/model selector or alias.`,title:e=>{B(e,SH())},$$slots:{title:!0}});var c=F(s,2),l=N(c),u=F(N(l),2);fl(N(u),{}),E(u),E(l);var d=F(l,2),f=F(N(d),2);ta(f),E(d);var p=F(d,2),m=F(N(p),2);ta(m),E(p),E(c);var h=F(c,2),g=N(h);q(N(g),{get icon(){return Ia},class:`form-action-icon`}),He(2),E(g),E(h),E(t),I(()=>{g.disabled=L(i)||!L(a),G(g,`aria-busy`,L(i)?`true`:`false`)}),ua(f,()=>L(n),e=>j(n,e)),ua(m,()=>L(r),e=>j(r,e)),R(`click`,g,o),B(e,t)};H(l,e=>{L(a)&&e(u)}),B(e,c),O()}Vr([`click`]);function TH(e){return String(e&&e.status||`ok`).toLowerCase()}function EH(e){if(!e||typeof e!=`object`)return`Runtime refresh completed.`;let t=Number(e.model_count||0),n=Number(e.provider_count||0),r=TH(e);return(r===`ok`?`Runtime refreshed.`:r===`partial`?`Runtime refresh completed with warnings.`:`Runtime refresh failed.`)+` `+t+` model`+(t===1?``:`s`)+` across `+n+` provider`+(n===1?``:`s`)+`.`}function DH(e){return!!e&&TH(e)===`ok`}function OH(e){let t=e&&e.steps;return Array.isArray(t)?t:[]}function kH(e){let t=String(e&&e.name||``).replace(/_/g,` `),n=String(e&&e.status||``).trim(),r=String(e&&(e.error||e.message)||``).trim();return t?r?t+`: `+n+` - `+r:t+`: `+n:r||n||``}var AH=z(`

          Runtime Refresh

          `),jH=z(`
        • `),MH=z(`
            `),NH=z(`
            `,1);function PH(e,t){D(t,!0);let n=A(!1),r=A(null);async function i(){if(!L(n)){j(n,!0),j(r,null);try{let e=await Es(`/admin/runtime/refresh`,`POST`,void 0,{label:`runtime refresh`});if(e.stale)return;if(!e.ok){Y.error(`Runtime refresh failed.`);return}j(r,e.data&&typeof e.data==`object`?e.data:null,!0),DH(L(r))?Y.success(EH(L(r))):Y.error(EH(L(r))),J.refresh()}catch(e){console.error(`Failed to refresh runtime:`,e),Y.error(`Runtime refresh failed.`)}finally{j(n,!1)}}}var a=NH(),o=P(a),s=N(o);iC(s,{copyId:`runtime-refresh-help-copy`,label:`runtime refresh help`,text:`Pull the latest model metadata, provider inventory, API keys, aliases, model access rules, guardrails, and workflows.`,title:e=>{B(e,AH())},$$slots:{title:!0}});var c=F(s,2),l=N(c);let u;q(N(l),{get icon(){return go},class:`settings-refresh-icon`}),He(2),E(l),E(c),E(o);var d=F(o,2),f=N(d),p=e=>{var t=MH();U(t,21,()=>OH(L(r)),e=>e.name,(e,t)=>{var n=jH(),r=N(n,!0);E(n),I(e=>{W(n,1,`runtime-refresh-step is-${L(t).status??``}`,`svelte-yeq2mp`),V(r,e)},[()=>kH(L(t))]),B(e,n)}),E(t),B(e,t)},m=k(()=>OH(L(r)).length>0);H(f,e=>{L(m)&&e(p)}),E(d),I(()=>{u=W(l,1,`btn btn-primary btn-with-icon settings-refresh-btn`,null,u,{"is-refreshing":L(n)}),l.disabled=L(n),G(l,`aria-busy`,L(n)?`true`:`false`)}),R(`click`,l,i),B(e,a),O()}Vr([`click`]);var FH=z(``),IH=z(`

            `),LH=z(`

            `),RH=z(``),zH=z(`
            `),BH=z(`

            AI Processing

            `);function VH(e,t){D(t,!0);let n=A(M([])),r=A(!1),i=A(``),a=A(``);async function o(){j(r,!0),j(a,``);try{let e=await Ts(`/admin/runtime/settings`,{label:`runtime settings`});if(e.stale)return;if(!e.ok){j(a,`Unable to load runtime settings.`);return}j(n,Array.isArray(e.data?.settings)?e.data.settings:[],!0)}catch(e){console.error(`Failed to load runtime settings:`,e),j(a,`Unable to load runtime settings.`)}finally{j(r,!1)}}async function s(e,t,r){if(!(e.locked||L(i))){j(i,e.key,!0);try{let i=await Es(`/admin/runtime/settings/${encodeURIComponent(e.key)}`,`PUT`,{value:t},{label:`save ${e.label}`});if(i.stale){r.value=e.value;return}if(!i.ok){r.value=e.value,Y.error(`Unable to save ${e.label}.`);return}j(n,L(n).map(t=>t.key===e.key?i.data:t),!0),Y.success(`${e.label} saved.`)}catch(t){r.value=e.value,console.error(`Failed to save runtime setting:`,t),Y.error(`Unable to save ${e.label}.`)}finally{j(i,``)}}}kn(()=>{J.refreshTick,o()});var c=Zr(),l=P(c),u=e=>{var t=BH(),o=N(t),c=F(N(o),2),l=e=>{var t=FH(),n=N(t,!0);E(t),I(()=>V(n,L(a))),B(e,t)};H(c,e=>{L(a)&&e(l)}),E(o);var u=F(o,2);U(u,21,()=>L(n),e=>e.key,(e,t)=>{var n=zH(),r=N(n),a=N(r),o=N(a,!0);E(a);var c=F(a,2),l=e=>{var n=IH(),r=N(n,!0);E(n),I(()=>V(r,L(t).description)),B(e,n)};H(c,e=>{L(t).description&&e(l)});var u=F(c,2),d=e=>{var n=LH(),r=N(n);E(n),I(()=>V(r,`Managed by ${(L(t).managed_by||`environment`)??``}`)),B(e,n)};H(u,e=>{L(t).locked&&e(d)}),E(r);var f=F(r,2);U(f,21,()=>L(t).options||[],e=>e.value,(e,t)=>{var n=RH(),r=N(n,!0);E(n);var i={};I(()=>{G(n,`title`,L(t).description||``),V(r,L(t).label),i!==(i=L(t).value)&&(n.value=(n.__value=L(t).value)??``)}),B(e,n)}),E(f);var p;Ui(f),E(n),I(()=>{G(a,`for`,`runtime-setting-${L(t).key}`),V(o,L(t).label),G(f,`id`,`runtime-setting-${L(t).key}`),f.disabled=L(t).locked||L(i)!==``,p!==(p=L(t).value)&&(f.value=(f.__value=L(t).value)??``,Hi(f,L(t).value))}),R(`change`,f,e=>s(L(t),e.currentTarget.value,e.currentTarget)),B(e,n)}),E(u),E(t),I(()=>G(u,`aria-busy`,L(r)?`true`:`false`)),B(e,t)};H(l,e=>{(L(n).length>0||L(a))&&e(u)}),B(e,c),O()}Vr([`change`]);var HH=z(`
            `);function UH(e,t){D(t,!0),kn(()=>{J.refreshTick,Xo.page===`settings`&&(ys.ensureOptions(),As.ensureLoaded())});var n=HH(),r=F(N(n),2),i=N(r);GV(i,{});var a=F(i,2);JV(a,{});var o=F(a,2);iH(o,{});var s=F(o,2);oH(s,{});var c=F(s,2);vH(c,{});var l=F(c,2);VH(l,{});var u=F(l,2);wH(u,{}),PH(F(u,2),{}),E(r);var d=F(r,2),f=N(d,!0);E(d),E(n),I(e=>V(f,e),[()=>Go()]),B(e,n),O()}var WH=z(`
            `),GH=z(`
             
            `),KH=z(`
             
            `),qH=z(`
             
            `),JH=z(`
            `),YH=z(`
            `,1),XH=z(`
            `);function ZH(e,t){D(t,!0);let n=K(t,`showPromptCache`,3,!0),r=kM({logPrefix:`Failed to copy interaction message:`}),i=k(()=>t.msg.role===`function_call`||t.msg.role===`function_result`);function a(e){return(Math.max(0,Math.min(1,Number(e||0)))*100).toFixed(1)+`%`}function o(e){let t=Math.max(0,Math.min(1,Number(e||0)));return t>0?Math.round(t*100)+`% of this visible prompt item is estimated provider-cached`:void 0}function s(e){return e.role===`function_call`?(e.toolCalls||[]).map(e=>e.name+`()`).join(`, `):(e.functionName?e.functionName+`: `:``)+e.text}var c=XH();let l;var u=N(c),d=e=>{var r=GH(),i=N(r),a=N(i),c=N(a,!0);E(a);var l=F(a,2),u=N(l,!0);E(l);var d=F(l,2),f=N(d,!0);E(d),E(i);var p=F(i,2),m=e=>{var n=WH(),r=N(n);E(n),I(()=>V(r,`Call ID: ${t.msg.functionCallID??``}`)),B(e,n)};H(p,e=>{t.msg.functionCallID&&e(m)});var h=F(p,2),g=e=>{var n=Zr();U(P(n),17,()=>t.msg.toolCalls,ai,(e,n)=>{var r=Zr(),i=P(r),a=e=>{var r=WH(),i=N(r);E(r),I(()=>V(i,`Call ID${t.msg.toolCalls.length>1?` (`+L(n).name+`)`:``}: ${L(n).id??``}`)),B(e,r)};H(i,e=>{L(n).id&&e(a)}),B(e,r)}),B(e,n)};H(h,e=>{t.msg.role===`function_call`&&t.msg.toolCalls&&e(g)});var _=F(h,2),v=N(_,!0);E(_),E(r),I((e,n,i,a)=>{G(r,`title`,e),V(c,t.msg.roleLabel),V(u,n),V(f,i),V(v,a)},[()=>n()?o(t.msg.promptCacheRatio):void 0,()=>s(t.msg),()=>ys.formatTimestamp(t.msg.timestamp),()=>lL(t.msg)]),B(e,r)},f=e=>{var r=YH(),i=P(r),a=N(i),s=N(a,!0);E(a);var c=F(a,2),l=N(c,!0);E(c),E(i);var u=F(i,2),d=e=>{var r=KH(),i=N(r,!0);E(r),I(e=>{G(r,`title`,e),V(i,t.msg.text)},[()=>n()?o(t.msg.promptCacheRatio):void 0]),B(e,r)};H(u,e=>{t.msg.text&&e(d)});var f=F(u,2),p=e=>{var n=JH();U(n,23,()=>t.msg.toolCalls,(e,t)=>e.name+`-`+t,(e,t)=>{var n=qH(),r=N(n),i=N(r),a=N(i,!0);E(i);var o=F(i,2),s=N(o,!0);E(o),E(r);var c=F(r,2),l=e=>{var n=WH(),r=N(n);E(n),I(()=>V(r,`Call ID: ${L(t).id??``}`)),B(e,n)};H(c,e=>{L(t).id&&e(l)});var u=F(c,2),d=N(u,!0);E(u),E(n),I((e,n)=>{V(a,L(t).name+`()`),V(s,e),V(d,n)},[()=>dL(L(t))||`No arguments`,()=>dL(L(t))||`No arguments`]),B(e,n)}),E(n),B(e,n)};H(f,e=>{t.msg.toolCalls&&e(p)}),I((e,n)=>{G(i,`title`,e),V(s,t.msg.roleLabel),V(l,n)},[()=>n()?o(t.msg.promptCacheRatio):void 0,()=>ys.formatTimestamp(t.msg.timestamp)]),B(e,r)};H(u,e=>{L(i)?e(d):e(f,-1)});var p=F(u,2);let m;var h=N(p);{let e=k(()=>r.copied?Ka:Ya);q(h,{get icon(){return L(e)},width:`14`,height:`14`})}E(p),E(c),I(e=>{W(c,1,Pi([L(i)?`chat-function-note`:`chat-message`,t.msg.roleClass,{"is-anchor":t.msg.isAnchor,"is-after-anchor":t.msg.isAfterAnchor}]),`svelte-12s99s5`),G(c,`data-conversation-anchor`,t.msg.isAnchor?`true`:void 0),G(c,`data-entry-id`,t.msg.entryID),l=Vi(c,``,l,e),m=W(p,1,`chat-message-copy svelte-12s99s5`,null,m,{"is-copied":r.copied}),G(p,`aria-label`,r.copied?`Message copied`:`Copy message`),G(p,`title`,r.copied?`Copied`:`Copy message`)},[()=>({"--prompt-cache-fill":a(t.msg.promptCacheRatio),"--prompt-cache-visibility":n()&&t.msg.promptCacheRatio>0?`1`:`0`})]),R(`click`,p,e=>{e.stopPropagation(),r.copy(uL(t.msg))}),B(e,c),O()}Vr([`click`]);function QH(e,t=0){let n=Math.max(0,nU(e)-Math.max(0,nU(t))),r=Math.min(320,Math.max(180,Math.floor(n*.58))),i=Math.min(360,Math.max(128,Math.floor(n*.35)));return{min:r,max:Math.max(r,n-i)}}function $H(e,t,n=0){let r=QH(t,n),i=nU(e)||520;return Math.min(r.max,Math.max(r.min,Math.round(i)))}function eU(e,t,n=0){return $H(nU(t)-nU(e),t,n)}function tU(e,t,n,r){if(!Array.isArray(e)||e.length===0)return{index:-1,align:`start`};let i=nU(t),a=0;e.forEach((e,t)=>{nU(e)<=i+1&&(a=t)});let o=Number(r)<0?-1:1,s=Math.min(e.length-1,Math.max(0,a+o)),c=e.length-1,l=nU(e[c])0&&s===c&&l?`end`:`start`}}function nU(e){let t=Number(e);return Number.isFinite(t)?t:0}var rU=z(`
            `),iU=z(`
            `),aU=z(`

            Loading interactions...

            `),oU=z(`

            No interaction data available for this entry.

            `),sU=z(``),cU=z(`
            `,1),lU=z(`

            Showing the newest part of this session and the selected log.

            `),uU=z(`
            `),dU=z(``),fU=z(``),pU=z(``);function mU(e,t){D(t,!0);let n=yL,r=Number(Ca(`gomodel_interactions_panel_width`)),i=`gomodel_interactions_prompt_cache_fill`,a=Number.isFinite(r)&&r>0?r:520,o=A(M(a)),s=A(320),c=A(760),l=A(!1),u=A(!1),d=A(Ca(i,`true`)!==`false`),f=null;function p(e,{fullscreen:t,revealWithoutSlide:n=!1}){let r=yP(180);return t?ic(e,{x:L(o),duration:r,easing:sc}):n?{duration:0}:ac(e,{axis:`x`,duration:r,easing:sc})}async function m(e){if(e===L(l))return;let t=L(l)&&!e;j(u,t,!0),j(l,e,!0),t&&(await Sr(),j(u,!1))}function h(){j(d,!L(d)),wa(i,L(d))}function g(){return(document.querySelector(`.sidebar`)?.getBoundingClientRect().width||0)+(document.querySelector(`.sidebar-toggle`)?.getBoundingClientRect().width||0)}function _(){let e=g(),t=QH(window.innerWidth,e);j(s,t.min,!0),j(c,t.max,!0),j(o,$H(a,window.innerWidth,e),!0)}function v(e){j(o,eU(e,window.innerWidth,g()),!0),a=L(o)}function y(e){e.button===0&&(e.preventDefault(),f=e.pointerId,e.currentTarget.setPointerCapture(e.pointerId),document.body.classList.add(`conversation-panel-resizing`),v(e.clientX))}function b(e){e.pointerId===f&&v(e.clientX)}function x(e){f===null||e.pointerId!==void 0&&e.pointerId!==f||(f=null,document.body.classList.remove(`conversation-panel-resizing`),wa(`gomodel_interactions_panel_width`,a))}function S(e){e.key!==`ArrowLeft`&&e.key!==`ArrowRight`||(e.preventDefault(),a=L(o)+(e.key===`ArrowLeft`?24:-24),_(),a=L(o),wa(`gomodel_interactions_panel_width`,a))}function C(e){let t=document.getElementById(`interactions-drawer-content`),r=n.conversationThreadEl;if(!t||!r)return;let i=[...r.querySelectorAll(`[data-conversation-message="true"]`)],a=t.getBoundingClientRect(),o=a.top+14,s=tU(i.map(e=>e.getBoundingClientRect().top),o,a.bottom,e),c=i[s.index];if(!c)return;let l=s.align===`end`?t.scrollHeight:t.scrollTop+c.getBoundingClientRect().top-a.top-14;t.scrollTo({top:l,behavior:yP(1)>0?`smooth`:`auto`})}function w(){return[document.querySelector(`.sidebar`),document.querySelector(`.sidebar-toggle`),document.getElementById(`dashboard-content`)].filter(Boolean)}kn(()=>{if(!n.conversationOpen)return;_();let e=document.querySelector(`.sidebar`),t=new ResizeObserver(_);e&&t.observe(e);let r=e=>{e.key===`Escape`&&!ka.anyOpen&&(L(l)?m(!1):n.closeConversation())};return window.addEventListener(`keydown`,r),window.addEventListener(`resize`,_),()=>{x({}),t.disconnect(),window.removeEventListener(`keydown`,r),window.removeEventListener(`resize`,_)}}),kn(()=>{n.conversationOpen||j(l,!1)}),kn(()=>{if(!L(l))return;let e=w().map(e=>({element:e,inert:e.inert,ariaHidden:e.getAttribute(`aria-hidden`)}));return e.forEach(({element:e})=>{e.inert=!0,e.setAttribute(`aria-hidden`,`true`)}),()=>{e.forEach(({element:e,inert:t,ariaHidden:n})=>{e.inert=t,n===null?e.removeAttribute(`aria-hidden`):e.setAttribute(`aria-hidden`,n)})}}),kn(()=>{Xo.page!==`audit-logs`&&n.conversationOpen&&n.closeConversation()});var T=Zr(),ee=P(T),te=e=>{var t=Zr();U(P(t),16,()=>[L(l)],e=>e,(e,t)=>{var r=pU();let i,a;var l=N(r),f=F(l,2),g=N(f),_=F(N(g),2),v=N(_);let w;E(_),E(g);var T=F(g,2),ee=N(T),te=N(ee);{let e=k(()=>t?co:so);q(te,{get icon(){return L(e)},class:`table-icon-svg`})}E(ee),zs(F(ee,2),{label:`Close interactions`,onclick:()=>n.closeConversation(),get el(){return n.conversationCloseBtnEl},set el(e){n.conversationCloseBtnEl=e}}),E(T),E(f);var ne=F(f,2),re=N(ne),ie=e=>{var t=rU(),n=N(t);q(N(n),{get icon(){return Pa},width:`14`,height:`14`}),E(n);var r=F(n,2);q(N(r),{get icon(){return ja},width:`14`,height:`14`}),E(r),E(t),R(`click`,n,()=>C(-1)),R(`click`,r,()=>C(1)),B(e,t)};H(re,e=>{n.conversationMessages.length>1&&e(ie)});var ae=F(re,2),oe=e=>{var t=iU(),r=N(t,!0);E(t),I(()=>V(r,n.conversationError)),B(e,t)};H(ae,e=>{n.conversationError&&e(oe)});var se=F(ae,2),ce=e=>{B(e,aU())};H(se,e=>{n.conversationLoading&&e(ce)});var le=F(se,2),ue=e=>{B(e,oU())},de=k(()=>!n.conversationLoading&&!n.followUpSending&&!n.conversationError&&n.conversationMessages.length===0&&!n.conversationLiveWaiting());H(le,e=>{L(de)&&e(ue)});var fe=F(le,2),pe=e=>{var t=cU(),r=P(t),i=e=>{var t=sU(),n=N(t);let r;He(2),E(t),I(()=>{G(t,`aria-checked`,L(d)),G(t,`title`,(L(d)?`Hide`:`Show`)+` estimated provider prompt-cache fill`),r=W(n,1,`conversation-cache-switch svelte-ssrzja`,null,r,{"is-active":L(d)})}),R(`click`,t,h),B(e,t)},a=k(()=>n.conversationMessages.some(e=>Number(e.promptCacheRatio||0)>0));H(r,e=>{L(a)&&e(i)});var o=F(r,2);U(o,21,()=>n.conversationMessages,e=>e.uid,(e,t)=>{ZH(e,{get msg(){return L(t)},get showPromptCache(){return L(d)}})}),E(o),ha(o,e=>n.conversationThreadEl=e,()=>n?.conversationThreadEl),B(e,t)};H(fe,e=>{n.conversationMessages.length>0&&e(pe)});var me=F(fe,2),he=e=>{B(e,lU())};H(me,e=>{n.conversationTruncated&&e(he)});var ge=F(me,2),_e=e=>{var t=uU(),r=F(N(t),2),i=N(r,!0);E(r),E(t),I(e=>V(i,e),[()=>n.conversationLiveStatusText()]),B(e,t)},ve=k(()=>n.conversationLiveWaiting());H(ge,e=>{L(ve)&&e(_e)}),E(ne);var ye=F(ne,2),be=e=>{var t=fU(),r=N(t),i=N(r);dt(i);var a=F(i,2),o=e=>{var t=dU(),r=N(t,!0);E(t),I(()=>V(r,n.followUpError)),B(e,t)};H(a,e=>{n.followUpError&&e(o)});var s=F(a,2),c=N(s),l=N(c,!0);E(c);var u=F(c,2),d=N(u,!0);E(u),E(s),E(r),E(t),I((e,t,r)=>{i.disabled=e,V(l,t),u.disabled=r,V(d,n.followUpSending?`Sending…`:`Send`)},[()=>n.followUpSending||n.conversationLiveWaiting(),()=>n.selectedConversationEntry()?.path||``,()=>!n.canSendFollowUp()]),Br(`submit`,r,e=>{e.preventDefault(),n.sendFollowUp()}),ua(i,()=>n.followUpText,e=>n.followUpText=e),B(e,t)},xe=k(()=>n.conversationAnchorID&&n.followUpKind());H(ye,e=>{L(xe)&&e(be)}),E(r),ha(r,e=>n.conversationDialogEl=e,()=>n?.conversationDialogEl),I(()=>{i=W(r,1,`conversation-drawer svelte-ssrzja`,null,i,{"conversation-drawer-fullscreen":t}),G(r,`role`,t?`dialog`:void 0),G(r,`aria-modal`,t?`true`:void 0),a=Vi(r,``,a,{"--conversation-panel-width":L(o)+`px`}),G(l,`aria-valuemin`,L(s)),G(l,`aria-valuemax`,L(c)),G(l,`aria-valuenow`,L(o)),G(_,`aria-label`,n.conversationFollowLatest?`Following the latest interaction`:`Viewing a historical interaction`),G(_,`title`,n.conversationFollowLatest?`Following the latest interaction as new events arrive`:`Viewing a historical interaction; live updates are not followed`),w=W(v,1,`live-dot`,null,w,{"is-streaming":n.conversationFollowLatest}),G(ee,`aria-label`,t?`Exit fullscreen interactions`:`Show interactions fullscreen`),G(ee,`title`,t?`Exit fullscreen`:`Fullscreen`),G(ee,`aria-pressed`,t)}),R(`pointerdown`,l,y),R(`pointermove`,l,b),R(`pointerup`,l,x),Br(`pointercancel`,l,x),Br(`lostpointercapture`,l,x),R(`keydown`,l,S),R(`click`,ee,()=>m(!t)),Oi(7,r,()=>p,()=>({fullscreen:t,revealWithoutSlide:!t&&L(u)})),B(e,r)}),B(e,t)};H(ee,e=>{n.conversationOpen&&e(te)}),B(e,T),O()}Vr([`pointerdown`,`pointermove`,`pointerup`,`keydown`,`click`]);var hU=z(`
            `,1);function gU(e,t){D(t,!0);let n={overview:OC,usage:wT,budgets:eD,"rate-limits":dO,models:qj,workflows:mP,"audit-logs":uR,guardrails:rz,"mcp-servers":Lz,"providers-config":KB,"auth-keys":BV,settings:UH};ys.init(),Uc.init(),J.init(),Da.init(),Oa.init(),Xo.init(),kn(()=>{J.refreshTick,As.fetch(),Wc.fetchModels(),Wc.fetchCategories()}),kn(()=>{document.body.classList.toggle(`dashboard-modal-open`,ka.anyOpen)});let r=k(()=>n[Xo.page]||OC);var i=hU(),a=P(i);Ls(a,{});var o=F(a,2);let s;var c=N(o);mc(c,{}),gi(F(c,2),()=>L(r),(e,t)=>{t(e,{})}),E(o);var l=F(o,2);mU(l,{});var u=F(l,2);qs(u,{});var d=F(u,2);$s(d,{}),fc(F(d,2),{}),I(()=>s=W(o,1,`content`,null,s,{"interactions-open":yL.conversationOpen})),B(e,i),O()}ei(gU,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/internal/admin/dashboard/static/dist/index.html b/internal/admin/dashboard/static/dist/index.html index ef7760f15..fea248bed 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_virtualmodels.go b/internal/admin/handler_virtualmodels.go index 30392a684..6be834914 100644 --- a/internal/admin/handler_virtualmodels.go +++ b/internal/admin/handler_virtualmodels.go @@ -26,7 +26,9 @@ type upsertVirtualModelRequest struct { SessionAffinity *bool `json:"session_affinity,omitempty"` UserPaths []string `json:"user_paths,omitempty"` Description string `json:"description,omitempty"` - Enabled *bool `json:"enabled,omitempty"` + // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. + Slowdown float64 `json:"slowdown,omitempty"` + Enabled *bool `json:"enabled,omitempty"` } // virtualModelTargetRequest is one load-balancing destination. Model may be a @@ -162,6 +164,7 @@ func (h *Handler) buildVirtualModelUpsert(source string, req upsertVirtualModelR SessionAffinity: req.SessionAffinity, UserPaths: req.UserPaths, Description: strings.TrimSpace(req.Description), + Slowdown: req.Slowdown, Enabled: h.virtualModels.ResolveUpsertEnabled(source, req.OldSource, req.Enabled), } diff --git a/internal/admin/handler_virtualmodels_test.go b/internal/admin/handler_virtualmodels_test.go index e16869574..42eca8b4b 100644 --- a/internal/admin/handler_virtualmodels_test.go +++ b/internal/admin/handler_virtualmodels_test.go @@ -399,6 +399,44 @@ func TestUpsertPolicyVirtualModelAcceptsEmptyUserPaths(t *testing.T) { } } +func TestUpsertVirtualModelPersistsSlowdown(t *testing.T) { + h := newVMHandler(t) + e := echo.New() + + req := httptest.NewRequest(http.MethodPut, "/admin/virtual-models", bytes.NewBufferString(`{"source":"slow","target_model":"openai/gpt-4o","slowdown":0.5}`)) + req.Header.Set("Content-Type", "application/json") + rec := httptest.NewRecorder() + if err := h.UpsertVirtualModel(e.NewContext(req, rec)); err != nil { + t.Fatalf("UpsertVirtualModel() error = %v", err) + } + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200 body=%s", rec.Code, rec.Body.String()) + } + + var view virtualmodels.View + if err := json.Unmarshal(rec.Body.Bytes(), &view); err != nil { + t.Fatalf("decode response: %v", err) + } + if view.Slowdown != 0.5 { + t.Fatalf("view.Slowdown = %v, want 0.5", view.Slowdown) + } +} + +func TestUpsertVirtualModelRejectsSlowdownOutsideRange(t *testing.T) { + h := newVMHandler(t) + e := echo.New() + + req := httptest.NewRequest(http.MethodPut, "/admin/virtual-models", bytes.NewBufferString(`{"source":"slow","target_model":"openai/gpt-4o","slowdown":10.1}`)) + req.Header.Set("Content-Type", "application/json") + rec := httptest.NewRecorder() + if err := h.UpsertVirtualModel(e.NewContext(req, rec)); err != nil { + t.Fatalf("UpsertVirtualModel() error = %v", err) + } + if rec.Code != http.StatusBadRequest { + t.Fatalf("status = %d, want 400 body=%s", rec.Code, rec.Body.String()) + } +} + func TestUpsertRedirectVirtualModelReplacesAccessPolicy(t *testing.T) { h := newVMHandler(t, virtualmodels.VirtualModel{ Source: "openai/gpt-4o", diff --git a/internal/core/request_model_resolution.go b/internal/core/request_model_resolution.go index 4b9bd83fa..efc93e1c1 100644 --- a/internal/core/request_model_resolution.go +++ b/internal/core/request_model_resolution.go @@ -8,6 +8,9 @@ type RequestModelResolution struct { ProviderType string ProviderName string AliasApplied bool + // Slowdown is the extra-time factor selected for this request. A value of + // 0.5 adds 50% of measured inference time; zero disables slowdown. + Slowdown float64 } // RequestedQualifiedModel returns the canonical requested selector. diff --git a/internal/gateway/inference_execute.go b/internal/gateway/inference_execute.go index f15431d43..da2348863 100644 --- a/internal/gateway/inference_execute.go +++ b/internal/gateway/inference_execute.go @@ -8,6 +8,7 @@ import ( "time" "github.com/enterpilot/gomodel/internal/core" + "github.com/enterpilot/gomodel/internal/streaming" "github.com/enterpilot/gomodel/internal/usage" ) @@ -16,7 +17,9 @@ func (o *InferenceOrchestrator) ExecuteChatCompletion(ctx context.Context, workf if err := o.validateProviderAndRequest(req != nil, "chat request is required"); err != nil { return nil, err } - return executeTranslatedResult(o, ctx, workflow, req, requestID, endpoint, chatExecutionSpec) + return executeResultWithSlowdown(ctx, workflow, func() (*ChatCompletionResult, error) { + return executeTranslatedResult(o, ctx, workflow, req, requestID, endpoint, chatExecutionSpec) + }) } // DispatchChatCompletion executes a non-streaming chat request without usage side effects. @@ -28,7 +31,9 @@ func (o *InferenceOrchestrator) DispatchChatCompletion( if err := o.validateProviderAndRequest(req != nil, "chat request is required"); err != nil { return nil, "", "", "", false, err } - return o.executeChatCompletion(ctx, workflow, req) + return dispatchTranslatedWithSlowdown(ctx, workflow, func() (*core.ChatResponse, string, string, string, bool, error) { + return o.executeChatCompletion(ctx, workflow, req) + }) } // StreamChatCompletion opens a chat SSE stream. Stream usage is recorded by the caller's stream observer. @@ -36,13 +41,14 @@ func (o *InferenceOrchestrator) StreamChatCompletion(ctx context.Context, workfl if err := o.validateProviderAndRequest(req != nil, "chat request is required"); err != nil { return nil, err } + started := time.Now() streamReq, providerType, providerName, usageModel := o.ResolveChatRoute(workflow, req) stream, resolvedProviderType, resolvedProviderName, resolvedUsageModel, failoverModel, usedFailover, err := o.streamChatCompletion(ctx, workflow, streamReq, providerType, providerName, usageModel) if err != nil { return nil, err } return &StreamResult{ - Stream: stream, + Stream: streaming.NewSlowdownStream(ctx, stream, workflowSlowdown(workflow), started), Meta: ExecutionMeta{ ProviderType: resolvedProviderType, ProviderName: resolvedProviderName, @@ -58,7 +64,9 @@ func (o *InferenceOrchestrator) ExecuteResponses(ctx context.Context, workflow * if err := o.validateProviderAndRequest(req != nil, "responses request is required"); err != nil { return nil, err } - return executeTranslatedResult(o, ctx, workflow, req, requestID, endpoint, responsesExecutionSpec) + return executeResultWithSlowdown(ctx, workflow, func() (*ResponsesResult, error) { + return executeTranslatedResult(o, ctx, workflow, req, requestID, endpoint, responsesExecutionSpec) + }) } // DispatchResponses executes a non-streaming Responses request without usage side effects. @@ -70,7 +78,9 @@ func (o *InferenceOrchestrator) DispatchResponses( if err := o.validateProviderAndRequest(req != nil, "responses request is required"); err != nil { return nil, "", "", "", false, err } - return o.executeResponses(ctx, workflow, req) + return dispatchTranslatedWithSlowdown(ctx, workflow, func() (*core.ResponsesResponse, string, string, string, bool, error) { + return o.executeResponses(ctx, workflow, req) + }) } // StreamResponses opens a Responses API SSE stream. Stream usage is recorded by the caller's stream observer. @@ -78,6 +88,7 @@ func (o *InferenceOrchestrator) StreamResponses(ctx context.Context, workflow *c if err := o.validateProviderAndRequest(req != nil, "responses request is required"); err != nil { return nil, err } + started := time.Now() providerType, providerName, usageModel := o.routeMetadata(workflow, req.Model) if (workflow == nil || workflow.UsageEnabled()) && o.ShouldEnforceReturningUsageData() { ctx = core.WithEnforceReturningUsageData(ctx, true) @@ -87,7 +98,7 @@ func (o *InferenceOrchestrator) StreamResponses(ctx context.Context, workflow *c return nil, err } return &StreamResult{ - Stream: stream, + Stream: streaming.NewSlowdownStream(ctx, stream, workflowSlowdown(workflow), started), Meta: ExecutionMeta{ ProviderType: resolvedProviderType, ProviderName: resolvedProviderName, @@ -103,6 +114,7 @@ func (o *InferenceOrchestrator) ExecuteEmbeddings(ctx context.Context, workflow if err := o.validateProviderAndRequest(req != nil, "embeddings request is required"); err != nil { return nil, err } + started := time.Now() resp, providerType, providerName, err := o.executeEmbeddings(ctx, workflow, req) if err != nil { return nil, err @@ -111,6 +123,9 @@ func (o *InferenceOrchestrator) ExecuteEmbeddings(ctx context.Context, workflow o.logUsage(ctx, workflow, pricingModel, providerType, providerName, func(pricing *core.ModelPricing) *usage.UsageEntry { return usage.ExtractFromEmbeddingResponse(resp, requestID, providerType, endpoint, pricing) }) + if err := waitForInferenceSlowdown(ctx, workflow, time.Since(started)); err != nil { + return nil, err + } return &EmbeddingResult{ Response: resp, Meta: ExecutionMeta{ @@ -130,7 +145,15 @@ func (o *InferenceOrchestrator) DispatchEmbeddings( if err := o.validateProviderAndRequest(req != nil, "embeddings request is required"); err != nil { return nil, "", "", err } - return o.executeEmbeddings(ctx, workflow, req) + started := time.Now() + resp, providerType, providerName, err := o.executeEmbeddings(ctx, workflow, req) + if err != nil { + return nil, "", "", err + } + if err := waitForInferenceSlowdown(ctx, workflow, time.Since(started)); err != nil { + return nil, "", "", err + } + return resp, providerType, providerName, nil } // ResolveChatRoute returns the provider route and the request to send for chat streams. @@ -163,6 +186,9 @@ func (o *InferenceOrchestrator) CanFastPathStreamingChatPassthrough(workflow *co if req == nil || !req.Stream { return false } + if workflowSlowdown(workflow) > 0 { + return false + } if o.translatedRequestPatcher != nil || o.ShouldEnforceReturningUsageData() { return false } diff --git a/internal/gateway/interfaces.go b/internal/gateway/interfaces.go index 1dc09980c..f43ff15ad 100644 --- a/internal/gateway/interfaces.go +++ b/internal/gateway/interfaces.go @@ -22,6 +22,12 @@ type UserPathModelResolver interface { ResolveModelForUserPath(ctx context.Context, requested core.RequestedModelSelector) (core.ModelSelector, bool, error) } +// ModelSlowdownResolver optionally resolves an extra-time factor for a +// requested/resolved model pair. The context carries the effective user path. +type ModelSlowdownResolver interface { + ResolveSlowdown(context.Context, core.RequestedModelSelector, core.ModelSelector) float64 +} + // FailoverResolver resolves alternate concrete model selectors for a translated // request after the primary selector has already been resolved. type FailoverResolver interface { diff --git a/internal/gateway/request_model_resolution.go b/internal/gateway/request_model_resolution.go index 4280e6a93..da77d7cfa 100644 --- a/internal/gateway/request_model_resolution.go +++ b/internal/gateway/request_model_resolution.go @@ -134,13 +134,17 @@ func ResolveRequestModelWithAuthorizer( } } - return &core.RequestModelResolution{ + resolution := &core.RequestModelResolution{ Requested: requested, ResolvedSelector: resolvedSelector, ProviderType: strings.TrimSpace(provider.GetProviderType(resolvedModel)), ProviderName: ResolvedProviderName(provider, resolvedSelector, ""), AliasApplied: aliasApplied, - }, nil + } + if slowdownResolver, ok := resolver.(ModelSlowdownResolver); ok { + resolution.Slowdown = slowdownResolver.ResolveSlowdown(ctx, requested, resolvedSelector) + } + return resolution, nil } func refreshProviderModelsForResolution( diff --git a/internal/gateway/request_model_resolution_test.go b/internal/gateway/request_model_resolution_test.go index ed7ae41db..3b95d64ca 100644 --- a/internal/gateway/request_model_resolution_test.go +++ b/internal/gateway/request_model_resolution_test.go @@ -99,6 +99,46 @@ func (r requestAliasResolver) ResolveModel(requested core.RequestedModelSelector return selector, false, err } +type requestSlowdownResolver struct { + requestAliasResolver + factor float64 + requested string + resolved string +} + +func (r *requestSlowdownResolver) ResolveSlowdown(_ context.Context, requested core.RequestedModelSelector, resolved core.ModelSelector) float64 { + r.requested = requested.RequestedQualifiedModel() + r.resolved = resolved.QualifiedModel() + return r.factor +} + +func TestResolveRequestModelCarriesResolvedSlowdownFactor(t *testing.T) { + provider := newRequestRefreshProvider(1) + resolver := &requestSlowdownResolver{ + requestAliasResolver: requestAliasResolver{ + "smart": {Provider: "openai", Model: "gpt-4o"}, + }, + factor: 0.5, + } + + resolution, err := ResolveRequestModelWithAuthorizer( + context.Background(), + provider, + resolver, + nil, + core.NewRequestedModelSelector("smart", ""), + ) + if err != nil { + t.Fatalf("ResolveRequestModelWithAuthorizer() error = %v", err) + } + if resolution.Slowdown != 0.5 { + t.Fatalf("resolution.Slowdown = %v, want 0.5", resolution.Slowdown) + } + if resolver.requested != "smart" || resolver.resolved != "openai/gpt-4o" { + t.Fatalf("slowdown resolver inputs = (%q, %q), want (smart, openai/gpt-4o)", resolver.requested, resolver.resolved) + } +} + type requestRefreshTargetResolver struct { provider *requestRefreshProvider target core.ModelSelector diff --git a/internal/gateway/slowdown.go b/internal/gateway/slowdown.go new file mode 100644 index 000000000..ef3240583 --- /dev/null +++ b/internal/gateway/slowdown.go @@ -0,0 +1,67 @@ +package gateway + +import ( + "context" + "time" + + "github.com/enterpilot/gomodel/internal/core" +) + +func workflowSlowdown(workflow *core.Workflow) float64 { + if workflow == nil || workflow.Resolution == nil || workflow.Resolution.Slowdown <= 0 { + return 0 + } + return workflow.Resolution.Slowdown +} + +func waitForInferenceSlowdown(ctx context.Context, workflow *core.Workflow, inferenceTime time.Duration) error { + factor := workflowSlowdown(workflow) + if factor <= 0 || inferenceTime <= 0 { + return nil + } + delay := time.Duration(float64(inferenceTime) * factor) + timer := time.NewTimer(delay) + defer timer.Stop() + select { + case <-timer.C: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +func executeResultWithSlowdown[Result any]( + ctx context.Context, + workflow *core.Workflow, + execute func() (Result, error), +) (Result, error) { + started := time.Now() + result, err := execute() + if err != nil { + var zero Result + return zero, err + } + if err := waitForInferenceSlowdown(ctx, workflow, time.Since(started)); err != nil { + var zero Result + return zero, err + } + return result, nil +} + +func dispatchTranslatedWithSlowdown[Response any]( + ctx context.Context, + workflow *core.Workflow, + execute func() (Response, string, string, string, bool, error), +) (Response, string, string, string, bool, error) { + started := time.Now() + resp, providerType, providerName, failoverModel, usedFailover, err := execute() + if err != nil { + var zero Response + return zero, "", "", "", false, err + } + if err := waitForInferenceSlowdown(ctx, workflow, time.Since(started)); err != nil { + var zero Response + return zero, "", "", "", false, err + } + return resp, providerType, providerName, failoverModel, usedFailover, nil +} diff --git a/internal/gateway/slowdown_test.go b/internal/gateway/slowdown_test.go new file mode 100644 index 000000000..b776cf669 --- /dev/null +++ b/internal/gateway/slowdown_test.go @@ -0,0 +1,29 @@ +package gateway + +import ( + "context" + "testing" + "time" + + "github.com/enterpilot/gomodel/internal/core" +) + +func TestWaitForInferenceSlowdownAddsFactorOfInferenceTime(t *testing.T) { + workflow := &core.Workflow{Resolution: &core.RequestModelResolution{Slowdown: 0.5}} + started := time.Now() + if err := waitForInferenceSlowdown(context.Background(), workflow, 20*time.Millisecond); err != nil { + t.Fatalf("waitForInferenceSlowdown() error = %v", err) + } + if elapsed := time.Since(started); elapsed < 8*time.Millisecond { + t.Fatalf("waitForInferenceSlowdown() waited %v, want about 10ms", elapsed) + } +} + +func TestWaitForInferenceSlowdownStopsOnCancellation(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + workflow := &core.Workflow{Resolution: &core.RequestModelResolution{Slowdown: 10}} + if err := waitForInferenceSlowdown(ctx, workflow, time.Minute); err != context.Canceled { + t.Fatalf("waitForInferenceSlowdown() error = %v, want context.Canceled", err) + } +} diff --git a/internal/server/audio_service.go b/internal/server/audio_service.go index d70c971b6..986feda83 100644 --- a/internal/server/audio_service.go +++ b/internal/server/audio_service.go @@ -6,6 +6,7 @@ import ( "net/http" "path/filepath" "strings" + "time" "github.com/labstack/echo/v5" @@ -87,7 +88,9 @@ func (s *audioService) CreateSpeech(c *echo.Context) error { return handleError(c, err) } defer release() + started := time.Now() resp, err := router.CreateSpeech(ctx, req) + inferenceTime := time.Since(started) if err != nil { return handleError(c, err) } @@ -97,6 +100,9 @@ func (s *audioService) CreateSpeech(c *echo.Context) error { s.logUsage(ctx, route, func(pricing *core.ModelPricing) *usage.UsageEntry { return usage.ExtractFromSpeechRequest(req.Input, resp.Data, speechResponseFormat(req, resp), route.requestID, route.model, route.providerType, pricing) }) + if err := waitForModelSlowdownFactor(ctx, route.slowdown, inferenceTime); err != nil { + return handleError(c, err) + } return s.respondAudio(c, resp) } @@ -167,7 +173,9 @@ func (s *audioService) createAudioTranscription(c *echo.Context, translation boo return handleError(c, err) } defer release() + started := time.Now() resp, err := call(ctx, req) + inferenceTime := time.Since(started) if err != nil { return handleError(c, err) } @@ -180,6 +188,9 @@ func (s *audioService) createAudioTranscription(c *echo.Context, translation boo } return usage.ExtractFromTranscriptionResponse(resp.Data, route.requestID, route.model, route.providerType, pricing) }) + if err := waitForModelSlowdownFactor(ctx, route.slowdown, inferenceTime); err != nil { + return handleError(c, err) + } return s.respondAudio(c, resp) } @@ -193,6 +204,7 @@ type audioRoute struct { providerType string providerName string requestID string + slowdown float64 } // prepare resolves and authorizes the model, enforces budget, and stamps the @@ -218,7 +230,14 @@ func (s *audioService) prepare(c *echo.Context, model, providerHint string) (con ctx, requestID := requestContextWithRequestID(c.Request()) c.SetRequest(c.Request().WithContext(ctx)) - return ctx, s.routeFor(selector, requestID), nil + route := s.routeFor(selector, requestID) + route.slowdown = resolveModelSlowdown( + ctx, + s.modelResolver, + core.NewRequestedModelSelector(model, providerHint), + selector, + ) + return ctx, route, nil } // routeFor maps a resolved selector to its canonical provider type and concrete diff --git a/internal/server/model_slowdown.go b/internal/server/model_slowdown.go new file mode 100644 index 000000000..333eb8baf --- /dev/null +++ b/internal/server/model_slowdown.go @@ -0,0 +1,35 @@ +package server + +import ( + "context" + "time" + + "github.com/enterpilot/gomodel/internal/core" + "github.com/enterpilot/gomodel/internal/gateway" +) + +func resolveModelSlowdown( + ctx context.Context, + resolver RequestModelResolver, + requested core.RequestedModelSelector, + resolved core.ModelSelector, +) float64 { + if slowdownResolver, ok := resolver.(gateway.ModelSlowdownResolver); ok { + return slowdownResolver.ResolveSlowdown(ctx, requested, resolved) + } + return 0 +} + +func waitForModelSlowdownFactor(ctx context.Context, factor float64, inferenceTime time.Duration) error { + if factor <= 0 || inferenceTime <= 0 { + return nil + } + timer := time.NewTimer(time.Duration(float64(inferenceTime) * factor)) + defer timer.Stop() + select { + case <-timer.C: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/internal/streaming/slowdown_stream.go b/internal/streaming/slowdown_stream.go new file mode 100644 index 000000000..db5d260b2 --- /dev/null +++ b/internal/streaming/slowdown_stream.go @@ -0,0 +1,187 @@ +package streaming + +import ( + "context" + "io" + "sync" + "time" +) + +// NewSlowdownStream drains source in the background and releases each read +// chunk on a scaled timeline. factor is extra time: 0.5 makes a chunk that +// arrived 2s after inference start visible at 3s. Draining independently lets +// the upstream continue producing while delayed chunks accumulate in memory. +func NewSlowdownStream(ctx context.Context, source io.ReadCloser, factor float64, inferenceStarted time.Time) io.ReadCloser { + if source == nil || factor <= 0 { + return source + } + if ctx == nil { + ctx = context.Background() + } + if inferenceStarted.IsZero() { + inferenceStarted = time.Now() + } + streamCtx, cancel := context.WithCancel(ctx) + s := &slowdownStream{ + source: source, + factor: factor, + started: inferenceStarted, + ctx: streamCtx, + cancel: cancel, + notify: make(chan struct{}, 1), + } + go s.drain() + return s +} + +type slowdownChunk struct { + data []byte + due time.Time + err error +} + +type slowdownStream struct { + source io.ReadCloser + factor float64 + started time.Time + ctx context.Context + cancel context.CancelFunc + notify chan struct{} + + mu sync.Mutex + queue []slowdownChunk + closed bool + closeErr error + closeOnce sync.Once +} + +func (s *slowdownStream) drain() { + buf := make([]byte, 32*1024) + for { + n, err := s.source.Read(buf) + due := s.scaledDue(time.Since(s.started)) + if n > 0 { + data := append([]byte(nil), buf[:n]...) + if !s.enqueue(slowdownChunk{data: data, due: due}) { + return + } + } + if err != nil { + s.enqueue(slowdownChunk{due: due, err: err}) + return + } + } +} + +func (s *slowdownStream) scaledDue(elapsed time.Duration) time.Time { + scaled := time.Duration(float64(elapsed) * (1 + s.factor)) + return s.started.Add(scaled) +} + +func (s *slowdownStream) enqueue(chunk slowdownChunk) bool { + s.mu.Lock() + if s.closed { + s.mu.Unlock() + return false + } + s.queue = append(s.queue, chunk) + s.mu.Unlock() + select { + case s.notify <- struct{}{}: + default: + } + return true +} + +func (s *slowdownStream) Read(p []byte) (int, error) { + if len(p) == 0 { + return 0, nil + } + for { + chunk, ok, closed := s.peek() + if closed { + return 0, io.ErrClosedPipe + } + if !ok { + select { + case <-s.notify: + continue + case <-s.ctx.Done(): + return 0, s.ctx.Err() + } + } + + if wait := time.Until(chunk.due); wait > 0 { + timer := time.NewTimer(wait) + select { + case <-timer.C: + case <-s.ctx.Done(): + timer.Stop() + return 0, s.ctx.Err() + } + } + + s.mu.Lock() + if s.closed { + s.mu.Unlock() + return 0, io.ErrClosedPipe + } + if len(s.queue) == 0 { + s.mu.Unlock() + continue + } + front := &s.queue[0] + if len(front.data) > 0 { + n := copy(p, front.data) + front.data = front.data[n:] + if len(front.data) == 0 { + s.popLocked() + } + s.mu.Unlock() + return n, nil + } + err := front.err + s.popLocked() + s.mu.Unlock() + if err == nil { + err = io.EOF + } + return 0, err + } +} + +func (s *slowdownStream) peek() (slowdownChunk, bool, bool) { + s.mu.Lock() + defer s.mu.Unlock() + if s.closed { + return slowdownChunk{}, false, true + } + if len(s.queue) == 0 { + return slowdownChunk{}, false, false + } + return s.queue[0], true, false +} + +func (s *slowdownStream) popLocked() { + s.queue[0] = slowdownChunk{} + s.queue = s.queue[1:] + if len(s.queue) == 0 { + s.queue = nil + } +} + +func (s *slowdownStream) Close() error { + s.closeOnce.Do(func() { + s.cancel() + s.mu.Lock() + s.closed = true + s.queue = nil + s.mu.Unlock() + s.closeErr = s.source.Close() + select { + case s.notify <- struct{}{}: + default: + } + }) + return s.closeErr +} diff --git a/internal/streaming/slowdown_stream_test.go b/internal/streaming/slowdown_stream_test.go new file mode 100644 index 000000000..aa5f0bf89 --- /dev/null +++ b/internal/streaming/slowdown_stream_test.go @@ -0,0 +1,75 @@ +package streaming + +import ( + "context" + "io" + "sync/atomic" + "testing" + "time" +) + +func TestSlowdownStreamDrainsUpstreamBeforeDelayedRelease(t *testing.T) { + source := &timedChunkSource{} + started := time.Now() + stream := NewSlowdownStream(context.Background(), source, 5, started) + t.Cleanup(func() { _ = stream.Close() }) + + result := make(chan string, 1) + go func() { + body, _ := io.ReadAll(stream) + result <- string(body) + }() + + // The first source chunk arrives around 20ms and is due around 120ms with + // factor 5. The background drainer must still consume the whole source while + // the downstream reader is waiting, proving that delayed data is buffered. + time.Sleep(60 * time.Millisecond) + if reads := source.reads.Load(); reads < 3 { + t.Fatalf("source reads after 60ms = %d, want at least 3 (fully drained)", reads) + } + + select { + case body := <-result: + if body != "ab" { + t.Fatalf("delayed body = %q, want %q", body, "ab") + } + if elapsed := time.Since(started); elapsed < 90*time.Millisecond { + t.Fatalf("stream completed after %v, want scaled release near 120ms", elapsed) + } + case <-time.After(500 * time.Millisecond): + t.Fatal("timed out waiting for delayed stream") + } +} + +func TestSlowdownStreamReadStopsOnCancellation(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + source := &timedChunkSource{} + stream := NewSlowdownStream(ctx, source, 10, time.Now()) + t.Cleanup(func() { _ = stream.Close() }) + + cancel() + buf := make([]byte, 8) + if _, err := stream.Read(buf); err != context.Canceled { + t.Fatalf("Read() error = %v, want context.Canceled", err) + } +} + +type timedChunkSource struct { + reads atomic.Int32 +} + +func (s *timedChunkSource) Read(p []byte) (int, error) { + switch s.reads.Add(1) { + case 1: + time.Sleep(20 * time.Millisecond) + p[0] = 'a' + return 1, nil + case 2: + p[0] = 'b' + return 1, nil + default: + return 0, io.EOF + } +} + +func (*timedChunkSource) Close() error { return nil } diff --git a/internal/virtualmodels/config.go b/internal/virtualmodels/config.go index baa85231c..53e4e35df 100644 --- a/internal/virtualmodels/config.go +++ b/internal/virtualmodels/config.go @@ -32,6 +32,7 @@ func configModel(entry config.VirtualModelConfig) VirtualModel { Targets: configTargets(entry), UserPaths: entry.UserPaths, Description: entry.Description, + Slowdown: entry.Slowdown, Enabled: enabled, Managed: true, } diff --git a/internal/virtualmodels/config_overlay_test.go b/internal/virtualmodels/config_overlay_test.go index ff55ef392..34cfec38b 100644 --- a/internal/virtualmodels/config_overlay_test.go +++ b/internal/virtualmodels/config_overlay_test.go @@ -13,7 +13,7 @@ func TestConfigModels_Conversion(t *testing.T) { t.Parallel() enabled := false got := ConfigModels([]config.VirtualModelConfig{ - {Source: "alias", Target: "openai/gpt-4o"}, + {Source: "alias", Target: "openai/gpt-4o", Slowdown: 0.5}, { Source: "smart", Strategy: StrategyCost, @@ -28,7 +28,7 @@ func TestConfigModels_Conversion(t *testing.T) { if len(got) != 3 { t.Fatalf("ConfigModels len = %d, want 3", len(got)) } - if got[0].Targets[0].Model != "openai/gpt-4o" || !got[0].Enabled || !got[0].Managed { + if got[0].Targets[0].Model != "openai/gpt-4o" || got[0].Slowdown != 0.5 || !got[0].Enabled || !got[0].Managed { t.Fatalf("shorthand target conversion = %#v", got[0]) } if len(got[1].Targets) != 2 || got[1].Strategy != StrategyCost || got[1].Targets[0].Weight != 2 { diff --git a/internal/virtualmodels/service.go b/internal/virtualmodels/service.go index df9929762..64158ba13 100644 --- a/internal/virtualmodels/service.go +++ b/internal/virtualmodels/service.go @@ -263,14 +263,15 @@ func (s *Service) ListViews() []View { Targets: vm.Targets, Strategy: vm.Strategy, SessionAffinity: vm.SessionAffinity, - ProviderName: vm.ProviderName, - Model: vm.Model, - UserPaths: vm.UserPaths, - Description: vm.Description, - Enabled: vm.Enabled, - Managed: vm.Managed, - CreatedAt: vm.CreatedAt, - UpdatedAt: vm.UpdatedAt, + ProviderName: vm.ProviderName, + Model: vm.Model, + UserPaths: vm.UserPaths, + Description: vm.Description, + Slowdown: vm.Slowdown, + Enabled: vm.Enabled, + Managed: vm.Managed, + CreatedAt: vm.CreatedAt, + UpdatedAt: vm.UpdatedAt, } if vm.IsRedirect() { view.ResolvedModel, view.ProviderType, view.Valid = s.redirectViewResolution(vm) @@ -498,7 +499,7 @@ func (s *Service) policyIsRedundant(policy VirtualModel, fallbackRows []VirtualM // policyIsNoop reports whether an otherwise empty policy changes effective // access compared with the snapshot that would remain without that policy. func policyIsNoop(policy VirtualModel, fallback snapshot) bool { - if policy.IsRedirect() || len(policy.UserPaths) > 0 || strings.TrimSpace(policy.Description) != "" { + if policy.IsRedirect() || len(policy.UserPaths) > 0 || strings.TrimSpace(policy.Description) != "" || policy.Slowdown > 0 { return false } diff --git a/internal/virtualmodels/slowdown.go b/internal/virtualmodels/slowdown.go new file mode 100644 index 000000000..958efbb4e --- /dev/null +++ b/internal/virtualmodels/slowdown.go @@ -0,0 +1,36 @@ +package virtualmodels + +import ( + "context" + + "github.com/enterpilot/gomodel/internal/core" +) + +// ResolveSlowdown returns the request-scoped extra-time factor for a resolved +// model. A matching alias setting takes precedence over its concrete target; +// otherwise the normal exact/provider/model/global policy precedence applies. +// The context makes the lookup ready for user-path-specific settings without +// changing the request execution interface later. +func (s *Service) ResolveSlowdown( + ctx context.Context, + requested core.RequestedModelSelector, + resolved core.ModelSelector, +) float64 { + if s == nil { + return 0 + } + + snap := s.snapshot() + userPath := core.UserPathFromContext(ctx) + if !requested.ExplicitProvider { + if redirect, ok := snap.findRedirect(requested.Model, userPath, true); ok && redirect.vm.Slowdown > 0 { + return redirect.vm.Slowdown + } + } + + if policy, ok := snap.matchingPolicy(resolved.Provider, resolved.Model); ok && + policy.Slowdown > 0 && userPathAllowed(userPath, policy.UserPaths) { + return policy.Slowdown + } + return 0 +} diff --git a/internal/virtualmodels/slowdown_test.go b/internal/virtualmodels/slowdown_test.go new file mode 100644 index 000000000..480a35947 --- /dev/null +++ b/internal/virtualmodels/slowdown_test.go @@ -0,0 +1,130 @@ +package virtualmodels + +import ( + "context" + "testing" + + "github.com/enterpilot/gomodel/internal/core" +) + +func TestResolveSlowdown_AliasOverridesConcreteModel(t *testing.T) { + service := newSlowdownService(t, + VirtualModel{ + Source: "slow-alias", + Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, + Slowdown: 0.4, + Enabled: true, + }, + VirtualModel{ + Source: "openai/gpt-4o", + ProviderName: "openai", + Model: "gpt-4o", + Slowdown: 0.2, + Enabled: true, + }, + ) + + got := service.ResolveSlowdown( + context.Background(), + core.NewRequestedModelSelector("slow-alias", ""), + core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ) + if got != 0.4 { + t.Fatalf("ResolveSlowdown(alias) = %v, want 0.4", got) + } +} + +func TestResolveSlowdown_AliasFallsBackToConcreteModel(t *testing.T) { + service := newSlowdownService(t, + VirtualModel{ + Source: "plain-alias", + Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, + Enabled: true, + }, + VirtualModel{ + Source: "openai/gpt-4o", + ProviderName: "openai", + Model: "gpt-4o", + Slowdown: 0.2, + Enabled: true, + }, + ) + + got := service.ResolveSlowdown( + context.Background(), + core.NewRequestedModelSelector("plain-alias", ""), + core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ) + if got != 0.2 { + t.Fatalf("ResolveSlowdown(alias target) = %v, want 0.2", got) + } +} + +func TestResolveSlowdown_HonorsUserPathScope(t *testing.T) { + service := newSlowdownService(t, VirtualModel{ + Source: "openai/gpt-4o", + ProviderName: "openai", + Model: "gpt-4o", + UserPaths: []string{"/team/alpha"}, + Slowdown: 0.3, + Enabled: true, + }) + requested := core.NewRequestedModelSelector("openai/gpt-4o", "") + resolved := core.ModelSelector{Provider: "openai", Model: "gpt-4o"} + + matching := core.WithEffectiveUserPath(context.Background(), "/team/alpha/member") + if got := service.ResolveSlowdown(matching, requested, resolved); got != 0.3 { + t.Fatalf("ResolveSlowdown(matching path) = %v, want 0.3", got) + } + nonMatching := core.WithEffectiveUserPath(context.Background(), "/team/beta") + if got := service.ResolveSlowdown(nonMatching, requested, resolved); got != 0 { + t.Fatalf("ResolveSlowdown(non-matching path) = %v, want 0", got) + } +} + +func TestUpsertRejectsSlowdownOutsideRange(t *testing.T) { + service := newSlowdownService(t) + for _, slowdown := range []float64{0.09, 10.01} { + err := service.Upsert(context.Background(), VirtualModel{ + Source: "openai/gpt-4o", + ProviderName: "openai", + Model: "gpt-4o", + Slowdown: slowdown, + Enabled: true, + }) + if err == nil || !IsValidationError(err) { + t.Fatalf("Upsert(slowdown=%v) error = %v, want validation error", slowdown, err) + } + } +} + +func TestUpsertRejectsProviderWideSlowdown(t *testing.T) { + service := newSlowdownService(t) + err := service.Upsert(context.Background(), VirtualModel{ + Source: "openai/", + Slowdown: 0.5, + Enabled: true, + }) + if err == nil || !IsValidationError(err) { + t.Fatalf("Upsert(provider slowdown) error = %v, want validation error", err) + } +} + +func newSlowdownService(t *testing.T, rows ...VirtualModel) *Service { + t.Helper() + store := newSQLVMStore(t) + ctx := context.Background() + for _, row := range rows { + if err := store.Upsert(ctx, row); err != nil { + t.Fatalf("store.Upsert(%q): %v", row.Source, err) + } + } + service, err := NewService(store, testCatalog(), true) + if err != nil { + t.Fatalf("NewService: %v", err) + } + if err := service.Refresh(ctx); err != nil { + t.Fatalf("Refresh: %v", err) + } + return service +} diff --git a/internal/virtualmodels/store_mongodb.go b/internal/virtualmodels/store_mongodb.go index dbea3a168..775311404 100644 --- a/internal/virtualmodels/store_mongodb.go +++ b/internal/virtualmodels/store_mongodb.go @@ -20,6 +20,7 @@ type mongoVirtualModelDocument struct { Model string `bson:"model,omitempty"` UserPaths []string `bson:"user_paths,omitempty"` Description string `bson:"description,omitempty"` + Slowdown float64 `bson:"slowdown,omitempty"` Enabled bool `bson:"enabled"` CreatedAt time.Time `bson:"created_at"` UpdatedAt time.Time `bson:"updated_at"` @@ -99,6 +100,7 @@ func (s *MongoDBStore) Upsert(ctx context.Context, vm VirtualModel) error { "model": vm.Model, "user_paths": vm.UserPaths, "description": vm.Description, + "slowdown": vm.Slowdown, "enabled": vm.Enabled, "updated_at": vm.UpdatedAt, }, @@ -135,6 +137,7 @@ func virtualModelFromMongo(doc mongoVirtualModelDocument) VirtualModel { ProviderName: doc.ProviderName, Model: doc.Model, Description: doc.Description, + Slowdown: doc.Slowdown, Enabled: doc.Enabled, CreatedAt: doc.CreatedAt.UTC(), UpdatedAt: doc.UpdatedAt.UTC(), diff --git a/internal/virtualmodels/store_sql.go b/internal/virtualmodels/store_sql.go index c93d3ad79..15c5b5bd4 100644 --- a/internal/virtualmodels/store_sql.go +++ b/internal/virtualmodels/store_sql.go @@ -25,6 +25,7 @@ var sqlSchema = []string{ model TEXT NOT NULL DEFAULT '', user_paths TEXT NOT NULL DEFAULT '[]', description TEXT NOT NULL DEFAULT '', + slowdown DOUBLE PRECISION NOT NULL DEFAULT 0, enabled ` + sqlx.TypeBool + ` NOT NULL DEFAULT TRUE, created_at ` + sqlx.TypeInt64 + ` NOT NULL, updated_at ` + sqlx.TypeInt64 + ` NOT NULL @@ -38,19 +39,20 @@ var sqlSchema = []string{ // virtualModelMigrations backfill columns added after the table's first release. var virtualModelMigrations = []string{ "ALTER TABLE virtual_models ADD COLUMN session_affinity TEXT NOT NULL DEFAULT ''", + "ALTER TABLE virtual_models ADD COLUMN slowdown DOUBLE PRECISION NOT NULL DEFAULT 0", } const selectVirtualModelColumns = ` SELECT source, targets, strategy, session_affinity, provider_name, model, user_paths, - description, enabled, created_at, updated_at + description, slowdown, enabled, created_at, updated_at FROM virtual_models ` const upsertVirtualModelSQL = ` INSERT INTO virtual_models ( - source, targets, strategy, session_affinity, provider_name, model, user_paths, description, enabled, created_at, updated_at + source, targets, strategy, session_affinity, provider_name, model, user_paths, description, slowdown, enabled, created_at, updated_at ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(source) DO UPDATE SET targets = excluded.targets, strategy = excluded.strategy, @@ -59,6 +61,7 @@ const upsertVirtualModelSQL = ` model = excluded.model, user_paths = excluded.user_paths, description = excluded.description, + slowdown = excluded.slowdown, enabled = excluded.enabled, updated_at = excluded.updated_at ` @@ -171,6 +174,7 @@ func virtualModelUpsertArgs(vm VirtualModel) ([]any, error) { vm.Model, pathsJSON, vm.Description, + vm.Slowdown, vm.Enabled, vm.CreatedAt.Unix(), vm.UpdatedAt.Unix(), @@ -191,6 +195,7 @@ func scanSQLVirtualModel(scanner sqlx.Row) (VirtualModel, error) { &vm.Model, &userPaths, &vm.Description, + &vm.Slowdown, &vm.Enabled, &createdAt, &updatedAt, diff --git a/internal/virtualmodels/store_test.go b/internal/virtualmodels/store_test.go index d891a1f47..c1eedc34f 100644 --- a/internal/virtualmodels/store_test.go +++ b/internal/virtualmodels/store_test.go @@ -15,6 +15,7 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { Source: "fast", Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, Description: "primary", + Slowdown: 0.4, Enabled: true, } policy := VirtualModel{ @@ -22,6 +23,7 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { ProviderName: "openai", Model: "gpt-4o", UserPaths: []string{"/team"}, + Slowdown: 0.2, Enabled: true, } if err := store.Upsert(ctx, redirect); err != nil { @@ -49,6 +51,9 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { if len(gotRedirect.Targets) != 1 || gotRedirect.Targets[0].Model != "gpt-4o" || gotRedirect.Targets[0].Provider != "openai" { t.Fatalf("Get(fast).Targets = %#v, want [{openai gpt-4o 0}]", gotRedirect.Targets) } + if gotRedirect.Slowdown != 0.4 { + t.Fatalf("Get(fast).Slowdown = %v, want 0.4", gotRedirect.Slowdown) + } gotPolicy, err := store.Get(ctx, "openai/gpt-4o") if err != nil { @@ -60,6 +65,9 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { if len(gotPolicy.UserPaths) != 1 || gotPolicy.UserPaths[0] != "/team" { t.Fatalf("Get(policy).UserPaths = %#v, want [/team]", gotPolicy.UserPaths) } + if gotPolicy.Slowdown != 0.2 { + t.Fatalf("Get(policy).Slowdown = %v, want 0.2", gotPolicy.Slowdown) + } }) } diff --git a/internal/virtualmodels/types.go b/internal/virtualmodels/types.go index 5c1ef394b..13969a1f3 100644 --- a/internal/virtualmodels/types.go +++ b/internal/virtualmodels/types.go @@ -40,14 +40,16 @@ func (t Target) selector() (core.ModelSelector, error) { // VirtualModel is one operator-defined model entry. type VirtualModel struct { - Source string `json:"source" bson:"_id"` - Targets []Target `json:"targets,omitempty" bson:"targets,omitempty"` - Strategy string `json:"strategy,omitempty" bson:"strategy,omitempty"` - ProviderName string `json:"provider_name,omitempty" bson:"provider_name,omitempty"` - Model string `json:"model,omitempty" bson:"model,omitempty"` - UserPaths []string `json:"user_paths,omitempty" bson:"user_paths,omitempty"` - Description string `json:"description,omitempty" bson:"description,omitempty"` - Enabled bool `json:"enabled" bson:"enabled"` + Source string `json:"source" bson:"_id"` + Targets []Target `json:"targets,omitempty" bson:"targets,omitempty"` + Strategy string `json:"strategy,omitempty" bson:"strategy,omitempty"` + ProviderName string `json:"provider_name,omitempty" bson:"provider_name,omitempty"` + Model string `json:"model,omitempty" bson:"model,omitempty"` + UserPaths []string `json:"user_paths,omitempty" bson:"user_paths,omitempty"` + Description string `json:"description,omitempty" bson:"description,omitempty"` + // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. + Slowdown float64 `json:"slowdown,omitempty" bson:"slowdown,omitempty"` + Enabled bool `json:"enabled" bson:"enabled"` // SessionAffinity keeps requests of one detected session on the target that // served it before, while that target stays available. Tri-state: nil means @@ -134,15 +136,17 @@ const ( // View is the admin-facing representation of one virtual model. type View struct { - Source string `json:"source"` - Kind string `json:"kind"` + Source string `json:"source"` + Kind string `json:"kind"` Targets []Target `json:"targets,omitempty"` Strategy string `json:"strategy,omitempty"` SessionAffinity *bool `json:"session_affinity,omitempty"` - ProviderName string `json:"provider_name,omitempty"` - Model string `json:"model,omitempty"` - UserPaths []string `json:"user_paths,omitempty"` - Description string `json:"description,omitempty"` + ProviderName string `json:"provider_name,omitempty"` + Model string `json:"model,omitempty"` + UserPaths []string `json:"user_paths,omitempty"` + Description string `json:"description,omitempty"` + // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. + Slowdown float64 `json:"slowdown,omitempty"` Enabled bool `json:"enabled"` Managed bool `json:"managed,omitempty"` ResolvedModel string `json:"resolved_model,omitempty"` diff --git a/internal/virtualmodels/validation.go b/internal/virtualmodels/validation.go index d61c2f06f..5af80040f 100644 --- a/internal/virtualmodels/validation.go +++ b/internal/virtualmodels/validation.go @@ -2,6 +2,7 @@ package virtualmodels import ( "fmt" + "math" "sort" "strings" @@ -10,6 +11,11 @@ import ( "github.com/enterpilot/gomodel/internal/validation" ) +const ( + MinSlowdownFactor = 0.1 + MaxSlowdownFactor = 10.0 +) + // IsValidationError reports whether err is a validation error. func IsValidationError(err error) bool { return validation.IsError(err) @@ -26,6 +32,9 @@ func normalizeRedirect(vm VirtualModel) (VirtualModel, []core.ModelSelector, err vm.Source = strings.TrimSpace(vm.Source) vm.Description = strings.TrimSpace(vm.Description) vm.Strategy = normalizeStrategy(vm.Strategy) + if err := validateSlowdown(vm.Slowdown); err != nil { + return VirtualModel{}, nil, err + } if vm.Source == "" { return VirtualModel{}, nil, newValidationError("source is required", nil) @@ -78,6 +87,9 @@ func normalizeRedirect(vm VirtualModel) (VirtualModel, []core.ModelSelector, err // normalizePolicyInput trims a policy virtual model and normalizes its selector // and user paths from user-supplied input. func normalizePolicyInput(catalog Catalog, vm VirtualModel) (VirtualModel, error) { + if err := validateSlowdown(vm.Slowdown); err != nil { + return VirtualModel{}, err + } parts, err := modelselectors.NormalizeInput(catalog, vm.Source) if err != nil { return VirtualModel{}, err @@ -85,6 +97,9 @@ func normalizePolicyInput(catalog Catalog, vm VirtualModel) (VirtualModel, error vm.Source = parts.Selector vm.ProviderName = parts.ProviderName vm.Model = parts.Model + if vm.Slowdown > 0 && parts.Model == "" { + return VirtualModel{}, newValidationError("slowdown can only be configured for a model or redirect", nil) + } paths, err := normalizeUserPaths(vm.UserPaths) if err != nil { @@ -97,6 +112,9 @@ func normalizePolicyInput(catalog Catalog, vm VirtualModel) (VirtualModel, error // normalizeStoredPolicy normalizes a policy row loaded from storage. func normalizeStoredPolicy(vm VirtualModel) (VirtualModel, error) { + if err := validateSlowdown(vm.Slowdown); err != nil { + return VirtualModel{}, err + } parts, err := modelselectors.NormalizeStored(vm.Source, vm.ProviderName, vm.Model) if err != nil { return VirtualModel{}, err @@ -104,6 +122,9 @@ func normalizeStoredPolicy(vm VirtualModel) (VirtualModel, error) { vm.Source = parts.Selector vm.ProviderName = parts.ProviderName vm.Model = parts.Model + if vm.Slowdown > 0 && parts.Model == "" { + return VirtualModel{}, newValidationError("slowdown can only be configured for a model or redirect", nil) + } paths, err := normalizeUserPaths(vm.UserPaths) if err != nil { @@ -113,6 +134,16 @@ func normalizeStoredPolicy(vm VirtualModel) (VirtualModel, error) { return vm, nil } +func validateSlowdown(factor float64) error { + if factor == 0 { + return nil + } + if math.IsNaN(factor) || math.IsInf(factor, 0) || factor < MinSlowdownFactor || factor > MaxSlowdownFactor { + return newValidationError(fmt.Sprintf("slowdown must be 0 (disabled) or between %.1f and %.0f", MinSlowdownFactor, MaxSlowdownFactor), nil) + } + return nil +} + // normalizeUserPaths dedupes, normalizes, and sorts user paths. Empty input is // allowed and yields nil. func normalizeUserPaths(paths []string) ([]string, error) { diff --git a/web/dashboard/src/pages/models/ModelRow.svelte b/web/dashboard/src/pages/models/ModelRow.svelte index 2d8aff49c..345c33071 100644 --- a/web/dashboard/src/pages/models/ModelRow.svelte +++ b/web/dashboard/src/pages/models/ModelRow.svelte @@ -25,6 +25,15 @@ let { row, columns } = $props(); const pricing = $derived(pricingOverrides.modelRowPricing(row)); + const slowdown = $derived( + Number( + row.is_alias + ? row.alias && row.alias.slowdown + : (row.masking_alias && row.masking_alias.slowdown) || + (row.access && row.access.override && row.access.override.slowdown) || + 0, + ), + ); @@ -76,6 +85,11 @@ {/if} {/if} + {#if slowdown > 0} +
            + Slowdown +{slowdown}× inference time +
            + {/if} {#each columns as col, i (i)} @@ -146,7 +160,7 @@ {/if} {#if virtualModels.virtualModelsAvailable && !row.masking_alias} virtualModels.openVirtualModelEditModel(row)} > diff --git a/web/dashboard/src/pages/models/VirtualModelEditor.svelte b/web/dashboard/src/pages/models/VirtualModelEditor.svelte index 322e69f8f..f2fcbe2b3 100644 --- a/web/dashboard/src/pages/models/VirtualModelEditor.svelte +++ b/web/dashboard/src/pages/models/VirtualModelEditor.svelte @@ -175,6 +175,25 @@ > + {#if vm.vmFormSupportsSlowdown()} + + + + Adds a fraction of measured inference time: 0.5 adds 50%. Streaming chunks are buffered + and released on the slowed timeline. Leave empty to disable; accepted values are 0.1–10. + + + {/if} +
            {#if vm.vmFormMode === "edit"} diff --git a/web/dashboard/src/pages/models/virtualModels.svelte.js b/web/dashboard/src/pages/models/virtualModels.svelte.js index de74f9a69..96ed4a95a 100644 --- a/web/dashboard/src/pages/models/virtualModels.svelte.js +++ b/web/dashboard/src/pages/models/virtualModels.svelte.js @@ -32,6 +32,7 @@ import { vmFormHasPrimaryTarget, vmFormShowStrategy, vmFormShowWeights, + vmFormSupportsSlowdown, modelAccessUserPathsRestrict, removePrimaryTarget as removePrimaryTargetPure, } from "./virtualModelsLogic.js"; @@ -428,6 +429,9 @@ class VirtualModelsStore { user_paths: Array.isArray(alias.user_paths) ? alias.user_paths : [], description: String(alias.description || "").trim(), enabled: alias.enabled !== false, + ...(Number(alias.slowdown || 0) > 0 + ? { slowdown: Number(alias.slowdown) } + : {}), }, operation: "virtual model redirect", failureMessage: "Failed to remove redirect.", @@ -518,6 +522,10 @@ class VirtualModelsStore { return vmFormShowWeights(this.vmForm); } + vmFormSupportsSlowdown() { + return vmFormSupportsSlowdown(this.vmForm); + } + // The edit-modal status switch reuses the same .alias-toggle component and // three states, derived from the form's own fields: it is Restricted when // enabled and scoped to non-global user paths. @@ -599,6 +607,7 @@ class VirtualModelsStore { session_affinity: alias.session_affinity !== false, user_paths: (Array.isArray(alias.user_paths) ? alias.user_paths : []).join("\n"), description: alias.description || "", + slowdown: alias.slowdown || "", enabled: alias.enabled !== false, }; } @@ -643,6 +652,7 @@ class VirtualModelsStore { strategy: "round_robin", user_paths: userPaths.join("\n"), description: override && override.description ? override.description : "", + slowdown: override && override.slowdown ? override.slowdown : "", enabled: overrideEnabled, }; } @@ -671,6 +681,7 @@ class VirtualModelsStore { strategy: "round_robin", user_paths: userPaths.join("\n"), description: override && override.description ? override.description : "", + slowdown: override && override.slowdown ? override.slowdown : "", enabled: override ? override.enabled !== false : defaultEnabled, }; } diff --git a/web/dashboard/src/pages/models/virtualModelsLogic.js b/web/dashboard/src/pages/models/virtualModelsLogic.js index 834871e19..2f42d2555 100644 --- a/web/dashboard/src/pages/models/virtualModelsLogic.js +++ b/web/dashboard/src/pages/models/virtualModelsLogic.js @@ -214,6 +214,7 @@ export function mapRedirectView(view) { // Tri-state on the wire; only explicit false disables session affinity. session_affinity: view.session_affinity !== false, description: view.description || "", + slowdown: Number(view.slowdown || 0), enabled: view.enabled !== false, managed: Boolean(view.managed), valid: Boolean(view.valid), @@ -242,6 +243,7 @@ export function splitVirtualModelViews(views) { model: view.model || "", user_paths: Array.isArray(view.user_paths) ? view.user_paths : [], description: view.description || "", + slowdown: Number(view.slowdown || 0), enabled: view.enabled !== false, managed: Boolean(view.managed), scope_kind: view.scope_kind || "", @@ -731,6 +733,7 @@ export function defaultVirtualModelForm() { session_affinity: true, user_paths: "", description: "", + slowdown: "", enabled: true, }; } @@ -746,6 +749,14 @@ export function vmFormIsRedirect(form) { return collectExtraTargets(form && form.targets).length > 0; } +export function vmFormSupportsSlowdown(form) { + if (vmFormIsRedirect(form)) { + return true; + } + const source = String((form && form.source) || "").trim(); + return Boolean(source) && source !== GLOBAL_OVERRIDE_SELECTOR && !source.endsWith("/"); +} + // vmFormShowStrategy: the primary row is always visible, so the presence of a // second target row means the editor is configuring a load balancer — the // rows do not need to be filled yet for the strategy choice to be relevant. @@ -823,6 +834,10 @@ export function buildVirtualModelSavePayload(form, originalSource, mode) { description: String((form && form.description) || "").trim(), enabled: Boolean(form && form.enabled), }; + const slowdown = Number((form && form.slowdown) || 0); + if (Number.isFinite(slowdown) && slowdown !== 0) { + payload.slowdown = slowdown; + } if (isRename) { // Carry the prior key so the backend moves the row instead of leaving an // orphan behind under the old source. @@ -864,6 +879,10 @@ export function buildAliasTogglePayload(alias) { user_paths: Array.isArray(alias.user_paths) ? alias.user_paths : [], enabled: alias.enabled === false, }; + const slowdown = Number(alias.slowdown || 0); + if (slowdown > 0) { + payload.slowdown = slowdown; + } const lbTargets = Array.isArray(alias.targets) ? alias.targets : []; if (lbTargets.length > 1) { payload.strategy = alias.strategy || "round_robin"; @@ -892,19 +911,31 @@ export function buildModelTogglePayload(selector, existingPolicy, access) { const desired = !(safeAccess.effective_enabled !== false); const existingPaths = existingPolicy && Array.isArray(existingPolicy.user_paths) ? existingPolicy.user_paths : []; + const existingDescription = String((existingPolicy && existingPolicy.description) || "").trim(); + const existingSlowdown = Number((existingPolicy && existingPolicy.slowdown) || 0); + + const preserved = {}; + if (existingDescription) preserved.description = existingDescription; + if (existingSlowdown > 0) preserved.slowdown = existingSlowdown; let method = "PUT"; let payload; if (desired === false) { - payload = { source: selector, enabled: false, user_paths: existingPaths }; - } else if (existingPolicy && existingPaths.length === 0 && safeAccess.default_enabled !== false) { + payload = { source: selector, enabled: false, user_paths: existingPaths, ...preserved }; + } else if ( + existingPolicy && + existingPaths.length === 0 && + !existingDescription && + existingSlowdown === 0 && + safeAccess.default_enabled !== false + ) { // Removing a path-less policy only enables the model when the default is // on; in a default-disabled deployment we must keep an explicit enabled // policy instead of falling back to the default. method = "DELETE"; payload = { source: selector }; } else { - payload = { source: selector, enabled: true, user_paths: existingPaths }; + payload = { source: selector, enabled: true, user_paths: existingPaths, ...preserved }; } return { method, payload, desired }; } diff --git a/web/dashboard/tests/models-virtual-models.test.js b/web/dashboard/tests/models-virtual-models.test.js index 8e121d395..24e9ab5af 100644 --- a/web/dashboard/tests/models-virtual-models.test.js +++ b/web/dashboard/tests/models-virtual-models.test.js @@ -30,6 +30,7 @@ import { vmFormIsRedirect, vmFormShowStrategy, vmFormShowWeights, + vmFormSupportsSlowdown, } from "../src/pages/models/virtualModelsLogic.js"; function display(models, aliases, { available = true, activeCategory = "" } = {}) { @@ -87,6 +88,7 @@ test("splitVirtualModelViews parses redirect and policy Views", () => { enabled: true, valid: true, user_paths: ["/team/alpha"], + slowdown: 0.4, }, { source: "openai/gpt-4o", @@ -94,6 +96,7 @@ test("splitVirtualModelViews parses redirect and policy Views", () => { enabled: false, user_paths: ["/team/alpha"], managed: true, + slowdown: 0.2, }, null, ]); @@ -103,10 +106,12 @@ test("splitVirtualModelViews parses redirect and policy Views", () => { assert.equal(aliases[0].target_provider, "openai"); assert.equal(aliases[0].target_model, "gpt-4o"); assert.deepEqual(aliases[0].user_paths, ["/team/alpha"]); + assert.equal(aliases[0].slowdown, 0.4); assert.equal(policies.length, 1); assert.equal(policies[0].selector, "openai/gpt-4o"); assert.equal(policies[0].enabled, false); assert.equal(policies[0].managed, true); + assert.equal(policies[0].slowdown, 0.2); }); test("mapRedirectView keeps load-balanced targets, strategy, and labels them", () => { @@ -351,6 +356,17 @@ test("buildModelTogglePayload enabling a model with restricted paths sends PUT e assert.deepEqual(payload, { source: "openai/gpt-4o", enabled: true, user_paths: ["/team/alpha"] }); }); +test("buildModelTogglePayload preserves a configured slowdown instead of deleting the policy", () => { + const { method, payload } = buildModelTogglePayload( + "openai/gpt-4o", + { selector: "openai/gpt-4o", user_paths: [], enabled: false, slowdown: 0.5 }, + { selector: "openai/gpt-4o", default_enabled: true, effective_enabled: false }, + ); + assert.equal(method, "PUT"); + assert.equal(payload.enabled, true); + assert.equal(payload.slowdown, 0.5); +}); + test("buildAliasTogglePayload flips an alias enabled flag preserving the target", () => { const payload = buildAliasTogglePayload({ name: "smart", @@ -369,6 +385,16 @@ test("buildAliasTogglePayload flips an alias enabled flag preserving the target" }); }); +test("buildAliasTogglePayload preserves an alias slowdown", () => { + const payload = buildAliasTogglePayload({ + name: "slow", + target_model: "openai/gpt-4o", + slowdown: 1.5, + enabled: true, + }); + assert.equal(payload.slowdown, 1.5); +}); + test("buildAliasTogglePayload round-trips every target and strategy for a cost alias", () => { const payload = buildAliasTogglePayload({ name: "smart", @@ -454,6 +480,36 @@ test("save payload sends a policy body when target_model is empty", () => { }); }); +test("save payload includes a configured slowdown and omits disabled slowdown", () => { + const configured = buildVirtualModelSavePayload( + { source: "slow", target_model: "openai/gpt-4o", targets: [], slowdown: 2.5, enabled: true }, + "", + "create", + ); + assert.equal(configured.payload.slowdown, 2.5); + + const disabled = buildVirtualModelSavePayload( + { source: "fast", target_model: "openai/gpt-4o", targets: [], slowdown: "", enabled: true }, + "", + "create", + ); + assert.equal(Object.prototype.hasOwnProperty.call(disabled.payload, "slowdown"), false); + + const invalid = buildVirtualModelSavePayload( + { source: "invalid", target_model: "openai/gpt-4o", targets: [], slowdown: 10.1, enabled: true }, + "", + "create", + ); + assert.equal(invalid.payload.slowdown, 10.1); +}); + +test("slowdown is available for redirects and model policies only", () => { + assert.equal(vmFormSupportsSlowdown({ source: "slow", target_model: "openai/gpt-4o" }), true); + assert.equal(vmFormSupportsSlowdown({ source: "openai/gpt-4o", target_model: "" }), true); + assert.equal(vmFormSupportsSlowdown({ source: "openai/", target_model: "" }), false); + assert.equal(vmFormSupportsSlowdown({ source: "/", target_model: "" }), false); +}); + test("save payload carries old_source only when an edit renames the Source", () => { const renamed = buildVirtualModelSavePayload( { source: "smarter", target_model: "openai/gpt-4o", targets: [], enabled: true }, From dad5a6628af3c81716ba3e38e15d63b9ae4d1c38 Mon Sep 17 00:00:00 2001 From: "Jakub A. W" Date: Tue, 11 Aug 2026 13:41:47 +0200 Subject: [PATCH 2/4] fix(streaming): preserve usage accounting on slowdown --- .env.template | 4 +- config/config.example.yaml | 2 +- config/virtualmodels.go | 5 +- docs/features/virtual-models.mdx | 16 +- docs/openapi.json | 44 +++- .../{index-BoW-V4GJ.js => index-DiApg2WK.js} | 13 +- .../admin/dashboard/static/dist/index.html | 2 +- internal/admin/handler_virtualmodels.go | 4 +- internal/admin/handler_virtualmodels_test.go | 75 ++++--- internal/gateway/inference_execute.go | 9 +- internal/gateway/inference_orchestrator.go | 16 ++ .../gateway/request_model_resolution_test.go | 52 +++-- internal/gateway/slowdown_test.go | 49 +++-- internal/server/audio_service_test.go | 149 +++++++++++++ internal/server/messages_handler.go | 3 +- internal/server/stream_slowdown_test.go | 106 ++++++++++ .../server/translated_inference_service.go | 8 +- internal/streaming/slowdown_stream.go | 61 ++++-- internal/streaming/slowdown_stream_test.go | 46 ++++ internal/virtualmodels/config_overlay_test.go | 38 +++- internal/virtualmodels/service.go | 2 +- internal/virtualmodels/slowdown.go | 8 +- internal/virtualmodels/slowdown_test.go | 199 ++++++++++-------- internal/virtualmodels/store_mongodb.go | 2 +- internal/virtualmodels/store_sql.go | 4 +- internal/virtualmodels/store_test.go | 29 ++- internal/virtualmodels/types.go | 9 +- internal/virtualmodels/validation.go | 9 +- tools/openapi-postprocess.mjs | 22 ++ .../src/pages/models/ModelRow.svelte | 15 +- .../pages/models/VirtualModelEditor.svelte | 5 +- .../src/pages/models/virtualModels.svelte.js | 10 +- .../src/pages/models/virtualModelsLogic.js | 30 ++- .../tests/models-virtual-models.test.js | 29 ++- 34 files changed, 817 insertions(+), 258 deletions(-) rename internal/admin/dashboard/static/dist/assets/{index-BoW-V4GJ.js => index-DiApg2WK.js} (91%) create mode 100644 internal/server/stream_slowdown_test.go diff --git a/.env.template b/.env.template index 03e01be03..340b66ca6 100644 --- a/.env.template +++ b/.env.template @@ -202,8 +202,8 @@ # and is read-only in the dashboard. The same entries can be declared under # `virtual_models:` in config.yaml. Each entry: source, target (single) or # targets[] (load balanced), strategy (round_robin | cost), user_paths, -# slowdown (extra-time factor, 0.1-10), description, enabled. A target has model -# and optional provider + weight. +# slowdown (0 disables inherited slowdown; active factors are 0.1-10), +# description, enabled. A target has model and optional provider + weight. # VIRTUAL_MODELS=[{"source":"smart","strategy":"round_robin","targets":[{"model":"openai/gpt-4o","weight":2},{"model":"anthropic/claude-sonnet-4-6"}]}] # Failover & Workflow Configuration diff --git a/config/config.example.yaml b/config/config.example.yaml index 669a59dcf..228759ef4 100644 --- a/config/config.example.yaml +++ b/config/config.example.yaml @@ -61,7 +61,7 @@ models: # virtual_models: # - source: regular # a plain alias # target: anthropic/claude-sonnet-4-6 -# slowdown: 0.5 # add 50% of measured inference time (range: 0.1-10) +# slowdown: 0.5 # add 50%; use 0 to disable inherited slowdown (active range: 0.1-10) # - source: smart # weighted round-robin load balancer # strategy: round_robin # round_robin (default) | cost | adaptive (uses a routing extension when registered; otherwise falls back to round_robin) # targets: diff --git a/config/virtualmodels.go b/config/virtualmodels.go index c36f94aa3..a191d5370 100644 --- a/config/virtualmodels.go +++ b/config/virtualmodels.go @@ -41,8 +41,9 @@ type VirtualModelConfig struct { Description string `yaml:"description,omitempty" json:"description,omitempty"` // Slowdown is an optional extra-time factor. For example, 0.5 adds 50% of - // measured inference time. Zero disables slowdown. - Slowdown float64 `yaml:"slowdown,omitempty" json:"slowdown,omitempty"` + // measured inference time. Zero explicitly disables inherited slowdown; + // nil leaves the setting unspecified. + Slowdown *float64 `yaml:"slowdown,omitempty" json:"slowdown,omitempty"` // Enabled toggles the entry. It defaults to true when omitted. Enabled *bool `yaml:"enabled,omitempty" json:"enabled,omitempty"` diff --git a/docs/features/virtual-models.mdx b/docs/features/virtual-models.mdx index 4f475baad..bef9071d6 100644 --- a/docs/features/virtual-models.mdx +++ b/docs/features/virtual-models.mdx @@ -38,10 +38,11 @@ user-path restriction. ## Add artificial model latency Set **Slowdown** on a concrete model or redirect to add a fraction of measured -inference time. The accepted range is `0.1` to `10`; for example, `0.5` adds -50%, so a response that takes 2 seconds upstream is returned after about 3 -seconds. Leaving the field empty disables slowdown. Delays honor request -cancellation. +inference time. Active values range from `0.1` to `10`; for example, `0.5` +adds 50%, so a response that takes 2 seconds upstream is returned after about +3 seconds. Set `0` to explicitly disable slowdown, including slowdown inherited +from a concrete model. Leaving the field empty leaves the setting unspecified. +Delays honor request cancellation. For Chat Completions and Responses API SSE streams, GoModel drains the upstream in the background and releases each read chunk on the scaled timeline. This @@ -51,8 +52,8 @@ substantial memory. Realtime WebSocket sessions are not slowed. When an alias and its concrete target both have a slowdown, the alias value wins. An alias without its own value inherits the selected target model's -slowdown. This also applies to load-balanced virtual models after a target is -selected. +slowdown; set the alias to `0` to override that inheritance. This also applies +to load-balanced virtual models after a target is selected. The rest of this page covers redirects. @@ -164,7 +165,8 @@ VIRTUAL_MODELS=[{"source":"smart","strategy":"cost","targets":[{"model":"openai/ Each entry accepts `source`, a single `target` (shorthand) or a `targets` list, `strategy` (`round_robin` or `cost`), `session_affinity` (default `true`; see [Session Keeping](/features/session-keeping)), `user_paths`, `description`, -`slowdown` (an extra-time factor from `0.1` to `10`), and `enabled`. +`slowdown` (`0` disables inherited slowdown; active factors range from `0.1` to +`10`), and `enabled`. Leave the targets empty to declare an access policy on the `source` selector. An invalid declaration (unknown strategy, missing or self-referential target, or a target `provider` that matches no configured provider — a typo) fails startup diff --git a/docs/openapi.json b/docs/openapi.json index 6ca8bb391..05d320fb1 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -11054,7 +11054,19 @@ }, "slowdown": { "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", - "type": "number" + "oneOf": [ + { + "type": "number", + "enum": [ + 0 + ] + }, + { + "type": "number", + "minimum": 0.1, + "maximum": 10 + } + ] }, "source": { "type": "string" @@ -14397,7 +14409,19 @@ }, "slowdown": { "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", - "type": "number" + "oneOf": [ + { + "type": "number", + "enum": [ + 0 + ] + }, + { + "type": "number", + "minimum": 0.1, + "maximum": 10 + } + ] }, "source": { "type": "string" @@ -14452,8 +14476,20 @@ "type": "boolean" }, "slowdown": { - "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", - "type": "number" + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it. Nil\nleaves the setting unspecified so an alias can inherit its target model.", + "oneOf": [ + { + "type": "number", + "enum": [ + 0 + ] + }, + { + "type": "number", + "minimum": 0.1, + "maximum": 10 + } + ] }, "source": { "type": "string" diff --git a/internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js b/internal/admin/dashboard/static/dist/assets/index-DiApg2WK.js similarity index 91% rename from internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js rename to internal/admin/dashboard/static/dist/assets/index-DiApg2WK.js index f0789ebc6..dff92e905 100644 --- a/internal/admin/dashboard/static/dist/assets/index-BoW-V4GJ.js +++ b/internal/admin/dashboard/static/dist/assets/index-DiApg2WK.js @@ -21,18 +21,19 @@ moves the rule to a new key and restarts its live counters.

            `),KD=B(`

            A user path rule limits the whole subtree; provider and model rules cap all traffic routed there and make load balancing skip the target while it is saturated. One shared counter per rule. Leave a field empty to - skip that limit. Token limits require usage tracking.

            `,1);function qD(e,t){O(t,!0);{let t=A(()=>Z.rateLimitEditing?`Edit Rate Limit`:`Create Rate Limit`);ME(e,{get open(){return Z.rateLimitFormOpen},get title(){return R(t)},ariaLabel:`Rate limit editor`,get error(){return Z.rateLimitFormError},get submitting(){return Z.rateLimitFormSubmitting},submitLabel:`Save Rate Limit`,dialogClass:`budget-editor`,novalidate:!0,onclose:()=>Z.closeRateLimitForm(),onsubmit:()=>Z.submitRateLimitForm(),children:(e,t)=>{var n=KD(),r=F(n),i=P(r);PE(i,{id:`rate-limit-scope`,label:`Scope`,children:(e,t)=>{var n=zD();W(n,21,()=>Z.rateLimitScopeOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitScope()),Ui(n,()=>Z.rateLimitForm.scope,e=>Z.rateLimitForm.scope=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2);{let e=A(()=>Z.rateLimitSubjectFieldLabel());PE(a,{id:`rate-limit-subject`,get label(){return R(e)},children:(e,t)=>{var n=BD();ea(n),L(e=>{K(n,`placeholder`,e),K(n,`data-modal-autofocus`,!Z.rateLimitEditing||void 0),ta(n,Z.rateLimitForm.subject)},[()=>Z.rateLimitSubjectPlaceholder()]),z(`input`,n,e=>Z.setRateLimitFormSubject(e.currentTarget.value)),V(e,n)},$$slots:{default:!0}})}var o=I(a,2);PE(o,{id:`rate-limit-period`,label:`Period`,children:(e,t)=>{var n=VD();W(n,21,()=>Z.rateLimitPeriodOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitPeriodSeconds()),Ui(n,()=>Z.rateLimitForm.period,e=>Z.rateLimitForm.period=e),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=e=>{PE(e,{id:`rate-limit-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=HD();ea(n),la(n,()=>Z.rateLimitForm.period_seconds,e=>Z.rateLimitForm.period_seconds=e),V(e,n)},$$slots:{default:!0}})};U(s,e=>{Z.rateLimitForm.period===`custom`&&e(c)});var l=I(s,2);{let e=A(()=>Z.rateLimitForm.period===`concurrent`?`Max In-Flight Requests`:`Max Requests`);PE(l,{id:`rate-limit-max-requests`,get label(){return R(e)},children:(e,t)=>{var n=UD();ea(n),L(()=>K(n,`data-modal-autofocus`,Z.rateLimitEditing?!0:void 0)),la(n,()=>Z.rateLimitForm.max_requests,e=>Z.rateLimitForm.max_requests=e),V(e,n)},$$slots:{default:!0}})}var u=I(l,2),d=e=>{PE(e,{id:`rate-limit-max-tokens`,label:`Max Tokens`,children:(e,t)=>{var n=WD();ea(n),la(n,()=>Z.rateLimitForm.max_tokens,e=>Z.rateLimitForm.max_tokens=e),V(e,n)},$$slots:{default:!0}})};U(u,e=>{Z.rateLimitForm.period!==`concurrent`&&e(d)}),D(r);var f=I(r,4),p=e=>{V(e,GD())};U(f,e=>{Z.rateLimitEditing&&e(p)}),V(e,n)},$$slots:{default:!0}})}k()}Br([`change`,`input`]);var JD=B(` `),YD=B(` Edit`,1),XD=B(` `,1),ZD=B(`
            In-flight
            `),QD=B(`
            Requests
            `),$D=B(`
            Tokens
            `),eO=B(`
            `),tO=B(`
            `);function nO(e,t){O(t,!0);var n=tO();W(n,21,()=>t.rules,e=>Z.rateLimitKey(e),(e,t)=>{var n=eO(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=e=>{var n=JD(),r=P(n);{let e=A(()=>Z.rateLimitScope(R(t))===`provider`?bo:Pa);J(r,{get icon(){return R(e)},class:`budget-period-icon`})}var i=I(r,2),a=P(i,!0);D(i),D(n),L((e,t)=>{K(n,`title`,e),H(a,t)},[()=>`Rule scope: `+Z.rateLimitScopeLabel(R(t)),()=>Z.rateLimitScopeLabel(R(t))]),V(e,n)},u=A(()=>Z.rateLimitScope(R(t))!==`user_path`);U(c,e=>{R(u)&&e(l)});var d=I(c,2),f=P(d);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?ka:ko);J(f,{get icon(){return R(e)},class:`budget-period-icon`})}var p=I(f,2),m=P(p,!0);D(p),D(d),D(s);var h=I(s,2),g=P(h),_=P(g),v=P(_,!0);D(_),D(g);var y=I(g,2),b=P(y),x=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitForm(R(t)),children:(e,t)=>{var n=YD();J(F(n),{get icon(){return uo},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},S=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(b,e=>{R(S)&&e(x)});var C=I(b,2);{let e=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting counters`:`Reset counters`),n=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t)));OT(C,{get label(){return R(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>Z.resetRateLimit(R(t)),get disabled(){return R(n)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return go},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting`:`Reset`]),V(e,r)},$$slots:{default:!0}})}var w=I(C,2),T=e=>{{let n=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting rate limit`:`Delete rate limit`),r=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t)));OT(e,{get label(){return R(n)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>Z.deleteRateLimit(R(t)),get disabled(){return R(r)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return Ao},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting`:`Delete`]),V(e,r)},$$slots:{default:!0}})}},E=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(w,e=>{R(E)&&e(T)}),D(y),D(h),D(i);var ee=I(i,2),te=P(ee),ne=e=>{var n=ZD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u),D(l),D(o),D(n),L((e,t,n,r,i,l)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l)},[()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests),()=>`In-flight requests: `+Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` in flight`]),V(e,n)},re=A(()=>Z.rateLimitIsConcurrent(R(t)));U(te,e=>{R(re)&&e(ne)});var ie=I(te,2),ae=e=>{var n=QD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests),()=>`Requests used: `+Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` requests`,()=>Z.formatRateLimitNumber(R(t).requests_remaining)+` left`]),V(e,n)},oe=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_requests);U(ie,e=>{R(oe)&&e(ae)});var se=I(ie,2),ce=e=>{var n=$D(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens),()=>`Tokens used: `+Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)>=100}),()=>Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens)+` tokens`,()=>Z.formatRateLimitNumber(R(t).tokens_remaining)+` left`]),V(e,n)},le=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_tokens);U(se,e=>{R(le)&&e(ce)}),D(ee),D(r),D(n),L((e,t,n,r,i)=>{K(a,`title`,e),H(o,t),H(m,n),K(_,`title`,r),H(v,i)},[()=>Z.rateLimitScopeLabel(R(t))+`: `+Z.rateLimitSubject(R(t)),()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n),k()}var rO=B(`

            Rate Limits

            `),iO=B(``),aO=B(`
            Rate limit management is unavailable.
            `),oO=B(``),sO=B(`
            `),cO=B(`

            No rate limits configured yet.

            `),lO=B(`

            No rate limits match your filter.

            `),uO=B(`
            `);function dO(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`rate-limits`&&Z.fetchRateLimitsPage()});let n=A(()=>Z.filteredRateLimits());var r=uO(),i=P(r),a=P(i);iC(P(a),{copyId:`rate-limits-help-copy`,label:`rate limits help`,text:`Rate limits cap requests, tokens, and in-flight concurrency for a user path subtree, a provider, or a model. Consumer (user path) breaches return 429 with Retry-After and x-ratelimit-* headers; saturated providers and models are skipped by load balancing and failover while capacity exists elsewhere. Counters are per gateway instance and reset on restart; token limits need usage tracking.`,title:e=>{V(e,rO())},$$slots:{title:!0}}),D(a);var o=I(a,2),s=P(o),c=e=>{var t=iO();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=Z.rateLimitFormSubmitting),z(`click`,t,()=>Z.openRateLimitForm()),V(e,t)},l=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitsAvailable&&!Y.authError);U(s,e=>{R(l)&&e(c)}),D(o),D(i);var u=I(i,2);Kc(u,{});var d=I(u,2),f=e=>{V(e,aO())},p=A(()=>(!Z.rateLimitsEnabled()||!Z.rateLimitsAvailable)&&!Y.authError);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{var t=oO(),n=P(t,!0);D(t),L(()=>H(n,Z.rateLimitError)),V(e,t)};U(m,e=>{Z.rateLimitError&&!Y.authError&&e(h)});var g=I(m,2),_=e=>{ET(e,{label:`Loading rate limits...`})};U(g,e=>{Z.rateLimitsLoading&&!Y.authError&&e(_)});var v=I(g,2),y=e=>{var t=sO(),n=P(t);jw(P(n),{id:`rate-limit-filter`,placeholder:`Filter by subject, scope, or period...`,label:`Filter rate limits by subject, scope, or period`,get value(){return Z.rateLimitFilter},set value(e){Z.rateLimitFilter=e}}),D(n),D(t),V(e,t)};U(v,e=>{(Z.rateLimits.length>0||Z.rateLimitFilter)&&Z.rateLimitsAvailable&&!Y.authError&&!Z.rateLimitFormOpen&&e(y)});var b=I(v,2);qD(b,{});var x=I(b,2),S=e=>{nO(e,{get rules(){return R(n)}})};U(x,e=>{R(n).length>0&&Z.rateLimitsAvailable&&!Y.authError&&e(S)});var C=I(x,2),w=e=>{V(e,cO())},T=A(()=>Z.rateLimits.length===0&&!Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{V(e,lO())},te=A(()=>Z.rateLimits.length>0&&R(n).length===0&&Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(E,e=>{R(te)&&e(ee)}),D(r),V(e,r),k()}Br([`click`]);function fO(e){return String(e||``).trim().toLowerCase()}function pO(e){if(!e)return``;let t=String(e.selector||``).trim();if(t)return t;if(!e.model||!e.model.id)return``;let n=String(e.model.id||``).trim(),r=String(e.provider_name||``).trim();if(r)return r+`/`+n;let i=String(e.provider_type||``).trim();return!i||n.includes(`/`)?n:i+`/`+n}function mO(e,t,n,r){let i=new Set,a=String(e||``).trim().toLowerCase(),o=String(t||``).trim().toLowerCase(),s=String(n||``).trim().toLowerCase(),c=String(r||``).trim().toLowerCase();if(c&&i.add(c),!a)return i;i.add(a),s&&i.add(s+`/`+a),o&&!a.includes(`/`)&&i.add(o+`/`+a);let l=a.split(`/`);return l.length===2&&l[1]&&i.add(l[1]),i}function hO(e){return mO(e&&e.model?e.model.id:``,e?e.provider_type:``,e?e.provider_name:``,e?e.selector:``)}function gO(e){let t=new Set,n=String(e.resolved_model||``).trim().toLowerCase(),r=String(e.target_model||``).trim().toLowerCase(),i=String(e.target_provider||``).trim().toLowerCase();if(n){t.add(n);let e=n.split(`/`);e.length===2&&e[1]&&t.add(e[1])}if(r){t.add(r);let e=r.split(`/`);e.length===2&&e[1]&&t.add(e[1])}return r&&i&&t.add(i+`/`+r),t}function _O(e){if(!e)return``;let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n||n===t||n.startsWith(t+`/`)?n:t+`/`+n}function vO(e){if(e===``||e==null)return null;let t=Number(e);return!Number.isFinite(t)||t<=0?null:t}function yO(e,t){let n={model:e},r=vO(t);return r!==null&&(n.weight=r),n}function bO(e){let t=Array.isArray(e)?e:[],n=[];for(let e of t){let t=String(e&&e.model||``).trim();t&&n.push(yO(t,e&&e.weight))}return n}function xO(e){switch(String(e||``).toLowerCase()){case`cost`:return`lowest cost`;case`round_robin`:case``:return`round robin`;default:return e}}var SO={round_robin:`Round-robin (rotate across targets; honors weights)`,cost:`Lowest cost (cheapest target per request)`,adaptive:`Adaptive (target chosen by the registered routing extension)`};function CO(e,t){let n=Array.isArray(e)?[...e]:[],r=String(t||``).trim().toLowerCase();return r&&!n.includes(r)&&n.push(r),n.map(e=>({value:e,label:SO[e]||e}))}function wO(e){let t=Array.isArray(e.targets)?e.targets:[],n=t.length>0?t[0]:{},r=t.map(e=>{let t={provider:e.provider||``,model:e.model||``};return e.weight&&(t.weight=e.weight),t});return{name:e.source,target_provider:n.provider||``,target_model:n.model||``,targets:r,strategy:e.strategy||``,session_affinity:e.session_affinity!==!1,description:e.description||``,slowdown:Number(e.slowdown||0),enabled:e.enabled!==!1,managed:!!e.managed,valid:!!e.valid,resolved_model:e.resolved_model||``,provider_type:e.provider_type||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[]}}function TO(e){let t=Array.isArray(e)?e:[],n=[],r=[];for(let e of t)!e||typeof e!=`object`||(e.kind===`redirect`?n.push(wO(e)):e.kind===`policy`&&r.push({selector:e.source,provider_name:e.provider_name||``,model:e.model||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[],description:e.description||``,slowdown:Number(e.slowdown||0),enabled:e.enabled!==!1,managed:!!e.managed,scope_kind:e.scope_kind||``}));return{aliases:n,policies:r}}function EO(e){if(!e)return`—`;let t=Array.isArray(e.targets)?e.targets:[];return t.length>1?t.length+` targets · `+xO(e.strategy):e.resolved_model?e.resolved_model:e.target_provider?e.target_provider+`/`+e.target_model:e.target_model||`—`}function DO(e){return e?e.enabled===!1?`is-disabled`:e.valid?`is-valid`:`is-invalid`:`is-invalid`}function OO(e){return e?e.enabled===!1?`Disabled`:e.valid?`Active`:`Invalid`:`Invalid`}function kO(e){return Array.isArray(e)&&e.length>0&&e.indexOf(`/`)===-1}function AO(e,t){return!t||!e?``:e.effective_enabled===!1?`is-disabled`:kO(e.user_paths)?`is-restricted`:`is-enabled`}function jO(e){if(!e)return``;let t=[];e.effective_enabled===!1&&t.push(e.default_enabled===!1?`Disabled by default`:`Disabled`);let n=Array.isArray(e.user_paths)?e.user_paths:[];return n.length>0&&t.push(`Allowed for `+n.join(`, `)),t.join(` · `)}function MO({models:e,aliases:t,virtualModelsAvailable:n,activeCategory:r}){let i=Array.isArray(e)?e:[],a=Array.isArray(t)?t:[],o=new Map;if(n)for(let e of a){let t=fO(e&&e.name);!t||e.enabled===!1||!e.valid||o.set(t,e)}let s=new Map,c=i.map(e=>{let t=pO(e),n=null;for(let t of hO(e))s.has(t)||s.set(t,e),!n&&o.has(t)&&(n=o.get(t));let r=e&&e.access?e.access:null;return{key:`model:`+t,display_name:t,secondary_name:``,provider_name:e.provider_name||``,provider_type:e.provider_type||``,model:e.model,selector:e.selector||``,is_alias:!1,alias:null,access:r,masking_alias:n,has_virtual_model:!!(n||r&&r.override),alias_state_class:``,alias_state_text:``}});if(!n)return c;for(let e of a){let t=s.get(fO(e&&e.name));if(e&&e.enabled!==!1&&e.valid&&t)continue;let n=null;for(let t of gO(e))if(n=s.get(t)||null,n)break;!n&&r&&r!==`all`||c.push({key:`alias:`+e.name,display_name:e.name,secondary_name:EO(e),provider_name:n&&n.provider_name||``,provider_type:n?n.provider_type||e.provider_type||``:e.provider_type||``,model:n?n.model:{id:e.name,object:`model`},selector:``,is_alias:!0,alias:e,access:null,masking_alias:null,source_model_exists:!!t,has_virtual_model:!0,alias_state_class:DO(e),alias_state_text:OO(e)})}return c.sort((e,t)=>e.is_alias===t.is_alias?String(e.display_name||``).localeCompare(String(t.display_name||``)):e.is_alias?-1:1)}function NO(e,t){if(!t)return e;let n=String(t).toLowerCase();return e.filter(e=>[e.display_name,e.secondary_name,e.provider_name,e.provider_type,e.model&&e.model.owned_by,e.alias&&e.alias.description,e.alias&&e.alias_state_text,e.model&&e.model.metadata&&e.model.metadata.modes?e.model.metadata.modes.join(`,`):``,e.model&&e.model.metadata&&e.model.metadata.categories?e.model.metadata.categories.join(`,`):``].some(e=>String(e||``).toLowerCase().includes(n)))}function PO(e,t){return String(e||``).trim()||String(t||``).trim()||`Unassigned`}function FO(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return!r||r===n?``:r}function IO(e){let t=String(e||``).trim();return t?t+`/`:``}function LO(e){let t=Array.isArray(e)?e:[],n=t.filter(e=>e&&!e.is_alias).length,r=t.filter(e=>e&&e.is_alias).length,i=[];return n>0&&i.push(n+(n===1?` model`:` models`)),r>0&&i.push(r+(r===1?` alias`:` aliases`)),i.join(` · `)}function RO(e,t,n){let r=String(t||``).trim(),i=String(n||``).trim();for(let t of Array.isArray(e)?e:[]){let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim();if(!(r&&e!==r)&&!(!r&&i&&n!==i)&&t&&t.access)return t.access.default_enabled!==!1}return!0}function zO(e){for(let t of Array.isArray(e)?e:[])if(t&&t.access)return t.access.default_enabled!==!1;return!0}function BO(e,t){let n=String(t||``).trim();if(!n)return null;for(let t of Array.isArray(e)?e:[])if(String(t&&t.selector||``).trim()===n)return t;return null}function VO(e,t,n,r){let i=IO(t),a=r&&r.get(`/`)||null,o=i&&r&&r.get(i)||null,s=RO(e,t,n),c=o||a,l=c&&Array.isArray(c.user_paths)?Array.from(new Set(c.user_paths)).sort():[];return{selector:i,default_enabled:s,effective_enabled:c?c.enabled!==!1:s,user_paths:l,override:o}}function HO(e,t,n){if(!Array.isArray(e)||e.length===0)return[];let r=new Map;for(let e of Array.isArray(n)?n:[]){let t=String(e&&e.selector||``).trim();t&&r.set(t,e)}let i=[],a=new Map;for(let t of e){if(t&&t.is_alias){i.push(t);continue}let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim(),r=`provider-group:`+(e||n||`unassigned`);a.has(r)||a.set(r,{key:r,provider_name:e,provider_type:n,display_name:PO(e,n),type_label:FO(e,n),rows:[]});let o=a.get(r);!o.provider_name&&e&&(o.provider_name=e),!o.provider_type&&n&&(o.provider_type=n),o.display_name=PO(o.provider_name,o.provider_type),o.type_label=FO(o.provider_name,o.provider_type),o.rows.push(t)}let o=Array.from(a.values()).map(e=>{let n=VO(t,e.provider_name,e.provider_type,r);return{...e,access:n,access_summary:jO(n),item_count_label:LO(e.rows)}}).sort((e,t)=>String(e.display_name||``).localeCompare(String(t.display_name||``)));return i.length>0&&o.unshift({key:`virtual-model-group`,is_virtual_models:!0,provider_name:``,provider_type:``,display_name:`Virtual models`,type_label:``,rows:i,access:{selector:``},access_summary:``,item_count_label:LO(i)}),o}function UO(e,t){let n=BO(t,`/`),r=zO(e),i=n&&Array.isArray(n.user_paths)?n.user_paths:[];return{key:`scope-global`,is_alias:!1,display_name:`all providers and models`,access:{selector:`/`,default_enabled:r,effective_enabled:n?n.enabled!==!1:r,user_paths:i,override:n}}}function WO(e){return e?String(e.access&&e.access.selector||``).trim()||String(e.override_selector||``).trim()||pO(e):``}function GO(e){if(!e)return[];let t=[];return e.is_alias?t.push(`alias-row`,DO(e.alias)):e.has_virtual_model&&t.push(`alias-row`,`is-valid`),!e.is_alias&&e.masking_alias&&t.push(`masked-model-row`),!e.is_alias&&e.access&&e.access.effective_enabled===!1&&t.push(`model-access-disabled-row`),t}function KO(e){return!!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)}function qO(e){return!!(e&&!e.is_alias&&e.masking_alias&&e.masking_alias.name&&!e.masking_alias.managed)}function JO(e){return e&&e.is_alias&&e.alias&&e.alias.name?`alias-row-`+String(e.alias.name).replace(/[^a-zA-Z0-9_-]+/g,`-`):``}function YO(e){return e?e.is_alias?!!(e.alias&&e.alias.managed):!!(e.access&&e.access.override&&e.access.override.managed||e.masking_alias&&e.masking_alias.managed):!1}function XO(e){return!!(e&&e.override)}function ZO(e){return e?`table-action-btn-active`:``}function QO(e,t){let n=`Edit `+String(e||`model access`);return t?n+` (virtual model exists)`:n}function $O(){return{source:``,target_model:``,target_weight:1,targets:[],strategy:`round_robin`,session_affinity:!0,user_paths:``,description:``,slowdown:``,enabled:!0}}function ek(e){return String(e&&e.target_model||``).trim()!==``}function tk(e){return String(e&&e.target_model||``).trim()?!0:bO(e&&e.targets).length>0}function nk(e){if(tk(e))return!0;let t=String(e&&e.source||``).trim();return!!t&&t!==`/`&&!t.endsWith(`/`)}function rk(e){return!!e&&Array.isArray(e.targets)&&e.targets.length>0}function ik(e){return rk(e)&&String(e&&e.strategy||``).toLowerCase()!==`cost`}function ak(e){let t=Array.isArray(e.targets)?e.targets:[];if(t.length>0){let n=t.shift();e.target_model=n.model||``,e.target_weight=n.weight||1;return}e.target_model=``,e.target_weight=1}function ok(e){let t=Array.isArray(e&&e.targets)?e.targets:[];return t.length>0?{primaryModel:_O(t[0]),primaryWeight:t[0].weight||1,extraTargets:t.slice(1).map(e=>({model:_O(e),weight:e.weight||1}))}:{primaryModel:e&&e.target_provider?e.target_provider+`/`+e.target_model:e&&e.target_model||``,primaryWeight:1,extraTargets:[]}}function sk(e){return String(e||``).split(/\r?\n|,/).map(e=>String(e||``).trim()).filter(Boolean)}function ck(e,t,n){let r=String(e&&e.source||``).trim(),i=String(e&&e.target_model||``).trim(),a=bO(e&&e.targets),o=tk(e),s=String(t||``).trim(),c=n===`edit`&&!!s&&r!==s,l={source:r,user_paths:sk(e&&e.user_paths),description:String(e&&e.description||``).trim(),enabled:!!(e&&e.enabled)},u=Number(e&&e.slowdown||0);if(Number.isFinite(u)&&u!==0&&(l.slowdown=u),c&&(l.old_source=s),o){let t=[];if(i&&t.push(yO(i,e.target_weight)),t.push(...a),t.length>1){let n=e.strategy||`round_robin`;l.targets=n===`cost`?t.map(e=>({model:e.model})):t,l.strategy=n,e&&e.session_affinity===!1&&(l.session_affinity=!1)}else l.target_model=t[0].model}return{payload:l,source:r,isRedirect:o,isRename:c}}function lk(e){let t={source:e.name,description:String(e.description||``).trim(),user_paths:Array.isArray(e.user_paths)?e.user_paths:[],enabled:e.enabled===!1},n=Number(e.slowdown||0);n>0&&(t.slowdown=n);let r=Array.isArray(e.targets)?e.targets:[];return r.length>1?(t.strategy=e.strategy||`round_robin`,e.session_affinity===!1&&(t.session_affinity=!1),t.targets=t.strategy===`cost`?r.map(e=>({model:_O(e)})):r.map(e=>yO(_O(e),e.weight))):r.length===1?t.target_model=_O(r[0]):t.target_model=e.target_provider?e.target_provider+`/`+e.target_model:e.target_model,t}function uk(e,t,n){let r=n||{},i=r.effective_enabled===!1,a=t&&Array.isArray(t.user_paths)?t.user_paths:[],o=String(t&&t.description||``).trim(),s=Number(t&&t.slowdown||0),c={};o&&(c.description=o),s>0&&(c.slowdown=s);let l=`PUT`,u;return i===!1?u={source:e,enabled:!1,user_paths:a,...c}:t&&a.length===0&&!o&&s===0&&r.default_enabled!==!1?(l=`DELETE`,u={source:e}):u={source:e,enabled:!0,user_paths:a,...c},{method:l,payload:u,desired:i}}function dk(e,t,n){let r=Math.max(1,Number(t||75)),i=Math.min(n,e+r);return{limit:i,rendering:iMO({models:Wc.models,aliases:this.aliases,virtualModelsAvailable:this.virtualModelsAvailable,activeCategory:Wc.activeCategory}));get displayModels(){return R(this.#T)}set displayModels(e){M(this.#T,e)}#E=A(()=>HO(this.displayModels,Wc.models,this.modelOverrideViews));get displayModelGroups(){return R(this.#E)}set displayModelGroups(e){M(this.#E,e)}#D=A(()=>NO(this.displayModels,Wc.filter));get filteredDisplayModels(){return R(this.#D)}set filteredDisplayModels(e){M(this.#D,e)}#O=A(()=>{let e=this.filteredDisplayModels,t=Math.max(0,Math.min(Number(this.modelRenderLimit||0),e.length));return!Wc.filter&&t>=this.displayModels.length?this.displayModelGroups:HO(e.slice(0,t),Wc.models,this.modelOverrideViews)});get filteredDisplayModelGroups(){return R(this.#O)}set filteredDisplayModelGroups(e){M(this.#O,e)}#k=A(()=>UO(Wc.models,this.modelOverrideViews));get globalScopeRow(){return R(this.#k)}set globalScopeRow(e){M(this.#k,e)}modelsBusy(){return!!(Wc.loading||this.modelsRendering)}modelLoadingText(){if(Wc.loading)return this.displayModels.length>0?`Refreshing models...`:`Loading models...`;let e=this.filteredDisplayModels.length;return`Rendering models... `+Math.min(Number(this.modelRenderLimit||0),e)+` / `+e}restartModelRendering(e){let t=++this.#a,n=fk(this.modelRenderBatchSize,e);this.modelRenderLimit=n.limit,this.modelsRendering=n.rendering,n.rendering&&this.#A(t)}stopModelRendering(){this.#a++,this.modelsRendering=!1}#A(e){let t=()=>{if(e!==this.#a)return;let t=dk(this.modelRenderLimit,this.modelRenderBatchSize,this.filteredDisplayModels.length);this.modelRenderLimit=t.limit,this.modelsRendering=t.rendering,t.rendering&&this.#A(e)};typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>setTimeout(t,0)):setTimeout(t,0)}async fetchVirtualModels(){this.aliasLoading=!0,this.aliasError=``;try{let e=await ws(`/admin/virtual-models`,{label:`virtual models`});if(e.status===503){this.virtualModelsAvailable=!1,this.aliases=[],this.modelOverrideViews=[];return}if(e.stale)return;if(this.virtualModelsAvailable=!0,!e.ok){this.aliases=[],this.modelOverrideViews=[];return}let{aliases:t,policies:n}=TO(e.data);this.aliases=t,this.modelOverrideViews=n}catch(e){console.error(`Failed to fetch virtual models:`,e),this.aliases=[],this.modelOverrideViews=[],this.aliasError=`Unable to load virtual models.`}finally{this.aliasLoading=!1}}qualifiedModelName(e){return pO(e)}findModelOverrideView(e){return BO(this.modelOverrideViews,e)}hasGlobalModelOverride(){return!!this.findModelOverrideView(`/`)}findExistingAliasByName(e){let t=fO(e);if(!t)return null;for(let e of this.aliases)if(fO(e&&e.name)===t)return e;return null}findConcreteModelByName(e){let t=fO(e);if(!t)return null;for(let e of Wc.models)if(hO(e).has(t))return e;return null}rowToggleEnabled(e){return e?e.is_alias?e.alias&&e.alias.enabled!==!1:!!(e.access&&e.access.effective_enabled!==!1):!1}rowToggleLabel(e){return this.rowTogglingKey&&this.rowTogglingKey===e.key?`Updating...`:this.rowToggleRestricted(e)?`Restricted`:this.rowToggleEnabled(e)?`Enabled`:`Disabled`}rowToggleRestricted(e){return!!e&&!e.is_alias&&AO(e.access,this.virtualModelsAvailable)===`is-restricted`}rowToggleAriaLabel(e){if(!e)return``;let t=this.rowToggleEnabled(e)?`Disable `:`Enable `,n;return n=e.is_alias?`alias `+String(e.alias&&e.alias.name||``):String(e.display_name||e.access&&e.access.selector||`model`),t+n.trim()}async toggleRowEnabled(e){if(this.virtualModelsAvailable&&!(!e||this.rowTogglingKey===e.key)){if(YO(e)){lc.success(`This virtual model is managed by configuration and is read-only.`);return}if(e.is_alias){await this.toggleAliasRow(e);return}await this.toggleModelRow(e)}}async toggleAliasRow(e){let t=e.alias;if(!t||!t.name)return;this.rowTogglingKey=e.key;let n=lk(t);try{let e=await Ts(`/admin/virtual-models`,`PUT`,n,{label:`alias state`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update alias state.`));return}lc.success(n.enabled?`Alias enabled.`:`Alias disabled.`),this.fetchVirtualModels()}catch(e){console.error(`Failed to toggle alias state:`,e),lc.error(`Failed to update alias state.`)}finally{this.rowTogglingKey=``}}async toggleModelRow(e){let t=WO(e);if(!t)return;let{method:n,payload:r,desired:i}=uk(t,this.findModelOverrideView(t),e.access||{});this.rowTogglingKey=e.key;try{let e=await Ts(`/admin/virtual-models`,n,r,{label:`model access`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(n===`DELETE`&&e.status===404)){if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update model access.`));return}}lc.success(i?`Model enabled.`:`Model disabled.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to toggle model access:`,e),lc.error(`Failed to update model access.`)}finally{this.rowTogglingKey=``}}async removeAliasRow(e){if(!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)||this.rowDeletingKey)return;let t=String(e.alias.name||``).trim();t&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the virtual model alias "`+t+`"?`,method:`DELETE`,payload:{source:t},operation:`virtual model`,failureMessage:`Failed to remove virtual model.`,notice:`Virtual model removed.`,ignoreNotFound:!0})}async removeRedirectRow(e){let t=e&&e.masking_alias;if(!(e&&!e.is_alias&&t&&t.name&&!t.managed)||this.rowDeletingKey)return;let n=String(t.name||``).trim();n&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the redirect for "`+n+`"? Other virtual model settings will be preserved.`,method:`PUT`,payload:{source:n,user_paths:Array.isArray(t.user_paths)?t.user_paths:[],description:String(t.description||``).trim(),enabled:t.enabled!==!1,...Number(t.slowdown||0)>0?{slowdown:Number(t.slowdown)}:{}},operation:`virtual model redirect`,failureMessage:`Failed to remove redirect.`,notice:`Redirect removed. Other virtual model settings were preserved.`})}async mutateVirtualModelRow(e){if(!this.rowDeletingKey&&window.confirm(e.confirmMessage)){this.rowDeletingKey=e.rowKey;try{let t=await Ts(`/admin/virtual-models`,e.method,e.payload,{label:e.operation});if(t.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(e.ignoreNotFound&&t.status===404)){if(t.stale)return;if(!t.ok){lc.error(t.status===401?`Authentication required.`:bs(t,e.failureMessage));return}}this.virtualModelsAvailable=!0,lc.success(e.notice),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(t){console.error(e.failureMessage,t),lc.error(e.failureMessage)}finally{this.rowDeletingKey=``}}}addVmTarget(){Array.isArray(this.vmForm.targets)||(this.vmForm.targets=[]),this.vmForm.targets.push({model:``,weight:1})}removeVmTarget(e){Array.isArray(this.vmForm.targets)&&this.vmForm.targets.splice(e,1)}removePrimaryTarget(){ak(this.vmForm)}vmFormHasPrimaryTarget(){return ek(this.vmForm)}vmFormShowStrategy(){return rk(this.vmForm)}vmStrategyOptions(){return CO(ks.virtualModelStrategies(),this.vmForm.strategy)}vmFormShowWeights(){return ik(this.vmForm)}vmFormSupportsSlowdown(){return nk(this.vmForm)}vmFormToggleRestricted(){return!!(this.vmForm&&this.vmForm.enabled)&&kO(sk(this.vmForm.user_paths))}vmFormToggleLabel(){return!this.vmForm||!this.vmForm.enabled?`Disabled`:this.vmFormToggleRestricted()?`Restricted`:`Enabled`}resetVirtualModelForm(){this.vmFormError=``,this.vmFormHelpOpen=!1,this.vmFormUserPathsHelpOpen=!1,this.vmSubmitting=!1,this.vmDeleting=!1,this.vmFormHasExisting=!1,this.vmFormDefaultEnabled=!0,this.vmFormEffectiveEnabled=!0,this.vmFormDisplayName=``,this.vmFormSourceLocked=!1,this.vmFormOriginalSource=``,this.vmFormManaged=!1,this.vmForm=$O()}closeVirtualModelForm(){this.vmFormOpen=!1,this.resetVirtualModelForm()}openVirtualModelCreate(e){this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`create`,this.vmFormSourceLocked=!1,this.vmFormDisplayName=`New virtual model`,e&&e.model&&e.model.id&&(this.vmForm.target_model=pO(e))}openVirtualModelEditAlias(e){if(!e)return;this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!1,this.vmFormHasExisting=!0,this.vmFormManaged=!!e.managed,this.vmFormOriginalSource=e.name||``,this.vmFormDisplayName=e.name||``,this.vmFormDefaultEnabled=zO(Wc.models),this.vmFormEffectiveEnabled=e.enabled!==!1;let{primaryModel:t,primaryWeight:n,extraTargets:r}=ok(e);this.vmForm={source:e.name||``,target_model:t,target_weight:n,targets:r,strategy:e.strategy||`round_robin`,session_affinity:e.session_affinity!==!1,user_paths:(Array.isArray(e.user_paths)?e.user_paths:[]).join(` -`),description:e.description||``,slowdown:e.slowdown||``,enabled:e.enabled!==!1}}openVirtualModelEditModel(e){if(!e||e.is_alias)return;let t=e.access||{},n=t.override||null,r=n&&Array.isArray(n.user_paths)?n.user_paths:Array.isArray(t.user_paths)?t.user_paths:[],i=WO(e);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!n,this.vmFormOriginalSource=i;let a=n?n.enabled!==!1:t.effective_enabled!==!1;this.vmFormDefaultEnabled=t.default_enabled!==!1,this.vmFormEffectiveEnabled=a,this.vmFormManaged=!!(n&&n.managed),this.vmFormDisplayName=e.access_display_name||e.display_name||i||``,this.vmForm={source:i,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:r.join(` -`),description:n&&n.description?n.description:``,slowdown:n&&n.slowdown?n.slowdown:``,enabled:a}}openGlobalModelOverrideEdit(){let e=this.findModelOverrideView(`/`),t=e&&Array.isArray(e.user_paths)?e.user_paths:[],n=zO(Wc.models);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!e,this.vmFormOriginalSource=`/`,this.vmFormDefaultEnabled=n,this.vmFormEffectiveEnabled=e?e.enabled!==!1:n,this.vmFormManaged=!!(e&&e.managed),this.vmFormDisplayName=`All providers and models`,this.vmForm={source:`/`,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:t.join(` -`),description:e&&e.description?e.description:``,slowdown:e&&e.slowdown?e.slowdown:``,enabled:e?e.enabled!==!1:n}}openProviderOverrideEdit(e){!e||!e.access||!e.access.selector||this.openVirtualModelEditModel({display_name:e.display_name,access_display_name:`All models in `+e.display_name,provider_name:e.provider_name,provider_type:e.provider_type,access:e.access,override_selector:e.access.selector,is_alias:!1})}async submitVirtualModelForm(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be edited here.`;return}let{payload:e,source:t,isRedirect:n,isRename:r}=ck(this.vmForm,this.vmFormOriginalSource,this.vmFormMode);if(!t){this.vmFormError=`Source is required.`;return}if(this.vmFormError=``,this.vmFormMode!==`edit`){let e=this.findExistingAliasByName(t),r=e?null:this.findModelOverrideView(t);if(e||r){let n=e?`A virtual model named "`+e.name+`" already exists. Saving will update that virtual model. Continue?`:`An access policy for "`+t+`" already exists. Saving will update that virtual model. Continue?`;if(!window.confirm(n)){this.vmFormError=`Choose a different source or edit the existing virtual model.`;return}}else if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Creating this alias will mask that model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}else if(r){let e=(this.aliases||[]).find(e=>e&&e.name===t)||null,r=e?null:this.findModelOverrideView(t);if(e||r){this.vmFormError=`A virtual model for "`+t+`" already exists. Choose a different source.`;return}if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Renaming to that name will mask the model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}this.vmSubmitting=!0;try{let t=await Ts(`/admin/virtual-models`,`PUT`,e,{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to save virtual model.`);return}let r=!n&&t.status===204;this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(n?`Alias saved.`:r?`Model access reset to inherited/default.`:`Model access saved.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to save virtual model:`,e),this.vmFormError=`Failed to save virtual model.`}finally{this.vmSubmitting=!1}}async deleteVirtualModel(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be removed here.`;return}let e=String(this.vmForm.source||this.vmFormOriginalSource||``).trim();if(!(!e||!this.vmFormHasExisting)&&window.confirm(`Remove the virtual model for "`+e+`"? This reverts to inherited/default behavior.`)){this.vmDeleting=!0,this.vmFormError=``;try{let t=await Ts(`/admin/virtual-models`,`DELETE`,{source:e},{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to remove virtual model.`);return}}this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(`Virtual model removed.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to delete virtual model:`,e),this.vmFormError=`Failed to remove virtual model.`}finally{this.vmDeleting=!1}}}},mk=[{value:`input_per_mtok`,label:`Input $/MTok`,group:`Tokens`},{value:`output_per_mtok`,label:`Output $/MTok`,group:`Tokens`},{value:`cached_input_per_mtok`,label:`Cached input $/MTok`,group:`Tokens`},{value:`cache_write_per_mtok`,label:`Cache write $/MTok`,group:`Tokens`},{value:`reasoning_output_per_mtok`,label:`Reasoning output $/MTok`,group:`Tokens`},{value:`batch_input_per_mtok`,label:`Batch input $/MTok`,group:`Batch`},{value:`batch_output_per_mtok`,label:`Batch output $/MTok`,group:`Batch`},{value:`audio_input_per_mtok`,label:`Audio input $/MTok`,group:`Audio`},{value:`audio_output_per_mtok`,label:`Audio output $/MTok`,group:`Audio`},{value:`per_image`,label:`$/Image`,group:`Image`},{value:`input_per_image`,label:`Input $/Image`,group:`Image`},{value:`per_second_input`,label:`Input $/Second`,group:`Audio/Video`},{value:`per_second_output`,label:`Output $/Second`,group:`Video`},{value:`per_character_input`,label:`$/Character`,group:`Audio`},{value:`per_page`,label:`$/Page`,group:`Utility`},{value:`per_request`,label:`$/Request`,group:`Utility`}];function hk(e){let t=mk.find(t=>t.value===e);return t?t.label:String(e||``).replace(/_/g,` `)}function gk(e){return e&&typeof e==`object`?JSON.parse(JSON.stringify(e)):{}}function _k(e,t){let n=gk(e),r=t&&t.pricing?t.pricing:t;if(!r||typeof r!=`object`)return n;for(let e of mk)r[e.value]!==null&&r[e.value]!==void 0&&(n[e.value]=Number(r[e.value]));return Array.isArray(r.tiers)&&r.tiers.length>0&&(n.tiers=gk(r.tiers)),n}function vk(e){switch(String(e||``).trim()){case`config_yaml`:return`config.yaml`;case`model_registry`:return`Model registry`;default:return e?String(e):`Unknown`}}function yk(e){let t=e&&e.pricing?e.pricing:{},n=e&&e.pricing_sources&&typeof e.pricing_sources==`object`?e.pricing_sources:{},r={};for(let e of mk)t[e.value]!==null&&t[e.value]!==void 0&&(r[e.value]=vk(n[e.value]||`model_registry`));return r}function bk(e){let t=String(e&&e.selector||``).trim();return t?`Dashboard/API override (`+t+`)`:`Dashboard/API override`}function xk(e){let t=String(e||``).trim();return t?t+`/`:``}function Sk(e){return String(e&&e.model&&e.model.id||``).trim()}function Ck(e){let t=String(e&&e.provider_name||``).trim(),n=Sk(e);return t&&n?t+`/`+n:n}function wk(e){return Sk(e)}function Tk(e){let t=new Map;for(let n of Array.isArray(e)?e:[]){let e=String(n&&n.selector||``).trim();e&&t.set(e,n)}return t}function Ek(e,t){let n=String(t||``).trim();return n&&Tk(e).get(n)||null}function Dk(e,t,n){let r=Tk(e),i=Ck(t),a=wk(t),o=xk(t&&t.provider_name),s=String(n||``).trim();for(let e of[i,a,o,`/`]){if(!e||e===s)continue;let t=r.get(e);if(t)return t}return null}function Ok(e,t,n){let r=e&&e.model&&e.model.metadata?e.model.metadata:null,i=gk(r&&r.pricing),a=yk(r),o=Dk(t,e,n),s=o&&o.pricing?o.pricing:null;if(s){let e=bk(o);for(let t of mk)s[t.value]!==null&&s[t.value]!==void 0&&(i[t.value]=Number(s[t.value]),a[t.value]=e);Array.isArray(s.tiers)&&s.tiers.length>0&&(i.tiers=gk(s.tiers),a.tiers=e)}return{pricing:i,sources:a}}function kk(e,t){let n=e&&e.pricing?e.pricing:{},r=[];for(let e of mk)n[e.value]!==null&&n[e.value]!==void 0&&r.push({id:t(),field:e.value,value:String(n[e.value])});return r}function Ak(e,t){let n=new Set;for(let r of Array.isArray(e)?e:[]){if(t&&r.id===t)continue;let e=String(r.field||``).trim();e&&n.add(e)}return n}function jk(e,t){let n=Ak(e,t&&t.id);return mk.filter(e=>e.value===(t&&t.field)||!n.has(e.value))}function Mk(e,t){let n={},r=new Set;for(let t of Array.isArray(e)?e:[]){let e=String(t.field||``).trim();if(!e)return{error:`Choose a price type for every row.`};if(r.has(e))return{error:`Each price type can only be used once.`};r.add(e);let i=String(t.value||``).trim();if(i===``)return{error:`Enter a value for `+hk(e)+`.`};let a=Number(i);if(!Number.isFinite(a)||a<0)return{error:`Pricing values must be numbers greater than or equal to 0.`};n[e]=a}let i=Array.isArray(t)?t:[];return i.length>0&&(n.tiers=gk(i)),Object.keys(n).length===0?{error:`Add at least one pricing field before saving.`}:{pricing:n}}function Nk(e,t,n){let r=e||{},i=t||{},a=n||{},o=_k(r,a);return mk.map(e=>{let t=a[e.value]!==null&&a[e.value]!==void 0,n=r[e.value]!==null&&r[e.value]!==void 0;return{field:e.value,label:e.label,value:o[e.value],source:t?`Form/API value`:n?i[e.value]||`Model registry`:`Unset`}}).filter(e=>e.source!==`Unset`||e.value!==void 0)}var Pk=new class{#e=j(!0);get modelPricingOverridesAvailable(){return R(this.#e)}set modelPricingOverridesAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get modelPricingOverrideViews(){return R(this.#t)}set modelPricingOverrideViews(e){M(this.#t,e,!0)}#n=j(``);get modelPricingOverrideError(){return R(this.#n)}set modelPricingOverrideError(e){M(this.#n,e,!0)}#r=j(!1);get modelPricingOverrideFormOpen(){return R(this.#r)}set modelPricingOverrideFormOpen(e){M(this.#r,e,!0)}#i=j(!1);get modelPricingOverrideSubmitting(){return R(this.#i)}set modelPricingOverrideSubmitting(e){M(this.#i,e,!0)}#a=j(!1);get modelPricingOverrideFormHasExistingOverride(){return R(this.#a)}set modelPricingOverrideFormHasExistingOverride(e){M(this.#a,e,!0)}#o=j(``);get modelPricingOverrideFormDisplayName(){return R(this.#o)}set modelPricingOverrideFormDisplayName(e){M(this.#o,e,!0)}#s=j(``);get modelPricingOverrideFormScope(){return R(this.#s)}set modelPricingOverrideFormScope(e){M(this.#s,e,!0)}#c=j(N([]));get modelPricingOverrideFormScopeOptions(){return R(this.#c)}set modelPricingOverrideFormScopeOptions(e){M(this.#c,e,!0)}#l=j(null);get modelPricingOverrideFormRow(){return R(this.#l)}set modelPricingOverrideFormRow(e){M(this.#l,e,!0)}#u=j(null);get modelPricingOverrideFormBasePricing(){return R(this.#u)}set modelPricingOverrideFormBasePricing(e){M(this.#u,e,!0)}#d=j(null);get modelPricingOverrideFormBasePricingSources(){return R(this.#d)}set modelPricingOverrideFormBasePricingSources(e){M(this.#d,e,!0)}#f=j(N([]));get modelPricingOverrideFormPreservedTiers(){return R(this.#f)}set modelPricingOverrideFormPreservedTiers(e){M(this.#f,e,!0)}#p=j(N([]));get modelPricingOverrideRows(){return R(this.#p)}set modelPricingOverrideRows(e){M(this.#p,e,!0)}#m=j(N({selector:``}));get modelPricingOverrideForm(){return R(this.#m)}set modelPricingOverrideForm(e){M(this.#m,e,!0)}_modelPricingOverrideRowID=0;pricingFieldOptions(){return mk}pricingFieldLabel(e){return hk(e)}async fetchModelPricingOverrides(){this.modelPricingOverrideError=``;try{let e=await ws(`/admin/model-pricing-overrides`,{label:`model pricing overrides`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideViews=[];return}if(e.stale)return;if(this.modelPricingOverridesAvailable=!0,!e.ok){this.modelPricingOverrideViews=[];return}this.modelPricingOverrideViews=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch model pricing overrides:`,e),this.modelPricingOverrideViews=[],this.modelPricingOverrideError=`Unable to load model pricing overrides.`}}findModelPricingOverrideView(e){return Ek(this.modelPricingOverrideViews,e)}hasGlobalPricingOverride(){return!!this.findModelPricingOverrideView(`/`)}hasProviderPricingOverride(e){return!!this.findModelPricingOverrideView(xk(e&&e.provider_name))}hasModelPricingOverride(e){return!!this.findModelPricingOverrideView(Ck(e))}modelPricingButtonClass(e){return e?`table-action-btn-active`:``}modelPricingButtonLabel(e,t){let n=`Edit `+String(e||`model pricing`);return t?n+` (override exists)`:n}modelRowPricing(e){return Ok(e,this.modelPricingOverrideViews).pricing}openGlobalPricingOverrideEdit(){this.openModelPricingOverrideForm({displayName:`All providers and models`,selector:`/`,scope:`global`,scopeOptions:[{value:`global`,label:`All providers and models`,selector:`/`}],row:null})}openProviderPricingOverrideEdit(e){let t=xk(e&&e.provider_name);t&&this.openModelPricingOverrideForm({displayName:`All models in `+(e.display_name||e.provider_name||t),selector:t,scope:`provider`,scopeOptions:[{value:`provider`,label:`Provider`,selector:t}],row:null})}openModelPricingOverrideEdit(e){if(!e||e.is_alias)return;let t=Ck(e),n=wk(e),r=[{value:`exact`,label:`This provider and model`,selector:t}];n&&n!==t&&r.push({value:`model`,label:`This model across providers`,selector:n}),this.openModelPricingOverrideForm({displayName:e.display_name||t,selector:t,scope:`exact`,scopeOptions:r,row:e})}openModelPricingOverrideForm(e){let t=e||{};this.modelPricingOverrideFormOpen=!0,this.modelPricingOverrideError=``,this.modelPricingOverrideFormDisplayName=t.displayName||t.selector||`Pricing`,this.modelPricingOverrideFormScope=t.scope||``,this.modelPricingOverrideFormScopeOptions=Array.isArray(t.scopeOptions)?t.scopeOptions:[],this.modelPricingOverrideFormRow=t.row||null,this.modelPricingOverrideForm={selector:t.selector||``},this.loadModelPricingOverrideFormSelector(t.selector||``)}loadModelPricingOverrideFormSelector(e){e=String(e||``).trim();let t=this.findModelPricingOverrideView(e);this.modelPricingOverrideFormHasExistingOverride=!!t,this.modelPricingOverrideRows=kk(t,()=>this.nextModelPricingOverrideRowID()),this.modelPricingOverrideFormPreservedTiers=t&&t.pricing&&Array.isArray(t.pricing.tiers)?gk(t.pricing.tiers):[],this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow();let n=this.modelPricingOverrideFormRow,r=n?Ok(n,this.modelPricingOverrideViews,e):{pricing:{},sources:{}};this.modelPricingOverrideFormBasePricing=r.pricing,this.modelPricingOverrideFormBasePricingSources=r.sources}setModelPricingOverrideScope(e){this.modelPricingOverrideFormScope=e;let t=this.modelPricingOverrideFormScopeOptions.find(t=>t.value===e);t&&(this.modelPricingOverrideForm.selector=t.selector,this.loadModelPricingOverrideFormSelector(t.selector))}nextModelPricingOverrideRowID(){return this._modelPricingOverrideRowID=(this._modelPricingOverrideRowID||0)+1,`pricing-row-`+this._modelPricingOverrideRowID}availablePricingFieldOptions(e){return jk(this.modelPricingOverrideRows,e)}addModelPricingOverrideRow(){let e=Ak(this.modelPricingOverrideRows),t=mk.find(t=>!e.has(t.value))||mk[0];t&&this.modelPricingOverrideRows.push({id:this.nextModelPricingOverrideRowID(),field:t.value,value:``})}removeModelPricingOverrideRow(e){this.modelPricingOverrideRows=this.modelPricingOverrideRows.filter(t=>t.id!==e.id),this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow()}modelPricingOverridePayload(){return Mk(this.modelPricingOverrideRows,this.modelPricingOverrideFormPreservedTiers)}modelPricingOverrideDraftPricing(){let e=this.modelPricingOverridePayload();return e&&e.pricing?e.pricing:{}}modelPricingEffectivePreviewRows(){return Nk(this.modelPricingOverrideFormBasePricing,this.modelPricingOverrideFormBasePricingSources,this.modelPricingOverrideDraftPricing())}closeModelPricingOverrideForm(){this.modelPricingOverrideFormOpen=!1,this.modelPricingOverrideSubmitting=!1,this.modelPricingOverrideError=``,this.modelPricingOverrideFormHasExistingOverride=!1,this.modelPricingOverrideFormDisplayName=``,this.modelPricingOverrideFormScope=``,this.modelPricingOverrideFormScopeOptions=[],this.modelPricingOverrideFormRow=null,this.modelPricingOverrideFormBasePricing=null,this.modelPricingOverrideFormBasePricingSources=null,this.modelPricingOverrideFormPreservedTiers=[],this.modelPricingOverrideRows=[],this.modelPricingOverrideForm={selector:``}}async submitModelPricingOverrideForm(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!e){this.modelPricingOverrideError=`Model pricing selector is required.`;return}let t=this.modelPricingOverridePayload();if(t.error){this.modelPricingOverrideError=t.error;return}let n={selector:e,...t};this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let e=await Ts(`/admin/model-pricing-overrides`,`PUT`,n,{label:`model pricing override`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(e.stale)return;if(!e.ok){this.modelPricingOverrideError=e.status===401?`Authentication required.`:bs(e,`Failed to save model pricing.`);return}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing saved.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to save model pricing override:`,e),this.modelPricingOverrideError=`Failed to save model pricing.`}finally{this.modelPricingOverrideSubmitting=!1}}async deleteModelPricingOverride(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!(!e||!this.modelPricingOverrideFormHasExistingOverride)&&window.confirm(`Remove the model pricing override for "`+e+`"?`)){this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let t=await Ts(`/admin/model-pricing-overrides`,`DELETE`,{selector:e},{label:`model pricing override`});if(t.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.modelPricingOverrideError=t.status===401?`Authentication required.`:bs(t,`Failed to remove model pricing override.`);return}}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing override removed.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to delete model pricing override:`,e),this.modelPricingOverrideError=`Failed to remove model pricing override.`}finally{this.modelPricingOverrideSubmitting=!1}}}},Fk=B(``);function Ik(e,t){O(t,!0);var n=Fk();let r;var i=I(P(n),2),a=P(i,!0);D(i),D(n),L((e,i,o)=>{r=G(n,1,`alias-toggle`,null,r,e),n.disabled=pk.rowTogglingKey===t.row.key||!pk.virtualModelsAvailable,K(n,`aria-label`,i),H(a,o)},[()=>({enabled:pk.rowToggleEnabled(t.row),restricted:pk.rowToggleRestricted(t.row)}),()=>pk.rowToggleAriaLabel(t.row),()=>pk.rowToggleLabel(t.row)]),z(`click`,n,()=>pk.toggleRowEnabled(t.row)),V(e,n),k()}Br([`click`]);var Lk=B(`
            `);function Rk(e,t){O(t,!0);var n=Lk(),r=P(n),i=e=>{Ik(e,{get row(){return pk.globalScopeRow}})};U(r,e=>{pk.virtualModelsAvailable&&e(i)});var a=I(r,2),o=e=>{{let t=A(()=>Pk.modelPricingButtonLabel(`global model pricing`,Pk.hasGlobalPricingOverride())),n=A(()=>Pk.modelPricingButtonClass(Pk.hasGlobalPricingOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>Pk.openGlobalPricingOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(a,e=>{Pk.modelPricingOverridesAvailable&&e(o)});var s=I(a,2),c=e=>{{let t=A(()=>QO(`global model access`,pk.hasGlobalModelOverride())),n=A(()=>ZO(pk.hasGlobalModelOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>pk.openGlobalModelOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n),k()}function zk(e){return String(e&&(e.primary_model||e.source)||``).trim()}function Bk(e){return Array.isArray(e&&e.fallback_models)?e.fallback_models:Array.isArray(e&&e.targets)?e.targets:[]}function Vk(e){return Array.isArray(e)?e.map(e=>({...e,source:zk(e),targets:Bk(e)})):[]}function Hk(e){let t=Bk(e);return t.length===0?`-`:t.join(`, `)}function Uk(e){return e&&e.enabled===!1?`Off`:e&&e.managed?`Config`:`On`}function Wk(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>zk(e)===n)||null}function Gk(e,t){if(!t||t.is_alias)return!1;let n=Wk(e,pO(t));return!!(n&&n.enabled!==!1&&Bk(n).length>0)}function Kk(e,t){return Gk(e,t)?`table-action-btn-failover-active`:``}function qk(e,t){let n=`Edit failover for `+(t&&t.display_name?t.display_name:`model`);return Gk(e,t)?n+` (active)`:n}function Jk(e){let t=[e&&e.target_model];return(Array.isArray(e&&e.targets)?e.targets:[]).forEach(e=>t.push(e&&e.model)),t.map(e=>String(e||``).trim()).filter(Boolean)}function Yk(e){let t=Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(Boolean):[];return{target_model:t[0]||``,targets:t.slice(1).map(e=>({model:e}))}}function Xk(e){return{primary_model:String(e&&e.source||``).trim(),fallback_models:Jk(e),enabled:!(e&&e.enabled===!1)}}function Zk(e){return zk(e)}function Qk(e){let t={};return(Array.isArray(e)?e:[]).forEach(e=>{let n=Zk(e);n&&(t[n]=!0)}),t}function $k(e,t){let n=Zk(t);return!!(n&&e&&e[n])}function eA(e,t){return(Array.isArray(e)?e:[]).filter(e=>$k(t,e))}function tA(e,t){let n=Array.isArray(e)?e:[];return n.length>0&&eA(n,t).length===n.length}function nA(e){return[zk(e),Bk(e).join(` `)].join(` `).toLowerCase()}function rA(e,t){let n=Array.isArray(e)?e:[],r=String(t||``).trim().toLowerCase();return r?n.filter(e=>nA(e).includes(r)):n}function iA(e){return{primary_model:zk(e),fallback_models:Bk(e).map(e=>String(e||``).trim()).filter(Boolean),enabled:!!(e&&e.enabled!==!1)}}function aA(){return{source:``,target_model:``,targets:[],enabled:!0}}var Q=new class{#e=j(!0);get failoverAvailable(){return R(this.#e)}set failoverAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get failoverRules(){return R(this.#t)}set failoverRules(e){M(this.#t,e,!0)}#n=j(!1);get failoverLoading(){return R(this.#n)}set failoverLoading(e){M(this.#n,e,!0)}#r=j(!1);get failoverSaving(){return R(this.#r)}set failoverSaving(e){M(this.#r,e,!0)}#i=j(!1);get failoverGenerating(){return R(this.#i)}set failoverGenerating(e){M(this.#i,e,!0)}#a=j(``);get failoverError(){return R(this.#a)}set failoverError(e){M(this.#a,e,!0)}#o=j(N([]));get failoverGeneratedRules(){return R(this.#o)}set failoverGeneratedRules(e){M(this.#o,e,!0)}#s=j(!1);get failoverDraftsOpen(){return R(this.#s)}set failoverDraftsOpen(e){M(this.#s,e,!0)}#c=j(N({}));get failoverDraftSelections(){return R(this.#c)}set failoverDraftSelections(e){M(this.#c,e,!0)}#l=j(``);get failoverDraftFilter(){return R(this.#l)}set failoverDraftFilter(e){M(this.#l,e,!0)}#u=j(!1);get failoverDraftSaving(){return R(this.#u)}set failoverDraftSaving(e){M(this.#u,e,!0)}#d=j(!1);get failoverFormOpen(){return R(this.#d)}set failoverFormOpen(e){M(this.#d,e,!0)}#f=j(`create`);get failoverFormMode(){return R(this.#f)}set failoverFormMode(e){M(this.#f,e,!0)}#p=j(!1);get failoverFormManaged(){return R(this.#p)}set failoverFormManaged(e){M(this.#p,e,!0)}#m=j(N(aA()));get failoverForm(){return R(this.#m)}set failoverForm(e){M(this.#m,e,!0)}failoverEnabled(){return ks.booleanFlag(`FAILOVER_ENABLED`,!0)}async fetchFailoverRules(){if(!this.failoverEnabled()){this.failoverAvailable=!1,this.failoverRules=[],this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,this.failoverError=``,this.failoverLoading=!1;return}this.failoverLoading=!0,this.failoverError=``;try{let e=await ws(`/admin/failover`,{label:`failover mappings`});if(e.status===503){this.failoverAvailable=!1,this.failoverRules=[];return}if(e.stale)return;if(this.failoverAvailable=!0,!e.ok){this.failoverRules=[];return}this.failoverRules=Vk(e.data)}catch(e){console.error(`Failed to fetch failover mappings:`,e),this.failoverRules=[],this.failoverError=`Unable to load failover mappings.`}finally{this.failoverLoading=!1}}resetFailoverForm(){this.failoverFormMode=`create`,this.failoverFormManaged=!1,this.failoverForm=aA()}openFailoverCreate(){this.resetFailoverForm(),this.failoverFormOpen=!0,this.focusFailoverEditor()}openFailoverEdit(e){if(!e)return;this.resetFailoverForm(),this.failoverFormMode=`edit`,this.failoverFormOpen=!0,this.failoverFormManaged=!!e.managed;let t=this.failoverPrimaryModel(e),n=this.failoverTargets(e);this.failoverForm={source:t,target_model:n[0]||``,targets:n.slice(1).map(e=>({model:e})),enabled:e.enabled!==!1},this.focusFailoverEditor()}openFailoverForModel(e){if(!e||e.is_alias)return;let t=this.qualifiedModelName(e),n=this.failoverRules.find(e=>this.failoverPrimaryModel(e)===t);if(n){this.openFailoverEdit(n);return}this.resetFailoverForm(),this.failoverFormMode=`create`,this.failoverFormOpen=!0,this.failoverForm.source=t,this.focusFailoverEditor()}closeFailoverForm(){this.failoverFormOpen=!1}closeFailoverDraftsModal(){this.failoverDraftSaving||(this.failoverDraftsOpen=!1)}failoverFormTargets(){return Jk(this.failoverForm)}setFailoverFormTargets(e){let t=Yk(e);this.failoverForm.target_model=t.target_model,this.failoverForm.targets=t.targets}addFailoverTarget(){Array.isArray(this.failoverForm.targets)||(this.failoverForm.targets=[]),this.failoverForm.targets.push({model:``}),this.focusFailoverEditor()}removeFailoverTarget(e){if(!Array.isArray(this.failoverForm.targets)){this.failoverForm.targets=[];return}this.failoverForm.targets.splice(e,1)}removePrimaryFailoverTarget(){let e=Array.isArray(this.failoverForm.targets)?this.failoverForm.targets:[];if(e.length>0){let t=e.shift();this.failoverForm.target_model=t&&t.model?t.model:``,this.failoverForm.targets=e;return}this.failoverForm.target_model=``}failoverRulePayload(){return Xk(this.failoverForm)}async submitFailoverForm(){if(this.failoverSaving||this.failoverGenerating||this.failoverFormManaged)return;let e=this.failoverRulePayload();if(!e.primary_model){this.failoverError=`Primary model is required.`;return}if(e.enabled&&e.fallback_models.length===0){this.failoverError=`Add at least one failover target.`;return}this.failoverSaving=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to save failover mapping.`;return}lc.success(`Failover mapping saved.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to save failover mapping:`,e),this.failoverError=`Failed to save failover mapping.`}finally{this.failoverSaving=!1}}async deleteFailoverRule(e){let t=String(e&&this.failoverPrimaryModel(e)||this.failoverForm.source||``).trim();if(!(!t||this.failoverSaving||this.failoverGenerating)&&confirm(`Remove failover mapping for "`+t+`"?`)){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover`,`DELETE`,{primary_model:t},{label:`failover mapping`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mapping.`;return}lc.success(`Failover mapping removed.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to remove failover mapping:`,e),this.failoverError=`Failed to remove failover mapping.`}finally{this.failoverSaving=!1}}}async generateFailoverForForm(){if(this.failoverGenerating||this.failoverSaving||this.failoverFormManaged)return;let e=String(this.failoverForm.source||``).trim();if(!e){this.failoverError=`Primary model is required.`;return}this.failoverGenerating=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover/generate`,`POST`,{primary_model:e},{label:`failover generation`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to generate failover mapping.`;return}let n=Vk(t.data),r=n.find(t=>this.failoverPrimaryModel(t)===e)||n[0]||null,i=this.failoverTargets(r);if(i.length===0){this.failoverError=`No failover suggestions were generated for this model.`;return}this.setFailoverFormTargets(i),lc.success(`Generated `+i.length+` fallback model`+(i.length===1?`.`:`s.`)),this.focusFailoverEditor()}catch(e){console.error(`Failed to generate failover mapping:`,e),this.failoverError=`Failed to generate failover mapping.`}finally{this.failoverGenerating=!1}}openFailoverResetDialog(){Js.open({title:`Remove failover models`,titleId:`failoverResetDialogTitle`,inputId:`failover-reset-confirmation`,message:`Remove every dashboard-managed failover mapping. Configuration-managed mappings remain active.`,requiredText:`remove`,confirmLabel:`Remove Failover`,icon:Ao,dialogClass:`budget-reset-dialog`,onConfirm:async()=>{await this.resetFailoverRules(),this.failoverError&&(Js.error=this.failoverError)}})}async resetFailoverRules(){if(!this.failoverSaving){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover/reset`,`POST`,void 0,{label:`failover removal`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mappings.`;return}this.failoverRules=Vk(e.data),this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,lc.success(`Dashboard-managed failover mappings removed.`),Js.close()}catch(e){console.error(`Failed to remove failover mappings:`,e),this.failoverError=`Failed to remove failover mappings.`}finally{this.failoverSaving=!1}}}async generateFailoverRules(){if(!(this.failoverGenerating||this.failoverDraftSaving)){this.failoverGenerating=!0,this.failoverError=``,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!0;try{let e=await Ts(`/admin/failover/generate`,`POST`,void 0,{label:`failover generation`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to generate failover mappings.`;return}this.failoverGeneratedRules=Vk(e.data),this.selectAllFailoverDrafts(this.failoverGeneratedRules)}catch(e){console.error(`Failed to generate failover mappings:`,e),this.failoverError=`Failed to generate failover mappings.`}finally{this.failoverGenerating=!1}}}failoverDraftKey(e){return Zk(e)}selectAllFailoverDrafts(e){this.failoverDraftSelections=Qk(e)}failoverDraftSelected(e){return $k(this.failoverDraftSelections,e)}setFailoverDraftSelected(e,t){let n=this.failoverDraftKey(e);n&&(this.failoverDraftSelections={...this.failoverDraftSelections,[n]:!!t})}selectedFailoverDrafts(){return eA(this.failoverGeneratedRules,this.failoverDraftSelections)}selectedFailoverDraftCount(){return this.selectedFailoverDrafts().length}failoverDraftCountLabel(){return this.selectedFailoverDraftCount()+` / `+this.failoverGeneratedRules.length+` selected`}allFailoverDraftsSelected(){return tA(this.failoverGeneratedRules,this.failoverDraftSelections)}toggleAllFailoverDrafts(){if(!(this.failoverDraftSaving||this.failoverGenerating||this.failoverGeneratedRules.length===0)){if(this.allFailoverDraftsSelected()){this.failoverDraftSelections={};return}this.selectAllFailoverDrafts(this.failoverGeneratedRules)}}failoverDraftSearchText(e){return nA(e)}filteredFailoverDrafts(){return rA(this.failoverGeneratedRules,this.failoverDraftFilter)}failoverDraftPayload(e){return iA(e)}async saveSelectedFailoverDrafts(){if(this.failoverDraftSaving||this.failoverGenerating)return;let e=this.selectedFailoverDrafts();if(e.length===0){this.failoverError=`Select at least one failover draft.`;return}this.failoverDraftSaving=!0,this.failoverError=``;try{for(let t of e){let e=this.failoverDraftPayload(t);if(!e.primary_model||e.fallback_models.length===0){this.failoverError=`Generated failover draft is missing model data.`;return}let n=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(n.stale)return;if(!n.ok){this.failoverError=`Failed to save failover mapping.`;return}}lc.success(`Saved `+e.length+` failover mapping`+(e.length===1?`.`:`s.`)),this.failoverDraftsOpen=!1,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.fetchFailoverRules()}catch(e){console.error(`Failed to save generated failover mappings:`,e),this.failoverError=`Failed to save failover mappings.`}finally{this.failoverDraftSaving=!1}}focusFailoverEditor(){setTimeout(()=>{let e=document.querySelector(`[data-failover-editor]`),t=e&&e.querySelector?e.querySelector(`[data-modal-autofocus], input:not([disabled]), textarea:not([disabled]), button:not([disabled])`):null;t&&typeof t.focus==`function`&&t.focus({preventScroll:!0})},0)}failoverTargetLabel(e){return Hk(e)}failoverPrimaryModel(e){return zk(e)}failoverTargets(e){return Bk(e)}findFailoverMapping(e){return Wk(this.failoverRules,e)}hasActiveFailoverMapping(e){return Gk(this.failoverRules,e)}failoverButtonClass(e){return Kk(this.failoverRules,e)}failoverButtonLabel(e){return qk(this.failoverRules,e)}normalizeFailoverRules(e){return Vk(e)}failoverRuleStatus(e){return Uk(e)}qualifiedModelName(e){return pO(e)}},oA=B(``),sA=B(``),cA=B(`Config`),lA=B(`
            Targets
            `),uA=B(``),dA=B(`
            Redirects to
            `),fA=B(`
            Slowdown
            `),pA=B(` `),mA=B(`
            `),hA=B(`
            `),gA=B(`
            `);function _A(e,t){O(t,!0);let n=A(()=>Pk.modelRowPricing(t.row)),r=A(()=>Number(t.row.is_alias?t.row.alias&&t.row.alias.slowdown:t.row.masking_alias&&t.row.masking_alias.slowdown||t.row.access&&t.row.access.override&&t.row.access.override.slowdown||0));var i=gA(),a=P(i),o=P(a),s=P(o),c=P(s),l=P(c,!0);D(c);var u=I(c,2),d=e=>{V(e,oA())};U(u,e=>{t.row.is_alias&&e(d)});var f=I(u,2),p=e=>{V(e,sA())};U(f,e=>{!t.row.is_alias&&t.row.masking_alias&&e(p)});var m=I(f,2),h=e=>{V(e,cA())},g=A(()=>YO(t.row));U(m,e=>{R(g)&&e(h)}),D(s);var _=I(s,2),v=e=>{var n=lA(),r=I(P(n)),i=P(r,!0);D(r),D(n),L(()=>H(i,t.row.secondary_name)),V(e,n)};U(_,e=>{t.row.is_alias&&e(v)});var y=I(_,2),b=e=>{var n=dA(),r=I(P(n)),i=P(r,!0);D(r);var a=I(r,2),o=e=>{var n=uA();L(e=>{K(n,`aria-label`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),K(n,`title`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),n.disabled=e},[()=>!!pk.rowDeletingKey]),z(`click`,n,()=>pk.removeRedirectRow(t.row)),V(e,n)},s=A(()=>pk.virtualModelsAvailable&&qO(t.row));U(a,e=>{R(s)&&e(o)}),D(n),L(e=>H(i,e),[()=>EO(t.row.masking_alias)]),V(e,n)};U(y,e=>{!t.row.is_alias&&t.row.masking_alias&&e(b)});var x=I(y,2),S=e=>{var t=fA(),n=I(P(t)),i=P(n);D(n),D(t),L(()=>H(i,`+${R(r)??``}× inference time`)),V(e,t)};U(x,e=>{R(r)>0&&e(S)}),D(o),D(a);var C=I(a);W(C,17,()=>t.columns,ii,(e,r)=>{var i=pA(),a=P(i,!0);D(i),L(e=>{G(i,1,Ni(R(r).class),`svelte-1iynym`),H(a,e)},[()=>R(r).value(t.row,R(n))]),V(e,i)});var w=I(C),T=P(w),E=e=>{var n=mA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>pk.rowDeletingKey===t.row.key?`Removing alias `+t.row.alias.name:`Remove alias `+t.row.alias.name),r=A(()=>!!pk.rowDeletingKey);OT(e,{get label(){return R(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>pk.removeAliasRow(t.row),get disabled(){return R(r)},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})}},o=A(()=>pk.virtualModelsAvailable&&KO(t.row));U(i,e=>{R(o)&&e(a)});var s=I(i,2),c=e=>{{let n=A(()=>`Edit alias `+t.row.alias.name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n)},ee=e=>{var n=hA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`model pricing for `+t.row.display_name,Pk.hasModelPricingOverride(t.row))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasModelPricingOverride(t.row)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openModelPricingOverrideEdit(t.row),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(i,e=>{Pk.modelPricingOverridesAvailable&&e(a)});var o=I(i,2),s=e=>{{let n=A(()=>Q.failoverButtonLabel(t.row)),r=A(()=>Q.failoverButtonClass(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Q.openFailoverForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Eo},class:`table-icon-svg`})},$$slots:{default:!0}})}},c=A(()=>Q.failoverAvailable&&Q.failoverEnabled());U(o,e=>{R(c)&&e(s)});var l=I(o,2),u=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(t.row.display_name,Z.rateLimitGaugeClassForModel(t.row))),r=A(()=>Z.rateLimitGaugeClassForModel(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},d=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitInspectorModelID(t.row));U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{{let n=A(()=>`Edit redirect for `+t.row.display_name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.masking_alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(f,e=>{pk.virtualModelsAvailable&&t.row.masking_alias&&t.row.masking_alias.name&&e(p)});var m=I(f,2),h=e=>{{let n=A(()=>QO(`model settings for `+t.row.display_name,XO(t.row.access))),r=A(()=>ZO(XO(t.row.access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openVirtualModelEditModel(t.row),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(m,e=>{pk.virtualModelsAvailable&&!t.row.masking_alias&&e(h)}),D(n),V(e,n)};U(T,e=>{t.row.is_alias?e(E):e(ee,-1)}),D(w),D(i),L((e,n)=>{K(i,`id`,e),G(i,1,n,`svelte-1iynym`),H(l,t.row.display_name)},[()=>JO(t.row)||void 0,()=>Ni(GO(t.row))]),V(e,i),k()}Br([`click`]);var vA={headerLines:[`Modes`],value:e=>(e.model?.metadata?.modes??[]).join(`, `)||`-`};function yA(e,t){return{headerLines:e,class:`col-price`,value:t}}var bA=yA([`Input / Output ($/MTok)`],(e,t)=>yc(t?.input_per_mtok)+` / `+yc(t?.output_per_mtok)),xA={all:[bA],text_generation:[vA,bA,yA([`Cached $/MTok`],(e,t)=>yc(t?.cached_input_per_mtok))],embedding:[yA([`Input`,`$/MTok`],(e,t)=>yc(t?.input_per_mtok))],image:[yA([`$/Image`],(e,t)=>bc(t?.per_image))],audio:[yA([`$/Second`],(e,t)=>bc(t?.per_second_input)),yA([`$/Character`],(e,t)=>bc(t?.per_character_input))],video:[yA([`$/Second (In)`],(e,t)=>bc(t?.per_second_input)),yA([`$/Second (Out)`],(e,t)=>bc(t?.per_second_output))],utility:[yA([`$/Page`],(e,t)=>bc(t?.per_page)),yA([`$/Request`],(e,t)=>bc(t?.per_request))]};function SA(e){return xA[e]||xA.all}function CA(e){return SA(e).length+2}var wA=B(`
            `),TA=B(` `,1),EA=B(``),DA=B(` `),OA=B(` `),kA=B(`
            `),AA=B(`
            `),jA=B(`
            Model
            `);function MA(e,t){O(t,!0);let n=A(()=>Wc.activeCategory||`all`),r=A(()=>SA(R(n))),i=A(()=>CA(R(n)));var a=jA(),o=P(a),s=P(o),c=P(s),l=I(P(c));W(l,17,()=>R(r),ii,(e,t)=>{var n=EA();W(n,21,()=>R(t).headerLines,ii,(e,t,n)=>{var r=TA(),i=F(r),a=e=>{V(e,wA())};U(i,e=>{n>0&&e(a)});var o=I(i,1,!0);L(()=>H(o,R(t))),V(e,r)}),D(n),L(()=>G(n,1,Ni(R(t).class),`svelte-1911hy6`)),V(e,n)});var u=I(l);Rk(P(u),{}),D(u),D(c),D(s),W(I(s),17,()=>pk.filteredDisplayModelGroups,e=>e.key,(e,t)=>{var n=AA(),a=P(n),o=P(a),s=P(o),c=P(s),l=P(c),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=e=>{var n=DA(),r=P(n,!0);D(n),L(()=>H(r,`(`+R(t).type_label+`)`)),V(e,n)};U(f,e=>{R(t).type_label&&e(p)});var m=I(f,2),h=e=>{var n=OA(),r=P(n,!0);D(n),L(()=>H(r,R(t).item_count_label)),V(e,n)};U(m,e=>{R(t).item_count_label&&e(h)}),D(l);var g=I(l,2),_=e=>{var n=kA(),r=P(n,!0);D(n),L(()=>H(r,R(t).access_summary)),V(e,n)};U(g,e=>{R(t).access_summary&&e(_)}),D(c);var v=I(c,2),y=P(v),b=e=>{Ik(e,{get row(){return R(t)}})};U(y,e=>{R(t).access.selector&&e(b)});var x=I(y,2),S=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`provider pricing for `+R(t).display_name,Pk.hasProviderPricingOverride(R(t)))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasProviderPricingOverride(R(t))));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openProviderPricingOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(x,e=>{Pk.modelPricingOverridesAvailable&&R(t).provider_name&&e(S)});var C=I(x,2),w=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(`provider `+R(t).display_name,Z.rateLimitGaugeClassForProvider(R(t)))),r=A(()=>Z.rateLimitGaugeClassForProvider(R(t)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForProvider(R(t)),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},T=A(()=>Z.rateLimitsEnabled()&&R(t).provider_name);U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{{let n=A(()=>QO(`provider access for `+R(t).display_name,XO(R(t).access))),r=A(()=>ZO(XO(R(t).access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openProviderOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(E,e=>{pk.virtualModelsAvailable&&R(t).access.selector&&e(ee)}),D(v),D(s),D(o),D(a),W(I(a),17,()=>R(t).rows,e=>e.key,(e,t)=>{_A(e,{get row(){return R(t)},get columns(){return R(r)}})}),D(n),L(()=>{K(o,`colspan`,R(i)),H(d,R(t).display_name)}),V(e,n)}),D(o),D(a),V(e,a),k()}var NA=B(``);function PA(e,t){let n=q(t,`enabled`,3,!1),r=q(t,`label`,3,``),i=q(t,`disabled`,3,!1),a=q(t,`restricted`,3,!1);var o=NA();let s;var c=I(P(o),2),l=P(c,!0);D(c),D(o),L(()=>{s=G(o,1,`alias-toggle`,null,s,{enabled:n(),restricted:a()}),o.disabled=i(),K(o,`aria-label`,(n()?`Disable `:`Enable `)+r()),H(l,t.text??(n()?`Enabled`:`Disabled`))}),z(`click`,o,function(...e){t.onclick?.apply(this,e)}),V(e,o)}Br([`click`]);var FA=B(``),IA=B(`
            `);function LA(e,t){O(t,!0);let n=q(t,`model`,15,``),r=q(t,`weight`,15),i=q(t,`id`,3,void 0),a=q(t,`placeholder`,3,`openai/gpt-4o`),o=q(t,`showRemove`,3,!0);var s=IA(),c=P(s);ea(c);var l=I(c,2),u=e=>{var t=FA();ea(t),L(()=>t.disabled=pk.vmFormManaged),la(t,r),V(e,t)},d=A(()=>pk.vmFormShowWeights());U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{OT(e,{label:`Remove target`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,get onclick(){return t.onremove},get disabled(){return pk.vmFormManaged},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})};U(f,e=>{o()&&e(p)}),D(s),L(()=>{K(c,`id`,i()),K(c,`placeholder`,a()),c.disabled=pk.vmFormManaged}),la(c,n),V(e,s),k()}var RA=B(`

            `),zA=B(`adaptive lets the registered routing extension pick the target per + skip that limit. Token limits require usage tracking.

            `,1);function qD(e,t){O(t,!0);{let t=A(()=>Z.rateLimitEditing?`Edit Rate Limit`:`Create Rate Limit`);ME(e,{get open(){return Z.rateLimitFormOpen},get title(){return R(t)},ariaLabel:`Rate limit editor`,get error(){return Z.rateLimitFormError},get submitting(){return Z.rateLimitFormSubmitting},submitLabel:`Save Rate Limit`,dialogClass:`budget-editor`,novalidate:!0,onclose:()=>Z.closeRateLimitForm(),onsubmit:()=>Z.submitRateLimitForm(),children:(e,t)=>{var n=KD(),r=F(n),i=P(r);PE(i,{id:`rate-limit-scope`,label:`Scope`,children:(e,t)=>{var n=zD();W(n,21,()=>Z.rateLimitScopeOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitScope()),Ui(n,()=>Z.rateLimitForm.scope,e=>Z.rateLimitForm.scope=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2);{let e=A(()=>Z.rateLimitSubjectFieldLabel());PE(a,{id:`rate-limit-subject`,get label(){return R(e)},children:(e,t)=>{var n=BD();ea(n),L(e=>{K(n,`placeholder`,e),K(n,`data-modal-autofocus`,!Z.rateLimitEditing||void 0),ta(n,Z.rateLimitForm.subject)},[()=>Z.rateLimitSubjectPlaceholder()]),z(`input`,n,e=>Z.setRateLimitFormSubject(e.currentTarget.value)),V(e,n)},$$slots:{default:!0}})}var o=I(a,2);PE(o,{id:`rate-limit-period`,label:`Period`,children:(e,t)=>{var n=VD();W(n,21,()=>Z.rateLimitPeriodOptions(),e=>e.value,(e,t)=>{var n=RD(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(n),z(`change`,n,()=>Z.syncRateLimitPeriodSeconds()),Ui(n,()=>Z.rateLimitForm.period,e=>Z.rateLimitForm.period=e),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=e=>{PE(e,{id:`rate-limit-period-seconds`,label:`Period Seconds`,children:(e,t)=>{var n=HD();ea(n),la(n,()=>Z.rateLimitForm.period_seconds,e=>Z.rateLimitForm.period_seconds=e),V(e,n)},$$slots:{default:!0}})};U(s,e=>{Z.rateLimitForm.period===`custom`&&e(c)});var l=I(s,2);{let e=A(()=>Z.rateLimitForm.period===`concurrent`?`Max In-Flight Requests`:`Max Requests`);PE(l,{id:`rate-limit-max-requests`,get label(){return R(e)},children:(e,t)=>{var n=UD();ea(n),L(()=>K(n,`data-modal-autofocus`,Z.rateLimitEditing?!0:void 0)),la(n,()=>Z.rateLimitForm.max_requests,e=>Z.rateLimitForm.max_requests=e),V(e,n)},$$slots:{default:!0}})}var u=I(l,2),d=e=>{PE(e,{id:`rate-limit-max-tokens`,label:`Max Tokens`,children:(e,t)=>{var n=WD();ea(n),la(n,()=>Z.rateLimitForm.max_tokens,e=>Z.rateLimitForm.max_tokens=e),V(e,n)},$$slots:{default:!0}})};U(u,e=>{Z.rateLimitForm.period!==`concurrent`&&e(d)}),D(r);var f=I(r,4),p=e=>{V(e,GD())};U(f,e=>{Z.rateLimitEditing&&e(p)}),V(e,n)},$$slots:{default:!0}})}k()}Br([`change`,`input`]);var JD=B(` `),YD=B(` Edit`,1),XD=B(` `,1),ZD=B(`
            In-flight
            `),QD=B(`
            Requests
            `),$D=B(`
            Tokens
            `),eO=B(`
            `),tO=B(`
            `);function nO(e,t){O(t,!0);var n=tO();W(n,21,()=>t.rules,e=>Z.rateLimitKey(e),(e,t)=>{var n=eO(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=e=>{var n=JD(),r=P(n);{let e=A(()=>Z.rateLimitScope(R(t))===`provider`?bo:Pa);J(r,{get icon(){return R(e)},class:`budget-period-icon`})}var i=I(r,2),a=P(i,!0);D(i),D(n),L((e,t)=>{K(n,`title`,e),H(a,t)},[()=>`Rule scope: `+Z.rateLimitScopeLabel(R(t)),()=>Z.rateLimitScopeLabel(R(t))]),V(e,n)},u=A(()=>Z.rateLimitScope(R(t))!==`user_path`);U(c,e=>{R(u)&&e(l)});var d=I(c,2),f=P(d);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?ka:ko);J(f,{get icon(){return R(e)},class:`budget-period-icon`})}var p=I(f,2),m=P(p,!0);D(p),D(d),D(s);var h=I(s,2),g=P(h),_=P(g),v=P(_,!0);D(_),D(g);var y=I(g,2),b=P(y),x=e=>{OT(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitForm(R(t)),children:(e,t)=>{var n=YD();J(F(n),{get icon(){return uo},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},S=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(b,e=>{R(S)&&e(x)});var C=I(b,2);{let e=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting counters`:`Reset counters`),n=A(()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t)));OT(C,{get label(){return R(e)},class:`budget-action-btn budget-action-btn-warning`,onclick:()=>Z.resetRateLimit(R(t)),get disabled(){return R(n)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return go},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitResettingKey===Z.rateLimitKey(R(t))?`Resetting`:`Reset`]),V(e,r)},$$slots:{default:!0}})}var w=I(C,2),T=e=>{{let n=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting rate limit`:`Delete rate limit`),r=A(()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t)));OT(e,{get label(){return R(n)},class:`table-action-btn-danger budget-action-btn`,onclick:()=>Z.deleteRateLimit(R(t)),get disabled(){return R(r)},children:(e,n)=>{var r=XD(),i=F(r);J(i,{get icon(){return Ao},class:`budget-action-icon`});var a=I(i,2),o=P(a,!0);D(a),L(e=>H(o,e),[()=>Z.rateLimitDeletingKey===Z.rateLimitKey(R(t))?`Deleting`:`Delete`]),V(e,r)},$$slots:{default:!0}})}},E=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(w,e=>{R(E)&&e(T)}),D(y),D(h),D(i);var ee=I(i,2),te=P(ee),ne=e=>{var n=ZD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u),D(l),D(o),D(n),L((e,t,n,r,i,l)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l)},[()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests),()=>`In-flight requests: `+Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).in_flight,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).in_flight)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` in flight`]),V(e,n)},re=A(()=>Z.rateLimitIsConcurrent(R(t)));U(te,e=>{R(re)&&e(ne)});var ie=I(te,2),ae=e=>{var n=QD(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests),()=>`Requests used: `+Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).requests_used,R(t).max_requests)>=100}),()=>Z.formatRateLimitNumber(R(t).requests_used)+` of `+Z.formatRateLimitNumber(R(t).max_requests)+` requests`,()=>Z.formatRateLimitNumber(R(t).requests_remaining)+` left`]),V(e,n)},oe=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_requests);U(ie,e=>{R(oe)&&e(ae)});var se=I(ie,2),ce=e=>{var n=$D(),r=P(n),i=I(P(r),2),a=P(i,!0);D(i),D(r);var o=I(r,2),s=P(o);let c;var l=I(s,2),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=P(f,!0);D(f),D(l),D(o),D(n),L((e,t,n,r,i,l,u)=>{H(a,e),K(o,`aria-valuenow`,t),K(o,`aria-label`,n),Bi(o,r),c=G(s,1,`budget-bar-fill budget-bar-fill-usage`,null,c,i),H(d,l),H(p,u)},[()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens),()=>`Tokens used: `+Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens),()=>`--budget-progress: `+Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)+`%`,()=>({"budget-bar-fill-danger":Z.rateLimitUsagePercent(R(t).tokens_used,R(t).max_tokens)>=100}),()=>Z.formatRateLimitNumber(R(t).tokens_used)+` of `+Z.formatRateLimitNumber(R(t).max_tokens)+` tokens`,()=>Z.formatRateLimitNumber(R(t).tokens_remaining)+` left`]),V(e,n)},le=A(()=>!Z.rateLimitIsConcurrent(R(t))&&R(t).max_tokens);U(se,e=>{R(le)&&e(ce)}),D(ee),D(r),D(n),L((e,t,n,r,i)=>{K(a,`title`,e),H(o,t),H(m,n),K(_,`title`,r),H(v,i)},[()=>Z.rateLimitScopeLabel(R(t))+`: `+Z.rateLimitSubject(R(t)),()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n),k()}var rO=B(`

            Rate Limits

            `),iO=B(``),aO=B(`
            Rate limit management is unavailable.
            `),oO=B(``),sO=B(`
            `),cO=B(`

            No rate limits configured yet.

            `),lO=B(`

            No rate limits match your filter.

            `),uO=B(`
            `);function dO(e,t){O(t,!0),On(()=>{Y.refreshTick,Yo.page===`rate-limits`&&Z.fetchRateLimitsPage()});let n=A(()=>Z.filteredRateLimits());var r=uO(),i=P(r),a=P(i);iC(P(a),{copyId:`rate-limits-help-copy`,label:`rate limits help`,text:`Rate limits cap requests, tokens, and in-flight concurrency for a user path subtree, a provider, or a model. Consumer (user path) breaches return 429 with Retry-After and x-ratelimit-* headers; saturated providers and models are skipped by load balancing and failover while capacity exists elsewhere. Counters are per gateway instance and reset on restart; token limits need usage tracking.`,title:e=>{V(e,rO())},$$slots:{title:!0}}),D(a);var o=I(a,2),s=P(o),c=e=>{var t=iO();J(P(t),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(t),L(()=>t.disabled=Z.rateLimitFormSubmitting),z(`click`,t,()=>Z.openRateLimitForm()),V(e,t)},l=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitsAvailable&&!Y.authError);U(s,e=>{R(l)&&e(c)}),D(o),D(i);var u=I(i,2);Kc(u,{});var d=I(u,2),f=e=>{V(e,aO())},p=A(()=>(!Z.rateLimitsEnabled()||!Z.rateLimitsAvailable)&&!Y.authError);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{var t=oO(),n=P(t,!0);D(t),L(()=>H(n,Z.rateLimitError)),V(e,t)};U(m,e=>{Z.rateLimitError&&!Y.authError&&e(h)});var g=I(m,2),_=e=>{ET(e,{label:`Loading rate limits...`})};U(g,e=>{Z.rateLimitsLoading&&!Y.authError&&e(_)});var v=I(g,2),y=e=>{var t=sO(),n=P(t);jw(P(n),{id:`rate-limit-filter`,placeholder:`Filter by subject, scope, or period...`,label:`Filter rate limits by subject, scope, or period`,get value(){return Z.rateLimitFilter},set value(e){Z.rateLimitFilter=e}}),D(n),D(t),V(e,t)};U(v,e=>{(Z.rateLimits.length>0||Z.rateLimitFilter)&&Z.rateLimitsAvailable&&!Y.authError&&!Z.rateLimitFormOpen&&e(y)});var b=I(v,2);qD(b,{});var x=I(b,2),S=e=>{nO(e,{get rules(){return R(n)}})};U(x,e=>{R(n).length>0&&Z.rateLimitsAvailable&&!Y.authError&&e(S)});var C=I(x,2),w=e=>{V(e,cO())},T=A(()=>Z.rateLimits.length===0&&!Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{V(e,lO())},te=A(()=>Z.rateLimits.length>0&&R(n).length===0&&Z.rateLimitFilter&&!Z.rateLimitsLoading&&!Y.authError&&!Z.rateLimitError&&Z.rateLimitsAvailable&&Z.rateLimitsEnabled());U(E,e=>{R(te)&&e(ee)}),D(r),V(e,r),k()}Br([`click`]);function fO(e){return String(e||``).trim().toLowerCase()}function pO(e){if(!e)return``;let t=String(e.selector||``).trim();if(t)return t;if(!e.model||!e.model.id)return``;let n=String(e.model.id||``).trim(),r=String(e.provider_name||``).trim();if(r)return r+`/`+n;let i=String(e.provider_type||``).trim();return!i||n.includes(`/`)?n:i+`/`+n}function mO(e,t,n,r){let i=new Set,a=String(e||``).trim().toLowerCase(),o=String(t||``).trim().toLowerCase(),s=String(n||``).trim().toLowerCase(),c=String(r||``).trim().toLowerCase();if(c&&i.add(c),!a)return i;i.add(a),s&&i.add(s+`/`+a),o&&!a.includes(`/`)&&i.add(o+`/`+a);let l=a.split(`/`);return l.length===2&&l[1]&&i.add(l[1]),i}function hO(e){return mO(e&&e.model?e.model.id:``,e?e.provider_type:``,e?e.provider_name:``,e?e.selector:``)}function gO(e){let t=new Set,n=String(e.resolved_model||``).trim().toLowerCase(),r=String(e.target_model||``).trim().toLowerCase(),i=String(e.target_provider||``).trim().toLowerCase();if(n){t.add(n);let e=n.split(`/`);e.length===2&&e[1]&&t.add(e[1])}if(r){t.add(r);let e=r.split(`/`);e.length===2&&e[1]&&t.add(e[1])}return r&&i&&t.add(i+`/`+r),t}function _O(e){if(!e)return``;let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n||n===t||n.startsWith(t+`/`)?n:t+`/`+n}function vO(e){if(e===``||e==null)return null;let t=Number(e);return!Number.isFinite(t)||t<=0?null:t}function yO(e,t){let n={model:e},r=vO(t);return r!==null&&(n.weight=r),n}function bO(e){let t=Array.isArray(e)?e:[],n=[];for(let e of t){let t=String(e&&e.model||``).trim();t&&n.push(yO(t,e&&e.weight))}return n}function xO(e){switch(String(e||``).toLowerCase()){case`cost`:return`lowest cost`;case`round_robin`:case``:return`round robin`;default:return e}}var SO={round_robin:`Round-robin (rotate across targets; honors weights)`,cost:`Lowest cost (cheapest target per request)`,adaptive:`Adaptive (target chosen by the registered routing extension)`};function CO(e,t){let n=Array.isArray(e)?[...e]:[],r=String(t||``).trim().toLowerCase();return r&&!n.includes(r)&&n.push(r),n.map(e=>({value:e,label:SO[e]||e}))}function wO(e){let t=Array.isArray(e.targets)?e.targets:[],n=t.length>0?t[0]:{},r=t.map(e=>{let t={provider:e.provider||``,model:e.model||``};return e.weight&&(t.weight=e.weight),t});return{name:e.source,target_provider:n.provider||``,target_model:n.model||``,targets:r,strategy:e.strategy||``,session_affinity:e.session_affinity!==!1,description:e.description||``,slowdown:e.slowdown==null?null:Number(e.slowdown),enabled:e.enabled!==!1,managed:!!e.managed,valid:!!e.valid,resolved_model:e.resolved_model||``,provider_type:e.provider_type||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[]}}function TO(e){let t=Array.isArray(e)?e:[],n=[],r=[];for(let e of t)!e||typeof e!=`object`||(e.kind===`redirect`?n.push(wO(e)):e.kind===`policy`&&r.push({selector:e.source,provider_name:e.provider_name||``,model:e.model||``,user_paths:Array.isArray(e.user_paths)?e.user_paths:[],description:e.description||``,slowdown:e.slowdown==null?null:Number(e.slowdown),enabled:e.enabled!==!1,managed:!!e.managed,scope_kind:e.scope_kind||``}));return{aliases:n,policies:r}}function EO(e){if(!e)return`—`;let t=Array.isArray(e.targets)?e.targets:[];return t.length>1?t.length+` targets · `+xO(e.strategy):e.resolved_model?e.resolved_model:e.target_provider?e.target_provider+`/`+e.target_model:e.target_model||`—`}function DO(e){return e?e.enabled===!1?`is-disabled`:e.valid?`is-valid`:`is-invalid`:`is-invalid`}function OO(e){return e?e.enabled===!1?`Disabled`:e.valid?`Active`:`Invalid`:`Invalid`}function kO(e){return Array.isArray(e)&&e.length>0&&e.indexOf(`/`)===-1}function AO(e,t){return!t||!e?``:e.effective_enabled===!1?`is-disabled`:kO(e.user_paths)?`is-restricted`:`is-enabled`}function jO(e){if(!e)return``;let t=[];e.effective_enabled===!1&&t.push(e.default_enabled===!1?`Disabled by default`:`Disabled`);let n=Array.isArray(e.user_paths)?e.user_paths:[];return n.length>0&&t.push(`Allowed for `+n.join(`, `)),t.join(` · `)}function MO({models:e,aliases:t,virtualModelsAvailable:n,activeCategory:r}){let i=Array.isArray(e)?e:[],a=Array.isArray(t)?t:[],o=new Map;if(n)for(let e of a){let t=fO(e&&e.name);!t||e.enabled===!1||!e.valid||o.set(t,e)}let s=new Map,c=i.map(e=>{let t=pO(e),n=null;for(let t of hO(e))s.has(t)||s.set(t,e),!n&&o.has(t)&&(n=o.get(t));let r=e&&e.access?e.access:null;return{key:`model:`+t,display_name:t,secondary_name:``,provider_name:e.provider_name||``,provider_type:e.provider_type||``,model:e.model,selector:e.selector||``,is_alias:!1,alias:null,access:r,masking_alias:n,has_virtual_model:!!(n||r&&r.override),alias_state_class:``,alias_state_text:``}});if(!n)return c;for(let e of a){let t=s.get(fO(e&&e.name));if(e&&e.enabled!==!1&&e.valid&&t)continue;let n=null;for(let t of gO(e))if(n=s.get(t)||null,n)break;!n&&r&&r!==`all`||c.push({key:`alias:`+e.name,display_name:e.name,secondary_name:EO(e),provider_name:n&&n.provider_name||``,provider_type:n?n.provider_type||e.provider_type||``:e.provider_type||``,model:n?n.model:{id:e.name,object:`model`},selector:``,is_alias:!0,alias:e,access:null,masking_alias:null,source_model_exists:!!t,has_virtual_model:!0,alias_state_class:DO(e),alias_state_text:OO(e)})}return c.sort((e,t)=>e.is_alias===t.is_alias?String(e.display_name||``).localeCompare(String(t.display_name||``)):e.is_alias?-1:1)}function NO(e,t){if(!t)return e;let n=String(t).toLowerCase();return e.filter(e=>[e.display_name,e.secondary_name,e.provider_name,e.provider_type,e.model&&e.model.owned_by,e.alias&&e.alias.description,e.alias&&e.alias_state_text,e.model&&e.model.metadata&&e.model.metadata.modes?e.model.metadata.modes.join(`,`):``,e.model&&e.model.metadata&&e.model.metadata.categories?e.model.metadata.categories.join(`,`):``].some(e=>String(e||``).toLowerCase().includes(n)))}function PO(e,t){return String(e||``).trim()||String(t||``).trim()||`Unassigned`}function FO(e,t){let n=String(e||``).trim(),r=String(t||``).trim();return!r||r===n?``:r}function IO(e){let t=String(e||``).trim();return t?t+`/`:``}function LO(e){let t=Array.isArray(e)?e:[],n=t.filter(e=>e&&!e.is_alias).length,r=t.filter(e=>e&&e.is_alias).length,i=[];return n>0&&i.push(n+(n===1?` model`:` models`)),r>0&&i.push(r+(r===1?` alias`:` aliases`)),i.join(` · `)}function RO(e,t,n){let r=String(t||``).trim(),i=String(n||``).trim();for(let t of Array.isArray(e)?e:[]){let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim();if(!(r&&e!==r)&&!(!r&&i&&n!==i)&&t&&t.access)return t.access.default_enabled!==!1}return!0}function zO(e){for(let t of Array.isArray(e)?e:[])if(t&&t.access)return t.access.default_enabled!==!1;return!0}function BO(e,t){let n=String(t||``).trim();if(!n)return null;for(let t of Array.isArray(e)?e:[])if(String(t&&t.selector||``).trim()===n)return t;return null}function VO(e,t,n,r){let i=IO(t),a=r&&r.get(`/`)||null,o=i&&r&&r.get(i)||null,s=RO(e,t,n),c=o||a,l=c&&Array.isArray(c.user_paths)?Array.from(new Set(c.user_paths)).sort():[];return{selector:i,default_enabled:s,effective_enabled:c?c.enabled!==!1:s,user_paths:l,override:o}}function HO(e,t,n){if(!Array.isArray(e)||e.length===0)return[];let r=new Map;for(let e of Array.isArray(n)?n:[]){let t=String(e&&e.selector||``).trim();t&&r.set(t,e)}let i=[],a=new Map;for(let t of e){if(t&&t.is_alias){i.push(t);continue}let e=String(t&&t.provider_name||``).trim(),n=String(t&&t.provider_type||``).trim(),r=`provider-group:`+(e||n||`unassigned`);a.has(r)||a.set(r,{key:r,provider_name:e,provider_type:n,display_name:PO(e,n),type_label:FO(e,n),rows:[]});let o=a.get(r);!o.provider_name&&e&&(o.provider_name=e),!o.provider_type&&n&&(o.provider_type=n),o.display_name=PO(o.provider_name,o.provider_type),o.type_label=FO(o.provider_name,o.provider_type),o.rows.push(t)}let o=Array.from(a.values()).map(e=>{let n=VO(t,e.provider_name,e.provider_type,r);return{...e,access:n,access_summary:jO(n),item_count_label:LO(e.rows)}}).sort((e,t)=>String(e.display_name||``).localeCompare(String(t.display_name||``)));return i.length>0&&o.unshift({key:`virtual-model-group`,is_virtual_models:!0,provider_name:``,provider_type:``,display_name:`Virtual models`,type_label:``,rows:i,access:{selector:``},access_summary:``,item_count_label:LO(i)}),o}function UO(e,t){let n=BO(t,`/`),r=zO(e),i=n&&Array.isArray(n.user_paths)?n.user_paths:[];return{key:`scope-global`,is_alias:!1,display_name:`all providers and models`,access:{selector:`/`,default_enabled:r,effective_enabled:n?n.enabled!==!1:r,user_paths:i,override:n}}}function WO(e){return e?String(e.access&&e.access.selector||``).trim()||String(e.override_selector||``).trim()||pO(e):``}function GO(e){if(!e)return[];let t=[];return e.is_alias?t.push(`alias-row`,DO(e.alias)):e.has_virtual_model&&t.push(`alias-row`,`is-valid`),!e.is_alias&&e.masking_alias&&t.push(`masked-model-row`),!e.is_alias&&e.access&&e.access.effective_enabled===!1&&t.push(`model-access-disabled-row`),t}function KO(e){return!!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)}function qO(e){return!!(e&&!e.is_alias&&e.masking_alias&&e.masking_alias.name&&!e.masking_alias.managed)}function JO(e){return e&&e.is_alias&&e.alias&&e.alias.name?`alias-row-`+String(e.alias.name).replace(/[^a-zA-Z0-9_-]+/g,`-`):``}function YO(e){return e?e.is_alias?!!(e.alias&&e.alias.managed):!!(e.access&&e.access.override&&e.access.override.managed||e.masking_alias&&e.masking_alias.managed):!1}function XO(e){return!!(e&&e.override)}function ZO(e){return e?`table-action-btn-active`:``}function QO(e,t){let n=`Edit `+String(e||`model access`);return t?n+` (virtual model exists)`:n}function $O(){return{source:``,target_model:``,target_weight:1,targets:[],strategy:`round_robin`,session_affinity:!0,user_paths:``,description:``,slowdown:``,enabled:!0}}function ek(e){return String(e&&e.target_model||``).trim()!==``}function tk(e){return String(e&&e.target_model||``).trim()?!0:bO(e&&e.targets).length>0}function nk(e){if(tk(e))return!0;let t=String(e&&e.source||``).trim();return!!t&&t!==`/`&&!t.endsWith(`/`)}function rk(e){return!!e&&Array.isArray(e.targets)&&e.targets.length>0}function ik(e){return rk(e)&&String(e&&e.strategy||``).toLowerCase()!==`cost`}function ak(e){let t=Array.isArray(e.targets)?e.targets:[];if(t.length>0){let n=t.shift();e.target_model=n.model||``,e.target_weight=n.weight||1;return}e.target_model=``,e.target_weight=1}function ok(e){let t=Array.isArray(e&&e.targets)?e.targets:[];return t.length>0?{primaryModel:_O(t[0]),primaryWeight:t[0].weight||1,extraTargets:t.slice(1).map(e=>({model:_O(e),weight:e.weight||1}))}:{primaryModel:e&&e.target_provider?e.target_provider+`/`+e.target_model:e&&e.target_model||``,primaryWeight:1,extraTargets:[]}}function sk(e){return String(e||``).split(/\r?\n|,/).map(e=>String(e||``).trim()).filter(Boolean)}function ck(e,t,n){let r=String(e&&e.source||``).trim(),i=String(e&&e.target_model||``).trim(),a=bO(e&&e.targets),o=tk(e),s=String(t||``).trim(),c=n===`edit`&&!!s&&r!==s,l={source:r,user_paths:sk(e&&e.user_paths),description:String(e&&e.description||``).trim(),enabled:!!(e&&e.enabled)},u=e&&e.slowdown;if(u!==``&&u!=null){let e=Number(u);Number.isFinite(e)&&(l.slowdown=e)}if(c&&(l.old_source=s),o){let t=[];if(i&&t.push(yO(i,e.target_weight)),t.push(...a),t.length>1){let n=e.strategy||`round_robin`;l.targets=n===`cost`?t.map(e=>({model:e.model})):t,l.strategy=n,e&&e.session_affinity===!1&&(l.session_affinity=!1)}else l.target_model=t[0].model}return{payload:l,source:r,isRedirect:o,isRename:c}}function lk(e){let t={source:e.name,description:String(e.description||``).trim(),user_paths:Array.isArray(e.user_paths)?e.user_paths:[],enabled:e.enabled===!1};if(e.slowdown!=null){let n=Number(e.slowdown);Number.isFinite(n)&&(t.slowdown=n)}let n=Array.isArray(e.targets)?e.targets:[];return n.length>1?(t.strategy=e.strategy||`round_robin`,e.session_affinity===!1&&(t.session_affinity=!1),t.targets=t.strategy===`cost`?n.map(e=>({model:_O(e)})):n.map(e=>yO(_O(e),e.weight))):n.length===1?t.target_model=_O(n[0]):t.target_model=e.target_provider?e.target_provider+`/`+e.target_model:e.target_model,t}function uk(e,t,n){let r=n||{},i=r.effective_enabled===!1,a=t&&Array.isArray(t.user_paths)?t.user_paths:[],o=String(t&&t.description||``).trim(),s=!!(t&&t.slowdown!=null),c=Number(s?t.slowdown:0),l={};o&&(l.description=o),s&&Number.isFinite(c)&&(l.slowdown=c);let u=`PUT`,d;return i===!1?d={source:e,enabled:!1,user_paths:a,...l}:t&&a.length===0&&!o&&!s&&r.default_enabled!==!1?(u=`DELETE`,d={source:e}):d={source:e,enabled:!0,user_paths:a,...l},{method:u,payload:d,desired:i}}function dk(e,t,n){let r=Math.max(1,Number(t||75)),i=Math.min(n,e+r);return{limit:i,rendering:iMO({models:Wc.models,aliases:this.aliases,virtualModelsAvailable:this.virtualModelsAvailable,activeCategory:Wc.activeCategory}));get displayModels(){return R(this.#T)}set displayModels(e){M(this.#T,e)}#E=A(()=>HO(this.displayModels,Wc.models,this.modelOverrideViews));get displayModelGroups(){return R(this.#E)}set displayModelGroups(e){M(this.#E,e)}#D=A(()=>NO(this.displayModels,Wc.filter));get filteredDisplayModels(){return R(this.#D)}set filteredDisplayModels(e){M(this.#D,e)}#O=A(()=>{let e=this.filteredDisplayModels,t=Math.max(0,Math.min(Number(this.modelRenderLimit||0),e.length));return!Wc.filter&&t>=this.displayModels.length?this.displayModelGroups:HO(e.slice(0,t),Wc.models,this.modelOverrideViews)});get filteredDisplayModelGroups(){return R(this.#O)}set filteredDisplayModelGroups(e){M(this.#O,e)}#k=A(()=>UO(Wc.models,this.modelOverrideViews));get globalScopeRow(){return R(this.#k)}set globalScopeRow(e){M(this.#k,e)}modelsBusy(){return!!(Wc.loading||this.modelsRendering)}modelLoadingText(){if(Wc.loading)return this.displayModels.length>0?`Refreshing models...`:`Loading models...`;let e=this.filteredDisplayModels.length;return`Rendering models... `+Math.min(Number(this.modelRenderLimit||0),e)+` / `+e}restartModelRendering(e){let t=++this.#a,n=fk(this.modelRenderBatchSize,e);this.modelRenderLimit=n.limit,this.modelsRendering=n.rendering,n.rendering&&this.#A(t)}stopModelRendering(){this.#a++,this.modelsRendering=!1}#A(e){let t=()=>{if(e!==this.#a)return;let t=dk(this.modelRenderLimit,this.modelRenderBatchSize,this.filteredDisplayModels.length);this.modelRenderLimit=t.limit,this.modelsRendering=t.rendering,t.rendering&&this.#A(e)};typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>setTimeout(t,0)):setTimeout(t,0)}async fetchVirtualModels(){this.aliasLoading=!0,this.aliasError=``;try{let e=await ws(`/admin/virtual-models`,{label:`virtual models`});if(e.status===503){this.virtualModelsAvailable=!1,this.aliases=[],this.modelOverrideViews=[];return}if(e.stale)return;if(this.virtualModelsAvailable=!0,!e.ok){this.aliases=[],this.modelOverrideViews=[];return}let{aliases:t,policies:n}=TO(e.data);this.aliases=t,this.modelOverrideViews=n}catch(e){console.error(`Failed to fetch virtual models:`,e),this.aliases=[],this.modelOverrideViews=[],this.aliasError=`Unable to load virtual models.`}finally{this.aliasLoading=!1}}qualifiedModelName(e){return pO(e)}findModelOverrideView(e){return BO(this.modelOverrideViews,e)}hasGlobalModelOverride(){return!!this.findModelOverrideView(`/`)}findExistingAliasByName(e){let t=fO(e);if(!t)return null;for(let e of this.aliases)if(fO(e&&e.name)===t)return e;return null}findConcreteModelByName(e){let t=fO(e);if(!t)return null;for(let e of Wc.models)if(hO(e).has(t))return e;return null}rowToggleEnabled(e){return e?e.is_alias?e.alias&&e.alias.enabled!==!1:!!(e.access&&e.access.effective_enabled!==!1):!1}rowToggleLabel(e){return this.rowTogglingKey&&this.rowTogglingKey===e.key?`Updating...`:this.rowToggleRestricted(e)?`Restricted`:this.rowToggleEnabled(e)?`Enabled`:`Disabled`}rowToggleRestricted(e){return!!e&&!e.is_alias&&AO(e.access,this.virtualModelsAvailable)===`is-restricted`}rowToggleAriaLabel(e){if(!e)return``;let t=this.rowToggleEnabled(e)?`Disable `:`Enable `,n;return n=e.is_alias?`alias `+String(e.alias&&e.alias.name||``):String(e.display_name||e.access&&e.access.selector||`model`),t+n.trim()}async toggleRowEnabled(e){if(this.virtualModelsAvailable&&!(!e||this.rowTogglingKey===e.key)){if(YO(e)){lc.success(`This virtual model is managed by configuration and is read-only.`);return}if(e.is_alias){await this.toggleAliasRow(e);return}await this.toggleModelRow(e)}}async toggleAliasRow(e){let t=e.alias;if(!t||!t.name)return;this.rowTogglingKey=e.key;let n=lk(t);try{let e=await Ts(`/admin/virtual-models`,`PUT`,n,{label:`alias state`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update alias state.`));return}lc.success(n.enabled?`Alias enabled.`:`Alias disabled.`),this.fetchVirtualModels()}catch(e){console.error(`Failed to toggle alias state:`,e),lc.error(`Failed to update alias state.`)}finally{this.rowTogglingKey=``}}async toggleModelRow(e){let t=WO(e);if(!t)return;let{method:n,payload:r,desired:i}=uk(t,this.findModelOverrideView(t),e.access||{});this.rowTogglingKey=e.key;try{let e=await Ts(`/admin/virtual-models`,n,r,{label:`model access`});if(e.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(n===`DELETE`&&e.status===404)){if(e.stale)return;if(!e.ok){lc.error(e.status===401?`Authentication required.`:bs(e,`Failed to update model access.`));return}}lc.success(i?`Model enabled.`:`Model disabled.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to toggle model access:`,e),lc.error(`Failed to update model access.`)}finally{this.rowTogglingKey=``}}async removeAliasRow(e){if(!(e&&e.is_alias&&e.alias&&e.alias.name&&!e.alias.managed)||this.rowDeletingKey)return;let t=String(e.alias.name||``).trim();t&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the virtual model alias "`+t+`"?`,method:`DELETE`,payload:{source:t},operation:`virtual model`,failureMessage:`Failed to remove virtual model.`,notice:`Virtual model removed.`,ignoreNotFound:!0})}async removeRedirectRow(e){let t=e&&e.masking_alias;if(!(e&&!e.is_alias&&t&&t.name&&!t.managed)||this.rowDeletingKey)return;let n=String(t.name||``).trim();n&&await this.mutateVirtualModelRow({rowKey:e.key,confirmMessage:`Remove the redirect for "`+n+`"? Other virtual model settings will be preserved.`,method:`PUT`,payload:{source:n,user_paths:Array.isArray(t.user_paths)?t.user_paths:[],description:String(t.description||``).trim(),enabled:t.enabled!==!1,...t.slowdown==null?{}:{slowdown:Number(t.slowdown)}},operation:`virtual model redirect`,failureMessage:`Failed to remove redirect.`,notice:`Redirect removed. Other virtual model settings were preserved.`})}async mutateVirtualModelRow(e){if(!this.rowDeletingKey&&window.confirm(e.confirmMessage)){this.rowDeletingKey=e.rowKey;try{let t=await Ts(`/admin/virtual-models`,e.method,e.payload,{label:e.operation});if(t.status===503){this.virtualModelsAvailable=!1,lc.error(`Virtual models feature is unavailable.`);return}if(!(e.ignoreNotFound&&t.status===404)){if(t.stale)return;if(!t.ok){lc.error(t.status===401?`Authentication required.`:bs(t,e.failureMessage));return}}this.virtualModelsAvailable=!0,lc.success(e.notice),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(t){console.error(e.failureMessage,t),lc.error(e.failureMessage)}finally{this.rowDeletingKey=``}}}addVmTarget(){Array.isArray(this.vmForm.targets)||(this.vmForm.targets=[]),this.vmForm.targets.push({model:``,weight:1})}removeVmTarget(e){Array.isArray(this.vmForm.targets)&&this.vmForm.targets.splice(e,1)}removePrimaryTarget(){ak(this.vmForm)}vmFormHasPrimaryTarget(){return ek(this.vmForm)}vmFormShowStrategy(){return rk(this.vmForm)}vmStrategyOptions(){return CO(ks.virtualModelStrategies(),this.vmForm.strategy)}vmFormShowWeights(){return ik(this.vmForm)}vmFormSupportsSlowdown(){return nk(this.vmForm)}vmFormToggleRestricted(){return!!(this.vmForm&&this.vmForm.enabled)&&kO(sk(this.vmForm.user_paths))}vmFormToggleLabel(){return!this.vmForm||!this.vmForm.enabled?`Disabled`:this.vmFormToggleRestricted()?`Restricted`:`Enabled`}resetVirtualModelForm(){this.vmFormError=``,this.vmFormHelpOpen=!1,this.vmFormUserPathsHelpOpen=!1,this.vmSubmitting=!1,this.vmDeleting=!1,this.vmFormHasExisting=!1,this.vmFormDefaultEnabled=!0,this.vmFormEffectiveEnabled=!0,this.vmFormDisplayName=``,this.vmFormSourceLocked=!1,this.vmFormOriginalSource=``,this.vmFormManaged=!1,this.vmForm=$O()}closeVirtualModelForm(){this.vmFormOpen=!1,this.resetVirtualModelForm()}openVirtualModelCreate(e){this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`create`,this.vmFormSourceLocked=!1,this.vmFormDisplayName=`New virtual model`,e&&e.model&&e.model.id&&(this.vmForm.target_model=pO(e))}openVirtualModelEditAlias(e){if(!e)return;this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!1,this.vmFormHasExisting=!0,this.vmFormManaged=!!e.managed,this.vmFormOriginalSource=e.name||``,this.vmFormDisplayName=e.name||``,this.vmFormDefaultEnabled=zO(Wc.models),this.vmFormEffectiveEnabled=e.enabled!==!1;let{primaryModel:t,primaryWeight:n,extraTargets:r}=ok(e);this.vmForm={source:e.name||``,target_model:t,target_weight:n,targets:r,strategy:e.strategy||`round_robin`,session_affinity:e.session_affinity!==!1,user_paths:(Array.isArray(e.user_paths)?e.user_paths:[]).join(` +`),description:e.description||``,slowdown:e.slowdown??``,enabled:e.enabled!==!1}}openVirtualModelEditModel(e){if(!e||e.is_alias)return;let t=e.access||{},n=t.override||null,r=n&&Array.isArray(n.user_paths)?n.user_paths:Array.isArray(t.user_paths)?t.user_paths:[],i=WO(e);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!n,this.vmFormOriginalSource=i;let a=n?n.enabled!==!1:t.effective_enabled!==!1;this.vmFormDefaultEnabled=t.default_enabled!==!1,this.vmFormEffectiveEnabled=a,this.vmFormManaged=!!(n&&n.managed),this.vmFormDisplayName=e.access_display_name||e.display_name||i||``,this.vmForm={source:i,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:r.join(` +`),description:n&&n.description?n.description:``,slowdown:n&&n.slowdown!=null?n.slowdown:``,enabled:a}}openGlobalModelOverrideEdit(){let e=this.findModelOverrideView(`/`),t=e&&Array.isArray(e.user_paths)?e.user_paths:[],n=zO(Wc.models);this.resetVirtualModelForm(),this.vmFormOpen=!0,this.vmFormMode=`edit`,this.vmFormSourceLocked=!0,this.vmFormHasExisting=!!e,this.vmFormOriginalSource=`/`,this.vmFormDefaultEnabled=n,this.vmFormEffectiveEnabled=e?e.enabled!==!1:n,this.vmFormManaged=!!(e&&e.managed),this.vmFormDisplayName=`All providers and models`,this.vmForm={source:`/`,target_model:``,target_weight:``,targets:[],strategy:`round_robin`,user_paths:t.join(` +`),description:e&&e.description?e.description:``,slowdown:e&&e.slowdown!=null?e.slowdown:``,enabled:e?e.enabled!==!1:n}}openProviderOverrideEdit(e){!e||!e.access||!e.access.selector||this.openVirtualModelEditModel({display_name:e.display_name,access_display_name:`All models in `+e.display_name,provider_name:e.provider_name,provider_type:e.provider_type,access:e.access,override_selector:e.access.selector,is_alias:!1})}async submitVirtualModelForm(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be edited here.`;return}let{payload:e,source:t,isRedirect:n,isRename:r}=ck(this.vmForm,this.vmFormOriginalSource,this.vmFormMode);if(!t){this.vmFormError=`Source is required.`;return}if(this.vmFormError=``,this.vmFormMode!==`edit`){let e=this.findExistingAliasByName(t),r=e?null:this.findModelOverrideView(t);if(e||r){let n=e?`A virtual model named "`+e.name+`" already exists. Saving will update that virtual model. Continue?`:`An access policy for "`+t+`" already exists. Saving will update that virtual model. Continue?`;if(!window.confirm(n)){this.vmFormError=`Choose a different source or edit the existing virtual model.`;return}}else if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Creating this alias will mask that model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}else if(r){let e=(this.aliases||[]).find(e=>e&&e.name===t)||null,r=e?null:this.findModelOverrideView(t);if(e||r){this.vmFormError=`A virtual model for "`+t+`" already exists. Choose a different source.`;return}if(n){let e=this.findConcreteModelByName(t);if(e){let t=pO(e)||String(e.model&&e.model.id||``).trim();if(!window.confirm(`A model named "`+t+`" already exists. Renaming to that name will mask the model in the list. Continue?`)){this.vmFormError=`Choose a different source to avoid masking an existing model.`;return}}}}this.vmSubmitting=!0;try{let t=await Ts(`/admin/virtual-models`,`PUT`,e,{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to save virtual model.`);return}let r=!n&&t.status===204;this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(n?`Alias saved.`:r?`Model access reset to inherited/default.`:`Model access saved.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to save virtual model:`,e),this.vmFormError=`Failed to save virtual model.`}finally{this.vmSubmitting=!1}}async deleteVirtualModel(){if(this.vmFormManaged){this.vmFormError=`This virtual model is managed by configuration and cannot be removed here.`;return}let e=String(this.vmForm.source||this.vmFormOriginalSource||``).trim();if(!(!e||!this.vmFormHasExisting)&&window.confirm(`Remove the virtual model for "`+e+`"? This reverts to inherited/default behavior.`)){this.vmDeleting=!0,this.vmFormError=``;try{let t=await Ts(`/admin/virtual-models`,`DELETE`,{source:e},{label:`virtual model`});if(t.status===503){this.virtualModelsAvailable=!1,this.vmFormError=`Virtual models feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.vmFormError=t.status===401?`Authentication required.`:bs(t,`Failed to remove virtual model.`);return}}this.virtualModelsAvailable=!0,this.closeVirtualModelForm(),lc.success(`Virtual model removed.`),Promise.all([Wc.fetchModels(),this.fetchVirtualModels()])}catch(e){console.error(`Failed to delete virtual model:`,e),this.vmFormError=`Failed to remove virtual model.`}finally{this.vmDeleting=!1}}}},mk=[{value:`input_per_mtok`,label:`Input $/MTok`,group:`Tokens`},{value:`output_per_mtok`,label:`Output $/MTok`,group:`Tokens`},{value:`cached_input_per_mtok`,label:`Cached input $/MTok`,group:`Tokens`},{value:`cache_write_per_mtok`,label:`Cache write $/MTok`,group:`Tokens`},{value:`reasoning_output_per_mtok`,label:`Reasoning output $/MTok`,group:`Tokens`},{value:`batch_input_per_mtok`,label:`Batch input $/MTok`,group:`Batch`},{value:`batch_output_per_mtok`,label:`Batch output $/MTok`,group:`Batch`},{value:`audio_input_per_mtok`,label:`Audio input $/MTok`,group:`Audio`},{value:`audio_output_per_mtok`,label:`Audio output $/MTok`,group:`Audio`},{value:`per_image`,label:`$/Image`,group:`Image`},{value:`input_per_image`,label:`Input $/Image`,group:`Image`},{value:`per_second_input`,label:`Input $/Second`,group:`Audio/Video`},{value:`per_second_output`,label:`Output $/Second`,group:`Video`},{value:`per_character_input`,label:`$/Character`,group:`Audio`},{value:`per_page`,label:`$/Page`,group:`Utility`},{value:`per_request`,label:`$/Request`,group:`Utility`}];function hk(e){let t=mk.find(t=>t.value===e);return t?t.label:String(e||``).replace(/_/g,` `)}function gk(e){return e&&typeof e==`object`?JSON.parse(JSON.stringify(e)):{}}function _k(e,t){let n=gk(e),r=t&&t.pricing?t.pricing:t;if(!r||typeof r!=`object`)return n;for(let e of mk)r[e.value]!==null&&r[e.value]!==void 0&&(n[e.value]=Number(r[e.value]));return Array.isArray(r.tiers)&&r.tiers.length>0&&(n.tiers=gk(r.tiers)),n}function vk(e){switch(String(e||``).trim()){case`config_yaml`:return`config.yaml`;case`model_registry`:return`Model registry`;default:return e?String(e):`Unknown`}}function yk(e){let t=e&&e.pricing?e.pricing:{},n=e&&e.pricing_sources&&typeof e.pricing_sources==`object`?e.pricing_sources:{},r={};for(let e of mk)t[e.value]!==null&&t[e.value]!==void 0&&(r[e.value]=vk(n[e.value]||`model_registry`));return r}function bk(e){let t=String(e&&e.selector||``).trim();return t?`Dashboard/API override (`+t+`)`:`Dashboard/API override`}function xk(e){let t=String(e||``).trim();return t?t+`/`:``}function Sk(e){return String(e&&e.model&&e.model.id||``).trim()}function Ck(e){let t=String(e&&e.provider_name||``).trim(),n=Sk(e);return t&&n?t+`/`+n:n}function wk(e){return Sk(e)}function Tk(e){let t=new Map;for(let n of Array.isArray(e)?e:[]){let e=String(n&&n.selector||``).trim();e&&t.set(e,n)}return t}function Ek(e,t){let n=String(t||``).trim();return n&&Tk(e).get(n)||null}function Dk(e,t,n){let r=Tk(e),i=Ck(t),a=wk(t),o=xk(t&&t.provider_name),s=String(n||``).trim();for(let e of[i,a,o,`/`]){if(!e||e===s)continue;let t=r.get(e);if(t)return t}return null}function Ok(e,t,n){let r=e&&e.model&&e.model.metadata?e.model.metadata:null,i=gk(r&&r.pricing),a=yk(r),o=Dk(t,e,n),s=o&&o.pricing?o.pricing:null;if(s){let e=bk(o);for(let t of mk)s[t.value]!==null&&s[t.value]!==void 0&&(i[t.value]=Number(s[t.value]),a[t.value]=e);Array.isArray(s.tiers)&&s.tiers.length>0&&(i.tiers=gk(s.tiers),a.tiers=e)}return{pricing:i,sources:a}}function kk(e,t){let n=e&&e.pricing?e.pricing:{},r=[];for(let e of mk)n[e.value]!==null&&n[e.value]!==void 0&&r.push({id:t(),field:e.value,value:String(n[e.value])});return r}function Ak(e,t){let n=new Set;for(let r of Array.isArray(e)?e:[]){if(t&&r.id===t)continue;let e=String(r.field||``).trim();e&&n.add(e)}return n}function jk(e,t){let n=Ak(e,t&&t.id);return mk.filter(e=>e.value===(t&&t.field)||!n.has(e.value))}function Mk(e,t){let n={},r=new Set;for(let t of Array.isArray(e)?e:[]){let e=String(t.field||``).trim();if(!e)return{error:`Choose a price type for every row.`};if(r.has(e))return{error:`Each price type can only be used once.`};r.add(e);let i=String(t.value||``).trim();if(i===``)return{error:`Enter a value for `+hk(e)+`.`};let a=Number(i);if(!Number.isFinite(a)||a<0)return{error:`Pricing values must be numbers greater than or equal to 0.`};n[e]=a}let i=Array.isArray(t)?t:[];return i.length>0&&(n.tiers=gk(i)),Object.keys(n).length===0?{error:`Add at least one pricing field before saving.`}:{pricing:n}}function Nk(e,t,n){let r=e||{},i=t||{},a=n||{},o=_k(r,a);return mk.map(e=>{let t=a[e.value]!==null&&a[e.value]!==void 0,n=r[e.value]!==null&&r[e.value]!==void 0;return{field:e.value,label:e.label,value:o[e.value],source:t?`Form/API value`:n?i[e.value]||`Model registry`:`Unset`}}).filter(e=>e.source!==`Unset`||e.value!==void 0)}var Pk=new class{#e=j(!0);get modelPricingOverridesAvailable(){return R(this.#e)}set modelPricingOverridesAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get modelPricingOverrideViews(){return R(this.#t)}set modelPricingOverrideViews(e){M(this.#t,e,!0)}#n=j(``);get modelPricingOverrideError(){return R(this.#n)}set modelPricingOverrideError(e){M(this.#n,e,!0)}#r=j(!1);get modelPricingOverrideFormOpen(){return R(this.#r)}set modelPricingOverrideFormOpen(e){M(this.#r,e,!0)}#i=j(!1);get modelPricingOverrideSubmitting(){return R(this.#i)}set modelPricingOverrideSubmitting(e){M(this.#i,e,!0)}#a=j(!1);get modelPricingOverrideFormHasExistingOverride(){return R(this.#a)}set modelPricingOverrideFormHasExistingOverride(e){M(this.#a,e,!0)}#o=j(``);get modelPricingOverrideFormDisplayName(){return R(this.#o)}set modelPricingOverrideFormDisplayName(e){M(this.#o,e,!0)}#s=j(``);get modelPricingOverrideFormScope(){return R(this.#s)}set modelPricingOverrideFormScope(e){M(this.#s,e,!0)}#c=j(N([]));get modelPricingOverrideFormScopeOptions(){return R(this.#c)}set modelPricingOverrideFormScopeOptions(e){M(this.#c,e,!0)}#l=j(null);get modelPricingOverrideFormRow(){return R(this.#l)}set modelPricingOverrideFormRow(e){M(this.#l,e,!0)}#u=j(null);get modelPricingOverrideFormBasePricing(){return R(this.#u)}set modelPricingOverrideFormBasePricing(e){M(this.#u,e,!0)}#d=j(null);get modelPricingOverrideFormBasePricingSources(){return R(this.#d)}set modelPricingOverrideFormBasePricingSources(e){M(this.#d,e,!0)}#f=j(N([]));get modelPricingOverrideFormPreservedTiers(){return R(this.#f)}set modelPricingOverrideFormPreservedTiers(e){M(this.#f,e,!0)}#p=j(N([]));get modelPricingOverrideRows(){return R(this.#p)}set modelPricingOverrideRows(e){M(this.#p,e,!0)}#m=j(N({selector:``}));get modelPricingOverrideForm(){return R(this.#m)}set modelPricingOverrideForm(e){M(this.#m,e,!0)}_modelPricingOverrideRowID=0;pricingFieldOptions(){return mk}pricingFieldLabel(e){return hk(e)}async fetchModelPricingOverrides(){this.modelPricingOverrideError=``;try{let e=await ws(`/admin/model-pricing-overrides`,{label:`model pricing overrides`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideViews=[];return}if(e.stale)return;if(this.modelPricingOverridesAvailable=!0,!e.ok){this.modelPricingOverrideViews=[];return}this.modelPricingOverrideViews=Array.isArray(e.data)?e.data:[]}catch(e){console.error(`Failed to fetch model pricing overrides:`,e),this.modelPricingOverrideViews=[],this.modelPricingOverrideError=`Unable to load model pricing overrides.`}}findModelPricingOverrideView(e){return Ek(this.modelPricingOverrideViews,e)}hasGlobalPricingOverride(){return!!this.findModelPricingOverrideView(`/`)}hasProviderPricingOverride(e){return!!this.findModelPricingOverrideView(xk(e&&e.provider_name))}hasModelPricingOverride(e){return!!this.findModelPricingOverrideView(Ck(e))}modelPricingButtonClass(e){return e?`table-action-btn-active`:``}modelPricingButtonLabel(e,t){let n=`Edit `+String(e||`model pricing`);return t?n+` (override exists)`:n}modelRowPricing(e){return Ok(e,this.modelPricingOverrideViews).pricing}openGlobalPricingOverrideEdit(){this.openModelPricingOverrideForm({displayName:`All providers and models`,selector:`/`,scope:`global`,scopeOptions:[{value:`global`,label:`All providers and models`,selector:`/`}],row:null})}openProviderPricingOverrideEdit(e){let t=xk(e&&e.provider_name);t&&this.openModelPricingOverrideForm({displayName:`All models in `+(e.display_name||e.provider_name||t),selector:t,scope:`provider`,scopeOptions:[{value:`provider`,label:`Provider`,selector:t}],row:null})}openModelPricingOverrideEdit(e){if(!e||e.is_alias)return;let t=Ck(e),n=wk(e),r=[{value:`exact`,label:`This provider and model`,selector:t}];n&&n!==t&&r.push({value:`model`,label:`This model across providers`,selector:n}),this.openModelPricingOverrideForm({displayName:e.display_name||t,selector:t,scope:`exact`,scopeOptions:r,row:e})}openModelPricingOverrideForm(e){let t=e||{};this.modelPricingOverrideFormOpen=!0,this.modelPricingOverrideError=``,this.modelPricingOverrideFormDisplayName=t.displayName||t.selector||`Pricing`,this.modelPricingOverrideFormScope=t.scope||``,this.modelPricingOverrideFormScopeOptions=Array.isArray(t.scopeOptions)?t.scopeOptions:[],this.modelPricingOverrideFormRow=t.row||null,this.modelPricingOverrideForm={selector:t.selector||``},this.loadModelPricingOverrideFormSelector(t.selector||``)}loadModelPricingOverrideFormSelector(e){e=String(e||``).trim();let t=this.findModelPricingOverrideView(e);this.modelPricingOverrideFormHasExistingOverride=!!t,this.modelPricingOverrideRows=kk(t,()=>this.nextModelPricingOverrideRowID()),this.modelPricingOverrideFormPreservedTiers=t&&t.pricing&&Array.isArray(t.pricing.tiers)?gk(t.pricing.tiers):[],this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow();let n=this.modelPricingOverrideFormRow,r=n?Ok(n,this.modelPricingOverrideViews,e):{pricing:{},sources:{}};this.modelPricingOverrideFormBasePricing=r.pricing,this.modelPricingOverrideFormBasePricingSources=r.sources}setModelPricingOverrideScope(e){this.modelPricingOverrideFormScope=e;let t=this.modelPricingOverrideFormScopeOptions.find(t=>t.value===e);t&&(this.modelPricingOverrideForm.selector=t.selector,this.loadModelPricingOverrideFormSelector(t.selector))}nextModelPricingOverrideRowID(){return this._modelPricingOverrideRowID=(this._modelPricingOverrideRowID||0)+1,`pricing-row-`+this._modelPricingOverrideRowID}availablePricingFieldOptions(e){return jk(this.modelPricingOverrideRows,e)}addModelPricingOverrideRow(){let e=Ak(this.modelPricingOverrideRows),t=mk.find(t=>!e.has(t.value))||mk[0];t&&this.modelPricingOverrideRows.push({id:this.nextModelPricingOverrideRowID(),field:t.value,value:``})}removeModelPricingOverrideRow(e){this.modelPricingOverrideRows=this.modelPricingOverrideRows.filter(t=>t.id!==e.id),this.modelPricingOverrideRows.length===0&&this.modelPricingOverrideFormPreservedTiers.length===0&&this.addModelPricingOverrideRow()}modelPricingOverridePayload(){return Mk(this.modelPricingOverrideRows,this.modelPricingOverrideFormPreservedTiers)}modelPricingOverrideDraftPricing(){let e=this.modelPricingOverridePayload();return e&&e.pricing?e.pricing:{}}modelPricingEffectivePreviewRows(){return Nk(this.modelPricingOverrideFormBasePricing,this.modelPricingOverrideFormBasePricingSources,this.modelPricingOverrideDraftPricing())}closeModelPricingOverrideForm(){this.modelPricingOverrideFormOpen=!1,this.modelPricingOverrideSubmitting=!1,this.modelPricingOverrideError=``,this.modelPricingOverrideFormHasExistingOverride=!1,this.modelPricingOverrideFormDisplayName=``,this.modelPricingOverrideFormScope=``,this.modelPricingOverrideFormScopeOptions=[],this.modelPricingOverrideFormRow=null,this.modelPricingOverrideFormBasePricing=null,this.modelPricingOverrideFormBasePricingSources=null,this.modelPricingOverrideFormPreservedTiers=[],this.modelPricingOverrideRows=[],this.modelPricingOverrideForm={selector:``}}async submitModelPricingOverrideForm(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!e){this.modelPricingOverrideError=`Model pricing selector is required.`;return}let t=this.modelPricingOverridePayload();if(t.error){this.modelPricingOverrideError=t.error;return}let n={selector:e,...t};this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let e=await Ts(`/admin/model-pricing-overrides`,`PUT`,n,{label:`model pricing override`});if(e.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(e.stale)return;if(!e.ok){this.modelPricingOverrideError=e.status===401?`Authentication required.`:bs(e,`Failed to save model pricing.`);return}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing saved.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to save model pricing override:`,e),this.modelPricingOverrideError=`Failed to save model pricing.`}finally{this.modelPricingOverrideSubmitting=!1}}async deleteModelPricingOverride(){let e=String(this.modelPricingOverrideForm.selector||``).trim();if(!(!e||!this.modelPricingOverrideFormHasExistingOverride)&&window.confirm(`Remove the model pricing override for "`+e+`"?`)){this.modelPricingOverrideSubmitting=!0,this.modelPricingOverrideError=``;try{let t=await Ts(`/admin/model-pricing-overrides`,`DELETE`,{selector:e},{label:`model pricing override`});if(t.status===503){this.modelPricingOverridesAvailable=!1,this.modelPricingOverrideError=`Model pricing overrides feature is unavailable.`;return}if(t.status!==404){if(t.stale)return;if(!t.ok){this.modelPricingOverrideError=t.status===401?`Authentication required.`:bs(t,`Failed to remove model pricing override.`);return}}this.modelPricingOverridesAvailable=!0,this.closeModelPricingOverrideForm(),lc.success(`Model pricing override removed.`),this.fetchModelPricingOverrides()}catch(e){console.error(`Failed to delete model pricing override:`,e),this.modelPricingOverrideError=`Failed to remove model pricing override.`}finally{this.modelPricingOverrideSubmitting=!1}}}},Fk=B(``);function Ik(e,t){O(t,!0);var n=Fk();let r;var i=I(P(n),2),a=P(i,!0);D(i),D(n),L((e,i,o)=>{r=G(n,1,`alias-toggle`,null,r,e),n.disabled=pk.rowTogglingKey===t.row.key||!pk.virtualModelsAvailable,K(n,`aria-label`,i),H(a,o)},[()=>({enabled:pk.rowToggleEnabled(t.row),restricted:pk.rowToggleRestricted(t.row)}),()=>pk.rowToggleAriaLabel(t.row),()=>pk.rowToggleLabel(t.row)]),z(`click`,n,()=>pk.toggleRowEnabled(t.row)),V(e,n),k()}Br([`click`]);var Lk=B(`
            `);function Rk(e,t){O(t,!0);var n=Lk(),r=P(n),i=e=>{Ik(e,{get row(){return pk.globalScopeRow}})};U(r,e=>{pk.virtualModelsAvailable&&e(i)});var a=I(r,2),o=e=>{{let t=A(()=>Pk.modelPricingButtonLabel(`global model pricing`,Pk.hasGlobalPricingOverride())),n=A(()=>Pk.modelPricingButtonClass(Pk.hasGlobalPricingOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>Pk.openGlobalPricingOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(a,e=>{Pk.modelPricingOverridesAvailable&&e(o)});var s=I(a,2),c=e=>{{let t=A(()=>QO(`global model access`,pk.hasGlobalModelOverride())),n=A(()=>ZO(pk.hasGlobalModelOverride()));OT(e,{get label(){return R(t)},get class(){return`table-icon-btn ${R(n)??``}`},onclick:()=>pk.openGlobalModelOverrideEdit(),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n),k()}function zk(e){return String(e&&(e.primary_model||e.source)||``).trim()}function Bk(e){return Array.isArray(e&&e.fallback_models)?e.fallback_models:Array.isArray(e&&e.targets)?e.targets:[]}function Vk(e){return Array.isArray(e)?e.map(e=>({...e,source:zk(e),targets:Bk(e)})):[]}function Hk(e){let t=Bk(e);return t.length===0?`-`:t.join(`, `)}function Uk(e){return e&&e.enabled===!1?`Off`:e&&e.managed?`Config`:`On`}function Wk(e,t){let n=String(t||``).trim();return n&&(Array.isArray(e)?e:[]).find(e=>zk(e)===n)||null}function Gk(e,t){if(!t||t.is_alias)return!1;let n=Wk(e,pO(t));return!!(n&&n.enabled!==!1&&Bk(n).length>0)}function Kk(e,t){return Gk(e,t)?`table-action-btn-failover-active`:``}function qk(e,t){let n=`Edit failover for `+(t&&t.display_name?t.display_name:`model`);return Gk(e,t)?n+` (active)`:n}function Jk(e){let t=[e&&e.target_model];return(Array.isArray(e&&e.targets)?e.targets:[]).forEach(e=>t.push(e&&e.model)),t.map(e=>String(e||``).trim()).filter(Boolean)}function Yk(e){let t=Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(Boolean):[];return{target_model:t[0]||``,targets:t.slice(1).map(e=>({model:e}))}}function Xk(e){return{primary_model:String(e&&e.source||``).trim(),fallback_models:Jk(e),enabled:!(e&&e.enabled===!1)}}function Zk(e){return zk(e)}function Qk(e){let t={};return(Array.isArray(e)?e:[]).forEach(e=>{let n=Zk(e);n&&(t[n]=!0)}),t}function $k(e,t){let n=Zk(t);return!!(n&&e&&e[n])}function eA(e,t){return(Array.isArray(e)?e:[]).filter(e=>$k(t,e))}function tA(e,t){let n=Array.isArray(e)?e:[];return n.length>0&&eA(n,t).length===n.length}function nA(e){return[zk(e),Bk(e).join(` `)].join(` `).toLowerCase()}function rA(e,t){let n=Array.isArray(e)?e:[],r=String(t||``).trim().toLowerCase();return r?n.filter(e=>nA(e).includes(r)):n}function iA(e){return{primary_model:zk(e),fallback_models:Bk(e).map(e=>String(e||``).trim()).filter(Boolean),enabled:!!(e&&e.enabled!==!1)}}function aA(){return{source:``,target_model:``,targets:[],enabled:!0}}var Q=new class{#e=j(!0);get failoverAvailable(){return R(this.#e)}set failoverAvailable(e){M(this.#e,e,!0)}#t=j(N([]));get failoverRules(){return R(this.#t)}set failoverRules(e){M(this.#t,e,!0)}#n=j(!1);get failoverLoading(){return R(this.#n)}set failoverLoading(e){M(this.#n,e,!0)}#r=j(!1);get failoverSaving(){return R(this.#r)}set failoverSaving(e){M(this.#r,e,!0)}#i=j(!1);get failoverGenerating(){return R(this.#i)}set failoverGenerating(e){M(this.#i,e,!0)}#a=j(``);get failoverError(){return R(this.#a)}set failoverError(e){M(this.#a,e,!0)}#o=j(N([]));get failoverGeneratedRules(){return R(this.#o)}set failoverGeneratedRules(e){M(this.#o,e,!0)}#s=j(!1);get failoverDraftsOpen(){return R(this.#s)}set failoverDraftsOpen(e){M(this.#s,e,!0)}#c=j(N({}));get failoverDraftSelections(){return R(this.#c)}set failoverDraftSelections(e){M(this.#c,e,!0)}#l=j(``);get failoverDraftFilter(){return R(this.#l)}set failoverDraftFilter(e){M(this.#l,e,!0)}#u=j(!1);get failoverDraftSaving(){return R(this.#u)}set failoverDraftSaving(e){M(this.#u,e,!0)}#d=j(!1);get failoverFormOpen(){return R(this.#d)}set failoverFormOpen(e){M(this.#d,e,!0)}#f=j(`create`);get failoverFormMode(){return R(this.#f)}set failoverFormMode(e){M(this.#f,e,!0)}#p=j(!1);get failoverFormManaged(){return R(this.#p)}set failoverFormManaged(e){M(this.#p,e,!0)}#m=j(N(aA()));get failoverForm(){return R(this.#m)}set failoverForm(e){M(this.#m,e,!0)}failoverEnabled(){return ks.booleanFlag(`FAILOVER_ENABLED`,!0)}async fetchFailoverRules(){if(!this.failoverEnabled()){this.failoverAvailable=!1,this.failoverRules=[],this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,this.failoverError=``,this.failoverLoading=!1;return}this.failoverLoading=!0,this.failoverError=``;try{let e=await ws(`/admin/failover`,{label:`failover mappings`});if(e.status===503){this.failoverAvailable=!1,this.failoverRules=[];return}if(e.stale)return;if(this.failoverAvailable=!0,!e.ok){this.failoverRules=[];return}this.failoverRules=Vk(e.data)}catch(e){console.error(`Failed to fetch failover mappings:`,e),this.failoverRules=[],this.failoverError=`Unable to load failover mappings.`}finally{this.failoverLoading=!1}}resetFailoverForm(){this.failoverFormMode=`create`,this.failoverFormManaged=!1,this.failoverForm=aA()}openFailoverCreate(){this.resetFailoverForm(),this.failoverFormOpen=!0,this.focusFailoverEditor()}openFailoverEdit(e){if(!e)return;this.resetFailoverForm(),this.failoverFormMode=`edit`,this.failoverFormOpen=!0,this.failoverFormManaged=!!e.managed;let t=this.failoverPrimaryModel(e),n=this.failoverTargets(e);this.failoverForm={source:t,target_model:n[0]||``,targets:n.slice(1).map(e=>({model:e})),enabled:e.enabled!==!1},this.focusFailoverEditor()}openFailoverForModel(e){if(!e||e.is_alias)return;let t=this.qualifiedModelName(e),n=this.failoverRules.find(e=>this.failoverPrimaryModel(e)===t);if(n){this.openFailoverEdit(n);return}this.resetFailoverForm(),this.failoverFormMode=`create`,this.failoverFormOpen=!0,this.failoverForm.source=t,this.focusFailoverEditor()}closeFailoverForm(){this.failoverFormOpen=!1}closeFailoverDraftsModal(){this.failoverDraftSaving||(this.failoverDraftsOpen=!1)}failoverFormTargets(){return Jk(this.failoverForm)}setFailoverFormTargets(e){let t=Yk(e);this.failoverForm.target_model=t.target_model,this.failoverForm.targets=t.targets}addFailoverTarget(){Array.isArray(this.failoverForm.targets)||(this.failoverForm.targets=[]),this.failoverForm.targets.push({model:``}),this.focusFailoverEditor()}removeFailoverTarget(e){if(!Array.isArray(this.failoverForm.targets)){this.failoverForm.targets=[];return}this.failoverForm.targets.splice(e,1)}removePrimaryFailoverTarget(){let e=Array.isArray(this.failoverForm.targets)?this.failoverForm.targets:[];if(e.length>0){let t=e.shift();this.failoverForm.target_model=t&&t.model?t.model:``,this.failoverForm.targets=e;return}this.failoverForm.target_model=``}failoverRulePayload(){return Xk(this.failoverForm)}async submitFailoverForm(){if(this.failoverSaving||this.failoverGenerating||this.failoverFormManaged)return;let e=this.failoverRulePayload();if(!e.primary_model){this.failoverError=`Primary model is required.`;return}if(e.enabled&&e.fallback_models.length===0){this.failoverError=`Add at least one failover target.`;return}this.failoverSaving=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to save failover mapping.`;return}lc.success(`Failover mapping saved.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to save failover mapping:`,e),this.failoverError=`Failed to save failover mapping.`}finally{this.failoverSaving=!1}}async deleteFailoverRule(e){let t=String(e&&this.failoverPrimaryModel(e)||this.failoverForm.source||``).trim();if(!(!t||this.failoverSaving||this.failoverGenerating)&&confirm(`Remove failover mapping for "`+t+`"?`)){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover`,`DELETE`,{primary_model:t},{label:`failover mapping`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mapping.`;return}lc.success(`Failover mapping removed.`),this.closeFailoverForm(),this.fetchFailoverRules()}catch(e){console.error(`Failed to remove failover mapping:`,e),this.failoverError=`Failed to remove failover mapping.`}finally{this.failoverSaving=!1}}}async generateFailoverForForm(){if(this.failoverGenerating||this.failoverSaving||this.failoverFormManaged)return;let e=String(this.failoverForm.source||``).trim();if(!e){this.failoverError=`Primary model is required.`;return}this.failoverGenerating=!0,this.failoverError=``;try{let t=await Ts(`/admin/failover/generate`,`POST`,{primary_model:e},{label:`failover generation`});if(t.stale)return;if(!t.ok){this.failoverError=`Failed to generate failover mapping.`;return}let n=Vk(t.data),r=n.find(t=>this.failoverPrimaryModel(t)===e)||n[0]||null,i=this.failoverTargets(r);if(i.length===0){this.failoverError=`No failover suggestions were generated for this model.`;return}this.setFailoverFormTargets(i),lc.success(`Generated `+i.length+` fallback model`+(i.length===1?`.`:`s.`)),this.focusFailoverEditor()}catch(e){console.error(`Failed to generate failover mapping:`,e),this.failoverError=`Failed to generate failover mapping.`}finally{this.failoverGenerating=!1}}openFailoverResetDialog(){Js.open({title:`Remove failover models`,titleId:`failoverResetDialogTitle`,inputId:`failover-reset-confirmation`,message:`Remove every dashboard-managed failover mapping. Configuration-managed mappings remain active.`,requiredText:`remove`,confirmLabel:`Remove Failover`,icon:Ao,dialogClass:`budget-reset-dialog`,onConfirm:async()=>{await this.resetFailoverRules(),this.failoverError&&(Js.error=this.failoverError)}})}async resetFailoverRules(){if(!this.failoverSaving){this.failoverSaving=!0,this.failoverError=``;try{let e=await Ts(`/admin/failover/reset`,`POST`,void 0,{label:`failover removal`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to remove failover mappings.`;return}this.failoverRules=Vk(e.data),this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!1,lc.success(`Dashboard-managed failover mappings removed.`),Js.close()}catch(e){console.error(`Failed to remove failover mappings:`,e),this.failoverError=`Failed to remove failover mappings.`}finally{this.failoverSaving=!1}}}async generateFailoverRules(){if(!(this.failoverGenerating||this.failoverDraftSaving)){this.failoverGenerating=!0,this.failoverError=``,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.failoverDraftsOpen=!0;try{let e=await Ts(`/admin/failover/generate`,`POST`,void 0,{label:`failover generation`});if(e.stale)return;if(!e.ok){this.failoverError=`Failed to generate failover mappings.`;return}this.failoverGeneratedRules=Vk(e.data),this.selectAllFailoverDrafts(this.failoverGeneratedRules)}catch(e){console.error(`Failed to generate failover mappings:`,e),this.failoverError=`Failed to generate failover mappings.`}finally{this.failoverGenerating=!1}}}failoverDraftKey(e){return Zk(e)}selectAllFailoverDrafts(e){this.failoverDraftSelections=Qk(e)}failoverDraftSelected(e){return $k(this.failoverDraftSelections,e)}setFailoverDraftSelected(e,t){let n=this.failoverDraftKey(e);n&&(this.failoverDraftSelections={...this.failoverDraftSelections,[n]:!!t})}selectedFailoverDrafts(){return eA(this.failoverGeneratedRules,this.failoverDraftSelections)}selectedFailoverDraftCount(){return this.selectedFailoverDrafts().length}failoverDraftCountLabel(){return this.selectedFailoverDraftCount()+` / `+this.failoverGeneratedRules.length+` selected`}allFailoverDraftsSelected(){return tA(this.failoverGeneratedRules,this.failoverDraftSelections)}toggleAllFailoverDrafts(){if(!(this.failoverDraftSaving||this.failoverGenerating||this.failoverGeneratedRules.length===0)){if(this.allFailoverDraftsSelected()){this.failoverDraftSelections={};return}this.selectAllFailoverDrafts(this.failoverGeneratedRules)}}failoverDraftSearchText(e){return nA(e)}filteredFailoverDrafts(){return rA(this.failoverGeneratedRules,this.failoverDraftFilter)}failoverDraftPayload(e){return iA(e)}async saveSelectedFailoverDrafts(){if(this.failoverDraftSaving||this.failoverGenerating)return;let e=this.selectedFailoverDrafts();if(e.length===0){this.failoverError=`Select at least one failover draft.`;return}this.failoverDraftSaving=!0,this.failoverError=``;try{for(let t of e){let e=this.failoverDraftPayload(t);if(!e.primary_model||e.fallback_models.length===0){this.failoverError=`Generated failover draft is missing model data.`;return}let n=await Ts(`/admin/failover`,`PUT`,e,{label:`failover mapping`});if(n.stale)return;if(!n.ok){this.failoverError=`Failed to save failover mapping.`;return}}lc.success(`Saved `+e.length+` failover mapping`+(e.length===1?`.`:`s.`)),this.failoverDraftsOpen=!1,this.failoverGeneratedRules=[],this.failoverDraftSelections={},this.failoverDraftFilter=``,this.fetchFailoverRules()}catch(e){console.error(`Failed to save generated failover mappings:`,e),this.failoverError=`Failed to save failover mappings.`}finally{this.failoverDraftSaving=!1}}focusFailoverEditor(){setTimeout(()=>{let e=document.querySelector(`[data-failover-editor]`),t=e&&e.querySelector?e.querySelector(`[data-modal-autofocus], input:not([disabled]), textarea:not([disabled]), button:not([disabled])`):null;t&&typeof t.focus==`function`&&t.focus({preventScroll:!0})},0)}failoverTargetLabel(e){return Hk(e)}failoverPrimaryModel(e){return zk(e)}failoverTargets(e){return Bk(e)}findFailoverMapping(e){return Wk(this.failoverRules,e)}hasActiveFailoverMapping(e){return Gk(this.failoverRules,e)}failoverButtonClass(e){return Kk(this.failoverRules,e)}failoverButtonLabel(e){return qk(this.failoverRules,e)}normalizeFailoverRules(e){return Vk(e)}failoverRuleStatus(e){return Uk(e)}qualifiedModelName(e){return pO(e)}},oA=B(``),sA=B(``),cA=B(`Config`),lA=B(`
            Targets
            `),uA=B(``),dA=B(`
            Redirects to
            `),fA=B(`
            Slowdown
            `),pA=B(` `),mA=B(`
            `),hA=B(`
            `),gA=B(`
            `);function _A(e,t){O(t,!0);let n=A(()=>Pk.modelRowPricing(t.row)),r=A(()=>t.row.is_alias?t.row.alias&&t.row.alias.slowdown:t.row.masking_alias&&t.row.masking_alias.slowdown!=null?t.row.masking_alias.slowdown:t.row.access&&t.row.access.override&&t.row.access.override.slowdown),i=A(()=>Number(R(r)==null?0:R(r)));var a=gA(),o=P(a),s=P(o),c=P(s),l=P(c),u=P(l,!0);D(l);var d=I(l,2),f=e=>{V(e,oA())};U(d,e=>{t.row.is_alias&&e(f)});var p=I(d,2),m=e=>{V(e,sA())};U(p,e=>{!t.row.is_alias&&t.row.masking_alias&&e(m)});var h=I(p,2),g=e=>{V(e,cA())},_=A(()=>YO(t.row));U(h,e=>{R(_)&&e(g)}),D(c);var v=I(c,2),y=e=>{var n=lA(),r=I(P(n)),i=P(r,!0);D(r),D(n),L(()=>H(i,t.row.secondary_name)),V(e,n)};U(v,e=>{t.row.is_alias&&e(y)});var b=I(v,2),x=e=>{var n=dA(),r=I(P(n)),i=P(r,!0);D(r);var a=I(r,2),o=e=>{var n=uA();L(e=>{K(n,`aria-label`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),K(n,`title`,pk.rowDeletingKey===t.row.key?`Removing redirect for `+t.row.display_name:`Remove redirect for `+t.row.display_name),n.disabled=e},[()=>!!pk.rowDeletingKey]),z(`click`,n,()=>pk.removeRedirectRow(t.row)),V(e,n)},s=A(()=>pk.virtualModelsAvailable&&qO(t.row));U(a,e=>{R(s)&&e(o)}),D(n),L(e=>H(i,e),[()=>EO(t.row.masking_alias)]),V(e,n)};U(b,e=>{!t.row.is_alias&&t.row.masking_alias&&e(x)});var S=I(b,2),C=e=>{var t=fA(),n=I(P(t)),r=P(n);D(n),D(t),L(()=>H(r,`+${R(i)??``}× inference time`)),V(e,t)};U(S,e=>{R(i)>0&&e(C)}),D(s),D(o);var w=I(o);W(w,17,()=>t.columns,ii,(e,r)=>{var i=pA(),a=P(i,!0);D(i),L(e=>{G(i,1,Ni(R(r).class),`svelte-1iynym`),H(a,e)},[()=>R(r).value(t.row,R(n))]),V(e,i)});var T=I(w),E=P(T),ee=e=>{var n=mA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>pk.rowDeletingKey===t.row.key?`Removing alias `+t.row.alias.name:`Remove alias `+t.row.alias.name),r=A(()=>!!pk.rowDeletingKey);OT(e,{get label(){return R(n)},class:`table-action-btn-danger table-icon-btn`,onclick:()=>pk.removeAliasRow(t.row),get disabled(){return R(r)},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})}},o=A(()=>pk.virtualModelsAvailable&&KO(t.row));U(i,e=>{R(o)&&e(a)});var s=I(i,2),c=e=>{{let n=A(()=>`Edit alias `+t.row.alias.name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(s,e=>{pk.virtualModelsAvailable&&e(c)}),D(n),V(e,n)},te=e=>{var n=hA(),r=P(n);Ik(r,{get row(){return t.row}});var i=I(r,2),a=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`model pricing for `+t.row.display_name,Pk.hasModelPricingOverride(t.row))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasModelPricingOverride(t.row)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openModelPricingOverrideEdit(t.row),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(i,e=>{Pk.modelPricingOverridesAvailable&&e(a)});var o=I(i,2),s=e=>{{let n=A(()=>Q.failoverButtonLabel(t.row)),r=A(()=>Q.failoverButtonClass(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Q.openFailoverForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Eo},class:`table-icon-svg`})},$$slots:{default:!0}})}},c=A(()=>Q.failoverAvailable&&Q.failoverEnabled());U(o,e=>{R(c)&&e(s)});var l=I(o,2),u=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(t.row.display_name,Z.rateLimitGaugeClassForModel(t.row))),r=A(()=>Z.rateLimitGaugeClassForModel(t.row));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForModel(t.row),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},d=A(()=>Z.rateLimitsEnabled()&&Z.rateLimitInspectorModelID(t.row));U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{{let n=A(()=>`Edit redirect for `+t.row.display_name);OT(e,{get label(){return R(n)},class:`table-icon-btn table-action-btn-active`,onclick:()=>pk.openVirtualModelEditAlias(t.row.masking_alias),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(f,e=>{pk.virtualModelsAvailable&&t.row.masking_alias&&t.row.masking_alias.name&&e(p)});var m=I(f,2),h=e=>{{let n=A(()=>QO(`model settings for `+t.row.display_name,XO(t.row.access))),r=A(()=>ZO(XO(t.row.access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openVirtualModelEditModel(t.row),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(m,e=>{pk.virtualModelsAvailable&&!t.row.masking_alias&&e(h)}),D(n),V(e,n)};U(E,e=>{t.row.is_alias?e(ee):e(te,-1)}),D(T),D(a),L((e,n)=>{K(a,`id`,e),G(a,1,n,`svelte-1iynym`),H(u,t.row.display_name)},[()=>JO(t.row)||void 0,()=>Ni(GO(t.row))]),V(e,a),k()}Br([`click`]);var vA={headerLines:[`Modes`],value:e=>(e.model?.metadata?.modes??[]).join(`, `)||`-`};function yA(e,t){return{headerLines:e,class:`col-price`,value:t}}var bA=yA([`Input / Output ($/MTok)`],(e,t)=>yc(t?.input_per_mtok)+` / `+yc(t?.output_per_mtok)),xA={all:[bA],text_generation:[vA,bA,yA([`Cached $/MTok`],(e,t)=>yc(t?.cached_input_per_mtok))],embedding:[yA([`Input`,`$/MTok`],(e,t)=>yc(t?.input_per_mtok))],image:[yA([`$/Image`],(e,t)=>bc(t?.per_image))],audio:[yA([`$/Second`],(e,t)=>bc(t?.per_second_input)),yA([`$/Character`],(e,t)=>bc(t?.per_character_input))],video:[yA([`$/Second (In)`],(e,t)=>bc(t?.per_second_input)),yA([`$/Second (Out)`],(e,t)=>bc(t?.per_second_output))],utility:[yA([`$/Page`],(e,t)=>bc(t?.per_page)),yA([`$/Request`],(e,t)=>bc(t?.per_request))]};function SA(e){return xA[e]||xA.all}function CA(e){return SA(e).length+2}var wA=B(`
            `),TA=B(` `,1),EA=B(``),DA=B(` `),OA=B(` `),kA=B(`
            `),AA=B(`
            `),jA=B(`
            Model
            `);function MA(e,t){O(t,!0);let n=A(()=>Wc.activeCategory||`all`),r=A(()=>SA(R(n))),i=A(()=>CA(R(n)));var a=jA(),o=P(a),s=P(o),c=P(s),l=I(P(c));W(l,17,()=>R(r),ii,(e,t)=>{var n=EA();W(n,21,()=>R(t).headerLines,ii,(e,t,n)=>{var r=TA(),i=F(r),a=e=>{V(e,wA())};U(i,e=>{n>0&&e(a)});var o=I(i,1,!0);L(()=>H(o,R(t))),V(e,r)}),D(n),L(()=>G(n,1,Ni(R(t).class),`svelte-1911hy6`)),V(e,n)});var u=I(l);Rk(P(u),{}),D(u),D(c),D(s),W(I(s),17,()=>pk.filteredDisplayModelGroups,e=>e.key,(e,t)=>{var n=AA(),a=P(n),o=P(a),s=P(o),c=P(s),l=P(c),u=P(l),d=P(u,!0);D(u);var f=I(u,2),p=e=>{var n=DA(),r=P(n,!0);D(n),L(()=>H(r,`(`+R(t).type_label+`)`)),V(e,n)};U(f,e=>{R(t).type_label&&e(p)});var m=I(f,2),h=e=>{var n=OA(),r=P(n,!0);D(n),L(()=>H(r,R(t).item_count_label)),V(e,n)};U(m,e=>{R(t).item_count_label&&e(h)}),D(l);var g=I(l,2),_=e=>{var n=kA(),r=P(n,!0);D(n),L(()=>H(r,R(t).access_summary)),V(e,n)};U(g,e=>{R(t).access_summary&&e(_)}),D(c);var v=I(c,2),y=P(v),b=e=>{Ik(e,{get row(){return R(t)}})};U(y,e=>{R(t).access.selector&&e(b)});var x=I(y,2),S=e=>{{let n=A(()=>Pk.modelPricingButtonLabel(`provider pricing for `+R(t).display_name,Pk.hasProviderPricingOverride(R(t)))),r=A(()=>Pk.modelPricingButtonClass(Pk.hasProviderPricingOverride(R(t))));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Pk.openProviderPricingOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return Ka},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(x,e=>{Pk.modelPricingOverridesAvailable&&R(t).provider_name&&e(S)});var C=I(x,2),w=e=>{{let n=A(()=>Z.rateLimitGaugeTitle(`provider `+R(t).display_name,Z.rateLimitGaugeClassForProvider(R(t)))),r=A(()=>Z.rateLimitGaugeClassForProvider(R(t)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>Z.openRateLimitInspectorForProvider(R(t)),children:(e,t)=>{J(e,{get icon(){return Qa},class:`table-icon-svg`})},$$slots:{default:!0}})}},T=A(()=>Z.rateLimitsEnabled()&&R(t).provider_name);U(C,e=>{R(T)&&e(w)});var E=I(C,2),ee=e=>{{let n=A(()=>QO(`provider access for `+R(t).display_name,XO(R(t).access))),r=A(()=>ZO(XO(R(t).access)));OT(e,{get label(){return R(n)},get class(){return`table-icon-btn ${R(r)??``}`},onclick:()=>pk.openProviderOverrideEdit(R(t)),children:(e,t)=>{J(e,{get icon(){return uo},class:`table-icon-svg`})},$$slots:{default:!0}})}};U(E,e=>{pk.virtualModelsAvailable&&R(t).access.selector&&e(ee)}),D(v),D(s),D(o),D(a),W(I(a),17,()=>R(t).rows,e=>e.key,(e,t)=>{_A(e,{get row(){return R(t)},get columns(){return R(r)}})}),D(n),L(()=>{K(o,`colspan`,R(i)),H(d,R(t).display_name)}),V(e,n)}),D(o),D(a),V(e,a),k()}var NA=B(``);function PA(e,t){let n=q(t,`enabled`,3,!1),r=q(t,`label`,3,``),i=q(t,`disabled`,3,!1),a=q(t,`restricted`,3,!1);var o=NA();let s;var c=I(P(o),2),l=P(c,!0);D(c),D(o),L(()=>{s=G(o,1,`alias-toggle`,null,s,{enabled:n(),restricted:a()}),o.disabled=i(),K(o,`aria-label`,(n()?`Disable `:`Enable `)+r()),H(l,t.text??(n()?`Enabled`:`Disabled`))}),z(`click`,o,function(...e){t.onclick?.apply(this,e)}),V(e,o)}Br([`click`]);var FA=B(``),IA=B(`
            `);function LA(e,t){O(t,!0);let n=q(t,`model`,15,``),r=q(t,`weight`,15),i=q(t,`id`,3,void 0),a=q(t,`placeholder`,3,`openai/gpt-4o`),o=q(t,`showRemove`,3,!0);var s=IA(),c=P(s);ea(c);var l=I(c,2),u=e=>{var t=FA();ea(t),L(()=>t.disabled=pk.vmFormManaged),la(t,r),V(e,t)},d=A(()=>pk.vmFormShowWeights());U(l,e=>{R(d)&&e(u)});var f=I(l,2),p=e=>{OT(e,{label:`Remove target`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,get onclick(){return t.onremove},get disabled(){return pk.vmFormManaged},children:(e,t)=>{J(e,{get icon(){return Ao},class:`table-icon-svg`})},$$slots:{default:!0}})};U(f,e=>{o()&&e(p)}),D(s),L(()=>{K(c,`id`,i()),K(c,`placeholder`,a()),c.disabled=pk.vmFormManaged}),la(c,n),V(e,s),k()}var RA=B(`

            `),zA=B(`adaptive lets the registered routing extension pick the target per request.`,1),BA=B(`Add one target to make this a redirect/alias, or two or more to load balance across them, then pick a strategy: round_robin rotates across targets (weight biases the share) and cost always routes to the cheapest available target. Leave Targets empty to make it only an access policy on the Source selector. The selector uses / for all providers and models, for one provider, or for one model. user_paths is matched against the effective request user_path: the managed API key user_path when present, otherwise the configured user path request header.`,1),VA=B(``),HA=B(`

            This virtual model is defined in configuration (config.yaml / VIRTUAL_MODELS) and is read-only here. Edit your configuration to change it.

            `),UA=B(``),WA=B(``),GA=B(``),KA=B(`
            `,1),qA=B(``),JA=B(`Use / to allow every user path. Use a team path to restrict to that - subtree, or an unused path to make the selector unavailable.`,1),YA=B(``),XA=B(` Adds a fraction of measured inference time: 0.5 adds 50%. Streaming chunks are buffered - and released on the slowed timeline. Leave empty to disable; accepted values are 0.1–10.`,1),ZA=B(` `),QA=B(`
            Targets
            `,1);function $A(e,t){O(t,!0);let n=pk;On(()=>{n.vmFormOpen&&ks.ensureLoaded()});{let t=e=>{iC(e,{copyId:`virtual-model-help-copy`,label:`virtual model help`,get open(){return n.vmFormHelpOpen},set open(e){n.vmFormHelpOpen=e},title:e=>{var t=RA(),r=P(t,!0);D(t),L(()=>H(r,n.vmFormDisplayName||n.vmForm.source||`Virtual model`)),V(e,t)},help:e=>{Ve();var t=BA(),n=I(F(t),7),r=e=>{var t=zA();Ve(),V(e,t)},i=A(()=>ks.virtualModelStrategies().includes(`adaptive`));U(n,e=>{R(i)&&e(r)});var a=I(n,8);a.textContent=`{provider_name}/`;var o=I(a,2);o.textContent=`{provider_name}/{model}`,Ve(7),V(e,t)},$$slots:{title:!0,help:!0}})},r=e=>{var t=Xr(),r=F(t),i=e=>{var t=VA();L(()=>t.disabled=n.vmDeleting||n.vmSubmitting),z(`click`,t,()=>n.deleteVirtualModel()),V(e,t)};U(r,e=>{n.vmFormHasExisting&&!n.vmFormManaged&&e(i)}),V(e,t)},i=A(()=>n.vmDeleting||n.vmFormManaged),a=A(()=>n.vmFormMode===`edit`?`Save`:`Create`),o=A(()=>n.vmFormMode===`edit`?_o:po);ME(e,{get open(){return n.vmFormOpen},ariaLabel:`Virtual model editor`,get error(){return n.vmFormError},get submitting(){return n.vmSubmitting},get submitDisabled(){return R(i)},get submitLabel(){return R(a)},get submitIcon(){return R(o)},onclose:()=>n.closeVirtualModelForm(),onsubmit:()=>n.submitVirtualModelForm(),header:t,extraActions:r,children:(e,t)=>{var r=QA(),i=F(r),a=e=>{V(e,HA())};U(i,e=>{n.vmFormManaged&&e(a)});var o=I(i,2);PE(o,{id:`virtual-model-source`,label:`Source`,children:(e,t)=>{var r=UA();ea(r),L(()=>r.disabled=n.vmFormSourceLocked||n.vmFormManaged),la(r,()=>n.vmForm.source,e=>n.vmForm.source=e),V(e,r)},$$slots:{default:!0}});var s=I(o,2);W(s,21,()=>Wc.models,e=>pO(e),(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(R(t)),()=>pO(R(t))]),V(e,n)}),D(s);var c=I(s,2),l=I(P(c),2);{let e=A(()=>n.vmFormHasPrimaryTarget());LA(l,{id:`virtual-model-target`,get showRemove(){return R(e)},onremove:()=>n.removePrimaryTarget(),get model(){return n.vmForm.target_model},set model(e){n.vmForm.target_model=e},get weight(){return n.vmForm.target_weight},set weight(e){n.vmForm.target_weight=e}})}var u=I(l,2);W(u,17,()=>n.vmForm.targets,ii,(e,t,r)=>{LA(e,{placeholder:`groq/llama`,onremove:()=>n.removeVmTarget(r),get model(){return R(t).model},set model(e){R(t).model=e},get weight(){return R(t).weight},set weight(e){R(t).weight=e}})});var d=I(u,2),f=P(d);J(P(f),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(f),D(d),D(c);var p=I(c,2),m=e=>{var t=KA(),r=F(t);PE(r,{id:`virtual-model-strategy`,label:`Load-balancing strategy`,children:(e,t)=>{var r=GA();W(r,21,()=>n.vmStrategyOptions(),e=>e.value,(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),L(()=>r.disabled=n.vmFormManaged),Ui(r,()=>n.vmForm.strategy,e=>n.vmForm.strategy=e),V(e,r)},$$slots:{default:!0}});var i=I(r,2),a=P(i),o=P(a);ea(o),Ve(2),D(a),D(i),L(()=>o.disabled=n.vmFormManaged),ua(o,()=>n.vmForm.session_affinity,e=>n.vmForm.session_affinity=e),V(e,t)},h=A(()=>n.vmFormShowStrategy());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=P(g);iC(_,{copyId:`virtual-model-user-paths-help`,label:`user paths help`,get open(){return n.vmFormUserPathsHelpOpen},set open(e){n.vmFormUserPathsHelpOpen=e},title:e=>{V(e,qA())},help:e=>{Ve();var t=JA();Ve(2),V(e,t)},$$slots:{title:!0,help:!0}});var v=I(_,2);ut(v),K(v,`placeholder`,`/ + subtree, or an unused path to make the selector unavailable.`,1),YA=B(``),XA=B(` Adds a fraction of measured inference time: 0.5 adds 50%. Streaming chunks are buffered + and released on the slowed timeline. Use 0 to override inherited slowdown, or leave empty + to inherit it; active values are 0.1–10.`,1),ZA=B(` `),QA=B(`
            Targets
            `,1);function $A(e,t){O(t,!0);let n=pk;On(()=>{n.vmFormOpen&&ks.ensureLoaded()});{let t=e=>{iC(e,{copyId:`virtual-model-help-copy`,label:`virtual model help`,get open(){return n.vmFormHelpOpen},set open(e){n.vmFormHelpOpen=e},title:e=>{var t=RA(),r=P(t,!0);D(t),L(()=>H(r,n.vmFormDisplayName||n.vmForm.source||`Virtual model`)),V(e,t)},help:e=>{Ve();var t=BA(),n=I(F(t),7),r=e=>{var t=zA();Ve(),V(e,t)},i=A(()=>ks.virtualModelStrategies().includes(`adaptive`));U(n,e=>{R(i)&&e(r)});var a=I(n,8);a.textContent=`{provider_name}/`;var o=I(a,2);o.textContent=`{provider_name}/{model}`,Ve(7),V(e,t)},$$slots:{title:!0,help:!0}})},r=e=>{var t=Xr(),r=F(t),i=e=>{var t=VA();L(()=>t.disabled=n.vmDeleting||n.vmSubmitting),z(`click`,t,()=>n.deleteVirtualModel()),V(e,t)};U(r,e=>{n.vmFormHasExisting&&!n.vmFormManaged&&e(i)}),V(e,t)},i=A(()=>n.vmDeleting||n.vmFormManaged),a=A(()=>n.vmFormMode===`edit`?`Save`:`Create`),o=A(()=>n.vmFormMode===`edit`?_o:po);ME(e,{get open(){return n.vmFormOpen},ariaLabel:`Virtual model editor`,get error(){return n.vmFormError},get submitting(){return n.vmSubmitting},get submitDisabled(){return R(i)},get submitLabel(){return R(a)},get submitIcon(){return R(o)},onclose:()=>n.closeVirtualModelForm(),onsubmit:()=>n.submitVirtualModelForm(),header:t,extraActions:r,children:(e,t)=>{var r=QA(),i=F(r),a=e=>{V(e,HA())};U(i,e=>{n.vmFormManaged&&e(a)});var o=I(i,2);PE(o,{id:`virtual-model-source`,label:`Source`,children:(e,t)=>{var r=UA();ea(r),L(()=>r.disabled=n.vmFormSourceLocked||n.vmFormManaged),la(r,()=>n.vmForm.source,e=>n.vmForm.source=e),V(e,r)},$$slots:{default:!0}});var s=I(o,2);W(s,21,()=>Wc.models,e=>pO(e),(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>pO(R(t)),()=>pO(R(t))]),V(e,n)}),D(s);var c=I(s,2),l=I(P(c),2);{let e=A(()=>n.vmFormHasPrimaryTarget());LA(l,{id:`virtual-model-target`,get showRemove(){return R(e)},onremove:()=>n.removePrimaryTarget(),get model(){return n.vmForm.target_model},set model(e){n.vmForm.target_model=e},get weight(){return n.vmForm.target_weight},set weight(e){n.vmForm.target_weight=e}})}var u=I(l,2);W(u,17,()=>n.vmForm.targets,ii,(e,t,r)=>{LA(e,{placeholder:`groq/llama`,onremove:()=>n.removeVmTarget(r),get model(){return R(t).model},set model(e){R(t).model=e},get weight(){return R(t).weight},set weight(e){R(t).weight=e}})});var d=I(u,2),f=P(d);J(P(f),{get icon(){return po},class:`form-action-icon`}),Ve(2),D(f),D(d),D(c);var p=I(c,2),m=e=>{var t=KA(),r=F(t);PE(r,{id:`virtual-model-strategy`,label:`Load-balancing strategy`,children:(e,t)=>{var r=GA();W(r,21,()=>n.vmStrategyOptions(),e=>e.value,(e,t)=>{var n=WA(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),L(()=>r.disabled=n.vmFormManaged),Ui(r,()=>n.vmForm.strategy,e=>n.vmForm.strategy=e),V(e,r)},$$slots:{default:!0}});var i=I(r,2),a=P(i),o=P(a);ea(o),Ve(2),D(a),D(i),L(()=>o.disabled=n.vmFormManaged),ua(o,()=>n.vmForm.session_affinity,e=>n.vmForm.session_affinity=e),V(e,t)},h=A(()=>n.vmFormShowStrategy());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=P(g);iC(_,{copyId:`virtual-model-user-paths-help`,label:`user paths help`,get open(){return n.vmFormUserPathsHelpOpen},set open(e){n.vmFormUserPathsHelpOpen=e},title:e=>{V(e,qA())},help:e=>{Ve();var t=JA();Ve(2),V(e,t)},$$slots:{title:!0,help:!0}});var v=I(_,2);ut(v),K(v,`placeholder`,`/ /team/alpha /non-existing`),D(g);var y=I(g,2);PE(y,{id:`virtual-model-description`,label:`Description`,children:(e,t)=>{var r=YA();ut(r),L(()=>r.disabled=n.vmFormManaged),la(r,()=>n.vmForm.description,e=>n.vmForm.description=e),V(e,r)},$$slots:{default:!0}});var b=I(y,2),x=e=>{PE(e,{id:`virtual-model-slowdown`,label:`Slowdown (extra inference time)`,children:(e,t)=>{var r=XA(),i=F(r);ea(i),Ve(2),L(()=>i.disabled=n.vmFormManaged),la(i,()=>n.vmForm.slowdown,e=>n.vmForm.slowdown=e),V(e,r)},$$slots:{default:!0}})},S=A(()=>n.vmFormSupportsSlowdown());U(b,e=>{R(S)&&e(x)});var C=I(b,2),w=P(C),T=e=>{var t=ZA(),r=P(t,!0);D(t),L(()=>H(r,`Default enabled: `+(n.vmFormDefaultEnabled?`yes`:`no`)+` · Effective now: `+(n.vmFormEffectiveEnabled?`yes`:`no`))),V(e,t)};U(w,e=>{n.vmFormMode===`edit`&&e(T)});var E=I(w,2),ee=P(E);{let e=A(()=>n.vmFormToggleRestricted()),t=A(()=>n.vmFormToggleLabel());PA(ee,{get enabled(){return n.vmForm.enabled},get restricted(){return R(e)},label:`virtual model`,get disabled(){return n.vmFormManaged},get text(){return R(t)},onclick:()=>{n.vmFormManaged||(n.vmForm.enabled=!n.vmForm.enabled)}})}D(E),D(C),L(()=>{f.disabled=n.vmFormManaged,v.disabled=n.vmFormManaged}),z(`click`,f,()=>n.addVmTarget()),la(v,()=>n.vmForm.user_paths,e=>n.vmForm.user_paths=e),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var ej=B(`

            Pricing override

            `,1),tj=B(``),nj=B(``),rj=B(``),ij=B(``),aj=B(`
            `),oj=B(`
            Tiered pricing exists for this override and will be preserved. Tier editing can be added without a database migration.
            `),sj=B(`
            No pricing fields set.
            `),cj=B(`
            `),lj=B(`

            Currency is USD. Saved fields override model registry and config.yaml pricing for this diff --git a/internal/admin/dashboard/static/dist/index.html b/internal/admin/dashboard/static/dist/index.html index fea248bed..9df8d21fc 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_virtualmodels.go b/internal/admin/handler_virtualmodels.go index 6be834914..943a4f384 100644 --- a/internal/admin/handler_virtualmodels.go +++ b/internal/admin/handler_virtualmodels.go @@ -27,8 +27,8 @@ type upsertVirtualModelRequest struct { UserPaths []string `json:"user_paths,omitempty"` Description string `json:"description,omitempty"` // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. - Slowdown float64 `json:"slowdown,omitempty"` - Enabled *bool `json:"enabled,omitempty"` + Slowdown *float64 `json:"slowdown,omitempty"` + Enabled *bool `json:"enabled,omitempty"` } // virtualModelTargetRequest is one load-balancing destination. Model may be a diff --git a/internal/admin/handler_virtualmodels_test.go b/internal/admin/handler_virtualmodels_test.go index 42eca8b4b..a029c8115 100644 --- a/internal/admin/handler_virtualmodels_test.go +++ b/internal/admin/handler_virtualmodels_test.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "net/http" "net/http/httptest" "testing" @@ -399,41 +400,45 @@ func TestUpsertPolicyVirtualModelAcceptsEmptyUserPaths(t *testing.T) { } } -func TestUpsertVirtualModelPersistsSlowdown(t *testing.T) { - h := newVMHandler(t) - e := echo.New() - - req := httptest.NewRequest(http.MethodPut, "/admin/virtual-models", bytes.NewBufferString(`{"source":"slow","target_model":"openai/gpt-4o","slowdown":0.5}`)) - req.Header.Set("Content-Type", "application/json") - rec := httptest.NewRecorder() - if err := h.UpsertVirtualModel(e.NewContext(req, rec)); err != nil { - t.Fatalf("UpsertVirtualModel() error = %v", err) - } - if rec.Code != http.StatusOK { - t.Fatalf("status = %d, want 200 body=%s", rec.Code, rec.Body.String()) - } - - var view virtualmodels.View - if err := json.Unmarshal(rec.Body.Bytes(), &view); err != nil { - t.Fatalf("decode response: %v", err) - } - if view.Slowdown != 0.5 { - t.Fatalf("view.Slowdown = %v, want 0.5", view.Slowdown) - } -} - -func TestUpsertVirtualModelRejectsSlowdownOutsideRange(t *testing.T) { - h := newVMHandler(t) - e := echo.New() - - req := httptest.NewRequest(http.MethodPut, "/admin/virtual-models", bytes.NewBufferString(`{"source":"slow","target_model":"openai/gpt-4o","slowdown":10.1}`)) - req.Header.Set("Content-Type", "application/json") - rec := httptest.NewRecorder() - if err := h.UpsertVirtualModel(e.NewContext(req, rec)); err != nil { - t.Fatalf("UpsertVirtualModel() error = %v", err) - } - if rec.Code != http.StatusBadRequest { - t.Fatalf("status = %d, want 400 body=%s", rec.Code, rec.Body.String()) +func TestUpsertVirtualModelValidatesSlowdown(t *testing.T) { + tests := []struct { + name string + slowdown float64 + wantStatus int + }{ + {name: "explicit zero", slowdown: 0, wantStatus: http.StatusOK}, + {name: "minimum", slowdown: 0.1, wantStatus: http.StatusOK}, + {name: "maximum", slowdown: 10, wantStatus: http.StatusOK}, + {name: "below minimum", slowdown: 0.09, wantStatus: http.StatusBadRequest}, + {name: "above maximum", slowdown: 10.1, wantStatus: http.StatusBadRequest}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + h := newVMHandler(t) + e := echo.New() + body := fmt.Sprintf(`{"source":"slow","target_model":"openai/gpt-4o","slowdown":%v}`, tt.slowdown) + req := httptest.NewRequest(http.MethodPut, "/admin/virtual-models", bytes.NewBufferString(body)) + req.Header.Set("Content-Type", "application/json") + rec := httptest.NewRecorder() + if err := h.UpsertVirtualModel(e.NewContext(req, rec)); err != nil { + t.Fatalf("UpsertVirtualModel() error = %v", err) + } + if rec.Code != tt.wantStatus { + t.Fatalf("status = %d, want %d body=%s", rec.Code, tt.wantStatus, rec.Body.String()) + } + if tt.wantStatus != http.StatusOK { + return + } + + var view virtualmodels.View + if err := json.Unmarshal(rec.Body.Bytes(), &view); err != nil { + t.Fatalf("decode response: %v", err) + } + if view.Slowdown == nil || *view.Slowdown != tt.slowdown { + t.Fatalf("view.Slowdown = %v, want %v", view.Slowdown, tt.slowdown) + } + }) } } diff --git a/internal/gateway/inference_execute.go b/internal/gateway/inference_execute.go index da2348863..707158a2d 100644 --- a/internal/gateway/inference_execute.go +++ b/internal/gateway/inference_execute.go @@ -8,7 +8,6 @@ import ( "time" "github.com/enterpilot/gomodel/internal/core" - "github.com/enterpilot/gomodel/internal/streaming" "github.com/enterpilot/gomodel/internal/usage" ) @@ -48,7 +47,9 @@ func (o *InferenceOrchestrator) StreamChatCompletion(ctx context.Context, workfl return nil, err } return &StreamResult{ - Stream: streaming.NewSlowdownStream(ctx, stream, workflowSlowdown(workflow), started), + Stream: stream, + slowdownFactor: workflowSlowdown(workflow), + inferenceStarted: started, Meta: ExecutionMeta{ ProviderType: resolvedProviderType, ProviderName: resolvedProviderName, @@ -98,7 +99,9 @@ func (o *InferenceOrchestrator) StreamResponses(ctx context.Context, workflow *c return nil, err } return &StreamResult{ - Stream: streaming.NewSlowdownStream(ctx, stream, workflowSlowdown(workflow), started), + Stream: stream, + slowdownFactor: workflowSlowdown(workflow), + inferenceStarted: started, Meta: ExecutionMeta{ ProviderType: resolvedProviderType, ProviderName: resolvedProviderName, diff --git a/internal/gateway/inference_orchestrator.go b/internal/gateway/inference_orchestrator.go index a0f4e4e9d..0244796e0 100644 --- a/internal/gateway/inference_orchestrator.go +++ b/internal/gateway/inference_orchestrator.go @@ -3,8 +3,10 @@ package gateway import ( "context" "io" + "time" "github.com/enterpilot/gomodel/internal/core" + "github.com/enterpilot/gomodel/internal/streaming" "github.com/enterpilot/gomodel/internal/usage" ) @@ -116,7 +118,21 @@ type EmbeddingResult struct { } // StreamResult is a provider SSE stream plus route metadata for observers. +// Stream is intentionally unbuffered so accounting observers can consume the +// provider events before WrapDeliveryStream applies any client-facing delay. type StreamResult struct { Stream io.ReadCloser Meta ExecutionMeta + + slowdownFactor float64 + inferenceStarted time.Time +} + +// WrapDeliveryStream applies this result's client-facing slowdown after any +// accounting or persistence wrappers have been attached to stream. +func (r *StreamResult) WrapDeliveryStream(ctx context.Context, stream io.ReadCloser) io.ReadCloser { + if r == nil { + return stream + } + return streaming.NewSlowdownStream(ctx, stream, r.slowdownFactor, r.inferenceStarted) } diff --git a/internal/gateway/request_model_resolution_test.go b/internal/gateway/request_model_resolution_test.go index 3b95d64ca..bd3914de9 100644 --- a/internal/gateway/request_model_resolution_test.go +++ b/internal/gateway/request_model_resolution_test.go @@ -113,29 +113,45 @@ func (r *requestSlowdownResolver) ResolveSlowdown(_ context.Context, requested c } func TestResolveRequestModelCarriesResolvedSlowdownFactor(t *testing.T) { - provider := newRequestRefreshProvider(1) - resolver := &requestSlowdownResolver{ + aliasResolver := &requestSlowdownResolver{ requestAliasResolver: requestAliasResolver{ "smart": {Provider: "openai", Model: "gpt-4o"}, }, factor: 0.5, } - - resolution, err := ResolveRequestModelWithAuthorizer( - context.Background(), - provider, - resolver, - nil, - core.NewRequestedModelSelector("smart", ""), - ) - if err != nil { - t.Fatalf("ResolveRequestModelWithAuthorizer() error = %v", err) - } - if resolution.Slowdown != 0.5 { - t.Fatalf("resolution.Slowdown = %v, want 0.5", resolution.Slowdown) - } - if resolver.requested != "smart" || resolver.resolved != "openai/gpt-4o" { - t.Fatalf("slowdown resolver inputs = (%q, %q), want (smart, openai/gpt-4o)", resolver.requested, resolver.resolved) + directResolver := &requestSlowdownResolver{factor: 0.3} + tests := []struct { + name string + resolver ModelResolver + requested string + wantSlowdown float64 + capture *requestSlowdownResolver + wantResolved string + }{ + {name: "alias factor", resolver: aliasResolver, requested: "smart", wantSlowdown: 0.5, capture: aliasResolver, wantResolved: "openai/gpt-4o"}, + {name: "direct model factor", resolver: directResolver, requested: "openai/gpt-4o", wantSlowdown: 0.3, capture: directResolver, wantResolved: "openai/gpt-4o"}, + {name: "resolver without slowdown contract", resolver: requestAliasResolver{}, requested: "openai/gpt-4o", wantSlowdown: 0, wantResolved: "openai/gpt-4o"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + resolution, err := ResolveRequestModelWithAuthorizer( + context.Background(), newRequestRefreshProvider(1), tt.resolver, nil, + core.NewRequestedModelSelector(tt.requested, ""), + ) + if err != nil { + t.Fatalf("ResolveRequestModelWithAuthorizer() error = %v", err) + } + if resolution.Slowdown != tt.wantSlowdown { + t.Fatalf("resolution.Slowdown = %v, want %v", resolution.Slowdown, tt.wantSlowdown) + } + if got := resolution.ResolvedSelector.QualifiedModel(); got != tt.wantResolved { + t.Fatalf("resolved selector = %q, want %q", got, tt.wantResolved) + } + if tt.capture != nil && (tt.capture.requested != tt.requested || tt.capture.resolved != tt.wantResolved) { + t.Fatalf("slowdown resolver inputs = (%q, %q), want (%q, %q)", tt.capture.requested, tt.capture.resolved, tt.requested, tt.wantResolved) + } + }) } } diff --git a/internal/gateway/slowdown_test.go b/internal/gateway/slowdown_test.go index b776cf669..2f6d95280 100644 --- a/internal/gateway/slowdown_test.go +++ b/internal/gateway/slowdown_test.go @@ -2,28 +2,49 @@ package gateway import ( "context" + "errors" "testing" "time" "github.com/enterpilot/gomodel/internal/core" ) -func TestWaitForInferenceSlowdownAddsFactorOfInferenceTime(t *testing.T) { - workflow := &core.Workflow{Resolution: &core.RequestModelResolution{Slowdown: 0.5}} - started := time.Now() - if err := waitForInferenceSlowdown(context.Background(), workflow, 20*time.Millisecond); err != nil { - t.Fatalf("waitForInferenceSlowdown() error = %v", err) +func TestWaitForInferenceSlowdown(t *testing.T) { + canceled, cancel := context.WithCancel(context.Background()) + cancel() + tests := []struct { + name string + ctx context.Context + workflow *core.Workflow + inference time.Duration + wantMin time.Duration + wantMax time.Duration + wantErr error + }{ + {name: "nil workflow", ctx: context.Background(), inference: time.Second, wantMax: 250 * time.Millisecond}, + {name: "zero factor", ctx: context.Background(), workflow: slowdownWorkflow(0), inference: time.Second, wantMax: 250 * time.Millisecond}, + {name: "positive factor", ctx: context.Background(), workflow: slowdownWorkflow(0.5), inference: 20 * time.Millisecond, wantMin: 8 * time.Millisecond, wantMax: 250 * time.Millisecond}, + {name: "canceled context", ctx: canceled, workflow: slowdownWorkflow(10), inference: time.Minute, wantMax: 250 * time.Millisecond, wantErr: context.Canceled}, } - if elapsed := time.Since(started); elapsed < 8*time.Millisecond { - t.Fatalf("waitForInferenceSlowdown() waited %v, want about 10ms", elapsed) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + started := time.Now() + err := waitForInferenceSlowdown(tt.ctx, tt.workflow, tt.inference) + elapsed := time.Since(started) + if !errors.Is(err, tt.wantErr) { + t.Fatalf("waitForInferenceSlowdown() error = %v, want %v", err, tt.wantErr) + } + if elapsed < tt.wantMin { + t.Fatalf("waitForInferenceSlowdown() waited %v, want at least %v", elapsed, tt.wantMin) + } + if tt.wantMax > 0 && elapsed > tt.wantMax { + t.Fatalf("waitForInferenceSlowdown() waited %v, want at most %v", elapsed, tt.wantMax) + } + }) } } -func TestWaitForInferenceSlowdownStopsOnCancellation(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - cancel() - workflow := &core.Workflow{Resolution: &core.RequestModelResolution{Slowdown: 10}} - if err := waitForInferenceSlowdown(ctx, workflow, time.Minute); err != context.Canceled { - t.Fatalf("waitForInferenceSlowdown() error = %v, want context.Canceled", err) - } +func slowdownWorkflow(factor float64) *core.Workflow { + return &core.Workflow{Resolution: &core.RequestModelResolution{Slowdown: factor}} } diff --git a/internal/server/audio_service_test.go b/internal/server/audio_service_test.go index f37e86fcc..cdc6a5b0a 100644 --- a/internal/server/audio_service_test.go +++ b/internal/server/audio_service_test.go @@ -10,7 +10,9 @@ import ( "net/http/httptest" "os" "strings" + "sync" "testing" + "time" "github.com/labstack/echo/v5" @@ -31,6 +33,9 @@ type audioMockProvider struct { capturedSpeech *core.AudioSpeechRequest capturedTranscription *core.AudioTranscriptionRequest capturedTranslation *core.AudioTranscriptionRequest + providerDelay time.Duration + providerCalled chan struct{} + providerCalledOnce sync.Once } // ResolveModel lets the fake stand in for the Router so the service can authorize @@ -46,6 +51,7 @@ func (m *audioMockProvider) ResolveModel(requested core.RequestedModelSelector) func (m *audioMockProvider) CreateSpeech(_ context.Context, req *core.AudioSpeechRequest) (*core.AudioResponse, error) { m.capturedSpeech = req + m.waitForAudioResponse() if m.audioErr != nil { return nil, m.audioErr } @@ -54,6 +60,7 @@ func (m *audioMockProvider) CreateSpeech(_ context.Context, req *core.AudioSpeec func (m *audioMockProvider) CreateTranscription(_ context.Context, req *core.AudioTranscriptionRequest) (*core.AudioResponse, error) { m.capturedTranscription = req + m.waitForAudioResponse() if m.audioErr != nil { return nil, m.audioErr } @@ -62,12 +69,154 @@ func (m *audioMockProvider) CreateTranscription(_ context.Context, req *core.Aud func (m *audioMockProvider) CreateTranslation(_ context.Context, req *core.AudioTranscriptionRequest) (*core.AudioResponse, error) { m.capturedTranslation = req + m.waitForAudioResponse() if m.audioErr != nil { return nil, m.audioErr } return m.translationResp, nil } +func (m *audioMockProvider) waitForAudioResponse() { + if m.providerCalled != nil { + m.providerCalledOnce.Do(func() { close(m.providerCalled) }) + } + if m.providerDelay > 0 { + time.Sleep(m.providerDelay) + } +} + +type audioSlowdownResolver struct { + factor float64 + requested string + resolved string +} + +func (r *audioSlowdownResolver) ResolveModel(requested core.RequestedModelSelector) (core.ModelSelector, bool, error) { + selector, err := requested.Normalize() + return selector, false, err +} + +func (r *audioSlowdownResolver) ResolveSlowdown(_ context.Context, requested core.RequestedModelSelector, resolved core.ModelSelector) float64 { + r.requested = requested.RequestedQualifiedModel() + r.resolved = resolved.QualifiedModel() + return r.factor +} + +func TestAudioSlowdownAppliesAfterInferenceAndHonorsCancellation(t *testing.T) { + tests := []struct { + name string + model string + newContext func() (*echo.Context, *httptest.ResponseRecorder) + call func(*Handler, *echo.Context) error + response func(*audioMockProvider) + }{ + { + name: "speech", + model: "gpt-4o-mini-tts", + newContext: func() (*echo.Context, *httptest.ResponseRecorder) { + c, rec, _ := newSpeechRequestWithAuditEntry() + return c, rec + }, + call: func(h *Handler, c *echo.Context) error { return h.AudioSpeech(c) }, + response: func(p *audioMockProvider) { + p.speechResp = &core.AudioResponse{ContentType: "audio/mpeg", Data: []byte("audio")} + }, + }, + { + name: "transcription", + model: "gpt-4o-transcribe", + newContext: func() (*echo.Context, *httptest.ResponseRecorder) { + c, rec, _ := newTranscriptionRequestWithAuditEntry("speech.mp3", []byte("audio")) + return c, rec + }, + call: func(h *Handler, c *echo.Context) error { return h.AudioTranscriptions(c) }, + response: func(p *audioMockProvider) { + p.transcriptionResp = &core.AudioResponse{ContentType: "application/json", Data: []byte(`{"text":"hi"}`)} + }, + }, + { + name: "translation", + model: "whisper-1", + newContext: newTranslationSlowdownTestContext, + call: func(h *Handler, c *echo.Context) error { return h.AudioTranslations(c) }, + response: func(p *audioMockProvider) { + p.translationResp = &core.AudioResponse{ContentType: "application/json", Data: []byte(`{"text":"hello"}`)} + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name+" success", func(t *testing.T) { + resolver := &audioSlowdownResolver{factor: 1} + provider := &audioMockProvider{ + mockProvider: &mockProvider{supportedModels: []string{tt.model}}, + providerDelay: 15 * time.Millisecond, + } + tt.response(provider) + handler := newHandler(provider, nil, nil, nil, resolver, nil, nil, nil) + c, rec := tt.newContext() + + started := time.Now() + if err := tt.call(handler, c); err != nil { + t.Fatalf("audio handler error = %v", err) + } + if elapsed := time.Since(started); elapsed < 25*time.Millisecond { + t.Fatalf("handler returned after %v, want provider time plus matching slowdown", elapsed) + } + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200 body=%s", rec.Code, rec.Body.String()) + } + if resolver.requested != tt.model || resolver.resolved != tt.model { + t.Fatalf("slowdown resolver inputs = (%q, %q), want (%q, %q)", resolver.requested, resolver.resolved, tt.model, tt.model) + } + }) + + t.Run(tt.name+" cancellation", func(t *testing.T) { + resolver := &audioSlowdownResolver{factor: 10} + provider := &audioMockProvider{ + mockProvider: &mockProvider{supportedModels: []string{tt.model}}, + providerDelay: 15 * time.Millisecond, + providerCalled: make(chan struct{}), + } + tt.response(provider) + handler := newHandler(provider, nil, nil, nil, resolver, nil, nil, nil) + c, _ := tt.newContext() + ctx, cancel := context.WithCancel(c.Request().Context()) + c.SetRequest(c.Request().WithContext(ctx)) + + done := make(chan struct{}) + go func() { + _ = tt.call(handler, c) + close(done) + }() + select { + case <-provider.providerCalled: + case <-time.After(time.Second): + t.Fatal("provider was not called") + } + cancel() + select { + case <-done: + case <-time.After(150 * time.Millisecond): + t.Fatal("handler did not cancel the post-inference slowdown") + } + }) + } +} + +func newTranslationSlowdownTestContext() (*echo.Context, *httptest.ResponseRecorder) { + var buf bytes.Buffer + w := multipart.NewWriter(&buf) + _ = w.WriteField("model", "whisper-1") + part, _ := w.CreateFormFile("file", "speech.mp3") + _, _ = part.Write([]byte("audio")) + _ = w.Close() + req := httptest.NewRequest(http.MethodPost, "/v1/audio/translations", &buf) + req.Header.Set("Content-Type", w.FormDataContentType()) + rec := httptest.NewRecorder() + return echo.New().NewContext(req, rec), rec +} + func TestAudioSpeech_HappyPath(t *testing.T) { mock := &audioMockProvider{ mockProvider: &mockProvider{supportedModels: []string{"gpt-4o-mini-tts"}}, diff --git a/internal/server/messages_handler.go b/internal/server/messages_handler.go index 5703ce6cc..9d9e31188 100644 --- a/internal/server/messages_handler.go +++ b/internal/server/messages_handler.go @@ -216,7 +216,8 @@ func (s *translatedInferenceService) dispatchMessages(c *echo.Context, req *core result.Meta.FailoverModel, result.Stream, func(stream io.ReadCloser) io.ReadCloser { - return anthropicapi.NewStreamConverter(stream, model, anthropicapi.EstimateChatInputTokens(req)) + converted := anthropicapi.NewStreamConverter(stream, model, anthropicapi.EstimateChatInputTokens(req)) + return result.WrapDeliveryStream(ctx, converted) }, ) } diff --git a/internal/server/stream_slowdown_test.go b/internal/server/stream_slowdown_test.go new file mode 100644 index 000000000..1b545e45e --- /dev/null +++ b/internal/server/stream_slowdown_test.go @@ -0,0 +1,106 @@ +package server + +import ( + "context" + "io" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + "time" + + "github.com/labstack/echo/v5" + + "github.com/enterpilot/gomodel/internal/streaming" + "github.com/enterpilot/gomodel/internal/usage" +) + +func TestSlowedStreamRecordsUsageConsumedBeforeClientCancellation(t *testing.T) { + tests := []struct { + name string + endpoint string + data string + }{ + { + name: "chat completions", + endpoint: "/v1/chat/completions", + data: "data: {\"id\":\"chatcmpl-slow\",\"model\":\"gpt-4o\",\"usage\":{\"prompt_tokens\":4,\"completion_tokens\":2,\"total_tokens\":6}}\n\ndata: [DONE]\n\n", + }, + { + name: "responses", + endpoint: "/v1/responses", + data: "event: response.completed\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp-slow\",\"model\":\"gpt-4o\",\"usage\":{\"input_tokens\":4,\"output_tokens\":2,\"total_tokens\":6}}}\n\ndata: [DONE]\n\n", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + req := httptest.NewRequest(http.MethodPost, tt.endpoint, nil).WithContext(ctx) + rec := httptest.NewRecorder() + c := echo.New().NewContext(req, rec) + logger := &usageCaptureLogger{config: usage.Config{Enabled: true}} + handler := NewHandler(&mockProvider{}, nil, logger, nil) + source := newDrainSignalingStream(tt.data) + + done := make(chan struct{}) + go func() { + _ = handler.translatedInference().handleStreamingReadCloser( + c, nil, "gpt-4o", "openai", "primary-openai", "", source, + func(observed io.ReadCloser) io.ReadCloser { + return streaming.NewSlowdownStream(ctx, observed, 10, time.Now().Add(-time.Second)) + }, + ) + close(done) + }() + + select { + case <-source.closed: + case <-time.After(time.Second): + t.Fatal("slowdown wrapper did not finish and close the upstream stream") + } + entries := logger.Entries() + if len(entries) != 1 { + t.Fatalf("usage entries before client delivery = %d, want 1 after provider completion", len(entries)) + } + cancel() + select { + case <-done: + case <-time.After(time.Second): + t.Fatal("stream handler did not stop after cancellation") + } + + entries = logger.Entries() + if len(entries) != 1 { + t.Fatalf("usage entries = %d, want 1 after provider completed before disconnect", len(entries)) + } + if entries[0].TotalTokens != 6 { + t.Fatalf("TotalTokens = %d, want 6", entries[0].TotalTokens) + } + }) + } +} + +type drainSignalingStream struct { + reader *strings.Reader + closed chan struct{} + closeOnce sync.Once +} + +func newDrainSignalingStream(data string) *drainSignalingStream { + return &drainSignalingStream{ + reader: strings.NewReader(data), + closed: make(chan struct{}), + } +} + +func (s *drainSignalingStream) Read(p []byte) (int, error) { + return s.reader.Read(p) +} + +func (s *drainSignalingStream) Close() error { + s.closeOnce.Do(func() { close(s.closed) }) + return nil +} diff --git a/internal/server/translated_inference_service.go b/internal/server/translated_inference_service.go index eb4703712..c061d631e 100644 --- a/internal/server/translated_inference_service.go +++ b/internal/server/translated_inference_service.go @@ -135,7 +135,9 @@ func (s *translatedInferenceService) dispatchChatCompletion(c *echo.Context, req result.Meta.ProviderName, result.Meta.FailoverModel, result.Stream, - nil, + func(stream io.ReadCloser) io.ReadCloser { + return result.WrapDeliveryStream(ctx, stream) + }, ) } @@ -313,7 +315,9 @@ func (s *translatedInferenceService) dispatchResponses(c *echo.Context, req *cor result.Meta.ProviderName, result.Meta.FailoverModel, stream, - nil, + func(stream io.ReadCloser) io.ReadCloser { + return result.WrapDeliveryStream(ctx, stream) + }, ) } diff --git a/internal/streaming/slowdown_stream.go b/internal/streaming/slowdown_stream.go index db5d260b2..6719c3823 100644 --- a/internal/streaming/slowdown_stream.go +++ b/internal/streaming/slowdown_stream.go @@ -23,14 +23,16 @@ func NewSlowdownStream(ctx context.Context, source io.ReadCloser, factor float64 } streamCtx, cancel := context.WithCancel(ctx) s := &slowdownStream{ - source: source, - factor: factor, - started: inferenceStarted, - ctx: streamCtx, - cancel: cancel, - notify: make(chan struct{}, 1), + source: source, + factor: factor, + started: inferenceStarted, + ctx: streamCtx, + cancel: cancel, + notify: make(chan struct{}, 1), + drainDone: make(chan struct{}), } go s.drain() + go s.closeSourceOnCancellation() return s } @@ -41,21 +43,24 @@ type slowdownChunk struct { } type slowdownStream struct { - source io.ReadCloser - factor float64 - started time.Time - ctx context.Context - cancel context.CancelFunc - notify chan struct{} - - mu sync.Mutex - queue []slowdownChunk - closed bool - closeErr error - closeOnce sync.Once + source io.ReadCloser + factor float64 + started time.Time + ctx context.Context + cancel context.CancelFunc + notify chan struct{} + drainDone chan struct{} + + mu sync.Mutex + queue []slowdownChunk + closed bool + closeOnce sync.Once + sourceCloseOnce sync.Once + sourceCloseErr error } func (s *slowdownStream) drain() { + defer close(s.drainDone) buf := make([]byte, 32*1024) for { n, err := s.source.Read(buf) @@ -68,11 +73,27 @@ func (s *slowdownStream) drain() { } if err != nil { s.enqueue(slowdownChunk{due: due, err: err}) + _ = s.closeSource() return } } } +func (s *slowdownStream) closeSourceOnCancellation() { + select { + case <-s.ctx.Done(): + _ = s.closeSource() + case <-s.drainDone: + } +} + +func (s *slowdownStream) closeSource() error { + s.sourceCloseOnce.Do(func() { + s.sourceCloseErr = s.source.Close() + }) + return s.sourceCloseErr +} + func (s *slowdownStream) scaledDue(elapsed time.Duration) time.Time { scaled := time.Duration(float64(elapsed) * (1 + s.factor)) return s.started.Add(scaled) @@ -177,11 +198,11 @@ func (s *slowdownStream) Close() error { s.closed = true s.queue = nil s.mu.Unlock() - s.closeErr = s.source.Close() + _ = s.closeSource() select { case s.notify <- struct{}{}: default: } }) - return s.closeErr + return s.sourceCloseErr } diff --git a/internal/streaming/slowdown_stream_test.go b/internal/streaming/slowdown_stream_test.go index aa5f0bf89..59febb374 100644 --- a/internal/streaming/slowdown_stream_test.go +++ b/internal/streaming/slowdown_stream_test.go @@ -3,6 +3,7 @@ package streaming import ( "context" "io" + "sync" "sync/atomic" "testing" "time" @@ -54,6 +55,26 @@ func TestSlowdownStreamReadStopsOnCancellation(t *testing.T) { } } +func TestSlowdownStreamCancellationClosesBlockedUpstream(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + source := newBlockingCloseSource() + stream := NewSlowdownStream(ctx, source, 1, time.Now()) + t.Cleanup(func() { _ = stream.Close() }) + + select { + case <-source.readStarted: + case <-time.After(time.Second): + t.Fatal("upstream Read did not start") + } + cancel() + + select { + case <-source.closed: + case <-time.After(time.Second): + t.Fatal("upstream Close was not called after cancellation") + } +} + type timedChunkSource struct { reads atomic.Int32 } @@ -73,3 +94,28 @@ func (s *timedChunkSource) Read(p []byte) (int, error) { } func (*timedChunkSource) Close() error { return nil } + +type blockingCloseSource struct { + readStarted chan struct{} + closed chan struct{} + readOnce sync.Once + closeOnce sync.Once +} + +func newBlockingCloseSource() *blockingCloseSource { + return &blockingCloseSource{ + readStarted: make(chan struct{}), + closed: make(chan struct{}), + } +} + +func (s *blockingCloseSource) Read([]byte) (int, error) { + s.readOnce.Do(func() { close(s.readStarted) }) + <-s.closed + return 0, io.ErrClosedPipe +} + +func (s *blockingCloseSource) Close() error { + s.closeOnce.Do(func() { close(s.closed) }) + return nil +} diff --git a/internal/virtualmodels/config_overlay_test.go b/internal/virtualmodels/config_overlay_test.go index 34cfec38b..b66068f8e 100644 --- a/internal/virtualmodels/config_overlay_test.go +++ b/internal/virtualmodels/config_overlay_test.go @@ -13,7 +13,7 @@ func TestConfigModels_Conversion(t *testing.T) { t.Parallel() enabled := false got := ConfigModels([]config.VirtualModelConfig{ - {Source: "alias", Target: "openai/gpt-4o", Slowdown: 0.5}, + {Source: "alias", Target: "openai/gpt-4o", Slowdown: new(0.5)}, { Source: "smart", Strategy: StrategyCost, @@ -28,7 +28,7 @@ func TestConfigModels_Conversion(t *testing.T) { if len(got) != 3 { t.Fatalf("ConfigModels len = %d, want 3", len(got)) } - if got[0].Targets[0].Model != "openai/gpt-4o" || got[0].Slowdown != 0.5 || !got[0].Enabled || !got[0].Managed { + if got[0].Targets[0].Model != "openai/gpt-4o" || got[0].Slowdown == nil || *got[0].Slowdown != 0.5 || !got[0].Enabled || !got[0].Managed { t.Fatalf("shorthand target conversion = %#v", got[0]) } if len(got[1].Targets) != 2 || got[1].Strategy != StrategyCost || got[1].Targets[0].Weight != 2 { @@ -39,6 +39,40 @@ func TestConfigModels_Conversion(t *testing.T) { } } +func TestConfigModels_PreservesSlowdownPresence(t *testing.T) { + t.Parallel() + tests := []struct { + name string + in *float64 + want *float64 + }{ + {name: "omitted", in: nil, want: nil}, + {name: "explicit zero", in: new(0.0), want: new(0.0)}, + {name: "minimum active factor", in: new(MinSlowdownFactor), want: new(MinSlowdownFactor)}, + {name: "maximum active factor", in: new(MaxSlowdownFactor), want: new(MaxSlowdownFactor)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ConfigModels([]config.VirtualModelConfig{{ + Source: "alias", Target: "openai/gpt-4o", Slowdown: tt.in, + }}) + if len(got) != 1 { + t.Fatalf("ConfigModels len = %d, want 1", len(got)) + } + if tt.want == nil { + if got[0].Slowdown != nil { + t.Fatalf("Slowdown = %v, want nil", got[0].Slowdown) + } + return + } + if got[0].Slowdown == nil || *got[0].Slowdown != *tt.want { + t.Fatalf("Slowdown = %v, want %v", got[0].Slowdown, *tt.want) + } + }) + } +} + func TestService_ConfigOverlayResolvesAndIsReadOnly(t *testing.T) { t.Parallel() svc := newBalancingService(t) diff --git a/internal/virtualmodels/service.go b/internal/virtualmodels/service.go index 64158ba13..361ce41d8 100644 --- a/internal/virtualmodels/service.go +++ b/internal/virtualmodels/service.go @@ -499,7 +499,7 @@ func (s *Service) policyIsRedundant(policy VirtualModel, fallbackRows []VirtualM // policyIsNoop reports whether an otherwise empty policy changes effective // access compared with the snapshot that would remain without that policy. func policyIsNoop(policy VirtualModel, fallback snapshot) bool { - if policy.IsRedirect() || len(policy.UserPaths) > 0 || strings.TrimSpace(policy.Description) != "" || policy.Slowdown > 0 { + if policy.IsRedirect() || len(policy.UserPaths) > 0 || strings.TrimSpace(policy.Description) != "" || policy.Slowdown != nil { return false } diff --git a/internal/virtualmodels/slowdown.go b/internal/virtualmodels/slowdown.go index 958efbb4e..114fda445 100644 --- a/internal/virtualmodels/slowdown.go +++ b/internal/virtualmodels/slowdown.go @@ -23,14 +23,14 @@ func (s *Service) ResolveSlowdown( snap := s.snapshot() userPath := core.UserPathFromContext(ctx) if !requested.ExplicitProvider { - if redirect, ok := snap.findRedirect(requested.Model, userPath, true); ok && redirect.vm.Slowdown > 0 { - return redirect.vm.Slowdown + if redirect, ok := snap.findRedirect(requested.Model, userPath, true); ok && redirect.vm.Slowdown != nil { + return *redirect.vm.Slowdown } } if policy, ok := snap.matchingPolicy(resolved.Provider, resolved.Model); ok && - policy.Slowdown > 0 && userPathAllowed(userPath, policy.UserPaths) { - return policy.Slowdown + policy.Slowdown != nil && userPathAllowed(userPath, policy.UserPaths) { + return *policy.Slowdown } return 0 } diff --git a/internal/virtualmodels/slowdown_test.go b/internal/virtualmodels/slowdown_test.go index 480a35947..8923b68ea 100644 --- a/internal/virtualmodels/slowdown_test.go +++ b/internal/virtualmodels/slowdown_test.go @@ -2,111 +2,132 @@ package virtualmodels import ( "context" + "math" "testing" "github.com/enterpilot/gomodel/internal/core" ) -func TestResolveSlowdown_AliasOverridesConcreteModel(t *testing.T) { - service := newSlowdownService(t, - VirtualModel{ - Source: "slow-alias", - Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, - Slowdown: 0.4, - Enabled: true, - }, - VirtualModel{ - Source: "openai/gpt-4o", - ProviderName: "openai", - Model: "gpt-4o", - Slowdown: 0.2, - Enabled: true, - }, - ) - - got := service.ResolveSlowdown( - context.Background(), - core.NewRequestedModelSelector("slow-alias", ""), - core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, - ) - if got != 0.4 { - t.Fatalf("ResolveSlowdown(alias) = %v, want 0.4", got) - } -} - -func TestResolveSlowdown_AliasFallsBackToConcreteModel(t *testing.T) { - service := newSlowdownService(t, - VirtualModel{ - Source: "plain-alias", - Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, - Enabled: true, - }, - VirtualModel{ - Source: "openai/gpt-4o", - ProviderName: "openai", - Model: "gpt-4o", - Slowdown: 0.2, - Enabled: true, - }, - ) - - got := service.ResolveSlowdown( - context.Background(), - core.NewRequestedModelSelector("plain-alias", ""), - core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, - ) - if got != 0.2 { - t.Fatalf("ResolveSlowdown(alias target) = %v, want 0.2", got) - } -} - -func TestResolveSlowdown_HonorsUserPathScope(t *testing.T) { - service := newSlowdownService(t, VirtualModel{ +func TestResolveSlowdown(t *testing.T) { + concrete := VirtualModel{ Source: "openai/gpt-4o", ProviderName: "openai", Model: "gpt-4o", - UserPaths: []string{"/team/alpha"}, - Slowdown: 0.3, + Slowdown: new(0.2), Enabled: true, - }) - requested := core.NewRequestedModelSelector("openai/gpt-4o", "") - resolved := core.ModelSelector{Provider: "openai", Model: "gpt-4o"} - - matching := core.WithEffectiveUserPath(context.Background(), "/team/alpha/member") - if got := service.ResolveSlowdown(matching, requested, resolved); got != 0.3 { - t.Fatalf("ResolveSlowdown(matching path) = %v, want 0.3", got) } - nonMatching := core.WithEffectiveUserPath(context.Background(), "/team/beta") - if got := service.ResolveSlowdown(nonMatching, requested, resolved); got != 0 { - t.Fatalf("ResolveSlowdown(non-matching path) = %v, want 0", got) + tests := []struct { + name string + rows []VirtualModel + requested core.RequestedModelSelector + resolved core.ModelSelector + ctx context.Context + want float64 + }{ + { + name: "alias overrides concrete model", + rows: []VirtualModel{ + {Source: "slow-alias", Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, Slowdown: new(0.4), Enabled: true}, + concrete, + }, + requested: core.NewRequestedModelSelector("slow-alias", ""), + resolved: core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ctx: context.Background(), + want: 0.4, + }, + { + name: "alias inherits concrete model when omitted", + rows: []VirtualModel{ + {Source: "plain-alias", Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, Enabled: true}, + concrete, + }, + requested: core.NewRequestedModelSelector("plain-alias", ""), + resolved: core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ctx: context.Background(), + want: 0.2, + }, + { + name: "explicit alias zero disables concrete model slowdown", + rows: []VirtualModel{ + {Source: "fast-alias", Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, Slowdown: new(0.0), Enabled: true}, + concrete, + }, + requested: core.NewRequestedModelSelector("fast-alias", ""), + resolved: core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ctx: context.Background(), + want: 0, + }, + { + name: "matching user path", + rows: []VirtualModel{{ + Source: "openai/gpt-4o", ProviderName: "openai", Model: "gpt-4o", + UserPaths: []string{"/team/alpha"}, Slowdown: new(0.3), Enabled: true, + }}, + requested: core.NewRequestedModelSelector("openai/gpt-4o", ""), + resolved: core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ctx: core.WithEffectiveUserPath(context.Background(), "/team/alpha/member"), + want: 0.3, + }, + { + name: "non-matching user path", + rows: []VirtualModel{{ + Source: "openai/gpt-4o", ProviderName: "openai", Model: "gpt-4o", + UserPaths: []string{"/team/alpha"}, Slowdown: new(0.3), Enabled: true, + }}, + requested: core.NewRequestedModelSelector("openai/gpt-4o", ""), + resolved: core.ModelSelector{Provider: "openai", Model: "gpt-4o"}, + ctx: core.WithEffectiveUserPath(context.Background(), "/team/beta"), + want: 0, + }, } -} -func TestUpsertRejectsSlowdownOutsideRange(t *testing.T) { - service := newSlowdownService(t) - for _, slowdown := range []float64{0.09, 10.01} { - err := service.Upsert(context.Background(), VirtualModel{ - Source: "openai/gpt-4o", - ProviderName: "openai", - Model: "gpt-4o", - Slowdown: slowdown, - Enabled: true, + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + service := newSlowdownService(t, tt.rows...) + if got := service.ResolveSlowdown(tt.ctx, tt.requested, tt.resolved); got != tt.want { + t.Fatalf("ResolveSlowdown() = %v, want %v", got, tt.want) + } }) - if err == nil || !IsValidationError(err) { - t.Fatalf("Upsert(slowdown=%v) error = %v, want validation error", slowdown, err) - } } } -func TestUpsertRejectsProviderWideSlowdown(t *testing.T) { - service := newSlowdownService(t) - err := service.Upsert(context.Background(), VirtualModel{ - Source: "openai/", - Slowdown: 0.5, - Enabled: true, - }) - if err == nil || !IsValidationError(err) { - t.Fatalf("Upsert(provider slowdown) error = %v, want validation error", err) +func TestUpsertValidatesSlowdown(t *testing.T) { + tests := []struct { + name string + source string + slowdown *float64 + wantInvalid bool + }{ + {name: "omitted", source: "openai/gpt-4o", slowdown: nil}, + {name: "disabled zero", source: "openai/gpt-4o", slowdown: new(0.0)}, + {name: "minimum", source: "openai/gpt-4o", slowdown: new(MinSlowdownFactor)}, + {name: "maximum", source: "openai/gpt-4o", slowdown: new(MaxSlowdownFactor)}, + {name: "below minimum", source: "openai/gpt-4o", slowdown: new(0.09), wantInvalid: true}, + {name: "above maximum", source: "openai/gpt-4o", slowdown: new(10.01), wantInvalid: true}, + {name: "NaN", source: "openai/gpt-4o", slowdown: new(math.NaN()), wantInvalid: true}, + {name: "positive infinity", source: "openai/gpt-4o", slowdown: new(math.Inf(1)), wantInvalid: true}, + {name: "negative infinity", source: "openai/gpt-4o", slowdown: new(math.Inf(-1)), wantInvalid: true}, + {name: "provider scope", source: "openai/", slowdown: new(0.5), wantInvalid: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + service := newSlowdownService(t) + err := service.Upsert(context.Background(), VirtualModel{ + Source: tt.source, + Slowdown: tt.slowdown, + Enabled: true, + }) + if tt.wantInvalid { + if err == nil || !IsValidationError(err) { + t.Fatalf("Upsert() error = %v, want validation error", err) + } + return + } + if err != nil { + t.Fatalf("Upsert() error = %v, want nil", err) + } + }) } } diff --git a/internal/virtualmodels/store_mongodb.go b/internal/virtualmodels/store_mongodb.go index 775311404..756205b29 100644 --- a/internal/virtualmodels/store_mongodb.go +++ b/internal/virtualmodels/store_mongodb.go @@ -20,7 +20,7 @@ type mongoVirtualModelDocument struct { Model string `bson:"model,omitempty"` UserPaths []string `bson:"user_paths,omitempty"` Description string `bson:"description,omitempty"` - Slowdown float64 `bson:"slowdown,omitempty"` + Slowdown *float64 `bson:"slowdown,omitempty"` Enabled bool `bson:"enabled"` CreatedAt time.Time `bson:"created_at"` UpdatedAt time.Time `bson:"updated_at"` diff --git a/internal/virtualmodels/store_sql.go b/internal/virtualmodels/store_sql.go index 15c5b5bd4..fc20c0a95 100644 --- a/internal/virtualmodels/store_sql.go +++ b/internal/virtualmodels/store_sql.go @@ -25,7 +25,7 @@ var sqlSchema = []string{ model TEXT NOT NULL DEFAULT '', user_paths TEXT NOT NULL DEFAULT '[]', description TEXT NOT NULL DEFAULT '', - slowdown DOUBLE PRECISION NOT NULL DEFAULT 0, + slowdown DOUBLE PRECISION DEFAULT NULL, enabled ` + sqlx.TypeBool + ` NOT NULL DEFAULT TRUE, created_at ` + sqlx.TypeInt64 + ` NOT NULL, updated_at ` + sqlx.TypeInt64 + ` NOT NULL @@ -39,7 +39,7 @@ var sqlSchema = []string{ // virtualModelMigrations backfill columns added after the table's first release. var virtualModelMigrations = []string{ "ALTER TABLE virtual_models ADD COLUMN session_affinity TEXT NOT NULL DEFAULT ''", - "ALTER TABLE virtual_models ADD COLUMN slowdown DOUBLE PRECISION NOT NULL DEFAULT 0", + "ALTER TABLE virtual_models ADD COLUMN slowdown DOUBLE PRECISION DEFAULT NULL", } const selectVirtualModelColumns = ` diff --git a/internal/virtualmodels/store_test.go b/internal/virtualmodels/store_test.go index c1eedc34f..d915350f4 100644 --- a/internal/virtualmodels/store_test.go +++ b/internal/virtualmodels/store_test.go @@ -15,7 +15,7 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { Source: "fast", Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, Description: "primary", - Slowdown: 0.4, + Slowdown: new(0.4), Enabled: true, } policy := VirtualModel{ @@ -23,22 +23,31 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { ProviderName: "openai", Model: "gpt-4o", UserPaths: []string{"/team"}, - Slowdown: 0.2, + Slowdown: new(0.2), Enabled: true, } + disabledOverride := VirtualModel{ + Source: "no-slowdown", + Targets: []Target{{Provider: "openai", Model: "gpt-4o"}}, + Slowdown: new(0.0), + Enabled: true, + } if err := store.Upsert(ctx, redirect); err != nil { t.Fatalf("Upsert(redirect) error = %v", err) } if err := store.Upsert(ctx, policy); err != nil { t.Fatalf("Upsert(policy) error = %v", err) } + if err := store.Upsert(ctx, disabledOverride); err != nil { + t.Fatalf("Upsert(disabled override) error = %v", err) + } got, err := store.List(ctx) if err != nil { t.Fatalf("List() error = %v", err) } - if len(got) != 2 { - t.Fatalf("len(List()) = %d, want 2", len(got)) + if len(got) != 3 { + t.Fatalf("len(List()) = %d, want 3", len(got)) } gotRedirect, err := store.Get(ctx, "fast") @@ -51,7 +60,7 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { if len(gotRedirect.Targets) != 1 || gotRedirect.Targets[0].Model != "gpt-4o" || gotRedirect.Targets[0].Provider != "openai" { t.Fatalf("Get(fast).Targets = %#v, want [{openai gpt-4o 0}]", gotRedirect.Targets) } - if gotRedirect.Slowdown != 0.4 { + if gotRedirect.Slowdown == nil || *gotRedirect.Slowdown != 0.4 { t.Fatalf("Get(fast).Slowdown = %v, want 0.4", gotRedirect.Slowdown) } @@ -65,9 +74,17 @@ func TestStore_RoundTripRedirectAndPolicy(t *testing.T) { if len(gotPolicy.UserPaths) != 1 || gotPolicy.UserPaths[0] != "/team" { t.Fatalf("Get(policy).UserPaths = %#v, want [/team]", gotPolicy.UserPaths) } - if gotPolicy.Slowdown != 0.2 { + if gotPolicy.Slowdown == nil || *gotPolicy.Slowdown != 0.2 { t.Fatalf("Get(policy).Slowdown = %v, want 0.2", gotPolicy.Slowdown) } + + gotDisabled, err := store.Get(ctx, "no-slowdown") + if err != nil { + t.Fatalf("Get(no-slowdown) error = %v", err) + } + if gotDisabled.Slowdown == nil || *gotDisabled.Slowdown != 0 { + t.Fatalf("Get(no-slowdown).Slowdown = %v, want explicit zero", gotDisabled.Slowdown) + } }) } diff --git a/internal/virtualmodels/types.go b/internal/virtualmodels/types.go index 13969a1f3..d567edcf4 100644 --- a/internal/virtualmodels/types.go +++ b/internal/virtualmodels/types.go @@ -47,9 +47,10 @@ type VirtualModel struct { Model string `json:"model,omitempty" bson:"model,omitempty"` UserPaths []string `json:"user_paths,omitempty" bson:"user_paths,omitempty"` Description string `json:"description,omitempty" bson:"description,omitempty"` - // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. - Slowdown float64 `json:"slowdown,omitempty" bson:"slowdown,omitempty"` - Enabled bool `json:"enabled" bson:"enabled"` + // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. Nil + // leaves the setting unspecified so an alias can inherit its target model. + Slowdown *float64 `json:"slowdown,omitempty" bson:"slowdown,omitempty"` + Enabled bool `json:"enabled" bson:"enabled"` // SessionAffinity keeps requests of one detected session on the target that // served it before, while that target stays available. Tri-state: nil means @@ -146,7 +147,7 @@ type View struct { UserPaths []string `json:"user_paths,omitempty"` Description string `json:"description,omitempty"` // Slowdown is an extra-time factor from 0.1 to 10; zero disables it. - Slowdown float64 `json:"slowdown,omitempty"` + Slowdown *float64 `json:"slowdown,omitempty"` Enabled bool `json:"enabled"` Managed bool `json:"managed,omitempty"` ResolvedModel string `json:"resolved_model,omitempty"` diff --git a/internal/virtualmodels/validation.go b/internal/virtualmodels/validation.go index 5af80040f..a144c92dd 100644 --- a/internal/virtualmodels/validation.go +++ b/internal/virtualmodels/validation.go @@ -97,7 +97,7 @@ func normalizePolicyInput(catalog Catalog, vm VirtualModel) (VirtualModel, error vm.Source = parts.Selector vm.ProviderName = parts.ProviderName vm.Model = parts.Model - if vm.Slowdown > 0 && parts.Model == "" { + if vm.Slowdown != nil && parts.Model == "" { return VirtualModel{}, newValidationError("slowdown can only be configured for a model or redirect", nil) } @@ -122,7 +122,7 @@ func normalizeStoredPolicy(vm VirtualModel) (VirtualModel, error) { vm.Source = parts.Selector vm.ProviderName = parts.ProviderName vm.Model = parts.Model - if vm.Slowdown > 0 && parts.Model == "" { + if vm.Slowdown != nil && parts.Model == "" { return VirtualModel{}, newValidationError("slowdown can only be configured for a model or redirect", nil) } @@ -134,10 +134,11 @@ func normalizeStoredPolicy(vm VirtualModel) (VirtualModel, error) { return vm, nil } -func validateSlowdown(factor float64) error { - if factor == 0 { +func validateSlowdown(configured *float64) error { + if configured == nil || *configured == 0 { return nil } + factor := *configured if math.IsNaN(factor) || math.IsInf(factor, 0) || factor < MinSlowdownFactor || factor > MaxSlowdownFactor { return newValidationError(fmt.Sprintf("slowdown must be 0 (disabled) or between %.1f and %.0f", MinSlowdownFactor, MaxSlowdownFactor), nil) } diff --git a/tools/openapi-postprocess.mjs b/tools/openapi-postprocess.mjs index cebb1a12d..43fb3ab68 100644 --- a/tools/openapi-postprocess.mjs +++ b/tools/openapi-postprocess.mjs @@ -371,6 +371,27 @@ function applyStringArrayPropertyBounds(schemaName, propertyName, maxItems, item property.items.maxLength = itemMaxLength; } +function applySlowdownSchemaConstraints() { + const oneOf = [ + { type: "number", enum: [0] }, + { type: "number", minimum: 0.1, maximum: 10 }, + ]; + for (const name of [ + "admin.upsertVirtualModelRequest", + "virtualmodels.View", + "virtualmodels.VirtualModel", + ]) { + const properties = schema(name).properties; + if (!properties?.slowdown) { + throw new Error(`missing slowdown property on schema: ${name}`); + } + properties.slowdown = { + description: properties.slowdown.description, + oneOf: clone(oneOf), + }; + } +} + // applyPathSidebarTitles sets the API Reference sidebar entry of every // operation to its path so endpoints are listed by URL rather than by // natural-language summary. Mintlify renders the HTTP method as a colored @@ -440,6 +461,7 @@ ensureRequiredProperty("admin.deleteModelPricingOverrideRequest", "selector"); ensureRequiredProperty("core.ResponsesConversationRef", "id"); applyBudgetKeySchemaConstraints(); applyStringArrayPropertyBounds("admin.upsertVirtualModelRequest", "user_paths", 100, 1024); +applySlowdownSchemaConstraints(); applyPricingSchemaConstraints(); applyPathSidebarTitles(); diff --git a/web/dashboard/src/pages/models/ModelRow.svelte b/web/dashboard/src/pages/models/ModelRow.svelte index 345c33071..075b89ca4 100644 --- a/web/dashboard/src/pages/models/ModelRow.svelte +++ b/web/dashboard/src/pages/models/ModelRow.svelte @@ -25,14 +25,15 @@ let { row, columns } = $props(); const pricing = $derived(pricingOverrides.modelRowPricing(row)); + const configuredSlowdown = $derived( + row.is_alias + ? row.alias && row.alias.slowdown + : row.masking_alias && row.masking_alias.slowdown != null + ? row.masking_alias.slowdown + : row.access && row.access.override && row.access.override.slowdown, + ); const slowdown = $derived( - Number( - row.is_alias - ? row.alias && row.alias.slowdown - : (row.masking_alias && row.masking_alias.slowdown) || - (row.access && row.access.override && row.access.override.slowdown) || - 0, - ), + Number(configuredSlowdown == null ? 0 : configuredSlowdown), ); diff --git a/web/dashboard/src/pages/models/VirtualModelEditor.svelte b/web/dashboard/src/pages/models/VirtualModelEditor.svelte index f2fcbe2b3..31e66deed 100644 --- a/web/dashboard/src/pages/models/VirtualModelEditor.svelte +++ b/web/dashboard/src/pages/models/VirtualModelEditor.svelte @@ -180,7 +180,7 @@ Adds a fraction of measured inference time: 0.5 adds 50%. Streaming chunks are buffered - and released on the slowed timeline. Leave empty to disable; accepted values are 0.1–10. + and released on the slowed timeline. Use 0 to override inherited slowdown, or leave empty + to inherit it; active values are 0.1–10. {/if} diff --git a/web/dashboard/src/pages/models/virtualModels.svelte.js b/web/dashboard/src/pages/models/virtualModels.svelte.js index 96ed4a95a..dc2f2c860 100644 --- a/web/dashboard/src/pages/models/virtualModels.svelte.js +++ b/web/dashboard/src/pages/models/virtualModels.svelte.js @@ -429,9 +429,7 @@ class VirtualModelsStore { user_paths: Array.isArray(alias.user_paths) ? alias.user_paths : [], description: String(alias.description || "").trim(), enabled: alias.enabled !== false, - ...(Number(alias.slowdown || 0) > 0 - ? { slowdown: Number(alias.slowdown) } - : {}), + ...(alias.slowdown != null ? { slowdown: Number(alias.slowdown) } : {}), }, operation: "virtual model redirect", failureMessage: "Failed to remove redirect.", @@ -607,7 +605,7 @@ class VirtualModelsStore { session_affinity: alias.session_affinity !== false, user_paths: (Array.isArray(alias.user_paths) ? alias.user_paths : []).join("\n"), description: alias.description || "", - slowdown: alias.slowdown || "", + slowdown: alias.slowdown ?? "", enabled: alias.enabled !== false, }; } @@ -652,7 +650,7 @@ class VirtualModelsStore { strategy: "round_robin", user_paths: userPaths.join("\n"), description: override && override.description ? override.description : "", - slowdown: override && override.slowdown ? override.slowdown : "", + slowdown: override && override.slowdown != null ? override.slowdown : "", enabled: overrideEnabled, }; } @@ -681,7 +679,7 @@ class VirtualModelsStore { strategy: "round_robin", user_paths: userPaths.join("\n"), description: override && override.description ? override.description : "", - slowdown: override && override.slowdown ? override.slowdown : "", + slowdown: override && override.slowdown != null ? override.slowdown : "", enabled: override ? override.enabled !== false : defaultEnabled, }; } diff --git a/web/dashboard/src/pages/models/virtualModelsLogic.js b/web/dashboard/src/pages/models/virtualModelsLogic.js index 2f42d2555..bd28ccb7f 100644 --- a/web/dashboard/src/pages/models/virtualModelsLogic.js +++ b/web/dashboard/src/pages/models/virtualModelsLogic.js @@ -214,7 +214,7 @@ export function mapRedirectView(view) { // Tri-state on the wire; only explicit false disables session affinity. session_affinity: view.session_affinity !== false, description: view.description || "", - slowdown: Number(view.slowdown || 0), + slowdown: view.slowdown == null ? null : Number(view.slowdown), enabled: view.enabled !== false, managed: Boolean(view.managed), valid: Boolean(view.valid), @@ -243,7 +243,7 @@ export function splitVirtualModelViews(views) { model: view.model || "", user_paths: Array.isArray(view.user_paths) ? view.user_paths : [], description: view.description || "", - slowdown: Number(view.slowdown || 0), + slowdown: view.slowdown == null ? null : Number(view.slowdown), enabled: view.enabled !== false, managed: Boolean(view.managed), scope_kind: view.scope_kind || "", @@ -834,9 +834,12 @@ export function buildVirtualModelSavePayload(form, originalSource, mode) { description: String((form && form.description) || "").trim(), enabled: Boolean(form && form.enabled), }; - const slowdown = Number((form && form.slowdown) || 0); - if (Number.isFinite(slowdown) && slowdown !== 0) { - payload.slowdown = slowdown; + const slowdownInput = form && form.slowdown; + if (slowdownInput !== "" && slowdownInput != null) { + const slowdown = Number(slowdownInput); + if (Number.isFinite(slowdown)) { + payload.slowdown = slowdown; + } } if (isRename) { // Carry the prior key so the backend moves the row instead of leaving an @@ -879,9 +882,11 @@ export function buildAliasTogglePayload(alias) { user_paths: Array.isArray(alias.user_paths) ? alias.user_paths : [], enabled: alias.enabled === false, }; - const slowdown = Number(alias.slowdown || 0); - if (slowdown > 0) { - payload.slowdown = slowdown; + if (alias.slowdown != null) { + const slowdown = Number(alias.slowdown); + if (Number.isFinite(slowdown)) { + payload.slowdown = slowdown; + } } const lbTargets = Array.isArray(alias.targets) ? alias.targets : []; if (lbTargets.length > 1) { @@ -912,11 +917,14 @@ export function buildModelTogglePayload(selector, existingPolicy, access) { const existingPaths = existingPolicy && Array.isArray(existingPolicy.user_paths) ? existingPolicy.user_paths : []; const existingDescription = String((existingPolicy && existingPolicy.description) || "").trim(); - const existingSlowdown = Number((existingPolicy && existingPolicy.slowdown) || 0); + const hasExistingSlowdown = Boolean(existingPolicy && existingPolicy.slowdown != null); + const existingSlowdown = Number(hasExistingSlowdown ? existingPolicy.slowdown : 0); const preserved = {}; if (existingDescription) preserved.description = existingDescription; - if (existingSlowdown > 0) preserved.slowdown = existingSlowdown; + if (hasExistingSlowdown && Number.isFinite(existingSlowdown)) { + preserved.slowdown = existingSlowdown; + } let method = "PUT"; let payload; @@ -926,7 +934,7 @@ export function buildModelTogglePayload(selector, existingPolicy, access) { existingPolicy && existingPaths.length === 0 && !existingDescription && - existingSlowdown === 0 && + !hasExistingSlowdown && safeAccess.default_enabled !== false ) { // Removing a path-less policy only enables the model when the default is diff --git a/web/dashboard/tests/models-virtual-models.test.js b/web/dashboard/tests/models-virtual-models.test.js index 24e9ab5af..ada650233 100644 --- a/web/dashboard/tests/models-virtual-models.test.js +++ b/web/dashboard/tests/models-virtual-models.test.js @@ -367,6 +367,16 @@ test("buildModelTogglePayload preserves a configured slowdown instead of deletin assert.equal(payload.slowdown, 0.5); }); +test("buildModelTogglePayload preserves an explicit zero slowdown override", () => { + const { method, payload } = buildModelTogglePayload( + "openai/gpt-4o", + { selector: "openai/gpt-4o", user_paths: [], enabled: false, slowdown: 0 }, + { selector: "openai/gpt-4o", default_enabled: true, effective_enabled: false }, + ); + assert.equal(method, "PUT"); + assert.equal(payload.slowdown, 0); +}); + test("buildAliasTogglePayload flips an alias enabled flag preserving the target", () => { const payload = buildAliasTogglePayload({ name: "smart", @@ -395,6 +405,16 @@ test("buildAliasTogglePayload preserves an alias slowdown", () => { assert.equal(payload.slowdown, 1.5); }); +test("buildAliasTogglePayload preserves an explicit zero slowdown", () => { + const payload = buildAliasTogglePayload({ + name: "fast", + target_model: "openai/gpt-4o", + slowdown: 0, + enabled: true, + }); + assert.equal(payload.slowdown, 0); +}); + test("buildAliasTogglePayload round-trips every target and strategy for a cost alias", () => { const payload = buildAliasTogglePayload({ name: "smart", @@ -480,7 +500,7 @@ test("save payload sends a policy body when target_model is empty", () => { }); }); -test("save payload includes a configured slowdown and omits disabled slowdown", () => { +test("save payload distinguishes configured slowdown, explicit zero, and inherited slowdown", () => { const configured = buildVirtualModelSavePayload( { source: "slow", target_model: "openai/gpt-4o", targets: [], slowdown: 2.5, enabled: true }, "", @@ -495,6 +515,13 @@ test("save payload includes a configured slowdown and omits disabled slowdown", ); assert.equal(Object.prototype.hasOwnProperty.call(disabled.payload, "slowdown"), false); + const explicitlyDisabled = buildVirtualModelSavePayload( + { source: "fast", target_model: "openai/gpt-4o", targets: [], slowdown: 0, enabled: true }, + "", + "create", + ); + assert.equal(explicitlyDisabled.payload.slowdown, 0); + const invalid = buildVirtualModelSavePayload( { source: "invalid", target_model: "openai/gpt-4o", targets: [], slowdown: 10.1, enabled: true }, "", From 4d2dbd10ba69c338b9b480304ff358f326e445c9 Mon Sep 17 00:00:00 2001 From: "Jakub A. W" Date: Tue, 11 Aug 2026 13:50:17 +0200 Subject: [PATCH 3/4] test(slowdown): cover cancellation lifecycle --- internal/server/audio_service_test.go | 17 +++++++-- internal/streaming/slowdown_stream_test.go | 43 +++++++++++++++------- internal/virtualmodels/slowdown_test.go | 10 +++++ internal/virtualmodels/types.go | 4 ++ 4 files changed, 57 insertions(+), 17 deletions(-) diff --git a/internal/server/audio_service_test.go b/internal/server/audio_service_test.go index cdc6a5b0a..a3c0581ff 100644 --- a/internal/server/audio_service_test.go +++ b/internal/server/audio_service_test.go @@ -36,6 +36,8 @@ type audioMockProvider struct { providerDelay time.Duration providerCalled chan struct{} providerCalledOnce sync.Once + providerCompleted chan struct{} + providerCompletedOnce sync.Once } // ResolveModel lets the fake stand in for the Router so the service can authorize @@ -83,6 +85,9 @@ func (m *audioMockProvider) waitForAudioResponse() { if m.providerDelay > 0 { time.Sleep(m.providerDelay) } + if m.providerCompleted != nil { + m.providerCompletedOnce.Do(func() { close(m.providerCompleted) }) + } } type audioSlowdownResolver struct { @@ -174,9 +179,10 @@ func TestAudioSlowdownAppliesAfterInferenceAndHonorsCancellation(t *testing.T) { t.Run(tt.name+" cancellation", func(t *testing.T) { resolver := &audioSlowdownResolver{factor: 10} provider := &audioMockProvider{ - mockProvider: &mockProvider{supportedModels: []string{tt.model}}, - providerDelay: 15 * time.Millisecond, - providerCalled: make(chan struct{}), + mockProvider: &mockProvider{supportedModels: []string{tt.model}}, + providerDelay: 15 * time.Millisecond, + providerCalled: make(chan struct{}), + providerCompleted: make(chan struct{}), } tt.response(provider) handler := newHandler(provider, nil, nil, nil, resolver, nil, nil, nil) @@ -194,6 +200,11 @@ func TestAudioSlowdownAppliesAfterInferenceAndHonorsCancellation(t *testing.T) { case <-time.After(time.Second): t.Fatal("provider was not called") } + select { + case <-provider.providerCompleted: + case <-time.After(time.Second): + t.Fatal("provider did not complete") + } cancel() select { case <-done: diff --git a/internal/streaming/slowdown_stream_test.go b/internal/streaming/slowdown_stream_test.go index 59febb374..434380254 100644 --- a/internal/streaming/slowdown_stream_test.go +++ b/internal/streaming/slowdown_stream_test.go @@ -56,22 +56,37 @@ func TestSlowdownStreamReadStopsOnCancellation(t *testing.T) { } func TestSlowdownStreamCancellationClosesBlockedUpstream(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - source := newBlockingCloseSource() - stream := NewSlowdownStream(ctx, source, 1, time.Now()) - t.Cleanup(func() { _ = stream.Close() }) - - select { - case <-source.readStarted: - case <-time.After(time.Second): - t.Fatal("upstream Read did not start") + tests := []struct { + name string + shutdown func(context.CancelFunc, io.Closer) + }{ + {name: "parent context cancellation", shutdown: func(cancel context.CancelFunc, _ io.Closer) { cancel() }}, + {name: "explicit stream close", shutdown: func(_ context.CancelFunc, stream io.Closer) { _ = stream.Close() }}, } - cancel() - select { - case <-source.closed: - case <-time.After(time.Second): - t.Fatal("upstream Close was not called after cancellation") + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + source := newBlockingCloseSource() + stream := NewSlowdownStream(ctx, source, 1, time.Now()) + t.Cleanup(func() { + cancel() + _ = stream.Close() + }) + + select { + case <-source.readStarted: + case <-time.After(time.Second): + t.Fatal("upstream Read did not start") + } + tt.shutdown(cancel, stream) + + select { + case <-source.closed: + case <-time.After(time.Second): + t.Fatal("upstream Close was not called after shutdown") + } + }) } } diff --git a/internal/virtualmodels/slowdown_test.go b/internal/virtualmodels/slowdown_test.go index 8923b68ea..dd8e4bda0 100644 --- a/internal/virtualmodels/slowdown_test.go +++ b/internal/virtualmodels/slowdown_test.go @@ -91,6 +91,16 @@ func TestResolveSlowdown(t *testing.T) { } } +func TestVirtualModelCloneDoesNotShareSlowdown(t *testing.T) { + original := VirtualModel{Slowdown: new(0.5)} + cloned := original.clone() + + *cloned.Slowdown = 1 + if *original.Slowdown != 0.5 { + t.Fatalf("mutating clone changed original slowdown to %v", *original.Slowdown) + } +} + func TestUpsertValidatesSlowdown(t *testing.T) { tests := []struct { name string diff --git a/internal/virtualmodels/types.go b/internal/virtualmodels/types.go index d567edcf4..411c0234f 100644 --- a/internal/virtualmodels/types.go +++ b/internal/virtualmodels/types.go @@ -116,6 +116,10 @@ func (v VirtualModel) Kind() string { // clone returns a deep copy of the virtual model so snapshot consumers cannot // mutate cached slices. func (v VirtualModel) clone() VirtualModel { + if v.Slowdown != nil { + slowdown := *v.Slowdown + v.Slowdown = &slowdown + } if len(v.Targets) > 0 { v.Targets = append([]Target(nil), v.Targets...) } From 08c345bfd502875bd9e5c12a33cd02b0b16114c4 Mon Sep 17 00:00:00 2001 From: "Jakub A. W" Date: Tue, 11 Aug 2026 13:54:42 +0200 Subject: [PATCH 4/4] fix(streaming): retain terminal slowdown errors --- internal/streaming/slowdown_stream.go | 25 ++++++----- internal/streaming/slowdown_stream_test.go | 51 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/internal/streaming/slowdown_stream.go b/internal/streaming/slowdown_stream.go index 6719c3823..4dff96e58 100644 --- a/internal/streaming/slowdown_stream.go +++ b/internal/streaming/slowdown_stream.go @@ -54,6 +54,7 @@ type slowdownStream struct { mu sync.Mutex queue []slowdownChunk closed bool + terminalErr error closeOnce sync.Once sourceCloseOnce sync.Once sourceCloseErr error @@ -119,9 +120,9 @@ func (s *slowdownStream) Read(p []byte) (int, error) { return 0, nil } for { - chunk, ok, closed := s.peek() - if closed { - return 0, io.ErrClosedPipe + chunk, ok, err := s.peek() + if err != nil { + return 0, err } if !ok { select { @@ -161,26 +162,30 @@ func (s *slowdownStream) Read(p []byte) (int, error) { s.mu.Unlock() return n, nil } - err := front.err - s.popLocked() - s.mu.Unlock() + err = front.err if err == nil { err = io.EOF } + s.terminalErr = err + s.popLocked() + s.mu.Unlock() return 0, err } } -func (s *slowdownStream) peek() (slowdownChunk, bool, bool) { +func (s *slowdownStream) peek() (slowdownChunk, bool, error) { s.mu.Lock() defer s.mu.Unlock() if s.closed { - return slowdownChunk{}, false, true + return slowdownChunk{}, false, io.ErrClosedPipe + } + if s.terminalErr != nil { + return slowdownChunk{}, false, s.terminalErr } if len(s.queue) == 0 { - return slowdownChunk{}, false, false + return slowdownChunk{}, false, nil } - return s.queue[0], true, false + return s.queue[0], true, nil } func (s *slowdownStream) popLocked() { diff --git a/internal/streaming/slowdown_stream_test.go b/internal/streaming/slowdown_stream_test.go index 434380254..9841a5576 100644 --- a/internal/streaming/slowdown_stream_test.go +++ b/internal/streaming/slowdown_stream_test.go @@ -2,7 +2,9 @@ package streaming import ( "context" + "errors" "io" + "strings" "sync" "sync/atomic" "testing" @@ -55,6 +57,49 @@ func TestSlowdownStreamReadStopsOnCancellation(t *testing.T) { } } +func TestSlowdownStreamPreservesTerminalError(t *testing.T) { + sourceErr := errors.New("upstream failed") + tests := []struct { + name string + source io.ReadCloser + firstChunk string + wantErr error + }{ + {name: "EOF", source: io.NopCloser(strings.NewReader("x")), firstChunk: "x", wantErr: io.EOF}, + {name: "source error", source: io.NopCloser(terminalErrorReader{err: sourceErr}), wantErr: sourceErr}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stream := NewSlowdownStream(context.Background(), tt.source, 0.1, time.Now().Add(-time.Second)) + t.Cleanup(func() { _ = stream.Close() }) + buf := make([]byte, 8) + if tt.firstChunk != "" { + n, err := stream.Read(buf) + if err != nil || string(buf[:n]) != tt.firstChunk { + t.Fatalf("first Read() = (%q, %v), want (%q, nil)", buf[:n], err, tt.firstChunk) + } + } + + for read := 1; read <= 2; read++ { + result := make(chan error, 1) + go func() { + _, err := stream.Read(buf) + result <- err + }() + select { + case err := <-result: + if !errors.Is(err, tt.wantErr) { + t.Fatalf("terminal Read() %d error = %v, want %v", read, err, tt.wantErr) + } + case <-time.After(time.Second): + t.Fatalf("terminal Read() %d blocked", read) + } + } + }) + } +} + func TestSlowdownStreamCancellationClosesBlockedUpstream(t *testing.T) { tests := []struct { name string @@ -134,3 +179,9 @@ func (s *blockingCloseSource) Close() error { s.closeOnce.Do(func() { close(s.closed) }) return nil } + +type terminalErrorReader struct { + err error +} + +func (r terminalErrorReader) Read([]byte) (int, error) { return 0, r.err }