From 0167f798381e1c1dd8861d51c97ea157ea3b8b01 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 18:28:21 +0200 Subject: [PATCH 1/5] feat(ui): group nav into 4 sections + sub-tabs with hash routing Replace the 11-item flat top bar with Overview / Serving / Observe / Admin / Playground, each revealing sub-tabs. Hash routing (#/section/tab) makes sub-tabs deep-linkable and reload-safe. Services splits into routes/profiles sub-tabs via a mode prop. All existing views re-homed unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../{index-Drstn1oh.js => index-Ccb3uXli.js} | 6 +- src/berth/ui/index.html | 2 +- ui/src/App.tsx | 105 +++--------------- ui/src/components/SubTabs.tsx | 31 ++++++ ui/src/components/TopNav.tsx | 38 +++++++ ui/src/hashRoute.ts | 26 +++++ ui/src/nav.ts | 55 +++++++++ ui/src/views/Services.tsx | 81 ++++++++------ ui/src/views/serving/Profiles.tsx | 5 + ui/src/views/serving/Routes.tsx | 5 + 10 files changed, 227 insertions(+), 127 deletions(-) rename src/berth/ui/assets/{index-Drstn1oh.js => index-Ccb3uXli.js} (83%) create mode 100644 ui/src/components/SubTabs.tsx create mode 100644 ui/src/components/TopNav.tsx create mode 100644 ui/src/hashRoute.ts create mode 100644 ui/src/nav.ts create mode 100644 ui/src/views/serving/Profiles.tsx create mode 100644 ui/src/views/serving/Routes.tsx diff --git a/src/berth/ui/assets/index-Drstn1oh.js b/src/berth/ui/assets/index-Ccb3uXli.js similarity index 83% rename from src/berth/ui/assets/index-Drstn1oh.js rename to src/berth/ui/assets/index-Ccb3uXli.js index 0017498..ee7e0e0 100644 --- a/src/berth/ui/assets/index-Drstn1oh.js +++ b/src/berth/ui/assets/index-Ccb3uXli.js @@ -6,6 +6,6 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r= `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` `+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function k(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),pn=!1;if(fn)try{var mn={};Object.defineProperty(mn,"passive",{get:function(){pn=!0}}),window.addEventListener(`test`,mn,mn),window.removeEventListener(`test`,mn,mn)}catch{pn=!1}var hn=null,gn=null,_n=null;function vn(){if(_n)return _n;var e,t=gn,n=t.length,r,i=`value`in hn?hn.value:hn.textContent,a=i.length;for(e=0;e=Xn),$n=` `,er=!1;function tr(e,t){switch(e){case`keyup`:return Jn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function nr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var rr=!1;function ir(e,t){switch(e){case`compositionend`:return nr(t);case`keypress`:return t.which===32?(er=!0,$n):null;case`textInput`:return e=t.data,e===$n&&er?null:e;default:return null}}function ar(e,t){if(rr)return e===`compositionend`||!Yn&&tr(e,t)?(e=vn(),_n=gn=hn=null,rr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Dr(n)}}function kr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?kr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ar(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=zt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=zt(e.document)}return t}function jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Mr=fn&&`documentMode`in document&&11>=document.documentMode,Nr=null,Pr=null,Fr=null,Ir=!1;function Lr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ir||Nr==null||Nr!==zt(r)||(r=Nr,`selectionStart`in r&&jr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Fr&&Er(Fr,r)||(Fr=r,r=Ed(Pr,`onSelect`),0>=o,i-=o,ki=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),L&&ji(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),L&&ji(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return L&&ji(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),L&&ji(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=gi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=hi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=yi(o,e.mode,c),c.return=e,e=c}return s(e);case w:return o=Aa(o),b(e,r,o,c)}if(ue(o))return h(e,r,o,c);if(se(o)){if(l=se(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===S)return b(e,r,ia(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=_i(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=di(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ci(e),si(e,null,n),t}return ii(e,r,t,n),ci(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Fs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,de,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ra(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ai(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Tr(s,o))return ii(e,t,i,0),K===null&&ri(),!1}catch{}if(n=ai(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ai(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var zs={readContext:ra,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ra,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ra,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(L){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(L){var n=Ai,r=ki;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[mt]=t,o[ht]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ve.current,Ui(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ii,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Bi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ui(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ui(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Zi(t.type),U(t),null;case 19:if(he(R),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)mi(n,e),n=n.sibling;return D(R,R.current&1|2),L&&ji(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!L)return U(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=R.current,D(R,a?n&1|2:n&1),L&&ji(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&he(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Zi(la),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Pi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Zi(la),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(R),null;case 4:return xe(),null;case 10:return Zi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&he(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Zi(la),null;case 25:return null;default:return null}}function Vc(e,t){switch(Pi(t),t.tag){case 3:Zi(la),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:he(R);break;case 10:Zi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&he(ba);break;case 24:Zi(la)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Ar(e),jr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[mt]=e,wt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Or(s,h),v=Or(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,o)}catch{}return!0}finally{E.p=a,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=xi(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=xi(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=oi(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||k(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function kt(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function At(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function jt(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function Mt({d:e,modelName:t}){let n=jt(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Nt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(Mt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Pt(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),r=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),i=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[a,o]=(0,k.useState)(!1),[s,c]=(0,k.useState)(null),[l,u]=(0,k.useState)(``),d=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),f=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),p=t.data??[],m=p.filter(e=>e.status===`ready`||e.status===`loading`),h=a?p:m,g=p.length-h.length;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`dashboard`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=i.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,n=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:n===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(n.data??[]).length,` gpu / `,m.length,` active`]})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),(0,A.jsx)(`div`,{className:`grid gap-12 `+At((n.data??[]).length),children:(n.data??[]).map(e=>(0,A.jsx)(Nt,{g:e,deployments:p,models:r.data??[]},e.index))})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:a,onChange:e=>o(e.target.checked)}),`show stopped `,g>0&&!a&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,g,`)`]})]})]}),l&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:l}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[h.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),h.map(e=>{let t=(r.data??[]).find(t=>t.id===e.model_id),n=(i.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,o=s===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:n===`local`?`text-mute`:`text-accent`,children:n})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ot,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:kt(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:o,onClick:()=>f.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:o,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&d.mutate(e.id)},children:o?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Ft(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function It(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function Lt(e){return e&&e!==`local`?e:null}var Rt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},zt=e=>new Promise(t=>setTimeout(t,e));function Bt(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Vt(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await zt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Ht(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Rt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Ft(f.gpuIds),n=It(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=Lt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Bt(t))throw t;return Vt(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Rt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Rt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function Ut(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}var Wt={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function Gt({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function Kt(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??Wt,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(Gt,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(Gt,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(Gt,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(Gt,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(Gt,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(Gt,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(Gt,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(Gt,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(Gt,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(Gt,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var qt={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function Jt(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` -`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function Yt({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function Xt({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function Zt({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function Qt(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...qt}),[o,s]=(0,k.useState)({model:``,...qt}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...qt,model:e.model,pending:!0})),n&&s(e=>({...e,...qt,model:e.model,pending:!0}));let t=[Jt(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(Jt(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(Xt,{stats:i.stats})]}),(0,A.jsx)(Yt,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(Xt,{stats:o.stats})]}),(0,A.jsx)(Yt,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(Zt,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(Zt,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function $t(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function en({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function tn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function nn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(tn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[$t(o),` total`]})]}),(0,A.jsx)(tn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function rn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(en,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(nn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function an(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function on(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=an(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>an(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function sn({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function cn(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function ln({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:cn(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:cn(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function un({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(ln,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var dn={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},fn={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function pn(){let e=rt(),t=j({queryKey:N.profiles,queryFn:F.listProfiles}),n=j({queryKey:N.routes,queryFn:F.listRoutes}),r=j({queryKey:N.models,queryFn:F.listModels}),i=j({queryKey:N.backends,queryFn:F.listBackends}),a=j({queryKey:N.nodes,queryFn:F.listNodes}),o=t.data??[],s=n.data??[],c=o.length>0,[l,u]=(0,k.useState)(dn),[d,f]=(0,k.useState)(``),[p,m]=(0,k.useState)(``),h=M({mutationFn:()=>{let e=Ft(l.gpu_ids),t=It(l.max_model_len);return F.createProfile({name:l.name.trim(),model_name:l.model_name.trim(),hf_repo:l.hf_repo.trim(),backend:l.backend||void 0,gpu_ids:e,max_model_len:t,pinned:l.pinned,node_label:Lt(l.node_label)})},onMutate:()=>f(``),onError:e=>f(e.message),onSuccess:()=>{u(dn),e.invalidateQueries({queryKey:N.profiles})}}),g=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>m(``),onError:e=>m(e.message),onSuccess:()=>e.invalidateQueries({queryKey:N.deployments})}),_=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>m(``),onError:e=>m(e.message),onSuccess:()=>{e.invalidateQueries({queryKey:N.profiles}),e.invalidateQueries({queryKey:N.routes})}}),[v,y]=(0,k.useState)(fn),[b,x]=(0,k.useState)(``),ee=M({mutationFn:()=>{let e=Number(v.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:v.name.trim(),match_model:v.match_model.trim(),profile_name:v.profile_name,fallback_profile_name:v.fallback_profile_name||null,priority:e})},onMutate:()=>x(``),onError:e=>x(e.message),onSuccess:()=>{y(fn),e.invalidateQueries({queryKey:N.routes})}}),S=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>e.invalidateQueries({queryKey:N.routes})}),[C,te]=(0,k.useState)(``),[ne,re]=(0,k.useState)(null),w=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>re(e),onError:()=>re(null)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`services`}),(0,A.jsxs)(`div`,{className:`label`,children:[o.length,` profiles / `,s.length,` routes`]})]}),(0,A.jsx)(sn,{profiles:o,models:r.data??[],backends:i.data??[],nodes:a.data?.nodes??[],form:l,setForm:u,formError:d,actionError:p,createProfile:h,deployProfile:g,deleteProfile:_}),(0,A.jsx)(un,{profiles:o,routes:s,hasProfiles:c,form:v,setForm:y,routeError:b,createRoute:ee,deleteRoute:S,dryRunModel:C,setDryRunModel:te,dryRunResult:ne,setDryRunResult:re,dryRun:w})]})}function mn(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function hn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function gn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function _n(e){switch(gn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function vn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${mn(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:mn(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:mn(r)})]})]})]})}function yn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${_n(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):mn(hn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(vn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function bn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return an(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>gn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(yn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function xn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function Sn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Cn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function wn(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Tn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function En(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function Dn({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function On({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${En(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Tn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Cn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Cn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:wn(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(Dn,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(Dn,{values:r.series.request_rate})]})]})]})}function kn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function An({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Cn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function jn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${En(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Tn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Cn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Cn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:wn(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(kn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(An,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function Mn({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Cn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Cn(t.total_vram_mb)]})]})]})}function Nn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(kn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(xn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(xn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(xn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(xn,{label:`vram`,value:Cn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(Mn,{nodes:l})}),r.data&&(0,A.jsx)(Nn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(On,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(jn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(Sn,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function Fn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function In(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Ln=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Rn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` -`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Bn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Ln.filter(e=>e.group===`public`),s=Ln.filter(e=>e.group===`cluster`),c=Ln.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Rn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Rn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Rn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Fn(r.leader_url??`default`),children:In(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:zn(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Vn=[{id:`dashboard`,label:`dashboard`},{id:`cluster`,label:`cluster`},{id:`models`,label:`models`},{id:`adapters`,label:`adapters`},{id:`services`,label:`services`},{id:`predictor`,label:`predictor`},{id:`playground`,label:`playground`},{id:`requests`,label:`requests`},{id:`keys`,label:`keys`},{id:`logs`,label:`logs`},{id:`settings`,label:`settings`}];function Hn(){let[e,t]=(0,k.useState)(`dashboard`);return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Vn.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:()=>{Ct(),location.reload()},className:`label hover:text-dim transition-colors`,children:`sign out`})]})}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:[e===`dashboard`&&(0,A.jsx)(Pt,{}),e===`cluster`&&(0,A.jsx)(Pn,{}),e===`models`&&(0,A.jsx)(Ht,{}),e===`adapters`&&(0,A.jsx)(Ut,{}),e===`services`&&(0,A.jsx)(pn,{}),e===`predictor`&&(0,A.jsx)(Kt,{}),e===`playground`&&(0,A.jsx)(Qt,{}),e===`requests`&&(0,A.jsx)(bn,{}),e===`keys`&&(0,A.jsx)(rn,{}),e===`logs`&&(0,A.jsx)(on,{}),e===`settings`&&(0,A.jsx)(Bn,{})]},e)})]})})}var Un=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:Un,children:(0,A.jsx)(Hn,{})})})); \ No newline at end of file +`).replace(Ad,``)}function Md(e,t){return t=jd(t),jd(e)===t}function $(e,t,n,r,a,o){switch(n){case`children`:typeof r==`string`?t===`body`||t===`textarea`&&r===``||Jt(e,r):(typeof r==`number`||typeof r==`bigint`)&&t!==`body`&&Jt(e,``+r);break;case`className`:Mt(e,`class`,r);break;case`tabIndex`:Mt(e,`tabindex`,r);break;case`dir`:case`role`:case`viewBox`:case`width`:case`height`:Mt(e,n,r);break;case`style`:Zt(e,r,o);break;case`data`:if(t!==`object`){Mt(e,`data`,r);break}case`src`:case`href`:if(r===``&&(t!==`a`||n!==`href`)){e.removeAttribute(n);break}if(r==null||typeof r==`function`||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`action`:case`formAction`:if(typeof r==`function`){e.setAttribute(n,`javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')`);break}else typeof o==`function`&&(n===`formAction`?(t!==`input`&&$(e,t,`name`,a.name,a,null),$(e,t,`formEncType`,a.formEncType,a,null),$(e,t,`formMethod`,a.formMethod,a,null),$(e,t,`formTarget`,a.formTarget,a,null)):($(e,t,`encType`,a.encType,a,null),$(e,t,`method`,a.method,a,null),$(e,t,`target`,a.target,a,null)));if(r==null||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`onClick`:r!=null&&(e.onclick=nn);break;case`onScroll`:r!=null&&Q(`scroll`,e);break;case`onScrollEnd`:r!=null&&Q(`scrollend`,e);break;case`dangerouslySetInnerHTML`:if(r!=null){if(typeof r!=`object`||!(`__html`in r))throw Error(i(61));if(n=r.__html,n!=null){if(a.children!=null)throw Error(i(60));e.innerHTML=n}}break;case`multiple`:e.multiple=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`muted`:e.muted=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`suppressContentEditableWarning`:case`suppressHydrationWarning`:case`defaultValue`:case`defaultChecked`:case`innerHTML`:case`ref`:break;case`autoFocus`:break;case`xlinkHref`:if(r==null||typeof r==`function`||typeof r==`boolean`||typeof r==`symbol`){e.removeAttribute(`xlink:href`);break}n=tn(``+r),e.setAttributeNS(`http://www.w3.org/1999/xlink`,`xlink:href`,n);break;case`contentEditable`:case`spellCheck`:case`draggable`:case`value`:case`autoReverse`:case`externalResourcesRequired`:case`focusable`:case`preserveAlpha`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``+r):e.removeAttribute(n);break;case`inert`:case`allowFullScreen`:case`async`:case`autoPlay`:case`controls`:case`default`:case`defer`:case`disabled`:case`disablePictureInPicture`:case`disableRemotePlayback`:case`formNoValidate`:case`hidden`:case`loop`:case`noModule`:case`noValidate`:case`open`:case`playsInline`:case`readOnly`:case`required`:case`reversed`:case`scoped`:case`seamless`:case`itemScope`:r&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``):e.removeAttribute(n);break;case`capture`:case`download`:!0===r?e.setAttribute(n,``):!1!==r&&r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`cols`:case`rows`:case`size`:case`span`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case`rowSpan`:case`start`:r==null||typeof r==`function`||typeof r==`symbol`||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case`popover`:Q(`beforetoggle`,e),Q(`toggle`,e),jt(e,`popover`,r);break;case`xlinkActuate`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:actuate`,r);break;case`xlinkArcrole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:arcrole`,r);break;case`xlinkRole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:role`,r);break;case`xlinkShow`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:show`,r);break;case`xlinkTitle`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:title`,r);break;case`xlinkType`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:type`,r);break;case`xmlBase`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:base`,r);break;case`xmlLang`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:lang`,r);break;case`xmlSpace`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:space`,r);break;case`is`:jt(e,`is`,r);break;case`innerText`:case`textContent`:break;default:(!(2s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function kt(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function At(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function jt(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function Mt({d:e,modelName:t}){let n=jt(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Nt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(Mt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Pt(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),r=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),i=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[a,o]=(0,k.useState)(!1),[s,c]=(0,k.useState)(null),[l,u]=(0,k.useState)(``),d=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),f=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),p=t.data??[],m=p.filter(e=>e.status===`ready`||e.status===`loading`),h=a?p:m,g=p.length-h.length;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`dashboard`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=i.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,n=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:n===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(n.data??[]).length,` gpu / `,m.length,` active`]})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),(0,A.jsx)(`div`,{className:`grid gap-12 `+At((n.data??[]).length),children:(n.data??[]).map(e=>(0,A.jsx)(Nt,{g:e,deployments:p,models:r.data??[]},e.index))})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:a,onChange:e=>o(e.target.checked)}),`show stopped `,g>0&&!a&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,g,`)`]})]})]}),l&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:l}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[h.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),h.map(e=>{let t=(r.data??[]).find(t=>t.id===e.model_id),n=(i.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,o=s===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:n===`local`?`text-mute`:`text-accent`,children:n})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ot,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:kt(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:o,onClick:()=>f.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:o,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&d.mutate(e.id)},children:o?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Ft(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function It(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function Lt(e){return e&&e!==`local`?e:null}var Rt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},zt=e=>new Promise(t=>setTimeout(t,e));function Bt(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Vt(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await zt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Ht(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Rt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Ft(f.gpuIds),n=It(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=Lt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Bt(t))throw t;return Vt(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Rt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Rt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function Ut(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function Wt({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function Gt(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function Kt({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:Gt(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:Gt(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function qt({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(Kt,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var Jt={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},Yt={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function Xt({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(Jt),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Ft(u.gpu_ids),t=It(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:Lt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(Jt),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(Yt),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(Yt),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(Wt,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(qt,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function Zt(){return(0,A.jsx)(Xt,{mode:`routes`})}function Qt(){return(0,A.jsx)(Xt,{mode:`profiles`})}var $t={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function en({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function tn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??$t,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(en,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(en,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(en,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(en,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(en,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(en,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(en,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(en,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(en,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(en,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var nn={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function rn(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` +`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function an({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function on({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function sn({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function cn(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...nn}),[o,s]=(0,k.useState)({model:``,...nn}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...nn,model:e.model,pending:!0})),n&&s(e=>({...e,...nn,model:e.model,pending:!0}));let t=[rn(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(rn(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(on,{stats:i.stats})]}),(0,A.jsx)(an,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(on,{stats:o.stats})]}),(0,A.jsx)(an,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(sn,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(sn,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function ln(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function un({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function dn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function fn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(dn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[ln(o),` total`]})]}),(0,A.jsx)(dn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function pn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(un,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(fn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function mn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function hn(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=mn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>mn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function gn(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function _n(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function vn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function yn(e){switch(vn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function bn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${gn(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:gn(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:gn(r)})]})]})]})}function xn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${yn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):gn(_n(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(bn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function Sn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return mn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>vn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(xn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Cn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function wn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Tn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function En(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Dn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function On(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function kn({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function An({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${On(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Dn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Tn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Tn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:En(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(kn,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(kn,{values:r.series.request_rate})]})]})]})}function jn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Mn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Tn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Nn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${On(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Dn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Tn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Tn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:En(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(jn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Mn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function Pn({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Tn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Tn(t.total_vram_mb)]})]})]})}function Fn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(jn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Cn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Cn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Cn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Cn,{label:`vram`,value:Tn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(Pn,{nodes:l})}),r.data&&(0,A.jsx)(Fn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(An,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Nn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(wn,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function Ln(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function Rn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var zn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Bn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` +`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Hn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=zn.filter(e=>e.group===`public`),s=zn.filter(e=>e.group===`cluster`),c=zn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Bn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Bn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Bn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Ln(r.leader_url??`default`),children:Rn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Vn(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Un=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Pt}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:Pt},{id:`models`,label:`models`,component:Ht},{id:`adapters`,label:`adapters`,component:Ut},{id:`routes`,label:`routes`,component:Zt},{id:`profiles`,label:`profiles`,component:Qt}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:Sn},{id:`logs`,label:`logs`,component:hn},{id:`cluster`,label:`cluster`,component:In},{id:`predictor`,label:`predictor`,component:tn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:pn},{id:`settings`,label:`settings`,component:Hn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:cn}]}];function Wn(e){return Un.find(t=>t.id===e)??Un[0]}function Gn(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function Kn({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Un.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function qn({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function Jn(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function Yn(e,t){return t?`#/${e}/${t}`:`#/${e}`}function Xn(){let[e,t]=(0,k.useState)(()=>Jn(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(Jn(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=Yn(e,t)}]}function Zn(){let[e,t]=Xn(),n=Wn(e.section),r=Gn(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(Kn,{active:n.id,onSelect:e=>{let n=Wn(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(qn,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var Qn=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:Qn,children:(0,A.jsx)(Zn,{})})})); \ No newline at end of file diff --git a/src/berth/ui/index.html b/src/berth/ui/index.html index cdbcc32..a88e421 100644 --- a/src/berth/ui/index.html +++ b/src/berth/ui/index.html @@ -15,7 +15,7 @@ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> - + diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 8617cd4..1e4dcb1 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,101 +1,28 @@ -import { useState } from 'react' import TokenGate from './components/TokenGate' +import TopNav from './components/TopNav' +import SubTabs from './components/SubTabs' import { clearToken } from './api' -import Dashboard from './views/Dashboard' -import Models from './views/Models' -import Adapters from './views/Adapters' -import Predictor from './views/Predictor' -import Playground from './views/Playground' -import Keys from './views/Keys' -import Logs from './views/Logs' -import Services from './views/Services' -import Requests from './views/Requests' -import Cluster from './views/Cluster' -import Settings from './views/Settings' - -type View = - | 'dashboard' - | 'cluster' - | 'models' - | 'adapters' - | 'services' - | 'predictor' - | 'playground' - | 'requests' - | 'keys' - | 'logs' - | 'settings' - -const VIEWS: { id: View; label: string }[] = [ - { id: 'dashboard', label: 'dashboard' }, - { id: 'cluster', label: 'cluster' }, - { id: 'models', label: 'models' }, - { id: 'adapters', label: 'adapters' }, - { id: 'services', label: 'services' }, - { id: 'predictor', label: 'predictor' }, - { id: 'playground', label: 'playground' }, - { id: 'requests', label: 'requests' }, - { id: 'keys', label: 'keys' }, - { id: 'logs', label: 'logs' }, - { id: 'settings', label: 'settings' }, -] +import { findSection, findTab } from './nav' +import { useHashRoute } from './hashRoute' export default function App() { - const [view, setView] = useState('dashboard') + const [route, navigate] = useHashRoute() + const section = findSection(route.section) + const tab = findTab(section, route.tab ?? section.tabs[0].id) + const View = tab.component return (
-
-
-
-
- berth -
- -
- -
-
+ { const s = findSection(id); navigate(s.id, s.tabs[0].id) }} + onSignOut={() => { clearToken(); location.reload() }} + /> + navigate(section.id, t)} />
-
- {view === 'dashboard' && } - {view === 'cluster' && } - {view === 'models' && } - {view === 'adapters' && } - {view === 'services' && } - {view === 'predictor' && } - {view === 'playground' && } - {view === 'requests' && } - {view === 'keys' && } - {view === 'logs' && } - {view === 'settings' && } +
+
diff --git a/ui/src/components/SubTabs.tsx b/ui/src/components/SubTabs.tsx new file mode 100644 index 0000000..c9327f2 --- /dev/null +++ b/ui/src/components/SubTabs.tsx @@ -0,0 +1,31 @@ +import type { Section } from '../nav' + +export default function SubTabs({ section, activeTab, onSelect }: { + section: Section + activeTab: string + onSelect: (tabId: string) => void +}) { + if (section.tabs.length <= 1) return null + return ( +
+
+ {section.tabs.map(t => { + const on = activeTab === t.id + return ( + + ) + })} +
+
+ ) +} diff --git a/ui/src/components/TopNav.tsx b/ui/src/components/TopNav.tsx new file mode 100644 index 0000000..d228b1c --- /dev/null +++ b/ui/src/components/TopNav.tsx @@ -0,0 +1,38 @@ +import { NAV } from '../nav' + +export default function TopNav({ active, onSelect, onSignOut }: { + active: string + onSelect: (sectionId: string) => void + onSignOut: () => void +}) { + return ( +
+
+
+
berth
+ +
+ +
+
+ ) +} diff --git a/ui/src/hashRoute.ts b/ui/src/hashRoute.ts new file mode 100644 index 0000000..22d9849 --- /dev/null +++ b/ui/src/hashRoute.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react' + +export type Route = { section: string; tab: string | null } + +// '#/serving/models' -> { section:'serving', tab:'models' }; '' -> overview +export function parseHash(hash: string): Route { + const clean = hash.replace(/^#\/?/, '') + if (!clean) return { section: 'overview', tab: null } + const [section, tab] = clean.split('/') + return { section, tab: tab || null } +} + +export function formatHash(section: string, tab: string | null): string { + return tab ? `#/${section}/${tab}` : `#/${section}` +} + +export function useHashRoute(): [Route, (s: string, t: string | null) => void] { + const [route, setRoute] = useState(() => parseHash(location.hash)) + useEffect(() => { + const on = () => setRoute(parseHash(location.hash)) + window.addEventListener('hashchange', on) + return () => window.removeEventListener('hashchange', on) + }, []) + const nav = (s: string, t: string | null) => { location.hash = formatHash(s, t) } + return [route, nav] +} diff --git a/ui/src/nav.ts b/ui/src/nav.ts new file mode 100644 index 0000000..80e5c68 --- /dev/null +++ b/ui/src/nav.ts @@ -0,0 +1,55 @@ +import type { ComponentType } from 'react' +// Phase 1: Overview and Deployments are temporarily aliased to the existing +// Dashboard so the shell compiles before Phase 2 splits Dashboard apart. +import Dashboard from './views/Dashboard' +import Models from './views/Models' +import Adapters from './views/Adapters' +import Routes from './views/serving/Routes' +import Profiles from './views/serving/Profiles' +import Predictor from './views/Predictor' +import Playground from './views/Playground' +import Keys from './views/Keys' +import Logs from './views/Logs' +import Requests from './views/Requests' +import Cluster from './views/Cluster' +import Settings from './views/Settings' + +const Overview = Dashboard +const Deployments = Dashboard + +export type Tab = { id: string; label: string; component: ComponentType } +export type Section = { id: string; label: string; tabs: Tab[] } + +export const NAV: Section[] = [ + { id: 'overview', label: 'overview', tabs: [ + { id: 'overview', label: 'overview', component: Overview }, + ] }, + { id: 'serving', label: 'serving', tabs: [ + { id: 'deployments', label: 'deployments', component: Deployments }, + { id: 'models', label: 'models', component: Models }, + { id: 'adapters', label: 'adapters', component: Adapters }, + { id: 'routes', label: 'routes', component: Routes }, + { id: 'profiles', label: 'profiles', component: Profiles }, + ] }, + { id: 'observe', label: 'observe', tabs: [ + { id: 'requests', label: 'requests', component: Requests }, + { id: 'logs', label: 'logs', component: Logs }, + { id: 'cluster', label: 'cluster', component: Cluster }, + { id: 'predictor', label: 'predictor', component: Predictor }, + ] }, + { id: 'admin', label: 'admin', tabs: [ + { id: 'keys', label: 'keys', component: Keys }, + { id: 'settings', label: 'settings', component: Settings }, + ] }, + { id: 'playground', label: 'playground', tabs: [ + { id: 'playground', label: 'playground', component: Playground }, + ] }, +] + +export function findSection(id: string): Section { + return NAV.find(s => s.id === id) ?? NAV[0] +} + +export function findTab(section: Section, tabId: string): Tab { + return section.tabs.find(t => t.id === tabId) ?? section.tabs[0] +} diff --git a/ui/src/views/Services.tsx b/ui/src/views/Services.tsx index ce5b998..46f6df1 100644 --- a/ui/src/views/Services.tsx +++ b/ui/src/views/Services.tsx @@ -24,7 +24,9 @@ const emptyRouteForm: RouteFormState = { priority: '100', } -export default function Services() { +export type ServicesMode = 'both' | 'routes' | 'profiles' + +export default function Services({ mode = 'both' }: { mode?: ServicesMode }) { const qc = useQueryClient() const profiles = useQuery({ queryKey: queryKeys.profiles, queryFn: api.listProfiles }) const routes = useQuery({ queryKey: queryKeys.routes, queryFn: api.listRoutes }) @@ -116,44 +118,55 @@ export default function Services() { onError: () => setDryRunResult(null), }) + const showProfiles = mode === 'both' || mode === 'profiles' + const showRoutes = mode === 'both' || mode === 'routes' + const title = mode === 'routes' ? 'routes' : mode === 'profiles' ? 'profiles' : 'services' + const count = mode === 'routes' + ? `${routeList.length} routes` + : mode === 'profiles' + ? `${profileList.length} profiles` + : `${profileList.length} profiles / ${routeList.length} routes` + return (
-

