@usex/mikrotik-mcp 4.20.0 → 4.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/dist/shared/{cli-fa29149s.js → cli-4tycy2mf.js} +3577 -3566
- package/dist/shared/{cli-cdxrs0vz.js → cli-g27x73vg.js} +1 -1
- package/dist/shared/{library-ypdm9bkx.js → library-v21pwa2g.js} +3577 -3566
- package/dist/shared/{library-g5p25m9e.js → library-w7gzvedz.js} +1 -1
- package/dist/ui/observability.html +4 -4
- package/package.json +1 -1
- package/schemas/tool-catalog.json +34 -9
- package/schemas/tools/add_ovpn_server.json +1 -0
- package/schemas/tools/build_wireguard_mesh.json +3 -2
- package/schemas/tools/create_bridge.json +1 -0
- package/schemas/tools/create_eoip_tunnel.json +1 -0
- package/schemas/tools/create_gre_tunnel.json +1 -0
- package/schemas/tools/create_ipip_tunnel.json +1 -0
- package/schemas/tools/create_l2tp_client.json +1 -0
- package/schemas/tools/create_ovpn_client.json +1 -0
- package/schemas/tools/create_pptp_client.json +1 -0
- package/schemas/tools/create_sstp_client.json +1 -0
- package/schemas/tools/create_vlan_interface.json +1 -0
- package/schemas/tools/create_vxlan_tunnel.json +1 -0
- package/schemas/tools/create_wireguard_interface.json +3 -1
- package/schemas/tools/create_wireless_interface.json +3 -1
- package/schemas/tools/design_network_segment.json +1 -0
- package/schemas/tools/update_bridge.json +3 -1
- package/schemas/tools/update_vlan_interface.json +3 -1
- package/schemas/tools/update_wireguard_interface.json +3 -1
- package/schemas/tools/update_wireless_interface.json +3 -1
|
@@ -142,7 +142,7 @@ ${n.map(([e,n])=>{let r=n.theme?.[t]??n.color;return r?` --color-${e}: ${r};`:n
|
|
|
142
142
|
`).length;return(0,W.jsxs)(`div`,{className:`border-border bg-background flex max-h-[420px] overflow-hidden rounded-md border`,children:[(0,W.jsx)(`pre`,{className:`bg-muted text-muted-foreground m-0 min-w-[38px] overflow-hidden px-2 py-2.5 text-right font-mono text-xs leading-[1.5] select-none`,"aria-hidden":`true`,ref:f,children:Array.from({length:y},(e,t)=>t+1).join(`
|
|
143
143
|
`)}),(0,W.jsxs)(`div`,{className:`relative flex-1`,children:[(0,W.jsxs)(`pre`,{className:`text-muted-foreground pointer-events-none absolute inset-0 z-0 m-0 box-border overflow-hidden px-3 py-2.5 font-mono text-xs leading-[1.5] whitespace-pre [tab-size:2] [&_.j-bool]:text-chart-4 [&_.j-key]:text-chart-1 [&_.j-null]:text-muted-foreground [&_.j-num]:text-chart-3 [&_.j-str]:text-chart-2`,"aria-hidden":`true`,ref:d,children:[T7(r),`
|
|
144
144
|
`]}),(0,W.jsx)(BS,{ref:l,className:`caret-brand selection:bg-brand/35 relative z-[1] m-0 box-border h-[400px] min-h-0 w-full resize-y rounded-none border-0 bg-transparent px-3 py-2.5 font-mono text-xs leading-[1.5] whitespace-pre text-transparent shadow-none [field-sizing:fixed] [tab-size:2] outline-none focus-visible:border-0 focus-visible:ring-0 dark:bg-transparent`,spellCheck:!1,wrap:`off`,value:r,onChange:e=>{i(e.target.value),h(e.currentTarget)},onKeyDown:_,onClick:()=>c(null),onScroll:e=>{let t=e.currentTarget;d.current&&(d.current.scrollTop=t.scrollTop,d.current.scrollLeft=t.scrollLeft),f.current&&(f.current.scrollTop=t.scrollTop)}}),s&&(0,W.jsx)(`div`,{className:`border-brand bg-card absolute z-[5] max-h-[184px] min-w-[150px] overflow-y-auto rounded-md border shadow-lg`,style:{left:s.x,top:s.y},children:s.items.map((e,t)=>(0,W.jsx)(`div`,{className:q(`cursor-pointer px-[11px] py-[5px] font-mono text-xs`,t===s.index?`bg-brand/20 text-foreground`:`text-muted-foreground`),onMouseDown:t=>{t.preventDefault(),g(e)},children:e},e))})]})]})}var o9=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:{};function kte({initial:e,onClose:t,onReload:n}){let[r,i]=(0,v.useState)(()=>o9(e)),[a,o]=(0,v.useState)(`form`),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)([]),[d,f]=(0,v.useState)({}),[p,m]=(0,v.useState)(null),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(0),[b,x]=(0,v.useState)(6e4),[S,C]=(0,v.useState)(null);(0,v.useEffect)(()=>{let e=setTimeout(()=>{_c(`/api/config/validate`,r).then(e=>u(e.errors??[])).catch(()=>{})},350);return()=>clearTimeout(e)},[r]),(0,v.useEffect)(()=>{if(!h||_<=0)return;let e=setInterval(()=>y(e=>Math.max(0,e-1)),1e3);return()=>clearInterval(e)},[h,_]);let w=(0,v.useRef)(n);w.current=n,(0,v.useEffect)(()=>{h&&_===0&&(h.rollbackMs??0)>0&&(C(`Auto-reverted — changes were not confirmed in time.`),g(null),w.current())},[h,_]);let T=!s&&l.length===0,E=async()=>{let e=o9(r.devices);if(Object.keys(e).length===0){C(`No devices configured to test — add one first.`),J.error(`No devices to test`);return}f({}),C(`Testing devices…`);let t={};for(let[n,r]of Object.entries(e)){let e=await _c(`/api/config/test-device`,{name:n,config:r}).catch(()=>({ok:!1}));t[n]=e.ok&&e.status?.reachable===!0?{ok:!0,label:`${Math.round(e.status.latencyMs??0)}ms · ${e.status.identity??`ok`}`}:{ok:!1,label:e.status?.error??e.errors?.[0]?.message??`unreachable`},f({...t})}C(null),Object.values(t).every(e=>e.ok)?J.success(`Devices reachable`):J.error(`Some devices unreachable`)},D=async()=>{m(await _c(`/api/config/preview`,r))},O=async()=>{C(`Saving…`);try{let e=await _c(`/api/config`,{config:r,rollbackMs:b});if(C(null),m(null),!e.ok){u(e.errors??[{path:`(root)`,message:`save rejected`}]),J.error(e.errors?.[0]?.message??`Config save rejected`);return}g(e),y(Math.round((e.rollbackMs??0)/1e3)),J.success(`Config applied`)}catch(e){C(null),J.error(e instanceof Error?e.message:`Save failed`)}},k=async()=>{if(h?.pendingId)try{await _c(`/api/config/keep`,{pendingId:h.pendingId}),g(null),C(`Changes kept.`),n(),J.success(`Change kept`)}catch(e){J.error(e instanceof Error?e.message:`Keep failed`)}},A=async()=>{if(h?.pendingId)try{await _c(`/api/config/rollback`,{pendingId:h.pendingId}),g(null),C(`Reverted to the previous config.`),n(),J.success(`Change rolled back`)}catch(e){J.error(e instanceof Error?e.message:`Rollback failed`)}};return(0,W.jsxs)(`div`,{className:`flex flex-col gap-2.5`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,W.jsxs)(`div`,{className:`border-border bg-muted inline-flex gap-0.5 rounded-md border p-0.5`,children:[(0,W.jsxs)(`button`,{className:q(`flex cursor-pointer items-center gap-1.5 rounded-[6px] border-0 bg-transparent px-[11px] py-1 text-xs font-semibold`,a===`form`?`bg-card text-foreground shadow-sm`:`text-muted-foreground`),onClick:()=>{c(null),o(`form`)},children:[(0,W.jsx)(Gc,{className:`size-3.5`}),` Form`]}),(0,W.jsxs)(`button`,{className:q(`flex cursor-pointer items-center gap-1.5 rounded-[6px] border-0 bg-transparent px-[11px] py-1 text-xs font-semibold`,a===`json`?`bg-card text-foreground shadow-sm`:`text-muted-foreground`),onClick:()=>o(`json`),children:[(0,W.jsx)(Nc,{className:`size-3.5`}),` JSON`]})]}),(0,W.jsx)(`span`,{className:q(`rounded-full border px-2.5 py-1 font-mono text-[11px]`,T?`border-success/40 bg-success/10 text-success`:`border-destructive/40 bg-destructive/10 text-destructive`),children:s?`invalid JSON`:l.length?`${l.length} schema issue(s)`:`valid ✓`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void E(),children:`Test devices`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void D(),disabled:!T,children:`Preview diff`}),(0,W.jsx)(Xx,{size:`sm`,value:String(b),onValueChange:e=>x(Number(e)),options:Dte.map(([e,t])=>({value:String(t),label:e})),"aria-label":`Auto-revert window`}),(0,W.jsx)(X,{size:`sm`,type:`accent`,onClick:()=>void O(),disabled:!T||!!h,children:`Save`}),(0,W.jsx)(X,{size:`sm`,onClick:t,children:`Close`})]}),S&&(0,W.jsx)(`div`,{className:`text-muted-foreground font-mono text-xs`,children:S}),h&&(0,W.jsxs)(`div`,{className:`border-warning/40 bg-warning/10 flex flex-wrap items-center gap-2 rounded-md border px-3 py-2.5 text-xs`,children:[(0,W.jsx)(`strong`,{children:`Applied.`}),` `,(h.rollbackMs??0)>0?(0,W.jsxs)(W.Fragment,{children:[`Reverting in `,(0,W.jsxs)(`span`,{className:`text-warning font-mono font-bold`,children:[_,`s`]}),` `,`unless you keep it.`]}):(0,W.jsx)(W.Fragment,{children:`Saved without an auto-revert window.`}),h.devicesChanged&&(0,W.jsxs)(`span`,{className:`text-warning text-[11px]`,children:[` `,`· device list changed — reconnect the MCP client to expose it to the model`]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{size:`sm`,type:`accent`,onClick:()=>void k(),children:`Keep changes`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void A(),children:`Revert now`})]}),Object.keys(d).length>0&&(0,W.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:Object.entries(d).map(([e,t])=>(0,W.jsxs)(`span`,{className:q(`rounded-full border px-2.5 py-1 font-mono text-[11px]`,t.ok?`border-success/40 text-success`:`border-destructive/40 text-destructive`),children:[t.ok?`●`:`○`,` `,e,`: `,t.label]},e))}),a===`form`?(0,W.jsx)(wte,{cfg:r,onChange:i}):(0,W.jsx)(Ote,{value:r,onChange:e=>i(o9(e)),onJsonError:c}),(s||l.length>0)&&(0,W.jsx)(`div`,{className:`flex flex-col gap-[3px]`,children:s?(0,W.jsxs)(`div`,{className:`text-destructive font-mono text-[11px]`,children:[`JSON: `,s]}):l.slice(0,12).map((e,t)=>(0,W.jsxs)(`div`,{className:`text-destructive font-mono text-[11px]`,children:[(0,W.jsx)(`code`,{className:`text-warning`,children:e.path}),` — `,e.message]},t))}),p&&(0,W.jsxs)(`div`,{className:`border-border overflow-hidden rounded-md border`,children:[(0,W.jsxs)(`div`,{className:`bg-muted flex items-center gap-2 px-[13px] py-[9px] text-xs`,children:[(0,W.jsx)(`strong`,{children:`Diff vs current`}),(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:p.summary?.changed?`+${p.summary.added} / -${p.summary.removed}`:`no changes`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,icon:(0,W.jsx)(_l,{className:`size-4`}),onClick:()=>m(null),"aria-label":`Close preview`})]}),(0,W.jsx)(`pre`,{className:`bg-background text-muted-foreground m-0 max-h-[320px] overflow-auto px-3 py-2.5 font-mono text-[11px] leading-[1.5]`,children:(p.unified||`(identical)`).split(`
|
|
145
|
-
`).map((e,t)=>(0,W.jsx)(`div`,{className:e.startsWith(`+`)?`text-success`:e.startsWith(`-`)?`text-destructive`:e.startsWith(`@@`)?`text-brand`:``,children:e||` `},t))})]})]})}function Ate({x:e,y:t,text:n,className:r,textClassName:i,padX:a=9,fontSize:o=9}){let s=(0,v.useRef)(null),[c,l]=(0,v.useState)(()=>n.length*o*.62);(0,v.useLayoutEffect)(()=>{let e=s.current?.getComputedTextLength();e&&e>0&&l(e)},[n,o]);let u=Math.round(c+a*2);return(0,W.jsxs)(`g`,{transform:`translate(${e.toFixed(1)},${t.toFixed(1)})`,children:[(0,W.jsx)(`rect`,{className:r,x:-u/2,y:-9,rx:9,width:u,height:18}),(0,W.jsx)(`text`,{ref:s,className:i,x:0,y:3.5,textAnchor:`middle`,fontSize:o,children:n})]})}function s9(e){return e.reachable===!0?{label:`online`,color:`var(--foreground)`}:e.reachable===!1?{label:`offline`,color:`var(--destructive)`}:{label:`checking…`,color:`var(--muted-foreground)`}}function c9(e,t){let n=[...new Set(t)].sort(),r=Math.max(1,n.length),i=Math.max(0,n.indexOf(e));return`hsl(${Math.round(i*360/r)} 70% ${62-i%3*5}%)`}function l9(e,t,n,r){let i=1-r;return{x:i*i*e.x+2*i*r*t.x+r*r*n.x,y:i*i*e.y+2*i*r*t.y+r*r*n.y}}function u9(e,t,n,r){let i=1-r,a=2*i*(t.x-e.x)+2*r*(n.x-t.x),o=2*i*(t.y-e.y)+2*r*(n.y-t.y);return Math.atan2(o,a)*180/Math.PI}var d9=`var(--foreground)`,f9=`var(--muted-foreground)`,p9=`var(--warning)`;function m9(e){return e.jumpVia?e.jumpVia:e.jumpHost?`${e.jumpHost.host}:${e.jumpHost.port}`:null}var h9=18,jte=e=>e.length>h9?`${e.slice(0,h9-1)}…`:e,Mte=e=>Math.max(23,Math.min(70,e.length*3.1+12));function Nte({payload:e,pulses:t}){let n=e.devices,r=Math.max(1,n.length),i=n.map(e=>e.name),a=n.map(e=>{let t=jte(e.name);return{d:e,label:t,r:Mte(t)}}),o=Math.max(23,...a.map(e=>e.r)),s=r>1?(o+18)/Math.sin(Math.PI/r):0,c=Math.max(110+o,s,120),l=o+60,u=Math.max(700,Math.round((c+o+40)*2)),d=Math.round((c+l)*2),f=u/2,p=d/2,m={x:f,y:p},h=a.map((e,t)=>{let n=t/r*Math.PI*2-Math.PI/2+(r%2==0?Math.PI/r:0);return{...e,i:t,x:f+c*Math.cos(n),y:p+c*Math.sin(n)}});return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`svg`,{className:`conn`,viewBox:`0 0 ${u} ${d}`,width:`100%`,height:d,preserveAspectRatio:`xMidYMid meet`,children:[(0,W.jsxs)(`defs`,{children:[(0,W.jsxs)(`radialGradient`,{id:`conn-hub`,cx:`0.5`,cy:`0.34`,r:`0.75`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`0.6`,stopColor:`color-mix(in srgb, var(--foreground) 70%, var(--muted-foreground))`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`})]}),(0,W.jsxs)(`radialGradient`,{id:`conn-orb`,cx:`0.5`,cy:`0.32`,r:`0.85`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--muted)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--card)`})]}),(0,W.jsxs)(`radialGradient`,{id:`conn-burst`,cx:`0.5`,cy:`0.5`,r:`0.5`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`0.5`,stopColor:`color-mix(in srgb, var(--foreground) 80%, transparent)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`,stopOpacity:`0`})]}),(0,W.jsxs)(`linearGradient`,{id:`conn-tunnel-grad`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:p9,stopOpacity:`0.15`}),(0,W.jsx)(`stop`,{offset:`0.5`,stopColor:p9,stopOpacity:`0.95`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:p9,stopOpacity:`0.15`})]}),(0,W.jsxs)(`filter`,{id:`conn-tunnel-glow`,x:`-40%`,y:`-40%`,width:`180%`,height:`180%`,children:[(0,W.jsx)(`feGaussianBlur`,{stdDeviation:`3`,result:`b`}),(0,W.jsxs)(`feMerge`,{children:[(0,W.jsx)(`feMergeNode`,{in:`b`}),(0,W.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]})]}),[.5,.78,1].map((e,t)=>(0,W.jsx)(`circle`,{className:`conn-grid`,cx:f,cy:p,r:c*e},`g-${t}`)),[0,1,2].map(e=>(0,W.jsx)(`circle`,{className:`conn-sonar`,cx:f,cy:p,style:{animationDelay:`${e*1.1}s`}},`s-${e}`)),h.map(({d:e,i:n,x:r,y:i})=>{let a=s9(e.status),o=e.status.reachable===!0,s=e.status.reachable==null,c={x:r,y:i},l=(f+r)/2,u=(p+i)/2,d=r-f,h=i-p,g=Math.hypot(d,h)||1,_=-h/g,v=d/g,y={x:l+_*16,y:u+v*16},b={x:l-_*16,y:u-v*16},x=`M${f},${p} Q${y.x.toFixed(1)},${y.y.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,S=`M${f},${p} Q${b.x.toFixed(1)},${b.y.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,C=`M${f},${p} Q${l.toFixed(1)},${u.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,w=l9(m,y,c,.52),T=u9(m,y,c,.52),E=l9(m,b,c,.48),D=u9(m,b,c,.48)+180,O=t[e.name]??0;return(0,W.jsxs)(`g`,{children:[(0,W.jsx)(`path`,{id:`conn-cmd-${n}`,className:`conn-link`,d:x,stroke:o?d9:a.color,strokeOpacity:o?.5:.32,strokeDasharray:s?`2 8`:o?void 0:`6 7`}),(0,W.jsx)(`path`,{id:`conn-res-${n}`,className:`conn-link`,d:S,stroke:o?f9:a.color,strokeOpacity:o?.5:.18,strokeDasharray:o?void 0:`6 7`}),o&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{className:`conn-flow`,d:x,stroke:`var(--foreground)`}),(0,W.jsx)(`circle`,{className:`conn-packet`,r:3.2,fill:`var(--foreground)`,children:(0,W.jsx)(`animateMotion`,{dur:`2.6s`,repeatCount:`indefinite`,calcMode:`linear`,children:(0,W.jsx)(`mpath`,{href:`#conn-cmd-${n}`})})}),(0,W.jsx)(`rect`,{className:`conn-packet`,x:-2.6,y:-2.6,width:5.2,height:5.2,fill:`var(--muted-foreground)`,transform:`rotate(45)`,children:(0,W.jsx)(`animateMotion`,{dur:`2.6s`,begin:`0.9s`,repeatCount:`indefinite`,calcMode:`linear`,keyPoints:`1;0`,keyTimes:`0;1`,children:(0,W.jsx)(`mpath`,{href:`#conn-res-${n}`})})}),(0,W.jsx)(`path`,{className:`conn-chevron`,d:`M-4,-3 L4,0 L-4,3`,stroke:`var(--foreground)`,transform:`translate(${w.x.toFixed(1)},${w.y.toFixed(1)}) rotate(${T.toFixed(1)})`}),(0,W.jsx)(`path`,{className:`conn-chevron`,d:`M-4,-3 L4,0 L-4,3`,stroke:`var(--muted-foreground)`,transform:`translate(${E.x.toFixed(1)},${E.y.toFixed(1)}) rotate(${D.toFixed(1)})`})]}),O>0&&(0,W.jsx)(`g`,{children:(0,W.jsxs)(`circle`,{r:6,fill:`url(#conn-burst)`,children:[(0,W.jsx)(`animateMotion`,{dur:`1.1s`,repeatCount:`1`,calcMode:`linear`,keyPoints:`0;1;0`,keyTimes:`0;0.5;1`,path:C}),(0,W.jsx)(`animate`,{attributeName:`opacity`,values:`0;1;1;0`,keyTimes:`0;0.1;0.85;1`,dur:`1.1s`,repeatCount:`1`,fill:`freeze`})]})},`burst-${e.name}-${O}`)]},`l-${e.name}`)}),h.map(e=>{let t=e.d.jumpVia,n=t?h.find(e=>e.d.name===t):void 0,r=!n&&e.d.jumpHost?e.d.jumpHost:void 0;if(!n&&!r)return null;let i={x:e.x,y:e.y},a=Math.hypot(e.x-f,e.y-p)||1,o=(e.x-f)/a,s=(e.y-p)/a,c=n?{x:n.x,y:n.y}:{x:e.x+o*(e.r+46),y:e.y+s*(e.r+46)},l=(c.x+i.x)/2,u=(c.y+i.y)/2,d=Math.hypot(l-f,u-p)||1,m=n?50:16,g={x:l+(l-f)/d*m,y:u+(u-p)/d*m},_=`M${c.x.toFixed(1)},${c.y.toFixed(1)} Q${g.x.toFixed(1)},${g.y.toFixed(1)} ${i.x.toFixed(1)},${i.y.toFixed(1)}`,v=m9(e.d)??``,y=l9(c,g,i,.5),b=`conn-tunnel-${e.i}`;return(0,W.jsxs)(`g`,{className:`conn-tunnel-g`,children:[(0,W.jsx)(`path`,{className:`conn-tunnel-halo`,d:_,stroke:p9}),(0,W.jsx)(`path`,{id:b,className:`conn-tunnel`,d:_,stroke:`url(#conn-tunnel-grad)`,filter:`url(#conn-tunnel-glow)`}),r&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{className:`conn-tunnel-sat`,cx:c.x,cy:c.y,r:11,fill:`var(--background)`,stroke:`var(--warning)`}),(0,W.jsx)(`text`,{x:c.x,y:c.y+3.5,textAnchor:`middle`,fontSize:11,children:`🛡️`})]}),(0,W.jsxs)(`text`,{className:`conn-tunnel-lock`,fontSize:13,textAnchor:`middle`,children:[`🔒`,(0,W.jsx)(`animateMotion`,{dur:`2.4s`,repeatCount:`indefinite`,calcMode:`linear`,rotate:`auto`,children:(0,W.jsx)(`mpath`,{href:`#${b}`})})]}),(0,W.jsx)(Ate,{x:y.x,y:y.y,text:`⤳ via ${v}`,className:`conn-tunnel-badge`,textClassName:`conn-tunnel-badge-tx`})]},`jump-${e.d.name}`)}),(0,W.jsx)(`circle`,{className:`conn-hub-glow`,cx:f,cy:p,r:42}),(0,W.jsx)(`circle`,{className:`conn-hub-ring`,cx:f,cy:p,r:37}),(0,W.jsx)(`circle`,{cx:f,cy:p,r:29,fill:`url(#conn-hub)`,stroke:`var(--border)`,strokeWidth:1.5}),(0,W.jsx)(`text`,{x:f,y:p-4,textAnchor:`middle`,fill:`var(--background)`,fontSize:12,fontWeight:700,children:`LLM`}),(0,W.jsx)(`text`,{x:f,y:p+8,textAnchor:`middle`,fill:`var(--background)`,fillOpacity:.66,fontSize:8,fontWeight:600,children:`⇄ MCP`}),(0,W.jsx)(`text`,{x:f,y:p+18,textAnchor:`middle`,fill:`var(--background)`,fillOpacity:.66,fontSize:7.5,fontWeight:600,children:`server`}),h.map(({d:e,x:t,y:n,r,label:a})=>{let o=s9(e.status),s=e.status.reachable===!0,c=s?`${e.status.latencyMs??`?`} ms`:o.label,l=c9(e.name,i);return(0,W.jsxs)(`g`,{className:`conn-node`,opacity:e.disabled?.35:1,children:[s&&(0,W.jsx)(`circle`,{className:`conn-node-halo`,cx:t,cy:n,r:r+1,stroke:l}),e.pool?.pooled&&(0,W.jsx)(`circle`,{cx:t,cy:n,r:r+5,fill:`none`,stroke:e.pool.inflight>0?`var(--chart-1)`:`var(--success)`,strokeWidth:1.5,strokeDasharray:e.pool.inflight>0?void 0:`4 4`,opacity:.5,className:e.pool.inflight>0?`conn-blink`:void 0}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:`url(#conn-orb)`}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:l,opacity:.16}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:`none`,stroke:l,strokeWidth:2.5}),(0,W.jsx)(`circle`,{className:s?`conn-blink`:void 0,cx:t+r*.7,cy:n-r*.7,r:4.5,fill:o.color,stroke:`var(--background)`,strokeWidth:1.5}),(0,W.jsx)(`text`,{x:t,y:n+3.5,textAnchor:`middle`,fill:`var(--foreground)`,fontSize:10,fontWeight:600,children:a}),(0,W.jsx)(`text`,{x:t,y:n+r+14,textAnchor:`middle`,fill:`var(--muted-foreground)`,fontSize:9,children:e.address??e.host}),(0,W.jsx)(`text`,{x:t,y:n+r+26,textAnchor:`middle`,fill:o.color,fontSize:9,fontWeight:600,children:c})]},`n-${e.name}`)})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground mt-2 flex flex-wrap justify-center gap-4 text-[11px] [&>span]:inline-flex [&>span]:items-center [&>span]:gap-1.5 [&_i]:inline-block [&_i]:size-2.5 [&_i]:rounded-[3px]`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:d9}}),` command · LLM → device`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:f9}}),` response · device → LLM`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:d9}}),` live call (round-trip)`]}),e.devices.some(e=>m9(e))&&(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:`var(--warning)`}}),` 🔒 SSH jump tunnel (ProxyJump)`]}),e.devices.some(e=>e.pool?.pooled)&&(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:`var(--success)`}}),` pooled SSH connection`]})]})]})}function Pte({d:e,allNames:t,onToggle:n,onTest:r,onReconnect:i}){let[a,o]=(0,v.useState)(null),s=t=>{if(a)return;let n=t===`test`?r:i;n&&(o(t),n(e.name).finally(()=>o(null)))},c=s9(e.status),l=e.status.reachable===!0?`${c.label} · ${e.status.latencyMs??`?`}ms${e.status.version?` · v${e.status.version}`:``}`:e.status.reachable===!1?`${c.label}${e.status.error?` · ${e.status.error}`:``}`:c.label,u=c9(e.name,t);return(0,W.jsxs)(`div`,{className:q(`bg-card grid gap-2 rounded-lg border px-[15px] py-3.5 transition-[transform,border-color] duration-300`,`hover:border-chart-2/35 hover:-translate-y-0.5`,e.disabled&&`opacity-50 grayscale-[0.4]`),style:{borderLeft:`3px solid ${u}`},"data-disabled":e.disabled?`1`:void 0,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`size-[9px] shrink-0 rounded-full`,style:{background:u},title:`device colour`}),(0,W.jsx)(`span`,{className:`text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`}),e.disabled&&(0,W.jsx)(Hx,{type:`warning`,children:`disabled`}),(0,W.jsx)(`span`,{className:`size-[7px] shrink-0 rounded-full`,style:{background:c.color},title:c.label}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(`span`,{onClick:e=>e.stopPropagation(),children:(0,W.jsx)(Y7,{checked:!e.disabled,onCheckedChange:()=>n?.(e.name,!e.disabled),title:e.disabled?`Enable device`:`Disable device`,"aria-label":e.disabled?`Enable device`:`Disable device`})}),(0,W.jsx)(Hx,{type:`secondary`,children:e.authMode})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground [&_b]:text-foreground grid grid-cols-[auto_1fr] gap-x-3 gap-y-[3px] text-[11px] [&_b]:font-medium [&_b]:break-words`,children:[(0,W.jsx)(`span`,{children:e.mac?`mac`:`host`}),(0,W.jsx)(`b`,{children:e.address??`${e.host}:${e.port}`}),(0,W.jsx)(`span`,{children:`user`}),(0,W.jsx)(`b`,{children:e.username}),(0,W.jsx)(`span`,{children:`status`}),(0,W.jsx)(`b`,{style:{color:c.color},children:l}),(0,W.jsx)(`span`,{children:`activity`}),(0,W.jsxs)(`b`,{children:[e.activity.calls,` calls · `,e.activity.errors,` err`,e.activity.avgMs?` · ${fx(e.activity.avgMs)} avg`:``]}),e.pool&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{children:`pool`}),(0,W.jsx)(`b`,{className:e.pool.dead?`text-destructive`:e.pool.inflight>0?`text-chart-1`:e.pool.pooled?`text-success`:`text-muted-foreground`,children:e.pool.pooled?e.pool.inflight>0?`${e.pool.inflight} inflight`:`connected`:`—`})]}),e.description&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{children:`note`}),(0,W.jsx)(`b`,{children:e.description})]})]}),m9(e)&&(0,W.jsxs)(`div`,{className:`border-warning/30 bg-warning/8 mt-2.5 mb-0.5 flex items-center gap-1.5 overflow-hidden rounded-[10px] border px-2.5 py-[7px] text-[10px]`,title:`Reached over SSH through the bastion ${m9(e)} (ProxyJump) — no port exposed on ${e.name}.`,children:[(0,W.jsxs)(`span`,{className:`border-warning/60 text-warning bg-background inline-flex items-center gap-1.5 rounded-[7px] border px-2 py-[3px] whitespace-nowrap`,children:[(0,W.jsx)(cl,{className:`size-3`}),` `,m9(e),e.jumpVia?(0,W.jsx)(`i`,{className:`bg-warning text-background rounded-[4px] px-1 py-px text-[7px] tracking-[0.08em] uppercase not-italic`,children:`jump`}):null]}),(0,W.jsx)(`span`,{className:`jump-route__wire jump-route__wire--enc`,children:(0,W.jsx)(`span`,{className:`jump-route__lock`,"aria-hidden":!0,children:`🔒`})}),(0,W.jsxs)(`span`,{className:`bg-background text-foreground inline-flex items-center gap-1.5 rounded-[7px] border px-2 py-[3px] whitespace-nowrap`,style:{borderColor:u},title:e.name,children:[(0,W.jsx)(tl,{className:`size-3`}),` `,e.name]})]}),(r||i)&&(0,W.jsxs)(`div`,{className:`mt-1.5 flex gap-2`,onClick:e=>e.stopPropagation(),children:[r&&(0,W.jsxs)(vb,{variant:`outline`,size:`xs`,disabled:!!a,onClick:()=>s(`test`),title:`Probe this device now (fresh SSH connect + health refresh)`,children:[a===`test`?(0,W.jsx)(Kc,{className:`animate-spin`}):(0,W.jsx)(Ac,{}),` Test`]}),i&&(0,W.jsxs)(vb,{variant:`outline`,size:`xs`,disabled:!!a,onClick:()=>s(`reconnect`),title:`Drop the pooled SSH connection and re-establish it`,children:[a===`reconnect`?(0,W.jsx)(Kc,{className:`animate-spin`}):(0,W.jsx)(il,{}),` Reconnect`]})]})]})}var Fte={READ:`text-success border-success/45 bg-success/10`,WRITE:`text-chart-1 border-chart-1/45 bg-chart-1/10`,WRITE_IDEMPOTENT:`text-chart-2 border-chart-2/45 bg-chart-2/10`,DESTRUCTIVE:`text-warning border-warning/45 bg-warning/10`,DANGEROUS:`text-destructive border-destructive/45 bg-destructive/10`},g9=`border-b border-border/60 px-3.5 py-[7px] text-xs [overflow-wrap:anywhere]`,_9=q(g9,`bg-muted/40 text-muted-foreground`),v9=q(g9,`text-foreground`),y9=`m-0 max-h-[40vh] overflow-auto rounded border border-border bg-background p-3 font-mono text-xs break-words whitespace-pre-wrap`,b9=`m-0 text-[11px] font-semibold tracking-wide text-muted-foreground uppercase`;function Ite({event:e,onClose:t}){let[n,r]=(0,v.useState)(k7);return(0,W.jsx)(q7,{title:(0,W.jsxs)(`span`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`span`,{className:q(`inline-block rounded-full border px-2 py-px font-mono text-[10px] tracking-wide uppercase`,Fte[e.risk]??`text-muted-foreground`),children:e.risk}),(0,W.jsx)(`span`,{className:`font-mono text-[15px]`,children:e.tool}),(0,W.jsx)(ux,{text:e.tool,icon:!0,title:`Copy tool name`})]}),onClose:t,children:(0,W.jsxs)(`div`,{className:`grid gap-3`,children:[(0,W.jsxs)(`div`,{className:`grid grid-cols-[minmax(120px,0.4fr)_1fr] overflow-hidden rounded-lg border border-border font-mono`,children:[(0,W.jsx)(`div`,{className:_9,children:`title`}),(0,W.jsx)(`div`,{className:v9,children:e.title}),e.reason&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`div`,{className:q(g9,`bg-muted/40 text-warning`),children:`reason`}),(0,W.jsx)(`div`,{className:q(g9,`text-foreground italic`),children:e.reason})]}),(0,W.jsx)(`div`,{className:_9,children:`time`}),(0,W.jsx)(`div`,{className:v9,children:new Date(e.ts).toLocaleString(void 0,{hour12:!1})}),(0,W.jsx)(`div`,{className:_9,children:`device`}),(0,W.jsx)(`div`,{className:v9,children:e.device??`—`}),(0,W.jsx)(`div`,{className:_9,children:`transport`}),(0,W.jsx)(`div`,{className:v9,children:e.transport??`—`}),(0,W.jsx)(`div`,{className:_9,children:`duration`}),(0,W.jsx)(`div`,{className:v9,children:fx(e.durationMs)}),(0,W.jsx)(`div`,{className:_9,children:`status`}),(0,W.jsx)(`div`,{className:v9,children:(0,W.jsx)(`span`,{className:e.isError?`text-destructive`:`text-success`,children:e.isError?`error`:`ok`})}),(0,W.jsx)(`div`,{className:_9,children:`output size`}),(0,W.jsxs)(`div`,{className:v9,children:[px(e.outputBytes),e.truncated?` (truncated)`:``]}),(0,W.jsx)(`div`,{className:_9,children:`structured`}),(0,W.jsx)(`div`,{className:v9,children:e.hasStructured?`yes (renders an MCP App view)`:`no`})]}),e.error&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h2`,{className:b9,children:`ERROR`}),(0,W.jsx)(`pre`,{className:q(y9,`text-destructive`),children:e.error})]}),(0,W.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`h2`,{className:b9,children:`INPUT`}),(0,W.jsx)(`span`,{className:`flex-1`}),e.input&&(0,W.jsx)(X,{type:`secondary`,size:`sm`,ghost:!0,onClick:()=>r(e=>{let t=!e;return A7(t),t}),title:n?`Showing pretty-printed JSON — click for raw`:`Showing raw JSON — click to pretty-print`,children:n?`✦ Pretty`:`{ } Raw`}),(0,W.jsx)(ux,{text:e.input,title:`Copy input JSON`})]}),e.input?(0,W.jsx)(M7,{value:j7(e.input,n)}):(0,W.jsx)(`pre`,{className:q(y9,`text-muted-foreground`),children:`—`}),(0,W.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`h2`,{className:b9,children:`OUTPUT`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(ux,{text:e.output,title:`Copy output`})]}),(0,W.jsx)(`pre`,{className:q(y9,`text-muted-foreground`),children:e.output?D7(e.output):`—`})]})})}var x9=e=>e==null?`?`:px(e);function Lte({d:e}){let t=e.status,n=e.history??[];return t.reachable===!0||n.length>0?(0,W.jsxs)(`div`,{className:`bg-card text-card-foreground flex flex-col gap-2.5 rounded-lg border p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(Wx,{color:s9(t).color}),(0,W.jsx)(`span`,{className:`font-mono text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Hx,{type:t.version?`success`:`default`,children:t.version?`v${t.version}`:`—`})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground -mt-1 font-mono text-[11px]`,children:[t.boardName??`router`,t.architecture?` · ${t.architecture}`:``,t.cpuCount?` · ${t.cpuCount} cpu`:``,t.uptime?` · up ${t.uptime}`:``]}),(0,W.jsxs)(`div`,{className:`flex justify-around gap-3.5`,children:[(0,W.jsx)(l7,{value:t.cpuLoad,label:`CPU`,color:_x.cpu}),(0,W.jsx)(l7,{value:t.memUsedPct,label:`MEM`,color:_x.mem}),(0,W.jsx)(l7,{value:t.hddUsedPct,label:`DISK`,color:_x.disk})]}),(0,W.jsxs)(`div`,{className:`grid gap-2`,children:[(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`CPU load`}),(0,W.jsx)(c7,{id:`${e.name}-cpu`,values:n.map(e=>e.cpuLoad),color:_x.cpu,maxValue:100,unit:`%`})]}),(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`Memory used`}),(0,W.jsx)(c7,{id:`${e.name}-mem`,values:n.map(e=>e.memUsedPct),color:_x.mem,maxValue:100,unit:`%`})]}),(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`Probe latency`}),(0,W.jsx)(c7,{id:`${e.name}-lat`,values:n.map(e=>e.latencyMs),color:_x.latency,unit:`ms`})]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground font-mono text-[11px]`,children:[`RAM `,x9(t.totalMemory&&t.freeMemory?t.totalMemory-t.freeMemory:void 0),` /`,` `,x9(t.totalMemory),` · free disk `,x9(t.freeHdd)]}),t.disks&&t.disks.length>0&&(0,W.jsxs)(`div`,{className:`grid gap-1`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`External storage`}),t.disks.map(e=>(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-2 font-mono text-[11px]`,children:[(0,W.jsxs)(`span`,{className:`truncate`,children:[(0,W.jsx)(Hx,{type:`secondary`,children:e.slot}),` `,e.model??e.mountPoint??`disk`,e.fs?` · ${e.fs}`:``]}),(0,W.jsxs)(`span`,{className:`text-muted-foreground whitespace-nowrap`,children:[x9(e.free),` free / `,x9(e.size),e.usedPct==null?``:` · ${e.usedPct}%`]})]},e.slot))]})]}):(0,W.jsxs)(`div`,{className:`bg-card text-card-foreground flex min-h-[120px] flex-col justify-center gap-1.5 rounded-lg border p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(Wx,{color:s9(t).color}),(0,W.jsx)(`span`,{className:`font-mono text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`})]}),(0,W.jsx)(`p`,{className:`text-muted-foreground m-0 text-[11px]`,children:t.reachable===!1?`Offline — ${t.error??`unreachable`}`:e.mac?`Waiting for the first MAC-Telnet probe (these run every few minutes to avoid contending with tool calls)…`:`Waiting for the first health probe…`})]})}function Rte(e,t){let n=(0,v.useRef)(e),r=(0,v.useRef)(t);n.current=e,r.current=t,(0,v.useEffect)(()=>{let e=!1,t=null,i=null,a=()=>{e||(i=new EventSource(hc(`/api/sse`)),i.addEventListener(`hello`,()=>r.current(`sse`)),i.addEventListener(`tool`,e=>{try{n.current(JSON.parse(e.data))}catch{}}),i.onerror=()=>{i&&i.readyState===EventSource.CONNECTING&&r.current(`off`)})},o=()=>{if(e)return;let i=location.protocol===`https:`?`wss`:`ws`;t=new WebSocket(hc(`${i}://${location.host}/api/stream`));let s=!1;t.onopen=()=>{s=!0,r.current(`ws`)},t.onerror=()=>t?.close(),t.onmessage=e=>{try{let t=JSON.parse(e.data);t.type===`event`&&t.event&&n.current(t.event)}catch{}},t.onclose=()=>{e||(r.current(`off`),s?setTimeout(o,2e3):a())}};return o(),()=>{e=!0,t?.close(),i?.close()}},[])}function zte(e){(0,v.useLayoutEffect)(()=>{let t=e.current;if(!t||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;document.documentElement.classList.add(`js-motion`);let n=new WeakSet,r=e=>{n.has(e)||(n.add(e),zi.set(e,{opacity:0,y:26}),ic.create({trigger:e,start:`top 90%`,once:!0,onEnter:()=>zi.to(e,{opacity:1,y:0,duration:.7,ease:`power3.out`})}))},i=e=>{for(let t of e.querySelectorAll(`.reveal`))r(t)};i(t);let a=new MutationObserver(e=>{for(let t of e)for(let e of t.addedNodes)e instanceof Element&&(e.matches(`.reveal`)&&r(e),i(e))});a.observe(t,{childList:!0,subtree:!0});let o=setInterval(()=>ic.refresh(),1200),s=setTimeout(()=>clearInterval(o),7e3);return()=>{a.disconnect(),clearInterval(o),clearTimeout(s);for(let e of ic.getAll())e.kill();document.documentElement.classList.remove(`js-motion`)}},[e])}function S9(e){return new Date(e).toLocaleString()}function C9(e){let t=Date.now()-e;return t<6e4?`just now`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}var Bte={"in-sync":`success`,drifted:`warning`,unknown:`secondary`,"no-baseline":`secondary`},Vte={"in-sync":`In Sync`,drifted:`Drifted`,unknown:`Unknown`,"no-baseline":`No Baseline`};function Hte({device:e,onDone:t}){let[n,r]=(0,v.useState)([]),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(``);(0,v.useEffect)(()=>{gc(`/api/drift/history/${encodeURIComponent(e)}?limit=20`).then(e=>{r(e.snapshots),e.snapshots.length>0&&a(e.snapshots[0].id)})},[e]);let f=async()=>{if(!i)return;l(!0),d(``);let n=await _c(`/api/drift/baseline`,{device:e,snapshotId:i,label:o||void 0});if(l(!1),n.ok)J.success(`Baseline set`),t();else{let e=n.error??`Failed`;d(e),J.error(e)}};return n.length===0?(0,W.jsx)(`div`,{className:`p-2`,children:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`No snapshots for this device. Capture one with capture_config_snapshot first.`})}):(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2`,children:[(0,W.jsx)(Xx,{value:i,onValueChange:a,"aria-label":`Baseline snapshot`,className:`min-w-[200px] flex-1`,options:n.map(e=>({value:e.id,label:`${e.id} — ${S9(e.ts)} — ${e.lines} lines${e.label?` "${e.label}"`:``}`}))}),(0,W.jsx)(Kx,{placeholder:`Label (optional)`,value:o,onChange:e=>s(e.target.value),className:`w-40`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void f(),disabled:c||!i,children:c?`Setting...`:`Set as Baseline`}),u&&(0,W.jsx)(`span`,{className:`text-destructive text-xs`,children:u})]})}function Ute({unified:e}){return e?(0,W.jsx)(`pre`,{className:`m-0 max-h-[500px] overflow-auto rounded bg-background p-3 font-mono text-[11px] leading-normal`,children:e.split(`
|
|
145
|
+
`).map((e,t)=>(0,W.jsx)(`div`,{className:e.startsWith(`+`)?`text-success`:e.startsWith(`-`)?`text-destructive`:e.startsWith(`@@`)?`text-brand`:``,children:e||` `},t))})]})]})}function Ate({x:e,y:t,text:n,className:r,textClassName:i,padX:a=9,fontSize:o=9}){let s=(0,v.useRef)(null),[c,l]=(0,v.useState)(()=>n.length*o*.62);(0,v.useLayoutEffect)(()=>{let e=s.current?.getComputedTextLength();e&&e>0&&l(e)},[n,o]);let u=Math.round(c+a*2);return(0,W.jsxs)(`g`,{transform:`translate(${e.toFixed(1)},${t.toFixed(1)})`,children:[(0,W.jsx)(`rect`,{className:r,x:-u/2,y:-9,rx:9,width:u,height:18}),(0,W.jsx)(`text`,{ref:s,className:i,x:0,y:3.5,textAnchor:`middle`,fontSize:o,children:n})]})}function s9(e){return e.reachable===!0?{label:`online`,color:`var(--foreground)`}:e.reachable===!1?{label:`offline`,color:`var(--destructive)`}:{label:`checking…`,color:`var(--muted-foreground)`}}function c9(e,t){let n=[...new Set(t)].sort(),r=Math.max(1,n.length),i=Math.max(0,n.indexOf(e));return`hsl(${Math.round(i*360/r)} 70% ${62-i%3*5}%)`}function l9(e,t,n,r){let i=1-r;return{x:i*i*e.x+2*i*r*t.x+r*r*n.x,y:i*i*e.y+2*i*r*t.y+r*r*n.y}}function u9(e,t,n,r){let i=1-r,a=2*i*(t.x-e.x)+2*r*(n.x-t.x),o=2*i*(t.y-e.y)+2*r*(n.y-t.y);return Math.atan2(o,a)*180/Math.PI}var d9=`var(--foreground)`,f9=`var(--muted-foreground)`,p9=`var(--warning)`;function m9(e){return e.jumpVia?e.jumpVia:e.jumpHost?`${e.jumpHost.host}:${e.jumpHost.port}`:null}var h9=18,jte=e=>e.length>h9?`${e.slice(0,h9-1)}…`:e,Mte=e=>Math.max(23,Math.min(70,e.length*3.1+12));function Nte({payload:e,pulses:t}){let n=e.devices,r=Math.max(1,n.length),i=n.map(e=>e.name),a=n.map(e=>{let t=jte(e.name);return{d:e,label:t,r:Mte(t)}}),o=Math.max(23,...a.map(e=>e.r)),s=r>1?(o+18)/Math.sin(Math.PI/r):0,c=Math.max(110+o,s,120),l=o+60,u=Math.max(700,Math.round((c+o+40)*2)),d=Math.round((c+l)*2),f=u/2,p=d/2,m={x:f,y:p},h=a.map((e,t)=>{let n=t/r*Math.PI*2-Math.PI/2+(r%2==0?Math.PI/r:0);return{...e,i:t,x:f+c*Math.cos(n),y:p+c*Math.sin(n)}});return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`svg`,{className:`conn`,viewBox:`0 0 ${u} ${d}`,width:`100%`,height:d,preserveAspectRatio:`xMidYMid meet`,children:[(0,W.jsxs)(`defs`,{children:[(0,W.jsxs)(`radialGradient`,{id:`conn-hub`,cx:`0.5`,cy:`0.34`,r:`0.75`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`0.6`,stopColor:`color-mix(in srgb, var(--foreground) 70%, var(--muted-foreground))`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`})]}),(0,W.jsxs)(`radialGradient`,{id:`conn-orb`,cx:`0.5`,cy:`0.32`,r:`0.85`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--muted)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--card)`})]}),(0,W.jsxs)(`radialGradient`,{id:`conn-burst`,cx:`0.5`,cy:`0.5`,r:`0.5`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`0.5`,stopColor:`color-mix(in srgb, var(--foreground) 80%, transparent)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`,stopOpacity:`0`})]}),(0,W.jsxs)(`linearGradient`,{id:`conn-tunnel-grad`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:p9,stopOpacity:`0.15`}),(0,W.jsx)(`stop`,{offset:`0.5`,stopColor:p9,stopOpacity:`0.95`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:p9,stopOpacity:`0.15`})]}),(0,W.jsxs)(`filter`,{id:`conn-tunnel-glow`,x:`-40%`,y:`-40%`,width:`180%`,height:`180%`,children:[(0,W.jsx)(`feGaussianBlur`,{stdDeviation:`3`,result:`b`}),(0,W.jsxs)(`feMerge`,{children:[(0,W.jsx)(`feMergeNode`,{in:`b`}),(0,W.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]})]}),[.5,.78,1].map((e,t)=>(0,W.jsx)(`circle`,{className:`conn-grid`,cx:f,cy:p,r:c*e},`g-${t}`)),[0,1,2].map(e=>(0,W.jsx)(`circle`,{className:`conn-sonar`,cx:f,cy:p,style:{animationDelay:`${e*1.1}s`}},`s-${e}`)),h.map(({d:e,i:n,x:r,y:i})=>{let a=s9(e.status),o=e.status.reachable===!0,s=e.status.reachable==null,c={x:r,y:i},l=(f+r)/2,u=(p+i)/2,d=r-f,h=i-p,g=Math.hypot(d,h)||1,_=-h/g,v=d/g,y={x:l+_*16,y:u+v*16},b={x:l-_*16,y:u-v*16},x=`M${f},${p} Q${y.x.toFixed(1)},${y.y.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,S=`M${f},${p} Q${b.x.toFixed(1)},${b.y.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,C=`M${f},${p} Q${l.toFixed(1)},${u.toFixed(1)} ${r.toFixed(1)},${i.toFixed(1)}`,w=l9(m,y,c,.52),T=u9(m,y,c,.52),E=l9(m,b,c,.48),D=u9(m,b,c,.48)+180,O=t[e.name]??0;return(0,W.jsxs)(`g`,{children:[(0,W.jsx)(`path`,{id:`conn-cmd-${n}`,className:`conn-link`,d:x,stroke:o?d9:a.color,strokeOpacity:o?.5:.32,strokeDasharray:s?`2 8`:o?void 0:`6 7`}),(0,W.jsx)(`path`,{id:`conn-res-${n}`,className:`conn-link`,d:S,stroke:o?f9:a.color,strokeOpacity:o?.5:.18,strokeDasharray:o?void 0:`6 7`}),o&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{className:`conn-flow`,d:x,stroke:`var(--foreground)`}),(0,W.jsx)(`circle`,{className:`conn-packet`,r:3.2,fill:`var(--foreground)`,children:(0,W.jsx)(`animateMotion`,{dur:`2.6s`,repeatCount:`indefinite`,calcMode:`linear`,children:(0,W.jsx)(`mpath`,{href:`#conn-cmd-${n}`})})}),(0,W.jsx)(`rect`,{className:`conn-packet`,x:-2.6,y:-2.6,width:5.2,height:5.2,fill:`var(--muted-foreground)`,transform:`rotate(45)`,children:(0,W.jsx)(`animateMotion`,{dur:`2.6s`,begin:`0.9s`,repeatCount:`indefinite`,calcMode:`linear`,keyPoints:`1;0`,keyTimes:`0;1`,children:(0,W.jsx)(`mpath`,{href:`#conn-res-${n}`})})}),(0,W.jsx)(`path`,{className:`conn-chevron`,d:`M-4,-3 L4,0 L-4,3`,stroke:`var(--foreground)`,transform:`translate(${w.x.toFixed(1)},${w.y.toFixed(1)}) rotate(${T.toFixed(1)})`}),(0,W.jsx)(`path`,{className:`conn-chevron`,d:`M-4,-3 L4,0 L-4,3`,stroke:`var(--muted-foreground)`,transform:`translate(${E.x.toFixed(1)},${E.y.toFixed(1)}) rotate(${D.toFixed(1)})`})]}),O>0&&(0,W.jsx)(`g`,{children:(0,W.jsxs)(`circle`,{r:6,fill:`url(#conn-burst)`,children:[(0,W.jsx)(`animateMotion`,{dur:`1.1s`,repeatCount:`1`,calcMode:`linear`,keyPoints:`0;1;0`,keyTimes:`0;0.5;1`,path:C}),(0,W.jsx)(`animate`,{attributeName:`opacity`,values:`0;1;1;0`,keyTimes:`0;0.1;0.85;1`,dur:`1.1s`,repeatCount:`1`,fill:`freeze`})]})},`burst-${e.name}-${O}`)]},`l-${e.name}`)}),h.map(e=>{let t=e.d.jumpVia,n=t?h.find(e=>e.d.name===t):void 0,r=!n&&e.d.jumpHost?e.d.jumpHost:void 0;if(!n&&!r)return null;let i={x:e.x,y:e.y},a=Math.hypot(e.x-f,e.y-p)||1,o=(e.x-f)/a,s=(e.y-p)/a,c=n?{x:n.x,y:n.y}:{x:e.x+o*(e.r+46),y:e.y+s*(e.r+46)},l=(c.x+i.x)/2,u=(c.y+i.y)/2,d=Math.hypot(l-f,u-p)||1,m=n?50:16,g={x:l+(l-f)/d*m,y:u+(u-p)/d*m},_=`M${c.x.toFixed(1)},${c.y.toFixed(1)} Q${g.x.toFixed(1)},${g.y.toFixed(1)} ${i.x.toFixed(1)},${i.y.toFixed(1)}`,v=m9(e.d)??``,y=l9(c,g,i,.5),b=`conn-tunnel-${e.i}`;return(0,W.jsxs)(`g`,{className:`conn-tunnel-g`,children:[(0,W.jsx)(`path`,{className:`conn-tunnel-halo`,d:_,stroke:p9}),(0,W.jsx)(`path`,{id:b,className:`conn-tunnel`,d:_,stroke:`url(#conn-tunnel-grad)`,filter:`url(#conn-tunnel-glow)`}),r&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{className:`conn-tunnel-sat`,cx:c.x,cy:c.y,r:11,fill:`var(--background)`,stroke:`var(--warning)`}),(0,W.jsx)(`text`,{x:c.x,y:c.y+3.5,textAnchor:`middle`,fontSize:11,children:`🛡️`})]}),(0,W.jsxs)(`text`,{className:`conn-tunnel-lock`,fontSize:13,textAnchor:`middle`,children:[`🔒`,(0,W.jsx)(`animateMotion`,{dur:`2.4s`,repeatCount:`indefinite`,calcMode:`linear`,rotate:`auto`,children:(0,W.jsx)(`mpath`,{href:`#${b}`})})]}),(0,W.jsx)(Ate,{x:y.x,y:y.y,text:`⤳ via ${v}`,className:`conn-tunnel-badge`,textClassName:`conn-tunnel-badge-tx`})]},`jump-${e.d.name}`)}),(0,W.jsx)(`circle`,{className:`conn-hub-glow`,cx:f,cy:p,r:42}),(0,W.jsx)(`circle`,{className:`conn-hub-ring`,cx:f,cy:p,r:37}),(0,W.jsx)(`circle`,{cx:f,cy:p,r:29,fill:`url(#conn-hub)`,stroke:`var(--border)`,strokeWidth:1.5}),(0,W.jsx)(`text`,{x:f,y:p-4,textAnchor:`middle`,fill:`var(--background)`,fontSize:12,fontWeight:700,children:`LLM`}),(0,W.jsx)(`text`,{x:f,y:p+8,textAnchor:`middle`,fill:`var(--background)`,fillOpacity:.66,fontSize:8,fontWeight:600,children:`⇄ MCP`}),(0,W.jsx)(`text`,{x:f,y:p+18,textAnchor:`middle`,fill:`var(--background)`,fillOpacity:.66,fontSize:7.5,fontWeight:600,children:`server`}),h.map(({d:e,x:t,y:n,r,label:a})=>{let o=s9(e.status),s=e.status.reachable===!0,c=s?`${e.status.latencyMs??`?`} ms`:o.label,l=c9(e.name,i);return(0,W.jsxs)(`g`,{className:`conn-node`,opacity:e.disabled?.35:1,children:[s&&(0,W.jsx)(`circle`,{className:`conn-node-halo`,cx:t,cy:n,r:r+1,stroke:l}),e.pool?.pooled&&(0,W.jsx)(`circle`,{cx:t,cy:n,r:r+5,fill:`none`,stroke:e.pool.inflight>0?`var(--chart-1)`:`var(--success)`,strokeWidth:1.5,strokeDasharray:e.pool.inflight>0?void 0:`4 4`,opacity:.5,className:e.pool.inflight>0?`conn-blink`:void 0}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:`url(#conn-orb)`}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:l,opacity:.16}),(0,W.jsx)(`circle`,{cx:t,cy:n,r,fill:`none`,stroke:l,strokeWidth:2.5}),(0,W.jsx)(`circle`,{className:s?`conn-blink`:void 0,cx:t+r*.7,cy:n-r*.7,r:4.5,fill:o.color,stroke:`var(--background)`,strokeWidth:1.5}),(0,W.jsx)(`text`,{x:t,y:n+3.5,textAnchor:`middle`,fill:`var(--foreground)`,fontSize:10,fontWeight:600,children:a}),(0,W.jsx)(`text`,{x:t,y:n+r+14,textAnchor:`middle`,fill:`var(--muted-foreground)`,fontSize:9,children:e.address??e.host}),(0,W.jsx)(`text`,{x:t,y:n+r+26,textAnchor:`middle`,fill:o.color,fontSize:9,fontWeight:600,children:c})]},`n-${e.name}`)})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground mt-2 flex flex-wrap justify-center gap-4 text-[11px] [&>span]:inline-flex [&>span]:items-center [&>span]:gap-1.5 [&_i]:inline-block [&_i]:size-2.5 [&_i]:rounded-[3px]`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:d9}}),` command · LLM → device`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:f9}}),` response · device → LLM`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:d9}}),` live call (round-trip)`]}),e.devices.some(e=>m9(e))&&(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:`var(--warning)`}}),` 🔒 SSH jump tunnel (ProxyJump)`]}),e.devices.some(e=>e.pool?.pooled)&&(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{style:{background:`var(--success)`}}),` pooled SSH connection`]})]})]})}function Pte({d:e,allNames:t,onToggle:n,onTest:r,onReconnect:i}){let[a,o]=(0,v.useState)(null),s=t=>{if(a)return;let n=t===`test`?r:i;n&&(o(t),n(e.name).finally(()=>o(null)))},c=s9(e.status),l=e.status.reachable===!0?`${c.label} · ${e.status.latencyMs??`?`}ms${e.status.version?` · v${e.status.version}`:``}`:e.status.reachable===!1?`${c.label}${e.status.error?` · ${e.status.error}`:``}`:c.label,u=c9(e.name,t);return(0,W.jsxs)(`div`,{className:q(`bg-card grid gap-2 rounded-lg border px-[15px] py-3.5 transition-[transform,border-color] duration-300`,`hover:border-chart-2/35 hover:-translate-y-0.5`,e.disabled&&`opacity-50 grayscale-[0.4]`),style:{borderLeft:`3px solid ${u}`},"data-disabled":e.disabled?`1`:void 0,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`size-[9px] shrink-0 rounded-full`,style:{background:u},title:`device colour`}),(0,W.jsx)(`span`,{className:`text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`}),e.disabled&&(0,W.jsx)(Hx,{type:`warning`,children:`disabled`}),(0,W.jsx)(`span`,{className:`size-[7px] shrink-0 rounded-full`,style:{background:c.color},title:c.label}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(`span`,{onClick:e=>e.stopPropagation(),children:(0,W.jsx)(Y7,{checked:!e.disabled,onCheckedChange:()=>n?.(e.name,!e.disabled),title:e.disabled?`Enable device`:`Disable device`,"aria-label":e.disabled?`Enable device`:`Disable device`})}),(0,W.jsx)(Hx,{type:`secondary`,children:e.authMode})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground [&_b]:text-foreground grid grid-cols-[auto_1fr] gap-x-3 gap-y-[3px] text-[11px] [&_b]:font-medium [&_b]:break-words`,children:[(0,W.jsx)(`span`,{children:e.mac?`mac`:`host`}),(0,W.jsx)(`b`,{children:e.address??`${e.host}:${e.port}`}),(0,W.jsx)(`span`,{children:`user`}),(0,W.jsx)(`b`,{children:e.username}),(0,W.jsx)(`span`,{children:`status`}),(0,W.jsx)(`b`,{style:{color:c.color},children:l}),(0,W.jsx)(`span`,{children:`activity`}),(0,W.jsxs)(`b`,{children:[e.activity.calls,` calls · `,e.activity.errors,` err`,e.activity.avgMs?` · ${fx(e.activity.avgMs)} avg`:``]}),e.pool&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{children:`pool`}),(0,W.jsx)(`b`,{className:e.pool.dead?`text-destructive`:e.pool.inflight>0?`text-chart-1`:e.pool.pooled?`text-success`:`text-muted-foreground`,children:e.pool.pooled?e.pool.inflight>0?`${e.pool.inflight} inflight`:`connected`:`—`})]}),e.description&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{children:`note`}),(0,W.jsx)(`b`,{children:e.description})]})]}),m9(e)&&(0,W.jsxs)(`div`,{className:`border-warning/30 bg-warning/8 mt-2.5 mb-0.5 flex items-center gap-1.5 overflow-hidden rounded-[10px] border px-2.5 py-[7px] text-[10px]`,title:`Reached over SSH through the bastion ${m9(e)} (ProxyJump) — no port exposed on ${e.name}.`,children:[(0,W.jsxs)(`span`,{className:`border-warning/60 text-warning bg-background inline-flex items-center gap-1.5 rounded-[7px] border px-2 py-[3px] whitespace-nowrap`,children:[(0,W.jsx)(cl,{className:`size-3`}),` `,m9(e),e.jumpVia?(0,W.jsx)(`i`,{className:`bg-warning text-background rounded-[4px] px-1 py-px text-[7px] tracking-[0.08em] uppercase not-italic`,children:`jump`}):null]}),(0,W.jsx)(`span`,{className:`jump-route__wire jump-route__wire--enc`,children:(0,W.jsx)(`span`,{className:`jump-route__lock`,"aria-hidden":!0,children:`🔒`})}),(0,W.jsxs)(`span`,{className:`bg-background text-foreground inline-flex items-center gap-1.5 rounded-[7px] border px-2 py-[3px] whitespace-nowrap`,style:{borderColor:u},title:e.name,children:[(0,W.jsx)(tl,{className:`size-3`}),` `,e.name]})]}),(r||i)&&(0,W.jsxs)(`div`,{className:`mt-1.5 flex gap-2`,onClick:e=>e.stopPropagation(),children:[r&&(0,W.jsxs)(vb,{variant:`outline`,size:`xs`,disabled:!!a,onClick:()=>s(`test`),title:`Probe this device now (fresh SSH connect + health refresh)`,children:[a===`test`?(0,W.jsx)(Kc,{className:`animate-spin`}):(0,W.jsx)(Ac,{}),` Test`]}),i&&(0,W.jsxs)(vb,{variant:`outline`,size:`xs`,disabled:!!a,onClick:()=>s(`reconnect`),title:`Drop the pooled SSH connection and re-establish it`,children:[a===`reconnect`?(0,W.jsx)(Kc,{className:`animate-spin`}):(0,W.jsx)(il,{}),` Reconnect`]})]})]})}var Fte={READ:`text-success border-success/45 bg-success/10`,WRITE:`text-chart-1 border-chart-1/45 bg-chart-1/10`,WRITE_IDEMPOTENT:`text-chart-2 border-chart-2/45 bg-chart-2/10`,DESTRUCTIVE:`text-warning border-warning/45 bg-warning/10`,DANGEROUS:`text-destructive border-destructive/45 bg-destructive/10`},g9=`border-b border-border/60 px-3.5 py-[7px] text-xs [overflow-wrap:anywhere]`,_9=q(g9,`bg-muted/40 text-muted-foreground`),v9=q(g9,`text-foreground`),y9=`m-0 max-h-[40vh] overflow-auto rounded border border-border bg-background p-3 font-mono text-xs break-words whitespace-pre-wrap`,b9=`m-0 text-[11px] font-semibold tracking-wide text-muted-foreground uppercase`;function Ite({event:e,onClose:t}){let[n,r]=(0,v.useState)(k7);return(0,W.jsx)(q7,{title:(0,W.jsxs)(`span`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`span`,{className:q(`inline-block rounded-full border px-2 py-px font-mono text-[10px] tracking-wide uppercase`,Fte[e.risk]??`text-muted-foreground`),children:e.risk}),(0,W.jsx)(`span`,{className:`font-mono text-[15px]`,children:e.tool}),(0,W.jsx)(ux,{text:e.tool,icon:!0,title:`Copy tool name`})]}),onClose:t,children:(0,W.jsxs)(`div`,{className:`grid gap-3`,children:[(0,W.jsxs)(`div`,{className:`grid grid-cols-[minmax(120px,0.4fr)_1fr] overflow-hidden rounded-lg border border-border font-mono`,children:[(0,W.jsx)(`div`,{className:_9,children:`title`}),(0,W.jsx)(`div`,{className:v9,children:e.title}),e.reason&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`div`,{className:q(g9,`bg-muted/40 text-warning`),children:`reason`}),(0,W.jsx)(`div`,{className:q(g9,`text-foreground italic`),children:e.reason})]}),(0,W.jsx)(`div`,{className:_9,children:`time`}),(0,W.jsx)(`div`,{className:v9,children:new Date(e.ts).toLocaleString(void 0,{hour12:!1})}),(0,W.jsx)(`div`,{className:_9,children:`device`}),(0,W.jsx)(`div`,{className:v9,children:e.device??`—`}),(0,W.jsx)(`div`,{className:_9,children:`transport`}),(0,W.jsx)(`div`,{className:v9,children:e.transport??`—`}),(0,W.jsx)(`div`,{className:_9,children:`duration`}),(0,W.jsx)(`div`,{className:v9,children:fx(e.durationMs)}),(0,W.jsx)(`div`,{className:_9,children:`status`}),(0,W.jsx)(`div`,{className:v9,children:(0,W.jsx)(`span`,{className:e.isError?`text-destructive`:`text-success`,children:e.isError?`error`:`ok`})}),(0,W.jsx)(`div`,{className:_9,children:`output size`}),(0,W.jsxs)(`div`,{className:v9,children:[px(e.outputBytes),e.truncated?` (truncated)`:``]}),(0,W.jsx)(`div`,{className:_9,children:`structured`}),(0,W.jsx)(`div`,{className:v9,children:e.hasStructured?`yes (renders an MCP App view)`:`no`})]}),e.error&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h2`,{className:b9,children:`ERROR`}),(0,W.jsx)(`pre`,{className:q(y9,`text-destructive`),children:e.error})]}),(0,W.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`h2`,{className:b9,children:`INPUT`}),(0,W.jsx)(`span`,{className:`flex-1`}),e.input&&(0,W.jsx)(X,{type:`secondary`,size:`sm`,ghost:!0,onClick:()=>r(e=>{let t=!e;return A7(t),t}),title:n?`Showing pretty-printed JSON — click for raw`:`Showing raw JSON — click to pretty-print`,children:n?`✦ Pretty`:`{ } Raw`}),(0,W.jsx)(ux,{text:e.input,title:`Copy input JSON`})]}),e.input?(0,W.jsx)(M7,{value:j7(e.input,n)}):(0,W.jsx)(`pre`,{className:q(y9,`text-muted-foreground`),children:`—`}),(0,W.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,W.jsx)(`h2`,{className:b9,children:`OUTPUT`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(ux,{text:e.output,title:`Copy output`})]}),(0,W.jsx)(`pre`,{className:q(y9,`text-muted-foreground`),children:e.output?D7(e.output):`—`})]})})}var x9=e=>e==null?`?`:px(e);function Lte({d:e}){let t=e.status,n=e.history??[];return t.reachable===!0||n.length>0?(0,W.jsxs)(`div`,{className:`bg-card text-card-foreground flex flex-col gap-2.5 rounded-lg border p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(Wx,{color:s9(t).color}),(0,W.jsx)(`span`,{className:`font-mono text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Hx,{type:t.version?`success`:`default`,children:t.version?`v${t.version}`:`—`})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground -mt-1 font-mono text-[11px]`,children:[t.boardName??`router`,t.architecture?` · ${t.architecture}`:``,t.cpuCount?` · ${t.cpuCount} cpu`:``,t.uptime?` · up ${t.uptime}`:``]}),(0,W.jsxs)(`div`,{className:`flex justify-around gap-3.5`,children:[(0,W.jsx)(l7,{value:t.cpuLoad,label:`CPU`,color:_x.cpu}),(0,W.jsx)(l7,{value:t.memUsedPct,label:`MEM`,color:_x.mem}),(0,W.jsx)(l7,{value:t.hddUsedPct,label:`DISK`,color:_x.disk})]}),(0,W.jsxs)(`div`,{className:`grid gap-2`,children:[(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`CPU load`}),(0,W.jsx)(c7,{id:`${e.name}-cpu`,values:n.map(e=>e.cpuLoad),color:_x.cpu,maxValue:100,unit:`%`})]}),(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`Memory used`}),(0,W.jsx)(c7,{id:`${e.name}-mem`,values:n.map(e=>e.memUsedPct),color:_x.mem,maxValue:100,unit:`%`})]}),(0,W.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`Probe latency`}),(0,W.jsx)(c7,{id:`${e.name}-lat`,values:n.map(e=>e.latencyMs),color:_x.latency,unit:`ms`})]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground font-mono text-[11px]`,children:[`RAM `,x9(t.totalMemory&&t.freeMemory?t.totalMemory-t.freeMemory:void 0),` /`,` `,x9(t.totalMemory),` · free disk `,x9(t.freeHdd)]}),t.disks&&t.disks.length>0&&(0,W.jsxs)(`div`,{className:`grid gap-1`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-[10px] tracking-[0.05em] uppercase`,children:`External storage`}),t.disks.map(e=>(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-2 font-mono text-[11px]`,children:[(0,W.jsxs)(`span`,{className:`truncate`,children:[(0,W.jsx)(Hx,{type:`secondary`,children:e.slot}),` `,e.model??e.mountPoint??`disk`,e.fs?` · ${e.fs}`:``]}),(0,W.jsxs)(`span`,{className:`text-muted-foreground whitespace-nowrap`,children:[x9(e.free),` free / `,x9(e.size),e.usedPct==null?``:` · ${e.usedPct}%`]})]},e.slot))]})]}):(0,W.jsxs)(`div`,{className:`bg-card text-card-foreground flex min-h-[120px] flex-col justify-center gap-1.5 rounded-lg border p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(Wx,{color:s9(t).color}),(0,W.jsx)(`span`,{className:`font-mono text-[13px] font-medium`,children:e.name}),e.isDefault&&(0,W.jsx)(Hx,{type:`accent`,children:`default`})]}),(0,W.jsx)(`p`,{className:`text-muted-foreground m-0 text-[11px]`,children:t.reachable===!1?`Offline — ${t.error??`unreachable`}`:e.mac?`Waiting for the first MAC-Telnet probe (these run every few minutes to avoid contending with tool calls)…`:`Waiting for the first health probe…`})]})}function Rte(e,t){let n=(0,v.useRef)(e),r=(0,v.useRef)(t);n.current=e,r.current=t,(0,v.useEffect)(()=>{let e=!1,t=null,i=null,a=()=>{t&&=(t.onopen=t.onerror=t.onmessage=t.onclose=null,t.close(),null),i&&=(i.close(),null)},o=()=>{e||(i=new EventSource(hc(`/api/sse`)),i.addEventListener(`hello`,()=>r.current(`sse`)),i.addEventListener(`tool`,e=>{try{n.current(JSON.parse(e.data))}catch{}}),i.onerror=()=>{i&&i.readyState===EventSource.CONNECTING&&r.current(`off`)})},s=()=>{if(e)return;let i=location.protocol===`https:`?`wss`:`ws`;t=new WebSocket(hc(`${i}://${location.host}/api/stream`));let a=!1;t.onopen=()=>{a=!0,r.current(`ws`)},t.onerror=()=>t?.close(),t.onmessage=e=>{try{let t=JSON.parse(e.data);t.type===`event`&&t.event&&n.current(t.event)}catch{}},t.onclose=()=>{e||(r.current(`off`),a?setTimeout(s,2e3):o())}},c=()=>t?.readyState===WebSocket.OPEN||i?.readyState===EventSource.OPEN,l=()=>{e||c()||(a(),s())},u=()=>{document.visibilityState===`visible`&&l()};return s(),document.addEventListener(`visibilitychange`,u),window.addEventListener(`online`,l),()=>{e=!0,document.removeEventListener(`visibilitychange`,u),window.removeEventListener(`online`,l),a()}},[])}function zte(e){(0,v.useLayoutEffect)(()=>{let t=e.current;if(!t||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;document.documentElement.classList.add(`js-motion`);let n=new WeakSet,r=e=>{n.has(e)||(n.add(e),zi.set(e,{opacity:0,y:26}),ic.create({trigger:e,start:`top 90%`,once:!0,onEnter:()=>zi.to(e,{opacity:1,y:0,duration:.7,ease:`power3.out`})}))},i=e=>{for(let t of e.querySelectorAll(`.reveal`))r(t)};i(t);let a=new MutationObserver(e=>{for(let t of e)for(let e of t.addedNodes)e instanceof Element&&(e.matches(`.reveal`)&&r(e),i(e))});a.observe(t,{childList:!0,subtree:!0});let o=setInterval(()=>ic.refresh(),1200),s=setTimeout(()=>clearInterval(o),7e3);return()=>{a.disconnect(),clearInterval(o),clearTimeout(s);for(let e of ic.getAll())e.kill();document.documentElement.classList.remove(`js-motion`)}},[e])}function S9(e){return new Date(e).toLocaleString()}function C9(e){let t=Date.now()-e;return t<6e4?`just now`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}var Bte={"in-sync":`success`,drifted:`warning`,unknown:`secondary`,"no-baseline":`secondary`},Vte={"in-sync":`In Sync`,drifted:`Drifted`,unknown:`Unknown`,"no-baseline":`No Baseline`};function Hte({device:e,onDone:t}){let[n,r]=(0,v.useState)([]),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(``);(0,v.useEffect)(()=>{gc(`/api/drift/history/${encodeURIComponent(e)}?limit=20`).then(e=>{r(e.snapshots),e.snapshots.length>0&&a(e.snapshots[0].id)})},[e]);let f=async()=>{if(!i)return;l(!0),d(``);let n=await _c(`/api/drift/baseline`,{device:e,snapshotId:i,label:o||void 0});if(l(!1),n.ok)J.success(`Baseline set`),t();else{let e=n.error??`Failed`;d(e),J.error(e)}};return n.length===0?(0,W.jsx)(`div`,{className:`p-2`,children:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`No snapshots for this device. Capture one with capture_config_snapshot first.`})}):(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2`,children:[(0,W.jsx)(Xx,{value:i,onValueChange:a,"aria-label":`Baseline snapshot`,className:`min-w-[200px] flex-1`,options:n.map(e=>({value:e.id,label:`${e.id} — ${S9(e.ts)} — ${e.lines} lines${e.label?` "${e.label}"`:``}`}))}),(0,W.jsx)(Kx,{placeholder:`Label (optional)`,value:o,onChange:e=>s(e.target.value),className:`w-40`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void f(),disabled:c||!i,children:c?`Setting...`:`Set as Baseline`}),u&&(0,W.jsx)(`span`,{className:`text-destructive text-xs`,children:u})]})}function Ute({unified:e}){return e?(0,W.jsx)(`pre`,{className:`m-0 max-h-[500px] overflow-auto rounded bg-background p-3 font-mono text-[11px] leading-normal`,children:e.split(`
|
|
146
146
|
`).map((e,t)=>{let n=`text-muted-foreground`;return e.startsWith(`+`)?n=`text-success bg-success/10`:e.startsWith(`-`)?n=`text-destructive bg-destructive/10`:e.startsWith(`@@`)?n=`text-brand`:e.startsWith(`/`)&&(n=`text-warning`),(0,W.jsx)(`div`,{className:q(`px-1`,n),children:e||`\xA0`},t)})}):(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`No differences.`})}function Wte({sections:e}){if(e.length===0)return null;let t=Math.max(...e.map(e=>e.added+e.removed),1);return(0,W.jsx)(`div`,{className:`flex flex-col gap-1.5`,children:e.slice(0,15).map(e=>(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`w-[220px] truncate text-[11px] text-foreground`,title:e.path,children:e.path}),(0,W.jsxs)(`div`,{className:`flex h-3.5 flex-1 overflow-hidden rounded-[3px] bg-muted`,children:[(0,W.jsx)(`div`,{className:`h-full bg-success`,style:{width:`${e.added/t*100}%`}}),(0,W.jsx)(`div`,{className:`h-full bg-destructive`,style:{width:`${e.removed/t*100}%`}})]}),(0,W.jsxs)(`span`,{className:`min-w-[60px] text-[11px] text-muted-foreground`,children:[`+`,e.added,` -`,e.removed]})]},e.path))})}function Gte({attributions:e}){return e.length===0?(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`No config-related log entries found.`}):(0,W.jsx)(`div`,{className:`max-h-[250px] overflow-auto`,children:(0,W.jsxs)(Qb,{className:`text-[11px]`,children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`Time`}),(0,W.jsx)(Y,{children:`User`}),(0,W.jsx)(Y,{children:`Action`}),(0,W.jsx)(Y,{children:`Section`}),(0,W.jsx)(Y,{children:`Log`})]})}),(0,W.jsx)(ex,{children:e.map((e,t)=>(0,W.jsxs)(tx,{children:[(0,W.jsx)(nx,{className:`whitespace-nowrap`,children:e.timestamp??`—`}),(0,W.jsx)(nx,{children:e.user??`—`}),(0,W.jsx)(nx,{children:(0,W.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-px text-[10px]`,children:e.action??`?`})}),(0,W.jsx)(nx,{className:`max-w-[160px] truncate`,title:e.section,children:e.section}),(0,W.jsx)(nx,{className:`max-w-[300px] truncate text-muted-foreground`,title:e.logLine,children:e.logLine})]},t))})]})})}function Kte({device:e,onClose:t,onChanged:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(!1),[s,c]=(0,v.useState)(``),l=(0,v.useCallback)(async()=>{o(!0),c(``);try{let t=await gc(`/api/drift/check/${encodeURIComponent(e)}`);`error`in t?c(t.error):i(t)}catch(e){c(e instanceof Error?e.message:String(e))}o(!1)},[e]),u=async()=>{let t=await _c(`/api/drift/baseline`,{device:e,snapshotId:r?.baselineId,label:`promoted`});t.error?J.error(t.error):(J.success(`Drift promoted`),n())},d=async()=>{await vc(`/api/drift/baseline/${encodeURIComponent(e)}`,{}),J.success(`Baseline removed`),n()};return(0,W.jsxs)(sx,{title:`${e} — Drift Detail`,className:`reveal`,extra:(0,W.jsxs)(`div`,{className:`flex gap-2`,children:[(0,W.jsx)(X,{size:`sm`,onClick:()=>void l(),disabled:a,children:a?`Checking...`:`Check Now`}),(0,W.jsx)(X,{size:`sm`,type:`error`,ghost:!0,onClick:()=>void d(),children:`Remove Baseline`}),(0,W.jsx)(X,{size:`sm`,type:`secondary`,onClick:t,children:`Close`})]}),children:[s&&(0,W.jsx)(`div`,{className:`text-destructive`,children:s}),r&&(0,W.jsxs)(`div`,{children:[(0,W.jsxs)(`div`,{className:`mb-3 flex items-center gap-6 border-b border-border py-3`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(Wx,{type:r.identical?`success`:`warning`}),(0,W.jsx)(`strong`,{children:r.identical?`In Sync`:`Drifted`})]}),!r.identical&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{children:[`Score: `,(0,W.jsx)(`strong`,{children:r.score}),`/100`]}),(0,W.jsxs)(`div`,{className:`text-success`,children:[`+`,r.summary.added]}),(0,W.jsxs)(`div`,{className:`text-destructive`,children:[`-`,r.summary.removed]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground text-[11px]`,children:[r.summary.unchanged,` unchanged`]}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void u(),children:`Promote as Baseline`})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground ml-auto text-[11px]`,children:[`Checked: `,S9(r.capturedAt)]})]}),r.sections.length>0&&(0,W.jsxs)(`div`,{className:`mb-4`,children:[(0,W.jsx)(`h4`,{className:`mt-0 mb-2 text-[13px]`,children:`Sections with drift`}),(0,W.jsx)(Wte,{sections:r.sections})]}),r.attributions.length>0&&(0,W.jsxs)(`div`,{className:`mb-4`,children:[(0,W.jsx)(`h4`,{className:`mt-0 mb-2 text-[13px]`,children:`Change attribution`}),(0,W.jsx)(Gte,{attributions:r.attributions})]}),!r.identical&&(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{className:`mt-0 mb-2 text-[13px]`,children:`Unified diff`}),(0,W.jsx)(Ute,{unified:r.unified})]})]}),!r&&!a&&!s&&(0,W.jsx)(`p`,{className:`text-muted-foreground text-center text-[11px]`,children:`Click "Check Now" to run a live drift check against the golden baseline.`})]})}function qte(){let[e,t]=(0,v.useState)([]),[n,r]=(0,v.useState)([]),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(``),u=(0,v.useCallback)(async()=>{try{let[e,n]=await Promise.all([gc(`/api/drift/status`),gc(`/api/drift/baselines`)]);t(e.devices),r(n.baselines),l(``)}catch(e){l(e instanceof Error?e.message:String(e))}},[]);if((0,v.useEffect)(()=>{u();let e=setInterval(()=>void u(),15e3);return()=>clearInterval(e)},[u]),c&&e.length===0)return(0,W.jsx)(sx,{className:`reveal`,children:(0,W.jsx)(`p`,{className:`text-destructive`,children:c})});let d=e.filter(e=>e.status!==`no-baseline`);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-2 gap-3 sm:grid-cols-4`,children:[(0,W.jsx)(cx,{k:`Devices`,v:String(e.length)}),(0,W.jsx)(cx,{k:`With Baseline`,v:String(d.length)}),(0,W.jsx)(cx,{k:`In Sync`,v:String(e.filter(e=>e.status===`in-sync`).length)}),(0,W.jsx)(cx,{k:`Drifted`,v:String(e.filter(e=>e.status===`drifted`).length)})]}),(0,W.jsx)(sx,{title:`Fleet Drift Overview`,className:`reveal`,children:(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(240px,1fr))] gap-3`,children:e.map(e=>(0,W.jsxs)(`div`,{onClick:()=>{e.status!==`no-baseline`&&a(e.device)},className:q(`rounded-lg border bg-card p-4 transition-colors`,i===e.device?`border-brand`:`border-border`,e.status===`no-baseline`?`cursor-default`:`cursor-pointer hover:border-brand/40`),children:[(0,W.jsxs)(`div`,{className:`mb-2 flex justify-between`,children:[(0,W.jsx)(`strong`,{className:`text-sm`,children:e.device}),(0,W.jsx)(Hx,{type:Bte[e.status],children:Vte[e.status]})]}),e.baseline&&(0,W.jsxs)(`div`,{className:`text-muted-foreground text-[11px]`,children:[(0,W.jsxs)(`div`,{children:[`Baseline: `,C9(e.baseline.setAt)]}),e.baseline.label&&(0,W.jsxs)(`div`,{children:[`Label: `,e.baseline.label]})]}),e.status===`no-baseline`&&(0,W.jsx)(X,{size:`sm`,className:`mt-2`,onClick:t=>{t.stopPropagation(),s(e.device)},children:`Set Baseline`})]},e.device))})}),o&&(0,W.jsx)(sx,{title:`Set baseline for ${o}`,className:`reveal`,extra:(0,W.jsx)(X,{size:`sm`,type:`secondary`,onClick:()=>s(null),children:`Cancel`}),children:(0,W.jsx)(Hte,{device:o,onDone:()=>{s(null),u()}})}),i&&(0,W.jsx)(Kte,{device:i,onClose:()=>a(null),onChanged:()=>{a(null),u()}}),n.length>0&&(0,W.jsx)(sx,{title:`Baseline Manager`,className:`reveal`,children:(0,W.jsx)(`div`,{className:`overflow-x-auto`,children:(0,W.jsxs)(Qb,{className:`text-xs`,children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`Device`}),(0,W.jsx)(Y,{children:`Snapshot ID`}),(0,W.jsx)(Y,{children:`Set At`}),(0,W.jsx)(Y,{children:`Set By`}),(0,W.jsx)(Y,{children:`Label`}),(0,W.jsx)(Y,{children:`Size`}),(0,W.jsx)(Y,{children:`SHA`}),(0,W.jsx)(Y,{})]})}),(0,W.jsx)(ex,{children:n.map(e=>(0,W.jsxs)(tx,{children:[(0,W.jsx)(nx,{children:(0,W.jsx)(`strong`,{children:e.device})}),(0,W.jsx)(nx,{className:`font-mono text-[11px]`,children:e.snapshotId}),(0,W.jsx)(nx,{title:S9(e.setAt),children:C9(e.setAt)}),(0,W.jsx)(nx,{children:e.setBy}),(0,W.jsx)(nx,{children:e.label??`—`}),(0,W.jsx)(nx,{children:e.snapshot?`${e.snapshot.lines} lines / ${e.snapshot.bytes} bytes`:`deleted`}),(0,W.jsx)(nx,{className:`font-mono text-[10px]`,children:e.snapshot?.sha?.slice(0,8)??`—`}),(0,W.jsx)(nx,{children:(0,W.jsx)(X,{size:`sm`,type:`error`,ghost:!0,onClick:()=>{vc(`/api/drift/baseline/${encodeURIComponent(e.device)}`,{}).then(()=>{J.success(`Baseline removed`),u()})},children:`Remove`})})]},e.device))})]})})}),e.length===0&&!c&&(0,W.jsx)(sx,{className:`reveal`,children:(0,W.jsx)(`p`,{className:`text-muted-foreground text-center text-[11px]`,children:`No devices configured. Add devices to start using Drift Guard.`})})]})}function Jte(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)&2147483647;return t%360}var w9=[`var(--entity-1)`,`var(--entity-2)`,`var(--entity-3)`,`var(--entity-4)`,`var(--entity-5)`,`var(--entity-6)`,`var(--entity-7)`,`var(--entity-8)`,`var(--entity-9)`,`var(--entity-10)`];function T9(e){return w9[Math.abs(Jte(e))%w9.length]}var Yte={create_entity:`Created entity`,delete_entity:`Deleted entity`,create_relation:`Created relation`,delete_relation:`Deleted relation`,add_observation:`Added observations`,delete_observation:`Deleted observations`};function Xte(e,t,n,r){let i=n/2,a=r/2,o=e.map((t,o)=>{let s=2*Math.PI*o/Math.max(e.length,1),c=Math.min(n,r)*.3;return{id:t.name,label:t.name,type:t.entityType,x:i+c*Math.cos(s),y:a+c*Math.sin(s),vx:0,vy:0,obsCount:t.observations.length}}),s=t.map(e=>({source:e.from,target:e.to,label:e.relationType})),c=new Map(o.map(e=>[e.id,e])),l=.005,u=.85;for(let e=0;e<200;e++){for(let e=0;e<o.length;e++)for(let t=e+1;t<o.length;t++){let n=o[e],r=o[t],i=n.x-r.x,a=n.y-r.y,s=Math.sqrt(i*i+a*a)||1,c=3e3/(s*s);i=i/s*c,a=a/s*c,n.vx+=i,n.vy+=a,r.vx-=i,r.vy-=a}for(let e of s){let t=c.get(e.source),n=c.get(e.target);if(!t||!n)continue;let r=n.x-t.x,i=n.y-t.y,a=r*l,o=i*l;t.vx+=a,t.vy+=o,n.vx-=a,n.vy-=o}for(let e of o)e.vx+=(i-e.x)*.001,e.vy+=(a-e.y)*.001;for(let e of o){e.vx*=u,e.vy*=u,e.x+=e.vx,e.y+=e.vy;let t=Math.max(40,e.label.length*2.7+16);e.x=Math.max(t,Math.min(n-t,e.x)),e.y=Math.max(30,Math.min(r-30,e.y))}}return{nodes:o,edges:s}}function Zte({graph:e}){let t=(0,v.useRef)(null),[n,r]=(0,v.useState)(null),i=(0,v.useMemo)(()=>Xte(e.entities,e.relations,700,460),[e.entities,e.relations]),a=(0,v.useMemo)(()=>new Map(i.nodes.map(e=>[e.id,e])),[i.nodes]);return e.entities.length===0?(0,W.jsx)(`div`,{className:`text-muted-foreground flex items-center justify-center`,style:{height:460},children:(0,W.jsx)(`p`,{children:`No entities yet — create some via the MCP tools.`})}):(0,W.jsxs)(`svg`,{ref:t,viewBox:`0 0 700 460`,style:{width:`100%`,height:`auto`,maxHeight:460,display:`block`},children:[(0,W.jsx)(`defs`,{children:(0,W.jsx)(`marker`,{id:`mem-arrow`,viewBox:`0 0 10 6`,refX:`10`,refY:`3`,markerWidth:`8`,markerHeight:`6`,orient:`auto-start-reverse`,children:(0,W.jsx)(`path`,{d:`M0 0 L10 3 L0 6Z`,fill:`var(--muted-foreground)`})})}),i.edges.map((e,t)=>{let r=a.get(e.source),i=a.get(e.target);if(!r||!i)return null;let o=n!=null&&(e.source===n||e.target===n),s=n!=null&&!o,c=i.x-r.x,l=i.y-r.y,u=Math.sqrt(c*c+l*l)||1,d=e=>{let t=e.label.length*5.4,n=13+Math.min(e.obsCount,6);return Math.max(n,t/2+12)},f=d(r)+4,p=d(i)+4,m=r.x+c/u*f,h=r.y+l/u*f,g=i.x-c/u*p,_=i.y-l/u*p,v=(m+g)/2,y=(h+_)/2;return(0,W.jsxs)(`g`,{opacity:s?.15:1,children:[(0,W.jsx)(`line`,{x1:m,y1:h,x2:g,y2:_,stroke:o?`var(--foreground)`:`var(--border)`,strokeWidth:o?1.8:1,markerEnd:`url(#mem-arrow)`}),(0,W.jsx)(`text`,{x:v,y:y-5,textAnchor:`middle`,fill:`var(--muted-foreground)`,fontSize:`8`,style:{pointerEvents:`none`},children:e.label})]},t)}),i.nodes.map(e=>{let t=e.id===n,i=n!=null&&!t,a=T9(e.type),o=e.label,s=o.length*5.4,c=13+Math.min(e.obsCount,6),l=Math.max(c,s/2+12),u=c;return(0,W.jsxs)(`g`,{opacity:i?.25:1,style:{cursor:`pointer`},onClick:()=>r(t?null:e.id),children:[(0,W.jsx)(`rect`,{x:e.x-l,y:e.y-c,width:l*2,height:c*2,rx:u,ry:u,fill:a,fillOpacity:.15,stroke:t?`var(--foreground)`:a,strokeWidth:t?2:1.2}),(0,W.jsx)(`text`,{x:e.x,y:e.y+1,textAnchor:`middle`,dominantBaseline:`central`,fill:`var(--foreground)`,fontSize:`9`,fontWeight:t?600:400,style:{pointerEvents:`none`},children:o}),(0,W.jsx)(`text`,{x:e.x,y:e.y+c+11,textAnchor:`middle`,fill:`var(--muted-foreground)`,fontSize:`7`,style:{pointerEvents:`none`},children:e.type})]},e.id)})]})}function Qte({entity:e,relations:t,onClose:n,onDelete:r}){let i=t.filter(t=>t.to===e.name),a=t.filter(t=>t.from===e.name);return(0,W.jsxs)(`div`,{className:`rounded-lg border border-border bg-card p-5`,children:[(0,W.jsxs)(`div`,{className:`mb-2 flex items-center gap-2.5`,children:[(0,W.jsxs)(`h3`,{className:`m-0 flex items-center font-mono text-[15px]`,children:[(0,W.jsx)(Wx,{color:T9(e.entityType),className:`mr-2 size-2.5`}),e.name]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{type:`error`,ghost:!0,size:`sm`,onClick:r,title:`Delete entity`,children:`Delete`}),(0,W.jsx)(X,{type:`secondary`,size:`sm`,onClick:n,children:`Close`})]}),(0,W.jsxs)(`p`,{className:`mt-0 mb-2 text-xs text-muted-foreground`,children:[`Type: `,(0,W.jsx)(`strong`,{children:e.entityType}),` · Created:`,` `,new Date(e.createdAt).toLocaleString(),` · Updated:`,` `,new Date(e.updatedAt).toLocaleString()]}),e.observations.length>0&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`h4`,{className:`mt-3 mb-1.5 text-xs text-muted-foreground`,children:[`Observations (`,e.observations.length,`)`]}),(0,W.jsx)(`ul`,{className:`m-0 pl-[18px] text-[13px]`,children:e.observations.map((e,t)=>(0,W.jsx)(`li`,{className:`mb-0.5`,children:e},t))})]}),(a.length>0||i.length>0)&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h4`,{className:`mt-3 mb-1.5 text-xs text-muted-foreground`,children:`Relations`}),(0,W.jsxs)(`div`,{className:`text-[13px]`,children:[a.map((e,t)=>(0,W.jsxs)(`div`,{children:[`→ `,(0,W.jsx)(`strong`,{children:e.relationType}),` → `,e.to]},`o${t}`)),i.map((e,t)=>(0,W.jsxs)(`div`,{children:[`← `,(0,W.jsx)(`strong`,{children:e.relationType}),` ← `,e.from]},`i${t}`))]})]})]})}function $te({activity:e}){return e.length===0?(0,W.jsx)(`p`,{className:`text-muted-foreground text-[13px]`,children:`No activity yet.`}):(0,W.jsx)(`div`,{className:`max-h-[280px] overflow-y-auto`,children:(0,W.jsxs)(Qb,{className:`text-xs`,children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`Time`}),(0,W.jsx)(Y,{children:`Action`}),(0,W.jsx)(Y,{children:`Subject`})]})}),(0,W.jsx)(ex,{children:e.map(e=>(0,W.jsxs)(tx,{children:[(0,W.jsx)(nx,{className:`whitespace-nowrap text-muted-foreground`,children:mx(e.ts)}),(0,W.jsx)(nx,{children:Yte[e.action]??e.action}),(0,W.jsx)(nx,{className:`max-w-[260px] truncate`,children:e.subject})]},e.id))})]})})}function ene({config:e,onSaved:t}){let[n,r]=(0,v.useState)(e.dbPath),[i,a]=(0,v.useState)(!1),[o,s]=(0,v.useState)(``);(0,v.useEffect)(()=>{r(e.dbPath)},[e.dbPath]);let c=(0,v.useCallback)(async()=>{a(!0),s(``);try{let e=await _c(`/api/memory/config`,{dbPath:n});if(e.ok)s(`Saved`),J.success(`Config saved`),t();else{let t=e.error??`Failed`;s(t),J.error(t)}}catch(e){s(String(e)),J.error(String(e))}finally{a(!1)}},[n,t]);return(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`label`,{className:`mb-1 block text-xs text-muted-foreground`,children:`Database path`}),(0,W.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,W.jsx)(Kx,{type:`text`,value:n,onChange:e=>r(e.target.value),className:`flex-1 text-[13px]`}),(0,W.jsx)(X,{size:`sm`,onClick:c,disabled:i||n===e.dbPath,children:i?`Saving…`:`Save`})]}),o&&(0,W.jsx)(`p`,{className:q(`mt-1 text-xs`,o===`Saved`?`text-success`:`text-destructive`),children:o}),e.stats&&(0,W.jsxs)(`div`,{className:`mt-3 grid grid-cols-3 gap-3`,children:[(0,W.jsx)(cx,{k:`Entities`,v:String(e.stats.entities)}),(0,W.jsx)(cx,{k:`Relations`,v:String(e.stats.relations)}),(0,W.jsx)(cx,{k:`Observations`,v:String(e.stats.observations)})]})]})}function tne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(null),[u,d]=(0,v.useState)(``),[f,p]=(0,v.useState)(``),m=(0,v.useCallback)(async()=>{try{let[e,n,i,o]=await Promise.all([gc(`/api/memory/graph`),gc(`/api/memory/stats`),gc(`/api/memory/config`),gc(`/api/memory/activity?limit=50`)]);t(e),r(n),a(i),s(o),p(``)}catch(e){p(String(e))}},[]);(0,v.useEffect)(()=>{m();let e=setInterval(()=>void m(),1e4);return()=>clearInterval(e)},[m]);let h=(0,v.useCallback)(async()=>{if(!u.trim()){m();return}try{let e=await gc(`/api/memory/search?q=${encodeURIComponent(u)}`);t(e)}catch(e){p(String(e))}},[u,m]),g=(0,v.useCallback)(async e=>{try{await vc(`/api/memory/entities`,{names:[e]}),J.success(`Entity deleted`)}catch(e){J.error(e instanceof Error?e.message:`Entity deletion failed`)}l(null),m()},[m]);return f&&!e?(0,W.jsx)(sx,{title:`Knowledge Graph`,children:(0,W.jsx)(`p`,{className:`text-destructive`,children:f})}):(0,W.jsxs)(W.Fragment,{children:[n&&(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-5`,children:[(0,W.jsx)(cx,{k:`Entities`,v:String(n.entities)}),(0,W.jsx)(cx,{k:`Relations`,v:String(n.relations)}),(0,W.jsx)(cx,{k:`Observations`,v:String(n.observations)}),(0,W.jsx)(cx,{k:`Entity types`,v:String(n.entityTypes.length)}),(0,W.jsx)(cx,{k:`Relation types`,v:String(n.relationTypes.length)})]}),(0,W.jsx)(sx,{title:`Knowledge Graph`,className:`reveal`,extra:(0,W.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,W.jsx)(Kx,{type:`text`,placeholder:`Search entities…`,value:u,onChange:e=>d(e.target.value),onKeyDown:e=>e.key===`Enter`&&h(),className:`w-[200px] text-xs`}),(0,W.jsx)(X,{size:`sm`,onClick:h,children:`Search`}),u&&(0,W.jsx)(X,{size:`sm`,type:`secondary`,onClick:()=>{d(``),m()},children:`Clear`})]}),children:e&&(0,W.jsx)(Zte,{graph:e})}),(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-2 gap-4`,children:[(0,W.jsx)(sx,{title:`Entities`,children:e&&e.entities.length>0?(0,W.jsx)(`div`,{className:`max-h-[360px] overflow-y-auto`,children:(0,W.jsxs)(Qb,{className:`text-xs`,children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`Name`}),(0,W.jsx)(Y,{children:`Type`}),(0,W.jsx)(Y,{children:`Obs`}),(0,W.jsx)(Y,{children:`Created`})]})}),(0,W.jsx)(ex,{children:e.entities.map(e=>(0,W.jsxs)(tx,{className:`cursor-pointer`,"data-state":c?.name===e.name?`selected`:void 0,onClick:()=>l(e),children:[(0,W.jsxs)(nx,{children:[(0,W.jsx)(Wx,{color:T9(e.entityType),className:`mr-1.5`}),e.name]}),(0,W.jsx)(nx,{className:`text-muted-foreground`,children:e.entityType}),(0,W.jsx)(nx,{children:e.observations.length}),(0,W.jsx)(nx,{className:`text-muted-foreground`,children:mx(e.createdAt)})]},e.name))})]})}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-[13px]`,children:e?`No entities.`:`Loading…`})}),c&&e?(0,W.jsx)(Qte,{entity:c,relations:e.relations,onClose:()=>l(null),onDelete:()=>g(c.name)}):(0,W.jsx)(sx,{title:`Activity Log`,children:(0,W.jsx)($te,{activity:o})})]}),n&&(n.entityTypes.length>0||n.relationTypes.length>0)&&(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-2 gap-4`,children:[n.entityTypes.length>0&&(0,W.jsx)(sx,{title:`Entity Types`,children:(0,W.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:n.entityTypes.map(e=>(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-xl px-2.5 py-0.5 text-xs`,style:{background:`${T9(e.type)}22`,border:`1px solid ${T9(e.type)}44`},children:[(0,W.jsx)(Wx,{color:T9(e.type)}),e.type,(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[`(`,e.count,`)`]})]},e.type))})}),n.relationTypes.length>0&&(0,W.jsx)(sx,{title:`Relation Types`,children:(0,W.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:n.relationTypes.map(e=>(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-xl border border-border bg-muted px-2.5 py-0.5 text-xs`,children:[e.type,(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[`(`,e.count,`)`]})]},e.type))})})]}),i&&(0,W.jsx)(sx,{title:`Memory Configuration`,className:`reveal`,children:(0,W.jsx)(ene,{config:i,onSaved:m})})]})}var E9=e=>q(`flex items-start gap-2.5 rounded-md border px-[11px] py-[9px] cursor-pointer select-none transition-colors`,e?`border-brand/50 bg-brand/10`:`border-border bg-card hover:border-brand/35`);function nne({m:e,busy:t,onToggle:n}){return(0,W.jsxs)(`label`,{className:E9(e.enabled),title:e.description,children:[(0,W.jsx)(`input`,{type:`checkbox`,className:`mt-0.5 cursor-pointer accent-brand`,checked:e.enabled,disabled:t,onChange:()=>n(e.slug,!e.enabled)}),(0,W.jsxs)(`span`,{className:`flex min-w-0 flex-1 flex-col gap-0.5`,children:[(0,W.jsxs)(`span`,{className:`flex flex-wrap items-center gap-[7px] text-xs font-semibold text-foreground`,children:[e.label,(0,W.jsx)(`code`,{className:`rounded border border-border bg-background px-[5px] py-px font-mono text-[10px] text-muted-foreground`,children:e.slug})]}),(0,W.jsx)(`span`,{className:`text-[11px] leading-[1.35] text-muted-foreground`,children:e.description})]}),(0,W.jsxs)(`span`,{className:`whitespace-nowrap pt-px font-mono text-[10px] text-muted-foreground`,children:[e.toolCount,` tool`,e.toolCount===1?``:`s`]})]})}function rne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(new Set),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(!1),f=(0,v.useCallback)(()=>{gc(`/api/modules`).then(e=>{t(e),e.appViews!==void 0&&l(e.appViews)}).catch(()=>a(`could not load modules`))},[]);(0,v.useEffect)(()=>f(),[f]);let p=e=>t(t=>t?{...t,...e}:e),m=(0,v.useCallback)(async(e,n)=>{r(t=>new Set(t).add(e)),t(t=>t&&{...t,modules:t.modules.map(t=>t.slug===e?{...t,enabled:n}:t)});let i=await _c(`/api/modules/toggle`,{slug:e,enabled:n}).catch(()=>({error:`request failed`}));if(r(t=>{let n=new Set(t);return n.delete(e),n}),i.error||i.ok===!1){a(i.error??`toggle failed`),J.error(i.error??`Toggle failed`),f();return}p(i);let o=i.persisted?`saved to config`:`applied live (not saved)`,s=i.warning?` ⚠ ${i.warning}`:``;a(`${e} ${n?`enabled`:`disabled`} — ${o}. Reconnect the MCP client (or restart the server) for the tool list to update.${s}`),J.success(`Module ${n?`enabled`:`disabled`}`)},[f]),h=(0,v.useCallback)(async(e,t)=>{for(let n of e)await m(n,t)},[m]),g=(0,v.useCallback)(async e=>{d(!0),l(e);let t=await _c(`/api/modules/app-views`,{enabled:e}).catch(()=>({error:`request failed`}));if(d(!1),`error`in t&&t.error){a(t.error),J.error(t.error),l(!e);return}`appViews`in t&&t.appViews!==void 0&&l(t.appViews);let n=`persisted`in t&&t.persisted?`saved to config`:`applied live (not saved)`,r=`warning`in t&&t.warning?` — ${t.warning}`:``;a(`App views ${e?`enabled`:`disabled`} — ${n}. Restart the server for the change to take effect.${r}`),J.success(`App Views ${e?`enabled`:`disabled`}`)},[]),_=(0,v.useMemo)(()=>{if(!e)return[];let t=o.trim().toLowerCase(),n=e=>!t||e.slug.toLowerCase().includes(t)||e.label.toLowerCase().includes(t)||e.group.toLowerCase().includes(t)||e.description.toLowerCase().includes(t),r=new Map;for(let t of e.modules){if(!n(t))continue;let e=r.get(t.group)??[];e.push(t),r.set(t.group,e)}return[...r.entries()].map(([e,t])=>({group:e,modules:t}))},[e,o]);if(!e)return(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`loading modules…`});let y=_.reduce((e,t)=>e+t.modules.length,0);return(0,W.jsx)(`section`,{className:`grid content-start gap-[18px]`,children:(0,W.jsxs)(sx,{title:`Tool modules`,className:`reveal`,extra:(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[e.enabledModules,`/`,e.total,` modules · `,e.enabledTools,`/`,e.totalTools,` `,`tools exposed`]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,icon:(0,W.jsx)(rl,{}),onClick:f,children:`Refresh`})]}),children:[(0,W.jsxs)(`label`,{className:q(E9(c),`mb-2.5`),title:`Emit MCP App view metadata (_meta.ui) on read tools`,children:[(0,W.jsx)(`input`,{type:`checkbox`,className:`mt-0.5 cursor-pointer accent-brand`,checked:c,disabled:u,onChange:()=>void g(!c)}),(0,W.jsxs)(`span`,{className:`flex min-w-0 flex-1 flex-col gap-0.5`,children:[(0,W.jsx)(`span`,{className:`flex flex-wrap items-center gap-[7px] text-xs font-semibold text-foreground`,children:`MCP App Views`}),(0,W.jsxs)(`span`,{className:`text-[11px] leading-[1.35] text-muted-foreground`,children:[`When on, read tools emit interactive table/detail widgets via `,(0,W.jsx)(`code`,{children:`_meta.ui`}),`. Disable to keep the LLM context lean. Requires server restart.`]})]})]}),(0,W.jsxs)(`div`,{className:`mb-2.5 flex flex-wrap gap-3 font-mono text-[11px] text-muted-foreground`,children:[(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-[5px]`,children:[`writes to: `,(0,W.jsx)(`code`,{children:e.source?.path??`config file`})]}),(0,W.jsx)(`span`,{className:`inline-flex items-center gap-[5px]`,children:e.hasAllowList?`allow-list active`:`all modules on by default`})]}),(0,W.jsxs)(`p`,{className:`mb-3 text-muted-foreground text-xs`,children:[`Toggle a module to expose or hide all of its tools. Disabling adds it to`,` `,(0,W.jsx)(`code`,{children:`tools.disabledModules`}),` in your config file; enabling removes it (or adds it to`,` `,(0,W.jsx)(`code`,{children:`tools.enabledModules`}),` when an allow-list is in force). Trimming the surface below ~150–200 tools makes every remaining tool reliably findable by the MCP client. The client must reconnect for changes to take effect.`]}),(0,W.jsxs)(`div`,{className:`mb-1.5 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Kx,{placeholder:`Filter modules by name, slug, group or description…`,value:o,onChange:e=>s(e.target.value)}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void h(e.modules.filter(e=>!e.enabled).map(e=>e.slug),!0),children:`Enable all`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void h(e.modules.filter(e=>e.enabled).map(e=>e.slug),!1),children:`Disable all`})]}),i&&(0,W.jsx)(`div`,{className:`mt-3 font-mono text-xs text-muted-foreground`,children:i}),y===0?(0,W.jsxs)(`div`,{className:`p-3 text-muted-foreground text-[11px]`,children:[`No modules match “`,o,`”.`]}):(0,W.jsx)(`div`,{className:`mt-3 flex flex-col gap-[18px]`,children:_.map(({group:e,modules:t})=>{let r=t.filter(e=>e.enabled).length,i=t.map(e=>e.slug);return(0,W.jsxs)(`div`,{children:[(0,W.jsxs)(`div`,{className:`mb-2 flex items-center gap-2.5 border-b border-border pb-1.5`,children:[(0,W.jsx)(`h3`,{className:`m-0 text-[13px] font-semibold text-foreground`,children:e}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[r,`/`,t.length,` on`]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void h(i.filter(e=>{let n=t.find(t=>t.slug===e);return n?!n.enabled:!1}),!0),children:`Enable group`}),(0,W.jsx)(X,{size:`sm`,onClick:()=>void h(i.filter(e=>{let n=t.find(t=>t.slug===e);return n?n.enabled:!1}),!1),children:`Disable group`})]}),(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(min(100%,360px),1fr))] gap-2`,children:t.map(e=>(0,W.jsx)(nne,{m:e,busy:n.has(e.slug),onToggle:(e,t)=>void m(e,t)},e.slug))})]},e)})})]})})}function ine({...e}){return(0,W.jsx)(_f,{"data-slot":`dialog`,...e})}function ane({...e}){return(0,W.jsx)(Cf,{"data-slot":`dialog-portal`,...e})}function one({className:e,...t}){return(0,W.jsx)(Tf,{"data-slot":`dialog-overlay`,className:q(`fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function sne({className:e,children:t,showCloseButton:n=!0,...r}){return(0,W.jsxs)(ane,{"data-slot":`dialog-portal`,children:[(0,W.jsx)(one,{}),(0,W.jsxs)(kf,{"data-slot":`dialog-content`,className:q(`fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg`,e),...r,children:[t,n&&(0,W.jsxs)(Rf,{"data-slot":`dialog-close`,className:`absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,children:[(0,W.jsx)(_l,{}),(0,W.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function cne({className:e,...t}){return(0,W.jsx)(`div`,{"data-slot":`dialog-header`,className:q(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function lne({className:e,showCloseButton:t=!1,children:n,...r}){return(0,W.jsxs)(`div`,{"data-slot":`dialog-footer`,className:q(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...r,children:[n,t&&(0,W.jsx)(Rf,{asChild:!0,children:(0,W.jsx)(vb,{variant:`outline`,children:`Close`})})]})}function une({className:e,...t}){return(0,W.jsx)(Pf,{"data-slot":`dialog-title`,className:q(`text-lg leading-none font-semibold`,e),...t})}function dne({className:e,...t}){return(0,W.jsx)(If,{"data-slot":`dialog-description`,className:q(`text-sm text-muted-foreground`,e),...t})}var D9=` {0,3}`;function O9(e){let t=e.replace(/\r\n?/g,`
|
|
147
147
|
`);t=t.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`);let n=[];t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(e,t,r)=>(n.push(`<pre><code>${r.trim()}</code></pre>`),`%%CB${n.length-1}%%`));let r=[];t=t.replace(/`([^`]+)`/g,(e,t)=>(r.push(`<code>${t}</code>`),`%%IC${r.length-1}%%`)),t=t.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,`<img src="$2" alt="$1"/>`),t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,`<a href="$2" target="_blank" rel="noopener">$1</a>`),t=t.replace(/(?<!=["'])(https?:\/\/[^\s<>")\]]+)/g,`<a href="$1" target="_blank" rel="noopener">$1</a>`),t=t.replace(/\*\*\*(.+?)\*\*\*/g,`<strong><em>$1</em></strong>`),t=t.replace(/\*\*(.+?)\*\*/g,`<strong>$1</strong>`),t=t.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,`<em>$1</em>`),t=t.replace(/~~(.+?)~~/g,`<del>$1</del>`),t=t.replace(RegExp(`^${D9}#### (.+)$`,`gm`),`<h5>$1</h5>`),t=t.replace(RegExp(`^${D9}### (.+)$`,`gm`),`<h4>$1</h4>`),t=t.replace(RegExp(`^${D9}## (.+)$`,`gm`),`<h3>$1</h3>`),t=t.replace(RegExp(`^${D9}# (.+)$`,`gm`),`<h2>$1</h2>`),t=t.replace(RegExp(`^${D9}> (.+)$`,`gm`),`<blockquote>$1</blockquote>`),t=t.replace(/<\/blockquote>\n<blockquote>/g,`
|
|
148
148
|
`),t=t.replace(RegExp(`^${D9}(?:-{3,}|\\*{3,}|_{3,})\\s*$`,`gm`),`<hr/>`),t=t.replace(RegExp(`((?:^${D9}\\|.+\\|\\n?)+)`,`gm`),e=>{let t=e.trim().split(`
|
|
@@ -151,11 +151,11 @@ ${n.map(([e,n])=>{let r=n.theme?.[t]??n.color;return r?` --color-${e}: ${r};`:n
|
|
|
151
151
|
<li>`),t=t.replace(/((?:<li>.*<\/li>\n?)+)/g,e=>`<ul>${e.trimEnd()}</ul>`),t=t.replace(/<li>\[x\] (.+?)<\/li>/gi,`<li class="wn-task done"><span class="wn-check">✓</span> $1</li>`),t=t.replace(/<li>\[ \] (.+?)<\/li>/g,`<li class="wn-task"><span class="wn-check">☐</span> $1</li>`);let i=/^<\/?(h[2-5]|ul|ol|li|pre|blockquote|hr|div|table|img)/;return t=t.split(`
|
|
152
152
|
`).map(e=>{let t=e.trim();return t?i.test(t)?t:`<p>${t}</p>`:``}).join(`
|
|
153
153
|
`),t=t.replace(/%%CB(\d+)%%/g,(e,t)=>n[Number(t)]),t=t.replace(/%%IC(\d+)%%/g,(e,t)=>r[Number(t)]),t}var k9=`mt-whats-new-dismissed`,A9=`mt-whats-new-seen-version`;function fne(e){try{return localStorage.getItem(k9)===e}catch{return!1}}function pne(e){try{localStorage.setItem(k9,e)}catch{}}function mne(e){try{let t=localStorage.getItem(A9);return localStorage.setItem(A9,e),t!==null&&t!==e}catch{return!1}}var j9=`text-[13px] leading-[1.7] text-muted-foreground [&_h2]:mt-[18px] [&_h2]:mb-1.5 [&_h2]:text-[17px] [&_h2]:font-bold [&_h2]:text-foreground [&_h3]:mt-[18px] [&_h3]:mb-1.5 [&_h3]:text-[15px] [&_h3]:font-bold [&_h3]:text-foreground [&_h4]:mt-[18px] [&_h4]:mb-1.5 [&_h4]:text-[14px] [&_h4]:font-bold [&_h4]:text-foreground [&_h5]:mt-[18px] [&_h5]:mb-1.5 [&_h5]:text-[14px] [&_h5]:font-bold [&_h5]:text-foreground [&_p]:my-[5px] [&_ul]:my-[5px] [&_ul]:list-disc [&_ul]:pl-[18px] [&_ol]:my-[5px] [&_ol]:list-decimal [&_ol]:pl-[22px] [&_li]:my-[3px] [&_li]:marker:text-brand [&_img]:my-1.5 [&_img]:max-w-full [&_img]:rounded-md [&_img]:border [&_img]:border-border [&_code]:rounded [&_code]:border [&_code]:border-border [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-xs [&_code]:text-brand [&_pre]:my-2 [&_pre]:overflow-x-auto [&_pre]:rounded-md [&_pre]:border [&_pre]:border-border [&_pre]:bg-background [&_pre]:p-3 [&_pre_code]:border-0 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-muted-foreground [&_a]:text-brand [&_a]:underline [&_a]:underline-offset-2 [&_strong]:font-semibold [&_strong]:text-foreground [&_blockquote]:my-2 [&_blockquote]:border-l-[3px] [&_blockquote]:border-brand/40 [&_blockquote]:px-3.5 [&_blockquote]:py-1.5 [&_blockquote]:italic [&_hr]:my-3.5 [&_hr]:border-0 [&_hr]:border-t [&_hr]:border-border [&_del]:text-muted-foreground [&_del]:opacity-60 [&_table]:w-full [&_table]:border-collapse [&_table]:font-mono [&_table]:text-xs [&_th]:border-b [&_th]:border-border [&_th]:bg-muted [&_th]:px-3 [&_th]:py-[7px] [&_th]:text-left [&_th]:text-[11px] [&_th]:font-semibold [&_th]:tracking-wide [&_th]:text-foreground [&_th]:uppercase [&_td]:border-b [&_td]:border-border [&_td]:px-3 [&_td]:py-[7px] [&_td]:text-muted-foreground [&_.wn-table-wrap]:my-2.5 [&_.wn-table-wrap]:overflow-x-auto [&_.wn-table-wrap]:rounded-md [&_.wn-table-wrap]:border [&_.wn-table-wrap]:border-border [&_.wn-task]:-ml-[18px] [&_.wn-task]:list-none [&_.wn-check]:inline-block [&_.wn-check]:w-4 [&_.wn-task.done_.wn-check]:text-success`,hne=600*1e3;function gne(e){let[t,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(!1);(0,v.useEffect)(()=>{if(!e)return;let t=mne(e),r=null,a=()=>{gc(`/api/releases/latest`).then(e=>{n(e);let a=r===null,o=r!==null&&e.version!==r;if(r=e.version,a&&t){setTimeout(()=>i(!0),1200);return}e.isNewer&&!fne(e.version)&&(a||o)&&setTimeout(()=>i(!0),a?1200:0)}).catch(()=>{})};a();let o=setInterval(a,hne);return()=>clearInterval(o)},[e]);let a=(0,v.useCallback)(()=>{t?.isNewer&&pne(t.version),i(!1)},[t]),o=(0,v.useCallback)(()=>i(!0),[]);return{release:t,showModal:r,showIndicator:t!==null&&t.isNewer,openModal:o,dismissRelease:a}}function _ne({release:e,onDismiss:t}){let n=new Date(e.publishedAt).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,year:`numeric`}),r={__html:O9(e.body)};return(0,W.jsx)(ine,{open:!0,onOpenChange:e=>{e||t()},children:(0,W.jsxs)(sne,{className:`max-h-[calc(100vh-80px)] gap-0 overflow-y-auto p-0 sm:max-w-[520px]`,children:[(0,W.jsxs)(cne,{className:`items-center gap-4 px-8 pt-10 pb-6 text-center`,children:[(0,W.jsx)(`span`,{className:`inline-block rounded-full border border-brand/30 bg-brand/10 px-3.5 py-1 font-mono text-[10px] font-bold tracking-[0.2em] text-brand uppercase`,children:e.isNewer?`NEW RELEASE`:`RELEASE NOTES`}),(0,W.jsxs)(une,{className:`text-[44px] leading-none font-extrabold tracking-tight text-brand`,children:[`v`,e.version]}),(0,W.jsxs)(dne,{className:`font-mono text-xs text-muted-foreground`,children:[`Released `,n,e.isNewer&&(0,W.jsxs)(W.Fragment,{children:[` · you’re on v`,e.currentVersion]})]})]}),(0,W.jsx)(`div`,{className:q(`px-8 py-5`,j9),dangerouslySetInnerHTML:r}),(0,W.jsxs)(lne,{className:`flex-row items-center justify-between border-t border-border px-8 pt-3.5 pb-6`,children:[(0,W.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1.5 font-mono text-xs text-muted-foreground hover:text-foreground`,children:[`View on GitHub`,(0,W.jsx)(Uc,{className:`size-3.5`})]}),(0,W.jsx)(X,{type:`default`,size:`sm`,onClick:t,children:`Got it`})]})]})})}var M9=`@usex/mikrotik-mcp`;function vne(e){try{return new Date(e).toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`})}catch{return e}}function N9(e){return e===`current`?{label:`Reinstall`,icon:(0,W.jsx)(il,{className:`size-3.5`})}:e===`newer`?{label:`Upgrade`,icon:(0,W.jsx)(Mc,{className:`size-3.5`})}:{label:`Downgrade`,icon:(0,W.jsx)(jc,{className:`size-3.5`})}}function yne({body:e}){return e.trim()?(0,W.jsx)(`div`,{className:q(j9),dangerouslySetInnerHTML:{__html:O9(e)}}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`No release notes.`})}function bne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(!0),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(new Set),[c,l]=(0,v.useState)(null),[u,d]=(0,v.useState)(!1),[f,p]=(0,v.useState)(null),m=(0,v.useCallback)(async()=>{r(!0);try{let e=await gc(`/api/releases`);t(e),a(null);let n=e.releases.find(t=>t.version===e.latestVersion);n&&s(new Set([n.version]))}catch(e){a(e instanceof Error?e.message:`Could not load releases`)}finally{r(!1)}},[]);(0,v.useEffect)(()=>{m()},[m]);let h=e=>s(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n});async function g(e){l(null),d(!0),p(null);let t=J.loading(`Installing ${M9}@${e}…`);try{let n=await _c(`/api/upgrade`,{version:e});n?.ok?(p(n.log??null),J.success(`Installed v${n.version}`,{id:t,description:n.restarting?`Restarting on the new version — reconnect shortly.`:n.note})):(p(n?.log??null),J.error(n?.error??`Install failed`,{id:t,description:`See the install log below.`}))}catch{J.error(`Install failed (server unreachable)`,{id:t})}finally{d(!1)}}let _=e?.releases.find(t=>t.version===e.latestVersion)??null,y=(0,v.useMemo)(()=>e?(0,W.jsxs)(`div`,{className:`relative overflow-hidden rounded-xl border bg-card p-6`,children:[(0,W.jsx)(`div`,{className:`from-brand/10 pointer-events-none absolute -top-16 -right-16 size-56 rounded-full bg-gradient-to-br to-transparent blur-2xl`}),(0,W.jsxs)(`div`,{className:`relative flex flex-wrap items-center justify-between gap-4`,children:[(0,W.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px] font-medium tracking-[0.18em] uppercase`,children:`Running version`}),(0,W.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,W.jsxs)(`span`,{className:`text-foreground text-[40px] leading-none font-extrabold tracking-tight`,children:[`v`,e.currentVersion]}),e.updateAvailable?(0,W.jsxs)(`span`,{className:`bg-brand/10 text-brand ring-brand/30 inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-semibold ring-1`,children:[(0,W.jsx)(ll,{className:`size-3.5`}),` v`,e.latestVersion,` available`]}):(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 rounded-full bg-emerald-500/10 px-3 py-1 text-xs font-semibold text-emerald-500 ring-1 ring-emerald-500/30`,children:[(0,W.jsx)(Pc,{className:`size-3.5`}),` Up to date`]})]})]}),(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsxs)(X,{onClick:()=>void m(),title:`Re-check for updates`,children:[(0,W.jsx)(rl,{className:`size-3.5`}),` Re-check`]}),e.updateAvailable&&_&&(0,W.jsxs)(X,{onClick:()=>l(_),disabled:u,className:`bg-brand text-brand-foreground hover:bg-brand/90 border-transparent`,children:[(0,W.jsx)(Mc,{className:`size-3.5`}),` Upgrade to latest`]})]})]})]}):null,[e,_,u,m]);return n?(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center gap-2 p-6 text-sm`,children:[(0,W.jsx)(Gx,{}),` Loading releases…`]}):i||!e?(0,W.jsx)(`div`,{className:`p-4`,children:(0,W.jsxs)(zx,{type:`error`,label:`Couldn't load releases`,children:[i??`No data.`,` Check network access to GitHub.`]})}):(0,W.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[y,f&&(0,W.jsxs)(`div`,{className:`rounded-lg border bg-card p-3`,children:[(0,W.jsx)(`div`,{className:`text-muted-foreground mb-1.5 text-[11px] font-semibold tracking-wide uppercase`,children:`Install log`}),(0,W.jsx)(`pre`,{className:`text-muted-foreground max-h-52 overflow-auto font-mono text-[11px] leading-relaxed whitespace-pre-wrap`,children:f})]}),(0,W.jsxs)(`div`,{className:`relative pl-6`,children:[(0,W.jsx)(`div`,{className:`bg-border absolute top-2 bottom-2 left-[9px] w-px`,"aria-hidden":`true`}),(0,W.jsx)(`div`,{className:`flex flex-col gap-3`,children:e.releases.map(t=>{let n=o.has(t.version),r=t.relation===`current`,i=t.version===e.latestVersion,a=N9(t.relation);return(0,W.jsxs)(`div`,{className:`relative`,children:[(0,W.jsx)(`span`,{className:q(`absolute top-3.5 -left-[21px] z-10 grid size-[19px] place-items-center rounded-full ring-4 ring-card`,r?`bg-emerald-500`:i?`bg-brand`:t.relation===`newer`?`bg-brand/60`:`bg-muted-foreground/40`),title:r?`You are here`:t.relation,children:r&&(0,W.jsx)(Pc,{className:`size-3 text-white`})}),(0,W.jsxs)(`div`,{className:q(`rounded-lg border bg-card transition-colors`,r&&`border-emerald-500/40`,i&&!r&&`border-brand/40`),children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1.5 p-3.5`,children:[(0,W.jsxs)(`button`,{type:`button`,onClick:()=>h(t.version),className:`flex items-baseline gap-2 text-left`,title:n?`Hide notes`:`Show notes`,children:[(0,W.jsxs)(`span`,{className:`text-foreground text-lg font-bold tracking-tight`,children:[`v`,t.version]}),(0,W.jsx)(`span`,{className:`text-muted-foreground text-xs`,children:vne(t.publishedAt)})]}),r&&(0,W.jsx)(`span`,{className:`inline-flex items-center gap-1 rounded-full bg-emerald-500/10 px-2 py-0.5 text-[10px] font-semibold text-emerald-500 uppercase`,children:`current`}),i&&!r&&(0,W.jsx)(`span`,{className:`bg-brand/10 text-brand rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase`,children:`latest`}),t.prerelease&&(0,W.jsx)(`span`,{className:`text-muted-foreground rounded-full bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase`,children:`pre-release`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(`a`,{href:t.url,target:`_blank`,rel:`noopener noreferrer`,className:`text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs`,title:`Open on GitHub`,children:(0,W.jsx)(Uc,{className:`size-3.5`})}),(0,W.jsx)(X,{onClick:()=>h(t.version),children:n?`Hide notes`:`Notes`}),(0,W.jsxs)(X,{onClick:()=>l(t),disabled:u,className:q(t.relation===`older`&&`text-destructive`,t.relation===`newer`&&`bg-brand text-brand-foreground hover:bg-brand/90 border-transparent`),title:`${a.label} to v${t.version}`,children:[a.icon,` `,a.label]})]}),n&&(0,W.jsx)(`div`,{className:`border-t px-4 py-3.5`,children:(0,W.jsx)(yne,{body:t.body})})]})]},t.version)})})]}),(0,W.jsx)(yb,{open:c!==null,onOpenChange:e=>!e&&l(null),children:(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:c?`${N9(c.relation).label} to v${c.version}?`:``}),(0,W.jsxs)(Tb,{children:[`This runs`,` `,(0,W.jsxs)(`code`,{className:`text-brand bg-muted rounded px-1.5 py-0.5 font-mono text-xs`,children:[`bun i -g `,M9,`@`,c?.version]}),` `,`on the server, then the server relaunches on that version and this connection drops briefly. Reconnect after.`,c?.relation===`older`&&(0,W.jsxs)(W.Fragment,{children:[` `,(0,W.jsx)(`b`,{className:`text-destructive`,children:`Downgrade`}),` — a newer config may not load on an older build; snapshot first if unsure.`]})]})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsxs)(Eb,{className:q(_b({variant:c?.relation===`older`?`destructive`:`default`}),`gap-1.5`),onClick:()=>c&&void g(c.version),children:[c?N9(c.relation).icon:null,c?N9(c.relation).label:`Install`]})]})]})}),(0,W.jsxs)(`p`,{className:`text-muted-foreground flex items-center gap-1.5 text-[11px]`,children:[(0,W.jsx)(Bc,{className:`size-3`}),` Prefer the CLI? Run`,` `,(0,W.jsxs)(`code`,{className:`bg-muted rounded px-1.5 py-0.5 font-mono`,children:[`bun i -g `,M9,`@latest`]})]})]})}var xne={critical:`text-destructive`,high:`text-orange-500`,medium:`text-yellow-500`,low:`text-muted-foreground`};function P9(e){return(0,W.jsx)(Hx,{type:e===`5ghz`?`success`:e===`2ghz`?`warning`:`secondary`,children:e===`2ghz`?`2.4G`:e===`5ghz`?`5G`:`?`})}async function F9(e,t,n,r){let i=J.loading(`${n}…`);try{let a=await _c(e,{...t,confirm:!0});a?.ok?(J.success(`${n} applied`,{id:i,description:a.snapshotId?`snapshot ${a.snapshotId}`:a.message}),r()):J.error(a?.error??`${n} failed`,{id:i})}catch{J.error(`${n} failed (server unreachable)`,{id:i})}}function Sne({mac:e,cap:t,onDone:n}){return(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(gl,{}),children:`Steer`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsxs)(wb,{children:[`Steer `,e,` toward `,t,`?`]}),(0,W.jsx)(Tb,{children:`Installs a hard signal-range reject on the client’s current radio so it re-associates on the stronger neighbor. This may briefly disconnect the client, and RouterOS ultimately lets the client decide (advisory). A config snapshot is taken first and the change runs in Safe Mode.`})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{className:_b({variant:`destructive`}),onClick:()=>void F9(`/api/capsman/apply/steer`,{mac:e,mode:`hard`},`Steer ${e}`,n),children:`Steer (hard)`})]})]})]})}function Cne(e){let t=Math.min(1,e.clientCount/30),n=Math.min(1,(e.cpuLoad??0)/100),r=e.conflicts.length>0?.4:0;return Math.max(0,1-(t*.5+n*.4+r))}function wne(e){return e>.66?`bg-emerald-500/15 border-emerald-500/40`:e>.33?`bg-yellow-500/15 border-yellow-500/40`:`bg-destructive/15 border-destructive/50`}function Tne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)([]),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(!0),[u,d]=(0,v.useState)(null);async function f(){l(!0);try{let[e,n,i]=await Promise.all([gc(`/api/capsman/overview`),gc(`/api/capsman/clients`),gc(`/api/capsman/audit`)]);t(e),r(n.weak),a(i),d(null)}catch(e){d(e instanceof Error?e.message:`Could not load CAPsMAN data`)}finally{l(!1)}try{let e=await gc(`/api/capsman/trends`);s(e.series??[])}catch{s([])}}(0,v.useEffect)(()=>{f()},[]);let p=(0,v.useMemo)(()=>{let t=new Map;for(let n of e?.radios??[]){let e=n.floor??`?`;(t.get(e)??t.set(e,[]).get(e)).push(n)}return[...t.entries()].sort((e,t)=>e[0].localeCompare(t[0]))},[e]);return c&&!e?(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center gap-2 p-6 text-sm`,children:[(0,W.jsx)(Gx,{}),` Loading CAPsMAN fabric…`]}):u?(0,W.jsx)(`div`,{className:`p-4`,children:(0,W.jsxs)(zx,{type:`error`,label:`CAPsMAN unavailable`,children:[u,`. This device may not run a CAPsMAN manager, or has no managed CAPs.`]})}):e?(0,W.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[!e.managerEnabled&&(0,W.jsx)(zx,{type:`warning`,label:`No CAPsMAN manager`,children:`This device isn’t running a CAPsMAN manager (or no CAPs are provisioned). The audit still runs; the coverage grid will be empty.`}),(0,W.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-4 xl:grid-cols-6`,children:[(0,W.jsx)(cx,{k:`CAPs`,v:hx(e.totals.caps),sub:`managed access points`}),(0,W.jsx)(cx,{k:`Radios`,v:hx(e.totals.radios)}),(0,W.jsx)(cx,{k:`Clients`,v:hx(e.totals.clients)}),(0,W.jsx)(cx,{k:`2.4G / 5G`,v:`${e.bandSplit[`2ghz`]} / ${e.bandSplit[`5ghz`]}`,sub:`client band split`}),(0,W.jsx)(cx,{k:`Co-channel`,v:hx(e.cochannel.length),cls:e.cochannel.length?`text-destructive`:void 0,sub:`conflicting pairs`}),(0,W.jsx)(cx,{k:`Findings`,v:hx(i?.total??0),cls:i&&i.total>0?`text-orange-500`:void 0})]}),(0,W.jsx)(sx,{title:`Coverage & load by floor`,extra:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e.cochannel.length>0&&(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(nl,{}),children:`Apply channel plan`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Apply the proposed channel plan?`}),(0,W.jsxs)(Tb,{children:[`Re-channels radios to the non-overlapping plan (2.4 GHz 1/6/11, 5 GHz DFS-aware) to clear the `,e.cochannel.length,` co-channel conflict(s). Clients on a re-channeled radio briefly re-associate. Snapshot + Safe Mode; idempotent. (v7 /interface wifi only.)`]})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{onClick:()=>void F9(`/api/capsman/apply/channel-plan`,{},`Channel plan`,()=>void f()),children:`Apply`})]})]})]}),(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(al,{}),children:`Auto-balance`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Apply resource-aware load balance?`}),(0,W.jsx)(Tb,{children:`For each overloaded or CPU-constrained radio that has an idle adjacent neighbor, installs a connect-priority nudge so NEW clients prefer the neighbor. Existing clients are not disconnected. Snapshot + Safe Mode; idempotent.`})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{onClick:()=>void F9(`/api/capsman/apply/load-balance`,{},`Load balance`,()=>void f()),children:`Apply`})]})]})]}),(0,W.jsxs)(`button`,{type:`button`,onClick:()=>void f(),className:`text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs`,children:[(0,W.jsx)(rl,{className:`size-3.5`}),` refresh`]})]}),children:p.length===0?(0,W.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`No managed radios.`}):(0,W.jsx)(`div`,{className:`flex flex-col gap-4`,children:p.map(([t,n])=>(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`text-muted-foreground mb-1.5 text-[11px] font-semibold tracking-wide uppercase`,children:t===`?`?`Unfloored (inferred by signal)`:`Floor ${t}`}),(0,W.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6`,children:n.map(t=>{let n=e.proposedChannels[t.radioId],r=n!=null&&n!==t.channel;return(0,W.jsxs)(`div`,{className:q(`flex flex-col gap-1 rounded-lg border p-2.5`,wne(Cne(t))),title:`${t.cap} · ${t.adjacent.length} neighbors`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-1`,children:[(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-xs font-semibold`,children:[(0,W.jsx)(nl,{className:`size-3`}),` `,t.cap]}),P9(t.band)]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center justify-between text-[11px]`,children:[(0,W.jsxs)(`span`,{className:q(t.conflicts.length>0&&`text-destructive font-medium`),children:[`ch `,t.channel??`?`,r&&(0,W.jsxs)(`span`,{className:`text-brand`,children:[` →`,n]})]}),(0,W.jsxs)(`span`,{children:[t.clientCount,` cl`]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center justify-between text-[11px]`,children:[(0,W.jsxs)(`span`,{children:[`CPU `,t.cpuLoad==null?`—`:`${t.cpuLoad}%`]}),t.conflicts.length>0&&(0,W.jsxs)(`span`,{className:`text-destructive inline-flex items-center gap-0.5`,children:[(0,W.jsx)(ml,{className:`size-3`}),` co-ch`]})]})]},t.radioId)})})]},t))})}),(0,W.jsx)(sx,{title:`Roaming (FT) & HA audit`,extra:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[i&&i.findings.some(e=>e.category===`ft`)&&(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(gl,{}),children:`Enable FT`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Enable 802.11r fast-roaming?`}),(0,W.jsx)(Tb,{children:`Turns on FT across the CAPsMAN security configs and converges them on ONE shared mobility domain, so clients roam between floors without a full re-auth. This briefly re-keys associated clients. Snapshot + Safe Mode; idempotent.`})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{onClick:()=>void F9(`/api/capsman/apply/ft`,{},`Enable FT`,()=>void f()),children:`Enable FT`})]})]})]}),i&&i.findings.some(e=>e.category===`ha`)&&(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(ml,{}),children:`Harden HA`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Harden CAPsMAN HA (require peer certificate)?`}),(0,W.jsx)(Tb,{children:`Enables require-peer-certificate on this manager so a rogue manager can’t adopt your CAPs. Standing up a second manager and pointing every CAP at both is multi-device and NOT auto-applied — the tool returns those manual steps. Snapshot + Safe Mode; idempotent.`})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{onClick:()=>void F9(`/api/capsman/apply/ha`,{},`Harden HA`,()=>void f()),children:`Harden HA`})]})]})]})]}),children:!i||i.total===0?(0,W.jsx)(`p`,{className:`text-emerald-500 text-sm`,children:`No findings — roaming & redundancy look healthy. ✓`}):(0,W.jsx)(`div`,{className:`flex flex-col gap-1.5`,children:i.findings.map(e=>(0,W.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border p-2.5`,children:[(0,W.jsx)(`span`,{className:q(`mt-0.5 text-[10px] font-bold uppercase`,xne[e.severity]),children:e.severity.slice(0,4)}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsx)(`div`,{className:`text-sm font-medium`,children:e.title}),(0,W.jsx)(`div`,{className:`text-muted-foreground text-xs`,children:e.detail}),(0,W.jsxs)(`div`,{className:`text-muted-foreground mt-0.5 text-xs`,children:[`→ `,e.recommendation,(0,W.jsxs)(`span`,{className:`ml-2 opacity-60`,children:[`[`,e.category,` · `,e.confidence,`]`]})]})]})]},e.finding_id))})}),(0,W.jsx)(sx,{title:`Weak-signal clients`,extra:(0,W.jsxs)(`span`,{className:`text-muted-foreground text-xs`,children:[n.length,` below threshold`]}),children:n.length===0?(0,W.jsx)(`p`,{className:`text-emerald-500 text-sm`,children:`No weak clients. ✓`}):(0,W.jsx)(`div`,{className:`overflow-x-auto`,children:(0,W.jsxs)(Qb,{children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`Client`}),(0,W.jsx)(Y,{children:`Signal`}),(0,W.jsx)(Y,{children:`Band`}),(0,W.jsx)(Y,{children:`Current AP`}),(0,W.jsx)(Y,{children:`Recommended`}),(0,W.jsx)(Y,{})]})}),(0,W.jsx)(ex,{children:n.map(e=>(0,W.jsxs)(tx,{children:[(0,W.jsx)(nx,{className:`font-mono text-xs`,children:e.mac}),(0,W.jsxs)(nx,{className:q(e.signal<-80?`text-destructive`:`text-orange-500`,`tabular-nums`),children:[e.signal,` dBm`]}),(0,W.jsx)(nx,{children:P9(e.band)}),(0,W.jsx)(nx,{className:`text-xs`,children:e.currentCap}),(0,W.jsx)(nx,{className:`text-xs`,children:e.recommendCap?(0,W.jsxs)(`span`,{className:`text-brand inline-flex items-center gap-1`,children:[(0,W.jsx)(gl,{className:`size-3`}),` `,e.recommendCap,` (+`,e.gainDb,` dB)`]}):(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`coverage gap`})}),(0,W.jsx)(nx,{children:e.recommendCap&&(0,W.jsx)(Sne,{mac:e.mac,cap:e.recommendCap,onDone:()=>void f()})})]},e.mac))})]})})}),o.length>0&&(0,W.jsx)(sx,{title:`Radio load trends`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`associated clients per radio · sampled every 5 min`}),children:(0,W.jsx)(`div`,{className:`grid grid-cols-1 gap-4 p-1 sm:grid-cols-2 xl:grid-cols-3`,children:o.map(e=>{let t=e.band===`5ghz`?`var(--success)`:e.band===`2ghz`?`var(--warning)`:`var(--muted-foreground)`;return(0,W.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,W.jsxs)(`span`,{className:`flex items-center gap-1.5 font-medium`,children:[P9(e.band),(0,W.jsx)(`span`,{className:`truncate`,children:e.cap}),(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[`/`,e.radioId]})]}),(0,W.jsxs)(`span`,{className:`text-muted-foreground tabular-nums`,children:[`peak `,e.peak,` · avg `,e.avg]})]}),(0,W.jsx)(c7,{values:e.points.map(e=>e.clients),color:t,id:`capsman-${e.radioId}`})]},e.radioId)})})}),(0,W.jsx)(`p`,{className:`text-muted-foreground text-[11px]`,children:`Steering, load-balance, channel-plan, FT and HA apply are all live (snapshot + Safe Mode, confirmed). All steering is advisory — RouterOS lets the client decide. Load trends fill in as the background sampler runs.`})]}):null}var Ene={TCP:`var(--chart-1)`,UDP:`var(--chart-2)`,ICMP:`var(--chart-3)`,ICMPv6:`var(--chart-3)`,ARP:`var(--chart-4)`,IPv6:`var(--chart-5)`},I9=e=>e&&Ene[e]||`var(--muted-foreground)`;function Dne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(!1);(0,v.useEffect)(()=>{let e=()=>void gc(`/api/capture/packets?limit=150`).then(t).catch(()=>{});e();let n=setInterval(e,1500);return()=>clearInterval(n)},[]);let i=e?.stats,a=e?.packets??[],o=async()=>{r(!0);let e=await _c(`/api/capture/stop`,{}).catch(()=>null);r(!1),e===null||e.ok===!1||e.error?J.error(e?.error??`Capture stop failed`):J.success(`Capture stopped`)};if(!i||!i.running&&i.packets===0)return(0,W.jsxs)(`div`,{className:`text-muted-foreground text-[13px] leading-relaxed`,children:[`No capture running. Start one with the`,` `,(0,W.jsx)(`code`,{className:`text-brand font-mono`,children:`start_packet_capture`}),` tool — point the device's TZSP stream at this host — and decoded packets stream in here live.`]});let s=Math.max(1,...Object.values(i.protocols));return(0,W.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2.5`,children:[(0,W.jsx)(Wx,{color:i.running?`var(--success)`:`var(--muted-foreground)`,pulse:i.running}),(0,W.jsx)(`b`,{children:i.running?`capturing`:`stopped`}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[`UDP `,i.port]}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[hx(i.packets),` pkts · `,px(i.bytes)]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsxs)(`a`,{className:`bg-card hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-xs whitespace-nowrap`,href:hc(`/api/capture/pcap`),download:`capture.pcap`,children:[(0,W.jsx)(Hc,{className:`size-3.5`}),` pcap`]}),(0,W.jsx)(X,{type:`error`,ghost:!0,size:`sm`,icon:(0,W.jsx)(ul,{className:`size-3.5`}),onClick:()=>void o(),disabled:n||!i.running,children:`Stop`})]}),(0,W.jsxs)(`div`,{className:`grid grid-cols-[220px_1fr] gap-3 max-[720px]:grid-cols-1`,children:[(0,W.jsxs)(`div`,{className:`flex flex-col gap-[5px]`,children:[(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px] tracking-[0.05em] uppercase`,children:`Protocols`}),Object.entries(i.protocols).map(([e,t])=>(0,W.jsxs)(`div`,{className:`grid grid-cols-[52px_1fr_34px] items-center gap-1.5 font-mono text-[11px]`,children:[(0,W.jsx)(`span`,{style:{color:I9(e)},children:e}),(0,W.jsx)(`span`,{className:`bg-muted h-2 overflow-hidden rounded-full`,children:(0,W.jsx)(`i`,{className:`block h-full rounded-full`,style:{width:`${t/s*100}%`,background:I9(e)}})}),(0,W.jsx)(`span`,{className:`text-muted-foreground text-right`,children:t})]},e)),(0,W.jsx)(`div`,{className:`text-muted-foreground mt-3 text-[11px] tracking-[0.05em] uppercase`,children:`Top talkers`}),i.topTalkers.length===0&&(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`—`}),i.topTalkers.map(e=>(0,W.jsxs)(`div`,{className:`text-muted-foreground flex justify-between font-mono text-[11px] [&>b]:text-foreground`,children:[(0,W.jsx)(`span`,{children:e.addr}),(0,W.jsx)(`b`,{children:e.count})]},e.addr))]}),(0,W.jsx)(`div`,{className:`bg-background h-[360px] overflow-y-auto rounded-md border font-mono text-[11px]/[1.6]`,children:a.length===0?(0,W.jsx)(`div`,{className:`text-muted-foreground p-2.5 text-[11px]`,children:`waiting for packets…`}):a.map((e,t)=>(0,W.jsxs)(`div`,{className:`grid grid-cols-[90px_64px_48px_1fr] gap-2 overflow-hidden px-2.5 py-px whitespace-nowrap odd:bg-card/40`,children:[(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:mx(e.ts)}),(0,W.jsx)(`span`,{className:`font-semibold`,style:{color:I9(e.protocol)},children:e.protocol??e.ethType}),(0,W.jsx)(`span`,{className:`text-muted-foreground text-right`,children:e.len}),(0,W.jsx)(`span`,{className:`text-foreground overflow-hidden text-ellipsis`,children:e.info})]},t))})]})]})}function One(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(null),c=(0,v.useCallback)(()=>{gc(`/api/s3/list`).then(t).catch(()=>t({configured:!1,objects:[]}))},[]);(0,v.useEffect)(()=>c(),[c]);let l=e=>{gc(`/api/s3/presign?key=${encodeURIComponent(e)}`).then(e=>{e.url?window.open(e.url,`_blank`,`noopener`):(s(`could not generate download link`),J.error(`Could not generate download link`))}).catch(()=>{s(`could not generate download link`),J.error(`Could not generate download link`)})},u=async e=>{a(e);let t=await _c(`/api/s3/delete`,{key:e}).catch(()=>({error:`request failed`}));a(null),r(null),t.ok?(s(`Deleted ${e}`),J.success(`S3 object deleted`),c()):(s(t.error??`delete failed`),J.error(t.error??`S3 object delete failed`))};return e?e.configured?(0,W.jsx)(`section`,{className:`grid content-start gap-[18px]`,children:(0,W.jsxs)(sx,{title:`S3 backups`,className:`reveal`,extra:(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[e.target,` · `,e.objects.length,` object`,e.objects.length===1?``:`s`,e.truncated?` (truncated)`:``]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,icon:(0,W.jsx)(rl,{}),onClick:c,children:`Refresh`})]}),children:[o&&(0,W.jsx)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:o}),e.objects.length===0?(0,W.jsxs)(`div`,{className:`p-3 text-muted-foreground text-[11px]`,children:[`No objects in the bucket. Upload one with the `,(0,W.jsx)(`code`,{children:`upload_backup_to_s3`}),` tool.`]}):(0,W.jsxs)(Qb,{className:`font-mono`,children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`key`}),(0,W.jsx)(Y,{className:`text-right tabular-nums`,children:`size`}),(0,W.jsx)(Y,{children:`modified`}),(0,W.jsx)(Y,{className:`w-[200px]`,children:`actions`})]})}),(0,W.jsx)(ex,{children:e.objects.map(e=>(0,W.jsxs)(tx,{children:[(0,W.jsx)(nx,{children:e.key}),(0,W.jsx)(nx,{className:`text-right tabular-nums`,children:px(e.size)}),(0,W.jsx)(nx,{children:e.lastModified?new Date(e.lastModified).toLocaleString(void 0,{hour12:!1}):`—`}),(0,W.jsxs)(nx,{className:`flex gap-1.5`,onClick:e=>e.stopPropagation(),children:[(0,W.jsx)(X,{size:`sm`,ghost:!0,icon:(0,W.jsx)(Hc,{}),onClick:()=>l(e.key),children:`Download`}),n===e.key?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(X,{size:`sm`,type:`error`,ghost:!0,icon:(0,W.jsx)(Pc,{}),disabled:i===e.key,onClick:()=>void u(e.key),children:`Confirm`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>r(null),children:`Cancel`})]}):(0,W.jsx)(X,{size:`sm`,ghost:!0,icon:(0,W.jsx)(pl,{}),onClick:()=>r(e.key),children:`Delete`})]})]},e.key))})]})]})}):(0,W.jsxs)(`div`,{className:`grid justify-items-center gap-2 rounded-lg border border-dashed border-border px-4 py-[54px] text-center`,children:[(0,W.jsx)(zc,{className:`size-7 text-muted-foreground opacity-80`}),(0,W.jsx)(`p`,{className:`m-0 font-semibold text-foreground`,children:`S3 is not configured`}),(0,W.jsxs)(`p`,{className:`m-0 max-w-[460px] text-muted-foreground text-xs`,children:[`Add an `,(0,W.jsx)(`code`,{children:`s3`}),` block (bucket + credentials) to your config to manage backup objects here.`]})]}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`loading S3 objects…`})}function kne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(``),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(null),u=(0,v.useCallback)(()=>{gc(`/api/snapshots`).then(e=>t(e.snapshots)).catch(()=>t([]))},[]);(0,v.useEffect)(()=>u(),[u]);let d=e=>{gc(`/api/snapshot/${encodeURIComponent(e)}`).then(s).catch(()=>{})},f=()=>{!n||!i||_c(`/api/snapshots/diff`,{from:n,to:i}).then(l).catch(()=>J.error(`Diff failed`))};if(!e)return(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`loading snapshots…`});if(e.length===0)return(0,W.jsxs)(`div`,{className:`grid justify-items-center gap-2 rounded-lg border border-dashed border-border px-4 py-[54px] text-center`,children:[(0,W.jsx)(Wc,{className:`size-7 text-muted-foreground`}),(0,W.jsx)(`p`,{className:`font-semibold text-foreground`,children:`No config snapshots yet`}),(0,W.jsxs)(`p`,{className:`max-w-[460px] text-xs text-muted-foreground`,children:[`Capture one with the `,(0,W.jsx)(`code`,{children:`capture_config_snapshot`}),` tool — then time-travel diff any two here.`]})]});let p=e.map(e=>({value:e.id,label:`${e.device} · ${e.label??e.id} · ${mx(e.ts)}`}));return(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsxs)(sx,{title:`Config snapshots`,className:`reveal`,extra:(0,W.jsx)(X,{size:`sm`,icon:(0,W.jsx)(rl,{}),onClick:u,children:`Refresh`}),children:[(0,W.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Xx,{value:n,onValueChange:r,"aria-label":`Diff from snapshot`,options:[{value:``,label:`diff from…`},...p]}),(0,W.jsx)(Xx,{value:i,onValueChange:a,"aria-label":`Diff to snapshot`,options:[{value:``,label:`to…`},...p]}),(0,W.jsx)(X,{size:`sm`,onClick:f,disabled:!n||!i,children:`Diff →`}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[e.length,` snapshots`]})]}),(0,W.jsx)(`div`,{className:`max-h-[60vh] overflow-auto rounded-lg border border-border`,children:(0,W.jsxs)(Qb,{children:[(0,W.jsx)($b,{className:`sticky top-0 z-10 bg-card`,children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{children:`captured`}),(0,W.jsx)(Y,{children:`device`}),(0,W.jsx)(Y,{children:`label`}),(0,W.jsx)(Y,{children:`version`}),(0,W.jsx)(Y,{className:`text-right`,children:`lines`}),(0,W.jsx)(Y,{className:`text-right`,children:`size`}),(0,W.jsx)(Y,{children:`output`})]})}),(0,W.jsx)(ex,{children:e.map(e=>(0,W.jsxs)(tx,{className:`cursor-pointer`,"data-state":o?.id===e.id?`selected`:void 0,onClick:()=>d(e.id),children:[(0,W.jsx)(nx,{children:mx(e.ts)}),(0,W.jsx)(nx,{children:e.device}),(0,W.jsx)(nx,{children:e.label??`—`}),(0,W.jsx)(nx,{children:e.rosVersion??`—`}),(0,W.jsx)(nx,{className:`text-right tabular-nums`,children:e.lines}),(0,W.jsx)(nx,{className:`text-right tabular-nums`,children:px(e.bytes)}),(0,W.jsx)(nx,{className:`max-w-[320px] truncate text-muted-foreground`,children:`view export →`})]},e.id))})]})})]}),c&&(0,W.jsx)(sx,{title:`Time-travel diff`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:c.summary.changed?`+${c.summary.added} / -${c.summary.removed}`:`identical`}),children:(0,W.jsx)(`pre`,{className:`m-0 max-h-80 overflow-auto rounded bg-background p-3 font-mono text-[11px] leading-normal text-muted-foreground`,children:(c.unified||`(identical)`).split(`
|
|
154
|
-
`).map((e,t)=>(0,W.jsx)(`div`,{className:e.startsWith(`+`)?`text-success`:e.startsWith(`-`)?`text-destructive`:e.startsWith(`@@`)?`text-brand`:``,children:e||` `},t))})}),o&&(0,W.jsx)(sx,{title:`Snapshot · ${o.label??o.id}`,className:`reveal`,extra:(0,W.jsx)(X,{type:`secondary`,size:`sm`,icon:(0,W.jsx)(_l,{}),onClick:()=>s(null),children:`Close`}),children:(0,W.jsx)(`pre`,{className:`m-0 overflow-auto rounded border border-border bg-background p-3 font-mono text-xs break-words whitespace-pre-wrap`,style:{maxHeight:460},children:o.body||`(empty)`})})]})}function L9({className:e,orientation:t=`horizontal`,decorative:n=!0,...r}){return(0,W.jsx)(sv,{"data-slot":`separator`,decorative:n,orientation:t,className:q(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...r})}var R9=` hub`;function z9(e){let t=e;for(;t>Math.PI;)t-=Math.PI*2;for(;t<-Math.PI;)t+=Math.PI*2;return t}function Ane(e,t,n){let r=new Map,i=new Map;r.set(R9,{x:450,y:310});let a=e.length<=1?110:Math.min(170,96+e.length*7),o=a+(e.length<=1?190:155);e.forEach((t,n)=>{let o=e.length===1?-Math.PI/2:n/e.length*Math.PI*2-Math.PI/2;i.set(t.id,o),r.set(t.id,{x:450+a*Math.cos(o),y:310+a*Math.sin(o)})});let s=new Map,c=new Map;for(let e of t){let t=n.get(e.id)??``,r=i.get(t)??-Math.PI/2,a=s.get(t)??0;s.set(t,a+1),c.set(e.id,r+Math.ceil(a/2)*(a%2==0?1:-1)*.34)}for(let e=0;e<10;e++)for(let e of t){let r=0;for(let n of t){if(e.id===n.id)continue;let t=z9((c.get(e.id)??0)-(c.get(n.id)??0)),i=Math.abs(t)*o;i<1?r+=e.id<n.id?.02:-.02:i<120&&(r+=Math.sign(t)*2600/(i*i*o))}let a=z9((i.get(n.get(e.id)??``)??-Math.PI/2)-(c.get(e.id)??0));c.set(e.id,(c.get(e.id)??0)+r+a*.06)}for(let e of t){let t=c.get(e.id)??0;r.set(e.id,{x:450+o*Math.cos(t),y:310+o*Math.sin(t)})}return{pos:r,rInner:a,rOuter:o}}function B9(e,t){let n=2*Math.PI*e,r=Math.min(100,Math.max(0,t??0))/100*n;return`${r} ${n-r}`}function jne(e,t=7){let n=t*Math.PI/180,r=e*Math.cos(n),i=e*Math.sin(n);return`M 450 310 L ${450+r} ${310-i} A ${e} ${e} 0 0 1 ${450+r} ${310+i} Z`}function V9(e){return e==null?`var(--muted-foreground)`:e>=85?`var(--destructive)`:e>=60?`var(--warning)`:`var(--chart-2)`}function Mne(e){return e.reachable===!0?`var(--chart-2)`:e.reachable===!1?`var(--destructive)`:e.kind===`device`?`var(--muted-foreground)`:`var(--border)`}function Nne({topo:e,onOnboard:t}){let[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)({x:0,y:0,k:1}),[f,p]=(0,v.useState)(!1),m=(0,v.useRef)(null),h=(0,v.useRef)(null),g=(0,v.useMemo)(()=>e.nodes.filter(e=>e.kind===`device`),[e.nodes]),_=(0,v.useMemo)(()=>e.nodes.filter(e=>e.kind===`neighbor`),[e.nodes]),y=(0,v.useMemo)(()=>{let t=new Map,n=new Set(_.map(e=>e.id));for(let r of e.edges)n.has(r.to)&&!t.has(r.to)&&t.set(r.to,r.from);return t},[e.edges,_]),{pos:b,rInner:x,rOuter:S}=(0,v.useMemo)(()=>Ane(g,_,y),[g,_,y]),C=(0,v.useMemo)(()=>new Map(e.nodes.map(e=>[e.id,e])),[e.nodes]),w=n?C.get(n):null,T=(0,v.useMemo)(()=>{let t=new Map,n=(e,n)=>{t.has(e)||t.set(e,new Set([e])),t.get(e).add(n)};for(let e of g)n(e.id,R9),n(R9,e.id);for(let t of e.edges)n(t.from,t.to),n(t.to,t.from);return t},[e.edges,g]),E=o.trim().toLowerCase(),D=(0,v.useCallback)(e=>c&&!e.onboardable?!1:E?[e.label,e.id,e.ip,e.mac,e.board,e.identity].filter(e=>!!e).some(e=>e.toLowerCase().includes(E)):!0,[E,c]),O=i?T.get(i):null,k=e=>{if(O)return!O.has(e);if(e===` hub`)return!1;let t=C.get(e);return t?!D(t):!1},A=e=>{let t=h.current?.getBoundingClientRect();if(!t)return;let n=(e.clientX-t.left)/t.width*900,r=(e.clientY-t.top)/t.height*620;d(t=>{let i=Math.min(3,Math.max(.5,t.k*(e.deltaY<0?1.12:1/1.12))),a=i/t.k;return{k:i,x:n-(n-t.x)*a,y:r-(r-t.y)*a}})},j=e=>{m.current={px:e.clientX,py:e.clientY,ox:u.x,oy:u.y},p(!0)},M=e=>{let t=m.current,n=h.current?.getBoundingClientRect();if(!t||!n)return;let r=900/n.width*(e.clientX-t.px),i=620/n.height*(e.clientY-t.py);d(e=>({...e,x:t.ox+r,y:t.oy+i}))},N=()=>{m.current=null,p(!1)},P=e=>d(t=>{let n=Math.min(3,Math.max(.5,t.k*e)),r=n/t.k;return{k:n,x:450-(450-t.x)*r,y:310-(310-t.y)*r}}),F=g.map(e=>({from:R9,to:e.id,interface:void 0}));return(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,W.jsxs)(`div`,{className:`relative min-w-[200px] flex-1`,children:[(0,W.jsx)(ol,{className:`text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2`}),(0,W.jsx)(Kx,{className:`pl-8`,type:`search`,placeholder:`Filter by name, identity, IP, MAC or board…`,value:o,onChange:e=>s(e.target.value)})]}),(0,W.jsxs)(X,{size:`sm`,ghost:!0,type:c?`accent`:`default`,onClick:()=>l(e=>!e),title:`Dim everything except neighbours that can be onboarded`,icon:(0,W.jsx)(el,{}),children:[`Onboardable`,e.stats.onboardable>0?` (${e.stats.onboardable})`:``]}),(0,W.jsx)(L9,{orientation:`vertical`,className:`h-6`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>P(1/1.25),"aria-label":`Zoom out`,icon:(0,W.jsx)(qc,{})}),(0,W.jsxs)(`span`,{className:`text-muted-foreground w-11 text-center font-mono text-[11px] tabular-nums`,children:[Math.round(u.k*100),`%`]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>P(1.25),"aria-label":`Zoom in`,icon:(0,W.jsx)($c,{})}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>d({x:0,y:0,k:1}),title:`Reset view`,icon:(0,W.jsx)(Vc,{}),children:`Reset`})]}),(0,W.jsxs)(`div`,{className:`bg-card relative overflow-hidden rounded-xl border`,children:[(0,W.jsxs)(`svg`,{ref:h,viewBox:`0 0 900 620`,width:`100%`,height:560,preserveAspectRatio:`xMidYMid meet`,className:q(`block w-full touch-none select-none`,f?`cursor-grabbing`:`cursor-grab`),onWheel:A,onPointerDown:j,onPointerMove:M,onPointerUp:N,onPointerLeave:N,onClick:()=>r(null),style:{background:`radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--brand) 7%, transparent), transparent 62%)`},children:[(0,W.jsxs)(`defs`,{children:[(0,W.jsxs)(`linearGradient`,{id:`topo-beam`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--brand)`,stopOpacity:`0.3`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--brand)`,stopOpacity:`0`})]}),(0,W.jsxs)(`radialGradient`,{id:`topo-hub`,cx:`0.5`,cy:`0.35`,r:`0.75`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`})]})]}),(0,W.jsxs)(`g`,{transform:`translate(${u.x},${u.y}) scale(${u.k})`,children:[(0,W.jsx)(`g`,{className:`topo-ring`,children:[x,S,S+62].map(e=>(0,W.jsx)(`circle`,{cx:450,cy:310,r:e,fill:`none`,className:`stroke-border/70`,strokeDasharray:`2 8`},e))}),(0,W.jsx)(`g`,{className:`topo-sweep`,style:{transformOrigin:`450px 310px`},children:(0,W.jsx)(`path`,{d:jne(S+62),fill:`url(#topo-beam)`})}),[...F,...e.edges].map((t,n)=>{let r=b.get(t.from),i=b.get(t.to);if(!r||!i)return null;let a=C.get(t.to)?.kind===`neighbor`,o=k(t.from)||k(t.to),s=-(i.y-r.y),c=i.x-r.x,l=Math.hypot(s,c)||1,u=a?16:8,d=(r.x+i.x)/2+s/l*u,f=(r.y+i.y)/2+c/l*u;return(0,W.jsx)(`path`,{d:`M ${r.x} ${r.y} Q ${d} ${f} ${i.x} ${i.y}`,fill:`none`,strokeWidth:a?1.2:1.6,strokeDasharray:a?`4 4`:`6 10`,className:q(`transition-opacity`,a?`stroke-brand/55`:`topo-flow stroke-chart-2/70`,o&&`opacity-15`),children:(0,W.jsxs)(`title`,{children:[t.from===` hub`?e.server:t.from,` → `,t.to,t.interface?` (${t.interface})`:``]})},`e-${n}`)}),(0,W.jsxs)(`g`,{className:q(`transition-opacity`,O&&!O.has(` hub`)&&`opacity-15`),onMouseEnter:()=>a(R9),onMouseLeave:()=>a(null),children:[(0,W.jsx)(`circle`,{cx:450,cy:310,r:40,className:`fill-brand/15`}),(0,W.jsx)(`circle`,{cx:450,cy:310,r:27,fill:`url(#topo-hub)`,className:`stroke-border`}),(0,W.jsx)(sl,{x:441,y:295,width:18,height:18,className:`stroke-background pointer-events-none`}),(0,W.jsx)(`text`,{x:450,y:326,textAnchor:`middle`,className:`fill-background pointer-events-none font-mono text-[8px] font-bold`,children:`MCP`}),(0,W.jsx)(`text`,{x:450,y:368,textAnchor:`middle`,className:`fill-muted-foreground pointer-events-none font-mono text-[10px]`,children:e.server})]}),e.nodes.map(e=>{let t=b.get(e.id);if(!t)return null;let i=e.kind===`device`,o=n===e.id,s=k(e.id),c=Mne(e),l=i?26:15;return(0,W.jsxs)(`g`,{transform:`translate(${t.x},${t.y})`,className:q(`cursor-pointer transition-opacity`,s&&`opacity-15`),onMouseEnter:()=>a(e.id),onMouseLeave:()=>a(null),onClick:t=>{t.stopPropagation(),r(t=>t===e.id?null:e.id)},children:[o&&(0,W.jsx)(`circle`,{r:l+8,className:`topo-halo stroke-brand fill-none`,strokeWidth:2}),i?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{r:l+7,className:`stroke-border/60 fill-none`,strokeWidth:3}),(0,W.jsx)(`circle`,{r:l+7,fill:`none`,strokeWidth:3,strokeLinecap:`round`,transform:`rotate(-90)`,style:{stroke:V9(e.cpuLoad)},strokeDasharray:B9(l+7,e.cpuLoad)}),(0,W.jsx)(`circle`,{r:l+2,className:`stroke-border/40 fill-none`,strokeWidth:2}),(0,W.jsx)(`circle`,{r:l+2,fill:`none`,strokeWidth:2,strokeLinecap:`round`,transform:`rotate(-90)`,style:{stroke:V9(e.memUsedPct)},strokeDasharray:B9(l+2,e.memUsedPct)}),(0,W.jsx)(`circle`,{r:l-4,className:`fill-muted`,style:{stroke:c},strokeWidth:1.6}),(0,W.jsx)(`text`,{textAnchor:`middle`,y:3,className:`fill-foreground pointer-events-none font-mono text-[9px] font-bold`,children:(e.label||e.id).slice(0,4).toUpperCase()})]}):(0,W.jsxs)(W.Fragment,{children:[e.onboardable&&(0,W.jsx)(`circle`,{r:l+5,className:`topo-pulse fill-brand/25`}),(0,W.jsx)(`rect`,{x:-l*.72,y:-l*.72,width:l*1.44,height:l*1.44,rx:3,transform:`rotate(45)`,className:`fill-card`,style:{stroke:c},strokeWidth:1.4,strokeDasharray:e.onboardable?`3 2`:void 0}),e.onboardable&&(0,W.jsx)($c,{x:-5,y:-5,width:10,height:10,className:`stroke-brand pointer-events-none`})]}),(0,W.jsx)(`text`,{textAnchor:`middle`,y:l+(i?22:18),className:`fill-foreground pointer-events-none font-mono text-[10px]`,children:(e.label||e.id).slice(0,18)}),i&&(0,W.jsx)(`text`,{textAnchor:`middle`,y:l+34,className:`fill-muted-foreground pointer-events-none font-mono text-[9px]`,children:e.ip||e.board||``})]},e.id)})]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground pointer-events-none absolute top-3 left-3 flex flex-col gap-1 font-mono text-[10px]`,children:[(0,W.jsx)(`span`,{className:`text-foreground text-[11px] font-semibold`,children:`Layer-2 fabric`}),(0,W.jsxs)(`span`,{children:[e.stats.devices,` managed · `,e.stats.neighbors,` discovered`]}),e.stats.onboardable>0&&(0,W.jsxs)(`span`,{className:`text-brand`,children:[e.stats.onboardable,` awaiting onboard`]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground pointer-events-none absolute right-3 bottom-3 flex flex-col items-end gap-1 font-mono text-[10px]`,children:[(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-chart-2 inline-block size-2 rounded-full`}),` online`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-destructive inline-block size-2 rounded-full`}),` offline`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`border-border inline-block size-2 rotate-45 border`}),` neighbour`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-brand/40 inline-block size-2 rounded-full`}),` onboardable`]})]})]}),w&&(0,W.jsx)(Pne,{node:w,onClose:()=>r(null),onOnboard:t})]})}function Pne({node:e,onClose:t,onOnboard:n}){let r=e.suggestedConfig?JSON.stringify({[e.suggestedConfig.name]:H9(e.suggestedConfig)},null,2):null,i=[[`identity`,e.identity],[`address`,e.ip],[`mac`,e.mac],[`board`,e.board],[`platform`,e.platform],[`version`,e.version],[`uptime`,e.uptime]].filter(e=>!!e[1]);return(0,W.jsxs)(`div`,{className:`bg-card rounded-xl border p-4`,children:[(0,W.jsxs)(`div`,{className:`mb-2 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(`strong`,{className:`font-mono text-sm`,children:e.label||e.id}),(0,W.jsx)(Ex,{variant:e.kind===`device`?`secondary`:`outline`,children:e.kind}),e.onboardable&&(0,W.jsx)(Ex,{className:`bg-brand text-brand-foreground`,children:`onboardable`}),e.reachable===!1&&(0,W.jsx)(Ex,{variant:`destructive`,children:`offline`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{ghost:!0,size:`sm`,icon:(0,W.jsx)(_l,{}),onClick:t,"aria-label":`Close`})]}),(0,W.jsx)(`div`,{className:`text-muted-foreground grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 font-mono text-[11px]`,children:i.length===0?(0,W.jsx)(`span`,{children:`no details advertised`}):i.map(([e,t])=>(0,W.jsxs)(v.Fragment,{children:[(0,W.jsx)(`span`,{children:e}),(0,W.jsx)(`span`,{className:`text-foreground break-all`,children:t})]},e))}),e.kind===`device`&&(e.cpuLoad!=null||e.memUsedPct!=null)&&(0,W.jsxs)(`div`,{className:`mt-3 flex gap-4 font-mono text-[11px]`,children:[e.cpuLoad!=null&&(0,W.jsxs)(`span`,{style:{color:V9(e.cpuLoad)},children:[`cpu `,e.cpuLoad,`%`]}),e.memUsedPct!=null&&(0,W.jsxs)(`span`,{style:{color:V9(e.memUsedPct)},children:[`mem `,e.memUsedPct,`%`]})]}),r&&e.suggestedConfig&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(L9,{className:`my-3`}),(0,W.jsx)(`p`,{className:`text-muted-foreground mb-1.5 text-[11px]`,children:`Not managed yet — add this to your device config to onboard it:`}),(0,W.jsx)(`pre`,{className:`bg-background text-foreground m-0 mb-2 overflow-x-auto rounded-md border px-2.5 py-2 font-mono text-[11px]/[1.5] whitespace-pre`,children:r}),(0,W.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,W.jsx)(ux,{title:`Copy config stub`,label:`Copy config stub`,text:r}),n&&(0,W.jsx)(X,{type:`accent`,size:`sm`,onClick:()=>n(e.suggestedConfig.name,H9(e.suggestedConfig)),children:`Add to config →`})]})]})]})}function H9(e){let t={port:e.port,username:e.username};return e.host&&(t.host=e.host),e.mac&&(t.mac=e.mac),t}function U9(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${Math.round(e)}ms`}function Fne(e){return!e||!e.pooled?`var(--muted-foreground)`:e.dead?`var(--destructive)`:e.inflight>0?`var(--chart-1)`:`var(--success)`}function Ine(e){return!e||!e.pooled?`no connection`:e.dead?`reconnecting`:e.inflight>0?`${e.inflight} inflight`:`ready`}function Lne({device:e}){let t=e.pool,n=!t||!t.pooled?`border-dashed opacity-60`:t.dead?`border-destructive/50`:t.inflight>0?`border-chart-1/50`:`border-success/35`,r=!!t&&t.pooled&&t.inflight>0,i=Fne(t),a=!t||!t.pooled?0:t.inflight>0?Math.min(8+t.inflight*15,100):100;return(0,W.jsxs)(`div`,{className:q(`bg-card rounded-lg border px-3 py-2.5 transition-colors hover:border-muted-foreground/40`,n),children:[(0,W.jsxs)(`div`,{className:`mb-1.5 flex items-center gap-1.5`,children:[(0,W.jsx)(`span`,{className:`size-[7px] shrink-0 rounded-full`,style:{background:i}}),(0,W.jsx)(`span`,{className:`text-foreground overflow-hidden text-xs font-semibold text-ellipsis whitespace-nowrap`,children:e.name}),(0,W.jsx)(`span`,{className:`ml-auto text-[10px] font-semibold tracking-[0.04em] uppercase`,style:{color:i},children:Ine(t)})]}),(0,W.jsxs)(`div`,{className:`bg-muted relative h-1.5 overflow-hidden rounded-[3px]`,children:[(0,W.jsx)(`div`,{className:q(`h-full rounded-[3px] opacity-65 transition-[width] duration-[400ms]`,r&&`animate-pulse`),style:{width:`${a}%`,background:i}}),t&&t.pooled&&t.inflight>0&&(0,W.jsxs)(`span`,{className:`text-foreground absolute -top-px right-1 text-[8px] leading-[8px] font-bold [text-shadow:0_0_3px_rgba(0,0,0,0.6)]`,children:[t.inflight,` ch`]})]})]})}function W9({k:e,v:t,sub:n}){return(0,W.jsx)(cx,{k:e,v:t,sub:n,cls:`min-w-[100px]`})}function Rne({devices:e,poolPayload:t}){let n=e.filter(e=>e.pool!==null&&e.pool!==void 0);if(!(t?.enabled??n.length>0)&&n.length===0)return(0,W.jsxs)(`details`,{className:`my-3`,open:!0,children:[(0,W.jsx)(`summary`,{className:`mb-2 cursor-pointer font-semibold`,children:`SSH Connection Pool`}),(0,W.jsxs)(`p`,{className:`text-muted-foreground my-1 text-[13px]`,children:[`Connection pooling is disabled. Enable it with`,` `,(0,W.jsx)(`code`,{className:`text-chart-1 text-xs`,children:`--ssh-keep-alive true`}),` or`,` `,(0,W.jsx)(`code`,{className:`text-chart-1 text-xs`,children:`MIKROTIK_SSH__KEEP_ALIVE=true`}),` to keep persistent SSH connections across tool calls.`]})]});let r=t?.aggregate,i=t?.config;return(0,W.jsxs)(`details`,{className:`my-3`,open:!0,children:[(0,W.jsx)(`summary`,{className:`mb-2 cursor-pointer font-semibold`,children:`SSH Connection Pool`}),r&&(0,W.jsxs)(`div`,{className:`mb-3 flex flex-wrap gap-2`,children:[(0,W.jsx)(W9,{k:`Connections`,v:String(r.totalConnections)}),(0,W.jsx)(W9,{k:`Inflight`,v:String(r.totalInflight),sub:`channels`}),(0,W.jsx)(W9,{k:`Idle`,v:String(r.totalIdle)}),(0,W.jsx)(W9,{k:`Busy`,v:String(r.totalBusy)}),i&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(W9,{k:`Keepalive`,v:U9(i.keepAliveInterval)}),(0,W.jsx)(W9,{k:`Idle timeout`,v:U9(i.idleTimeout)})]})]}),n.length>0&&(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-2`,children:n.map(e=>(0,W.jsx)(Lne,{device:e},e.name))})]})}zi.registerPlugin(ic);function G9(e,t,n){let r=URL.createObjectURL(new Blob([t],{type:`${n};charset=utf-8`})),i=document.createElement(`a`);i.href=r,i.download=e,document.body.append(i),i.click(),i.remove(),URL.revokeObjectURL(r)}var K9=[{id:`overview`,label:`Overview`,sub:`Calls, latency & risk at a glance`},{id:`devices`,label:`Devices`,sub:`Connectivity radar & system health`},{id:`clients`,label:`Clients`,sub:`Connected LAN devices — usage, block/allow, pin IP`},{id:`aaa`,label:`RADIUS & UM`,sub:`RADIUS client & User Manager RADIUS server`},{id:`topology`,label:`Topology`,sub:`Layer-2 neighbours via MNDP / CDP / LLDP`},{id:`packets`,label:`Packets`,sub:`Live TZSP capture & decode`},{id:`snapshots`,label:`Snapshots`,sub:`Config history & time-travel diff`},{id:`drift`,label:`Drift Guard`,sub:`Golden config baselines & live drift detection`},{id:`plan`,label:`Change Plan`,sub:`Dry-run intended RouterOS commands`},{id:`s3`,label:`S3 Backups`,sub:`List, download & delete S3 backup objects`},{id:`backups`,label:`Backups`,sub:`Local config vault — create, restore, manage`},{id:`modules`,label:`Modules`,sub:`Enable/disable tool modules — curate the surface`},{id:`config`,label:`Config`,sub:`Effective configuration & safe editor`},{id:`memory`,label:`Memory`,sub:`Knowledge graph — entities, relations & observations`},{id:`releases`,label:`Releases`,sub:`Update, downgrade & read every version's notes`},{id:`capsman`,label:`CAPsMAN`,sub:`Wi-Fi fabric: coverage, weak signal, load, FT & HA`},{id:`feed`,label:`Live Feed`,sub:`Every tool call, in real time`}],q9=new Set(K9.map(e=>e.id)),J9=`mt-view`;function Y9(){try{let e=location.hash.replace(/^#\/?/,``);return q9.has(e)?e:null}catch{return null}}function zne(){let e=Y9();if(e)return e;try{let e=localStorage.getItem(J9);if(e&&q9.has(e))return e}catch{}return`overview`}var X9=[`var(--foreground)`,`var(--muted-foreground)`],Z9={overview:X9,devices:X9,clients:X9,aaa:X9,topology:X9,packets:X9,snapshots:X9,drift:X9,plan:X9,s3:X9,backups:X9,modules:X9,config:X9,memory:X9,releases:X9,capsman:X9,feed:X9},Bne={overview:{what:`A live pulse of all MCP tool activity: total calls, error rate, p50/p95 latency, the busiest tools, and a risk breakdown — over a time window you choose.`,tips:[`Change the time window (top-right) to zoom from the last 5 minutes out to 24 hours.`,`The risk donut splits calls by annotation: read · write · destructive · dangerous.`,`A rising error line usually points at one device or one tool — jump to Live Feed to see which.`]},devices:{what:`Every configured router with its live reachability (SSH or MAC-Telnet), latency, identity, and system health — CPU, memory and disk — refreshed continuously.`,tips:[`Each device gets a stable colour so you can track it across the connectivity radar.`,`Health (CPU/Mem/Disk) is probed periodically; MAC-Telnet devices are probed on a slower cadence.`,`Latency tiers are colour-coded green → amber → red; a grey node is currently unreachable.`,`The SSH Connection Pool panel shows persistent connections: green = idle/ready, blue = busy with inflight channels, red = reconnecting.`]},clients:{what:`The LAN devices connected to a router — merged from its DHCP leases and ARP table — with live Download/Upload charts, and one-click controls to block/allow a device, pin (reserve) its IP, change that IP, or relabel it.`,tips:[`Pick the router (top-right) to inspect its connected devices; filter by IP, MAC or name.`,`Click a device to open its live ↓/↑ traffic chart — needs a simple queue targeting its IP.`,`Block/allow is enforced by MAC, so it survives the device changing IP; “Pin IP” makes its lease static.`]},aaa:{what:"Full management of the router's RADIUS client (`/radius`) and the built-in User Manager RADIUS server (`/user-manager`): RADIUS servers + incoming CoA, and User Manager users, service profiles, rate/quota limitations, NAS clients, profile assignments, accounting sessions, and global settings.",tips:[`Pick the router (top-right), then switch tabs across RADIUS, Users, Profiles, Limitations, NAS, Assignments, Sessions and Settings.`,`Every tab is full CRUD: add, edit, enable/disable and remove — secrets are write-only and shown redacted.`,`The Usage & Heatmap tab shows each user's 3-month download/upload and a GitHub-style connection heatmap, persisted locally.`,`If a device lacks the user-manager package, the User Manager tabs explain how to install it; RADIUS-client tabs still work.`]},topology:{what:`A Layer-2 map of neighbours each router discovers via MNDP / CDP / LLDP — the physical adjacency of your network, drawn live.`,tips:[`Solid nodes are configured devices; faint nodes are discovered-but-unmanaged neighbours.`,`Use “Add to config →” on an unmanaged neighbour to pre-fill it in the Config editor.`,`Drag to pan; the layout settles automatically as new neighbours arrive.`]},packets:{what:`Live packet capture streamed from a router over TZSP — decode headers in real time without leaving the dashboard.`,tips:[`Pick a device and start the capture; packets decode as they arrive.`,`Stop the capture when done — it frees the router-side sniffer.`,`Great for debugging a protocol issue alongside the Live Feed of tool calls.`]},snapshots:{what:`Point-in-time captures of a device’s full configuration (/export), stored locally so you can diff any two and see exactly what changed.`,tips:[`Capture a snapshot before a risky change, then diff after to audit the delta.`,`The diff is line-level: green added, red removed.`,`Snapshots are device config exports — for the dashboard’s OWN config history see the Config page.`]},drift:{what:`Detect when router configs drift from their golden baseline — with change attribution and one-click reconciliation.`,tips:[`Set a baseline via MCP tools (config_set_baseline) or the Baseline Manager below.`,`Click a device card to run a live drift check against its golden config.`,`Promote accepted changes as the new baseline, or reconcile to roll back.`]},plan:{what:`Dry-run the exact RouterOS commands a change would run before it touches a device — a change plan you can review and trust.`,tips:[`Paste or build intended commands to see them validated and ordered.`,`Nothing is sent to the device from here — it’s a preview.`,`Pair with Safe Mode (auto-revert) when you do apply for real.`]},s3:{what:`Browse, download, and delete backup objects in your configured S3-compatible bucket — your off-box archive of device backups and exports.`,tips:[`Filter by key prefix to find a device’s backups quickly.`,`Download fetches the object through a presigned URL; delete is permanent.`,`For host-side .rsc backups instead, use the Backups page.`]},backups:{what:`A local config vault on the MCP server: capture a device’s /export as a timestamped .rsc file, then download, upload, rename, restore (via Safe Mode), or delete it.`,tips:[`Restore offers a dry-run (applies then rolls back) before you commit for real.`,`Edit the vault path inline in the header — it’s saved to your config.`,`Filenames are stamped in the device’s local 24-hour clock.`]},modules:{what:"Every tool module in the catalog with a live on/off switch. Toggling one writes your config file's `tools` block (disabledModules / enabledModules) and applies it immediately, so you can curate exactly which scopes the MCP server exposes.",tips:[`MCP clients search-rank tools and degrade past ~100; trim the surface below ~150–200 tools so every remaining tool is reliably findable.`,`Disable adds the module to tools.disabledModules; enable removes it (or adds it to an active allow-list) — your config file is updated live on each toggle.`,`Changes need an MCP client reconnect (or a server restart) to actually shrink/grow the visible tool list.`]},config:{what:`View the effective configuration, edit it safely with schema-aware validation and auto-rollback, browse a full field guide, and travel through config version history.`,tips:[`Every successful apply is auto-saved to the version timeline — restore any point in time.`,`Save a named checkpoint before a big change for an easy, labelled rollback.`,`The Field Guide documents every config option, its type, and default — straight from the schema.`]},memory:{what:`A persistent knowledge graph the AI builds across sessions — entities (routers, subnets, users), relations between them, and free-text observations.`,tips:[`Entities are created by the AI via MCP tools — you can browse and delete them here.`,`The graph visualization shows entities as circles and relations as directed edges; click a node to inspect it.`,`Change the database path to switch between different knowledge bases.`]},releases:{what:`Every published version of the server on a timeline, with its release notes. Upgrade to the latest, or install any specific version to upgrade or downgrade.`,tips:[`The green dot marks the version you're running now; the brand dot marks the latest.`,"Install runs `bun i -g @usex/mikrotik-mcp@<version>` on the server, then it self-restarts onto that version (the connection drops briefly).",`Click a version to expand its release notes; the latest is expanded by default.`]},capsman:{what:`The CAPsMAN Wi-Fi fabric for this controller: managed APs grouped by floor with per-radio health (client load, CPU, co-channel conflicts), weak-signal clients with the recommended neighbor AP to steer toward, and a roaming (802.11r FT) + HA redundancy audit.`,tips:[`Radio cards are colored by health; a red 'co-ch' badge means an adjacent radio shares its channel — the proposed channel is shown as →N.`,`Floors come from the AP identity/comment tag (e.g. AP-F3-E); unfloored APs are grouped by inferred signal adjacency.`,`This page is read-only in this release — steering, channel-plan apply, FT enable and HA setup arrive in later phases.`]},feed:{what:`Every tool call as it happens — tool, device, risk, duration, and success/error — with full request/response detail on click.`,tips:[`Filter by status to isolate failures, or by tool/device to follow one thread.`,`Click any row to open the full (secret-redacted) request and response.`,`Pause the stream when you want to inspect without rows shifting under you.`]}};function Q9({icon:e,title:t,sub:n,body:r,className:i}){return(0,W.jsxs)(`div`,{className:q(`text-muted-foreground flex flex-col items-center gap-2 rounded-lg border border-dashed px-6 py-14 text-center`,i),children:[e,(0,W.jsx)(`p`,{className:`text-foreground text-sm font-medium`,children:t}),n!=null&&(0,W.jsx)(`p`,{className:`max-w-md text-xs`,children:n}),r]})}function Vne({view:e}){let t=Bne[e];return(0,W.jsxs)(`div`,{className:`bg-card reveal flex gap-3 rounded-lg border p-4`,role:`region`,"aria-label":`Page help`,children:[(0,W.jsx)(Rc,{className:`text-brand mt-0.5 size-4 shrink-0`,"aria-hidden":`true`}),(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,W.jsx)(`p`,{className:`text-sm`,children:t.what}),(0,W.jsx)(`ul`,{className:`text-muted-foreground list-disc space-y-1 pl-4 text-xs`,children:t.tips.map((e,t)=>(0,W.jsx)(`li`,{children:e},t))})]})]})}function Hne(){return(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,className:`size-3.5`,children:(0,W.jsxs)(`g`,{stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,W.jsx)(`path`,{d:`M21 12a9 9 0 1 1-2.64-6.36`}),(0,W.jsx)(`path`,{d:`M21 3v6h-6`})]})})}function Une(){let[e,t]=(0,v.useState)(!1);async function n(e){t(!0);let n=J.loading(e?`Restarting server…`:`Reloading config…`);try{let t=await _c(`/api/reload`,{hard:e});t?.ok?e?J.success(`Restarting — reconnect shortly`,{id:n,description:t.note}):J.success(`Config reloaded · ${t.count??`?`} device${t.count===1?``:`s`}`,{id:n}):J.error(t?.error??(e?`Restart failed`:`Reload failed`),{id:n})}catch{J.error(`${e?`Restart`:`Reload`} failed (server unreachable)`,{id:n})}finally{t(!1)}}return(0,W.jsxs)(`div`,{className:`inline-flex w-fit -space-x-px`,role:`group`,"aria-label":`Reload server`,children:[(0,W.jsxs)(vb,{variant:`outline`,size:`sm`,disabled:e,onClick:()=>void n(!1),title:`Re-read the config from disk and apply it live (no downtime)`,className:`rounded-r-none focus-visible:z-10`,children:[(0,W.jsx)(Hne,{}),`Reload Server`]}),(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(vb,{variant:`outline`,size:`sm`,disabled:e,title:`Fully restart the server process (relaunches itself, drops the connection briefly)`,className:`rounded-l-none px-2 focus-visible:z-10`,children:`Restart`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Restart the MCP server?`}),(0,W.jsxs)(Tb,{children:[`The server relaunches itself and rebinds the same port(s) in ~1.5s — no external supervisor needed. The current connection drops briefly; reconnect after. To pick up a newly added device without downtime, use `,(0,W.jsx)(`b`,{children:`Reload Server`}),` instead.`]})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{className:_b({variant:`destructive`}),onClick:()=>void n(!0),children:`Restart`})]})]})]})]})}function Wne({name:e}){return(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.7`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:{overview:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`3`,width:`8`,height:`8`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`13`,y:`3`,width:`8`,height:`5`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`13`,y:`10`,width:`8`,height:`11`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`8`,height:`8`,rx:`1.6`})]}),devices:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`7`,rx:`2`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`18`,height:`7`,rx:`2`}),(0,W.jsx)(`path`,{d:`M7 7.5h.01M7 16.5h.01`})]}),clients:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`9`,cy:`8`,r:`3`}),(0,W.jsx)(`path`,{d:`M3.5 19a5.5 5.5 0 0 1 11 0`}),(0,W.jsx)(`path`,{d:`M16 7.5a2.5 2.5 0 0 1 0 5M17.5 19a4.5 4.5 0 0 0-2-3.6`})]}),aaa:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3 4 6v5c0 4.4 3.2 7.6 8 9 4.8-1.4 8-4.6 8-9V6l-8-3Z`}),(0,W.jsx)(`path`,{d:`M9.5 11.5 11 13l3.5-3.5`})]}),topology:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`12`,cy:`5`,r:`2.4`}),(0,W.jsx)(`circle`,{cx:`5`,cy:`19`,r:`2.4`}),(0,W.jsx)(`circle`,{cx:`19`,cy:`19`,r:`2.4`}),(0,W.jsx)(`path`,{d:`M12 7.4 6.4 16.6M12 7.4 17.6 16.6`})]}),packets:(0,W.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`}),snapshots:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3 3 7.5 12 12 21 7.5 12 3Z`}),(0,W.jsx)(`path`,{d:`M3 12 12 16.5 21 12`}),(0,W.jsx)(`path`,{d:`M3 16.5 12 21 21 16.5`})]}),drift:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 22c5.5 0 10-4.5 10-10S17.5 2 12 2 2 6.5 2 12s4.5 10 10 10Z`}),(0,W.jsx)(`path`,{d:`M9 12l2 2 4-4`}),(0,W.jsx)(`path`,{d:`M12 6v2M12 16v2M6 12h2M16 12h2`})]}),plan:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`6`,cy:`6`,r:`2.3`}),(0,W.jsx)(`circle`,{cx:`6`,cy:`18`,r:`2.3`}),(0,W.jsx)(`circle`,{cx:`18`,cy:`8`,r:`2.3`}),(0,W.jsx)(`path`,{d:`M6 8.3v7.4M8.3 6H13a3 3 0 0 1 3 3v0`})]}),s3:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`ellipse`,{cx:`12`,cy:`6`,rx:`7`,ry:`2.6`}),(0,W.jsx)(`path`,{d:`M5 6v12c0 1.5 3.1 2.6 7 2.6s7-1.1 7-2.6V6`}),(0,W.jsx)(`path`,{d:`M5 12c0 1.5 3.1 2.6 7 2.6s7-1.1 7-2.6`})]}),backups:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M3 6.5 5 3.5h14l2 3`}),(0,W.jsx)(`rect`,{x:`3`,y:`6.5`,width:`18`,height:`14`,rx:`2`}),(0,W.jsx)(`path`,{d:`M9.5 12h5`})]}),modules:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`5`,width:`18`,height:`6`,rx:`3`}),(0,W.jsx)(`circle`,{cx:`8`,cy:`8`,r:`1.5`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`18`,height:`6`,rx:`3`}),(0,W.jsx)(`circle`,{cx:`16`,cy:`16`,r:`1.5`})]}),config:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M4 7h8M16 7h4M4 17h4M12 17h8`}),(0,W.jsx)(`circle`,{cx:`14`,cy:`7`,r:`2.2`}),(0,W.jsx)(`circle`,{cx:`10`,cy:`17`,r:`2.2`})]}),memory:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`12`,cy:`6`,r:`2`}),(0,W.jsx)(`circle`,{cx:`6`,cy:`14`,r:`2`}),(0,W.jsx)(`circle`,{cx:`18`,cy:`14`,r:`2`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`20`,r:`2`}),(0,W.jsx)(`path`,{d:`M12 8v-0.5M12 8 7.2 12.5M12 8 16.8 12.5M6 16 10.5 18.5M18 16 13.5 18.5`})]}),releases:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3v12`}),(0,W.jsx)(`path`,{d:`M8 11l4 4 4-4`}),(0,W.jsx)(`path`,{d:`M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2`})]}),capsman:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M5 12a7 7 0 0 1 14 0`}),(0,W.jsx)(`path`,{d:`M8.5 12a3.5 3.5 0 0 1 7 0`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`12`,r:`1.4`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`path`,{d:`M12 13.4V20`})]}),feed:(0,W.jsx)(`path`,{d:`M4 6h16M4 12h16M4 18h10`})}[e]})}function Gne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(null),c=gne(n?.version),[l,u]=(0,v.useState)(null),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(!1),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)([]),[b,x]=(0,v.useState)(36e5),S=Number(d?.dashboard?.feedLimit)||200,C=(0,v.useCallback)(async e=>{if(!d)return;let t={...d.dashboard,feedLimit:e};await _c(`/api/config`,{config:{...d,dashboard:t},rollbackMs:0}).catch(()=>J.error(`Could not save the feed limit`)),await gc(`/api/config`).then(f).catch(()=>{})},[d]),[w,T]=(0,v.useState)(!1),[E,D]=(0,v.useState)(`off`),[O,k]=(0,v.useState)(null),[A,j]=(0,v.useState)(()=>new Set),[M,N]=(0,v.useState)({}),[P,F]=(0,v.useState)({tool:``,risk:``,device:``,status:``,q:``}),I=(0,v.useRef)(w);I.current=w;let L=(0,v.useRef)(null);zte(L);let[R,ee]=(0,v.useState)(zne),te=(0,v.useCallback)(e=>{ee(e);try{Y9()!==e&&(location.hash=e),localStorage.setItem(J9,e)}catch{}},[]);(0,v.useEffect)(()=>{if(Y9()!==R)try{location.hash=R}catch{}let e=()=>{let e=Y9();e&&te(e)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let[z,B]=(0,v.useState)(()=>{try{let e=localStorage.getItem(`mt-help-open`);return new Set(e?JSON.parse(e):[])}catch{return new Set}}),V=e=>B(t=>{let n=new Set(t);n.has(e)?n.delete(e):n.add(e);try{localStorage.setItem(`mt-help-open`,JSON.stringify([...n]))}catch{}return n}),[ne,re]=(0,v.useState)(``),[ie,ae]=(0,v.useState)(`all`),oe=(0,v.useMemo)(()=>{let e=i?.devices??[];return{online:e.filter(e=>e.status.reachable===!0).length,offline:e.filter(e=>e.status.reachable===!1).length,total:e.length}},[i]),se=(0,v.useMemo)(()=>{let e=i?.devices??[],t=ne.trim().toLowerCase();return e.filter(e=>!(ie===`online`&&e.status.reachable!==!0||ie===`offline`&&e.status.reachable!==!1||t&&!e.name.toLowerCase().includes(t)&&!(e.address??e.host??``).toLowerCase().includes(t)))},[i,ne,ie]);Rte((0,v.useCallback)(e=>{if(I.current)return;y(t=>[e,...t].slice(0,xx));let t=e.device;t&&N(e=>({...e,[t]:(e[t]??0)+1}))},[]),(0,v.useCallback)(e=>D(e),[])),(0,v.useEffect)(()=>{gc(`/api/events?limit=${xx}`).then(e=>y(e.events)).catch(()=>{})},[]);let H=(0,v.useCallback)(()=>{gc(`/api/stats?window=${b}&buckets=60`).then(t).catch(()=>{})},[b]);(0,v.useEffect)(()=>{H();let e=()=>{H(),gc(`/api/meta`).then(r).catch(()=>{}),gc(`/api/devices`).then(a).catch(()=>{}),gc(`/api/ssh-pool`).then(s).catch(()=>{}),gc(`/api/topology`).then(u).catch(()=>{})};e();let t=setInterval(()=>{I.current||e()},4e3);return()=>clearInterval(t)},[H]),(0,v.useEffect)(()=>{let e=()=>void gc(`/api/config`).then(f).catch(()=>{});e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[]);let ce=(0,v.useCallback)((e,t)=>{_c(`/api/devices/toggle`,{device:e,disabled:t}).then(n=>{a(n),J.success(`Device ${e} ${t?`disabled`:`enabled`}`)}).catch(()=>J.error(`Could not ${t?`disable`:`enable`} ${e}`))},[]),le=(0,v.useCallback)(async(e,t)=>{try{let n=await _c(`/api/devices/${e}`,{device:t});a(n);let r=n.status?.reachable,i=e===`reconnect`?`Reconnected to`:`Tested`;r===!1?J.error(`${t} is unreachable`):J.success(`${i} ${t}`)}catch{J.error(`Could not ${e===`reconnect`?`reconnect to`:`test`} ${t}`)}},[]),ue=(0,v.useCallback)(e=>le(`test`,e),[le]),de=(0,v.useCallback)(e=>le(`reconnect`,e),[le]);(0,v.useEffect)(()=>{let e=e=>{e.key===`Escape`&&k(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);let fe=(0,v.useMemo)(()=>{let e=P.q.trim().toLowerCase();return _.filter(t=>!(P.tool&&t.tool!==P.tool||P.risk&&t.risk!==P.risk||P.device&&t.device!==P.device||P.status===`ok`&&t.isError||P.status===`error`&&!t.isError||e&&!t.tool.toLowerCase().includes(e)&&!t.input.toLowerCase().includes(e)&&!t.output.toLowerCase().includes(e)&&!(t.error??``).toLowerCase().includes(e))).sort((e,t)=>t.ts-e.ts)},[_,P]),pe=!!(P.tool||P.risk||P.device||P.status||P.q),me=(0,v.useMemo)(()=>_.filter(e=>e.isError),[_]),he=(0,v.useMemo)(()=>({ok:_.length-me.length,error:me.length}),[_,me]),ge=(0,v.useCallback)(async e=>{try{k(await gc(`/api/event/${encodeURIComponent(e.id)}`))}catch{k(e)}},[]),_e=(0,v.useMemo)(()=>fe.slice(0,S),[fe,S]),ve=(0,v.useMemo)(()=>_e.map(e=>e.id),[_e]),ye=ve.length>0&&ve.every(e=>A.has(e)),be=!ye&&ve.some(e=>A.has(e)),xe=(0,v.useCallback)(e=>{j(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Se=(0,v.useCallback)(()=>{j(e=>{let t=new Set(e);if(ve.length>0&&ve.every(e=>t.has(e)))for(let e of ve)t.delete(e);else for(let e of ve)t.add(e);return t})},[ve]),[Ce,we]=(0,v.useState)(!1),Te=(0,v.useCallback)(async()=>{let e=[...A];if(e.length!==0)try{await yc({ids:e});let t=new Set(e);y(e=>e.filter(e=>!t.has(e.id))),j(new Set),J.success(`Deleted ${e.length} event${e.length===1?``:`s`}`)}catch{J.error(`Could not delete the selected events`)}finally{we(!1)}},[A]),Ee=e=>{if(e===`json`){G9(`mcp-events.json`,JSON.stringify(fe,null,2),`application/json`);return}let t=[`ts`,`tool`,`risk`,`device`,`durationMs`,`isError`,`error`,`reason`],n=e=>/[",\n]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e,r=fe.map(e=>[new Date(e.ts).toISOString(),e.tool,e.risk,e.device??``,String(e.durationMs),String(e.isError),e.error??``,e.reason??``].map(n).join(`,`)).join(`
|
|
155
|
-
`);G9(`mcp-events.csv`,`${t.join(`,`)}\n${r}\n`,`text/csv`)},De=e?e.errorRate>=.2?`text-destructive`:e.errorRate>=.05?`text-warning`:``:``,Oe=d?.mcp??{},ke=d?.dashboard??{},Ae=d?.ssh??{},je=(e,t,n)=>(0,W.jsx)(Xx,{size:`sm`,"aria-label":t,value:P[e],onValueChange:t=>F(n=>({...n,[e]:t})),options:[{value:``,label:t},...n.map(e=>({value:e,label:e}))]}),Me=K9.find(e=>e.id===R)??K9[0];return(0,W.jsxs)(`div`,{className:`bg-background text-foreground grid min-h-screen grid-cols-[240px_1fr]`,ref:L,"data-view":R,style:{"--page-accent":Z9[R][0],"--page-accent-2":Z9[R][1]},children:[(0,W.jsxs)(`aside`,{className:`bg-card sticky top-0 flex h-screen flex-col gap-4 border-r p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsx)(`div`,{className:`bg-foreground text-background grid size-9 shrink-0 place-items-center rounded-md`,children:(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,className:`size-5`,children:(0,W.jsxs)(`g`,{stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,W.jsx)(`path`,{d:`M12 12 L4 5 M12 12 L20 5 M12 12 L12 20`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`4`,cy:`5`,r:`1.9`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`20`,cy:`5`,r:`1.9`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`20`,r:`1.9`,fill:`currentColor`,stroke:`none`})]})})}),(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col leading-tight`,children:[(0,W.jsx)(`b`,{className:`truncate text-sm`,children:`MikroTik MCP`}),(0,W.jsxs)(`small`,{className:q(`text-muted-foreground inline-flex items-center gap-1 text-[11px]`,c.release&&`hover:text-foreground cursor-pointer`),title:c.release?`View release notes`:void 0,onClick:c.release?()=>c.openModal():void 0,children:[n?.version?`v${n.version}`:`Observability`,c.showIndicator&&(0,W.jsx)(`span`,{className:`bg-brand inline-block size-1.5 rounded-full`,title:`v${c.release?.version} available`})]})]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Xb,{})]}),(0,W.jsx)(`nav`,{className:`flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto`,children:K9.map(e=>(0,W.jsxs)(`button`,{type:`button`,className:q(`flex items-center gap-2.5 rounded-md px-2.5 py-2 text-left text-[13px] transition-colors`,`[&_svg]:size-4 [&_svg]:shrink-0`,R===e.id?`bg-accent text-accent-foreground font-medium`:`text-muted-foreground hover:bg-accent/50 hover:text-foreground`),onClick:()=>te(e.id),children:[(0,W.jsx)(Wne,{name:e.id}),(0,W.jsx)(`span`,{className:`truncate`,children:e.label}),e.id===`feed`&&_.length>0&&(0,W.jsx)(`span`,{className:`bg-brand text-brand-foreground animate-in zoom-in-50 ml-auto rounded-full px-1.5 py-0.5 text-[10px] tabular-nums`,children:_.length>999?`999+`:_.length},_.length)]},e.id))}),(0,W.jsxs)(`div`,{className:`flex flex-col gap-1.5 border-t pt-3`,children:[(0,W.jsx)(Une,{}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-[11px]`,title:`Live transport: WebSocket (preferred) or SSE fallback`,children:[(0,W.jsx)(Wx,{type:E===`off`?`secondary`:`success`,pulse:E!==`off`}),E===`off`?`offline`:`live · ${E}`]}),(0,W.jsx)(`small`,{className:`text-muted-foreground text-[11px]`,children:n?`${hx(n.total)} events · ${n.transport}`:`connecting…`})]})]}),(0,W.jsxs)(`main`,{className:`flex min-w-0 flex-col gap-5 p-6`,"data-view":R,children:[(0,W.jsxs)(`header`,{className:`reveal flex flex-wrap items-center gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,W.jsx)(`h1`,{className:`truncate text-xl font-semibold`,children:Me.label}),(0,W.jsx)(`small`,{className:`text-muted-foreground text-xs`,children:Me.sub})]}),(0,W.jsx)(`span`,{className:`flex-1`}),R===`overview`&&(0,W.jsx)(Xx,{size:`sm`,"aria-label":`Stats time window`,value:String(b),onValueChange:e=>x(Number(e)),options:bx.map(([e,t])=>({value:String(t),label:`window: ${e}`}))}),(0,W.jsx)(X,{size:`sm`,ghost:!0,type:z.has(R)?`accent`:`default`,onClick:()=>V(R),"aria-expanded":z.has(R),title:`About this page`,icon:(0,W.jsx)(Rc,{}),children:`Help`})]}),z.has(R)&&(0,W.jsx)(Vne,{view:R}),R===`overview`&&(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsx)(`div`,{className:`reveal grid grid-cols-[repeat(auto-fit,minmax(9rem,1fr))] gap-3`,children:e?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(cx,{k:`Calls (window)`,v:hx(e.total)}),(0,W.jsx)(cx,{k:`Calls / min`,v:e.callsPerMin.toFixed(1)}),(0,W.jsx)(cx,{k:`Error rate`,v:`${(e.errorRate*100).toFixed(1)}%`,sub:`${e.errors} err`,cls:De}),(0,W.jsx)(cx,{k:`Avg latency`,v:fx(e.latency.avg)}),(0,W.jsx)(cx,{k:`p95 latency`,v:fx(e.latency.p95)}),(0,W.jsx)(cx,{k:`p99 latency`,v:fx(e.latency.p99)}),(0,W.jsx)(cx,{k:`Distinct tools`,v:hx(e.distinctTools)}),(0,W.jsx)(cx,{k:`Output volume`,v:px(e.outputBytes)})]}):(0,W.jsx)(cx,{k:`Loading…`,v:`—`})}),(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-1 gap-4 xl:grid-cols-3`,children:[(0,W.jsx)(sx,{title:`Calls over time`,className:`xl:col-span-2`,children:e?(0,W.jsx)(o7,{series:e.series}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`no data`})}),e&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(sx,{title:`By risk`,children:(0,W.jsx)(s7,{segments:Object.keys(e.byRisk).map(t=>({label:t,value:e.byRisk[t],color:vx[t]}))})}),(0,W.jsx)(sx,{title:`Top tools`,className:`xl:col-span-2`,children:(0,W.jsx)(lx,{rows:e.byTool.map(e=>({label:e.tool,value:e.count,sub:`${e.count}× · ${fx(e.p95Ms)} p95${e.errors?` · ${e.errors} err`:``}`,color:e.errors?`var(--destructive)`:void 0}))})}),(0,W.jsx)(sx,{title:`Status`,children:(0,W.jsx)(s7,{centerLabel:`calls`,segments:[{label:`ok`,value:he.ok,color:`var(--muted-foreground)`},{label:`error`,value:he.error,color:`var(--destructive)`}]})}),(0,W.jsx)(sx,{title:`By device`,children:e.byDevice.length?(0,W.jsx)(lx,{rows:e.byDevice.map(e=>({label:e.device,value:e.count}))}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`single device`})}),(0,W.jsx)(sx,{title:`Recent errors`,children:me.length?(0,W.jsx)(`div`,{className:`flex flex-col gap-2`,children:me.slice(0,8).map(e=>(0,W.jsxs)(`div`,{className:`hover:bg-accent/50 grid cursor-pointer grid-cols-[auto_1fr] items-center gap-3 rounded-md px-1 py-0.5`,onClick:()=>void ge(e),children:[(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:mx(e.ts)}),(0,W.jsxs)(`span`,{className:`text-destructive min-w-0 truncate text-xs`,title:e.error??e.output,children:[e.tool,`: `,e.error??e.output??`error`]})]},e.id))}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`no errors 🎉`})})]})]})]}),R===`devices`&&(i&&i.devices.length>0?(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsxs)(`div`,{className:`reveal flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Kx,{className:`min-w-[180px] flex-1`,type:`search`,placeholder:`Search devices by name or address…`,value:ne,onChange:e=>re(e.target.value)}),(0,W.jsx)(`div`,{className:`bg-muted flex gap-0.5 rounded-md p-0.5`,children:[`all`,`online`,`offline`].map(e=>(0,W.jsx)(`button`,{type:`button`,className:q(`rounded-sm px-2.5 py-1 text-xs transition-colors`,ie===e?`bg-background text-foreground shadow-xs`:`text-muted-foreground hover:text-foreground`),onClick:()=>ae(e),children:e===`all`?`All ${oe.total}`:e===`online`?`Online ${oe.online}`:`Offline ${oe.offline}`},e))}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[se.length,`/`,oe.total,` shown`]})]}),(0,W.jsxs)(`details`,{className:`bg-card reveal rounded-lg border p-4`,open:oe.total<=8,children:[(0,W.jsxs)(`summary`,{className:`cursor-pointer text-sm font-medium`,children:[`Connectivity radar`,(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[` `,`· `,oe.online,` online · `,oe.offline,` offline ·`,` `,oe.total,` total`]})]}),(0,W.jsx)(Nte,{payload:i,pulses:M})]}),(0,W.jsx)(Rne,{devices:se,poolPayload:o}),se.length===0?(0,W.jsx)(Q9,{className:`reveal`,icon:(0,W.jsx)(ol,{className:`size-6`}),title:`No devices match`,sub:`Try a different search or status filter.`}):(0,W.jsx)(`div`,{className:`reveal grid grid-cols-[repeat(auto-fill,minmax(20rem,1fr))] gap-4`,children:se.map(e=>(0,W.jsx)(Pte,{d:e,allNames:i.devices.map(e=>e.name),onToggle:ce,onTest:ue,onReconnect:de},e.name))}),se.length>0&&(0,W.jsx)(sx,{title:`Device system health`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`CPU · memory · disk · latency · live probe`}),children:(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(22rem,1fr))] gap-3`,children:se.map(e=>(0,W.jsx)(Lte,{d:e},e.name))})})]}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Yc,{className:`size-6`}),title:`No devices configured`,body:(0,W.jsx)(zx,{type:`secondary`,label:`Tip`,children:`Add a device to your config to see connectivity and system health here.`})})),R===`clients`&&(0,W.jsx)(C7,{}),R===`aaa`&&(0,W.jsx)(zS,{}),R===`topology`&&(l&&l.nodes.length>0?(0,W.jsx)(`section`,{className:`reveal grid content-start gap-[18px]`,children:(0,W.jsx)(Nne,{topo:l,onOnboard:(e,t)=>{g({name:e,body:t}),m(!0),te(`config`)}})}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(el,{className:`size-6`}),title:`No neighbours discovered yet`,sub:`Layer-2 neighbours (MNDP / CDP / LLDP) appear here as the device reports them.`})),R===`packets`&&(0,W.jsx)(`section`,{className:`grid content-start gap-[18px]`,children:(0,W.jsx)(sx,{title:`Packet capture`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`live TZSP decode · /tool sniffer streaming`}),children:(0,W.jsx)(Dne,{})})}),R===`snapshots`&&(0,W.jsx)(kne,{}),R===`drift`&&(0,W.jsx)(qte,{}),R===`plan`&&(0,W.jsx)(US,{}),R===`s3`&&(0,W.jsx)(One,{}),R===`backups`&&(0,W.jsx)(Qx,{}),R===`modules`&&(0,W.jsx)(rne,{}),R===`config`&&(d?(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsx)(sx,{title:`Configuration`,className:`reveal`,extra:(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>m(e=>!e),title:`Edit the config JSON with autocomplete, validation and safe-apply`,icon:p?void 0:(0,W.jsx)(Zc,{}),children:p?`View`:`Edit config`}),children:p?(0,W.jsx)(kte,{initial:h?{...d,devices:{...d.devices,[h.name]:h.body}}:d,onClose:()=>{m(!1),g(null)},onReload:()=>{g(null),gc(`/api/config`).then(f).catch(()=>{})}},h?`seed-${h.name}`:`config`):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`text-muted-foreground mb-2.5 flex flex-wrap gap-x-4 gap-y-1 text-[11px]`,children:[(0,W.jsxs)(`span`,{children:[`transport: `,gx(Oe.transport)]}),(0,W.jsxs)(`span`,{children:[`read-only: `,d.readOnly?`yes`:`no`]}),(0,W.jsxs)(`span`,{children:[`dashboard: `,gx(ke.host),`:`,gx(ke.port)]}),(0,W.jsxs)(`span`,{children:[`capture: `,ke.captureBody?`on`:`off`]}),(0,W.jsxs)(`span`,{children:[`s3: `,d.s3?`configured`:`off`]}),(0,W.jsxs)(`span`,{children:[`ssh pool: `,Ae.keepAlive===!1?`off`:`on`]})]}),(0,W.jsxs)(`details`,{children:[(0,W.jsx)(`summary`,{className:`cursor-pointer text-sm`,children:`Full effective configuration (secrets redacted)`}),(0,W.jsx)(M7,{value:d,maxHeight:340})]})]})}),(0,W.jsx)(sx,{title:`Dashboard preferences`,className:`reveal`,extra:(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[`saved to `,(0,W.jsx)(`code`,{children:`dashboard.feedLimit`}),` in the config`]}),children:(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,W.jsx)(kb,{className:`text-[12.5px]`,children:`Live Feed rows`}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[`How many matching calls the feed table renders. Up to `,hx(1e4),` are kept in memory regardless; this only bounds what is drawn.`]})]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Xx,{size:`sm`,"aria-label":`Live Feed rows`,value:String(S),onValueChange:e=>void C(Number(e)),options:dx.map(e=>({value:String(e),label:`${hx(e)} rows${e===200?` (default)`:``}`}))})]})}),(0,W.jsx)(sx,{title:`Version history`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`point-in-time snapshots · diff & restore`}),children:(0,W.jsx)(B7,{onRestored:()=>void gc(`/api/config`).then(f).catch(()=>{})})}),(0,W.jsx)(sx,{title:`Field guide`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`every config option, documented from the schema`}),children:(0,W.jsx)(H7,{})})]}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Gx,{}),title:`Loading configuration…`})),R===`memory`&&(0,W.jsx)(tne,{}),R===`releases`&&(0,W.jsx)(bne,{}),R===`capsman`&&(0,W.jsx)(Tne,{}),R===`feed`&&(0,W.jsxs)(sx,{className:`reveal`,title:`Live tool calls`,extra:(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[hx(_e.length),` shown`,fe.length>_e.length&&` of ${hx(fe.length)} matching`,` ·`,` `,hx(_.length),` buffered`]}),children:[(0,W.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Kx,{className:`min-w-[180px] flex-1`,type:`search`,placeholder:`Search tool / input / output / error…`,value:P.q,onChange:e=>F(t=>({...t,q:e.target.value}))}),je(`tool`,`all tools`,n?.tools??[]),je(`risk`,`all risk`,[`READ`,`WRITE`,`WRITE_IDEMPOTENT`,`DESTRUCTIVE`,`DANGEROUS`]),je(`device`,`all devices`,n?.devices??[]),je(`status`,`all status`,[`ok`,`error`]),(0,W.jsx)(X,{size:`sm`,ghost:!0,type:w?`accent`:`default`,onClick:()=>T(e=>!e),icon:w?(0,W.jsx)(Qc,{}):(0,W.jsx)(Xc,{}),children:w?`Resume`:`Pause`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>Ee(`csv`),children:`CSV`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>Ee(`json`),children:`JSON`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>F({tool:``,risk:``,device:``,status:``,q:``}),children:`Clear`}),Ce&&A.size>0?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(X,{size:`sm`,type:`error`,onClick:()=>void Te(),icon:(0,W.jsx)(Pc,{}),children:[`Confirm delete (`,A.size,`)`]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>we(!1),children:`Cancel`})]}):(0,W.jsxs)(X,{size:`sm`,ghost:!0,disabled:A.size===0,onClick:()=>we(!0),title:`Delete the selected rows`,icon:(0,W.jsx)(pl,{}),children:[`Delete`,A.size>0?` (${A.size})`:``]})]}),fe.length===0?pe?(0,W.jsx)(Q9,{icon:(0,W.jsx)(ol,{className:`size-6`}),title:`No calls match your filters`,sub:`${_.length} call${_.length===1?``:`s`} buffered — try widening the search or the risk / device / status filters.`,body:(0,W.jsx)(X,{size:`sm`,ghost:!0,className:`mt-2`,onClick:()=>F({tool:``,risk:``,device:``,status:``,q:``}),children:`Clear filters`})}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Wx,{type:E===`off`?`secondary`:`success`,pulse:E!==`off`,className:`size-3`}),title:E===`off`?`Not connected`:`Listening for tool calls…`,sub:E===`off`?`The live stream is offline — it will reconnect automatically.`:`Tool calls the LLM makes against this server stream in here in real time.`}):(0,W.jsx)(`div`,{className:`max-h-[60vh] overflow-auto`,children:(0,W.jsxs)(Qb,{children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{className:`w-7`,children:(0,W.jsx)(Ob,{"aria-label":`Select all shown rows`,checked:ye?!0:be?`indeterminate`:!1,onCheckedChange:Se})}),(0,W.jsx)(Y,{children:`time`}),(0,W.jsx)(Y,{children:`tool`}),(0,W.jsx)(Y,{children:`risk`}),(0,W.jsx)(Y,{children:`device`}),(0,W.jsx)(Y,{className:`text-right`,children:`dur`}),(0,W.jsx)(Y,{children:`status`}),(0,W.jsx)(Y,{children:`output`})]})}),(0,W.jsx)(ex,{children:_e.map(e=>(0,W.jsxs)(tx,{"data-state":A.has(e.id)?`selected`:void 0,className:q(`cursor-pointer`,e.isError&&`bg-destructive/8`),onClick:()=>void ge(e),children:[(0,W.jsx)(nx,{onClick:e=>e.stopPropagation(),children:(0,W.jsx)(Ob,{"aria-label":`Select row`,checked:A.has(e.id),onCheckedChange:()=>xe(e.id)})}),(0,W.jsx)(nx,{className:`tabular-nums`,children:mx(e.ts)}),(0,W.jsx)(nx,{children:e.tool}),(0,W.jsx)(nx,{children:(0,W.jsx)(`span`,{className:q(`rounded-full border px-1.5 py-0.5 text-[10px]`,yx[e.risk]),children:e.risk.replace(`WRITE_IDEMPOTENT`,`WRITE·I`)})}),(0,W.jsx)(nx,{children:e.device??`—`}),(0,W.jsx)(nx,{className:`text-right tabular-nums`,children:fx(e.durationMs)}),(0,W.jsx)(nx,{children:(0,W.jsx)(`span`,{className:e.isError?`text-destructive`:`text-muted-foreground`,children:e.isError?`error`:`ok`})}),(0,W.jsx)(nx,{className:`text-muted-foreground max-w-[24rem] truncate`,children:e.isError?e.error??`error`:e.reason?(0,W.jsx)(`span`,{className:`italic`,children:e.reason}):e.output||`—`})]},e.id))})]})})]})]}),c.showModal&&c.release&&(0,W.jsx)(_ne,{release:c.release,onDismiss:c.dismissRelease}),O&&(0,W.jsx)(Ite,{event:O,onClose:()=>k(null)}),(0,W.jsx)(Zb,{})]})}var $9=document.getElementById(`root`);$9&&(0,y.createRoot)($9).render((0,W.jsx)(Gne,{}));
|
|
154
|
+
`).map((e,t)=>(0,W.jsx)(`div`,{className:e.startsWith(`+`)?`text-success`:e.startsWith(`-`)?`text-destructive`:e.startsWith(`@@`)?`text-brand`:``,children:e||` `},t))})}),o&&(0,W.jsx)(sx,{title:`Snapshot · ${o.label??o.id}`,className:`reveal`,extra:(0,W.jsx)(X,{type:`secondary`,size:`sm`,icon:(0,W.jsx)(_l,{}),onClick:()=>s(null),children:`Close`}),children:(0,W.jsx)(`pre`,{className:`m-0 overflow-auto rounded border border-border bg-background p-3 font-mono text-xs break-words whitespace-pre-wrap`,style:{maxHeight:460},children:o.body||`(empty)`})})]})}function L9({className:e,orientation:t=`horizontal`,decorative:n=!0,...r}){return(0,W.jsx)(sv,{"data-slot":`separator`,decorative:n,orientation:t,className:q(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...r})}var R9=` hub`;function z9(e){let t=e;for(;t>Math.PI;)t-=Math.PI*2;for(;t<-Math.PI;)t+=Math.PI*2;return t}function Ane(e,t,n){let r=new Map,i=new Map;r.set(R9,{x:450,y:310});let a=e.length<=1?110:Math.min(170,96+e.length*7),o=a+(e.length<=1?190:155);e.forEach((t,n)=>{let o=e.length===1?-Math.PI/2:n/e.length*Math.PI*2-Math.PI/2;i.set(t.id,o),r.set(t.id,{x:450+a*Math.cos(o),y:310+a*Math.sin(o)})});let s=new Map,c=new Map;for(let e of t){let t=n.get(e.id)??``,r=i.get(t)??-Math.PI/2,a=s.get(t)??0;s.set(t,a+1),c.set(e.id,r+Math.ceil(a/2)*(a%2==0?1:-1)*.34)}for(let e=0;e<10;e++)for(let e of t){let r=0;for(let n of t){if(e.id===n.id)continue;let t=z9((c.get(e.id)??0)-(c.get(n.id)??0)),i=Math.abs(t)*o;i<1?r+=e.id<n.id?.02:-.02:i<120&&(r+=Math.sign(t)*2600/(i*i*o))}let a=z9((i.get(n.get(e.id)??``)??-Math.PI/2)-(c.get(e.id)??0));c.set(e.id,(c.get(e.id)??0)+r+a*.06)}for(let e of t){let t=c.get(e.id)??0;r.set(e.id,{x:450+o*Math.cos(t),y:310+o*Math.sin(t)})}return{pos:r,rInner:a,rOuter:o}}function B9(e,t){let n=2*Math.PI*e,r=Math.min(100,Math.max(0,t??0))/100*n;return`${r} ${n-r}`}function jne(e,t=7){let n=t*Math.PI/180,r=e*Math.cos(n),i=e*Math.sin(n);return`M 450 310 L ${450+r} ${310-i} A ${e} ${e} 0 0 1 ${450+r} ${310+i} Z`}function V9(e){return e==null?`var(--muted-foreground)`:e>=85?`var(--destructive)`:e>=60?`var(--warning)`:`var(--chart-2)`}function Mne(e){return e.reachable===!0?`var(--chart-2)`:e.reachable===!1?`var(--destructive)`:e.kind===`device`?`var(--muted-foreground)`:`var(--border)`}function Nne({topo:e,onOnboard:t}){let[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)({x:0,y:0,k:1}),[f,p]=(0,v.useState)(!1),m=(0,v.useRef)(null),h=(0,v.useRef)(null),g=(0,v.useMemo)(()=>e.nodes.filter(e=>e.kind===`device`),[e.nodes]),_=(0,v.useMemo)(()=>e.nodes.filter(e=>e.kind===`neighbor`),[e.nodes]),y=(0,v.useMemo)(()=>{let t=new Map,n=new Set(_.map(e=>e.id));for(let r of e.edges)n.has(r.to)&&!t.has(r.to)&&t.set(r.to,r.from);return t},[e.edges,_]),{pos:b,rInner:x,rOuter:S}=(0,v.useMemo)(()=>Ane(g,_,y),[g,_,y]),C=(0,v.useMemo)(()=>new Map(e.nodes.map(e=>[e.id,e])),[e.nodes]),w=n?C.get(n):null,T=(0,v.useMemo)(()=>{let t=new Map,n=(e,n)=>{t.has(e)||t.set(e,new Set([e])),t.get(e).add(n)};for(let e of g)n(e.id,R9),n(R9,e.id);for(let t of e.edges)n(t.from,t.to),n(t.to,t.from);return t},[e.edges,g]),E=o.trim().toLowerCase(),D=(0,v.useCallback)(e=>c&&!e.onboardable?!1:E?[e.label,e.id,e.ip,e.mac,e.board,e.identity].filter(e=>!!e).some(e=>e.toLowerCase().includes(E)):!0,[E,c]),O=i?T.get(i):null,k=e=>{if(O)return!O.has(e);if(e===` hub`)return!1;let t=C.get(e);return t?!D(t):!1},A=e=>{let t=h.current?.getBoundingClientRect();if(!t)return;let n=(e.clientX-t.left)/t.width*900,r=(e.clientY-t.top)/t.height*620;d(t=>{let i=Math.min(3,Math.max(.5,t.k*(e.deltaY<0?1.12:1/1.12))),a=i/t.k;return{k:i,x:n-(n-t.x)*a,y:r-(r-t.y)*a}})},j=e=>{m.current={px:e.clientX,py:e.clientY,ox:u.x,oy:u.y},p(!0)},M=e=>{let t=m.current,n=h.current?.getBoundingClientRect();if(!t||!n)return;let r=900/n.width*(e.clientX-t.px),i=620/n.height*(e.clientY-t.py);d(e=>({...e,x:t.ox+r,y:t.oy+i}))},N=()=>{m.current=null,p(!1)},P=e=>d(t=>{let n=Math.min(3,Math.max(.5,t.k*e)),r=n/t.k;return{k:n,x:450-(450-t.x)*r,y:310-(310-t.y)*r}}),F=g.map(e=>({from:R9,to:e.id,interface:void 0}));return(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,W.jsxs)(`div`,{className:`relative min-w-[200px] flex-1`,children:[(0,W.jsx)(ol,{className:`text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2`}),(0,W.jsx)(Kx,{className:`pl-8`,type:`search`,placeholder:`Filter by name, identity, IP, MAC or board…`,value:o,onChange:e=>s(e.target.value)})]}),(0,W.jsxs)(X,{size:`sm`,ghost:!0,type:c?`accent`:`default`,onClick:()=>l(e=>!e),title:`Dim everything except neighbours that can be onboarded`,icon:(0,W.jsx)(el,{}),children:[`Onboardable`,e.stats.onboardable>0?` (${e.stats.onboardable})`:``]}),(0,W.jsx)(L9,{orientation:`vertical`,className:`h-6`}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>P(1/1.25),"aria-label":`Zoom out`,icon:(0,W.jsx)(qc,{})}),(0,W.jsxs)(`span`,{className:`text-muted-foreground w-11 text-center font-mono text-[11px] tabular-nums`,children:[Math.round(u.k*100),`%`]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>P(1.25),"aria-label":`Zoom in`,icon:(0,W.jsx)($c,{})}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>d({x:0,y:0,k:1}),title:`Reset view`,icon:(0,W.jsx)(Vc,{}),children:`Reset`})]}),(0,W.jsxs)(`div`,{className:`bg-card relative overflow-hidden rounded-xl border`,children:[(0,W.jsxs)(`svg`,{ref:h,viewBox:`0 0 900 620`,width:`100%`,height:560,preserveAspectRatio:`xMidYMid meet`,className:q(`block w-full touch-none select-none`,f?`cursor-grabbing`:`cursor-grab`),onWheel:A,onPointerDown:j,onPointerMove:M,onPointerUp:N,onPointerLeave:N,onClick:()=>r(null),style:{background:`radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--brand) 7%, transparent), transparent 62%)`},children:[(0,W.jsxs)(`defs`,{children:[(0,W.jsxs)(`linearGradient`,{id:`topo-beam`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--brand)`,stopOpacity:`0.3`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--brand)`,stopOpacity:`0`})]}),(0,W.jsxs)(`radialGradient`,{id:`topo-hub`,cx:`0.5`,cy:`0.35`,r:`0.75`,children:[(0,W.jsx)(`stop`,{offset:`0`,stopColor:`var(--foreground)`}),(0,W.jsx)(`stop`,{offset:`1`,stopColor:`var(--muted-foreground)`})]})]}),(0,W.jsxs)(`g`,{transform:`translate(${u.x},${u.y}) scale(${u.k})`,children:[(0,W.jsx)(`g`,{className:`topo-ring`,children:[x,S,S+62].map(e=>(0,W.jsx)(`circle`,{cx:450,cy:310,r:e,fill:`none`,className:`stroke-border/70`,strokeDasharray:`2 8`},e))}),(0,W.jsx)(`g`,{className:`topo-sweep`,style:{transformOrigin:`450px 310px`},children:(0,W.jsx)(`path`,{d:jne(S+62),fill:`url(#topo-beam)`})}),[...F,...e.edges].map((t,n)=>{let r=b.get(t.from),i=b.get(t.to);if(!r||!i)return null;let a=C.get(t.to)?.kind===`neighbor`,o=k(t.from)||k(t.to),s=-(i.y-r.y),c=i.x-r.x,l=Math.hypot(s,c)||1,u=a?16:8,d=(r.x+i.x)/2+s/l*u,f=(r.y+i.y)/2+c/l*u;return(0,W.jsx)(`path`,{d:`M ${r.x} ${r.y} Q ${d} ${f} ${i.x} ${i.y}`,fill:`none`,strokeWidth:a?1.2:1.6,strokeDasharray:a?`4 4`:`6 10`,className:q(`transition-opacity`,a?`stroke-brand/55`:`topo-flow stroke-chart-2/70`,o&&`opacity-15`),children:(0,W.jsxs)(`title`,{children:[t.from===` hub`?e.server:t.from,` → `,t.to,t.interface?` (${t.interface})`:``]})},`e-${n}`)}),(0,W.jsxs)(`g`,{className:q(`transition-opacity`,O&&!O.has(` hub`)&&`opacity-15`),onMouseEnter:()=>a(R9),onMouseLeave:()=>a(null),children:[(0,W.jsx)(`circle`,{cx:450,cy:310,r:40,className:`fill-brand/15`}),(0,W.jsx)(`circle`,{cx:450,cy:310,r:27,fill:`url(#topo-hub)`,className:`stroke-border`}),(0,W.jsx)(sl,{x:441,y:295,width:18,height:18,className:`stroke-background pointer-events-none`}),(0,W.jsx)(`text`,{x:450,y:326,textAnchor:`middle`,className:`fill-background pointer-events-none font-mono text-[8px] font-bold`,children:`MCP`}),(0,W.jsx)(`text`,{x:450,y:368,textAnchor:`middle`,className:`fill-muted-foreground pointer-events-none font-mono text-[10px]`,children:e.server})]}),e.nodes.map(e=>{let t=b.get(e.id);if(!t)return null;let i=e.kind===`device`,o=n===e.id,s=k(e.id),c=Mne(e),l=i?26:15;return(0,W.jsxs)(`g`,{transform:`translate(${t.x},${t.y})`,className:q(`cursor-pointer transition-opacity`,s&&`opacity-15`),onMouseEnter:()=>a(e.id),onMouseLeave:()=>a(null),onClick:t=>{t.stopPropagation(),r(t=>t===e.id?null:e.id)},children:[o&&(0,W.jsx)(`circle`,{r:l+8,className:`topo-halo stroke-brand fill-none`,strokeWidth:2}),i?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{r:l+7,className:`stroke-border/60 fill-none`,strokeWidth:3}),(0,W.jsx)(`circle`,{r:l+7,fill:`none`,strokeWidth:3,strokeLinecap:`round`,transform:`rotate(-90)`,style:{stroke:V9(e.cpuLoad)},strokeDasharray:B9(l+7,e.cpuLoad)}),(0,W.jsx)(`circle`,{r:l+2,className:`stroke-border/40 fill-none`,strokeWidth:2}),(0,W.jsx)(`circle`,{r:l+2,fill:`none`,strokeWidth:2,strokeLinecap:`round`,transform:`rotate(-90)`,style:{stroke:V9(e.memUsedPct)},strokeDasharray:B9(l+2,e.memUsedPct)}),(0,W.jsx)(`circle`,{r:l-4,className:`fill-muted`,style:{stroke:c},strokeWidth:1.6}),(0,W.jsx)(`text`,{textAnchor:`middle`,y:3,className:`fill-foreground pointer-events-none font-mono text-[9px] font-bold`,children:(e.label||e.id).slice(0,4).toUpperCase()})]}):(0,W.jsxs)(W.Fragment,{children:[e.onboardable&&(0,W.jsx)(`circle`,{r:l+5,className:`topo-pulse fill-brand/25`}),(0,W.jsx)(`rect`,{x:-l*.72,y:-l*.72,width:l*1.44,height:l*1.44,rx:3,transform:`rotate(45)`,className:`fill-card`,style:{stroke:c},strokeWidth:1.4,strokeDasharray:e.onboardable?`3 2`:void 0}),e.onboardable&&(0,W.jsx)($c,{x:-5,y:-5,width:10,height:10,className:`stroke-brand pointer-events-none`})]}),(0,W.jsx)(`text`,{textAnchor:`middle`,y:l+(i?22:18),className:`fill-foreground pointer-events-none font-mono text-[10px]`,children:(e.label||e.id).slice(0,18)}),i&&(0,W.jsx)(`text`,{textAnchor:`middle`,y:l+34,className:`fill-muted-foreground pointer-events-none font-mono text-[9px]`,children:e.ip||e.board||``})]},e.id)})]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground pointer-events-none absolute top-3 left-3 flex flex-col gap-1 font-mono text-[10px]`,children:[(0,W.jsx)(`span`,{className:`text-foreground text-[11px] font-semibold`,children:`Layer-2 fabric`}),(0,W.jsxs)(`span`,{children:[e.stats.devices,` managed · `,e.stats.neighbors,` discovered`]}),e.stats.onboardable>0&&(0,W.jsxs)(`span`,{className:`text-brand`,children:[e.stats.onboardable,` awaiting onboard`]})]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground pointer-events-none absolute right-3 bottom-3 flex flex-col items-end gap-1 font-mono text-[10px]`,children:[(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-chart-2 inline-block size-2 rounded-full`}),` online`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-destructive inline-block size-2 rounded-full`}),` offline`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`border-border inline-block size-2 rotate-45 border`}),` neighbour`]}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,W.jsx)(`i`,{className:`bg-brand/40 inline-block size-2 rounded-full`}),` onboardable`]})]})]}),w&&(0,W.jsx)(Pne,{node:w,onClose:()=>r(null),onOnboard:t})]})}function Pne({node:e,onClose:t,onOnboard:n}){let r=e.suggestedConfig?JSON.stringify({[e.suggestedConfig.name]:H9(e.suggestedConfig)},null,2):null,i=[[`identity`,e.identity],[`address`,e.ip],[`mac`,e.mac],[`board`,e.board],[`platform`,e.platform],[`version`,e.version],[`uptime`,e.uptime]].filter(e=>!!e[1]);return(0,W.jsxs)(`div`,{className:`bg-card rounded-xl border p-4`,children:[(0,W.jsxs)(`div`,{className:`mb-2 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(`strong`,{className:`font-mono text-sm`,children:e.label||e.id}),(0,W.jsx)(Ex,{variant:e.kind===`device`?`secondary`:`outline`,children:e.kind}),e.onboardable&&(0,W.jsx)(Ex,{className:`bg-brand text-brand-foreground`,children:`onboardable`}),e.reachable===!1&&(0,W.jsx)(Ex,{variant:`destructive`,children:`offline`}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(X,{ghost:!0,size:`sm`,icon:(0,W.jsx)(_l,{}),onClick:t,"aria-label":`Close`})]}),(0,W.jsx)(`div`,{className:`text-muted-foreground grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 font-mono text-[11px]`,children:i.length===0?(0,W.jsx)(`span`,{children:`no details advertised`}):i.map(([e,t])=>(0,W.jsxs)(v.Fragment,{children:[(0,W.jsx)(`span`,{children:e}),(0,W.jsx)(`span`,{className:`text-foreground break-all`,children:t})]},e))}),e.kind===`device`&&(e.cpuLoad!=null||e.memUsedPct!=null)&&(0,W.jsxs)(`div`,{className:`mt-3 flex gap-4 font-mono text-[11px]`,children:[e.cpuLoad!=null&&(0,W.jsxs)(`span`,{style:{color:V9(e.cpuLoad)},children:[`cpu `,e.cpuLoad,`%`]}),e.memUsedPct!=null&&(0,W.jsxs)(`span`,{style:{color:V9(e.memUsedPct)},children:[`mem `,e.memUsedPct,`%`]})]}),r&&e.suggestedConfig&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(L9,{className:`my-3`}),(0,W.jsx)(`p`,{className:`text-muted-foreground mb-1.5 text-[11px]`,children:`Not managed yet — add this to your device config to onboard it:`}),(0,W.jsx)(`pre`,{className:`bg-background text-foreground m-0 mb-2 overflow-x-auto rounded-md border px-2.5 py-2 font-mono text-[11px]/[1.5] whitespace-pre`,children:r}),(0,W.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,W.jsx)(ux,{title:`Copy config stub`,label:`Copy config stub`,text:r}),n&&(0,W.jsx)(X,{type:`accent`,size:`sm`,onClick:()=>n(e.suggestedConfig.name,H9(e.suggestedConfig)),children:`Add to config →`})]})]})]})}function H9(e){let t={port:e.port,username:e.username};return e.host&&(t.host=e.host),e.mac&&(t.mac=e.mac),t}function U9(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${Math.round(e)}ms`}function Fne(e){return!e||!e.pooled?`var(--muted-foreground)`:e.dead?`var(--destructive)`:e.inflight>0?`var(--chart-1)`:`var(--success)`}function Ine(e){return!e||!e.pooled?`no connection`:e.dead?`reconnecting`:e.inflight>0?`${e.inflight} inflight`:`ready`}function Lne({device:e}){let t=e.pool,n=!t||!t.pooled?`border-dashed opacity-60`:t.dead?`border-destructive/50`:t.inflight>0?`border-chart-1/50`:`border-success/35`,r=!!t&&t.pooled&&t.inflight>0,i=Fne(t),a=!t||!t.pooled?0:t.inflight>0?Math.min(8+t.inflight*15,100):100;return(0,W.jsxs)(`div`,{className:q(`bg-card rounded-lg border px-3 py-2.5 transition-colors hover:border-muted-foreground/40`,n),children:[(0,W.jsxs)(`div`,{className:`mb-1.5 flex items-center gap-1.5`,children:[(0,W.jsx)(`span`,{className:`size-[7px] shrink-0 rounded-full`,style:{background:i}}),(0,W.jsx)(`span`,{className:`text-foreground overflow-hidden text-xs font-semibold text-ellipsis whitespace-nowrap`,children:e.name}),(0,W.jsx)(`span`,{className:`ml-auto text-[10px] font-semibold tracking-[0.04em] uppercase`,style:{color:i},children:Ine(t)})]}),(0,W.jsxs)(`div`,{className:`bg-muted relative h-1.5 overflow-hidden rounded-[3px]`,children:[(0,W.jsx)(`div`,{className:q(`h-full rounded-[3px] opacity-65 transition-[width] duration-[400ms]`,r&&`animate-pulse`),style:{width:`${a}%`,background:i}}),t&&t.pooled&&t.inflight>0&&(0,W.jsxs)(`span`,{className:`text-foreground absolute -top-px right-1 text-[8px] leading-[8px] font-bold [text-shadow:0_0_3px_rgba(0,0,0,0.6)]`,children:[t.inflight,` ch`]})]})]})}function W9({k:e,v:t,sub:n}){return(0,W.jsx)(cx,{k:e,v:t,sub:n,cls:`min-w-[100px]`})}function Rne({devices:e,poolPayload:t}){let n=e.filter(e=>e.pool!==null&&e.pool!==void 0);if(!(t?.enabled??n.length>0)&&n.length===0)return(0,W.jsxs)(`details`,{className:`my-3`,open:!0,children:[(0,W.jsx)(`summary`,{className:`mb-2 cursor-pointer font-semibold`,children:`SSH Connection Pool`}),(0,W.jsxs)(`p`,{className:`text-muted-foreground my-1 text-[13px]`,children:[`Connection pooling is disabled. Enable it with`,` `,(0,W.jsx)(`code`,{className:`text-chart-1 text-xs`,children:`--ssh-keep-alive true`}),` or`,` `,(0,W.jsx)(`code`,{className:`text-chart-1 text-xs`,children:`MIKROTIK_SSH__KEEP_ALIVE=true`}),` to keep persistent SSH connections across tool calls.`]})]});let r=t?.aggregate,i=t?.config;return(0,W.jsxs)(`details`,{className:`my-3`,open:!0,children:[(0,W.jsx)(`summary`,{className:`mb-2 cursor-pointer font-semibold`,children:`SSH Connection Pool`}),r&&(0,W.jsxs)(`div`,{className:`mb-3 flex flex-wrap gap-2`,children:[(0,W.jsx)(W9,{k:`Connections`,v:String(r.totalConnections)}),(0,W.jsx)(W9,{k:`Inflight`,v:String(r.totalInflight),sub:`channels`}),(0,W.jsx)(W9,{k:`Idle`,v:String(r.totalIdle)}),(0,W.jsx)(W9,{k:`Busy`,v:String(r.totalBusy)}),i&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(W9,{k:`Keepalive`,v:U9(i.keepAliveInterval)}),(0,W.jsx)(W9,{k:`Idle timeout`,v:U9(i.idleTimeout)})]})]}),n.length>0&&(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-2`,children:n.map(e=>(0,W.jsx)(Lne,{device:e},e.name))})]})}zi.registerPlugin(ic);function G9(e,t,n){let r=URL.createObjectURL(new Blob([t],{type:`${n};charset=utf-8`})),i=document.createElement(`a`);i.href=r,i.download=e,document.body.append(i),i.click(),i.remove(),URL.revokeObjectURL(r)}var K9=[{id:`overview`,label:`Overview`,sub:`Calls, latency & risk at a glance`},{id:`devices`,label:`Devices`,sub:`Connectivity radar & system health`},{id:`clients`,label:`Clients`,sub:`Connected LAN devices — usage, block/allow, pin IP`},{id:`aaa`,label:`RADIUS & UM`,sub:`RADIUS client & User Manager RADIUS server`},{id:`topology`,label:`Topology`,sub:`Layer-2 neighbours via MNDP / CDP / LLDP`},{id:`packets`,label:`Packets`,sub:`Live TZSP capture & decode`},{id:`snapshots`,label:`Snapshots`,sub:`Config history & time-travel diff`},{id:`drift`,label:`Drift Guard`,sub:`Golden config baselines & live drift detection`},{id:`plan`,label:`Change Plan`,sub:`Dry-run intended RouterOS commands`},{id:`s3`,label:`S3 Backups`,sub:`List, download & delete S3 backup objects`},{id:`backups`,label:`Backups`,sub:`Local config vault — create, restore, manage`},{id:`modules`,label:`Modules`,sub:`Enable/disable tool modules — curate the surface`},{id:`config`,label:`Config`,sub:`Effective configuration & safe editor`},{id:`memory`,label:`Memory`,sub:`Knowledge graph — entities, relations & observations`},{id:`releases`,label:`Releases`,sub:`Update, downgrade & read every version's notes`},{id:`capsman`,label:`CAPsMAN`,sub:`Wi-Fi fabric: coverage, weak signal, load, FT & HA`},{id:`feed`,label:`Live Feed`,sub:`Every tool call, in real time`}],q9=new Set(K9.map(e=>e.id)),J9=`mt-view`;function Y9(){try{let e=location.hash.replace(/^#\/?/,``);return q9.has(e)?e:null}catch{return null}}function zne(){let e=Y9();if(e)return e;try{let e=localStorage.getItem(J9);if(e&&q9.has(e))return e}catch{}return`overview`}var X9=[`var(--foreground)`,`var(--muted-foreground)`],Z9={overview:X9,devices:X9,clients:X9,aaa:X9,topology:X9,packets:X9,snapshots:X9,drift:X9,plan:X9,s3:X9,backups:X9,modules:X9,config:X9,memory:X9,releases:X9,capsman:X9,feed:X9},Bne={overview:{what:`A live pulse of all MCP tool activity: total calls, error rate, p50/p95 latency, the busiest tools, and a risk breakdown — over a time window you choose.`,tips:[`Change the time window (top-right) to zoom from the last 5 minutes out to 24 hours.`,`The risk donut splits calls by annotation: read · write · destructive · dangerous.`,`A rising error line usually points at one device or one tool — jump to Live Feed to see which.`]},devices:{what:`Every configured router with its live reachability (SSH or MAC-Telnet), latency, identity, and system health — CPU, memory and disk — refreshed continuously.`,tips:[`Each device gets a stable colour so you can track it across the connectivity radar.`,`Health (CPU/Mem/Disk) is probed periodically; MAC-Telnet devices are probed on a slower cadence.`,`Latency tiers are colour-coded green → amber → red; a grey node is currently unreachable.`,`The SSH Connection Pool panel shows persistent connections: green = idle/ready, blue = busy with inflight channels, red = reconnecting.`]},clients:{what:`The LAN devices connected to a router — merged from its DHCP leases and ARP table — with live Download/Upload charts, and one-click controls to block/allow a device, pin (reserve) its IP, change that IP, or relabel it.`,tips:[`Pick the router (top-right) to inspect its connected devices; filter by IP, MAC or name.`,`Click a device to open its live ↓/↑ traffic chart — needs a simple queue targeting its IP.`,`Block/allow is enforced by MAC, so it survives the device changing IP; “Pin IP” makes its lease static.`]},aaa:{what:"Full management of the router's RADIUS client (`/radius`) and the built-in User Manager RADIUS server (`/user-manager`): RADIUS servers + incoming CoA, and User Manager users, service profiles, rate/quota limitations, NAS clients, profile assignments, accounting sessions, and global settings.",tips:[`Pick the router (top-right), then switch tabs across RADIUS, Users, Profiles, Limitations, NAS, Assignments, Sessions and Settings.`,`Every tab is full CRUD: add, edit, enable/disable and remove — secrets are write-only and shown redacted.`,`The Usage & Heatmap tab shows each user's 3-month download/upload and a GitHub-style connection heatmap, persisted locally.`,`If a device lacks the user-manager package, the User Manager tabs explain how to install it; RADIUS-client tabs still work.`]},topology:{what:`A Layer-2 map of neighbours each router discovers via MNDP / CDP / LLDP — the physical adjacency of your network, drawn live.`,tips:[`Solid nodes are configured devices; faint nodes are discovered-but-unmanaged neighbours.`,`Use “Add to config →” on an unmanaged neighbour to pre-fill it in the Config editor.`,`Drag to pan; the layout settles automatically as new neighbours arrive.`]},packets:{what:`Live packet capture streamed from a router over TZSP — decode headers in real time without leaving the dashboard.`,tips:[`Pick a device and start the capture; packets decode as they arrive.`,`Stop the capture when done — it frees the router-side sniffer.`,`Great for debugging a protocol issue alongside the Live Feed of tool calls.`]},snapshots:{what:`Point-in-time captures of a device’s full configuration (/export), stored locally so you can diff any two and see exactly what changed.`,tips:[`Capture a snapshot before a risky change, then diff after to audit the delta.`,`The diff is line-level: green added, red removed.`,`Snapshots are device config exports — for the dashboard’s OWN config history see the Config page.`]},drift:{what:`Detect when router configs drift from their golden baseline — with change attribution and one-click reconciliation.`,tips:[`Set a baseline via MCP tools (config_set_baseline) or the Baseline Manager below.`,`Click a device card to run a live drift check against its golden config.`,`Promote accepted changes as the new baseline, or reconcile to roll back.`]},plan:{what:`Dry-run the exact RouterOS commands a change would run before it touches a device — a change plan you can review and trust.`,tips:[`Paste or build intended commands to see them validated and ordered.`,`Nothing is sent to the device from here — it’s a preview.`,`Pair with Safe Mode (auto-revert) when you do apply for real.`]},s3:{what:`Browse, download, and delete backup objects in your configured S3-compatible bucket — your off-box archive of device backups and exports.`,tips:[`Filter by key prefix to find a device’s backups quickly.`,`Download fetches the object through a presigned URL; delete is permanent.`,`For host-side .rsc backups instead, use the Backups page.`]},backups:{what:`A local config vault on the MCP server: capture a device’s /export as a timestamped .rsc file, then download, upload, rename, restore (via Safe Mode), or delete it.`,tips:[`Restore offers a dry-run (applies then rolls back) before you commit for real.`,`Edit the vault path inline in the header — it’s saved to your config.`,`Filenames are stamped in the device’s local 24-hour clock.`]},modules:{what:"Every tool module in the catalog with a live on/off switch. Toggling one writes your config file's `tools` block (disabledModules / enabledModules) and applies it immediately, so you can curate exactly which scopes the MCP server exposes.",tips:[`MCP clients search-rank tools and degrade past ~100; trim the surface below ~150–200 tools so every remaining tool is reliably findable.`,`Disable adds the module to tools.disabledModules; enable removes it (or adds it to an active allow-list) — your config file is updated live on each toggle.`,`Changes need an MCP client reconnect (or a server restart) to actually shrink/grow the visible tool list.`]},config:{what:`View the effective configuration, edit it safely with schema-aware validation and auto-rollback, browse a full field guide, and travel through config version history.`,tips:[`Every successful apply is auto-saved to the version timeline — restore any point in time.`,`Save a named checkpoint before a big change for an easy, labelled rollback.`,`The Field Guide documents every config option, its type, and default — straight from the schema.`]},memory:{what:`A persistent knowledge graph the AI builds across sessions — entities (routers, subnets, users), relations between them, and free-text observations.`,tips:[`Entities are created by the AI via MCP tools — you can browse and delete them here.`,`The graph visualization shows entities as circles and relations as directed edges; click a node to inspect it.`,`Change the database path to switch between different knowledge bases.`]},releases:{what:`Every published version of the server on a timeline, with its release notes. Upgrade to the latest, or install any specific version to upgrade or downgrade.`,tips:[`The green dot marks the version you're running now; the brand dot marks the latest.`,"Install runs `bun i -g @usex/mikrotik-mcp@<version>` on the server, then it self-restarts onto that version (the connection drops briefly).",`Click a version to expand its release notes; the latest is expanded by default.`]},capsman:{what:`The CAPsMAN Wi-Fi fabric for this controller: managed APs grouped by floor with per-radio health (client load, CPU, co-channel conflicts), weak-signal clients with the recommended neighbor AP to steer toward, and a roaming (802.11r FT) + HA redundancy audit.`,tips:[`Radio cards are colored by health; a red 'co-ch' badge means an adjacent radio shares its channel — the proposed channel is shown as →N.`,`Floors come from the AP identity/comment tag (e.g. AP-F3-E); unfloored APs are grouped by inferred signal adjacency.`,`This page is read-only in this release — steering, channel-plan apply, FT enable and HA setup arrive in later phases.`]},feed:{what:`Every tool call as it happens — tool, device, risk, duration, and success/error — with full request/response detail on click.`,tips:[`Filter by status to isolate failures, or by tool/device to follow one thread.`,`Click any row to open the full (secret-redacted) request and response.`,`Pause the stream when you want to inspect without rows shifting under you.`]}};function Q9({icon:e,title:t,sub:n,body:r,className:i}){return(0,W.jsxs)(`div`,{className:q(`text-muted-foreground flex flex-col items-center gap-2 rounded-lg border border-dashed px-6 py-14 text-center`,i),children:[e,(0,W.jsx)(`p`,{className:`text-foreground text-sm font-medium`,children:t}),n!=null&&(0,W.jsx)(`p`,{className:`max-w-md text-xs`,children:n}),r]})}function Vne({view:e}){let t=Bne[e];return(0,W.jsxs)(`div`,{className:`bg-card reveal flex gap-3 rounded-lg border p-4`,role:`region`,"aria-label":`Page help`,children:[(0,W.jsx)(Rc,{className:`text-brand mt-0.5 size-4 shrink-0`,"aria-hidden":`true`}),(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,W.jsx)(`p`,{className:`text-sm`,children:t.what}),(0,W.jsx)(`ul`,{className:`text-muted-foreground list-disc space-y-1 pl-4 text-xs`,children:t.tips.map((e,t)=>(0,W.jsx)(`li`,{children:e},t))})]})]})}function Hne(){return(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,className:`size-3.5`,children:(0,W.jsxs)(`g`,{stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,W.jsx)(`path`,{d:`M21 12a9 9 0 1 1-2.64-6.36`}),(0,W.jsx)(`path`,{d:`M21 3v6h-6`})]})})}function Une(){let[e,t]=(0,v.useState)(!1);async function n(e){t(!0);let n=J.loading(e?`Restarting server…`:`Reloading config…`);try{let t=await _c(`/api/reload`,{hard:e});t?.ok?e?J.success(`Restarting — reconnect shortly`,{id:n,description:t.note}):J.success(`Config reloaded · ${t.count??`?`} device${t.count===1?``:`s`}`,{id:n}):J.error(t?.error??(e?`Restart failed`:`Reload failed`),{id:n})}catch{J.error(`${e?`Restart`:`Reload`} failed (server unreachable)`,{id:n})}finally{t(!1)}}return(0,W.jsxs)(`div`,{className:`inline-flex w-fit -space-x-px`,role:`group`,"aria-label":`Reload server`,children:[(0,W.jsxs)(vb,{variant:`outline`,size:`sm`,disabled:e,onClick:()=>void n(!1),title:`Re-read the config from disk and apply it live (no downtime)`,className:`rounded-r-none focus-visible:z-10`,children:[(0,W.jsx)(Hne,{}),`Reload Server`]}),(0,W.jsxs)(yb,{children:[(0,W.jsx)(bb,{asChild:!0,children:(0,W.jsx)(vb,{variant:`outline`,size:`sm`,disabled:e,title:`Fully restart the server process (relaunches itself, drops the connection briefly)`,className:`rounded-l-none px-2 focus-visible:z-10`,children:`Restart`})}),(0,W.jsxs)(xb,{children:[(0,W.jsxs)(Sb,{children:[(0,W.jsx)(wb,{children:`Restart the MCP server?`}),(0,W.jsxs)(Tb,{children:[`The server relaunches itself and rebinds the same port(s) in ~1.5s — no external supervisor needed. The current connection drops briefly; reconnect after. To pick up a newly added device without downtime, use `,(0,W.jsx)(`b`,{children:`Reload Server`}),` instead.`]})]}),(0,W.jsxs)(Cb,{children:[(0,W.jsx)(Db,{children:`Cancel`}),(0,W.jsx)(Eb,{className:_b({variant:`destructive`}),onClick:()=>void n(!0),children:`Restart`})]})]})]})]})}function Wne({name:e}){return(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.7`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:{overview:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`3`,width:`8`,height:`8`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`13`,y:`3`,width:`8`,height:`5`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`13`,y:`10`,width:`8`,height:`11`,rx:`1.6`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`8`,height:`8`,rx:`1.6`})]}),devices:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`7`,rx:`2`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`18`,height:`7`,rx:`2`}),(0,W.jsx)(`path`,{d:`M7 7.5h.01M7 16.5h.01`})]}),clients:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`9`,cy:`8`,r:`3`}),(0,W.jsx)(`path`,{d:`M3.5 19a5.5 5.5 0 0 1 11 0`}),(0,W.jsx)(`path`,{d:`M16 7.5a2.5 2.5 0 0 1 0 5M17.5 19a4.5 4.5 0 0 0-2-3.6`})]}),aaa:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3 4 6v5c0 4.4 3.2 7.6 8 9 4.8-1.4 8-4.6 8-9V6l-8-3Z`}),(0,W.jsx)(`path`,{d:`M9.5 11.5 11 13l3.5-3.5`})]}),topology:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`12`,cy:`5`,r:`2.4`}),(0,W.jsx)(`circle`,{cx:`5`,cy:`19`,r:`2.4`}),(0,W.jsx)(`circle`,{cx:`19`,cy:`19`,r:`2.4`}),(0,W.jsx)(`path`,{d:`M12 7.4 6.4 16.6M12 7.4 17.6 16.6`})]}),packets:(0,W.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`}),snapshots:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3 3 7.5 12 12 21 7.5 12 3Z`}),(0,W.jsx)(`path`,{d:`M3 12 12 16.5 21 12`}),(0,W.jsx)(`path`,{d:`M3 16.5 12 21 21 16.5`})]}),drift:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 22c5.5 0 10-4.5 10-10S17.5 2 12 2 2 6.5 2 12s4.5 10 10 10Z`}),(0,W.jsx)(`path`,{d:`M9 12l2 2 4-4`}),(0,W.jsx)(`path`,{d:`M12 6v2M12 16v2M6 12h2M16 12h2`})]}),plan:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`6`,cy:`6`,r:`2.3`}),(0,W.jsx)(`circle`,{cx:`6`,cy:`18`,r:`2.3`}),(0,W.jsx)(`circle`,{cx:`18`,cy:`8`,r:`2.3`}),(0,W.jsx)(`path`,{d:`M6 8.3v7.4M8.3 6H13a3 3 0 0 1 3 3v0`})]}),s3:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`ellipse`,{cx:`12`,cy:`6`,rx:`7`,ry:`2.6`}),(0,W.jsx)(`path`,{d:`M5 6v12c0 1.5 3.1 2.6 7 2.6s7-1.1 7-2.6V6`}),(0,W.jsx)(`path`,{d:`M5 12c0 1.5 3.1 2.6 7 2.6s7-1.1 7-2.6`})]}),backups:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M3 6.5 5 3.5h14l2 3`}),(0,W.jsx)(`rect`,{x:`3`,y:`6.5`,width:`18`,height:`14`,rx:`2`}),(0,W.jsx)(`path`,{d:`M9.5 12h5`})]}),modules:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`rect`,{x:`3`,y:`5`,width:`18`,height:`6`,rx:`3`}),(0,W.jsx)(`circle`,{cx:`8`,cy:`8`,r:`1.5`}),(0,W.jsx)(`rect`,{x:`3`,y:`13`,width:`18`,height:`6`,rx:`3`}),(0,W.jsx)(`circle`,{cx:`16`,cy:`16`,r:`1.5`})]}),config:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M4 7h8M16 7h4M4 17h4M12 17h8`}),(0,W.jsx)(`circle`,{cx:`14`,cy:`7`,r:`2.2`}),(0,W.jsx)(`circle`,{cx:`10`,cy:`17`,r:`2.2`})]}),memory:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`circle`,{cx:`12`,cy:`6`,r:`2`}),(0,W.jsx)(`circle`,{cx:`6`,cy:`14`,r:`2`}),(0,W.jsx)(`circle`,{cx:`18`,cy:`14`,r:`2`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`20`,r:`2`}),(0,W.jsx)(`path`,{d:`M12 8v-0.5M12 8 7.2 12.5M12 8 16.8 12.5M6 16 10.5 18.5M18 16 13.5 18.5`})]}),releases:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M12 3v12`}),(0,W.jsx)(`path`,{d:`M8 11l4 4 4-4`}),(0,W.jsx)(`path`,{d:`M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2`})]}),capsman:(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`path`,{d:`M5 12a7 7 0 0 1 14 0`}),(0,W.jsx)(`path`,{d:`M8.5 12a3.5 3.5 0 0 1 7 0`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`12`,r:`1.4`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`path`,{d:`M12 13.4V20`})]}),feed:(0,W.jsx)(`path`,{d:`M4 6h16M4 12h16M4 18h10`})}[e]})}function Gne(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(null),c=gne(n?.version),[l,u]=(0,v.useState)(null),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(!1),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)([]),[b,x]=(0,v.useState)(36e5),S=Number(d?.dashboard?.feedLimit)||200,C=(0,v.useCallback)(async e=>{if(!d)return;let t={...d.dashboard,feedLimit:e};await _c(`/api/config`,{config:{...d,dashboard:t},rollbackMs:0}).catch(()=>J.error(`Could not save the feed limit`)),await gc(`/api/config`).then(f).catch(()=>{})},[d]),[w,T]=(0,v.useState)(!1),[E,D]=(0,v.useState)(`off`),[O,k]=(0,v.useState)(null),[A,j]=(0,v.useState)(()=>new Set),[M,N]=(0,v.useState)({}),[P,F]=(0,v.useState)({tool:``,risk:``,device:``,status:``,q:``}),I=(0,v.useRef)(w);I.current=w;let L=(0,v.useRef)(null);zte(L);let[R,ee]=(0,v.useState)(zne),te=(0,v.useCallback)(e=>{ee(e);try{Y9()!==e&&(location.hash=e),localStorage.setItem(J9,e)}catch{}},[]);(0,v.useEffect)(()=>{if(Y9()!==R)try{location.hash=R}catch{}let e=()=>{let e=Y9();e&&te(e)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let[z,B]=(0,v.useState)(()=>{try{let e=localStorage.getItem(`mt-help-open`);return new Set(e?JSON.parse(e):[])}catch{return new Set}}),V=e=>B(t=>{let n=new Set(t);n.has(e)?n.delete(e):n.add(e);try{localStorage.setItem(`mt-help-open`,JSON.stringify([...n]))}catch{}return n}),[ne,re]=(0,v.useState)(``),[ie,ae]=(0,v.useState)(`all`),oe=(0,v.useMemo)(()=>{let e=i?.devices??[];return{online:e.filter(e=>e.status.reachable===!0).length,offline:e.filter(e=>e.status.reachable===!1).length,total:e.length}},[i]),se=(0,v.useMemo)(()=>{let e=i?.devices??[],t=ne.trim().toLowerCase();return e.filter(e=>!(ie===`online`&&e.status.reachable!==!0||ie===`offline`&&e.status.reachable!==!1||t&&!e.name.toLowerCase().includes(t)&&!(e.address??e.host??``).toLowerCase().includes(t)))},[i,ne,ie]);Rte((0,v.useCallback)(e=>{if(I.current)return;y(t=>[e,...t].slice(0,xx));let t=e.device;t&&N(e=>({...e,[t]:(e[t]??0)+1}))},[]),(0,v.useCallback)(e=>D(e),[]));let H=(0,v.useCallback)(()=>{I.current||gc(`/api/events?limit=${xx}`).then(e=>y(e.events)).catch(()=>{})},[]);(0,v.useEffect)(()=>{H()},[H]),(0,v.useEffect)(()=>{let e=()=>{document.visibilityState===`visible`&&H()};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[H]);let ce=(0,v.useCallback)(()=>{gc(`/api/stats?window=${b}&buckets=60`).then(t).catch(()=>{})},[b]);(0,v.useEffect)(()=>{ce();let e=()=>{ce(),gc(`/api/meta`).then(r).catch(()=>{}),gc(`/api/devices`).then(a).catch(()=>{}),gc(`/api/ssh-pool`).then(s).catch(()=>{}),gc(`/api/topology`).then(u).catch(()=>{})};e();let t=setInterval(()=>{I.current||e()},4e3);return()=>clearInterval(t)},[ce]),(0,v.useEffect)(()=>{let e=()=>void gc(`/api/config`).then(f).catch(()=>{});e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[]);let le=(0,v.useCallback)((e,t)=>{_c(`/api/devices/toggle`,{device:e,disabled:t}).then(n=>{a(n),J.success(`Device ${e} ${t?`disabled`:`enabled`}`)}).catch(()=>J.error(`Could not ${t?`disable`:`enable`} ${e}`))},[]),ue=(0,v.useCallback)(async(e,t)=>{try{let n=await _c(`/api/devices/${e}`,{device:t});a(n);let r=n.status?.reachable,i=e===`reconnect`?`Reconnected to`:`Tested`;r===!1?J.error(`${t} is unreachable`):J.success(`${i} ${t}`)}catch{J.error(`Could not ${e===`reconnect`?`reconnect to`:`test`} ${t}`)}},[]),de=(0,v.useCallback)(e=>ue(`test`,e),[ue]),fe=(0,v.useCallback)(e=>ue(`reconnect`,e),[ue]);(0,v.useEffect)(()=>{let e=e=>{e.key===`Escape`&&k(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);let pe=(0,v.useMemo)(()=>{let e=P.q.trim().toLowerCase();return _.filter(t=>!(P.tool&&t.tool!==P.tool||P.risk&&t.risk!==P.risk||P.device&&t.device!==P.device||P.status===`ok`&&t.isError||P.status===`error`&&!t.isError||e&&!t.tool.toLowerCase().includes(e)&&!t.input.toLowerCase().includes(e)&&!t.output.toLowerCase().includes(e)&&!(t.error??``).toLowerCase().includes(e))).sort((e,t)=>t.ts-e.ts)},[_,P]),me=!!(P.tool||P.risk||P.device||P.status||P.q),he=(0,v.useMemo)(()=>_.filter(e=>e.isError),[_]),ge=(0,v.useMemo)(()=>({ok:_.length-he.length,error:he.length}),[_,he]),_e=(0,v.useCallback)(async e=>{try{k(await gc(`/api/event/${encodeURIComponent(e.id)}`))}catch{k(e)}},[]),ve=(0,v.useMemo)(()=>pe.slice(0,S),[pe,S]),ye=(0,v.useMemo)(()=>ve.map(e=>e.id),[ve]),be=ye.length>0&&ye.every(e=>A.has(e)),xe=!be&&ye.some(e=>A.has(e)),Se=(0,v.useRef)(null),Ce=(0,v.useRef)(!1),we=(0,v.useCallback)(e=>{let t=Ce.current;Ce.current=!1,j(n=>{let r=new Set(n),i=Se.current;if(t&&i&&i!==e){let t=ye.indexOf(i),n=ye.indexOf(e);if(t!==-1&&n!==-1){for(let e=Math.min(t,n);e<=Math.max(t,n);e++)r.add(ye[e]);return r}}return r.has(e)?r.delete(e):r.add(e),Se.current=e,r})},[ye]),Te=(0,v.useCallback)(()=>{j(e=>{let t=new Set(e);if(ye.length>0&&ye.every(e=>t.has(e)))for(let e of ye)t.delete(e);else for(let e of ye)t.add(e);return t})},[ye]),[Ee,De]=(0,v.useState)(!1),Oe=(0,v.useCallback)(async()=>{let e=[...A];if(e.length!==0)try{await yc({ids:e});let t=new Set(e);y(e=>e.filter(e=>!t.has(e.id))),j(new Set),J.success(`Deleted ${e.length} event${e.length===1?``:`s`}`)}catch{J.error(`Could not delete the selected events`)}finally{De(!1)}},[A]),ke=e=>{let t=A.size?pe.filter(e=>A.has(e.id)):pe;if(e===`json`){G9(`mcp-events.json`,JSON.stringify(t,null,2),`application/json`);return}let n=[`ts`,`tool`,`risk`,`device`,`durationMs`,`isError`,`error`,`reason`],r=e=>/[",\n]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e,i=t.map(e=>[new Date(e.ts).toISOString(),e.tool,e.risk,e.device??``,String(e.durationMs),String(e.isError),e.error??``,e.reason??``].map(r).join(`,`)).join(`
|
|
155
|
+
`);G9(`mcp-events.csv`,`${n.join(`,`)}\n${i}\n`,`text/csv`)},Ae=e?e.errorRate>=.2?`text-destructive`:e.errorRate>=.05?`text-warning`:``:``,je=d?.mcp??{},Me=d?.dashboard??{},Ne=d?.ssh??{},Pe=(e,t,n)=>(0,W.jsx)(Xx,{size:`sm`,"aria-label":t,value:P[e],onValueChange:t=>F(n=>({...n,[e]:t})),options:[{value:``,label:t},...n.map(e=>({value:e,label:e}))]}),Fe=K9.find(e=>e.id===R)??K9[0];return(0,W.jsxs)(`div`,{className:`bg-background text-foreground grid min-h-screen grid-cols-[240px_1fr]`,ref:L,"data-view":R,style:{"--page-accent":Z9[R][0],"--page-accent-2":Z9[R][1]},children:[(0,W.jsxs)(`aside`,{className:`bg-card sticky top-0 flex h-screen flex-col gap-4 border-r p-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsx)(`div`,{className:`bg-foreground text-background grid size-9 shrink-0 place-items-center rounded-md`,children:(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,className:`size-5`,children:(0,W.jsxs)(`g`,{stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,W.jsx)(`path`,{d:`M12 12 L4 5 M12 12 L20 5 M12 12 L12 20`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`4`,cy:`5`,r:`1.9`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`20`,cy:`5`,r:`1.9`,fill:`currentColor`,stroke:`none`}),(0,W.jsx)(`circle`,{cx:`12`,cy:`20`,r:`1.9`,fill:`currentColor`,stroke:`none`})]})})}),(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col leading-tight`,children:[(0,W.jsx)(`b`,{className:`truncate text-sm`,children:`MikroTik MCP`}),(0,W.jsxs)(`small`,{className:q(`text-muted-foreground inline-flex items-center gap-1 text-[11px]`,c.release&&`hover:text-foreground cursor-pointer`),title:c.release?`View release notes`:void 0,onClick:c.release?()=>c.openModal():void 0,children:[n?.version?`v${n.version}`:`Observability`,c.showIndicator&&(0,W.jsx)(`span`,{className:`bg-brand inline-block size-1.5 rounded-full`,title:`v${c.release?.version} available`})]})]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Xb,{})]}),(0,W.jsx)(`nav`,{className:`flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto`,children:K9.map(e=>(0,W.jsxs)(`button`,{type:`button`,className:q(`flex items-center gap-2.5 rounded-md px-2.5 py-2 text-left text-[13px] transition-colors`,`[&_svg]:size-4 [&_svg]:shrink-0`,R===e.id?`bg-accent text-accent-foreground font-medium`:`text-muted-foreground hover:bg-accent/50 hover:text-foreground`),onClick:()=>te(e.id),children:[(0,W.jsx)(Wne,{name:e.id}),(0,W.jsx)(`span`,{className:`truncate`,children:e.label}),e.id===`feed`&&_.length>0&&(0,W.jsx)(`span`,{className:`bg-brand text-brand-foreground animate-in zoom-in-50 ml-auto rounded-full px-1.5 py-0.5 text-[10px] tabular-nums`,children:_.length>999?`999+`:_.length},_.length)]},e.id))}),(0,W.jsxs)(`div`,{className:`flex flex-col gap-1.5 border-t pt-3`,children:[(0,W.jsx)(Une,{}),(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-[11px]`,title:`Live transport: WebSocket (preferred) or SSE fallback`,children:[(0,W.jsx)(Wx,{type:E===`off`?`secondary`:`success`,pulse:E!==`off`}),E===`off`?`offline`:`live · ${E}`]}),(0,W.jsx)(`small`,{className:`text-muted-foreground text-[11px]`,children:n?`${hx(n.total)} events · ${n.transport}`:`connecting…`})]})]}),(0,W.jsxs)(`main`,{className:`flex min-w-0 flex-col gap-5 p-6`,"data-view":R,children:[(0,W.jsxs)(`header`,{className:`reveal flex flex-wrap items-center gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,W.jsx)(`h1`,{className:`truncate text-xl font-semibold`,children:Fe.label}),(0,W.jsx)(`small`,{className:`text-muted-foreground text-xs`,children:Fe.sub})]}),(0,W.jsx)(`span`,{className:`flex-1`}),R===`overview`&&(0,W.jsx)(Xx,{size:`sm`,"aria-label":`Stats time window`,value:String(b),onValueChange:e=>x(Number(e)),options:bx.map(([e,t])=>({value:String(t),label:`window: ${e}`}))}),(0,W.jsx)(X,{size:`sm`,ghost:!0,type:z.has(R)?`accent`:`default`,onClick:()=>V(R),"aria-expanded":z.has(R),title:`About this page`,icon:(0,W.jsx)(Rc,{}),children:`Help`})]}),z.has(R)&&(0,W.jsx)(Vne,{view:R}),R===`overview`&&(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsx)(`div`,{className:`reveal grid grid-cols-[repeat(auto-fit,minmax(9rem,1fr))] gap-3`,children:e?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(cx,{k:`Calls (window)`,v:hx(e.total)}),(0,W.jsx)(cx,{k:`Calls / min`,v:e.callsPerMin.toFixed(1)}),(0,W.jsx)(cx,{k:`Error rate`,v:`${(e.errorRate*100).toFixed(1)}%`,sub:`${e.errors} err`,cls:Ae}),(0,W.jsx)(cx,{k:`Avg latency`,v:fx(e.latency.avg)}),(0,W.jsx)(cx,{k:`p95 latency`,v:fx(e.latency.p95)}),(0,W.jsx)(cx,{k:`p99 latency`,v:fx(e.latency.p99)}),(0,W.jsx)(cx,{k:`Distinct tools`,v:hx(e.distinctTools)}),(0,W.jsx)(cx,{k:`Output volume`,v:px(e.outputBytes)})]}):(0,W.jsx)(cx,{k:`Loading…`,v:`—`})}),(0,W.jsxs)(`div`,{className:`reveal grid grid-cols-1 gap-4 xl:grid-cols-3`,children:[(0,W.jsx)(sx,{title:`Calls over time`,className:`xl:col-span-2`,children:e?(0,W.jsx)(o7,{series:e.series}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`no data`})}),e&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(sx,{title:`By risk`,children:(0,W.jsx)(s7,{segments:Object.keys(e.byRisk).map(t=>({label:t,value:e.byRisk[t],color:vx[t]}))})}),(0,W.jsx)(sx,{title:`Top tools`,className:`xl:col-span-2`,children:(0,W.jsx)(lx,{rows:e.byTool.map(e=>({label:e.tool,value:e.count,sub:`${e.count}× · ${fx(e.p95Ms)} p95${e.errors?` · ${e.errors} err`:``}`,color:e.errors?`var(--destructive)`:void 0}))})}),(0,W.jsx)(sx,{title:`Status`,children:(0,W.jsx)(s7,{centerLabel:`calls`,segments:[{label:`ok`,value:ge.ok,color:`var(--muted-foreground)`},{label:`error`,value:ge.error,color:`var(--destructive)`}]})}),(0,W.jsx)(sx,{title:`By device`,children:e.byDevice.length?(0,W.jsx)(lx,{rows:e.byDevice.map(e=>({label:e.device,value:e.count}))}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`single device`})}),(0,W.jsx)(sx,{title:`Recent errors`,children:he.length?(0,W.jsx)(`div`,{className:`flex flex-col gap-2`,children:he.slice(0,8).map(e=>(0,W.jsxs)(`div`,{className:`hover:bg-accent/50 grid cursor-pointer grid-cols-[auto_1fr] items-center gap-3 rounded-md px-1 py-0.5`,onClick:()=>void _e(e),children:[(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:mx(e.ts)}),(0,W.jsxs)(`span`,{className:`text-destructive min-w-0 truncate text-xs`,title:e.error??e.output,children:[e.tool,`: `,e.error??e.output??`error`]})]},e.id))}):(0,W.jsx)(`div`,{className:`text-muted-foreground text-[11px]`,children:`no errors 🎉`})})]})]})]}),R===`devices`&&(i&&i.devices.length>0?(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsxs)(`div`,{className:`reveal flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Kx,{className:`min-w-[180px] flex-1`,type:`search`,placeholder:`Search devices by name or address…`,value:ne,onChange:e=>re(e.target.value)}),(0,W.jsx)(`div`,{className:`bg-muted flex gap-0.5 rounded-md p-0.5`,children:[`all`,`online`,`offline`].map(e=>(0,W.jsx)(`button`,{type:`button`,className:q(`rounded-sm px-2.5 py-1 text-xs transition-colors`,ie===e?`bg-background text-foreground shadow-xs`:`text-muted-foreground hover:text-foreground`),onClick:()=>ae(e),children:e===`all`?`All ${oe.total}`:e===`online`?`Online ${oe.online}`:`Offline ${oe.offline}`},e))}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[se.length,`/`,oe.total,` shown`]})]}),(0,W.jsxs)(`details`,{className:`bg-card reveal rounded-lg border p-4`,open:oe.total<=8,children:[(0,W.jsxs)(`summary`,{className:`cursor-pointer text-sm font-medium`,children:[`Connectivity radar`,(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[` `,`· `,oe.online,` online · `,oe.offline,` offline ·`,` `,oe.total,` total`]})]}),(0,W.jsx)(Nte,{payload:i,pulses:M})]}),(0,W.jsx)(Rne,{devices:se,poolPayload:o}),se.length===0?(0,W.jsx)(Q9,{className:`reveal`,icon:(0,W.jsx)(ol,{className:`size-6`}),title:`No devices match`,sub:`Try a different search or status filter.`}):(0,W.jsx)(`div`,{className:`reveal grid grid-cols-[repeat(auto-fill,minmax(20rem,1fr))] gap-4`,children:se.map(e=>(0,W.jsx)(Pte,{d:e,allNames:i.devices.map(e=>e.name),onToggle:le,onTest:de,onReconnect:fe},e.name))}),se.length>0&&(0,W.jsx)(sx,{title:`Device system health`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`CPU · memory · disk · latency · live probe`}),children:(0,W.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(22rem,1fr))] gap-3`,children:se.map(e=>(0,W.jsx)(Lte,{d:e},e.name))})})]}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Yc,{className:`size-6`}),title:`No devices configured`,body:(0,W.jsx)(zx,{type:`secondary`,label:`Tip`,children:`Add a device to your config to see connectivity and system health here.`})})),R===`clients`&&(0,W.jsx)(C7,{}),R===`aaa`&&(0,W.jsx)(zS,{}),R===`topology`&&(l&&l.nodes.length>0?(0,W.jsx)(`section`,{className:`reveal grid content-start gap-[18px]`,children:(0,W.jsx)(Nne,{topo:l,onOnboard:(e,t)=>{g({name:e,body:t}),m(!0),te(`config`)}})}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(el,{className:`size-6`}),title:`No neighbours discovered yet`,sub:`Layer-2 neighbours (MNDP / CDP / LLDP) appear here as the device reports them.`})),R===`packets`&&(0,W.jsx)(`section`,{className:`grid content-start gap-[18px]`,children:(0,W.jsx)(sx,{title:`Packet capture`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`live TZSP decode · /tool sniffer streaming`}),children:(0,W.jsx)(Dne,{})})}),R===`snapshots`&&(0,W.jsx)(kne,{}),R===`drift`&&(0,W.jsx)(qte,{}),R===`plan`&&(0,W.jsx)(US,{}),R===`s3`&&(0,W.jsx)(One,{}),R===`backups`&&(0,W.jsx)(Qx,{}),R===`modules`&&(0,W.jsx)(rne,{}),R===`config`&&(d?(0,W.jsxs)(`section`,{className:`grid content-start gap-[18px]`,children:[(0,W.jsx)(sx,{title:`Configuration`,className:`reveal`,extra:(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>m(e=>!e),title:`Edit the config JSON with autocomplete, validation and safe-apply`,icon:p?void 0:(0,W.jsx)(Zc,{}),children:p?`View`:`Edit config`}),children:p?(0,W.jsx)(kte,{initial:h?{...d,devices:{...d.devices,[h.name]:h.body}}:d,onClose:()=>{m(!1),g(null)},onReload:()=>{g(null),gc(`/api/config`).then(f).catch(()=>{})}},h?`seed-${h.name}`:`config`):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`text-muted-foreground mb-2.5 flex flex-wrap gap-x-4 gap-y-1 text-[11px]`,children:[(0,W.jsxs)(`span`,{children:[`transport: `,gx(je.transport)]}),(0,W.jsxs)(`span`,{children:[`read-only: `,d.readOnly?`yes`:`no`]}),(0,W.jsxs)(`span`,{children:[`dashboard: `,gx(Me.host),`:`,gx(Me.port)]}),(0,W.jsxs)(`span`,{children:[`capture: `,Me.captureBody?`on`:`off`]}),(0,W.jsxs)(`span`,{children:[`s3: `,d.s3?`configured`:`off`]}),(0,W.jsxs)(`span`,{children:[`ssh pool: `,Ne.keepAlive===!1?`off`:`on`]})]}),(0,W.jsxs)(`details`,{children:[(0,W.jsx)(`summary`,{className:`cursor-pointer text-sm`,children:`Full effective configuration (secrets redacted)`}),(0,W.jsx)(M7,{value:d,maxHeight:340})]})]})}),(0,W.jsx)(sx,{title:`Dashboard preferences`,className:`reveal`,extra:(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[`saved to `,(0,W.jsx)(`code`,{children:`dashboard.feedLimit`}),` in the config`]}),children:(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,W.jsx)(kb,{className:`text-[12.5px]`,children:`Live Feed rows`}),(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[`How many matching calls the feed table renders. Up to `,hx(1e4),` are kept in memory regardless; this only bounds what is drawn.`]})]}),(0,W.jsx)(`span`,{className:`flex-1`}),(0,W.jsx)(Xx,{size:`sm`,"aria-label":`Live Feed rows`,value:String(S),onValueChange:e=>void C(Number(e)),options:dx.map(e=>({value:String(e),label:`${hx(e)} rows${e===200?` (default)`:``}`}))})]})}),(0,W.jsx)(sx,{title:`Version history`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`point-in-time snapshots · diff & restore`}),children:(0,W.jsx)(B7,{onRestored:()=>void gc(`/api/config`).then(f).catch(()=>{})})}),(0,W.jsx)(sx,{title:`Field guide`,className:`reveal`,extra:(0,W.jsx)(`span`,{className:`text-muted-foreground text-[11px]`,children:`every config option, documented from the schema`}),children:(0,W.jsx)(H7,{})})]}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Gx,{}),title:`Loading configuration…`})),R===`memory`&&(0,W.jsx)(tne,{}),R===`releases`&&(0,W.jsx)(bne,{}),R===`capsman`&&(0,W.jsx)(Tne,{}),R===`feed`&&(0,W.jsxs)(sx,{className:`reveal`,title:`Live tool calls`,extra:(0,W.jsxs)(`span`,{className:`text-muted-foreground text-[11px]`,children:[hx(ve.length),` shown`,pe.length>ve.length&&` of ${hx(pe.length)} matching`,` ·`,` `,hx(_.length),` buffered`]}),children:[(0,W.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center gap-2`,children:[(0,W.jsx)(Kx,{className:`min-w-[180px] flex-1`,type:`search`,placeholder:`Search tool / input / output / error…`,value:P.q,onChange:e=>F(t=>({...t,q:e.target.value}))}),Pe(`tool`,`all tools`,n?.tools??[]),Pe(`risk`,`all risk`,[`READ`,`WRITE`,`WRITE_IDEMPOTENT`,`DESTRUCTIVE`,`DANGEROUS`]),Pe(`device`,`all devices`,n?.devices??[]),Pe(`status`,`all status`,[`ok`,`error`]),(0,W.jsx)(X,{size:`sm`,ghost:!0,type:w?`accent`:`default`,onClick:()=>T(e=>!e),icon:w?(0,W.jsx)(Qc,{}):(0,W.jsx)(Xc,{}),children:w?`Resume`:`Pause`}),(0,W.jsxs)(X,{size:`sm`,ghost:!0,onClick:()=>ke(`csv`),title:A.size?`Export ${A.size} selected row${A.size===1?``:`s`} as CSV`:`Export all visible rows as CSV`,children:[`CSV`,A.size?` (${A.size})`:``]}),(0,W.jsxs)(X,{size:`sm`,ghost:!0,onClick:()=>ke(`json`),title:A.size?`Export ${A.size} selected row${A.size===1?``:`s`} as JSON`:`Export all visible rows as JSON`,children:[`JSON`,A.size?` (${A.size})`:``]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>F({tool:``,risk:``,device:``,status:``,q:``}),children:`Clear`}),Ee&&A.size>0?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(X,{size:`sm`,type:`error`,onClick:()=>void Oe(),icon:(0,W.jsx)(Pc,{}),children:[`Confirm delete (`,A.size,`)`]}),(0,W.jsx)(X,{size:`sm`,ghost:!0,onClick:()=>De(!1),children:`Cancel`})]}):(0,W.jsxs)(X,{size:`sm`,ghost:!0,disabled:A.size===0,onClick:()=>De(!0),title:`Delete the selected rows`,icon:(0,W.jsx)(pl,{}),children:[`Delete`,A.size>0?` (${A.size})`:``]})]}),pe.length===0?me?(0,W.jsx)(Q9,{icon:(0,W.jsx)(ol,{className:`size-6`}),title:`No calls match your filters`,sub:`${_.length} call${_.length===1?``:`s`} buffered — try widening the search or the risk / device / status filters.`,body:(0,W.jsx)(X,{size:`sm`,ghost:!0,className:`mt-2`,onClick:()=>F({tool:``,risk:``,device:``,status:``,q:``}),children:`Clear filters`})}):(0,W.jsx)(Q9,{icon:(0,W.jsx)(Wx,{type:E===`off`?`secondary`:`success`,pulse:E!==`off`,className:`size-3`}),title:E===`off`?`Not connected`:`Listening for tool calls…`,sub:E===`off`?`The live stream is offline — it will reconnect automatically.`:`Tool calls the LLM makes against this server stream in here in real time.`}):(0,W.jsx)(`div`,{className:`max-h-[60vh] overflow-auto`,children:(0,W.jsxs)(Qb,{children:[(0,W.jsx)($b,{children:(0,W.jsxs)(tx,{children:[(0,W.jsx)(Y,{className:`w-7`,children:(0,W.jsx)(Ob,{"aria-label":`Select all shown rows`,checked:be?!0:xe?`indeterminate`:!1,onCheckedChange:Te})}),(0,W.jsx)(Y,{children:`time`}),(0,W.jsx)(Y,{children:`tool`}),(0,W.jsx)(Y,{children:`risk`}),(0,W.jsx)(Y,{children:`device`}),(0,W.jsx)(Y,{className:`text-right`,children:`dur`}),(0,W.jsx)(Y,{children:`status`}),(0,W.jsx)(Y,{children:`output`})]})}),(0,W.jsx)(ex,{children:ve.map(e=>(0,W.jsxs)(tx,{"data-state":A.has(e.id)?`selected`:void 0,className:q(`cursor-pointer`,e.isError&&`bg-destructive/8`),onClick:()=>void _e(e),children:[(0,W.jsx)(nx,{onClick:e=>e.stopPropagation(),children:(0,W.jsx)(Ob,{"aria-label":`Select row (Shift-click to select a range)`,checked:A.has(e.id),onPointerDown:e=>{Ce.current=e.shiftKey},onCheckedChange:()=>we(e.id)})}),(0,W.jsx)(nx,{className:`tabular-nums`,children:mx(e.ts)}),(0,W.jsx)(nx,{children:e.tool}),(0,W.jsx)(nx,{children:(0,W.jsx)(`span`,{className:q(`rounded-full border px-1.5 py-0.5 text-[10px]`,yx[e.risk]),children:e.risk.replace(`WRITE_IDEMPOTENT`,`WRITE·I`)})}),(0,W.jsx)(nx,{children:e.device??`—`}),(0,W.jsx)(nx,{className:`text-right tabular-nums`,children:fx(e.durationMs)}),(0,W.jsx)(nx,{children:(0,W.jsx)(`span`,{className:e.isError?`text-destructive`:`text-muted-foreground`,children:e.isError?`error`:`ok`})}),(0,W.jsx)(nx,{className:`text-muted-foreground max-w-[24rem] truncate`,children:e.isError?e.error??`error`:e.reason?(0,W.jsx)(`span`,{className:`italic`,children:e.reason}):e.output||`—`})]},e.id))})]})})]})]}),c.showModal&&c.release&&(0,W.jsx)(_ne,{release:c.release,onDismiss:c.dismissRelease}),O&&(0,W.jsx)(Ite,{event:O,onClose:()=>k(null)}),(0,W.jsx)(Zb,{})]})}var $9=document.getElementById(`root`);$9&&(0,y.createRoot)($9).render((0,W.jsx)(Gne,{}));
|
|
156
156
|
</script>
|
|
157
157
|
<style>
|
|
158
|
-
@import "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap";@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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:var(--font-mt);--font-mono:var(--font-mt);--color-orange-500:oklch(70.5% .213 47.604);--color-yellow-500:oklch(79.5% .184 86.047);--color-emerald-500:oklch(69.6% .17 162.48);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--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-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-2xl:40px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-mt);--default-mono-font-family:var(--font-mt);--color-border:var(--border)}}@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;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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{--font-mt:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);font-family:var(--font-mt);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components{@media (prefers-reduced-motion:no-preference){.js-motion .reveal{opacity:0}}}@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.-top-16{top:calc(var(--spacing) * -16)}.-top-px{top:-1px}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.-right-16{right:calc(var(--spacing) * -16)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.-bottom-1\.5{bottom:calc(var(--spacing) * -1.5)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.-left-\[21px\]{left:-21px}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[9px\]{left:9px}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[5\]{z-index:5}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.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}}.m-0{margin:0}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-2\.5{margin-block:calc(var(--spacing) * 2.5)}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-\[3px\]{margin-top:3px}.mt-\[7px\]{margin-top:7px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.\[field-sizing\:fixed\]{field-sizing:fixed}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-56{width:calc(var(--spacing) * 56);height:calc(var(--spacing) * 56)}.size-\[7px\]{width:7px;height:7px}.size-\[9px\]{width:9px;height:9px}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[18px\]{width:18px;height:18px}.size-\[19px\]{width:19px;height:19px}.size-\[72px\]{width:72px;height:72px}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-40{height:calc(var(--spacing) * 40)}.h-\[18px\]{height:18px}.h-\[46px\]{height:46px}.h-\[150px\]{height:150px}.h-\[200px\]{height:200px}.h-\[360px\]{height:360px}.h-\[400px\]{height:400px}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[184px\]{max-height:184px}.max-h-\[250px\]{max-height:250px}.max-h-\[280px\]{max-height:280px}.max-h-\[320px\]{max-height:320px}.max-h-\[360px\]{max-height:360px}.max-h-\[420px\]{max-height:420px}.max-h-\[440px\]{max-height:440px}.max-h-\[500px\]{max-height:500px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-\[120px\]{min-height:120px}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:var(--spacing)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\/4{width:75%}.w-7{width:calc(var(--spacing) * 7)}.w-11{width:calc(var(--spacing) * 11)}.w-20{width:calc(var(--spacing) * 20)}.w-40{width:calc(var(--spacing) * 40)}.w-\[90px\]{width:90px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[150px\]{width:150px}.w-\[170px\]{width:170px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[380px\]{width:380px}.w-\[min\(48vw\,380px\)\]{width:min(48vw,380px)}.w-\[min\(360px\,60vw\)\]{width:min(360px,60vw)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[190px\]{max-width:190px}.max-w-\[200px\]{max-width:200px}.max-w-\[260px\]{max-width:260px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[460px\]{max-width:460px}.max-w-\[520px\]{max-width:520px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-\[min\(60vw\,520px\)\]{max-width:min(60vw,520px)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[38px\]{min-width:38px}.min-w-\[48px\]{min-width:48px}.min-w-\[60px\]{min-width:60px}.min-w-\[100px\]{min-width:100px}.min-w-\[150px\]{min-width:150px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[980px\]{min-width:980px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-100\%-9px\)\]{--tw-translate-y:calc(-100% - 9px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-y{resize:vertical}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-cols-\[24px_minmax\(0\,1fr\)_auto\]{grid-template-columns:24px minmax(0,1fr) auto}.grid-cols-\[52px_1fr_34px\]{grid-template-columns:52px 1fr 34px}.grid-cols-\[90px_64px_48px_1fr\]{grid-template-columns:90px 64px 48px 1fr}.grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,7rem\)_1fr_auto\]{grid-template-columns:minmax(0,7rem) 1fr auto}.grid-cols-\[minmax\(120px\,0\.4fr\)_1fr\]{grid-template-columns:minmax(120px,.4fr) 1fr}.grid-cols-\[repeat\(auto-fill\,minmax\(20rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(20rem,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(22rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(22rem,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(200px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(220px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(240px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(min\(100\%\,360px\)\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(min(100%,360px),1fr))}.grid-cols-\[repeat\(auto-fit\,minmax\(9rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(9rem,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-start{justify-items:start}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[3px\]{gap:3px}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[9px\]{gap:9px}.gap-\[18px\]{gap:18px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-3\.5{column-gap:calc(var(--spacing) * 3.5)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px * var(--tw-space-x-reverse));margin-inline-end:calc(-1px * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2\.5{row-gap:calc(var(--spacing) * 2.5)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-\[3px\]{row-gap:3px}.self-start{align-self:flex-start}.justify-self-center{justify-self:center}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[6px\]{border-radius:6px}.rounded-\[7px\]{border-radius:7px}.rounded-\[10px\]{border-radius:10px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-\[2\.5px\]{border-style:var(--tw-border-style);border-width:2.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-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-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--color-border\){border-color:var(--color-border)}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-brand,.border-brand\/30{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/30{border-color:color-mix(in oklab, var(--brand) 30%, transparent)}}.border-brand\/40{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/40{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.border-brand\/50{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/50{border-color:color-mix(in oklab, var(--brand) 50%, transparent)}}.border-brand\/55{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/55{border-color:color-mix(in oklab, var(--brand) 55%, transparent)}}.border-chart-1\/40{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/40{border-color:color-mix(in oklab, var(--chart-1) 40%, transparent)}}.border-chart-1\/45{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/45{border-color:color-mix(in oklab, var(--chart-1) 45%, transparent)}}.border-chart-1\/50{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/50{border-color:color-mix(in oklab, var(--chart-1) 50%, transparent)}}.border-chart-2\/40{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.border-chart-2\/40{border-color:color-mix(in oklab, var(--chart-2) 40%, transparent)}}.border-chart-2\/45{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.border-chart-2\/45{border-color:color-mix(in oklab, var(--chart-2) 45%, transparent)}}.border-chart-3\/35{border-color:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.border-chart-3\/35{border-color:color-mix(in oklab, var(--chart-3) 35%, transparent)}}.border-chart-3\/40{border-color:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.border-chart-3\/40{border-color:color-mix(in oklab, var(--chart-3) 40%, transparent)}}.border-chart-4\/40{border-color:var(--chart-4)}@supports (color:color-mix(in lab, red, red)){.border-chart-4\/40{border-color:color-mix(in oklab, var(--chart-4) 40%, transparent)}}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/40{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.border-destructive\/45{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/45{border-color:color-mix(in oklab, var(--destructive) 45%, transparent)}}.border-destructive\/50{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/50{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-input{border-color:var(--input)}.border-success\/35{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/35{border-color:color-mix(in oklab, var(--success) 35%, transparent)}}.border-success\/40{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/40{border-color:color-mix(in oklab, var(--success) 40%, transparent)}}.border-success\/45{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/45{border-color:color-mix(in oklab, var(--success) 45%, transparent)}}.border-transparent{border-color:#0000}.border-warning\/30{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/30{border-color:color-mix(in oklab, var(--warning) 30%, transparent)}}.border-warning\/40{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/40{border-color:color-mix(in oklab, var(--warning) 40%, transparent)}}.border-warning\/45{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/45{border-color:color-mix(in oklab, var(--warning) 45%, transparent)}}.border-warning\/60{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/60{border-color:color-mix(in oklab, var(--warning) 60%, transparent)}}.border-yellow-500\/40{border-color:#edb20066}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\/40{border-color:color-mix(in oklab, var(--color-yellow-500) 40%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-border{border-left-color:var(--border)}.border-l-destructive{border-left-color:var(--destructive)}.border-l-success{border-left-color:var(--success)}.border-l-transparent{border-left-color:#0000}.border-l-warning{border-left-color:var(--warning)}.bg-\(--color-bg\){background-color:var(--color-bg)}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--border)}.bg-brand,.bg-brand\/10{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/10{background-color:color-mix(in oklab, var(--brand) 10%, transparent)}}.bg-brand\/15{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/15{background-color:color-mix(in oklab, var(--brand) 15%, transparent)}}.bg-brand\/20{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/20{background-color:color-mix(in oklab, var(--brand) 20%, transparent)}}.bg-brand\/40{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/40{background-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.bg-brand\/60{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/60{background-color:color-mix(in oklab, var(--brand) 60%, transparent)}}.bg-brand\/\[0\.13\]{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/\[0\.13\]{background-color:color-mix(in oklab, var(--brand) 13%, transparent)}}.bg-card{background-color:var(--card)}.bg-chart-1\/10{background-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.bg-chart-1\/10{background-color:color-mix(in oklab, var(--chart-1) 10%, transparent)}}.bg-chart-2,.bg-chart-2\/10{background-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.bg-chart-2\/10{background-color:color-mix(in oklab, var(--chart-2) 10%, transparent)}}.bg-destructive,.bg-destructive\/8{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/8{background-color:color-mix(in oklab, var(--destructive) 8%, transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-destructive\/15{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/15{background-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.bg-muted-foreground\/60{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/60{background-color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/45{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/45{background-color:color-mix(in oklab, var(--muted) 45%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-success,.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.bg-success\/10{background-color:color-mix(in oklab, var(--success) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/8{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/8{background-color:color-mix(in oklab, var(--warning) 8%, transparent)}}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.bg-yellow-500\/15{background-color:#edb20026}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/15{background-color:color-mix(in oklab, var(--color-yellow-500) 15%, transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-brand\/10{--tw-gradient-from:var(--brand)}@supports (color:color-mix(in lab, red, red)){.from-brand\/10{--tw-gradient-from:color-mix(in oklab, var(--brand) 10%, transparent)}}.from-brand\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.fill-background{fill:var(--background)}.fill-brand\/15{fill:var(--brand)}@supports (color:color-mix(in lab, red, red)){.fill-brand\/15{fill:color-mix(in oklab, var(--brand) 15%, transparent)}}.fill-brand\/25{fill:var(--brand)}@supports (color:color-mix(in lab, red, red)){.fill-brand\/25{fill:color-mix(in oklab, var(--brand) 25%, transparent)}}.fill-card{fill:var(--card)}.fill-chart-3\/20{fill:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.fill-chart-3\/20{fill:color-mix(in oklab, var(--chart-3) 20%, transparent)}}.fill-chart-4\/15{fill:var(--chart-4)}@supports (color:color-mix(in lab, red, red)){.fill-chart-4\/15{fill:color-mix(in oklab, var(--chart-4) 15%, transparent)}}.fill-current{fill:currentColor}.fill-foreground{fill:var(--foreground)}.fill-muted{fill:var(--muted)}.fill-muted-foreground{fill:var(--muted-foreground)}.fill-none{fill:none}.fill-success\/20{fill:var(--success)}@supports (color:color-mix(in lab, red, red)){.fill-success\/20{fill:color-mix(in oklab, var(--success) 20%, transparent)}}.fill-warning\/15{fill:var(--warning)}@supports (color:color-mix(in lab, red, red)){.fill-warning\/15{fill:color-mix(in oklab, var(--warning) 15%, transparent)}}.stroke-background{stroke:var(--background)}.stroke-border,.stroke-border\/40{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/40{stroke:color-mix(in oklab, var(--border) 40%, transparent)}}.stroke-border\/60{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/60{stroke:color-mix(in oklab, var(--border) 60%, transparent)}}.stroke-border\/70{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/70{stroke:color-mix(in oklab, var(--border) 70%, transparent)}}.stroke-brand,.stroke-brand\/55{stroke:var(--brand)}@supports (color:color-mix(in lab, red, red)){.stroke-brand\/55{stroke:color-mix(in oklab, var(--brand) 55%, transparent)}}.stroke-chart-2\/70{stroke:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.stroke-chart-2\/70{stroke:color-mix(in oklab, var(--chart-2) 70%, transparent)}}.stroke-chart-3{stroke:var(--chart-3)}.stroke-chart-4{stroke:var(--chart-4)}.stroke-foreground{stroke:var(--foreground)}.stroke-none{stroke:none}.stroke-success{stroke:var(--success)}.stroke-warning{stroke:var(--warning)}.stroke-1{stroke-width:1px}.stroke-2{stroke-width:2px}.stroke-\[1\.5px\]{stroke-width:1.5px}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.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)}.px-\[5px\]{padding-inline:5px}.px-\[7px\]{padding-inline:7px}.px-\[11px\]{padding-inline:11px}.px-\[13px\]{padding-inline:13px}.px-\[15px\]{padding-inline:15px}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-\[3px\]{padding-block:3px}.py-\[5px\]{padding-block:5px}.py-\[7px\]{padding-block:7px}.py-\[9px\]{padding-block:9px}.py-\[11px\]{padding-block:11px}.py-\[54px\]{padding-block:54px}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-px{padding-top:1px}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-\[18px\]{padding-left:18px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mt)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-\[11px\]\/\[1\.5\]{font-size:11px;line-height:1.5}.text-\[11px\]\/\[1\.6\]{font-size:11px;line-height:1.6}.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-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[40px\]{font-size:40px}.text-\[44px\]{font-size:44px}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[8px\]{--tw-leading:8px;line-height:8px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.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-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.09em\]{--tw-tracking:.09em;letter-spacing:.09em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.\[tab-size\:2\]{tab-size:2}.text-accent-foreground{color:var(--accent-foreground)}.text-background{color:var(--background)}.text-brand{color:var(--brand)}.text-brand-foreground{color:var(--brand-foreground)}.text-card-foreground{color:var(--card-foreground)}.text-chart-1{color:var(--chart-1)}.text-chart-2{color:var(--chart-2)}.text-chart-3{color:var(--chart-3)}.text-chart-4{color:var(--chart-4)}.text-chart-5{color:var(--chart-5)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-emerald-500{color:var(--color-emerald-500)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.text-muted-foreground\/80{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/80{color:color-mix(in oklab, var(--muted-foreground) 80%, transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-success{color:var(--success)}.text-transparent{color:#0000}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.caret-brand{caret-color:var(--brand)}.accent-brand{accent-color:var(--brand)}.opacity-15{opacity:.15}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-brand\/25{--tw-ring-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.ring-brand\/25{--tw-ring-color:color-mix(in oklab, var(--brand) 25%, transparent)}}.ring-brand\/30{--tw-ring-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.ring-brand\/30{--tw-ring-color:color-mix(in oklab, var(--brand) 30%, transparent)}}.ring-card{--tw-ring-color:var(--card)}.ring-emerald-500\/30{--tw-ring-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.ring-emerald-500\/30{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale-\[0\.4\]{--tw-grayscale:grayscale(.4);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,border-color\]{transition-property:transform,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-\[400ms\]{--tw-duration:.4s;transition-duration:.4s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-50{--tw-enter-scale:.5}.zoom-in-95{--tw-enter-scale:.95}.\[text-shadow\:0_0_3px_rgba\(0\,0\,0\,0\.6\)\]{text-shadow:0 0 3px #0009}.\[transition\:stroke_0\.1s_ease\]{transition:stroke .1s}.\[vector-effect\:non-scaling-stroke\]{vector-effect:non-scaling-stroke}.running{animation-play-state:running}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-\[\.toast\]\:bg-muted:is(:where(.group).toast *){background-color:var(--muted)}.group-\[\.toast\]\:bg-primary:is(:where(.group).toast *){background-color:var(--primary)}.group-\[\.toast\]\:text-destructive:is(:where(.group).toast *){color:var(--destructive)}.group-\[\.toast\]\:text-foreground:is(:where(.group).toast *){color:var(--foreground)}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group).toast *){color:var(--muted-foreground)}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group).toast *){color:var(--primary-foreground)}.group-\[\.toaster\]\:border:is(:where(.group).toaster *){border-style:var(--tw-border-style);border-width:1px}.group-\[\.toaster\]\:bg-background:is(:where(.group).toaster *){background-color:var(--background)}.group-\[\.toaster\]\:text-foreground:is(:where(.group).toaster *){color:var(--foreground)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-brand\/35 ::selection{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.selection\:bg-brand\/35 ::selection{background-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.selection\:bg-brand\/35::selection{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.selection\:bg-brand\/35::selection{background-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-\[25px\]:before{content:var(--tw-content);top:25px}.before\:bottom-0:before{content:var(--tw-content);bottom:0}.before\:left-\[22px\]:before{content:var(--tw-content);left:22px}.before\:w-px:before{content:var(--tw-content);width:1px}.before\:bg-border:before{content:var(--tw-content);background-color:var(--border)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:before\:hidden:last-child:before{content:var(--tw-content);display:none}.odd\:bg-card\/40:nth-child(odd){background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.odd\:bg-card\/40:nth-child(odd){background-color:color-mix(in oklab, var(--card) 40%, transparent)}}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-brand\/35:hover{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:border-brand\/35:hover{border-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.hover\:border-brand\/40:hover{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:border-brand\/40:hover{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.hover\:border-chart-2\/35:hover{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.hover\:border-chart-2\/35:hover{border-color:color-mix(in oklab, var(--chart-2) 35%, transparent)}}.hover\:border-muted-foreground\/40:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:border-muted-foreground\/40:hover{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.hover\:bg-brand\/10:hover{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/10:hover{background-color:color-mix(in oklab, var(--brand) 10%, transparent)}}.hover\:bg-brand\/90:hover{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/90:hover{background-color:color-mix(in oklab, var(--brand) 90%, transparent)}}.hover\:bg-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-foreground\/5:hover{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/5:hover{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-success\/10:hover{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/10:hover{background-color:color-mix(in oklab, var(--success) 10%, transparent)}}.hover\:bg-success\/90:hover{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/90:hover{background-color:color-mix(in oklab, var(--success) 90%, transparent)}}.hover\:bg-warning\/10:hover{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warning\/10:hover{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.hover\:bg-warning\/90:hover{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warning\/90:hover{background-color:color-mix(in oklab, var(--warning) 90%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-0:focus-visible{border-style:var(--tw-border-style);border-width:0}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem}.data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@media not all and (width>=720px){.max-\[720px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media (width>=40rem){.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-\[520px\]{max-width:520px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[\&_\.j-bool\]\:text-chart-4 .j-bool{color:var(--chart-4)}.\[\&_\.j-key\]\:text-chart-1 .j-key{color:var(--chart-1)}.\[\&_\.j-null\]\:text-muted-foreground .j-null{color:var(--muted-foreground)}.\[\&_\.j-num\]\:text-chart-3 .j-num{color:var(--chart-3)}.\[\&_\.j-str\]\:text-chart-2 .j-str{color:var(--chart-2)}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:var(--muted-foreground)}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:color-mix(in oklab, var(--border) 50%, transparent)}}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:var(--border)}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke=\#ccc]{stroke:var(--border)}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:var(--muted)}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke=\#ccc]{stroke:var(--border)}.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.wn-check\]\:inline-block .wn-check{display:inline-block}.\[\&_\.wn-check\]\:w-4 .wn-check{width:calc(var(--spacing) * 4)}.\[\&_\.wn-table-wrap\]\:my-2\.5 .wn-table-wrap{margin-block:calc(var(--spacing) * 2.5)}.\[\&_\.wn-table-wrap\]\:overflow-x-auto .wn-table-wrap{overflow-x:auto}.\[\&_\.wn-table-wrap\]\:rounded-md .wn-table-wrap{border-radius:var(--radius)}.\[\&_\.wn-table-wrap\]\:border .wn-table-wrap{border-style:var(--tw-border-style);border-width:1px}.\[\&_\.wn-table-wrap\]\:border-border .wn-table-wrap{border-color:var(--border)}.\[\&_\.wn-task\]\:-ml-\[18px\] .wn-task{margin-left:-18px}.\[\&_\.wn-task\]\:list-none .wn-task{list-style-type:none}.\[\&_\.wn-task\.done_\.wn-check\]\:text-success .wn-task.done .wn-check{color:var(--success)}.\[\&_a\]\:text-brand a{color:var(--brand)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}.\[\&_b\]\:font-medium b{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_b\]\:break-words b{overflow-wrap:break-word}.\[\&_b\]\:text-foreground b{color:var(--foreground)}.\[\&_blockquote\]\:my-2 blockquote{margin-block:calc(var(--spacing) * 2)}.\[\&_blockquote\]\:border-l-\[3px\] blockquote{border-left-style:var(--tw-border-style);border-left-width:3px}.\[\&_blockquote\]\:border-brand\/40 blockquote{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.\[\&_blockquote\]\:border-brand\/40 blockquote{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.\[\&_blockquote\]\:px-3\.5 blockquote{padding-inline:calc(var(--spacing) * 3.5)}.\[\&_blockquote\]\:py-1\.5 blockquote{padding-block:calc(var(--spacing) * 1.5)}.\[\&_blockquote\]\:italic blockquote{font-style:italic}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:border code{border-style:var(--tw-border-style);border-width:1px}.\[\&_code\]\:border-border code{border-color:var(--border)}.\[\&_code\]\:bg-muted code{background-color:var(--muted)}.\[\&_code\]\:px-1\.5 code{padding-inline:calc(var(--spacing) * 1.5)}.\[\&_code\]\:py-0\.5 code{padding-block:calc(var(--spacing) * .5)}.\[\&_code\]\:font-mono code{font-family:var(--font-mt)}.\[\&_code\]\:text-xs code{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_code\]\:text-brand code{color:var(--brand)}.\[\&_del\]\:text-muted-foreground del{color:var(--muted-foreground)}.\[\&_del\]\:opacity-60 del{opacity:.6}.\[\&_h2\]\:mt-\[18px\] h2{margin-top:18px}.\[\&_h2\]\:mb-1\.5 h2{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h2\]\:text-\[17px\] h2{font-size:17px}.\[\&_h2\]\:font-bold h2{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h2\]\:text-foreground h2{color:var(--foreground)}.\[\&_h3\]\:mt-\[18px\] h3{margin-top:18px}.\[\&_h3\]\:mb-1\.5 h3{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h3\]\:text-\[15px\] h3{font-size:15px}.\[\&_h3\]\:font-bold h3{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h3\]\:text-foreground h3{color:var(--foreground)}.\[\&_h4\]\:mt-\[18px\] h4{margin-top:18px}.\[\&_h4\]\:mb-1\.5 h4{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h4\]\:text-\[14px\] h4{font-size:14px}.\[\&_h4\]\:font-bold h4{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h4\]\:text-foreground h4{color:var(--foreground)}.\[\&_h5\]\:mt-\[18px\] h5{margin-top:18px}.\[\&_h5\]\:mb-1\.5 h5{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h5\]\:text-\[14px\] h5{font-size:14px}.\[\&_h5\]\:font-bold h5{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h5\]\:text-foreground h5{color:var(--foreground)}.\[\&_hr\]\:my-3\.5 hr{margin-block:calc(var(--spacing) * 3.5)}.\[\&_hr\]\:border-0 hr{border-style:var(--tw-border-style);border-width:0}.\[\&_hr\]\:border-t hr{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&_hr\]\:border-border hr{border-color:var(--border)}.\[\&_i\]\:inline-block i{display:inline-block}.\[\&_i\]\:size-2\.5 i{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.\[\&_i\]\:rounded-\[3px\] i{border-radius:3px}.\[\&_img\]\:my-1\.5 img{margin-block:calc(var(--spacing) * 1.5)}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_img\]\:rounded-md img{border-radius:var(--radius)}.\[\&_img\]\:border img{border-style:var(--tw-border-style);border-width:1px}.\[\&_img\]\:border-border img{border-color:var(--border)}.\[\&_li\]\:my-\[3px\] li{margin-block:3px}.\[\&_li\]\:marker\:text-brand li ::marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li::marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li ::-webkit-details-marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li::-webkit-details-marker{color:var(--brand)}.\[\&_ol\]\:my-\[5px\] ol{margin-block:5px}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-\[22px\] ol{padding-left:22px}.\[\&_p\]\:my-\[5px\] p{margin-block:5px}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:my-2 pre{margin-block:calc(var(--spacing) * 2)}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded-md pre{border-radius:var(--radius)}.\[\&_pre\]\:border pre{border-style:var(--tw-border-style);border-width:1px}.\[\&_pre\]\:border-border pre{border-color:var(--border)}.\[\&_pre\]\:bg-background pre{background-color:var(--background)}.\[\&_pre\]\:p-3 pre{padding:calc(var(--spacing) * 3)}.\[\&_pre_code\]\:border-0 pre code{border-style:var(--tw-border-style);border-width:0}.\[\&_pre_code\]\:bg-transparent pre code{background-color:#0000}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_pre_code\]\:text-muted-foreground pre code{color:var(--muted-foreground)}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_strong\]\:text-foreground strong{color:var(--foreground)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:font-mono table{font-family:var(--font-mt)}.\[\&_table\]\:text-xs table{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_td\]\:border-b td{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_td\]\:border-border td{border-color:var(--border)}.\[\&_td\]\:px-3 td{padding-inline:calc(var(--spacing) * 3)}.\[\&_td\]\:py-\[7px\] td{padding-block:7px}.\[\&_td\]\:text-muted-foreground td{color:var(--muted-foreground)}.\[\&_th\]\:border-b th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_th\]\:border-border th{border-color:var(--border)}.\[\&_th\]\:bg-muted th{background-color:var(--muted)}.\[\&_th\]\:px-3 th{padding-inline:calc(var(--spacing) * 3)}.\[\&_th\]\:py-\[7px\] th{padding-block:7px}.\[\&_th\]\:text-left th{text-align:left}.\[\&_th\]\:text-\[11px\] th{font-size:11px}.\[\&_th\]\:font-semibold th{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_th\]\:tracking-wide th{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.\[\&_th\]\:text-foreground th{color:var(--foreground)}.\[\&_th\]\:uppercase th{text-transform:uppercase}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&_ul\]\:my-\[5px\] ul{margin-block:5px}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-\[18px\] ul{padding-left:18px}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>b\]\:text-foreground>b{color:var(--foreground)}.\[\&\>span\]\:inline-flex>span{display:inline-flex}.\[\&\>span\]\:items-center>span{align-items:center}.\[\&\>span\]\:gap-1\.5>span{gap:calc(var(--spacing) * 1.5)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.conn{display:block;overflow:visible}.conn-grid{fill:none;stroke:var(--border);stroke-opacity:.7;stroke-dasharray:2 7}.conn-sonar{fill:none;stroke:var(--brand);stroke-width:1.5px;opacity:0;animation:3.3s ease-out infinite conn-sonar}.conn-hub-glow{fill:var(--brand);opacity:.22;filter:blur(11px)}.conn-hub-ring{fill:none;stroke:var(--brand);stroke-width:1.4px;stroke-dasharray:4 9;opacity:.7;transform-box:fill-box;transform-origin:50%;animation:15s linear infinite conn-rot}.conn-node text{pointer-events:none}.conn-node-halo{fill:none;stroke-width:2px;transform-box:fill-box;transform-origin:50%;animation:2.4s ease-in-out infinite conn-halo}.conn-link{fill:none;stroke-width:1.6px;opacity:.38}.conn-flow{fill:none;stroke-width:2.4px;stroke-linecap:round;stroke-dasharray:2 13;opacity:.9;filter:drop-shadow(0 0 4px);animation:1.05s linear infinite conn-flow}.conn-packet{filter:drop-shadow(0 0 6px var(--chart-2))}.conn-chevron{fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.6}.conn-tunnel-halo{fill:none;stroke-width:8px;stroke-linecap:round;opacity:.1}.conn-tunnel{fill:none;stroke-width:2.4px;stroke-linecap:round;stroke-dasharray:6 6;animation:.9s linear infinite conn-tunnel-flow}.conn-tunnel-lock{filter:drop-shadow(0 0 4px var(--warning))}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-lock{filter:drop-shadow(0 0 4px color-mix(in srgb, var(--warning) 80%, transparent))}}.conn-tunnel-sat{stroke-width:1.5px;filter:drop-shadow(0 0 5px var(--warning))}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-sat{filter:drop-shadow(0 0 5px color-mix(in srgb, var(--warning) 53%, transparent))}}.conn-tunnel-badge{fill:var(--warning)}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-badge{fill:color-mix(in srgb, var(--warning) 16%, var(--background))}}.conn-tunnel-badge{stroke:var(--warning)}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-badge{stroke:color-mix(in srgb, var(--warning) 60%, var(--border))}}.conn-tunnel-badge{stroke-width:1px}.conn-tunnel-badge-tx{fill:var(--warning);letter-spacing:.02em;font-weight:700}.jump-route__wire{background-image:linear-gradient(90deg, var(--border) 0 50%, transparent 50% 100%);background-size:8px 2px;border-radius:2px;flex:1;min-width:18px;height:2px;animation:.7s linear infinite jump-wire}.jump-route__wire--enc{background-image:linear-gradient(90deg, var(--warning) 0 55%, transparent 55% 100%);min-width:34px;height:3px;box-shadow:0 0 8px -1px var(--warning);background-size:10px 3px;position:relative}@supports (color:color-mix(in lab, red, red)){.jump-route__wire--enc{box-shadow:0 0 8px -1px color-mix(in srgb, var(--warning) 53%, transparent)}}.jump-route__lock{filter:drop-shadow(0 0 3px var(--warning));font-size:11px;animation:2.2s linear infinite jump-lock;position:absolute;top:50%}.topo-sweep{animation:8s linear infinite topo-sweep}.topo-ring{transform-box:fill-box;transform-origin:50%;animation:90s linear infinite reverse topo-ring}.topo-flow{animation:1.4s linear infinite topo-flow}.topo-pulse{transform-box:fill-box;transform-origin:50%;animation:2.6s ease-in-out infinite topo-pulse}.topo-halo{transform-box:fill-box;transform-origin:50%;animation:2.2s ease-out infinite topo-halo}@keyframes topo-sweep{to{transform:rotate(360deg)}}@keyframes topo-ring{to{transform:rotate(360deg)}}@keyframes topo-flow{to{stroke-dashoffset:-16px}}@keyframes topo-pulse{0%,to{opacity:.55;transform:scale(1)}50%{opacity:1;transform:scale(1.12)}}@keyframes topo-halo{0%{opacity:.5;transform:scale(1)}to{opacity:0;transform:scale(1.9)}}@keyframes conn-sonar{0%{r:30px;opacity:.5}to{r:150px;opacity:0}}@keyframes conn-flow{to{stroke-dashoffset:-60px}}@keyframes conn-rot{to{transform:rotate(360deg)}}@keyframes conn-halo{0%,to{opacity:.45;transform:scale(1)}50%{opacity:0;transform:scale(1.55)}}@keyframes conn-tunnel-flow{to{stroke-dashoffset:-24px}}@keyframes jump-wire{to{background-position:8px 0}}@keyframes jump-lock{0%{left:-4px;transform:translateY(-50%)scale(.9)}50%{transform:translateY(-50%)scale(1.1)}to{left:calc(100% - 8px);transform:translateY(-50%)scale(.9)}}@media (prefers-reduced-motion:reduce){.conn-sonar,.topo-sweep{display:none}.conn-flow,.conn-hub-ring,.conn-node-halo,.conn-tunnel,.jump-route__wire,.jump-route__lock,.topo-ring,.topo-flow,.topo-pulse,.topo-halo{animation:none}.conn-packet animateMotion,.conn-tunnel-lock animateMotion{display:none}}:root{--background:#fff;--foreground:#0a0a0a;--card:#fff;--card-foreground:#0a0a0a;--popover:#fff;--popover-foreground:#0a0a0a;--primary:#0a0a0a;--primary-foreground:#fafafa;--secondary:#f4f4f5;--secondary-foreground:#0a0a0a;--muted:#f4f4f5;--muted-foreground:#71717a;--accent:#f4f4f5;--accent-foreground:#0a0a0a;--destructive:#e5484d;--destructive-foreground:#fff;--success:#18794e;--warning:#ab6400;--border:#e4e4e7;--input:#e4e4e7;--radius:.5rem;--page-accent:var(--foreground);--page-accent-2:var(--muted-foreground);--brand:var(--page-accent);--brand-foreground:var(--background);--ring:var(--brand);--chart-1:#0068d6;--chart-2:#0f8a7e;--chart-3:#3d8f2f;--chart-4:#a35200;--chart-5:#7048c4;--entity-1:#0068d6;--entity-2:#087a52;--entity-3:#6d3fc4;--entity-4:#a35200;--entity-5:#c02a2a;--entity-6:#0f8a7e;--entity-7:#c0267a;--entity-8:#2563eb;--entity-9:#8a6a00;--entity-10:#b4530f}.dark{--background:#0a0a0a;--foreground:#ededed;--card:#111;--card-foreground:#ededed;--popover:#111;--popover-foreground:#ededed;--primary:#ededed;--primary-foreground:#0a0a0a;--secondary:#1a1a1a;--secondary-foreground:#ededed;--muted:#1a1a1a;--muted-foreground:#a1a1a1;--accent:#1a1a1a;--accent-foreground:#ededed;--destructive:#ff5c5c;--destructive-foreground:#fff;--success:#2dd4a7;--warning:#f5a623;--border:#2a2a2a;--input:#2a2a2a;--chart-1:#3291ff;--chart-2:#2dd4bf;--chart-3:#69d05a;--chart-4:#f5a623;--chart-5:#9d7bff;--entity-1:#3291ff;--entity-2:#34d399;--entity-3:#a78bfa;--entity-4:#f59e0b;--entity-5:#ef4444;--entity-6:#2dd4bf;--entity-7:#f472b6;--entity-8:#60a5fa;--entity-9:#facc15;--entity-10:#fb923c}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
158
|
+
@import "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap";@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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:var(--font-mt);--font-mono:var(--font-mt);--color-orange-500:oklch(70.5% .213 47.604);--color-yellow-500:oklch(79.5% .184 86.047);--color-emerald-500:oklch(69.6% .17 162.48);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--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-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-2xl:40px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-mt);--default-mono-font-family:var(--font-mt);--color-border:var(--border)}}@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;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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{--font-mt:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);font-family:var(--font-mt);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components{@media (prefers-reduced-motion:no-preference){.js-motion .reveal{opacity:0}}}@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.-top-16{top:calc(var(--spacing) * -16)}.-top-px{top:-1px}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.-right-16{right:calc(var(--spacing) * -16)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.-bottom-1\.5{bottom:calc(var(--spacing) * -1.5)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.-left-\[21px\]{left:-21px}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[9px\]{left:9px}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[5\]{z-index:5}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.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}}.m-0{margin:0}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-2\.5{margin-block:calc(var(--spacing) * 2.5)}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-\[3px\]{margin-top:3px}.mt-\[7px\]{margin-top:7px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.\[field-sizing\:fixed\]{field-sizing:fixed}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-56{width:calc(var(--spacing) * 56);height:calc(var(--spacing) * 56)}.size-\[7px\]{width:7px;height:7px}.size-\[9px\]{width:9px;height:9px}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[18px\]{width:18px;height:18px}.size-\[19px\]{width:19px;height:19px}.size-\[72px\]{width:72px;height:72px}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-40{height:calc(var(--spacing) * 40)}.h-\[18px\]{height:18px}.h-\[46px\]{height:46px}.h-\[150px\]{height:150px}.h-\[200px\]{height:200px}.h-\[360px\]{height:360px}.h-\[400px\]{height:400px}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[184px\]{max-height:184px}.max-h-\[250px\]{max-height:250px}.max-h-\[280px\]{max-height:280px}.max-h-\[320px\]{max-height:320px}.max-h-\[360px\]{max-height:360px}.max-h-\[420px\]{max-height:420px}.max-h-\[440px\]{max-height:440px}.max-h-\[500px\]{max-height:500px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-\[120px\]{min-height:120px}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:var(--spacing)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\/4{width:75%}.w-7{width:calc(var(--spacing) * 7)}.w-11{width:calc(var(--spacing) * 11)}.w-20{width:calc(var(--spacing) * 20)}.w-40{width:calc(var(--spacing) * 40)}.w-\[90px\]{width:90px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[150px\]{width:150px}.w-\[170px\]{width:170px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[380px\]{width:380px}.w-\[min\(48vw\,380px\)\]{width:min(48vw,380px)}.w-\[min\(360px\,60vw\)\]{width:min(360px,60vw)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[190px\]{max-width:190px}.max-w-\[200px\]{max-width:200px}.max-w-\[260px\]{max-width:260px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[460px\]{max-width:460px}.max-w-\[520px\]{max-width:520px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-\[min\(60vw\,520px\)\]{max-width:min(60vw,520px)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[38px\]{min-width:38px}.min-w-\[48px\]{min-width:48px}.min-w-\[60px\]{min-width:60px}.min-w-\[100px\]{min-width:100px}.min-w-\[150px\]{min-width:150px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[980px\]{min-width:980px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-100\%-9px\)\]{--tw-translate-y:calc(-100% - 9px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-y{resize:vertical}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-cols-\[24px_minmax\(0\,1fr\)_auto\]{grid-template-columns:24px minmax(0,1fr) auto}.grid-cols-\[52px_1fr_34px\]{grid-template-columns:52px 1fr 34px}.grid-cols-\[90px_64px_48px_1fr\]{grid-template-columns:90px 64px 48px 1fr}.grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,7rem\)_1fr_auto\]{grid-template-columns:minmax(0,7rem) 1fr auto}.grid-cols-\[minmax\(120px\,0\.4fr\)_1fr\]{grid-template-columns:minmax(120px,.4fr) 1fr}.grid-cols-\[repeat\(auto-fill\,minmax\(20rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(20rem,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(22rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(22rem,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(200px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(220px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(240px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(min\(100\%\,360px\)\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(min(100%,360px),1fr))}.grid-cols-\[repeat\(auto-fit\,minmax\(9rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(9rem,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-start{justify-items:start}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[3px\]{gap:3px}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[9px\]{gap:9px}.gap-\[18px\]{gap:18px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-3\.5{column-gap:calc(var(--spacing) * 3.5)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px * var(--tw-space-x-reverse));margin-inline-end:calc(-1px * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2\.5{row-gap:calc(var(--spacing) * 2.5)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-\[3px\]{row-gap:3px}.self-start{align-self:flex-start}.justify-self-center{justify-self:center}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[6px\]{border-radius:6px}.rounded-\[7px\]{border-radius:7px}.rounded-\[10px\]{border-radius:10px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-\[2\.5px\]{border-style:var(--tw-border-style);border-width:2.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-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-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--color-border\){border-color:var(--color-border)}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-brand,.border-brand\/30{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/30{border-color:color-mix(in oklab, var(--brand) 30%, transparent)}}.border-brand\/40{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/40{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.border-brand\/50{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/50{border-color:color-mix(in oklab, var(--brand) 50%, transparent)}}.border-brand\/55{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.border-brand\/55{border-color:color-mix(in oklab, var(--brand) 55%, transparent)}}.border-chart-1\/40{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/40{border-color:color-mix(in oklab, var(--chart-1) 40%, transparent)}}.border-chart-1\/45{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/45{border-color:color-mix(in oklab, var(--chart-1) 45%, transparent)}}.border-chart-1\/50{border-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.border-chart-1\/50{border-color:color-mix(in oklab, var(--chart-1) 50%, transparent)}}.border-chart-2\/40{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.border-chart-2\/40{border-color:color-mix(in oklab, var(--chart-2) 40%, transparent)}}.border-chart-2\/45{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.border-chart-2\/45{border-color:color-mix(in oklab, var(--chart-2) 45%, transparent)}}.border-chart-3\/35{border-color:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.border-chart-3\/35{border-color:color-mix(in oklab, var(--chart-3) 35%, transparent)}}.border-chart-3\/40{border-color:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.border-chart-3\/40{border-color:color-mix(in oklab, var(--chart-3) 40%, transparent)}}.border-chart-4\/40{border-color:var(--chart-4)}@supports (color:color-mix(in lab, red, red)){.border-chart-4\/40{border-color:color-mix(in oklab, var(--chart-4) 40%, transparent)}}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/40{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.border-destructive\/45{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/45{border-color:color-mix(in oklab, var(--destructive) 45%, transparent)}}.border-destructive\/50{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/50{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-input{border-color:var(--input)}.border-success\/35{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/35{border-color:color-mix(in oklab, var(--success) 35%, transparent)}}.border-success\/40{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/40{border-color:color-mix(in oklab, var(--success) 40%, transparent)}}.border-success\/45{border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.border-success\/45{border-color:color-mix(in oklab, var(--success) 45%, transparent)}}.border-transparent{border-color:#0000}.border-warning\/30{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/30{border-color:color-mix(in oklab, var(--warning) 30%, transparent)}}.border-warning\/40{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/40{border-color:color-mix(in oklab, var(--warning) 40%, transparent)}}.border-warning\/45{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/45{border-color:color-mix(in oklab, var(--warning) 45%, transparent)}}.border-warning\/60{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/60{border-color:color-mix(in oklab, var(--warning) 60%, transparent)}}.border-yellow-500\/40{border-color:#edb20066}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\/40{border-color:color-mix(in oklab, var(--color-yellow-500) 40%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-border{border-left-color:var(--border)}.border-l-destructive{border-left-color:var(--destructive)}.border-l-success{border-left-color:var(--success)}.border-l-transparent{border-left-color:#0000}.border-l-warning{border-left-color:var(--warning)}.bg-\(--color-bg\){background-color:var(--color-bg)}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--border)}.bg-brand,.bg-brand\/10{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/10{background-color:color-mix(in oklab, var(--brand) 10%, transparent)}}.bg-brand\/15{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/15{background-color:color-mix(in oklab, var(--brand) 15%, transparent)}}.bg-brand\/20{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/20{background-color:color-mix(in oklab, var(--brand) 20%, transparent)}}.bg-brand\/40{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/40{background-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.bg-brand\/60{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/60{background-color:color-mix(in oklab, var(--brand) 60%, transparent)}}.bg-brand\/\[0\.13\]{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/\[0\.13\]{background-color:color-mix(in oklab, var(--brand) 13%, transparent)}}.bg-card{background-color:var(--card)}.bg-chart-1\/10{background-color:var(--chart-1)}@supports (color:color-mix(in lab, red, red)){.bg-chart-1\/10{background-color:color-mix(in oklab, var(--chart-1) 10%, transparent)}}.bg-chart-2,.bg-chart-2\/10{background-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.bg-chart-2\/10{background-color:color-mix(in oklab, var(--chart-2) 10%, transparent)}}.bg-destructive,.bg-destructive\/8{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/8{background-color:color-mix(in oklab, var(--destructive) 8%, transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-destructive\/15{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/15{background-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.bg-muted-foreground\/60{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/60{background-color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/45{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/45{background-color:color-mix(in oklab, var(--muted) 45%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-success,.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.bg-success\/10{background-color:color-mix(in oklab, var(--success) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/8{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/8{background-color:color-mix(in oklab, var(--warning) 8%, transparent)}}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.bg-yellow-500\/15{background-color:#edb20026}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/15{background-color:color-mix(in oklab, var(--color-yellow-500) 15%, transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-brand\/10{--tw-gradient-from:var(--brand)}@supports (color:color-mix(in lab, red, red)){.from-brand\/10{--tw-gradient-from:color-mix(in oklab, var(--brand) 10%, transparent)}}.from-brand\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.fill-background{fill:var(--background)}.fill-brand\/15{fill:var(--brand)}@supports (color:color-mix(in lab, red, red)){.fill-brand\/15{fill:color-mix(in oklab, var(--brand) 15%, transparent)}}.fill-brand\/25{fill:var(--brand)}@supports (color:color-mix(in lab, red, red)){.fill-brand\/25{fill:color-mix(in oklab, var(--brand) 25%, transparent)}}.fill-card{fill:var(--card)}.fill-chart-3\/20{fill:var(--chart-3)}@supports (color:color-mix(in lab, red, red)){.fill-chart-3\/20{fill:color-mix(in oklab, var(--chart-3) 20%, transparent)}}.fill-chart-4\/15{fill:var(--chart-4)}@supports (color:color-mix(in lab, red, red)){.fill-chart-4\/15{fill:color-mix(in oklab, var(--chart-4) 15%, transparent)}}.fill-current{fill:currentColor}.fill-foreground{fill:var(--foreground)}.fill-muted{fill:var(--muted)}.fill-muted-foreground{fill:var(--muted-foreground)}.fill-none{fill:none}.fill-success\/20{fill:var(--success)}@supports (color:color-mix(in lab, red, red)){.fill-success\/20{fill:color-mix(in oklab, var(--success) 20%, transparent)}}.fill-warning\/15{fill:var(--warning)}@supports (color:color-mix(in lab, red, red)){.fill-warning\/15{fill:color-mix(in oklab, var(--warning) 15%, transparent)}}.stroke-background{stroke:var(--background)}.stroke-border,.stroke-border\/40{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/40{stroke:color-mix(in oklab, var(--border) 40%, transparent)}}.stroke-border\/60{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/60{stroke:color-mix(in oklab, var(--border) 60%, transparent)}}.stroke-border\/70{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.stroke-border\/70{stroke:color-mix(in oklab, var(--border) 70%, transparent)}}.stroke-brand,.stroke-brand\/55{stroke:var(--brand)}@supports (color:color-mix(in lab, red, red)){.stroke-brand\/55{stroke:color-mix(in oklab, var(--brand) 55%, transparent)}}.stroke-chart-2\/70{stroke:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.stroke-chart-2\/70{stroke:color-mix(in oklab, var(--chart-2) 70%, transparent)}}.stroke-chart-3{stroke:var(--chart-3)}.stroke-chart-4{stroke:var(--chart-4)}.stroke-foreground{stroke:var(--foreground)}.stroke-none{stroke:none}.stroke-success{stroke:var(--success)}.stroke-warning{stroke:var(--warning)}.stroke-1{stroke-width:1px}.stroke-2{stroke-width:2px}.stroke-\[1\.5px\]{stroke-width:1.5px}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.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)}.px-\[5px\]{padding-inline:5px}.px-\[7px\]{padding-inline:7px}.px-\[11px\]{padding-inline:11px}.px-\[13px\]{padding-inline:13px}.px-\[15px\]{padding-inline:15px}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-\[3px\]{padding-block:3px}.py-\[5px\]{padding-block:5px}.py-\[7px\]{padding-block:7px}.py-\[9px\]{padding-block:9px}.py-\[11px\]{padding-block:11px}.py-\[54px\]{padding-block:54px}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-px{padding-top:1px}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-\[18px\]{padding-left:18px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mt)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-\[11px\]\/\[1\.5\]{font-size:11px;line-height:1.5}.text-\[11px\]\/\[1\.6\]{font-size:11px;line-height:1.6}.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-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[40px\]{font-size:40px}.text-\[44px\]{font-size:44px}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[8px\]{--tw-leading:8px;line-height:8px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.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-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.09em\]{--tw-tracking:.09em;letter-spacing:.09em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.\[tab-size\:2\]{tab-size:2}.text-accent-foreground{color:var(--accent-foreground)}.text-background{color:var(--background)}.text-brand{color:var(--brand)}.text-brand-foreground{color:var(--brand-foreground)}.text-card-foreground{color:var(--card-foreground)}.text-chart-1{color:var(--chart-1)}.text-chart-2{color:var(--chart-2)}.text-chart-3{color:var(--chart-3)}.text-chart-4{color:var(--chart-4)}.text-chart-5{color:var(--chart-5)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-emerald-500{color:var(--color-emerald-500)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.text-muted-foreground\/80{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/80{color:color-mix(in oklab, var(--muted-foreground) 80%, transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-success{color:var(--success)}.text-transparent{color:#0000}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.caret-brand{caret-color:var(--brand)}.accent-brand{accent-color:var(--brand)}.opacity-15{opacity:.15}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-brand\/25{--tw-ring-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.ring-brand\/25{--tw-ring-color:color-mix(in oklab, var(--brand) 25%, transparent)}}.ring-brand\/30{--tw-ring-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.ring-brand\/30{--tw-ring-color:color-mix(in oklab, var(--brand) 30%, transparent)}}.ring-card{--tw-ring-color:var(--card)}.ring-emerald-500\/30{--tw-ring-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.ring-emerald-500\/30{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale-\[0\.4\]{--tw-grayscale:grayscale(.4);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,border-color\]{transition-property:transform,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-\[400ms\]{--tw-duration:.4s;transition-duration:.4s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-50{--tw-enter-scale:.5}.zoom-in-95{--tw-enter-scale:.95}.\[text-shadow\:0_0_3px_rgba\(0\,0\,0\,0\.6\)\]{text-shadow:0 0 3px #0009}.\[transition\:stroke_0\.1s_ease\]{transition:stroke .1s}.\[vector-effect\:non-scaling-stroke\]{vector-effect:non-scaling-stroke}.running{animation-play-state:running}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-\[\.toast\]\:bg-muted:is(:where(.group).toast *){background-color:var(--muted)}.group-\[\.toast\]\:bg-primary:is(:where(.group).toast *){background-color:var(--primary)}.group-\[\.toast\]\:text-destructive:is(:where(.group).toast *){color:var(--destructive)}.group-\[\.toast\]\:text-foreground:is(:where(.group).toast *){color:var(--foreground)}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group).toast *){color:var(--muted-foreground)}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group).toast *){color:var(--primary-foreground)}.group-\[\.toaster\]\:border:is(:where(.group).toaster *){border-style:var(--tw-border-style);border-width:1px}.group-\[\.toaster\]\:bg-background:is(:where(.group).toaster *){background-color:var(--background)}.group-\[\.toaster\]\:text-foreground:is(:where(.group).toaster *){color:var(--foreground)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-brand\/35 ::selection{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.selection\:bg-brand\/35 ::selection{background-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.selection\:bg-brand\/35::selection{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.selection\:bg-brand\/35::selection{background-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-\[25px\]:before{content:var(--tw-content);top:25px}.before\:bottom-0:before{content:var(--tw-content);bottom:0}.before\:left-\[22px\]:before{content:var(--tw-content);left:22px}.before\:w-px:before{content:var(--tw-content);width:1px}.before\:bg-border:before{content:var(--tw-content);background-color:var(--border)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:before\:hidden:last-child:before{content:var(--tw-content);display:none}.odd\:bg-card\/40:nth-child(odd){background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.odd\:bg-card\/40:nth-child(odd){background-color:color-mix(in oklab, var(--card) 40%, transparent)}}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-brand\/35:hover{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:border-brand\/35:hover{border-color:color-mix(in oklab, var(--brand) 35%, transparent)}}.hover\:border-brand\/40:hover{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:border-brand\/40:hover{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.hover\:border-chart-2\/35:hover{border-color:var(--chart-2)}@supports (color:color-mix(in lab, red, red)){.hover\:border-chart-2\/35:hover{border-color:color-mix(in oklab, var(--chart-2) 35%, transparent)}}.hover\:border-muted-foreground\/40:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:border-muted-foreground\/40:hover{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.hover\:bg-brand\/10:hover{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/10:hover{background-color:color-mix(in oklab, var(--brand) 10%, transparent)}}.hover\:bg-brand\/90:hover{background-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/90:hover{background-color:color-mix(in oklab, var(--brand) 90%, transparent)}}.hover\:bg-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-foreground\/5:hover{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/5:hover{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-success\/10:hover{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/10:hover{background-color:color-mix(in oklab, var(--success) 10%, transparent)}}.hover\:bg-success\/90:hover{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/90:hover{background-color:color-mix(in oklab, var(--success) 90%, transparent)}}.hover\:bg-warning\/10:hover{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warning\/10:hover{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.hover\:bg-warning\/90:hover{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warning\/90:hover{background-color:color-mix(in oklab, var(--warning) 90%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-0:focus-visible{border-style:var(--tw-border-style);border-width:0}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem}.data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@media not all and (width>=720px){.max-\[720px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media (width>=40rem){.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-\[520px\]{max-width:520px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[\&_\.j-bool\]\:text-chart-4 .j-bool{color:var(--chart-4)}.\[\&_\.j-key\]\:text-chart-1 .j-key{color:var(--chart-1)}.\[\&_\.j-null\]\:text-muted-foreground .j-null{color:var(--muted-foreground)}.\[\&_\.j-num\]\:text-chart-3 .j-num{color:var(--chart-3)}.\[\&_\.j-str\]\:text-chart-2 .j-str{color:var(--chart-2)}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:var(--muted-foreground)}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:var(--border)}@supports (color:color-mix(in lab, red, red)){.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:color-mix(in oklab, var(--border) 50%, transparent)}}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:var(--border)}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke=\#ccc]{stroke:var(--border)}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:var(--muted)}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke=\#ccc]{stroke:var(--border)}.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.wn-check\]\:inline-block .wn-check{display:inline-block}.\[\&_\.wn-check\]\:w-4 .wn-check{width:calc(var(--spacing) * 4)}.\[\&_\.wn-table-wrap\]\:my-2\.5 .wn-table-wrap{margin-block:calc(var(--spacing) * 2.5)}.\[\&_\.wn-table-wrap\]\:overflow-x-auto .wn-table-wrap{overflow-x:auto}.\[\&_\.wn-table-wrap\]\:rounded-md .wn-table-wrap{border-radius:var(--radius)}.\[\&_\.wn-table-wrap\]\:border .wn-table-wrap{border-style:var(--tw-border-style);border-width:1px}.\[\&_\.wn-table-wrap\]\:border-border .wn-table-wrap{border-color:var(--border)}.\[\&_\.wn-task\]\:-ml-\[18px\] .wn-task{margin-left:-18px}.\[\&_\.wn-task\]\:list-none .wn-task{list-style-type:none}.\[\&_\.wn-task\.done_\.wn-check\]\:text-success .wn-task.done .wn-check{color:var(--success)}.\[\&_a\]\:text-brand a{color:var(--brand)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}.\[\&_b\]\:font-medium b{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_b\]\:break-words b{overflow-wrap:break-word}.\[\&_b\]\:text-foreground b{color:var(--foreground)}.\[\&_blockquote\]\:my-2 blockquote{margin-block:calc(var(--spacing) * 2)}.\[\&_blockquote\]\:border-l-\[3px\] blockquote{border-left-style:var(--tw-border-style);border-left-width:3px}.\[\&_blockquote\]\:border-brand\/40 blockquote{border-color:var(--brand)}@supports (color:color-mix(in lab, red, red)){.\[\&_blockquote\]\:border-brand\/40 blockquote{border-color:color-mix(in oklab, var(--brand) 40%, transparent)}}.\[\&_blockquote\]\:px-3\.5 blockquote{padding-inline:calc(var(--spacing) * 3.5)}.\[\&_blockquote\]\:py-1\.5 blockquote{padding-block:calc(var(--spacing) * 1.5)}.\[\&_blockquote\]\:italic blockquote{font-style:italic}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:border code{border-style:var(--tw-border-style);border-width:1px}.\[\&_code\]\:border-border code{border-color:var(--border)}.\[\&_code\]\:bg-muted code{background-color:var(--muted)}.\[\&_code\]\:px-1\.5 code{padding-inline:calc(var(--spacing) * 1.5)}.\[\&_code\]\:py-0\.5 code{padding-block:calc(var(--spacing) * .5)}.\[\&_code\]\:font-mono code{font-family:var(--font-mt)}.\[\&_code\]\:text-xs code{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_code\]\:text-brand code{color:var(--brand)}.\[\&_del\]\:text-muted-foreground del{color:var(--muted-foreground)}.\[\&_del\]\:opacity-60 del{opacity:.6}.\[\&_h2\]\:mt-\[18px\] h2{margin-top:18px}.\[\&_h2\]\:mb-1\.5 h2{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h2\]\:text-\[17px\] h2{font-size:17px}.\[\&_h2\]\:font-bold h2{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h2\]\:text-foreground h2{color:var(--foreground)}.\[\&_h3\]\:mt-\[18px\] h3{margin-top:18px}.\[\&_h3\]\:mb-1\.5 h3{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h3\]\:text-\[15px\] h3{font-size:15px}.\[\&_h3\]\:font-bold h3{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h3\]\:text-foreground h3{color:var(--foreground)}.\[\&_h4\]\:mt-\[18px\] h4{margin-top:18px}.\[\&_h4\]\:mb-1\.5 h4{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h4\]\:text-\[14px\] h4{font-size:14px}.\[\&_h4\]\:font-bold h4{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h4\]\:text-foreground h4{color:var(--foreground)}.\[\&_h5\]\:mt-\[18px\] h5{margin-top:18px}.\[\&_h5\]\:mb-1\.5 h5{margin-bottom:calc(var(--spacing) * 1.5)}.\[\&_h5\]\:text-\[14px\] h5{font-size:14px}.\[\&_h5\]\:font-bold h5{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h5\]\:text-foreground h5{color:var(--foreground)}.\[\&_hr\]\:my-3\.5 hr{margin-block:calc(var(--spacing) * 3.5)}.\[\&_hr\]\:border-0 hr{border-style:var(--tw-border-style);border-width:0}.\[\&_hr\]\:border-t hr{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&_hr\]\:border-border hr{border-color:var(--border)}.\[\&_i\]\:inline-block i{display:inline-block}.\[\&_i\]\:size-2\.5 i{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.\[\&_i\]\:rounded-\[3px\] i{border-radius:3px}.\[\&_img\]\:my-1\.5 img{margin-block:calc(var(--spacing) * 1.5)}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_img\]\:rounded-md img{border-radius:var(--radius)}.\[\&_img\]\:border img{border-style:var(--tw-border-style);border-width:1px}.\[\&_img\]\:border-border img{border-color:var(--border)}.\[\&_li\]\:my-\[3px\] li{margin-block:3px}.\[\&_li\]\:marker\:text-brand li ::marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li::marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li ::-webkit-details-marker{color:var(--brand)}.\[\&_li\]\:marker\:text-brand li::-webkit-details-marker{color:var(--brand)}.\[\&_ol\]\:my-\[5px\] ol{margin-block:5px}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-\[22px\] ol{padding-left:22px}.\[\&_p\]\:my-\[5px\] p{margin-block:5px}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:my-2 pre{margin-block:calc(var(--spacing) * 2)}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded-md pre{border-radius:var(--radius)}.\[\&_pre\]\:border pre{border-style:var(--tw-border-style);border-width:1px}.\[\&_pre\]\:border-border pre{border-color:var(--border)}.\[\&_pre\]\:bg-background pre{background-color:var(--background)}.\[\&_pre\]\:p-3 pre{padding:calc(var(--spacing) * 3)}.\[\&_pre_code\]\:border-0 pre code{border-style:var(--tw-border-style);border-width:0}.\[\&_pre_code\]\:bg-transparent pre code{background-color:#0000}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_pre_code\]\:text-muted-foreground pre code{color:var(--muted-foreground)}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_strong\]\:text-foreground strong{color:var(--foreground)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:font-mono table{font-family:var(--font-mt)}.\[\&_table\]\:text-xs table{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_td\]\:border-b td{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_td\]\:border-border td{border-color:var(--border)}.\[\&_td\]\:px-3 td{padding-inline:calc(var(--spacing) * 3)}.\[\&_td\]\:py-\[7px\] td{padding-block:7px}.\[\&_td\]\:text-muted-foreground td{color:var(--muted-foreground)}.\[\&_th\]\:border-b th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_th\]\:border-border th{border-color:var(--border)}.\[\&_th\]\:bg-muted th{background-color:var(--muted)}.\[\&_th\]\:px-3 th{padding-inline:calc(var(--spacing) * 3)}.\[\&_th\]\:py-\[7px\] th{padding-block:7px}.\[\&_th\]\:text-left th{text-align:left}.\[\&_th\]\:text-\[11px\] th{font-size:11px}.\[\&_th\]\:font-semibold th{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_th\]\:tracking-wide th{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.\[\&_th\]\:text-foreground th{color:var(--foreground)}.\[\&_th\]\:uppercase th{text-transform:uppercase}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&_ul\]\:my-\[5px\] ul{margin-block:5px}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-\[18px\] ul{padding-left:18px}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>b\]\:text-foreground>b{color:var(--foreground)}.\[\&\>span\]\:inline-flex>span{display:inline-flex}.\[\&\>span\]\:items-center>span{align-items:center}.\[\&\>span\]\:gap-1\.5>span{gap:calc(var(--spacing) * 1.5)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.conn{display:block;overflow:visible}.conn-grid{fill:none;stroke:var(--border);stroke-opacity:.7;stroke-dasharray:2 7}.conn-sonar{fill:none;stroke:var(--brand);stroke-width:1.5px;opacity:0;animation:3.3s ease-out infinite conn-sonar}.conn-hub-glow{fill:var(--brand);opacity:.22;filter:blur(11px)}.conn-hub-ring{fill:none;stroke:var(--brand);stroke-width:1.4px;stroke-dasharray:4 9;opacity:.7;transform-box:fill-box;transform-origin:50%;animation:15s linear infinite conn-rot}.conn-node text{pointer-events:none}.conn-node-halo{fill:none;stroke-width:2px;transform-box:fill-box;transform-origin:50%;animation:2.4s ease-in-out infinite conn-halo}.conn-link{fill:none;stroke-width:1.6px;opacity:.38}.conn-flow{fill:none;stroke-width:2.4px;stroke-linecap:round;stroke-dasharray:2 13;opacity:.9;filter:drop-shadow(0 0 4px);animation:1.05s linear infinite conn-flow}.conn-packet{filter:drop-shadow(0 0 6px var(--chart-2))}.conn-chevron{fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.6}.conn-tunnel-halo{fill:none;stroke-width:8px;stroke-linecap:round;opacity:.1}.conn-tunnel{fill:none;stroke-width:2.4px;stroke-linecap:round;stroke-dasharray:6 6;animation:.9s linear infinite conn-tunnel-flow}.conn-tunnel-lock{filter:drop-shadow(0 0 4px var(--warning))}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-lock{filter:drop-shadow(0 0 4px color-mix(in srgb, var(--warning) 80%, transparent))}}.conn-tunnel-sat{stroke-width:1.5px;filter:drop-shadow(0 0 5px var(--warning))}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-sat{filter:drop-shadow(0 0 5px color-mix(in srgb, var(--warning) 53%, transparent))}}.conn-tunnel-badge{fill:var(--warning)}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-badge{fill:color-mix(in srgb, var(--warning) 16%, var(--background))}}.conn-tunnel-badge{stroke:var(--warning)}@supports (color:color-mix(in lab, red, red)){.conn-tunnel-badge{stroke:color-mix(in srgb, var(--warning) 60%, var(--border))}}.conn-tunnel-badge{stroke-width:1px}.conn-tunnel-badge-tx{fill:var(--warning);letter-spacing:.02em;font-weight:700}.jump-route__wire{background-image:linear-gradient(90deg, var(--border) 0 50%, transparent 50% 100%);background-size:8px 2px;border-radius:2px;flex:1;min-width:18px;height:2px;animation:.7s linear infinite jump-wire}.jump-route__wire--enc{background-image:linear-gradient(90deg, var(--warning) 0 55%, transparent 55% 100%);min-width:34px;height:3px;box-shadow:0 0 8px -1px var(--warning);background-size:10px 3px;position:relative}@supports (color:color-mix(in lab, red, red)){.jump-route__wire--enc{box-shadow:0 0 8px -1px color-mix(in srgb, var(--warning) 53%, transparent)}}.jump-route__lock{filter:drop-shadow(0 0 3px var(--warning));font-size:11px;animation:2.2s linear infinite jump-lock;position:absolute;top:50%}.topo-sweep{animation:8s linear infinite topo-sweep}.topo-ring{transform-box:fill-box;transform-origin:50%;animation:90s linear infinite reverse topo-ring}.topo-flow{animation:1.4s linear infinite topo-flow}.topo-pulse{transform-box:fill-box;transform-origin:50%;animation:2.6s ease-in-out infinite topo-pulse}.topo-halo{transform-box:fill-box;transform-origin:50%;animation:2.2s ease-out infinite topo-halo}@keyframes topo-sweep{to{transform:rotate(360deg)}}@keyframes topo-ring{to{transform:rotate(360deg)}}@keyframes topo-flow{to{stroke-dashoffset:-16px}}@keyframes topo-pulse{0%,to{opacity:.55;transform:scale(1)}50%{opacity:1;transform:scale(1.12)}}@keyframes topo-halo{0%{opacity:.5;transform:scale(1)}to{opacity:0;transform:scale(1.9)}}@keyframes conn-sonar{0%{r:30px;opacity:.5}to{r:150px;opacity:0}}@keyframes conn-flow{to{stroke-dashoffset:-60px}}@keyframes conn-rot{to{transform:rotate(360deg)}}@keyframes conn-halo{0%,to{opacity:.45;transform:scale(1)}50%{opacity:0;transform:scale(1.55)}}@keyframes conn-tunnel-flow{to{stroke-dashoffset:-24px}}@keyframes jump-wire{to{background-position:8px 0}}@keyframes jump-lock{0%{left:-4px;transform:translateY(-50%)scale(.9)}50%{transform:translateY(-50%)scale(1.1)}to{left:calc(100% - 8px);transform:translateY(-50%)scale(.9)}}@media (prefers-reduced-motion:reduce){.conn-sonar,.topo-sweep{display:none}.conn-flow,.conn-hub-ring,.conn-node-halo,.conn-tunnel,.jump-route__wire,.jump-route__lock,.topo-ring,.topo-flow,.topo-pulse,.topo-halo{animation:none}.conn-packet animateMotion,.conn-tunnel-lock animateMotion{display:none}}:root{--background:#fff;--foreground:#0a0a0a;--card:#fff;--card-foreground:#0a0a0a;--popover:#fff;--popover-foreground:#0a0a0a;--primary:#0a0a0a;--primary-foreground:#fafafa;--secondary:#f4f4f5;--secondary-foreground:#0a0a0a;--muted:#f4f4f5;--muted-foreground:#71717a;--accent:#f4f4f5;--accent-foreground:#0a0a0a;--destructive:#e5484d;--destructive-foreground:#fff;--success:#18794e;--warning:#ab6400;--border:#e4e4e7;--input:#e4e4e7;--radius:.5rem;--page-accent:var(--foreground);--page-accent-2:var(--muted-foreground);--brand:var(--page-accent);--brand-foreground:var(--background);--ring:var(--brand);--chart-1:#0068d6;--chart-2:#0f8a7e;--chart-3:#3d8f2f;--chart-4:#a35200;--chart-5:#7048c4;--entity-1:#0068d6;--entity-2:#087a52;--entity-3:#6d3fc4;--entity-4:#a35200;--entity-5:#c02a2a;--entity-6:#0f8a7e;--entity-7:#c0267a;--entity-8:#2563eb;--entity-9:#8a6a00;--entity-10:#b4530f}.dark{--background:#0a0a0a;--foreground:#ededed;--card:#111;--card-foreground:#ededed;--popover:#111;--popover-foreground:#ededed;--primary:#ededed;--primary-foreground:#0a0a0a;--secondary:#1a1a1a;--secondary-foreground:#ededed;--muted:#1a1a1a;--muted-foreground:#a1a1a1;--accent:#1a1a1a;--accent-foreground:#ededed;--destructive:#ff5c5c;--destructive-foreground:#fff;--success:#2dd4a7;--warning:#f5a623;--border:#2a2a2a;--input:#2a2a2a;--chart-1:#3291ff;--chart-2:#2dd4bf;--chart-3:#69d05a;--chart-4:#f5a623;--chart-5:#9d7bff;--entity-1:#3291ff;--entity-2:#34d399;--entity-3:#a78bfa;--entity-4:#f59e0b;--entity-5:#ef4444;--entity-6:#2dd4bf;--entity-7:#f472b6;--entity-8:#60a5fa;--entity-9:#facc15;--entity-10:#fb923c}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
159
159
|
/*$vite$:1*/
|
|
160
160
|
</style>
|
|
161
161
|
</head>
|