services

-
- {profileList.length} profiles / {routeList.length} routes -
+

{title}

+
{count}
- - - + {showProfiles && ( + + )} + + {showRoutes && ( + + )}
) } diff --git a/ui/src/views/serving/Profiles.tsx b/ui/src/views/serving/Profiles.tsx new file mode 100644 index 0000000..ed2f337 --- /dev/null +++ b/ui/src/views/serving/Profiles.tsx @@ -0,0 +1,5 @@ +import Services from '../Services' + +export default function Profiles() { + return +} diff --git a/ui/src/views/serving/Routes.tsx b/ui/src/views/serving/Routes.tsx new file mode 100644 index 0000000..cfc4a23 --- /dev/null +++ b/ui/src/views/serving/Routes.tsx @@ -0,0 +1,5 @@ +import Services from '../Services' + +export default function Routes() { + return +} From e3384c6186d80a1ea41e89b5742912e2bcc52b93 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 18:31:15 +0200 Subject: [PATCH 2/5] feat(ui): split dashboard into Overview + Serving>Deployments Overview is now read-only monitoring (header summary + GPU health strip), with a placeholder for the Phase 4 request-stat tiles. The load/stop/pin control table moves to Serving>Deployments. GpuCard and Sparkline are promoted to components/ for reuse; the old Dashboard.tsx and cluster/Sparkline.tsx are retired. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../{index-Ccb3uXli.js => index-tJy0r6F4.js} | 6 +- src/berth/ui/index.html | 2 +- ui/src/components/GpuCard.tsx | 111 +++++++++++++ .../cluster => components}/Sparkline.tsx | 0 ui/src/nav.ts | 8 +- ui/src/views/cluster/NodeCard.tsx | 2 +- ui/src/views/overview/HealthStrip.tsx | 27 +++ ui/src/views/overview/Overview.tsx | 42 +++++ .../Deployments.tsx} | 155 +----------------- 9 files changed, 193 insertions(+), 160 deletions(-) rename src/berth/ui/assets/{index-Ccb3uXli.js => index-tJy0r6F4.js} (85%) create mode 100644 ui/src/components/GpuCard.tsx rename ui/src/{views/cluster => components}/Sparkline.tsx (100%) create mode 100644 ui/src/views/overview/HealthStrip.tsx create mode 100644 ui/src/views/overview/Overview.tsx rename ui/src/views/{Dashboard.tsx => serving/Deployments.tsx} (54%) diff --git a/src/berth/ui/assets/index-Ccb3uXli.js b/src/berth/ui/assets/index-tJy0r6F4.js similarity index 85% rename from src/berth/ui/assets/index-Ccb3uXli.js rename to src/berth/ui/assets/index-tJy0r6F4.js index ee7e0e0..07ffe95 100644 --- a/src/berth/ui/assets/index-Ccb3uXli.js +++ b/src/berth/ui/assets/index-tJy0r6F4.js @@ -6,6 +6,6 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r= `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` `+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function k(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),pn=!1;if(fn)try{var mn={};Object.defineProperty(mn,"passive",{get:function(){pn=!0}}),window.addEventListener(`test`,mn,mn),window.removeEventListener(`test`,mn,mn)}catch{pn=!1}var hn=null,gn=null,_n=null;function vn(){if(_n)return _n;var e,t=gn,n=t.length,r,i=`value`in hn?hn.value:hn.textContent,a=i.length;for(e=0;e=Xn),$n=` `,er=!1;function tr(e,t){switch(e){case`keyup`:return Jn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function nr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var rr=!1;function ir(e,t){switch(e){case`compositionend`:return nr(t);case`keypress`:return t.which===32?(er=!0,$n):null;case`textInput`:return e=t.data,e===$n&&er?null:e;default:return null}}function ar(e,t){if(rr)return e===`compositionend`||!Yn&&tr(e,t)?(e=vn(),_n=gn=hn=null,rr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Dr(n)}}function kr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?kr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ar(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=zt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=zt(e.document)}return t}function jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Mr=fn&&`documentMode`in document&&11>=document.documentMode,Nr=null,Pr=null,Fr=null,Ir=!1;function Lr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ir||Nr==null||Nr!==zt(r)||(r=Nr,`selectionStart`in r&&jr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Fr&&Er(Fr,r)||(Fr=r,r=Ed(Pr,`onSelect`),0>=o,i-=o,ki=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),L&&ji(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),L&&ji(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return L&&ji(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),L&&ji(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=gi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=hi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=yi(o,e.mode,c),c.return=e,e=c}return s(e);case w:return o=Aa(o),b(e,r,o,c)}if(ue(o))return h(e,r,o,c);if(se(o)){if(l=se(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===S)return b(e,r,ia(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=_i(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=di(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ci(e),si(e,null,n),t}return ii(e,r,t,n),ci(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Fs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,de,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ra(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ai(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Tr(s,o))return ii(e,t,i,0),K===null&&ri(),!1}catch{}if(n=ai(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ai(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var zs={readContext:ra,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ra,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ra,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(L){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(L){var n=Ai,r=ki;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[mt]=t,o[ht]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ve.current,Ui(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ii,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Bi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ui(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ui(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Zi(t.type),U(t),null;case 19:if(he(R),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)mi(n,e),n=n.sibling;return D(R,R.current&1|2),L&&ji(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!L)return U(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=R.current,D(R,a?n&1|2:n&1),L&&ji(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&he(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Zi(la),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Pi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Zi(la),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(R),null;case 4:return xe(),null;case 10:return Zi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&he(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Zi(la),null;case 25:return null;default:return null}}function Vc(e,t){switch(Pi(t),t.tag){case 3:Zi(la),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:he(R);break;case 10:Zi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&he(ba);break;case 24:Zi(la)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Ar(e),jr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[mt]=e,wt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Or(s,h),v=Or(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,o)}catch{}return!0}finally{E.p=a,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=xi(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=xi(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=oi(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||k(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function kt(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function At(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function jt(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function Mt({d:e,modelName:t}){let n=jt(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Nt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(Mt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Pt(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),r=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),i=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[a,o]=(0,k.useState)(!1),[s,c]=(0,k.useState)(null),[l,u]=(0,k.useState)(``),d=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),f=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{c(e),u(``)},onError:e=>u(e.message),onSettled:()=>{c(null),e.invalidateQueries({queryKey:N.deployments})}}),p=t.data??[],m=p.filter(e=>e.status===`ready`||e.status===`loading`),h=a?p:m,g=p.length-h.length;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`dashboard`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=i.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,n=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:n===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(n.data??[]).length,` gpu / `,m.length,` active`]})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),(0,A.jsx)(`div`,{className:`grid gap-12 `+At((n.data??[]).length),children:(n.data??[]).map(e=>(0,A.jsx)(Nt,{g:e,deployments:p,models:r.data??[]},e.index))})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:a,onChange:e=>o(e.target.checked)}),`show stopped `,g>0&&!a&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,g,`)`]})]})]}),l&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:l}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[h.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),h.map(e=>{let t=(r.data??[]).find(t=>t.id===e.model_id),n=(i.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,o=s===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:n===`local`?`text-mute`:`text-accent`,children:n})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ot,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:kt(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:o,onClick:()=>f.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:o,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&d.mutate(e.id)},children:o?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Ft(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function It(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function Lt(e){return e&&e!==`local`?e:null}var Rt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},zt=e=>new Promise(t=>setTimeout(t,e));function Bt(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Vt(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await zt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Ht(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Rt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Ft(f.gpuIds),n=It(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=Lt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Bt(t))throw t;return Vt(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Rt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Rt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function Ut(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function Wt({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function Gt(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function Kt({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:Gt(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:Gt(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function qt({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(Kt,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var Jt={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},Yt={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function Xt({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(Jt),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Ft(u.gpu_ids),t=It(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:Lt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(Jt),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(Yt),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(Yt),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(Wt,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(qt,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function Zt(){return(0,A.jsx)(Xt,{mode:`routes`})}function Qt(){return(0,A.jsx)(Xt,{mode:`profiles`})}var $t={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function en({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function tn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??$t,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(en,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(en,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(en,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(en,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(en,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(en,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(en,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(en,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(en,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(en,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var nn={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function rn(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` -`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function an({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function on({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function sn({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function cn(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...nn}),[o,s]=(0,k.useState)({model:``,...nn}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...nn,model:e.model,pending:!0})),n&&s(e=>({...e,...nn,model:e.model,pending:!0}));let t=[rn(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(rn(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(on,{stats:i.stats})]}),(0,A.jsx)(an,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(on,{stats:o.stats})]}),(0,A.jsx)(an,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(sn,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(sn,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function ln(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function un({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function dn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function fn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(dn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[ln(o),` total`]})]}),(0,A.jsx)(dn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function pn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(un,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(fn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function mn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function hn(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=mn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>mn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function gn(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function _n(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function vn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function yn(e){switch(vn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function bn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${gn(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:gn(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:gn(r)})]})]})]})}function xn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${yn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):gn(_n(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(bn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function Sn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return mn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>vn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(xn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Cn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function wn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Tn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function En(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Dn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function On(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function kn({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function An({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${On(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Dn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Tn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Tn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:En(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(kn,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(kn,{values:r.series.request_rate})]})]})]})}function jn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Mn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Tn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Nn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${On(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Dn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Tn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Tn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:En(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(jn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Mn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function Pn({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Tn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Tn(t.total_vram_mb)]})]})]})}function Fn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(jn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Cn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Cn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Cn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Cn,{label:`vram`,value:Tn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(Pn,{nodes:l})}),r.data&&(0,A.jsx)(Fn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(An,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Nn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(wn,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function Ln(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function Rn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var zn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Bn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` -`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Hn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=zn.filter(e=>e.group===`public`),s=zn.filter(e=>e.group===`cluster`),c=zn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Bn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Bn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Bn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Ln(r.leader_url??`default`),children:Rn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Vn(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Un=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Pt}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:Pt},{id:`models`,label:`models`,component:Ht},{id:`adapters`,label:`adapters`,component:Ut},{id:`routes`,label:`routes`,component:Zt},{id:`profiles`,label:`profiles`,component:Qt}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:Sn},{id:`logs`,label:`logs`,component:hn},{id:`cluster`,label:`cluster`,component:In},{id:`predictor`,label:`predictor`,component:tn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:pn},{id:`settings`,label:`settings`,component:Hn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:cn}]}];function Wn(e){return Un.find(t=>t.id===e)??Un[0]}function Gn(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function Kn({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Un.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function qn({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function Jn(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function Yn(e,t){return t?`#/${e}/${t}`:`#/${e}`}function Xn(){let[e,t]=(0,k.useState)(()=>Jn(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(Jn(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=Yn(e,t)}]}function Zn(){let[e,t]=Xn(),n=Wn(e.section),r=Gn(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(Kn,{active:n.id,onSelect:e=>{let n=Wn(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(qn,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var Qn=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:Qn,children:(0,A.jsx)(Zn,{})})})); \ No newline at end of file +`).replace(Ad,``)}function Md(e,t){return t=jd(t),jd(e)===t}function $(e,t,n,r,a,o){switch(n){case`children`:typeof r==`string`?t===`body`||t===`textarea`&&r===``||Jt(e,r):(typeof r==`number`||typeof r==`bigint`)&&t!==`body`&&Jt(e,``+r);break;case`className`:Mt(e,`class`,r);break;case`tabIndex`:Mt(e,`tabindex`,r);break;case`dir`:case`role`:case`viewBox`:case`width`:case`height`:Mt(e,n,r);break;case`style`:Zt(e,r,o);break;case`data`:if(t!==`object`){Mt(e,`data`,r);break}case`src`:case`href`:if(r===``&&(t!==`a`||n!==`href`)){e.removeAttribute(n);break}if(r==null||typeof r==`function`||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`action`:case`formAction`:if(typeof r==`function`){e.setAttribute(n,`javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')`);break}else typeof o==`function`&&(n===`formAction`?(t!==`input`&&$(e,t,`name`,a.name,a,null),$(e,t,`formEncType`,a.formEncType,a,null),$(e,t,`formMethod`,a.formMethod,a,null),$(e,t,`formTarget`,a.formTarget,a,null)):($(e,t,`encType`,a.encType,a,null),$(e,t,`method`,a.method,a,null),$(e,t,`target`,a.target,a,null)));if(r==null||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`onClick`:r!=null&&(e.onclick=nn);break;case`onScroll`:r!=null&&Q(`scroll`,e);break;case`onScrollEnd`:r!=null&&Q(`scrollend`,e);break;case`dangerouslySetInnerHTML`:if(r!=null){if(typeof r!=`object`||!(`__html`in r))throw Error(i(61));if(n=r.__html,n!=null){if(a.children!=null)throw Error(i(60));e.innerHTML=n}}break;case`multiple`:e.multiple=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`muted`:e.muted=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`suppressContentEditableWarning`:case`suppressHydrationWarning`:case`defaultValue`:case`defaultChecked`:case`innerHTML`:case`ref`:break;case`autoFocus`:break;case`xlinkHref`:if(r==null||typeof r==`function`||typeof r==`boolean`||typeof r==`symbol`){e.removeAttribute(`xlink:href`);break}n=tn(``+r),e.setAttributeNS(`http://www.w3.org/1999/xlink`,`xlink:href`,n);break;case`contentEditable`:case`spellCheck`:case`draggable`:case`value`:case`autoReverse`:case`externalResourcesRequired`:case`focusable`:case`preserveAlpha`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``+r):e.removeAttribute(n);break;case`inert`:case`allowFullScreen`:case`async`:case`autoPlay`:case`controls`:case`default`:case`defer`:case`disabled`:case`disablePictureInPicture`:case`disableRemotePlayback`:case`formNoValidate`:case`hidden`:case`loop`:case`noModule`:case`noValidate`:case`open`:case`playsInline`:case`readOnly`:case`required`:case`reversed`:case`scoped`:case`seamless`:case`itemScope`:r&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``):e.removeAttribute(n);break;case`capture`:case`download`:!0===r?e.setAttribute(n,``):!1!==r&&r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`cols`:case`rows`:case`size`:case`span`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case`rowSpan`:case`start`:r==null||typeof r==`function`||typeof r==`symbol`||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case`popover`:Q(`beforetoggle`,e),Q(`toggle`,e),jt(e,`popover`,r);break;case`xlinkActuate`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:actuate`,r);break;case`xlinkArcrole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:arcrole`,r);break;case`xlinkRole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:role`,r);break;case`xlinkShow`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:show`,r);break;case`xlinkTitle`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:title`,r);break;case`xlinkType`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:type`,r);break;case`xmlBase`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:base`,r);break;case`xmlLang`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:lang`,r);break;case`xmlSpace`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:space`,r);break;case`is`:jt(e,`is`,r);break;case`innerText`:case`textContent`:break;default:(!(2s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function kt(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function At(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function jt({d:e,modelName:t}){let n=At(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Mt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(jt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Nt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=t.data??[],i=e.data??[];return(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no gpus reported`}):(0,A.jsx)(`div`,{className:`grid gap-12 `+kt(r.length),children:r.map(e=>(0,A.jsx)(Mt,{g:e,deployments:i,models:n.data??[]},e.index))})]})}function Pt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`overview`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=n.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,r=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:r===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` gpu / `,r.length,` active`]})]})]}),(0,A.jsx)(Nt,{})]})}function Ft({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function It(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(``),u=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),d=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),f=t.data??[],p=f.filter(e=>e.status===`ready`||e.status===`loading`),m=i?f:p,h=f.length-m.length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`deployments`}),(0,A.jsxs)(`div`,{className:`label`,children:[p.length,` active / `,f.length,` total`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:i,onChange:e=>a(e.target.checked)}),`show stopped `,h>0&&!i&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,h,`)`]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:c}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[m.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),m.map(e=>{let t=(n.data??[]).find(t=>t.id===e.model_id),i=(r.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,s=o===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:i===`local`?`text-mute`:`text-accent`,children:i})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ft,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:Ot(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:s,onClick:()=>d.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&u.mutate(e.id)},children:s?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Lt(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function Rt(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function zt(e){return e&&e!==`local`?e:null}var Bt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},Vt=e=>new Promise(t=>setTimeout(t,e));function Ht(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Ut(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await Vt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Wt(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Bt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Lt(f.gpuIds),n=Rt(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=zt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Ht(t))throw t;return Ut(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Bt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Bt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function Gt(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function Kt({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function qt(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function Jt({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:qt(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:qt(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function Yt({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(Jt,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var Xt={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},Zt={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function Qt({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(Xt),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Lt(u.gpu_ids),t=Rt(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:zt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(Xt),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(Zt),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(Zt),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(Kt,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(Yt,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function $t(){return(0,A.jsx)(Qt,{mode:`routes`})}function en(){return(0,A.jsx)(Qt,{mode:`profiles`})}var tn={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function nn({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function rn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??tn,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(nn,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(nn,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(nn,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(nn,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(nn,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(nn,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(nn,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(nn,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(nn,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(nn,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var an={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function on(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` +`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function sn({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function cn({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function ln({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function un(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...an}),[o,s]=(0,k.useState)({model:``,...an}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...an,model:e.model,pending:!0})),n&&s(e=>({...e,...an,model:e.model,pending:!0}));let t=[on(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(on(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(cn,{stats:i.stats})]}),(0,A.jsx)(sn,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(cn,{stats:o.stats})]}),(0,A.jsx)(sn,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(ln,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(ln,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function dn(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function fn({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function pn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function mn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(pn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[dn(o),` total`]})]}),(0,A.jsx)(pn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function hn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(fn,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(mn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function gn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function _n(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=gn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>gn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function vn(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function yn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function bn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function xn(e){switch(bn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function Sn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${vn(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:vn(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:vn(r)})]})]})]})}function Cn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${xn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):vn(yn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(Sn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function wn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return gn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>bn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(Cn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Tn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function En({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Dn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function On(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function kn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function An(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function jn({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function Mn({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${An(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${kn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Dn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Dn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:On(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(jn,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(jn,{values:r.series.request_rate})]})]})]})}function Nn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Pn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Dn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Fn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${An(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${kn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Dn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Dn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:On(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(Nn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Pn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function In({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Dn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Dn(t.total_vram_mb)]})]})]})}function Ln({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(Nn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Tn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Tn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Tn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Tn,{label:`vram`,value:Dn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(In,{nodes:l})}),r.data&&(0,A.jsx)(Ln,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(Mn,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Fn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(En,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function zn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function Bn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Vn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Hn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` +`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Wn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Vn.filter(e=>e.group===`public`),s=Vn.filter(e=>e.group===`cluster`),c=Vn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Hn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Hn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Hn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+zn(r.leader_url??`default`),children:Bn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Un(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Gn=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Pt}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:It},{id:`models`,label:`models`,component:Wt},{id:`adapters`,label:`adapters`,component:Gt},{id:`routes`,label:`routes`,component:$t},{id:`profiles`,label:`profiles`,component:en}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:wn},{id:`logs`,label:`logs`,component:_n},{id:`cluster`,label:`cluster`,component:Rn},{id:`predictor`,label:`predictor`,component:rn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:hn},{id:`settings`,label:`settings`,component:Wn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:un}]}];function Kn(e){return Gn.find(t=>t.id===e)??Gn[0]}function qn(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function Jn({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Gn.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function Yn({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function Xn(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function Zn(e,t){return t?`#/${e}/${t}`:`#/${e}`}function Qn(){let[e,t]=(0,k.useState)(()=>Xn(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(Xn(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=Zn(e,t)}]}function $n(){let[e,t]=Qn(),n=Kn(e.section),r=qn(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(Jn,{active:n.id,onSelect:e=>{let n=Kn(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(Yn,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var er=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:er,children:(0,A.jsx)($n,{})})})); \ No newline at end of file diff --git a/src/berth/ui/index.html b/src/berth/ui/index.html index a88e421..e396c8a 100644 --- a/src/berth/ui/index.html +++ b/src/berth/ui/index.html @@ -15,7 +15,7 @@ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> - + diff --git a/ui/src/components/GpuCard.tsx b/ui/src/components/GpuCard.tsx new file mode 100644 index 0000000..4ee9363 --- /dev/null +++ b/ui/src/components/GpuCard.tsx @@ -0,0 +1,111 @@ +import type { Deployment, GpuSnapshot, Model } from '../api' + +export function fmtMb(mb: number | null | undefined): string { + if (!mb) return '-' + if (mb >= 1024) return `${(mb / 1024).toFixed(1)} GB` + return `${mb} MB` +} + +export function fmtGpus(ids: number[] | undefined): string { + if (!ids || ids.length === 0) return '-' + return ids.length === 1 ? `gpu ${ids[0]}` : `gpu ${ids.join(',')}` +} + +export function gpuGridCols(count: number): string { + if (count <= 1) return 'grid-cols-1' + if (count === 2) return 'grid-cols-1 md:grid-cols-2' + if (count === 3) return 'grid-cols-1 md:grid-cols-3' + return 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4' +} + +function idleCountdown(d: Deployment): string | null { + if (d.pinned) return null + if (!d.idle_timeout_s || !d.last_request_at) return null + // sqlite CURRENT_TIMESTAMP is naive UTC ("YYYY-MM-DD HH:MM:SS"); coerce to ISO + // with explicit Z so Date.parse doesn't treat it as local time. + const iso = String(d.last_request_at).replace(' ', 'T') + 'Z' + const last = Date.parse(iso) + if (Number.isNaN(last)) return null + const remaining = d.idle_timeout_s - (Date.now() - last) / 1000 + if (remaining <= 0) return 'evicting' + if (remaining < 60) return `${Math.round(remaining)}s` + return `${Math.round(remaining / 60)}m` +} + +function DeploymentChip({ d, modelName }: { d: Deployment; modelName: string }) { + const idle = idleCountdown(d) + const vram = d.vram_used_mb && d.vram_used_mb > 0 ? d.vram_used_mb : d.vram_reserved_mb + return ( +
+ + {modelName} + {d.backend} + {fmtMb(vram)} + {d.pinned ? ( + pin + ) : idle ? ( + + {idle} + + ) : ( + + )} +
+ ) +} + +export function GpuCard({ + g, deployments, models, +}: { + g: GpuSnapshot + deployments: Deployment[] + models: Model[] +}) { + const pct = (g.memory_used_mb / g.memory_total_mb) * 100 + const onCard = deployments.filter(d => + (d.gpu_ids ?? []).includes(g.index) && + (d.status === 'ready' || d.status === 'loading'), + ) + return ( +
+
+
gpu {g.index}
+
{pct.toFixed(0)}%
+
+
+
+ {(g.memory_used_mb / 1024).toFixed(1)} +
+
/ {(g.memory_total_mb / 1024).toFixed(0)} GB
+
+
+
+
+
+ util {g.gpu_util_pct}% + {g.power_w} w + + {onCard.length === 0 + ? idle + : {onCard.length} loaded} + +
+ {onCard.length > 0 && ( +
+ {onCard.map(d => { + const m = models.find(m => m.id === d.model_id) + return ( + + ) + })} +
+ )} +
+ ) +} diff --git a/ui/src/views/cluster/Sparkline.tsx b/ui/src/components/Sparkline.tsx similarity index 100% rename from ui/src/views/cluster/Sparkline.tsx rename to ui/src/components/Sparkline.tsx diff --git a/ui/src/nav.ts b/ui/src/nav.ts index 80e5c68..b8fa3f9 100644 --- a/ui/src/nav.ts +++ b/ui/src/nav.ts @@ -1,7 +1,6 @@ import type { ComponentType } from 'react' -// Phase 1: Overview and Deployments are temporarily aliased to the existing -// Dashboard so the shell compiles before Phase 2 splits Dashboard apart. -import Dashboard from './views/Dashboard' +import Overview from './views/overview/Overview' +import Deployments from './views/serving/Deployments' import Models from './views/Models' import Adapters from './views/Adapters' import Routes from './views/serving/Routes' @@ -14,9 +13,6 @@ import Requests from './views/Requests' import Cluster from './views/Cluster' import Settings from './views/Settings' -const Overview = Dashboard -const Deployments = Dashboard - export type Tab = { id: string; label: string; component: ComponentType } export type Section = { id: string; label: string; tabs: Tab[] } diff --git a/ui/src/views/cluster/NodeCard.tsx b/ui/src/views/cluster/NodeCard.tsx index c57a678..ed3d622 100644 --- a/ui/src/views/cluster/NodeCard.tsx +++ b/ui/src/views/cluster/NodeCard.tsx @@ -1,6 +1,6 @@ import type { MetricsSnapshotNode, Node } from '../../api' import { fmtMb, fmtRelative, statusColor, statusDot } from './format' -import { Sparkline } from './Sparkline' +import { Sparkline } from '../../components/Sparkline' export function NodeCard({ node, diff --git a/ui/src/views/overview/HealthStrip.tsx b/ui/src/views/overview/HealthStrip.tsx new file mode 100644 index 0000000..ad70b35 --- /dev/null +++ b/ui/src/views/overview/HealthStrip.tsx @@ -0,0 +1,27 @@ +import { useQuery } from '@tanstack/react-query' +import { api, queryKeys } from '../../api' +import { GpuCard, gpuGridCols } from '../../components/GpuCard' + +export default function HealthStrip() { + const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) + const gpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) + const models = useQuery({ queryKey: queryKeys.models, queryFn: api.listModels, refetchInterval: 5000 }) + + const gpuList = gpus.data ?? [] + const all = deps.data ?? [] + + return ( +
+
gpus
+ {gpuList.length === 0 ? ( +
no gpus reported
+ ) : ( +
+ {gpuList.map(g => ( + + ))} +
+ )} +
+ ) +} diff --git a/ui/src/views/overview/Overview.tsx b/ui/src/views/overview/Overview.tsx new file mode 100644 index 0000000..c571f0a --- /dev/null +++ b/ui/src/views/overview/Overview.tsx @@ -0,0 +1,42 @@ +import { useQuery } from '@tanstack/react-query' +import { api, queryKeys } from '../../api' +import HealthStrip from './HealthStrip' + +export default function Overview() { + const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) + const gpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) + const nodes = useQuery({ queryKey: queryKeys.nodes, queryFn: api.listNodes, refetchInterval: 5000 }) + + const all = deps.data ?? [] + const active = all.filter(d => d.status === 'ready' || d.status === 'loading') + + return ( +
+
+

overview

+
+ {(() => { + const ns = nodes.data?.nodes ?? [] + const ready = ns.filter(n => n.status === 'ready').length + const remote = ns.filter(n => n.label !== 'local').length + if (ns.length === 0) return null + return ( +
+ {remote === 0 ? ( + <>single-node + ) : ( + <>cluster {ready}/{ns.length} + )} +
+ ) + })()} +
{(gpus.data ?? []).length} gpu / {active.length} active
+
+
+ + + + {/* request stats — Phase 4 (StatTiles, TrafficChart, TopModels, DeploymentsGlance) */} +
+ ) +} diff --git a/ui/src/views/Dashboard.tsx b/ui/src/views/serving/Deployments.tsx similarity index 54% rename from ui/src/views/Dashboard.tsx rename to ui/src/views/serving/Deployments.tsx index 4a3d064..97c81db 100644 --- a/ui/src/views/Dashboard.tsx +++ b/ui/src/views/serving/Deployments.tsx @@ -1,12 +1,7 @@ import { useState } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { api, queryKeys, type Deployment, type GpuSnapshot, type Model } from '../api' - -function fmtMb(mb: number | null | undefined): string { - if (!mb) return '-' - if (mb >= 1024) return `${(mb / 1024).toFixed(1)} GB` - return `${mb} MB` -} +import { api, queryKeys } from '../../api' +import { fmtMb, fmtGpus } from '../../components/GpuCard' function VramCell({ used, reserved, status }: { used: number | null; reserved: number; status: string }) { if (status === 'stopped' || status === 'failed') { @@ -28,114 +23,9 @@ function VramCell({ used, reserved, status }: { used: number | null; reserved: n ) } -function fmtGpus(ids: number[] | undefined): string { - if (!ids || ids.length === 0) return '-' - return ids.length === 1 ? `gpu ${ids[0]}` : `gpu ${ids.join(',')}` -} - -function gpuGridCols(count: number): string { - if (count <= 1) return 'grid-cols-1' - if (count === 2) return 'grid-cols-1 md:grid-cols-2' - if (count === 3) return 'grid-cols-1 md:grid-cols-3' - return 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4' -} - -function idleCountdown(d: Deployment): string | null { - if (d.pinned) return null - if (!d.idle_timeout_s || !d.last_request_at) return null - // sqlite CURRENT_TIMESTAMP is naive UTC ("YYYY-MM-DD HH:MM:SS"); coerce to ISO - // with explicit Z so Date.parse doesn't treat it as local time. - const iso = String(d.last_request_at).replace(' ', 'T') + 'Z' - const last = Date.parse(iso) - if (Number.isNaN(last)) return null - const remaining = d.idle_timeout_s - (Date.now() - last) / 1000 - if (remaining <= 0) return 'evicting' - if (remaining < 60) return `${Math.round(remaining)}s` - return `${Math.round(remaining / 60)}m` -} - -function DeploymentChip({ d, modelName }: { d: Deployment; modelName: string }) { - const idle = idleCountdown(d) - const vram = d.vram_used_mb && d.vram_used_mb > 0 ? d.vram_used_mb : d.vram_reserved_mb - return ( -
- - {modelName} - {d.backend} - {fmtMb(vram)} - {d.pinned ? ( - pin - ) : idle ? ( - - {idle} - - ) : ( - - )} -
- ) -} - -function GpuCard({ - g, deployments, models, -}: { - g: GpuSnapshot - deployments: Deployment[] - models: Model[] -}) { - const pct = (g.memory_used_mb / g.memory_total_mb) * 100 - const onCard = deployments.filter(d => - (d.gpu_ids ?? []).includes(g.index) && - (d.status === 'ready' || d.status === 'loading'), - ) - return ( -
-
-
gpu {g.index}
-
{pct.toFixed(0)}%
-
-
-
- {(g.memory_used_mb / 1024).toFixed(1)} -
-
/ {(g.memory_total_mb / 1024).toFixed(0)} GB
-
-
-
-
-
- util {g.gpu_util_pct}% - {g.power_w} w - - {onCard.length === 0 - ? idle - : {onCard.length} loaded} - -
- {onCard.length > 0 && ( -
- {onCard.map(d => { - const m = models.find(m => m.id === d.model_id) - return ( - - ) - })} -
- )} -
- ) -} - -export default function Dashboard() { +export default function Deployments() { const qc = useQueryClient() const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) - const gpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) const models = useQuery({ queryKey: queryKeys.models, queryFn: api.listModels, refetchInterval: 5000 }) const nodes = useQuery({ queryKey: queryKeys.nodes, queryFn: api.listNodes, refetchInterval: 5000 }) const [showAll, setShowAll] = useState(false) @@ -162,45 +52,12 @@ export default function Dashboard() { const hiddenCount = all.length - visible.length return ( -
+
-

dashboard

-
- {(() => { - const ns = nodes.data?.nodes ?? [] - const ready = ns.filter(n => n.status === 'ready').length - const remote = ns.filter(n => n.label !== 'local').length - if (ns.length === 0) return null - return ( -
- {remote === 0 ? ( - <>single-node - ) : ( - <> - cluster {ready}/{ns.length} - - )} -
- ) - })()} -
{(gpus.data ?? []).length} gpu / {active.length} active
-
+

deployments

+
{active.length} active / {all.length} total
-
-
gpus
-
- {(gpus.data ?? []).map(g => ( - - ))} -
-
-
deployments
From 45de2a8e29a405300a17b1825a800ccb8d9e1730 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 18:35:34 +0200 Subject: [PATCH 3/5] feat(daemon): GET /admin/usage/series read-only usage aggregate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add usage_events.series_in_window() — bucketed request volume + tokens over a window, zero-filled and oldest-first, optionally grouped by model or key (mirrors key_usage.bucketed_usage). Expose it as GET /admin/usage/series on the admin router to power the Overview dashboard's volume/throughput tiles and traffic-over-time/top-models history. Bounded by usage retention. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/daemon/admin_runtime.py | 32 ++++++++- src/berth/store/usage_events.py | 105 +++++++++++++++++++++++++++++ tests/unit/test_admin_endpoints.py | 42 ++++++++++++ tests/unit/test_usage_series.py | 69 +++++++++++++++++++ 4 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_usage_series.py diff --git a/src/berth/daemon/admin_runtime.py b/src/berth/daemon/admin_runtime.py index 3e6b5f2..737d0e1 100644 --- a/src/berth/daemon/admin_runtime.py +++ b/src/berth/daemon/admin_runtime.py @@ -8,9 +8,10 @@ from fastapi.responses import StreamingResponse from berth.backends.base import Backend -from berth.daemon.admin import get_backends, router +from berth.daemon.admin import get_backends, get_conn, router from berth.store import deployments as dep_store from berth.store import nodes as nodes_store +from berth.store import usage_events as _usage_events @router.get("/requests") @@ -72,6 +73,35 @@ def predictor_stats(request: Request): return task.stats_snapshot() +@router.get("/usage/series") +def usage_series( + window_s: int = 86400, + bucket_s: int = 3600, + group_by: str | None = None, + conn: sqlite3.Connection = Depends(get_conn), +): + """Read-only aggregate request volume + tokens over time, bucketed. + + Powers the Overview dashboard's volume/throughput tiles and the + traffic-over-time / top-models history. Bounded by the daemon's usage + retention window. group_by may be 'model' or 'key' (or omitted/'none'). + """ + if window_s <= 0 or bucket_s <= 0: + raise HTTPException(400, "window_s and bucket_s must be positive") + if window_s // bucket_s > 1024: + raise HTTPException(400, "too many buckets requested (cap is 1024)") + if group_by not in (None, "none", "model", "key"): + raise HTTPException(400, "group_by must be one of: model, key") + gb = None if group_by in (None, "none") else group_by + data = _usage_events.series_in_window( + conn, window_s=window_s, bucket_s=bucket_s, group_by=gb, + ) + base = {"window_s": window_s, "bucket_s": bucket_s, "group_by": gb} + if gb: + return {**base, "groups": data} + return {**base, "buckets": data} + + @router.get("/deployments/current/logs") def stream_current_logs(request: Request): conn: sqlite3.Connection = request.app.state.conn diff --git a/src/berth/store/usage_events.py b/src/berth/store/usage_events.py index acee627..ebaadf6 100644 --- a/src/berth/store/usage_events.py +++ b/src/berth/store/usage_events.py @@ -136,6 +136,111 @@ def list_recent( return [_row(r) for r in rows] +def series_in_window( + conn: sqlite3.Connection, + *, + window_s: int, + bucket_s: int, + group_by: str | None = None, +) -> list[dict]: + """Time-bucketed request volume + tokens over the past `window_s` seconds. + + Mirrors `key_usage.bucketed_usage`: buckets are `bucket_s` wide, zero-filled, + returned oldest-first so the UI can plot left-to-right. + + - ``group_by=None`` -> a flat list of bucket dicts: + ``[{bucket_idx, ts_offset_s, count, tokens_in, tokens_out}, ...]``. + - ``group_by='model'|'key'`` -> one entry per group, sorted by total desc: + ``[{key, label, total, tokens_in, tokens_out, buckets:[...]}, ...]`` where + each group carries its own zero-filled bucket list. + + Bounded by retention: rows older than the daemon's retention window have + already been rolled up into usage_aggregates and dropped, so the effective + history can be shorter than `window_s`. + """ + bucket_s = max(1, int(bucket_s)) + num_buckets = max(1, int(window_s) // bucket_s) + col = {None: None, "model": "model_name", "key": "api_key_id"}[group_by] + + def _empty_buckets() -> list[dict]: + # bucket_idx 0 = most recent; emit oldest -> newest. + return [ + { + "bucket_idx": i, + "ts_offset_s": i * bucket_s, + "count": 0, + "tokens_in": 0, + "tokens_out": 0, + } + for i in range(num_buckets - 1, -1, -1) + ] + + def _fill(buckets: list[dict], by_idx: dict) -> None: + for b in buckets: + r = by_idx.get(b["bucket_idx"]) + if r is not None: + b["count"] = int(r["count"]) + b["tokens_in"] = int(r["tokens_in"]) + b["tokens_out"] = int(r["tokens_out"]) + + select_grp = f"{col} AS grp," if col else "" + group_grp = "grp, " if col else "" + rows = conn.execute( + f""" + SELECT + {select_grp} + CAST( + (CAST(strftime('%s', 'now') AS INTEGER) + - CAST(strftime('%s', ts) AS INTEGER)) / ? + AS INTEGER + ) AS bucket_idx, + COUNT(*) AS count, + COALESCE(SUM(tokens_in), 0) AS tokens_in, + COALESCE(SUM(tokens_out), 0) AS tokens_out + FROM usage_events + WHERE ts > datetime('now', ?) + GROUP BY {group_grp}bucket_idx + """, + (bucket_s, f"-{window_s} seconds"), + ).fetchall() + + if col is None: + out = _empty_buckets() + _fill(out, {int(r["bucket_idx"]): r for r in rows}) + return out + + groups: dict[str, dict] = {} + for r in rows: + raw = r["grp"] + gkey = "" if raw is None else str(raw) + g = groups.setdefault(gkey, { + "key": gkey, + "label": "—" if raw is None else str(raw), + "total": 0, + "tokens_in": 0, + "tokens_out": 0, + "_by_idx": {}, + }) + g["total"] += int(r["count"]) + g["tokens_in"] += int(r["tokens_in"]) + g["tokens_out"] += int(r["tokens_out"]) + g["_by_idx"][int(r["bucket_idx"])] = r + + result: list[dict] = [] + for g in sorted(groups.values(), key=lambda x: x["total"], reverse=True): + buckets = _empty_buckets() + _fill(buckets, g["_by_idx"]) + result.append({ + "key": g["key"], + "label": g["label"], + "total": g["total"], + "tokens_in": g["tokens_in"], + "tokens_out": g["tokens_out"], + "buckets": buckets, + }) + return result + + def purge_older_than( conn: sqlite3.Connection, *, before_iso: str, ) -> int: diff --git a/tests/unit/test_admin_endpoints.py b/tests/unit/test_admin_endpoints.py index 75bc8d0..06379f6 100644 --- a/tests/unit/test_admin_endpoints.py +++ b/tests/unit/test_admin_endpoints.py @@ -1008,3 +1008,45 @@ async def test_deploy_with_backend_adopted_returns_400(app): ) assert r.status_code == 400, r.text assert "reserved" in r.json()["detail"].lower() + + +@pytest.mark.asyncio +async def test_usage_series_ungrouped(app): + """/admin/usage/series returns zero-filled buckets and counts seeded events.""" + usage_store.record(app.state.conn, model_name="qwen", base_name="qwen", tokens_out=12) + usage_store.record(app.state.conn, model_name="qwen", base_name="qwen", tokens_out=8) + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + r = await c.get("/admin/usage/series?window_s=3600&bucket_s=3600") + assert r.status_code == 200, r.text + body = r.json() + assert body["group_by"] is None + assert body["buckets"][-1]["count"] == 2 + assert body["buckets"][-1]["tokens_out"] == 20 + + +@pytest.mark.asyncio +async def test_usage_series_group_by_model(app): + usage_store.record(app.state.conn, model_name="a", base_name="a") + usage_store.record(app.state.conn, model_name="a", base_name="a") + usage_store.record(app.state.conn, model_name="b", base_name="b") + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + r = await c.get("/admin/usage/series?window_s=3600&bucket_s=3600&group_by=model") + assert r.status_code == 200, r.text + body = r.json() + assert body["group_by"] == "model" + assert [g["label"] for g in body["groups"]] == ["a", "b"] + assert body["groups"][0]["total"] == 2 + + +@pytest.mark.asyncio +async def test_usage_series_rejects_bad_params(app): + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + bad_window = await c.get("/admin/usage/series?window_s=0&bucket_s=60") + too_many = await c.get("/admin/usage/series?window_s=10000000&bucket_s=1") + bad_group = await c.get("/admin/usage/series?window_s=3600&bucket_s=60&group_by=bogus") + assert bad_window.status_code == 400, bad_window.text + assert too_many.status_code == 400, too_many.text + assert bad_group.status_code == 400, bad_group.text diff --git a/tests/unit/test_usage_series.py b/tests/unit/test_usage_series.py new file mode 100644 index 0000000..8073e40 --- /dev/null +++ b/tests/unit/test_usage_series.py @@ -0,0 +1,69 @@ +"""Store tests for the bucketed usage-series query that powers the Overview +dashboard's volume/throughput tiles. The /admin/usage/series route handler is +covered HTTP-level in test_admin_endpoints.py (reusing its app fixture, which +imports the daemon modules in the right order — admin_runtime imported on its +own hits a pre-existing admin<->admin_runtime circular import). +""" +from berth.store import db +from berth.store import usage_events as ue + + +def _fresh(tmp_path): + conn = db.connect(tmp_path / "t.db") + db.init_schema(conn) + return conn + + +# --- store: series_in_window ------------------------------------------------- + +def test_series_ungrouped_counts_and_tokens(tmp_path): + conn = _fresh(tmp_path) + for _ in range(3): + ue.record(conn, model_name="m", base_name="m", tokens_in=2, tokens_out=10) + rows = ue.series_in_window(conn, window_s=3600, bucket_s=3600, group_by=None) + assert len(rows) == 1 # window_s // bucket_s == 1 bucket + assert rows[-1]["count"] == 3 + assert rows[-1]["tokens_in"] == 6 + assert rows[-1]["tokens_out"] == 30 + + +def test_series_zero_fills_empty_buckets_oldest_first(tmp_path): + conn = _fresh(tmp_path) + ue.record(conn, model_name="m", base_name="m", tokens_out=1) + rows = ue.series_in_window(conn, window_s=3600, bucket_s=600, group_by=None) + assert len(rows) == 6 # 3600 / 600 + # oldest first; all but the most-recent bucket are empty + assert rows[0]["count"] == 0 + assert rows[-1]["count"] == 1 + # ts_offset decreases toward the present + assert rows[0]["ts_offset_s"] > rows[-1]["ts_offset_s"] + + +def test_series_group_by_model_sorted_by_total(tmp_path): + conn = _fresh(tmp_path) + for _ in range(3): + ue.record(conn, model_name="busy", base_name="busy", tokens_out=5) + ue.record(conn, model_name="quiet", base_name="quiet", tokens_out=7) + groups = ue.series_in_window(conn, window_s=3600, bucket_s=3600, group_by="model") + assert [g["label"] for g in groups] == ["busy", "quiet"] # busy first (higher total) + by_label = {g["label"]: g for g in groups} + assert by_label["busy"]["total"] == 3 + assert by_label["quiet"]["tokens_out"] == 7 + # each group still carries a zero-filled bucket list + assert by_label["busy"]["buckets"][-1]["count"] == 3 + + +def test_series_group_by_key(tmp_path): + conn = _fresh(tmp_path) + ue.record(conn, model_name="m", base_name="m", api_key_id=None, tokens_out=1) + groups = ue.series_in_window(conn, window_s=3600, bucket_s=3600, group_by="key") + # NULL api_key id collapses to the "—" label + assert groups[0]["label"] == "—" + assert groups[0]["total"] == 1 + + +def test_series_empty_window_returns_zeroed_buckets(tmp_path): + conn = _fresh(tmp_path) + rows = ue.series_in_window(conn, window_s=3600, bucket_s=1800, group_by=None) + assert len(rows) == 2 + assert all(r["count"] == 0 for r in rows) From 98228b7cfb67a454fbf4b667cdf582afc4707e58 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 18:37:41 +0200 Subject: [PATCH 4/5] feat(ui): Overview request-stat tiles, traffic chart, top models, glance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the stats dashboard to Overview: four StatTiles (volume, latency, errors, throughput) with latency/errors badged "live · 60s"; volume and throughput sourced from /admin/usage/series recent buckets, latency/errors from the metrics snapshot via a request-weighted aggregateSnapshot helper. Plus a 24h traffic-over-time bar chart and top-models table from usage history, and a read-only deployments glance linking to Serving. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/ui/assets/index-B1_2_G6r.css | 2 + src/berth/ui/assets/index-BsGljYOY.css | 2 - .../{index-tJy0r6F4.js => index-CNEC70C6.js} | 6 +- src/berth/ui/index.html | 4 +- ui/src/api.ts | 38 ++++++++ ui/src/views/overview/DeploymentsGlance.tsx | 49 +++++++++++ ui/src/views/overview/Overview.tsx | 88 ++++++++++++++++++- ui/src/views/overview/StatTile.tsx | 35 ++++++++ ui/src/views/overview/TopModels.tsx | 28 ++++++ ui/src/views/overview/TrafficChart.tsx | 43 +++++++++ ui/src/views/overview/useOverviewStats.ts | 59 +++++++++++++ 11 files changed, 346 insertions(+), 8 deletions(-) create mode 100644 src/berth/ui/assets/index-B1_2_G6r.css delete mode 100644 src/berth/ui/assets/index-BsGljYOY.css rename src/berth/ui/assets/{index-tJy0r6F4.js => index-CNEC70C6.js} (78%) create mode 100644 ui/src/views/overview/DeploymentsGlance.tsx create mode 100644 ui/src/views/overview/StatTile.tsx create mode 100644 ui/src/views/overview/TopModels.tsx create mode 100644 ui/src/views/overview/TrafficChart.tsx create mode 100644 ui/src/views/overview/useOverviewStats.ts diff --git a/src/berth/ui/assets/index-B1_2_G6r.css b/src/berth/ui/assets/index-B1_2_G6r.css new file mode 100644 index 0000000..e7838ca --- /dev/null +++ b/src/berth/ui/assets/index-B1_2_G6r.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-light:300;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--bg-page:#0d0d0b;--bg-elev:#15140f;--bg-sunk:#08080706;--ink:#e8e5dd;--ink-dim:#9d998d;--ink-mute:#5e5b51;--rule:#25231d;--rule-soft:#1c1a16;--accent:#ff5c2a;--accent-dim:#c4421c;--accent-soft:#ff5c2a1f;--ok:#a6c97e;--warn:#e2c46d;--err:#e36b5d}*{font-feature-settings:"tnum" 1, "calt" 1, "ss02" 1;box-sizing:border-box}html,body{background:var(--bg-page);color:var(--ink);-webkit-font-smoothing:antialiased;text-rendering:geometricprecision;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.55}body{background-color:var(--bg-page);background-image:radial-gradient(70% 38% at 50% -8%,#ff5c2a12,#0000 65%),radial-gradient(90% 70% at 50% 60%,#0000 55%,#00000073 100%);background-attachment:fixed;min-height:100vh}::selection{background:var(--accent);color:var(--bg-page)}:focus{outline:none}:focus-visible{outline:1px solid var(--accent);outline-offset:2px}input,select,textarea,button{font:inherit;color:inherit;background:0 0}select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='none' stroke='%239d998d' stroke-width='1.2' d='M1 1l4 4 4-4'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;padding-right:28px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--rule);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--ink-mute)}}@layer components{.label{letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);font-size:10px;font-weight:500}.field{background:var(--bg-elev);border:1px solid var(--rule);caret-color:var(--accent);padding:8px 12px;font-size:13px;transition:border-color .12s}.field::placeholder{color:var(--ink-mute)}.field:hover{border-color:var(--ink-mute)}.field:focus,.field:focus-within{border-color:var(--accent);outline:none}textarea.field{resize:vertical;padding:12px;line-height:1.55}.btn-primary{background:var(--accent);color:var(--bg-page);border:1px solid var(--accent);letter-spacing:.02em;cursor:pointer;padding:8px 18px;font-weight:500;transition:background .12s,border-color .12s}.btn-primary:hover{background:var(--accent-dim);border-color:var(--accent-dim)}.btn-primary:disabled{color:var(--ink-mute);border-color:var(--rule);cursor:not-allowed;background:0 0}.btn{color:var(--ink);border:1px solid var(--rule);cursor:pointer;background:0 0;padding:8px 16px;transition:border-color .12s,color .12s}.btn:hover{border-color:var(--ink-mute)}.btn:disabled{color:var(--ink-mute);border-color:var(--rule-soft);cursor:not-allowed}.btn-link-danger{color:var(--err);cursor:pointer;background:0 0;border:none;padding:0;transition:opacity .12s}.btn-link-danger:hover{opacity:.7}.dot{background:var(--ink-mute);vertical-align:middle;border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-right:8px;display:inline-block}.dot-ready{background:var(--ok)}.dot-loading{background:var(--accent);animation:1.6s ease-in-out infinite pulse}.dot-failed{background:var(--err)}.dot-stopped{background:var(--ink-mute)}.dot-stopping{background:var(--warn)}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.caret:after{content:"|";color:var(--accent);margin-left:6px;font-weight:400;animation:1.1s steps(2,end) infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.enter{animation:.36s cubic-bezier(.2,.7,.2,1) both enter}@keyframes enter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.ditable{border-collapse:collapse;width:100%}.ditable thead th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);border-bottom:1px solid var(--rule);padding:10px 16px 10px 0;font-size:10px;font-weight:500}.ditable tbody td{border-bottom:1px solid var(--rule-soft);color:var(--ink);padding:14px 16px 14px 0}.ditable tbody tr:hover td{background:var(--bg-elev)}.ditable tbody td:last-child,.ditable thead th:last-child{padding-right:0}.ditable .num{font-variant-numeric:tabular-nums}}@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-3{grid-column:span 3/span 3}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-3{height:calc(var(--spacing) * 3)}.h-14{height:calc(var(--spacing) * 14)}.h-\[32rem\]{height:32rem}.h-\[280px\]{height:280px}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[2\.5rem\]{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-\[7ch\]{width:7ch}.w-\[8ch\]{width:8ch}.w-\[14ch\]{width:14ch}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[16ch\]{max-width:16ch}.max-w-\[1280px\]{max-width:1280px}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[420px\]{min-width:420px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[1fr_180px\]{grid-template-columns:1fr 180px}.grid-cols-\[1fr_180px_auto\]{grid-template-columns:1fr 180px auto}.grid-cols-\[1fr_200px_160px_auto\]{grid-template-columns:1fr 200px 160px auto}.grid-cols-\[1fr_220px_auto\]{grid-template-columns:1fr 220px auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-14>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 14) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 14) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing) * 4);column-gap:calc(var(--spacing) * 4)}.gap-x-6{-moz-column-gap:calc(var(--spacing) * 6);column-gap:calc(var(--spacing) * 6)}.gap-x-8{-moz-column-gap:calc(var(--spacing) * 8);column-gap:calc(var(--spacing) * 8)}.gap-x-10{-moz-column-gap:calc(var(--spacing) * 10);column-gap:calc(var(--spacing) * 10)}.gap-x-12{-moz-column-gap:calc(var(--spacing) * 12);column-gap:calc(var(--spacing) * 12)}:where(.space-x-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-rule-soft>:not(:last-child)){border-color:var(--rule-soft)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-accent,.border-accent\/40{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/40{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.border-err\/30{border-color:var(--err)}@supports (color:color-mix(in lab, red, red)){.border-err\/30{border-color:color-mix(in oklab, var(--err) 30%, transparent)}}.border-err\/40{border-color:var(--err)}@supports (color:color-mix(in lab, red, red)){.border-err\/40{border-color:color-mix(in oklab, var(--err) 40%, transparent)}}.border-rule{border-color:var(--rule)}.border-rule-soft{border-color:var(--rule-soft)}.border-rule\/40{border-color:var(--rule)}@supports (color:color-mix(in lab, red, red)){.border-rule\/40{border-color:color-mix(in oklab, var(--rule) 40%, transparent)}}.bg-\[\#08080a\]{background-color:#08080a}.bg-\[var\(--accent-soft\)\]{background-color:var(--accent-soft)}.bg-accent,.bg-accent\/70{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/70{background-color:color-mix(in oklab, var(--accent) 70%, transparent)}}.bg-bg,.bg-bg\/80{background-color:var(--bg-page)}@supports (color:color-mix(in lab, red, red)){.bg-bg\/80{background-color:color-mix(in oklab, var(--bg-page) 80%, transparent)}}.bg-elev,.bg-elev\/30{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.bg-elev\/30{background-color:color-mix(in oklab, var(--bg-elev) 30%, transparent)}}.bg-elev\/40{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.bg-elev\/40{background-color:color-mix(in oklab, var(--bg-elev) 40%, transparent)}}.bg-rule{background-color:var(--rule)}.bg-rule-soft{background-color:var(--rule-soft)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.\!py-12{padding-block:calc(var(--spacing) * 12)!important}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-12{padding-block:calc(var(--spacing) * 12)}.\!pt-2{padding-top:calc(var(--spacing) * 2)!important}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.\!pb-6{padding-bottom:calc(var(--spacing) * 6)!important}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.tracking-tightish{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent,.text-accent\/70{color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.text-accent\/70{color:color-mix(in oklab, var(--accent) 70%, transparent)}}.text-dim{color:var(--ink-dim)}.text-err{color:var(--err)}.text-ink,.text-ink\/80{color:var(--ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/80{color:color-mix(in oklab, var(--ink) 80%, transparent)}}.text-mute{color:var(--ink-mute)}.text-ok{color:var(--ok)}.text-warn{color:var(--warn)}.uppercase{text-transform:uppercase}.accent-accent{accent-color:var(--accent)}.accent-dim{accent-color:var(--ink-dim)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hover\:border-accent:hover{border-color:var(--accent)}.hover\:bg-elev\/40:hover{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-elev\/40:hover{background-color:color-mix(in oklab, var(--bg-elev) 40%, transparent)}}.hover\:text-accent:hover{color:var(--accent)}.hover\:text-dim:hover{color:var(--ink-dim)}.hover\:text-ink:hover{color:var(--ink)}.hover\:opacity-70:hover{opacity:.7}}.disabled\:opacity-40:disabled{opacity:.4}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-start-2{grid-column-start:2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=64rem){.lg\:inline{display:inline}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.lg\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}}.tnum{font-variant-numeric:tabular-nums}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}} diff --git a/src/berth/ui/assets/index-BsGljYOY.css b/src/berth/ui/assets/index-BsGljYOY.css deleted file mode 100644 index f82afcd..0000000 --- a/src/berth/ui/assets/index-BsGljYOY.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-light:300;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--bg-page:#0d0d0b;--bg-elev:#15140f;--bg-sunk:#08080706;--ink:#e8e5dd;--ink-dim:#9d998d;--ink-mute:#5e5b51;--rule:#25231d;--rule-soft:#1c1a16;--accent:#ff5c2a;--accent-dim:#c4421c;--accent-soft:#ff5c2a1f;--ok:#a6c97e;--warn:#e2c46d;--err:#e36b5d}*{font-feature-settings:"tnum" 1, "calt" 1, "ss02" 1;box-sizing:border-box}html,body{background:var(--bg-page);color:var(--ink);-webkit-font-smoothing:antialiased;text-rendering:geometricprecision;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.55}body{background-color:var(--bg-page);background-image:radial-gradient(70% 38% at 50% -8%,#ff5c2a12,#0000 65%),radial-gradient(90% 70% at 50% 60%,#0000 55%,#00000073 100%);background-attachment:fixed;min-height:100vh}::selection{background:var(--accent);color:var(--bg-page)}:focus{outline:none}:focus-visible{outline:1px solid var(--accent);outline-offset:2px}input,select,textarea,button{font:inherit;color:inherit;background:0 0}select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='none' stroke='%239d998d' stroke-width='1.2' d='M1 1l4 4 4-4'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;padding-right:28px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--rule);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--ink-mute)}}@layer components{.label{letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);font-size:10px;font-weight:500}.field{background:var(--bg-elev);border:1px solid var(--rule);caret-color:var(--accent);padding:8px 12px;font-size:13px;transition:border-color .12s}.field::placeholder{color:var(--ink-mute)}.field:hover{border-color:var(--ink-mute)}.field:focus,.field:focus-within{border-color:var(--accent);outline:none}textarea.field{resize:vertical;padding:12px;line-height:1.55}.btn-primary{background:var(--accent);color:var(--bg-page);border:1px solid var(--accent);letter-spacing:.02em;cursor:pointer;padding:8px 18px;font-weight:500;transition:background .12s,border-color .12s}.btn-primary:hover{background:var(--accent-dim);border-color:var(--accent-dim)}.btn-primary:disabled{color:var(--ink-mute);border-color:var(--rule);cursor:not-allowed;background:0 0}.btn{color:var(--ink);border:1px solid var(--rule);cursor:pointer;background:0 0;padding:8px 16px;transition:border-color .12s,color .12s}.btn:hover{border-color:var(--ink-mute)}.btn:disabled{color:var(--ink-mute);border-color:var(--rule-soft);cursor:not-allowed}.btn-link-danger{color:var(--err);cursor:pointer;background:0 0;border:none;padding:0;transition:opacity .12s}.btn-link-danger:hover{opacity:.7}.dot{background:var(--ink-mute);vertical-align:middle;border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-right:8px;display:inline-block}.dot-ready{background:var(--ok)}.dot-loading{background:var(--accent);animation:1.6s ease-in-out infinite pulse}.dot-failed{background:var(--err)}.dot-stopped{background:var(--ink-mute)}.dot-stopping{background:var(--warn)}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.caret:after{content:"|";color:var(--accent);margin-left:6px;font-weight:400;animation:1.1s steps(2,end) infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.enter{animation:.36s cubic-bezier(.2,.7,.2,1) both enter}@keyframes enter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.ditable{border-collapse:collapse;width:100%}.ditable thead th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);border-bottom:1px solid var(--rule);padding:10px 16px 10px 0;font-size:10px;font-weight:500}.ditable tbody td{border-bottom:1px solid var(--rule-soft);color:var(--ink);padding:14px 16px 14px 0}.ditable tbody tr:hover td{background:var(--bg-elev)}.ditable tbody td:last-child,.ditable thead th:last-child{padding-right:0}.ditable .num{font-variant-numeric:tabular-nums}}@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-3{grid-column:span 3/span 3}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.h-3{height:calc(var(--spacing) * 3)}.h-14{height:calc(var(--spacing) * 14)}.h-\[32rem\]{height:32rem}.h-\[280px\]{height:280px}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[2\.5rem\]{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[16ch\]{max-width:16ch}.max-w-\[1280px\]{max-width:1280px}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[420px\]{min-width:420px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[1fr_180px\]{grid-template-columns:1fr 180px}.grid-cols-\[1fr_180px_auto\]{grid-template-columns:1fr 180px auto}.grid-cols-\[1fr_200px_160px_auto\]{grid-template-columns:1fr 200px 160px auto}.grid-cols-\[1fr_220px_auto\]{grid-template-columns:1fr 220px auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-14>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 14) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 14) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{-moz-column-gap:calc(var(--spacing) * 4);column-gap:calc(var(--spacing) * 4)}.gap-x-6{-moz-column-gap:calc(var(--spacing) * 6);column-gap:calc(var(--spacing) * 6)}.gap-x-8{-moz-column-gap:calc(var(--spacing) * 8);column-gap:calc(var(--spacing) * 8)}.gap-x-10{-moz-column-gap:calc(var(--spacing) * 10);column-gap:calc(var(--spacing) * 10)}:where(.space-x-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-rule-soft>:not(:last-child)){border-color:var(--rule-soft)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-accent,.border-accent\/40{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/40{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.border-err\/30{border-color:var(--err)}@supports (color:color-mix(in lab, red, red)){.border-err\/30{border-color:color-mix(in oklab, var(--err) 30%, transparent)}}.border-err\/40{border-color:var(--err)}@supports (color:color-mix(in lab, red, red)){.border-err\/40{border-color:color-mix(in oklab, var(--err) 40%, transparent)}}.border-rule{border-color:var(--rule)}.border-rule-soft{border-color:var(--rule-soft)}.border-rule\/40{border-color:var(--rule)}@supports (color:color-mix(in lab, red, red)){.border-rule\/40{border-color:color-mix(in oklab, var(--rule) 40%, transparent)}}.bg-\[\#08080a\]{background-color:#08080a}.bg-\[var\(--accent-soft\)\]{background-color:var(--accent-soft)}.bg-accent,.bg-accent\/70{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/70{background-color:color-mix(in oklab, var(--accent) 70%, transparent)}}.bg-bg,.bg-bg\/80{background-color:var(--bg-page)}@supports (color:color-mix(in lab, red, red)){.bg-bg\/80{background-color:color-mix(in oklab, var(--bg-page) 80%, transparent)}}.bg-elev,.bg-elev\/30{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.bg-elev\/30{background-color:color-mix(in oklab, var(--bg-elev) 30%, transparent)}}.bg-elev\/40{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.bg-elev\/40{background-color:color-mix(in oklab, var(--bg-elev) 40%, transparent)}}.bg-rule{background-color:var(--rule)}.bg-rule-soft{background-color:var(--rule-soft)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.\!py-12{padding-block:calc(var(--spacing) * 12)!important}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-12{padding-block:calc(var(--spacing) * 12)}.\!pt-2{padding-top:calc(var(--spacing) * 2)!important}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.\!pb-6{padding-bottom:calc(var(--spacing) * 6)!important}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.tracking-tightish{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent,.text-accent\/70{color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.text-accent\/70{color:color-mix(in oklab, var(--accent) 70%, transparent)}}.text-dim{color:var(--ink-dim)}.text-err{color:var(--err)}.text-ink,.text-ink\/80{color:var(--ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/80{color:color-mix(in oklab, var(--ink) 80%, transparent)}}.text-mute{color:var(--ink-mute)}.text-ok{color:var(--ok)}.text-warn{color:var(--warn)}.uppercase{text-transform:uppercase}.accent-accent{accent-color:var(--accent)}.accent-dim{accent-color:var(--ink-dim)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hover\:bg-elev\/40:hover{background-color:var(--bg-elev)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-elev\/40:hover{background-color:color-mix(in oklab, var(--bg-elev) 40%, transparent)}}.hover\:text-accent:hover{color:var(--accent)}.hover\:text-dim:hover{color:var(--ink-dim)}.hover\:text-ink:hover{color:var(--ink)}.hover\:opacity-70:hover{opacity:.7}}.disabled\:opacity-40:disabled{opacity:.4}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-start-2{grid-column-start:2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=64rem){.lg\:inline{display:inline}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.lg\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}}.tnum{font-variant-numeric:tabular-nums}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}} diff --git a/src/berth/ui/assets/index-tJy0r6F4.js b/src/berth/ui/assets/index-CNEC70C6.js similarity index 78% rename from src/berth/ui/assets/index-tJy0r6F4.js rename to src/berth/ui/assets/index-CNEC70C6.js index 07ffe95..628e90c 100644 --- a/src/berth/ui/assets/index-tJy0r6F4.js +++ b/src/berth/ui/assets/index-CNEC70C6.js @@ -6,6 +6,6 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r= `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` `+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function k(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),pn=!1;if(fn)try{var mn={};Object.defineProperty(mn,"passive",{get:function(){pn=!0}}),window.addEventListener(`test`,mn,mn),window.removeEventListener(`test`,mn,mn)}catch{pn=!1}var hn=null,gn=null,_n=null;function vn(){if(_n)return _n;var e,t=gn,n=t.length,r,i=`value`in hn?hn.value:hn.textContent,a=i.length;for(e=0;e=Xn),$n=` `,er=!1;function tr(e,t){switch(e){case`keyup`:return Jn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function nr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var rr=!1;function ir(e,t){switch(e){case`compositionend`:return nr(t);case`keypress`:return t.which===32?(er=!0,$n):null;case`textInput`:return e=t.data,e===$n&&er?null:e;default:return null}}function ar(e,t){if(rr)return e===`compositionend`||!Yn&&tr(e,t)?(e=vn(),_n=gn=hn=null,rr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Dr(n)}}function kr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?kr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ar(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=zt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=zt(e.document)}return t}function jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Mr=fn&&`documentMode`in document&&11>=document.documentMode,Nr=null,Pr=null,Fr=null,Ir=!1;function Lr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ir||Nr==null||Nr!==zt(r)||(r=Nr,`selectionStart`in r&&jr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Fr&&Er(Fr,r)||(Fr=r,r=Ed(Pr,`onSelect`),0>=o,i-=o,ki=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),L&&ji(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),L&&ji(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return L&&ji(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),L&&ji(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=gi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=hi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=yi(o,e.mode,c),c.return=e,e=c}return s(e);case w:return o=Aa(o),b(e,r,o,c)}if(ue(o))return h(e,r,o,c);if(se(o)){if(l=se(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===S)return b(e,r,ia(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=_i(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=di(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ci(e),si(e,null,n),t}return ii(e,r,t,n),ci(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Fs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,de,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ra(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ai(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Tr(s,o))return ii(e,t,i,0),K===null&&ri(),!1}catch{}if(n=ai(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ai(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var zs={readContext:ra,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ra,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ra,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(L){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(L){var n=Ai,r=ki;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[mt]=t,o[ht]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ve.current,Ui(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ii,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Bi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ui(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ui(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Zi(t.type),U(t),null;case 19:if(he(R),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)mi(n,e),n=n.sibling;return D(R,R.current&1|2),L&&ji(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!L)return U(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=R.current,D(R,a?n&1|2:n&1),L&&ji(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&he(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Zi(la),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Pi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Zi(la),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(R),null;case 4:return xe(),null;case 10:return Zi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&he(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Zi(la),null;case 25:return null;default:return null}}function Vc(e,t){switch(Pi(t),t.tag){case 3:Zi(la),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:he(R);break;case 10:Zi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&he(ba);break;case 24:Zi(la)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Ar(e),jr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[mt]=e,wt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Or(s,h),v=Or(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,o)}catch{}return!0}finally{E.p=a,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=xi(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=xi(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=oi(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||k(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function kt(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function At(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function jt({d:e,modelName:t}){let n=At(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Mt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(jt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Nt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=t.data??[],i=e.data??[];return(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no gpus reported`}):(0,A.jsx)(`div`,{className:`grid gap-12 `+kt(r.length),children:r.map(e=>(0,A.jsx)(Mt,{g:e,deployments:i,models:n.data??[]},e.index))})]})}function Pt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`overview`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=n.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,r=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:r===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` gpu / `,r.length,` active`]})]})]}),(0,A.jsx)(Nt,{})]})}function Ft({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function It(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(``),u=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),d=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),f=t.data??[],p=f.filter(e=>e.status===`ready`||e.status===`loading`),m=i?f:p,h=f.length-m.length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`deployments`}),(0,A.jsxs)(`div`,{className:`label`,children:[p.length,` active / `,f.length,` total`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:i,onChange:e=>a(e.target.checked)}),`show stopped `,h>0&&!i&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,h,`)`]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:c}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[m.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),m.map(e=>{let t=(n.data??[]).find(t=>t.id===e.model_id),i=(r.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,s=o===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:i===`local`?`text-mute`:`text-accent`,children:i})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ft,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:Ot(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:s,onClick:()=>d.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&u.mutate(e.id)},children:s?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Lt(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function Rt(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function zt(e){return e&&e!==`local`?e:null}var Bt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},Vt=e=>new Promise(t=>setTimeout(t,e));function Ht(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Ut(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await Vt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Wt(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Bt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Lt(f.gpuIds),n=Rt(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=zt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Ht(t))throw t;return Ut(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Bt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Bt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function Gt(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function Kt({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function qt(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function Jt({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:qt(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:qt(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function Yt({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(Jt,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var Xt={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},Zt={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function Qt({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(Xt),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Lt(u.gpu_ids),t=Rt(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:zt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(Xt),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(Zt),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(Zt),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(Kt,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(Yt,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function $t(){return(0,A.jsx)(Qt,{mode:`routes`})}function en(){return(0,A.jsx)(Qt,{mode:`profiles`})}var tn={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function nn({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function rn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??tn,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(nn,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(nn,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(nn,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(nn,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(nn,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(nn,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(nn,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(nn,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(nn,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(nn,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var an={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function on(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` -`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function sn({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function cn({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function ln({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function un(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...an}),[o,s]=(0,k.useState)({model:``,...an}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...an,model:e.model,pending:!0})),n&&s(e=>({...e,...an,model:e.model,pending:!0}));let t=[on(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(on(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(cn,{stats:i.stats})]}),(0,A.jsx)(sn,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(cn,{stats:o.stats})]}),(0,A.jsx)(sn,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(ln,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(ln,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function dn(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function fn({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function pn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function mn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(pn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[dn(o),` total`]})]}),(0,A.jsx)(pn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function hn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(fn,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(mn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function gn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function _n(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=gn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>gn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function vn(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function yn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function bn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function xn(e){switch(bn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function Sn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${vn(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:vn(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:vn(r)})]})]})]})}function Cn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${xn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):vn(yn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(Sn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function wn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return gn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>bn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(Cn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Tn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function En({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Dn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function On(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function kn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function An(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function jn({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function Mn({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${An(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${kn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Dn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Dn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:On(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(jn,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(jn,{values:r.series.request_rate})]})]})]})}function Nn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Pn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Dn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Fn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${An(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${kn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Dn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Dn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:On(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(Nn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Pn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function In({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Dn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Dn(t.total_vram_mb)]})]})]})}function Ln({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(Nn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Tn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Tn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Tn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Tn,{label:`vram`,value:Dn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(In,{nodes:l})}),r.data&&(0,A.jsx)(Ln,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(Mn,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Fn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(En,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function zn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function Bn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Vn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Hn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` -`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Wn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Vn.filter(e=>e.group===`public`),s=Vn.filter(e=>e.group===`cluster`),c=Vn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Hn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Hn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Hn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+zn(r.leader_url??`default`),children:Bn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Un(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Gn=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Pt}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:It},{id:`models`,label:`models`,component:Wt},{id:`adapters`,label:`adapters`,component:Gt},{id:`routes`,label:`routes`,component:$t},{id:`profiles`,label:`profiles`,component:en}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:wn},{id:`logs`,label:`logs`,component:_n},{id:`cluster`,label:`cluster`,component:Rn},{id:`predictor`,label:`predictor`,component:rn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:hn},{id:`settings`,label:`settings`,component:Wn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:un}]}];function Kn(e){return Gn.find(t=>t.id===e)??Gn[0]}function qn(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function Jn({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Gn.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function Yn({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function Xn(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function Zn(e,t){return t?`#/${e}/${t}`:`#/${e}`}function Qn(){let[e,t]=(0,k.useState)(()=>Xn(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(Xn(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=Zn(e,t)}]}function $n(){let[e,t]=Qn(),n=Kn(e.section),r=qn(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(Jn,{active:n.id,onSelect:e=>{let n=Kn(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(Yn,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var er=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:er,children:(0,A.jsx)($n,{})})})); \ No newline at end of file +`).replace(Ad,``)}function Md(e,t){return t=jd(t),jd(e)===t}function $(e,t,n,r,a,o){switch(n){case`children`:typeof r==`string`?t===`body`||t===`textarea`&&r===``||Jt(e,r):(typeof r==`number`||typeof r==`bigint`)&&t!==`body`&&Jt(e,``+r);break;case`className`:Mt(e,`class`,r);break;case`tabIndex`:Mt(e,`tabindex`,r);break;case`dir`:case`role`:case`viewBox`:case`width`:case`height`:Mt(e,n,r);break;case`style`:Zt(e,r,o);break;case`data`:if(t!==`object`){Mt(e,`data`,r);break}case`src`:case`href`:if(r===``&&(t!==`a`||n!==`href`)){e.removeAttribute(n);break}if(r==null||typeof r==`function`||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`action`:case`formAction`:if(typeof r==`function`){e.setAttribute(n,`javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')`);break}else typeof o==`function`&&(n===`formAction`?(t!==`input`&&$(e,t,`name`,a.name,a,null),$(e,t,`formEncType`,a.formEncType,a,null),$(e,t,`formMethod`,a.formMethod,a,null),$(e,t,`formTarget`,a.formTarget,a,null)):($(e,t,`encType`,a.encType,a,null),$(e,t,`method`,a.method,a,null),$(e,t,`target`,a.target,a,null)));if(r==null||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=tn(``+r),e.setAttribute(n,r);break;case`onClick`:r!=null&&(e.onclick=nn);break;case`onScroll`:r!=null&&Q(`scroll`,e);break;case`onScrollEnd`:r!=null&&Q(`scrollend`,e);break;case`dangerouslySetInnerHTML`:if(r!=null){if(typeof r!=`object`||!(`__html`in r))throw Error(i(61));if(n=r.__html,n!=null){if(a.children!=null)throw Error(i(60));e.innerHTML=n}}break;case`multiple`:e.multiple=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`muted`:e.muted=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`suppressContentEditableWarning`:case`suppressHydrationWarning`:case`defaultValue`:case`defaultChecked`:case`innerHTML`:case`ref`:break;case`autoFocus`:break;case`xlinkHref`:if(r==null||typeof r==`function`||typeof r==`boolean`||typeof r==`symbol`){e.removeAttribute(`xlink:href`);break}n=tn(``+r),e.setAttributeNS(`http://www.w3.org/1999/xlink`,`xlink:href`,n);break;case`contentEditable`:case`spellCheck`:case`draggable`:case`value`:case`autoReverse`:case`externalResourcesRequired`:case`focusable`:case`preserveAlpha`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``+r):e.removeAttribute(n);break;case`inert`:case`allowFullScreen`:case`async`:case`autoPlay`:case`controls`:case`default`:case`defer`:case`disabled`:case`disablePictureInPicture`:case`disableRemotePlayback`:case`formNoValidate`:case`hidden`:case`loop`:case`noModule`:case`noValidate`:case`open`:case`playsInline`:case`readOnly`:case`required`:case`reversed`:case`scoped`:case`seamless`:case`itemScope`:r&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``):e.removeAttribute(n);break;case`capture`:case`download`:!0===r?e.setAttribute(n,``):!1!==r&&r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`cols`:case`rows`:case`size`:case`span`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case`rowSpan`:case`start`:r==null||typeof r==`function`||typeof r==`symbol`||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case`popover`:Q(`beforetoggle`,e),Q(`toggle`,e),jt(e,`popover`,r);break;case`xlinkActuate`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:actuate`,r);break;case`xlinkArcrole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:arcrole`,r);break;case`xlinkRole`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:role`,r);break;case`xlinkShow`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:show`,r);break;case`xlinkTitle`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:title`,r);break;case`xlinkType`:Nt(e,`http://www.w3.org/1999/xlink`,`xlink:type`,r);break;case`xmlBase`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:base`,r);break;case`xmlLang`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:lang`,r);break;case`xmlSpace`:Nt(e,`http://www.w3.org/XML/1998/namespace`,`xml:space`,r);break;case`is`:jt(e,`is`,r);break;case`innerText`:case`textContent`:break;default:(!(2s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t],usageSeries:(e,t,n)=>[`usage-series`,e,t,n]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`),getUsageSeries:(e=86400,t=3600)=>P(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}`),getUsageByModel:(e=86400,t=3600)=>P(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}&group_by=model`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function kt(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function At(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function jt({d:e,modelName:t}){let n=At(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Mt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(jt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Nt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=t.data??[],i=e.data??[];return(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no gpus reported`}):(0,A.jsx)(`div`,{className:`grid gap-12 `+kt(r.length),children:r.map(e=>(0,A.jsx)(Mt,{g:e,deployments:i,models:n.data??[]},e.index))})]})}function Pt({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function Ft({title:e,value:t,sub:n,spark:r,badge:i,onClick:a}){return(0,A.jsxs)(`div`,{className:`space-y-3 border-l border-rule pl-5 `+(a?`cursor-pointer hover:border-accent transition-colors`:``),onClick:a,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tracking-tightish tnum`,children:t}),r&&r.length>0&&(0,A.jsx)(`div`,{className:`text-accent`,children:(0,A.jsx)(Pt,{values:r,width:120,height:22})}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:n}),i&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:i})]})}function It({buckets:e,height:t=56}){if(e.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no traffic in window`});let n=Math.max(1,...e.map(e=>e.count)),r=100/e.length;return(0,A.jsx)(`svg`,{width:`100%`,height:t,viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,"aria-label":`requests over time`,children:e.map((e,i)=>{let a=e.count/n*t;return(0,A.jsx)(`rect`,{x:i*r+1/2,y:t-a,width:Math.max(r-1,.4),height:a,className:`text-accent`,fill:`currentColor`,opacity:e.count===0?.15:.85,children:(0,A.jsxs)(`title`,{children:[e.count,` req`]})},i)})})}function Lt({groups:e,limit:t=5}){let n=e.slice(0,t);if(n.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no requests in window`});let r=Math.max(1,...n.map(e=>e.total));return(0,A.jsx)(`div`,{className:`space-y-2`,children:n.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,children:[(0,A.jsx)(`span`,{className:`font-mono text-ink truncate w-[14ch]`,title:e.label,children:e.label}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[8ch] text-right`,children:e.total.toLocaleString()}),(0,A.jsx)(`div`,{className:`flex-1 h-1 bg-rule-soft relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent`,style:{width:`${e.total/r*100}%`}})})]},e.key))})}function Rt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`);return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`active deployments`}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{location.hash=`#/serving/deployments`},children:`manage in serving →`})]}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`nothing loaded`}):(0,A.jsx)(`div`,{className:`space-y-1`,children:r.map(e=>{let r=(t.data??[]).find(t=>t.id===e.model_id),i=(n.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:r?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[7ch] text-right`,children:(e.gpu_ids??[]).length?`gpu ${(e.gpu_ids??[]).join(`,`)}`:`-`}),i!==`local`&&(0,A.jsx)(`span`,{className:`text-accent text-[10px]`,children:i})]},e.id)})})]})}function zt(e){let t=(e?.nodes??[]).flatMap(e=>e.deployments),n=0,r=0,i=0,a=0,o=0,s=0;for(let e of t){n+=e.in_flight,r+=e.requests_last_window,i+=e.errors_last_window;let t=e.requests_last_window||0;a+=e.latency_p50_ms*t,o+=e.latency_p95_ms*t,s+=t}let c=t.length?t.reduce((e,t)=>e+t.latency_p50_ms,0)/t.length:0,l=t.length?t.reduce((e,t)=>e+t.latency_p95_ms,0)/t.length:0;return{inFlight:n,requestsWindow:r,errorsWindow:i,errorRate:i/Math.max(r,1),latencyP50:s?a/s:c,latencyP95:s?o/s:l}}function Bt(e,t){if(e.length===0||t<=0)return{reqPerMin:0,tokPerSec:0,totalOut:0};let n=e.slice(-3),r=n.length*t,i=n.reduce((e,t)=>e+t.count,0),a=n.reduce((e,t)=>e+t.tokens_out,0),o=e.reduce((e,t)=>e+t.tokens_out,0);return{reqPerMin:r?i/r*60:0,tokPerSec:r?a/r:0,totalOut:o}}function Vt(e,t){return(0,A.jsxs)(A.Fragment,{children:[e,(0,A.jsxs)(`span`,{className:`text-mute text-[13px]`,children:[` `,t]})]})}function Ht(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=j({queryKey:N.metricsSnapshot,queryFn:F.getMetricsSnapshot,refetchInterval:2e3}),i=j({queryKey:N.usageSeries(3600,60,`none`),queryFn:()=>F.getUsageSeries(3600,60),refetchInterval:5e3}),a=j({queryKey:N.usageSeries(86400,3600,`none`),queryFn:()=>F.getUsageSeries(86400,3600),refetchInterval:3e4}),o=j({queryKey:N.usageSeries(86400,3600,`model`),queryFn:()=>F.getUsageByModel(86400,3600),refetchInterval:3e4}),s=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`),c=zt(r.data),l=i.data?.buckets??[],u=Bt(l,60),d=l.slice(-30).map(e=>e.count),f=l.slice(-30).map(e=>e.tokens_out);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`overview`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=n.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,r=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:r===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` gpu / `,s.length,` active`]})]})]}),(0,A.jsx)(Nt,{}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`request stats`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-y-8 gap-x-6`,children:[(0,A.jsx)(Ft,{title:`volume`,value:Vt(u.reqPerMin.toFixed(+(u.reqPerMin<10)),`req/min`),sub:`${c.inFlight} in flight`,spark:d,badge:`live`}),(0,A.jsx)(Ft,{title:`latency`,value:Vt(c.latencyP50.toFixed(0),`ms p50`),sub:`p95 ${c.latencyP95.toFixed(0)} ms`,badge:`live · 60s`}),(0,A.jsx)(Ft,{title:`errors`,value:Vt((c.errorRate*100).toFixed(1),`%`),sub:(0,A.jsxs)(`span`,{className:`text-accent`,children:[c.errorsWindow,` recent → see traffic`]}),badge:`live · 60s`,onClick:()=>{location.hash=`#/observe/requests`}}),(0,A.jsx)(Ft,{title:`throughput`,value:Vt(u.tokPerSec.toFixed(0),`tok/s`),sub:`${u.totalOut.toLocaleString()} out tok · 1h`,spark:f,badge:`live`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`traffic over time`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:`last 24h · bounded by retention`})]}),(0,A.jsx)(It,{buckets:a.data?.buckets??[]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-12 gap-y-10`,children:[(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`top models · 24h`}),(0,A.jsx)(Lt,{groups:o.data?.groups??[]})]}),(0,A.jsx)(`section`,{children:(0,A.jsx)(Rt,{})})]})]})}function Ut({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function Wt(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(``),u=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),d=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),f=t.data??[],p=f.filter(e=>e.status===`ready`||e.status===`loading`),m=i?f:p,h=f.length-m.length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`deployments`}),(0,A.jsxs)(`div`,{className:`label`,children:[p.length,` active / `,f.length,` total`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:i,onChange:e=>a(e.target.checked)}),`show stopped `,h>0&&!i&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,h,`)`]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:c}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[m.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),m.map(e=>{let t=(n.data??[]).find(t=>t.id===e.model_id),i=(r.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,s=o===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:i===`local`?`text-mute`:`text-accent`,children:i})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ut,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:Ot(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:s,onClick:()=>d.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&u.mutate(e.id)},children:s?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Gt(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function Kt(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function qt(e){return e&&e!==`local`?e:null}var Jt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},Yt=e=>new Promise(t=>setTimeout(t,e));function Xt(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Zt(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await Yt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Qt(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Jt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Gt(f.gpuIds),n=Kt(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=qt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Xt(t))throw t;return Zt(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Jt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Jt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function $t(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function en({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function tn(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function nn({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:tn(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:tn(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function rn({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(nn,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var an={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},on={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function sn({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(an),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Gt(u.gpu_ids),t=Kt(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:qt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(an),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(on),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(on),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(en,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(rn,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function cn(){return(0,A.jsx)(sn,{mode:`routes`})}function ln(){return(0,A.jsx)(sn,{mode:`profiles`})}var un={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function dn({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function fn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??un,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(dn,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(dn,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(dn,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(dn,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(dn,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(dn,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(dn,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(dn,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(dn,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(dn,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var pn={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function mn(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` +`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function hn({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function gn({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function _n({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function vn(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...pn}),[o,s]=(0,k.useState)({model:``,...pn}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...pn,model:e.model,pending:!0})),n&&s(e=>({...e,...pn,model:e.model,pending:!0}));let t=[mn(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(mn(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(gn,{stats:i.stats})]}),(0,A.jsx)(hn,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(gn,{stats:o.stats})]}),(0,A.jsx)(hn,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(_n,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(_n,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function yn(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function bn({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function xn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function Sn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(xn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[yn(o),` total`]})]}),(0,A.jsx)(xn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function Cn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(bn,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(Sn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function wn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function Tn(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=wn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>wn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function En(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function Dn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function On(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function kn(e){switch(On(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function An({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${En(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:En(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:En(r)})]})]})]})}function jn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${kn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):En(Dn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(An,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function Mn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return wn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>On(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(jn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Nn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function Pn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Fn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function In(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Ln(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function Rn(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function zn({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${Rn(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Ln(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Fn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Fn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:In(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(Pt,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(Pt,{values:r.series.request_rate})]})]})]})}function Bn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Vn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Fn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Hn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${Rn(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Ln(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Fn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Fn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:In(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(Bn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Vn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function Un({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Fn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Fn(t.total_vram_mb)]})]})]})}function Wn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(Bn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Nn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Nn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Nn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Nn,{label:`vram`,value:Fn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(Un,{nodes:l})}),r.data&&(0,A.jsx)(Wn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(zn,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Hn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(Pn,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function Kn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function qn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Jn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Yn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` +`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Zn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Jn.filter(e=>e.group===`public`),s=Jn.filter(e=>e.group===`cluster`),c=Jn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Yn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Yn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Yn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Kn(r.leader_url??`default`),children:qn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Xn(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Qn=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Ht}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:Wt},{id:`models`,label:`models`,component:Qt},{id:`adapters`,label:`adapters`,component:$t},{id:`routes`,label:`routes`,component:cn},{id:`profiles`,label:`profiles`,component:ln}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:Mn},{id:`logs`,label:`logs`,component:Tn},{id:`cluster`,label:`cluster`,component:Gn},{id:`predictor`,label:`predictor`,component:fn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:Cn},{id:`settings`,label:`settings`,component:Zn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:vn}]}];function $n(e){return Qn.find(t=>t.id===e)??Qn[0]}function er(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function tr({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Qn.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function nr({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function rr(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function ir(e,t){return t?`#/${e}/${t}`:`#/${e}`}function ar(){let[e,t]=(0,k.useState)(()=>rr(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(rr(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=ir(e,t)}]}function or(){let[e,t]=ar(),n=$n(e.section),r=er(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(tr,{active:n.id,onSelect:e=>{let n=$n(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(nr,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var sr=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:sr,children:(0,A.jsx)(or,{})})})); \ No newline at end of file diff --git a/src/berth/ui/index.html b/src/berth/ui/index.html index e396c8a..807ce5e 100644 --- a/src/berth/ui/index.html +++ b/src/berth/ui/index.html @@ -15,8 +15,8 @@ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> - - + +
diff --git a/ui/src/api.ts b/ui/src/api.ts index 42a3ab1..8413a46 100644 --- a/ui/src/api.ts +++ b/ui/src/api.ts @@ -32,6 +32,8 @@ export const queryKeys = { node: (nodeId: number) => ['node', nodeId] as const, keyUsage: (keyId: number, scope: 'spark' | 'detail') => ['key-usage', keyId, scope] as const, + usageSeries: (windowS: number, bucketS: number, groupBy: string) => + ['usage-series', windowS, bucketS, groupBy] as const, } export async function eventSourceUrl(path: string): Promise { @@ -360,6 +362,13 @@ export const api = { getConfig: () => jfetch('GET', '/admin/config'), getMetricsSnapshot: () => jfetch('GET', '/admin/metrics/snapshot'), + getUsageSeries: (windowS = 86400, bucketS = 3600) => + jfetch('GET', `/admin/usage/series?window_s=${windowS}&bucket_s=${bucketS}`), + getUsageByModel: (windowS = 86400, bucketS = 3600) => + jfetch( + 'GET', + `/admin/usage/series?window_s=${windowS}&bucket_s=${bucketS}&group_by=model`, + ), } export type MetricsSnapshotGpu = { @@ -392,6 +401,35 @@ export type MetricsSnapshotNode = { export type MetricsSnapshot = { nodes: MetricsSnapshotNode[] } +// Usage-series (Overview volume/throughput + history). Bounded by retention. +export type UsageBucket = { + bucket_idx: number + ts_offset_s: number + count: number + tokens_in: number + tokens_out: number +} +export type UsageSeries = { + window_s: number + bucket_s: number + group_by: null + buckets: UsageBucket[] +} +export type UsageGroup = { + key: string + label: string + total: number + tokens_in: number + tokens_out: number + buckets: UsageBucket[] +} +export type UsageSeriesGrouped = { + window_s: number + bucket_s: number + group_by: 'model' | 'key' + groups: UsageGroup[] +} + // Cluster types. export type Node = { diff --git a/ui/src/views/overview/DeploymentsGlance.tsx b/ui/src/views/overview/DeploymentsGlance.tsx new file mode 100644 index 0000000..b846f9f --- /dev/null +++ b/ui/src/views/overview/DeploymentsGlance.tsx @@ -0,0 +1,49 @@ +import { useQuery } from '@tanstack/react-query' +import { api, queryKeys } from '../../api' + +// Read-only snapshot of what's running. Actions live in Serving > Deployments. +export default function DeploymentsGlance() { + const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) + const models = useQuery({ queryKey: queryKeys.models, queryFn: api.listModels, refetchInterval: 5000 }) + const nodes = useQuery({ queryKey: queryKeys.nodes, queryFn: api.listNodes, refetchInterval: 5000 }) + + const active = (deps.data ?? []).filter(d => d.status === 'ready' || d.status === 'loading') + + return ( +
+
+
active deployments
+ +
+ {active.length === 0 ? ( +
nothing loaded
+ ) : ( +
+ {active.map(d => { + const m = (models.data ?? []).find(m => m.id === d.model_id) + const node = (nodes.data?.nodes ?? []).find(n => n.id === d.node_id) + const nodeLabel = node?.label ?? (d.node_id ? `#${d.node_id}` : 'local') + return ( +
+ + {m?.name ?? `#${d.id}`} + {d.backend} + + {(d.gpu_ids ?? []).length ? `gpu ${(d.gpu_ids ?? []).join(',')}` : '-'} + + {nodeLabel !== 'local' && ( + {nodeLabel} + )} +
+ ) + })} +
+ )} +
+ ) +} diff --git a/ui/src/views/overview/Overview.tsx b/ui/src/views/overview/Overview.tsx index c571f0a..de39bf9 100644 --- a/ui/src/views/overview/Overview.tsx +++ b/ui/src/views/overview/Overview.tsx @@ -1,14 +1,47 @@ import { useQuery } from '@tanstack/react-query' import { api, queryKeys } from '../../api' import HealthStrip from './HealthStrip' +import StatTile from './StatTile' +import TrafficChart from './TrafficChart' +import TopModels from './TopModels' +import DeploymentsGlance from './DeploymentsGlance' +import { aggregateSnapshot, recentRates } from './useOverviewStats' + +function unit(value: string, u: string) { + return <>{value} {u} +} export default function Overview() { const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) const gpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) const nodes = useQuery({ queryKey: queryKeys.nodes, queryFn: api.listNodes, refetchInterval: 5000 }) + const snap = useQuery({ queryKey: queryKeys.metricsSnapshot, queryFn: api.getMetricsSnapshot, refetchInterval: 2000 }) + + // Live volume/throughput: last hour in 60s buckets, refreshed often. + const live = useQuery({ + queryKey: queryKeys.usageSeries(3600, 60, 'none'), + queryFn: () => api.getUsageSeries(3600, 60), + refetchInterval: 5000, + }) + // History: last 24h in 1h buckets. + const history = useQuery({ + queryKey: queryKeys.usageSeries(86400, 3600, 'none'), + queryFn: () => api.getUsageSeries(86400, 3600), + refetchInterval: 30000, + }) + const byModel = useQuery({ + queryKey: queryKeys.usageSeries(86400, 3600, 'model'), + queryFn: () => api.getUsageByModel(86400, 3600), + refetchInterval: 30000, + }) const all = deps.data ?? [] const active = all.filter(d => d.status === 'ready' || d.status === 'loading') + const stats = aggregateSnapshot(snap.data) + const liveBuckets = live.data?.buckets ?? [] + const rates = recentRates(liveBuckets, 60) + const volSpark = liveBuckets.slice(-30).map(b => b.count) + const tokSpark = liveBuckets.slice(-30).map(b => b.tokens_out) return (
@@ -36,7 +69,60 @@ export default function Overview() { - {/* request stats — Phase 4 (StatTiles, TrafficChart, TopModels, DeploymentsGlance) */} +
+
request stats
+
+ + + {stats.errorsWindow} recent → see traffic + } + badge="live · 60s" + onClick={() => { location.hash = '#/observe/requests' }} + /> + +
+
+ +
+
+
traffic over time
+
+ last 24h · bounded by retention +
+
+ +
+ +
+
+
top models · 24h
+ +
+
+ +
+
) } diff --git a/ui/src/views/overview/StatTile.tsx b/ui/src/views/overview/StatTile.tsx new file mode 100644 index 0000000..703fbd2 --- /dev/null +++ b/ui/src/views/overview/StatTile.tsx @@ -0,0 +1,35 @@ +import type { ReactNode } from 'react' +import { Sparkline } from '../../components/Sparkline' + +export default function StatTile({ + title, value, sub, spark, badge, onClick, +}: { + title: string + value: ReactNode + sub?: ReactNode + spark?: number[] + badge?: string + onClick?: () => void +}) { + return ( +
+
{title}
+
{value}
+ {spark && spark.length > 0 && ( +
+ +
+ )} + {sub &&
{sub}
} + {badge && ( +
{badge}
+ )} +
+ ) +} diff --git a/ui/src/views/overview/TopModels.tsx b/ui/src/views/overview/TopModels.tsx new file mode 100644 index 0000000..199b705 --- /dev/null +++ b/ui/src/views/overview/TopModels.tsx @@ -0,0 +1,28 @@ +import type { UsageGroup } from '../../api' + +export default function TopModels({ groups, limit = 5 }: { + groups: UsageGroup[] + limit?: number +}) { + const top = groups.slice(0, limit) + if (top.length === 0) { + return
no requests in window
+ } + const max = Math.max(1, ...top.map(g => g.total)) + return ( +
+ {top.map(g => ( +
+ {g.label} + {g.total.toLocaleString()} +
+
+
+
+ ))} +
+ ) +} diff --git a/ui/src/views/overview/TrafficChart.tsx b/ui/src/views/overview/TrafficChart.tsx new file mode 100644 index 0000000..b241b27 --- /dev/null +++ b/ui/src/views/overview/TrafficChart.tsx @@ -0,0 +1,43 @@ +import type { UsageBucket } from '../../api' + +// Minimal dependency-free bar chart of request volume per bucket. Same +// aesthetic as Sparkline (currentColor, thin), scaled to the container. +export default function TrafficChart({ buckets, height = 56 }: { + buckets: UsageBucket[] + height?: number +}) { + if (buckets.length === 0) { + return
no traffic in window
+ } + const max = Math.max(1, ...buckets.map(b => b.count)) + const n = buckets.length + const gap = 1 + const barW = 100 / n + return ( + + {buckets.map((b, i) => { + const h = (b.count / max) * height + return ( + + {b.count} req + + ) + })} + + ) +} diff --git a/ui/src/views/overview/useOverviewStats.ts b/ui/src/views/overview/useOverviewStats.ts new file mode 100644 index 0000000..ebbe8d0 --- /dev/null +++ b/ui/src/views/overview/useOverviewStats.ts @@ -0,0 +1,59 @@ +import type { MetricsSnapshot, UsageBucket } from '../../api' + +export type OverviewStats = { + inFlight: number + requestsWindow: number + errorsWindow: number + errorRate: number + latencyP50: number + latencyP95: number +} + +// Aggregate the per-deployment metrics snapshot into top-line numbers. +// Percentiles can't be summed: p50/p95 are request-weighted means across +// deployments (a live approximation, not a true global percentile). Kept as +// a pure function so it's testable without a framework. +export function aggregateSnapshot(snap: MetricsSnapshot | undefined): OverviewStats { + const deps = (snap?.nodes ?? []).flatMap(n => n.deployments) + let inFlight = 0, req = 0, err = 0, wP50 = 0, wP95 = 0, w = 0 + for (const d of deps) { + inFlight += d.in_flight + req += d.requests_last_window + err += d.errors_last_window + const weight = d.requests_last_window || 0 + wP50 += d.latency_p50_ms * weight + wP95 += d.latency_p95_ms * weight + w += weight + } + // Fall back to a simple mean when no requests landed in the window. + const simpleP50 = deps.length ? deps.reduce((s, d) => s + d.latency_p50_ms, 0) / deps.length : 0 + const simpleP95 = deps.length ? deps.reduce((s, d) => s + d.latency_p95_ms, 0) / deps.length : 0 + return { + inFlight, + requestsWindow: req, + errorsWindow: err, + errorRate: err / Math.max(req, 1), + latencyP50: w ? wP50 / w : simpleP50, + latencyP95: w ? wP95 / w : simpleP95, + } +} + +// Volume rate (req/min) and throughput (tokens/sec) from recent usage buckets. +export function recentRates(buckets: UsageBucket[], bucketS: number): { + reqPerMin: number + tokPerSec: number + totalOut: number +} { + if (buckets.length === 0 || bucketS <= 0) return { reqPerMin: 0, tokPerSec: 0, totalOut: 0 } + // Average over the most recent few buckets for a steadier live read. + const tail = buckets.slice(-3) + const seconds = tail.length * bucketS + const count = tail.reduce((s, b) => s + b.count, 0) + const out = tail.reduce((s, b) => s + b.tokens_out, 0) + const totalOut = buckets.reduce((s, b) => s + b.tokens_out, 0) + return { + reqPerMin: seconds ? (count / seconds) * 60 : 0, + tokPerSec: seconds ? out / seconds : 0, + totalOut, + } +} From 37aec5004c2332b3de06c2e3c1454696b78a07fb Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 18:55:05 +0200 Subject: [PATCH 5/5] fix(store): build usage-series SQL from literal queries (bandit B608) series_in_window interpolated the group-by column into an f-string query, which Bandit flagged as a possible SQL-injection vector (B608) and failed the Security CI job. The column was always an internal whitelist value, not user input, but switch to fully literal per-branch queries so there is no string-built SQL at all. Behavior unchanged; tests still green. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/store/usage_events.py | 72 ++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/src/berth/store/usage_events.py b/src/berth/store/usage_events.py index ebaadf6..8ec34ca 100644 --- a/src/berth/store/usage_events.py +++ b/src/berth/store/usage_events.py @@ -183,26 +183,58 @@ def _fill(buckets: list[dict], by_idx: dict) -> None: b["tokens_in"] = int(r["tokens_in"]) b["tokens_out"] = int(r["tokens_out"]) - select_grp = f"{col} AS grp," if col else "" - group_grp = "grp, " if col else "" - rows = conn.execute( - f""" - SELECT - {select_grp} - CAST( - (CAST(strftime('%s', 'now') AS INTEGER) - - CAST(strftime('%s', ts) AS INTEGER)) / ? - AS INTEGER - ) AS bucket_idx, - COUNT(*) AS count, - COALESCE(SUM(tokens_in), 0) AS tokens_in, - COALESCE(SUM(tokens_out), 0) AS tokens_out - FROM usage_events - WHERE ts > datetime('now', ?) - GROUP BY {group_grp}bucket_idx - """, - (bucket_s, f"-{window_s} seconds"), - ).fetchall() + # Fully literal SQL per group_by case — no string interpolation of column + # names into the query (avoids SQL-injection surface entirely; the group + # column is an internal whitelist, never user input). Only the bucket width + # and window are bound parameters. + params = (bucket_s, f"-{window_s} seconds") + if col is None: + rows = conn.execute( + """ + SELECT + CAST((CAST(strftime('%s', 'now') AS INTEGER) + - CAST(strftime('%s', ts) AS INTEGER)) / ? AS INTEGER) AS bucket_idx, + COUNT(*) AS count, + COALESCE(SUM(tokens_in), 0) AS tokens_in, + COALESCE(SUM(tokens_out), 0) AS tokens_out + FROM usage_events + WHERE ts > datetime('now', ?) + GROUP BY bucket_idx + """, + params, + ).fetchall() + elif col == "model_name": + rows = conn.execute( + """ + SELECT + model_name AS grp, + CAST((CAST(strftime('%s', 'now') AS INTEGER) + - CAST(strftime('%s', ts) AS INTEGER)) / ? AS INTEGER) AS bucket_idx, + COUNT(*) AS count, + COALESCE(SUM(tokens_in), 0) AS tokens_in, + COALESCE(SUM(tokens_out), 0) AS tokens_out + FROM usage_events + WHERE ts > datetime('now', ?) + GROUP BY grp, bucket_idx + """, + params, + ).fetchall() + else: # col == "api_key_id" + rows = conn.execute( + """ + SELECT + api_key_id AS grp, + CAST((CAST(strftime('%s', 'now') AS INTEGER) + - CAST(strftime('%s', ts) AS INTEGER)) / ? AS INTEGER) AS bucket_idx, + COUNT(*) AS count, + COALESCE(SUM(tokens_in), 0) AS tokens_in, + COALESCE(SUM(tokens_out), 0) AS tokens_out + FROM usage_events + WHERE ts > datetime('now', ?) + GROUP BY grp, bucket_idx + """, + params, + ).fetchall() if col is None: out = _empty_buckets()